[med-svn] [fw4spl] 01/01: Imported Upstream version 0.9.2

Corentin Desfarges corentin-guest at moszumanska.debian.org
Mon Oct 6 13:46:36 UTC 2014


This is an automated email from the git hooks/post-receive script.

corentin-guest pushed a commit to branch master
in repository fw4spl.

commit aa16a3ecd509fe5e4918d990c8d1ad4351a9cb06
Author: Corentin Desfarges <corentin.desfarges at gmail.com>
Date:   Mon Oct 6 15:34:40 2014 +0200

    Imported Upstream version 0.9.2
---
 .hgignore                                          |    9 +
 .hgtags                                            |   99 +
 Apps/Tuto01Basic/CMakeLists.txt                    |    1 +
 Apps/Tuto01Basic/COPYING                           |  675 +++++++
 Apps/Tuto01Basic/COPYING.LESSER                    |  166 ++
 Apps/Tuto01Basic/Properties.cmake                  |    7 +
 Apps/Tuto01Basic/bin/build.options                 |   13 +
 Apps/Tuto01Basic/rc/plugin.xml                     |   27 +
 Apps/Tuto01Basic/rc/profile.xml                    |   16 +
 Apps/Tuto01Basic/rc/tuto.ico                       |  Bin 0 -> 9158 bytes
 Apps/Tuto02DataServiceBasic/CMakeLists.txt         |    1 +
 Apps/Tuto02DataServiceBasic/COPYING                |  675 +++++++
 Apps/Tuto02DataServiceBasic/COPYING.LESSER         |  166 ++
 Apps/Tuto02DataServiceBasic/Properties.cmake       |    7 +
 Apps/Tuto02DataServiceBasic/bin/build.options      |   19 +
 Apps/Tuto02DataServiceBasic/rc/plugin.xml          |   68 +
 Apps/Tuto02DataServiceBasic/rc/profile.xml         |   33 +
 Apps/Tuto02DataServiceBasic/rc/tuto.ico            |  Bin 0 -> 9158 bytes
 Apps/Tuto02DataServiceBasicCtrl/CMakeLists.txt     |    1 +
 Apps/Tuto02DataServiceBasicCtrl/COPYING            |  675 +++++++
 Apps/Tuto02DataServiceBasicCtrl/COPYING.LESSER     |  166 ++
 Apps/Tuto02DataServiceBasicCtrl/Properties.cmake   |    7 +
 Apps/Tuto02DataServiceBasicCtrl/bin/build.options  |   22 +
 .../tuto02DataServiceBasicCtrl/Namespace.hpp       |   20 +
 .../include/tuto02DataServiceBasicCtrl/Plugin.hpp  |   58 +
 .../include/tuto02DataServiceBasicCtrl/config.hpp  |   39 +
 Apps/Tuto02DataServiceBasicCtrl/rc/plugin.xml      |    6 +
 Apps/Tuto02DataServiceBasicCtrl/rc/profile.xml     |   25 +
 Apps/Tuto02DataServiceBasicCtrl/rc/tuto.ico        |  Bin 0 -> 9158 bytes
 .../src/tuto02DataServiceBasicCtrl/Plugin.cpp      |  100 +
 Apps/Tuto03DataService/CMakeLists.txt              |    1 +
 Apps/Tuto03DataService/COPYING                     |  675 +++++++
 Apps/Tuto03DataService/COPYING.LESSER              |  166 ++
 Apps/Tuto03DataService/Properties.cmake            |    7 +
 Apps/Tuto03DataService/bin/build.options           |   18 +
 Apps/Tuto03DataService/rc/plugin.xml               |  100 +
 Apps/Tuto03DataService/rc/profile.xml              |   29 +
 Apps/Tuto03DataService/rc/tuto.ico                 |  Bin 0 -> 9158 bytes
 Apps/Tuto03DataServiceBis/CMakeLists.txt           |    1 +
 Apps/Tuto03DataServiceBis/COPYING                  |  675 +++++++
 Apps/Tuto03DataServiceBis/COPYING.LESSER           |  166 ++
 Apps/Tuto03DataServiceBis/Properties.cmake         |    7 +
 Apps/Tuto03DataServiceBis/bin/build.options        |   18 +
 Apps/Tuto03DataServiceBis/rc/plugin.xml            |  103 +
 Apps/Tuto03DataServiceBis/rc/profile.xml           |   30 +
 Apps/Tuto03DataServiceBis/rc/tuto.ico              |  Bin 0 -> 9158 bytes
 Apps/Tuto04ComChannel/CMakeLists.txt               |    1 +
 Apps/Tuto04ComChannel/COPYING                      |  675 +++++++
 Apps/Tuto04ComChannel/COPYING.LESSER               |  166 ++
 Apps/Tuto04ComChannel/Properties.cmake             |    7 +
 Apps/Tuto04ComChannel/bin/build.options            |   18 +
 .../rc/configurations/config-connect.xml           |  108 +
 .../rc/configurations/config-proxy.xml             |  102 +
 Apps/Tuto04ComChannel/rc/plugin.xml                |    7 +
 Apps/Tuto04ComChannel/rc/profile.xml               |   31 +
 Apps/Tuto04ComChannel/rc/profileProxy.xml          |   31 +
 Apps/Tuto04ComChannel/rc/tuto.ico                  |  Bin 0 -> 9158 bytes
 Apps/Tuto05Mesher/CMakeLists.txt                   |    1 +
 Apps/Tuto05Mesher/COPYING                          |  675 +++++++
 Apps/Tuto05Mesher/COPYING.LESSER                   |  166 ++
 Apps/Tuto05Mesher/Properties.cmake                 |    7 +
 Apps/Tuto05Mesher/bin/build.options                |   21 +
 Apps/Tuto05Mesher/rc/plugin.xml                    |  193 ++
 Apps/Tuto05Mesher/rc/profile.xml                   |   33 +
 Apps/Tuto05Mesher/rc/tuto.ico                      |  Bin 0 -> 9158 bytes
 Apps/Tuto05MesherB/CMakeLists.txt                  |    1 +
 Apps/Tuto05MesherB/COPYING                         |  675 +++++++
 Apps/Tuto05MesherB/COPYING.LESSER                  |  166 ++
 Apps/Tuto05MesherB/Properties.cmake                |    7 +
 Apps/Tuto05MesherB/bin/build.options               |   21 +
 Apps/Tuto05MesherB/rc/plugin.xml                   |  194 ++
 Apps/Tuto05MesherB/rc/profile.xml                  |   33 +
 Apps/Tuto05MesherB/rc/tuto.ico                     |  Bin 0 -> 9158 bytes
 Apps/Tuto05MesherC/CMakeLists.txt                  |    1 +
 Apps/Tuto05MesherC/COPYING                         |  675 +++++++
 Apps/Tuto05MesherC/COPYING.LESSER                  |  166 ++
 Apps/Tuto05MesherC/Properties.cmake                |    7 +
 Apps/Tuto05MesherC/bin/build.options               |   21 +
 Apps/Tuto05MesherC/rc/plugin.xml                   |  221 ++
 Apps/Tuto05MesherC/rc/profile.xml                  |   34 +
 Apps/Tuto05MesherC/rc/tuto.ico                     |  Bin 0 -> 9158 bytes
 Apps/Tuto06Filter/CMakeLists.txt                   |    1 +
 Apps/Tuto06Filter/COPYING                          |  675 +++++++
 Apps/Tuto06Filter/COPYING.LESSER                   |  166 ++
 Apps/Tuto06Filter/Properties.cmake                 |    7 +
 Apps/Tuto06Filter/bin/build.options                |   19 +
 Apps/Tuto06Filter/rc/plugin.xml                    |  113 ++
 Apps/Tuto06Filter/rc/profile.xml                   |   31 +
 Apps/Tuto06Filter/rc/tuto.ico                      |  Bin 0 -> 9158 bytes
 Apps/Tuto07LoaderForExternalData/CMakeLists.txt    |    1 +
 Apps/Tuto07LoaderForExternalData/COPYING           |  675 +++++++
 Apps/Tuto07LoaderForExternalData/COPYING.LESSER    |  166 ++
 Apps/Tuto07LoaderForExternalData/Properties.cmake  |    7 +
 Apps/Tuto07LoaderForExternalData/bin/build.options |   20 +
 .../Tuto07LoaderForExternalData/rc/ExternalData.us |    5 +
 Apps/Tuto07LoaderForExternalData/rc/plugin.xml     |  286 +++
 Apps/Tuto07LoaderForExternalData/rc/profile.xml    |   36 +
 .../rc/profileImageOnly.xml                        |   37 +
 Apps/Tuto07LoaderForExternalData/rc/tuto.ico       |  Bin 0 -> 9158 bytes
 Apps/Tuto08GenericScene/CMakeLists.txt             |    2 +
 Apps/Tuto08GenericScene/COPYING                    |  675 +++++++
 Apps/Tuto08GenericScene/COPYING.LESSER             |  166 ++
 Apps/Tuto08GenericScene/Properties.cmake           |    7 +
 Apps/Tuto08GenericScene/bin/build.options          |   22 +
 Apps/Tuto08GenericScene/rc/plugin.xml              |  181 ++
 Apps/Tuto08GenericScene/rc/profile.xml             |   31 +
 Apps/Tuto08GenericScene/rc/tuto.ico                |  Bin 0 -> 9158 bytes
 Apps/Tuto09MesherWithGenericScene/CMakeLists.txt   |    2 +
 Apps/Tuto09MesherWithGenericScene/COPYING          |  675 +++++++
 Apps/Tuto09MesherWithGenericScene/COPYING.LESSER   |  166 ++
 Apps/Tuto09MesherWithGenericScene/Properties.cmake |    7 +
 .../Tuto09MesherWithGenericScene/bin/build.options |   25 +
 Apps/Tuto09MesherWithGenericScene/rc/plugin.xml    |  236 +++
 Apps/Tuto09MesherWithGenericScene/rc/profile.xml   |   40 +
 Apps/Tuto09MesherWithGenericScene/rc/tuto.ico      |  Bin 0 -> 9158 bytes
 Apps/Tuto10MatrixTransformInGS/CMakeLists.txt      |    2 +
 Apps/Tuto10MatrixTransformInGS/COPYING             |  675 +++++++
 Apps/Tuto10MatrixTransformInGS/COPYING.LESSER      |  166 ++
 Apps/Tuto10MatrixTransformInGS/Properties.cmake    |    7 +
 Apps/Tuto10MatrixTransformInGS/bin/build.options   |   20 +
 Apps/Tuto10MatrixTransformInGS/rc/cube.trian       |   23 +
 Apps/Tuto10MatrixTransformInGS/rc/plugin.xml       |  231 +++
 Apps/Tuto10MatrixTransformInGS/rc/profile.xml      |   34 +
 Apps/Tuto10MatrixTransformInGS/rc/tuto.ico         |  Bin 0 -> 9158 bytes
 Apps/Tuto11LaunchBasicConfig/CMakeLists.txt        |    2 +
 Apps/Tuto11LaunchBasicConfig/COPYING               |  675 +++++++
 Apps/Tuto11LaunchBasicConfig/COPYING.LESSER        |  166 ++
 Apps/Tuto11LaunchBasicConfig/Properties.cmake      |    7 +
 Apps/Tuto11LaunchBasicConfig/bin/build.options     |   18 +
 .../rc/BasicFrameConfig.xml                        |   36 +
 Apps/Tuto11LaunchBasicConfig/rc/plugin.xml         |   83 +
 Apps/Tuto11LaunchBasicConfig/rc/profile.xml        |   30 +
 Apps/Tuto11LaunchBasicConfig/rc/tuto.ico           |  Bin 0 -> 9158 bytes
 Apps/Tuto12Picker/CMakeLists.txt                   |    2 +
 Apps/Tuto12Picker/COPYING                          |  675 +++++++
 Apps/Tuto12Picker/COPYING.LESSER                   |  166 ++
 Apps/Tuto12Picker/Properties.cmake                 |    7 +
 Apps/Tuto12Picker/bin/build.options                |   22 +
 Apps/Tuto12Picker/rc/plugin.xml                    |  197 ++
 Apps/Tuto12Picker/rc/profile.xml                   |   31 +
 Apps/Tuto12Picker/rc/tuto.ico                      |  Bin 0 -> 9158 bytes
 Apps/Tuto13Scene2D/CMakeLists.txt                  |    2 +
 Apps/Tuto13Scene2D/COPYING                         |  675 +++++++
 Apps/Tuto13Scene2D/COPYING.LESSER                  |  166 ++
 Apps/Tuto13Scene2D/Properties.cmake                |    7 +
 Apps/Tuto13Scene2D/bin/build.options               |   16 +
 Apps/Tuto13Scene2D/rc/plugin.xml                   |  121 ++
 Apps/Tuto13Scene2D/rc/profile.xml                  |   21 +
 Apps/Tuto13Scene2D/rc/tuto.ico                     |  Bin 0 -> 9158 bytes
 Apps/Tuto14MeshGenerator/CMakeLists.txt            |    2 +
 Apps/Tuto14MeshGenerator/COPYING                   |  675 +++++++
 Apps/Tuto14MeshGenerator/COPYING.LESSER            |  166 ++
 Apps/Tuto14MeshGenerator/Properties.cmake          |    7 +
 Apps/Tuto14MeshGenerator/bin/build.options         |   21 +
 Apps/Tuto14MeshGenerator/rc/plugin.xml             |  222 ++
 Apps/Tuto14MeshGenerator/rc/profile.xml            |   31 +
 Apps/Tuto14MeshGenerator/rc/tuto.ico               |  Bin 0 -> 9158 bytes
 Apps/Tuto15Multithread/CMakeLists.txt              |    2 +
 Apps/Tuto15Multithread/COPYING                     |  675 +++++++
 Apps/Tuto15Multithread/COPYING.LESSER              |  166 ++
 Apps/Tuto15Multithread/Properties.cmake            |    7 +
 Apps/Tuto15Multithread/bin/build.options           |   18 +
 .../rc/configurations/config-dynamic.xml           |  156 ++
 .../Tuto15Multithread/rc/configurations/config.xml |  136 ++
 .../rc/configurations/mesh-visu.xml                |   38 +
 Apps/Tuto15Multithread/rc/plugin.xml               |   11 +
 Apps/Tuto15Multithread/rc/profile.xml              |   31 +
 Apps/Tuto15Multithread/rc/profileDynamic.xml       |   31 +
 Apps/Tuto15Multithread/rc/tuto.ico                 |  Bin 0 -> 9158 bytes
 Apps/Tuto15MultithreadCtrl/CMakeLists.txt          |    1 +
 Apps/Tuto15MultithreadCtrl/COPYING                 |  675 +++++++
 Apps/Tuto15MultithreadCtrl/COPYING.LESSER          |  166 ++
 Apps/Tuto15MultithreadCtrl/Properties.cmake        |    7 +
 Apps/Tuto15MultithreadCtrl/bin/build.options       |   26 +
 .../include/Tuto15MultithreadCtrl/Namespace.hpp    |   20 +
 .../include/Tuto15MultithreadCtrl/Plugin.hpp       |   46 +
 .../Tuto15MultithreadCtrl/SIncrementArray.hpp      |   59 +
 .../include/Tuto15MultithreadCtrl/SReadArray.hpp   |   48 +
 .../include/Tuto15MultithreadCtrl/SShowArray.hpp   |   48 +
 .../include/Tuto15MultithreadCtrl/config.hpp       |   40 +
 Apps/Tuto15MultithreadCtrl/rc/plugin.xml           |   24 +
 Apps/Tuto15MultithreadCtrl/rc/profile.xml          |   10 +
 .../src/Tuto15MultithreadCtrl/Plugin.cpp           |  154 ++
 .../src/Tuto15MultithreadCtrl/SIncrementArray.cpp  |   92 +
 .../src/Tuto15MultithreadCtrl/SReadArray.cpp       |   84 +
 .../src/Tuto15MultithreadCtrl/SShowArray.cpp       |   72 +
 Apps/TutoGui/CMakeLists.txt                        |    2 +
 Apps/TutoGui/COPYING                               |  675 +++++++
 Apps/TutoGui/COPYING.LESSER                        |  166 ++
 Apps/TutoGui/Properties.cmake                      |    7 +
 Apps/TutoGui/bin/build.options                     |   18 +
 Apps/TutoGui/rc/icons/important.png                |  Bin 0 -> 1582 bytes
 Apps/TutoGui/rc/icons/monkey.png                   |  Bin 0 -> 2184 bytes
 Apps/TutoGui/rc/icons/system.png                   |  Bin 0 -> 2240 bytes
 Apps/TutoGui/rc/icons/unreadable.png               |  Bin 0 -> 1201 bytes
 Apps/TutoGui/rc/plugin.xml                         |  235 +++
 Apps/TutoGui/rc/profile.xml                        |   18 +
 Apps/TutoGui/rc/profileQt.xml                      |   18 +
 Apps/TutoGui/rc/tuto.ico                           |  Bin 0 -> 9158 bytes
 Apps/TutoPython/CMakeLists.txt                     |   11 +
 Apps/TutoPython/COPYING                            |  675 +++++++
 Apps/TutoPython/COPYING.LESSER                     |  166 ++
 Apps/TutoPython/Properties.cmake                   |    7 +
 Apps/TutoPython/bin/build.options                  |   17 +
 Apps/TutoPython/rc/icons/cross.png                 |  Bin 0 -> 1201 bytes
 Apps/TutoPython/rc/icons/python.png                |  Bin 0 -> 9930 bytes
 Apps/TutoPython/rc/plugin.xml                      |  110 +
 Apps/TutoPython/rc/profile.xml                     |   28 +
 Apps/TutoPython/rc/tuto.ico                        |  Bin 0 -> 9158 bytes
 Apps/TutoTrianConverterCtrl/CMakeLists.txt         |    5 +
 Apps/TutoTrianConverterCtrl/COPYING                |  675 +++++++
 Apps/TutoTrianConverterCtrl/COPYING.LESSER         |  166 ++
 Apps/TutoTrianConverterCtrl/Properties.cmake       |    7 +
 Apps/TutoTrianConverterCtrl/bin/build.options      |   14 +
 .../include/tutoTrianConverterCtrl/Namespace.hpp   |   21 +
 .../include/tutoTrianConverterCtrl/Plugin.hpp      |   51 +
 .../include/tutoTrianConverterCtrl/config.hpp      |   39 +
 Apps/TutoTrianConverterCtrl/rc/plugin.xml          |    6 +
 Apps/TutoTrianConverterCtrl/rc/profile.xml         |   13 +
 .../src/tutoTrianConverterCtrl/Plugin.cpp          |  130 ++
 Apps/TutoVectorField/CMakeLists.txt                |    1 +
 Apps/TutoVectorField/COPYING                       |  675 +++++++
 Apps/TutoVectorField/COPYING.LESSER                |  166 ++
 Apps/TutoVectorField/Properties.cmake              |    7 +
 Apps/TutoVectorField/bin/build.options             |   24 +
 Apps/TutoVectorField/rc/plugin.xml                 |  162 ++
 Apps/TutoVectorField/rc/profile.xml                |   32 +
 Apps/VRRender/CMakeLists.txt                       |  108 +
 Apps/VRRender/COPYING                              |  675 +++++++
 Apps/VRRender/COPYING.LESSER                       |  166 ++
 Apps/VRRender/Properties.cmake                     |   40 +
 Apps/VRRender/bin/build.options                    |   43 +
 Apps/VRRender/doc/Makefile                         |   88 +
 Apps/VRRender/doc/htmlhelpTowxHtmlHelp             |   22 +
 Apps/VRRender/doc/make.bat                         |  112 ++
 Apps/VRRender/doc/makeall.sh                       |   43 +
 Apps/VRRender/doc/source/2D_Landmarks.rst          |   23 +
 Apps/VRRender/doc/source/2D_MPR.rst                |   42 +
 Apps/VRRender/doc/source/3D_Distances.rst          |   23 +
 Apps/VRRender/doc/source/3D_Medical_Image_Visu.rst |   32 +
 .../VRRender/doc/source/3D_Models_Manipulation.rst |   42 +
 Apps/VRRender/doc/source/3D_Models_Properties.rst  |   20 +
 Apps/VRRender/doc/source/3D_Resection.rst          |   53 +
 Apps/VRRender/doc/source/3D_Volume_Rendering.rst   |   37 +
 Apps/VRRender/doc/source/Acknowledgment.rst        |  136 ++
 Apps/VRRender/doc/source/Basic_Image_Filtering.rst |   12 +
 Apps/VRRender/doc/source/Export_Data.rst           |    8 +
 Apps/VRRender/doc/source/Help_menu.rst             |   12 +
 Apps/VRRender/doc/source/Introduction.rst          |    9 +
 Apps/VRRender/doc/source/Licence.rst               |   23 +
 Apps/VRRender/doc/source/Minimal_config.rst        |   31 +
 Apps/VRRender/doc/source/Read_and_Select_Data.rst  |   26 +
 Apps/VRRender/doc/source/Shortcuts.rst             |  138 ++
 Apps/VRRender/doc/source/Start_VR_Planning.rst     |   17 +
 Apps/VRRender/doc/source/Tool_bar.rst              |   11 +
 Apps/VRRender/doc/source/Transfert_function.rst    |   31 +
 .../doc/source/What_is_Volume_Rendering.rst        |   15 +
 Apps/VRRender/doc/source/Windows_Installation.rst  |   16 +
 .../doc/source/_static/3D-New-Resection.png        |  Bin 0 -> 219192 bytes
 .../doc/source/_static/3D-Planning-View-00.png     |  Bin 0 -> 207145 bytes
 .../doc/source/_static/3D-Resect-First.png         |  Bin 0 -> 252338 bytes
 .../source/_static/3D-Resect-cutting-planes.png    |  Bin 0 -> 284064 bytes
 .../doc/source/_static/3D-Resect-manage.png        |  Bin 0 -> 171825 bytes
 .../doc/source/_static/3D-Resect-plane-side.png    |  Bin 0 -> 263504 bytes
 .../doc/source/_static/3D-Resect-start.png         |  Bin 0 -> 189534 bytes
 .../doc/source/_static/3D-Resect-volume.png        |  Bin 0 -> 242396 bytes
 Apps/VRRender/doc/source/_static/3D-distance.png   |  Bin 0 -> 142029 bytes
 Apps/VRRender/doc/source/_static/3D-landmark.png   |  Bin 0 -> 163292 bytes
 Apps/VRRender/doc/source/_static/3D-rotate.png     |  Bin 0 -> 191571 bytes
 Apps/VRRender/doc/source/_static/3D-scan-1-3.png   |  Bin 0 -> 222456 bytes
 .../doc/source/_static/3D-scan-GL-value.png        |  Bin 0 -> 157133 bytes
 .../doc/source/_static/3D-scan-ax-front-sag.png    |  Bin 0 -> 190004 bytes
 .../doc/source/_static/3D-scan-contrast.png        |  Bin 0 -> 160927 bytes
 .../doc/source/_static/3D-show-hide-organs.png     |  Bin 0 -> 208376 bytes
 .../doc/source/_static/3D-show-hide-scan.png       |  Bin 0 -> 230334 bytes
 .../VRRender/doc/source/_static/3D-translation.png |  Bin 0 -> 79500 bytes
 .../doc/source/_static/3D-transparency.png         |  Bin 0 -> 188677 bytes
 Apps/VRRender/doc/source/_static/3D-turn.png       |  Bin 0 -> 152259 bytes
 Apps/VRRender/doc/source/_static/3D-zoom.png       |  Bin 0 -> 93864 bytes
 .../doc/source/_static/Add-Find-View-landmark.png  |  Bin 0 -> 5482 bytes
 Apps/VRRender/doc/source/_static/Add-landmark.png  |  Bin 0 -> 1577 bytes
 Apps/VRRender/doc/source/_static/Add-plan1.png     |  Bin 0 -> 2312 bytes
 Apps/VRRender/doc/source/_static/Add-plan2.png     |  Bin 0 -> 2846 bytes
 Apps/VRRender/doc/source/_static/AddTool.png       |  Bin 0 -> 1052 bytes
 Apps/VRRender/doc/source/_static/Find-landmark.png |  Bin 0 -> 2122 bytes
 Apps/VRRender/doc/source/_static/Mode-VR.png       |  Bin 0 -> 1981 bytes
 Apps/VRRender/doc/source/_static/Negato-01.png     |  Bin 0 -> 291839 bytes
 .../doc/source/_static/Negato-Distance.png         |  Bin 0 -> 223655 bytes
 Apps/VRRender/doc/source/_static/Negato-Zoom.png   |  Bin 0 -> 209461 bytes
 Apps/VRRender/doc/source/_static/Negato-axes.png   |  Bin 0 -> 298175 bytes
 .../doc/source/_static/Negato-contrast.png         |  Bin 0 -> 152816 bytes
 Apps/VRRender/doc/source/_static/Negato-filter.png |  Bin 0 -> 164233 bytes
 Apps/VRRender/doc/source/_static/Negato-info.png   |  Bin 0 -> 276129 bytes
 .../doc/source/_static/Negato-landmarks.png        |  Bin 0 -> 325920 bytes
 .../doc/source/_static/Negato-translate.png        |  Bin 0 -> 240307 bytes
 Apps/VRRender/doc/source/_static/Resection.png     |  Bin 0 -> 1439 bytes
 Apps/VRRender/doc/source/_static/Resection2.png    |  Bin 0 -> 2287 bytes
 .../doc/source/_static/Tool-bar-planning.png       |  Bin 0 -> 24281 bytes
 Apps/VRRender/doc/source/_static/VR-01.jpg         |  Bin 0 -> 79308 bytes
 Apps/VRRender/doc/source/_static/VR-DEF.jpg        |  Bin 0 -> 24294 bytes
 Apps/VRRender/doc/source/_static/VR-TF-01.jpg      |  Bin 0 -> 34932 bytes
 Apps/VRRender/doc/source/_static/VR-TF-02.jpg      |  Bin 0 -> 28750 bytes
 Apps/VRRender/doc/source/_static/VR-TF-AUTO-01.png |  Bin 0 -> 239456 bytes
 Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.jpg |  Bin 0 -> 34801 bytes
 Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.png |  Bin 0 -> 370325 bytes
 Apps/VRRender/doc/source/_static/VR-TF-DEF.jpg     |  Bin 0 -> 56208 bytes
 Apps/VRRender/doc/source/_static/VR-TF-MPR-01.jpg  |  Bin 0 -> 99344 bytes
 Apps/VRRender/doc/source/_static/VR-TF-MPR-02.jpg  |  Bin 0 -> 101031 bytes
 Apps/VRRender/doc/source/_static/VR-cutting.jpg    |  Bin 0 -> 33487 bytes
 Apps/VRRender/doc/source/_static/VR-manip.jpg      |  Bin 0 -> 23377 bytes
 Apps/VRRender/doc/source/_static/VR.png            |  Bin 0 -> 49100 bytes
 Apps/VRRender/doc/source/_static/VRPlanning.png    |  Bin 0 -> 40972 bytes
 Apps/VRRender/doc/source/_static/VR_WLE_html.png   |  Bin 0 -> 20559 bytes
 Apps/VRRender/doc/source/_static/VR_html.png       |  Bin 0 -> 35500 bytes
 Apps/VRRender/doc/source/_static/View-INFO.png     |  Bin 0 -> 260 bytes
 Apps/VRRender/doc/source/_static/View-landmark.png |  Bin 0 -> 2538 bytes
 .../doc/source/_static/acknowledgment/apple.png    |  Bin 0 -> 65027 bytes
 .../doc/source/_static/acknowledgment/boost.png    |  Bin 0 -> 7192 bytes
 .../doc/source/_static/acknowledgment/bzip2.png    |  Bin 0 -> 6589 bytes
 .../doc/source/_static/acknowledgment/cfitsio.png  |  Bin 0 -> 7683 bytes
 .../doc/source/_static/acknowledgment/dcmtk.png    |  Bin 0 -> 6761 bytes
 .../doc/source/_static/acknowledgment/doxygen.png  |  Bin 0 -> 11988 bytes
 .../doc/source/_static/acknowledgment/eclipse.png  |  Bin 0 -> 13860 bytes
 .../doc/source/_static/acknowledgment/ehealth.png  |  Bin 0 -> 411007 bytes
 .../doc/source/_static/acknowledgment/fits2itk.png |  Bin 0 -> 7367 bytes
 .../doc/source/_static/acknowledgment/fsf.png      |  Bin 0 -> 6409 bytes
 .../doc/source/_static/acknowledgment/gcc.png      |  Bin 0 -> 28137 bytes
 .../doc/source/_static/acknowledgment/gdcm.png     |  Bin 0 -> 9736 bytes
 .../doc/source/_static/acknowledgment/itk.png      |  Bin 0 -> 9372 bytes
 .../doc/source/_static/acknowledgment/libjpeg.png  |  Bin 0 -> 2829 bytes
 .../doc/source/_static/acknowledgment/libpng.png   |  Bin 0 -> 2655 bytes
 .../doc/source/_static/acknowledgment/libtiff.png  |  Bin 0 -> 2118 bytes
 .../doc/source/_static/acknowledgment/libxml2.png  |  Bin 0 -> 7940 bytes
 .../doc/source/_static/acknowledgment/linux-64.png |  Bin 0 -> 29352 bytes
 .../doc/source/_static/acknowledgment/linux.png    |  Bin 0 -> 31211 bytes
 .../doc/source/_static/acknowledgment/log4cxx.png  |  Bin 0 -> 6161 bytes
 .../doc/source/_static/acknowledgment/ms.png       |  Bin 0 -> 13902 bytes
 .../doc/source/_static/acknowledgment/opengl.png   |  Bin 0 -> 7428 bytes
 .../doc/source/_static/acknowledgment/python.png   |  Bin 0 -> 2641 bytes
 .../doc/source/_static/acknowledgment/scons.png    |  Bin 0 -> 5926 bytes
 .../doc/source/_static/acknowledgment/sphinx.png   |  Bin 0 -> 4624 bytes
 .../doc/source/_static/acknowledgment/vim.png      |  Bin 0 -> 15549 bytes
 .../doc/source/_static/acknowledgment/visualc.png  |  Bin 0 -> 7902 bytes
 .../doc/source/_static/acknowledgment/vtk.png      |  Bin 0 -> 8157 bytes
 .../source/_static/acknowledgment/vtkinria3d.png   |  Bin 0 -> 10656 bytes
 .../doc/source/_static/acknowledgment/wix.png      |  Bin 0 -> 17600 bytes
 .../doc/source/_static/acknowledgment/wx.png       |  Bin 0 -> 9304 bytes
 .../doc/source/_static/acknowledgment/zlib.png     |  Bin 0 -> 9172 bytes
 Apps/VRRender/doc/source/_static/axial-view.jpg    |  Bin 0 -> 16033 bytes
 Apps/VRRender/doc/source/_static/basic.css         |  414 ++++
 Apps/VRRender/doc/source/_static/camera-photo.png  |  Bin 0 -> 864 bytes
 Apps/VRRender/doc/source/_static/danger.png        |  Bin 0 -> 18201 bytes
 Apps/VRRender/doc/source/_static/default.css       |  201 ++
 Apps/VRRender/doc/source/_static/distance.png      |  Bin 0 -> 763 bytes
 Apps/VRRender/doc/source/_static/doctools.js       |  232 +++
 Apps/VRRender/doc/source/_static/ehealth.png       |  Bin 0 -> 411007 bytes
 Apps/VRRender/doc/source/_static/file.png          |  Bin 0 -> 392 bytes
 Apps/VRRender/doc/source/_static/frontal-view.jpg  |  Bin 0 -> 11859 bytes
 Apps/VRRender/doc/source/_static/icon-2D.png       |  Bin 0 -> 1383 bytes
 Apps/VRRender/doc/source/_static/icon-3D.png       |  Bin 0 -> 1796 bytes
 Apps/VRRender/doc/source/_static/icon-VR.png       |  Bin 0 -> 1487 bytes
 Apps/VRRender/doc/source/_static/icon-axial.png    |  Bin 0 -> 1556 bytes
 Apps/VRRender/doc/source/_static/icon-frontal.png  |  Bin 0 -> 1883 bytes
 Apps/VRRender/doc/source/_static/icon-sagittal.png |  Bin 0 -> 2000 bytes
 Apps/VRRender/doc/source/_static/icon-windows.jpg  |  Bin 0 -> 768 bytes
 Apps/VRRender/doc/source/_static/icone-F9.png      |  Bin 0 -> 1906 bytes
 Apps/VRRender/doc/source/_static/icone-VR-01.jpg   |  Bin 0 -> 947 bytes
 Apps/VRRender/doc/source/_static/icone-VR-02.jpg   |  Bin 0 -> 820 bytes
 Apps/VRRender/doc/source/_static/icone-VR-03.jpg   |  Bin 0 -> 904 bytes
 Apps/VRRender/doc/source/_static/icone-VR-04.jpg   |  Bin 0 -> 849 bytes
 Apps/VRRender/doc/source/_static/icone-VR-05.jpg   |  Bin 0 -> 898 bytes
 Apps/VRRender/doc/source/_static/icone-VR-06.jpg   |  Bin 0 -> 984 bytes
 Apps/VRRender/doc/source/_static/info-patient.png  |  Bin 0 -> 188609 bytes
 Apps/VRRender/doc/source/_static/jquery.js         |   32 +
 Apps/VRRender/doc/source/_static/minus.png         |  Bin 0 -> 199 bytes
 Apps/VRRender/doc/source/_static/openDicom.png     |  Bin 0 -> 1786 bytes
 .../doc/source/_static/openDicom_openFxz.png       |  Bin 0 -> 2880 bytes
 Apps/VRRender/doc/source/_static/openFxz.png       |  Bin 0 -> 1632 bytes
 Apps/VRRender/doc/source/_static/operation.png     |  Bin 0 -> 3316 bytes
 Apps/VRRender/doc/source/_static/plus.png          |  Bin 0 -> 199 bytes
 Apps/VRRender/doc/source/_static/pygments.css      |   61 +
 Apps/VRRender/doc/source/_static/sagittal-view.jpg |  Bin 0 -> 10483 bytes
 Apps/VRRender/doc/source/_static/searchtools.js    |  467 +++++
 Apps/VRRender/doc/source/_static/sliceHide.png     |  Bin 0 -> 947 bytes
 Apps/VRRender/doc/source/_static/sliceShow.png     |  Bin 0 -> 545 bytes
 Apps/VRRender/doc/source/_static/video.png         |  Bin 0 -> 3717 bytes
 Apps/VRRender/doc/source/_static/view_frontal.png  |  Bin 0 -> 2048 bytes
 Apps/VRRender/doc/source/_static/view_profil.png   |  Bin 0 -> 2215 bytes
 Apps/VRRender/doc/source/conf.py                   |  208 ++
 Apps/VRRender/doc/source/index.rst                 |   37 +
 Apps/VRRender/rc/about/about.html                  |   25 +
 Apps/VRRender/rc/about/ircad_150.png               |  Bin 0 -> 4187 bytes
 Apps/VRRender/rc/about/vrrender_128.png            |  Bin 0 -> 13585 bytes
 .../rc/configurations/MenuAndViewConfig.xml        |   43 +
 Apps/VRRender/rc/configurations/VRRenderBase.xml   |  166 ++
 Apps/VRRender/rc/configurations/sdb.xml            |  127 ++
 Apps/VRRender/rc/documentations/ack.html           |   72 +
 Apps/VRRender/rc/documentations/ack.png            |  Bin 0 -> 163061 bytes
 Apps/VRRender/rc/documentations/apple.png          |  Bin 0 -> 2724 bytes
 Apps/VRRender/rc/documentations/boost.png          |  Bin 0 -> 5159 bytes
 Apps/VRRender/rc/documentations/bzip2.png          |  Bin 0 -> 4302 bytes
 Apps/VRRender/rc/documentations/cfitsio.png        |  Bin 0 -> 4495 bytes
 Apps/VRRender/rc/documentations/dcmtk.png          |  Bin 0 -> 5789 bytes
 Apps/VRRender/rc/documentations/doxygen.png        |  Bin 0 -> 2635 bytes
 Apps/VRRender/rc/documentations/eclipse.png        |  Bin 0 -> 2806 bytes
 Apps/VRRender/rc/documentations/fits2itk.png       |  Bin 0 -> 5942 bytes
 Apps/VRRender/rc/documentations/fsf.png            |  Bin 0 -> 1795 bytes
 Apps/VRRender/rc/documentations/gcc.png            |  Bin 0 -> 2034 bytes
 Apps/VRRender/rc/documentations/gdcm.png           |  Bin 0 -> 6026 bytes
 Apps/VRRender/rc/documentations/ircad.gif          |  Bin 0 -> 3515 bytes
 Apps/VRRender/rc/documentations/ircad.png          |  Bin 0 -> 26118 bytes
 Apps/VRRender/rc/documentations/ircad_150.png      |  Bin 0 -> 4187 bytes
 Apps/VRRender/rc/documentations/itk.png            |  Bin 0 -> 7093 bytes
 Apps/VRRender/rc/documentations/libjpeg.png        |  Bin 0 -> 1965 bytes
 Apps/VRRender/rc/documentations/libpng.png         |  Bin 0 -> 1938 bytes
 Apps/VRRender/rc/documentations/libtiff.png        |  Bin 0 -> 1766 bytes
 Apps/VRRender/rc/documentations/libxml2.png        |  Bin 0 -> 5524 bytes
 Apps/VRRender/rc/documentations/linux-64.png       |  Bin 0 -> 1716 bytes
 Apps/VRRender/rc/documentations/linux.png          |  Bin 0 -> 1582 bytes
 Apps/VRRender/rc/documentations/log4cxx.png        |  Bin 0 -> 4285 bytes
 Apps/VRRender/rc/documentations/ms.png             |  Bin 0 -> 2847 bytes
 Apps/VRRender/rc/documentations/opengl.png         |  Bin 0 -> 6544 bytes
 Apps/VRRender/rc/documentations/python.png         |  Bin 0 -> 1594 bytes
 Apps/VRRender/rc/documentations/qt.png             |  Bin 0 -> 5149 bytes
 Apps/VRRender/rc/documentations/scons.png          |  Bin 0 -> 1500 bytes
 Apps/VRRender/rc/documentations/sphinx.png         |  Bin 0 -> 2041 bytes
 Apps/VRRender/rc/documentations/visualc.png        |  Bin 0 -> 1821 bytes
 Apps/VRRender/rc/documentations/vrrender.ico       |  Bin 0 -> 136606 bytes
 Apps/VRRender/rc/documentations/vrrender.png       |  Bin 0 -> 299435 bytes
 Apps/VRRender/rc/documentations/vrrender2.png      |  Bin 0 -> 29973 bytes
 Apps/VRRender/rc/documentations/vrrender_128.png   |  Bin 0 -> 13585 bytes
 Apps/VRRender/rc/documentations/vrrender_96.png    |  Bin 0 -> 8787 bytes
 Apps/VRRender/rc/documentations/vtk.png            |  Bin 0 -> 5343 bytes
 Apps/VRRender/rc/documentations/vtkinria3d.png     |  Bin 0 -> 7807 bytes
 Apps/VRRender/rc/documentations/wix.png            |  Bin 0 -> 2326 bytes
 Apps/VRRender/rc/documentations/wx.png             |  Bin 0 -> 9441 bytes
 Apps/VRRender/rc/documentations/zlib.png           |  Bin 0 -> 6638 bytes
 Apps/VRRender/rc/plugin.xml                        |  102 +
 Apps/VRRender/rc/profile.xml                       |   67 +
 Apps/VRRender/rc/vrrender.ico                      |  Bin 0 -> 136606 bytes
 .../2DVisualizationActivity/CMakeLists.txt         |    2 +
 .../2DVisualizationActivity/Properties.cmake       |    7 +
 .../2DVisualizationActivity/bin/build.options      |   14 +
 .../rc/configurations/2DNegato.xml                 |  124 ++
 .../rc/configurations/2DNegatoWithTF.xml           |  126 ++
 .../rc/configurations/2DVisualization.xml          |  158 ++
 .../2DVisualizationActivity/rc/plugin.xml          |   34 +
 .../3DVisualizationActivity/CMakeLists.txt         |    2 +
 .../3DVisualizationActivity/Properties.cmake       |    7 +
 .../3DVisualizationActivity/bin/build.options      |   16 +
 .../rc/configurations/3DNegatoWithAcq.xml          |  162 ++
 .../rc/configurations/3DVisualization.xml          |  264 +++
 .../rc/configurations/ManageOrganWithSeries.xml    |   87 +
 .../3DVisualizationActivity/rc/plugin.xml          |   33 +
 Bundles/LeafActivity/blendActivity/CMakeLists.txt  |    2 +
 .../LeafActivity/blendActivity/Properties.cmake    |    7 +
 .../LeafActivity/blendActivity/bin/build.options   |   14 +
 .../blendActivity/rc/configurations/Blend.xml      |  130 ++
 .../blendActivity/rc/configurations/ImageMix.xml   |  212 ++
 .../rc/configurations/TransferFunctionEditor.xml   |  278 +++
 Bundles/LeafActivity/blendActivity/rc/plugin.xml   |   38 +
 .../volumeRenderingActivity/CMakeLists.txt         |    3 +
 .../volumeRenderingActivity/Properties.cmake       |    7 +
 .../volumeRenderingActivity/bin/build.options      |   22 +
 .../rc/configurations/VolumeRendering.xml          |  429 ++++
 .../volumeRenderingActivity/rc/plugin.xml          |   33 +
 .../LeafAtomFilter/filterVRRender/CMakeLists.txt   |    4 +
 .../LeafAtomFilter/filterVRRender/Properties.cmake |   15 +
 .../filterVRRender/bin/build.options               |   11 +
 .../include/filterVRRender/MedicalDataV1.hpp       |   47 +
 .../include/filterVRRender/MedicalDataV2.hpp       |   46 +
 .../include/filterVRRender/Plugin.hpp              |   42 +
 .../include/filterVRRender/config.hpp              |   41 +
 .../LeafAtomFilter/filterVRRender/rc/plugin.xml    |    6 +
 .../src/filterVRRender/MedicalDataV1.cpp           |   60 +
 .../src/filterVRRender/MedicalDataV2.cpp           |   66 +
 .../filterVRRender/src/filterVRRender/Plugin.cpp   |   26 +
 .../filterVRRender/test/cppunit.options            |   16 +
 .../test/tu/include/MedicalDataV1Test.hpp          |   44 +
 .../filterVRRender/test/tu/rc/profile.xml          |   10 +
 .../test/tu/src/MedicalDataV1Test.cpp              |   93 +
 Bundles/LeafCtrl/ctrlMemory/CMakeLists.txt         |   10 +
 Bundles/LeafCtrl/ctrlMemory/COPYING                |  675 +++++++
 Bundles/LeafCtrl/ctrlMemory/COPYING.LESSER         |  166 ++
 Bundles/LeafCtrl/ctrlMemory/Properties.cmake       |    7 +
 Bundles/LeafCtrl/ctrlMemory/bin/build.options      |    7 +
 .../ctrlMemory/include/ctrlMemory/LockDumpSrv.hpp  |   73 +
 .../ctrlMemory/include/ctrlMemory/Plugin.hpp       |   34 +
 .../ctrlMemory/include/ctrlMemory/config.hpp       |   40 +
 .../ctrlMemory/manager/LockDumpManagerSrv.hpp      |   99 +
 .../ctrlMemory/include/ctrlMemory/namespace.hpp    |   27 +
 Bundles/LeafCtrl/ctrlMemory/rc/plugin.xml          |   24 +
 .../ctrlMemory/src/ctrlMemory/LockDumpSrv.cpp      |   69 +
 .../LeafCtrl/ctrlMemory/src/ctrlMemory/Plugin.cpp  |   37 +
 .../src/ctrlMemory/manager/LockDumpManagerSrv.cpp  |  156 ++
 Bundles/LeafCtrl/ctrlSelection/CMakeLists.txt      |   11 +
 Bundles/LeafCtrl/ctrlSelection/COPYING             |  675 +++++++
 Bundles/LeafCtrl/ctrlSelection/COPYING.LESSER      |  166 ++
 Bundles/LeafCtrl/ctrlSelection/Properties.cmake    |    7 +
 Bundles/LeafCtrl/ctrlSelection/bin/build.options   |   14 +
 .../include/ctrlSelection/BookmarkSrv.hpp          |   77 +
 .../include/ctrlSelection/IManagerSrv.hpp          |  137 ++
 .../include/ctrlSelection/IUpdaterSrv.hpp          |   90 +
 .../include/ctrlSelection/IWrapperSrv.hpp          |   46 +
 .../include/ctrlSelection/ImageUpdateAxis.hpp      |   86 +
 .../include/ctrlSelection/MedicalImageSrv.hpp      |   72 +
 .../include/ctrlSelection/Namespace.hpp            |   21 +
 .../ctrlSelection/include/ctrlSelection/Plugin.hpp |   33 +
 .../ctrlSelection/include/ctrlSelection/config.hpp |   40 +
 .../manager/MedicalImageManagerSrv.hpp             |   76 +
 .../include/ctrlSelection/manager/Namespace.hpp    |   24 +
 .../include/ctrlSelection/manager/SField.hpp       |  150 ++
 .../include/ctrlSelection/manager/SwapperSrv.hpp   |  151 ++
 .../updater/DataInfoFromMsgUpdaterSrv.hpp          |   75 +
 .../include/ctrlSelection/updater/Namespace.hpp    |   25 +
 .../ctrlSelection/updater/ObjFromMsgUpdaterSrv.hpp |   75 +
 .../updater/ReconstructionFromResecUpdaterSrv.hpp  |   79 +
 .../include/ctrlSelection/updater/SDrop.hpp        |   66 +
 .../SReconstructionFromModelSeriesUpdater.hpp      |   87 +
 .../ctrlSelection/updater/TranslateUpdater.hpp     |   79 +
 .../ctrlSelection/wrapper/GraphWrapperSrv.hpp      |   72 +
 .../ctrlSelection/wrapper/ImageWrapperSrv.hpp      |   72 +
 .../ctrlSelection/wrapper/MsgForwarderSrv.hpp      |   89 +
 .../ctrlSelection/wrapper/MsgWrapperSrv.hpp        |   79 +
 .../include/ctrlSelection/wrapper/Namespace.hpp    |   24 +
 .../wrapper/ObjToCompositeMsgForwarderSrv.hpp      |   90 +
 Bundles/LeafCtrl/ctrlSelection/rc/plugin.xml       |  113 ++
 .../src/ctrlSelection/BookmarkSrv.cpp              |  109 +
 .../src/ctrlSelection/IManagerSrv.cpp              |  233 +++
 .../src/ctrlSelection/IUpdaterSrv.cpp              |  140 ++
 .../src/ctrlSelection/IWrapperSrv.cpp              |   24 +
 .../src/ctrlSelection/ImageUpdateAxis.cpp          |  147 ++
 .../src/ctrlSelection/MedicalImageSrv.cpp          |  105 +
 .../ctrlSelection/src/ctrlSelection/Plugin.cpp     |   39 +
 .../manager/MedicalImageManagerSrv.cpp             |  135 ++
 .../src/ctrlSelection/manager/SField.cpp           |  444 ++++
 .../src/ctrlSelection/manager/SwapperSrv.cpp       |  458 +++++
 .../updater/DataInfoFromMsgUpdaterSrv.cpp          |  110 +
 .../ctrlSelection/updater/ObjFromMsgUpdaterSrv.cpp |  100 +
 .../updater/ReconstructionFromResecUpdaterSrv.cpp  |  124 ++
 .../src/ctrlSelection/updater/SDrop.cpp            |  130 ++
 .../SReconstructionFromModelSeriesUpdater.cpp      |  127 ++
 .../src/ctrlSelection/updater/TranslateUpdater.cpp |  175 ++
 .../src/ctrlSelection/wrapper/GraphWrapperSrv.cpp  |   62 +
 .../src/ctrlSelection/wrapper/ImageWrapperSrv.cpp  |   63 +
 .../src/ctrlSelection/wrapper/MsgForwarderSrv.cpp  |  126 ++
 .../src/ctrlSelection/wrapper/MsgWrapperSrv.cpp    |   93 +
 .../wrapper/ObjToCompositeMsgForwarderSrv.cpp      |  190 ++
 Bundles/LeafCtrl/monitor/CMakeLists.txt            |   15 +
 Bundles/LeafCtrl/monitor/Properties.cmake          |    7 +
 Bundles/LeafCtrl/monitor/bin/build.options         |   19 +
 .../LeafCtrl/monitor/include/monitor/Plugin.hpp    |   34 +
 .../include/monitor/action/MemoryConsumption.hpp   |   79 +
 .../monitor/include/monitor/action/MemoryInfo.hpp  |   53 +
 .../monitor/include/monitor/action/SDumpAll.hpp    |   56 +
 .../monitor/include/monitor/action/fwMetrics.hpp   |   53 +
 .../monitor/include/monitor/action/namespace.hpp   |   24 +
 .../LeafCtrl/monitor/include/monitor/config.hpp    |   39 +
 .../include/monitor/installSIGSEVBacktrace.hpp     |   33 +
 .../LeafCtrl/monitor/include/monitor/namespace.hpp |   20 +
 Bundles/LeafCtrl/monitor/rc/plugin.xml             |   29 +
 Bundles/LeafCtrl/monitor/src/monitor/Plugin.cpp    |   38 +
 .../src/monitor/action/MemoryConsumption.cpp       |  124 ++
 .../monitor/src/monitor/action/MemoryInfo.cpp      |   95 +
 .../monitor/src/monitor/action/SDumpAll.cpp        |   93 +
 .../monitor/src/monitor/action/fwMetrics.cpp       |   91 +
 .../monitor/src/monitor/installSIGSEVBacktrace.cpp |  310 +++
 Bundles/LeafIO/ioAtoms/CMakeLists.txt              |   11 +
 Bundles/LeafIO/ioAtoms/COPYING                     |  675 +++++++
 Bundles/LeafIO/ioAtoms/COPYING.LESSER              |  166 ++
 Bundles/LeafIO/ioAtoms/Properties.cmake            |   22 +
 Bundles/LeafIO/ioAtoms/bin/build.options           |   23 +
 Bundles/LeafIO/ioAtoms/include/ioAtoms/Plugin.hpp  |   42 +
 Bundles/LeafIO/ioAtoms/include/ioAtoms/SReader.hpp |  156 ++
 Bundles/LeafIO/ioAtoms/include/ioAtoms/SWriter.hpp |  136 ++
 Bundles/LeafIO/ioAtoms/include/ioAtoms/config.hpp  |   41 +
 .../LeafIO/ioAtoms/include/ioAtoms/namespace.hpp   |   22 +
 Bundles/LeafIO/ioAtoms/rc/plugin.xml               |   27 +
 Bundles/LeafIO/ioAtoms/src/ioAtoms/Plugin.cpp      |   26 +
 Bundles/LeafIO/ioAtoms/src/ioAtoms/SReader.cpp     |  452 +++++
 Bundles/LeafIO/ioAtoms/src/ioAtoms/SWriter.cpp     |  374 ++++
 Bundles/LeafIO/ioAtoms/test/CMakeLists.txt         |   10 +
 Bundles/LeafIO/ioAtoms/test/Properties.cmake       |    8 +
 Bundles/LeafIO/ioAtoms/test/cppunit.options        |   18 +
 .../LeafIO/ioAtoms/test/tu/include/IoAtomsTest.hpp |   44 +
 Bundles/LeafIO/ioAtoms/test/tu/rc/profile.xml      |   13 +
 Bundles/LeafIO/ioAtoms/test/tu/src/IoAtomsTest.cpp |  244 +++
 Bundles/LeafIO/ioData/CMakeLists.txt               |   18 +
 Bundles/LeafIO/ioData/COPYING                      |  675 +++++++
 Bundles/LeafIO/ioData/COPYING.LESSER               |  166 ++
 Bundles/LeafIO/ioData/Properties.cmake             |   17 +
 Bundles/LeafIO/ioData/bin/build.options            |   17 +
 .../ioData/include/ioData/CameraReaderService.hpp  |  126 ++
 .../ioData/include/ioData/MeshReaderService.hpp    |  118 ++
 .../ioData/include/ioData/MeshWriterService.hpp    |  127 ++
 Bundles/LeafIO/ioData/include/ioData/Namespace.hpp |   21 +
 Bundles/LeafIO/ioData/include/ioData/Plugin.hpp    |   41 +
 .../ioData/include/ioData/SplineReaderService.hpp  |  161 ++
 .../ioData/TransformationMatrix3DReaderService.hpp |  117 ++
 .../ioData/TransformationMatrix3DWriterService.hpp |  119 ++
 .../include/ioData/TriangularMeshReaderService.hpp |  116 ++
 .../include/ioData/TriangularMeshWriterService.hpp |  118 ++
 .../ioData/include/ioData/action/SMeshModifier.hpp |  106 +
 Bundles/LeafIO/ioData/include/ioData/export.hpp    |   41 +
 Bundles/LeafIO/ioData/rc/plugin.xml                |   66 +
 .../ioData/src/ioData/CameraReaderService.cpp      |  122 ++
 .../LeafIO/ioData/src/ioData/MeshReaderService.cpp |  132 ++
 .../LeafIO/ioData/src/ioData/MeshWriterService.cpp |  125 ++
 Bundles/LeafIO/ioData/src/ioData/Plugin.cpp        |   25 +
 .../ioData/src/ioData/SplineReaderService.cpp      |  163 ++
 .../ioData/TransformationMatrix3DReaderService.cpp |  130 ++
 .../ioData/TransformationMatrix3DWriterService.cpp |  130 ++
 .../src/ioData/TriangularMeshReaderService.cpp     |  110 +
 .../src/ioData/TriangularMeshWriterService.cpp     |  106 +
 .../ioData/src/ioData/action/SMeshModifier.cpp     |  169 ++
 Bundles/LeafIO/ioITK/CMakeLists.txt                |   44 +
 Bundles/LeafIO/ioITK/Properties.cmake              |    7 +
 Bundles/LeafIO/ioITK/bin/build.options             |   18 +
 .../ioITK/include/ioITK/InrImageReaderService.hpp  |   68 +
 .../ioITK/include/ioITK/InrImageWriterService.hpp  |   64 +
 .../ioITK/include/ioITK/JpgImageWriterService.hpp  |   67 +
 Bundles/LeafIO/ioITK/include/ioITK/Plugin.hpp      |   38 +
 .../ioITK/include/ioITK/SImageSeriesWriter.hpp     |   58 +
 .../ioITK/include/ioITK/SInrSeriesDBReader.hpp     |   79 +
 .../ioITK/include/ioITK/SJpgImageSeriesWriter.hpp  |   58 +
 Bundles/LeafIO/ioITK/include/ioITK/export.hpp      |   40 +
 Bundles/LeafIO/ioITK/rc/plugin.xml                 |   50 +
 .../ioITK/src/ioITK/InrImageReaderService.cpp      |  163 ++
 .../ioITK/src/ioITK/InrImageWriterService.cpp      |  156 ++
 .../ioITK/src/ioITK/JpgImageWriterService.cpp      |  156 ++
 Bundles/LeafIO/ioITK/src/ioITK/Plugin.cpp          |   33 +
 .../LeafIO/ioITK/src/ioITK/SImageSeriesWriter.cpp  |  128 ++
 .../LeafIO/ioITK/src/ioITK/SInrSeriesDBReader.cpp  |  205 ++
 .../ioITK/src/ioITK/SJpgImageSeriesWriter.cpp      |  143 ++
 Bundles/LeafIO/ioITK/test/CMakeLists.txt           |   10 +
 Bundles/LeafIO/ioITK/test/Properties.cmake         |    8 +
 Bundles/LeafIO/ioITK/test/cppunit.options          |   18 +
 Bundles/LeafIO/ioITK/test/tu/include/IoItkTest.hpp |   69 +
 Bundles/LeafIO/ioITK/test/tu/rc/profile.xml        |   14 +
 Bundles/LeafIO/ioITK/test/tu/src/IoItkTest.cpp     |  291 +++
 Bundles/LeafIO/ioTuto/CMakeLists.txt               |   13 +
 Bundles/LeafIO/ioTuto/COPYING                      |  675 +++++++
 Bundles/LeafIO/ioTuto/COPYING.LESSER               |  166 ++
 Bundles/LeafIO/ioTuto/Properties.cmake             |    7 +
 Bundles/LeafIO/ioTuto/bin/build.options            |   20 +
 .../include/ioTuto/ExternalDataReaderService.hpp   |  111 +
 Bundles/LeafIO/ioTuto/include/ioTuto/Plugin.hpp    |   32 +
 Bundles/LeafIO/ioTuto/include/ioTuto/config.hpp    |   40 +
 Bundles/LeafIO/ioTuto/rc/plugin.xml                |   22 +
 .../src/ioTuto/ExternalDataReaderService.cpp       |  191 ++
 Bundles/LeafIO/ioTuto/src/ioTuto/Plugin.cpp        |   27 +
 Bundles/LeafIO/ioVTK/CMakeLists.txt                |   22 +
 Bundles/LeafIO/ioVTK/COPYING                       |  675 +++++++
 Bundles/LeafIO/ioVTK/COPYING.LESSER                |  166 ++
 Bundles/LeafIO/ioVTK/Properties.cmake              |    7 +
 Bundles/LeafIO/ioVTK/bin/build.options             |   18 +
 .../ioVTK/include/ioVTK/ImageReaderService.hpp     |  103 +
 .../ioVTK/include/ioVTK/ImageWriterService.hpp     |  123 ++
 .../ioVTK/include/ioVTK/MaxMeshReaderService.hpp   |  111 +
 .../ioVTK/include/ioVTK/MeshReaderService.hpp      |  130 ++
 .../ioVTK/include/ioVTK/MeshWriterService.hpp      |  126 ++
 Bundles/LeafIO/ioVTK/include/ioVTK/Namespace.hpp   |   19 +
 Bundles/LeafIO/ioVTK/include/ioVTK/Plugin.hpp      |   41 +
 .../ioVTK/include/ioVTK/SImageSeriesWriter.hpp     |  107 +
 .../ioVTK/include/ioVTK/SModelSeriesObjWriter.hpp  |  112 ++
 .../ioVTK/include/ioVTK/SModelSeriesReader.hpp     |   87 +
 .../ioVTK/include/ioVTK/SModelSeriesWriter.hpp     |   98 +
 .../LeafIO/ioVTK/include/ioVTK/SSeriesDBReader.hpp |  113 ++
 .../include/ioVTK/TriangularMeshReaderService.hpp  |  131 ++
 .../include/ioVTK/TriangularMeshWriterService.hpp  |  124 ++
 .../ioVTK/include/ioVTK/VtkModelReaderService.hpp  |  142 ++
 Bundles/LeafIO/ioVTK/include/ioVTK/export.hpp      |   41 +
 Bundles/LeafIO/ioVTK/rc/plugin.xml                 |  100 +
 .../LeafIO/ioVTK/src/ioVTK/ImageReaderService.cpp  |  236 +++
 .../LeafIO/ioVTK/src/ioVTK/ImageWriterService.cpp  |  198 ++
 .../ioVTK/src/ioVTK/MaxMeshReaderService.cpp       |  179 ++
 .../LeafIO/ioVTK/src/ioVTK/MeshReaderService.cpp   |  173 ++
 .../LeafIO/ioVTK/src/ioVTK/MeshWriterService.cpp   |  149 ++
 Bundles/LeafIO/ioVTK/src/ioVTK/Plugin.cpp          |   25 +
 .../LeafIO/ioVTK/src/ioVTK/SImageSeriesWriter.cpp  |  134 ++
 .../ioVTK/src/ioVTK/SModelSeriesObjWriter.cpp      |  176 ++
 .../LeafIO/ioVTK/src/ioVTK/SModelSeriesReader.cpp  |  176 ++
 .../LeafIO/ioVTK/src/ioVTK/SModelSeriesWriter.cpp  |  148 ++
 Bundles/LeafIO/ioVTK/src/ioVTK/SSeriesDBReader.cpp |  167 ++
 .../src/ioVTK/TriangularMeshReaderService.cpp      |  175 ++
 .../src/ioVTK/TriangularMeshWriterService.cpp      |  151 ++
 .../ioVTK/src/ioVTK/VtkModelReaderService.cpp      |  188 ++
 Bundles/LeafIO/ioVTK/test/CMakeLists.txt           |   10 +
 Bundles/LeafIO/ioVTK/test/Properties.cmake         |    8 +
 Bundles/LeafIO/ioVTK/test/cppunit.options          |   22 +
 .../test/tu/include/ImageReaderWriterTest.hpp      |   69 +
 .../test/tu/include/ModelSeriesWriterTest.hpp      |   40 +
 .../ioVTK/test/tu/include/SeriesDBReaderTest.hpp   |   41 +
 Bundles/LeafIO/ioVTK/test/tu/rc/profile.xml        |   11 +
 .../ioVTK/test/tu/src/ImageReaderWriterTest.cpp    |  564 ++++++
 .../ioVTK/test/tu/src/ModelSeriesWriterTest.cpp    |  250 +++
 .../ioVTK/test/tu/src/SeriesDBReaderTest.cpp       |  199 ++
 Bundles/LeafIO/ioVtkGdcm/CMakeLists.txt            |   10 +
 Bundles/LeafIO/ioVtkGdcm/Properties.cmake          |    7 +
 Bundles/LeafIO/ioVtkGdcm/bin/build.options         |   18 +
 .../LeafIO/ioVtkGdcm/include/ioVtkGdcm/Plugin.hpp  |   38 +
 .../include/ioVtkGdcm/SImageSeriesWriter.hpp       |   71 +
 .../include/ioVtkGdcm/SSeriesDBLazyReader.hpp      |   83 +
 .../include/ioVtkGdcm/SSeriesDBReader.hpp          |   85 +
 .../LeafIO/ioVtkGdcm/include/ioVtkGdcm/config.hpp  |   41 +
 .../ioVtkGdcm/include/ioVtkGdcm/namespace.hpp      |   20 +
 Bundles/LeafIO/ioVtkGdcm/rc/plugin.xml             |   27 +
 Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/Plugin.cpp  |   26 +
 .../ioVtkGdcm/src/ioVtkGdcm/SImageSeriesWriter.cpp |  171 ++
 .../src/ioVtkGdcm/SSeriesDBLazyReader.cpp          |  195 ++
 .../ioVtkGdcm/src/ioVtkGdcm/SSeriesDBReader.cpp    |  195 ++
 Bundles/LeafIO/ioVtkGdcm/test/CMakeLists.txt       |   10 +
 Bundles/LeafIO/ioVtkGdcm/test/Properties.cmake     |    8 +
 Bundles/LeafIO/ioVtkGdcm/test/cppunit.options      |   12 +
 .../ioVtkGdcm/test/tu/include/IoVtkGdcmTest.hpp    |   43 +
 Bundles/LeafIO/ioVtkGdcm/test/tu/rc/profile.xml    |   11 +
 .../LeafIO/ioVtkGdcm/test/tu/src/IoVtkGdcmTest.cpp |  227 +++
 Bundles/LeafOp/opImageFilter/CMakeLists.txt        |   10 +
 Bundles/LeafOp/opImageFilter/COPYING               |  675 +++++++
 Bundles/LeafOp/opImageFilter/COPYING.LESSER        |  166 ++
 Bundles/LeafOp/opImageFilter/Properties.cmake      |    7 +
 Bundles/LeafOp/opImageFilter/bin/build.options     |   17 +
 .../include/opImageFilter/Namespace.hpp            |   21 +
 .../opImageFilter/include/opImageFilter/Plugin.hpp |   41 +
 .../include/opImageFilter/action/ImageFilter.hpp   |   57 +
 .../include/opImageFilter/action/Namespace.hpp     |   24 +
 .../opImageFilter/include/opImageFilter/config.hpp |   40 +
 Bundles/LeafOp/opImageFilter/rc/plugin.xml         |   14 +
 .../opImageFilter/src/opImageFilter/Plugin.cpp     |   35 +
 .../src/opImageFilter/action/ImageFilter.cpp       |  146 ++
 Bundles/LeafOp/opSofa/CMakeLists.txt               |   62 +
 Bundles/LeafOp/opSofa/Properties.cmake             |   23 +
 Bundles/LeafOp/opVTKMesh/CMakeLists.txt            |   20 +
 Bundles/LeafOp/opVTKMesh/COPYING                   |  675 +++++++
 Bundles/LeafOp/opVTKMesh/COPYING.LESSER            |  166 ++
 Bundles/LeafOp/opVTKMesh/Properties.cmake          |    7 +
 Bundles/LeafOp/opVTKMesh/bin/build.options         |   18 +
 .../LeafOp/opVTKMesh/include/opVTKMesh/IMesher.hpp |   42 +
 .../opVTKMesh/include/opVTKMesh/Namespace.hpp      |   21 +
 .../LeafOp/opVTKMesh/include/opVTKMesh/Plugin.hpp  |   41 +
 .../opVTKMesh/include/opVTKMesh/SVTKMesher.hpp     |   68 +
 .../include/opVTKMesh/action/Namespace.hpp         |   24 +
 .../include/opVTKMesh/action/VTKMeshCreation.hpp   |   57 +
 .../LeafOp/opVTKMesh/include/opVTKMesh/config.hpp  |   40 +
 Bundles/LeafOp/opVTKMesh/rc/plugin.xml             |   20 +
 Bundles/LeafOp/opVTKMesh/src/opVTKMesh/IMesher.cpp |   24 +
 Bundles/LeafOp/opVTKMesh/src/opVTKMesh/Plugin.cpp  |   35 +
 .../LeafOp/opVTKMesh/src/opVTKMesh/SVTKMesher.cpp  |  189 ++
 .../src/opVTKMesh/action/VTKMeshCreation.cpp       |  181 ++
 Bundles/LeafPatch/patchMedicalData/CMakeLists.txt  |    4 +
 Bundles/LeafPatch/patchMedicalData/COPYING         |  675 +++++++
 Bundles/LeafPatch/patchMedicalData/COPYING.LESSER  |  166 ++
 .../LeafPatch/patchMedicalData/Properties.cmake    |    7 +
 .../LeafPatch/patchMedicalData/bin/build.options   |    3 +
 .../include/patchMedicalData/Plugin.hpp            |   39 +
 .../include/patchMedicalData/config.hpp            |   39 +
 .../include/patchMedicalData/namespace.hpp         |   18 +
 Bundles/LeafPatch/patchMedicalData/rc/plugin.xml   |    3 +
 .../src/patchMedicalData/Plugin.cpp                |   37 +
 .../LeafPatch/patchMedicalData/test/CMakeLists.txt |    8 +
 .../patchMedicalData/test/Properties.cmake         |    8 +
 .../patchMedicalData/test/cppunit.options          |   21 +
 .../patchMedicalData/test/tu/include/PatchTest.hpp |   47 +
 .../patchMedicalData/test/tu/rc/profile.xml        |   16 +
 .../patchMedicalData/test/tu/src/PatchTest.cpp     |  206 ++
 Bundles/LeafUI/guiQt/CMakeLists.txt                |   25 +
 Bundles/LeafUI/guiQt/COPYING                       |  675 +++++++
 Bundles/LeafUI/guiQt/COPYING.LESSER                |  166 ++
 Bundles/LeafUI/guiQt/Properties.cmake              |    7 +
 Bundles/LeafUI/guiQt/bin/build.options             |   19 +
 Bundles/LeafUI/guiQt/include/guiQt/Namespace.hpp   |   21 +
 Bundles/LeafUI/guiQt/include/guiQt/Plugin.hpp      |   57 +
 Bundles/LeafUI/guiQt/include/guiQt/config.hpp      |   40 +
 Bundles/LeafUI/guiQt/include/guiQt/editor/Code.hpp |   95 +
 .../guiQt/include/guiQt/editor/DummyEditor.hpp     |  100 +
 .../guiQt/include/guiQt/editor/DynamicView.hpp     |  183 ++
 .../guiQt/include/guiQt/editor/Namespace.hpp       |   24 +
 Bundles/LeafUI/guiQt/rc/plugin.xml                 |   27 +
 Bundles/LeafUI/guiQt/src/guiQt/Plugin.cpp          |  104 +
 Bundles/LeafUI/guiQt/src/guiQt/editor/Code.cpp     |  178 ++
 .../LeafUI/guiQt/src/guiQt/editor/DummyEditor.cpp  |  122 ++
 .../LeafUI/guiQt/src/guiQt/editor/DynamicView.cpp  |  408 ++++
 Bundles/LeafUI/guiQt/test/CMakeLists.txt           |   10 +
 Bundles/LeafUI/guiQt/test/Properties.cmake         |    8 +
 Bundles/LeafUI/guiQt/test/cppunit.options          |   26 +
 Bundles/LeafUI/guiQt/test/tu/include/GuiQtTest.hpp |   46 +
 Bundles/LeafUI/guiQt/test/tu/rc/profile.xml        |   23 +
 Bundles/LeafUI/guiQt/test/tu/src/GuiQtTest.cpp     |  104 +
 Bundles/LeafUI/guiWx/CMakeLists.txt                |   21 +
 Bundles/LeafUI/guiWx/COPYING                       |  675 +++++++
 Bundles/LeafUI/guiWx/COPYING.LESSER                |  166 ++
 Bundles/LeafUI/guiWx/Properties.cmake              |    7 +
 Bundles/LeafUI/guiWx/bin/build.options             |   17 +
 Bundles/LeafUI/guiWx/include/guiWx/Namespace.hpp   |   21 +
 Bundles/LeafUI/guiWx/include/guiWx/Plugin.hpp      |   49 +
 Bundles/LeafUI/guiWx/include/guiWx/config.hpp      |   40 +
 .../guiWx/include/guiWx/editor/DummyEditor.hpp     |   98 +
 .../guiWx/include/guiWx/editor/Namespace.hpp       |   24 +
 Bundles/LeafUI/guiWx/rc/plugin.xml                 |   14 +
 Bundles/LeafUI/guiWx/src/guiWx/Plugin.cpp          |   70 +
 .../LeafUI/guiWx/src/guiWx/editor/DummyEditor.cpp  |  120 ++
 Bundles/LeafUI/monitorQt/CMakeLists.txt            |   30 +
 Bundles/LeafUI/monitorQt/Properties.cmake          |    7 +
 Bundles/LeafUI/monitorQt/bin/build.options         |   18 +
 .../monitorQt/include/monitorQt/DumpEditor.hpp     |  131 ++
 .../LeafUI/monitorQt/include/monitorQt/Plugin.hpp  |   39 +
 .../monitorQt/action/ClassFactoryRegistryInfo.hpp  |   66 +
 .../include/monitorQt/action/ComponentsTree.hpp    |   68 +
 .../LeafUI/monitorQt/include/monitorQt/config.hpp  |   39 +
 Bundles/LeafUI/monitorQt/rc/DumpFrameConfig.xml    |   56 +
 Bundles/LeafUI/monitorQt/rc/plugin.xml             |   27 +
 .../LeafUI/monitorQt/src/monitorQt/DumpEditor.cpp  |  736 +++++++
 Bundles/LeafUI/monitorQt/src/monitorQt/Plugin.cpp  |   35 +
 .../monitorQt/action/ClassFactoryRegistryInfo.cpp  |  103 +
 .../src/monitorQt/action/ComponentsTree.cpp        |  124 ++
 Bundles/LeafUI/uiGenericQt/CMakeLists.txt          |   23 +
 Bundles/LeafUI/uiGenericQt/COPYING                 |  675 +++++++
 Bundles/LeafUI/uiGenericQt/COPYING.LESSER          |  166 ++
 Bundles/LeafUI/uiGenericQt/Properties.cmake        |    7 +
 Bundles/LeafUI/uiGenericQt/bin/build.options       |   19 +
 .../uiGenericQt/include/uiGenericQt/Namespace.hpp  |   21 +
 .../uiGenericQt/include/uiGenericQt/Plugin.hpp     |   36 +
 .../action/LaunchBrowserActionService.hpp          |   82 +
 .../include/uiGenericQt/action/SShowAbout.hpp      |  105 +
 .../uiGenericQt/action/ShowAcknowledgments.hpp     |   85 +
 .../uiGenericQt/action/ShowHelpContents.hpp        |   81 +
 .../include/uiGenericQt/action/ShowRevInfo.hpp     |   91 +
 .../uiGenericQt/include/uiGenericQt/config.hpp     |   40 +
 Bundles/LeafUI/uiGenericQt/rc/plugin.xml           |   39 +
 .../LeafUI/uiGenericQt/src/uiGenericQt/Plugin.cpp  |   26 +
 .../action/LaunchBrowserActionService.cpp          |  110 +
 .../src/uiGenericQt/action/SShowAbout.cpp          |  170 ++
 .../src/uiGenericQt/action/ShowAcknowledgments.cpp |  141 ++
 .../src/uiGenericQt/action/ShowHelpContents.cpp    |  158 ++
 .../src/uiGenericQt/action/ShowRevInfo.cpp         |  326 +++
 Bundles/LeafUI/uiIO/CMakeLists.txt                 |    8 +
 Bundles/LeafUI/uiIO/COPYING                        |  675 +++++++
 Bundles/LeafUI/uiIO/COPYING.LESSER                 |  166 ++
 Bundles/LeafUI/uiIO/Properties.cmake               |    7 +
 Bundles/LeafUI/uiIO/bin/build.options              |   13 +
 Bundles/LeafUI/uiIO/include/uiIO/Namespace.hpp     |   21 +
 Bundles/LeafUI/uiIO/include/uiIO/Plugin.hpp        |   34 +
 .../uiIO/include/uiIO/action/SSeriesDBMerger.hpp   |   83 +
 Bundles/LeafUI/uiIO/include/uiIO/config.hpp        |   40 +
 .../uiIO/include/uiIO/editor/IOSelectorService.hpp |  127 ++
 .../LeafUI/uiIO/include/uiIO/editor/Namespace.hpp  |   24 +
 Bundles/LeafUI/uiIO/rc/plugin.xml                  |   25 +
 Bundles/LeafUI/uiIO/src/uiIO/Plugin.cpp            |   35 +
 .../uiIO/src/uiIO/action/SSeriesDBMerger.cpp       |  123 ++
 .../uiIO/src/uiIO/editor/IOSelectorService.cpp     |  369 ++++
 Bundles/LeafUI/uiImageQt/CMakeLists.txt            |   27 +
 Bundles/LeafUI/uiImageQt/COPYING                   |  675 +++++++
 Bundles/LeafUI/uiImageQt/COPYING.LESSER            |  166 ++
 Bundles/LeafUI/uiImageQt/Properties.cmake          |    7 +
 Bundles/LeafUI/uiImageQt/bin/build.options         |   19 +
 .../uiImageQt/include/uiImageQt/ImageInfo.hpp      |   72 +
 .../include/uiImageQt/ImageTransparency.hpp        |   95 +
 .../uiImageQt/include/uiImageQt/Namespace.hpp      |   21 +
 .../LeafUI/uiImageQt/include/uiImageQt/Plugin.hpp  |   37 +
 .../uiImageQt/include/uiImageQt/ShowScanEditor.hpp |  106 +
 .../include/uiImageQt/SliceIndexPositionEditor.hpp |  110 +
 .../include/uiImageQt/SliceListEditor.hpp          |  108 +
 .../include/uiImageQt/SliceListEditor2.hpp         |  109 +
 .../uiImageQt/include/uiImageQt/WindowLevel.hpp    |  170 ++
 .../LeafUI/uiImageQt/include/uiImageQt/config.hpp  |   40 +
 Bundles/LeafUI/uiImageQt/rc/plugin.xml             |   51 +
 .../LeafUI/uiImageQt/src/uiImageQt/ImageInfo.cpp   |  141 ++
 .../uiImageQt/src/uiImageQt/ImageTransparency.cpp  |  240 +++
 Bundles/LeafUI/uiImageQt/src/uiImageQt/Plugin.cpp  |   27 +
 .../uiImageQt/src/uiImageQt/ShowScanEditor.cpp     |  172 ++
 .../src/uiImageQt/SliceIndexPositionEditor.cpp     |  291 +++
 .../uiImageQt/src/uiImageQt/SliceListEditor.cpp    |  220 ++
 .../uiImageQt/src/uiImageQt/SliceListEditor2.cpp   |  231 +++
 .../LeafUI/uiImageQt/src/uiImageQt/WindowLevel.cpp |  629 ++++++
 Bundles/LeafUI/uiMeasurement/CMakeLists.txt        |   14 +
 Bundles/LeafUI/uiMeasurement/COPYING               |  675 +++++++
 Bundles/LeafUI/uiMeasurement/COPYING.LESSER        |  166 ++
 Bundles/LeafUI/uiMeasurement/Properties.cmake      |    7 +
 Bundles/LeafUI/uiMeasurement/bin/build.options     |   15 +
 .../include/uiMeasurement/Namespace.hpp            |   21 +
 .../uiMeasurement/include/uiMeasurement/Plugin.hpp |   36 +
 .../include/uiMeasurement/action/AddDistance.hpp   |   56 +
 .../include/uiMeasurement/action/AddLandmark.hpp   |   55 +
 .../include/uiMeasurement/action/FocusLandmark.hpp |   54 +
 .../include/uiMeasurement/action/LoadLandmark.hpp  |   49 +
 .../uiMeasurement/action/RemoveDistance.hpp        |   62 +
 .../uiMeasurement/action/RemoveLandmark.hpp        |   63 +
 .../uiMeasurement/action/SAddLabeledPoint.hpp      |   64 +
 .../include/uiMeasurement/action/SaveLandmark.hpp  |   50 +
 .../include/uiMeasurement/action/ShowDistance.hpp  |   63 +
 .../include/uiMeasurement/action/ShowLandmark.hpp  |   60 +
 .../uiMeasurement/include/uiMeasurement/config.hpp |   40 +
 Bundles/LeafUI/uiMeasurement/rc/plugin.xml         |  110 +
 .../uiMeasurement/src/uiMeasurement/Plugin.cpp     |   25 +
 .../src/uiMeasurement/action/AddDistance.cpp       |  128 ++
 .../src/uiMeasurement/action/AddLandmark.cpp       |  163 ++
 .../src/uiMeasurement/action/FocusLandmark.cpp     |  179 ++
 .../src/uiMeasurement/action/LoadLandmark.cpp      |  163 ++
 .../src/uiMeasurement/action/RemoveDistance.cpp    |  205 ++
 .../src/uiMeasurement/action/RemoveLandmark.cpp    |  177 ++
 .../src/uiMeasurement/action/SAddLabeledPoint.cpp  |  140 ++
 .../src/uiMeasurement/action/SaveLandmark.cpp      |  154 ++
 .../src/uiMeasurement/action/ShowDistance.cpp      |  135 ++
 .../src/uiMeasurement/action/ShowLandmark.cpp      |  135 ++
 Bundles/LeafUI/uiMeasurementQt/CMakeLists.txt      |   23 +
 Bundles/LeafUI/uiMeasurementQt/COPYING             |  675 +++++++
 Bundles/LeafUI/uiMeasurementQt/COPYING.LESSER      |  166 ++
 Bundles/LeafUI/uiMeasurementQt/Properties.cmake    |    7 +
 Bundles/LeafUI/uiMeasurementQt/bin/build.options   |   15 +
 .../include/uiMeasurementQt/Plugin.hpp             |   36 +
 .../include/uiMeasurementQt/config.hpp             |   40 +
 .../include/uiMeasurementQt/editor/Distance.hpp    |  104 +
 .../include/uiMeasurementQt/editor/Namespace.hpp   |   25 +
 Bundles/LeafUI/uiMeasurementQt/rc/plugin.xml       |   14 +
 .../uiMeasurementQt/src/uiMeasurementQt/Plugin.cpp |   25 +
 .../src/uiMeasurementQt/editor/Distance.cpp        |  152 ++
 Bundles/LeafUI/uiMedDataQt/CMakeLists.txt          |   35 +
 Bundles/LeafUI/uiMedDataQt/COPYING                 |  675 +++++++
 Bundles/LeafUI/uiMedDataQt/COPYING.LESSER          |  166 ++
 Bundles/LeafUI/uiMedDataQt/Properties.cmake        |   25 +
 Bundles/LeafUI/uiMedDataQt/bin/build.options       |   22 +
 .../include/uiMedDataQt/InsertSeries.hpp           |   51 +
 .../uiMedDataQt/include/uiMedDataQt/Plugin.hpp     |   36 +
 .../include/uiMedDataQt/SSeriesViewer.hpp          |  119 ++
 .../include/uiMedDataQt/action/SExportSeries.hpp   |   81 +
 .../include/uiMedDataQt/action/SInitNewSeries.hpp  |   81 +
 .../uiMedDataQt/include/uiMedDataQt/config.hpp     |   40 +
 .../uiMedDataQt/include/uiMedDataQt/constants.hpp  |   35 +
 .../uiMedDataQt/editor/SModelSeriesList.hpp        |  118 ++
 .../uiMedDataQt/editor/SOrganTransformation.hpp    |   93 +
 .../include/uiMedDataQt/editor/SSelector.hpp       |  141 ++
 .../include/uiMedDataQt/editor/SSeries.hpp         |  144 ++
 .../uiMedDataQt/include/uiMedDataQt/namespace.hpp  |   54 +
 .../include/uiMedDataQt/widget/EquipmentEditor.hpp |   67 +
 .../include/uiMedDataQt/widget/PatientEditor.hpp   |   77 +
 .../include/uiMedDataQt/widget/Selector.hpp        |  142 ++
 .../include/uiMedDataQt/widget/SelectorModel.hpp   |  165 ++
 .../include/uiMedDataQt/widget/SeriesEditor.hpp    |  144 ++
 .../include/uiMedDataQt/widget/StudyEditor.hpp     |   94 +
 Bundles/LeafUI/uiMedDataQt/rc/SeriesExportCfg.xml  |   87 +
 Bundles/LeafUI/uiMedDataQt/rc/plugin.xml           |  162 ++
 .../uiMedDataQt/src/uiMedDataQt/InsertSeries.cpp   |   54 +
 .../LeafUI/uiMedDataQt/src/uiMedDataQt/Plugin.cpp  |   25 +
 .../uiMedDataQt/src/uiMedDataQt/SSeriesViewer.cpp  |  189 ++
 .../src/uiMedDataQt/action/SExportSeries.cpp       |  186 ++
 .../src/uiMedDataQt/action/SInitNewSeries.cpp      |  184 ++
 .../src/uiMedDataQt/editor/SModelSeriesList.cpp    |  283 +++
 .../uiMedDataQt/editor/SOrganTransformation.cpp    |  393 ++++
 .../src/uiMedDataQt/editor/SSelector.cpp           |  328 +++
 .../uiMedDataQt/src/uiMedDataQt/editor/SSeries.cpp |  273 +++
 .../src/uiMedDataQt/widget/EquipmentEditor.cpp     |   79 +
 .../src/uiMedDataQt/widget/PatientEditor.cpp       |  197 ++
 .../src/uiMedDataQt/widget/Selector.cpp            |  212 ++
 .../src/uiMedDataQt/widget/SelectorModel.cpp       |  448 +++++
 .../src/uiMedDataQt/widget/SeriesEditor.cpp        |  237 +++
 .../src/uiMedDataQt/widget/StudyEditor.cpp         |  188 ++
 Bundles/LeafUI/uiPython/CMakeLists.txt             |   11 +
 Bundles/LeafUI/uiPython/COPYING                    |  675 +++++++
 Bundles/LeafUI/uiPython/COPYING.LESSER             |  166 ++
 Bundles/LeafUI/uiPython/Properties.cmake           |    7 +
 Bundles/LeafUI/uiPython/bin/build.options          |    7 +
 .../LeafUI/uiPython/include/uiPython/Namespace.hpp |   21 +
 .../LeafUI/uiPython/include/uiPython/Plugin.hpp    |   51 +
 .../uiPython/include/uiPython/action/Namespace.hpp |   24 +
 .../uiPython/include/uiPython/action/StringRun.hpp |   79 +
 .../uiPython/include/uiPython/action/Test.hpp      |   79 +
 .../LeafUI/uiPython/include/uiPython/config.hpp    |   41 +
 Bundles/LeafUI/uiPython/rc/plugin.xml              |   24 +
 Bundles/LeafUI/uiPython/src/uiPython/Plugin.cpp    |   30 +
 .../uiPython/src/uiPython/action/StringRun.cpp     |   85 +
 .../LeafUI/uiPython/src/uiPython/action/Test.cpp   |   82 +
 Bundles/LeafUI/uiReconstructionQt/CMakeLists.txt   |   23 +
 Bundles/LeafUI/uiReconstructionQt/COPYING          |  675 +++++++
 Bundles/LeafUI/uiReconstructionQt/COPYING.LESSER   |  166 ++
 Bundles/LeafUI/uiReconstructionQt/Properties.cmake |    7 +
 .../LeafUI/uiReconstructionQt/bin/build.options    |   16 +
 .../include/uiReconstructionQt/Namespace.hpp       |   20 +
 .../uiReconstructionQt/OrganMaterialEditor.hpp     |   87 +
 .../include/uiReconstructionQt/Plugin.hpp          |   35 +
 .../uiReconstructionQt/RepresentationEditor.hpp    |  100 +
 .../include/uiReconstructionQt/config.hpp          |   40 +
 Bundles/LeafUI/uiReconstructionQt/rc/plugin.xml    |   22 +
 .../src/uiReconstructionQt/OrganMaterialEditor.cpp |  241 +++
 .../src/uiReconstructionQt/Plugin.cpp              |   27 +
 .../uiReconstructionQt/RepresentationEditor.cpp    |  407 ++++
 Bundles/LeafUI/uiTF/CMakeLists.txt                 |   26 +
 Bundles/LeafUI/uiTF/Properties.cmake               |    7 +
 Bundles/LeafUI/uiTF/bin/build.options              |    6 +
 Bundles/LeafUI/uiTF/include/uiTF/Plugin.hpp        |   40 +
 .../uiTF/include/uiTF/TransferFunctionEditor.hpp   |  125 ++
 Bundles/LeafUI/uiTF/include/uiTF/export.hpp        |   41 +
 Bundles/LeafUI/uiTF/rc/plugin.xml                  |   17 +
 Bundles/LeafUI/uiTF/rc/tf/CT-Bones-U16.json        |  132 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Bones.json            |  132 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Liver-2.json          |  176 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Liver-U16.json        |  165 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Liver.json            |  165 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Lungs-U16.json        |  143 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Lungs.json            |  143 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Muscles-U16.json      |  220 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Muscles.json          |  154 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Skin-U16.json         |  242 +++
 Bundles/LeafUI/uiTF/rc/tf/CT-Skin.json             |  231 +++
 Bundles/LeafUI/uiTF/rc/tf/CT-Thorax.json           |  209 ++
 Bundles/LeafUI/uiTF/rc/tf/CT-Vessels.json          |  154 ++
 Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Kidneys.json      |  154 ++
 Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Liver.json        |  187 ++
 Bundles/LeafUI/uiTF/rc/tf/MRI-T2-vessels.json      |  154 ++
 Bundles/LeafUI/uiTF/src/uiTF/Plugin.cpp            |   38 +
 .../uiTF/src/uiTF/TransferFunctionEditor.cpp       |  628 ++++++
 Bundles/LeafUI/uiVisu/CMakeLists.txt               |   14 +
 Bundles/LeafUI/uiVisu/COPYING                      |  675 +++++++
 Bundles/LeafUI/uiVisu/COPYING.LESSER               |  166 ++
 Bundles/LeafUI/uiVisu/Properties.cmake             |    7 +
 Bundles/LeafUI/uiVisu/bin/build.options            |   17 +
 Bundles/LeafUI/uiVisu/include/uiVisu/Namespace.hpp |   20 +
 Bundles/LeafUI/uiVisu/include/uiVisu/Plugin.hpp    |   35 +
 .../uiVisu/action/CameraOrientationAction.hpp      |   83 +
 .../include/uiVisu/action/CrossTypeAction.hpp      |   85 +
 .../uiVisu/include/uiVisu/action/SSnapshot.hpp     |   90 +
 Bundles/LeafUI/uiVisu/include/uiVisu/config.hpp    |   40 +
 Bundles/LeafUI/uiVisu/rc/plugin.xml                |   27 +
 Bundles/LeafUI/uiVisu/src/uiVisu/Plugin.cpp        |   27 +
 .../src/uiVisu/action/CameraOrientationAction.cpp  |  125 ++
 .../uiVisu/src/uiVisu/action/CrossTypeAction.cpp   |  125 ++
 .../LeafUI/uiVisu/src/uiVisu/action/SSnapshot.cpp  |  159 ++
 Bundles/LeafUI/uiVisuQt/CMakeLists.txt             |   25 +
 Bundles/LeafUI/uiVisuQt/COPYING                    |  675 +++++++
 Bundles/LeafUI/uiVisuQt/COPYING.LESSER             |  166 ++
 Bundles/LeafUI/uiVisuQt/Properties.cmake           |    7 +
 Bundles/LeafUI/uiVisuQt/bin/build.options          |   18 +
 .../uiVisuQt/include/uiVisuQt/BasicFloatEditor.hpp |   86 +
 .../LeafUI/uiVisuQt/include/uiVisuQt/Namespace.hpp |   20 +
 .../LeafUI/uiVisuQt/include/uiVisuQt/Plugin.hpp    |   35 +
 .../uiVisuQt/include/uiVisuQt/PointEditor.hpp      |   80 +
 .../uiVisuQt/include/uiVisuQt/SnapshotEditor.hpp   |  104 +
 .../uiVisuQt/TransformationMatrixEditor.hpp        |   82 +
 .../LeafUI/uiVisuQt/include/uiVisuQt/config.hpp    |   40 +
 Bundles/LeafUI/uiVisuQt/rc/plugin.xml              |   35 +
 .../uiVisuQt/src/uiVisuQt/BasicFloatEditor.cpp     |  185 ++
 Bundles/LeafUI/uiVisuQt/src/uiVisuQt/Plugin.cpp    |   27 +
 .../LeafUI/uiVisuQt/src/uiVisuQt/PointEditor.cpp   |  156 ++
 .../uiVisuQt/src/uiVisuQt/SnapshotEditor.cpp       |  216 ++
 .../src/uiVisuQt/TransformationMatrixEditor.cpp    |  142 ++
 Bundles/LeafVisu/scene2D/CMakeLists.txt            |   22 +
 Bundles/LeafVisu/scene2D/COPYING                   |  675 +++++++
 Bundles/LeafVisu/scene2D/COPYING.LESSER            |  166 ++
 Bundles/LeafVisu/scene2D/Properties.cmake          |    7 +
 Bundles/LeafVisu/scene2D/bin/build.options         |   14 +
 .../LeafVisu/scene2D/include/scene2D/Plugin.hpp    |   44 +
 .../LeafVisu/scene2D/include/scene2D/Render.hpp    |  306 +++
 .../include/scene2D/Scene2DGraphicsView.hpp        |   73 +
 .../scene2D/include/scene2D/adaptor/Axis.hpp       |   99 +
 .../include/scene2D/adaptor/CurvedHistogram.hpp    |  144 ++
 .../scene2D/include/scene2D/adaptor/Grid2D.hpp     |  140 ++
 .../include/scene2D/adaptor/GridFromFloat.hpp      |  113 ++
 .../scene2D/include/scene2D/adaptor/Histogram.hpp  |   91 +
 .../include/scene2D/adaptor/HistogramCursor.hpp    |  101 +
 .../include/scene2D/adaptor/HistogramValue.hpp     |   99 +
 .../scene2D/include/scene2D/adaptor/IAdaptor.hpp   |  178 ++
 .../scene2D/include/scene2D/adaptor/Line.hpp       |  103 +
 .../scene2D/include/scene2D/adaptor/Negato.hpp     |   79 +
 .../include/scene2D/adaptor/ScaleValues.hpp        |  168 ++
 .../scene2D/include/scene2D/adaptor/Sin.hpp        |   47 +
 .../scene2D/include/scene2D/adaptor/Square.hpp     |   62 +
 .../include/scene2D/adaptor/TransferFunction.hpp   |  197 ++
 .../include/scene2D/adaptor/ViewportInteractor.hpp |   58 +
 .../scene2D/adaptor/ViewportRangeSelector.hpp      |  112 ++
 .../include/scene2D/adaptor/ViewportUpdater.hpp    |   65 +
 .../scene2D/include/scene2D/adaptor/namespace.hpp  |   25 +
 Bundles/LeafVisu/scene2D/include/scene2D/bspline.h |  136 ++
 .../LeafVisu/scene2D/include/scene2D/config.hpp    |   40 +
 .../LeafVisu/scene2D/include/scene2D/data/Axis.hpp |   82 +
 .../scene2D/include/scene2D/data/Coord.hpp         |   41 +
 .../scene2D/include/scene2D/data/Event.hpp         |   99 +
 .../scene2D/include/scene2D/data/InitQtPen.hpp     |   34 +
 .../LeafVisu/scene2D/include/scene2D/data/Size.hpp |   41 +
 .../scene2D/include/scene2D/data/Viewport.hpp      |   61 +
 .../scene2D/include/scene2D/data/ViewportMsg.hpp   |   53 +
 .../scene2D/include/scene2D/data/namespace.hpp     |   25 +
 .../LeafVisu/scene2D/include/scene2D/namespace.hpp |   25 +
 .../scene2D/processing/ComputeHistogramFunctor.hxx |   64 +
 .../scene2D/processing/SComputeHistogram.hpp       |   88 +
 Bundles/LeafVisu/scene2D/rc/plugin.xml             |  113 ++
 Bundles/LeafVisu/scene2D/src/scene2D/Plugin.cpp    |   37 +
 Bundles/LeafVisu/scene2D/src/scene2D/Render.cpp    |  564 ++++++
 .../scene2D/src/scene2D/Scene2DGraphicsView.cpp    |  266 +++
 .../LeafVisu/scene2D/src/scene2D/adaptor/Axis.cpp  |  311 +++
 .../src/scene2D/adaptor/CurvedHistogram.cpp        |  565 ++++++
 .../scene2D/src/scene2D/adaptor/Grid2D.cpp         |  234 +++
 .../scene2D/src/scene2D/adaptor/GridFromFloat.cpp  |  188 ++
 .../scene2D/src/scene2D/adaptor/Histogram.cpp      |  250 +++
 .../src/scene2D/adaptor/HistogramCursor.cpp        |  216 ++
 .../scene2D/src/scene2D/adaptor/HistogramValue.cpp |  235 +++
 .../scene2D/src/scene2D/adaptor/IAdaptor.cpp       |  341 ++++
 .../LeafVisu/scene2D/src/scene2D/adaptor/Line.cpp  |  114 ++
 .../scene2D/src/scene2D/adaptor/Negato.cpp         |  428 ++++
 .../scene2D/src/scene2D/adaptor/ScaleValues.cpp    |  458 +++++
 .../LeafVisu/scene2D/src/scene2D/adaptor/Sin.cpp   |   78 +
 .../scene2D/src/scene2D/adaptor/Square.cpp         |  179 ++
 .../src/scene2D/adaptor/TransferFunction.cpp       |  970 +++++++++
 .../src/scene2D/adaptor/ViewportInteractor.cpp     |  161 ++
 .../src/scene2D/adaptor/ViewportRangeSelector.cpp  |  371 ++++
 .../src/scene2D/adaptor/ViewportUpdater.cpp        |  111 +
 Bundles/LeafVisu/scene2D/src/scene2D/data/Axis.cpp |  114 ++
 .../LeafVisu/scene2D/src/scene2D/data/Event.cpp    |   94 +
 .../scene2D/src/scene2D/data/InitQtPen.cpp         |   44 +
 .../LeafVisu/scene2D/src/scene2D/data/Viewport.cpp |  127 ++
 .../scene2D/src/scene2D/data/ViewportMsg.cpp       |   35 +
 .../src/scene2D/processing/SComputeHistogram.cpp   |  138 ++
 Bundles/LeafVisu/scene2D/test/CMakeLists.txt       |    8 +
 Bundles/LeafVisu/scene2D/test/Properties.cmake     |    8 +
 Bundles/LeafVisu/scene2D/test/cppunit.options      |   13 +
 .../scene2D/test/tu/include/ProcessingTest.hpp     |   31 +
 Bundles/LeafVisu/scene2D/test/tu/rc/profile.xml    |    9 +
 .../scene2D/test/tu/src/ProcessingTest.cpp         |  129 ++
 Bundles/LeafVisu/visuVTK/CMakeLists.txt            |    8 +
 Bundles/LeafVisu/visuVTK/COPYING                   |  675 +++++++
 Bundles/LeafVisu/visuVTK/COPYING.LESSER            |  166 ++
 Bundles/LeafVisu/visuVTK/Properties.cmake          |    7 +
 Bundles/LeafVisu/visuVTK/bin/build.options         |   15 +
 .../LeafVisu/visuVTK/include/visuVTK/Namespace.hpp |   20 +
 .../LeafVisu/visuVTK/include/visuVTK/Plugin.hpp    |   39 +
 .../LeafVisu/visuVTK/include/visuVTK/config.hpp    |   40 +
 Bundles/LeafVisu/visuVTK/rc/plugin.xml             |   18 +
 Bundles/LeafVisu/visuVTK/rc/visuVTKCfg.xsd         |   25 +
 Bundles/LeafVisu/visuVTK/src/visuVTK/Plugin.cpp    |   41 +
 Bundles/LeafVisu/visuVTKAdaptor/CMakeLists.txt     |   22 +
 Bundles/LeafVisu/visuVTKAdaptor/COPYING            |  675 +++++++
 Bundles/LeafVisu/visuVTKAdaptor/COPYING.LESSER     |  166 ++
 Bundles/LeafVisu/visuVTKAdaptor/Properties.cmake   |    7 +
 Bundles/LeafVisu/visuVTKAdaptor/bin/build.options  |   25 +
 .../visuVTKAdaptor/include/visuVTKAdaptor/Axes.hpp |   52 +
 .../include/visuVTKAdaptor/BoxWidget.hpp           |   57 +
 .../include/visuVTKAdaptor/Camera.hpp              |   55 +
 .../include/visuVTKAdaptor/Camera2.hpp             |   56 +
 .../visuVTKAdaptor/include/visuVTKAdaptor/Cube.hpp |   37 +
 .../include/visuVTKAdaptor/Distance.hpp            |   74 +
 .../include/visuVTKAdaptor/Image.hpp               |   87 +
 .../include/visuVTKAdaptor/Image3DCursor.hpp       |   69 +
 .../include/visuVTKAdaptor/ImageLandmarks.hpp      |   58 +
 .../include/visuVTKAdaptor/ImageMultiDistances.hpp |   66 +
 .../visuVTKAdaptor/ImagePickerInteractor.hpp       |   59 +
 .../include/visuVTKAdaptor/ImageSeries.hpp         |   91 +
 .../include/visuVTKAdaptor/ImageSlice.hpp          |   96 +
 .../include/visuVTKAdaptor/ImageText.hpp           |   47 +
 .../include/visuVTKAdaptor/ImagesBlend.hpp         |  102 +
 .../include/visuVTKAdaptor/ImagesProbeCursor.hpp   |   97 +
 .../include/visuVTKAdaptor/InteractorStyle.hpp     |   54 +
 .../include/visuVTKAdaptor/LabeledPointList.hpp    |   56 +
 .../include/visuVTKAdaptor/Material.hpp            |   63 +
 .../include/visuVTKAdaptor/Medical3DCamera.hpp     |   58 +
 .../visuVTKAdaptor/include/visuVTKAdaptor/Mesh.hpp |  129 ++
 .../include/visuVTKAdaptor/MeshFactory.hpp         |   59 +
 .../include/visuVTKAdaptor/MeshNormals.hpp         |   68 +
 .../include/visuVTKAdaptor/MeshesBoxWidget.hpp     |   78 +
 .../include/visuVTKAdaptor/Model.hpp               |   49 +
 .../include/visuVTKAdaptor/ModelSeries.hpp         |   60 +
 .../include/visuVTKAdaptor/Namespace.hpp           |   20 +
 .../include/visuVTKAdaptor/NegatoMPR.hpp           |   80 +
 .../include/visuVTKAdaptor/NegatoOneSlice.hpp      |   71 +
 .../visuVTKAdaptor/NegatoSlicingInteractor.hpp     |   63 +
 .../visuVTKAdaptor/NegatoWindowingInteractor.hpp   |   65 +
 .../include/visuVTKAdaptor/Normals.hpp             |   65 +
 .../include/visuVTKAdaptor/PickerInteractor.hpp    |   58 +
 .../include/visuVTKAdaptor/Plane.hpp               |   70 +
 .../include/visuVTKAdaptor/PlaneInteractor.hpp     |   59 +
 .../include/visuVTKAdaptor/PlaneList.hpp           |   58 +
 .../visuVTKAdaptor/PlaneSelectionNotifier.hpp      |   73 +
 .../include/visuVTKAdaptor/PlaneSelector.hpp       |   53 +
 .../include/visuVTKAdaptor/Plugin.hpp              |   40 +
 .../include/visuVTKAdaptor/Point.hpp               |   64 +
 .../include/visuVTKAdaptor/PointLabel.hpp          |   51 +
 .../include/visuVTKAdaptor/PointList.hpp           |   58 +
 .../include/visuVTKAdaptor/PointListInteractor.hpp |   59 +
 .../include/visuVTKAdaptor/ProbeCursor.hpp         |   81 +
 .../include/visuVTKAdaptor/Reconstruction.hpp      |   68 +
 .../include/visuVTKAdaptor/Render.hpp              |   50 +
 .../include/visuVTKAdaptor/Resection.hpp           |   57 +
 .../include/visuVTKAdaptor/ResectionDB.hpp         |   55 +
 .../include/visuVTKAdaptor/ResetCamera.hpp         |   52 +
 .../include/visuVTKAdaptor/SliceFollowerCamera.hpp |   52 +
 .../include/visuVTKAdaptor/SlicesCursor.hpp        |   78 +
 .../include/visuVTKAdaptor/Snapshot.hpp            |   53 +
 .../visuVTKAdaptor/include/visuVTKAdaptor/Text.hpp |   83 +
 .../include/visuVTKAdaptor/Transform.hpp           |   89 +
 .../include/visuVTKAdaptor/TriangularMesh.hpp      |  143 ++
 .../include/visuVTKAdaptor/VectorField.hpp         |   66 +
 .../include/visuVTKAdaptor/Video.hpp               |   62 +
 .../include/visuVTKAdaptor/config.hpp              |   40 +
 Bundles/LeafVisu/visuVTKAdaptor/rc/plugin.xml      |  339 ++++
 Bundles/LeafVisu/visuVTKAdaptor/rc/video.xml       |   35 +
 .../visuVTKAdaptor/src/visuVTKAdaptor/Axes.cpp     |  122 ++
 .../src/visuVTKAdaptor/BoxWidget.cpp               |  215 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Camera.cpp   |  202 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Camera2.cpp  |  214 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Cube.cpp     |   44 +
 .../visuVTKAdaptor/src/visuVTKAdaptor/Distance.cpp |  194 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Image.cpp    |  336 ++++
 .../src/visuVTKAdaptor/Image3DCursor.cpp           |  214 ++
 .../src/visuVTKAdaptor/ImageLandmarks.cpp          |  321 +++
 .../src/visuVTKAdaptor/ImageMultiDistances.cpp     |  504 +++++
 .../src/visuVTKAdaptor/ImagePickerInteractor.cpp   |  304 +++
 .../src/visuVTKAdaptor/ImageSeries.cpp             |  207 ++
 .../src/visuVTKAdaptor/ImageSlice.cpp              |  433 ++++
 .../src/visuVTKAdaptor/ImageText.cpp               |  146 ++
 .../src/visuVTKAdaptor/ImagesBlend.cpp             |  315 +++
 .../src/visuVTKAdaptor/ImagesProbeCursor.cpp       |  476 +++++
 .../src/visuVTKAdaptor/InteractorStyle.cpp         |  111 +
 .../src/visuVTKAdaptor/LabeledPointList.cpp        |  299 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Material.cpp |  199 ++
 .../src/visuVTKAdaptor/Medical3DCamera.cpp         |  173 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Mesh.cpp     |  924 +++++++++
 .../src/visuVTKAdaptor/MeshFactory.cpp             |  169 ++
 .../src/visuVTKAdaptor/MeshNormals.cpp             |  250 +++
 .../src/visuVTKAdaptor/MeshesBoxWidget.cpp         |  323 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Model.cpp    |  126 ++
 .../src/visuVTKAdaptor/ModelSeries.cpp             |  163 ++
 .../src/visuVTKAdaptor/NegatoMPR.cpp               |  378 ++++
 .../src/visuVTKAdaptor/NegatoOneSlice.cpp          |  300 +++
 .../src/visuVTKAdaptor/NegatoSlicingInteractor.cpp |  476 +++++
 .../visuVTKAdaptor/NegatoWindowingInteractor.cpp   |  290 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Normals.cpp  |  204 ++
 .../src/visuVTKAdaptor/PickerInteractor.cpp        |  274 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Plane.cpp    |  298 +++
 .../src/visuVTKAdaptor/PlaneInteractor.cpp         |  248 +++
 .../src/visuVTKAdaptor/PlaneList.cpp               |  306 +++
 .../src/visuVTKAdaptor/PlaneSelectionNotifier.cpp  |  245 +++
 .../src/visuVTKAdaptor/PlaneSelector.cpp           |  137 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Plugin.cpp   |   30 +
 .../visuVTKAdaptor/src/visuVTKAdaptor/Point.cpp    |  268 +++
 .../src/visuVTKAdaptor/PointLabel.cpp              |   94 +
 .../src/visuVTKAdaptor/PointList.cpp               |  188 ++
 .../src/visuVTKAdaptor/PointListInteractor.cpp     |  236 +++
 .../src/visuVTKAdaptor/ProbeCursor.cpp             |  435 ++++
 .../src/visuVTKAdaptor/Reconstruction.cpp          |  237 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Render.cpp   |  104 +
 .../src/visuVTKAdaptor/Resection.cpp               |  164 ++
 .../src/visuVTKAdaptor/ResectionDB.cpp             |  160 ++
 .../src/visuVTKAdaptor/ResetCamera.cpp             |  106 +
 .../src/visuVTKAdaptor/SliceFollowerCamera.cpp     |  232 +++
 .../src/visuVTKAdaptor/SlicesCursor.cpp            |  431 ++++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Snapshot.cpp |  166 ++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Text.cpp     |  176 ++
 .../src/visuVTKAdaptor/Transform.cpp               |  207 ++
 .../src/visuVTKAdaptor/TriangularMesh.cpp          |  994 +++++++++
 .../src/visuVTKAdaptor/VectorField.cpp             |  226 +++
 .../visuVTKAdaptor/src/visuVTKAdaptor/Video.cpp    |  163 ++
 Bundles/LeafVisu/visuVTKQt/CMakeLists.txt          |   33 +
 Bundles/LeafVisu/visuVTKQt/COPYING                 |  675 +++++++
 Bundles/LeafVisu/visuVTKQt/COPYING.LESSER          |  166 ++
 Bundles/LeafVisu/visuVTKQt/Properties.cmake        |    7 +
 Bundles/LeafVisu/visuVTKQt/bin/build.options       |   20 +
 .../visuVTKQt/include/visuVTKQt/Namespace.hpp      |   20 +
 .../visuVTKQt/include/visuVTKQt/Plugin.hpp         |   39 +
 .../visuVTKQt/VtkRenderWindowInteractorManager.hpp |   79 +
 .../visuVTKQt/include/visuVTKQt/config.hpp         |   40 +
 Bundles/LeafVisu/visuVTKQt/rc/plugin.xml           |   13 +
 .../LeafVisu/visuVTKQt/src/visuVTKQt/Plugin.cpp    |   41 +
 .../visuVTKQt/VtkRenderWindowInteractorManager.cpp |  139 ++
 Bundles/LeafVisu/visuVTKVRAdaptor/CMakeLists.txt   |   21 +
 Bundles/LeafVisu/visuVTKVRAdaptor/Properties.cmake |    7 +
 .../LeafVisu/visuVTKVRAdaptor/bin/build.options    |   20 +
 .../include/visuVTKVRAdaptor/Plugin.hpp            |   40 +
 .../include/visuVTKVRAdaptor/Volume.hpp            |  121 ++
 .../include/visuVTKVRAdaptor/config.hpp            |   40 +
 Bundles/LeafVisu/visuVTKVRAdaptor/rc/plugin.xml    |   19 +
 .../src/visuVTKVRAdaptor/Plugin.cpp                |   29 +
 .../src/visuVTKVRAdaptor/Volume.cpp                |  473 +++++
 Bundles/LeafVisu/vtkCompositeMesh/CMakeLists.txt   |   20 +
 Bundles/LeafVisu/vtkCompositeMesh/COPYING          |  675 +++++++
 Bundles/LeafVisu/vtkCompositeMesh/COPYING.LESSER   |  166 ++
 Bundles/LeafVisu/vtkCompositeMesh/Properties.cmake |    7 +
 .../LeafVisu/vtkCompositeMesh/bin/build.options    |   16 +
 .../include/vtkCompositeMesh/Namespace.hpp         |   20 +
 .../include/vtkCompositeMesh/Plugin.hpp            |   49 +
 .../include/vtkCompositeMesh/RendererService.hpp   |  163 ++
 .../include/vtkCompositeMesh/config.hpp            |   40 +
 Bundles/LeafVisu/vtkCompositeMesh/rc/plugin.xml    |   12 +
 .../src/vtkCompositeMesh/Plugin.cpp                |   25 +
 .../src/vtkCompositeMesh/RendererService.cpp       |  312 +++
 Bundles/LeafVisu/vtkSimpleMesh/CMakeLists.txt      |   20 +
 Bundles/LeafVisu/vtkSimpleMesh/COPYING             |  675 +++++++
 Bundles/LeafVisu/vtkSimpleMesh/COPYING.LESSER      |  166 ++
 Bundles/LeafVisu/vtkSimpleMesh/Properties.cmake    |    7 +
 Bundles/LeafVisu/vtkSimpleMesh/bin/build.options   |   16 +
 .../include/vtkSimpleMesh/Namespace.hpp            |   20 +
 .../vtkSimpleMesh/include/vtkSimpleMesh/Plugin.hpp |   49 +
 .../include/vtkSimpleMesh/RendererService.hpp      |  163 ++
 .../vtkSimpleMesh/SSimpleMeshDeformation.hpp       |  113 ++
 .../vtkSimpleMesh/include/vtkSimpleMesh/config.hpp |   40 +
 Bundles/LeafVisu/vtkSimpleMesh/rc/plugin.xml       |   21 +
 .../vtkSimpleMesh/src/vtkSimpleMesh/Plugin.cpp     |   25 +
 .../src/vtkSimpleMesh/RendererService.cpp          |  298 +++
 .../src/vtkSimpleMesh/SSimpleMeshDeformation.cpp   |  272 +++
 Bundles/LeafVisu/vtkSimpleNegato/CMakeLists.txt    |   18 +
 Bundles/LeafVisu/vtkSimpleNegato/COPYING           |  675 +++++++
 Bundles/LeafVisu/vtkSimpleNegato/COPYING.LESSER    |  166 ++
 Bundles/LeafVisu/vtkSimpleNegato/Properties.cmake  |    7 +
 Bundles/LeafVisu/vtkSimpleNegato/bin/build.options |   16 +
 .../include/vtkSimpleNegato/Namespace.hpp          |   20 +
 .../include/vtkSimpleNegato/Plugin.hpp             |   51 +
 .../include/vtkSimpleNegato/RendererService.hpp    |  136 ++
 .../include/vtkSimpleNegato/config.hpp             |   40 +
 Bundles/LeafVisu/vtkSimpleNegato/rc/plugin.xml     |   15 +
 .../vtkSimpleNegato/src/vtkSimpleNegato/Plugin.cpp |   25 +
 .../src/vtkSimpleNegato/RendererService.cpp        |  244 +++
 Bundles/core/activities/CMakeLists.txt             |   19 +
 Bundles/core/activities/Properties.cmake           |    7 +
 Bundles/core/activities/bin/build.options          |   11 +
 .../core/activities/include/activities/Plugin.hpp  |   30 +
 .../activities/action/SActivityLauncher.hpp        |  194 ++
 .../core/activities/include/activities/config.hpp  |   33 +
 .../include/activities/helper/Activity.hpp         |   37 +
 Bundles/core/activities/rc/activities.xsd          |   67 +
 Bundles/core/activities/rc/plugin.xml              |   21 +
 Bundles/core/activities/src/activities/Plugin.cpp  |   31 +
 .../src/activities/action/SActivityLauncher.cpp    |  540 +++++
 .../activities/src/activities/helper/Activity.cpp  |  154 ++
 Bundles/core/appXml/CMakeLists.txt                 |    9 +
 Bundles/core/appXml/COPYING                        |  675 +++++++
 Bundles/core/appXml/COPYING.LESSER                 |  166 ++
 Bundles/core/appXml/Properties.cmake               |    7 +
 Bundles/core/appXml/bin/build.options              |    5 +
 Bundles/core/appXml/include/appXml/Namespace.hpp   |   21 +
 Bundles/core/appXml/include/appXml/Plugin.hpp      |   49 +
 Bundles/core/appXml/include/appXml/config.hpp      |   39 +
 Bundles/core/appXml/rc/plugin.xml                  |    7 +
 Bundles/core/appXml/src/appXml/Plugin.cpp          |   80 +
 Bundles/core/binding/CMakeLists.txt                |    4 +
 Bundles/core/binding/COPYING                       |  675 +++++++
 Bundles/core/binding/COPYING.LESSER                |  166 ++
 Bundles/core/binding/Properties.cmake              |    7 +
 Bundles/core/binding/bin/build.options             |    6 +
 Bundles/core/binding/include/binding/Plugin.hpp    |   43 +
 Bundles/core/binding/include/binding/config.hpp    |   41 +
 Bundles/core/binding/include/binding/namespace.hpp |   17 +
 Bundles/core/binding/rc/plugin.xml                 |    5 +
 Bundles/core/binding/src/binding/Plugin.cpp        |   60 +
 Bundles/core/dataReg/CMakeLists.txt                |    7 +
 Bundles/core/dataReg/COPYING                       |  675 +++++++
 Bundles/core/dataReg/COPYING.LESSER                |  166 ++
 Bundles/core/dataReg/Properties.cmake              |    7 +
 Bundles/core/dataReg/bin/build.options             |    4 +
 Bundles/core/dataReg/include/dataReg/Namespace.hpp |   18 +
 Bundles/core/dataReg/include/dataReg/Plugin.hpp    |   39 +
 Bundles/core/dataReg/include/dataReg/config.hpp    |   39 +
 Bundles/core/dataReg/rc/plugin.xml                 |    5 +
 Bundles/core/dataReg/src/dataReg/Plugin.cpp        |   35 +
 Bundles/core/gui/CMakeLists.txt                    |   15 +
 Bundles/core/gui/COPYING                           |  675 +++++++
 Bundles/core/gui/COPYING.LESSER                    |  166 ++
 Bundles/core/gui/Properties.cmake                  |    7 +
 Bundles/core/gui/bin/build.options                 |   15 +
 Bundles/core/gui/include/gui/Namespace.hpp         |   21 +
 Bundles/core/gui/include/gui/Plugin.hpp            |   49 +
 .../gui/include/gui/action/ActionNotifyService.hpp |   81 +
 .../gui/include/gui/action/ConfigActionSrv.hpp     |  176 ++
 .../include/gui/action/ConfigActionSrvWithKey.hpp  |  128 ++
 .../include/gui/action/ModifyLayoutActionSrv.hpp   |  121 ++
 Bundles/core/gui/include/gui/action/Namespace.hpp  |   26 +
 .../gui/include/gui/action/NothingActionSrv.hpp    |   82 +
 .../core/gui/include/gui/action/PushObjectSrv.hpp  |   92 +
 Bundles/core/gui/include/gui/action/QuitAction.hpp |   76 +
 .../gui/include/gui/action/SConfigLauncher.hpp     |  134 ++
 Bundles/core/gui/include/gui/action/SSignal.hpp    |  118 ++
 .../core/gui/include/gui/action/SSlotCaller.hpp    |   97 +
 .../include/gui/action/StarterActionService.hpp    |  144 ++
 .../gui/include/gui/aspect/DefaultMenuBarSrv.hpp   |   98 +
 .../core/gui/include/gui/aspect/DefaultMenuSrv.hpp |   99 +
 .../gui/include/gui/aspect/DefaultToolBarSrv.hpp   |  127 ++
 Bundles/core/gui/include/gui/aspect/Namespace.hpp  |   26 +
 .../core/gui/include/gui/editor/IDialogEditor.hpp  |   58 +
 Bundles/core/gui/include/gui/editor/IEditor.hpp    |   63 +
 Bundles/core/gui/include/gui/editor/Namespace.hpp  |   26 +
 Bundles/core/gui/include/gui/export.hpp            |   41 +
 .../core/gui/include/gui/frame/DefaultFrame.hpp    |   84 +
 Bundles/core/gui/include/gui/frame/Namespace.hpp   |   26 +
 Bundles/core/gui/include/gui/view/DefaultView.hpp  |   88 +
 Bundles/core/gui/include/gui/view/IView.hpp        |   53 +
 Bundles/core/gui/include/gui/view/Namespace.hpp    |   26 +
 Bundles/core/gui/rc/plugin.xml                     |  104 +
 Bundles/core/gui/rc/xml.xsd                        |  117 ++
 Bundles/core/gui/src/gui/Plugin.cpp                |   29 +
 .../gui/src/gui/action/ActionNotifyService.cpp     |  114 ++
 .../core/gui/src/gui/action/ConfigActionSrv.cpp    |  203 ++
 .../gui/src/gui/action/ConfigActionSrvWithKey.cpp  |  238 +++
 .../gui/src/gui/action/ModifyLayoutActionSrv.cpp   |  199 ++
 .../core/gui/src/gui/action/NothingActionSrv.cpp   |   78 +
 Bundles/core/gui/src/gui/action/PushObjectSrv.cpp  |  186 ++
 Bundles/core/gui/src/gui/action/QuitAction.cpp     |   84 +
 .../core/gui/src/gui/action/SConfigLauncher.cpp    |  120 ++
 Bundles/core/gui/src/gui/action/SSignal.cpp        |  127 ++
 Bundles/core/gui/src/gui/action/SSlotCaller.cpp    |  132 ++
 .../gui/src/gui/action/StarterActionService.cpp    |  221 ++
 .../core/gui/src/gui/aspect/DefaultMenuBarSrv.cpp  |   81 +
 Bundles/core/gui/src/gui/aspect/DefaultMenuSrv.cpp |   76 +
 .../core/gui/src/gui/aspect/DefaultToolBarSrv.cpp  |   75 +
 Bundles/core/gui/src/gui/editor/IDialogEditor.cpp  |   36 +
 Bundles/core/gui/src/gui/editor/IEditor.cpp        |   36 +
 Bundles/core/gui/src/gui/frame/DefaultFrame.cpp    |   80 +
 Bundles/core/gui/src/gui/view/DefaultView.cpp      |   79 +
 Bundles/core/gui/src/gui/view/IView.cpp            |   26 +
 Bundles/core/io/CMakeLists.txt                     |   11 +
 Bundles/core/io/COPYING                            |  675 +++++++
 Bundles/core/io/COPYING.LESSER                     |  166 ++
 Bundles/core/io/Properties.cmake                   |    7 +
 Bundles/core/io/bin/build.options                  |    5 +
 Bundles/core/io/include/io/IReader.hpp             |  173 ++
 Bundles/core/io/include/io/IWriter.hpp             |  154 ++
 Bundles/core/io/include/io/Namespace.hpp           |   21 +
 Bundles/core/io/include/io/Plugin.hpp              |   44 +
 Bundles/core/io/include/io/config.hpp              |   40 +
 Bundles/core/io/include/io/ioTypes.hpp             |   28 +
 Bundles/core/io/rc/Image.xsd                       |   34 +
 Bundles/core/io/rc/baseTypes.xsd                   |   93 +
 .../core/io/rc/defaultCompositeObjectReaderCfg.xsd |   27 +
 Bundles/core/io/rc/locale/en/LC_MESSAGES/io.po     |  102 +
 .../core/io/rc/locale/fr/LC_MESSAGES/io-Final.po   |  126 ++
 Bundles/core/io/rc/locale/fr/LC_MESSAGES/io.po     |   73 +
 Bundles/core/io/rc/plugin.xml                      |    5 +
 Bundles/core/io/src/io/IReader.cpp                 |  182 ++
 Bundles/core/io/src/io/IWriter.cpp                 |  163 ++
 Bundles/core/io/src/io/Plugin.cpp                  |   25 +
 Bundles/core/memory/CMakeLists.txt                 |   12 +
 Bundles/core/memory/COPYING                        |  675 +++++++
 Bundles/core/memory/COPYING.LESSER                 |  166 ++
 Bundles/core/memory/Properties.cmake               |    7 +
 Bundles/core/memory/bin/build.options              |   11 +
 Bundles/core/memory/include/memory/Namespace.hpp   |   21 +
 Bundles/core/memory/include/memory/Plugin.hpp      |   44 +
 Bundles/core/memory/include/memory/SDumpPolicy.hpp |   77 +
 Bundles/core/memory/include/memory/config.hpp      |   40 +
 Bundles/core/memory/rc/plugin.xml                  |   12 +
 Bundles/core/memory/src/memory/Plugin.cpp          |   68 +
 Bundles/core/memory/src/memory/SDumpPolicy.cpp     |  117 ++
 Bundles/core/servicesReg/CMakeLists.txt            |    6 +
 Bundles/core/servicesReg/COPYING                   |  675 +++++++
 Bundles/core/servicesReg/COPYING.LESSER            |  166 ++
 Bundles/core/servicesReg/Properties.cmake          |    7 +
 Bundles/core/servicesReg/bin/build.options         |    8 +
 .../servicesReg/include/servicesReg/Namespace.hpp  |   21 +
 .../servicesReg/include/servicesReg/Plugin.hpp     |   42 +
 .../servicesReg/include/servicesReg/config.hpp     |   39 +
 Bundles/core/servicesReg/rc/appConfig.xsd          |  155 ++
 .../core/servicesReg/rc/appConfigParameters.xsd    |   25 +
 Bundles/core/servicesReg/rc/plugin.xml             |   74 +
 Bundles/core/servicesReg/rc/serviceConfig.xsd      |   23 +
 Bundles/core/servicesReg/rc/serviceFactory.xsd     |   17 +
 .../core/servicesReg/src/servicesReg/Plugin.cpp    |   75 +
 Bundles/core/visu/CMakeLists.txt                   |    9 +
 Bundles/core/visu/COPYING                          |  675 +++++++
 Bundles/core/visu/COPYING.LESSER                   |  166 ++
 Bundles/core/visu/Properties.cmake                 |    7 +
 Bundles/core/visu/bin/build.options                |    7 +
 Bundles/core/visu/include/visu/Namespace.hpp       |   21 +
 Bundles/core/visu/include/visu/Plugin.hpp          |   36 +
 Bundles/core/visu/include/visu/config.hpp          |   40 +
 Bundles/core/visu/rc/chest.xml                     |   46 +
 .../visu/rc/locale/en/LC_MESSAGES/visualization.po |   59 +
 .../locale/fr/LC_MESSAGES/visualization-Final.po   |   46 +
 .../visu/rc/locale/fr/LC_MESSAGES/visualization.po |   59 +
 .../rc/locale/fr/LC_MESSAGES/visualization.pot     |   29 +
 Bundles/core/visu/rc/plugin.xml                    |   10 +
 Bundles/core/visu/rc/visuCfg.xsd                   |   25 +
 Bundles/core/visu/src/visu/Plugin.cpp              |   25 +
 Bundles/media/CMakeLists.txt                       |    2 +
 Bundles/media/Properties.cmake                     |    7 +
 Bundles/media/bin/build.options                    |    3 +
 Bundles/media/rc/camera-photo.png                  |  Bin 0 -> 864 bytes
 Bundles/media/rc/delete.png                        |  Bin 0 -> 1257 bytes
 Bundles/media/rc/distance.png                      |  Bin 0 -> 763 bytes
 Bundles/media/rc/export.png                        |  Bin 0 -> 1150 bytes
 Bundles/media/rc/icon-dump.svg                     |   87 +
 Bundles/media/rc/icons/Add-landmark.png            |  Bin 0 -> 1577 bytes
 Bundles/media/rc/icons/Export.svg                  |  256 +++
 Bundles/media/rc/icons/Find-landmark.png           |  Bin 0 -> 2122 bytes
 Bundles/media/rc/icons/FullCross.png               |  Bin 0 -> 118 bytes
 Bundles/media/rc/icons/HideCross.png               |  Bin 0 -> 781 bytes
 Bundles/media/rc/icons/HideDistance.png            |  Bin 0 -> 1907 bytes
 Bundles/media/rc/icons/ImageSeries.svg             |  134 ++
 Bundles/media/rc/icons/Import.svg                  |  132 ++
 Bundles/media/rc/icons/Launch_activity.svg         |  251 +++
 Bundles/media/rc/icons/Load-landmark.png           |  Bin 0 -> 1951 bytes
 Bundles/media/rc/icons/ManageOrgan.png             |  Bin 0 -> 1906 bytes
 Bundles/media/rc/icons/ModelSeries.svg             |  115 ++
 Bundles/media/rc/icons/NormalCross.png             |  Bin 0 -> 128 bytes
 Bundles/media/rc/icons/Remove-landmark.png         |  Bin 0 -> 1636 bytes
 Bundles/media/rc/icons/RemoveDistance.png          |  Bin 0 -> 2207 bytes
 Bundles/media/rc/icons/Save-landmark.png           |  Bin 0 -> 2104 bytes
 Bundles/media/rc/icons/View-landmark.png           |  Bin 0 -> 2538 bytes
 Bundles/media/rc/icons/camera-photo.png            |  Bin 0 -> 864 bytes
 Bundles/media/rc/icons/distance.png                |  Bin 0 -> 3352 bytes
 Bundles/media/rc/icons/icon-2D.png                 |  Bin 0 -> 1383 bytes
 Bundles/media/rc/icons/icon-3D.png                 |  Bin 0 -> 1796 bytes
 Bundles/media/rc/icons/icon-VR.png                 |  Bin 0 -> 1487 bytes
 Bundles/media/rc/icons/icon-axial.png              |  Bin 0 -> 1556 bytes
 Bundles/media/rc/icons/icon-blend.png              |  Bin 0 -> 2663 bytes
 Bundles/media/rc/icons/icon-box-reset.png          |  Bin 0 -> 3179 bytes
 Bundles/media/rc/icons/icon-box.png                |  Bin 0 -> 2758 bytes
 Bundles/media/rc/icons/icon-exportVRParam.png      |  Bin 0 -> 1647 bytes
 Bundles/media/rc/icons/icon-frontal.png            |  Bin 0 -> 1883 bytes
 Bundles/media/rc/icons/icon-landmark.png           |  Bin 0 -> 2434 bytes
 Bundles/media/rc/icons/icon-sagittal.png           |  Bin 0 -> 2000 bytes
 Bundles/media/rc/icons/icon-tf1.svg                |  476 +++++
 Bundles/media/rc/icons/icon-tf2.svg                |  510 +++++
 Bundles/media/rc/import.png                        |  Bin 0 -> 919 bytes
 Bundles/media/rc/new.png                           |  Bin 0 -> 692 bytes
 Bundles/media/rc/nowindowing.svg                   |  112 ++
 Bundles/media/rc/plugin.xml                        |    2 +
 Bundles/media/rc/ramp.png                          |  Bin 0 -> 1463 bytes
 Bundles/media/rc/reinitialize.png                  |  Bin 0 -> 1369 bytes
 Bundles/media/rc/rename.png                        |  Bin 0 -> 939 bytes
 Bundles/media/rc/sliceHide.png                     |  Bin 0 -> 947 bytes
 Bundles/media/rc/sliceShow.png                     |  Bin 0 -> 545 bytes
 Bundles/media/rc/square.png                        |  Bin 0 -> 1300 bytes
 Bundles/media/rc/windowing.svg                     |  104 +
 Bundles/media/src/media/media.cpp                  |    1 +
 CHANGELOG.txt                                      |  693 +++++++
 CMake/FindCAMP.cmake                               |   48 +
 CMake/FindCppUnit.cmake                            |   46 +
 CMake/FindHDF5.cmake                               |   62 +
 CMake/FindIconv.cmake                              |   10 +
 CMake/OSXTools/osx_install_name_tool.py            |  328 +++
 CMake/Wix/WIX.template.in                          |   80 +
 CMake/build/configure_file.cmake                   |    2 +
 CMake/cppunit/cppunit_main.cpp                     |  300 +++
 CMake/doxygen/Doxyfile.in                          | 1521 ++++++++++++++
 CMake/doxygen/MainPage.dox                         |    7 +
 CMake/fw-ITK.cmake                                 |   33 +
 CMake/fw-Qt4.cmake                                 |    5 +
 CMake/fw-VTK.cmake                                 |    2 +
 CMake/fw-VXL.cmake                                 |    1 +
 CMake/fw-boost.cmake                               |   33 +
 CMake/fw-python.cmake                              |    4 +
 CMakeLists.txt                                     |  750 +++++++
 README.md                                          |    5 +
 SrcLib/ARLcore/CMakeLists.txt                      |   48 +
 SrcLib/ARLcore/CMakeLists.txt.old                  |   60 +
 SrcLib/ARLcore/Properties.cmake                    |    7 +
 SrcLib/ARLcore/bin/build.options                   |    4 +
 SrcLib/ARLcore/include/arlcore/Calibration.h       |  191 ++
 SrcLib/ARLcore/include/arlcore/Camera.h            |  281 +++
 SrcLib/ARLcore/include/arlcore/CameraList.h        |   67 +
 SrcLib/ARLcore/include/arlcore/Colour.h            |   66 +
 SrcLib/ARLcore/include/arlcore/Command.h           |   53 +
 SrcLib/ARLcore/include/arlcore/Common.h            |   79 +
 SrcLib/ARLcore/include/arlcore/FieldCorrection.h   |   90 +
 SrcLib/ARLcore/include/arlcore/File.h              |  148 ++
 SrcLib/ARLcore/include/arlcore/ICP.h               |  126 ++
 SrcLib/ARLcore/include/arlcore/MatrixR.h           |  390 ++++
 SrcLib/ARLcore/include/arlcore/Mesh.h              |  129 ++
 SrcLib/ARLcore/include/arlcore/Misc.h              |  389 ++++
 SrcLib/ARLcore/include/arlcore/Object.h            |  223 ++
 SrcLib/ARLcore/include/arlcore/Optimization.h      | 1088 ++++++++++
 SrcLib/ARLcore/include/arlcore/Parameters.h        |  154 ++
 SrcLib/ARLcore/include/arlcore/Particle.h          |   60 +
 SrcLib/ARLcore/include/arlcore/PlaneSystem.h       |  316 +++
 SrcLib/ARLcore/include/arlcore/Player.h            |   68 +
 SrcLib/ARLcore/include/arlcore/Point.h             |  364 ++++
 SrcLib/ARLcore/include/arlcore/PointsList.h        |  343 ++++
 SrcLib/ARLcore/include/arlcore/Reconst3D.h         |  256 +++
 SrcLib/ARLcore/include/arlcore/Recorder.h          |   69 +
 SrcLib/ARLcore/include/arlcore/Scene.h             |  137 ++
 SrcLib/ARLcore/include/arlcore/Scenes.h            |  191 ++
 SrcLib/ARLcore/include/arlcore/SmartPointsList.h   |  221 ++
 SrcLib/ARLcore/include/arlcore/Tag.h               |  117 ++
 SrcLib/ARLcore/include/arlcore/Tags.h              |   70 +
 SrcLib/ARLcore/include/arlcore/Tracker.h           |   35 +
 SrcLib/ARLcore/include/arlcore/Type.h              |  129 ++
 SrcLib/ARLcore/include/arlcore/UncertaintyPropag.h |   68 +
 SrcLib/ARLcore/include/arlcore/UnitTestArlCore.h   |   93 +
 .../include/arlcore/vnl_covariance_matrix.h        |   49 +
 SrcLib/ARLcore/include/arlcore/vnl_rigid_vector.h  |   73 +
 .../include/arlcore/vnl_rotation3d_matrix.h        |   78 +
 .../include/arlcore/vnl_rotation3d_vector.h        |   78 +
 SrcLib/ARLcore/src/arlcore/Calibration.cpp         |  625 ++++++
 SrcLib/ARLcore/src/arlcore/Camera.cpp              | 1137 +++++++++++
 SrcLib/ARLcore/src/arlcore/CameraList.cpp          |   75 +
 SrcLib/ARLcore/src/arlcore/Colour.cpp              |   91 +
 SrcLib/ARLcore/src/arlcore/Command.cpp             |   52 +
 SrcLib/ARLcore/src/arlcore/FieldCorrection.cpp     |  172 ++
 SrcLib/ARLcore/src/arlcore/File.cpp                |  195 ++
 SrcLib/ARLcore/src/arlcore/ICP.cpp                 |  533 +++++
 SrcLib/ARLcore/src/arlcore/MatrixR.cpp             | 1889 +++++++++++++++++
 SrcLib/ARLcore/src/arlcore/Mesh.cpp                |  754 +++++++
 SrcLib/ARLcore/src/arlcore/Misc.cpp                | 1383 +++++++++++++
 SrcLib/ARLcore/src/arlcore/Object.cpp              |  383 ++++
 SrcLib/ARLcore/src/arlcore/Optimization.cpp        | 2069 +++++++++++++++++++
 SrcLib/ARLcore/src/arlcore/Parameters.cpp          |  261 +++
 SrcLib/ARLcore/src/arlcore/Particle.cpp            |   54 +
 SrcLib/ARLcore/src/arlcore/PlaneSystem.cpp         |  786 ++++++++
 SrcLib/ARLcore/src/arlcore/Player.cpp              |   83 +
 SrcLib/ARLcore/src/arlcore/Point.cpp               | 1082 ++++++++++
 SrcLib/ARLcore/src/arlcore/PointsList.cpp          | 1477 ++++++++++++++
 SrcLib/ARLcore/src/arlcore/Reconst3D.cpp           | 1194 +++++++++++
 SrcLib/ARLcore/src/arlcore/Recorder.cpp            |   62 +
 SrcLib/ARLcore/src/arlcore/Scene.cpp               |  282 +++
 SrcLib/ARLcore/src/arlcore/Scenes.cpp              |  512 +++++
 SrcLib/ARLcore/src/arlcore/SmartPointsList.cpp     |  526 +++++
 SrcLib/ARLcore/src/arlcore/Tag.cpp                 |  167 ++
 SrcLib/ARLcore/src/arlcore/Tags.cpp                |  162 ++
 SrcLib/ARLcore/src/arlcore/Tracker.cpp             |   21 +
 SrcLib/ARLcore/src/arlcore/UncertaintyPropag.cpp   |  643 ++++++
 SrcLib/ARLcore/src/arlcore/UnitTestArlCore.cpp     | 1948 ++++++++++++++++++
 .../ARLcore/src/arlcore/vnl_covariance_matrix.cpp  |   60 +
 SrcLib/ARLcore/src/arlcore/vnl_rigid_vector.cpp    |  108 +
 .../ARLcore/src/arlcore/vnl_rotation3d_matrix.cpp  |  267 +++
 .../ARLcore/src/arlcore/vnl_rotation3d_vector.cpp  |  163 ++
 SrcLib/ARLcore/test/CMakeLists.txt                 |   10 +
 SrcLib/ARLcore/test/Properties.cmake               |    7 +
 SrcLib/ARLcore/test/cppunit.options                |   10 +
 SrcLib/ARLcore/test/tu/include/CalibrationTest.hpp |   42 +
 SrcLib/ARLcore/test/tu/include/GeometryTest.hpp    |   44 +
 .../ARLcore/test/tu/include/RegistrationTest.hpp   |   47 +
 SrcLib/ARLcore/test/tu/src/CalibrationTest.cpp     |   67 +
 SrcLib/ARLcore/test/tu/src/GeometryTest.cpp        |   64 +
 SrcLib/ARLcore/test/tu/src/RegistrationTest.cpp    |   77 +
 SrcLib/core/fwActivities/CMakeLists.txt            |   15 +
 SrcLib/core/fwActivities/COPYING                   |  675 +++++++
 SrcLib/core/fwActivities/COPYING.LESSER            |  166 ++
 SrcLib/core/fwActivities/Properties.cmake          |    7 +
 SrcLib/core/fwActivities/bin/build.options         |   11 +
 .../fwActivities/include/fwActivities/IBuilder.hpp |   79 +
 .../include/fwActivities/IValidator.hpp            |   83 +
 .../fwActivities/builder/ActivitySeries.hpp        |   60 +
 .../builder/ActivitySeriesInitData.hpp             |   53 +
 .../include/fwActivities/builder/factory/new.hpp   |   58 +
 .../fwActivities/builder/registry/detail.hpp       |   39 +
 .../fwActivities/builder/registry/macros.hpp       |   30 +
 .../fwActivities/include/fwActivities/config.hpp   |   41 +
 .../include/fwActivities/namespace.hpp             |   72 +
 .../include/fwActivities/registry/Activities.hpp   |  245 +++
 .../fwActivities/validator/ImageProperties.hpp     |   51 +
 .../fwActivities/validator/RelatedStudy.hpp        |   51 +
 .../include/fwActivities/validator/factory/new.hpp |   58 +
 .../fwActivities/validator/registry/detail.hpp     |   39 +
 .../fwActivities/validator/registry/macros.hpp     |   30 +
 .../fwActivities/src/fwActivities/IBuilder.cpp     |   38 +
 .../src/fwActivities/builder/ActivitySeries.cpp    |  133 ++
 .../builder/ActivitySeriesInitData.cpp             |   59 +
 .../src/fwActivities/builder/factory/new.cpp       |   27 +
 .../src/fwActivities/builder/registry/detail.cpp   |   31 +
 .../src/fwActivities/registry/Activities.cpp       |  316 +++
 .../src/fwActivities/validator/ImageProperties.cpp |   95 +
 .../src/fwActivities/validator/RelatedStudy.cpp    |   86 +
 .../src/fwActivities/validator/factory/new.cpp     |   27 +
 .../src/fwActivities/validator/registry/detail.cpp |   31 +
 SrcLib/core/fwActivities/test/CMakeLists.txt       |   10 +
 SrcLib/core/fwActivities/test/Properties.cmake     |    7 +
 SrcLib/core/fwActivities/test/cppunit.options      |    9 +
 .../include/builder/ActivitySeriesBuilderTest.hpp  |   43 +
 .../tu/include/registry/ActivityRegistryTest.hpp   |   49 +
 .../fwActivities/test/tu/rc/tu_builder/plugin.xml  |   27 +
 .../fwActivities/test/tu/rc/tu_registry/plugin.xml |  181 ++
 .../tu/src/builder/ActivitySeriesBuilderTest.cpp   |  110 +
 .../test/tu/src/registry/ActivityRegistryTest.cpp  |  205 ++
 SrcLib/core/fwAtomConversion/CMakeLists.txt        |   16 +
 SrcLib/core/fwAtomConversion/Properties.cmake      |    7 +
 SrcLib/core/fwAtomConversion/bin/build.options     |    4 +
 .../fwAtomConversion/AtomToDataMappingVisitor.hpp  |   99 +
 .../include/fwAtomConversion/AtomVisitor.hpp       |  111 +
 .../include/fwAtomConversion/DataVisitor.hpp       |  104 +
 .../include/fwAtomConversion/camp/ValueMapper.hpp  |   65 +
 .../include/fwAtomConversion/config.hpp            |   41 +
 .../include/fwAtomConversion/convert.hpp           |   92 +
 .../exception/ClassnameMismatch.hpp                |   29 +
 .../exception/ConversionNotManaged.hpp             |   29 +
 .../exception/DataFactoryNotFound.hpp              |   29 +
 .../exception/DuplicatedDataUUID.hpp               |   29 +
 .../fwAtomConversion/exception/NullPointer.hpp     |   30 +
 .../fwAtomConversion/exception/ObjectNotFound.hpp  |   30 +
 .../include/fwAtomConversion/mapper/Base.hpp       |   80 +
 .../include/fwAtomConversion/mapper/Graph.hpp      |   67 +
 .../fwAtomConversion/mapper/factory/new.hpp        |   46 +
 .../fwAtomConversion/mapper/registry/detail.hpp    |   39 +
 .../fwAtomConversion/mapper/registry/macros.hpp    |   31 +
 .../include/fwAtomConversion/namespace.hpp         |   51 +
 .../fwAtomConversion/AtomToDataMappingVisitor.cpp  |  441 ++++
 .../src/fwAtomConversion/AtomVisitor.cpp           |  123 ++
 .../src/fwAtomConversion/DataVisitor.cpp           |  257 +++
 .../src/fwAtomConversion/convert.cpp               |   98 +
 .../src/fwAtomConversion/exception/NullPointer.cpp |   23 +
 .../fwAtomConversion/exception/ObjectNotFound.cpp  |   23 +
 .../src/fwAtomConversion/mapper/Graph.cpp          |   97 +
 .../src/fwAtomConversion/mapper/factory/new.cpp    |   28 +
 .../fwAtomConversion/mapper/registry/detail.cpp    |   31 +
 SrcLib/core/fwAtomConversion/test/CMakeLists.txt   |   10 +
 SrcLib/core/fwAtomConversion/test/Properties.cmake |    7 +
 SrcLib/core/fwAtomConversion/test/cppunit.options  |   12 +
 .../test/tu/include/ConversionTest.hpp             |   93 +
 .../test/tu/src/ConversionTest.cpp                 |  662 ++++++
 SrcLib/core/fwAtoms/CMakeLists.txt                 |   14 +
 SrcLib/core/fwAtoms/COPYING                        |  675 +++++++
 SrcLib/core/fwAtoms/COPYING.LESSER                 |  166 ++
 SrcLib/core/fwAtoms/Properties.cmake               |    7 +
 SrcLib/core/fwAtoms/bin/build.options              |    5 +
 SrcLib/core/fwAtoms/include/fwAtoms/Base.hpp       |  140 ++
 SrcLib/core/fwAtoms/include/fwAtoms/Blob.hpp       |   83 +
 SrcLib/core/fwAtoms/include/fwAtoms/Boolean.hpp    |   96 +
 SrcLib/core/fwAtoms/include/fwAtoms/Exception.hpp  |   43 +
 SrcLib/core/fwAtoms/include/fwAtoms/Map.hpp        |  161 ++
 SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hpp    |  136 ++
 SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hxx    |  122 ++
 SrcLib/core/fwAtoms/include/fwAtoms/Object.hpp     |  123 ++
 SrcLib/core/fwAtoms/include/fwAtoms/Object.hxx     |   31 +
 SrcLib/core/fwAtoms/include/fwAtoms/Sequence.hpp   |  114 ++
 SrcLib/core/fwAtoms/include/fwAtoms/String.hpp     |   75 +
 SrcLib/core/fwAtoms/include/fwAtoms/config.hpp     |   41 +
 .../fwAtoms/include/fwAtoms/factory/namespace.hpp  |   26 +
 .../core/fwAtoms/include/fwAtoms/factory/new.hpp   |   57 +
 SrcLib/core/fwAtoms/include/fwAtoms/namespace.hpp  |   29 +
 .../fwAtoms/include/fwAtoms/registry/detail.hpp    |   37 +
 .../fwAtoms/include/fwAtoms/registry/macros.hpp    |   24 +
 .../fwAtoms/include/fwAtoms/registry/namespace.hpp |   27 +
 SrcLib/core/fwAtoms/src/fwAtoms/Base.cpp           |   22 +
 SrcLib/core/fwAtoms/src/fwAtoms/Blob.cpp           |   69 +
 SrcLib/core/fwAtoms/src/fwAtoms/Boolean.cpp        |   55 +
 SrcLib/core/fwAtoms/src/fwAtoms/Exception.cpp      |   23 +
 SrcLib/core/fwAtoms/src/fwAtoms/Map.cpp            |   30 +
 SrcLib/core/fwAtoms/src/fwAtoms/Numeric.cpp        |  109 +
 SrcLib/core/fwAtoms/src/fwAtoms/Object.cpp         |  128 ++
 SrcLib/core/fwAtoms/src/fwAtoms/Sequence.cpp       |   30 +
 SrcLib/core/fwAtoms/src/fwAtoms/String.cpp         |   32 +
 SrcLib/core/fwAtoms/src/fwAtoms/factory/new.cpp    |   25 +
 .../core/fwAtoms/src/fwAtoms/registry/detail.cpp   |   30 +
 SrcLib/core/fwAtoms/test/CMakeLists.txt            |   10 +
 SrcLib/core/fwAtoms/test/Properties.cmake          |    7 +
 SrcLib/core/fwAtoms/test/cppunit.options           |   10 +
 SrcLib/core/fwAtoms/test/tu/include/AtomTest.hpp   |   44 +
 .../core/fwAtoms/test/tu/include/BooleanTest.hpp   |   38 +
 .../core/fwAtoms/test/tu/include/NumericTest.hpp   |   44 +
 SrcLib/core/fwAtoms/test/tu/include/StringTest.hpp |   38 +
 SrcLib/core/fwAtoms/test/tu/src/AtomTest.cpp       |  185 ++
 SrcLib/core/fwAtoms/test/tu/src/BooleanTest.cpp    |   53 +
 SrcLib/core/fwAtoms/test/tu/src/NumericTest.cpp    |  198 ++
 SrcLib/core/fwAtoms/test/tu/src/StringTest.cpp     |   49 +
 SrcLib/core/fwAtomsFilter/CMakeLists.txt           |   14 +
 SrcLib/core/fwAtomsFilter/Properties.cmake         |   13 +
 SrcLib/core/fwAtomsFilter/bin/build.options        |   10 +
 .../include/fwAtomsFilter/IFilter.hpp              |   74 +
 .../fwAtomsFilter/include/fwAtomsFilter/config.hpp |   40 +
 .../include/fwAtomsFilter/factory/new.hpp          |   60 +
 .../include/fwAtomsFilter/functions.hpp            |   29 +
 .../include/fwAtomsFilter/namespace.hpp            |   36 +
 .../include/fwAtomsFilter/registry/detail.hpp      |   36 +
 .../include/fwAtomsFilter/registry/macros.hpp      |   29 +
 .../fwAtomsFilter/src/fwAtomsFilter/IFilter.cpp    |   25 +
 .../src/fwAtomsFilter/factory/new.cpp              |   25 +
 .../fwAtomsFilter/src/fwAtomsFilter/functions.cpp  |   68 +
 .../src/fwAtomsFilter/registry/detail.cpp          |   29 +
 SrcLib/core/fwAtomsPatch/CMakeLists.txt            |   11 +
 SrcLib/core/fwAtomsPatch/COPYING                   |  675 +++++++
 SrcLib/core/fwAtomsPatch/COPYING.LESSER            |  166 ++
 SrcLib/core/fwAtomsPatch/Properties.cmake          |    7 +
 SrcLib/core/fwAtomsPatch/bin/build.options         |    9 +
 .../fwAtomsPatch/include/fwAtomsPatch/IPatch.hpp   |   73 +
 .../include/fwAtomsPatch/ISemanticPatch.hpp        |  117 ++
 .../include/fwAtomsPatch/IStructuralCreator.hpp    |   65 +
 .../include/fwAtomsPatch/IStructuralPatch.hpp      |   81 +
 .../include/fwAtomsPatch/LinkDescriptor.hpp        |   95 +
 .../include/fwAtomsPatch/PatchingManager.hpp       |   58 +
 .../include/fwAtomsPatch/SemanticPatchDB.hpp       |   93 +
 .../include/fwAtomsPatch/StructuralCreatorDB.hpp   |   99 +
 .../include/fwAtomsPatch/StructuralPatchDB.hpp     |   95 +
 .../include/fwAtomsPatch/VersionDescriptor.hpp     |   81 +
 .../include/fwAtomsPatch/VersionsGraph.hpp         |  148 ++
 .../include/fwAtomsPatch/VersionsManager.hpp       |  126 ++
 .../include/fwAtomsPatch/conditions/Abstract.hpp   |   53 +
 .../fwAtomsPatch/conditions/NumericOverflow.hpp    |   52 +
 .../fwAtomsPatch/include/fwAtomsPatch/config.hpp   |   40 +
 .../fwAtomsPatch/exceptions/BadExtension.hpp       |   31 +
 .../include/fwAtomsPatch/exceptions/Base.hpp       |   34 +
 .../exceptions/ImpossibleConversion.hpp            |   31 +
 .../fwAtomsPatch/exceptions/MissingInformation.hpp |   31 +
 .../fwAtomsPatch/exceptions/UnknownVersion.hpp     |   31 +
 .../include/fwAtomsPatch/helper/Object.hpp         |   72 +
 .../include/fwAtomsPatch/helper/functions.hpp      |   51 +
 .../include/fwAtomsPatch/infos/Logger.hpp          |   77 +
 .../include/fwAtomsPatch/infos/log.hpp             |   53 +
 .../include/fwAtomsPatch/namespace.hpp             |   79 +
 .../fwAtomsPatch/patcher/DefaultPatcher.hpp        |  124 ++
 .../include/fwAtomsPatch/patcher/IPatcher.hpp      |   88 +
 .../fwAtomsPatch/patcher/factory/namespace.hpp     |   32 +
 .../include/fwAtomsPatch/patcher/factory/new.hpp   |   66 +
 .../fwAtomsPatch/patcher/registry/detail.hpp       |   42 +
 .../fwAtomsPatch/patcher/registry/macros.hpp       |   34 +
 .../fwAtomsPatch/patcher/registry/namespace.hpp    |   32 +
 .../fwAtomsPatch/include/fwAtomsPatch/types.hpp    |   29 +
 .../core/fwAtomsPatch/src/fwAtomsPatch/IPatch.cpp  |   44 +
 .../src/fwAtomsPatch/ISemanticPatch.cpp            |   72 +
 .../src/fwAtomsPatch/IStructuralCreator.cpp        |   69 +
 .../src/fwAtomsPatch/IStructuralPatch.cpp          |   73 +
 .../src/fwAtomsPatch/LinkDescriptor.cpp            |   33 +
 .../src/fwAtomsPatch/PatchingManager.cpp           |  110 +
 .../src/fwAtomsPatch/SemanticPatchDB.cpp           |   86 +
 .../src/fwAtomsPatch/StructuralCreatorDB.cpp       |   65 +
 .../src/fwAtomsPatch/StructuralPatchDB.cpp         |   56 +
 .../src/fwAtomsPatch/VersionDescriptor.cpp         |   31 +
 .../src/fwAtomsPatch/VersionsGraph.cpp             |  246 +++
 .../src/fwAtomsPatch/VersionsManager.cpp           |  254 +++
 .../src/fwAtomsPatch/conditions/Abstract.cpp       |   43 +
 .../fwAtomsPatch/conditions/NumericOverflow.cpp    |   64 +
 .../src/fwAtomsPatch/exceptions/BadExtension.cpp   |   21 +
 .../src/fwAtomsPatch/exceptions/Base.cpp           |   22 +
 .../exceptions/ImpossibleConversion.cpp            |   21 +
 .../fwAtomsPatch/exceptions/MissingInformation.cpp |   21 +
 .../src/fwAtomsPatch/exceptions/UnknownVersion.cpp |   21 +
 .../src/fwAtomsPatch/helper/Object.cpp             |  162 ++
 .../src/fwAtomsPatch/helper/functions.cpp          |  163 ++
 .../fwAtomsPatch/src/fwAtomsPatch/infos/Logger.cpp |  140 ++
 .../src/fwAtomsPatch/patcher/DefaultPatcher.cpp    |  334 +++
 .../src/fwAtomsPatch/patcher/IPatcher.cpp          |   28 +
 .../src/fwAtomsPatch/patcher/factory/new.cpp       |   31 +
 .../src/fwAtomsPatch/patcher/registry/detail.cpp   |   35 +
 SrcLib/core/fwCamp/CMakeLists.txt                  |   14 +
 SrcLib/core/fwCamp/Properties.cmake                |    7 +
 SrcLib/core/fwCamp/bin/build.options               |    7 +
 .../fwCamp/include/fwCamp/Mapper/ArrayMapper.hpp   |   70 +
 .../fwCamp/include/fwCamp/Mapper/ValueMapper.hpp   |  253 +++
 SrcLib/core/fwCamp/include/fwCamp/UserObject.hpp   |   37 +
 .../include/fwCamp/camp/ExtendedClassVisitor.hpp   |   37 +
 .../core/fwCamp/include/fwCamp/camp/MapMapper.hpp  |   53 +
 .../fwCamp/include/fwCamp/camp/MapProperty.hpp     |   91 +
 .../fwCamp/include/fwCamp/camp/MapValueMapper.hpp  |   27 +
 .../core/fwCamp/include/fwCamp/camp/customtype.hpp |   21 +
 .../include/fwCamp/camp/detail/MapPropertyImpl.hpp |   70 +
 .../include/fwCamp/camp/detail/MapPropertyImpl.hxx |   70 +
 SrcLib/core/fwCamp/include/fwCamp/camp/traits.hpp  |   38 +
 SrcLib/core/fwCamp/include/fwCamp/config.hpp       |   40 +
 .../fwCamp/include/fwCamp/factory/namespace.hpp    |   27 +
 SrcLib/core/fwCamp/include/fwCamp/factory/new.hpp  |   37 +
 SrcLib/core/fwCamp/include/fwCamp/macros.hpp       |  186 ++
 SrcLib/core/fwCamp/include/fwCamp/namespace.hpp    |   15 +
 .../core/fwCamp/include/fwCamp/registry/detail.hpp |   36 +
 .../fwCamp/include/fwCamp/registry/namespace.hpp   |   26 +
 SrcLib/core/fwCamp/src/fwCamp/camp/MapProperty.cpp |   61 +
 SrcLib/core/fwCamp/src/fwCamp/factory/new.cpp      |   23 +
 SrcLib/core/fwCamp/src/fwCamp/registry/detail.cpp  |   29 +
 SrcLib/core/fwCom/CMakeLists.txt                   |   11 +
 SrcLib/core/fwCom/COPYING                          |  675 +++++++
 SrcLib/core/fwCom/COPYING.LESSER                   |  166 ++
 SrcLib/core/fwCom/Properties.cmake                 |    7 +
 SrcLib/core/fwCom/bin/build.options                |   10 +
 SrcLib/core/fwCom/include/fwCom/Connection.hpp     |   85 +
 SrcLib/core/fwCom/include/fwCom/HasSignals.hpp     |   58 +
 SrcLib/core/fwCom/include/fwCom/HasSlots.hpp       |   58 +
 SrcLib/core/fwCom/include/fwCom/Signal.hpp         |  737 +++++++
 SrcLib/core/fwCom/include/fwCom/Signal.hpp.vrdc    |  138 ++
 SrcLib/core/fwCom/include/fwCom/Signal.hxx         | 1478 ++++++++++++++
 SrcLib/core/fwCom/include/fwCom/Signal.hxx.vrdc    |  222 ++
 SrcLib/core/fwCom/include/fwCom/SignalBase.hpp     |  105 +
 SrcLib/core/fwCom/include/fwCom/Signals.hpp        |   70 +
 SrcLib/core/fwCom/include/fwCom/Slot.hpp           |  570 ++++++
 SrcLib/core/fwCom/include/fwCom/Slot.hpp.vrdc      |  105 +
 SrcLib/core/fwCom/include/fwCom/Slot.hxx           |  690 +++++++
 SrcLib/core/fwCom/include/fwCom/Slot.hxx.vrdc      |  112 ++
 SrcLib/core/fwCom/include/fwCom/SlotBase.hpp       |  233 +++
 SrcLib/core/fwCom/include/fwCom/SlotBase.hpp.vrdc  |  233 +++
 SrcLib/core/fwCom/include/fwCom/SlotBase.hxx       |  265 +++
 SrcLib/core/fwCom/include/fwCom/SlotBase.hxx.vrdc  |  265 +++
 SrcLib/core/fwCom/include/fwCom/SlotCall.hpp       |  426 ++++
 SrcLib/core/fwCom/include/fwCom/SlotCall.hpp.vrdc  |   85 +
 SrcLib/core/fwCom/include/fwCom/SlotCall.hxx       |  664 ++++++
 SrcLib/core/fwCom/include/fwCom/SlotCall.hxx.vrdc  |  115 ++
 SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp |  715 +++++++
 .../fwCom/include/fwCom/SlotConnection.hpp.vrdc    |  128 ++
 SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx | 1558 ++++++++++++++
 .../fwCom/include/fwCom/SlotConnection.hxx.vrdc    |  217 ++
 .../fwCom/include/fwCom/SlotConnectionBase.hpp     |   68 +
 SrcLib/core/fwCom/include/fwCom/SlotRun.hpp        |  423 ++++
 SrcLib/core/fwCom/include/fwCom/SlotRun.hpp.vrdc   |   88 +
 SrcLib/core/fwCom/include/fwCom/SlotRun.hxx        |  577 ++++++
 SrcLib/core/fwCom/include/fwCom/SlotRun.hxx.vrdc   |  106 +
 SrcLib/core/fwCom/include/fwCom/Slots.hpp          |  156 ++
 SrcLib/core/fwCom/include/fwCom/Slots.hpp.vrdc     |   86 +
 SrcLib/core/fwCom/include/fwCom/Slots.hxx          |  178 ++
 SrcLib/core/fwCom/include/fwCom/Slots.hxx.vrdc     |   42 +
 SrcLib/core/fwCom/include/fwCom/config.hpp         |   41 +
 .../include/fwCom/exception/AlreadyConnected.hpp   |   30 +
 .../core/fwCom/include/fwCom/exception/BadCall.hpp |   30 +
 .../core/fwCom/include/fwCom/exception/BadRun.hpp  |   31 +
 .../core/fwCom/include/fwCom/exception/BadSlot.hpp |   30 +
 .../fwCom/include/fwCom/exception/NoWorker.hpp     |   32 +
 SrcLib/core/fwCom/include/fwCom/namespace.hpp      |  245 +++
 SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp  |  411 ++++
 .../fwCom/include/fwCom/util/AutoBind.hpp.vrdc     |  168 ++
 SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx  |  855 ++++++++
 .../fwCom/include/fwCom/util/AutoBind.hxx.vrdc     |  120 ++
 SrcLib/core/fwCom/include/fwCom/util/WeakCall.hpp  |  139 ++
 .../include/fwCom/util/convert_function_type.hpp   |  140 ++
 .../fwCom/util/convert_function_type.hpp.vrdc      |   58 +
 SrcLib/core/fwCom/include/fwCom/util/log.hpp       |   38 +
 .../fwCom/include/fwCom/util/remove_last_arg.hpp   |  112 ++
 SrcLib/core/fwCom/scripts/test/unpacked.cpp        | 2123 +++++++++++++++++++
 SrcLib/core/fwCom/scripts/test/variadic.cpp        |  848 ++++++++
 SrcLib/core/fwCom/scripts/variadic_parser.py       |  452 +++++
 SrcLib/core/fwCom/src/fwCom/SignalBase.cpp         |   21 +
 SrcLib/core/fwCom/src/fwCom/Signals.cpp            |   78 +
 SrcLib/core/fwCom/src/fwCom/SlotBase.cpp           |   52 +
 SrcLib/core/fwCom/src/fwCom/Slots.cpp              |   86 +
 .../fwCom/src/fwCom/exception/AlreadyConnected.cpp |   24 +
 SrcLib/core/fwCom/src/fwCom/exception/BadCall.cpp  |   24 +
 SrcLib/core/fwCom/src/fwCom/exception/BadRun.cpp   |   25 +
 SrcLib/core/fwCom/src/fwCom/exception/BadSlot.cpp  |   25 +
 SrcLib/core/fwCom/src/fwCom/exception/NoWorker.cpp |   25 +
 SrcLib/core/fwCom/test/CMakeLists.txt              |   10 +
 SrcLib/core/fwCom/test/Properties.cmake            |    7 +
 SrcLib/core/fwCom/test/cppunit.options             |   21 +
 SrcLib/core/fwCom/test/tu/include/SignalTest.hpp   |   50 +
 SrcLib/core/fwCom/test/tu/include/SignalsTest.hpp  |   39 +
 SrcLib/core/fwCom/test/tu/include/SlotTest.hpp     |   50 +
 SrcLib/core/fwCom/test/tu/include/SlotsTest.hpp    |   40 +
 SrcLib/core/fwCom/test/tu/include/UtilTest.hpp     |   41 +
 SrcLib/core/fwCom/test/tu/src/SignalTest.cpp       |  657 ++++++
 SrcLib/core/fwCom/test/tu/src/SignalsTest.cpp      |  134 ++
 SrcLib/core/fwCom/test/tu/src/SlotTest.cpp         |  415 ++++
 SrcLib/core/fwCom/test/tu/src/SlotsTest.cpp        |  156 ++
 SrcLib/core/fwCom/test/tu/src/UtilTest.cpp         |  114 ++
 SrcLib/core/fwComEd/CMakeLists.txt                 |   20 +
 SrcLib/core/fwComEd/COPYING                        |  675 +++++++
 SrcLib/core/fwComEd/COPYING.LESSER                 |  166 ++
 SrcLib/core/fwComEd/Properties.cmake               |    7 +
 SrcLib/core/fwComEd/bin/build.options              |   13 +
 SrcLib/core/fwComEd/include/fwComEd/BooleanMsg.hpp |   54 +
 SrcLib/core/fwComEd/include/fwComEd/CameraMsg.hpp  |  125 ++
 SrcLib/core/fwComEd/include/fwComEd/ColorMsg.hpp   |   53 +
 .../core/fwComEd/include/fwComEd/CompositeMsg.hpp  |  108 +
 SrcLib/core/fwComEd/include/fwComEd/Dictionary.hpp |   64 +
 .../fwComEd/include/fwComEd/DictionaryOrganMsg.hpp |   55 +
 SrcLib/core/fwComEd/include/fwComEd/FloatMsg.hpp   |   52 +
 SrcLib/core/fwComEd/include/fwComEd/GraphMsg.hpp   |  111 +
 .../core/fwComEd/include/fwComEd/HistogramMsg.hpp  |   52 +
 SrcLib/core/fwComEd/include/fwComEd/ImageMsg.hpp   |  123 ++
 SrcLib/core/fwComEd/include/fwComEd/IntegerMsg.hpp |   52 +
 .../fwComEd/include/fwComEd/InteractionMsg.hpp     |  138 ++
 .../core/fwComEd/include/fwComEd/LocationMsg.hpp   |   52 +
 .../core/fwComEd/include/fwComEd/MaterialMsg.hpp   |   54 +
 SrcLib/core/fwComEd/include/fwComEd/MeshMsg.hpp    |   54 +
 SrcLib/core/fwComEd/include/fwComEd/ModelMsg.hpp   |   51 +
 .../fwComEd/include/fwComEd/ModelSeriesMsg.hpp     |   59 +
 SrcLib/core/fwComEd/include/fwComEd/Namespace.hpp  |   20 +
 .../core/fwComEd/include/fwComEd/PlaneListMsg.hpp  |   61 +
 SrcLib/core/fwComEd/include/fwComEd/PlaneMsg.hpp   |   62 +
 .../core/fwComEd/include/fwComEd/PointListMsg.hpp  |   59 +
 SrcLib/core/fwComEd/include/fwComEd/PointMsg.hpp   |   59 +
 .../fwComEd/include/fwComEd/ReconstructionMsg.hpp  |   56 +
 .../fwComEd/include/fwComEd/ResectionDBMsg.hpp     |   65 +
 .../core/fwComEd/include/fwComEd/ResectionMsg.hpp  |   58 +
 .../core/fwComEd/include/fwComEd/SeriesDBMsg.hpp   |   89 +
 SrcLib/core/fwComEd/include/fwComEd/SplineMsg.hpp  |   52 +
 SrcLib/core/fwComEd/include/fwComEd/StringMsg.hpp  |   50 +
 SrcLib/core/fwComEd/include/fwComEd/TagMsg.hpp     |   52 +
 .../include/fwComEd/TransferFunctionMsg.hpp        |   86 +
 .../include/fwComEd/TransformationMatrix3DMsg.hpp  |   53 +
 .../fwComEd/include/fwComEd/TriangularMeshMsg.hpp  |   51 +
 SrcLib/core/fwComEd/include/fwComEd/VectorMsg.hpp  |   87 +
 SrcLib/core/fwComEd/include/fwComEd/VideoMsg.hpp   |   59 +
 SrcLib/core/fwComEd/include/fwComEd/export.hpp     |   41 +
 .../fwComEd/fieldHelper/MedicalImageHelpers.hpp    |  399 ++++
 .../include/fwComEd/fieldHelper/Namespace.hpp      |   24 +
 .../core/fwComEd/include/fwComEd/helper/Array.hpp  |  183 ++
 .../fwComEd/include/fwComEd/helper/Composite.hpp   |   85 +
 .../core/fwComEd/include/fwComEd/helper/Field.hpp  |  100 +
 .../core/fwComEd/include/fwComEd/helper/Image.hpp  |  109 +
 .../fwComEd/include/fwComEd/helper/ImageGetter.hpp |   43 +
 .../fwComEd/include/fwComEd/helper/ImageGetter.hxx |   31 +
 .../include/fwComEd/helper/MedicalImageAdaptor.hpp |  345 ++++
 .../core/fwComEd/include/fwComEd/helper/Mesh.hpp   |  229 +++
 .../fwComEd/include/fwComEd/helper/MsgHelper.hpp   |   51 +
 .../fwComEd/include/fwComEd/helper/Namespace.hpp   |   24 +
 .../fwComEd/include/fwComEd/helper/SeriesDB.hpp    |   82 +
 .../core/fwComEd/include/fwComEd/helper/Vector.hpp |   76 +
 .../fwComEd/include/fwComEd/parser/Composite.hpp   |   79 +
 .../include/fwComEd/parser/GenericField.hpp        |   78 +
 .../core/fwComEd/include/fwComEd/parser/List.hpp   |   80 +
 .../core/fwComEd/include/fwComEd/parser/Object.hpp |   53 +
 .../fwComEd/parser/TransformationMatrix3D.hpp      |   61 +
 SrcLib/core/fwComEd/src/fwComEd/BooleanMsg.cpp     |   34 +
 SrcLib/core/fwComEd/src/fwComEd/CameraMsg.cpp      |  103 +
 SrcLib/core/fwComEd/src/fwComEd/ColorMsg.cpp       |   33 +
 SrcLib/core/fwComEd/src/fwComEd/CompositeMsg.cpp   |  115 ++
 SrcLib/core/fwComEd/src/fwComEd/Dictionary.cpp     |   38 +
 .../fwComEd/src/fwComEd/DictionaryOrganMsg.cpp     |   36 +
 SrcLib/core/fwComEd/src/fwComEd/FloatMsg.cpp       |   33 +
 SrcLib/core/fwComEd/src/fwComEd/GraphMsg.cpp       |  151 ++
 SrcLib/core/fwComEd/src/fwComEd/HistorgramMsg.cpp  |   33 +
 SrcLib/core/fwComEd/src/fwComEd/ImageMsg.cpp       |   70 +
 SrcLib/core/fwComEd/src/fwComEd/IntegerMsg.cpp     |   33 +
 SrcLib/core/fwComEd/src/fwComEd/InteractionMsg.cpp |  103 +
 SrcLib/core/fwComEd/src/fwComEd/LocationMsg.cpp    |   33 +
 SrcLib/core/fwComEd/src/fwComEd/MaterialMsg.cpp    |   32 +
 SrcLib/core/fwComEd/src/fwComEd/MeshMsg.cpp        |   39 +
 SrcLib/core/fwComEd/src/fwComEd/ModelMsg.cpp       |   33 +
 SrcLib/core/fwComEd/src/fwComEd/ModelSeriesMsg.cpp |   39 +
 SrcLib/core/fwComEd/src/fwComEd/PlaneListMsg.cpp   |   37 +
 SrcLib/core/fwComEd/src/fwComEd/PlaneMsg.cpp       |   38 +
 SrcLib/core/fwComEd/src/fwComEd/PointListMsg.cpp   |   35 +
 SrcLib/core/fwComEd/src/fwComEd/PointMsg.cpp       |   35 +
 .../core/fwComEd/src/fwComEd/ReconstructionMsg.cpp |   32 +
 SrcLib/core/fwComEd/src/fwComEd/ResectionDBMsg.cpp |   40 +
 SrcLib/core/fwComEd/src/fwComEd/ResectionMsg.cpp   |   37 +
 SrcLib/core/fwComEd/src/fwComEd/SeriesDBMsg.cpp    |   81 +
 SrcLib/core/fwComEd/src/fwComEd/SplineMsg.cpp      |   33 +
 SrcLib/core/fwComEd/src/fwComEd/StringMsg.cpp      |   33 +
 SrcLib/core/fwComEd/src/fwComEd/TagMsg.cpp         |   33 +
 .../fwComEd/src/fwComEd/TransferFunctionMsg.cpp    |   59 +
 .../src/fwComEd/TransformationMatrix3DMsg.cpp      |   33 +
 .../core/fwComEd/src/fwComEd/TriangularMeshMsg.cpp |   34 +
 SrcLib/core/fwComEd/src/fwComEd/VectorMsg.cpp      |   85 +
 SrcLib/core/fwComEd/src/fwComEd/VideoMsg.cpp       |   34 +
 .../fwComEd/fieldHelper/MedicalImageHelpers.cpp    |  203 ++
 SrcLib/core/fwComEd/src/fwComEd/helper/Array.cpp   |  185 ++
 .../core/fwComEd/src/fwComEd/helper/Composite.cpp  |  117 ++
 SrcLib/core/fwComEd/src/fwComEd/helper/Field.cpp   |  168 ++
 SrcLib/core/fwComEd/src/fwComEd/helper/Image.cpp   |  237 +++
 .../src/fwComEd/helper/MedicalImageAdaptor.cpp     |  520 +++++
 SrcLib/core/fwComEd/src/fwComEd/helper/Mesh.cpp    |  359 ++++
 .../core/fwComEd/src/fwComEd/helper/MsgHelper.cpp  |   59 +
 .../core/fwComEd/src/fwComEd/helper/SeriesDB.cpp   |  103 +
 SrcLib/core/fwComEd/src/fwComEd/helper/Vector.cpp  |   92 +
 .../core/fwComEd/src/fwComEd/parser/Composite.cpp  |  151 ++
 .../fwComEd/src/fwComEd/parser/GenericField.cpp    |   62 +
 SrcLib/core/fwComEd/src/fwComEd/parser/List.cpp    |  146 ++
 SrcLib/core/fwComEd/src/fwComEd/parser/Object.cpp  |  159 ++
 .../src/fwComEd/parser/TransformationMatrix3D.cpp  |   59 +
 SrcLib/core/fwComEd/test/CMakeLists.txt            |   10 +
 SrcLib/core/fwComEd/test/Properties.cmake          |    7 +
 SrcLib/core/fwComEd/test/cppunit.options           |   22 +
 .../test/tu/include/CompositeMessageTest.hpp       |   53 +
 .../fwComEd/test/tu/include/ConfigParserTest.hpp   |  173 ++
 .../fwComEd/test/tu/include/FieldHelperTest.hpp    |   49 +
 .../core/fwComEd/test/tu/include/MessagesTest.hpp  |   49 +
 .../fwComEd/test/tu/include/SeriesDBMsgTest.hpp    |   64 +
 .../core/fwComEd/test/tu/include/VectorMsgTest.hpp |   62 +
 .../fwComEd/test/tu/src/CompositeMessageTest.cpp   |  225 +++
 .../core/fwComEd/test/tu/src/ConfigParserTest.cpp  |  238 +++
 .../core/fwComEd/test/tu/src/FieldHelperTest.cpp   |   99 +
 SrcLib/core/fwComEd/test/tu/src/MessagesTest.cpp   |   93 +
 .../core/fwComEd/test/tu/src/SeriesDBMsgTest.cpp   |  202 ++
 SrcLib/core/fwComEd/test/tu/src/VectorMsgTest.cpp  |  174 ++
 SrcLib/core/fwCommand/CMakeLists.txt               |   14 +
 SrcLib/core/fwCommand/COPYING                      |  675 +++++++
 SrcLib/core/fwCommand/COPYING.LESSER               |  166 ++
 SrcLib/core/fwCommand/Properties.cmake             |    7 +
 SrcLib/core/fwCommand/bin/build.options            |    5 +
 SrcLib/core/fwCommand/include/fwCommand/Empty.hpp  |   47 +
 .../core/fwCommand/include/fwCommand/ICommand.hpp  |   79 +
 .../core/fwCommand/include/fwCommand/Manager.hpp   |  186 ++
 .../fwCommand/include/fwCommand/PaintCommand.hpp   |   95 +
 .../include/fwCommand/UndoRedoManager.hpp          |  155 ++
 SrcLib/core/fwCommand/include/fwCommand/config.hpp |   41 +
 SrcLib/core/fwCommand/src/fwCommand/Empty.cpp      |   39 +
 SrcLib/core/fwCommand/src/fwCommand/Manager.cpp    |  204 ++
 .../core/fwCommand/src/fwCommand/PaintCommand.cpp  |  165 ++
 .../fwCommand/src/fwCommand/UndoRedoManager.cpp    |  149 ++
 SrcLib/core/fwCore/CMakeLists.txt                  |   13 +
 SrcLib/core/fwCore/COPYING                         |  675 +++++++
 SrcLib/core/fwCore/COPYING.LESSER                  |  166 ++
 SrcLib/core/fwCore/Properties.cmake                |    7 +
 SrcLib/core/fwCore/bin/build.options               |    4 +
 SrcLib/core/fwCore/include/fwCore/BaseObject.hpp   |   36 +
 SrcLib/core/fwCore/include/fwCore/Demangler.hpp    |  173 ++
 SrcLib/core/fwCore/include/fwCore/Exception.hpp    |   33 +
 SrcLib/core/fwCore/include/fwCore/HiResClock.hpp   |   52 +
 SrcLib/core/fwCore/include/fwCore/HiResTimer.hpp   |  109 +
 SrcLib/core/fwCore/include/fwCore/LogicStamp.hpp   |  101 +
 SrcLib/core/fwCore/include/fwCore/Namespace.hpp    |   20 +
 SrcLib/core/fwCore/include/fwCore/TimeStamp.hpp    |  140 ++
 SrcLib/core/fwCore/include/fwCore/base.hpp         |   21 +
 .../core/fwCore/include/fwCore/concept_checks.hpp  |   53 +
 SrcLib/core/fwCore/include/fwCore/config.hpp       |   43 +
 .../core/fwCore/include/fwCore/exceptionmacros.hpp |  120 ++
 .../core/fwCore/include/fwCore/log/Namespace.hpp   |   23 +
 .../fwCore/include/fwCore/log/ScopedMessage.hpp    |   55 +
 .../core/fwCore/include/fwCore/log/SpyLogger.hpp   |   81 +
 SrcLib/core/fwCore/include/fwCore/macros.hpp       |  602 ++++++
 SrcLib/core/fwCore/include/fwCore/mt/Namespace.hpp |   23 +
 SrcLib/core/fwCore/include/fwCore/mt/types.hpp     |   52 +
 SrcLib/core/fwCore/include/fwCore/spyLog.hpp       |  366 ++++
 .../fwCore/include/fwCore/util/FactoryRegistry.hpp |  155 ++
 .../include/fwCore/util/LazyInstantiator.hpp       |   69 +
 .../core/fwCore/include/fwCore/util/Namespace.hpp  |   23 +
 SrcLib/core/fwCore/src/fwCore/Demangler.cpp        |  138 ++
 SrcLib/core/fwCore/src/fwCore/Exception.cpp        |   22 +
 SrcLib/core/fwCore/src/fwCore/HiResClock.cpp       |   59 +
 SrcLib/core/fwCore/src/fwCore/HiResTimer.cpp       |   76 +
 SrcLib/core/fwCore/src/fwCore/LogicStamp.cpp       |   28 +
 SrcLib/core/fwCore/src/fwCore/TimeStamp.cpp        |   21 +
 .../core/fwCore/src/fwCore/log/ScopedMessage.cpp   |   47 +
 SrcLib/core/fwCore/src/fwCore/log/SpyLogger.cpp    |  189 ++
 SrcLib/core/fwCore/test/CMakeLists.txt             |   10 +
 SrcLib/core/fwCore/test/Properties.cmake           |    7 +
 SrcLib/core/fwCore/test/cppunit.options            |    4 +
 .../fwCore/test/tu/include/FactoryRegistryTest.hpp |   40 +
 .../test/tu/include/LazyInstantiatorTest.hpp       |   36 +
 SrcLib/core/fwCore/test/tu/include/SpyLogTest.hpp  |   45 +
 .../fwCore/test/tu/src/FactoryRegistryTest.cpp     |  329 +++
 .../fwCore/test/tu/src/LazyInstantiatorTest.cpp    |  131 ++
 SrcLib/core/fwCore/test/tu/src/SpyLogTest.cpp      |  210 ++
 SrcLib/core/fwData/CMakeLists.txt                  |   17 +
 SrcLib/core/fwData/COPYING                         |  675 +++++++
 SrcLib/core/fwData/COPYING.LESSER                  |  166 ++
 SrcLib/core/fwData/Properties.cmake                |    7 +
 SrcLib/core/fwData/bin/build.options               |    6 +
 SrcLib/core/fwData/include/fwData/Array.hpp        |  251 +++
 SrcLib/core/fwData/include/fwData/Boolean.hpp      |   57 +
 SrcLib/core/fwData/include/fwData/Camera.hpp       |  160 ++
 SrcLib/core/fwData/include/fwData/Color.hpp        |  106 +
 SrcLib/core/fwData/include/fwData/Composite.hpp    |  161 ++
 SrcLib/core/fwData/include/fwData/Edge.hpp         |   92 +
 SrcLib/core/fwData/include/fwData/Exception.hpp    |   45 +
 SrcLib/core/fwData/include/fwData/Float.hpp        |   64 +
 SrcLib/core/fwData/include/fwData/GenericField.hpp |  163 ++
 .../fwData/include/fwData/GenericFieldBase.hpp     |   52 +
 SrcLib/core/fwData/include/fwData/Graph.hpp        |  233 +++
 SrcLib/core/fwData/include/fwData/Histogram.hpp    |  125 ++
 SrcLib/core/fwData/include/fwData/Image.hpp        |  206 ++
 SrcLib/core/fwData/include/fwData/Integer.hpp      |   57 +
 SrcLib/core/fwData/include/fwData/Line.hpp         |   70 +
 SrcLib/core/fwData/include/fwData/List.hpp         |  114 ++
 SrcLib/core/fwData/include/fwData/Material.hpp     |  128 ++
 SrcLib/core/fwData/include/fwData/Mesh.hpp         |  368 ++++
 SrcLib/core/fwData/include/fwData/Model.hpp        |   81 +
 SrcLib/core/fwData/include/fwData/Namespace.hpp    |   20 +
 SrcLib/core/fwData/include/fwData/Node.hpp         |  110 +
 SrcLib/core/fwData/include/fwData/Object.hpp       |  315 +++
 SrcLib/core/fwData/include/fwData/ObjectLock.hpp   |   59 +
 SrcLib/core/fwData/include/fwData/Plane.hpp        |   89 +
 SrcLib/core/fwData/include/fwData/PlaneList.hpp    |   69 +
 SrcLib/core/fwData/include/fwData/Point.hpp        |   77 +
 SrcLib/core/fwData/include/fwData/PointList.hpp    |   67 +
 SrcLib/core/fwData/include/fwData/Port.hpp         |   60 +
 .../core/fwData/include/fwData/ProcessObject.hpp   |  175 ++
 SrcLib/core/fwData/include/fwData/ROITraits.hpp    |   87 +
 .../core/fwData/include/fwData/Reconstruction.hpp  |  107 +
 .../fwData/include/fwData/ReconstructionTraits.hpp |   89 +
 SrcLib/core/fwData/include/fwData/Resection.hpp    |   96 +
 SrcLib/core/fwData/include/fwData/ResectionDB.hpp  |   81 +
 SrcLib/core/fwData/include/fwData/Spline.hpp       |   99 +
 SrcLib/core/fwData/include/fwData/String.hpp       |   57 +
 .../core/fwData/include/fwData/StructureTraits.hpp |  139 ++
 .../include/fwData/StructureTraitsDictionary.hpp   |   81 +
 .../include/fwData/StructureTraitsHelper.hpp       |   43 +
 SrcLib/core/fwData/include/fwData/Tag.hpp          |   76 +
 .../fwData/include/fwData/TransferFunction.hpp     |  221 ++
 .../include/fwData/TransformationMatrix3D.hpp      |   93 +
 .../core/fwData/include/fwData/TriangularMesh.hpp  |  133 ++
 SrcLib/core/fwData/include/fwData/Vector.hpp       |  146 ++
 SrcLib/core/fwData/include/fwData/Video.hpp        |  108 +
 SrcLib/core/fwData/include/fwData/camp/mapper.hpp  |   76 +
 SrcLib/core/fwData/include/fwData/config.hpp       |   44 +
 .../fwData/include/fwData/factory/namespace.hpp    |   27 +
 SrcLib/core/fwData/include/fwData/factory/new.hpp  |   67 +
 .../core/fwData/include/fwData/location/Folder.hpp |  135 ++
 .../fwData/include/fwData/location/ILocation.hpp   |   78 +
 .../fwData/include/fwData/location/MultiFiles.hpp  |   96 +
 .../fwData/include/fwData/location/Namespace.hpp   |   23 +
 .../fwData/include/fwData/location/SingleFile.hpp  |  113 ++
 SrcLib/core/fwData/include/fwData/macros.hpp       |  237 +++
 SrcLib/core/fwData/include/fwData/mt/Namespace.hpp |   25 +
 .../fwData/include/fwData/mt/ObjectReadLock.hpp    |   56 +
 .../include/fwData/mt/ObjectReadToWriteLock.hpp    |   63 +
 .../fwData/include/fwData/mt/ObjectWriteLock.hpp   |   56 +
 .../core/fwData/include/fwData/registry/detail.hpp |   37 +
 .../core/fwData/include/fwData/registry/macros.hpp |   23 +
 .../fwData/include/fwData/registry/namespace.hpp   |   27 +
 SrcLib/core/fwData/src/fwData/Array.cpp            |  324 +++
 SrcLib/core/fwData/src/fwData/Boolean.cpp          |   53 +
 SrcLib/core/fwData/src/fwData/Camera.cpp           |   70 +
 SrcLib/core/fwData/src/fwData/Color.cpp            |  161 ++
 SrcLib/core/fwData/src/fwData/Composite.cpp        |   69 +
 SrcLib/core/fwData/src/fwData/Edge.cpp             |  114 ++
 SrcLib/core/fwData/src/fwData/Exception.cpp        |   22 +
 SrcLib/core/fwData/src/fwData/Float.cpp            |   58 +
 SrcLib/core/fwData/src/fwData/GenericFieldBase.cpp |   19 +
 SrcLib/core/fwData/src/fwData/Graph.cpp            |  384 ++++
 SrcLib/core/fwData/src/fwData/Histogram.cpp        |  135 ++
 SrcLib/core/fwData/src/fwData/Image.cpp            |  297 +++
 SrcLib/core/fwData/src/fwData/Integer.cpp          |   53 +
 SrcLib/core/fwData/src/fwData/Line.cpp             |   69 +
 SrcLib/core/fwData/src/fwData/List.cpp             |   64 +
 SrcLib/core/fwData/src/fwData/Material.cpp         |   98 +
 SrcLib/core/fwData/src/fwData/Mesh.cpp             |  534 +++++
 SrcLib/core/fwData/src/fwData/Model.cpp            |   78 +
 SrcLib/core/fwData/src/fwData/Node.cpp             |  173 ++
 SrcLib/core/fwData/src/fwData/Object.cpp           |  209 ++
 SrcLib/core/fwData/src/fwData/ObjectLock.cpp       |  118 ++
 SrcLib/core/fwData/src/fwData/Plane.cpp            |  100 +
 SrcLib/core/fwData/src/fwData/PlaneList.cpp        |   90 +
 SrcLib/core/fwData/src/fwData/Point.cpp            |   82 +
 SrcLib/core/fwData/src/fwData/PointList.cpp        |   66 +
 SrcLib/core/fwData/src/fwData/Port.cpp             |   56 +
 SrcLib/core/fwData/src/fwData/ProcessObject.cpp    |  171 ++
 SrcLib/core/fwData/src/fwData/ROITraits.cpp        |   76 +
 SrcLib/core/fwData/src/fwData/Reconstruction.cpp   |   81 +
 .../fwData/src/fwData/ReconstructionTraits.cpp     |   88 +
 SrcLib/core/fwData/src/fwData/Resection.cpp        |   87 +
 SrcLib/core/fwData/src/fwData/ResectionDB.cpp      |   66 +
 SrcLib/core/fwData/src/fwData/Spline.cpp           |   53 +
 SrcLib/core/fwData/src/fwData/String.cpp           |   52 +
 SrcLib/core/fwData/src/fwData/StructureTraits.cpp  |   46 +
 .../src/fwData/StructureTraitsDictionary.cpp       |  103 +
 .../fwData/src/fwData/StructureTraitsHelper.cpp    |   43 +
 SrcLib/core/fwData/src/fwData/Tag.cpp              |   63 +
 SrcLib/core/fwData/src/fwData/TransferFunction.cpp |  413 ++++
 .../fwData/src/fwData/TransformationMatrix3D.cpp   |   81 +
 SrcLib/core/fwData/src/fwData/TriangularMesh.cpp   |  163 ++
 SrcLib/core/fwData/src/fwData/Vector.cpp           |   57 +
 SrcLib/core/fwData/src/fwData/Video.cpp            |   69 +
 SrcLib/core/fwData/src/fwData/factory/new.cpp      |   27 +
 SrcLib/core/fwData/src/fwData/location/Folder.cpp  |   94 +
 .../core/fwData/src/fwData/location/ILocation.cpp  |   27 +
 .../core/fwData/src/fwData/location/MultiFiles.cpp |   62 +
 .../core/fwData/src/fwData/location/SingleFile.cpp |   84 +
 .../core/fwData/src/fwData/mt/ObjectReadLock.cpp   |   52 +
 .../fwData/src/fwData/mt/ObjectReadToWriteLock.cpp |   67 +
 .../core/fwData/src/fwData/mt/ObjectWriteLock.cpp  |   52 +
 SrcLib/core/fwData/src/fwData/registry/detail.cpp  |   30 +
 SrcLib/core/fwData/test/CMakeLists.txt             |   10 +
 SrcLib/core/fwData/test/Properties.cmake           |    7 +
 SrcLib/core/fwData/test/cppunit.options            |   34 +
 SrcLib/core/fwData/test/tu/include/ArrayTest.hpp   |   38 +
 SrcLib/core/fwData/test/tu/include/BooleanTest.hpp |   33 +
 SrcLib/core/fwData/test/tu/include/CameraTest.hpp  |   33 +
 SrcLib/core/fwData/test/tu/include/ColorTest.hpp   |   34 +
 .../core/fwData/test/tu/include/CompositeTest.hpp  |   34 +
 SrcLib/core/fwData/test/tu/include/CopyTest.hpp    |   99 +
 SrcLib/core/fwData/test/tu/include/EdgeTest.hpp    |   33 +
 SrcLib/core/fwData/test/tu/include/FloatTest.hpp   |   33 +
 SrcLib/core/fwData/test/tu/include/GraphTest.hpp   |   38 +
 SrcLib/core/fwData/test/tu/include/ImageTest.hpp   |   41 +
 SrcLib/core/fwData/test/tu/include/IntegerTest.hpp |   35 +
 .../core/fwData/test/tu/include/IsTypeOfTest.hpp   |   32 +
 SrcLib/core/fwData/test/tu/include/MTLockTest.hpp  |   44 +
 SrcLib/core/fwData/test/tu/include/MacrosTest.hpp  |   33 +
 .../core/fwData/test/tu/include/MaterialTest.hpp   |   32 +
 SrcLib/core/fwData/test/tu/include/MeshTest.hpp    |   40 +
 SrcLib/core/fwData/test/tu/include/ModelTest.hpp   |   32 +
 SrcLib/core/fwData/test/tu/include/ObjectTest.hpp  |   33 +
 .../fwData/test/tu/include/ProcessObjectTest.hpp   |   32 +
 .../core/fwData/test/tu/include/ROITraitsTest.hpp  |   33 +
 .../fwData/test/tu/include/ReconstructionTest.hpp  |   37 +
 .../test/tu/include/ReconstructionTraitsTest.hpp   |   34 +
 SrcLib/core/fwData/test/tu/include/StringTest.hpp  |   35 +
 .../tu/include/StructureTraitsDictionaryTest.hpp   |   33 +
 .../test/tu/include/TransferFunctionTest.hpp       |   52 +
 .../test/tu/include/TransformationMatrix3DTest.hpp |   35 +
 SrcLib/core/fwData/test/tu/include/VideoTest.hpp   |   33 +
 SrcLib/core/fwData/test/tu/src/ArrayTest.cpp       |  376 ++++
 SrcLib/core/fwData/test/tu/src/BooleanTest.cpp     |   48 +
 SrcLib/core/fwData/test/tu/src/CameraTest.cpp      |   58 +
 SrcLib/core/fwData/test/tu/src/ColorTest.cpp       |   77 +
 SrcLib/core/fwData/test/tu/src/CompositeTest.cpp   |  108 +
 SrcLib/core/fwData/test/tu/src/CopyTest.cpp        |  377 ++++
 SrcLib/core/fwData/test/tu/src/EdgeTest.cpp        |   54 +
 SrcLib/core/fwData/test/tu/src/FloatTest.cpp       |   74 +
 SrcLib/core/fwData/test/tu/src/GraphTest.cpp       |  255 +++
 SrcLib/core/fwData/test/tu/src/ImageTest.cpp       |  284 +++
 SrcLib/core/fwData/test/tu/src/IntegerTest.cpp     |   54 +
 SrcLib/core/fwData/test/tu/src/IsTypeOfTest.cpp    |   99 +
 SrcLib/core/fwData/test/tu/src/MTLockTest.cpp      |  176 ++
 SrcLib/core/fwData/test/tu/src/MacrosTest.cpp      |   97 +
 SrcLib/core/fwData/test/tu/src/MaterialTest.cpp    |   57 +
 SrcLib/core/fwData/test/tu/src/MeshTest.cpp        |  469 +++++
 SrcLib/core/fwData/test/tu/src/ModelTest.cpp       |   53 +
 SrcLib/core/fwData/test/tu/src/ObjectTest.cpp      |  108 +
 .../core/fwData/test/tu/src/ProcessObjectTest.cpp  |   45 +
 SrcLib/core/fwData/test/tu/src/ROITraitsTest.cpp   |   51 +
 .../core/fwData/test/tu/src/ReconstructionTest.cpp |  115 ++
 .../test/tu/src/ReconstructionTraitsTest.cpp       |   56 +
 SrcLib/core/fwData/test/tu/src/StringTest.cpp      |   48 +
 .../test/tu/src/StructureTraitsDictionaryTest.cpp  |  122 ++
 .../fwData/test/tu/src/TransferFunctionTest.cpp    |  348 ++++
 .../test/tu/src/TransformationMatrix3DTest.cpp     |   66 +
 SrcLib/core/fwData/test/tu/src/VideoTest.cpp       |   47 +
 SrcLib/core/fwDataCamp/CMakeLists.txt              |   12 +
 SrcLib/core/fwDataCamp/Properties.cmake            |    7 +
 SrcLib/core/fwDataCamp/bin/build.options           |    3 +
 .../core/fwDataCamp/include/fwDataCamp/Array.hpp   |   19 +
 .../core/fwDataCamp/include/fwDataCamp/Camera.hpp  |   17 +
 .../core/fwDataCamp/include/fwDataCamp/Image.hpp   |   17 +
 SrcLib/core/fwDataCamp/include/fwDataCamp/Line.hpp |   17 +
 .../fwDataCamp/include/fwDataCamp/Material.hpp     |   21 +
 SrcLib/core/fwDataCamp/include/fwDataCamp/Mesh.hpp |   17 +
 SrcLib/core/fwDataCamp/include/fwDataCamp/Node.hpp |   17 +
 .../fwDataCamp/include/fwDataCamp/ROITraits.hpp    |   18 +
 .../include/fwDataCamp/Reconstruction.hpp          |   22 +
 .../include/fwDataCamp/ReconstructionTraits.hpp    |   18 +
 .../fwDataCamp/include/fwDataCamp/Resection.hpp    |   17 +
 .../fwDataCamp/include/fwDataCamp/ResectionDB.hpp  |   17 +
 .../include/fwDataCamp/StructureTraits.hpp         |   20 +
 SrcLib/core/fwDataCamp/include/fwDataCamp/Tag.hpp  |   17 +
 .../include/fwDataCamp/TransferFunction.hpp        |   17 +
 .../core/fwDataCamp/include/fwDataCamp/Version.hpp |   21 +
 .../core/fwDataCamp/include/fwDataCamp/Video.hpp   |   17 +
 .../fwDataCamp/include/fwDataCamp/autoload.hpp     |  115 ++
 .../core/fwDataCamp/include/fwDataCamp/config.hpp  |   45 +
 .../include/fwDataCamp/exception/NullPointer.hpp   |   31 +
 .../fwDataCamp/exception/ObjectNotFound.hpp        |   31 +
 .../fwDataCamp/include/fwDataCamp/getObject.hpp    |   57 +
 .../fwDataCamp/include/fwDataCamp/namespace.hpp    |   38 +
 .../include/fwDataCamp/visitor/CompareObjects.hpp  |  150 ++
 .../include/fwDataCamp/visitor/GetObject.hpp       |  163 ++
 .../include/fwDataCamp/visitor/RecursiveLock.hpp   |   97 +
 .../include/fwMedDataCamp/ActivitySeries.hpp       |   17 +
 .../include/fwMedDataCamp/ImageSeries.hpp          |   17 +
 .../fwDataCamp/include/fwMedDataCamp/Series.hpp    |   19 +
 .../fwDataCamp/include/fwMedDataCamp/autoload.hpp  |   45 +
 SrcLib/core/fwDataCamp/src/autoload.cpp            |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Array.cpp    |   28 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Boolean.cpp  |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Camera.cpp   |   22 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Color.cpp    |   19 +
 .../core/fwDataCamp/src/fwDataCamp/Composite.cpp   |   21 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Edge.cpp     |   21 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Float.cpp    |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Graph.cpp    |   20 +
 .../core/fwDataCamp/src/fwDataCamp/Histogram.cpp   |   20 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Image.cpp    |   26 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Integer.cpp  |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Line.cpp     |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/List.cpp     |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Material.cpp |   51 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Mesh.cpp     |   28 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Model.cpp    |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Node.cpp     |   21 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Object.cpp   |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Plane.cpp    |   21 +
 .../core/fwDataCamp/src/fwDataCamp/PlaneList.cpp   |   18 +
 .../core/fwDataCamp/src/fwDataCamp/PointList.cpp   |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Points.cpp   |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Port.cpp     |   20 +
 .../fwDataCamp/src/fwDataCamp/ProcessObject.cpp    |   20 +
 .../core/fwDataCamp/src/fwDataCamp/ROITraits.cpp   |   21 +
 .../fwDataCamp/src/fwDataCamp/Reconstruction.cpp   |   23 +
 .../src/fwDataCamp/ReconstructionTraits.cpp        |   21 +
 .../core/fwDataCamp/src/fwDataCamp/Resection.cpp   |   24 +
 .../core/fwDataCamp/src/fwDataCamp/ResectionDB.cpp |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/String.cpp   |   19 +
 .../fwDataCamp/src/fwDataCamp/StructureTraits.cpp  |   56 +
 .../src/fwDataCamp/StructureTraitsDictionary.cpp   |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Tag.cpp      |   20 +
 .../fwDataCamp/src/fwDataCamp/TransferFunction.cpp |   34 +
 .../src/fwDataCamp/TransformationMatrix3D.cpp      |   19 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Vector.cpp   |   18 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Version.cpp  |   12 +
 SrcLib/core/fwDataCamp/src/fwDataCamp/Video.cpp    |   20 +
 .../src/fwDataCamp/exception/NullPointer.cpp       |   24 +
 .../src/fwDataCamp/exception/ObjectNotFound.cpp    |   24 +
 .../core/fwDataCamp/src/fwDataCamp/getObject.cpp   |   45 +
 .../fwDataCamp/src/fwDataCamp/location/Folder.cpp  |   21 +
 .../src/fwDataCamp/location/SingleFile.cpp         |   17 +
 .../src/fwDataCamp/visitor/CompareObjects.cpp      |  304 +++
 .../src/fwDataCamp/visitor/GetObject.cpp           |  262 +++
 .../src/fwDataCamp/visitor/RecursiveLock.cpp       |  192 ++
 .../src/fwMedDataCamp/ActivitySeries.cpp           |   25 +
 .../fwDataCamp/src/fwMedDataCamp/Equipment.cpp     |   21 +
 .../fwDataCamp/src/fwMedDataCamp/ImageSeries.cpp   |   24 +
 .../fwDataCamp/src/fwMedDataCamp/ModelSeries.cpp   |   22 +
 .../core/fwDataCamp/src/fwMedDataCamp/Patient.cpp  |   24 +
 .../core/fwDataCamp/src/fwMedDataCamp/Series.cpp   |   34 +
 .../core/fwDataCamp/src/fwMedDataCamp/SeriesDB.cpp |   22 +
 SrcLib/core/fwDataCamp/src/fwMedDataCamp/Study.cpp |   26 +
 SrcLib/core/fwDataCamp/test/CMakeLists.txt         |   10 +
 SrcLib/core/fwDataCamp/test/Properties.cmake       |    7 +
 SrcLib/core/fwDataCamp/test/cppunit.options        |   15 +
 .../test/tu/include/CompareObjectsTest.hpp         |   46 +
 .../fwDataCamp/test/tu/include/DataCampHelper.hpp  |   27 +
 .../fwDataCamp/test/tu/include/GetObjectTest.hpp   |   39 +
 .../core/fwDataCamp/test/tu/include/ObjectTest.hpp |   37 +
 .../test/tu/include/RecursiveLockTest.hpp          |   37 +
 .../include/fwMedDataCamp/ActivitySeriesTest.hpp   |   35 +
 .../tu/include/fwMedDataCamp/EquipmentTest.hpp     |   35 +
 .../tu/include/fwMedDataCamp/ImageSeriesTest.hpp   |   35 +
 .../tu/include/fwMedDataCamp/ModelSeriesTest.hpp   |   35 +
 .../test/tu/include/fwMedDataCamp/PatientTest.hpp  |   35 +
 .../test/tu/include/fwMedDataCamp/SeriesDBTest.hpp |   35 +
 .../test/tu/include/fwMedDataCamp/StudyTest.hpp    |   35 +
 .../fwDataCamp/test/tu/src/CompareObjectsTest.cpp  |  225 +++
 .../core/fwDataCamp/test/tu/src/DataCampHelper.cpp |   60 +
 .../core/fwDataCamp/test/tu/src/GetObjectTest.cpp  |  115 ++
 SrcLib/core/fwDataCamp/test/tu/src/ObjectTest.cpp  |   54 +
 .../fwDataCamp/test/tu/src/RecursiveLockTest.cpp   |  100 +
 .../tu/src/fwMedDataCamp/ActivitySeriesTest.cpp    |   73 +
 .../test/tu/src/fwMedDataCamp/EquipmentTest.cpp    |   56 +
 .../test/tu/src/fwMedDataCamp/ImageSeriesTest.cpp  |   98 +
 .../test/tu/src/fwMedDataCamp/ModelSeriesTest.cpp  |   95 +
 .../test/tu/src/fwMedDataCamp/PatientTest.cpp      |   67 +
 .../test/tu/src/fwMedDataCamp/SeriesDBTest.cpp     |   79 +
 .../test/tu/src/fwMedDataCamp/StudyTest.cpp        |   76 +
 SrcLib/core/fwDataIO/CMakeLists.txt                |   15 +
 SrcLib/core/fwDataIO/COPYING                       |  675 +++++++
 SrcLib/core/fwDataIO/COPYING.LESSER                |  166 ++
 SrcLib/core/fwDataIO/Properties.cmake              |    7 +
 SrcLib/core/fwDataIO/bin/build.options             |   15 +
 .../core/fwDataIO/include/fwDataIO/Namespace.hpp   |   20 +
 SrcLib/core/fwDataIO/include/fwDataIO/config.hpp   |   48 +
 .../include/fwDataIO/reader/ArrayReader.hpp        |   61 +
 .../include/fwDataIO/reader/DictionaryReader.hpp   |   71 +
 .../fwDataIO/reader/GenericObjectReader.hpp        |   81 +
 .../include/fwDataIO/reader/GzArrayReader.hpp      |   62 +
 .../fwDataIO/reader/GzBufferImageReader.hpp        |   64 +
 .../include/fwDataIO/reader/IObjectReader.hpp      |  128 ++
 .../include/fwDataIO/reader/MeshReader.hpp         |   67 +
 .../fwDataIO/include/fwDataIO/reader/Namespace.hpp |   24 +
 .../fwDataIO/include/fwDataIO/reader/TagReader.hpp |   65 +
 .../reader/TransformationMatrix3DReader.hpp        |   60 +
 .../fwDataIO/reader/TriangularMeshReader.hpp       |   70 +
 .../include/fwDataIO/reader/factory/namespace.hpp  |   30 +
 .../include/fwDataIO/reader/factory/new.hpp        |   64 +
 .../include/fwDataIO/reader/registry/detail.hpp    |   41 +
 .../include/fwDataIO/reader/registry/macros.hpp    |   26 +
 .../include/fwDataIO/reader/registry/namespace.hpp |   30 +
 .../include/fwDataIO/writer/ArrayWriter.hpp        |   60 +
 .../fwDataIO/writer/GenericObjectWriter.hpp        |   79 +
 .../include/fwDataIO/writer/GzArrayWriter.hpp      |   61 +
 .../fwDataIO/writer/GzBufferImageWriter.hpp        |   64 +
 .../include/fwDataIO/writer/IObjectWriter.hpp      |  139 ++
 .../include/fwDataIO/writer/MeshWriter.hpp         |   71 +
 .../fwDataIO/include/fwDataIO/writer/Namespace.hpp |   24 +
 .../writer/TransformationMatrix3DWriter.hpp        |   61 +
 .../fwDataIO/writer/TriangularMeshWriter.hpp       |   70 +
 .../include/fwDataIO/writer/factory/namespace.hpp  |   30 +
 .../include/fwDataIO/writer/factory/new.hpp        |   64 +
 .../include/fwDataIO/writer/registry/detail.hpp    |   41 +
 .../include/fwDataIO/writer/registry/macros.hpp    |   26 +
 .../include/fwDataIO/writer/registry/namespace.hpp |   30 +
 SrcLib/core/fwDataIO/rc/OrganDictionary.dic        |  187 ++
 .../fwDataIO/src/fwDataIO/reader/ArrayReader.cpp   |   77 +
 .../src/fwDataIO/reader/DictionaryReader.cpp       |  372 ++++
 .../fwDataIO/src/fwDataIO/reader/GzArrayReader.cpp |   81 +
 .../src/fwDataIO/reader/GzBufferImageReader.cpp    |   96 +
 .../fwDataIO/src/fwDataIO/reader/IObjectReader.cpp |   60 +
 .../fwDataIO/src/fwDataIO/reader/MeshReader.cpp    |  265 +++
 .../fwDataIO/src/fwDataIO/reader/TagReader.cpp     |  118 ++
 .../reader/TransformationMatrix3DReader.cpp        |   72 +
 .../src/fwDataIO/reader/TriangularMeshReader.cpp   |  170 ++
 .../fwDataIO/src/fwDataIO/reader/factory/new.cpp   |   31 +
 .../src/fwDataIO/reader/registry/detail.cpp        |   34 +
 .../fwDataIO/src/fwDataIO/writer/ArrayWriter.cpp   |   69 +
 .../fwDataIO/src/fwDataIO/writer/GzArrayWriter.cpp |   80 +
 .../src/fwDataIO/writer/GzBufferImageWriter.cpp    |   99 +
 .../fwDataIO/src/fwDataIO/writer/IObjectWriter.cpp |   66 +
 .../fwDataIO/src/fwDataIO/writer/MeshWriter.cpp    |  133 ++
 .../writer/TransformationMatrix3DWriter.cpp        |   78 +
 .../src/fwDataIO/writer/TriangularMeshWriter.cpp   |   87 +
 .../fwDataIO/src/fwDataIO/writer/factory/new.cpp   |   31 +
 .../src/fwDataIO/writer/registry/detail.cpp        |   34 +
 SrcLib/core/fwDataIO/test/CMakeLists.txt           |   10 +
 SrcLib/core/fwDataIO/test/Properties.cmake         |    7 +
 SrcLib/core/fwDataIO/test/cppunit.options          |    8 +
 .../test/tu/include/DictionaryReaderTest.hpp       |   56 +
 .../fwDataIO/test/tu/include/FileNameParser.hpp    |   45 +
 .../fwDataIO/test/tu/include/MeshTrianTest.hpp     |   48 +
 SrcLib/core/fwDataIO/test/tu/include/TrianTest.hpp |   53 +
 .../fwDataIO/test/tu/src/DictionaryReaderTest.cpp  |  212 ++
 SrcLib/core/fwDataIO/test/tu/src/MeshTrianTest.cpp |  149 ++
 SrcLib/core/fwDataIO/test/tu/src/TrianTest.cpp     |  196 ++
 SrcLib/core/fwDataTools/CMakeLists.txt             |   14 +
 SrcLib/core/fwDataTools/Properties.cmake           |    7 +
 SrcLib/core/fwDataTools/bin/build.options          |    9 +
 .../include/fwDataTools/AlgoMeshDeformation.hpp    |   88 +
 .../core/fwDataTools/include/fwDataTools/Image.hpp |  100 +
 .../core/fwDataTools/include/fwDataTools/Mesh.hpp  |  134 ++
 .../fwDataTools/include/fwDataTools/Namespace.hpp  |   20 +
 .../include/fwDataTools/TransferFunction.hpp       |   45 +
 .../include/fwDataTools/TransformationMatrix3D.hpp |   61 +
 .../fwDataTools/include/fwDataTools/Vector.hxx     |  131 ++
 .../fwDataTools/include/fwDataTools/export.hpp     |   41 +
 .../include/fwDataTools/thread/RegionThreader.hpp  |   80 +
 .../src/fwDataTools/AlgoMeshDeformation.cpp        |  152 ++
 SrcLib/core/fwDataTools/src/fwDataTools/Image.cpp  |  179 ++
 SrcLib/core/fwDataTools/src/fwDataTools/Mesh.cpp   |  591 ++++++
 .../src/fwDataTools/TransferFunction.cpp           |  294 +++
 .../src/fwDataTools/TransformationMatrix3D.cpp     |  106 +
 SrcLib/core/fwDataTools/test/CMakeLists.txt        |   10 +
 SrcLib/core/fwDataTools/test/Properties.cmake      |    7 +
 SrcLib/core/fwDataTools/test/cppunit.options       |   17 +
 .../core/fwDataTools/test/tu/include/ImageTest.hpp |   42 +
 .../core/fwDataTools/test/tu/include/MeshTest.hpp  |   42 +
 .../test/tu/include/TransformationMatrix3DTest.hpp |   44 +
 SrcLib/core/fwDataTools/test/tu/src/ImageTest.cpp  |  217 ++
 SrcLib/core/fwDataTools/test/tu/src/MeshTest.cpp   |   73 +
 .../test/tu/src/TransformationMatrix3DTest.cpp     |  158 ++
 SrcLib/core/fwGui/CMakeLists.txt                   |   14 +
 SrcLib/core/fwGui/COPYING                          |  675 +++++++
 SrcLib/core/fwGui/COPYING.LESSER                   |  166 ++
 SrcLib/core/fwGui/Properties.cmake                 |    7 +
 SrcLib/core/fwGui/bin/build.options                |    4 +
 .../fwGui/include/fwGui/ActionCallbackBase.hpp     |   72 +
 SrcLib/core/fwGui/include/fwGui/Application.hpp    |   49 +
 SrcLib/core/fwGui/include/fwGui/Cursor.hpp         |   55 +
 SrcLib/core/fwGui/include/fwGui/GuiBaseObject.hpp  |   65 +
 SrcLib/core/fwGui/include/fwGui/GuiRegistry.hpp    |  227 +++
 SrcLib/core/fwGui/include/fwGui/IActionSrv.hpp     |  134 ++
 SrcLib/core/fwGui/include/fwGui/IApplication.hpp   |   44 +
 SrcLib/core/fwGui/include/fwGui/ICursor.hpp        |   57 +
 SrcLib/core/fwGui/include/fwGui/IFrameSrv.hpp      |  122 ++
 .../core/fwGui/include/fwGui/IGuiContainerSrv.hpp  |  128 ++
 SrcLib/core/fwGui/include/fwGui/IMenuBarSrv.hpp    |  104 +
 .../core/fwGui/include/fwGui/IMenuItemCallback.hpp |   41 +
 SrcLib/core/fwGui/include/fwGui/IMenuSrv.hpp       |  120 ++
 SrcLib/core/fwGui/include/fwGui/IToolBarSrv.hpp    |  122 ++
 SrcLib/core/fwGui/include/fwGui/Namespace.hpp      |   20 +
 .../include/fwGui/builder/IContainerBuilder.hpp    |   81 +
 .../include/fwGui/builder/IMenuBarBuilder.hpp      |   79 +
 .../include/fwGui/builder/IToolBarBuilder.hpp      |  103 +
 .../core/fwGui/include/fwGui/builder/Namespace.hpp |   24 +
 SrcLib/core/fwGui/include/fwGui/config.hpp         |   43 +
 .../fwGui/include/fwGui/container/Namespace.hpp    |   24 +
 .../fwGui/include/fwGui/container/fwContainer.hpp  |   44 +
 .../core/fwGui/include/fwGui/container/fwMenu.hpp  |   40 +
 .../fwGui/include/fwGui/container/fwMenuBar.hpp    |   40 +
 .../fwGui/include/fwGui/container/fwMenuItem.hpp   |   40 +
 .../fwGui/include/fwGui/container/fwToolBar.hpp    |   40 +
 .../fwGui/include/fwGui/dialog/IInputDialog.hpp    |   60 +
 .../fwGui/include/fwGui/dialog/ILocationDialog.hpp |  117 ++
 .../fwGui/include/fwGui/dialog/IMessageDialog.hpp  |   88 +
 .../include/fwGui/dialog/IMultiSelectorDialog.hpp  |   72 +
 .../fwGui/include/fwGui/dialog/IProgressDialog.hpp |   93 +
 .../include/fwGui/dialog/IPulseProgressDialog.hpp  |   74 +
 .../fwGui/include/fwGui/dialog/ISelectorDialog.hpp |   70 +
 .../fwGui/include/fwGui/dialog/InputDialog.hpp     |  101 +
 .../fwGui/include/fwGui/dialog/LocationDialog.hpp  |   87 +
 .../fwGui/include/fwGui/dialog/MessageDialog.hpp   |   89 +
 .../include/fwGui/dialog/MultiSelectorDialog.hpp   |   64 +
 .../core/fwGui/include/fwGui/dialog/Namespace.hpp  |   24 +
 .../fwGui/include/fwGui/dialog/ProgressDialog.hpp  |   65 +
 .../include/fwGui/dialog/PulseProgressDialog.hpp   |   63 +
 .../fwGui/include/fwGui/dialog/SelectorDialog.hpp  |   80 +
 .../core/fwGui/include/fwGui/factory/namespace.hpp |   27 +
 SrcLib/core/fwGui/include/fwGui/factory/new.hpp    |   56 +
 .../layoutManager/CardinalLayoutManagerBase.hpp    |  146 ++
 .../fwGui/layoutManager/IFrameLayoutManager.hpp    |  167 ++
 .../fwGui/layoutManager/IMenuBarLayoutManager.hpp  |  129 ++
 .../fwGui/layoutManager/IMenuLayoutManager.hpp     |  196 ++
 .../fwGui/layoutManager/IToolBarLayoutManager.hpp  |  203 ++
 .../fwGui/layoutManager/IViewLayoutManager.hpp     |   90 +
 .../fwGui/layoutManager/LineLayoutManagerBase.hpp  |  135 ++
 .../include/fwGui/layoutManager/Namespace.hpp      |   24 +
 .../fwGui/layoutManager/TabLayoutManagerBase.hpp   |  112 ++
 .../layoutManager/ToolboxLayoutManagerBase.hpp     |  123 ++
 .../include/fwGui/registrar/ActionRegistrar.hpp    |   65 +
 .../include/fwGui/registrar/MenuBarRegistrar.hpp   |  113 ++
 .../include/fwGui/registrar/MenuRegistrar.hpp      |  165 ++
 .../fwGui/include/fwGui/registrar/Namespace.hpp    |   24 +
 .../include/fwGui/registrar/ToolBarRegistrar.hpp   |  183 ++
 .../include/fwGui/registrar/ViewRegistrar.hpp      |  173 ++
 .../core/fwGui/include/fwGui/registry/detail.hpp   |   37 +
 .../core/fwGui/include/fwGui/registry/macros.hpp   |   27 +
 .../fwGui/include/fwGui/registry/namespace.hpp     |   27 +
 SrcLib/core/fwGui/src/fwGui/ActionCallbackBase.cpp |   69 +
 SrcLib/core/fwGui/src/fwGui/Application.cpp        |   26 +
 SrcLib/core/fwGui/src/fwGui/Cursor.cpp             |   51 +
 SrcLib/core/fwGui/src/fwGui/GuiRegistry.cpp        |  415 ++++
 SrcLib/core/fwGui/src/fwGui/IActionSrv.cpp         |  184 ++
 SrcLib/core/fwGui/src/fwGui/IApplication.cpp       |   30 +
 SrcLib/core/fwGui/src/fwGui/ICursor.cpp            |   30 +
 SrcLib/core/fwGui/src/fwGui/IFrameSrv.cpp          |  239 +++
 SrcLib/core/fwGui/src/fwGui/IGuiContainerSrv.cpp   |  175 ++
 SrcLib/core/fwGui/src/fwGui/IMenuBarSrv.cpp        |  127 ++
 SrcLib/core/fwGui/src/fwGui/IMenuSrv.cpp           |  155 ++
 SrcLib/core/fwGui/src/fwGui/IToolBarSrv.cpp        |  156 ++
 .../fwGui/src/fwGui/builder/IContainerBuilder.cpp  |   54 +
 .../fwGui/src/fwGui/builder/IMenuBarBuilder.cpp    |   56 +
 .../fwGui/src/fwGui/builder/IToolBarBuilder.cpp    |  102 +
 .../core/fwGui/src/fwGui/container/fwContainer.cpp |   16 +
 SrcLib/core/fwGui/src/fwGui/container/fwMenu.cpp   |   16 +
 .../core/fwGui/src/fwGui/container/fwMenuBar.cpp   |   16 +
 .../core/fwGui/src/fwGui/container/fwMenuItem.cpp  |   16 +
 .../core/fwGui/src/fwGui/container/fwToolBar.cpp   |   16 +
 .../core/fwGui/src/fwGui/dialog/IInputDialog.cpp   |   27 +
 .../fwGui/src/fwGui/dialog/ILocationDialog.cpp     |  149 ++
 .../core/fwGui/src/fwGui/dialog/IMessageDialog.cpp |   27 +
 .../src/fwGui/dialog/IMultiSelectorDialog.cpp      |   26 +
 .../fwGui/src/fwGui/dialog/IProgressDialog.cpp     |   57 +
 .../src/fwGui/dialog/IPulseProgressDialog.cpp      |   45 +
 .../fwGui/src/fwGui/dialog/ISelectorDialog.cpp     |   26 +
 SrcLib/core/fwGui/src/fwGui/dialog/InputDialog.cpp |   80 +
 .../core/fwGui/src/fwGui/dialog/LocationDialog.cpp |   94 +
 .../core/fwGui/src/fwGui/dialog/MessageDialog.cpp  |  121 ++
 .../fwGui/src/fwGui/dialog/MultiSelectorDialog.cpp |   53 +
 .../core/fwGui/src/fwGui/dialog/ProgressDialog.cpp |   85 +
 .../fwGui/src/fwGui/dialog/PulseProgressDialog.cpp |   70 +
 .../core/fwGui/src/fwGui/dialog/SelectorDialog.cpp |   72 +
 SrcLib/core/fwGui/src/fwGui/factory/new.cpp        |   26 +
 .../layoutManager/CardinalLayoutManagerBase.cpp    |  142 ++
 .../fwGui/layoutManager/IFrameLayoutManager.cpp    |  241 +++
 .../fwGui/layoutManager/IMenuBarLayoutManager.cpp  |   81 +
 .../src/fwGui/layoutManager/IMenuLayoutManager.cpp |  166 ++
 .../fwGui/layoutManager/IToolBarLayoutManager.cpp  |  170 ++
 .../src/fwGui/layoutManager/IViewLayoutManager.cpp |   59 +
 .../fwGui/layoutManager/LineLayoutManagerBase.cpp  |  120 ++
 .../fwGui/layoutManager/TabLayoutManagerBase.cpp   |   85 +
 .../layoutManager/ToolboxLayoutManagerBase.cpp     |  106 +
 .../fwGui/src/fwGui/registrar/ActionRegistrar.cpp  |   63 +
 .../fwGui/src/fwGui/registrar/MenuBarRegistrar.cpp |  126 ++
 .../fwGui/src/fwGui/registrar/MenuRegistrar.cpp    |  202 ++
 .../fwGui/src/fwGui/registrar/ToolBarRegistrar.cpp |  253 +++
 .../fwGui/src/fwGui/registrar/ViewRegistrar.cpp    |  255 +++
 SrcLib/core/fwGui/src/fwGui/registry/detail.cpp    |   30 +
 SrcLib/core/fwGuiQt/CMakeLists.txt                 |   34 +
 SrcLib/core/fwGuiQt/COPYING                        |  675 +++++++
 SrcLib/core/fwGuiQt/COPYING.LESSER                 |  166 ++
 SrcLib/core/fwGuiQt/Properties.cmake               |    7 +
 SrcLib/core/fwGuiQt/bin/build.options              |   19 +
 SrcLib/core/fwGuiQt/bin/qt.conf                    |    3 +
 .../fwGuiQt/include/fwGuiQt/ActionCallback.hpp     |   56 +
 SrcLib/core/fwGuiQt/include/fwGuiQt/App.hpp        |   46 +
 .../core/fwGuiQt/include/fwGuiQt/Application.hpp   |   44 +
 SrcLib/core/fwGuiQt/include/fwGuiQt/Cursor.hpp     |   51 +
 SrcLib/core/fwGuiQt/include/fwGuiQt/Namespace.hpp  |   21 +
 .../core/fwGuiQt/include/fwGuiQt/QtMainFrame.hpp   |   53 +
 .../core/fwGuiQt/include/fwGuiQt/SliceSelector.hpp |   97 +
 SrcLib/core/fwGuiQt/include/fwGuiQt/WorkerQt.hpp   |   27 +
 .../include/fwGuiQt/builder/ContainerBuilder.hpp   |   65 +
 .../include/fwGuiQt/builder/MenuBarBuilder.hpp     |   64 +
 .../fwGuiQt/include/fwGuiQt/builder/Namespace.hpp  |   25 +
 .../include/fwGuiQt/builder/ToolBarBuilder.hpp     |   64 +
 SrcLib/core/fwGuiQt/include/fwGuiQt/config.hpp     |   43 +
 .../include/fwGuiQt/container/Namespace.hpp        |   24 +
 .../include/fwGuiQt/container/QtContainer.hpp      |   70 +
 .../fwGuiQt/container/QtMenuBarContainer.hpp       |   68 +
 .../include/fwGuiQt/container/QtMenuContainer.hpp  |   67 +
 .../fwGuiQt/container/QtMenuItemContainer.hpp      |   65 +
 .../fwGuiQt/container/QtToolBarContainer.hpp       |   67 +
 .../fwGuiQt/include/fwGuiQt/dialog/InputDialog.hpp |   75 +
 .../include/fwGuiQt/dialog/LocationDialog.hpp      |   73 +
 .../include/fwGuiQt/dialog/MessageDialog.hpp       |   76 +
 .../include/fwGuiQt/dialog/MultiSelectorDialog.hpp |   74 +
 .../fwGuiQt/include/fwGuiQt/dialog/Namespace.hpp   |   24 +
 .../include/fwGuiQt/dialog/ProgressDialog.hpp      |   87 +
 .../include/fwGuiQt/dialog/PulseProgressDialog.hpp |   66 +
 .../include/fwGuiQt/dialog/SelectorDialog.hpp      |   73 +
 .../include/fwGuiQt/highlighter/CppHighlighter.hpp |   51 +
 .../fwGuiQt/highlighter/PythonHighlighter.hpp      |   58 +
 .../layoutManager/CardinalLayoutManager.hpp        |   72 +
 .../fwGuiQt/layoutManager/FrameLayoutManager.hpp   |   74 +
 .../fwGuiQt/layoutManager/LineLayoutManager.hpp    |   61 +
 .../fwGuiQt/layoutManager/MenuBarLayoutManager.hpp |   76 +
 .../fwGuiQt/layoutManager/MenuLayoutManager.hpp    |   81 +
 .../include/fwGuiQt/layoutManager/Namespace.hpp    |   24 +
 .../fwGuiQt/layoutManager/TabLayoutManager.hpp     |   73 +
 .../fwGuiQt/layoutManager/ToolBarLayoutManager.hpp |   81 +
 .../fwGuiQt/layoutManager/ToolboxLayoutManager.hpp |   59 +
 .../core/fwGuiQt/include/fwGuiQt/util/FuncSlot.hpp |   47 +
 .../include/fwGuiQt/widget/QRangeSlider.hpp        |  100 +
 .../fwGuiQt/include/fwGuiQt/widget/QfwToolbox.hpp  |  102 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/ActionCallback.cpp |   44 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/App.cpp            |   75 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/Application.cpp    |   30 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/Cursor.cpp         |   66 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/QtMainFrame.cpp    |   53 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/SliceSelector.cpp  |  149 ++
 SrcLib/core/fwGuiQt/src/fwGuiQt/WorkerQt.cpp       |  382 ++++
 .../src/fwGuiQt/builder/ContainerBuilder.cpp       |  105 +
 .../fwGuiQt/src/fwGuiQt/builder/MenuBarBuilder.cpp |   86 +
 .../fwGuiQt/src/fwGuiQt/builder/ToolBarBuilder.cpp |  134 ++
 .../fwGuiQt/src/fwGuiQt/container/QtContainer.cpp  |   98 +
 .../src/fwGuiQt/container/QtMenuBarContainer.cpp   |   72 +
 .../src/fwGuiQt/container/QtMenuContainer.cpp      |   58 +
 .../src/fwGuiQt/container/QtMenuItemContainer.cpp  |   56 +
 .../src/fwGuiQt/container/QtToolBarContainer.cpp   |   62 +
 .../fwGuiQt/src/fwGuiQt/dialog/InputDialog.cpp     |   86 +
 .../fwGuiQt/src/fwGuiQt/dialog/LocationDialog.cpp  |  160 ++
 .../fwGuiQt/src/fwGuiQt/dialog/MessageDialog.cpp   |  139 ++
 .../src/fwGuiQt/dialog/MultiSelectorDialog.cpp     |  122 ++
 .../fwGuiQt/src/fwGuiQt/dialog/ProgressDialog.cpp  |  197 ++
 .../src/fwGuiQt/dialog/PulseProgressDialog.cpp     |   78 +
 .../fwGuiQt/src/fwGuiQt/dialog/SelectorDialog.cpp  |  114 ++
 .../src/fwGuiQt/highlighter/CppHighlighter.cpp     |  117 ++
 .../src/fwGuiQt/highlighter/PythonHighlighter.cpp  |  159 ++
 .../layoutManager/CardinalLayoutManager.cpp        |  185 ++
 .../fwGuiQt/layoutManager/FrameLayoutManager.cpp   |  202 ++
 .../fwGuiQt/layoutManager/LineLayoutManager.cpp    |  122 ++
 .../fwGuiQt/layoutManager/MenuBarLayoutManager.cpp |   91 +
 .../fwGuiQt/layoutManager/MenuLayoutManager.cpp    |  173 ++
 .../src/fwGuiQt/layoutManager/TabLayoutManager.cpp |   98 +
 .../fwGuiQt/layoutManager/ToolBarLayoutManager.cpp |  220 ++
 .../fwGuiQt/layoutManager/ToolboxLayoutManager.cpp |  108 +
 SrcLib/core/fwGuiQt/src/fwGuiQt/util/FuncSlot.cpp  |   24 +
 .../fwGuiQt/src/fwGuiQt/widget/QRangeSlider.cpp    |  469 +++++
 .../core/fwGuiQt/src/fwGuiQt/widget/QfwToolbox.cpp |  337 ++++
 SrcLib/core/fwGuiQt/test/CMakeLists.txt            |   12 +
 SrcLib/core/fwGuiQt/test/Properties.cmake          |    7 +
 SrcLib/core/fwGuiQt/test/cppunit.options           |   18 +
 .../core/fwGuiQt/test/tu/include/WorkerQtTest.hpp  |   59 +
 SrcLib/core/fwGuiQt/test/tu/src/WorkerQtTest.cpp   |  298 +++
 SrcLib/core/fwGuiWx/CMakeLists.txt                 |   19 +
 SrcLib/core/fwGuiWx/COPYING                        |  675 +++++++
 SrcLib/core/fwGuiWx/COPYING.LESSER                 |  166 ++
 SrcLib/core/fwGuiWx/Properties.cmake               |    7 +
 SrcLib/core/fwGuiWx/bin/build.options              |   10 +
 .../fwGuiWx/include/fwGuiWx/ActionCallback.hpp     |   50 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/App.hpp        |   86 +
 .../core/fwGuiWx/include/fwGuiWx/Application.hpp   |   44 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/Cursor.hpp     |   53 +
 .../fwGuiWx/include/fwGuiWx/LoggerInitializer.hpp  |   28 +
 .../core/fwGuiWx/include/fwGuiWx/MessageEvent.hpp  |   42 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/Namespace.hpp  |   21 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/Shortcut.hpp   |  184 ++
 SrcLib/core/fwGuiWx/include/fwGuiWx/WorkerWx.hpp   |   27 +
 .../include/fwGuiWx/builder/ContainerBuilder.hpp   |   65 +
 .../include/fwGuiWx/builder/MenuBarBuilder.hpp     |   64 +
 .../fwGuiWx/include/fwGuiWx/builder/Namespace.hpp  |   25 +
 .../include/fwGuiWx/builder/ToolBarBuilder.hpp     |   64 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/config.hpp     |   43 +
 .../include/fwGuiWx/container/Namespace.hpp        |   25 +
 .../include/fwGuiWx/container/WxContainer.hpp      |   64 +
 .../fwGuiWx/container/WxMenuBarContainer.hpp       |   61 +
 .../include/fwGuiWx/container/WxMenuContainer.hpp  |   61 +
 .../fwGuiWx/container/WxMenuItemContainer.hpp      |   66 +
 .../fwGuiWx/container/WxToolBarContainer.hpp       |   61 +
 SrcLib/core/fwGuiWx/include/fwGuiWx/convert.hpp    |   32 +
 .../fwGuiWx/include/fwGuiWx/dialog/InputDialog.hpp |   80 +
 .../include/fwGuiWx/dialog/LocationDialog.hpp      |   66 +
 .../include/fwGuiWx/dialog/MessageDialog.hpp       |   76 +
 .../include/fwGuiWx/dialog/MultiSelectorDialog.hpp |   69 +
 .../fwGuiWx/include/fwGuiWx/dialog/Namespace.hpp   |   24 +
 .../include/fwGuiWx/dialog/ProgressDialog.hpp      |   63 +
 .../include/fwGuiWx/dialog/PulseProgressDialog.hpp |   93 +
 .../include/fwGuiWx/dialog/SelectorDialog.hpp      |   69 +
 .../layoutManager/CardinalLayoutManager.hpp        |   67 +
 .../fwGuiWx/layoutManager/FrameLayoutManager.hpp   |   68 +
 .../fwGuiWx/layoutManager/LineLayoutManager.hpp    |   61 +
 .../fwGuiWx/layoutManager/MenuBarLayoutManager.hpp |   80 +
 .../fwGuiWx/layoutManager/MenuLayoutManager.hpp    |   87 +
 .../include/fwGuiWx/layoutManager/Namespace.hpp    |   24 +
 .../fwGuiWx/layoutManager/TabLayoutManager.hpp     |   67 +
 .../fwGuiWx/layoutManager/ToolBarLayoutManager.hpp |   83 +
 .../include/fwGuiWx/widgets/ImageURLPanel.hpp      |   48 +
 .../fwGuiWx/include/fwGuiWx/widgets/Namespace.hpp  |   24 +
 .../include/fwGuiWx/widgets/colourpicker.hpp       |  162 ++
 .../include/fwGuiWx/widgets/fwProgressDialog.hpp   |  177 ++
 SrcLib/core/fwGuiWx/src/fwGuiWx/ActionCallback.cpp |   37 +
 SrcLib/core/fwGuiWx/src/fwGuiWx/App.cpp            |  315 +++
 SrcLib/core/fwGuiWx/src/fwGuiWx/Application.cpp    |   31 +
 SrcLib/core/fwGuiWx/src/fwGuiWx/Cursor.cpp         |   65 +
 .../core/fwGuiWx/src/fwGuiWx/LoggerInitializer.cpp |  128 ++
 SrcLib/core/fwGuiWx/src/fwGuiWx/Shortcut.cpp       |  358 ++++
 SrcLib/core/fwGuiWx/src/fwGuiWx/WorkerWx.cpp       |  370 ++++
 .../src/fwGuiWx/builder/ContainerBuilder.cpp       |  113 ++
 .../fwGuiWx/src/fwGuiWx/builder/MenuBarBuilder.cpp |   74 +
 .../fwGuiWx/src/fwGuiWx/builder/ToolBarBuilder.cpp |   88 +
 .../fwGuiWx/src/fwGuiWx/container/WxContainer.cpp  |  109 +
 .../src/fwGuiWx/container/WxMenuBarContainer.cpp   |   64 +
 .../src/fwGuiWx/container/WxMenuContainer.cpp      |   59 +
 .../src/fwGuiWx/container/WxMenuItemContainer.cpp  |   69 +
 .../src/fwGuiWx/container/WxToolBarContainer.cpp   |   59 +
 SrcLib/core/fwGuiWx/src/fwGuiWx/convert.cpp        |   23 +
 .../fwGuiWx/src/fwGuiWx/dialog/InputDialog.cpp     |   59 +
 .../fwGuiWx/src/fwGuiWx/dialog/LocationDialog.cpp  |  177 ++
 .../fwGuiWx/src/fwGuiWx/dialog/MessageDialog.cpp   |  122 ++
 .../src/fwGuiWx/dialog/MultiSelectorDialog.cpp     |  129 ++
 .../fwGuiWx/src/fwGuiWx/dialog/ProgressDialog.cpp  |   73 +
 .../src/fwGuiWx/dialog/PulseProgressDialog.cpp     |  201 ++
 .../fwGuiWx/src/fwGuiWx/dialog/SelectorDialog.cpp  |  118 ++
 .../layoutManager/CardinalLayoutManager.cpp        |  107 +
 .../fwGuiWx/layoutManager/FrameLayoutManager.cpp   |  185 ++
 .../fwGuiWx/layoutManager/LineLayoutManager.cpp    |  100 +
 .../fwGuiWx/layoutManager/MenuBarLayoutManager.cpp |  106 +
 .../fwGuiWx/layoutManager/MenuLayoutManager.cpp    |  183 ++
 .../src/fwGuiWx/layoutManager/TabLayoutManager.cpp |   89 +
 .../fwGuiWx/layoutManager/ToolBarLayoutManager.cpp |  155 ++
 .../fwGuiWx/src/fwGuiWx/widgets/ImageURLPanel.cpp  |   67 +
 .../fwGuiWx/src/fwGuiWx/widgets/colourpicker.cpp   |  432 ++++
 .../src/fwGuiWx/widgets/fwProgressDialog.cpp       |  696 +++++++
 SrcLib/core/fwGuiWx/test/CMakeLists.txt            |   12 +
 SrcLib/core/fwGuiWx/test/Properties.cmake          |    7 +
 SrcLib/core/fwGuiWx/test/cppunit.options           |   17 +
 .../core/fwGuiWx/test/tu/include/WorkerWxTest.hpp  |   59 +
 SrcLib/core/fwGuiWx/test/tu/src/WorkerWxTest.cpp   |  298 +++
 SrcLib/core/fwMath/CMakeLists.txt                  |    7 +
 SrcLib/core/fwMath/Properties.cmake                |    7 +
 SrcLib/core/fwMath/bin/build.options               |    6 +
 SrcLib/core/fwMath/include/fwMath/Compare.hpp      |   59 +
 .../core/fwMath/include/fwMath/IntrasecTypes.hpp   |   39 +
 .../core/fwMath/include/fwMath/LineFunctions.hpp   |   60 +
 .../core/fwMath/include/fwMath/MatrixFunctions.hpp |   34 +
 .../core/fwMath/include/fwMath/MeshFunctions.hpp   |  125 ++
 SrcLib/core/fwMath/include/fwMath/Namespace.hpp    |   21 +
 .../core/fwMath/include/fwMath/PlaneFunctions.hpp  |  103 +
 .../core/fwMath/include/fwMath/VectorFunctions.hpp |  147 ++
 SrcLib/core/fwMath/include/fwMath/export.hpp       |   41 +
 SrcLib/core/fwMath/src/fwMath/LineFunctions.cpp    |  103 +
 SrcLib/core/fwMath/src/fwMath/MatrixFunctions.cpp  |   70 +
 SrcLib/core/fwMath/src/fwMath/MeshFunctions.cpp    |  296 +++
 SrcLib/core/fwMath/src/fwMath/PlaneFunctions.cpp   |  141 ++
 SrcLib/core/fwMath/src/fwMath/VectorFunctions.cpp  |  181 ++
 SrcLib/core/fwMath/test/CMakeLists.txt             |   10 +
 SrcLib/core/fwMath/test/Properties.cmake           |    7 +
 SrcLib/core/fwMath/test/cppunit.options            |   12 +
 SrcLib/core/fwMath/test/tu/include/CompareTest.hpp |   37 +
 .../fwMath/test/tu/include/MatrixFunctionsTest.hpp |   35 +
 .../fwMath/test/tu/include/PlaneFunctionsTest.hpp  |   47 +
 .../fwMath/test/tu/include/VectorFunctionsTest.hpp |   45 +
 SrcLib/core/fwMath/test/tu/src/CompareTest.cpp     |   67 +
 .../fwMath/test/tu/src/MatrixFunctionsTest.cpp     |   97 +
 .../core/fwMath/test/tu/src/PlaneFunctionsTest.cpp |  267 +++
 .../fwMath/test/tu/src/VectorFunctionsTest.cpp     |  156 ++
 SrcLib/core/fwMedData/CMakeLists.txt               |   10 +
 SrcLib/core/fwMedData/COPYING                      |  675 +++++++
 SrcLib/core/fwMedData/COPYING.LESSER               |  166 ++
 SrcLib/core/fwMedData/Properties.cmake             |    7 +
 SrcLib/core/fwMedData/bin/build.options            |    4 +
 .../fwMedData/include/fwMedData/ActivitySeries.hpp |   92 +
 .../core/fwMedData/include/fwMedData/Equipment.hpp |   73 +
 .../fwMedData/include/fwMedData/ImageSeries.hpp    |   81 +
 .../fwMedData/include/fwMedData/ModelSeries.hpp    |   86 +
 .../core/fwMedData/include/fwMedData/Patient.hpp   |  101 +
 SrcLib/core/fwMedData/include/fwMedData/Series.hpp |  149 ++
 .../core/fwMedData/include/fwMedData/SeriesDB.hpp  |  126 ++
 SrcLib/core/fwMedData/include/fwMedData/Study.hpp  |  118 ++
 SrcLib/core/fwMedData/include/fwMedData/config.hpp |   41 +
 .../core/fwMedData/include/fwMedData/namespace.hpp |   18 +
 SrcLib/core/fwMedData/include/fwMedData/types.hpp  |   22 +
 .../fwMedData/src/fwMedData/ActivitySeries.cpp     |   61 +
 SrcLib/core/fwMedData/src/fwMedData/Equipment.cpp  |   56 +
 .../core/fwMedData/src/fwMedData/ImageSeries.cpp   |   59 +
 .../core/fwMedData/src/fwMedData/ModelSeries.cpp   |   59 +
 SrcLib/core/fwMedData/src/fwMedData/Patient.cpp    |   62 +
 SrcLib/core/fwMedData/src/fwMedData/Series.cpp     |   81 +
 SrcLib/core/fwMedData/src/fwMedData/SeriesDB.cpp   |   62 +
 SrcLib/core/fwMedData/src/fwMedData/Study.cpp      |   66 +
 SrcLib/core/fwMedData/test/CMakeLists.txt          |   10 +
 SrcLib/core/fwMedData/test/Properties.cmake        |    7 +
 SrcLib/core/fwMedData/test/cppunit.options         |   20 +
 .../test/tu/include/ActivitySeriesTest.hpp         |   46 +
 .../fwMedData/test/tu/include/EquipmentTest.hpp    |   38 +
 .../fwMedData/test/tu/include/ImageSeriesTest.hpp  |   38 +
 .../fwMedData/test/tu/include/ModelSeriesTest.hpp  |   38 +
 .../core/fwMedData/test/tu/include/PatientTest.hpp |   44 +
 .../fwMedData/test/tu/include/SeriesDBTest.hpp     |   44 +
 .../core/fwMedData/test/tu/include/SeriesTest.hpp  |   61 +
 .../core/fwMedData/test/tu/include/StudyTest.hpp   |   48 +
 .../fwMedData/test/tu/src/ActivitySeriesTest.cpp   |   62 +
 .../core/fwMedData/test/tu/src/EquipmentTest.cpp   |   49 +
 .../core/fwMedData/test/tu/src/ImageSeriesTest.cpp |   56 +
 .../core/fwMedData/test/tu/src/ModelSeriesTest.cpp |   77 +
 SrcLib/core/fwMedData/test/tu/src/PatientTest.cpp  |   81 +
 SrcLib/core/fwMedData/test/tu/src/SeriesDBTest.cpp |   93 +
 SrcLib/core/fwMedData/test/tu/src/SeriesTest.cpp   |  170 ++
 SrcLib/core/fwMedData/test/tu/src/StudyTest.cpp    |  102 +
 SrcLib/core/fwMedDataTools/CMakeLists.txt          |   13 +
 SrcLib/core/fwMedDataTools/Properties.cmake        |    7 +
 SrcLib/core/fwMedDataTools/bin/build.options       |    6 +
 .../include/fwMedDataTools/config.hpp              |   40 +
 .../include/fwMedDataTools/functions.hpp           |   29 +
 .../include/fwMedDataTools/namespace.hpp           |   14 +
 .../src/fwMedDataTools/functions.cpp               |   41 +
 SrcLib/core/fwMedDataTools/test/cppunit.options    |    9 +
 .../test/tu/include/FunctionsTest.hpp              |   45 +
 .../fwMedDataTools/test/tu/src/FunctionsTest.cpp   |   46 +
 SrcLib/core/fwMemory/CMakeLists.txt                |   16 +
 SrcLib/core/fwMemory/COPYING                       |  675 +++++++
 SrcLib/core/fwMemory/COPYING.LESSER                |  166 ++
 SrcLib/core/fwMemory/Properties.cmake              |    7 +
 SrcLib/core/fwMemory/bin/build.options             |   22 +
 .../include/fwMemory/BufferAllocationPolicy.hpp    |   67 +
 .../core/fwMemory/include/fwMemory/BufferInfo.hpp  |   64 +
 .../fwMemory/include/fwMemory/BufferManager.hpp    |  334 +++
 .../fwMemory/include/fwMemory/BufferObject.hpp     |  302 +++
 SrcLib/core/fwMemory/include/fwMemory/ByteSize.hpp |  150 ++
 .../core/fwMemory/include/fwMemory/FileFormat.hpp  |   22 +
 .../core/fwMemory/include/fwMemory/FileHolder.hpp  |   57 +
 SrcLib/core/fwMemory/include/fwMemory/IPolicy.hpp  |   72 +
 .../core/fwMemory/include/fwMemory/Namespace.hpp   |   20 +
 .../fwMemory/include/fwMemory/camp/declare.hpp     |   32 +
 .../core/fwMemory/include/fwMemory/camp/mapper.hpp |   39 +
 SrcLib/core/fwMemory/include/fwMemory/config.hpp   |   39 +
 .../include/fwMemory/exception/BadCast.hpp         |   32 +
 .../fwMemory/include/fwMemory/exception/Memory.hpp |   32 +
 .../include/fwMemory/policy/AlwaysDump.hpp         |   83 +
 .../include/fwMemory/policy/BarrierDump.hpp        |   92 +
 .../fwMemory/include/fwMemory/policy/NeverDump.hpp |   81 +
 .../fwMemory/include/fwMemory/policy/ValveDump.hpp |   85 +
 .../include/fwMemory/policy/factory/new.hpp        |   46 +
 .../include/fwMemory/policy/registry/detail.hpp    |   39 +
 .../include/fwMemory/policy/registry/macros.hpp    |   29 +
 .../fwMemory/include/fwMemory/stream/in/Buffer.hpp |   50 +
 .../include/fwMemory/stream/in/IFactory.hpp        |   41 +
 .../fwMemory/include/fwMemory/stream/in/Raw.hpp    |   51 +
 .../fwMemory/include/fwMemory/stream/in/RawZ.hpp   |   45 +
 .../fwMemory/tools/DarwinMemoryMonitorTools.hpp    |   63 +
 .../include/fwMemory/tools/MemoryMonitorTools.hpp  |   54 +
 .../fwMemory/tools/PosixMemoryMonitorTools.hpp     |  142 ++
 .../fwMemory/tools/Win32MemoryMonitorTools.hpp     |   62 +
 .../src/fwMemory/BufferAllocationPolicy.cpp        |  163 ++
 SrcLib/core/fwMemory/src/fwMemory/BufferInfo.cpp   |   38 +
 .../core/fwMemory/src/fwMemory/BufferManager.cpp   |  673 +++++++
 SrcLib/core/fwMemory/src/fwMemory/BufferObject.cpp |  124 ++
 SrcLib/core/fwMemory/src/fwMemory/ByteSize.cpp     |  311 +++
 SrcLib/core/fwMemory/src/fwMemory/FileHolder.cpp   |   51 +
 SrcLib/core/fwMemory/src/fwMemory/camp/declare.cpp |   17 +
 .../fwMemory/src/fwMemory/policy/AlwaysDump.cpp    |  156 ++
 .../fwMemory/src/fwMemory/policy/BarrierDump.cpp   |  258 +++
 .../fwMemory/src/fwMemory/policy/NeverDump.cpp     |  118 ++
 .../fwMemory/src/fwMemory/policy/ValveDump.cpp     |  253 +++
 .../fwMemory/src/fwMemory/policy/factory/new.cpp   |   28 +
 .../src/fwMemory/policy/registry/detail.cpp        |   31 +
 .../fwMemory/src/fwMemory/stream/in/Buffer.cpp     |   65 +
 .../core/fwMemory/src/fwMemory/stream/in/Raw.cpp   |   38 +
 .../core/fwMemory/src/fwMemory/stream/in/RawZ.cpp  |   54 +
 .../fwMemory/tools/DarwinMemoryMonitorTools.cpp    |  190 ++
 .../src/fwMemory/tools/MemoryMonitorTools.cpp      |   95 +
 .../src/fwMemory/tools/PosixMemoryMonitorTools.cpp |  488 +++++
 .../src/fwMemory/tools/Win32MemoryMonitorTools.cpp |  204 ++
 SrcLib/core/fwMemory/test/CMakeLists.txt           |   10 +
 SrcLib/core/fwMemory/test/Properties.cmake         |    7 +
 SrcLib/core/fwMemory/test/cppunit.options          |   10 +
 .../fwMemory/test/tu/include/BufferManagerTest.hpp |   36 +
 .../fwMemory/test/tu/include/BufferObjectTest.hpp  |   38 +
 .../core/fwMemory/test/tu/include/ByteSizeTest.hpp |   35 +
 .../fwMemory/test/tu/src/BufferManagerTest.cpp     |  170 ++
 .../core/fwMemory/test/tu/src/BufferObjectTest.cpp |  239 +++
 SrcLib/core/fwMemory/test/tu/src/ByteSizeTest.cpp  |  173 ++
 SrcLib/core/fwPython/CMakeLists.txt                |   28 +
 SrcLib/core/fwPython/Properties.cmake              |    7 +
 SrcLib/core/fwPython/bin/build.options             |    5 +
 .../core/fwPython/include/fwPython/Interpreter.hpp |   69 +
 .../fwPython/include/fwPython/bindings/Image.hpp   |   18 +
 .../include/fwPython/bindings/STLContainers.hpp    |   24 +
 .../include/fwPython/bindings/STLContainers.hxx    |   32 +
 .../fwPython/include/fwPython/bindings/base.hpp    |   26 +
 .../include/fwPython/bindings/namespace.hpp        |   26 +
 SrcLib/core/fwPython/include/fwPython/config.hpp   |   39 +
 .../core/fwPython/include/fwPython/namespace.hpp   |   20 +
 SrcLib/core/fwPython/include/fwPython/python.hpp   |   32 +
 SrcLib/core/fwPython/src/fwPython/Interpreter.cpp  |  147 ++
 .../core/fwPython/src/fwPython/bindings/Image.cpp  |  157 ++
 .../src/fwPython/bindings/STLContainers.cpp        |   89 +
 .../core/fwPython/src/fwPython/bindings/base.cpp   |  142 ++
 SrcLib/core/fwPython/src/fwPython/python.cpp       |  111 +
 SrcLib/core/fwPython/test/CMakeLists.txt           |   10 +
 SrcLib/core/fwPython/test/Properties.cmake         |    7 +
 SrcLib/core/fwPython/test/cppunit.options          |    8 +
 .../fwPython/test/tu/include/InterpreterTest.hpp   |   47 +
 .../core/fwPython/test/tu/src/InterpreterTest.cpp  |  170 ++
 SrcLib/core/fwRender/CMakeLists.txt                |   10 +
 SrcLib/core/fwRender/COPYING                       |  675 +++++++
 SrcLib/core/fwRender/COPYING.LESSER                |  166 ++
 SrcLib/core/fwRender/Properties.cmake              |    7 +
 SrcLib/core/fwRender/bin/build.options             |    7 +
 SrcLib/core/fwRender/include/fwRender/IRender.hpp  |   61 +
 .../core/fwRender/include/fwRender/Namespace.hpp   |   20 +
 SrcLib/core/fwRender/include/fwRender/config.hpp   |   39 +
 SrcLib/core/fwRender/src/fwRender/IRender.cpp      |   34 +
 SrcLib/core/fwRuntime/CHANGES                      |  102 +
 SrcLib/core/fwRuntime/CMakeLists.txt               |   19 +
 SrcLib/core/fwRuntime/COPYING                      |  675 +++++++
 SrcLib/core/fwRuntime/COPYING.LESSER               |  166 ++
 SrcLib/core/fwRuntime/Properties.cmake             |    7 +
 SrcLib/core/fwRuntime/bin/build.options            |   10 +
 SrcLib/core/fwRuntime/doc/doxygen/doxyfile         |  214 ++
 SrcLib/core/fwRuntime/header.txt                   |    3 +
 SrcLib/core/fwRuntime/include/fwRuntime/Bundle.hpp |  475 +++++
 .../fwRuntime/include/fwRuntime/BundleElement.hpp  |   98 +
 .../include/fwRuntime/ConfigurationElement.hpp     |  254 +++
 .../fwRuntime/ConfigurationElementContainer.hpp    |  129 ++
 .../core/fwRuntime/include/fwRuntime/Convert.hpp   |   71 +
 .../include/fwRuntime/EConfigurationElement.hpp    |   62 +
 .../fwRuntime/include/fwRuntime/EmptyPlugin.hpp    |   53 +
 .../fwRuntime/include/fwRuntime/Executable.hpp     |   83 +
 .../include/fwRuntime/ExecutableFactory.hpp        |   82 +
 .../fwRuntime/ExecutableFactoryRegistrar.hpp       |   55 +
 .../core/fwRuntime/include/fwRuntime/Extension.hpp |  136 ++
 .../fwRuntime/include/fwRuntime/ExtensionPoint.hpp |  178 ++
 .../fwRuntime/include/fwRuntime/IExecutable.hpp    |   85 +
 .../core/fwRuntime/include/fwRuntime/IPlugin.hpp   |   63 +
 .../core/fwRuntime/include/fwRuntime/Namespace.hpp |   20 +
 SrcLib/core/fwRuntime/include/fwRuntime/Plugin.hpp |   61 +
 .../core/fwRuntime/include/fwRuntime/Runtime.hpp   |  290 +++
 .../include/fwRuntime/RuntimeException.hpp         |   56 +
 .../core/fwRuntime/include/fwRuntime/Version.hpp   |   83 +
 SrcLib/core/fwRuntime/include/fwRuntime/config.hpp |   42 +
 .../core/fwRuntime/include/fwRuntime/dl/Darwin.hpp |  110 +
 .../core/fwRuntime/include/fwRuntime/dl/Darwin.hxx |   31 +
 .../include/fwRuntime/dl/DarwinNameDecorator.hpp   |   53 +
 .../include/fwRuntime/dl/INameDecorator.hpp        |   53 +
 .../fwRuntime/include/fwRuntime/dl/Library.hpp     |  170 ++
 .../include/fwRuntime/dl/NameDecorator.hpp         |   81 +
 .../fwRuntime/include/fwRuntime/dl/Namespace.hpp   |   25 +
 .../core/fwRuntime/include/fwRuntime/dl/Native.hpp |  146 ++
 .../core/fwRuntime/include/fwRuntime/dl/Posix.hpp  |   91 +
 .../include/fwRuntime/dl/PosixNameDecorator.hpp    |   53 +
 .../core/fwRuntime/include/fwRuntime/dl/Win32.hpp  |   86 +
 .../include/fwRuntime/dl/Win32NameDecorator.hpp    |   53 +
 SrcLib/core/fwRuntime/include/fwRuntime/helper.hpp |   86 +
 .../fwRuntime/io/BundleDescriptorReader.hpp        |  177 ++
 .../fwRuntime/include/fwRuntime/io/Namespace.hpp   |   25 +
 .../include/fwRuntime/io/ProfileReader.hpp         |  136 ++
 .../fwRuntime/include/fwRuntime/io/Validator.hpp   |  138 ++
 .../fwRuntime/include/fwRuntime/operations.hpp     |  359 ++++
 .../fwRuntime/include/fwRuntime/predicates.hpp     |   45 +
 .../include/fwRuntime/profile/Activater.hpp        |  101 +
 .../include/fwRuntime/profile/Initializer.hpp      |   64 +
 .../include/fwRuntime/profile/Namespace.hpp        |   25 +
 .../include/fwRuntime/profile/Profile.hpp          |  226 +++
 .../include/fwRuntime/profile/Starter.hpp          |   64 +
 .../include/fwRuntime/profile/Stopper.hpp          |   64 +
 .../include/fwRuntime/profile/Uninitializer.hpp    |   64 +
 .../fwRuntime/utils/GenericExecutableFactory.hpp   |   94 +
 .../utils/GenericExecutableFactoryRegistrar.hpp    |   49 +
 .../include/fwRuntime/utils/Namespace.hpp          |   24 +
 .../fwRuntime/rc/locale/en/LC_MESSAGES/runtime.po  |   17 +
 .../fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.po  |   17 +
 .../fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.pot |    0
 SrcLib/core/fwRuntime/rc/plugin.xsd                |   78 +
 SrcLib/core/fwRuntime/rc/profile.xsd               |   43 +
 SrcLib/core/fwRuntime/src/Bundle.cpp               |  602 ++++++
 SrcLib/core/fwRuntime/src/BundleElement.cpp        |   62 +
 SrcLib/core/fwRuntime/src/ConfigurationElement.cpp |  174 ++
 .../src/ConfigurationElementContainer.cpp          |  116 ++
 SrcLib/core/fwRuntime/src/Convert.cpp              |  313 +++
 .../core/fwRuntime/src/EConfigurationElement.cpp   |   46 +
 SrcLib/core/fwRuntime/src/EmptyPlugin.cpp          |   23 +
 SrcLib/core/fwRuntime/src/Executable.cpp           |   44 +
 SrcLib/core/fwRuntime/src/ExecutableFactory.cpp    |   31 +
 .../fwRuntime/src/ExecutableFactoryRegistrar.cpp   |   35 +
 SrcLib/core/fwRuntime/src/Extension.cpp            |  126 ++
 SrcLib/core/fwRuntime/src/ExtensionPoint.cpp       |   59 +
 SrcLib/core/fwRuntime/src/IExecutable.cpp          |   21 +
 SrcLib/core/fwRuntime/src/IPlugin.cpp              |   29 +
 SrcLib/core/fwRuntime/src/Plugin.cpp               |   34 +
 SrcLib/core/fwRuntime/src/Runtime.cpp              |  332 +++
 SrcLib/core/fwRuntime/src/RuntimeException.cpp     |   33 +
 SrcLib/core/fwRuntime/src/Version.cpp              |   98 +
 SrcLib/core/fwRuntime/src/dl/Darwin.cpp            |  115 ++
 .../core/fwRuntime/src/dl/DarwinNameDecoration.cpp |   35 +
 SrcLib/core/fwRuntime/src/dl/INameDecorator.cpp    |   26 +
 SrcLib/core/fwRuntime/src/dl/NameDecorator.cpp     |   51 +
 SrcLib/core/fwRuntime/src/dl/Native.cpp            |  133 ++
 SrcLib/core/fwRuntime/src/dl/Posix.cpp             |   98 +
 .../core/fwRuntime/src/dl/PosixNameDecorator.cpp   |   35 +
 SrcLib/core/fwRuntime/src/dl/Win32.cpp             |  101 +
 .../core/fwRuntime/src/dl/Win32NameDecorator.cpp   |   28 +
 SrcLib/core/fwRuntime/src/helper.cpp               |  217 ++
 .../fwRuntime/src/io/BundleDescriptorReader.cpp    |  559 +++++
 SrcLib/core/fwRuntime/src/io/ProfileReader.cpp     |  292 +++
 SrcLib/core/fwRuntime/src/io/Validator.cpp         |  209 ++
 SrcLib/core/fwRuntime/src/operations.cpp           |  161 ++
 SrcLib/core/fwRuntime/src/profile/Activater.cpp    |  110 +
 SrcLib/core/fwRuntime/src/profile/Initializer.cpp  |   52 +
 SrcLib/core/fwRuntime/src/profile/Profile.cpp      |  253 +++
 SrcLib/core/fwRuntime/src/profile/Starter.cpp      |   49 +
 SrcLib/core/fwRuntime/src/profile/Stopper.cpp      |   52 +
 .../core/fwRuntime/src/profile/Uninitializer.cpp   |   47 +
 SrcLib/core/fwRuntime/test/CMakeLists.txt          |   10 +
 SrcLib/core/fwRuntime/test/Properties.cmake        |    7 +
 SrcLib/core/fwRuntime/test/cppunit.options         |    9 +
 .../test/tu/include/EConfigurationElementTest.hpp  |   39 +
 .../core/fwRuntime/test/tu/include/RuntimeTest.hpp |   39 +
 .../test/tu/src/EConfigurationElementTest.cpp      |   59 +
 SrcLib/core/fwRuntime/test/tu/src/RuntimeTest.cpp  |   73 +
 SrcLib/core/fwServices/CMakeLists.txt              |   16 +
 SrcLib/core/fwServices/COPYING                     |  675 +++++++
 SrcLib/core/fwServices/COPYING.LESSER              |  166 ++
 SrcLib/core/fwServices/Properties.cmake            |    7 +
 SrcLib/core/fwServices/bin/build.options           |   14 +
 .../include/fwServices/AppConfigManager.hpp        |  191 ++
 .../include/fwServices/AppConfigManager.hxx        |   32 +
 SrcLib/core/fwServices/include/fwServices/Base.hpp |   25 +
 .../fwServices/include/fwServices/IController.hpp  |   42 +
 .../include/fwServices/IEditionService.hpp         |   88 +
 .../fwServices/include/fwServices/IService.hpp     |  478 +++++
 .../fwServices/include/fwServices/IService.hxx     |   25 +
 .../fwServices/include/fwServices/IXMLParser.hpp   |   98 +
 .../fwServices/include/fwServices/Namespace.hpp    |   26 +
 .../fwServices/include/fwServices/ObjectMsg.hpp    |  267 +++
 .../include/fwServices/SConfigController.hpp       |  113 ++
 .../include/fwServices/ServiceFactoryRegistrar.hpp |   42 +
 .../core/fwServices/include/fwServices/config.hpp  |   46 +
 .../fwServices/factory/message/namespace.hpp       |   31 +
 .../include/fwServices/factory/message/new.hpp     |   62 +
 .../include/fwServices/factory/namespace.hpp       |   28 +
 .../fwServices/include/fwServices/factory/new.hpp  |   39 +
 .../include/fwServices/helper/ConfigLauncher.hpp   |  111 +
 .../fwServices/helper/SigSlotConnection.hpp        |   77 +
 .../core/fwServices/include/fwServices/macros.hpp  |   80 +
 .../core/fwServices/include/fwServices/op/Add.hpp  |   41 +
 .../core/fwServices/include/fwServices/op/Add.hxx  |   35 +
 .../core/fwServices/include/fwServices/op/Get.hpp  |   50 +
 .../core/fwServices/include/fwServices/op/Get.hxx  |   34 +
 .../fwServices/include/fwServices/op/Namespace.hpp |   24 +
 .../include/fwServices/registry/ActiveWorkers.hpp  |   93 +
 .../include/fwServices/registry/AppConfig.hpp      |  193 ++
 .../fwServices/registry/AppConfigParameters.hpp    |   94 +
 .../include/fwServices/registry/Namespace.hpp      |   24 +
 .../include/fwServices/registry/ObjectService.hpp  |  294 +++
 .../include/fwServices/registry/ObjectService.hxx  |  108 +
 .../include/fwServices/registry/Proxy.hpp          |   97 +
 .../include/fwServices/registry/ServiceConfig.hpp  |  152 ++
 .../include/fwServices/registry/ServiceFactory.hpp |  166 ++
 .../include/fwServices/registry/message/detail.hpp |   42 +
 .../include/fwServices/registry/message/macros.hpp |   26 +
 .../fwServices/registry/message/namespace.hpp      |   30 +
 .../fwServices/src/fwServices/AppConfigManager.cpp |  746 +++++++
 .../core/fwServices/src/fwServices/IController.cpp |   24 +
 .../fwServices/src/fwServices/IEditionService.cpp  |   75 +
 SrcLib/core/fwServices/src/fwServices/IService.cpp |  397 ++++
 .../core/fwServices/src/fwServices/IXMLParser.cpp  |   77 +
 .../core/fwServices/src/fwServices/ObjectMsg.cpp   |  254 +++
 .../src/fwServices/SConfigController.cpp           |   72 +
 .../src/fwServices/factory/message/new.cpp         |   33 +
 .../src/fwServices/helper/ConfigLauncher.cpp       |  171 ++
 .../src/fwServices/helper/SigSlotConnection.cpp    |   56 +
 SrcLib/core/fwServices/src/fwServices/op/Add.cpp   |   43 +
 SrcLib/core/fwServices/src/fwServices/op/Get.cpp   |   36 +
 .../src/fwServices/registry/ActiveWorkers.cpp      |   84 +
 .../src/fwServices/registry/AppConfig.cpp          |  309 +++
 .../fwServices/registry/AppConfigParameters.cpp    |   98 +
 .../src/fwServices/registry/ObjectService.cpp      |  314 +++
 .../fwServices/src/fwServices/registry/Proxy.cpp   |  165 ++
 .../src/fwServices/registry/ServiceConfig.cpp      |  162 ++
 .../src/fwServices/registry/ServiceFactory.cpp     |  488 +++++
 .../src/fwServices/registry/message/detail.cpp     |   37 +
 SrcLib/core/fwServices/test/CMakeLists.txt         |   10 +
 SrcLib/core/fwServices/test/Properties.cmake       |    7 +
 SrcLib/core/fwServices/test/cppunit.options        |   18 +
 .../test/tu/include/ActiveWorkersTest.hpp          |   38 +
 .../test/tu/include/AppConfigParametersTest.hpp    |   44 +
 .../fwServices/test/tu/include/AppConfigTest.hpp   |   47 +
 .../fwServices/test/tu/include/ObjectMsgTest.hpp   |   41 +
 .../test/tu/include/ObjectServiceTest.hpp          |   41 +
 .../core/fwServices/test/tu/include/ProxyTest.hpp  |   38 +
 .../test/tu/include/ServiceConfigTest.hpp          |   46 +
 .../fwServices/test/tu/include/ServiceTest.hpp     |  129 ++
 .../test/tu/include/SigSlotConnectionTest.hpp      |   35 +
 .../test/tu/include/SlotsSignalsStuff.hpp          |  197 ++
 .../test/tu/include/SlotsSignalsTest.hpp           |   42 +
 .../test/tu/rc/AppConfigParametersTest/plugin.xml  |   21 +
 .../fwServices/test/tu/src/ActiveWorkersTest.cpp   |   59 +
 .../test/tu/src/AppConfigParametersTest.cpp        |  127 ++
 .../core/fwServices/test/tu/src/AppConfigTest.cpp  |  150 ++
 .../core/fwServices/test/tu/src/ObjectMsgTest.cpp  |   64 +
 .../fwServices/test/tu/src/ObjectServiceTest.cpp   |  129 ++
 SrcLib/core/fwServices/test/tu/src/ProxyTest.cpp   |  139 ++
 .../fwServices/test/tu/src/ServiceConfigTest.cpp   |  104 +
 SrcLib/core/fwServices/test/tu/src/ServiceTest.cpp |  297 +++
 .../test/tu/src/SigSlotConnectionTest.cpp          |   79 +
 .../fwServices/test/tu/src/SlotsSignalsStuff.cpp   |  186 ++
 .../fwServices/test/tu/src/SlotsSignalsTest.cpp    |  252 +++
 SrcLib/core/fwThread/CMakeLists.txt                |   12 +
 SrcLib/core/fwThread/COPYING                       |  675 +++++++
 SrcLib/core/fwThread/COPYING.LESSER                |  166 ++
 SrcLib/core/fwThread/Properties.cmake              |    7 +
 SrcLib/core/fwThread/bin/build.options             |   10 +
 .../core/fwThread/include/fwThread/Namespace.hpp   |   20 +
 .../core/fwThread/include/fwThread/TaskHandler.hpp |   52 +
 .../core/fwThread/include/fwThread/TaskHandler.hxx |   32 +
 SrcLib/core/fwThread/include/fwThread/Timer.hpp    |  100 +
 SrcLib/core/fwThread/include/fwThread/Worker.hpp   |  127 ++
 SrcLib/core/fwThread/include/fwThread/Worker.hxx   |   40 +
 SrcLib/core/fwThread/include/fwThread/config.hpp   |   43 +
 SrcLib/core/fwThread/src/fwThread/Timer.cpp        |   22 +
 SrcLib/core/fwThread/src/fwThread/Worker.cpp       |   22 +
 SrcLib/core/fwThread/src/fwThread/WorkerAsio.cpp   |  302 +++
 SrcLib/core/fwThread/test/CMakeLists.txt           |   10 +
 SrcLib/core/fwThread/test/Properties.cmake         |    7 +
 SrcLib/core/fwThread/test/cppunit.options          |    4 +
 .../fwThread/test/tu/include/TaskHandlerTest.hpp   |   36 +
 .../core/fwThread/test/tu/include/WorkerTest.hpp   |   36 +
 .../core/fwThread/test/tu/src/TaskHandlerTest.cpp  |  143 ++
 SrcLib/core/fwThread/test/tu/src/WorkerTest.cpp    |  269 +++
 SrcLib/core/fwTools/CMakeLists.txt                 |    7 +
 SrcLib/core/fwTools/COPYING                        |  675 +++++++
 SrcLib/core/fwTools/COPYING.LESSER                 |  166 ++
 SrcLib/core/fwTools/Properties.cmake               |    7 +
 SrcLib/core/fwTools/bin/build.options              |    5 +
 SrcLib/core/fwTools/include/fwTools/Bookmarks.hpp  |   82 +
 .../core/fwTools/include/fwTools/Combinatory.hpp   |  216 ++
 SrcLib/core/fwTools/include/fwTools/Dispatcher.hpp |  191 ++
 .../fwTools/include/fwTools/DynamicAttributes.hxx  |  139 ++
 .../core/fwTools/include/fwTools/DynamicType.hpp   |  165 ++
 .../core/fwTools/include/fwTools/DynamicType.hxx   |  166 ++
 .../include/fwTools/DynamicTypeKeyTypeMapping.hpp  |   78 +
 SrcLib/core/fwTools/include/fwTools/Exception.hpp  |   46 +
 SrcLib/core/fwTools/include/fwTools/Failed.hpp     |   45 +
 .../core/fwTools/include/fwTools/IntegerTypes.hpp  |   27 +
 .../fwTools/include/fwTools/IntrinsicTypes.hpp     |   25 +
 SrcLib/core/fwTools/include/fwTools/Namespace.hpp  |   20 +
 .../fwTools/include/fwTools/NumericRoundCast.hxx   |   49 +
 SrcLib/core/fwTools/include/fwTools/Object.hpp     |  125 ++
 SrcLib/core/fwTools/include/fwTools/Os.hpp         |   67 +
 .../fwTools/include/fwTools/ProgressAdviser.hpp    |   62 +
 .../fwTools/include/fwTools/ProgressToLogger.hpp   |   52 +
 .../include/fwTools/StringKeyTypeMapping.hpp       |   76 +
 SrcLib/core/fwTools/include/fwTools/Stringizer.hpp |  149 ++
 SrcLib/core/fwTools/include/fwTools/System.hpp     |   91 +
 SrcLib/core/fwTools/include/fwTools/Type.hpp       |  332 +++
 SrcLib/core/fwTools/include/fwTools/TypeInfo.hpp   |   93 +
 .../include/fwTools/TypeInfoKeyTypeMapping.hpp     |   77 +
 .../core/fwTools/include/fwTools/TypeMapping.hpp   |  201 ++
 SrcLib/core/fwTools/include/fwTools/UUID.hpp       |  102 +
 SrcLib/core/fwTools/include/fwTools/config.hpp     |   53 +
 .../core/fwTools/include/fwTools/dateAndTime.hpp   |   80 +
 .../include/fwTools/fromIsoExtendedString.hpp      |   62 +
 SrcLib/core/fwTools/include/fwTools/fwID.hpp       |  159 ++
 SrcLib/core/fwTools/include/fwTools/macros.hpp     |  231 +++
 .../fwTools/include/fwTools/pathDifference.hpp     |   53 +
 .../fwTools/include/fwTools/random/Generator.hpp   |   83 +
 SrcLib/core/fwTools/src/fwTools/Bookmarks.cpp      |   95 +
 SrcLib/core/fwTools/src/fwTools/DynamicType.cpp    |  134 ++
 .../src/fwTools/DynamicTypeKeyTypeMapping.cpp      |   85 +
 SrcLib/core/fwTools/src/fwTools/Exception.cpp      |   23 +
 SrcLib/core/fwTools/src/fwTools/Failed.cpp         |   22 +
 SrcLib/core/fwTools/src/fwTools/Object.cpp         |   53 +
 SrcLib/core/fwTools/src/fwTools/Os.cpp             |   88 +
 .../core/fwTools/src/fwTools/ProgressAdviser.cpp   |   28 +
 .../core/fwTools/src/fwTools/ProgressToLogger.cpp  |   29 +
 .../fwTools/src/fwTools/StringKeyTypeMapping.cpp   |   85 +
 SrcLib/core/fwTools/src/fwTools/Stringizer.cpp     |   82 +
 SrcLib/core/fwTools/src/fwTools/System.cpp         |  292 +++
 SrcLib/core/fwTools/src/fwTools/Type.cpp           |  250 +++
 SrcLib/core/fwTools/src/fwTools/TypeInfo.cpp       |  100 +
 .../fwTools/src/fwTools/TypeInfoKeyTypeMapping.cpp |   91 +
 SrcLib/core/fwTools/src/fwTools/UUID.cpp           |  123 ++
 SrcLib/core/fwTools/src/fwTools/dateAndTime.cpp    |  118 ++
 .../fwTools/src/fwTools/fromIsoExtendedString.cpp  |   83 +
 SrcLib/core/fwTools/src/fwTools/fwID.cpp           |  175 ++
 SrcLib/core/fwTools/src/fwTools/pathDifference.cpp |   43 +
 SrcLib/core/fwTools/test/CMakeLists.txt            |    9 +
 SrcLib/core/fwTools/test/Properties.cmake          |    7 +
 SrcLib/core/fwTools/test/cppunit.options           |   17 +
 .../fwTools/test/tu/include/DynamicTypeTest.hpp    |   34 +
 SrcLib/core/fwTools/test/tu/include/FwIDTest.hpp   |   45 +
 SrcLib/core/fwTools/test/tu/include/MacrosTest.hpp |   34 +
 .../test/tu/include/NumericRoundCastTest.hpp       |   42 +
 SrcLib/core/fwTools/test/tu/include/ObjectTest.hpp |   34 +
 SrcLib/core/fwTools/test/tu/include/RandomTest.hpp |   38 +
 .../fwTools/test/tu/include/StringizerTest.hpp     |   34 +
 SrcLib/core/fwTools/test/tu/include/TypeTest.hpp   |   34 +
 SrcLib/core/fwTools/test/tu/include/UUIDTest.hpp   |   46 +
 .../core/fwTools/test/tu/src/DynamicTypeTest.cpp   |   43 +
 SrcLib/core/fwTools/test/tu/src/FwIDTest.cpp       |  183 ++
 SrcLib/core/fwTools/test/tu/src/MacrosTest.cpp     |   71 +
 .../fwTools/test/tu/src/NumericRoundCastTest.cpp   |  123 ++
 SrcLib/core/fwTools/test/tu/src/ObjectTest.cpp     |   46 +
 SrcLib/core/fwTools/test/tu/src/RandomTest.cpp     |   88 +
 SrcLib/core/fwTools/test/tu/src/StringizerTest.cpp |   49 +
 SrcLib/core/fwTools/test/tu/src/TypeTest.cpp       |  145 ++
 SrcLib/core/fwTools/test/tu/src/UUIDTest.cpp       |  143 ++
 SrcLib/core/fwZip/CMakeLists.txt                   |   12 +
 SrcLib/core/fwZip/COPYING                          |  675 +++++++
 SrcLib/core/fwZip/COPYING.LESSER                   |  166 ++
 SrcLib/core/fwZip/Properties.cmake                 |    7 +
 SrcLib/core/fwZip/bin/build.options                |    7 +
 SrcLib/core/fwZip/include/Namespace.hpp            |   20 +
 SrcLib/core/fwZip/include/fwZip/IReadArchive.hpp   |   50 +
 SrcLib/core/fwZip/include/fwZip/IWriteArchive.hpp  |   61 +
 SrcLib/core/fwZip/include/fwZip/ReadDirArchive.hpp |   77 +
 SrcLib/core/fwZip/include/fwZip/ReadZipArchive.hpp |   74 +
 .../core/fwZip/include/fwZip/WriteDirArchive.hpp   |   82 +
 .../core/fwZip/include/fwZip/WriteZipArchive.hpp   |   88 +
 SrcLib/core/fwZip/include/fwZip/config.hpp         |   43 +
 SrcLib/core/fwZip/include/fwZip/exception/Read.hpp |   31 +
 .../core/fwZip/include/fwZip/exception/Write.hpp   |   31 +
 SrcLib/core/fwZip/include/minizip/crypt.h          |  131 ++
 SrcLib/core/fwZip/include/minizip/export.h         |    8 +
 SrcLib/core/fwZip/include/minizip/ioapi.h          |  202 ++
 SrcLib/core/fwZip/include/minizip/iowin32.h        |   32 +
 SrcLib/core/fwZip/include/minizip/mztools.h        |   31 +
 SrcLib/core/fwZip/include/minizip/unzip.h          |  439 ++++
 SrcLib/core/fwZip/include/minizip/zip.h            |  364 ++++
 SrcLib/core/fwZip/src/fwZip/ReadDirArchive.cpp     |   60 +
 SrcLib/core/fwZip/src/fwZip/ReadZipArchive.cpp     |  115 ++
 SrcLib/core/fwZip/src/fwZip/WriteDirArchive.cpp    |   95 +
 SrcLib/core/fwZip/src/fwZip/WriteZipArchive.cpp    |  194 ++
 SrcLib/core/fwZip/src/fwZip/exception/Read.cpp     |   24 +
 SrcLib/core/fwZip/src/fwZip/exception/Write.cpp    |   24 +
 SrcLib/core/fwZip/src/minizip/ioapi.c              |  247 +++
 SrcLib/core/fwZip/src/minizip/iowin32.c            |  392 ++++
 SrcLib/core/fwZip/src/minizip/mztools.c            |  283 +++
 SrcLib/core/fwZip/src/minizip/unzip.c              | 2125 ++++++++++++++++++++
 SrcLib/core/fwZip/src/minizip/zip.c                | 2006 ++++++++++++++++++
 SrcLib/io/fwAtomsBoostIO/CMakeLists.txt            |    5 +
 SrcLib/io/fwAtomsBoostIO/COPYING                   |  675 +++++++
 SrcLib/io/fwAtomsBoostIO/COPYING.LESSER            |  166 ++
 SrcLib/io/fwAtomsBoostIO/Properties.cmake          |    7 +
 SrcLib/io/fwAtomsBoostIO/bin/build.options         |    8 +
 .../include/fwAtomsBoostIO/Reader.hpp              |   46 +
 .../include/fwAtomsBoostIO/Writer.hpp              |   59 +
 .../include/fwAtomsBoostIO/config.hpp              |   41 +
 .../include/fwAtomsBoostIO/types.hpp               |   24 +
 .../fwAtomsBoostIO/src/fwAtomsBoostIO/Reader.cpp   |  356 ++++
 .../fwAtomsBoostIO/src/fwAtomsBoostIO/Writer.cpp   |  319 +++
 SrcLib/io/fwAtomsBoostIO/test/CMakeLists.txt       |    7 +
 SrcLib/io/fwAtomsBoostIO/test/Properties.cmake     |    7 +
 SrcLib/io/fwAtomsBoostIO/test/cppunit.options      |   13 +
 .../fwAtomsBoostIO/test/tu/include/BoostIOTest.hpp |   56 +
 .../io/fwAtomsBoostIO/test/tu/src/BoostIOTest.cpp  |  336 ++++
 SrcLib/io/fwAtomsHdf5IO/CMakeLists.txt             |   20 +
 SrcLib/io/fwAtomsHdf5IO/COPYING                    |  675 +++++++
 SrcLib/io/fwAtomsHdf5IO/COPYING.LESSER             |  166 ++
 SrcLib/io/fwAtomsHdf5IO/Properties.cmake           |    7 +
 SrcLib/io/fwAtomsHdf5IO/bin/build.options          |    4 +
 .../fwAtomsHdf5IO/include/fwAtomsHdf5IO/Reader.hpp |   54 +
 .../fwAtomsHdf5IO/include/fwAtomsHdf5IO/Writer.hpp |   69 +
 .../fwAtomsHdf5IO/include/fwAtomsHdf5IO/config.hpp |   41 +
 .../io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Reader.cpp  |  360 ++++
 .../io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Writer.cpp  |  253 +++
 SrcLib/io/fwAtomsHdf5IO/test/CMakeLists.txt        |    7 +
 SrcLib/io/fwAtomsHdf5IO/test/Properties.cmake      |    7 +
 SrcLib/io/fwAtomsHdf5IO/test/cppunit.options       |    7 +
 .../fwAtomsHdf5IO/test/tu/include/Hdf5IOTest.hpp   |   46 +
 SrcLib/io/fwAtomsHdf5IO/test/tu/src/Hdf5IOTest.cpp |  263 +++
 SrcLib/io/fwItkIO/CMakeLists.txt                   |   49 +
 SrcLib/io/fwItkIO/Properties.cmake                 |    7 +
 SrcLib/io/fwItkIO/bin/build.options                |   11 +
 .../include/fwItkIO/ImageIOFactoryRegistrar.hxx    |   36 +
 SrcLib/io/fwItkIO/include/fwItkIO/ImageReader.hpp  |   45 +
 SrcLib/io/fwItkIO/include/fwItkIO/ImageWriter.hpp  |   46 +
 .../io/fwItkIO/include/fwItkIO/JpgImageWriter.hpp  |   46 +
 SrcLib/io/fwItkIO/include/fwItkIO/config.hpp       |   39 +
 .../include/fwItkIO/helper/ProgressItkToFw.hpp     |   68 +
 .../include/fwItkIO/helper/ProgressItkToFw.hxx     |   75 +
 SrcLib/io/fwItkIO/include/fwItkIO/itk.hpp          |   59 +
 SrcLib/io/fwItkIO/include/fwItkIO/itk.hxx          |  147 ++
 SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hpp        |   37 +
 SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hxx        |   41 +
 SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIO.h  |   83 +
 .../fwItkIO/include/inr2itk/itkInrImageIOFactory.h |   60 +
 SrcLib/io/fwItkIO/src/fwItkIO/ImageReader.cpp      |  133 ++
 SrcLib/io/fwItkIO/src/fwItkIO/ImageWriter.cpp      |  127 ++
 SrcLib/io/fwItkIO/src/fwItkIO/JpgImageWriter.cpp   |  173 ++
 SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIO.cxx    |  804 ++++++++
 .../fwItkIO/src/inr2itk/itkInrImageIOFactory.cxx   |   58 +
 SrcLib/io/fwItkIO/test/CMakeLists.txt              |   10 +
 SrcLib/io/fwItkIO/test/Properties.cmake            |    7 +
 SrcLib/io/fwItkIO/test/cppunit.options             |   17 +
 .../test/tu/include/ImageConversionTest.hpp        |   51 +
 .../test/tu/include/ImageConversionTest.hxx        |   47 +
 .../test/tu/include/ImageReaderWriterJPGTest.hpp   |   42 +
 .../test/tu/include/ImageReaderWriterTest.hpp      |   46 +
 SrcLib/io/fwItkIO/test/tu/include/helper.hpp       |   29 +
 .../io/fwItkIO/test/tu/src/ImageConversionTest.cpp |  136 ++
 .../test/tu/src/ImageReaderWriterJPGTest.cpp       |   90 +
 .../fwItkIO/test/tu/src/ImageReaderWriterTest.cpp  |  137 ++
 SrcLib/io/fwItkIO/test/tu/src/helper.cpp           |   37 +
 SrcLib/io/fwVtkIO/CMakeLists.txt                   |   15 +
 SrcLib/io/fwVtkIO/COPYING                          |  675 +++++++
 SrcLib/io/fwVtkIO/COPYING.LESSER                   |  166 ++
 SrcLib/io/fwVtkIO/Properties.cmake                 |    7 +
 SrcLib/io/fwVtkIO/bin/build.options                |   17 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/ImageReader.hpp  |   58 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/ImageWriter.hpp  |   60 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/MeshReader.hpp   |   60 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/MeshWriter.hpp   |   61 +
 .../io/fwVtkIO/include/fwVtkIO/MetaImageReader.hpp |   59 +
 .../io/fwVtkIO/include/fwVtkIO/MetaImageWriter.hpp |   58 +
 .../include/fwVtkIO/ModelSeriesObjWriter.hpp       |   71 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/Namespace.hpp    |   20 +
 .../io/fwVtkIO/include/fwVtkIO/SeriesDBReader.hpp  |   66 +
 .../include/fwVtkIO/TriangularMeshReader.hpp       |   59 +
 .../include/fwVtkIO/TriangularMeshWriter.hpp       |   59 +
 .../io/fwVtkIO/include/fwVtkIO/VtiImageReader.hpp  |   59 +
 .../io/fwVtkIO/include/fwVtkIO/VtiImageWriter.hpp  |   58 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/config.hpp       |   53 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/helper/Mesh.hpp  |  122 ++
 .../include/fwVtkIO/helper/ProgressVtkToFw.hpp     |   68 +
 .../include/fwVtkIO/helper/ProgressVtkToFw.hxx     |   73 +
 .../include/fwVtkIO/helper/TransferFunction.hpp    |   67 +
 SrcLib/io/fwVtkIO/include/fwVtkIO/vtk.hpp          |  154 ++
 SrcLib/io/fwVtkIO/src/fwVtkIO/ImageReader.cpp      |   78 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/ImageWriter.cpp      |   68 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/MeshReader.cpp       |   68 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/MeshWriter.cpp       |   67 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageReader.cpp  |   75 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageWriter.cpp  |   67 +
 .../fwVtkIO/src/fwVtkIO/ModelSeriesObjWriter.cpp   |  121 ++
 SrcLib/io/fwVtkIO/src/fwVtkIO/SeriesDBReader.cpp   |  414 ++++
 .../fwVtkIO/src/fwVtkIO/TriangularMeshReader.cpp   |   78 +
 .../fwVtkIO/src/fwVtkIO/TriangularMeshWriter.cpp   |   68 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageReader.cpp   |   75 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageWriter.cpp   |   73 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/helper/Mesh.cpp      |  473 +++++
 .../src/fwVtkIO/helper/TransferFunction.cpp        |   85 +
 SrcLib/io/fwVtkIO/src/fwVtkIO/vtk.cpp              |  503 +++++
 SrcLib/io/fwVtkIO/test/CMakeLists.txt              |   10 +
 SrcLib/io/fwVtkIO/test/Properties.cmake            |    7 +
 SrcLib/io/fwVtkIO/test/cppunit.options             |   18 +
 SrcLib/io/fwVtkIO/test/tu/include/ImageTest.hpp    |   58 +
 SrcLib/io/fwVtkIO/test/tu/include/MeshTest.hpp     |   45 +
 SrcLib/io/fwVtkIO/test/tu/include/SeriesDBTest.hpp |   43 +
 .../test/tu/include/TransferFunctionTest.hpp       |   47 +
 SrcLib/io/fwVtkIO/test/tu/include/TrianTest.hpp    |   41 +
 SrcLib/io/fwVtkIO/test/tu/src/ImageTest.cpp        |  450 +++++
 SrcLib/io/fwVtkIO/test/tu/src/MeshTest.cpp         |  158 ++
 SrcLib/io/fwVtkIO/test/tu/src/SeriesDBTest.cpp     |  191 ++
 .../fwVtkIO/test/tu/src/TransferFunctionTest.cpp   |  157 ++
 SrcLib/io/fwVtkIO/test/tu/src/TrianTest.cpp        |   85 +
 SrcLib/io/vtkGdcmIO/CMakeLists.txt                 |   26 +
 SrcLib/io/vtkGdcmIO/Properties.cmake               |    7 +
 SrcLib/io/vtkGdcmIO/bin/build.options              |   13 +
 .../include/vtkGdcmIO/ImageSeriesWriter.hpp        |   53 +
 .../include/vtkGdcmIO/SeriesDBLazyReader.hpp       |  119 ++
 .../vtkGdcmIO/include/vtkGdcmIO/SeriesDBReader.hpp |   78 +
 SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/config.hpp   |   50 +
 .../include/vtkGdcmIO/helper/GdcmHelper.hpp        |   36 +
 .../include/vtkGdcmIO/helper/ImageDicomStream.hpp  |  113 ++
 .../vtkGdcmIO/src/vtkGdcmIO/ImageSeriesWriter.cpp  |  242 +++
 .../vtkGdcmIO/src/vtkGdcmIO/SeriesDBLazyReader.cpp |  574 ++++++
 .../io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBReader.cpp  |  447 ++++
 .../vtkGdcmIO/src/vtkGdcmIO/helper/GdcmHelper.cpp  |   95 +
 .../src/vtkGdcmIO/helper/ImageDicomStream.cpp      |  142 ++
 SrcLib/io/vtkGdcmIO/test/CMakeLists.txt            |    8 +
 SrcLib/io/vtkGdcmIO/test/Properties.cmake          |    7 +
 SrcLib/io/vtkGdcmIO/test/cppunit.options           |   17 +
 .../test/tu/include/ImageSeriesWriterTest.hpp      |   37 +
 .../test/tu/include/SeriesDBLazyReaderTest.hpp     |   46 +
 .../test/tu/include/SeriesDBReaderTest.hpp         |   46 +
 .../test/tu/src/ImageSeriesWriterTest.cpp          |   99 +
 .../test/tu/src/SeriesDBLazyReaderTest.cpp         |   83 +
 .../vtkGdcmIO/test/tu/src/SeriesDBReaderTest.cpp   |   65 +
 SrcLib/patch/fwMDSemanticPatch/CMakeLists.txt      |    6 +
 SrcLib/patch/fwMDSemanticPatch/COPYING             |  675 +++++++
 SrcLib/patch/fwMDSemanticPatch/COPYING.LESSER      |  166 ++
 SrcLib/patch/fwMDSemanticPatch/Properties.cmake    |    7 +
 SrcLib/patch/fwMDSemanticPatch/bin/build.options   |    9 +
 .../include/fwMDSemanticPatch/PatchLoader.hpp      |   26 +
 .../V1/V2/MedicalWorkspacePatcher.hpp              |   78 +
 .../fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp |   58 +
 .../fwMDSemanticPatch/V1/V2/fwData/Composite.hpp   |   59 +
 .../fwMDSemanticPatch/V1/V2/fwData/Patient.hpp     |   56 +
 .../fwMDSemanticPatch/V1/V2/fwData/Study.hpp       |   57 +
 .../include/fwMDSemanticPatch/config.hpp           |   44 +
 .../include/fwMDSemanticPatch/namespace.hpp        |   38 +
 SrcLib/patch/fwMDSemanticPatch/rc/V1.versions      |   51 +
 SrcLib/patch/fwMDSemanticPatch/rc/V1ToV2.graphlink |   20 +
 SrcLib/patch/fwMDSemanticPatch/rc/V2.versions      |   53 +
 .../src/fwMDSemanticPatch/PatchLoader.cpp          |   28 +
 .../V1/V2/MedicalWorkspacePatcher.cpp              |   78 +
 .../fwMDSemanticPatch/V1/V2/fwData/Acquisition.cpp |   77 +
 .../fwMDSemanticPatch/V1/V2/fwData/Composite.cpp   |  316 +++
 .../src/fwMDSemanticPatch/V1/V2/fwData/Patient.cpp |   68 +
 .../src/fwMDSemanticPatch/V1/V2/fwData/Study.cpp   |   67 +
 .../fwMDSemanticPatch/V1/V2/fwData/autoload.cpp    |   44 +
 SrcLib/patch/fwStructuralPatch/CMakeLists.txt      |    4 +
 SrcLib/patch/fwStructuralPatch/COPYING             |  675 +++++++
 SrcLib/patch/fwStructuralPatch/COPYING.LESSER      |  166 ++
 SrcLib/patch/fwStructuralPatch/Properties.cmake    |    7 +
 SrcLib/patch/fwStructuralPatch/bin/build.options   |   11 +
 .../include/fwStructuralPatch/PatchLoader.hpp      |   26 +
 .../include/fwStructuralPatch/config.hpp           |   44 +
 .../creator/fwMedData/ActivitySeries1.hpp          |   52 +
 .../creator/fwMedData/Equipment1.hpp               |   44 +
 .../creator/fwMedData/ImageSeries1.hpp             |   47 +
 .../creator/fwMedData/ModelSeries1.hpp             |   47 +
 .../creator/fwMedData/Patient1.hpp                 |   46 +
 .../creator/fwMedData/Series1.hpp                  |   50 +
 .../fwStructuralPatch/creator/fwMedData/Study1.hpp |   50 +
 .../Acquisition/V1ToFwMedDataImageSeriesV1.hpp     |   61 +
 .../fwData/Patient/V1ToFwMedDataPatientV1.hpp      |   60 +
 .../fwData/Reconstruction/V1ToV2.hpp               |   59 +
 .../fwData/Study/V1ToFwMedDataStudyV1.hpp          |   60 +
 .../include/fwStructuralPatch/namespace.hpp        |   59 +
 .../src/fwStructuralPatch/PatchLoader.cpp          |   17 +
 .../src/fwStructuralPatch/autoload.cpp             |   35 +
 .../src/fwStructuralPatch/creator/autoload.cpp     |   41 +
 .../creator/fwMedData/ActivitySeries1.cpp          |   55 +
 .../creator/fwMedData/Equipment1.cpp               |   56 +
 .../creator/fwMedData/ImageSeries1.cpp             |   52 +
 .../creator/fwMedData/ModelSeries1.cpp             |   53 +
 .../creator/fwMedData/Patient1.cpp                 |   57 +
 .../creator/fwMedData/Series1.cpp                  |   65 +
 .../fwStructuralPatch/creator/fwMedData/Study1.cpp |   57 +
 .../Acquisition/V1ToFwMedDataImageSeriesV1.cpp     |  135 ++
 .../fwData/Patient/V1ToFwMedDataPatientV1.cpp      |   98 +
 .../fwData/Reconstruction/V1ToV2.cpp               |   78 +
 .../fwData/Study/V1ToFwMedDataStudyV1.cpp          |   75 +
 SrcLib/patch/fwStructuralPatch/test/CMakeLists.txt |   10 +
 .../patch/fwStructuralPatch/test/Properties.cmake  |    7 +
 .../patch/fwStructuralPatch/test/cppunit.options   |   25 +
 .../creator/fwMedData/ActivitySeries1Test.hpp      |   44 +
 .../include/creator/fwMedData/Equipment1Test.hpp   |   42 +
 .../include/creator/fwMedData/ImageSeries1Test.hpp |   44 +
 .../include/creator/fwMedData/ModelSeries1Test.hpp |   44 +
 .../tu/include/creator/fwMedData/Patient1Test.hpp  |   43 +
 .../tu/include/creator/fwMedData/Series1Test.hpp   |   44 +
 .../tu/include/creator/fwMedData/Study1Test.hpp    |   43 +
 .../Acquisition/V1ToFwMedDataImageSeriesV1Test.hpp |   42 +
 .../fwData/Patient/V1ToFwMedDataPatientV1Test.hpp  |   42 +
 .../include/fwData/Reconstruction/V1ToV2Test.hpp   |   44 +
 .../fwData/Study/V1ToFwMedDataStudyV1Test.hpp      |   42 +
 .../src/creator/fwMedData/ActivitySeries1Test.cpp  |   95 +
 .../tu/src/creator/fwMedData/Equipment1Test.cpp    |   93 +
 .../tu/src/creator/fwMedData/ImageSeries1Test.cpp  |   92 +
 .../tu/src/creator/fwMedData/ModelSeries1Test.cpp  |   92 +
 .../test/tu/src/creator/fwMedData/Patient1Test.cpp |   94 +
 .../test/tu/src/creator/fwMedData/Series1Test.cpp  |  101 +
 .../test/tu/src/creator/fwMedData/Study1Test.cpp   |   99 +
 .../Acquisition/V1ToFwMedDataImageSeriesV1Test.cpp |  154 ++
 .../fwData/Patient/V1ToFwMedDataPatientV1Test.cpp  |  113 ++
 .../tu/src/fwData/Reconstruction/V1ToV2Test.cpp    |  120 ++
 .../src/fwData/Study/V1ToFwMedDataStudyV1Test.cpp  |  117 ++
 SrcLib/tests/fwTest/CMakeLists.txt                 |   16 +
 SrcLib/tests/fwTest/COPYING                        |  675 +++++++
 SrcLib/tests/fwTest/COPYING.LESSER                 |  166 ++
 SrcLib/tests/fwTest/Properties.cmake               |    7 +
 SrcLib/tests/fwTest/bin/build.options              |   11 +
 SrcLib/tests/fwTest/include/fwTest/Data.hpp        |   29 +
 .../fwTest/include/fwTest/DicomReaderTest.hpp      |   46 +
 SrcLib/tests/fwTest/include/fwTest/Exception.hpp   |   32 +
 SrcLib/tests/fwTest/include/fwTest/File.hpp        |   27 +
 SrcLib/tests/fwTest/include/fwTest/config.hpp      |   41 +
 .../fwTest/include/fwTest/generator/Image.hpp      |   71 +
 .../tests/fwTest/include/fwTest/generator/Mesh.hpp |  111 +
 .../fwTest/include/fwTest/generator/Object.hpp     |   95 +
 .../fwTest/include/fwTest/generator/SeriesDB.hpp   |   96 +
 .../tests/fwTest/include/fwTest/helper/Thread.hpp  |   88 +
 .../tests/fwTest/include/fwTest/helper/compare.hpp |   28 +
 SrcLib/tests/fwTest/src/fwTest/Data.cpp            |   47 +
 SrcLib/tests/fwTest/src/fwTest/DicomReaderTest.cpp |  233 +++
 SrcLib/tests/fwTest/src/fwTest/Exception.cpp       |   20 +
 SrcLib/tests/fwTest/src/fwTest/File.cpp            |   47 +
 SrcLib/tests/fwTest/src/fwTest/generator/Image.cpp |  111 +
 SrcLib/tests/fwTest/src/fwTest/generator/Mesh.cpp  |  255 +++
 .../tests/fwTest/src/fwTest/generator/Object.cpp   |  399 ++++
 .../tests/fwTest/src/fwTest/generator/SeriesDB.cpp |  250 +++
 SrcLib/tests/fwTest/src/fwTest/helper/Thread.cpp   |   68 +
 SrcLib/tests/fwTest/src/fwTest/helper/compare.cpp  |   39 +
 SrcLib/tests/fwTest/src/fwTest/initialisation.cpp  |   57 +
 SrcLib/tests/fwTest/test/CMakeLists.txt            |   10 +
 SrcLib/tests/fwTest/test/Properties.cmake          |    7 +
 SrcLib/tests/fwTest/test/cppunit.options           |   15 +
 SrcLib/tests/fwTest/test/tu/include/ImageTest.hpp  |   51 +
 .../tests/fwTest/test/tu/include/SeriesDBTest.hpp  |   41 +
 SrcLib/tests/fwTest/test/tu/src/ImageTest.cpp      |  172 ++
 SrcLib/tests/fwTest/test/tu/src/SeriesDBTest.cpp   |  140 ++
 SrcLib/visu/fwRenderVTK/CMakeLists.txt             |   24 +
 SrcLib/visu/fwRenderVTK/COPYING                    |  675 +++++++
 SrcLib/visu/fwRenderVTK/COPYING.LESSER             |  166 ++
 SrcLib/visu/fwRenderVTK/Properties.cmake           |    7 +
 SrcLib/visu/fwRenderVTK/bin/build.options          |   20 +
 .../include/fwRenderVTK/IVtkAdaptorService.hpp     |  161 ++
 .../IVtkRenderWindowInteractorManager.hpp          |   91 +
 .../fwRenderVTK/include/fwRenderVTK/Namespace.hpp  |   20 +
 .../include/fwRenderVTK/VtkRenderService.hpp       |  198 ++
 .../fwRenderVTK/include/fwRenderVTK/config.hpp     |   41 +
 .../include/fwRenderVTK/factory/namespace.hpp      |   27 +
 .../include/fwRenderVTK/factory/new.hpp            |   59 +
 .../include/fwRenderVTK/registry/detail.hpp        |   37 +
 .../include/fwRenderVTK/registry/macros.hpp        |   27 +
 .../include/fwRenderVTK/registry/namespace.hpp     |   27 +
 .../include/fwRenderVTK/vtk/Helpers.hpp            |   31 +
 .../include/fwRenderVTK/vtk/Instantiator.hpp       |   22 +
 .../fwRenderVTK/vtk/InteractorStyle2DForNegato.hpp |   56 +
 .../fwRenderVTK/vtk/InteractorStyle3DForNegato.hpp |   60 +
 .../vtk/MarkedSphereHandleRepresentation.hpp       |   84 +
 .../include/fwRenderVTK/vtk/Namespace.hpp          |   24 +
 .../fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp     |  105 +
 .../include/fwRenderVTK/vtk/fwVtkCellPicker.hpp    |   93 +
 .../include/fwRenderVTK/vtk/fwVtkPicker.hpp        |   96 +
 .../vtk/fwVtkWindowLevelLookupTable.hpp            |   97 +
 .../src/fwRenderVTK/IVtkAdaptorService.cpp         |  375 ++++
 .../IVtkRenderWindowInteractorManager.cpp          |   42 +
 .../src/fwRenderVTK/VtkRenderService.cpp           |  554 +++++
 .../fwRenderVTK/src/fwRenderVTK/factory/new.cpp    |   26 +
 .../src/fwRenderVTK/registry/detail.cpp            |   30 +
 .../fwRenderVTK/src/fwRenderVTK/vtk/Helpers.cpp    |  139 ++
 .../src/fwRenderVTK/vtk/Instantiator.cpp           |   64 +
 .../fwRenderVTK/vtk/InteractorStyle2DForNegato.cpp |  276 +++
 .../fwRenderVTK/vtk/InteractorStyle3DForNegato.cpp |  407 ++++
 .../vtk/MarkedSphereHandleRepresentation.cpp       |  193 ++
 .../src/fwRenderVTK/vtk/fwVtkBoxRepresentation.cpp |  163 ++
 .../src/fwRenderVTK/vtk/fwVtkCellPicker.cpp        |  241 +++
 .../src/fwRenderVTK/vtk/fwVtkPicker.cpp            |  707 +++++++
 .../vtk/fwVtkWindowLevelLookupTable.cpp            |  631 ++++++
 .../fwRenderVTK/src/fwRenderVTK/vtklogging.cpp     |   77 +
 Utilities/VersionGenerator/bin/build.options       |   11 +
 Utilities/VersionGenerator/src/main.cpp            |   75 +
 launcher/CMakeLists.txt                            |    6 +
 launcher/COPYING                                   |  675 +++++++
 launcher/COPYING.LESSER                            |  166 ++
 launcher/Properties.cmake                          |    7 +
 launcher/bin/build.options                         |    7 +
 launcher/bin/vc/fw4spl.ico                         |  Bin 0 -> 136606 bytes
 launcher/bin/vc/launcher.rc                        |    3 +
 launcher/src/ProfileRunner.cpp                     |  342 ++++
 3580 files changed, 385198 insertions(+)

diff --git a/.hgignore b/.hgignore
new file mode 100644
index 0000000..a3c6248
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1,9 @@
+# use glob syntax.
+syntax: glob
+# vim swap file
+*.swp
+# eclipse stuff
+*.cproject
+*.project
+*.pyc
+*.pyo
diff --git a/.hgtags b/.hgtags
new file mode 100644
index 0000000..350ed82
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1,99 @@
+8b2fab86afa36b6be67b95c40d9580e7efb9842a fw4spl_0.4
+f3dad8e5c26f18c1ed450b73e829a6e4b86f4b27 fw4spl_0.5.0
+f3dad8e5c26f18c1ed450b73e829a6e4b86f4b27 fw4spl_0.5.0
+0000000000000000000000000000000000000000 fw4spl_0.5.0
+0000000000000000000000000000000000000000 fw4spl_0.5.0
+a2c98d22c36d6997b1b191a1610af97b41a4677a fw4spl_0.5.0
+f293a4a4fc6c976beeca6afd4f6280baab2f2e29 experimental_0.1.0
+7ecb860582b3d6a7f7b72d6464b27f88827f1f16 fw4spl_0.5.1
+cab8f119d12758e8e2463e6644e88b73203ce76a fw4spl_0.5.2
+cab8f119d12758e8e2463e6644e88b73203ce76a fw4spl_0.5.2
+0000000000000000000000000000000000000000 fw4spl_0.5.2
+0000000000000000000000000000000000000000 fw4spl_0.5.2
+5fb2251fcd8fc54b893d8712fcffba948cd828c7 fw4spl_0.5.2
+c9e6b411509616545ccbc77a89c984bcc0be9d3e fw4spl_0.6.0.1
+609b8ee1efb1ec9cd81c908618638ce0e3ea4d8d fw4spl_0.6.0.2
+ebaabb5ee69cf9102e02fd5b9e8360f4dc5431b0 fw4spl_0.6.0.3
+e77bb50c682d1d16b561664c59f708273fa0ac1a fw4spl_0.6.1.0
+ccf798d2db242d3cdce789eca8d01a983c15e5bf fw4spl_0.6.0.4
+e5a1535ef50b9a3612d4f9bd99f97075044c9aed fw4spl_0.6.2.0
+6a82531491adb0497b5c1e7ee79830acb1cbed7a experimentalFwServices_0.1.0
+f1f79477e215f19b36a2f541a5fe10f686bf5819 fw4spl_0.6.3.0
+6a24af6f58cf43f2e841c1c573010ae589815c17 fw4spl_0.6.2.1
+def4b0536a1d5185802fcc41bdd50cdb4d2aedea multiGui_0
+2e75de46941fe3a174c9c989012f908a0cede8df fw4spl_0.7.0.1
+ad546fca30f7b909ece47370b09f985d96a47d93 fw4spl_0.7.0.2
+6e58fe91fc96b22046cd540a6dd943899e240876 fw4spl_0.7.0.3
+e8368078bbe002be374084bcefa5c77fe90e53d4 fw4spl_0.7.0.4
+3442b53e2597c61f7d9bc6db83a2e72d2124f217 fw4spl_0.6.2.2
+2a3461ccce6894b20cc0f97779351ad9d015036b fw4spl_0.6.3.1
+1382cac10cadf93c0ce076947b86a38ec64281ca multiGui_1
+008d8f10cfffb38dc45a5e98d2a06c62169fa6e8 fw4spl_0.7.0.5
+0000000000000000000000000000000000000000 fw4spl_0.7.2
+ee7c147c1129220550c242ab3025d94f83126e22 fw4spl_0.7.2
+ee7c147c1129220550c242ab3025d94f83126e22 fw4spl_0.7.2
+0000000000000000000000000000000000000000 fw4spl_0.7.2
+ee7c147c1129220550c242ab3025d94f83126e22 fw4spl_0.7.1.0
+bf0d810ec11a8029092f0eb2fd2bd82683fc8c76 fw4spl_0.7.0.6
+4db7221bdcc70102cf47a76339b4722bc8ae8fed fw4spl_0.7.1.1
+6ab46e87343a2e8b0cabe503555849eadfc8f1d9 workshop-tw-2010.0
+16a7298093989a9098532eacff8c1b9137a3bebf fw4spl_0.7.1.2
+bd63b3f2a358532f3125ecd81e251c43577ef2fc fw4spl_0.7.2.0
+2a406b961c1d19f72576c28cb3387f015691826c fw4spl_0.7.3.0
+2652be53eebb509e7038f189e888f49429871033 fw4spl_0.7.3.1
+092e63003b56f33553ff9e1f179e3fcde68dead7 fw4spl_0.7.2.1
+c395bf56eb88c86d3bc907ed8d3c156c68082be0 fw4spl_0.7.3.2
+1c2286f1f945334bd8dfeb1e6dcb11ee2643cc28 fw4spl_0.7.3.3
+764af7bd3feae6c56044a8f3e363fbd86487c86a fw4spl_0.7.4.0
+e5e23c1f1eed3e6bb8f5db4611537715ecad603f fw4spl_0.7.4.1
+ba4dc4b00464e871bc759ec6f9fd4ca6d00189d7 fw4spl_0.7.2.2
+8d54571bdebfb585c03980a05a3cc6bad3ff240e fw4spl_0.7.3.4
+000bcce040f45262bb02af97b7e026af0c024c95 fw4spl_0.7.4.2
+a671d3636b2ecccfdd698eac65b0ed5c70bce131 fw4spl_0.7.5.0
+2e68938b619d1955ae1a1bc03a8e50eb2d735998 fw4spl_0.7.6.0
+35b4bbfc7842e9d270238fb2623a5f07a5370545 fw4spl_0.7.5.1
+35880468ccaedb2ebc2d48f50b5bccd0177a9697 fw4spl_0.7.6.1
+4622bc6b6eae64876406af4b3778394c6c2b5708 fw4spl_0.7.4.3
+640135ac2d04cf7424a61c21dea082cfa2ebaf7a fw4spl_0.7.6.2
+507b0dcd6d29e3d71f73035c6c5c47c34aa77c14 fw4spl_0.7.6.3
+fbd10e84e11fc322b0b723231f071da01bd76c66 fw4spl_0.7.7.0
+ff9578023e08c339d572acc3c1f4ec93705fdd03 fw4spl_0.7.7.1
+149e15137145f73be4834afca24f28e9a00164db fw4spl_0.7.7.2
+66c56c74973493d8ec436396cb096d123dde5620 fw4spl_0.7.8.0
+226ce8a2bd53b8dfd2cf99f0a3c16fdb13a100c5 fw4spl_0.7.8.1
+3d7f87f1a902299bafdc5ee6368378b318fe6ff6 fw4spl_0.7.9.0
+7580521d31d1dfdcc24d381051dd8102e17f500b fw4spl_0.8.0.0
+9fb39a40f2af066df4caf9ab70fb7ea68d37e336 fw4spl_0.7.9.1
+8f8aa49d1ed6f2f087b36a5d93f3f34c8cb5db30 fw4spl_0.7.7.3
+252086a2aa3b6db977144149859d6429cb0c7173 fw4spl_0.7.9.2
+252086a2aa3b6db977144149859d6429cb0c7173 fw4spl_0.7.9.2
+0000000000000000000000000000000000000000 fw4spl_0.7.9.2
+0000000000000000000000000000000000000000 fw4spl_0.7.9.2
+0afad68f7cd18077fcdb918eeb9dc60058ec9919 fw4spl_0.7.9.2
+e3d9b6ebc65a64dac70913bcf04db2ff0b4abb98 fw4spl_0.7.9.3
+e3d9b6ebc65a64dac70913bcf04db2ff0b4abb98 fw4spl_0.7.9.3
+1eceb79a30a48e1e2b1c407396a21529e8c9f67e fw4spl_0.7.9.3
+7240b1b6caeef6495e0aef0804b2be90564df949 fw4spl_0.7.9.4
+b819a6c88f10179257c4925a52aed2beec4eea67 fw4spl_0.8.1.0
+464981214c828dca362904e441fb89bf0bf3d7c4 fw4spl_0.8.1.1
+b5624619302209b9b537aed32a00ea960f764785 fw4spl_0.8.2.0
+024e68b31b72a99954fce6aca69bf8e0e8cf66cd fw4spl_0.7.9.5
+c98ad90e5a50adb86715bed8492d8ad79487ca17 fw4spl_0.8.1.2
+adff1ce9402e557a42d62d14d11b9b74c20d2c63 fw4spl_0.8.2.1
+e4ce8e4de1a22c18065f695cf2497a686b35e29a fw4spl_0.8.3.0
+9683c5f861cd3cec20b0e2b36c37a8ee88ac2825 fw4spl_0.7.9.6
+88be7514f2a36babe5a09462439a222030c1a690 fw4spl_0.8.2.2
+3b1e8e0811584b4d7b8190c54b3b14431582c134 fw4spl_0.8.3.1
+d5c427efd66d0f6675e298c86715e3fe9248cc0a fw4spl_0.8.2.3
+9683c5f861cd3cec20b0e2b36c37a8ee88ac2825 fw4spl_0.7.9.6
+488f8d22d7ba07fcd3c01b96bdbcb83cad130aec fw4spl_0.7.9.6
+d5c427efd66d0f6675e298c86715e3fe9248cc0a fw4spl_0.8.2.3
+cb23e8679d949f9c2ccd7982bfc954ba831ad219 fw4spl_0.8.2.3
+d465b66e24b7cb16b7cb5768923d9fac86fe8791 fw4spl_0.8.3.2
+efeff33fc51015bd0c4d67297b1fed95e84ffaa5 fw4spl_0.8.3.3
+51dbe3c236ba4872f3e5bf96d0be8347c923de32 fw4spl_0.8.3.4
+800d983e47e99282769fd4aaab07cc8f01b265a8 fw4spl_0.9.1.2
+31603bebba81901fb97a03cdfcd0ddc59b23e9e2 fw4spl_0.9.1.3
+703c9bb53338123eee50bab5b04338789d9c2170 fw4spl_0.9.1.4
+8bb2e274c775054c05da99ef0c7ef7b16d21dcc9 fw4spl_0.9.2.1
+5e86a1491c1c2f060c9a33a1bdd850515c3eecaf fw4spl_0.9.2.2
\ No newline at end of file
diff --git a/Apps/Tuto01Basic/CMakeLists.txt b/Apps/Tuto01Basic/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto01Basic/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto01Basic/COPYING b/Apps/Tuto01Basic/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto01Basic/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto01Basic/COPYING.LESSER b/Apps/Tuto01Basic/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto01Basic/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto01Basic/Properties.cmake b/Apps/Tuto01Basic/Properties.cmake
new file mode 100644
index 0000000..8432fdf
--- /dev/null
+++ b/Apps/Tuto01Basic/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto01Basic )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io appXml gui guiQt dataReg servicesReg launcher )
+
diff --git a/Apps/Tuto01Basic/bin/build.options b/Apps/Tuto01Basic/bin/build.options
new file mode 100644
index 0000000..07fc144
--- /dev/null
+++ b/Apps/Tuto01Basic/bin/build.options
@@ -0,0 +1,13 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [ 
+    'io_0-1'                ,
+    'appXml_0-1'            ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'launcher_0-1'          ,
+ ]
+
+
diff --git a/Apps/Tuto01Basic/rc/plugin.xml b/Apps/Tuto01Basic/rc/plugin.xml
new file mode 100644
index 0000000..ecef865
--- /dev/null
+++ b/Apps/Tuto01Basic/rc/plugin.xml
@@ -0,0 +1,27 @@
+
+<plugin id="Tuto01Basic">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoBasicConfig</id>
+        <type>parameters</type>
+        <config>
+            <object type="::fwData::Image">
+
+                <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>tutoBasicApplicationName</name>
+                            <icon>Bundles/Tuto01Basic_0-1/tuto.ico</icon>
+                            <minSize width="800" height="600" />
+                        </frame>
+                    </gui>
+                </service>
+
+                <start uid="myFrame" />
+
+            </object>
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto01Basic/rc/profile.xml b/Apps/Tuto01Basic/rc/profile.xml
new file mode 100644
index 0000000..bdf3702
--- /dev/null
+++ b/Apps/Tuto01Basic/rc/profile.xml
@@ -0,0 +1,16 @@
+<profile name="tutoBasicName" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="gui" version="0-1" />
+    <activate id="Tuto01Basic" />
+    <activate id="guiQt" version="0-1" />
+    
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoBasicConfig" />
+    </activate>
+
+    <start id="appXml" />
+    <start id="guiQt" />
+    
+</profile>
diff --git a/Apps/Tuto01Basic/rc/tuto.ico b/Apps/Tuto01Basic/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto01Basic/rc/tuto.ico differ
diff --git a/Apps/Tuto02DataServiceBasic/CMakeLists.txt b/Apps/Tuto02DataServiceBasic/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto02DataServiceBasic/COPYING b/Apps/Tuto02DataServiceBasic/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto02DataServiceBasic/COPYING.LESSER b/Apps/Tuto02DataServiceBasic/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto02DataServiceBasic/Properties.cmake b/Apps/Tuto02DataServiceBasic/Properties.cmake
new file mode 100644
index 0000000..b18e8c0
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto02DataServiceBasic )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io appXml gui guiQt dataReg servicesReg launcher visu visuVTKQt ioData ioVTK vtkSimpleNegato )
+
diff --git a/Apps/Tuto02DataServiceBasic/bin/build.options b/Apps/Tuto02DataServiceBasic/bin/build.options
new file mode 100755
index 0000000..6f21e04
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/bin/build.options
@@ -0,0 +1,19 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'appXml_0-1'            ,
+ ]
+
+
diff --git a/Apps/Tuto02DataServiceBasic/rc/plugin.xml b/Apps/Tuto02DataServiceBasic/rc/plugin.xml
new file mode 100644
index 0000000..b9cdadf
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/rc/plugin.xml
@@ -0,0 +1,68 @@
+<plugin id="Tuto02DataServiceBasic">
+
+<requirement id="servicesReg" />
+
+<extension implements="::fwServices::registry::AppConfig">
+        <id>tutoDataServiceBasicConfig</id>
+        <type>parameters</type>
+        <config>
+        
+
+    <!-- In tutoDataServiceBasic, the central data  object is a ::fwData::Image type.-->
+    <object type="::fwData::Image">
+
+        <!-- Reading service. Here, the service unique identifier (uid) is set to the myReaderPathFile value.
+        In this tutorial, this service does not need to receive information about its linked data. Therefore the autoConnect is set to no.
+        We are going to see in detail the use of communications in the tutoComChannel tutorial.
+        Furthermore, in the filename tag, an attribut (id) allows also to clarify the location of the 3D medical image file. 
+        In our case, the image must be stored in the MyInstallDir directory, in a sub-directory named TutoData.
+--> 
+        <service impl="::ioVTK::ImageReaderService" type="::io::IReader" uid="myReaderPathFile" autoConnect="no" >
+            <file>./TutoData/patient1.vtk</file>
+        </service>
+     
+        <!-- Visualization service of a 3D medical image.
+        Here, the value of the service unique identifier (uid) is myRenderingTuto.
+        In our tutorial, this service needs to receive information about its linked data,
+        indeed, it has to receive a message when the image is effectively loaded. Therefore, the autoConnect value is fixed to yes.
+        Furthermore, a guiContainerId attribut is also associated to the service.-->
+        <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="myRenderingTuto" autoConnect="yes" />
+        
+        <!-- Description service of the HMI.
+        Here, the container will be used by the 3D visualization service previously described. 
+        The ::gui::frame::MainFrame service automaticly positions the different containers in the application main window.
+        In our tutorial, this service does not need to receive information about its linked data. Therefore the autoConnect is set to no.
+        Remember we will see in details the use of communications in the tutoComChannel tutorial.-->
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>tutoDataServiceBasic</name>
+                    <icon>Bundles/Tuto02DataServiceBasic_0-1/tuto.ico</icon>
+                    <minSize width="800" height="600" />
+                </frame>
+            </gui>
+            <registry>
+                <view sid="myRenderingTuto" start="yes" />
+            </registry>
+        </service>
+        
+        <!-- Definition of the starting and closing order of the different services.
+        Here, the three services ::fwGui::IFrameSrv, and myReaderPathFile are started,
+        nevertheless, only the myReaderPathFile service is updated after the launching.
+        Indeed, as the image location is known (contained in the configuration file),
+        the image can be loaded since the application starting. It corresponds to the update flag for myReaderPathFile.
+        The HMI service must be started first, then the rendering service, and finaly the reading service.
+        The stopping of the services is done in the reverse order compared to the starting one.
+-->
+        
+        <start uid="myFrame" />
+        <start uid="myReaderPathFile"/>
+
+        <update uid="myReaderPathFile"/>
+
+    </object>
+
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/Tuto02DataServiceBasic/rc/profile.xml b/Apps/Tuto02DataServiceBasic/rc/profile.xml
new file mode 100644
index 0000000..683b633
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasic/rc/profile.xml
@@ -0,0 +1,33 @@
+<profile name="tutoDataServiceBasic" version="0.1">
+    <!-- List of the basic bundles having to be loaded to launch the application. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <!-- The visu bundle (visualization) is needed to use the vtkSimpleNegato bundle. -->
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto02DataServiceBasic" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoDataServiceBasicConfig" />
+    </activate>
+
+
+    <!-- List of the specific bundles that need to be loaded in this application context. -->
+    <!-- The ioVTK bundle (input output VTK) is a set of writing and reading services using the VTK library. -->
+    <activate id="ioVTK" version="0-1" />
+    <!-- The vtkSimpleNegato bundle contains the visualization service of medical images using the VTK library. -->
+    <activate id="vtkSimpleNegato" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+
+</profile>
diff --git a/Apps/Tuto02DataServiceBasic/rc/tuto.ico b/Apps/Tuto02DataServiceBasic/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto02DataServiceBasic/rc/tuto.ico differ
diff --git a/Apps/Tuto02DataServiceBasicCtrl/CMakeLists.txt b/Apps/Tuto02DataServiceBasicCtrl/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto02DataServiceBasicCtrl/COPYING b/Apps/Tuto02DataServiceBasicCtrl/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto02DataServiceBasicCtrl/COPYING.LESSER b/Apps/Tuto02DataServiceBasicCtrl/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto02DataServiceBasicCtrl/Properties.cmake b/Apps/Tuto02DataServiceBasicCtrl/Properties.cmake
new file mode 100644
index 0000000..da27396
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto02DataServiceBasicCtrl )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwData fwServices fwCom fwRuntime )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt ioData ioVTK vtkSimpleNegato launcher )
+
diff --git a/Apps/Tuto02DataServiceBasicCtrl/bin/build.options b/Apps/Tuto02DataServiceBasicCtrl/bin/build.options
new file mode 100644
index 0000000..666f513
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [ 
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+ ]
+
+LIB = [
+    'fwData_0-1'        ,
+    'fwServices_0-1'    ,
+    'fwCom_0-1'         ,
+    'fwRuntime_0-3'     ,
+ ]
diff --git a/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Namespace.hpp b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Namespace.hpp
new file mode 100644
index 0000000..13ebce2
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __TUTO02DATASERVICEBASICCTRL_NAMESPACE_HPP__
+#define __TUTO02DATASERVICEBASICCTRL_NAMESPACE_HPP__
+
+/**
+ * @brief      The namespace tuto02DataServiceBasicCtrl.
+ * @namespace  tuto02DataServiceBasicCtrl
+ * 
+ * @date       2009-2010.
+ */
+namespace tuto02DataServiceBasicCtrl
+{
+
+}
+#endif /* __TUTO02DATASERVICEBASICCTRL_NAMESPACE_HPP__ */
diff --git a/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Plugin.hpp b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Plugin.hpp
new file mode 100644
index 0000000..b4b2f22
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/Plugin.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTO02DATASERVICEBASICCTRL_PLUGIN_HPP_
+#define _TUTO02DATASERVICEBASICCTRL_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include <fwCom/Connection.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "tuto02DataServiceBasicCtrl/config.hpp"
+
+namespace tuto02DataServiceBasicCtrl
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+class TUTO02DATASERVICEBASICCTRL_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /// Constructor.
+    TUTO02DATASERVICEBASICCTRL_API Plugin() throw();
+
+    /// Destructor. Do nothing.
+    TUTO02DATASERVICEBASICCTRL_API ~Plugin() throw();
+
+    /// Overrides start method. .
+    TUTO02DATASERVICEBASICCTRL_API void start() throw(::fwRuntime::RuntimeException);
+
+    /// Overrides stop method. Do nothing
+    TUTO02DATASERVICEBASICCTRL_API void stop() throw();
+
+    TUTO02DATASERVICEBASICCTRL_API void initialize() throw( ::fwRuntime::RuntimeException );
+
+    TUTO02DATASERVICEBASICCTRL_API void uninitialize() throw();
+
+private:
+    ::fwData::Image::sptr m_image;
+
+    ::fwCom::Connection m_connection;
+
+    ::fwServices::IService::sptr m_frameSrv;
+    ::fwServices::IService::sptr m_renderSrv;
+    ::fwServices::IService::sptr m_readerSrv;
+};
+
+} // namespace tuto02DataServiceBasicCtrl
+
+#endif // _TUTO02DATASERVICEBASICCTRL_PLUGIN_HPP_
diff --git a/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/config.hpp b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/config.hpp
new file mode 100644
index 0000000..b499724
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/include/tuto02DataServiceBasicCtrl/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTO02DATASERVICEBASICCTRL_CONFIG_HPP_
+#define _TUTO02DATASERVICEBASICCTRL_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef TUTO02DATASERVICEBASICCTRL_EXPORTS
+    #define TUTO02DATASERVICEBASICCTRL_API __declspec(dllexport)
+    #else
+    #define TUTO02DATASERVICEBASICCTRL_API __declspec(dllimport)
+    #endif
+
+    #define TUTO02DATASERVICEBASICCTRL_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef TUTO02DATASERVICEBASICCTRL_EXPORTS
+    #define TUTO02DATASERVICEBASICCTRL_API __attribute__ ((visibility("default")))
+    #define TUTO02DATASERVICEBASICCTRL_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define TUTO02DATASERVICEBASICCTRL_API __attribute__ ((visibility("hidden")))
+    #define TUTO02DATASERVICEBASICCTRL_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define TUTO02DATASERVICEBASICCTRL_API
+    #define TUTO02DATASERVICEBASICCTRL_CLASS_API
+
+#endif
+
+#endif // _TUTO02DATASERVICEBASICCTRL_CONFIG_HPP_
diff --git a/Apps/Tuto02DataServiceBasicCtrl/rc/plugin.xml b/Apps/Tuto02DataServiceBasicCtrl/rc/plugin.xml
new file mode 100644
index 0000000..ae76972
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/rc/plugin.xml
@@ -0,0 +1,6 @@
+<plugin id="Tuto02DataServiceBasicCtrl" class="::tuto02DataServiceBasicCtrl::Plugin" >
+
+    <requirement id="servicesReg" />
+    <library name="Tuto02DataServiceBasicCtrl" />
+
+</plugin>
diff --git a/Apps/Tuto02DataServiceBasicCtrl/rc/profile.xml b/Apps/Tuto02DataServiceBasicCtrl/rc/profile.xml
new file mode 100644
index 0000000..7e553f4
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/rc/profile.xml
@@ -0,0 +1,25 @@
+<profile name="tuto02DataServiceBasicCtrl" version="0.1">
+    <!-- List of the basic bundles having to be loaded to launch the application. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="Tuto02DataServiceBasicCtrl" version="0-1" />
+    <!-- The visu bundle (visualization) is needed to use the vtkSimpleNegato bundle. -->
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <!-- List of the specific bundles that need to be loaded in this application context. -->
+    <!-- The ioVTK bundle (input output VTK) is a set of writing and reading services using the VTK library. -->
+    <activate id="ioVTK" version="0-1" />
+    <!-- The vtkSimpleNegato bundle contains the visualization service of medical images using the VTK library. -->
+    <activate id="vtkSimpleNegato" version="0-1" />
+
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="Tuto02DataServiceBasicCtrl" />
+</profile>
diff --git a/Apps/Tuto02DataServiceBasicCtrl/rc/tuto.ico b/Apps/Tuto02DataServiceBasicCtrl/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto02DataServiceBasicCtrl/rc/tuto.ico differ
diff --git a/Apps/Tuto02DataServiceBasicCtrl/src/tuto02DataServiceBasicCtrl/Plugin.cpp b/Apps/Tuto02DataServiceBasicCtrl/src/tuto02DataServiceBasicCtrl/Plugin.cpp
new file mode 100644
index 0000000..2904a0e
--- /dev/null
+++ b/Apps/Tuto02DataServiceBasicCtrl/src/tuto02DataServiceBasicCtrl/Plugin.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include "tuto02DataServiceBasicCtrl/Plugin.hpp"
+
+
+namespace tuto02DataServiceBasicCtrl
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::tuto02DataServiceBasicCtrl::Plugin");
+
+//------------------------------------------------------------------------------
+
+Plugin::Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::initialize() throw( ::fwRuntime::RuntimeException )
+{
+    m_image = ::fwData::Image::New();
+
+    // Reader service
+    m_readerSrv = ::fwServices::add(m_image, "::io::IReader", "::ioVTK::ImageReaderService");
+    ::fwServices::IService::ConfigType readerCfg;
+    readerCfg.put("service.file", "./TutoData/patient1.vtk");
+    m_readerSrv->setConfiguration( readerCfg ) ;
+    m_readerSrv->configure();
+
+    // Render service
+    m_renderSrv = ::fwServices::add(m_image, "::fwRender::IRender", "::vtkSimpleNegato::RendererService", "myRenderingTuto");
+    m_renderSrv->configure();
+
+    m_connection = m_image->signal( ::fwData::Object::s_OBJECT_MODIFIED_SIG)
+        ->connect(m_renderSrv->slot( ::fwServices::IService::s_RECEIVE_SLOT));
+
+    // Frame service
+    m_frameSrv = ::fwServices::add(m_image, "::fwGui::IFrameSrv", "::gui::frame::DefaultFrame");
+
+    ::fwServices::IService::ConfigType frameConfig;
+
+    frameConfig.put("service.gui.frame.name", "tutoDataServiceBasic");
+    frameConfig.put("service.gui.frame.icon", LIBSFW4SPL+"Bundles/Tuto02DataServiceBasicCtrl_0-1/tuto.ico");
+    frameConfig.put("service.gui.frame.minSize.<xmlattr>.width" , "800");
+    frameConfig.put("service.gui.frame.minSize.<xmlattr>.height", "600");
+
+    frameConfig.put("service.registry.view.<xmlattr>.sid"  , "myRenderingTuto");
+    frameConfig.put("service.registry.view.<xmlattr>.start", "yes");
+
+    m_frameSrv->setConfiguration( frameConfig ) ;
+    m_frameSrv->configure();
+
+    // Start app
+    m_readerSrv->start();
+    m_frameSrv->start();
+
+    m_readerSrv->update();
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::uninitialize() throw()
+{
+    m_connection.disconnect();
+    m_readerSrv->stop();
+    m_frameSrv->stop();
+    ::fwServices::OSR::unregisterService( m_readerSrv ) ;
+    ::fwServices::OSR::unregisterService( m_frameSrv ) ;
+    ::fwServices::OSR::unregisterService( m_renderSrv ) ;
+    m_image.reset();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace tuto02DataServiceBasicCtrl
diff --git a/Apps/Tuto03DataService/CMakeLists.txt b/Apps/Tuto03DataService/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto03DataService/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto03DataService/COPYING b/Apps/Tuto03DataService/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto03DataService/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto03DataService/COPYING.LESSER b/Apps/Tuto03DataService/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto03DataService/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto03DataService/Properties.cmake b/Apps/Tuto03DataService/Properties.cmake
new file mode 100644
index 0000000..a17d3b8
--- /dev/null
+++ b/Apps/Tuto03DataService/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto03DataService )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato uiIO appXml )
+
diff --git a/Apps/Tuto03DataService/bin/build.options b/Apps/Tuto03DataService/bin/build.options
new file mode 100755
index 0000000..0ebc2ea
--- /dev/null
+++ b/Apps/Tuto03DataService/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'uiIO_0-1'              ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto03DataService/rc/plugin.xml b/Apps/Tuto03DataService/rc/plugin.xml
new file mode 100644
index 0000000..9a0724e
--- /dev/null
+++ b/Apps/Tuto03DataService/rc/plugin.xml
@@ -0,0 +1,100 @@
+
+<plugin id="Tuto03DataService">
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoDataServiceConfig</id>
+        <type>parameters</type>
+        <config>
+
+
+        <!-- The root data object in tutoDataService is a ::fwData::Image. -->
+        <object type="::fwData::Image">
+
+
+                <!-- Graphical user interface manager.
+        In the tag <menus> we specify the identifiers of different services for the different menus.
+        In this tutorial, only one service (::gui::aspect::IMenu type) is created,
+        since the application's only one menu. The unique identifier (uid) of this service is "menu_file",
+        it's an FW4SPL identifier. -->
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>tutoDataService</name>
+                    <icon>Bundles/Tuto03DataService_0-1/tuto.ico</icon>
+                    <minSize width="800" height="600" />
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="myRenderingTuto" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="myMenu" start="yes" />
+            </registry>
+        </service>
+
+        <!-- The ::gui::aspect::DefaultMenuSrv service manage the menu creates the menu "File". This menu contains two menuItems (with a separator).
+        The actions associated with these two menuItem are identified with the uid "action_openFile" and "action_quit".
+        -->
+        <service uid="myMenu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open file" shortcut="Ctrl+O" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openFile" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <!-- The first service (::gui::action::StarterActionService) is a generic action. In the configuration of this service,
+        we specify the id of the services to be started and updated (start and update methods) when user click on the menuItem "OpenFile".
+        In this tutorial, ::gui::action::StarterActionService service starts and updates the service with the uid "myReaderPathFile". -->
+        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no" >
+            <start uid="myReaderPathFile"/>
+        </service>
+        <!-- The second service (::gui::action::QuitAction) is a generic action that will close the application
+        when the user click on the menuItem "Quit".
+        It's possible to associate with this kind of service (::gui::action::IAction) specific attributes to configure their style, shortcut... 
+        (Note:
+               In this tutorial, there is an attribute specialAction with the value "QUIT". On MS Windows, there's no impact.
+               But on Mac OS, this value installs the menuItem in the system menu bar,
+               and on Linux this value installs the default 'Quit' system icon in the menuItem.)    
+               The attribute "shortcut" is set with the value "Ctrl+Q" to close the application with this specific shortcut. -->
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+        <!-- The service ::uiIO::editor::IOSelectorService is started (start and update methods) by the service ::gui::action::StarterActionService. 
+        Indeed, the uid of the service ::uiIO::editor::IOSelectorService is the same as the uid 
+        defined in the service configuration ::gui::action::StarterActionService ( "myReaderPathFile").
+        This service lists all services available to read a data image and
+        it displays a dialog box to select the appropriate service.
+        (Note: 
+              if there is only one reading service, it's directly selected without dialog box.)
+        When the service was chosen, it is started by the ::uiIO::editor::IOSelectorService service. -->
+        <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor"  autoConnect="no" />
+
+        <!-- This service (::vtkSimpleNegato::RendererService) is a 3D visualization service of medical images. -->
+        <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="myRenderingTuto" autoConnect="yes" />
+
+        <start uid="myFrame" />
+
+    </object>
+
+
+</config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto03DataService/rc/profile.xml b/Apps/Tuto03DataService/rc/profile.xml
new file mode 100644
index 0000000..5682409
--- /dev/null
+++ b/Apps/Tuto03DataService/rc/profile.xml
@@ -0,0 +1,29 @@
+<profile name="tutoDataService" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoDataServiceConfig" />
+    </activate>
+
+    <!-- List of specific bundles. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+
+    <activate id="Tuto03DataService" />
+
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+</profile>
diff --git a/Apps/Tuto03DataService/rc/tuto.ico b/Apps/Tuto03DataService/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto03DataService/rc/tuto.ico differ
diff --git a/Apps/Tuto03DataServiceBis/CMakeLists.txt b/Apps/Tuto03DataServiceBis/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto03DataServiceBis/COPYING b/Apps/Tuto03DataServiceBis/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto03DataServiceBis/COPYING.LESSER b/Apps/Tuto03DataServiceBis/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto03DataServiceBis/Properties.cmake b/Apps/Tuto03DataServiceBis/Properties.cmake
new file mode 100644
index 0000000..f3a4c4a
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto03DataServiceBis )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleMesh uiIO appXml )
+
diff --git a/Apps/Tuto03DataServiceBis/bin/build.options b/Apps/Tuto03DataServiceBis/bin/build.options
new file mode 100755
index 0000000..2877574
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleMesh_0-1'     ,
+    'uiIO_0-1'              ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto03DataServiceBis/rc/plugin.xml b/Apps/Tuto03DataServiceBis/rc/plugin.xml
new file mode 100644
index 0000000..504d863
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/rc/plugin.xml
@@ -0,0 +1,103 @@
+<plugin id="Tuto03DataServiceBis">
+
+<requirement id="servicesReg" />
+    
+<extension implements="::fwServices::registry::AppConfig">
+        <id>tutoDataServiceConfig</id>
+        <type>parameters</type>
+        <config>
+        
+
+    <!-- The root data object in tutoDataService is a ::fwData::Mesh. -->
+    <object type="::fwData::Mesh">
+
+
+        <!-- Graphical user interface manager.
+        In the tag <menus> we specify the identifiers of different services for the different menus.
+        In this tutorial, only one service (::gui::aspect::IMenu type) is created,
+        since the application's only one menu. The unique identifier (uid) of this service is "menu_file",
+        it's an FW4SPL identifier. -->
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>tutoDataService bis</name>
+                    <icon>Bundles/Tuto03DataServiceBis_0-1/tuto.ico</icon>
+                    <minSize width="800" height="600" />
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="myRenderingTuto" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                     <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+        
+        <!-- The ::gui::aspect::DefaultMenu service creates the menu "File". This menu contains two menuItems (with a separator).
+        The actions associated with these two menuItem are identified with the uid "action_openFile" and "action_quit". -->
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open file" shortcut="Ctrl+O" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openFile" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <!-- The first service (::gui::action::StarterActionService) is a generic action. In the configuration of this service,
+        we specify the id of the services to be started and updated (start and update methods) when user click on the menuItem "OpenFile".
+        In this tutorial, ::gui::action::StarterActionService service starts and updates the service with the uid "myReaderPathFile". -->
+        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no" >
+            <start uid="myReaderPathFile"/>
+        </service>
+        <!-- The second service (::gui::action::QuitAction) is a generic action that will close the application
+        when the user click on the menuItem "Quit".
+        It's possible to associate with this kind of service (::gui::action::IAction) specific attributes to configure their style, shortcut... 
+        (Note:
+               In this tutorial, there is an attribute specialAction with the value "QUIT". On MS Windows, there's no impact.
+               But on Mac OS, this value installs the menuItem in the system menu bar,
+               and on Linux this value installs the default 'Quit' system icon in the menuItem.)    
+               The attribute "shortcut" is set with the value "Ctrl+Q" to close the application with this specific shortcut. -->
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+        <!-- The service ::uiIO::editor::IOSelectorService is started (start and update methods) by the service ::gui::action::StarterActionService. 
+        Indeed, the uid of the service ::uiIO::editor::IOSelectorService is the same as the uid 
+        defined in the service configuration ::gui::action::StarterActionService ( "myReaderPathFile").
+        This service lists all services available to read a data Mesh and
+        it displays a dialog box to select the appropriate service.
+        (Note: 
+              if there is only one reading service, it's directly selected without dialog box.)
+        When the service was chosen, it is started by the ::uiIO::editor::IOSelectorService service. -->
+        <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor"  autoConnect="no" />
+
+        <!-- This service (::vtkSimpleMesh::RendererService) is a 3D visualization service of medical meshes. -->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto" autoConnect="yes" >
+            <!--<win guiContainerId="900"/>-->
+        </service>
+
+        <start uid="myFrame" />
+
+        
+
+    </object>
+
+
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto03DataServiceBis/rc/profile.xml b/Apps/Tuto03DataServiceBis/rc/profile.xml
new file mode 100644
index 0000000..c14835b
--- /dev/null
+++ b/Apps/Tuto03DataServiceBis/rc/profile.xml
@@ -0,0 +1,30 @@
+<profile name="tutoDataService" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto03DataServiceBis" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoDataServiceConfig" />
+    </activate>
+
+    <!-- List of specific bundles. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto03DataServiceBis/rc/tuto.ico b/Apps/Tuto03DataServiceBis/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto03DataServiceBis/rc/tuto.ico differ
diff --git a/Apps/Tuto04ComChannel/CMakeLists.txt b/Apps/Tuto04ComChannel/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto04ComChannel/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto04ComChannel/COPYING b/Apps/Tuto04ComChannel/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto04ComChannel/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto04ComChannel/COPYING.LESSER b/Apps/Tuto04ComChannel/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto04ComChannel/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto04ComChannel/Properties.cmake b/Apps/Tuto04ComChannel/Properties.cmake
new file mode 100644
index 0000000..d512d10
--- /dev/null
+++ b/Apps/Tuto04ComChannel/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto04ComChannel )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleMesh uiIO appXml )
+
diff --git a/Apps/Tuto04ComChannel/bin/build.options b/Apps/Tuto04ComChannel/bin/build.options
new file mode 100755
index 0000000..2877574
--- /dev/null
+++ b/Apps/Tuto04ComChannel/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleMesh_0-1'     ,
+    'uiIO_0-1'              ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto04ComChannel/rc/configurations/config-connect.xml b/Apps/Tuto04ComChannel/rc/configurations/config-connect.xml
new file mode 100644
index 0000000..c796832
--- /dev/null
+++ b/Apps/Tuto04ComChannel/rc/configurations/config-connect.xml
@@ -0,0 +1,108 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>tutoComChannelConnectConfig</id>
+    <type>parameters</type>
+    <config>
+    
+    <!-- In tutoComChannel, the main data object type is ::fwData::Mesh.-->
+    <object type="::fwData::Mesh">
+
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no" >
+            <gui>
+                <frame>
+                    <name>tutoComChannel</name>
+                    <icon>Bundles/Tuto04ComChannel_0-1/tuto.ico</icon>
+                    <minSize width="720" height="600"/>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="myDefaultView" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+             <gui>
+                <layout>
+                     <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+        
+        <!-- The application contains three different views. The different views are characterized by their associated service uid.
+                 Furthermore, a minimum window height and a width are given to the last two views.-->
+         <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view caption="Rendering 1" align="center" />
+                    <view caption="Rendering 2" align="right" minWidth="400" minHeight="100" />
+                    <view caption="Rendering 3" align="right" minWidth="400" minHeight="100" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="myRenderingTuto1" start="yes" />
+                <view sid="myRenderingTuto2" start="yes" />
+                <view sid="myRenderingTuto3" start="yes" />
+            </registry>
+        </service>
+        
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open file" shortcut="Ctrl+O" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openFile" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no" >
+            <start uid="myReaderPathFile"/>
+        </service>
+
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+        <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no" >
+            <type mode="reader"/>
+        </service>
+
+        <!-- Visualization service for the first window.-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto1" autoConnect="yes" />
+        
+        <!-- Visualization service for the second window-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto2" autoConnect="yes" />
+
+        <!-- Visualization service for the third window-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto3" autoConnect="yes" />
+        
+        <!-- Connect the signal slot of the service to receive the updating of camera position -->
+        <connect>
+            <signal>myRenderingTuto1/camUpdated</signal>
+            <slot>myRenderingTuto2/updateCamPosition</slot>
+            <slot>myRenderingTuto3/updateCamPosition</slot>
+        </connect>
+        
+         <connect>
+            <signal>myRenderingTuto2/camUpdated</signal>
+            <slot>myRenderingTuto1/updateCamPosition</slot>
+            <slot>myRenderingTuto3/updateCamPosition</slot>
+        </connect>
+        
+        <connect>
+            <signal>myRenderingTuto3/camUpdated</signal>
+            <slot>myRenderingTuto2/updateCamPosition</slot>
+            <slot>myRenderingTuto1/updateCamPosition</slot>
+        </connect>
+        
+        <start uid="myFrame" />
+    </object>
+
+    </config>
+</extension>
diff --git a/Apps/Tuto04ComChannel/rc/configurations/config-proxy.xml b/Apps/Tuto04ComChannel/rc/configurations/config-proxy.xml
new file mode 100644
index 0000000..4d5ea3e
--- /dev/null
+++ b/Apps/Tuto04ComChannel/rc/configurations/config-proxy.xml
@@ -0,0 +1,102 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>tutoComChannelProxyConfig</id>
+    <type>parameters</type>
+    <config>
+    
+    <!-- In tutoComChannel, the main data object type is ::fwData::Mesh.-->
+    <object type="::fwData::Mesh">
+
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no" >
+            <gui>
+                <frame>
+                    <name>tutoComChannel</name>
+                    <icon>Bundles/Tuto04ComChannel_0-1/tuto.ico</icon>
+                    <minSize width="720" height="600"/>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="myDefaultView" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+             <gui>
+                <layout>
+                     <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+        
+        <!-- The application contains three different views. The different views are characterized by their associated service uid.
+                 Furthermore, a minimum window height and a width are given to the last two views.-->
+         <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view caption="Rendering 1" align="center" />
+                    <view caption="Rendering 2" align="right" minWidth="400" minHeight="100" />
+                    <view caption="Rendering 3" align="right" minWidth="400" minHeight="100" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="myRenderingTuto1" start="yes" />
+                <view sid="myRenderingTuto2" start="yes" />
+                <view sid="myRenderingTuto3" start="yes" />
+            </registry>
+        </service>
+        
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open file" shortcut="Ctrl+O" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openFile" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no" >
+            <start uid="myReaderPathFile"/>
+        </service>
+
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+        <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no" >
+            <type mode="reader"/>
+        </service>
+
+        <!-- Visualization service for the first window.-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto1" autoConnect="yes" />
+
+        
+        <!-- Visualization service for the second window-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto2" autoConnect="yes" />
+
+
+        <!-- Visualization service for the third window-->
+        <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="myRenderingTuto3" autoConnect="yes" />
+        
+        <!-- Connect the signal slot of the service to receive the updating of camera position -->
+        <proxy channel="Camera" >
+            <signal>myRenderingTuto1/camUpdated</signal>
+            <signal>myRenderingTuto2/camUpdated</signal>
+            <signal>myRenderingTuto3/camUpdated</signal>
+            
+            <slot>myRenderingTuto1/updateCamPosition</slot>
+            <slot>myRenderingTuto2/updateCamPosition</slot>
+            <slot>myRenderingTuto3/updateCamPosition</slot>
+        </proxy>
+        
+        <start uid="myFrame" />
+    </object>
+
+    </config>
+</extension>
diff --git a/Apps/Tuto04ComChannel/rc/plugin.xml b/Apps/Tuto04ComChannel/rc/plugin.xml
new file mode 100644
index 0000000..3c8d366
--- /dev/null
+++ b/Apps/Tuto04ComChannel/rc/plugin.xml
@@ -0,0 +1,7 @@
+<plugin id="Tuto04ComChannel">
+    
+    <requirement id="servicesReg" />
+    <xi:include href="configurations/config-connect.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/config-proxy.xml"   xmlns:xi="http://www.w3.org/2003/XInclude" />
+    
+</plugin>
diff --git a/Apps/Tuto04ComChannel/rc/profile.xml b/Apps/Tuto04ComChannel/rc/profile.xml
new file mode 100644
index 0000000..f07effc
--- /dev/null
+++ b/Apps/Tuto04ComChannel/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="tutoComChannel" version="0.1">
+
+    <!-- Basic bundles list. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto04ComChannel" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoComChannelConnectConfig" />
+    </activate>
+
+    <!-- Specific bundles list. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+        
+</profile>
diff --git a/Apps/Tuto04ComChannel/rc/profileProxy.xml b/Apps/Tuto04ComChannel/rc/profileProxy.xml
new file mode 100644
index 0000000..abd69fa
--- /dev/null
+++ b/Apps/Tuto04ComChannel/rc/profileProxy.xml
@@ -0,0 +1,31 @@
+<profile name="tutoComChannel" version="0.1">
+
+    <!-- Basic bundles list. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto04ComChannel" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoComChannelProxyConfig" />
+    </activate>
+
+    <!-- Specific bundles list. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+        
+</profile>
diff --git a/Apps/Tuto04ComChannel/rc/tuto.ico b/Apps/Tuto04ComChannel/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto04ComChannel/rc/tuto.ico differ
diff --git a/Apps/Tuto05Mesher/CMakeLists.txt b/Apps/Tuto05Mesher/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto05Mesher/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto05Mesher/COPYING b/Apps/Tuto05Mesher/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto05Mesher/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto05Mesher/COPYING.LESSER b/Apps/Tuto05Mesher/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto05Mesher/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto05Mesher/Properties.cmake b/Apps/Tuto05Mesher/Properties.cmake
new file mode 100644
index 0000000..a318c64
--- /dev/null
+++ b/Apps/Tuto05Mesher/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto05Mesher )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato vtkSimpleMesh vtkCompositeMesh uiIO opVTKMesh opImageFilter appXml )
+
diff --git a/Apps/Tuto05Mesher/bin/build.options b/Apps/Tuto05Mesher/bin/build.options
new file mode 100755
index 0000000..d7130cc
--- /dev/null
+++ b/Apps/Tuto05Mesher/bin/build.options
@@ -0,0 +1,21 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'vtkSimpleMesh_0-1'     ,
+    'vtkCompositeMesh_0-1'  ,
+    'uiIO_0-1'              ,
+    'opVTKMesh_0-1'         ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto05Mesher/rc/plugin.xml b/Apps/Tuto05Mesher/rc/plugin.xml
new file mode 100644
index 0000000..c54f0a5
--- /dev/null
+++ b/Apps/Tuto05Mesher/rc/plugin.xml
@@ -0,0 +1,193 @@
+
+<plugin id="Tuto05Mesher">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>MesherConfig</id>
+        <type>parameters</type>
+        <config>
+        
+
+        <!--  Composite data creation. -->
+        <object type="::fwData::Composite">
+
+            <!-- Frame & View -->
+
+            <!--
+                Service associated to the Composite data :
+                main window creation.
+            -->
+            <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <gui>
+                    <frame>
+                        <name>Mesher</name>
+                        <icon>Bundles/Tuto05Mesher_0-1/tuto.ico</icon>
+                        <minSize width="800" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="myMenuBar" start="yes" />
+                    <view sid="myDefaultView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view caption="Image view" />
+                        <view caption="Mesh view" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="RenderingImage" start="yes" />
+                    <view sid="RenderingMesh" start="yes" />
+                </registry>
+            </service>
+
+
+            <!-- Menu Bar, Menus & Actions -->
+
+
+            <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Mesher" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menuFile" start="yes" />
+                    <menu sid="menuMesher" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuFile" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Open image file" shortcut="Ctrl+O" />
+                        <menuItem name="Save image" />
+                        <separator />
+                        <menuItem name="Open mesh file" shortcut="Ctrl+M" />
+                        <menuItem name="Save mesh" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionOpenImageFile" start="yes" />
+                    <menuItem sid="actionSaveImageFile" start="yes" />
+                    <menuItem sid="actionOpenMeshFile" start="yes" />
+                    <menuItem sid="actionSaveMeshFile" start="yes" />
+                    <menuItem sid="actionQuit" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuMesher" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Compute Mesh (VTK)" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionCreateVTKMesh" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+
+            <!--
+                Service associated to the Composite data :
+                menu services creation.
+                Actions in relationship with images and meshe
+            -->
+            <service uid="actionOpenImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="readerPathImageFile" />
+            </service>
+
+            <service uid="actionSaveImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="writerImageFile" />
+            </service>
+
+            <service uid="actionOpenMeshFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="readerPathMeshFile" />
+            </service>
+
+            <service uid="actionSaveMeshFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="writerMeshFile" />
+            </service>
+
+            <service uid="actionCreateVTKMesh" type="::fwGui::IActionSrv" impl="::opVTKMesh::action::VTKMeshCreation" autoConnect="no">
+                <image uid="myImage" />
+                <mesh uid="myMesh" />
+                <percentReduction value="0" />
+            </service>
+
+
+            <!--
+                Image object creation Services contained between the tags <object> and </object>
+                are associated to the Image data.
+            -->
+            <item key="myImage">
+                <object uid="myImage" type="::fwData::Image">
+
+                    <!--
+                    Services associated to the Image data :
+                    Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="RenderingImage" autoConnect="yes" />
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="readerPathImageFile" autoConnect="no">
+                        <type mode="reader" />
+                    </service>
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="writerImageFile" autoConnect="no">
+                        <type mode="writer" />
+                    </service>
+
+                </object>
+            </item>
+
+            <!--
+                Mesh object creation. Services contained between the tags <object> and </object> are
+                associated to the Mesh data.
+             -->
+            <item key="myMesh">
+                <object uid="myMesh" type="::fwData::Mesh">
+
+                    <!--
+                        Services associated to the Mesh data :
+                        Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh" autoConnect="yes"/>
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="readerPathMeshFile" autoConnect="no">
+                        <type mode="reader" />
+                    </service>
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="writerMeshFile" autoConnect="no">
+                        <type mode="writer" />
+                    </service>
+
+                </object>
+            </item>
+
+            <!--
+                In order to start the different services, it does not need to follow the objects creation order. Note that the services associated to the Image and Mesh data are not started
+                between the tags corresponding to these two data definitions but, before the end of the Composite data definition.
+            -->
+            <start uid="myFrame" />
+
+            
+
+        </object>
+    
+        </config>
+    </extension>
+</plugin>    
diff --git a/Apps/Tuto05Mesher/rc/profile.xml b/Apps/Tuto05Mesher/rc/profile.xml
new file mode 100644
index 0000000..fe84f45
--- /dev/null
+++ b/Apps/Tuto05Mesher/rc/profile.xml
@@ -0,0 +1,33 @@
+<profile name="Mesher" version="0.1">
+
+    <!-- List of the basic bundles. -->
+    <activate id="dataReg" version="0-1"/>
+    <activate id="servicesReg" version="0-1"/>
+    <activate id="io" version="0-1"/>
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto05Mesher" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="MesherConfig" />
+    </activate>
+
+    <!-- List of the specific bundles. -->
+    <activate id="ioData" version="0-1"/>
+    <activate id="vtkSimpleMesh" version="0-1"/>
+    <activate id="vtkSimpleNegato" version="0-1"/>
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="opVTKMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto05Mesher/rc/tuto.ico b/Apps/Tuto05Mesher/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto05Mesher/rc/tuto.ico differ
diff --git a/Apps/Tuto05MesherB/CMakeLists.txt b/Apps/Tuto05MesherB/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto05MesherB/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto05MesherB/COPYING b/Apps/Tuto05MesherB/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto05MesherB/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto05MesherB/COPYING.LESSER b/Apps/Tuto05MesherB/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto05MesherB/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto05MesherB/Properties.cmake b/Apps/Tuto05MesherB/Properties.cmake
new file mode 100644
index 0000000..9c20ef1
--- /dev/null
+++ b/Apps/Tuto05MesherB/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto05MesherB )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato vtkSimpleMesh vtkCompositeMesh uiIO opVTKMesh opImageFilter appXml )
+
diff --git a/Apps/Tuto05MesherB/bin/build.options b/Apps/Tuto05MesherB/bin/build.options
new file mode 100755
index 0000000..d7130cc
--- /dev/null
+++ b/Apps/Tuto05MesherB/bin/build.options
@@ -0,0 +1,21 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'vtkSimpleMesh_0-1'     ,
+    'vtkCompositeMesh_0-1'  ,
+    'uiIO_0-1'              ,
+    'opVTKMesh_0-1'         ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto05MesherB/rc/plugin.xml b/Apps/Tuto05MesherB/rc/plugin.xml
new file mode 100644
index 0000000..7a87f79
--- /dev/null
+++ b/Apps/Tuto05MesherB/rc/plugin.xml
@@ -0,0 +1,194 @@
+<plugin id="Tuto05MesherB">
+
+    <requirement id="servicesReg" />
+    
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>MesherV2Config</id>
+        <type>parameters</type>
+        <config>
+
+
+        <!--  Composite data creation. -->
+        <object type="::fwData::Composite">
+
+            <!-- Frame & View -->
+
+            <!--
+                Service associated to the Composite data :
+                main window creation.
+            -->
+            <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <gui>
+                    <frame>
+                        <name>Mesher</name>
+                        <icon>Bundles/Tuto05MesherB_0-1/tuto.ico</icon>
+                        <minSize width="800" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="myMenuBar" start="yes" />
+                    <view sid="myDefaultView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Image view" align="center" />
+                        <view caption="Mesh 1 view" align="right" minWidth="500" minHeight="100" />
+                        <view caption="Mesh 2 view" align="right" minWidth="500" minHeight="100" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="RenderingImage" start="yes" />
+                    <view sid="RenderingMesh1" start="yes" />
+                    <view sid="RenderingMesh2" start="yes" />
+                </registry>
+            </service>
+
+
+            <!-- Menu Bar, Menus & Actions -->
+
+
+            <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Mesher" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menuFile" start="yes" />
+                    <menu sid="menuMesher" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuFile" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Open image file" shortcut="Ctrl+O" />
+                        <menuItem name="Save image" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionOpenImageFile" start="yes" />
+                    <menuItem sid="actionSaveImageFile" start="yes" />
+                    <menuItem sid="actionQuit" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuMesher" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Compute Mesh 1 (VTK)" />
+                        <menuItem name="Compute Mesh 2 (VTK)" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionCreateVTKMesh1" start="yes" />
+                    <menuItem sid="actionCreateVTKMesh2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+
+            <!--
+                Service associated to the Composite data :
+                menu services creation.
+                Actions in relationship with images and meshe
+            -->
+            <service uid="actionOpenImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="readerPathImageFile" />
+            </service>
+
+            <service uid="actionSaveImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="writerImageFile" />
+            </service>
+
+            <service uid="actionCreateVTKMesh1" type="::fwGui::IActionSrv" impl="::opVTKMesh::action::VTKMeshCreation" autoConnect="no">
+                <image uid="myImage" />
+                <mesh uid="myMesh1" />
+                <percentReduction value="0" />
+            </service>
+
+            <service uid="actionCreateVTKMesh2" type="::fwGui::IActionSrv" impl="::opVTKMesh::action::VTKMeshCreation" autoConnect="no">
+                <image uid="myImage" />
+                <mesh uid="myMesh2" />
+                <percentReduction value="30" />
+            </service>
+
+
+            <!--
+                Image object creation Services contained between the tags <object> and </object>
+                are associated to the Image data.
+            -->
+            <item key="myImage">
+                <object uid="myImage" type="::fwData::Image">
+
+                    <!--
+                    Services associated to the Image data :
+                    Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="RenderingImage" autoConnect="yes" />
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="readerPathImageFile" autoConnect="no">
+                        <type mode="reader" />
+                    </service>
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="writerImageFile" autoConnect="no">
+                        <type mode="writer" />
+                    </service>
+
+                </object>
+            </item>
+
+            <!--
+                Mesh objet creation. Services contained between the tags <object> and </object> are
+                associa ted to the Mesh data.
+             -->
+            <item key="myMesh1">
+                <object uid="myMesh1" type="::fwData::Mesh">
+
+                    <!--
+                        Services associated to the Mesh data :
+                        Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh1" autoConnect="yes"/>
+
+                </object>
+            </item>
+
+            <!--
+                Mesh objet creation. Services contained between the tags <object> and </object> are
+                associa ted to the Mesh data.
+             -->
+            <item key="myMesh2">
+                <object uid="myMesh2" type="::fwData::Mesh">
+
+                    <!--
+                        Services associated to the Mesh data :
+                        Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh2" autoConnect="yes"/>
+
+                </object>
+            </item>
+
+            <!--
+                In order to start the different services, it does not need to follow the objects creation order. Note that the services associated to the Image and Mesh data are not started
+                between the tags corresponding to these two data definitions but, before the end of the Composite data definition.
+            -->
+            <start uid="myFrame" />
+
+        </object>
+
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto05MesherB/rc/profile.xml b/Apps/Tuto05MesherB/rc/profile.xml
new file mode 100644
index 0000000..e51155f
--- /dev/null
+++ b/Apps/Tuto05MesherB/rc/profile.xml
@@ -0,0 +1,33 @@
+<profile name="MyApp" version="0.1">
+
+    <!-- List of the basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto05MesherB" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="MesherV2Config" />
+    </activate>
+
+    <!-- List of the specific bundles. -->
+    <activate id="ioData" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="opVTKMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto05MesherB/rc/tuto.ico b/Apps/Tuto05MesherB/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto05MesherB/rc/tuto.ico differ
diff --git a/Apps/Tuto05MesherC/CMakeLists.txt b/Apps/Tuto05MesherC/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto05MesherC/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto05MesherC/COPYING b/Apps/Tuto05MesherC/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto05MesherC/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto05MesherC/COPYING.LESSER b/Apps/Tuto05MesherC/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto05MesherC/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto05MesherC/Properties.cmake b/Apps/Tuto05MesherC/Properties.cmake
new file mode 100644
index 0000000..150f21d
--- /dev/null
+++ b/Apps/Tuto05MesherC/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto05MesherC )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato vtkSimpleMesh vtkCompositeMesh uiIO opVTKMesh opImageFilter appXml )
+
diff --git a/Apps/Tuto05MesherC/bin/build.options b/Apps/Tuto05MesherC/bin/build.options
new file mode 100755
index 0000000..d7130cc
--- /dev/null
+++ b/Apps/Tuto05MesherC/bin/build.options
@@ -0,0 +1,21 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'vtkSimpleMesh_0-1'     ,
+    'vtkCompositeMesh_0-1'  ,
+    'uiIO_0-1'              ,
+    'opVTKMesh_0-1'         ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto05MesherC/rc/plugin.xml b/Apps/Tuto05MesherC/rc/plugin.xml
new file mode 100644
index 0000000..8817b2e
--- /dev/null
+++ b/Apps/Tuto05MesherC/rc/plugin.xml
@@ -0,0 +1,221 @@
+<plugin id="Tuto05MesherC">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>MesherV3Config</id>
+        <type>parameters</type>
+        <config>
+
+
+        <!--  Composite data creation. -->
+        <object type="::fwData::Composite">
+
+            <!-- Frame & View -->
+
+            <!--
+                Service associated to the Composite data :
+                main window creation.
+            -->
+            <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <gui>
+                    <frame>
+                        <name>Mesher</name>
+                        <icon>Bundles/Tuto05MesherC_0-1/tuto.ico</icon>
+                        <minSize width="800" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="myMenuBar" start="yes" />
+                    <view sid="myDefaultView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Image view" align="center" />
+                        <view caption="Mesh 1 view" align="right" minWidth="500" minHeight="100" />
+                        <view caption="Meshes view" align="right" minWidth="500" minHeight="100" />
+                        <view caption="Mesh 2 view" align="right" minWidth="500" minHeight="100" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="RenderingImage" start="yes" />
+                    <view sid="RenderingMesh1" start="yes" />
+                    <view sid="RenderingMesh" start="yes" />
+                    <view sid="RenderingMesh2" start="yes" />
+                </registry>
+            </service>
+
+
+            <!-- Menu Bar, Menus & Actions -->
+
+
+            <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Mesher" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menuFile" start="yes" />
+                    <menu sid="menuMesher" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuFile" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Open image file" shortcut="Ctrl+O" />
+                        <menuItem name="Save image" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionOpenImageFile" start="yes" />
+                    <menuItem sid="actionSaveImageFile" start="yes" />
+                    <menuItem sid="actionQuit" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="menuMesher" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Compute Mesh 1 (VTK)" />
+                        <menuItem name="Compute Mesh 2 (VTK)" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="actionCreateVTKMesh1" start="yes" />
+                    <menuItem sid="actionCreateVTKMesh2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+
+            <!--
+                Service associated to the Composite data :
+                menu services creation.
+                Actions in relationship with images and meshe
+            -->
+            <service uid="actionOpenImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="readerPathImageFile" />
+            </service>
+
+            <service uid="actionSaveImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="writerImageFile" />
+            </service>
+
+            <service uid="actionCreateVTKMesh1" type="::fwGui::IActionSrv" impl="::opVTKMesh::action::VTKMeshCreation" autoConnect="no">
+                <image uid="myImage" />
+                <mesh uid="myMesh1" />
+                <percentReduction value="0" />
+            </service>
+
+            <service uid="actionCreateVTKMesh2" type="::fwGui::IActionSrv" impl="::opVTKMesh::action::VTKMeshCreation" autoConnect="no">
+                <image uid="myImage" />
+                <mesh uid="myMesh2" />
+                <percentReduction value="30" />
+            </service>
+
+
+
+            <service impl="::vtkCompositeMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh" autoConnect="yes" />
+
+            <!--
+                Image object creation Services contained between the tags <object> and </object>
+                are associated to the Image data.
+            -->
+            <item key="myImage">
+                <object uid="myImage" type="::fwData::Image">
+
+                    <!--
+                    Services associated to the Image data :
+                    Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="RenderingImage" autoConnect="yes" />
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="readerPathImageFile" autoConnect="no">
+                        <type mode="reader" />
+                    </service>
+
+                    <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="writerImageFile" autoConnect="no">
+                        <type mode="writer" />
+                    </service>
+
+                </object>
+            </item>
+
+            <!--
+                Mesh object creation. Services contained between the tags <object> and </object> are
+                associated to the Mesh data.
+             -->
+            <item key="myMesh1">
+                <object uid="myMesh1" type="::fwData::Mesh">
+
+                    <!--
+                        Services associated to the Mesh data :
+                        Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh1" autoConnect="yes"/>
+
+                </object>
+            </item>
+
+            <!--
+                Mesh object creation. Services contained between the tags <object> and </object> are
+                associated to the Mesh data.
+             -->
+            <item key="myMesh2">
+                <object uid="myMesh2" type="::fwData::Mesh">
+
+                    <!--
+                        Services associated to the Mesh data :
+                        Visualization, reading and writing service creation.
+                    -->
+                    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" uid="RenderingMesh2" autoConnect="yes"/>
+
+                </object>
+            </item>
+
+            <!-- Connect RenderingMesh 'updateCamPosition' slot to receive 'camUpdated' signal from RenderingMesh1 and RenderingMesh2 -->
+            <connect>
+                <signal>RenderingMesh1/camUpdated</signal>
+                <slot>RenderingMesh/updateCamPosition</slot>
+            </connect>
+
+            <connect>
+                <signal>RenderingMesh2/camUpdated</signal>
+                <slot>RenderingMesh/updateCamPosition</slot>
+            </connect>
+
+            <!-- Connect RenderingMesh 'receive' slot to receive 'objectModified' signal from myMesh1 and myMesh2 -->
+            <connect>
+                <signal>myMesh1/objectModified</signal>
+                <slot>RenderingMesh/receive</slot>
+            </connect>
+
+            <connect>
+                <signal>myMesh2/objectModified</signal>
+                <slot>RenderingMesh/receive</slot>
+            </connect>
+
+            <!--
+                In order to start the different services, it does not need to follow the objects creation order. Note that the services associated to the Image and Mesh data are not started
+                between the tags corresponding to these two data definitions but, before the end of the Composite data definition.
+            -->
+            <start uid="myFrame" />
+
+        </object>
+
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto05MesherC/rc/profile.xml b/Apps/Tuto05MesherC/rc/profile.xml
new file mode 100644
index 0000000..a2d41a6
--- /dev/null
+++ b/Apps/Tuto05MesherC/rc/profile.xml
@@ -0,0 +1,34 @@
+<profile name="MyApp" version="0.1">
+
+    <!-- List of the basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto05MesherC" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="MesherV3Config" />
+    </activate>
+
+    <!-- List of the specific bundles. -->
+    <activate id="ioData" version="0-1" />
+    <activate id="vtkCompositeMesh" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="opVTKMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+    
+</profile>
diff --git a/Apps/Tuto05MesherC/rc/tuto.ico b/Apps/Tuto05MesherC/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto05MesherC/rc/tuto.ico differ
diff --git a/Apps/Tuto06Filter/CMakeLists.txt b/Apps/Tuto06Filter/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/Tuto06Filter/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/Tuto06Filter/COPYING b/Apps/Tuto06Filter/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto06Filter/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto06Filter/COPYING.LESSER b/Apps/Tuto06Filter/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto06Filter/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto06Filter/Properties.cmake b/Apps/Tuto06Filter/Properties.cmake
new file mode 100644
index 0000000..db79c7b
--- /dev/null
+++ b/Apps/Tuto06Filter/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto06Filter )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato uiIO opImageFilter appXml )
+
diff --git a/Apps/Tuto06Filter/bin/build.options b/Apps/Tuto06Filter/bin/build.options
new file mode 100755
index 0000000..d084622
--- /dev/null
+++ b/Apps/Tuto06Filter/bin/build.options
@@ -0,0 +1,19 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'uiIO_0-1'              ,
+    'opImageFilter_0-1'     ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto06Filter/rc/plugin.xml b/Apps/Tuto06Filter/rc/plugin.xml
new file mode 100644
index 0000000..1431e4a
--- /dev/null
+++ b/Apps/Tuto06Filter/rc/plugin.xml
@@ -0,0 +1,113 @@
+<plugin id="Tuto06Filter">
+
+<requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>FilterConfig</id>
+        <type>parameters</type>
+        <config>
+        
+    <!-- Root object -->
+    <object type="::fwData::Composite">
+        <!-- Windows & Main Menu -->
+        <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no" >
+            <gui>
+                <frame>
+                    <name>Filter</name>
+                    <icon>Bundles/Tuto06Filter_0-1/tuto.ico</icon>
+                    <minSize width="720" height="600"/>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="myDefaultView" start="yes" />
+            </registry>
+        </service>
+        
+       <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                     <menu name="File" />
+                     <menu name="Filter" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menuFile" start="yes" />
+                <menu sid="menuFilter" start="yes" />
+            </registry>
+        </service>
+        
+        <service uid="myDefaultView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view align="center" />
+                    <view align="right" minWidth="500" minHeight="100" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="RenderingImage1" start="yes" />
+                <view sid="RenderingImage2" start="yes" />
+            </registry>
+        </service> 
+        
+        <!-- Menus -->
+        <service uid="menuFile" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open image file" shortcut="Ctrl+O" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="actionOpenImageFile" start="yes" />
+                <menuItem sid="actionQuit" start="yes" />
+            </registry>
+        </service>
+        <service uid="menuFilter" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Compute Image Filter" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="actionImageFilter" start="yes" />
+            </registry>
+        </service>
+        
+        <!-- Actions on Menus -->         
+        <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+        <service uid="actionOpenImageFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no" >
+            <start uid="readerPathImageFile"/>
+        </service>
+        <service uid="actionImageFilter" type="::fwGui::IActionSrv" impl="::opImageFilter::action::ImageFilter" autoConnect="no" >
+            <imageIn  uid="myImage1"/>
+            <imageOut uid="myImage2"/>
+        </service>
+        <!-- Services on objects -->
+        <!-- 1st Object of the composite -->
+        <item key="myImage1">
+            <object uid="myImage1" type="::fwData::Image">
+                <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="RenderingImage1" autoConnect="yes" />
+                <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="readerPathImageFile" autoConnect="no" >
+                    <type mode="reader"/>
+                </service>
+            </object>
+        </item>
+        <!-- 2nd Object of the composite -->       
+        <item key="myImage2">
+            <object uid="myImage2" type="::fwData::Image">
+                <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="RenderingImage2" autoConnect="yes" />
+            </object> 
+        </item>
+    
+    <!-- Starting order of services -->
+    <start uid="myFrame" />
+
+    
+  </object>
+  
+        </config>
+    </extension>
+</plugin>    
diff --git a/Apps/Tuto06Filter/rc/profile.xml b/Apps/Tuto06Filter/rc/profile.xml
new file mode 100644
index 0000000..6eca689
--- /dev/null
+++ b/Apps/Tuto06Filter/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="Filter" version="0.1">
+
+    <!-- List of the basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto06Filter" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="FilterConfig" />
+    </activate>
+
+    <!-- List of the specific bundles. -->
+    <activate id="ioData" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="opImageFilter" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto06Filter/rc/tuto.ico b/Apps/Tuto06Filter/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto06Filter/rc/tuto.ico differ
diff --git a/Apps/Tuto07LoaderForExternalData/CMakeLists.txt b/Apps/Tuto07LoaderForExternalData/CMakeLists.txt
new file mode 100644
index 0000000..15cd4c1
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
diff --git a/Apps/Tuto07LoaderForExternalData/COPYING b/Apps/Tuto07LoaderForExternalData/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto07LoaderForExternalData/COPYING.LESSER b/Apps/Tuto07LoaderForExternalData/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto07LoaderForExternalData/Properties.cmake b/Apps/Tuto07LoaderForExternalData/Properties.cmake
new file mode 100644
index 0000000..19f4fbb
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto07LoaderForExternalData )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioAtoms ioTuto vtkSimpleNegato uiIO ctrlSelection appXml )
+
diff --git a/Apps/Tuto07LoaderForExternalData/bin/build.options b/Apps/Tuto07LoaderForExternalData/bin/build.options
new file mode 100644
index 0000000..614b61d
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/bin/build.options
@@ -0,0 +1,20 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioAtoms_0-1'           ,
+    'ioTuto_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'uiIO_0-1'              ,
+    'ctrlSelection_0-1'     ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto07LoaderForExternalData/rc/ExternalData.us b/Apps/Tuto07LoaderForExternalData/rc/ExternalData.us
new file mode 100644
index 0000000..f417067
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/rc/ExternalData.us
@@ -0,0 +1,5 @@
+image1
+1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 16.1
+11.1 12.1 13.1 14.1 15.1 16.1 17.1 18.1 19.1 20.1 21.1 22.1 23.1 24.1 25.1 26.1
+1.01 2.01 3.01 4.01 5.01 6.01 7.01 8.01 9.01 10.01 11.01 12.01 13.01 14.01 15.01 16.01
+11.001 12.001 13.001 14.001 15.001 16.001 17.001 18.001 19.001 20.001 21.001 22.001 23.001 24.001 25.001 26.001
\ No newline at end of file
diff --git a/Apps/Tuto07LoaderForExternalData/rc/plugin.xml b/Apps/Tuto07LoaderForExternalData/rc/plugin.xml
new file mode 100644
index 0000000..64b24d1
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/rc/plugin.xml
@@ -0,0 +1,286 @@
+<plugin id="Tuto07LoaderForExternalData">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoLoaderExternalDataConfig</id>
+        <type>parameters</type>
+        <config>
+
+
+            <!-- The root data object in TutoConfigurations is a ::fwData::Composite. because it has to manage several objects-->
+            <object type="::fwData::Composite">
+
+                <!--
+                    Graphical user interface manager. The identifier (id) of the container is 900, it's a wxWidgets id. In the tag <menus> we specify the identifiers of different services for the
+                    different menus. In this tutorial, only one service (::gui::aspect::IMenu type) is created. This application have 2 menu one to open/save image and one to load/save extra data.
+                    There are FW4SPL identifiers.
+                -->
+                <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>Tuto07LoaderForExternalData</name>
+                            <icon>Bundles/Tuto07LoaderForExternalData_0-1/tuto.ico</icon>
+                        </frame>
+                        <menuBar />
+                    </gui>
+                    <registry>
+                        <menuBar sid="myMenuBar" start="yes" />
+                        <view sid="myRenderingTuto" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menu name="File" />
+                            <menu name="External data" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menu sid="menu_File" start="yes" />
+                        <menu sid="menu_ExternalData" start="yes" />
+                    </registry>
+                </service>
+
+                <!-- This service define the file menu -->
+                <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Open image" shortcut="Ctrl+O" />
+                            <menuItem name="Save image" shortcut="Ctrl+S" />
+                            <separator />
+                            <menuItem name="Save all data (External data + image)" />
+                            <separator />
+                            <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="action_openFile" start="yes" />
+                        <menuItem sid="action_SaveFile" start="yes" />
+                        <menuItem sid="action_SaveAll" start="yes" />
+                        <menuItem sid="action_quit" start="yes" />
+                    </registry>
+                </service>
+
+                <!-- This service define the External menu -->
+                <service uid="menu_ExternalData" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Import External data (*.us file)" />
+                            <menuItem name="Load External data" />
+                            <menuItem name="Save External data" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="ActionLoadExternalData" start="yes" />
+                        <menuItem sid="ActionLoadExternalDataNative" start="yes" />
+                        <menuItem sid="ActionSaveExternalData" start="yes" />
+                    </registry>
+                </service>
+
+                <!--
+                    This service (::gui::action::QuitAction) is a generic action that will close the application when the user click on the menuItem "Quit". It's possible to associate with this kind
+                    of service (::fwGui::IActionSrv) specific attributes to configure their style, shortcut... (Note: In this tutorial, there is an attribute specialAction with the value "QUIT". On MS
+                    Windows, there's no impact. But on Mac OS, this value installs the menuItem in the system menu bar, and on Linux this value installs the default 'Quit' system icon in the
+                    menuItem.) The attribute "shortcut" is set with the value "Ctrl+Q" to close the application with this specific shortcut.
+                -->
+                <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+                <service uid="action_SaveAll" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                    <start uid="saveAllData" />
+                </service>
+
+                <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="saveAllData" autoConnect="no">
+                    <type mode="writer" />
+                    <selection mode="include" />
+                    <addSelection service="::ioAtoms::SWriter" />
+                </service>
+
+                <!--  a ::fwData::Image. -->
+                <item key="tutoLoaderExternalDataImage">
+                    <object type="::fwData::Image">
+                        <!--
+                            The first service (::gui::action::StarterActionService) is a generic action. In the configuration of this service, we specify the id of the services to be started and
+                            updated (start and update methods) when user click on the menuItem "Open image". In this tutorial, ::gui::action::StarterActionService service starts and updates the
+                            service with the uid "myReaderPathFile".
+                        -->
+                        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="myReaderPathFile" />
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="myReaderPathFile" autoConnect="no">
+                            <type mode="reader" />
+                        </service>
+
+                        <!--
+                            The other service (::gui::action::StarterActionService) is a generic action. In the configuration of this service, we specify the id of the services to be started and
+                            updated (start and update methods) when user click on the menuItem "save image". In this tutorial, ::gui::action::StarterActionService service starts and updates the
+                            service with the uid "myWriterPathFile".
+                        -->
+                        <service uid="action_SaveFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="myWriterPathFile" />
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="myWriterPathFile" autoConnect="no">
+                            <type mode="writer" />
+                        </service>
+
+                        <!-- This service (::vtkSimpleNegato::RendererService) is a 3D visualization service of medical images.-->
+                        <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="myRenderingTuto" autoConnect="yes" />
+
+                    </object>
+                </item>
+
+                <!--  a ::fwData::Composite uses to store extra information. -->
+                <item key="ExternalData">
+                    <object type="::fwData::Composite">
+                        <service impl="::ioTuto::ExternalDataReaderService" type="::io::IReader" uid="loadExternalData" autoConnect="no">
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="loadExternalDataNative" autoConnect="no">
+                            <type mode="reader" />
+                            <selection mode="include" />
+                            <addSelection service="::ioAtoms::SReader" />
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="saveExternalData" autoConnect="no">
+                            <type mode="writer" />
+                            <selection mode="include" />
+                            <addSelection service="::ioAtoms::SWriter" />
+                        </service>
+
+                        <service uid="ActionLoadExternalData" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="loadExternalData" />
+                        </service>
+
+                        <service uid="ActionSaveExternalData" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="saveExternalData" />
+                        </service>
+                        <service uid="ActionLoadExternalDataNative" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="loadExternalDataNative" />
+                        </service>
+                    </object>
+                </item>
+
+                <!-- Definition of the starting and closing order of the different services.-->
+                <start uid="myFrame" />
+
+            </object>
+
+        </config>
+    </extension>
+
+
+
+
+
+
+
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoLoaderExternalDataImageOnlyConfig</id>
+        <type>parameters</type>
+        <config>
+
+
+            <!-- The root data object in TutoConfigurations is a ::fwData::Composite. because it has to manage several objects -->
+            <object type="::fwData::Composite">
+            
+                <!--
+                    Graphical user interface manager. The identifier (id) of the container is 900, it's a wxWidgets id. In the tag <menus> we specify the identifiers of different services for the
+                    different menus. In this tutorial, only one service (::gui::aspect::IMenu type) is created. This application have 2 menu one to open/save image and one to load/save extra data.
+                    There are FW4SPL identifiers.
+                -->
+
+                <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>Tuto07LoaderForExternalData</name>
+                            <icon>Bundles/Tuto07LoaderForExternalData_0-1/tuto.ico</icon>
+                        </frame>
+                        <menuBar />
+                    </gui>
+                    <registry>
+                        <menuBar sid="myMenuBar" start="yes" />
+                        <view sid="myRenderingTuto" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menu name="File" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menu sid="menu_File" start="yes" />
+                    </registry>
+                </service>
+
+                <!-- This service define the file menu -->
+                <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Open image" shortcut="Ctrl+O" />
+                            <menuItem name="Save image" shortcut="Ctrl+S" />
+                            <separator />
+                            <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="action_openFile" start="yes" />
+                        <menuItem sid="action_SaveFile" start="yes" />
+                        <menuItem sid="action_quit" start="yes" />
+                    </registry>
+                </service>
+
+
+                <!--
+                    This service (::gui::action::QuitAction) is a generic action that will close the application when the user click on the menuItem "Quit". It's possible to associate with this kind
+                    of service (::fwGui::IActionSrv) specific attributes to configure their style, shortcut... (Note: In this tutorial, there is an attribute specialAction with the value "QUIT". On MS
+                    Windows, there's no impact. But on Mac OS, this value installs the menuItem in the system menu bar, and on Linux this value installs the default 'Quit' system icon in the
+                    menuItem.) The attribute "shortcut" is set with the value "Ctrl+Q" to close the application with this specific shortcut.
+                -->
+                <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+                <!--  a ::fwData::Image. -->
+                <item key="tutoLoaderExternalDataImage">
+                    <object type="::fwData::Image">
+                        <!--
+                            The first service (::gui::action::StarterActionService) is a generic action. In the configuration of this service, we specify the id of the services to be started and
+                            updated (start and update methods) when user click on the menuItem "Open image". In this tutorial, ::gui::action::StarterActionService service starts and updates the
+                            service with the uid "myReaderPathFile".
+                        -->
+                        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="myReaderPathFile" />
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="myReaderPathFile" autoConnect="no">
+                            <type mode="reader" />
+                        </service>
+                        <service impl="::ctrlSelection::wrapper::ImageWrapperSrv" type="::ctrlSelection::IWrapperSrv" uid="newOBject2newImage" autoConnect="yes" />
+
+                        <!--
+                            The other service (::gui::action::StarterActionService) is a generic action. In the configuration of this service, we specify the id of the services to be started and
+                            updated (start and update methods) when user click on the menuItem "save image". In this tutorial, ::gui::action::StarterActionService service starts and updates the
+                            service with the uid "myWriterPathFile".
+                        -->
+                        <service uid="action_SaveFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="myWriterPathFile" />
+                        </service>
+                        <service impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" uid="myWriterPathFile" autoConnect="no">
+                            <type mode="writer" />
+                        </service>
+
+                        <!-- This service (::vtkSimpleNegato::RendererService) is a 3D visualization service of medical images. -->
+                        <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="myRenderingTuto" autoConnect="yes" />
+
+                    </object>
+                </item>
+
+                <!-- Definition of the starting and closing order of the different services. -->
+                <start uid="myFrame" />
+                <start uid="newOBject2newImage" />
+
+            </object>
+
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto07LoaderForExternalData/rc/profile.xml b/Apps/Tuto07LoaderForExternalData/rc/profile.xml
new file mode 100644
index 0000000..405d5ce
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/rc/profile.xml
@@ -0,0 +1,36 @@
+<profile name="tutoLoaderExternalData" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto07LoaderForExternalData" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="tutoLoaderExternalDataConfig" />
+    </activate>
+
+    <!-- List of specific bundles. -->
+    <activate id="ioAtoms" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1"/>
+    <activate id="ioTuto" version="0-1"/>    
+    <activate id="uiIO" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+    
+    <!-- List of the specific bundles that need to be loaded in this application context. -->
+    <start id="dataReg" />
+    <start id="ioData"/>
+    <start id="ioTuto"/>
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+    
+</profile>
diff --git a/Apps/Tuto07LoaderForExternalData/rc/profileImageOnly.xml b/Apps/Tuto07LoaderForExternalData/rc/profileImageOnly.xml
new file mode 100644
index 0000000..e53a3a8
--- /dev/null
+++ b/Apps/Tuto07LoaderForExternalData/rc/profileImageOnly.xml
@@ -0,0 +1,37 @@
+<profile name="tutoLoaderExternalData" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto07LoaderForExternalData" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="tutoLoaderExternalDataImageOnlyConfig" />
+    </activate>
+
+    <!-- List of specific bundles. -->
+    <activate id="ioAtoms" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1"/>
+    <activate id="ioTuto" version="0-1"/>
+    <activate id="uiIO" version="0-1" />
+    <activate id="ctrlSelection" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+
+    <!-- List of the specific bundles that need to be loaded in this application context. -->
+    <start id="dataReg" />
+    <start id="ioData"/>
+    <start id="ioTuto"/>
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto07LoaderForExternalData/rc/tuto.ico b/Apps/Tuto07LoaderForExternalData/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto07LoaderForExternalData/rc/tuto.ico differ
diff --git a/Apps/Tuto08GenericScene/CMakeLists.txt b/Apps/Tuto08GenericScene/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto08GenericScene/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto08GenericScene/COPYING b/Apps/Tuto08GenericScene/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto08GenericScene/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto08GenericScene/COPYING.LESSER b/Apps/Tuto08GenericScene/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto08GenericScene/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto08GenericScene/Properties.cmake b/Apps/Tuto08GenericScene/Properties.cmake
new file mode 100644
index 0000000..b32abd7
--- /dev/null
+++ b/Apps/Tuto08GenericScene/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto08GenericScene )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS dataReg ctrlSelection gui guiQt ioData ioVTK io servicesReg uiVisuQt uiImageQt uiIO visuVTK visuVTKQt visuVTKAdaptor visu launcher appXml )
+
diff --git a/Apps/Tuto08GenericScene/bin/build.options b/Apps/Tuto08GenericScene/bin/build.options
new file mode 100644
index 0000000..3211db7
--- /dev/null
+++ b/Apps/Tuto08GenericScene/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'dataReg_0-1'       ,
+    'ctrlSelection_0-1' ,
+    'gui_0-1'           ,
+    'guiQt_0-1'         ,
+    'ioData_0-1'        ,
+    'ioVTK_0-1'         ,
+    'io_0-1'            ,
+    'servicesReg_0-1'   ,
+    'uiVisuQt_0-1'      ,
+    'uiImageQt_0-1'     ,
+    'uiIO_0-1'          ,
+    'visuVTK_0-1'       ,
+    'visuVTKQt_0-1'     ,
+    'visuVTKAdaptor_0-1',
+    'visu_0-1'          ,
+    'launcher_0-1'      ,
+    'appXml_0-1'        ,
+ ]
diff --git a/Apps/Tuto08GenericScene/rc/plugin.xml b/Apps/Tuto08GenericScene/rc/plugin.xml
new file mode 100644
index 0000000..5b9212e
--- /dev/null
+++ b/Apps/Tuto08GenericScene/rc/plugin.xml
@@ -0,0 +1,181 @@
+<plugin id="Tuto08GenericScene">
+
+<requirement id="servicesReg" />
+
+<extension implements="::fwServices::registry::AppConfig">
+        <id>Tuto08GenericScene</id>
+        <type>parameters</type>
+        <config>
+
+
+    <object type="::fwData::Composite">
+        <service uid="MyIHM" impl="::gui::frame::DefaultFrame" type="::fwGui::IFrameSrv" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>Tuto08GenericScene</name>
+                    <icon>Bundles/Tuto08GenericScene_0-1/tuto.ico</icon>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="multiView_scene1" start="yes" />
+            </registry>
+        </service>
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open image" shortcut="Ctrl+I" />
+                    <menuItem name="Open mesh" shortcut="Ctrl+M" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openImage" start="yes" />
+                <menuItem sid="action_openMesh" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="action_openImage" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="imageReader" />
+        </service>
+        <service uid="action_openMesh" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="meshReader" />
+        </service>
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+        <service uid="multiView_scene1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view align="center" />
+                    <view align="bottom" minWidth="400" minHeight="30" resizable="no" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="genericScene" start="yes" />
+                <view sid="multiView_scene1_bottom" start="yes" />
+            </registry>
+        </service>
+
+
+        <service uid="multiView_scene1_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view proportion="0" minWidth="30" />
+                    <view proportion="0" minWidth="50" />
+                    <view proportion="1" />
+                    <view proportion="0" minWidth="30" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="sliceListEditor" start="no" />
+                <view sid="showScanEditor" start="no" />
+                <view sid="sliderIndexEditor" start="no" />
+                <view sid="snapshotScene1Editor" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="snapshotScene1Editor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+            <snap>
+                <scene uid="genericScene" />
+            </snap>
+        </service>
+        
+        <item key="mesh">
+            <object uid="meshUID" type="::fwData::Mesh">
+                <service uid="meshReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                    <type mode="reader" />
+                </service>
+            </object>
+        </item>
+        <item key="image">
+            <object uid="imageUID"  type="::fwData::Image">
+                <service uid="imageReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                    <type mode="reader" />
+                </service>
+            </object>
+        </item>
+        
+        <!-- CompositeVisu description -->
+        <item key="myCompositeVisu">
+            <object uid="myCompositeVisu" type="::fwData::Composite">
+
+                <service uid="updaterUID" impl="::ctrlSelection::updater::ObjFromMsgUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                    <update compositeKey="image" onEvent="NEW_IMAGE" fromUID="imageUID" actionType="ADD_OR_SWAP"/>
+                    <update compositeKey="mesh" onEvent="NEW_MESH" fromUID="meshUID" actionType="ADD_OR_SWAP"/>
+                </service>
+                
+                <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                    <scene>
+                        <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+                        
+                        <renderer id="default" background="0.0" />
+
+                        <adaptor id="meshAdaptor" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                            <config renderer="default" picker="" />
+                        </adaptor>
+
+                        <adaptor uid="MPRNegatoScene3D" id="MPRNegato3D" class="::visuVTKAdaptor::NegatoMPR" objectId="image">
+                            <config renderer="default" picker="myPicker" mode="3d" slices="3" sliceIndex="axial" />
+                        </adaptor>
+                            
+                        <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self" >
+                            <config renderer="default" />
+                        </adaptor>
+                        
+                    </scene>
+                </service>
+                
+                <service uid="manager" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes"  >
+                    <mode type="stop" />
+                    <config>
+                        <object id="image" type="::fwData::Image">
+                            <!-- This service convert a simple fwData::Image to medical Image -->
+                            <service uid="medicalImageConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController"  autoConnect="yes" />
+                            <service uid="sliceListEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor" autoConnect="yes">
+                                <negatoAdaptor uid="MPRNegatoScene3D" slices="3" />
+                            </service>
+                            <service uid="showScanEditor" type="::gui::editor::IEditor" impl="::uiImage::ShowScanEditor" autoConnect="no">
+                                <negatoAdaptor uid="MPRNegatoScene3D" />
+                            </service>
+                            <service uid="sliderIndexEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes" >
+                                <sliceIndex>axial</sliceIndex>
+                            </service>
+                        </object>
+                    </config>
+                </service>
+                
+                <proxy channel="UPDATER_CHANNEL" >
+                    <signal>imageUID/objectModified</signal>
+                    <signal>meshUID/objectModified</signal>
+                    <slot>updaterUID/receive</slot>
+                </proxy>
+
+            </object>
+        </item>
+
+        <start uid="MyIHM" />
+        <start uid="updaterUID" />
+        <start uid="manager" />
+
+    </object>
+
+
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/Tuto08GenericScene/rc/profile.xml b/Apps/Tuto08GenericScene/rc/profile.xml
new file mode 100644
index 0000000..c28bce8
--- /dev/null
+++ b/Apps/Tuto08GenericScene/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="Tuto08GenericScene" version="0.1" check-single-instance="true">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto08GenericScene" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="Tuto08GenericScene" />
+    </activate>
+
+    <activate id="ctrlSelection" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="uiImageQt" version="0-1" />
+
+    <start id="visuVTK" />
+    <start id="visuVTKAdaptor" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto08GenericScene/rc/tuto.ico b/Apps/Tuto08GenericScene/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto08GenericScene/rc/tuto.ico differ
diff --git a/Apps/Tuto09MesherWithGenericScene/CMakeLists.txt b/Apps/Tuto09MesherWithGenericScene/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto09MesherWithGenericScene/COPYING b/Apps/Tuto09MesherWithGenericScene/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto09MesherWithGenericScene/COPYING.LESSER b/Apps/Tuto09MesherWithGenericScene/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto09MesherWithGenericScene/Properties.cmake b/Apps/Tuto09MesherWithGenericScene/Properties.cmake
new file mode 100644
index 0000000..ab362df
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto09MesherWithGenericScene )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS launcher dataReg servicesReg gui guiQt io visu ioData ioVTK uiVisuQt uiImageQt uiReconstructionQt uiMedDataQt uiIO visuVTK visuVTKQt visuVTKAdaptor opVTKMesh ctrlSelection appXml )
+
diff --git a/Apps/Tuto09MesherWithGenericScene/bin/build.options b/Apps/Tuto09MesherWithGenericScene/bin/build.options
new file mode 100644
index 0000000..026d68b
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/bin/build.options
@@ -0,0 +1,25 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'launcher_0-1'           ,
+    'dataReg_0-1'            ,
+    'servicesReg_0-1'        ,
+    'gui_0-1'                ,
+    'guiQt_0-1'              ,
+    'io_0-1'                 ,
+    'visu_0-1'               ,
+    'ioData_0-1'             ,
+    'ioVTK_0-1'              ,
+    'uiVisuQt_0-1'           ,
+    'uiImageQt_0-1'          ,
+    'uiReconstructionQt_0-1' ,
+    'uiMedDataQt_0-1'        ,
+    'uiIO_0-1'               ,
+    'visuVTK_0-1'            ,
+    'visuVTKQt_0-1'          ,
+    'visuVTKAdaptor_0-1'     ,
+    'opVTKMesh_0-1'          ,
+    'ctrlSelection_0-1'      ,
+    'appXml_0-1'             ,
+]
diff --git a/Apps/Tuto09MesherWithGenericScene/rc/plugin.xml b/Apps/Tuto09MesherWithGenericScene/rc/plugin.xml
new file mode 100644
index 0000000..25b644f
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/rc/plugin.xml
@@ -0,0 +1,236 @@
+<plugin id="Tuto09MesherWithGenericScene">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>Tuto09MesherWithGenericScene</id>
+        <type>parameters</type>
+        <config>
+
+            <object type="::fwData::Composite">
+
+                <service uid="MyIHM" impl="::gui::frame::DefaultFrame" type="::fwGui::IFrameSrv" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>Tuto09MesherWithGenericScene</name>
+                            <icon>Bundles/Tuto09MesherWithGenericScene_0-1/tuto.ico</icon>
+                        </frame>
+                        <menuBar />
+                    </gui>
+                    <registry>
+                        <menuBar sid="myMenuBar" start="yes" />
+                        <view sid="multiView_scene1" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menu name="File" />
+                            <menu name="Mesher" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menu sid="menu_File" start="yes" />
+                        <menu sid="menu_Mesher" start="yes" />
+                    </registry>
+                </service>
+
+
+                <service uid="multiView_scene1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                    <gui>
+                        <layout type="::fwGui::CardinalLayoutManager">
+                            <view align="center" minWidth="200" />
+                            <view align="right" minWidth="200" minHeight="200" position="0" />
+                            <view align="right" minWidth="200" minHeight="80" position="1" />
+                            <view align="right" minWidth="200" minHeight="200" position="2" />
+                            <view align="bottom" minHeight="30" resizable="no" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <view sid="genericScene" start="yes" />
+                        <view sid="listOrganEditor" start="yes" />
+                        <view sid="organMaterialEditor" />
+                        <view sid="representationEditor" />
+                        <view sid="multiView_scene1_bottom" start="yes" />
+                    </registry>
+                </service>
+                <service uid="multiView_scene1_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                    <gui>
+                        <layout type="::fwGui::LineLayoutManager">
+                            <orientation value="horizontal" />
+                            <view proportion="0" minWidth="30" />
+                            <view proportion="0" minWidth="50" />
+                            <view proportion="1" />
+                            <view proportion="0" minWidth="30" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <view sid="sliceListEditor" />
+                        <view sid="showScanEditor" />
+                        <view sid="sliderIndexEditor" />
+                        <view sid="snapshotScene1Editor" start="yes" />
+                    </registry>
+                </service>
+
+
+                <service uid="snapshotScene1Editor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                    <snap>
+                        <scene uid="genericScene" />
+                    </snap>
+                </service>
+
+                <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Open image" shortcut="Ctrl+O" />
+                            <menuItem name="Save meshes" shortcut="Ctrl+S" />
+                            <separator />
+                            <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="action_openImage" start="yes" />
+                        <menuItem sid="action_saveModelSeries" start="yes" />
+                        <menuItem sid="action_quit" start="yes" />
+                    </registry>
+                </service>
+                <service uid="menu_Mesher" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Create Mesh 50" />
+                            <menuItem name="Create Mesh 80" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="action_createMesh50" start="no" />
+                        <menuItem sid="action_createMesh80" start="no" />
+                    </registry>
+                </service>
+
+                <service uid="action_openImage" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                    <start uid="imageReader" />
+                </service>
+                <service uid="action_saveModelSeries" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                    <start uid="modelSeriesWriter" />
+                </service>
+                <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+                
+                <item key="image">
+                    <object uid="imageUID"  type="::fwData::Image">
+                        <service uid="imageReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                            <type mode="reader" />
+                        </service>
+                    </object>
+                </item>
+        
+                <!-- CompositeVisu description -->
+                <item key="myCompositeVisu">
+                    <object uid="myCompositeVisu" type="::fwData::Composite">
+                       
+                       <service uid="updaterImageUID" impl="::ctrlSelection::updater::ObjFromMsgUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                            <update compositeKey="image" onEvent="NEW_IMAGE" fromUID="imageUID" actionType="ADD_OR_SWAP"/>
+                        </service>
+                
+                        <service uid="mesher50ServiceUID" impl="::opVTKMesh::SVTKMesher" type="::opVTKMesh::IMesher" autoConnect="no">
+                            <config>
+                                <percentReduction>50</percentReduction>
+                                <image>image</image>
+                                <modelSeries>modelSeries</modelSeries>
+                            </config>
+                        </service>
+                        
+                        <service uid="mesher80ServiceUID" impl="::opVTKMesh::SVTKMesher" type="::opVTKMesh::IMesher" autoConnect="no">
+                            <config>
+                                <percentReduction>80</percentReduction>
+                                <image>image</image>
+                                <modelSeries>modelSeries</modelSeries>
+                            </config>
+                        </service>
+
+                        <service uid="updaterReconstUID" impl="::ctrlSelection::updater::SReconstructionFromModelSeriesUpdater" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                            <update compositeKey="reconstruction" onEvent="NEW_RECONSTRUCTION_SELECTED" fromUID="*" actionType="ADD_OR_SWAP" />
+                        </service>
+
+                        <service uid="managerUID" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+                            <mode type="stop" />
+                            <config>
+
+                                <object id="image" type="::fwData::Image">
+                                    <!-- This service convert a simple fwData::Image to medical Image -->
+                                    <service impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController"  autoConnect="yes" />
+                                    <service uid="action_createMesh50" impl="::gui::action::StarterActionService" type="::fwGui::IActionSrv" autoConnect="no">
+                                        <start_if_exists uid="mesher50ServiceUID" />
+                                    </service>
+                                    <service uid="action_createMesh80" impl="::gui::action::StarterActionService" type="::fwGui::IActionSrv" autoConnect="no">
+                                        <start_if_exists uid="mesher80ServiceUID" />
+                                    </service>
+                                    <service uid="sliceListEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor" autoConnect="yes">
+                                        <negatoAdaptor uid="MPRNegatoScene3D" slices="3" />
+                                    </service>
+                                    <service uid="showScanEditor" type="::gui::editor::IEditor" impl="::uiImage::ShowScanEditor" autoConnect="no">
+                                        <negatoAdaptor uid="MPRNegatoScene3D" />
+                                    </service>
+                                    <service uid="sliderIndexEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes">
+                                        <sliceIndex>axial</sliceIndex>
+                                    </service>
+                                </object>
+                                
+                                <object id="reconstruction" type="::fwData::Reconstruction">
+                                    <service uid="organMaterialEditor" impl="::uiReconstruction::OrganMaterialEditor" type="::gui::editor::IEditor" autoConnect="no" />
+                                    <service uid="representationEditor" impl="::uiReconstruction::RepresentationEditor" type="::gui::editor::IEditor" autoConnect="no" />
+                                </object>
+                                
+                            </config>
+                        </service>
+
+                        <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                            <scene>
+
+                                <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+                                <renderer id="default" background="0.0" />
+                                <adaptor id="modelSeriesAdaptor" class="::visuVTKAdaptor::ModelSeries" objectId="modelSeries">
+                                    <config renderer="default" picker="" />
+                                </adaptor>
+                                <adaptor uid="MPRNegatoScene3D" id="MPRNegato3D" class="::visuVTKAdaptor::NegatoMPR" objectId="image">
+                                    <config renderer="default" picker="myPicker" mode="3D" slices="3" sliceIndex="axial" />
+                                </adaptor>
+                                <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                    <config renderer="default" />
+                                </adaptor>
+
+                            </scene>
+                        </service>
+                        
+                        <item key="modelSeries">
+                            <object uid="modelSeriesUID" type="::fwMedData::ModelSeries">
+                                <service uid="listOrganEditor" impl="::uiMedData::editor::SModelSeriesList" type="::gui::editor::IEditor" autoConnect="yes" />
+                                <service uid="modelSeriesWriter" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                                    <type mode="writer" />
+                                </service>
+                            </object>
+                        </item>
+                        
+                        <connect>
+                            <signal>modelSeriesUID/objectModified</signal>
+                            <slot>updaterReconstUID/receive</slot>
+                        </connect>
+                        <connect>
+                            <signal>imageUID/objectModified</signal>
+                            <slot>updaterImageUID/receive</slot>
+                        </connect>
+                    </object>
+                    
+                </item>
+
+                <start uid="MyIHM" />
+                <start uid="updaterReconstUID" />
+                <start uid="updaterImageUID" />
+                <start uid="managerUID" />
+
+            </object>
+
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/Tuto09MesherWithGenericScene/rc/profile.xml b/Apps/Tuto09MesherWithGenericScene/rc/profile.xml
new file mode 100644
index 0000000..4dea5ad
--- /dev/null
+++ b/Apps/Tuto09MesherWithGenericScene/rc/profile.xml
@@ -0,0 +1,40 @@
+<profile name="Tuto09MesherWithGenericScene" version="0.1" check-single-instance="true"> 
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" /> 
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto09MesherWithGenericScene" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="Tuto09MesherWithGenericScene" />
+    </activate>
+    
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+
+    <activate id="ctrlSelection" version="0-1" />
+    
+    <activate id="ioVTK" version="0-1" />
+    
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="uiImageQt" version="0-1" />
+    <activate id="uiReconstructionQt" version="0-1" />
+    <activate id="uiMedDataQt" version="0-1" />
+    
+    <activate id="opVTKMesh" version="0-1" />
+    
+    <!-- Start components -->
+    <start id="visuVTK" />
+    <start id="visuVTKQt" />
+    <start id="visuVTKAdaptor" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto09MesherWithGenericScene/rc/tuto.ico b/Apps/Tuto09MesherWithGenericScene/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto09MesherWithGenericScene/rc/tuto.ico differ
diff --git a/Apps/Tuto10MatrixTransformInGS/CMakeLists.txt b/Apps/Tuto10MatrixTransformInGS/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto10MatrixTransformInGS/COPYING b/Apps/Tuto10MatrixTransformInGS/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto10MatrixTransformInGS/COPYING.LESSER b/Apps/Tuto10MatrixTransformInGS/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto10MatrixTransformInGS/Properties.cmake b/Apps/Tuto10MatrixTransformInGS/Properties.cmake
new file mode 100644
index 0000000..0fda023
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto10MatrixTransformInGS )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu launcher ioVTK ioData uiIO uiVisuQt visuVTK visuVTKQt visuVTKAdaptor appXml )
+
diff --git a/Apps/Tuto10MatrixTransformInGS/bin/build.options b/Apps/Tuto10MatrixTransformInGS/bin/build.options
new file mode 100755
index 0000000..43521b5
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/bin/build.options
@@ -0,0 +1,20 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'uiIO_0-1'              ,
+    'uiVisuQt_0-1'          ,
+    'visuVTK_0-1'           ,
+    'visuVTKQt_0-1'         ,
+    'visuVTKAdaptor_0-1'    ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto10MatrixTransformInGS/rc/cube.trian b/Apps/Tuto10MatrixTransformInGS/rc/cube.trian
new file mode 100644
index 0000000..e301902
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/rc/cube.trian
@@ -0,0 +1,23 @@
+8
+-1.0 -1.0 -1.0
+1.0 -1.0 -1.0
+1.0 1.0 -1.0
+-1.0 1.0 -1.0
+-1.0 -1.0 1.0
+1.0 -1.0 1.0
+1.0 1.0 1.0
+-1.0 1.0 1.0
+
+12
+0 1 5 -1 -1 -1
+0 5 4 -1 -1 -1
+3 0 4 -1 -1 -1
+3 4 7 -1 -1 -1
+3 2 6 -1 -1 -1
+3 6 7 -1 -1 -1
+2 1 5 -1 -1 -1
+2 5 6 -1 -1 -1
+7 6 5 -1 -1 -1
+7 5 4 -1 -1 -1
+3 2 1 -1 -1 -1
+3 1 0 -1 -1 -1
diff --git a/Apps/Tuto10MatrixTransformInGS/rc/plugin.xml b/Apps/Tuto10MatrixTransformInGS/rc/plugin.xml
new file mode 100644
index 0000000..d938516
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/rc/plugin.xml
@@ -0,0 +1,231 @@
+<plugin id="Tuto10MatrixTransformInGS">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tuto</id>
+        <type>parameters</type>
+        <config>
+        
+
+        <object type="::fwData::Composite" >
+        
+            <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no" >
+                <gui>
+                    <frame>
+                        <name>Tuto10MatrixTransformInGS</name>
+                        <icon>Bundles/Tuto10MatrixTransformInGS_0-1/tuto.ico</icon>
+                        <minSize width="800" height="600"/>
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="myMenuBar" start="yes" />
+                    <view sid="multiView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menu name="File"/>
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menu_File" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="OpenFile" shortcut="Ctrl+O" />
+                        <separator />
+                        <menuItem name="Quit" shortcut="Ctrl+Q" specialAction="QUIT" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="action_openFile" start="yes" />
+                    <menuItem sid="action_quit" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="myReaderPathFile" />
+            </service>
+
+            <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+            <service uid="multiView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager" >
+                        <view align="center" />
+                        <view align="bottom" minHeight="40" position="0" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="genericScene" start="yes" />
+                    <view sid="matrixEditor" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                <scene>
+
+                    <renderer id="default" background="0.0" />
+
+                    <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+
+                    <vtkObject id="mat1" class="vtkTransform" />
+                    <vtkObject id="mat2" class="vtkTransform" />
+                    <vtkObject id="mat3" class="vtkTransform" />
+                    <vtkObject id="mat4" class="vtkTransform" />
+                    <vtkObject id="mat5" class="vtkTransform" />
+                    
+                    <!-- mat5 = mat5 x mat1 x mat4 -->
+                    <vtkObject id="mat6" class="vtkTransform" >
+                        <vtkTransform>
+                            <concatenate>mat5</concatenate>
+                            <concatenate>mat1</concatenate>
+                            <concatenate>mat4</concatenate>
+                        </vtkTransform>
+                    </vtkObject>
+                    
+                    <!-- mat6 = mat5 x mat2 x mat5 x mat5 x mat5 x mat4 x mat4 -->
+                    <vtkObject id="mat7" class="vtkTransform" >
+                        <vtkTransform>
+                            <concatenate inverse="yes">mat5</concatenate>
+                            <concatenate>mat2</concatenate>
+                            <concatenate>mat5</concatenate>
+                            <concatenate>mat5</concatenate>
+                            <concatenate>mat5</concatenate>
+                            <concatenate>mat4</concatenate>
+                            <concatenate>mat4</concatenate>
+                        </vtkTransform>
+                    </vtkObject>
+                    
+                    <!-- mat7 = mat3 x mat5 x mat4 x mat4 x mat4 -->
+                    <vtkObject id="mat8" class="vtkTransform" >
+                        <vtkTransform>
+                            <concatenate>mat3</concatenate>
+                            <concatenate>mat5</concatenate>
+                            <concatenate>mat4</concatenate>
+                            <concatenate>mat4</concatenate>
+                            <concatenate>mat4</concatenate>
+                        </vtkTransform>
+                    </vtkObject>
+                    
+                    
+
+                    <adaptor id="MatrixAdatorA" class="::visuVTKAdaptor::Transform" objectId="matrixA">
+                        <config renderer="default" picker="" transform="mat1" />
+                    </adaptor>
+
+                    <adaptor id="MatrixAdatorB" class="::visuVTKAdaptor::Transform" objectId="matrixB">
+                        <config renderer="default" picker="" transform="mat2" />
+                    </adaptor>
+                    
+                    <adaptor id="MatrixAdatorC" class="::visuVTKAdaptor::Transform" objectId="matrixC">
+                        <config renderer="default" picker="" transform="mat3" />
+                    </adaptor>
+                    
+                    <adaptor id="MatrixAdatorD" class="::visuVTKAdaptor::Transform" objectId="matrixD">
+                        <config renderer="default" picker="" transform="mat4" />
+                    </adaptor>
+                    
+                    <adaptor id="MatrixAdatorE" class="::visuVTKAdaptor::Transform" objectId="matrixE">
+                        <config renderer="default" picker="" transform="mat5" />
+                    </adaptor>
+                    
+                    
+                    
+                    <adaptor id="Renderer" class="::visuVTKAdaptor::Render" objectId="self">
+                        <config renderer="default" picker="" />
+                    </adaptor>
+
+                    <adaptor id="TMAdaptor1" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                        <config renderer="default" picker="" />
+                    </adaptor>
+
+                    <adaptor id="TMAdaptor2" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                        <config renderer="default" picker="" transform="mat6" />
+                    </adaptor>
+                    
+                    <adaptor id="TMAdaptor3" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                        <config renderer="default" picker="" transform="mat7" />
+                    </adaptor>
+                    
+                    <adaptor id="TMAdaptor4" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                        <config renderer="default" picker="" transform="mat8" />
+                    </adaptor>
+
+                </scene>
+            </service>
+            
+            <item key="matrixA">
+                <object uid="matrixA" type="::fwData::TransformationMatrix3D">
+                    <matrix>
+                        1 0 0 2
+                        0 1 0 0
+                        0 0 1 0
+                        0 0 0 1 
+                    </matrix>
+                </object>
+            </item>
+            
+            <item key="matrixB">
+                <object uid="matrixB" type="::fwData::TransformationMatrix3D">
+                    <matrix>
+                        1 0 0 4
+                        0 1 0 0
+                        0 0 1 0
+                        0 0 0 1 
+                    </matrix>
+                </object>
+            </item>
+            
+            <item key="matrixC">
+                <object uid="matrixC" type="::fwData::TransformationMatrix3D">
+                    <matrix>
+                        1 0 0 0
+                        0 1 0 0
+                        0 0 1 2
+                        0 0 0 1 
+                    </matrix>
+                </object>
+            </item>
+            
+            <item key="matrixD">
+                <object uid="matrixD" type="::fwData::TransformationMatrix3D">
+                    <matrix>
+                        0.75 0 0 0
+                        0 0.75 0 0
+                        0 0 0.75 0
+                        0 0 0 1 
+                    </matrix>
+                </object>
+            </item>
+            
+            <item key="matrixE">
+                <object uid="matrixE" type="::fwData::TransformationMatrix3D">
+                    <service uid="matrixEditor" impl="::uiVisu::TransformationMatrixEditor" type="::gui::editor::IEditor" autoConnect="yes" />
+                </object>
+            </item>
+
+            <item key="mesh">
+                <object uid="mesh" type="::fwData::Mesh">
+                    <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no" />
+                </object>
+            </item>
+            
+            <start uid="myFrame" />
+            
+            
+
+        </object>
+
+    
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto10MatrixTransformInGS/rc/profile.xml b/Apps/Tuto10MatrixTransformInGS/rc/profile.xml
new file mode 100644
index 0000000..b5ef100
--- /dev/null
+++ b/Apps/Tuto10MatrixTransformInGS/rc/profile.xml
@@ -0,0 +1,34 @@
+<profile name="tutoDataService" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    <activate id="gui" version="0-1" />
+    <activate id="visu" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto10MatrixTransformInGS" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="tuto" />
+    </activate>
+    
+    <!-- List of specific bundles. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    
+    <start id="dataReg" />
+    <start id="visuVTK" />
+    <start id="visuVTKQt" />
+    <start id="visuVTKAdaptor" />
+    <start id="guiQt" />
+    <start id="appXml" />
+    
+</profile>
diff --git a/Apps/Tuto10MatrixTransformInGS/rc/tuto.ico b/Apps/Tuto10MatrixTransformInGS/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto10MatrixTransformInGS/rc/tuto.ico differ
diff --git a/Apps/Tuto11LaunchBasicConfig/CMakeLists.txt b/Apps/Tuto11LaunchBasicConfig/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto11LaunchBasicConfig/COPYING b/Apps/Tuto11LaunchBasicConfig/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto11LaunchBasicConfig/COPYING.LESSER b/Apps/Tuto11LaunchBasicConfig/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto11LaunchBasicConfig/Properties.cmake b/Apps/Tuto11LaunchBasicConfig/Properties.cmake
new file mode 100644
index 0000000..ed1c31b
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto11LaunchBasicConfig )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt launcher ioVTK ioData vtkSimpleNegato uiIO appXml )
+
diff --git a/Apps/Tuto11LaunchBasicConfig/bin/build.options b/Apps/Tuto11LaunchBasicConfig/bin/build.options
new file mode 100644
index 0000000..0ebc2ea
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleNegato_0-1'   ,
+    'uiIO_0-1'              ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto11LaunchBasicConfig/rc/BasicFrameConfig.xml b/Apps/Tuto11LaunchBasicConfig/rc/BasicFrameConfig.xml
new file mode 100644
index 0000000..7cd2e08
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/rc/BasicFrameConfig.xml
@@ -0,0 +1,36 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>BasicFrameConfig</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" />
+        <param name="imageUid" />
+    </parameters>
+    <config>
+
+        <object uid="${imageUid}" src="ref" type="::fwData::Image">
+
+            <service uid="${GENERIC_UID}_BasicViewerFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <window onclose="notify" />
+                <gui>
+                    <frame>
+                        <name>Basic frame config</name>
+                        <minSize width="900" height="600" />
+                    </frame>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_SecondView" start="no" />
+                </registry>
+            </service>
+
+            <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="${GENERIC_UID}_SecondView" autoConnect="yes">
+            </service>
+
+            <start uid="${GENERIC_UID}_BasicViewerFrame" />
+            <start uid="${GENERIC_UID}_SecondView" />
+
+            <update uid="${GENERIC_UID}_SecondView" />
+
+        </object>
+
+    </config>
+</extension>
diff --git a/Apps/Tuto11LaunchBasicConfig/rc/plugin.xml b/Apps/Tuto11LaunchBasicConfig/rc/plugin.xml
new file mode 100644
index 0000000..fd317c2
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/rc/plugin.xml
@@ -0,0 +1,83 @@
+<plugin id="Tuto11LaunchBasicConfig">
+
+    <requirement id="servicesReg" />
+
+    <xi:include href="BasicFrameConfig.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>TutoLaunchBasicConfig</id>
+        <type>parameters</type>
+        <config>
+            <object uid="myImage" type="::fwData::Image">
+
+                <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>Tuto 11 : Launch basic config</name>
+                            <icon>Bundles/Tuto11LaunchBasicConfig_0-1/tuto.ico</icon>
+                            <minSize width="800" height="600" />
+                        </frame>
+                        <menuBar />
+                    </gui>
+                    <registry>
+                        <menuBar sid="mainMenuBar" start="yes" />
+                        <view sid="mainView" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="mainMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menu name="File" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menu sid="menuFile" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="menuFile" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                    <gui>
+                        <layout>
+                            <menuItem name="Open file" shortcut="Ctrl+O" />
+                            <separator />
+                            <menuItem name="Launch Config" style="check" />
+                            <separator />
+                            <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <menuItem sid="actionOpenFile" start="yes" />
+                        <menuItem sid="actionLaunchConfig" start="yes" />
+                        <menuItem sid="actionQuit" start="yes" />
+                    </registry>
+                </service>
+
+
+                <service uid="actionOpenFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                    <start uid="myReaderPathFile" />
+                </service>
+
+                <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+                <service uid="myReaderPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no" />
+
+                <service uid="actionLaunchConfig" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="no">
+                    <config>
+                        <appConfig id="BasicFrameConfig" >
+                            <parameters>
+                                <parameter replace="imageUid" by="myImage" />
+                            </parameters>
+                        </appConfig>
+                    </config>
+                </service>
+
+                <service impl="::vtkSimpleNegato::RendererService" type="::fwRender::IRender" uid="mainView" autoConnect="yes">
+                </service>
+
+                <start uid="myFrame" />
+
+            </object>
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto11LaunchBasicConfig/rc/profile.xml b/Apps/Tuto11LaunchBasicConfig/rc/profile.xml
new file mode 100644
index 0000000..73fe549
--- /dev/null
+++ b/Apps/Tuto11LaunchBasicConfig/rc/profile.xml
@@ -0,0 +1,30 @@
+<profile name="Tuto11LaunchBasicConfig" version="0.1">
+
+    <!-- List of basic bundles. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto11LaunchBasicConfig" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="TutoLaunchBasicConfig" />
+    </activate>
+
+    <!-- List of specific bundles. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto11LaunchBasicConfig/rc/tuto.ico b/Apps/Tuto11LaunchBasicConfig/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto11LaunchBasicConfig/rc/tuto.ico differ
diff --git a/Apps/Tuto12Picker/CMakeLists.txt b/Apps/Tuto12Picker/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto12Picker/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto12Picker/COPYING b/Apps/Tuto12Picker/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto12Picker/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto12Picker/COPYING.LESSER b/Apps/Tuto12Picker/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto12Picker/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto12Picker/Properties.cmake b/Apps/Tuto12Picker/Properties.cmake
new file mode 100644
index 0000000..e747d18
--- /dev/null
+++ b/Apps/Tuto12Picker/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto12Picker )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS dataReg ctrlSelection gui guiQt ioData ioVTK io servicesReg uiVisuQt uiImageQt uiIO visuVTK visuVTKQt visuVTKAdaptor visu launcher appXml )
+
diff --git a/Apps/Tuto12Picker/bin/build.options b/Apps/Tuto12Picker/bin/build.options
new file mode 100644
index 0000000..3211db7
--- /dev/null
+++ b/Apps/Tuto12Picker/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'dataReg_0-1'       ,
+    'ctrlSelection_0-1' ,
+    'gui_0-1'           ,
+    'guiQt_0-1'         ,
+    'ioData_0-1'        ,
+    'ioVTK_0-1'         ,
+    'io_0-1'            ,
+    'servicesReg_0-1'   ,
+    'uiVisuQt_0-1'      ,
+    'uiImageQt_0-1'     ,
+    'uiIO_0-1'          ,
+    'visuVTK_0-1'       ,
+    'visuVTKQt_0-1'     ,
+    'visuVTKAdaptor_0-1',
+    'visu_0-1'          ,
+    'launcher_0-1'      ,
+    'appXml_0-1'        ,
+ ]
diff --git a/Apps/Tuto12Picker/rc/plugin.xml b/Apps/Tuto12Picker/rc/plugin.xml
new file mode 100644
index 0000000..6488999
--- /dev/null
+++ b/Apps/Tuto12Picker/rc/plugin.xml
@@ -0,0 +1,197 @@
+<plugin id="Tuto12Picker">
+
+<requirement id="servicesReg" />
+
+<extension implements="::fwServices::registry::AppConfig">
+        <id>Tuto12Picker</id>
+        <type>parameters</type>
+        <config>
+
+    <object type="::fwData::Composite">
+        <service uid="MyIHM" impl="::gui::frame::DefaultFrame" type="::fwGui::IFrameSrv" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>Tuto12Picker</name>
+                    <icon>Bundles/Tuto12Picker_0-1/tuto.ico</icon>
+                    <minSize width="800" height="600"/>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="myMenuBar" start="yes" />
+                <view sid="mainView" start="yes" />
+            </registry>
+        </service>
+        <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open image" shortcut="Ctrl+I" />
+                    <menuItem name="Open mesh" shortcut="Ctrl+M" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openImage" start="yes" />
+                <menuItem sid="action_openMesh" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="action_openImage" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="imageReader" />
+        </service>
+        <service uid="action_openMesh" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="meshReader" />
+        </service>
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+        <service uid="mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="vertical" />
+                    <view caption="Picker world coordinate." proportion="0" />
+                    <view caption="Generic scene" border="11" proportion="1" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="pointView" start="yes" />
+                <view sid="multiViewScene" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="multiViewScene" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view align="center" />
+                    <view align="bottom" minWidth="400" minHeight="30" resizable="no" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="genericScene" start="yes" />
+                <view sid="multiViewScene_bottom" start="yes" />
+            </registry>
+        </service>
+
+
+        <service uid="multiViewScene_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view proportion="0" minWidth="30" />
+                    <view proportion="0" minWidth="50" />
+                    <view proportion="1" />
+                    <view proportion="0" minWidth="30" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="sliceListEditor" start="no" />
+                <view sid="showScanEditor" start="no" />
+                <view sid="sliderIndexEditor" start="no" />
+                <view sid="snapshotScene1Editor" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="snapshotScene1Editor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+            <snap>
+                <scene uid="genericScene" />
+            </snap>
+        </service>
+
+        <item key="mesh">
+            <object uid="meshUID" type="::fwData::Mesh">
+                <service uid="meshReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                    <type mode="reader" />
+                </service>
+            </object>
+        </item>
+        <item key="image">
+            <object uid="imageUID"  type="::fwData::Image">
+                <service uid="imageReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                    <type mode="reader" />
+                </service>
+            </object>
+        </item>
+        
+        <!-- CompositeVisu description -->
+        <item key="myCompositeVisu">
+            <object uid="myCompositeVisu" type="::fwData::Composite">                
+                
+                <service uid="updaterUID" impl="::ctrlSelection::updater::ObjFromMsgUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                    <update compositeKey="image" onEvent="NEW_IMAGE" fromUID="imageUID" actionType="ADD_OR_SWAP"/>
+                    <update compositeKey="mesh" onEvent="NEW_MESH" fromUID="meshUID" actionType="ADD_OR_SWAP"/>
+                </service>
+                
+                <service uid="pointView" impl="::uiVisu::PointEditor" type="::gui::editor::IEditor" autoConnect="yes"/>
+                
+                <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                    <scene>
+                        <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+
+                        <renderer id="default" background="0.0" />
+
+                        <adaptor id="meshAdaptor" class="::visuVTKAdaptor::Mesh" objectId="mesh">
+                            <config renderer="default" picker="" />
+                        </adaptor>
+
+                        <adaptor uid="MPRNegatoScene3D" id="MPRNegato3D" class="::visuVTKAdaptor::NegatoMPR" objectId="image">
+                            <config renderer="default" picker="myPicker" mode="3D" slices="3" sliceIndex="axial" />
+                        </adaptor>
+                        <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self" >
+                            <config renderer="default" />
+                        </adaptor>
+
+                        <adaptor id="pickerInteractor" class="::visuVTKAdaptor::PickerInteractor" objectId="self" >
+                            <config renderer="default" picker="myPicker" />
+                        </adaptor>
+                    </scene>
+                </service>
+                
+                <service uid="manager" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes"  >
+                    <mode type="stop" />
+                    <config>
+                        <object id="image" type="::fwData::Image">
+                            <!-- This service convert a simple fwData::Image to medical Image -->
+                            <service uid="medicalImageConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController"  autoConnect="yes" />
+                            <service uid="sliceListEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor" autoConnect="yes">
+                                <negatoAdaptor uid="MPRNegatoScene3D" slices="3" />
+                            </service>
+                            <service uid="showScanEditor" type="::gui::editor::IEditor" impl="::uiImage::ShowScanEditor" autoConnect="no">
+                                <negatoAdaptor uid="MPRNegatoScene3D" />
+                            </service>
+                            <service uid="sliderIndexEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes" >
+                                <sliceIndex>axial</sliceIndex>
+                            </service>
+                        </object>
+                    </config>
+                </service>
+                
+                <proxy channel="UPDATER_CHANNEL" >
+                    <signal>imageUID/objectModified</signal>
+                    <signal>meshUID/objectModified</signal>
+                    <slot>updaterUID/receive</slot>
+                </proxy>
+                
+            </object>
+        </item>
+
+        <start uid="MyIHM" />
+        <start uid="updaterUID" />
+        <start uid="manager" />
+
+    </object>
+    </config>
+</extension>
+
+</plugin>
diff --git a/Apps/Tuto12Picker/rc/profile.xml b/Apps/Tuto12Picker/rc/profile.xml
new file mode 100644
index 0000000..98e630e
--- /dev/null
+++ b/Apps/Tuto12Picker/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="Tuto12Picker" version="0.1" check-single-instance="true">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto12Picker" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="Tuto12Picker" />
+    </activate>
+    <activate id="ctrlSelection" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="uiImageQt" version="0-1" />
+
+    <start id="visuVTK" />
+    <start id="visuVTKAdaptor" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto12Picker/rc/tuto.ico b/Apps/Tuto12Picker/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto12Picker/rc/tuto.ico differ
diff --git a/Apps/Tuto13Scene2D/CMakeLists.txt b/Apps/Tuto13Scene2D/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto13Scene2D/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto13Scene2D/COPYING b/Apps/Tuto13Scene2D/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto13Scene2D/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto13Scene2D/COPYING.LESSER b/Apps/Tuto13Scene2D/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto13Scene2D/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto13Scene2D/Properties.cmake b/Apps/Tuto13Scene2D/Properties.cmake
new file mode 100644
index 0000000..9a39629
--- /dev/null
+++ b/Apps/Tuto13Scene2D/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto13Scene2D )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io appXml gui guiQt dataReg servicesReg launcher scene2D uiVisu uiVisuQt )
+
diff --git a/Apps/Tuto13Scene2D/bin/build.options b/Apps/Tuto13Scene2D/bin/build.options
new file mode 100644
index 0000000..55ada3e
--- /dev/null
+++ b/Apps/Tuto13Scene2D/bin/build.options
@@ -0,0 +1,16 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [ 
+    'io_0-1'                ,
+    'appXml_0-1'            ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'launcher_0-1'          ,
+    'scene2D_0-1'           ,
+    'uiVisu_0-1'            ,
+    'uiVisuQt_0-1'
+ ]
+
+
diff --git a/Apps/Tuto13Scene2D/rc/plugin.xml b/Apps/Tuto13Scene2D/rc/plugin.xml
new file mode 100644
index 0000000..f0a6e27
--- /dev/null
+++ b/Apps/Tuto13Scene2D/rc/plugin.xml
@@ -0,0 +1,121 @@
+
+<plugin id="Tuto13Scene2D">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoScene2DConfig</id>
+        <type>parameters</type>
+        <config>
+            <object type="::fwData::Image">
+
+                <service uid="mainFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                    <gui>
+                        <frame>
+                            <name>TutoScene132D</name>
+                            <icon>Bundles/Tuto13Scene2D_0-1/tuto.ico</icon>
+                            <minSize width="800" height="600" />
+                        </frame>
+                    </gui>
+                    <registry>
+                        <view sid="GENERIC_UID_GlobalView" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="GENERIC_UID_GlobalView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                    <gui>
+                        <layout type="::fwGui::LineLayoutManager" >
+                            <orientation value="vertical" />
+                            <view caption="Scene2D" />
+                            <view caption="FloatEditor" proportion="0" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <view sid="GENERIC_UID_Scene2D" start="no" />
+                        <view sid="GENERIC_UID_FloatEditor" start="no" />
+                    </registry>
+                </service>
+                
+                <item key="compositeVisu">
+
+                    <object uid="compositeVisu" type="::fwData::Composite">
+                        
+                        <service uid="GENERIC_UID_Scene2D" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+                            <scene>
+
+                                <viewport id="view1" x="-100" y="-100" width="200" height="200" />
+
+                                <axis id="axe1" origin="0.0" scale="1.0" scaleType="LINEAR" />
+                                <!-- <axis id="axe1-5" origin="-5.0" scale="1.0" scaleType="LINEAR" />
+                                <axis id="axe1y" origin="5.0" scale="10.0" scaleType="LINEAR" />
+                                <axis id="axe2" origin="0.0" scale="50.0" scaleType="LOG" /> -->
+                                
+                                <!--
+                                <adaptor id="sin" class="::scene2D::adaptor::Sin" objectId="self">
+                                    <config xMin="-50" xMax="50" />
+                                </adaptor> 
+
+                                <adaptor id="grid1" class="::scene2D::adaptor::Grid2D" objectId="self">
+                                    <config xMin="-500" xMax="500" yMin="-500" yMax="500" xSpacing="10" ySpacing="10" color="green" xAxis="axe1" yAxis="axe1y"/>
+                                </adaptor>
+
+                                <adaptor id="abscissa" class="::scene2D::adaptor::Line" objectId="self">
+                                    <config x1="-1000" x2="1000" y1="0" y2="0" color="red" zValue="1" />
+                                </adaptor>
+
+                                <adaptor id="ordinate" class="::scene2D::adaptor::Line" objectId="self">
+                                    <config x1="0" x2="0" y1="-1000" y2="1000" color="red" zValue="1" />
+                                </adaptor>
+
+                                <adaptor id="grid2" class="::scene2D::adaptor::Grid2D" objectId="self">
+                                    <config xMin="-300" xMax="300" yMin="-300" yMax="300" xSpacing="10" ySpacing="10" color="blue" xAxis="axe1" yAxis="axe2" />
+                                </adaptor> -->
+                              
+                                <adaptor id="gridFromFloat" class="::scene2D::adaptor::GridFromFloat" objectId="data">
+                                    <config xMin="-150" xMax="150" yMin="-150" yMax="150" xSpacing="10" ySpacing="10" color="green" zValue="2" xAxis="axe1" yAxis="axe1" />
+                                </adaptor>
+                              
+                                <adaptor id="square1" class="::scene2D::adaptor::Square" objectId="self">
+                                    <config x="0" y="0" size="15" color="red" zValue="4" />
+                                </adaptor>
+                                
+                                <adaptor id="square2" class="::scene2D::adaptor::Square" objectId="self">
+                                    <config x="20" y="20" size="30" color="blue" zValue="3" />
+                                </adaptor>
+                                
+                                <adaptor id="abscissa" class="::scene2D::adaptor::Line" objectId="self">
+                                    <config x1="-100" x2="100" y1="0" y2="0" color="red" zValue="5" />
+                                </adaptor>
+
+                                <adaptor id="ordinate" class="::scene2D::adaptor::Line" objectId="self">
+                                    <config x1="0" x2="0" y1="-100" y2="100" color="red" zValue="6" />
+                                </adaptor>
+                                
+                            </scene>
+
+                        </service>
+                      
+                        <item key="data">
+
+                            <object uid="GENERIC_UID_Float" type="::fwData::Float">
+
+                                <service uid="GENERIC_UID_FloatEditor" impl="::uiVisu::BasicFloatEditor" type="::gui::editor::IEditor" autoConnect="yes"/>
+                              
+                            </object>
+
+                        </item>
+
+
+                    </object>
+
+                </item>
+
+                <start uid="mainFrame" />
+                <start uid="GENERIC_UID_Scene2D" />
+                <start uid="GENERIC_UID_FloatEditor" />
+              
+            </object>
+        </config>
+    </extension>
+</plugin>
diff --git a/Apps/Tuto13Scene2D/rc/profile.xml b/Apps/Tuto13Scene2D/rc/profile.xml
new file mode 100644
index 0000000..c5c5342
--- /dev/null
+++ b/Apps/Tuto13Scene2D/rc/profile.xml
@@ -0,0 +1,21 @@
+<profile name="tutoScene2DName" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="gui" version="0-1" />
+    <activate id="Tuto13Scene2D" />
+    <activate id="guiQt" version="0-1" />
+    <activate id="scene2D" version="0-1" />
+    
+    <activate id="uiVisu" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoScene2DConfig" />
+    </activate>
+
+    <start id="scene2D" />
+    <start id="appXml" />
+    <start id="guiQt" />
+    
+</profile>
diff --git a/Apps/Tuto13Scene2D/rc/tuto.ico b/Apps/Tuto13Scene2D/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto13Scene2D/rc/tuto.ico differ
diff --git a/Apps/Tuto14MeshGenerator/CMakeLists.txt b/Apps/Tuto14MeshGenerator/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto14MeshGenerator/COPYING b/Apps/Tuto14MeshGenerator/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto14MeshGenerator/COPYING.LESSER b/Apps/Tuto14MeshGenerator/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto14MeshGenerator/Properties.cmake b/Apps/Tuto14MeshGenerator/Properties.cmake
new file mode 100644
index 0000000..8be7153
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto14MeshGenerator )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS dataReg ctrlSelection gui guiQt ioData ioVTK io servicesReg uiVisuQt uiIO visuVTK visuVTKQt visuVTKAdaptor visu launcher appXml )
+
diff --git a/Apps/Tuto14MeshGenerator/bin/build.options b/Apps/Tuto14MeshGenerator/bin/build.options
new file mode 100644
index 0000000..9462342
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/bin/build.options
@@ -0,0 +1,21 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'dataReg_0-1'       ,
+    'ctrlSelection_0-1' ,
+    'gui_0-1'           ,
+    'guiQt_0-1'         ,
+    'ioData_0-1'        ,
+    'ioVTK_0-1'         ,
+    'io_0-1'            ,
+    'servicesReg_0-1'   ,
+    'uiVisuQt_0-1'      ,
+    'uiIO_0-1'          ,
+    'visuVTK_0-1'       ,
+    'visuVTKQt_0-1'     ,
+    'visuVTKAdaptor_0-1',
+    'visu_0-1'          ,
+    'launcher_0-1'      ,
+    'appXml_0-1'        ,
+ ]
diff --git a/Apps/Tuto14MeshGenerator/rc/plugin.xml b/Apps/Tuto14MeshGenerator/rc/plugin.xml
new file mode 100644
index 0000000..9490626
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/rc/plugin.xml
@@ -0,0 +1,222 @@
+<plugin id="Tuto14MeshGenerator">
+
+<requirement id="servicesReg" />
+
+<extension implements="::fwServices::registry::AppConfig">
+    <id>Tuto14MeshGenerator</id>
+    <type>parameters</type>
+    <config>
+
+        <object type="::fwData::Composite">
+            <service uid="MyIHM" impl="::gui::frame::DefaultFrame" type="::fwGui::IFrameSrv" autoConnect="no">
+                <gui>
+                    <frame>
+                        <name>Tuto14MeshGenerator</name>
+                        <icon>Bundles/Tuto14MeshGenerator_0-1/tuto.ico</icon>
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="myMenuBar" start="yes" />
+                    <view sid="multiView_scene1" start="yes" />
+                </registry>
+            </service>
+            
+            <service uid="myMenuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Modify" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menu_File" start="yes" />
+                    <menu sid="menu_Modifier" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="Open file" shortcut="Ctrl+O" />
+                        <menuItem name="Save file" shortcut="Ctrl+S" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="action_openFile" start="yes" />
+                    <menuItem sid="action_saveFile" start="yes" />
+                    <menuItem sid="action_quit" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menu_Modifier" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="Shake mesh point" shortcut="Q" />
+                        <separator />
+                        <menuItem name="Colorize mesh point" shortcut="U" />
+                        <menuItem name="Colorize mesh cells" shortcut="I" />
+                        <separator />
+                        <menuItem name="Compute point normals" shortcut="O" />
+                        <menuItem name="Compute cell normals" shortcut="P" />
+                        <separator />
+                        <menuItem name="Shake point normals" shortcut="L" />
+                        <menuItem name="Shake cell normals" shortcut="M" />
+                        <separator />
+                        <menuItem name="Show point normals" style="radio" shortcut="2" />
+                        <menuItem name="Show cell normals" style="radio" shortcut="1" />
+                        <menuItem name="Hide normals" style="radio" shortcut="0" />
+                        <separator />
+                        <menuItem name="Show point colors" style="radio" shortcut="4" />
+                        <menuItem name="Show cell colors" style="radio" shortcut="5" />
+                        <menuItem name="Hide colors" style="radio" shortcut="6" />
+                        <separator />
+                        <menuItem name="mesh deformation" shortcut="D"/>
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="action_shakeMeshPoint" start="yes" />
+                    <menuItem sid="action_colorizeMeshPoints" start="yes" />
+                    <menuItem sid="action_colorizeMeshCells" start="yes" />
+                    <menuItem sid="action_computePointNormals" start="yes" />
+                    <menuItem sid="action_computeCellNormals" start="yes" />
+                    <menuItem sid="action_shakePointNormals" start="yes" />
+                    <menuItem sid="action_shakeCellNormals" start="yes" />
+
+                    <menuItem sid="action_showPointNormals" start="yes" />                    
+                    <menuItem sid="action_showCellNormals" start="yes" />                    
+                    <menuItem sid="action_hideNormals" start="yes" />
+                    
+                    <menuItem sid="action_showPointColors" start="yes" />                    
+                    <menuItem sid="action_showCellColors" start="yes" />                    
+                    <menuItem sid="action_hideColors" start="yes" />
+                    
+                    <menuItem sid="action_meshDeformation" start="yes" />
+                                        
+                </registry>
+            </service>
+            
+            <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="myReaderMesh" />
+            </service>
+            <service uid="action_saveFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="myWriterMesh" />
+            </service>
+            <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+            <service uid="multiView_scene1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager" >
+                        <view align="center" />
+                        <view align="bottom" minWidth="400" minHeight="30" resizable="no" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="genericScene" start="yes" />
+                </registry>
+            </service>
+
+            <!-- CompositeVisu description -->
+            <item key="myCompositeVisu">
+                <object uid="myCompositeVisu" type="::fwData::Composite">
+
+                    <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+                            <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+
+                            <renderer id="default" background="0.0" />
+                            <adaptor id="myRenderAdaptor" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" picker="" />
+                            </adaptor>
+                            <adaptor id="myTrianAdaptor" class="::visuVTKAdaptor::TriangularMesh" objectId="myTrianMesh">
+                                <config renderer="default" picker="" />
+                            </adaptor>
+                            <adaptor id="myMeshAdaptor" class="::visuVTKAdaptor::Mesh" objectId="myMesh">
+                                <config renderer="default" picker="" />
+                            </adaptor>
+                            <adaptor id="myMeshNormalsAdaptor" class="::visuVTKAdaptor::MeshNormals" objectId="myMesh">
+                                <config renderer="default" picker="" normal="CELL" />
+                            </adaptor>
+                        </scene>
+                    </service>
+
+                    <item key="myMesh">
+                        <object type="::fwData::Mesh">
+                            <service uid="myReaderMesh" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                                <type mode="reader" />
+                            </service>
+                            <service uid="myWriterMesh" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                                <type mode="writer" />
+                            </service>
+                            <service uid="action_shakeMeshPoint" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ShakeMeshPoint" />
+                            </service>
+                            <service uid="action_colorizeMeshPoints" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ColorizeMeshPoints" />
+                            </service>
+                            <service uid="action_colorizeMeshCells" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ColorizeMeshCells" />
+                            </service>
+                            <service uid="action_computePointNormals" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ComputePointNormals" />
+                            </service>
+                            <service uid="action_computeCellNormals" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ComputeCellNormals" />
+                            </service>
+                            <service uid="action_shakePointNormals" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ShakePointNormals" />
+                            </service>
+                            <service uid="action_shakeCellNormals" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="ShakeCellNormals" />
+                            </service>
+                            <service uid="action_showCellNormals" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no" >
+                                <state active="true" />
+                                <notify type="::fwComEd::MeshMsg" event="SHOW_CELL_NORMALS" />
+                            </service>
+                            <service uid="action_showPointNormals" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no">
+                                <notify type="::fwComEd::MeshMsg" event="SHOW_POINT_NORMALS" />
+                            </service>
+                            <service uid="action_hideNormals" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no">
+                                <notify type="::fwComEd::MeshMsg" event="HIDE_NORMALS" />
+                            </service>
+                            
+                            <service uid="action_meshDeformation" impl="::ioData::action::SMeshModifier" type="::fwGui::IActionSrv" autoConnect="no">
+                                <config functor="MeshDeformation" />
+                            </service>
+                            
+                            <service uid="action_showPointColors" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no">
+                                <notify type="::fwComEd::MeshMsg" event="SHOW_POINT_COLORS" />
+                            </service>
+                            <service uid="action_showCellColors" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no">
+                                <notify type="::fwComEd::MeshMsg" event="SHOW_CELL_COLORS" />
+                            </service>
+                            <service uid="action_hideColors" impl="::gui::action::ActionNotifyService" type="::fwGui::IActionSrv" autoConnect="no">
+                                <notify type="::fwComEd::MeshMsg" event="HIDE_COLORS" />
+                            </service>
+                                                        
+                            <service uid="msgWrapper" impl="::ctrlSelection::wrapper::MsgWrapperSrv" type="::ctrlSelection::IWrapperSrv" autoConnect="yes">
+                                <wrapper onEvent="ObjectMsg::UPDATED_OBJECT" toEvent="NEW_MESH" toMsgType="::fwComEd::MeshMsg" />
+                            </service>
+                            
+                        </object>
+                    </item>
+                    
+                    <item key="myTrianMesh">
+                        <object type="::fwData::TriangularMesh">
+                            
+                        </object>
+                    </item>
+                </object>
+            </item>
+
+            <start uid="MyIHM" />
+            <start uid="msgWrapper" />
+            
+        </object>
+        
+    </config>
+</extension>
+
+</plugin>
diff --git a/Apps/Tuto14MeshGenerator/rc/profile.xml b/Apps/Tuto14MeshGenerator/rc/profile.xml
new file mode 100644
index 0000000..039bfb2
--- /dev/null
+++ b/Apps/Tuto14MeshGenerator/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="Tuto14MeshGenerator" version="0.1" check-single-instance="true"> 
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" /> 
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto14MeshGenerator" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="Tuto14MeshGenerator" />
+    </activate>
+
+    <activate id="ctrlSelection" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+ 
+    <start id="visuVTK" />
+    <start id="visuVTKAdaptor" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/Tuto14MeshGenerator/rc/tuto.ico b/Apps/Tuto14MeshGenerator/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto14MeshGenerator/rc/tuto.ico differ
diff --git a/Apps/Tuto15Multithread/CMakeLists.txt b/Apps/Tuto15Multithread/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/Tuto15Multithread/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/Tuto15Multithread/COPYING b/Apps/Tuto15Multithread/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto15Multithread/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto15Multithread/COPYING.LESSER b/Apps/Tuto15Multithread/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto15Multithread/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto15Multithread/Properties.cmake b/Apps/Tuto15Multithread/Properties.cmake
new file mode 100644
index 0000000..7588575
--- /dev/null
+++ b/Apps/Tuto15Multithread/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto15Multithread )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io gui guiQt dataReg servicesReg visu visuVTKQt ioVTK ioData vtkSimpleMesh uiIO appXml launcher )
+
diff --git a/Apps/Tuto15Multithread/bin/build.options b/Apps/Tuto15Multithread/bin/build.options
new file mode 100644
index 0000000..2877574
--- /dev/null
+++ b/Apps/Tuto15Multithread/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'visu_0-1'              ,
+    'visuVTKQt_0-1'         ,
+    'launcher_0-1'          ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+    'vtkSimpleMesh_0-1'     ,
+    'uiIO_0-1'              ,
+    'appXml_0-1'            ,
+ ]
diff --git a/Apps/Tuto15Multithread/rc/configurations/config-dynamic.xml b/Apps/Tuto15Multithread/rc/configurations/config-dynamic.xml
new file mode 100644
index 0000000..5926beb
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/configurations/config-dynamic.xml
@@ -0,0 +1,156 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>tuto15MultithreadDynamicConfig</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" default="g"/>
+    </parameters>
+    <config>
+
+
+        <!-- In tutoComChannel, the main data object type is ::fwData::Mesh. -->
+        <object type="::fwData::Mesh">
+
+            <service uid="${GENERIC_UID}_frame" impl="::gui::frame::DefaultFrame" >
+                <gui>
+                    <frame>
+                        <name>Tuto15Multithread (dynamic version)</name>
+                        <icon>Bundles/Tuto15Multithread_0-1/tuto.ico</icon>
+                        <minSize width="720" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="${GENERIC_UID}_menuBar" start="yes" />
+                    <view sid="${GENERIC_UID}_view" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_menuBar" impl="::gui::aspect::DefaultMenuBarSrv" >
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="View" />
+                        <menu name="Deformation" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="${GENERIC_UID}_fileMenu" start="yes" />
+                    <menu sid="${GENERIC_UID}_viewMenu" start="yes" />
+                    <menu sid="${GENERIC_UID}_deformationMenu" start="yes" />
+                </registry>
+            </service>
+
+            <!-- The application contains three different views. The different views are characterized by their 
+            associated service uid. Furthermore, a minimum window height and a width are given to the last two views.-->
+            <service uid="${GENERIC_UID}_view" impl="::gui::view::DefaultView" >
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="1" />
+                        <view proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view wid="${GENERIC_UID}_rendering1View" />
+                    <view wid="${GENERIC_UID}_rendering2View" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_fileMenu" impl="::gui::aspect::DefaultMenuSrv" >
+                <gui>
+                    <layout>
+                        <menuItem name="Open file" shortcut="Ctrl+O" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_openFileAction" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_quitAction" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_deformationMenu" impl="::gui::aspect::DefaultMenuSrv" >
+                <gui>
+                    <layout>
+                        <menuItem name="Start deformation" shortcut="Ctrl+D" />
+                        <menuItem name="Stop deformation" shortcut="Ctrl+F" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_startDeformationAction" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_stopDeformationAction" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_viewMenu" impl="::gui::aspect::DefaultMenuSrv" >
+                <gui>
+                    <layout>
+                        <menuItem name="Render A" style="check" />
+                        <menuItem name="Render B" style="check" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_rendering1Action" start="no" />
+                    <menuItem sid="${GENERIC_UID}_rendering2Action" start="no" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_openFileAction" impl="::gui::action::StarterActionService" >
+                <start uid="${GENERIC_UID}_reader" />
+            </service>
+
+            <service uid="${GENERIC_UID}_quitAction" impl="::gui::action::QuitAction"  />
+
+            <service uid="${GENERIC_UID}_startDeformationAction" impl="::gui::action::SSlotCaller" >
+                <slots>
+                    <slot>${GENERIC_UID}_meshDeformation/startDeformation</slot>
+                </slots>
+            </service>
+
+            <service uid="${GENERIC_UID}_stopDeformationAction" impl="::gui::action::SSlotCaller" >
+                <slots>
+                    <slot>${GENERIC_UID}_meshDeformation/stopDeformation</slot>
+                </slots>
+            </service>
+
+            <service uid="${GENERIC_UID}_reader" impl="::uiIO::editor::IOSelectorService" >
+                <type mode="reader" />
+            </service>
+
+            <!-- Mesh deformation service. -->
+            <service uid="${GENERIC_UID}_meshDeformation" impl="::vtkSimpleMesh::SSimpleMeshDeformation"  worker="DEFORMATION_WORKER" />
+
+            <service uid="${GENERIC_UID}_rendering1Action" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                <config>
+                    <appConfig id="tuto15MultithreadMeshViewConfig" >
+                        <parameters>
+                            <parameter replace="meshUid" by="self" />
+                            <parameter replace="parentViewId" by="${GENERIC_UID}_rendering1View" />
+                            <parameter replace="channelId" by="camera" />
+                        </parameters>
+                    </appConfig>
+                </config>
+            </service>
+
+            <service uid="${GENERIC_UID}_rendering2Action" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                <config>
+                    <appConfig id="tuto15MultithreadMeshViewConfig" >
+                        <parameters>
+                            <parameter replace="meshUid" by="self" />
+                            <parameter replace="parentViewId" by="${GENERIC_UID}_rendering2View" />
+                            <parameter replace="channelId" by="camera" />
+                        </parameters>
+                    </appConfig>
+                </config>
+            </service>
+            
+            <start uid="${GENERIC_UID}_frame" />
+            <start uid="${GENERIC_UID}_meshDeformation" />
+            <start uid="${GENERIC_UID}_rendering1Action" />
+            <start uid="${GENERIC_UID}_rendering2Action" />
+
+        </object>
+
+    </config>
+</extension>
\ No newline at end of file
diff --git a/Apps/Tuto15Multithread/rc/configurations/config.xml b/Apps/Tuto15Multithread/rc/configurations/config.xml
new file mode 100644
index 0000000..a0098f3
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/configurations/config.xml
@@ -0,0 +1,136 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>tuto15MultithreadConfig</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" default="g"/>
+    </parameters>
+    <config>
+
+
+        <!-- In tutoComChannel, the main data object type is ::fwData::Mesh. -->
+        <object type="::fwData::Mesh">
+
+            <service uid="${GENERIC_UID}_frame" impl="::gui::frame::DefaultFrame" >
+                <gui>
+                    <frame>
+                        <name>Tuto15Multithread</name>
+                        <icon>Bundles/Tuto15Multithread_0-1/tuto.ico</icon>
+                        <minSize width="720" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="${GENERIC_UID}_menuBar" start="yes" />
+                    <view sid="${GENERIC_UID}_view" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_menuBar" impl="::gui::aspect::DefaultMenuBarSrv" >
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Deformation" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="${GENERIC_UID}_fileMenu" start="yes" />
+                    <menu sid="${GENERIC_UID}_deformationMenu" start="yes" />
+                </registry>
+            </service>
+
+            <!-- The application contains three different views. The different views are characterized by their 
+            associated service uid. Furthermore, a minimum window height and a width are given to the last two views.-->
+            <service uid="${GENERIC_UID}_view" impl="::gui::view::DefaultView" >
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="1" />
+                        <view proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_rendering1" start="yes" />
+                    <view sid="${GENERIC_UID}_rendering2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_fileMenu" impl="::gui::aspect::DefaultMenuSrv" >
+                <gui>
+                    <layout>
+                        <menuItem name="Open file" shortcut="Ctrl+O" />
+                        <separator />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_openFileAction" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_quitAction" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_deformationMenu" impl="::gui::aspect::DefaultMenuSrv" >
+                <gui>
+                    <layout>
+                        <menuItem name="Start deformation" shortcut="Ctrl+D" />
+                        <menuItem name="Stop deformation" shortcut="Ctrl+F" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_startDeformationAction" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_stopDeformationAction" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="${GENERIC_UID}_openFileAction" impl="::gui::action::StarterActionService" >
+                <start uid="${GENERIC_UID}_reader" />
+            </service>
+
+            <service uid="${GENERIC_UID}_quitAction" impl="::gui::action::QuitAction"  />
+
+            <service uid="${GENERIC_UID}_startDeformationAction" impl="::gui::action::SSlotCaller" >
+                <slots>
+                    <slot>${GENERIC_UID}_meshDeformation/startDeformation</slot>
+                </slots>
+            </service>
+
+            <service uid="${GENERIC_UID}_stopDeformationAction" impl="::gui::action::SSlotCaller" >
+                <slots>
+                    <slot>${GENERIC_UID}_meshDeformation/stopDeformation</slot>
+                </slots>
+            </service>
+
+            <service uid="${GENERIC_UID}_reader" impl="::uiIO::editor::IOSelectorService" >
+                <type mode="reader" />
+            </service>
+
+            <!-- Visualization service for the first window. -->
+            <service uid="${GENERIC_UID}_rendering1" impl="::vtkSimpleMesh::RendererService" autoConnect="yes" />
+
+
+            <!-- Visualization service for the second window -->
+            <service uid="${GENERIC_UID}_rendering2" impl="::vtkSimpleMesh::RendererService" autoConnect="yes" />
+
+            <!-- Mesh deformation service. -->
+            <service uid="${GENERIC_UID}_meshDeformation" impl="::vtkSimpleMesh::SSimpleMeshDeformation"  worker="DEFORMATION_WORKER" />
+
+
+            <!-- Connect the signal slot of the service to receive the updating of camera position -->
+            <connect>
+                <signal>${GENERIC_UID}_rendering1/camUpdated</signal>
+                <slot>${GENERIC_UID}_rendering2/updateCamPosition</slot>
+            </connect>
+
+            <connect>
+                <signal>${GENERIC_UID}_rendering2/camUpdated</signal>
+                <slot>${GENERIC_UID}_rendering1/updateCamPosition</slot>
+            </connect>
+
+
+            <start uid="${GENERIC_UID}_frame" />
+            <start uid="${GENERIC_UID}_meshDeformation" />
+
+        </object>
+
+    </config>
+</extension>
\ No newline at end of file
diff --git a/Apps/Tuto15Multithread/rc/configurations/mesh-visu.xml b/Apps/Tuto15Multithread/rc/configurations/mesh-visu.xml
new file mode 100644
index 0000000..85e1161
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/configurations/mesh-visu.xml
@@ -0,0 +1,38 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>tuto15MultithreadMeshViewConfig</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" />
+        <param name="meshUid" />
+        <param name="parentViewId" />
+        <param name="channelId" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite" >
+            
+            <item key="mesh">
+                <object uid="${meshUid}" type="::fwData::Mesh" src="ref">
+
+                    <!-- Visualization service for the first window. -->
+                    <service uid="${GENERIC_UID}_rendering" impl="::vtkSimpleMesh::RendererService" autoConnect="yes">
+                        <registry>
+                            <parent wid="${parentViewId}" />
+                        </registry>
+                    </service>
+        
+                </object>
+            </item>
+            
+            <!-- Connect the signal slot of the service to receive the updating of camera position -->
+            <proxy channel="${channelId}" >
+                <signal>${GENERIC_UID}_rendering/camUpdated</signal>
+                <slot>${GENERIC_UID}_rendering/updateCamPosition</slot>
+            </proxy>
+        
+            <start uid="${GENERIC_UID}_rendering" />
+            
+        </object>
+        
+    </config>
+</extension>
\ No newline at end of file
diff --git a/Apps/Tuto15Multithread/rc/plugin.xml b/Apps/Tuto15Multithread/rc/plugin.xml
new file mode 100644
index 0000000..71a203c
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/plugin.xml
@@ -0,0 +1,11 @@
+<plugin id="Tuto15Multithread">
+
+    <requirement id="servicesReg" />
+
+    <xi:include href="configurations/config.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    
+    <xi:include href="configurations/mesh-visu.xml"   xmlns:xi="http://www.w3.org/2003/XInclude" />
+    
+    <xi:include href="configurations/config-dynamic.xml"   xmlns:xi="http://www.w3.org/2003/XInclude" />
+    
+</plugin>
diff --git a/Apps/Tuto15Multithread/rc/profile.xml b/Apps/Tuto15Multithread/rc/profile.xml
new file mode 100644
index 0000000..bf1179a
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/profile.xml
@@ -0,0 +1,31 @@
+<profile name="tuto15Multithread" version="0.1">
+
+    <!-- Basic bundles list. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto15Multithread" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tuto15MultithreadConfig" />
+    </activate>
+
+    <!-- Specific bundles list. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+        
+</profile>
diff --git a/Apps/Tuto15Multithread/rc/profileDynamic.xml b/Apps/Tuto15Multithread/rc/profileDynamic.xml
new file mode 100644
index 0000000..694f177
--- /dev/null
+++ b/Apps/Tuto15Multithread/rc/profileDynamic.xml
@@ -0,0 +1,31 @@
+<profile name="tuto15Multithread" version="0.1">
+
+    <!-- Basic bundles list. -->
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="Tuto15Multithread" version="0-1" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tuto15MultithreadDynamicConfig" />
+    </activate>
+
+    <!-- Specific bundles list. -->
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="vtkSimpleMesh" version="0-1" />
+
+    <start id="dataReg" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+        
+</profile>
diff --git a/Apps/Tuto15Multithread/rc/tuto.ico b/Apps/Tuto15Multithread/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/Tuto15Multithread/rc/tuto.ico differ
diff --git a/Apps/Tuto15MultithreadCtrl/CMakeLists.txt b/Apps/Tuto15MultithreadCtrl/CMakeLists.txt
new file mode 100644
index 0000000..15cd4c1
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
diff --git a/Apps/Tuto15MultithreadCtrl/COPYING b/Apps/Tuto15MultithreadCtrl/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/Tuto15MultithreadCtrl/COPYING.LESSER b/Apps/Tuto15MultithreadCtrl/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/Tuto15MultithreadCtrl/Properties.cmake b/Apps/Tuto15MultithreadCtrl/Properties.cmake
new file mode 100644
index 0000000..782181e
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME Tuto15MultithreadCtrl )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwData fwServices fwCom fwThread fwComEd )
+set( REQUIREMENTS dataReg servicesReg launcher )
+
diff --git a/Apps/Tuto15MultithreadCtrl/bin/build.options b/Apps/Tuto15MultithreadCtrl/bin/build.options
new file mode 100755
index 0000000..7774a1b
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/bin/build.options
@@ -0,0 +1,26 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+REQUIREMENTS = ['launcher_0-1' ]
+
+BUNDLES = [
+    # 'io_0-1'                ,
+    # 'gui_0-1'               ,
+    # 'guiQt_0-1'             ,
+    'dataReg_0-1'             ,
+    'servicesReg_0-1'         ,
+    # 'visu_0-1'              ,
+    # 'visuVTKQt_0-1'         ,
+    # 'ioVTK_0-1'             ,
+    # 'vtkSimpleMesh_0-1'     ,
+    # 'uiIO_0-1'              ,
+    # 'appXml_0-1'            ,
+ ]
+
+LIB = [
+    'fwData_0-1'        ,
+    'fwServices_0-1'    ,
+    'fwCom_0-1'         ,
+    'fwThread_0-1'      ,
+    'fwComEd_0-1'       ,
+ ]
+
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Namespace.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Namespace.hpp
new file mode 100644
index 0000000..5af73b5
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTO15MULTITHREADCTRL_NAMESPACE_HPP_
+#define _TUTO15MULTITHREADCTRL_NAMESPACE_HPP_
+
+/**
+ * @brief       The namespace Tuto15MultithreadCtrl contains a few multithread example.
+ * @namespace   Tuto15MultithreadCtrl
+ * 
+ * @date        2012.
+ */
+namespace Tuto15MultithreadCtrl
+{
+
+}
+#endif // _TUTO15MULTITHREADCTRL_NAMESPACE_HPP_
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Plugin.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Plugin.hpp
new file mode 100644
index 0000000..3615e7b
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/Plugin.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTO15MULTITHREADCTRL_PLUGIN_HPP_
+#define _TUTO15MULTITHREADCTRL_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "Tuto15MultithreadCtrl/config.hpp"
+
+namespace Tuto15MultithreadCtrl
+{
+
+/**
+ * @brief Class call when bundle is started/stopped
+ * 
+ * @date    2012
+ */
+class TUTO15MULTITHREADCTRL_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public :
+
+    /// PLugin destructor
+    TUTO15MULTITHREADCTRL_API ~Plugin() throw();
+
+    /// This method is used by runtime to initialize the bundle.
+    TUTO15MULTITHREADCTRL_API void start() throw( ::fwRuntime::RuntimeException );
+
+    /// This method is used by runtime to stop the bundle.
+    TUTO15MULTITHREADCTRL_API void stop() throw();
+
+    TUTO15MULTITHREADCTRL_API void initialize() throw( ::fwRuntime::RuntimeException );
+
+    TUTO15MULTITHREADCTRL_API void uninitialize() throw();
+
+    TUTO15MULTITHREADCTRL_API int run() throw();
+
+};
+
+} // namespace Tuto15MultithreadCtrl
+
+#endif //_TUTO15MULTITHREADCTRL_PLUGIN_HPP_
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SIncrementArray.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SIncrementArray.hpp
new file mode 100644
index 0000000..bfc6685
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SIncrementArray.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __TUTO15MULTITHREADCTRL_SINCREMENTARRAY_HPP__
+#define __TUTO15MULTITHREADCTRL_SINCREMENTARRAY_HPP__
+
+#include <fwServices/IService.hpp>
+
+
+#include "Tuto15MultithreadCtrl/config.hpp"
+
+fwCorePredeclare((fwThread)(Timer));
+
+namespace Tuto15MultithreadCtrl
+{
+
+class TUTO15MULTITHREADCTRL_CLASS_API SIncrementArray : public ::fwServices::IService
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SIncrementArray)(::fwServices::IService) ) ;
+
+    TUTO15MULTITHREADCTRL_API SIncrementArray() throw();
+    TUTO15MULTITHREADCTRL_API virtual ~SIncrementArray() throw();
+
+    void setPeriod( unsigned int period )
+    {
+        m_periodInMillisec = period ;
+    }
+
+protected:
+
+    virtual void starting() throw(::fwTools::Failed);
+
+    virtual void stopping() throw(::fwTools::Failed);
+
+    virtual void swapping() throw ( ::fwTools::Failed );
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void configuring() throw(fwTools::Failed);
+
+    //virtual void info( std::ostream &_sstream ) ;
+
+    SPTR( fwThread::Timer ) m_timer;
+
+    unsigned int m_periodInMillisec;
+
+};
+
+}  // namespace Tuto15MultithreadCtrl
+
+#endif  // __TUTO15MULTITHREADCTRL_SINCREMENTARRAY_HPP__
+
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SReadArray.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SReadArray.hpp
new file mode 100644
index 0000000..0185a09
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SReadArray.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __TUTO15MULTITHREADCTRL_SREADARRAY_HPP__
+#define __TUTO15MULTITHREADCTRL_SREADARRAY_HPP__
+
+#include <fwServices/IService.hpp>
+
+#include "Tuto15MultithreadCtrl/config.hpp"
+
+namespace Tuto15MultithreadCtrl
+{
+
+class TUTO15MULTITHREADCTRL_CLASS_API SReadArray : public ::fwServices::IService
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SReadArray)(::fwServices::IService) ) ;
+
+    TUTO15MULTITHREADCTRL_API SReadArray() throw();
+    TUTO15MULTITHREADCTRL_API virtual ~SReadArray() throw();
+
+protected:
+
+    virtual void starting() throw(::fwTools::Failed);
+
+    virtual void stopping() throw(::fwTools::Failed);
+
+    virtual void swapping() throw ( ::fwTools::Failed );
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void configuring() throw(fwTools::Failed);
+
+    //virtual void info( std::ostream &_sstream ) ;
+
+
+};
+
+}  // namespace Tuto15MultithreadCtrl
+
+#endif  // __TUTO15MULTITHREADCTRL_SREADARRAY_HPP__
+
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SShowArray.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SShowArray.hpp
new file mode 100644
index 0000000..9bf9556
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/SShowArray.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __TUTO15MULTITHREADCTRL_SSHOWARRAY_HPP__
+#define __TUTO15MULTITHREADCTRL_SSHOWARRAY_HPP__
+
+#include <fwServices/IService.hpp>
+
+#include "Tuto15MultithreadCtrl/config.hpp"
+
+namespace Tuto15MultithreadCtrl
+{
+
+class TUTO15MULTITHREADCTRL_CLASS_API SShowArray : public ::fwServices::IService
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SShowArray)(::fwServices::IService) ) ;
+
+    TUTO15MULTITHREADCTRL_API SShowArray() throw();
+    TUTO15MULTITHREADCTRL_API virtual ~SShowArray() throw();
+
+protected:
+
+    virtual void starting() throw(::fwTools::Failed);
+
+    virtual void stopping() throw(::fwTools::Failed);
+
+    virtual void swapping() throw ( ::fwTools::Failed );
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void configuring() throw(fwTools::Failed);
+
+    //virtual void info( std::ostream &_sstream ) ;
+
+
+};
+
+}  // namespace Tuto15MultithShowCtrl
+
+#endif  // __TUTO15MULTITHREADCTRL_SSHOWARRAY_HPP__
+
diff --git a/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/config.hpp b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/config.hpp
new file mode 100644
index 0000000..64eb748
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/include/Tuto15MultithreadCtrl/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTO15MULTITHREADCTRL_CONFIG_HPP_
+#define _TUTO15MULTITHREADCTRL_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef TUTO15MULTITHREADCTRL_EXPORTS
+    #define TUTO15MULTITHREADCTRL_API __declspec(dllexport)
+    #else
+    #define TUTO15MULTITHREADCTRL_API __declspec(dllimport)
+    #endif
+
+    #define TUTO15MULTITHREADCTRL_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef TUTO15MULTITHREADCTRL_EXPORTS
+    #define TUTO15MULTITHREADCTRL_API __attribute__ ((visibility("default")))
+    #define TUTO15MULTITHREADCTRL_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define TUTO15MULTITHREADCTRL_API __attribute__ ((visibility("hidden")))
+    #define TUTO15MULTITHREADCTRL_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define TUTO15MULTITHREADCTRL_API
+    #define TUTO15MULTITHREADCTRL_CLASS_API
+
+#endif
+
+#endif //_TUTO15MULTITHREADCTRL_CONFIG_HPP_
diff --git a/Apps/Tuto15MultithreadCtrl/rc/plugin.xml b/Apps/Tuto15MultithreadCtrl/rc/plugin.xml
new file mode 100644
index 0000000..c36643b
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/rc/plugin.xml
@@ -0,0 +1,24 @@
+<plugin id="Tuto15MultithreadCtrl" class="::Tuto15MultithreadCtrl::Plugin">
+
+    <requirement id="servicesReg" />
+    <library name="Tuto15MultithreadCtrl" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IService</type>
+        <service>::Tuto15MultithreadCtrl::SReadArray</service>
+        <object>::fwData::Array</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IService</type>
+        <service>::Tuto15MultithreadCtrl::SShowArray</service>
+        <object>::fwData::Array</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IService</type>
+        <service>::Tuto15MultithreadCtrl::SIncrementArray</service>
+        <object>::fwData::Array</object>
+    </extension>
+
+</plugin>
diff --git a/Apps/Tuto15MultithreadCtrl/rc/profile.xml b/Apps/Tuto15MultithreadCtrl/rc/profile.xml
new file mode 100644
index 0000000..25a19d3
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/rc/profile.xml
@@ -0,0 +1,10 @@
+<profile name="Tuto15MultithreadCtrl" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    
+    <activate id="Tuto15MultithreadCtrl" version="0-1" />
+
+    <start id="Tuto15MultithreadCtrl" />
+
+</profile>
\ No newline at end of file
diff --git a/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/Plugin.cpp b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/Plugin.cpp
new file mode 100644
index 0000000..9559c3a
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/Plugin.cpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#include <cmath>
+
+#include <fwRuntime/profile/Profile.hpp>
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/Object.hpp>
+
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include "Tuto15MultithreadCtrl/Plugin.hpp"
+#include "Tuto15MultithreadCtrl/SReadArray.hpp"
+
+namespace Tuto15MultithreadCtrl
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::Tuto15MultithreadCtrl::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::profile::getCurrentProfile()->setRunCallback(::boost::bind(&Plugin::run, this));
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::initialize() throw( ::fwRuntime::RuntimeException )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::uninitialize() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+int Plugin::run() throw()
+{
+
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+
+    ::fwServices::IService::sptr srvRead =
+        ::fwServices::registry::ServiceFactory::getDefault()
+        ->create("::fwServices::IService", "::Tuto15MultithreadCtrl::SReadArray");
+    ::fwServices::IService::sptr srvShow =
+        ::fwServices::registry::ServiceFactory::getDefault()
+        ->create("::fwServices::IService", "::Tuto15MultithreadCtrl::SShowArray");
+    ::fwServices::IService::sptr srvIncrement =
+        ::fwServices::registry::ServiceFactory::getDefault()
+        ->create("::fwServices::IService", "::Tuto15MultithreadCtrl::SIncrementArray");
+
+    ::fwServices::OSR::registerService(array, srvRead);
+    ::fwServices::OSR::registerService(array, srvShow);
+    ::fwServices::OSR::registerService(array, srvIncrement);
+
+    SLM_ASSERT("Failed to create service", srvRead);
+    SLM_ASSERT("Failed to create service", srvShow);
+    SLM_ASSERT("Failed to create service", srvIncrement);
+
+    ::fwThread::Worker::sptr worker1 = ::fwThread::Worker::New();
+    ::fwThread::Worker::sptr worker2 = ::fwThread::Worker::New();
+    ::fwThread::Worker::sptr worker3 = ::fwThread::Worker::New();
+
+    // ::fwServices::registry::ActiveWorkers::sptr workers = ::fwServices::registry::ActiveWorkers::getDefault();
+    // workers->addWorker("worker1", worker1);
+    // workers->addWorker("worker2", worker2);
+    // workers->addWorker("worker3", worker3);
+
+    srvRead->setWorker(worker1);
+    srvShow->setWorker(worker2);
+    srvIncrement->setWorker(worker3);
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig
+        = array->signal< ::fwData::Object::ObjectModifiedSignalType>( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    ::fwCom::Connection showConnection = sig->connect(srvShow->slot( ::fwServices::IService::s_RECEIVE_SLOT) );
+    ::fwCom::Connection incrementConnection = sig->connect(srvIncrement->slot( ::fwServices::IService::s_RECEIVE_SLOT) );
+
+
+    srvRead->start().wait();
+    srvShow->start().wait();
+    srvIncrement->start().wait();
+
+    srvRead->update().wait();
+
+    unsigned long long count = 1<<30 ;
+    double d = 4<<2;
+
+    OSLM_INFO("Computing " << count << " square roots.");
+
+    for (unsigned long long i = 0; i < count ; ++i)
+    {
+        d = std::sqrt(d);
+    }
+
+    OSLM_INFO("Done computing " << count << " square roots : " << d);
+
+    // ::boost::this_thread::sleep_for( ::boost::chrono::seconds(10));
+
+    showConnection.disconnect();
+    incrementConnection.disconnect();
+
+    srvRead->stop().wait();
+    srvShow->stop().wait();
+    srvIncrement->stop().wait();
+
+
+    ::fwServices::OSR::unregisterService(srvRead);
+    ::fwServices::OSR::unregisterService(srvShow);
+    ::fwServices::OSR::unregisterService(srvIncrement);
+
+    srvRead.reset();
+    srvShow.reset();
+    srvIncrement.reset();
+
+    worker1->stop();
+    worker2->stop();
+    worker3->stop();
+
+    return 0;
+}
+
+
+} // namespace Tuto15MultithreadCtrl
diff --git a/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SIncrementArray.cpp b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SIncrementArray.cpp
new file mode 100644
index 0000000..dfc62eb
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SIncrementArray.cpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwThread/Timer.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include "Tuto15MultithreadCtrl/SIncrementArray.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IService , ::Tuto15MultithreadCtrl::SIncrementArray , ::fwData::Array ) ;
+
+namespace Tuto15MultithreadCtrl
+{
+
+SIncrementArray::SIncrementArray() throw() :
+    m_periodInMillisec(500)
+{
+}
+
+SIncrementArray::~SIncrementArray() throw()
+{
+}
+
+void SIncrementArray::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    m_timer = m_associatedWorker->createTimer();
+    m_timer->setFunction( ::boost::bind(&SIncrementArray::updating, this) );
+    m_timer->setDuration( ::boost::chrono::milliseconds(m_periodInMillisec) );
+}
+
+void SIncrementArray::stopping() throw( ::fwTools::Failed )
+{
+    m_timer.reset();
+}
+
+void SIncrementArray::updating() throw( ::fwTools::Failed )
+{
+    ::fwData::Array::sptr array = this->getObject< ::fwData::Array >();
+    ::fwData::mt::ObjectWriteLock writeLock(array);
+
+    SLM_ASSERT("No array.", array);
+    SLM_ASSERT("Array : bad number of dimensions.", array->getNumberOfDimensions() == 1 );
+
+    const int arraySize = array->getSize()[0];
+
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    unsigned int *buffer = static_cast< unsigned int* >( arrayHelper.getBuffer() );
+
+    for (int i = 0 ; i < arraySize; i++)
+    {
+        ++buffer[i];
+    }
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig
+        = array->signal< ::fwData::Object::ObjectModifiedSignalType>( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+
+    ::fwServices::ObjectMsg::sptr msg = ::fwServices::ObjectMsg::New();
+    msg->addEvent("MODIFIED_EVENT");
+    fwServicesBlockAndNotifyMsgMacro(this->getLightID(), sig, msg, m_slotReceive);
+}
+
+void SIncrementArray::configuring() throw( ::fwTools::Failed )
+{
+
+}
+
+void SIncrementArray::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    m_timer->start();
+}
+
+void SIncrementArray::swapping( ) throw( ::fwTools::Failed )
+{
+
+}
+
+} // namespace Tuto15MultithreadCtrl
diff --git a/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SReadArray.cpp b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SReadArray.cpp
new file mode 100644
index 0000000..84c9f29
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SReadArray.cpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Array.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include "Tuto15MultithreadCtrl/SReadArray.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IService , ::Tuto15MultithreadCtrl::SReadArray , ::fwData::Array ) ;
+
+namespace Tuto15MultithreadCtrl
+{
+
+SReadArray::SReadArray() throw()
+{
+}
+
+SReadArray::~SReadArray() throw()
+{
+}
+
+void SReadArray::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void SReadArray::stopping() throw( ::fwTools::Failed )
+{
+
+}
+
+void SReadArray::updating() throw( ::fwTools::Failed )
+{
+    ::fwData::Array::sptr array = this->getObject< ::fwData::Array >();
+    ::fwData::mt::ObjectWriteLock writeLock(array);
+    SLM_ASSERT("No array.", array);
+
+    const int arraySize = 10;
+
+    ::fwData::Array::SizeType size(1, arraySize);
+
+    array->resize("uint32", size, 1, true);
+
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    unsigned int *buffer = static_cast< unsigned int* >( arrayHelper.getBuffer() );
+
+    for (int i = 0 ; i < arraySize; i++)
+    {
+        buffer[i] = i;
+    }
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig
+        = array->signal< ::fwData::Object::ObjectModifiedSignalType>( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    ::fwServices::ObjectMsg::sptr msg = ::fwServices::ObjectMsg::New();
+    msg->addEvent("MODIFIED_EVENT");
+    sig->asyncEmit(msg);
+}
+
+void SReadArray::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+
+}
+
+void SReadArray::swapping( ) throw( ::fwTools::Failed )
+{
+
+}
+
+void SReadArray::configuring() throw( ::fwTools::Failed )
+{
+
+}
+
+} // namespace Tuto15MultithreadCtrl
diff --git a/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SShowArray.cpp b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SShowArray.cpp
new file mode 100644
index 0000000..9598f8e
--- /dev/null
+++ b/Apps/Tuto15MultithreadCtrl/src/Tuto15MultithreadCtrl/SShowArray.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iterator>
+#include <iostream>
+
+#include <fwData/Array.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "Tuto15MultithreadCtrl/SShowArray.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IService , ::Tuto15MultithreadCtrl::SShowArray , ::fwData::Array ) ;
+
+namespace Tuto15MultithreadCtrl
+{
+
+SShowArray::SShowArray() throw()
+{
+}
+
+SShowArray::~SShowArray() throw()
+{
+}
+
+void SShowArray::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void SShowArray::stopping() throw( ::fwTools::Failed )
+{
+
+}
+
+void SShowArray::updating() throw( ::fwTools::Failed )
+{
+
+}
+
+void SShowArray::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwData::Array::sptr array = this->getObject< ::fwData::Array >();
+    ::fwData::mt::ObjectReadLock readLock(array);
+    SLM_ASSERT("No array.", array);
+
+    ::fwComEd::helper::Array arrayHelper(array);
+    unsigned int *buffer = static_cast< unsigned int* >( arrayHelper.getBuffer() );
+
+    std::cout << "Buffer : ";
+    std::ostream_iterator<unsigned int> coutIter (std::cout,", ");
+    std::copy(buffer, buffer+10, coutIter );
+    std::cout << std::endl;
+}
+
+void SShowArray::swapping( ) throw( ::fwTools::Failed )
+{
+
+}
+
+void SShowArray::configuring() throw( ::fwTools::Failed )
+{
+
+}
+
+} // namespace Tuto15MultithreadCtrl
diff --git a/Apps/TutoGui/CMakeLists.txt b/Apps/TutoGui/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Apps/TutoGui/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Apps/TutoGui/COPYING b/Apps/TutoGui/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/TutoGui/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/TutoGui/COPYING.LESSER b/Apps/TutoGui/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/TutoGui/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/TutoGui/Properties.cmake b/Apps/TutoGui/Properties.cmake
new file mode 100644
index 0000000..a004cd7
--- /dev/null
+++ b/Apps/TutoGui/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME TutoGui )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS io appXml gui guiQt guiWx dataReg servicesReg launcher )
+
diff --git a/Apps/TutoGui/bin/build.options b/Apps/TutoGui/bin/build.options
new file mode 100644
index 0000000..afbddae
--- /dev/null
+++ b/Apps/TutoGui/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'guiQt_0-1'             ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'launcher_0-1'          ,
+    'appXml_0-1'            ,
+ ]
+
+
+if not (PLATFORM, ARCH) == ('osx', '64'):
+    BUNDLES += [
+            'guiWx_0-1'    ,
+            ]
+
diff --git a/Apps/TutoGui/rc/icons/important.png b/Apps/TutoGui/rc/icons/important.png
new file mode 100644
index 0000000..263fbd5
Binary files /dev/null and b/Apps/TutoGui/rc/icons/important.png differ
diff --git a/Apps/TutoGui/rc/icons/monkey.png b/Apps/TutoGui/rc/icons/monkey.png
new file mode 100644
index 0000000..fb0204a
Binary files /dev/null and b/Apps/TutoGui/rc/icons/monkey.png differ
diff --git a/Apps/TutoGui/rc/icons/system.png b/Apps/TutoGui/rc/icons/system.png
new file mode 100644
index 0000000..abac7e9
Binary files /dev/null and b/Apps/TutoGui/rc/icons/system.png differ
diff --git a/Apps/TutoGui/rc/icons/unreadable.png b/Apps/TutoGui/rc/icons/unreadable.png
new file mode 100644
index 0000000..b94fc97
Binary files /dev/null and b/Apps/TutoGui/rc/icons/unreadable.png differ
diff --git a/Apps/TutoGui/rc/plugin.xml b/Apps/TutoGui/rc/plugin.xml
new file mode 100644
index 0000000..21d244c
--- /dev/null
+++ b/Apps/TutoGui/rc/plugin.xml
@@ -0,0 +1,235 @@
+<plugin id="TutoGui">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoGuiConfig</id>
+        <type>parameters</type>
+        <config>
+
+        <object type="::fwData::Image">
+           <service uid="myFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no" >
+                <gui>
+                    <frame>
+                        <name>TutoGui</name>
+                        <icon>Bundles/TutoGui_0-1/tuto.ico</icon>
+                        <minSize width="800" height="600"/>
+                    </frame>
+                    <menuBar />
+                    <toolBar >
+                        <toolBitmapSize height= "32" width="32" />
+                    </toolBar>
+                </gui>
+                <registry>
+                    <menuBar sid="menuBar" start="yes" />
+                    <toolBar sid="toolBar" start="yes" />
+                    <view sid="view" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menu name="My Menu"/>
+                        <menu name="My Menu 2"/>
+                        <menu name="My Menu 3"/>
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="myMenu" start="yes" />
+                    <menu sid="myMenu2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="My item 1" style="check" icon="Bundles/TutoGui_0-1/icons/important.png" />
+                        <separator />
+                        <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                        <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                        <separator />
+                        <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                        <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                        <separator />
+                        <menuItem name="start 2-3 / stop A-B" style="radio" icon="Bundles/TutoGui_0-1/icons/important.png" />
+                        <menuItem name="start A-B / stop 2-3" style="radio" icon="Bundles/TutoGui_0-1/icons/important.png" />
+                        <menuItem name="Quit" icon="Bundles/TutoGui_0-1/icons/unreadable.png"/>
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="item1" start="yes" />
+                    <menuItem sid="item2" start="no" />
+                    <menuItem sid="item3" start="no" />
+                    <menuItem sid="item4" start="no" />
+                    <menuItem sid="item5" start="no" />
+                    <menuItem sid="item16" start="yes" />
+                    <menuItem sid="item17" start="yes" />
+                    <menuItem sid="actionQuit" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="myMenu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="My item 1" shortcut="1" style="check" />
+                        <separator />
+                        <menuItem name="My item 2" shortcut="2" style="radio" />
+                        <menuItem name="My item 3" shortcut="3" style="radio" />
+                        <separator />
+                        <menuItem name="My item A" shortcut="A" style="radio" />
+                        <menuItem name="My item B" shortcut="B" style="radio" />
+                        <separator />
+                        <menuItem name="Quit" shortcut="Ctrl+Q" specialAction="QUIT" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="item1" start="no" />
+                    <menuItem sid="item2" start="no" />
+                    <menuItem sid="item3" start="no" />
+                    <menuItem sid="item4" start="no" />
+                    <menuItem sid="item5" start="no" />
+                    <menuItem sid="actionQuit" start="no" />
+                </registry>
+            </service>
+
+            <service uid="myMenu2" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="My item 1" style="check" />
+                        <separator />
+                        <menuItem name="start 2-3 / stop A-B" style="radio" />
+                        <menuItem name="start A-B / stop 2-3" style="radio" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="item1" start="no" />
+                    <menuItem sid="item16" start="no" />
+                    <menuItem sid="item17" start="no" />
+                </registry>
+            </service>
+
+            <service uid="item1" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no">
+                <state active="true" />
+            </service>
+            <service uid="item2" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no" >
+                <state active="true" />
+            </service>
+            <service uid="item3" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no" />
+            <service uid="item4" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no" >
+                <state active="false" />
+            </service>
+            <service uid="item5" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no" >
+                <state active="true" />
+            </service>
+
+            <service uid="item16" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <state active="true" />
+                <start uid="item2" />
+                <start uid="item3" />
+                <stop uid="item4" />
+                <stop uid="item5" />
+            </service>
+            <service uid="item17" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <stop uid="item2" />
+                <stop uid="item3" />
+                <start uid="item4" />
+                <start uid="item5" />
+            </service>
+
+            <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+
+            <service uid="view" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager" >
+                        <orientation value="vertical" />
+                        <view caption="view1" />
+                        <view caption="view2" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view wid="myView" />
+                    <view sid="subView2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="subView1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager" >
+                        <orientation value="horizontal" />
+                        <view caption="view3" />
+                        <view caption="view4" />
+                        <view caption="view5" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="myView" />
+                    <view sid="subView3" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="subView2" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager" >
+                        <view caption="CardinalView1" align="center" />
+                        <view caption="CardinalView2" align="right" minWidth="400" />
+                        <view caption="CardinalView3" align="right" minWidth="400" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="view12" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="subView3" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::TabLayoutManager" >
+                        <view caption="TabView1"  />
+                        <view caption="TabView2" selected="yes" />
+                        <view caption="TabView3" />
+                    </layout>
+                </gui>
+                <registry/>
+            </service>
+
+            <service uid="view12" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager" >
+                        <orientation value="vertical" />
+                    </layout>
+                    <toolBar />
+                </gui>
+                <registry>
+                    <toolBar sid="toolbar2" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="toolbar2" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                        <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                        <separator />
+                        <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                        <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="item2" />
+                    <menuItem sid="item3" />
+                    <menuItem sid="item4" />
+                    <menuItem sid="item5" />
+                </registry>
+            </service>
+
+            <start uid="myFrame" />
+            <start uid="subView1" />
+
+        </object>
+
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/TutoGui/rc/profile.xml b/Apps/TutoGui/rc/profile.xml
new file mode 100644
index 0000000..01146d4
--- /dev/null
+++ b/Apps/TutoGui/rc/profile.xml
@@ -0,0 +1,18 @@
+<profile name="tutoGui" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="gui" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiWx" version="0-1" />
+
+    <activate id="TutoGui" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="tutoGuiConfig" />
+    </activate>
+    
+    <start id="guiWx" />
+    <start id="appXml" />
+      
+</profile>
diff --git a/Apps/TutoGui/rc/profileQt.xml b/Apps/TutoGui/rc/profileQt.xml
new file mode 100644
index 0000000..51b35c2
--- /dev/null
+++ b/Apps/TutoGui/rc/profileQt.xml
@@ -0,0 +1,18 @@
+<profile name="tutoGui" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="gui" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="TutoGui" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="tutoGuiConfig" />
+    </activate>
+
+    <start id="guiQt" />
+    <start id="appXml" />
+    
+</profile>
diff --git a/Apps/TutoGui/rc/tuto.ico b/Apps/TutoGui/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/TutoGui/rc/tuto.ico differ
diff --git a/Apps/TutoPython/CMakeLists.txt b/Apps/TutoPython/CMakeLists.txt
new file mode 100644
index 0000000..7f9b9c5
--- /dev/null
+++ b/Apps/TutoPython/CMakeLists.txt
@@ -0,0 +1,11 @@
+fwLoadProperties()
+
+
+if(NOT EXISTS "${EXTERNAL_LIBRARIES}/lib/site-packages/")
+    message(SEND_ERROR "numpy is required for TutoPython and it is not found in : ${EXTERNAL_LIBRARIES}/lib/site-packages/ ")
+else()
+    file(COPY "${EXTERNAL_LIBRARIES}/lib/site-packages/" DESTINATION "${CMAKE_BINARY_DIR}/Python/")
+    if(${NAME}_INSTALL)
+        install(DIRECTORY "${EXTERNAL_LIBRARIES}/lib/site-packages/" DESTINATION share/${FWPROJECT_NAME}_${DASH_VERSION} COMPONENT Python)
+    endif()
+endif()
diff --git a/Apps/TutoPython/COPYING b/Apps/TutoPython/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/TutoPython/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/TutoPython/COPYING.LESSER b/Apps/TutoPython/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/TutoPython/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/TutoPython/Properties.cmake b/Apps/TutoPython/Properties.cmake
new file mode 100644
index 0000000..3cdf816
--- /dev/null
+++ b/Apps/TutoPython/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME TutoPython )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwPython )
+set( REQUIREMENTS io ioVTK uiIO guiQt binding uiPython dataReg servicesReg appXml launcher )
+
diff --git a/Apps/TutoPython/bin/build.options b/Apps/TutoPython/bin/build.options
new file mode 100644
index 0000000..9e834f1
--- /dev/null
+++ b/Apps/TutoPython/bin/build.options
@@ -0,0 +1,17 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE = ['numpy']
+BUNDLES = [
+        'io',
+        'ioVTK',
+        'uiIO',
+        'guiQt',
+        'binding',
+        'uiPython',
+        'dataReg',
+        'servicesReg',
+        'appXml_0-1',
+        'launcher_0-1',
+ ]
+
+
diff --git a/Apps/TutoPython/rc/icons/cross.png b/Apps/TutoPython/rc/icons/cross.png
new file mode 100644
index 0000000..b94fc97
Binary files /dev/null and b/Apps/TutoPython/rc/icons/cross.png differ
diff --git a/Apps/TutoPython/rc/icons/python.png b/Apps/TutoPython/rc/icons/python.png
new file mode 100644
index 0000000..e81120e
Binary files /dev/null and b/Apps/TutoPython/rc/icons/python.png differ
diff --git a/Apps/TutoPython/rc/plugin.xml b/Apps/TutoPython/rc/plugin.xml
new file mode 100644
index 0000000..aedb82b
--- /dev/null
+++ b/Apps/TutoPython/rc/plugin.xml
@@ -0,0 +1,110 @@
+<plugin id="TutoPython">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>tutoPythonConfig</id>
+        <type>parameters</type>
+        <config>
+            <object type="::fwData::Composite">
+                <item key="PythonString">
+                    <object type="::fwData::String">
+
+                        <service uid="mainFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                            <gui>
+                                <frame>
+                                    <name>TutoPython</name>
+                                    <icon>Bundles/TutoPython_0-1/tuto.ico</icon>
+                                    <minSize width="800" height="600" />
+                                </frame>
+                                <toolBar>
+                                    <toolBitmapSize height="32" width="32" />
+                                </toolBar>
+                            </gui>
+                            <registry>
+                                <toolBar sid="toolBar" start="yes" />
+                                <view sid="codeEditor" start="yes" />
+                            </registry>
+                        </service>
+
+                        <service uid="toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+                            <gui>
+                                <layout>
+                                    <menuItem name="Test" icon="Bundles/TutoPython_0-1/icons/python.png" />
+                                    <menuItem name="Open" />
+                                    <menuItem name="Quit" icon="Bundles/TutoPython_0-1/icons/cross.png" />
+                                </layout>
+                            </gui>
+                            <registry>
+                                <menuItem sid="PyTest" start="yes" />
+                                <menuItem sid="action_openFile" start="yes" />
+                                <menuItem sid="actionQuit" start="yes" />
+                            </registry>
+                        </service>
+
+
+                        <service uid="PyTest" type="::fwGui::IActionSrv" impl="::uiPython::action::StringRun" autoConnect="no">
+                            <state active="true" />
+                            <!--<pyobjects> -->
+                            <!--<item name="" id="" /> -->
+                            <!--</pyobjects> -->
+                        </service>
+
+                        <service uid="actionQuit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+                        <service uid="codeEditor" type="::gui::editor::IEditor" impl="::guiQt::editor::Code" autoConnect="yes" />
+
+                        <value>
+<![CDATA[
+import fwData
+import numpy
+
+#use 'open' to load an image, then you can use the 'test' button
+
+image = fwData.getObject("anImage")
+
+print "Image informations : "
+for attr in ['origin', 'spacing', 'type', 'size' ]:
+    print " - ", attr, ':', getattr(image, attr)
+
+#get view on fwData::Image buffer
+if image.buffer is not None:
+    data = numpy.asarray(image.buffer)
+
+    #work on data ...
+    data[ (0 < data) & (data > 10) ] = 5
+
+    #this will retrieve the <anImageWriter> described in the configuration,
+    #start, update and stop it. this will show a file dialog box requesting a
+    #filename to save the image to.
+    writer = fwData.getSrv("anImageWriter")
+    writer.start()
+    writer.update()
+    writer.stop()
+]]>
+                    </value>
+
+                    </object>
+                </item>
+
+                <item key="Image">
+                    <object uid="anImage" type="::fwData::Image">
+                        <service uid="anImageReader" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no" />
+                        <service uid="anImageWriter" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no">
+                            <type mode="writer" />
+                        </service>
+
+                        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                            <start uid="anImageReader" />
+                        </service>
+
+
+                    </object>
+                </item>
+
+                <start uid="mainFrame" />
+            </object>
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/TutoPython/rc/profile.xml b/Apps/TutoPython/rc/profile.xml
new file mode 100644
index 0000000..51c8782
--- /dev/null
+++ b/Apps/TutoPython/rc/profile.xml
@@ -0,0 +1,28 @@
+<profile name="tutoPython" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    
+    <activate id="io" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+ 
+   
+    <activate id="binding" version="0-1" >
+        <param id="pythonhome" value="./PythonHome" />
+        <param id="pythonpath" value="./Python" />
+    </activate>
+    <activate id="uiPython" version="0-1" />
+
+    <activate id="TutoPython" version="0-1"/>
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="tutoPythonConfig" />
+    </activate>
+
+    <start id="appXml" />
+    <start id="binding" />  
+    <start id="guiQt" />  
+</profile>
diff --git a/Apps/TutoPython/rc/tuto.ico b/Apps/TutoPython/rc/tuto.ico
new file mode 100644
index 0000000..64f45cf
Binary files /dev/null and b/Apps/TutoPython/rc/tuto.ico differ
diff --git a/Apps/TutoTrianConverterCtrl/CMakeLists.txt b/Apps/TutoTrianConverterCtrl/CMakeLists.txt
new file mode 100644
index 0000000..6bfec0b
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/CMakeLists.txt
@@ -0,0 +1,5 @@
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem program_options REQUIRED)
+fwInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
\ No newline at end of file
diff --git a/Apps/TutoTrianConverterCtrl/COPYING b/Apps/TutoTrianConverterCtrl/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/TutoTrianConverterCtrl/COPYING.LESSER b/Apps/TutoTrianConverterCtrl/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/TutoTrianConverterCtrl/Properties.cmake b/Apps/TutoTrianConverterCtrl/Properties.cmake
new file mode 100644
index 0000000..9989976
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME TutoTrianConverterCtrl )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwRuntime fwServices fwData )
+set( REQUIREMENTS io gui dataReg servicesReg ioVTK ioData )
+
diff --git a/Apps/TutoTrianConverterCtrl/bin/build.options b/Apps/TutoTrianConverterCtrl/bin/build.options
new file mode 100644
index 0000000..a397546
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/bin/build.options
@@ -0,0 +1,14 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'io_0-1'                ,
+    'gui_0-1'               ,
+    'dataReg_0-1'           ,
+    'servicesReg_0-1'       ,
+    'ioVTK_0-1'             ,
+    'ioData_0-1'            ,
+ ]
+
+USE= ['boostProgramOptions']
+
diff --git a/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Namespace.hpp b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Namespace.hpp
new file mode 100644
index 0000000..ed9abcf
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef TUTOTRIANCONVERTERCTRLNAMESPACE_HPP_
+#define TUTOTRIANCONVERTERCTRLNAMESPACE_HPP_
+
+/**
+ * @brief      The namespace tutoTrianConverterCtrl.
+ * @namespace  tutoTrianConverterCtrl
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace tutoTrianConverterCtrl
+{
+
+}
+#endif /* TUTOTRIANCONVERTERCTRLNAMESPACE_HPP_ */
diff --git a/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Plugin.hpp b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Plugin.hpp
new file mode 100644
index 0000000..13e3d1c
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/Plugin.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTOTRIANCONVERTERCTRL_PLUGIN_HPP_
+#define _TUTOTRIANCONVERTERCTRL_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwServices/IService.hpp>
+
+#include "tutoTrianConverterCtrl/config.hpp"
+
+namespace tutoTrianConverterCtrl
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+class TUTOTRIANCONVERTERCTRL_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /// Constructor.
+    TUTOTRIANCONVERTERCTRL_API Plugin() throw();
+
+    /// Destructor. Do nothing.
+    TUTOTRIANCONVERTERCTRL_API ~Plugin() throw();
+
+    /// Overrides start method. .
+    TUTOTRIANCONVERTERCTRL_API void start() throw(::fwRuntime::RuntimeException);
+
+    /// Overrides stop method. Do nothing
+    TUTOTRIANCONVERTERCTRL_API void stop() throw();
+
+    TUTOTRIANCONVERTERCTRL_API void initialize() throw( ::fwRuntime::RuntimeException );
+
+    TUTOTRIANCONVERTERCTRL_API void uninitialize() throw();
+
+private:
+    ::fwData::Mesh::sptr m_mesh;
+    ::fwServices::IService::sptr m_writerSrv;
+    ::fwServices::IService::sptr m_readerSrv;
+};
+
+} // namespace tutoTrianConverterCtrl
+
+#endif // _TUTOTRIANCONVERTERCTRL_PLUGIN_HPP_
diff --git a/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/config.hpp b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/config.hpp
new file mode 100644
index 0000000..b82282a
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/include/tutoTrianConverterCtrl/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _TUTOTRIANCONVERTERCTRL_CONFIG_HPP_
+#define _TUTOTRIANCONVERTERCTRL_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef TUTOTRIANCONVERTERCTRL_EXPORTS
+    #define TUTOTRIANCONVERTERCTRL_API __declspec(dllexport)
+    #else
+    #define TUTOTRIANCONVERTERCTRL_API __declspec(dllimport)
+    #endif
+
+    #define TUTOTRIANCONVERTERCTRL_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef TUTOTRIANCONVERTERCTRL_EXPORTS
+    #define TUTOTRIANCONVERTERCTRL_API __attribute__ ((visibility("default")))
+    #define TUTOTRIANCONVERTERCTRL_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define TUTOTRIANCONVERTERCTRL_API __attribute__ ((visibility("hidden")))
+    #define TUTOTRIANCONVERTERCTRL_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define TUTOTRIANCONVERTERCTRL_API
+    #define TUTOTRIANCONVERTERCTRL_CLASS_API
+
+#endif
+
+#endif // _TUTOTRIANCONVERTERCTRL_CONFIG_HPP_
diff --git a/Apps/TutoTrianConverterCtrl/rc/plugin.xml b/Apps/TutoTrianConverterCtrl/rc/plugin.xml
new file mode 100644
index 0000000..5a447cd
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/rc/plugin.xml
@@ -0,0 +1,6 @@
+<plugin id="TutoTrianConverterCtrl" class="::tutoTrianConverterCtrl::Plugin" >
+
+    <requirement id="servicesReg" />
+    <library name="TutoTrianConverterCtrl" />
+
+</plugin>
diff --git a/Apps/TutoTrianConverterCtrl/rc/profile.xml b/Apps/TutoTrianConverterCtrl/rc/profile.xml
new file mode 100644
index 0000000..a3c4f33
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/rc/profile.xml
@@ -0,0 +1,13 @@
+<profile name="TutoTrianConverterCtrl" version="0.1">
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    
+    <activate id="TutoTrianConverterCtrl" version="0-1" />
+    <activate id="gui" version="0-1" />
+
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioData" version="0-1" />
+
+    <start id="TutoTrianConverterCtrl" />
+</profile>
diff --git a/Apps/TutoTrianConverterCtrl/src/tutoTrianConverterCtrl/Plugin.cpp b/Apps/TutoTrianConverterCtrl/src/tutoTrianConverterCtrl/Plugin.cpp
new file mode 100644
index 0000000..0424b90
--- /dev/null
+++ b/Apps/TutoTrianConverterCtrl/src/tutoTrianConverterCtrl/Plugin.cpp
@@ -0,0 +1,130 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/parsers.hpp>
+#include <boost/program_options/positional_options.hpp>
+#include <boost/program_options/variables_map.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include "tutoTrianConverterCtrl/Plugin.hpp"
+
+namespace tutoTrianConverterCtrl
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::tutoTrianConverterCtrl::Plugin");
+
+//------------------------------------------------------------------------------
+
+Plugin::Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::initialize() throw( ::fwRuntime::RuntimeException )
+{
+    namespace po = boost::program_options;
+
+    ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::profile::getCurrentProfile();
+    SLM_ASSERT("Profile is not initialized", profile);
+    ::fwRuntime::profile::Profile::ParamsContainer params = profile->getParams();
+
+    std::string trianMeshPath;
+    std::string vtkMeshPath;
+
+    po::options_description cmdline_options("TutoTrianConverterCtrl options");
+    cmdline_options.add_options()
+                                ("trian", po::value(&trianMeshPath)->required(), "Path of trian mesh file to convert")
+                                ("vtk", po::value(&vtkMeshPath)->required(), "Path of created vtk mesh file")
+                                ;
+
+    po::positional_options_description p;
+    p.add("trian", 1)
+                 .add("vtk", 2);
+
+    po::variables_map vm;
+
+    try
+    {
+        po::store(po::command_line_parser(params)
+        .options(cmdline_options)
+        .positional(p)
+        .run(),
+        vm);
+        po::notify(vm);
+    }
+    catch(po::error& e)
+    {
+        std::cerr << cmdline_options << std::endl << e.what() << std::endl;
+        return;
+    }
+
+    m_mesh = ::fwData::Mesh::New();
+    m_readerSrv = ::fwServices::add(m_mesh, "::io::IReader", "::ioData::MeshReaderService");
+    ::fwRuntime::EConfigurationElement::sptr readerCfg = ::fwRuntime::EConfigurationElement::New( "service" );
+    ::fwRuntime::EConfigurationElement::sptr readerFilenameCfg = ::fwRuntime::EConfigurationElement::New( "file" );
+    readerFilenameCfg->setValue(trianMeshPath);
+    readerCfg->addConfigurationElement(readerFilenameCfg);
+    m_readerSrv->setConfiguration( readerCfg ) ;
+    m_readerSrv->configure();
+
+    m_writerSrv = ::fwServices::add(m_mesh, "::io::IWriter", "::ioVTK::MeshWriterService");
+    ::fwRuntime::EConfigurationElement::sptr writerCfg = ::fwRuntime::EConfigurationElement::New( "service" );
+    ::fwRuntime::EConfigurationElement::sptr writerFilenameCfg = ::fwRuntime::EConfigurationElement::New( "file" );
+    writerFilenameCfg->setValue(vtkMeshPath);
+    writerCfg->addConfigurationElement(writerFilenameCfg);
+    m_writerSrv->setConfiguration( writerCfg ) ;
+    m_writerSrv->configure();
+
+    m_readerSrv->start();
+    m_writerSrv->start();
+    m_readerSrv->update();
+    m_writerSrv->update();
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::uninitialize() throw()
+{
+    if (m_writerSrv)
+    {
+        m_writerSrv->stop();
+        ::fwServices::OSR::unregisterService( m_writerSrv ) ;
+    }
+    if(m_readerSrv)
+    {
+        m_readerSrv->stop();
+        ::fwServices::OSR::unregisterService( m_readerSrv ) ;
+    }
+    m_mesh.reset();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace tutoTrianConverterCtrl
diff --git a/Apps/TutoVectorField/CMakeLists.txt b/Apps/TutoVectorField/CMakeLists.txt
new file mode 100644
index 0000000..0effb20
--- /dev/null
+++ b/Apps/TutoVectorField/CMakeLists.txt
@@ -0,0 +1 @@
+fwLoadProperties()
\ No newline at end of file
diff --git a/Apps/TutoVectorField/COPYING b/Apps/TutoVectorField/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/TutoVectorField/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/TutoVectorField/COPYING.LESSER b/Apps/TutoVectorField/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/TutoVectorField/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/TutoVectorField/Properties.cmake b/Apps/TutoVectorField/Properties.cmake
new file mode 100644
index 0000000..12b7d6b
--- /dev/null
+++ b/Apps/TutoVectorField/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME TutoVectorField )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS dataReg ctrlSelection gui guiQt ioData ioVTK io servicesReg uiVisuQt uiImageQt uiIO visuVTK visuVTKQt visuVTKAdaptor visu launcher appXml )
+
diff --git a/Apps/TutoVectorField/bin/build.options b/Apps/TutoVectorField/bin/build.options
new file mode 100644
index 0000000..827016a
--- /dev/null
+++ b/Apps/TutoVectorField/bin/build.options
@@ -0,0 +1,24 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+BUNDLES = [
+    'dataReg_0-1'       ,
+    'ctrlSelection_0-1' ,
+    'gui_0-1'           ,
+    'guiQt_0-1'         ,
+    'ioData_0-1'        ,
+    'ioVTK_0-1'         ,
+    'io_0-1'            ,
+    'servicesReg_0-1'   ,
+    'uiVisuQt_0-1'      ,
+    'uiImageQt_0-1'     ,
+    'uiIO_0-1'          ,
+    'visuVTK_0-1'       ,
+    'visuVTKQt_0-1'     ,
+    'visuVTKAdaptor_0-1',
+    'visu_0-1'          ,
+    'launcher_0-1'      ,
+    'appXml_0-1'        ,
+ ]
+
+
diff --git a/Apps/TutoVectorField/rc/plugin.xml b/Apps/TutoVectorField/rc/plugin.xml
new file mode 100644
index 0000000..5225c3d
--- /dev/null
+++ b/Apps/TutoVectorField/rc/plugin.xml
@@ -0,0 +1,162 @@
+<plugin id="TutoVectorField">
+
+<requirement id="servicesReg" />
+
+<extension implements="::fwServices::registry::AppConfig">
+        <id>TutoVectorField</id>
+        <type>parameters</type>
+        <config>
+
+
+    <object type="::fwData::Composite">
+        <service uid="IHM" impl="::gui::frame::DefaultFrame" type="::fwGui::IFrameSrv" autoConnect="no">
+            <gui>
+                <frame>
+                    <name>TutoVectorField</name>
+                </frame>
+                <menuBar />
+            </gui>
+            <registry>
+                <menuBar sid="menuBar" start="yes" />
+                <view sid="multiView_scene1" start="yes" />
+            </registry>
+        </service>
+        <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menu name="File" />
+                </layout>
+            </gui>
+            <registry>
+                <menu sid="menu_File" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="menu_File" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="Open file" shortcut="Ctrl+O" />
+                    <menuItem name="Save file" shortcut="Ctrl+S" />
+                    <separator />
+                    <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="action_openFile" start="yes" />
+                <menuItem sid="action_saveFile" start="yes" />
+                <menuItem sid="action_quit" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="action_openFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="readerPathFile" />
+        </service>
+        <service uid="action_saveFile" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+            <start uid="writerPathFile" />
+        </service>
+        <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+        <service uid="multiView_scene1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::CardinalLayoutManager" >
+                    <view align="center" />
+                    <view align="bottom" minWidth="400" minHeight="30" resizable="no" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="genericScene" start="yes" />
+                <view sid="multiView_scene1_bottom" start="yes" />
+            </registry>
+        </service>
+
+
+        <service uid="multiView_scene1_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view proportion="0" minWidth="30" />
+                    <view proportion="0" minWidth="50" />
+                    <view proportion="1" />
+                    <view proportion="0" minWidth="30" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="sliceListEditor" start="yes" />
+                <view sid="showScanEditor" start="yes" />
+                <view sid="sliderIndexEditor" start="yes" />
+                <view sid="snapshotScene1Editor" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="snapshotScene1Editor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+            <snap>
+                <scene uid="genericScene" />
+            </snap>
+        </service>
+
+        <!-- CompositeVisu description -->
+        <item key="compositeVisu">
+            <object uid="compositeVisu" type="::fwData::Composite">
+
+
+                <service uid="genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                    <scene>
+                        <picker id="picker" vtkclass="fwVtkCellPicker" />
+
+                        <renderer id="default" background="0.5" />
+                        <adaptor id="renderAdaptor" class="::visuVTKAdaptor::Render" objectId="self">
+                            <config renderer="default" picker="" />
+                        </adaptor>
+
+                        <adaptor uid="MPRNegatoScene3D" id="MPRNegato3D" class="::visuVTKAdaptor::NegatoMPR" objectId="image">
+                            <config renderer="default" picker="picker" mode="3D" slices="3" sliceIndex="axial" />
+                        </adaptor>
+
+                        <adaptor uid="vectorFieldAdatpor" id="vectorFieldAdatporId" class="::visuVTKAdaptor::VectorField" objectId="image">
+                            <config renderer="default" />
+                        </adaptor>
+
+                        <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self" >
+                            <config renderer="default" />
+                        </adaptor>
+                    </scene>
+                </service>
+
+                <item key="image">
+
+                    <object uid="image" type="::fwData::Image">
+
+                        <service uid="readerPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no"> 
+                            <type mode="reader"/>
+                        </service>
+
+                        <service uid="writerPathFile" impl="::uiIO::editor::IOSelectorService" type="::gui::editor::IDialogEditor" autoConnect="no"> 
+                            <type mode="writer"/>
+                        </service>
+
+                        <!-- This service convert a simple fwData::Image to medical Image -->
+                        <service uid="medicalImageConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController"  autoConnect="no" />
+
+                        <service uid="sliceListEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor" autoConnect="yes">
+                            <negatoAdaptor uid="MPRNegatoScene3D" slices="3" />
+                        </service>
+                        <service uid="showScanEditor" type="::gui::editor::IEditor" impl="::uiImage::ShowScanEditor" autoConnect="no">
+                            <negatoAdaptor uid="MPRNegatoScene3D" />
+                        </service>
+                        <service uid="sliderIndexEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes" >
+                            <sliceIndex>axial</sliceIndex>
+                        </service>
+                    </object>
+                </item>
+            </object>
+        </item>
+
+        <start uid="IHM" />
+
+    </object>
+
+
+        </config>
+    </extension>
+
+</plugin>
diff --git a/Apps/TutoVectorField/rc/profile.xml b/Apps/TutoVectorField/rc/profile.xml
new file mode 100644
index 0000000..ce74dd0
--- /dev/null
+++ b/Apps/TutoVectorField/rc/profile.xml
@@ -0,0 +1,32 @@
+<profile name="TutoVectorField" version="0.1" check-single-instance="true">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="io" version="0-1" />
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="TutoVectorField" version="0-1" />
+    <activate id="appXml" version="0-1">
+        <param id="config" value="TutoVectorField" />
+    </activate>
+
+    <activate id="ctrlSelection" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="uiImageQt" version="0-1" />
+
+    <start id="visuVTK" />
+    <start id="visuVTKAdaptor" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/VRRender/CMakeLists.txt b/Apps/VRRender/CMakeLists.txt
new file mode 100644
index 0000000..2a4834e
--- /dev/null
+++ b/Apps/VRRender/CMakeLists.txt
@@ -0,0 +1,108 @@
+fwLoadProperties()
+
+
+if(VRRender_INSTALL)
+    if(APPLE)
+        set(FWPROJECT_NAME VRRender)
+
+        set(VRRENDER_BUNDLE_ICON_FILE vrrender.icns) 
+        set_source_files_properties(rc/${VRRENDER_BUNDLE_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+
+
+        add_executable(
+            VRRender.app MACOSX_BUNDLE
+            ${launcher_HEADERS} ${launcher_SOURCES} 
+            rc/${VRRENDER_BUNDLE_ICON_FILE}
+            )
+
+
+        set_target_properties( VRRender.app PROPERTIES OUTPUT_NAME ${FWPROJECT_NAME})
+
+        add_definitions(-DDEFAULT_PROFILE=Bundles/${FWPROJECT_NAME}_${${FWPROJECT_NAME}_DASH_VERSION}/profile.xml)
+
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_ICON_FILE ${VRRENDER_BUNDLE_ICON_FILE})
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_INFO_STRING "${FWPROJECT_NAME}")
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_SHORT_VERSION_STRING "${${FWPROJECT_NAME}_VERSION}")
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${${FWPROJECT_NAME}_VERSION}")
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${FWPROJECT_NAME}")
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_COPYRIGHT "Copyright 2012-2013 IRCAD")
+        set_target_properties( VRRender.app PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER "com.ircad.vrrender")
+
+        find_package (Boost COMPONENTS filesystem program_options REQUIRED)
+
+        target_include_directories(VRRender.app PRIVATE ${Boost_INCLUDE_DIRS})
+        target_link_libraries(VRRender.app fwCore fwRuntime ${Boost_LIBRARIES})
+
+        set(APP_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/VRRender.app")
+
+        configure_file("${fwGuiQt_SOURCE_DIR}/bin/qt.conf" "${APP_PATH}/Contents/Resources/qt.conf")
+        INSTALL(CODE " file(WRITE \"${APP_PATH}/Contents/Resources/qt.conf\" \"\") " COMPONENT ApplicationBundle)
+
+        install(
+            TARGETS VRRender.app 
+            BUNDLE DESTINATION . COMPONENT ApplicationBundle
+            )
+
+        set(APP_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/VRRender.app")
+
+        install(DIRECTORY "${CMAKE_INSTALL_PREFIX}/share" DESTINATION "VRRender.app/Contents/" COMPONENT ApplicationBundle)
+        install(DIRECTORY "${CMAKE_INSTALL_PREFIX}/Bundles" DESTINATION "VRRender.app/Contents/" COMPONENT ApplicationBundle)
+        install(DIRECTORY "${CMAKE_INSTALL_PREFIX}/qtplugins/plugins" DESTINATION "VRRender.app/Contents/" COMPONENT ApplicationBundle)
+
+        INSTALL(CODE "
+        file(GLOB_RECURSE QTPLUGINS \"${APP_INSTALL_PATH}/Contents/plugins/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
+        file(GLOB_RECURSE BUNDLES \"${APP_INSTALL_PATH}/Contents/Bundles/*/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
+        include(BundleUtilities)
+        fixup_bundle(\"${APP_INSTALL_PATH}\" \"\${BUNDLES};\${QTPLUGINS}\" \"${CMAKE_INSTALL_PREFIX}/${LIBRARY_OUTPUT_DIR}\")
+        execute_process(
+            COMMAND sh -c \"find . -type f -exec stat --format='%s' {} \\; |sort -rn | uniq -d | xargs -I{} -n1 find . -type f -size {}c -print0 | xargs -0 stat --format='%20s %n' | sort | uniq -w20 --all-repeated=separate |cut -c22- | paste - - - -d' ' | sed 's/^/ln -s -f /' | sh \" 
+            WORKING_DIRECTORY ${APP_INSTALL_PATH}/Contents/MacOS
+            )
+
+        execute_process(
+            COMMAND sh -c \"python ${CMAKE_SOURCE_DIR}/CMake/OSXTools/osx_install_name_tool.py -e MacOS/ $(find Bundles -iname '*.dylib') -f \"
+            WORKING_DIRECTORY ${APP_INSTALL_PATH}/Contents
+            )
+
+        " COMPONENT ApplicationBundle)
+         
+    elseif(WIN32)
+        
+        set(FWPROJECT_NAME VRRender)
+        set(VRRENDER_BUNDLE_ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/rc/vrrender.ico) 
+        set(LAUNCHER_PATH "bin/launcher.exe")
+        set(PROFILE_PATH "Bundles/${FWPROJECT_NAME}_${${FWPROJECT_NAME}_DASH_VERSION}/profile.xml")
+        
+       #configure the wix template 
+       configure_file(${FWCMAKE_RESOURCE_PATH}Wix/WIX.template.in ${PROJECT_BINARY_DIR}WIX.template [@ONLY] )
+             
+               
+        install(CODE "
+                      file(GLOB_RECURSE LIBS
+                        \"\${CMAKE_INSTALL_PREFIX}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\")
+                      include(BundleUtilities)
+                      fixup_bundle(\"${CMAKE_INSTALL_PREFIX}/bin/launcher.exe\" \"\${LIBS}\" \"${EXTERNAL_LIBRARIES}/bin\")
+                     " COMPONENT Runtime)
+                     
+        set(CPACK_PACKAGE_NAME "${FWPROJECT_NAME}")
+        set(CPACK_INSTALLED_DIRECTORIES "${CMAKE_INSTALL_PREFIX};.") #look inside install dir for packaging
+        set(CPACK_PACKAGE_VENDOR "IRCAD")
+        set(CPACK_PACKAGE_ICON ${VRRENDER_BUNDLE_ICON_FILE})
+        set(CPACK_PACKAGE_VERSION "${VERSION}")
+                 
+        if(CPACK_BINARY_WIX)
+       
+            set(CPACK_WIX_TEMPLATE "${PROJECT_BINARY_DIR}WIX.template")
+            set(CPACK_WIX_PROGRAM_MENU_FOLDER "IRCAD" )
+            set(CPACK_WIX_PRODUCT_ICON ${VRRENDER_BUNDLE_ICON_FILE})
+            set(CPACK_RESOURCE_FILE_LICENSE ${FWCMAKE_RESOURCE_PATH}Wix/LICENSE.rtf)
+            
+        endif(CPACK_BINARY_WIX)
+        
+        include(CPack)
+
+    endif()
+endif()
+
+
+
diff --git a/Apps/VRRender/COPYING b/Apps/VRRender/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Apps/VRRender/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Apps/VRRender/COPYING.LESSER b/Apps/VRRender/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Apps/VRRender/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Apps/VRRender/Properties.cmake b/Apps/VRRender/Properties.cmake
new file mode 100644
index 0000000..a99b306
--- /dev/null
+++ b/Apps/VRRender/Properties.cmake
@@ -0,0 +1,40 @@
+
+set( NAME VRRender )
+set( VERSION 0.9 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS
+    servicesReg
+    dataReg
+    visu
+    visuVTK
+    visuVTKQt
+    visuVTKAdaptor
+    gui
+    guiQt
+    memory
+    monitor
+    monitorQt
+    ctrlMemory
+    launcher
+    ioVTK
+    ioVtkGdcm
+    uiIO
+    uiGenericQt
+    uiMedDataQt
+    uiImageQt
+    appXml
+    activities
+    ctrlSelection
+    uiReconstructionQt
+    2DVisualizationActivity
+    3DVisualizationActivity
+    blendActivity
+    volumeRenderingActivity
+    media
+    ioAtoms
+    patchMedicalData
+    ioITK
+    filterVRRender
+    )
+
diff --git a/Apps/VRRender/bin/build.options b/Apps/VRRender/bin/build.options
new file mode 100755
index 0000000..93be3a0
--- /dev/null
+++ b/Apps/VRRender/bin/build.options
@@ -0,0 +1,43 @@
+TYPE = 'bundle'
+VERSION = '0-9'
+BUNDLES = [
+    'servicesReg_0-1',
+    'dataReg_0-1',
+    'visu_0-1',
+    'visuVTK_0-1',
+    'visuVTKQt_0-1',
+    'visuVTKAdaptor_0-1',
+    'visuVTKVRAdaptor_0-1',
+    'scene2D_0-1',
+    'gui_0-1',
+    'guiQt_0-1',
+    'uiTF_0-1',
+    'uiVisu_0-1',
+    'uiVisuQt_0-1',
+    'memory_0-1',
+    'monitor_0-1',
+    'monitorQt_0-1',
+    'ctrlMemory_0-1',
+    'launcher_0-1',
+    'ioITK_0-1',
+    'ioVTK_0-1',
+    'ioVtkGdcm_0-1',
+    'uiIO_0-1',
+    'uiGenericQt_0-1',
+    'uiMedDataQt_0-1',
+    'uiImageQt_0-1',
+    'uiMeasurement_0-1',
+    'uiMeasurementQt_0-1',
+    'appXml_0-1',
+    'activities_0-1',
+    'ctrlSelection_0-1',
+    'uiReconstructionQt_0-1',
+    '2DVisualizationActivity_0-1',
+    '3DVisualizationActivity_0-1',
+    'blendActivity_0-1',
+    'volumeRenderingActivity_0-1',
+    'media_0-1',
+    'ioAtoms_0-1',
+    'patchMedicalData_0-1',
+    'filterVRRender_0-1',
+] 
diff --git a/Apps/VRRender/doc/Makefile b/Apps/VRRender/doc/Makefile
new file mode 100644
index 0000000..d746c38
--- /dev/null
+++ b/Apps/VRRender/doc/Makefile
@@ -0,0 +1,88 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html      to make standalone HTML files"
+	@echo "  dirhtml   to make HTML files named index.html in directories"
+	@echo "  pickle    to make pickle files"
+	@echo "  json      to make JSON files"
+	@echo "  htmlhelp  to make HTML files and a HTML help project"
+	@echo "  qthelp    to make HTML files and a qthelp project"
+	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  changes   to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck to check all external links for integrity"
+	@echo "  doctest   to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf build/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html
+	@echo
+	@echo "Build finished. The HTML pages are in build/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) build/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in build/dirhtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) build/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in build/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) build/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in build/qthelp, like this:"
+	@echo "# qcollectiongenerator build/qthelp/VRRenderDoc.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile build/qthelp/VRRenderDoc.qhc"
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in build/latex."
+	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+	      "run these through (pdf)latex."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes
+	@echo
+	@echo "The overview file is in build/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) build/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in build/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) build/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in build/doctest/output.txt."
diff --git a/Apps/VRRender/doc/htmlhelpTowxHtmlHelp b/Apps/VRRender/doc/htmlhelpTowxHtmlHelp
new file mode 100755
index 0000000..9d02306
--- /dev/null
+++ b/Apps/VRRender/doc/htmlhelpTowxHtmlHelp
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+test ! -d $1 && echo "$1 is not a dir" && exit 1 
+
+for i in $1/*html
+do
+    echo -n $i '... '
+    sed -i 's,<div \+class="[^"]\+" \+id=\("[^"]\+"\) *>,<a name=\1 />&,' $i
+    sed -i 's,<[a-z]\+ \+id=\("[^"]\+"\) *>,<a name=\1 />&,' $i
+    echo ok
+done
+
+sed -i  "s/Keyword/Name/g" $1/*hhk
+
+
+# images html theme defautl
+# mogrify -resize "850>" *.jpg
+
+# ipmages htmlhelp
+# mogrify -resize "1024>" *.jpg
+
+echo Done.
diff --git a/Apps/VRRender/doc/make.bat b/Apps/VRRender/doc/make.bat
new file mode 100644
index 0000000..0eb72e0
--- /dev/null
+++ b/Apps/VRRender/doc/make.bat
@@ -0,0 +1,112 @@
+ at ECHO OFF
+
+REM Command file for Sphinx documentation
+
+set SPHINXBUILD=sphinx-build
+set ALLSPHINXOPTS=-d build/doctrees %SPHINXOPTS% source
+if NOT "%PAPER%" == "" (
+    set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+    :help
+    echo.Please use `make ^<target^>` where ^<target^> is one of
+    echo.  html      to make standalone HTML files
+    echo.  dirhtml   to make HTML files named index.html in directories
+    echo.  pickle    to make pickle files
+    echo.  json      to make JSON files
+    echo.  htmlhelp  to make HTML files and a HTML help project
+    echo.  qthelp    to make HTML files and a qthelp project
+    echo.  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+    echo.  changes   to make an overview over all changed/added/deprecated items
+    echo.  linkcheck to check all external links for integrity
+    echo.  doctest   to run all doctests embedded in the documentation if enabled
+    goto end
+)
+
+if "%1" == "clean" (
+    for /d %%i in (build\*) do rmdir /q /s %%i
+    del /q /s build\*
+    goto end
+)
+
+if "%1" == "html" (
+    %SPHINXBUILD% -b html %ALLSPHINXOPTS% build/html
+    echo.
+    echo.Build finished. The HTML pages are in build/html.
+    goto end
+)
+
+if "%1" == "dirhtml" (
+    %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% build/dirhtml
+    echo.
+    echo.Build finished. The HTML pages are in build/dirhtml.
+    goto end
+)
+
+if "%1" == "pickle" (
+    %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% build/pickle
+    echo.
+    echo.Build finished; now you can process the pickle files.
+    goto end
+)
+
+if "%1" == "json" (
+    %SPHINXBUILD% -b json %ALLSPHINXOPTS% build/json
+    echo.
+    echo.Build finished; now you can process the JSON files.
+    goto end
+)
+
+if "%1" == "htmlhelp" (
+    %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% build/htmlhelp
+    echo.
+    echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in build/htmlhelp.
+    goto end
+)
+
+if "%1" == "qthelp" (
+    %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% build/qthelp
+    echo.
+    echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in build/qthelp, like this:
+    echo.^> qcollectiongenerator build\qthelp\VRRenderDoc.qhcp
+    echo.To view the help file:
+    echo.^> assistant -collectionFile build\qthelp\VRRenderDoc.ghc
+    goto end
+)
+
+if "%1" == "latex" (
+    %SPHINXBUILD% -b latex %ALLSPHINXOPTS% build/latex
+    echo.
+    echo.Build finished; the LaTeX files are in build/latex.
+    goto end
+)
+
+if "%1" == "changes" (
+    %SPHINXBUILD% -b changes %ALLSPHINXOPTS% build/changes
+    echo.
+    echo.The overview file is in build/changes.
+    goto end
+)
+
+if "%1" == "linkcheck" (
+    %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% build/linkcheck
+    echo.
+    echo.Link check complete; look for any errors in the above output ^
+or in build/linkcheck/output.txt.
+    goto end
+)
+
+if "%1" == "doctest" (
+    %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% build/doctest
+    echo.
+    echo.Testing of doctests in the sources finished, look at the ^
+results in build/doctest/output.txt.
+    goto end
+)
+
+:end
diff --git a/Apps/VRRender/doc/makeall.sh b/Apps/VRRender/doc/makeall.sh
new file mode 100755
index 0000000..fe934ce
--- /dev/null
+++ b/Apps/VRRender/doc/makeall.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# -*- coding: UTF8 -*-
+PROJ=VRRender
+
+test  $(basename $(dirname $PWD)) = "$PROJ" && (
+
+
+make html htmlhelp latex && (
+
+(
+cd build
+#patch -p1 < ../patch.cedil
+)
+
+(
+cd build/latex
+make all-pdf
+)
+
+find build/ -type d -name .svn|xargs rm -rf
+
+./htmlhelpTowxHtmlHelp build/htmlhelp
+
+(
+cd build/htmlhelp/_images
+mogrify -resize "1024>" *.jpg *.png
+)
+
+
+(
+cd build/html/_images
+mogrify -resize "850>" *.jpg
+)
+
+(
+rm ../rc/doc.zip
+cd build/htmlhelp/
+zip -r ../../../rc/doc.zip ./
+)
+
+) || echo Error
+
+) || echo "Erreur: A executer dans $PROJ/doc"
diff --git a/Apps/VRRender/doc/source/2D_Landmarks.rst b/Apps/VRRender/doc/source/2D_Landmarks.rst
new file mode 100755
index 0000000..54ca553
--- /dev/null
+++ b/Apps/VRRender/doc/source/2D_Landmarks.rst
@@ -0,0 +1,23 @@
+2D MPR Landmarks and Distance Measurement 
+=========================================
+
+.. index:: 2D landmark, 2D distance
+
+VR-Planning integrates a 3D landmarks positioning system in order to label a wanted 3D position of a voxel in the medical image. As described in the 3D medical image visualization, the management of these landmarks will be performed thanks to the following  three buttons of the tool bar  :
+
+.. image:: _static/Add-Find-View-landmark.png
+   :align: center
+
+Thus, a 3D landmark can be positioned at the last selected voxel position by clicking on the ''Add landmark'' button of the tools bar. This action also open a small window allowing to name the landmark. The landmark then appears and can be moved in (an only in) the selected Negato view by simply selecting it through a mouse left button press, and by moving it in the view by keeping the left button pressed and releasing it in the wanted location. 
+
+.. image:: _static/Negato-landmarks.png
+   :align: center
+
+All 3D landmark position being recorded, it is possible to automatically reach a landmark position by clicking on the ''Find landmark'' button of the tools bar. The selection of the wanted landmark will then allow to automatically position the three Negatos (axial, frontal and sagittal views) on the 3D position of the landmark. Landmarks taking an important place on the selected view, it is also possible to hide or show all landmarks by using the ''Hide/Show landmarks'' button of the too [...]
+
+Distance computation is activated by using the button located in the bottom right part of each Negato. A single click adds a colorized distance segment in the Negato view. Each new click adds such a distance segment with each time a new color. Distances are computed between two 3D spheres that can be moved in the Negato by simply selecting it by pressing on the mouse left button, and by moving it in the view by keeping the left button pressed and releasing it in the wanted location. Dist [...]
+
+.. image:: _static/Negato-Distance.png
+   :align: center
+
+
diff --git a/Apps/VRRender/doc/source/2D_MPR.rst b/Apps/VRRender/doc/source/2D_MPR.rst
new file mode 100755
index 0000000..3569345
--- /dev/null
+++ b/Apps/VRRender/doc/source/2D_MPR.rst
@@ -0,0 +1,42 @@
+2D Medical Image Multi-Planar Rendering (MPR)
+=============================================
+
+.. index:: 2D MPR, Multi Planar Rendering 
+
+The 2D medical image visualization is selected by using the F2 shortcut or the forth icon of the tool bar :
+
+.. image:: _static/icon-2D.png
+   :align: center
+
+The Multi-Planar Rendering (MPR) corresponds to the most standard visualization techniques developed and used on professional medical imaging workstations : three different views of the medical image in Axial, Frontal and Sagittal views. Each window is called Negato. VR-Planning provides such a 2D medical image view in one big left window (Negato1) and two smaller right windows (Negato2 and Negato 3).
+
+.. image:: _static/Negato-01.png
+   :align: center
+
+It is easy to change the visualized axis of the Negato by using the axis selection menu at the left bottom part of each Negato. The visualized axes are automatically synchronized in order to keep the three Axial, Frontal and Sagittal views in three different windows. 
+
+.. image:: _static/Negato-axes.png
+   :align: center
+
+Each Negato indicates the minimum and maximum screened density [min,max], the standard density windowing size W and the middle density of the windowing L. As in the 3D medical image visualization, it is possible to improve the visualized grey-level by modifying the screened windowing. The parameterization of the visualized grey level window is done via the same technique as developed in all existing radiological software tools. When pressing the right mouse button in the image, it is pos [...]
+
+.. image:: _static/Negato-contrast.png
+   :align: center
+
+Each Negato indicates the last selected voxel (voxel = volumic pixel), the coordinates (x,y,z) and the density of this voxel being indicated on the last line. Such a selection is performed by a simple left click in the image. Pressing (or clicking) the middle button provides the same information but adds an automatic synchronization of all views. When pressing the button, a full red cross centered on the selected voxel appears on all views while pressing the button.
+
+.. image:: _static/Negato-info.png
+   :align: center
+
+It is also possible to zoom and to translate the image on each Negato in order to focus the attention on a part of the image. After a left click in the selected Negato, you can zoom with the mouse wheel or by using the combination of the ``Shift`` key and pressing the right button of the mouse. A movement from bottom to top increases the zoom, and a movement from top to bottom decreases the zoom. 
+
+.. image:: _static/Negato-Zoom.png
+   :align: center
+
+The translation is performed by using the combination of the ``shift`` key and pressing the left button of the mouse. In this case, a movement in any direction creates a translation in the same direction. The reset of translations and zooms is performed with the ``R`` key.
+
+.. image:: _static/Negato-translate.png
+   :align: center
+
+The snapshot tool located at the left bottom part of each Negato allows to save the 2D-Slicer view in jpeg format. The snapshot is activated by a simple left button click on the picture icon localized at the bottom part of the window.
+
diff --git a/Apps/VRRender/doc/source/3D_Distances.rst b/Apps/VRRender/doc/source/3D_Distances.rst
new file mode 100755
index 0000000..ed00eb7
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Distances.rst
@@ -0,0 +1,23 @@
+3D Landmarks and Distance Measurement
+=====================================
+
+.. index:: 3D landmarks, 3D distance
+
+In order to label a wanted 3D position of a voxel in the medical image, VR-Planning integrates a 3D landmarks positioning system. The management of these landmarks will be performed thanks to the following three buttons of the tool bar corresponding respectively to ``Add landmark``, ``Find landmark`` and ``Hide/Show landmarks`` :
+
+.. image:: _static/Add-Find-View-landmark.png
+   :align: center
+
+A 3D landmark can be positioned at the last selected voxel position by clicking on the ``Add landmark`` button of the tools bar. This action also open a small window allowing to name the landmark. The landmark then appears and can be moved in the Negato view by simply selecting it through a mouse left button press, and by moving it in the view by keeping the left button pressed and releasing it in the wanted location.
+
+.. image:: _static/3D-landmark.png
+   :align: center
+
+All 3D landmark position being recorded, it is possible to automatically reach a landmark position by clicking on the ``Find landmark`` button of the tools bar. The selection of the wanted landmark will then allow to automatically position the three axial, frontal and sagittal planes on the 3D position of the landmark. 3D landmark taking an important place on the view, it is also possible to hide or show all landmarks by using the ``Hide/Show landmarks`` button of the tools bar. Finally, [...]
+   
+VR-Planning also offers the possibility to compute distances in 3D view. Distance computation is activated by using the distance button located in the bottom right part of the view. A single click adds a colorized distance segment in the medical image view. Each new click adds such a distance segment with each time a new color. Distances are computed between two 3D spheres that can be moved in the medical image view by simply selecting it through a mouse left button press, and by moving  [...]
+
+.. image:: _static/3D-distance.png
+   :align: center
+
+
diff --git a/Apps/VRRender/doc/source/3D_Medical_Image_Visu.rst b/Apps/VRRender/doc/source/3D_Medical_Image_Visu.rst
new file mode 100755
index 0000000..1c20592
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Medical_Image_Visu.rst
@@ -0,0 +1,32 @@
+3D Medical Image Visualization (including oblique plane)
+========================================================
+
+.. index:: 3D medical image, oblique plane 
+
+VR-Planning allows to visualize the medical image in a 3D rendering of slices. This rendering is automatically activated when the patient is loaded. However, it is possible to hide this medical image visualization by a simple click on the ``Scan`` button located on the left bottom of the 3D window. A new click on the ``No scan`` button allows to show again the medical image. 
+
+.. image:: _static/3D-show-hide-scan.png
+   :align: center
+
+When the medical image is visible, two different modes of visualization are available. The default one slice view can thus be replaced by using the ``>`` button located in the bottom left part of the 3D window. The user can select and display three planes corresponding to the axial, frontal and sagittal view. 
+
+.. image:: _static/3D-scan-1-3.png
+   :align: center
+
+The default one slice view is an axial view. The bottom view selector allows to replace this axial view by a frontal or a sagittal view. The slice selection is then performed thanks to the slider located to the bottom part of the visualization window. 
+
+.. image:: _static/3D-scan-ax-front-sag.png
+   :align: center
+
+Finally in all mode, the medical image visualization can be modified by using the same interaction than in the 2D visualization. First of all, it is possible to select a voxel of the image and to obtain its coordinates (x,y,z) and its density through a simple left click (or press) in the medical image. These information are printed in the top left part of the window. The same information are obtained with a middle click that automatically synchronizes axial, frontal and sagittal view on  [...]
+  
+.. image:: _static/3D-scan-GL-value.png
+   :align: center
+
+The parameterization of the visualized grey level window is done via the same technique as developed in all existing radiological software tools. When pressing the right mouse button in the image, it is possible to decrease or increase the middle value of the grey level window with up (increase) or down (decrease) movements of the mouse and the grey level window size with left (decrease) or right (increase) movements of the mouse. 
+  
+.. image:: _static/3D-scan-contrast.png
+   :align: center
+
+   
+   
diff --git a/Apps/VRRender/doc/source/3D_Models_Manipulation.rst b/Apps/VRRender/doc/source/3D_Models_Manipulation.rst
new file mode 100755
index 0000000..b596570
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Models_Manipulation.rst
@@ -0,0 +1,42 @@
+3D Models Manipulation
+======================
+
+.. index:: 3D Models, 3D Visualisation
+
+The 3D model manipulations mode is automatically selected when you start VR-Planning. It is also possible to select this mode by using the F1 shortcut or the third icon of the tool bar  :
+
+.. image:: _static/icon-3D.png
+   :align: center
+
+The tool bar contains three recorded 3D views : axial, frontal and sagittal. These three views are activated by selecting the ``Axial view``, ``Frontal view`` and ``Sagittal view`` options in the  ``3D Model`` menu, or by a simple click on the three last buttons of the tool bar : 
+
+================================= =================================== ==================================== 
+.. image:: _static/icon-axial.png .. image:: _static/icon-frontal.png .. image:: _static/icon-sagittal.png
+================================= =================================== ==================================== 
+.. image:: _static/axial-view.jpg .. image:: _static/frontal-view.jpg .. image:: _static/sagittal-view.jpg
+================================= =================================== ==================================== 
+
+The 3D modeled patient can be moved through different interactions on the 3D image. Here is the list of these interactions :
+
+- Rotation around the center of the 3D view by a left mouse button press and a mouse dragging in direction of the rotation. 
+
+.. image:: _static/3D-rotate.png
+   :align: center
+
+- Translation by a shift + left mouse button press and a mouse dragging in direction of the translation. The translation can be reset by pressing the ``R`` key on the computer keyboard (reinitialisation of the point of view)
+
+.. image:: _static/3D-translation.png
+   :align: center
+
+- Zoom by a Shift + right mouse button press and a mouse dragging up (zoom in) or down (zoom out). The same result is obtained only with the right button press (out of the 3D Scan), or by using Ctrl + right mouse button. The Zoom can be reset by pressing the ``R`` key on the computer keyboard (reinitialisation of the point of view).
+
+.. image:: _static/3D-zoom.png
+   :align: center
+
+- Rotation around the central axe of the 3D view by a Ctrl + left mouse button press and a mouse dragging in direction of the rotation.
+
+.. image:: _static/3D-turn.png
+   :align: center
+
+At any time, the user can take a jpeg picture of the 3D view by clicking on the picture icons at the bottom part of the windows.
+
diff --git a/Apps/VRRender/doc/source/3D_Models_Properties.rst b/Apps/VRRender/doc/source/3D_Models_Properties.rst
new file mode 100755
index 0000000..8d167b7
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Models_Properties.rst
@@ -0,0 +1,20 @@
+3D Models Properties (show/hide organs)
+=======================================
+
+.. index:: Models Properties, Show organs, Hide organs
+
+The list of 3D modeled organs is available in the ``Organ Manager`` window that appears by selecting the ``Manage organs colors`` option in the ``3D Model`` menu, or by pressing F9 on the keyboard, or by clicking on the following button of the tool bar  :
+
+.. image:: _static/icone-F9.png
+   :align: center
+
+The ``Organ Manager`` window allows to display or hide any organ by using the check box. The ``Hide all organs`` check box allows to hide all organs.
+
+.. image:: _static/3D-show-hide-organs.png
+   :align: center
+
+It also allows to modify its opacity thanks to a slider located at the bottom part of the property window.
+
+.. image:: _static/3D-transparency.png
+   :align: center
+
diff --git a/Apps/VRRender/doc/source/3D_Resection.rst b/Apps/VRRender/doc/source/3D_Resection.rst
new file mode 100755
index 0000000..e58e68a
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Resection.rst
@@ -0,0 +1,53 @@
+VR-Planning Resection
+=====================
+
+.. index:: Resection, cutting plane
+
+VR-Planning allows to virtually resect any anatomical or pathological 3D modelled structure and to obtain the resulting volume and linked percentage of resection. VR-Planning not only gives the opportunity to perform several resections but also to plan several surgeries. The first step will thus consist in defining the operation by clicking on the ``New Resection`` button of the tool bar. 
+
+.. image:: _static/operation.png
+   :align: center 
+
+Clicking on the ``New Resection`` button opens a window that proposes to create a new operation if no operation has been planned before. By clicking on OK, you can give an operation name (Operation_n by default). The validation with a click on the OK button then opens a new window containing the list of organs that will be possible to cut. By default, all visible organs are selected. After the selection of organs, a click on the OK button validates the operation definition and only organ [...]
+
+.. image:: _static/3D-Resect-start.png
+   :align: center
+
+At this stage of the operation definition it is possible to add a cutting plane by using the ``Take plane points`` button.
+
+.. image:: _static/Add-plan2.png
+   :align: center 
+   
+At any time, it is also possible to see the operation parameterisation by opening the ``Organ Manager`` window by a click on the organ manager button of the tool bar and by selecting the ``Operations`` tab in the window. The Organ Manager window offers the opportunity to modify selected organ properties. As we will see, it will also allow to modify cutting plane parameterization.
+
+.. image:: _static/3D-Resect-manage.png 
+   :align: center 
+   
+The resection requires the definition of one or several cutting planes. A cutting plane can be added by using the ``Take plane points`` button on the tool bar. After a click on this button, a cutting planes appears in the 3D view. The blue part will be the resecting part and the normal coloured part will be the safe part. Any cutting plane can be moved by selecting the three red control points (red square box). All control points can be selected and moved by a left button hold and mouse  [...]
+
+.. image:: _static/3D-Resect-cutting-planes.png 
+   :align: center 
+ 
+Any cutting plane separates the space into two areas: the resecting area and the safe area. It is possible to switch both areas by using the Organ Manager window. You must first select the wanted plane and then click on the ``change side`` tab to switch the resected area with the safe area as shown on the following image.
+
+.. image:: _static/3D-Resect-plane-side.png 
+   :align: center 
+ 
+VR-Planning allows to add several cutting planes for each operation. At any time a simple click on the ``Take plane points`` button of the tool bar is sufficient to add and then displace the new cutting plane that will appear in the Organ Manager window in the ``Plane`` area of the ``Operation`` tab. A resection is then finalized by a simple click on the ``Resection`` button of the tool bar.
+
+.. image:: _static/3D-Resect-First.png 
+   :align: center 
+ 
+After each resection, the ``Operation`` tab of the Organ Manager window indicates the resected part and the safe part list of organs. It is possible to change the rendering properties (colour and transparency) of each resected or safe part of organs. It is also possible to obtain the volume and percentage of both the safe and the resected part by selecting the wanted organs. Information appears then in the dedicated volume and ratio area of this window after a click on the ``Compute`` button.
+
+.. image:: _static/3D-Resect-volume.png 
+   :align: center 
+   
+One of the great improvements of VR-Planning in comparison with 3D VSP, which had been developed by IRCAD in 2001, is the opportunity to realize several resections on a same organ. It allows for instance to realize several segmentectomies on a same liver. To add a new resection, the user has to click on the ``New Resection`` button. It will then propose to choose between adding a new operation or adding a new resection. By selecting and validating a ``new resection``, a new window will a [...]
+
+.. image:: _static/3D-New-Resection.png 
+   :align: center 
+   
+The user can also choose to do a new operation, replacing the previously performed operation. To add a new resection, the user has to click on the ``New Resection`` button. It will then propose to choose between adding a new operation or adding a new resection. By selecting and validating a ``new operation``, a new window will appear allowing to change the name of the operation (by default operation_N). All interactions are then the same as for the first operation.
+
+Finally, you can change a resection or an operation by using the ``Operation`` tab of the ``Organ Manager`` window. The user has first to select the requested operation in the operation list. He/She will then be able to change a resection by adding or removing cutting planes. He/She must thus select the wanted resection in the same list and click on the ``Modify resection`` button. He/She will then be able to modify the cutting plane position, to add a cutting plane with the ``Take plane [...]
diff --git a/Apps/VRRender/doc/source/3D_Volume_Rendering.rst b/Apps/VRRender/doc/source/3D_Volume_Rendering.rst
new file mode 100755
index 0000000..f8a3c93
--- /dev/null
+++ b/Apps/VRRender/doc/source/3D_Volume_Rendering.rst
@@ -0,0 +1,37 @@
+3D Volume Rendering
+===================
+
+.. index:: 3D Volume Rendering
+
+The VR-Planning visualization mode is started by pressing the F3 shortcut. It is also possible to select this mode by clicking on the VR icon of the tool bar : 
+
+.. image:: _static/VR-01.jpg
+   :align: center
+
+VR-Planning has been developed in order to be used in a fast way. Automated transfer functions (TF) have therefore been included in the software allowing users to save time by only selecting these transfer functions. This selection is performed in the TF selector box of the ``Transfer function editor``.  
+
+.. image:: _static/VR-TF-AUTO-01.png
+   :align: center
+
+As shown for medical use, the current software includes several pre-computed CT-scan transfer functions allowing to visualize bones, kidneys, liver, lungs, muscles, skin and vessels. More automated transfer functions provide standard transfer functions currently used in other applications. It is important to notice that in VR-Planning the color table of the transfer functions is applied on the Negato1 view. It can be highly useful to have a better medical image reading. 
+
+.. image:: _static/VR-TF-AUTO-02.jpg
+   :align: center
+
+It is possible to manipulate the Volume Rendering view with the same command than with the 2D MPR view, which means by using the mouse wheel or by using the combination of the ``Shift`` key and pressing the Right button for the zoom, by pressing the Left button and moving the mouse for the rotation, and by combining the ``Shift`` key and pressing the Left button for translation. In this case, a movement in any direction creates a translation in the same direction. The reset of translatio [...]
+
+.. image:: _static/VR-manip.jpg
+   :align: center
+
+It is also possible to go directly to axial, frontal, and sagittal views by using the shortcut ``1``, ``2`` and ``3`` on the keyboard or the ``Volume Rendering`` menu by selecting ``Axial view``, ``Frontal view`` and ``Sagittal view`` options. In this same menu, the ``Snapshot rendering view`` option allows to take a picture of the Volume rendering view.
+
+Another important interest of VR-Planning is the ability to visualize only a part of the image by applying a cutting plane on the global image. Two major kinds of cutting planes are proposed. The first one is the standard axial, sagittal and frontal cutting plane. The second one is a mobile 3D cutting plane that can be placed anywhere in the volume. The selection of cutting planes (and unselection) is done with the ``Volume Rendering`` menu or via shortcuts : ``O`` for the ``View clippin [...]
+
+The clipping box provides 6 cutting planes: two axial, two frontal and two sagittal ones. The displacement of a cutting plane is then performed by pressing the left mouse button on the corresponding center sphere of this plane. When selected, the plane changes color and the sphere turns red. Displacement is then realized by moving the mouse. It is possible to remove the clipping box planes by selecting the ``Reset clipping box`` option in the ``Volume Rendering`` menu or by using the sho [...]
+
+.. image:: _static/VR-cutting.jpg
+   :align: center
+
+This cutting box can also be reduced through a kind of in and out zoom by selecting the central volume sphere by a right button pressing, and then by adding a ``Shift`` pressing and an up (zoom out) and down (zoom in) movement of the mouse. In the same way, the cutting box can be translated by selecting the central volume sphere by pressing the left button, and then by adding a ``Shift`` pressing and a movement of the mouse.
+
+Furthermore, the clipping plane provides one cutting plane that can be moved thanks to the displacement and orientation of a vector that is normal in this cutting plane. The displacement is then performed by pressing the left mouse button on one of the two extremities of the vector. When selected, the vector turns red. Displacement is then realized by moving the mouse. When the cutting plane cuts the box, a red intersection appears. It is then possible to directly move the plane into the [...]
diff --git a/Apps/VRRender/doc/source/Acknowledgment.rst b/Apps/VRRender/doc/source/Acknowledgment.rst
new file mode 100755
index 0000000..89a1ae1
--- /dev/null
+++ b/Apps/VRRender/doc/source/Acknowledgment.rst
@@ -0,0 +1,136 @@
+
+.. _acknowledgment:
+
+Acknowledgment
+==============
+
+.. index:: Acknowledgment, open source, European, ICT, ehealth
+
+.. |EQC| replace:: European Commission
+.. _EQC: http://ec.europa.eu/information_society/activities/health
+
+.. _PASSPORT: http://www.passport-liver.eu/
+
+
+
+
+.. |boost|      image:: _static/acknowledgment/boost.png
+                :align: middle
+.. |cfitsio|    image:: _static/acknowledgment/cfitsio.png
+                :align: middle
+.. |dcmtk|      image:: _static/acknowledgment/dcmtk.png
+                :align: middle
+.. |fits2itk|   image:: _static/acknowledgment/fits2itk.png
+                :align: middle
+.. |itk|        image:: _static/acknowledgment/itk.png
+                :align: middle
+.. |vtk|        image:: _static/acknowledgment/vtk.png
+                :align: middle
+.. |libjpeg|    image:: _static/acknowledgment/libjpeg.png
+                :align: middle
+.. |libpng|     image:: _static/acknowledgment/libpng.png
+                :align: middle
+.. |libtiff|    image:: _static/acknowledgment/libtiff.png
+                :align: middle
+.. |libxml2|    image:: _static/acknowledgment/libxml2.png
+                :align: middle
+.. |log4cxx|    image:: _static/acknowledgment/log4cxx.png
+                :align: middle
+.. |opengl|     image:: _static/acknowledgment/opengl.png
+                :align: middle
+.. |vtkinria3d| image:: _static/acknowledgment/vtkinria3d.png
+                :align: middle
+.. |python|     image:: _static/acknowledgment/python.png
+                :align: middle
+.. |sphinx|     image:: _static/acknowledgment/sphinx.png
+                :align: middle
+.. |wx|         image:: _static/acknowledgment/wx.png
+                :align: middle
+.. |zlib|       image:: _static/acknowledgment/zlib.png
+                :align: middle
+.. |bzip2|      image:: _static/acknowledgment/bzip2.png
+                :align: middle
+.. |gdcm|       image:: _static/acknowledgment/gdcm.png
+                :align: middle
+
+
+.. |doxygen|    image:: _static/acknowledgment/doxygen.png
+                :align: middle
+.. |eclipse|    image:: _static/acknowledgment/eclipse.png
+                :align: middle
+.. |vim|        image:: _static/acknowledgment/vim.png
+                :align: middle
+.. |fsf|        image:: _static/acknowledgment/fsf.png
+                :align: middle
+.. |gcc|        image:: _static/acknowledgment/gcc.png
+                :align: middle
+.. |scons|      image:: _static/acknowledgment/scons.png
+                :align: middle
+.. |visualc|    image:: _static/acknowledgment/visualc.png
+                :align: middle
+.. |wix|        image:: _static/acknowledgment/wix.png
+                :align: middle
+
+
+
+
+
+
+First of all, VR-Planning has partly been funded by the |EQC|_ within the ICT-2007.5.3 research project PASSPORT_.
+
+
+
+
+.. image:: _static/ehealth.png
+   :align: center
+
+VR-Planning  has been developed by Vincent Agnus, Arnaud Charnoz, Emilie Harquel, Alexandre Hostettler, Pascal Monnier, Johan Moreau, Nicolas Philipps and Julien Waechter, the project being managed by Prof. Luc Soler. Illustrations and logos have been realized by Juan Hernandez. Documentation and translation has been realized by Pamela Lhote and Luc Soler.
+
+The test and validation session has been performed by Mourad Bouhadjar, Anne-Blandine Osswald, and Prof. Luc Soler. 3D gallery and patient modeling have been realized by Mourad Bouhadjar, Anne-Blandine Osswald and Prof. Luc Soler.
+
+The website development has been supervised by the Websurg team under the management of Thomas Parent.
+
+This sofware has been tested at the University Hospital of Strasbourg. We would like to thank for their help the medical staff: 
+- Endocrine and Digestive Surgical team : Prof. Jacques Marescaux, Prof. Didier Mutter, Prof. Bernard Dallemagne, Prof. Luc Soler, Dr. Michel Vix,
+
+VR-Planning has been built on the following projects :
+
+.. list-table::
+
+   * - |boost|
+     - |cfitsio|
+     - |dcmtk|
+     - |fits2itk|
+     - |itk|
+     - |vtk|
+     - |vtkinria3d|
+   * - |libjpeg|
+     - |libpng|
+     - |libtiff|
+     - |libxml2|
+     - |log4cxx|
+     - |opengl|
+     - |wx|
+   * -
+     - |python|
+     - |sphinx|
+     - |zlib|
+     - |bzip2|
+     - |gdcm|
+     -
+
+
+VR-Planning has been developed with the following software :
+
+.. list-table::
+
+   * - |doxygen|
+     - |eclipse|
+     - |vim|
+     - |fsf|
+   * - |gcc|
+     - |scons|
+     - |wix|
+     - |visualc|
+
+
diff --git a/Apps/VRRender/doc/source/Basic_Image_Filtering.rst b/Apps/VRRender/doc/source/Basic_Image_Filtering.rst
new file mode 100755
index 0000000..0e98072
--- /dev/null
+++ b/Apps/VRRender/doc/source/Basic_Image_Filtering.rst
@@ -0,0 +1,12 @@
+VR-Planning basic image filtering
+===================================
+
+.. index:: filtering
+
+Several filters have been added in VR-Planning allowing to basically modify a selected image. When a filter is applied, a copy of the selected image is created and added in the ``series selector``. To distinguish the resulting image from the native image, the selector indicates a set of information allowing to precisely know the origin of the image and the parameter of the filter that has been used. This information is located in the comment area and is presented as follows: In : Operato [...]
+
+.. image:: _static/Negato-filter.png
+   :align: center
+
+In VR-Planning, we have decided to limit the set of filters to three basic operators: Image Rotation (that allows a +/- 90 degrees rotation in axial, saggital or frontal axe), Improve image 2D (a 1 pixel radius 2D median filter), and Improve image 3D (a 1 voxel radius 3D median filter).
+
diff --git a/Apps/VRRender/doc/source/Export_Data.rst b/Apps/VRRender/doc/source/Export_Data.rst
new file mode 100755
index 0000000..084020d
--- /dev/null
+++ b/Apps/VRRender/doc/source/Export_Data.rst
@@ -0,0 +1,8 @@
+Export and Close data
+=====================
+
+.. index:: Export Data
+
+The file menu contains two useful export options. The first ``export selected patient`` option allows to record a selected patient in a VR-Planning format. It will include the distance measurement, the landmark positioning, the transfer function of the direct volume rendering, and the planned operation integratin the cutting planes position. The second ``export slices (jpg)`` option allows to record, in a selected folder, all DICOM slices of the selected image in a jpeg format.
+
+The file menu also contains two options allowing to close opened patient data. The ``Close all patients`` option will close all patients data and the ``Close selected image`` will only close the image seleted in the ``series selector`` window.
diff --git a/Apps/VRRender/doc/source/Help_menu.rst b/Apps/VRRender/doc/source/Help_menu.rst
new file mode 100755
index 0000000..ca8ee7b
--- /dev/null
+++ b/Apps/VRRender/doc/source/Help_menu.rst
@@ -0,0 +1,12 @@
+Help Menu
+=========
+
+.. index:: Help
+
+VR-Planning include a ``Help`` menu including the VR-Planning documentation in an interactive window. All information contained in this document is thus available in this interactive help menu. Among this information, the list of shortcuts is an important help.
+
+Moreover, the ``Help`` menu contain several other useful options. The ``Edit Auto Update`` option, opens a window allowing to select (unselect) an automatic check of the VR-Planning software update. It also allows to select (unselect) the software statistic computation that will allow us to improve VR-Planning. In opposite, the ``Check update`` option allows to manually check the VR-Planning software update. 
+
+*For any support request do not hesitate to contact : rd-support-vrplanning at ircad.fr*
+
+However, do not forget that VR-Planning can be used under a specific user license agreement. By using the VR-Planning, you accept the terms and conditions described in the :ref:`licence` chapter. VR-Planning *NOT* being FDA approved and having *NO* CE Mark, it comes with absolutely *NO Warranty*.  
diff --git a/Apps/VRRender/doc/source/Introduction.rst b/Apps/VRRender/doc/source/Introduction.rst
new file mode 100755
index 0000000..065bd3e
--- /dev/null
+++ b/Apps/VRRender/doc/source/Introduction.rst
@@ -0,0 +1,9 @@
+Introduction
+============
+
+.. index:: IRCAD, Image Viewer, VR-Render
+
+
+VR-Planning is an IRCAD Surgical Planning Software working on Windows, Linux and MacOS. It allows to visualize 3D models of patients reconstucted from their DICOM Image by IRCAD R&D team, and also to virtually cut these models by providing an automatic volume and pourcentage computation. Three kinds of visualization are possible : 3D model visualization, 2D Dicom visualization and 3D Dicom direct volume rendering. You can also use VR-Planning to visualize your own DICOM medical images of [...]
+
+
diff --git a/Apps/VRRender/doc/source/Licence.rst b/Apps/VRRender/doc/source/Licence.rst
new file mode 100755
index 0000000..aa08f46
--- /dev/null
+++ b/Apps/VRRender/doc/source/Licence.rst
@@ -0,0 +1,23 @@
+
+.. _licence:
+
+Licence
+=======
+
+.. index:: Licence
+
+By using the VR-Planning software, you accept the terms and conditions described hereinafter. If you do not accept them, you can not use this software. IRCAD grants you a non-exclusive license to use this software. 
+
+EXCLUSION OF GUARANTEES : YOU ACKNOWLEDGE THAT IRCAD HAS NOT GIVEN YOU ANY EXPLICIT OR IMPLICIT GUARANTEE REGARDING THE VR-Planning SOFTWARE, ITS DATA MEDIUM AND ALL THE INCLUDED DOCUMENTS AND INFORMATION. YOU FURTHER ACKNOWLEDGE THAT THE SOFTWARE HAS BEEN PROVIDED  **IN ITS PRESENT STATE** WITHOUT ANY GUARANTEE OF WHATEVER KIND. IRCAD GIVES NO GUARANTEE, EXPLICIT OR TACIT, SPECIFICALLY REGARDING THE COMPLIANCE WITH A NEED OF A PARTICULAR USE, MERCHANTABLE STATE OR QUALITY OR NON-VIOLATI [...]
+
+LIABILITY LIMITATION : UNDER NO CIRCUMSTANCES IRCAD WILL BE HELD LIABLE FOR THE DAMAGES THAT MIGHT BE CAUSED THROUGH THE USE OF THE VR-Planning SOFTWARE, LOSS OF USAGE OR INTERRUPTION OF ACTIVITY OR FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSECUTIVE DAMAGE OF ANY KIND, SPECIFICALLY ANY LOSS OF BENEFIT OR LOSS OF PROFIT, NO MATTER WHAT KIND OF ACTION UNDERTAKEN, I.E. CONTRACTUAL, WRONGFUL (INCULDING IN CASE OF NEGLIGENCE), UNDER THE STRICT LIABILITY OF THE PRODUCT OR OTHER, REGARDLESS IF IR [...]
+
+VR-Planning uses a set of Open-Source libraries delivered with it   :ref:`acknowledgment`.
+
+.. |danger| image:: _static/danger.png
+            :align: middle
+
+.. warning::
+
+   |danger| This software is *NOT FDA* approved and has *NO CE mark*
+
diff --git a/Apps/VRRender/doc/source/Minimal_config.rst b/Apps/VRRender/doc/source/Minimal_config.rst
new file mode 100755
index 0000000..95a896e
--- /dev/null
+++ b/Apps/VRRender/doc/source/Minimal_config.rst
@@ -0,0 +1,31 @@
+Minimal Configuration
+=====================
+
+.. index:: Minimal Configuration, OS
+
+VR-Planning supports the following operating systems :
+
+
+
+.. |ms|         image:: _static/acknowledgment/ms.png
+                :align: middle
+.. |apple|      image:: _static/acknowledgment/apple.png
+                :align: middle
+.. |linux|      image:: _static/acknowledgment/linux.png
+                :align: middle
+.. |linux-64|   image:: _static/acknowledgment/linux-64.png
+                :align: middle
+
+
+.. list-table::
+
+   * - |ms|        
+..   - |apple|     
+..   - |linux|     
+..   - |linux-64|  
+
+
+.. To works, VR-Planning requires a minimum of 2 Go (Mac OS, Linux, windows NT) or 3 Go (Vista/7) of RAM. The 3D rendering requires a 3D graphics card working under OpenGL.
+
+To works, VR-Planning requires a minimum of 2 Go (windows XP) or 3 Go (Vista/7) of RAM. The 3D rendering requires a 3D graphics card supporting OpenGL.
+
diff --git a/Apps/VRRender/doc/source/Read_and_Select_Data.rst b/Apps/VRRender/doc/source/Read_and_Select_Data.rst
new file mode 100755
index 0000000..1191f37
--- /dev/null
+++ b/Apps/VRRender/doc/source/Read_and_Select_Data.rst
@@ -0,0 +1,26 @@
+Read and select data 
+====================
+
+.. index:: Read Data, Select Data
+
+
+
+It is possible to load recorded patient by using the ``Import`` functions in the ``File`` menu. Three formats are available for reading : DICOM, MFO (VR-Anat IRCAD Format) and FXZ (VR-Planning IRCAD Format). The Dicom format is available through the first button of the tool bar, the two IRCAD formats being available from the second button :
+
+.. image:: _static/openDicom_openFxz.png
+   :align: center
+
+
+A left click on the first icon, or a selection of the ``import DICOM`` option of the ``File`` menu allows to start the selection of a folder containing all DICOM slices of one or several medical images of the patient. The DICOM reader is the latest ITK version developed by Kitware and used by a large set of medical software applications.
+
+A left click on this icon, or a selection of the ``import data`` option of the ``File`` menu allows to load 3D modeled patient or exported DICOM images in two IRCAD format. The MFO format, as DICOM format, is a folder containing the 3D modelled patient data resulting of the VR-Anat software use. The Fxz is the specific VR-Planning format allowing to include in only one file one or several medical images and linked 3D models of one or several patients (see export data). This format will b [...]
+
+When a patient is loaded, it is possible to visualize (or hide) the ``series selector`` windows containing the parameters of the medical image or the patient information by clicking on the ``info`` button on the tool bar :
+
+.. image:: _static/View-INFO.png
+   :align: center
+
+The ``series selector`` window contains the name of the patient, the kind of modality (Ct-scan, MRI, etc…), the acquisition date, the image size, the voxel size and the comments. By clicking on the up left window icon, the ``property`` window is opened (or closed). It contains the patient’s birthdate, his gender and the hospital name. When data are anonymous, real patient information are erased and replaced by generic data. 
+
+.. image:: _static/info-patient.png
+   :align: center
diff --git a/Apps/VRRender/doc/source/Shortcuts.rst b/Apps/VRRender/doc/source/Shortcuts.rst
new file mode 100755
index 0000000..95c4a3e
--- /dev/null
+++ b/Apps/VRRender/doc/source/Shortcuts.rst
@@ -0,0 +1,138 @@
+Shortcuts
+=========
+
+.. index:: Shortcut, Shortcuts
+
+
+Global shortcuts
+----------------
+
+========== ================================
+ Shortcut   Action
+========== ================================
+ Suppr      Erase selected image
+ F1         3D Model view
+ F2         2D Medical Image view
+ F3         3D Volume rendering view
+ F9         Manage organs colors
+ F12        HShow/Hide patient information
+========== ================================
+
+
+Global 3D manipulation (in 3D and Volume Rendering view only)
+-------------------------------------------------------------
+
+=== ===============
+ 1    axial view
+ 2   frontal view
+ 3   sagittal view
+=== ===============
+
+
+
+
+Global 3D-2D manipulation
+-------------------------
+
+MD = Mouse drag which mean move the mouse by letting the selected button pressed.
+
+.. list-table::
+
+   * - shift + left mouse button + MD
+
+       shift + middle mouse button + MD
+
+       ctrl + middle mouse button + MD
+     - Translation
+   * - mouse wheel (up or down)
+
+       shift + Right mouse button + MD
+
+       ctrl + Right mouse button + MD
+     - Zoom
+   * - R
+     - Reset camera
+
+
+
+
+
+Specific manipulation for medical image (2D or 3D)
+--------------------------------------------------
+
+.. list-table::
+
+   * - left/right key
+
+       shift + mouse wheel
+     - modify current slice  (after any click in selected slice)
+   * - T/Y
+     - modify axial slice
+   * - G/H
+     - modify frontal slice
+   * - B/N
+     - modify sagittal slice
+   * - shift + R
+     - reset window/level
+   * - left mouse button
+     - show pixel values
+   * - middle mouse button
+     - synchronize all views
+   * - right mouse button
+     - modify level and window
+   * - ctrl + L
+     - add a landmark on the last selected voxel
+   * - ctrl + F
+     - synchronize all views on selected landmark
+   * - ctrl + V
+     - hide/show landmarks
+   * - right mouse click
+     - remove distance/landmark
+
+
+
+Specific manipulation of the oblique plane
+------------------------------------------
+
+======================================================= ========================================================
+ middle mouse button                                     in center of plane : plane translation from his normal
+
+                                                         in corner : rotation in the plane
+
+                                                         in border : rotation of the plane around his normal
+
+ ctrl + middle mouse button                              in center of plane : plane translation from his normal
+
+                                                         in corner : translation of the edge around the corner
+
+                                                         in border : translation of the edge
+
+ shift + middle mouse button                             reslice plane (increase/decrease plane size)
+======================================================= ========================================================
+
+
+Specific manipulation of Volume rendering clipping box
+------------------------------------------------------
+
+
+========== ===================================
+ O          show/hide clipping box
+ Ctrl + O   reset clipping box
+ T/Y        clipping box axial translation
+ G/H        clipping box frontal translation
+ B/N        clipping box sagittal translation
+ P          show/hide clipping plane
+ Ctrl + P   reset clipping plane
+========== ===================================
+
+
+Specific manipulation of Transfer function editor
+-------------------------------------------------
+
+========================= ==================
+ left mouse button         select points
+ Ctrl + left mouse click   new point
+ double left mouse click   edit point color
+ right mouse click         remove point
+========================= ==================
+
diff --git a/Apps/VRRender/doc/source/Start_VR_Planning.rst b/Apps/VRRender/doc/source/Start_VR_Planning.rst
new file mode 100755
index 0000000..32c072f
--- /dev/null
+++ b/Apps/VRRender/doc/source/Start_VR_Planning.rst
@@ -0,0 +1,17 @@
+Start VR-Planning
+===================
+
+.. index:: Start
+
+
+
+VR-Planning has been optimized for surgeon use. After installation, it will thus automatically recognize the IRCAD file format. By selecting the 3D clinical case (some 3D cases are freely available on www.websurg.com), VR-Planning will automatically start. However, you can also start VR-Planning for your own DICOM data or to select several IRCAD 3D modeled patients. IRCAD 3D modeled data are recognized and appear with the following VR-Planning icon :
+
+.. image:: _static/VRPlanning.png
+   :align: center
+
+When VR-Planning is started by selecting a patient, the 3D model visualization window appears as shown on the following example.
+
+.. image:: _static/3D-Planning-View-00.png
+   :align: center
+
diff --git a/Apps/VRRender/doc/source/Tool_bar.rst b/Apps/VRRender/doc/source/Tool_bar.rst
new file mode 100755
index 0000000..f2194dc
--- /dev/null
+++ b/Apps/VRRender/doc/source/Tool_bar.rst
@@ -0,0 +1,11 @@
+Tool Bar
+========
+
+.. index:: Tool Bar
+
+
+
+The easiest way to start VR-Planning is to use its tool bar. It contains respectively the following most used functions : Read Dicom image, read 3D modeled patient, 3D view, 2D scanner view, Direct volume rendering view, show/hide data information, add a 3D landmark, find a 3D landmark, hide/show 3D landmarks, show 3D organs list and properties, Axial view, Frontal view and Sagittal view, New operation, Add cutting plane, Compute Resection. All these functions will be explained in the fo [...]
+
+.. image:: _static/Tool-bar-planning.png
+   :align: center
diff --git a/Apps/VRRender/doc/source/Transfert_function.rst b/Apps/VRRender/doc/source/Transfert_function.rst
new file mode 100755
index 0000000..67af1e7
--- /dev/null
+++ b/Apps/VRRender/doc/source/Transfert_function.rst
@@ -0,0 +1,31 @@
+Transfer Function Editor
+========================
+
+.. index:: Transfer Function, TF Editor
+
+VR-Planning has been developed in order to edit transfer functions. Seven buttons are thus available :
+- The ``Delete`` button (red cross) removes a selected transfer function in the list,
+- The ``New`` button (white paper) defines a new transfer function in the list,
+- The ``Reinitialize`` button (green arrow) reinitializes the native transfer functions,
+- The ``Rename`` button (A) allows to change the name of a selected transfer function. 
+- The ``load`` (folder) and ``save`` (bleu arrow) buttons allow to load or save a transfer function in a selected location on the hard drive or on the network. 
+
+When a new function is created, this function is set by default with the same parameter as the last selected one. It is possible and easy to change any transfer function (new or old) by using the transfer function editor. All TF are set by control points that can be removed by a simple right button click on the selected control point in the transfer function.
+
+.. image:: _static/VR-TF-01.jpg
+   :align: center
+
+Addition of a new control point is done by pressing the control keyboard button and by clicking on the left mouse button on the transfer function. It is also possible to change the color of any control point by a double left button click on it. It then opens a color tab allowing to select the new requested color. The transparency and grey level of each control point can be modified by moving it by pressing the left mouse button and displacing it. These values can also be modified more pr [...]
+
+.. image:: _static/VR-TF-02.jpg
+   :align: center
+
+It is finally possible to easily modify the transfert function by using the windowing parameterization techniques. This method allow to fastly adapt the pre-computed CT-scan transfer functions to the specificity of the selected image. It is thus possible to make a translation of the Transfert function in order to reduce the grey level value (Mouse Right button Pression and displacement from up to down), or in opposite in order to increase the grey level value (Mouse Right button Pression [...]
+
+.. image:: _static/VR-TF-MPR-01.jpg
+   :align: center
+
+It is also possible to make a resizing of the Transfert function in order to reduce the grey level window (Mouse Right button Pression and displacement from right to left), or in opposite in order to increase the grey level window (Mouse Right button Pression and displacement from left to right) (see next image).
+
+.. image:: _static/VR-TF-MPR-02.jpg
+   :align: center
diff --git a/Apps/VRRender/doc/source/What_is_Volume_Rendering.rst b/Apps/VRRender/doc/source/What_is_Volume_Rendering.rst
new file mode 100755
index 0000000..8c20e45
--- /dev/null
+++ b/Apps/VRRender/doc/source/What_is_Volume_Rendering.rst
@@ -0,0 +1,15 @@
+What is direct Volume Rendering ? 
+=================================
+
+.. index:: Volume Rendering 
+
+Volume Rendering (VR) is a well known visualization method for the 3D visualization of medical images. It is based on transparency and coloration of voxels. Indeed, a medical image is composed of a set of voxels, each voxel having a grey level that represents a physical property of the tissue (absorption of X ray in case of CT for instance). A voxel being a pixel in 3D, it is a square if slice thickness = pixel size or a rectangular box if slice thickness is different from the pixel size [...]
+
+.. image:: _static/VR-DEF.jpg
+   :align: center
+
+The remaining problem is thus to select voxels that we want to see, and voxels that have to be put in transparency. Such a selection, called ``segmentation`` in computer sciences and consisting in delineating anatomical or pathological structures, is complex and time consuming. Another solution is to automatically replace all grey levels by colors, and add for each grey level an associated transparency level. This transformation is summarized in a transfer function that gives for each gr [...]
+
+.. image:: _static/VR-TF-DEF.jpg
+   :align: center
+
diff --git a/Apps/VRRender/doc/source/Windows_Installation.rst b/Apps/VRRender/doc/source/Windows_Installation.rst
new file mode 100755
index 0000000..858f252
--- /dev/null
+++ b/Apps/VRRender/doc/source/Windows_Installation.rst
@@ -0,0 +1,16 @@
+Windows Installation
+====================
+
+.. index:: Installation
+
+
+Installing VR-Planning is easy. Under Windows, the automatic install file
+``VR-Planning_n.msi`` starts with a double click on its icon. It starts a 5 step
+process where you will have to ``accept the terms in the license agreement``.
+It will further be possible to select the folder where the software will be
+installed. Indeed, the default folder can be avoid if you do not have the
+access right. In such a case, select a personal folder to install VR-Planning.
+After the final validation window, the setup software then installs VR-Planning
+on your computer and its icons on your desktop and it asks you for a last click
+on the finish button. The installation is completed.
+
diff --git a/Apps/VRRender/doc/source/_static/3D-New-Resection.png b/Apps/VRRender/doc/source/_static/3D-New-Resection.png
new file mode 100755
index 0000000..e510c23
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-New-Resection.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Planning-View-00.png b/Apps/VRRender/doc/source/_static/3D-Planning-View-00.png
new file mode 100755
index 0000000..f67ebed
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Planning-View-00.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-First.png b/Apps/VRRender/doc/source/_static/3D-Resect-First.png
new file mode 100755
index 0000000..69dd59e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-First.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-cutting-planes.png b/Apps/VRRender/doc/source/_static/3D-Resect-cutting-planes.png
new file mode 100755
index 0000000..633649e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-cutting-planes.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-manage.png b/Apps/VRRender/doc/source/_static/3D-Resect-manage.png
new file mode 100755
index 0000000..475a409
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-manage.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-plane-side.png b/Apps/VRRender/doc/source/_static/3D-Resect-plane-side.png
new file mode 100755
index 0000000..3f19da4
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-plane-side.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-start.png b/Apps/VRRender/doc/source/_static/3D-Resect-start.png
new file mode 100755
index 0000000..322ccb7
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-start.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-Resect-volume.png b/Apps/VRRender/doc/source/_static/3D-Resect-volume.png
new file mode 100755
index 0000000..fecb5e5
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-Resect-volume.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-distance.png b/Apps/VRRender/doc/source/_static/3D-distance.png
new file mode 100755
index 0000000..815bf3c
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-distance.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-landmark.png b/Apps/VRRender/doc/source/_static/3D-landmark.png
new file mode 100755
index 0000000..635fa12
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-landmark.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-rotate.png b/Apps/VRRender/doc/source/_static/3D-rotate.png
new file mode 100755
index 0000000..f628507
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-rotate.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-scan-1-3.png b/Apps/VRRender/doc/source/_static/3D-scan-1-3.png
new file mode 100755
index 0000000..3e68e07
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-scan-1-3.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-scan-GL-value.png b/Apps/VRRender/doc/source/_static/3D-scan-GL-value.png
new file mode 100755
index 0000000..4624ef5
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-scan-GL-value.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-scan-ax-front-sag.png b/Apps/VRRender/doc/source/_static/3D-scan-ax-front-sag.png
new file mode 100755
index 0000000..eccdea6
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-scan-ax-front-sag.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-scan-contrast.png b/Apps/VRRender/doc/source/_static/3D-scan-contrast.png
new file mode 100755
index 0000000..09897bd
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-scan-contrast.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-show-hide-organs.png b/Apps/VRRender/doc/source/_static/3D-show-hide-organs.png
new file mode 100755
index 0000000..6e2a27d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-show-hide-organs.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-show-hide-scan.png b/Apps/VRRender/doc/source/_static/3D-show-hide-scan.png
new file mode 100755
index 0000000..5aa38c1
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-show-hide-scan.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-translation.png b/Apps/VRRender/doc/source/_static/3D-translation.png
new file mode 100755
index 0000000..ddae1ef
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-translation.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-transparency.png b/Apps/VRRender/doc/source/_static/3D-transparency.png
new file mode 100755
index 0000000..20054ce
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-transparency.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-turn.png b/Apps/VRRender/doc/source/_static/3D-turn.png
new file mode 100755
index 0000000..6af3a15
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-turn.png differ
diff --git a/Apps/VRRender/doc/source/_static/3D-zoom.png b/Apps/VRRender/doc/source/_static/3D-zoom.png
new file mode 100755
index 0000000..b1543c1
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/3D-zoom.png differ
diff --git a/Apps/VRRender/doc/source/_static/Add-Find-View-landmark.png b/Apps/VRRender/doc/source/_static/Add-Find-View-landmark.png
new file mode 100755
index 0000000..194b1b1
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Add-Find-View-landmark.png differ
diff --git a/Apps/VRRender/doc/source/_static/Add-landmark.png b/Apps/VRRender/doc/source/_static/Add-landmark.png
new file mode 100755
index 0000000..33a4b2f
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Add-landmark.png differ
diff --git a/Apps/VRRender/doc/source/_static/Add-plan1.png b/Apps/VRRender/doc/source/_static/Add-plan1.png
new file mode 100755
index 0000000..d78bbae
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Add-plan1.png differ
diff --git a/Apps/VRRender/doc/source/_static/Add-plan2.png b/Apps/VRRender/doc/source/_static/Add-plan2.png
new file mode 100755
index 0000000..b9d130b
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Add-plan2.png differ
diff --git a/Apps/VRRender/doc/source/_static/AddTool.png b/Apps/VRRender/doc/source/_static/AddTool.png
new file mode 100755
index 0000000..5e4bbc2
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/AddTool.png differ
diff --git a/Apps/VRRender/doc/source/_static/Find-landmark.png b/Apps/VRRender/doc/source/_static/Find-landmark.png
new file mode 100755
index 0000000..4071446
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Find-landmark.png differ
diff --git a/Apps/VRRender/doc/source/_static/Mode-VR.png b/Apps/VRRender/doc/source/_static/Mode-VR.png
new file mode 100755
index 0000000..5263d21
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Mode-VR.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-01.png b/Apps/VRRender/doc/source/_static/Negato-01.png
new file mode 100755
index 0000000..00444e1
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-01.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-Distance.png b/Apps/VRRender/doc/source/_static/Negato-Distance.png
new file mode 100755
index 0000000..f7dcd28
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-Distance.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-Zoom.png b/Apps/VRRender/doc/source/_static/Negato-Zoom.png
new file mode 100755
index 0000000..8e6514f
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-Zoom.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-axes.png b/Apps/VRRender/doc/source/_static/Negato-axes.png
new file mode 100755
index 0000000..ab032fc
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-axes.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-contrast.png b/Apps/VRRender/doc/source/_static/Negato-contrast.png
new file mode 100755
index 0000000..3726356
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-contrast.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-filter.png b/Apps/VRRender/doc/source/_static/Negato-filter.png
new file mode 100755
index 0000000..f89c687
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-filter.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-info.png b/Apps/VRRender/doc/source/_static/Negato-info.png
new file mode 100755
index 0000000..1e1440c
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-info.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-landmarks.png b/Apps/VRRender/doc/source/_static/Negato-landmarks.png
new file mode 100755
index 0000000..0bd0219
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-landmarks.png differ
diff --git a/Apps/VRRender/doc/source/_static/Negato-translate.png b/Apps/VRRender/doc/source/_static/Negato-translate.png
new file mode 100755
index 0000000..abaf0a2
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Negato-translate.png differ
diff --git a/Apps/VRRender/doc/source/_static/Resection.png b/Apps/VRRender/doc/source/_static/Resection.png
new file mode 100755
index 0000000..8e2fd63
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Resection.png differ
diff --git a/Apps/VRRender/doc/source/_static/Resection2.png b/Apps/VRRender/doc/source/_static/Resection2.png
new file mode 100755
index 0000000..e6a1249
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Resection2.png differ
diff --git a/Apps/VRRender/doc/source/_static/Tool-bar-planning.png b/Apps/VRRender/doc/source/_static/Tool-bar-planning.png
new file mode 100755
index 0000000..267fe1f
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/Tool-bar-planning.png differ
diff --git a/Apps/VRRender/doc/source/_static/VR-01.jpg b/Apps/VRRender/doc/source/_static/VR-01.jpg
new file mode 100755
index 0000000..8f94f80
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-01.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-DEF.jpg b/Apps/VRRender/doc/source/_static/VR-DEF.jpg
new file mode 100755
index 0000000..7147434
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-DEF.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-01.jpg b/Apps/VRRender/doc/source/_static/VR-TF-01.jpg
new file mode 100755
index 0000000..03f94e6
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-01.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-02.jpg b/Apps/VRRender/doc/source/_static/VR-TF-02.jpg
new file mode 100755
index 0000000..1090a38
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-02.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-AUTO-01.png b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-01.png
new file mode 100755
index 0000000..79ccb40
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-01.png differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.jpg b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.jpg
new file mode 100755
index 0000000..12cc9f3
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.png b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.png
new file mode 100755
index 0000000..53363bc
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-AUTO-02.png differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-DEF.jpg b/Apps/VRRender/doc/source/_static/VR-TF-DEF.jpg
new file mode 100755
index 0000000..949a2e9
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-DEF.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-MPR-01.jpg b/Apps/VRRender/doc/source/_static/VR-TF-MPR-01.jpg
new file mode 100755
index 0000000..aed00c9
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-MPR-01.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-TF-MPR-02.jpg b/Apps/VRRender/doc/source/_static/VR-TF-MPR-02.jpg
new file mode 100755
index 0000000..552421b
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-TF-MPR-02.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-cutting.jpg b/Apps/VRRender/doc/source/_static/VR-cutting.jpg
new file mode 100755
index 0000000..805ed33
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-cutting.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR-manip.jpg b/Apps/VRRender/doc/source/_static/VR-manip.jpg
new file mode 100755
index 0000000..f450e5c
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR-manip.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/VR.png b/Apps/VRRender/doc/source/_static/VR.png
new file mode 100755
index 0000000..cdb175d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR.png differ
diff --git a/Apps/VRRender/doc/source/_static/VRPlanning.png b/Apps/VRRender/doc/source/_static/VRPlanning.png
new file mode 100755
index 0000000..39e87cb
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VRPlanning.png differ
diff --git a/Apps/VRRender/doc/source/_static/VR_WLE_html.png b/Apps/VRRender/doc/source/_static/VR_WLE_html.png
new file mode 100755
index 0000000..243ea53
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR_WLE_html.png differ
diff --git a/Apps/VRRender/doc/source/_static/VR_html.png b/Apps/VRRender/doc/source/_static/VR_html.png
new file mode 100755
index 0000000..947a0ab
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/VR_html.png differ
diff --git a/Apps/VRRender/doc/source/_static/View-INFO.png b/Apps/VRRender/doc/source/_static/View-INFO.png
new file mode 100755
index 0000000..058c290
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/View-INFO.png differ
diff --git a/Apps/VRRender/doc/source/_static/View-landmark.png b/Apps/VRRender/doc/source/_static/View-landmark.png
new file mode 100755
index 0000000..1951d6f
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/View-landmark.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/apple.png b/Apps/VRRender/doc/source/_static/acknowledgment/apple.png
new file mode 100755
index 0000000..b27ea73
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/apple.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/boost.png b/Apps/VRRender/doc/source/_static/acknowledgment/boost.png
new file mode 100755
index 0000000..9105c39
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/boost.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/bzip2.png b/Apps/VRRender/doc/source/_static/acknowledgment/bzip2.png
new file mode 100755
index 0000000..de77173
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/bzip2.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/cfitsio.png b/Apps/VRRender/doc/source/_static/acknowledgment/cfitsio.png
new file mode 100755
index 0000000..035502d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/cfitsio.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/dcmtk.png b/Apps/VRRender/doc/source/_static/acknowledgment/dcmtk.png
new file mode 100755
index 0000000..cf317a8
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/dcmtk.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/doxygen.png b/Apps/VRRender/doc/source/_static/acknowledgment/doxygen.png
new file mode 100755
index 0000000..98d9a50
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/doxygen.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/eclipse.png b/Apps/VRRender/doc/source/_static/acknowledgment/eclipse.png
new file mode 100755
index 0000000..6208433
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/eclipse.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/ehealth.png b/Apps/VRRender/doc/source/_static/acknowledgment/ehealth.png
new file mode 100755
index 0000000..aba2767
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/ehealth.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/fits2itk.png b/Apps/VRRender/doc/source/_static/acknowledgment/fits2itk.png
new file mode 100755
index 0000000..479bd0d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/fits2itk.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/fsf.png b/Apps/VRRender/doc/source/_static/acknowledgment/fsf.png
new file mode 100755
index 0000000..5fa3a86
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/fsf.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/gcc.png b/Apps/VRRender/doc/source/_static/acknowledgment/gcc.png
new file mode 100755
index 0000000..897baf7
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/gcc.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/gdcm.png b/Apps/VRRender/doc/source/_static/acknowledgment/gdcm.png
new file mode 100755
index 0000000..a066e94
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/gdcm.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/itk.png b/Apps/VRRender/doc/source/_static/acknowledgment/itk.png
new file mode 100755
index 0000000..726110a
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/itk.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/libjpeg.png b/Apps/VRRender/doc/source/_static/acknowledgment/libjpeg.png
new file mode 100755
index 0000000..4449d61
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/libjpeg.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/libpng.png b/Apps/VRRender/doc/source/_static/acknowledgment/libpng.png
new file mode 100755
index 0000000..9f197cc
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/libpng.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/libtiff.png b/Apps/VRRender/doc/source/_static/acknowledgment/libtiff.png
new file mode 100755
index 0000000..e0c0451
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/libtiff.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/libxml2.png b/Apps/VRRender/doc/source/_static/acknowledgment/libxml2.png
new file mode 100755
index 0000000..9f2073b
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/libxml2.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/linux-64.png b/Apps/VRRender/doc/source/_static/acknowledgment/linux-64.png
new file mode 100755
index 0000000..1a2bfbc
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/linux-64.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/linux.png b/Apps/VRRender/doc/source/_static/acknowledgment/linux.png
new file mode 100755
index 0000000..49bf66a
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/linux.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/log4cxx.png b/Apps/VRRender/doc/source/_static/acknowledgment/log4cxx.png
new file mode 100755
index 0000000..c4bc479
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/log4cxx.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/ms.png b/Apps/VRRender/doc/source/_static/acknowledgment/ms.png
new file mode 100755
index 0000000..2483141
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/ms.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/opengl.png b/Apps/VRRender/doc/source/_static/acknowledgment/opengl.png
new file mode 100755
index 0000000..a4d2b17
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/opengl.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/python.png b/Apps/VRRender/doc/source/_static/acknowledgment/python.png
new file mode 100755
index 0000000..de80d7d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/python.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/scons.png b/Apps/VRRender/doc/source/_static/acknowledgment/scons.png
new file mode 100755
index 0000000..ef89121
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/scons.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/sphinx.png b/Apps/VRRender/doc/source/_static/acknowledgment/sphinx.png
new file mode 100755
index 0000000..3206d4e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/sphinx.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/vim.png b/Apps/VRRender/doc/source/_static/acknowledgment/vim.png
new file mode 100755
index 0000000..69c1d59
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/vim.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/visualc.png b/Apps/VRRender/doc/source/_static/acknowledgment/visualc.png
new file mode 100755
index 0000000..5513663
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/visualc.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/vtk.png b/Apps/VRRender/doc/source/_static/acknowledgment/vtk.png
new file mode 100755
index 0000000..e559920
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/vtk.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/vtkinria3d.png b/Apps/VRRender/doc/source/_static/acknowledgment/vtkinria3d.png
new file mode 100755
index 0000000..1013778
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/vtkinria3d.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/wix.png b/Apps/VRRender/doc/source/_static/acknowledgment/wix.png
new file mode 100755
index 0000000..55196d9
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/wix.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/wx.png b/Apps/VRRender/doc/source/_static/acknowledgment/wx.png
new file mode 100755
index 0000000..562b129
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/wx.png differ
diff --git a/Apps/VRRender/doc/source/_static/acknowledgment/zlib.png b/Apps/VRRender/doc/source/_static/acknowledgment/zlib.png
new file mode 100755
index 0000000..8576eed
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/acknowledgment/zlib.png differ
diff --git a/Apps/VRRender/doc/source/_static/axial-view.jpg b/Apps/VRRender/doc/source/_static/axial-view.jpg
new file mode 100755
index 0000000..8604c62
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/axial-view.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/basic.css b/Apps/VRRender/doc/source/_static/basic.css
new file mode 100755
index 0000000..ed737d3
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/basic.css
@@ -0,0 +1,414 @@
+/**
+ * Sphinx stylesheet -- basic theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+img {
+    border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 0;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlight {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.refcount {
+    color: #060;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+ at media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}
diff --git a/Apps/VRRender/doc/source/_static/camera-photo.png b/Apps/VRRender/doc/source/_static/camera-photo.png
new file mode 100755
index 0000000..1e8e886
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/camera-photo.png differ
diff --git a/Apps/VRRender/doc/source/_static/danger.png b/Apps/VRRender/doc/source/_static/danger.png
new file mode 100755
index 0000000..5fc8c7c
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/danger.png differ
diff --git a/Apps/VRRender/doc/source/_static/default.css b/Apps/VRRender/doc/source/_static/default.css
new file mode 100755
index 0000000..c13ed68
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/default.css
@@ -0,0 +1,201 @@
+/**
+ * Sphinx stylesheet -- default theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+ at import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+    font-family: sans-serif;
+    font-size: 100%;
+    background-color: #11303d;
+    color: #000;
+    margin: 0;
+    padding: 0;
+}
+
+div.document {
+    background-color: #1c4e63;
+}
+
+div.body {
+    background-color: #ffffff;
+    color: #000000;
+    padding: 0 20px 30px 20px;
+}
+
+div.footer {
+    color: #ffffff;
+    width: 100%;
+    padding: 9px 0 9px 0;
+    text-align: center;
+    font-size: 75%;
+}
+
+div.footer a {
+    color: #ffffff;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #133f52;
+    line-height: 30px;
+    color: #ffffff;
+}
+
+div.related a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.4em;
+    font-weight: normal;
+    margin: 0;
+    padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+    color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+    font-family: 'Trebuchet MS', sans-serif;
+    color: #ffffff;
+    font-size: 1.3em;
+    font-weight: normal;
+    margin: 5px 0 0 0;
+    padding: 0;
+}
+
+div.sphinxsidebar p {
+    color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+    margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+    margin: 10px;
+    padding: 0;
+    color: #ffffff;
+}
+
+div.sphinxsidebar a {
+    color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+/* -- body styles ----------------------------------------------------------- */
+
+a {
+    color: #355f7c;
+    text-decoration: none;
+}
+
+a:hover {
+    text-decoration: underline;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: 'Trebuchet MS', sans-serif;
+    background-color: #f2f2f2;
+    font-weight: normal;
+    color: #20435c;
+    border-bottom: 1px solid #ccc;
+    margin: 20px -20px 10px -20px;
+    padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+
+div.body p, div.body dd, div.body li {
+    text-align: justify;
+    line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+
+div.topic {
+    background-color: #eee;
+}
+
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+
+p.admonition-title {
+    display: inline;
+}
+
+p.admonition-title:after {
+    content: ":";
+}
+
+pre {
+    padding: 5px;
+    background-color: #eeffcc;
+    color: #333333;
+    line-height: 120%;
+    border: 1px solid #ac9;
+    border-left: none;
+    border-right: none;
+}
+
+tt {
+    background-color: #ecf0f3;
+    padding: 0 1px 0 1px;
+    font-size: 0.95em;
+}
\ No newline at end of file
diff --git a/Apps/VRRender/doc/source/_static/distance.png b/Apps/VRRender/doc/source/_static/distance.png
new file mode 100755
index 0000000..7c00070
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/distance.png differ
diff --git a/Apps/VRRender/doc/source/_static/doctools.js b/Apps/VRRender/doc/source/_static/doctools.js
new file mode 100755
index 0000000..9447678
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/doctools.js
@@ -0,0 +1,232 @@
+/// XXX: make it cross browser
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+ */
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
+      "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {}
+}
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+}
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+}
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {
+      var val = node.nodeValue;
+      var pos = val.toLowerCase().indexOf(text);
+      if (pos >= 0 && !jQuery.className.has(node.parentNode, className)) {
+        var span = document.createElement("span");
+        span.className = className;
+        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+          document.createTextNode(val.substr(pos + text.length)),
+          node.nextSibling));
+        node.nodeValue = val.substr(0, pos);
+      }
+    }
+    else if (!jQuery(node).is("button, select, textarea")) {
+      jQuery.each(node.childNodes, function() {
+        highlight(this)
+      });
+    }
+  }
+  return this.each(function() {
+    highlight(this);
+  });
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+  init : function() {
+    this.fixFirefoxAnchorBug();
+    this.highlightSearchWords();
+    this.initModIndex();
+  },
+
+  /**
+   * i18n support
+   */
+  TRANSLATIONS : {},
+  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+  LOCALE : 'unknown',
+
+  // gettext and ngettext don't access this so that the functions
+  // can savely bound to a different name (_ = Documentation.gettext)
+  gettext : function(string) {
+    var translated = Documentation.TRANSLATIONS[string];
+    if (typeof translated == 'undefined')
+      return string;
+    return (typeof translated == 'string') ? translated : translated[0];
+  },
+
+  ngettext : function(singular, plural, n) {
+    var translated = Documentation.TRANSLATIONS[singular];
+    if (typeof translated == 'undefined')
+      return (n == 1) ? singular : plural;
+    return translated[Documentation.PLURALEXPR(n)];
+  },
+
+  addTranslations : function(catalog) {
+    for (var key in catalog.messages)
+      this.TRANSLATIONS[key] = catalog.messages[key];
+    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+    this.LOCALE = catalog.locale;
+  },
+
+  /**
+   * add context elements like header anchor links
+   */
+  addContextElements : function() {
+    $('div[id] > :header:first').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this headline')).
+      appendTo(this);
+    });
+    $('dt[id]').each(function() {
+      $('<a class="headerlink">\u00B6</a>').
+      attr('href', '#' + this.id).
+      attr('title', _('Permalink to this definition')).
+      appendTo(this);
+    });
+  },
+
+  /**
+   * workaround a firefox stupidity
+   */
+  fixFirefoxAnchorBug : function() {
+    if (document.location.hash && $.browser.mozilla)
+      window.setTimeout(function() {
+        document.location.href += '';
+      }, 10);
+  },
+
+  /**
+   * highlight the search words provided in the url in the text
+   */
+  highlightSearchWords : function() {
+    var params = $.getQueryParameters();
+    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+    if (terms.length) {
+      var body = $('div.body');
+      window.setTimeout(function() {
+        $.each(terms, function() {
+          body.highlightText(this.toLowerCase(), 'highlight');
+        });
+      }, 10);
+      $('<li class="highlight-link"><a href="javascript:Documentation.' +
+        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
+          .appendTo($('.sidebar .this-page-menu'));
+    }
+  },
+
+  /**
+   * init the modindex toggle buttons
+   */
+  initModIndex : function() {
+    var togglers = $('img.toggler').click(function() {
+      var src = $(this).attr('src');
+      var idnum = $(this).attr('id').substr(7);
+      console.log($('tr.cg-' + idnum).toggle());
+      if (src.substr(-9) == 'minus.png')
+        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+      else
+        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+    }).css('display', '');
+    if (DOCUMENTATION_OPTIONS.COLLAPSE_MODINDEX) {
+        togglers.click();
+    }
+  },
+
+  /**
+   * helper function to hide the search marks again
+   */
+  hideSearchWords : function() {
+    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
+    $('span.highlight').removeClass('highlight');
+  },
+
+  /**
+   * make the url absolute
+   */
+  makeURL : function(relativeURL) {
+    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+  },
+
+  /**
+   * get the current relative url
+   */
+  getCurrentURL : function() {
+    var path = document.location.pathname;
+    var parts = path.split(/\//);
+    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+      if (this == '..')
+        parts.pop();
+    });
+    var url = parts.join('/');
+    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+  }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+  Documentation.init();
+});
diff --git a/Apps/VRRender/doc/source/_static/ehealth.png b/Apps/VRRender/doc/source/_static/ehealth.png
new file mode 100755
index 0000000..aba2767
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/ehealth.png differ
diff --git a/Apps/VRRender/doc/source/_static/file.png b/Apps/VRRender/doc/source/_static/file.png
new file mode 100755
index 0000000..d18082e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/file.png differ
diff --git a/Apps/VRRender/doc/source/_static/frontal-view.jpg b/Apps/VRRender/doc/source/_static/frontal-view.jpg
new file mode 100755
index 0000000..987e9d3
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/frontal-view.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icon-2D.png b/Apps/VRRender/doc/source/_static/icon-2D.png
new file mode 100755
index 0000000..c802c3f
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-2D.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-3D.png b/Apps/VRRender/doc/source/_static/icon-3D.png
new file mode 100755
index 0000000..950234a
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-3D.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-VR.png b/Apps/VRRender/doc/source/_static/icon-VR.png
new file mode 100755
index 0000000..787163e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-VR.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-axial.png b/Apps/VRRender/doc/source/_static/icon-axial.png
new file mode 100755
index 0000000..ba1b7de
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-axial.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-frontal.png b/Apps/VRRender/doc/source/_static/icon-frontal.png
new file mode 100755
index 0000000..3622453
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-frontal.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-sagittal.png b/Apps/VRRender/doc/source/_static/icon-sagittal.png
new file mode 100755
index 0000000..36e9989
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-sagittal.png differ
diff --git a/Apps/VRRender/doc/source/_static/icon-windows.jpg b/Apps/VRRender/doc/source/_static/icon-windows.jpg
new file mode 100755
index 0000000..50569cb
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icon-windows.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-F9.png b/Apps/VRRender/doc/source/_static/icone-F9.png
new file mode 100755
index 0000000..8cc739a
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-F9.png differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-01.jpg b/Apps/VRRender/doc/source/_static/icone-VR-01.jpg
new file mode 100755
index 0000000..85fdc80
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-01.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-02.jpg b/Apps/VRRender/doc/source/_static/icone-VR-02.jpg
new file mode 100755
index 0000000..56d33d1
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-02.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-03.jpg b/Apps/VRRender/doc/source/_static/icone-VR-03.jpg
new file mode 100755
index 0000000..05c0bf5
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-03.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-04.jpg b/Apps/VRRender/doc/source/_static/icone-VR-04.jpg
new file mode 100755
index 0000000..4b9056e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-04.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-05.jpg b/Apps/VRRender/doc/source/_static/icone-VR-05.jpg
new file mode 100755
index 0000000..7c76565
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-05.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/icone-VR-06.jpg b/Apps/VRRender/doc/source/_static/icone-VR-06.jpg
new file mode 100755
index 0000000..da21b0e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/icone-VR-06.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/info-patient.png b/Apps/VRRender/doc/source/_static/info-patient.png
new file mode 100755
index 0000000..f4c6919
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/info-patient.png differ
diff --git a/Apps/VRRender/doc/source/_static/jquery.js b/Apps/VRRender/doc/source/_static/jquery.js
new file mode 100755
index 0000000..82b98e1
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/jquery.js
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){ [...]
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);retur [...]
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.g [...]
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:fun [...]
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this. [...]
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);} [...]
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByT [...]
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for( [...]
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData: [...]
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.c [...]
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid [...]
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode) [...]
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<lengt [...]
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuer [...]
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DO [...]
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false; [...]
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.compl [...]
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style. [...]
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timer [...]
\ No newline at end of file
diff --git a/Apps/VRRender/doc/source/_static/minus.png b/Apps/VRRender/doc/source/_static/minus.png
new file mode 100755
index 0000000..da1c562
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/minus.png differ
diff --git a/Apps/VRRender/doc/source/_static/openDicom.png b/Apps/VRRender/doc/source/_static/openDicom.png
new file mode 100755
index 0000000..3db1a30
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/openDicom.png differ
diff --git a/Apps/VRRender/doc/source/_static/openDicom_openFxz.png b/Apps/VRRender/doc/source/_static/openDicom_openFxz.png
new file mode 100755
index 0000000..14bef5d
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/openDicom_openFxz.png differ
diff --git a/Apps/VRRender/doc/source/_static/openFxz.png b/Apps/VRRender/doc/source/_static/openFxz.png
new file mode 100755
index 0000000..c63c40e
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/openFxz.png differ
diff --git a/Apps/VRRender/doc/source/_static/operation.png b/Apps/VRRender/doc/source/_static/operation.png
new file mode 100755
index 0000000..14d826c
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/operation.png differ
diff --git a/Apps/VRRender/doc/source/_static/plus.png b/Apps/VRRender/doc/source/_static/plus.png
new file mode 100755
index 0000000..b3cb374
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/plus.png differ
diff --git a/Apps/VRRender/doc/source/_static/pygments.css b/Apps/VRRender/doc/source/_static/pygments.css
new file mode 100755
index 0000000..1f2d2b6
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/pygments.css
@@ -0,0 +1,61 @@
+.hll { background-color: #ffffcc }
+.c { color: #408090; font-style: italic } /* Comment */
+.err { border: 1px solid #FF0000 } /* Error */
+.k { color: #007020; font-weight: bold } /* Keyword */
+.o { color: #666666 } /* Operator */
+.cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.cp { color: #007020 } /* Comment.Preproc */
+.c1 { color: #408090; font-style: italic } /* Comment.Single */
+.cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.gd { color: #A00000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.gi { color: #00A000 } /* Generic.Inserted */
+.go { color: #303030 } /* Generic.Output */
+.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.gs { font-weight: bold } /* Generic.Strong */
+.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.gt { color: #0040D0 } /* Generic.Traceback */
+.kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.kp { color: #007020 } /* Keyword.Pseudo */
+.kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.kt { color: #902000 } /* Keyword.Type */
+.m { color: #208050 } /* Literal.Number */
+.s { color: #4070a0 } /* Literal.String */
+.na { color: #4070a0 } /* Name.Attribute */
+.nb { color: #007020 } /* Name.Builtin */
+.nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.no { color: #60add5 } /* Name.Constant */
+.nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.ne { color: #007020 } /* Name.Exception */
+.nf { color: #06287e } /* Name.Function */
+.nl { color: #002070; font-weight: bold } /* Name.Label */
+.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.nt { color: #062873; font-weight: bold } /* Name.Tag */
+.nv { color: #bb60d5 } /* Name.Variable */
+.ow { color: #007020; font-weight: bold } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #208050 } /* Literal.Number.Float */
+.mh { color: #208050 } /* Literal.Number.Hex */
+.mi { color: #208050 } /* Literal.Number.Integer */
+.mo { color: #208050 } /* Literal.Number.Oct */
+.sb { color: #4070a0 } /* Literal.String.Backtick */
+.sc { color: #4070a0 } /* Literal.String.Char */
+.sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #4070a0 } /* Literal.String.Double */
+.se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.sh { color: #4070a0 } /* Literal.String.Heredoc */
+.si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.sx { color: #c65d09 } /* Literal.String.Other */
+.sr { color: #235388 } /* Literal.String.Regex */
+.s1 { color: #4070a0 } /* Literal.String.Single */
+.ss { color: #517918 } /* Literal.String.Symbol */
+.bp { color: #007020 } /* Name.Builtin.Pseudo */
+.vc { color: #bb60d5 } /* Name.Variable.Class */
+.vg { color: #bb60d5 } /* Name.Variable.Global */
+.vi { color: #bb60d5 } /* Name.Variable.Instance */
+.il { color: #208050 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/Apps/VRRender/doc/source/_static/sagittal-view.jpg b/Apps/VRRender/doc/source/_static/sagittal-view.jpg
new file mode 100755
index 0000000..ed91eea
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/sagittal-view.jpg differ
diff --git a/Apps/VRRender/doc/source/_static/searchtools.js b/Apps/VRRender/doc/source/_static/searchtools.js
new file mode 100755
index 0000000..a243b15
--- /dev/null
+++ b/Apps/VRRender/doc/source/_static/searchtools.js
@@ -0,0 +1,467 @@
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+  var textLower = text.toLowerCase();
+  var start = 0;
+  $.each(keywords, function() {
+    var i = textLower.indexOf(this.toLowerCase());
+    if (i > -1)
+      start = i;
+  });
+  start = Math.max(start - 120, 0);
+  var excerpt = ((start > 0) ? '...' : '') +
+  $.trim(text.substr(start, 240)) +
+  ((start + 240 - text.length) ? '...' : '');
+  var rv = $('<div class="context"></div>').text(excerpt);
+  $.each(hlwords, function() {
+    rv = rv.highlightText(this, 'highlight');
+  });
+  return rv;
+}
+
+/**
+ * Porter Stemmer
+ */
+var PorterStemmer = function() {
+
+  var step2list = {
+    ational: 'ate',
+    tional: 'tion',
+    enci: 'ence',
+    anci: 'ance',
+    izer: 'ize',
+    bli: 'ble',
+    alli: 'al',
+    entli: 'ent',
+    eli: 'e',
+    ousli: 'ous',
+    ization: 'ize',
+    ation: 'ate',
+    ator: 'ate',
+    alism: 'al',
+    iveness: 'ive',
+    fulness: 'ful',
+    ousness: 'ous',
+    aliti: 'al',
+    iviti: 'ive',
+    biliti: 'ble',
+    logi: 'log'
+  };
+
+  var step3list = {
+    icate: 'ic',
+    ative: '',
+    alize: 'al',
+    iciti: 'ic',
+    ical: 'ic',
+    ful: '',
+    ness: ''
+  };
+
+  var c = "[^aeiou]";          // consonant
+  var v = "[aeiouy]";          // vowel
+  var C = c + "[^aeiouy]*";    // consonant sequence
+  var V = v + "[aeiou]*";      // vowel sequence
+
+  var mgr0 = "^(" + C + ")?" + V + C;                      // [C]VC... is m>0
+  var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$";    // [C]VC[V] is m=1
+  var mgr1 = "^(" + C + ")?" + V + C + V + C;              // [C]VCVC... is m>1
+  var s_v   = "^(" + C + ")?" + v;                         // vowel in stem
+
+  this.stemWord = function (w) {
+    var stem;
+    var suffix;
+    var firstch;
+    var origword = w;
+
+    if (w.length < 3)
+      return w;
+
+    var re;
+    var re2;
+    var re3;
+    var re4;
+
+    firstch = w.substr(0,1);
+    if (firstch == "y")
+      w = firstch.toUpperCase() + w.substr(1);
+
+    // Step 1a
+    re = /^(.+?)(ss|i)es$/;
+    re2 = /^(.+?)([^s])s$/;
+
+    if (re.test(w))
+      w = w.replace(re,"$1$2");
+    else if (re2.test(w))
+      w = w.replace(re2,"$1$2");
+
+    // Step 1b
+    re = /^(.+?)eed$/;
+    re2 = /^(.+?)(ed|ing)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      re = new RegExp(mgr0);
+      if (re.test(fp[1])) {
+        re = /.$/;
+        w = w.replace(re,"");
+      }
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1];
+      re2 = new RegExp(s_v);
+      if (re2.test(stem)) {
+        w = stem;
+        re2 = /(at|bl|iz)$/;
+        re3 = new RegExp("([^aeiouylsz])\\1$");
+        re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+        if (re2.test(w))
+          w = w + "e";
+        else if (re3.test(w)) {
+          re = /.$/;
+          w = w.replace(re,"");
+        }
+        else if (re4.test(w))
+          w = w + "e";
+      }
+    }
+
+    // Step 1c
+    re = /^(.+?)y$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(s_v);
+      if (re.test(stem))
+        w = stem + "i";
+    }
+
+    // Step 2
+    re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step2list[suffix];
+    }
+
+    // Step 3
+    re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      suffix = fp[2];
+      re = new RegExp(mgr0);
+      if (re.test(stem))
+        w = stem + step3list[suffix];
+    }
+
+    // Step 4
+    re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+    re2 = /^(.+?)(s|t)(ion)$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      if (re.test(stem))
+        w = stem;
+    }
+    else if (re2.test(w)) {
+      var fp = re2.exec(w);
+      stem = fp[1] + fp[2];
+      re2 = new RegExp(mgr1);
+      if (re2.test(stem))
+        w = stem;
+    }
+
+    // Step 5
+    re = /^(.+?)e$/;
+    if (re.test(w)) {
+      var fp = re.exec(w);
+      stem = fp[1];
+      re = new RegExp(mgr1);
+      re2 = new RegExp(meq1);
+      re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+      if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+        w = stem;
+    }
+    re = /ll$/;
+    re2 = new RegExp(mgr1);
+    if (re.test(w) && re2.test(w)) {
+      re = /.$/;
+      w = w.replace(re,"");
+    }
+
+    // and turn initial Y back to y
+    if (firstch == "y")
+      w = firstch.toLowerCase() + w.substr(1);
+    return w;
+  }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+  _index : null,
+  _queued_query : null,
+  _pulse_status : -1,
+
+  init : function() {
+      var params = $.getQueryParameters();
+      if (params.q) {
+          var query = params.q[0];
+          $('input[name="q"]')[0].value = query;
+          this.performSearch(query);
+      }
+  },
+
+  /**
+   * Sets the index
+   */
+  setIndex : function(index) {
+    var q;
+    this._index = index;
+    if ((q = this._queued_query) !== null) {
+      this._queued_query = null;
+      Search.query(q);
+    }
+  },
+
+  hasIndex : function() {
+      return this._index !== null;
+  },
+
+  deferQuery : function(query) {
+      this._queued_query = query;
+  },
+
+  stopPulse : function() {
+      this._pulse_status = 0;
+  },
+
+  startPulse : function() {
+    if (this._pulse_status >= 0)
+        return;
+    function pulse() {
+      Search._pulse_status = (Search._pulse_status + 1) % 4;
+      var dotString = '';
+      for (var i = 0; i < Search._pulse_status; i++)
+        dotString += '.';
+      Search.dots.text(dotString);
+      if (Search._pulse_status > -1)
+        window.setTimeout(pulse, 500);
+    };
+    pulse();
+  },
+
+  /**
+   * perform a search for something
+   */
+  performSearch : function(query) {
+    // create the required interface elements
+    this.out = $('#search-results');
+    this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+    this.dots = $('<span></span>').appendTo(this.title);
+    this.status = $('<p style="display: none"></p>').appendTo(this.out);
+    this.output = $('<ul class="search"/>').appendTo(this.out);
+
+    $('#search-progress').text(_('Preparing search...'));
+    this.startPulse();
+
+    // index already loaded, the browser was quick!
+    if (this.hasIndex())
+      this.query(query);
+    else
+      this.deferQuery(query);
+  },
+
+  query : function(query) {
+    // stem the searchterms and add them to the
+    // correct list
+    var stemmer = new PorterStemmer();
+    var searchterms = [];
+    var excluded = [];
+    var hlterms = [];
+    var tmp = query.split(/\s+/);
+    var object = (tmp.length == 1) ? tmp[0].toLowerCase() : null;
+    for (var i = 0; i < tmp.length; i++) {
+      // stem the word
+      var word = stemmer.stemWord(tmp[i]).toLowerCase();
+      // select the correct list
+      if (word[0] == '-') {
+        var toAppend = excluded;
+        word = word.substr(1);
+      }
+      else {
+        var toAppend = searchterms;
+        hlterms.push(tmp[i].toLowerCase());
+      }
+      // only add if not already in the list
+      if (!$.contains(toAppend, word))
+        toAppend.push(word);
+    };
+    var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+    console.debug('SEARCH: searching for:');
+    console.info('required: ', searchterms);
+    console.info('excluded: ', excluded);
+
+    // prepare search
+    var filenames = this._index.filenames;
+    var titles = this._index.titles;
+    var terms = this._index.terms;
+    var descrefs = this._index.descrefs;
+    var modules = this._index.modules;
+    var desctypes = this._index.desctypes;
+    var fileMap = {};
+    var files = null;
+    var objectResults = [];
+    var regularResults = [];
+    $('#search-progress').empty();
+
+    // lookup as object
+    if (object != null) {
+      for (var module in modules) {
+        if (module.indexOf(object) > -1) {
+          fn = modules[module];
+          descr = _('module, in ') + titles[fn];
+          objectResults.push([filenames[fn], module, '#module-'+module, descr]);
+        }
+      }
+      for (var prefix in descrefs) {
+        for (var name in descrefs[prefix]) {
+          if (name.toLowerCase().indexOf(object) > -1) {
+            match = descrefs[prefix][name];
+            fullname = (prefix ? prefix + '.' : '') + name;
+            descr = desctypes[match[1]] + _(', in ') + titles[match[0]];
+            objectResults.push([filenames[match[0]], fullname, '#'+fullname, descr]);
+          }
+        }
+      }
+    }
+
+    // sort results descending
+    objectResults.sort(function(a, b) {
+      return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+    });
+
+
+    // perform the search on the required terms
+    for (var i = 0; i < searchterms.length; i++) {
+      var word = searchterms[i];
+      // no match but word was a required one
+      if ((files = terms[word]) == null)
+        break;
+      if (files.length == undefined) {
+        files = [files];
+      }
+      // create the mapping
+      for (var j = 0; j < files.length; j++) {
+        var file = files[j];
+        if (file in fileMap)
+          fileMap[file].push(word);
+        else
+          fileMap[file] = [word];
+      }
+    }
+
+    // now check if the files don't contain excluded terms
+    for (var file in fileMap) {
+      var valid = true;
+
+      // check if all requirements are matched
+      if (fileMap[file].length != searchterms.length)
+        continue;
+
+      // ensure that none of the excluded terms is in the
+      // search result.
+      for (var i = 0; i < excluded.length; i++) {
+        if (terms[excluded[i]] == file ||
+            $.contains(terms[excluded[i]] || [], file)) {
+          valid = false;
+          break;
+        }
+      }
+
+      // if we have still a valid result we can add it
+      // to the result list
+      if (valid)
+        regularResults.push([filenames[file], titles[file], '', null]);
+    }
+
+    // delete unused variables in order to not waste
+    // memory until list is retrieved completely
+    delete filenames, titles, terms;
+
+    // now sort the regular results descending by title
+    regularResults.sort(function(a, b) {
+      var left = a[1].toLowerCase();
+      var right = b[1].toLowerCase();
+      return (left > right) ? -1 : ((left < right) ? 1 : 0);
+    });
+
+    // combine both
+    var results = regularResults.concat(objectResults);
+
+    // print the results
+    var resultCount = results.length;
+    function displayNextItem() {
+      // results left, load the summary and display it
+      if (results.length) {
+        var item = results.pop();
+        var listItem = $('<li style="display:none"></li>');
+        listItem.append($('<a/>').attr(
+          'href',
+          item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+          highlightstring + item[2]).html(item[1]));
+        if (item[3]) {
+          listItem.append($('<span> (' + item[3] + ')</span>'));
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+          $.get('_sources/' + item[0] + '.txt', function(data) {
+            listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+            Search.output.append(listItem);
+            listItem.slideDown(5, function() {
+              displayNextItem();
+            });
+          });
+        } else {
+          // no source available, just display title
+          Search.output.append(listItem);
+          listItem.slideDown(5, function() {
+            displayNextItem();
+          });
+        }
+      }
+      // search finished, update title and status message
+      else {
+        Search.stopPulse();
+        Search.title.text(_('Search Results'));
+        if (!resultCount)
+          Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+        else
+            Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+        Search.status.fadeIn(500);
+      }
+    }
+    displayNextItem();
+  }
+}
+
+$(document).ready(function() {
+  Search.init();
+});
diff --git a/Apps/VRRender/doc/source/_static/sliceHide.png b/Apps/VRRender/doc/source/_static/sliceHide.png
new file mode 100755
index 0000000..14a1f34
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/sliceHide.png differ
diff --git a/Apps/VRRender/doc/source/_static/sliceShow.png b/Apps/VRRender/doc/source/_static/sliceShow.png
new file mode 100755
index 0000000..84c4fe9
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/sliceShow.png differ
diff --git a/Apps/VRRender/doc/source/_static/video.png b/Apps/VRRender/doc/source/_static/video.png
new file mode 100755
index 0000000..ff4bca2
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/video.png differ
diff --git a/Apps/VRRender/doc/source/_static/view_frontal.png b/Apps/VRRender/doc/source/_static/view_frontal.png
new file mode 100755
index 0000000..f1bc533
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/view_frontal.png differ
diff --git a/Apps/VRRender/doc/source/_static/view_profil.png b/Apps/VRRender/doc/source/_static/view_profil.png
new file mode 100755
index 0000000..40fd8a4
Binary files /dev/null and b/Apps/VRRender/doc/source/_static/view_profil.png differ
diff --git a/Apps/VRRender/doc/source/conf.py b/Apps/VRRender/doc/source/conf.py
new file mode 100644
index 0000000..f160cc5
--- /dev/null
+++ b/Apps/VRRender/doc/source/conf.py
@@ -0,0 +1,208 @@
+# ***** BEGIN LICENSE BLOCK *****
+# FW4SPL - Copyright (C) IRCAD, 2009-2012.
+# Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+# published by the Free Software Foundation.
+# ****** END LICENSE BLOCK ******
+
+# -*- coding: utf-8 -*-
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+projectname = u'VR-Planning'
+project = projectname.replace('-','').replace(' ','')
+copyright = u'2010, IRCAD'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.8'
+# The full version, including alpha/beta/rc tags.
+release = '0.8'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+language = 'en'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+today_fmt = '%Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+html_theme = 'default'
+#html_theme = 'sphinxdoc'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+html_logo = "_static/VR_html.png"
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+#html_last_updated_fmt = '%Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If false, no index is generated.
+html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+html_show_sphinx = False
+html_show_sourcelink = False
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'VR-Render Websurg Limited Edition'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+
+latex_elements = {
+        'papersize' : 'a4',
+        'pointsize' : '12pt',
+        }
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', project+'.tex', projectname+u' Documentation',
+   u'IRCAD', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+latex_logo = "_static/"+project+".png"
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+latex_use_parts = False
+#latex_use_parts = True
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
+latex_use_modindex = False
+
diff --git a/Apps/VRRender/doc/source/index.rst b/Apps/VRRender/doc/source/index.rst
new file mode 100755
index 0000000..95bcc24
--- /dev/null
+++ b/Apps/VRRender/doc/source/index.rst
@@ -0,0 +1,37 @@
+.. VRPlanningDoc documentation master file, created by
+   Luc SOLER on Fri Mar 12 12:00:00 2010.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to VR-Planning 0.2
+==========================
+
+Contents:
+
+
+.. toctree::
+   :maxdepth: 2
+   
+   Introduction
+   Windows_Installation
+   Start_VR_Planning
+   Tool_bar
+   Read_and_Select_Data
+   Export_Data
+   3D_Models_Manipulation
+   3D_Models_Properties
+   3D_Medical_Image_Visu
+   3D_Distances
+   3D_Resection
+   2D_MPR
+   2D_Landmarks
+   Basic_Image_Filtering
+   What_is_Volume_Rendering
+   3D_Volume_Rendering
+   Transfert_function
+   Help_menu
+   Shortcuts
+   Acknowledgment
+   Minimal_config
+   Licence
+
diff --git a/Apps/VRRender/rc/about/about.html b/Apps/VRRender/rc/about/about.html
new file mode 100644
index 0000000..8c6bfe7
--- /dev/null
+++ b/Apps/VRRender/rc/about/about.html
@@ -0,0 +1,25 @@
+<html>
+<head>
+<title>About</title>
+</head>
+
+<body>
+
+
+<p align="center">
+<img src="vrrender_128.png">
+<br><b>VR-Render</b> 
+<br><b>Version :</b> 0.9.6 
+<br><b>Contact Us :</b> <a href="mailto:fw4spl at gmail.com">fw4spl at gmail.com</a>
+<br><b>Web Home :</b> <a href="http://code.google.com/p/fw4spl" target="_blank">fw4spl project</a>
+<br><b>Team :</b> <a href="http://code.google.com/p/fw4spl/wiki/ContributorsAndLibraries" target="_blank">see contributors</a>
+</p>
+
+<hr>
+<p align="center">
+This program comes with absolutely no WARRANTY. Please read the LICENSE file for more information.
+</p>
+<hr>
+
+</body>
+</html>
diff --git a/Apps/VRRender/rc/about/ircad_150.png b/Apps/VRRender/rc/about/ircad_150.png
new file mode 100644
index 0000000..1acad5c
Binary files /dev/null and b/Apps/VRRender/rc/about/ircad_150.png differ
diff --git a/Apps/VRRender/rc/about/vrrender_128.png b/Apps/VRRender/rc/about/vrrender_128.png
new file mode 100644
index 0000000..2567511
Binary files /dev/null and b/Apps/VRRender/rc/about/vrrender_128.png differ
diff --git a/Apps/VRRender/rc/configurations/MenuAndViewConfig.xml b/Apps/VRRender/rc/configurations/MenuAndViewConfig.xml
new file mode 100644
index 0000000..2b2f58d
--- /dev/null
+++ b/Apps/VRRender/rc/configurations/MenuAndViewConfig.xml
@@ -0,0 +1,43 @@
+<serviceList>
+
+    <service uid="${GENERIC_UID}_mainview" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="yes">
+        <gui>
+            <layout type="::fwGui::CardinalLayoutManager">
+                <view caption="Information" align="center" minWidth="200" />
+                <view caption="Preview" align="bottom" minHeight="200" />
+            </layout>
+            <toolBar />
+        </gui>
+        <registry>
+            <parent wid="${WID_PARENT}" />
+            <toolBar sid="toolBar" start="yes" />
+            <view sid="${GENERIC_UID}_selector" start="yes" />
+            <view wid="${GENERIC_UID}_preview" />
+        </registry>
+    </service>
+
+    <service uid="toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+        <gui>
+            <layout>
+                <menuItem name="Import" icon="Bundles/media_0-1/icons/Import.svg" />
+                <menuItem name="Export" icon="Bundles/media_0-1/icons/Export.svg" />
+                <menuItem name="Launch activity" icon="Bundles/media_0-1/icons/Launch_activity.svg" />
+                <separator />
+                <menuItem name="2D visualization" icon="Bundles/media_0-1/icons/icon-2D.png" />
+                <menuItem name="3D visualization" icon="Bundles/media_0-1/icons/icon-3D.png" />
+                <menuItem name="Volume rendering" icon="Bundles/media_0-1/icons/icon-VR.png" />
+            </layout>
+        </gui>
+        <registry>
+            <menuItem sid="${GENERIC_UID}_action_import" start="yes" />
+            <menuItem sid="${GENERIC_UID}_action_exportSeries" start="yes" />
+            <menuItem sid="${GENERIC_UID}_action_newActivity" start="yes" />
+
+            <menuItem sid="${GENERIC_UID}_action_2DVisualization" start="yes" />
+            <menuItem sid="${GENERIC_UID}_action_3DVisualization" start="yes" />
+            <menuItem sid="${GENERIC_UID}_action_volumeRendering" start="yes" />
+        </registry>
+    </service>
+
+</serviceList>
+
diff --git a/Apps/VRRender/rc/configurations/VRRenderBase.xml b/Apps/VRRender/rc/configurations/VRRenderBase.xml
new file mode 100644
index 0000000..7549097
--- /dev/null
+++ b/Apps/VRRender/rc/configurations/VRRenderBase.xml
@@ -0,0 +1,166 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>VRRenderBase</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="appName" />
+        <param name="appIconPath" />
+    </parameters>
+    <config>
+        <object uid="seriesDB" type="::fwMedData::SeriesDB">
+
+            <service uid="action_open" type="::fwGui::IActionSrv" impl="::uiIO::action::SSeriesDBMerger" autoConnect="no">
+                <IOSelectorSrvConfig name="SDBOpenIOSelectorConfig" />
+            </service>
+            <service uid="action_save" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+                <start uid="SDBWriter" />
+            </service>
+            <service uid="SDBWriter" type="::gui::editor::IDialogEditor" impl="::uiIO::editor::IOSelectorService" autoConnect="no">
+                <type mode="writer" />
+                <selection mode="include" />
+                <addSelection service="::ioAtoms::SWriter" />
+                <config id="MDAtomsConfig" service="::ioAtoms::SWriter" />
+            </service>
+
+
+            <service uid="mainFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <gui>
+                    <frame>
+                        <name>${appName}</name>
+                        <icon>${appIconPath}</icon>
+                        <minSize width="800" height="600" />
+                    </frame>
+                    <menuBar />
+                </gui>
+                <registry>
+                    <menuBar sid="menuBar" start="yes" />
+                    <view sid="dynamicView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menu name="File" />
+                        <menu name="Monitor" />
+                        <menu name="Help" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menu sid="menu_file" start="yes" />
+                    <menu sid="menu_monitor" start="yes" />
+                    <menu sid="menu_help" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menu_file" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Open" shortcut="Ctrl+O" />
+                        <menuItem name="Save" shortcut="Ctrl+S" />
+                        <menuItem name="Quit" specialAction="QUIT" shortcut="Ctrl+Q" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="action_open" start="yes" />
+                    <menuItem sid="action_save" start="yes" />
+                    <menuItem sid="action_quit" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="menu_monitor" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+                <gui>
+                    <layout>
+                        <menuItem name="ClassFactoryRegistry information"/>
+                        <menuItem name="Framework related object metrics"/>
+                        <separator />
+                        <menuItem name="Show contributions tree"/>
+                        <separator />
+                        <menuItem name="Memory"/>
+                        <menuItem name="Change dump status" style="check" />
+                        <menuItem name="Dump all" />
+                        <menuItem name="Increase memory consumption"/>
+                        <menuItem name="Decrease memory consumption"/>
+                    </layout>
+                </gui>
+                    <registry>
+                       <menuItem sid="action_ClassFactoryRegistryInfo" start="yes" />
+                       <menuItem sid="action_fwMetrics" start="yes" />
+                       <menuItem sid="action_ComponentsTree" start="yes" />
+                       <menuItem sid="action_MemInfo" start="yes" />
+                       <menuItem sid="action_ChangeDumpStatus" start="yes" />
+                       <menuItem sid="dumpAll" start="yes" />
+                       <menuItem sid="action_incMemConsum" start="yes" />
+                       <menuItem sid="action_decMemConsum" start="yes" />
+                 </registry>
+            </service>
+
+            <service uid="menu_help" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="About" specialAction="ABOUT" />
+                        <menuItem name="Acknowledgments" />
+                        <separator />
+                        <menuItem name="VR-Render Website" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="action_about" start="yes" />
+                    <menuItem sid="action_acknowledgments" start="yes" />
+                    <menuItem sid="action_openBrowser" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="action_quit" type="::fwGui::IActionSrv" impl="::gui::action::QuitAction" autoConnect="no" />
+
+            <service uid="action_about" type="::fwGui::IActionSrv" impl="::uiGeneric::action::SShowAbout" autoConnect="no">
+                <filename id="Bundles/VRRender_0-9/about/about.html" />
+            </service>
+
+            <service uid="action_acknowledgments" type="::fwGui::IActionSrv" impl="::uiGeneric::action::ShowAcknowledgments" autoConnect="no">
+                <filename id="Bundles/VRRender_0-9/documentations/ack.html" />
+            </service>
+
+            <service uid="action_openBrowser" type="::fwGui::IActionSrv" impl="::uiGeneric::action::LaunchBrowserActionService" autoConnect="no">
+                <url>http://www.ircad.fr/softwares/vr-render/Software.php</url>
+            </service>
+
+            <service uid="dynamicView" type="::gui::view::IView" impl="::guiQt::editor::DynamicView" autoConnect="yes">
+                <config>
+                    <appConfig id="SDBVRRender" title="SDB" closable="false">
+                        <parameters>
+                            <parameter replace="SERIESDB" by="seriesDB" />
+                            <parameter replace="ICON_PATH" by="${appIconPath}" />
+                            <parameter replace="DYNAMICVIEW_CHANNEL" by="dynamicView" />
+                        </parameters>
+                    </appConfig>
+                </config>
+            </service>
+
+
+            <service uid="action_fwMetrics" type="::fwGui::IActionSrv" impl="::monitor::action::fwMetrics" autoConnect="no" />
+            <service uid="action_MemInfo" type="::fwGui::IActionSrv" impl="::monitor::action::MemoryInfo" autoConnect="no" />
+            <service uid="action_incMemConsum" type="::fwGui::IActionSrv" impl="::monitor::action::MemoryConsumption" autoConnect="no">
+                <config mode="increase" value="256" />
+            </service>
+            <service uid="action_decMemConsum" type="::fwGui::IActionSrv" impl="::monitor::action::MemoryConsumption" autoConnect="no">
+                <config mode="decrease" />
+            </service>
+
+            <service uid="action_ClassFactoryRegistryInfo" type="::fwGui::IActionSrv" impl="::monitor::action::ClassFactoryRegistryInfo" autoConnect="no" />
+            <service uid="action_ComponentsTree" type="::fwGui::IActionSrv" impl="::monitor::action::ComponentsTree" autoConnect="no" />
+            <service uid="action_ChangeDumpStatus" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="no">
+                <config>
+                    <appConfig id="DumpFrameConfig" />
+                </config>
+            </service>
+            <service uid="dumpAll" impl="::monitor::action::SDumpAll" type="::fwGui::IActionSrv" autoConnect="no" />
+
+            <proxy channel="dynamicView">
+                <slot>dynamicView/receive</slot>
+            </proxy>
+
+            <start uid="mainFrame" />
+        </object>
+
+    </config>
+</extension>
diff --git a/Apps/VRRender/rc/configurations/sdb.xml b/Apps/VRRender/rc/configurations/sdb.xml
new file mode 100644
index 0000000..ba7f1c3
--- /dev/null
+++ b/Apps/VRRender/rc/configurations/sdb.xml
@@ -0,0 +1,127 @@
+
+<extension implements="::fwServices::registry::AppConfig">
+    <id>SDBVRRender</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" />
+        <param name="SERIESDB" />
+        <param name="WID_PARENT" />
+        <param name="DYNAMICVIEW_CHANNEL" default="channel" />
+        <param name="ICON_PATH" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <xi:include href="MenuAndViewConfig.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+            <item key="seriesDB">
+                <object uid="${SERIESDB}" type="::fwMedData::SeriesDB" src="ref" >
+                    <service uid="${GENERIC_UID}_action_import" type="::fwGui::IActionSrv" impl="::uiIO::action::SSeriesDBMerger" autoConnect="no">
+                        <IOSelectorSrvConfig name="IOSelectorServiceConfigVRRenderSeriesDBReader" />
+                    </service>
+                    <service uid="${GENERIC_UID}_selector" impl="::uiMedData::editor::SSelector" autoConnect="yes">
+                        <selectionId>${GENERIC_UID}_selections</selectionId>
+                    </service>
+                </object>
+            </item>
+
+            <item key="selections">
+                <object uid="${GENERIC_UID}_selections" type="::fwData::Vector">
+                    <service uid="${GENERIC_UID}_seriesViewer" type="::fwServices::IController" impl="::uiMedData::SSeriesViewer" autoConnect="yes">
+                        <parentView>${GENERIC_UID}_preview</parentView>
+                        <configs>
+                            <config id="2DSimpleConfig" type="::fwMedData::ImageSeries">
+                                <extract path="@image" pattern="imageID" />
+                            </config>
+                            <config id="3DSimpleConfig" type="::fwMedData::ModelSeries" />
+                        </configs>
+                    </service>
+                    <service uid="${GENERIC_UID}_action_newActivity" type="::fwGui::IActionSrv" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+                        <config>
+                            <parameters>
+                                <parameter replace="SERIESDB" by="seriesDB"  />
+                                <parameter replace="ICON_PATH" by="${ICON_PATH}" />
+                            </parameters>
+                            <filter>
+                                <mode>exclude</mode>
+                                <id>ImageSeriesExport</id>
+                                <id>ModelSeriesExport</id>
+                            </filter>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_2DVisualization" type="::fwGui::IActionSrv" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+                        <config>
+                            <parameters>
+                                <parameter replace="SERIESDB" by="seriesDB"  />
+                                <parameter replace="ICON_PATH" by="${ICON_PATH}" />
+                            </parameters>
+                            <filter>
+                                <mode>include</mode>
+                                <id>2DVisualization</id>
+                            </filter>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_3DVisualization" type="::fwGui::IActionSrv" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+                        <config>
+                            <parameters>
+                                <parameter replace="SERIESDB" by="seriesDB"  />
+                                <parameter replace="ICON_PATH" by="${ICON_PATH}" />
+                            </parameters>
+                            <filter>
+                                <mode>include</mode>
+                                <id>3DVisualization</id>
+                            </filter>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_volumeRendering" type="::fwGui::IActionSrv" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+                        <config>
+                            <parameters>
+                                <parameter replace="SERIESDB" by="seriesDB"  />
+                                <parameter replace="ICON_PATH" by="${ICON_PATH}" />
+                            </parameters>
+                            <filter>
+                                <mode>include</mode>
+                                <id>VolumeRendering</id>
+                            </filter>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_exportSeries" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+                        <config>
+                            <mode>immediate</mode>
+                            <parameters>
+                            </parameters>
+                            <filter>
+                                <mode>include</mode>
+                                <id>ImageSeriesExport</id>
+                                <id>ModelSeriesExport</id>
+                            </filter>
+                        </config>
+                    </service>
+
+                </object>
+            </item>
+
+            <connect>
+                <signal>${GENERIC_UID}_selector/seriesDoubleClicked</signal>
+                <slot>${GENERIC_UID}_action_newActivity/launchSeries</slot>
+            </connect>
+
+            <proxy channel="${DYNAMICVIEW_CHANNEL}">
+                <signal>${GENERIC_UID}_action_newActivity/activityLaunched</signal>
+                <signal>${GENERIC_UID}_action_2DVisualization/activityLaunched</signal>
+                <signal>${GENERIC_UID}_action_3DVisualization/activityLaunched</signal>
+                <signal>${GENERIC_UID}_action_volumeRendering/activityLaunched</signal>
+            </proxy>
+
+            <start uid="${GENERIC_UID}_mainview" />
+            <start uid="${GENERIC_UID}_seriesViewer" />
+        </object>
+
+    </config>
+</extension>
+
diff --git a/Apps/VRRender/rc/documentations/ack.html b/Apps/VRRender/rc/documentations/ack.html
new file mode 100644
index 0000000..c94cc18
--- /dev/null
+++ b/Apps/VRRender/rc/documentations/ack.html
@@ -0,0 +1,72 @@
+<html>
+<head>
+    <title>Acknoledgments</title>
+</head>
+
+<body>
+
+<p align="center">
+    <img src="vrrender_128.png" />
+</p>
+
+<p align="center">
+
+Built on these projects :
+<br/>
+<img src="boost.png">
+<img src="cfitsio.png">
+<img src="dcmtk.png">
+<br/>
+<img src="fits2itk.png">
+<img src="itk.png">
+<img src="libjpeg.png">
+<br/>
+<img src="libpng.png">
+<img src="libtiff.png">
+<img src="libxml2.png">
+<br/>
+<img src="log4cxx.png">
+<img src="opengl.png">
+<img src="python.png">
+<br/>
+<img src="vtk.png">
+<img src="qt.png">
+<br/>
+<img src="zlib.png">
+<img src="bzip2.png">
+<img src="gdcm.png">
+<br/>
+
+<br/>
+Developed with these software :
+<br/>
+<img src="doxygen.png" />
+<img src="eclipse.png" />
+<img src="fsf.png" />
+<img src="gcc.png" />
+<br/>
+<img src="scons.png" />
+<img src="visualc.png" />
+<img src="wix.png" />
+<img src="sphinx.png" />
+<br/>
+
+<br/>
+Operating system supported  (32 and 64 bits):
+<br/>
+<img src="ms.png" />
+<img src="apple.png" />
+<img src="linux.png" />
+<br/>
+</p>
+
+<p align="center" >
+
+<br/><i>fw4spl Team and special thanks to</i>
+<br/><img src="ircad_150.png" />
+<br/><a href="http://code.google.com/p/fw4spl" target="_blank" >Web Home : fw4spl and VR-Render</a> 
+
+</p>
+
+</body>
+</html>
diff --git a/Apps/VRRender/rc/documentations/ack.png b/Apps/VRRender/rc/documentations/ack.png
new file mode 100644
index 0000000..8d0e671
Binary files /dev/null and b/Apps/VRRender/rc/documentations/ack.png differ
diff --git a/Apps/VRRender/rc/documentations/apple.png b/Apps/VRRender/rc/documentations/apple.png
new file mode 100644
index 0000000..8df8abd
Binary files /dev/null and b/Apps/VRRender/rc/documentations/apple.png differ
diff --git a/Apps/VRRender/rc/documentations/boost.png b/Apps/VRRender/rc/documentations/boost.png
new file mode 100644
index 0000000..194bc78
Binary files /dev/null and b/Apps/VRRender/rc/documentations/boost.png differ
diff --git a/Apps/VRRender/rc/documentations/bzip2.png b/Apps/VRRender/rc/documentations/bzip2.png
new file mode 100644
index 0000000..159fff7
Binary files /dev/null and b/Apps/VRRender/rc/documentations/bzip2.png differ
diff --git a/Apps/VRRender/rc/documentations/cfitsio.png b/Apps/VRRender/rc/documentations/cfitsio.png
new file mode 100644
index 0000000..f09e204
Binary files /dev/null and b/Apps/VRRender/rc/documentations/cfitsio.png differ
diff --git a/Apps/VRRender/rc/documentations/dcmtk.png b/Apps/VRRender/rc/documentations/dcmtk.png
new file mode 100644
index 0000000..d2411bb
Binary files /dev/null and b/Apps/VRRender/rc/documentations/dcmtk.png differ
diff --git a/Apps/VRRender/rc/documentations/doxygen.png b/Apps/VRRender/rc/documentations/doxygen.png
new file mode 100644
index 0000000..4a97c9d
Binary files /dev/null and b/Apps/VRRender/rc/documentations/doxygen.png differ
diff --git a/Apps/VRRender/rc/documentations/eclipse.png b/Apps/VRRender/rc/documentations/eclipse.png
new file mode 100644
index 0000000..4e13f44
Binary files /dev/null and b/Apps/VRRender/rc/documentations/eclipse.png differ
diff --git a/Apps/VRRender/rc/documentations/fits2itk.png b/Apps/VRRender/rc/documentations/fits2itk.png
new file mode 100644
index 0000000..beea18d
Binary files /dev/null and b/Apps/VRRender/rc/documentations/fits2itk.png differ
diff --git a/Apps/VRRender/rc/documentations/fsf.png b/Apps/VRRender/rc/documentations/fsf.png
new file mode 100644
index 0000000..515fb60
Binary files /dev/null and b/Apps/VRRender/rc/documentations/fsf.png differ
diff --git a/Apps/VRRender/rc/documentations/gcc.png b/Apps/VRRender/rc/documentations/gcc.png
new file mode 100644
index 0000000..0e373d3
Binary files /dev/null and b/Apps/VRRender/rc/documentations/gcc.png differ
diff --git a/Apps/VRRender/rc/documentations/gdcm.png b/Apps/VRRender/rc/documentations/gdcm.png
new file mode 100644
index 0000000..8246ebe
Binary files /dev/null and b/Apps/VRRender/rc/documentations/gdcm.png differ
diff --git a/Apps/VRRender/rc/documentations/ircad.gif b/Apps/VRRender/rc/documentations/ircad.gif
new file mode 100644
index 0000000..9e18c95
Binary files /dev/null and b/Apps/VRRender/rc/documentations/ircad.gif differ
diff --git a/Apps/VRRender/rc/documentations/ircad.png b/Apps/VRRender/rc/documentations/ircad.png
new file mode 100644
index 0000000..9294a7b
Binary files /dev/null and b/Apps/VRRender/rc/documentations/ircad.png differ
diff --git a/Apps/VRRender/rc/documentations/ircad_150.png b/Apps/VRRender/rc/documentations/ircad_150.png
new file mode 100644
index 0000000..1acad5c
Binary files /dev/null and b/Apps/VRRender/rc/documentations/ircad_150.png differ
diff --git a/Apps/VRRender/rc/documentations/itk.png b/Apps/VRRender/rc/documentations/itk.png
new file mode 100644
index 0000000..4011b07
Binary files /dev/null and b/Apps/VRRender/rc/documentations/itk.png differ
diff --git a/Apps/VRRender/rc/documentations/libjpeg.png b/Apps/VRRender/rc/documentations/libjpeg.png
new file mode 100644
index 0000000..39a9c82
Binary files /dev/null and b/Apps/VRRender/rc/documentations/libjpeg.png differ
diff --git a/Apps/VRRender/rc/documentations/libpng.png b/Apps/VRRender/rc/documentations/libpng.png
new file mode 100644
index 0000000..facb5a1
Binary files /dev/null and b/Apps/VRRender/rc/documentations/libpng.png differ
diff --git a/Apps/VRRender/rc/documentations/libtiff.png b/Apps/VRRender/rc/documentations/libtiff.png
new file mode 100644
index 0000000..16c953b
Binary files /dev/null and b/Apps/VRRender/rc/documentations/libtiff.png differ
diff --git a/Apps/VRRender/rc/documentations/libxml2.png b/Apps/VRRender/rc/documentations/libxml2.png
new file mode 100644
index 0000000..3291ab2
Binary files /dev/null and b/Apps/VRRender/rc/documentations/libxml2.png differ
diff --git a/Apps/VRRender/rc/documentations/linux-64.png b/Apps/VRRender/rc/documentations/linux-64.png
new file mode 100644
index 0000000..267569e
Binary files /dev/null and b/Apps/VRRender/rc/documentations/linux-64.png differ
diff --git a/Apps/VRRender/rc/documentations/linux.png b/Apps/VRRender/rc/documentations/linux.png
new file mode 100644
index 0000000..2df0145
Binary files /dev/null and b/Apps/VRRender/rc/documentations/linux.png differ
diff --git a/Apps/VRRender/rc/documentations/log4cxx.png b/Apps/VRRender/rc/documentations/log4cxx.png
new file mode 100644
index 0000000..dd2baaa
Binary files /dev/null and b/Apps/VRRender/rc/documentations/log4cxx.png differ
diff --git a/Apps/VRRender/rc/documentations/ms.png b/Apps/VRRender/rc/documentations/ms.png
new file mode 100644
index 0000000..ed5483c
Binary files /dev/null and b/Apps/VRRender/rc/documentations/ms.png differ
diff --git a/Apps/VRRender/rc/documentations/opengl.png b/Apps/VRRender/rc/documentations/opengl.png
new file mode 100644
index 0000000..87bdfc3
Binary files /dev/null and b/Apps/VRRender/rc/documentations/opengl.png differ
diff --git a/Apps/VRRender/rc/documentations/python.png b/Apps/VRRender/rc/documentations/python.png
new file mode 100644
index 0000000..beb0c99
Binary files /dev/null and b/Apps/VRRender/rc/documentations/python.png differ
diff --git a/Apps/VRRender/rc/documentations/qt.png b/Apps/VRRender/rc/documentations/qt.png
new file mode 100644
index 0000000..14ddf2a
Binary files /dev/null and b/Apps/VRRender/rc/documentations/qt.png differ
diff --git a/Apps/VRRender/rc/documentations/scons.png b/Apps/VRRender/rc/documentations/scons.png
new file mode 100644
index 0000000..4c6f16c
Binary files /dev/null and b/Apps/VRRender/rc/documentations/scons.png differ
diff --git a/Apps/VRRender/rc/documentations/sphinx.png b/Apps/VRRender/rc/documentations/sphinx.png
new file mode 100644
index 0000000..3040c00
Binary files /dev/null and b/Apps/VRRender/rc/documentations/sphinx.png differ
diff --git a/Apps/VRRender/rc/documentations/visualc.png b/Apps/VRRender/rc/documentations/visualc.png
new file mode 100644
index 0000000..4c47ddd
Binary files /dev/null and b/Apps/VRRender/rc/documentations/visualc.png differ
diff --git a/Apps/VRRender/rc/documentations/vrrender.ico b/Apps/VRRender/rc/documentations/vrrender.ico
new file mode 100644
index 0000000..d0c8883
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vrrender.ico differ
diff --git a/Apps/VRRender/rc/documentations/vrrender.png b/Apps/VRRender/rc/documentations/vrrender.png
new file mode 100644
index 0000000..71c446f
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vrrender.png differ
diff --git a/Apps/VRRender/rc/documentations/vrrender2.png b/Apps/VRRender/rc/documentations/vrrender2.png
new file mode 100644
index 0000000..0e0b4f2
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vrrender2.png differ
diff --git a/Apps/VRRender/rc/documentations/vrrender_128.png b/Apps/VRRender/rc/documentations/vrrender_128.png
new file mode 100644
index 0000000..2567511
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vrrender_128.png differ
diff --git a/Apps/VRRender/rc/documentations/vrrender_96.png b/Apps/VRRender/rc/documentations/vrrender_96.png
new file mode 100644
index 0000000..57867d9
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vrrender_96.png differ
diff --git a/Apps/VRRender/rc/documentations/vtk.png b/Apps/VRRender/rc/documentations/vtk.png
new file mode 100644
index 0000000..2824da0
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vtk.png differ
diff --git a/Apps/VRRender/rc/documentations/vtkinria3d.png b/Apps/VRRender/rc/documentations/vtkinria3d.png
new file mode 100644
index 0000000..21e87d4
Binary files /dev/null and b/Apps/VRRender/rc/documentations/vtkinria3d.png differ
diff --git a/Apps/VRRender/rc/documentations/wix.png b/Apps/VRRender/rc/documentations/wix.png
new file mode 100644
index 0000000..8eb22b9
Binary files /dev/null and b/Apps/VRRender/rc/documentations/wix.png differ
diff --git a/Apps/VRRender/rc/documentations/wx.png b/Apps/VRRender/rc/documentations/wx.png
new file mode 100644
index 0000000..0d00ae1
Binary files /dev/null and b/Apps/VRRender/rc/documentations/wx.png differ
diff --git a/Apps/VRRender/rc/documentations/zlib.png b/Apps/VRRender/rc/documentations/zlib.png
new file mode 100644
index 0000000..0c000df
Binary files /dev/null and b/Apps/VRRender/rc/documentations/zlib.png differ
diff --git a/Apps/VRRender/rc/plugin.xml b/Apps/VRRender/rc/plugin.xml
new file mode 100644
index 0000000..6bbdb7d
--- /dev/null
+++ b/Apps/VRRender/rc/plugin.xml
@@ -0,0 +1,102 @@
+<plugin id="VRRender">
+
+    <requirement id="servicesReg" />
+
+    <xi:include href="configurations/VRRenderBase.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/sdb.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwServices::registry::AppConfigParameters">
+        <id>VRRenderAppBase</id>
+        <parameters>
+            <param name="appName" value="VRRender 0.9.6" />
+            <param name="appIconPath" value="Bundles/VRRender_0-9/vrrender.ico" />
+        </parameters>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceConfig">
+        <id>IOSelectorServiceConfigVRRenderSeriesDBReader</id>
+        <service>::uiIO::editor::IOSelectorService</service>
+        <desc>IOSelectorService config for VRRender SeriesDB reader</desc>
+        <config>
+            <type mode="reader" />
+            <selection mode="exclude" />
+            <addSelection service="::ioAtoms::SReader" />
+        </config>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceConfig">
+        <id>SDBOpenIOSelectorConfig</id>
+        <service>::uiIO::editor::IOSelectorService</service>
+        <desc>"Open" action's IOSelector config</desc>
+        <config>
+            <type mode="reader" />
+            <selection mode="include" />
+            <addSelection service="::ioAtoms::SReader" />
+            <config id="MDAtomsConfig" service="::ioAtoms::SReader" />
+        </config>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceConfig">
+        <id>MDAtomsConfig</id>
+        <desc>reader/writer config to read/write an atom representing a medical data</desc>
+        <config>
+            <patcher context="MedicalData" version="V2" />
+            <filter>VRRenderMedicalDataV2</filter>
+         </config>
+     </extension>
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>ExportSelection</id>
+        <type>parameters</type>
+        <parameters>
+            <param name="GENERIC_UID" />
+            <param name="selection" />
+        </parameters>
+        <config>
+            <!-- <object uid="${selection}" type="::fwData::Vector" src="ref"> -->
+            <object uid="${selection}" src="ref">
+                <service uid="${GENERIC_UID}_export_selection" impl="::uiIO::editor::IOSelectorService" autoConnect="yes">
+                    <type mode="writer" />
+                    <!-- <selection mode="include" /> -->
+                    <!-- <addSelection service="::ioAtoms::SReader" /> -->
+                </service>
+                <start uid="${GENERIC_UID}_export_selection" />
+                <update uid="${GENERIC_UID}_export_selection" />
+            </object>
+        </config>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>ImageSeriesExport</id>
+        <title>ImageSeries Export</title>
+        <desc>ImageSeries Export</desc>
+        <icon>NONE</icon>
+        <requirements>
+            <requirement name="series" type="::fwMedData::ImageSeries" minOccurs="1" maxOccurs="1" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="ExportSelection">
+            <parameters>
+                <parameter replace="selection" by="@values.series" />
+            </parameters>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>ModelSeriesExport</id>
+        <title>ModelSeries Export</title>
+        <desc>ModelSeries Export</desc>
+        <icon>NONE</icon>
+        <requirements>
+            <requirement name="series" type="::fwMedData::ModelSeries" minOccurs="1" maxOccurs="1" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="ExportSelection">
+            <parameters>
+                <parameter replace="selection" by="@values.series" />
+            </parameters>
+        </appConfig>
+    </extension>
+
+
+</plugin>
diff --git a/Apps/VRRender/rc/profile.xml b/Apps/VRRender/rc/profile.xml
new file mode 100644
index 0000000..1886a3e
--- /dev/null
+++ b/Apps/VRRender/rc/profile.xml
@@ -0,0 +1,67 @@
+<profile name="VRRender" version="0.9.0">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioAtoms" version="0-1" />
+    <activate id="patchMedicalData" version="0-1" />
+    
+    <activate id="ioITK" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    <activate id="ioVtkGdcm" version="0-1" />
+    <activate id="uiIO" version="0-1" />
+    <activate id="uiGenericQt" version="0-1" />
+    <activate id="uiMedDataQt" version="0-1" />
+    <activate id="uiImageQt" version="0-1" />
+    <activate id="uiReconstructionQt" version="0-1" />
+    <activate id="uiMeasurement" version="0-1" />
+    <activate id="uiMeasurementQt" version="0-1" />
+    <activate id="uiVisu" version="0-1" />
+    <activate id="uiVisuQt" version="0-1" />
+    <activate id="uiTF" version="0-1" />
+
+    <activate id="ctrlMemory" version="0-1" />
+    <activate id="monitor" version="0-1" />
+    <activate id="memory" version="0-1" />
+    <activate id="monitorQt" version="0-1" />
+
+
+    <activate id="scene2D" version="0-1" />
+
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="visuVTKAdaptor" version="0-1" />
+    <activate id="visuVTKVRAdaptor" version="0-1" />
+
+    <activate id="activities" version="0-1" />
+    <activate id="ctrlSelection" version="0-1" />
+
+    <activate id="VRRender" />
+    <activate id="appXml" version="0-1" >
+        <param id="config" value="VRRenderBase" />
+        <param id="parameters" value="VRRenderAppBase" />
+    </activate>
+
+    <activate id="2DVisualizationActivity" version="0-1" />
+    <activate id="3DVisualizationActivity" version="0-1" />
+    <activate id="blendActivity"           version="0-1" />
+    <activate id="volumeRenderingActivity" version="0-1" />
+    
+    <activate id="filterVRRender" version="0-1" />
+
+    <start id="filterVRRender" />
+    <start id="memory" />
+    <start id="patchMedicalData"/>
+    <start id="scene2D" />
+    <start id="visuVTK" />
+    <start id="visuVTKQt" />
+    <start id="guiQt" />
+    <start id="activities" />
+    <start id="appXml" />
+
+</profile>
diff --git a/Apps/VRRender/rc/vrrender.ico b/Apps/VRRender/rc/vrrender.ico
new file mode 100644
index 0000000..d0c8883
Binary files /dev/null and b/Apps/VRRender/rc/vrrender.ico differ
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/CMakeLists.txt b/Bundles/LeafActivity/2DVisualizationActivity/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/Properties.cmake b/Bundles/LeafActivity/2DVisualizationActivity/Properties.cmake
new file mode 100644
index 0000000..17544f4
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME 2DVisualizationActivity )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS gui guiQt uiMeasurement uiMeasurementQt ctrlSelection uiImageQt uiVisu uiVisuQt visuVTKAdaptor media )
+
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/bin/build.options b/Bundles/LeafActivity/2DVisualizationActivity/bin/build.options
new file mode 100755
index 0000000..3d6284f
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/bin/build.options
@@ -0,0 +1,14 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [
+    'gui_0-1'            ,
+    'guiQt_0-1'          ,
+    'uiMeasurement_0-1'  ,
+    'uiMeasurementQt_0-1',
+    'ctrlSelection_0-1'  ,
+    'uiImageQt_0-1'      ,
+    'uiVisu_0-1'         ,
+    'uiVisuQt_0-1'       ,
+    'visuVTKAdaptor_0-1' ,
+    'media_0-1'          ,
+]
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegato.xml b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegato.xml
new file mode 100644
index 0000000..b347032
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegato.xml
@@ -0,0 +1,124 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>2DNegato</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="imageUid" />
+        <param name="orientation" default="axial" /> <!-- axial, frontal, sagittal -->
+        <param name="patient_name" default="" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="1" />
+                        <view proportion="0" minHeight="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <view sid="${GENERIC_UID}_negato" start="yes" />
+                    <view sid="${GENERIC_UID}_multiView_negato_bottom" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_multiView_negato_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="0" minWidth="30" />
+                        <view proportion="1" />
+                        <view proportion="0" minWidth="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_snapshotNegatoEditor" start="yes" />
+                    <view sid="${GENERIC_UID}_slider_negato" start="yes" />
+                    <view sid="${GENERIC_UID}_distanceNegatoEditor" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_snapshotNegatoEditor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                <snap>
+                    <scene uid="${GENERIC_UID}_negato" />
+                </snap>
+            </service>
+
+            <!-- GENERIC SCENE DEFINITION -->
+            <item key="visuConfig">
+                <object uid="${GENERIC_UID}_VisuComposite" type="::fwData::Composite">
+
+                    <!-- Generic Scene Negato -->
+                    <service uid="${GENERIC_UID}_negato" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+
+                            <picker id="negatodefault" vtkclass="fwVtkCellPicker" />
+
+                            <renderer id="default" background="0.0" />
+
+                            <adaptor id="renderNegato" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="snapshot" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="interactor" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                                <config renderer="default" style="InteractorStyle2DForNegato" />
+                            </adaptor>
+
+                            <adaptor id="MPRNegato" class="::visuVTKAdaptor::NegatoMPR" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" mode="2d" slices="1" sliceIndex="${orientation}" />
+                            </adaptor>
+
+                            <adaptor id="text" class="::visuVTKAdaptor::ImageText" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" text="" />
+                            </adaptor>
+
+                            <adaptor id="multiDistances" class="::visuVTKAdaptor::ImageMultiDistances" objectId="imageKey">
+                                <config filter="true" renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="landmarksNegato" class="::visuVTKAdaptor::ImageLandmarks" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="imageKey">
+                                <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                            </adaptor>
+                        </scene>
+                    </service>
+
+                    <item key="imageKey">
+                        <object uid="${imageUid}" src="ref" type="::fwData::Image">
+
+                            <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                            <service uid="${GENERIC_UID}_slider_negato" impl="::uiImage::SliceIndexPositionEditor" type="::gui::editor::IEditor" autoConnect="yes">
+                                <sliceIndex>${orientation}</sliceIndex>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_distanceNegatoEditor" type="::gui::editor::IEditor" impl="::uiMeasurement::editor::Distance" autoConnect="no">
+                                <placeInScene uid="${GENERIC_UID}_negato" />
+                            </service>
+
+                        </object>
+                    </item>
+
+                </object>
+            </item>
+
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_LockImageSrv" />
+            <start uid="${GENERIC_UID}_mainView" />
+
+        </object>
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegatoWithTF.xml b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegatoWithTF.xml
new file mode 100644
index 0000000..51b898c
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DNegatoWithTF.xml
@@ -0,0 +1,126 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>2DNegatoWithTF</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="imageUid" />
+        <param name="selectedTFKey" />
+        <param name="TFSelectionsUid" />
+        <param name="patient_name" default="" />
+        <param name="orientation" default="axial" /> <!-- axial, frontal, sagittal -->
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="1" />
+                        <view proportion="0" minHeight="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <view sid="${GENERIC_UID}_negato" start="yes" />
+                    <view sid="${GENERIC_UID}_multiView_negato_bottom" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_multiView_negato_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="0" minWidth="30" />
+                        <view proportion="1" />
+                        <view proportion="0" minWidth="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_snapshotNegatoEditor" start="yes" />
+                    <view sid="${GENERIC_UID}_slider_negato" start="yes" />
+                    <view sid="${GENERIC_UID}_distanceNegatoEditor" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_snapshotNegatoEditor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                <snap>
+                    <scene uid="${GENERIC_UID}_negato" />
+                </snap>
+            </service>
+
+            <!-- GENERIC SCENE DEFINITION -->
+            <item key="visuConfig">
+                <object uid="${GENERIC_UID}_VisuComposite" type="::fwData::Composite">
+
+                    <!-- Generic Scene Negato -->
+                    <service uid="${GENERIC_UID}_negato" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+
+                            <picker id="negatodefault" vtkclass="fwVtkCellPicker" />
+
+                            <renderer id="default" background="0.0" />
+
+                            <adaptor id="renderNegato" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="snapshot" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="interactor" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                                <config renderer="default" style="InteractorStyle2DForNegato" />
+                            </adaptor>
+
+                            <adaptor id="MPRNegato" class="::visuVTKAdaptor::NegatoMPR" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" mode="2d" slices="1" sliceIndex="${orientation}" selectedTFKey="${selectedTFKey}" tfSelectionFwID="${TFSelectionsUid}"/>
+                            </adaptor>
+
+                            <adaptor id="text" class="::visuVTKAdaptor::ImageText" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" text="" selectedTFKey="${selectedTFKey}" tfSelectionFwID="${TFSelectionsUid}"/>
+                            </adaptor>
+
+                            <adaptor id="multiDistances" class="::visuVTKAdaptor::ImageMultiDistances" objectId="imageKey">
+                                <config filter="true" renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="landmarksNegato" class="::visuVTKAdaptor::ImageLandmarks" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="imageKey">
+                                <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                            </adaptor>
+
+                        </scene>
+                    </service>
+
+                    <item key="imageKey">
+                        <object uid="${imageUid}" src="ref" type="::fwData::Image">
+
+                            <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                            <service uid="${GENERIC_UID}_slider_negato" impl="::uiImage::SliceIndexPositionEditor" type="::gui::editor::IEditor" autoConnect="yes">
+                                <sliceIndex>${orientation}</sliceIndex>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_distanceNegatoEditor" type="::gui::editor::IEditor" impl="::uiMeasurement::editor::Distance" autoConnect="no">
+                                <placeInScene uid="${GENERIC_UID}_negato" />
+                            </service>
+
+                        </object>
+                    </item>
+
+                </object>
+            </item>
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_LockImageSrv" />
+            <start uid="${GENERIC_UID}_mainView" />
+
+        </object>
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DVisualization.xml b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DVisualization.xml
new file mode 100644
index 0000000..bac596a
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/rc/configurations/2DVisualization.xml
@@ -0,0 +1,158 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>2DVisualization</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="SERIESDB" />
+        <param name="AS_UID" />
+        <param name="imageUid" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Negato1" align="center" />
+                        <view caption="Negato2" align="right" minWidth="350" />
+                        <view caption="Negato3" align="right" minWidth="350" />
+                    </layout>
+                    <toolBar />
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <toolBar sid="${GENERIC_UID}_toolBar" start="yes" />
+                    <view wid="${GENERIC_UID}_view_negato1" />
+                    <view wid="${GENERIC_UID}_view_negato2" />
+                    <view wid="${GENERIC_UID}_view_negato3" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="New landmark" icon="Bundles/media_0-1/icons/Add-landmark.png" />
+                        <menuItem name="Remove landmark" icon="Bundles/media_0-1/icons/Remove-landmark.png" />
+                        <menuItem name="Load landmark" icon="Bundles/media_0-1/icons/Load-landmark.png" />
+                        <menuItem name="Save landmark" icon="Bundles/media_0-1/icons/Save-landmark.png" />
+                        <menuItem name="Focus landmark" icon="Bundles/media_0-1/icons/Find-landmark.png" />
+                        <menuItem name="Hide/Show landmark" icon="Bundles/media_0-1/icons/View-landmark.png" />
+                        <separator />
+                        <menuItem name="Add distance" icon="Bundles/media_0-1/icons/distance.png" />
+                        <menuItem name="Remove distance" icon="Bundles/media_0-1/icons/RemoveDistance.png" />
+                        <menuItem name="Hide distance" icon="Bundles/media_0-1/icons/HideDistance.png" style="check" />
+                        <separator />
+                        <menuItem name="Hide cross" icon="Bundles/media_0-1/icons/HideCross.png" style="radio" />
+                        <menuItem name="Show normal cross" icon="Bundles/media_0-1/icons/NormalCross.png" style="radio" />
+                        <menuItem name="Show full cross" icon="Bundles/media_0-1/icons/FullCross.png" style="radio" />
+                        <separator />
+                        <menuItem name="Export Activity" icon="Bundles/media_0-1/icons/Export.svg"  />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_ActionNewLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionRemoveLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionLoadLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionSaveLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionFocusLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideLandmark" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionAddDistance" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionRemoveDistance" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideDistance" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideCross" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowNormalCross" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowFullCross" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionExportActivity" start="yes" />
+                </registry>
+            </service>
+
+            <item key="seriesDB">
+                <object uid="${SERIESDB}" src="ref" type="::fwMedData::SeriesDB">
+                    <service uid="${GENERIC_UID}_ActionExportActivity" type="::fwGui::IActionSrv" impl="::uiMedData::action::SExportSeries" autoConnect="yes">
+                        <seriesId>${AS_UID}</seriesId>
+                    </service>
+                </object>
+            </item>
+            
+            <item key="activitySeries">
+                <object uid="${AS_UID}" src="ref" type="::fwMedData::ActivitySeries" />
+            </item>
+
+            <item key="imageKey">
+                <object uid="${imageUid}" src="ref" type="::fwData::Image">
+                    <service uid="${GENERIC_UID}_MedicalImageSrv" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="no" />
+
+                    <service uid="${GENERIC_UID}_cfgNegato1" impl="::fwServices::SConfigController" autoConnect="no">
+                        <config>
+                            <appConfig id="2DNegato" >
+                                <parameters>
+                                    <parameter replace="imageUid" by="self"  />
+                                    <parameter replace="orientation" by="axial"  />
+                                    <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato1"  />
+                                </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_cfgNegato2" impl="::fwServices::SConfigController" autoConnect="no">
+                        <config>
+                            <appConfig id="2DNegato" >
+                                <parameters>
+                                    <parameter replace="imageUid" by="self"  />
+                                    <parameter replace="orientation" by="frontal"  />
+                                    <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato2"  />
+                                </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_cfgNegato3" impl="::fwServices::SConfigController" autoConnect="no">
+                        <config>
+                            <appConfig id="2DNegato" >
+                                <parameters>
+                                    <parameter replace="imageUid" by="self"  />
+                                    <parameter replace="orientation" by="sagittal"  />
+                                    <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato3"  />
+                                </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+
+
+                    <service uid="${GENERIC_UID}_ActionFocusLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::FocusLandmark" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionNewLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::AddLandmark" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionRemoveLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::RemoveLandmark" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionLoadLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::LoadLandmark" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionSaveLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::SaveLandmark" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionHideLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::ShowLandmark" autoConnect="yes" />
+                    <service uid="${GENERIC_UID}_ActionAddDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::AddDistance" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionRemoveDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::RemoveDistance" autoConnect="no" />
+                    <service uid="${GENERIC_UID}_ActionHideDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::ShowDistance" autoConnect="yes" />
+                    <service uid="${GENERIC_UID}_ActionHideCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                        <crossType>hide</crossType>
+                    </service>
+                    <service uid="${GENERIC_UID}_ActionShowNormalCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                        <crossType>half</crossType>
+                        <state active="true" />
+                    </service>
+                    <service uid="${GENERIC_UID}_ActionShowFullCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                        <crossType>full</crossType>
+                    </service>
+                </object>
+            </item>
+
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_MedicalImageSrv" />
+
+            <start uid="${GENERIC_UID}_cfgNegato1" />
+            <start uid="${GENERIC_UID}_cfgNegato2" />
+            <start uid="${GENERIC_UID}_cfgNegato3" />
+
+        </object>
+
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/2DVisualizationActivity/rc/plugin.xml b/Bundles/LeafActivity/2DVisualizationActivity/rc/plugin.xml
new file mode 100644
index 0000000..cfaa708
--- /dev/null
+++ b/Bundles/LeafActivity/2DVisualizationActivity/rc/plugin.xml
@@ -0,0 +1,34 @@
+<plugin id="2DVisualizationActivity">
+
+    <requirement id="servicesReg" />
+    <requirement id="gui" />
+    <requirement id="guiQt" />
+    <requirement id="uiMeasurement" />
+    <requirement id="uiMeasurementQt" />
+    <requirement id="ctrlSelection" />
+    <requirement id="uiImageQt" />
+    <requirement id="uiVisu" />
+    <requirement id="uiVisuQt" />
+    <requirement id="visuVTKAdaptor" />
+    <requirement id="media" />
+
+    <xi:include href="configurations/2DVisualization.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/2DNegato.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/2DNegatoWithTF.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>2DVisualization</id>
+        <title>2D Visu</title>
+        <desc>2D visualization activity</desc>
+        <icon>Bundles/media_0-1/icons/icon-2D.png</icon>
+        <requirements>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="1" maxOccurs="1" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="2DVisualization">
+            <parameters>
+                <parameter replace="imageUid" by="@values.imageSeries.image" />
+            </parameters>
+        </appConfig>
+    </extension>
+</plugin>
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/CMakeLists.txt b/Bundles/LeafActivity/3DVisualizationActivity/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/Properties.cmake b/Bundles/LeafActivity/3DVisualizationActivity/Properties.cmake
new file mode 100644
index 0000000..de1ca76
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME 3DVisualizationActivity )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS gui guiQt ctrlSelection uiVisu uiVisuQt visuVTKAdaptor uiImageQt uiMeasurement uiMeasurementQt uiReconstructionQt media )
+
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/bin/build.options b/Bundles/LeafActivity/3DVisualizationActivity/bin/build.options
new file mode 100755
index 0000000..f838ee2
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/bin/build.options
@@ -0,0 +1,16 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [
+    'gui_0-1'                ,
+    'guiQt_0-1'              ,
+    'ctrlSelection_0-1'      ,
+    'uiVisu_0-1'             ,
+    'uiVisuQt_0-1'           ,
+    'visuVTKAdaptor_0-1'     ,
+    'uiImageQt_0-1'          ,
+    'uiMeasurement_0-1'      ,
+    'uiMeasurementQt_0-1'    ,
+    'uiReconstructionQt_0-1' ,
+    'media_0-1'              ,
+]
+
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DNegatoWithAcq.xml b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DNegatoWithAcq.xml
new file mode 100644
index 0000000..1843851
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DNegatoWithAcq.xml
@@ -0,0 +1,162 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>3DNegatoWithAcq</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="InputImageCompositeUID" />
+        <param name="modelSeriesUid" />
+        <param name="patient_name"  default="" />
+        <param name="orientation" default="axial" /> <!-- axial, frontal, sagittal -->
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="1" />
+                        <view proportion="0" minHeight="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <view sid="${GENERIC_UID}_negato" start="yes" />
+                    <view sid="${GENERIC_UID}_multiView_negato_bottom" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_multiView_negato_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="0" minWidth="30" />
+                        <view proportion="0" minWidth="30" />
+                        <view proportion="1" />
+                        <view proportion="0" minWidth="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_sliceListNegatoEditor" start="no" />
+                    <view sid="${GENERIC_UID}_snapshotNegatoEditor" start="yes" />
+                    <view sid="${GENERIC_UID}_slider_negato" start="no" />
+                    <view sid="${GENERIC_UID}_distanceNegatoEditor" start="no" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_snapshotNegatoEditor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                <snap>
+                    <scene uid="${GENERIC_UID}_negato" />
+                </snap>
+            </service>
+
+            <!-- GENERIC SCENE DEFINITION -->
+            <item key="visuConfig">
+                <object uid="${GENERIC_UID}_VisuComposite" type="::fwData::Composite">
+
+                    <service uid="${GENERIC_UID}_VisuCompositeUpdater" impl="::ctrlSelection::updater::TranslateUpdater" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                        <translate fromUID="${InputImageCompositeUID}" fromKey="OptionalInputImageKey" toKey="imageKey" />
+                    </service>
+
+                    <!-- Generic Scene Negato -->
+                    <service uid="${GENERIC_UID}_negato" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+
+                            <picker id="negatodefault" vtkclass="fwVtkCellPicker" />
+
+                            <renderer id="default" background="0.0" />
+
+                            <adaptor id="renderNegato" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="snapshot" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="interactor" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                                <config renderer="default" style="InteractorStyle3DForNegato" />
+                            </adaptor>
+
+                            <adaptor id="medicalCamera" class="::visuVTKAdaptor::Medical3DCamera" objectId="imageKey">
+                                <config renderer="default" sliceIndex="${orientation}" />
+                            </adaptor>
+
+                            <adaptor uid="${GENERIC_UID}_MPRNegato" id="MPRNegato" class="::visuVTKAdaptor::NegatoMPR" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" slices="3" sliceIndex="${orientation}" />
+                            </adaptor>
+
+                            <adaptor id="modelSeries" class="::visuVTKAdaptor::ModelSeries" objectId="modelSeriesKey">
+                                <config renderer="default" picker="negatodefault" autoresetcamera="no" />
+                            </adaptor>
+
+                            <adaptor id="text" class="::visuVTKAdaptor::ImageText" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" text="" />
+                            </adaptor>
+
+                            <adaptor id="multiDistances" class="::visuVTKAdaptor::ImageMultiDistances" objectId="imageKey">
+                                <config filter="true" renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="landmarksNegato" class="::visuVTKAdaptor::ImageLandmarks" objectId="imageKey">
+                                <config renderer="default" picker="negatodefault" />
+                            </adaptor>
+
+                            <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="modelSeriesKey">
+                                <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                            </adaptor>
+
+
+                        </scene>
+                    </service>
+
+                    <item key="OptionalInputImageCompositeKey">
+                        <object uid="${InputImageCompositeUID}" src="ref" type="::fwData::Composite">
+
+                            <service uid="${GENERIC_UID}_EditorManager" impl="::ctrlSelection::manager::SwapperSrv" autoConnect="yes">
+                                <mode type="stop" />
+                                <config>
+                                    <object id="OptionalInputImageKey" type="::fwData::Image">
+
+                                        <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                                        <service uid="${GENERIC_UID}_slider_negato" impl="::uiImage::SliceIndexPositionEditor" type="::gui::editor::IEditor" autoConnect="yes">
+                                            <sliceIndex>${orientation}</sliceIndex>
+                                        </service>
+
+                                        <service uid="${GENERIC_UID}_distanceNegatoEditor" type="::gui::editor::IEditor" impl="::uiMeasurement::editor::Distance" autoConnect="no">
+                                            <placeInScene uid="${GENERIC_UID}_negato" />
+                                        </service>
+
+                                        <service uid="${GENERIC_UID}_sliceListNegatoEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor2" autoConnect="yes">
+                                            <negatoAdaptor uid="${GENERIC_UID}_MPRNegato" slices="3" />
+                                        </service>
+
+
+
+                                    </object>
+                                </config>
+                            </service>
+
+                        </object>
+                    </item>
+
+                    <item key="modelSeriesKey">
+                        <object uid="${modelSeriesUid}" src="ref" type="::fwMedData::ModelSeries">
+                        </object>
+                    </item>
+
+                </object>
+            </item>
+
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_EditorManager" />
+            <start uid="${GENERIC_UID}_VisuCompositeUpdater" />
+
+        </object>
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DVisualization.xml b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DVisualization.xml
new file mode 100644
index 0000000..b987645
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/3DVisualization.xml
@@ -0,0 +1,264 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>3DVisualization</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="ICON_PATH" />
+        <param name="SERIESDB" />
+        <param name="AS_UID" />
+        <param name="modelSeriesUid" />
+        <param name="InputImageCompositeUID" />
+        <param name="patient_name"  default="" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Negato1" align="center" />
+                        <view caption="Negato2" align="right" minWidth="350" visible="no" />
+                        <view caption="Negato3" align="right" minWidth="350" visible="no" />
+                    </layout>
+                    <toolBar />
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <toolBar sid="${GENERIC_UID}_toolBar" start="yes" />
+                    <view wid="${GENERIC_UID}_view_negato1" />
+                    <view wid="${GENERIC_UID}_view_negato2" />
+                    <view wid="${GENERIC_UID}_view_negato3" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="3D MPR Axial view" icon="Bundles/media_0-1/icons/icon-axial.png" />
+                        <menuItem name="3D MPR Frontal view" icon="Bundles/media_0-1/icons/icon-frontal.png" />
+                        <menuItem name="3D MPR Sagittal view" icon="Bundles/media_0-1/icons/icon-sagittal.png" />
+                        <separator />
+                        <menuItem name="New landmark" icon="Bundles/media_0-1/icons/Add-landmark.png" />
+                        <menuItem name="Remove landmark" icon="Bundles/media_0-1/icons/Remove-landmark.png" />
+                        <menuItem name="Load landmark" icon="Bundles/media_0-1/icons/Load-landmark.png" />
+                        <menuItem name="Save landmark" icon="Bundles/media_0-1/icons/Save-landmark.png" />
+                        <menuItem name="Focus landmark" icon="Bundles/media_0-1/icons/Find-landmark.png" />
+                        <menuItem name="Hide/Show landmark" icon="Bundles/media_0-1/icons/View-landmark.png" />
+                        <separator />
+                        <menuItem name="Add distance" icon="Bundles/media_0-1/icons/distance.png" />
+                        <menuItem name="Remove distance" icon="Bundles/media_0-1/icons/RemoveDistance.png" />
+                        <menuItem name="Hide distance" icon="Bundles/media_0-1/icons/HideDistance.png" style="check" />
+                        <separator />
+                        <menuItem name="Hide cross" icon="Bundles/media_0-1/icons/HideCross.png" style="radio" />
+                        <menuItem name="Show normal cross" icon="Bundles/media_0-1/icons/NormalCross.png" style="radio" />
+                        <menuItem name="Show full cross" icon="Bundles/media_0-1/icons/FullCross.png" style="radio" />
+                        <separator />
+                        <menuItem name="Manage organs color" icon="Bundles/media_0-1/icons/ManageOrgan.png" style="check" />
+                        <separator />
+                        <menuItem name="Export Activity" icon="Bundles/media_0-1/icons/Export.svg" />
+                        <spacer />
+                        <menu name="Visu 3D" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_action_AxialViewMPR3D" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_FrontalViewMPR3D" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_SagittalViewMPR3D" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionNewLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionRemoveLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionLoadLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionSaveLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionFocusLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideLandmark" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionAddDistance" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionRemoveDistance" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideDistance" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionHideCross" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowNormalCross" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowFullCross" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_organManager" start="no" />
+                    <menuItem sid="${GENERIC_UID}_ActionExportActivity" start="yes" />
+                    <menu sid="${GENERIC_UID}_menu" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="${GENERIC_UID}_menu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Manage organs colors" style="check" shortcut="F9" icon="Bundles/media_0-1/icons/ManageOrgan.png" />
+                        <separator />
+                        <menuItem name="Axial view" icon="Bundles/media_0-1/icons/icon-axial.png" />
+                        <menuItem name="Frontal view" icon="Bundles/media_0-1/icons/icon-frontal.png" />
+                        <menuItem name="Sagittal view" icon="Bundles/media_0-1/icons/icon-sagittal.png" />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_action_organManager" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_action_AxialViewMPR3D" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_FrontalViewMPR3D" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_SagittalViewMPR3D" start="no" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_action_organManager" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="no">
+                <config>
+                    <appConfig id="OrganManagerWithSeries">
+                        <parameters>
+                            <parameter replace="ORGAN_MANAGER_MODELSERIES" by="${modelSeriesUid}" />
+                            <parameter replace="ICON_PATH" by="${ICON_PATH}" />
+                        </parameters>
+                    </appConfig>
+                </config>
+            </service>
+
+            <service uid="${GENERIC_UID}_cfgNegato1" impl="::fwServices::SConfigController" autoConnect="no">
+                <config>
+                    <appConfig id="3DNegatoWithAcq">
+                        <parameters>
+                            <parameter replace="InputImageCompositeUID" by="@values.OptionalInputImageCompositeKey" />
+                            <parameter replace="modelSeriesUid" by="@values.modelSeriesKey" />
+                            <parameter replace="orientation" by="axial" />
+                            <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato1" />
+                            <parameter replace="patient_name" by="${patient_name}" />
+                        </parameters>
+                    </appConfig>
+                </config>
+            </service>
+
+
+
+            <item key="OptionalInputImageCompositeKey">
+                <object uid="${InputImageCompositeUID}" src="ref" type="::fwData::Composite">
+
+                    <service uid="${GENERIC_UID}_2DViewManager" impl="::ctrlSelection::manager::SwapperSrv" autoConnect="yes">
+                        <mode type="stop" />
+                        <config>
+                            <object id="OptionalInputImageKey" type="::fwData::Image">
+
+                                <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                                <service uid="${GENERIC_UID}_cfgNegato2" type="::fwServices::IController" impl="::fwServices::SConfigController" autoConnect="no">
+                                    <config>
+                                        <appConfig id="2DNegato">
+                                            <parameters>
+                                                <parameter replace="imageUid" by="self" />
+                                                <parameter replace="orientation" by="frontal" />
+                                                <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato2" />
+                                                <parameter replace="patient_name" by="${patient_name}" />
+                                            </parameters>
+                                        </appConfig>
+                                    </config>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_cfgNegato3" type="::fwServices::IController" impl="::fwServices::SConfigController" autoConnect="no">
+                                    <config>
+                                        <appConfig id="2DNegato">
+                                            <parameters>
+                                                <parameter replace="imageUid" by="self" />
+                                                <parameter replace="orientation" by="sagittal" />
+                                                <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato3" />
+                                                <parameter replace="patient_name" by="${patient_name}" />
+                                            </parameters>
+                                        </appConfig>
+                                    </config>
+                                </service>
+
+
+                                <service uid="${GENERIC_UID}_ActionFocusLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::FocusLandmark" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionNewLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::AddLandmark" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionRemoveLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::RemoveLandmark" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionLoadLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::LoadLandmark" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionSaveLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::SaveLandmark" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionHideLandmark" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::ShowLandmark" autoConnect="yes" />
+                                <service uid="${GENERIC_UID}_ActionAddDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::AddDistance" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionRemoveDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::RemoveDistance" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_ActionHideDistance" type="::fwGui::IActionSrv" impl="::uiMeasurement::action::ShowDistance" autoConnect="yes" />
+
+                                <service uid="${GENERIC_UID}_ActionHideCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                    <crossType>hide</crossType>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_ActionShowNormalCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                    <crossType>half</crossType>
+                                    <state active="true" />
+                                </service>
+
+                                <service uid="${GENERIC_UID}_ActionShowFullCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                    <crossType>full</crossType>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_action_SagittalViewMPR3D" type="::fwGui::IActionSrv" impl="::uiVisu::action::CameraOrientationAction" autoConnect="no">
+                                    <orientation>sagittal</orientation>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_action_FrontalViewMPR3D" type="::fwGui::IActionSrv" impl="::uiVisu::action::CameraOrientationAction" autoConnect="no">
+                                    <orientation>frontal</orientation>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_action_AxialViewMPR3D" type="::fwGui::IActionSrv" impl="::uiVisu::action::CameraOrientationAction" autoConnect="no">
+                                    <orientation>axial</orientation>
+                                </service>
+
+                                <service uid="${GENERIC_UID}_MedicalImageSrv" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="no" />
+
+
+                            </object>
+                        </config>
+                    </service>
+
+
+                    <service uid="${GENERIC_UID}_2DLayoutManager" impl="::ctrlSelection::manager::SwapperSrv" autoConnect="yes">
+                        <mode type="startAndUpdate" />
+                        <config>
+                            <object id="OptionalInputImageKey" type="::fwData::Image">
+
+                                <service uid="${GENERIC_UID}_ModifyLayout" type="::fwGui::IActionSrv" impl="::gui::action::ModifyLayoutActionSrv" autoConnect="no">
+                                    <config>
+                                        <show wid="${GENERIC_UID}_view_negato2" />
+                                        <show wid="${GENERIC_UID}_view_negato3" />
+                                    </config>
+                                </service>
+
+
+                            </object>
+                        </config>
+                    </service>
+
+
+
+                </object>
+            </item>
+
+
+
+
+            <item key="seriesDB">
+                <object uid="${SERIESDB}" src="ref" type="::fwMedData::SeriesDB">
+                    <service uid="${GENERIC_UID}_ActionExportActivity" type="::fwGui::IActionSrv" impl="::uiMedData::action::SExportSeries" autoConnect="yes">
+                        <seriesId>${AS_UID}</seriesId>
+                    </service>
+                </object>
+            </item>
+
+            <item key="activitySeries">
+                <object uid="${AS_UID}" src="ref" type="::fwMedData::ActivitySeries" />
+            </item>
+
+            <item key="modelSeriesKey">
+                <object uid="${modelSeriesUid}" src="ref" type="::fwMedData::ModelSeries" />
+            </item>
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_cfgNegato1" />
+            <start uid="${GENERIC_UID}_2DViewManager" />
+            <start uid="${GENERIC_UID}_2DLayoutManager" />
+
+        </object>
+
+
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/ManageOrganWithSeries.xml b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/ManageOrganWithSeries.xml
new file mode 100644
index 0000000..cda6800
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/rc/configurations/ManageOrganWithSeries.xml
@@ -0,0 +1,87 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>OrganManagerWithSeries</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="GENERIC_UID" />
+        <param name="ORGAN_MANAGER_MODELSERIES" />
+        <param name="ICON_PATH" />
+    </parameters>
+    <config>
+
+
+        <object type="::fwData::Composite">
+
+            <!-- MAIN FRAME -->
+            <service uid="${GENERIC_UID}_organManagerFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+                <window onclose="notify" />
+                <gui>
+                    <frame>
+                        <name>Organs Manager</name>
+                        <icon>${ICON_PATH}</icon>
+                        <!-- <minSize width="400" height="750" /> -->
+                        <style mode="STAY_ON_TOP" />
+                    </frame>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_multiViewOrgans" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_multiViewOrgans" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::ToolboxLayoutManager" >
+                        <view caption="Organs" expanded="true" />
+                        <view caption="Material" expanded="true" />
+                        <view caption="Representation" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_listOrganEditor" start="yes" />
+                    <view sid="${GENERIC_UID}_organMaterialEditor" start="no" />
+                    <view sid="${GENERIC_UID}_representationEditor" start="no" />
+                </registry>
+            </service>
+
+            <item key="selection">
+                <object type="::fwData::Composite">
+
+                    <service uid="${GENERIC_UID}_myUpdaterReconst" impl="::ctrlSelection::updater::SReconstructionFromModelSeriesUpdater" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+                        <update compositeKey="reconstruction" onEvent="NEW_RECONSTRUCTION_SELECTED" fromUID="*" actionType="ADD_OR_SWAP" />
+                        <update compositeKey="reconstruction" onEvent="REMOVED_RECONSTRUCTIONS" fromUID="*" actionType="REMOVE_IF_PRESENT" />
+                    </service>
+
+                    <service uid="${GENERIC_UID}_myManagerForOrgansFrame" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+                        <mode type="dummy" />
+                        <config>
+
+                            <object id="reconstruction" type="::fwData::Reconstruction">
+                                <service uid="${GENERIC_UID}_organMaterialEditor" impl="::uiReconstruction::OrganMaterialEditor" type="::gui::editor::IEditor" autoConnect="no" />
+                                <service uid="${GENERIC_UID}_representationEditor" impl="::uiReconstruction::RepresentationEditor" type="::gui::editor::IEditor" autoConnect="no" />
+                            </object>
+
+                        </config>
+                    </service>
+
+                </object>
+            </item>
+
+            <item key="modelSeries">
+                <object uid="${ORGAN_MANAGER_MODELSERIES}" src="ref" type="::fwMedData::ModelSeries">
+                    <service uid="${GENERIC_UID}_listOrganEditor" impl="::uiMedData::editor::SModelSeriesList" type="::gui::editor::IEditor" autoConnect="yes" />
+                </object>
+            </item>
+
+            <connect>
+                <signal>${ORGAN_MANAGER_MODELSERIES}/objectModified</signal>
+                <slot>${GENERIC_UID}_myUpdaterReconst/receive</slot>
+            </connect>
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_organManagerFrame" />
+            <start uid="${GENERIC_UID}_myUpdaterReconst" />
+            <start uid="${GENERIC_UID}_myManagerForOrgansFrame" />
+
+        </object>
+
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/3DVisualizationActivity/rc/plugin.xml b/Bundles/LeafActivity/3DVisualizationActivity/rc/plugin.xml
new file mode 100644
index 0000000..a64ea15
--- /dev/null
+++ b/Bundles/LeafActivity/3DVisualizationActivity/rc/plugin.xml
@@ -0,0 +1,33 @@
+<plugin id="3DVisualizationActivity">
+
+    <requirement id="servicesReg" />
+    <requirement id="2DVisualizationActivity" />
+    <requirement id="uiReconstructionQt" />
+    <requirement id="media" />
+
+    <xi:include href="configurations/3DVisualization.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/ManageOrganWithSeries.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/3DNegatoWithAcq.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>3DVisualization</id>
+        <title>3D Visu</title>
+        <desc>3D visualization activity</desc>
+        <icon>Bundles/media_0-1/icons/icon-3D.png</icon>
+        <requirements>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="0" maxOccurs="1" >
+                <key path="@image" >OptionalInputImageKey</key>
+            </requirement>
+            <requirement name="modelSeries" type="::fwMedData::ModelSeries" minOccurs="1" maxOccurs="1" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="3DVisualization">
+            <parameters>
+                <parameter replace="InputImageCompositeUID" by="@values.imageSeries" />
+                <parameter replace="modelSeriesUid" by="@values.modelSeries" />
+                <parameter replace="orientation" by="frontal" />
+            </parameters>
+        </appConfig>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafActivity/blendActivity/CMakeLists.txt b/Bundles/LeafActivity/blendActivity/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Bundles/LeafActivity/blendActivity/Properties.cmake b/Bundles/LeafActivity/blendActivity/Properties.cmake
new file mode 100644
index 0000000..007906c
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME blendActivity )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS gui guiQt ctrlSelection uiVisu uiVisuQt visuVTKAdaptor uiImageQt scene2D uiTF media )
+
diff --git a/Bundles/LeafActivity/blendActivity/bin/build.options b/Bundles/LeafActivity/blendActivity/bin/build.options
new file mode 100755
index 0000000..aa967d6
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/bin/build.options
@@ -0,0 +1,14 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = [
+    'gui_0-1'                ,
+    'guiQt_0-1'              ,
+    'ctrlSelection_0-1'      ,
+    'uiVisu_0-1'             ,
+    'uiVisuQt_0-1'           ,
+    'visuVTKAdaptor_0-1'     ,
+    'uiImageQt_0-1'          ,
+    'scene2D_0-1'            ,
+    'uiTF_0-1'               ,
+    'media_0-1'              ,
+]
diff --git a/Bundles/LeafActivity/blendActivity/rc/configurations/Blend.xml b/Bundles/LeafActivity/blendActivity/rc/configurations/Blend.xml
new file mode 100644
index 0000000..fb6c43e
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/rc/configurations/Blend.xml
@@ -0,0 +1,130 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>Blend</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="SERIESDB" />
+        <param name="AS_UID" />
+        <param name="frontImageUid" />
+        <param name="backgroundImageUid" />
+    </parameters>
+
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view align="center" />
+                    </layout>
+                    <toolBar />
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <toolBar sid="${GENERIC_UID}_toolBar" start="yes" />
+                    <view wid="${GENERIC_UID}_WID_VIEW" start="no" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Blend view" style="radio" icon="Bundles/media_0-1/icons/icon-2D.png" />
+                        <menuItem name="Edit background Image TF" style="radio" icon="Bundles/media_0-1/icons/icon-tf1.svg" />
+                        <menuItem name="Edit front Image TF" style="radio" icon="Bundles/media_0-1/icons/icon-tf2.svg" />
+                        <menuItem name="Export Activity" icon="Bundles/media_0-1/icons/Export.svg"  />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_action_blendView" start="no" />
+                    <menuItem sid="${GENERIC_UID}_action_bgTFView" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_action_frontTFView" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionExportActivity" start="yes" />
+                </registry>
+            </service>
+
+            <item key="seriesDB">
+                <object uid="${SERIESDB}" src="ref" type="::fwMedData::SeriesDB">
+                    <service uid="${GENERIC_UID}_ActionExportActivity" type="::fwGui::IActionSrv" impl="::uiMedData::action::SExportSeries" autoConnect="yes">
+                        <seriesId>${AS_UID}</seriesId>
+                    </service>
+                </object>
+            </item>
+            
+            <item key="activitySeries">
+                <object uid="${AS_UID}" src="ref" type="::fwMedData::ActivitySeries" />
+            </item>
+
+            <item key="TFSelectionsKey">
+                <object uid="${GENERIC_UID}_TFComposite" type="::fwData::Composite" />
+            </item>
+
+            <item key="myBlendSelectionComposite">
+                <object uid="${GENERIC_UID}_myBlendSelectionComposite" type="::fwData::Composite">
+                
+                    <service uid="${GENERIC_UID}_myManagerLockDump" impl="::ctrlMemory::manager::LockDumpManagerSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes" />
+
+                    <service uid="${GENERIC_UID}_action_blendView" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                        <state active="true" />
+                        <config>
+                            <appConfig id="ImageMix" >
+                               <parameters>
+                                    <parameter replace="SELECTED_myBlendSelectionComposite" by="${GENERIC_UID}_myBlendSelectionComposite"  />
+                                    <parameter replace="WID_VIEW" by="${GENERIC_UID}_WID_VIEW"  />
+                                    <parameter replace="TF_COMPOSITE_ID" by="${GENERIC_UID}_TFComposite"  />
+                                    <parameter replace="SELECTED_TF_KEYA" by="tfBackgroundImage"  />
+                                    <parameter replace="SELECTED_TF_KEYB" by="tfFrontImage"  />
+                               </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_bgTFView" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                        <config>
+                            <appConfig id="TransferFunctionEditor" >
+                                <parameters>
+                                    <parameter replace="SELECTED_UID_myImage" by="${backgroundImageUid}"  />
+                                    <parameter replace="WID_VIEW" by="${GENERIC_UID}_WID_VIEW"  />
+                                    <parameter replace="TF_COMPOSITE_ID" by="${GENERIC_UID}_TFComposite"  />
+                                    <parameter replace="SELECTED_TF_KEY" by="tfBackgroundImage"  />
+                                </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_action_frontTFView" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                        <config>
+                            <appConfig id="TransferFunctionEditor" >
+                                <parameters>
+                                    <parameter replace="SELECTED_UID_myImage" by="${frontImageUid}"  />
+                                    <parameter replace="WID_VIEW" by="${GENERIC_UID}_WID_VIEW"  />
+                                    <parameter replace="TF_COMPOSITE_ID" by="${GENERIC_UID}_TFComposite"  />
+                                    <parameter replace="SELECTED_TF_KEY" by="tfFrontImage"  />
+                                </parameters>
+                            </appConfig>
+                        </config>
+                    </service>
+                    
+                    <item key="backgroundImage">
+                        <object uid="${backgroundImageUid}" type="::fwData::Image" src="ref" />
+                    </item>
+                    
+                    <item key="frontImage">
+                        <object uid="${frontImageUid}" type="::fwData::Image" src="ref" />
+                    </item>
+                </object>
+            </item>
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_action_blendView" />
+            <start uid="${GENERIC_UID}_myManagerLockDump" />
+
+        </object>
+
+
+    </config>
+</extension>
+
diff --git a/Bundles/LeafActivity/blendActivity/rc/configurations/ImageMix.xml b/Bundles/LeafActivity/blendActivity/rc/configurations/ImageMix.xml
new file mode 100644
index 0000000..4a28e17
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/rc/configurations/ImageMix.xml
@@ -0,0 +1,212 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>ImageMix</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_VIEW" />
+        <param name="GENERIC_UID" />
+        <param name="SELECTED_myBlendSelectionComposite" />
+        <param name="TF_COMPOSITE_ID" />
+        <param name="SELECTED_TF_KEYA" />
+        <param name="SELECTED_TF_KEYB" />
+        <param name="patient_name"  default="" />
+    </parameters>
+
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Blend" align="center" />
+                        <view align="bottom" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="${WID_VIEW}" />
+                    <view sid="${GENERIC_UID}_blendGenericScene" start="yes" />
+                    <view sid="${GENERIC_UID}_bottomView" start="yes" />
+                </registry>
+            </service>
+
+
+            <service uid="${GENERIC_UID}_bottomView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" />
+                        <view proportion="0" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_sliderView" start="yes" />
+                    <view sid="${GENERIC_UID}_editorsView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_sliderView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="1" />
+                        <view proportion="0" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_slider" start="no" />
+                    <view sid="${GENERIC_UID}_snapshot" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_editorsView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view caption="Background image" proportion="1" />
+                        <view caption="Front image" proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_bgBottomView" start="yes" />
+                    <view sid="${GENERIC_UID}_frontBottomView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_bgBottomView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" />
+                        <spacer />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_bg_windowLevel" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_frontBottomView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" />
+                        <view proportion="0" />
+                        <spacer />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_front_windowLevel" />
+                    <view sid="${GENERIC_UID}_front_imageTransparency" />
+                </registry>
+            </service>
+
+            <item key="TFSelectionsKey">
+                <object uid="${TF_COMPOSITE_ID}" src="ref" type="::fwData::Composite" />
+            </item>
+
+            <item key="myBlendSelectionComposite">
+                <object uid="${SELECTED_myBlendSelectionComposite}" src="ref" type="::fwData::Composite">
+
+                    <service uid="${GENERIC_UID}_snapshot" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                        <snap>
+                            <scene uid="${GENERIC_UID}_blendGenericScene" />
+                        </snap>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_myManagerVisu" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes"> <!-- priority="0.6" -->
+                        <mode type="stop" />
+                        <config>
+                            <object id="backgroundImage" type="::fwData::Image">
+                                <service impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+                                <!-- This service convert a simple fwData::Image to medical Image -->
+                                <service uid="${GENERIC_UID}_bg_medicalImageConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="yes"/> <!-- priority="0.6" -->
+                                <service uid="${GENERIC_UID}_slider" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes">
+                                    <sliceIndex>axial</sliceIndex>
+                                </service>
+                                <service uid="${GENERIC_UID}_bg_windowLevel" type="::gui::editor::IEditor" impl="::uiImage::WindowLevel" autoConnect="yes">
+                                    <config selectedTFKey="${SELECTED_TF_KEYA}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                                </service>
+
+                            </object>
+
+                            <object id="frontImage" type="::fwData::Image">
+                                <service impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+                                <!-- This service convert a simple fwData::Image to medical Image -->
+                                <service impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="yes"/> <!-- priority="0.6" -->
+
+                                <service uid="${GENERIC_UID}_front_imageTransparency" type="::gui::editor::IEditor" impl="::uiImage::ImageTransparency" autoConnect="yes">
+                                    <shortcut value="V" />
+                                </service>
+
+                                <service uid="${GENERIC_UID}_front_windowLevel" type="::gui::editor::IEditor" impl="::uiImage::WindowLevel" autoConnect="yes">
+                                    <config selectedTFKey="${SELECTED_TF_KEYB}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                                </service>
+
+                            </object>
+                        </config>
+                    </service>
+
+                    <!-- Generic scene to show merging of backgroung and front images -->
+                    <service uid="${GENERIC_UID}_blendGenericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+                            <picker id="myPicker" vtkclass="fwVtkCellPicker" />
+                            <vtkObject id="imageBlend" class="vtkImageBlend" />
+                            <renderer id="default" background="0.0" />
+
+                            <adaptor id="myRenderAdaptor" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" picker="" />
+                            </adaptor>
+                            <adaptor uid="${GENERIC_UID}_MPRNegatoScene3D" id="MPRNegato3D" class="::visuVTKAdaptor::NegatoMPR" objectId="backgroundImage">
+                                <config renderer="default" picker="myPicker" mode="2D" slices="1" sliceIndex="axial" vtkimagesource="imageBlend"
+                                    selectedTFKey="${SELECTED_TF_KEYA}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                            </adaptor>
+                            <adaptor id="interactor" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                                <config renderer="default" style="InteractorStyle2DForNegato" />
+                            </adaptor>
+                            <adaptor id="bgImagePicker" class="::visuVTKAdaptor::ImagePickerInteractor" objectId="backgroundImage">
+                                <config renderer="default" picker="myPicker" />
+                            </adaptor>
+                            <adaptor id="frontImagePicker" class="::visuVTKAdaptor::ImagePickerInteractor" objectId="frontImage">
+                                <config renderer="default" picker="myPicker" />
+                            </adaptor>
+                            <adaptor id="snapshot" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <!-- Adaptor to show background and front image merge in the same view. -->
+                            <adaptor id="myImagesBlendAdaptor" class="::visuVTKAdaptor::ImagesBlend" objectId="self">
+                                <config vtkimageregister="imageBlend">
+                                    <image objectId="backgroundImage" tfalpha="no"
+                                        selectedTFKey="${SELECTED_TF_KEYA}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                                    <image objectId="frontImage" tfalpha="yes"
+                                        selectedTFKey="${SELECTED_TF_KEYB}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                                </config>
+                            </adaptor>
+
+                            <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="self">
+                                <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                            </adaptor>
+
+                            <!-- Adaptor to show the red cross and images pixel values informations in scene top left. -->
+                            <adaptor id="myImagesProbeCursor" class="::visuVTKAdaptor::ImagesProbeCursor" objectId="self">
+                                <config renderer="default" picker="myPicker">
+                                    <image objectId="backgroundImage" name="background" />
+                                    <image objectId="frontImage" name="front" />
+                                </config>
+                            </adaptor>
+                        </scene>
+                    </service>
+
+                </object>
+            </item>
+
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_myManagerVisu" />
+
+        </object>
+
+
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/blendActivity/rc/configurations/TransferFunctionEditor.xml b/Bundles/LeafActivity/blendActivity/rc/configurations/TransferFunctionEditor.xml
new file mode 100644
index 0000000..3b878e4
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/rc/configurations/TransferFunctionEditor.xml
@@ -0,0 +1,278 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>TransferFunctionEditor</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_VIEW" />
+        <param name="GENERIC_UID" />
+        <param name="TF_COMPOSITE_ID" />
+        <param name="SELECTED_TF_KEY" />
+        <param name="SELECTED_UID_myImage" />
+        <param name="patient_name"  default="" />
+    </parameters>
+
+
+    <config>
+
+        <object type="::fwData::Composite" uid="${GENERIC_UID}_myComposite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="Negato" align="center" />
+                        <view caption="TF selection" align="right" minWidth="450" />
+                    </layout>
+                </gui>
+                <registry>
+                    <parent wid="${WID_VIEW}" />
+                    <view sid="${GENERIC_UID}_sceneView" start="yes" />
+                    <view sid="${GENERIC_UID}_tfView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_sceneView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="1" />
+                        <view proportion="0" minHeight="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_genericScene" start="yes" />
+                    <view sid="${GENERIC_UID}_sceneView_bottom" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_sceneView_bottom" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="horizontal" />
+                        <view proportion="0" minWidth="30" />
+                        <view proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_snapshotEditor" start="yes" />
+                    <view sid="${GENERIC_UID}_slider" start="no" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_snapshotEditor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+                <snap>
+                    <scene uid="${GENERIC_UID}_genericScene" />
+                </snap>
+            </service>
+
+
+
+            <service uid="${GENERIC_UID}_tfView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" />
+                        <view proportion="0" minHeight="100" />
+                        <view proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_tfSelector" start="no" />
+                    <view sid="${GENERIC_UID}_Scene2D_Shutter" start="yes" />
+                    <view sid="${GENERIC_UID}_Scene2D" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_genericScene" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                <scene>
+                    <picker id="negato2default" vtkclass="fwVtkCellPicker" />
+                    <renderer id="default" background="0.0" />
+                    <adaptor id="renderNegato2" class="::visuVTKAdaptor::Render" objectId="self">
+                        <config renderer="default" />
+                    </adaptor>
+                    <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                        <config renderer="default" />
+                    </adaptor>
+                    <adaptor id="Interactor1" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                        <config renderer="default" style="InteractorStyle2DForNegato" />
+                    </adaptor>
+                    <adaptor id="MPRNegato2" class="::visuVTKAdaptor::NegatoMPR" objectId="displayed_image">
+                        <config renderer="default" picker="negato2default" mode="2d" slices="1" sliceIndex="axial" selectedTFKey="${SELECTED_TF_KEY}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                    </adaptor>
+                    <adaptor id="text" class="::visuVTKAdaptor::ImageText" objectId="displayed_image">
+                        <config renderer="default" picker="negato2default" text="" selectedTFKey="${SELECTED_TF_KEY}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                    </adaptor>
+                    <adaptor id="multiDistances" class="::visuVTKAdaptor::ImageMultiDistances" objectId="displayed_image">
+                        <config filter="true" renderer="default" picker="negato2default" />
+                    </adaptor>
+                    <adaptor id="landmarksNegato2" class="::visuVTKAdaptor::ImageLandmarks" objectId="displayed_image">
+                        <config renderer="default" picker="negato2default" />
+                    </adaptor>
+
+                    <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="displayed_image">
+                        <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                    </adaptor>
+
+                </scene>
+            </service>
+
+            <service uid="${GENERIC_UID}_Scene2D" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+                <scene>
+
+                    <scene x="-1100" y="-1.1" width="2400" height="1.2" antialiasing="true" />
+
+                    <viewport id="view1" x="-500" y="-1.1" width="500" height="1.2" />
+
+                    <axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" />
+                    <axis id="yAxis" origin="0.0" scale="-1.0" scaleType="LINEAR" />
+
+                    <axis id="axeHistogramY" origin="0.0" scale="-0.000001" scaleType="LINEAR" />
+
+                    <adaptor id="grid" class="::scene2D::adaptor::Grid2D" objectId="self">
+                        <config xMin="-1200" xMax="1500" yMin="0.0" yMax="1.0" xSpacing="100" ySpacing="0.1" opacity="0.25"
+                            viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="1" />
+                    </adaptor>
+
+                    <adaptor id="abscissa" class="::scene2D::adaptor::Line" objectId="self">
+                        <config x1="-1200" x2="1500" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" />
+                    </adaptor>
+
+                    <adaptor id="ordinate" class="::scene2D::adaptor::Line" objectId="self">
+                        <config x1="0" x2="0" y1="-0.1" y2="1.2" color="white" xAxis="xAxis" yAxis="yAxis" zValue="3" />
+                    </adaptor>
+
+                    <adaptor id="maxOpacity" class="::scene2D::adaptor::Line" objectId="self">
+                        <config x1="-1200" x2="1500" y1="1" y2="1" color="red" xAxis="xAxis" yAxis="yAxis" zValue="4" />
+                    </adaptor>
+
+                    <adaptor id="tf2" class="::scene2D::adaptor::TransferFunction" objectId="displayed_image">
+                        <config lineColor="lightGray" circleColor="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="7"
+                            viewportUID="${GENERIC_UID}_Viewport"
+                            selectedTFKey="${SELECTED_TF_KEY}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                    </adaptor>
+
+                    <adaptor id="viewportRangeUpdater" class="::scene2D::adaptor::ViewportUpdater" objectId="myViewport">
+                        <config xAxis="xAxis" yAxis="yAxis" zValue="9" />
+                    </adaptor>
+
+                    <adaptor id="scaleValuesLeft" class="::scene2D::adaptor::ScaleValues" objectId="self">
+                        <config min="0.0" max="1.0" interval="0.1" fontSize="7" align="left" unit="%" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                    </adaptor>
+
+                    <adaptor id="axisLeft" class="::scene2D::adaptor::Axis" objectId="self">
+                        <config min="0.0" max="1.0" interval="0.1" align="left" tickSize="5" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                    </adaptor>
+
+                    <adaptor id="scaleValuesBottom" class="::scene2D::adaptor::ScaleValues" objectId="self">
+                        <config min="-1024" max="1024" interval="200" fontSize="7" align="bottom" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                    </adaptor>
+
+                    <adaptor id="axisBottom" class="::scene2D::adaptor::Axis" objectId="self">
+                        <config min="-1024" max="1024" interval="100" align="bottom" tickSize="5" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                    </adaptor>
+
+                    <adaptor id="curvedHistogram" class="::scene2D::adaptor::CurvedHistogram" objectId="myHistogram">
+                        <config xAxis="xAxis" yAxis="axeHistogramY" borderColor="lightGray" innerColor="gray"
+                            opacity="0.25" zValue="6" borderWidth="2.0" />
+                    </adaptor>
+
+                </scene>
+
+            </service>
+
+            <service uid="${GENERIC_UID}_Scene2D_Shutter" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+                <scene>
+
+                    <scene x="-1100" y="-1.1" width="2400" height="1.2" />
+
+                    <viewport id="view1" x="-1100" y="-1.1" width="2400" height="1.2" />
+
+                    <axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" />
+                    <axis id="yAxis" origin="0.0" scale="-1.0" scaleType="LINEAR" />
+
+                    <axis id="axeHistogramY" origin="0.0" scale="-0.000001" scaleType="LINEAR" />
+
+                    <adaptor id="shutterGrid" class="::scene2D::adaptor::Grid2D" objectId="self">
+                        <config xMin="-1200" xMax="1400" yMin="-0.7" yMax="1.7" xSpacing="200" ySpacing="0.2"
+                            viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis"
+                            yAxis="yAxis" zValue="1" />
+                    </adaptor>
+
+                    <adaptor id="shutterAbscissa" class="::scene2D::adaptor::Line" objectId="self">
+                        <config x1="-1200" x2="1400" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" />
+                    </adaptor>
+
+                    <adaptor id="shutterOrdinate" class="::scene2D::adaptor::Line" objectId="self">
+                        <config x1="0" x2="0" y1="-0.1" y2="1.2" color="white" xAxis="xAxis" yAxis="yAxis" zValue="3" />
+                    </adaptor>
+
+                    <adaptor id="viewportRangeSelector" class="::scene2D::adaptor::ViewportRangeSelector" objectId="myViewport">
+                        <config xAxis="xAxis" yAxis="yAxis" zValue="5" initialWidth="1200" initialPos="-700" />
+                    </adaptor>
+
+                    <adaptor id="shutterHistogram" class="::scene2D::adaptor::Histogram" objectId="myHistogram">
+                        <config color="green" xAxis="xAxis" yAxis="axeHistogramY" zValue="4" />
+                    </adaptor>
+
+                </scene>
+
+            </service>
+
+            <item key="myViewport">
+                <object uid="${GENERIC_UID}_Viewport" type="::scene2D::data::Viewport" />
+            </item>
+
+            <item key="myHistogram">
+                <object uid="${GENERIC_UID}_Histogram" type="::fwData::Histogram" />
+            </item>
+
+            <item key="displayed_image">
+                <object uid="${SELECTED_UID_myImage}" src="ref" type="::fwData::Image">
+
+                    <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                    <service uid="${GENERIC_UID}_myManager" impl="::ctrlSelection::manager::SField" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+                        <mode type="stop" />
+                        <config>
+                            <field id="m_transferFunctionCompositeId" type="::fwData::Composite">
+                                <service uid="${GENERIC_UID}_tfSelector" type="::gui::editor::IEditor" impl="::uiTF::TransferFunctionEditor" autoConnect="yes">
+                                    <config selectedTFKey="${SELECTED_TF_KEY}" tfSelectionFwID="${TF_COMPOSITE_ID}" />
+                                </service>
+                            </field>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_MedicalImageSrv" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="no" />
+
+                    <!-- Editors for Negato2 -->
+                    <service uid="${GENERIC_UID}_slider" impl="::uiImage::SliceIndexPositionEditor" type="::gui::editor::IEditor" autoConnect="yes">
+                        <sliceIndex>axial</sliceIndex>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_computeHistogram" type="::fwServices::IController" impl="::scene2D::processing::SComputeHistogram" autoConnect="yes" worker="COMPUTING_THREAD" >
+                        <histogramId>${GENERIC_UID}_Histogram</histogramId>
+                        <binsWidth>5.0</binsWidth>
+                    </service>
+                </object>
+            </item>
+
+
+            <item key="TFSelectionsKey">
+                <object uid="${TF_COMPOSITE_ID}" src="ref" type="::fwData::Composite" />
+            </item>
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_LockImageSrv" />
+            <start uid="${GENERIC_UID}_computeHistogram" />
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_myManager" />
+            <start uid="${GENERIC_UID}_slider" />
+            <start uid="${GENERIC_UID}_MedicalImageSrv" />
+
+
+        </object>
+
+
+    </config>
+</extension>
+
diff --git a/Bundles/LeafActivity/blendActivity/rc/plugin.xml b/Bundles/LeafActivity/blendActivity/rc/plugin.xml
new file mode 100644
index 0000000..8fa03da
--- /dev/null
+++ b/Bundles/LeafActivity/blendActivity/rc/plugin.xml
@@ -0,0 +1,38 @@
+<plugin id="blendActivity">
+
+    <requirement id="servicesReg" />
+    <requirement id="gui" />
+    <requirement id="guiQt" />
+    <requirement id="ctrlSelection" />
+    <requirement id="uiVisu" />
+    <requirement id="uiVisuQt" />
+    <requirement id="visuVTKAdaptor" />
+    <requirement id="uiImageQt" />
+    <requirement id="media" />
+    <requirement id="uiTF" />
+    <requirement id="scene2D" />
+
+    <xi:include href="configurations/Blend.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/ImageMix.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+    <xi:include href="configurations/TransferFunctionEditor.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Blend</id>
+        <title>Blend</title>
+        <desc>Blend activity</desc>
+        <icon>Bundles/media_0-1/icons/icon-blend.png</icon>
+        <requirements>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="2" maxOccurs="2" >
+              <key>FrontImage</key>
+              <key>BackImage</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Blend">
+            <parameters>
+                <parameter replace="frontImageUid"      by="@values.imageSeries.values.FrontImage.image" />
+                <parameter replace="backgroundImageUid" by="@values.imageSeries.values.BackImage.image" />
+            </parameters>
+        </appConfig>
+    </extension>
+</plugin>
diff --git a/Bundles/LeafActivity/volumeRenderingActivity/CMakeLists.txt b/Bundles/LeafActivity/volumeRenderingActivity/CMakeLists.txt
new file mode 100644
index 0000000..28184c6
--- /dev/null
+++ b/Bundles/LeafActivity/volumeRenderingActivity/CMakeLists.txt
@@ -0,0 +1,3 @@
+
+fwLoadProperties()
+
diff --git a/Bundles/LeafActivity/volumeRenderingActivity/Properties.cmake b/Bundles/LeafActivity/volumeRenderingActivity/Properties.cmake
new file mode 100644
index 0000000..67e6b5c
--- /dev/null
+++ b/Bundles/LeafActivity/volumeRenderingActivity/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME volumeRenderingActivity )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES  )
+set( REQUIREMENTS 2DVisualizationActivity 3DVisualizationActivity gui guiQt ctrlSelection uiVisu uiVisuQt visuVTKAdaptor visuVTKVRAdaptor uiImageQt scene2D uiTF uiIO media )
+
diff --git a/Bundles/LeafActivity/volumeRenderingActivity/bin/build.options b/Bundles/LeafActivity/volumeRenderingActivity/bin/build.options
new file mode 100755
index 0000000..f0b42b8
--- /dev/null
+++ b/Bundles/LeafActivity/volumeRenderingActivity/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+
+REQUIREMENTS = [
+    '2DVisualizationActivity_0-1',
+    '3DVisualizationActivity_0-1',
+]
+
+BUNDLES = [
+    'gui_0-1'                ,
+    'guiQt_0-1'              ,
+    'ctrlSelection_0-1'      ,
+    'uiVisu_0-1'             ,
+    'uiVisuQt_0-1'           ,
+    'visuVTKAdaptor_0-1'     ,
+    'visuVTKVRAdaptor_0-1'   ,
+    'uiImageQt_0-1'          ,
+    'scene2D_0-1'            ,
+    'uiTF_0-1'               ,
+    'uiIO_0-1'               ,
+    'media_0-1'              ,
+]
diff --git a/Bundles/LeafActivity/volumeRenderingActivity/rc/configurations/VolumeRendering.xml b/Bundles/LeafActivity/volumeRenderingActivity/rc/configurations/VolumeRendering.xml
new file mode 100644
index 0000000..872d6f8
--- /dev/null
+++ b/Bundles/LeafActivity/volumeRenderingActivity/rc/configurations/VolumeRendering.xml
@@ -0,0 +1,429 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>VolumeRendering</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="WID_PARENT" />
+        <param name="GENERIC_UID" />
+        <param name="SERIESDB" />
+        <param name="AS_UID" />
+        <param name="ICON_PATH" />
+        <param name="imageUid" />
+        <param name="patient_name"  default="" />
+        <param name="optionalModelSeriesCompositeUid" />
+    </parameters>
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_mainView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::CardinalLayoutManager">
+                        <view caption="VR" align="center" />
+                        <view align="right" minWidth="450" />
+                    </layout>
+                    <toolBar />
+                </gui>
+                <registry>
+                    <parent wid="${WID_PARENT}" />
+                    <toolBar sid="${GENERIC_UID}_toolBar" start="yes" />
+                    <view sid="${GENERIC_UID}_vr" start="no" />
+                    <view sid="${GENERIC_UID}_tf" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_tf" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" minHeight="30" />
+                        <view proportion="1" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_tfm" start="no" />
+                    <view sid="${GENERIC_UID}_tfmTab" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_tfmTab" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::TabLayoutManager">
+                        <view caption="TF-Negato" />
+                        <view caption="TF-Scene2D" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view wid="${GENERIC_UID}_view_negato" />
+                    <view sid="${GENERIC_UID}_TFScene2D" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+                <gui>
+                    <layout>
+                        <menuItem name="Hide cross" icon="Bundles/media_0-1/icons/HideCross.png" style="radio" />
+                        <menuItem name="Show normal cross" icon="Bundles/media_0-1/icons/NormalCross.png" style="radio" />
+                        <menuItem name="Show full cross" icon="Bundles/media_0-1/icons/FullCross.png" style="radio" />
+                        <separator />
+                        <menuItem name="Show 3d slice cursor" icon="Bundles/media_0-1/icons/icon-landmark.png" style="check" />
+                        <menuItem name="Show mesh" icon="Bundles/media_0-1/icons/icon-3D.png" style="check" />
+                        <menuItem name="Manage organs color" icon="Bundles/media_0-1/icons/ManageOrgan.png" style="check" />
+                        <separator />
+                        <menuItem name="Show/hide box cropping" icon="Bundles/media_0-1/icons/icon-box.png" />
+                        <menuItem name="Reset box cropping" icon="Bundles/media_0-1/icons/icon-box-reset.png" />
+                        <separator />
+                        <menuItem name="Snapshot VR" icon="Bundles/media_0-1/icons/camera-photo.png" />
+                        <separator />
+                        <menuItem name="Export Activity" icon="Bundles/media_0-1/icons/Export.svg"  />
+                    </layout>
+                </gui>
+                <registry>
+                    <menuItem sid="${GENERIC_UID}_ActionHideCross" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowNormalCross" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowFullCross" start="yes" />
+
+                    <menuItem sid="${GENERIC_UID}_ActionShowSliceCursor" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionShowMesh" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_action_organManager" start="no" />
+
+                    <menuItem sid="${GENERIC_UID}_ActionShowHideBoxWidget" start="yes" />
+                    <menuItem sid="${GENERIC_UID}_ActionResetBoxWidget" start="yes" />
+
+                    <menuItem sid="${GENERIC_UID}_ActionSnapshotVR" start="yes" />
+
+                    <menuItem sid="${GENERIC_UID}_ActionExportActivity" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_TFScene2D" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="0" minHeight="100" />
+                        <view proportion="1" />
+                        <view proportion="0" minHeight="30" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_Scene2D_Shutter" start="no" />
+                    <view sid="${GENERIC_UID}_Scene2D" start="no" />
+                    <view sid="${GENERIC_UID}_FloatEditor" start="no" />
+                </registry>
+            </service>
+
+            <item key="seriesDB">
+                <object uid="${SERIESDB}" src="ref" type="::fwMedData::SeriesDB">
+                    <service uid="${GENERIC_UID}_ActionExportActivity" type="::fwGui::IActionSrv" impl="::uiMedData::action::SExportSeries" autoConnect="yes">
+                        <seriesId>${AS_UID}</seriesId>
+                    </service>
+                </object>
+            </item>
+
+            <item key="activitySeries">
+                <object uid="${AS_UID}" src="ref" type="::fwMedData::ActivitySeries" />
+            </item>
+
+            <!-- GENERIC SCENE DEFINITION -->
+            <item key="visuConfig">
+                <object uid="${GENERIC_UID}_VisuComposite" type="::fwData::Composite">
+
+                    <service uid="${GENERIC_UID}_ActionShowSliceCursor" impl="::gui::action::PushObjectSrv" type="::fwGui::IActionSrv" autoConnect="no">
+                        <push src="${GENERIC_UID}_VisuComposite[imageKey]" key="imageKeyCursor" />
+                    </service>
+
+                    <service uid="${GENERIC_UID}_ActionShowMesh" impl="::gui::action::PushObjectSrv" type="::fwGui::IActionSrv" autoConnect="no">
+                        <push src="${optionalModelSeriesCompositeUid}[optionalModelSeriesKey]" key="modelSeries" />
+                    </service>
+
+                    <service uid="${GENERIC_UID}_managerModelSeries" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes" >
+                        <mode type="stop" />
+                        <config>
+
+                            <object id="modelSeries" type="::fwMedData::ModelSeries">
+                                <service uid="${GENERIC_UID}_action_organManager" type="::fwGui::IActionSrv" impl="::gui::action::SConfigLauncher" autoConnect="yes">
+                                    <config>
+                                        <appConfig id="OrganManagerWithSeries" >
+                                            <parameters>
+                                                <parameter replace="ORGAN_MANAGER_MODELSERIES" by="self"  />
+                                                <parameter replace="ICON_PATH" by="${ICON_PATH}"  />
+                                            </parameters>
+                                        </appConfig>
+                                    </config>
+                                </service>
+                            </object>
+                        </config>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_ActionSnapshotVR" impl="::uiVisu::action::SSnapshot" type="::fwGui::IActionSrv" autoConnect="no">
+                        <snap>
+                            <scene uid="${GENERIC_UID}_vr" />
+                        </snap>
+                    </service>
+
+                    <!-- Generic Scene VR -->
+                    <service uid="${GENERIC_UID}_vr" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                        <scene>
+
+                            <picker id="negato1default" vtkclass="fwVtkCellPicker" />
+
+                            <renderer id="default" background="0.0" />
+
+                            <adaptor id="renderNegato1" class="::visuVTKAdaptor::Render" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="snapshot1" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="Interactor1" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                                <config renderer="default" style="InteractorStyle3DForNegato" />
+                            </adaptor>
+
+                            <adaptor id="Image3DCursor" class="::visuVTKAdaptor::Image3DCursor" objectId="imageKeyCursor">
+                                <config renderer="default" />
+                            </adaptor>
+
+                            <adaptor id="modelSeriesAdaptor" class="::visuVTKAdaptor::ModelSeries" objectId="modelSeries">
+                                <config renderer="default" picker="negato1default" autoresetcamera="no" />
+                            </adaptor>
+
+                            <adaptor id="VolumeScene3DA" class="::visuVTKVRAdaptor::Volume" objectId="imageKey">
+                                <config renderer="default" selectedTFKey="SelectedTF" tfSelectionFwID="${GENERIC_UID}_TFSelections" />
+                            </adaptor>
+
+                            <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="imageKey">
+                                <config renderer="default" text="${patient_name}" fontSize="15" hAlign="right" vAlign="top" />
+                            </adaptor>
+                        </scene>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_Scene2D" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+                        <scene>
+
+                            <scene x="-1100" y="-1.1" width="2400" height="1.2" antialiasing="true" />
+
+                            <viewport id="view1" x="-500" y="-1.1" width="500" height="1.2" />
+
+                            <axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" />
+                            <axis id="yAxis" origin="0.0" scale="-1.0" scaleType="LINEAR" />
+
+                            <axis id="axeHistogramY" origin="0.0" scale="-0.000001" scaleType="LINEAR" />
+
+                            <adaptor id="grid" class="::scene2D::adaptor::Grid2D" objectId="self">
+                                <config xMin="-1200" xMax="1500" yMin="0.0" yMax="1.0" xSpacing="100" ySpacing="0.1" opacity="0.25" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="1" />
+                            </adaptor>
+
+                            <adaptor id="abscissa" class="::scene2D::adaptor::Line" objectId="self">
+                                <config x1="-1200" x2="1500" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" />
+                            </adaptor>
+
+                            <adaptor id="ordinate" class="::scene2D::adaptor::Line" objectId="self">
+                                <config x1="0" x2="0" y1="-0.1" y2="1.2" color="white" xAxis="xAxis" yAxis="yAxis" zValue="3" />
+                            </adaptor>
+
+                            <adaptor id="maxOpacity" class="::scene2D::adaptor::Line" objectId="self">
+                                <config x1="-1200" x2="1500" y1="1" y2="1" color="red" xAxis="xAxis" yAxis="yAxis" zValue="4" />
+                            </adaptor>
+
+                            <adaptor id="curvedHistogram" class="::scene2D::adaptor::CurvedHistogram" objectId="histogram">
+                                <config xAxis="xAxis" yAxis="axeHistogramY" borderColor="lightGray" innerColor="gray" opacity="0.25" zValue="6" histogramPointUID="${GENERIC_UID}_HistogramPoint" borderWidth="2.0" />
+                            </adaptor>
+
+                            <!-- A graphic cursor that follow histogram's shape according to mouse's cursor -->
+                            <adaptor id="histogramCursor" class="::scene2D::adaptor::HistogramCursor" objectId="histogram">
+                                <config xAxis="xAxis" yAxis="axeHistogramY" color="blue" borderColor="gray" zValue="9" pointSize="16" viewportUID="${GENERIC_UID}_Viewport" histogramPointUID="${GENERIC_UID}_HistogramPoint" />
+                            </adaptor>
+
+                            <adaptor id="histogramValue" class="::scene2D::adaptor::HistogramValue" objectId="histogram">
+                                <config xAxis="xAxis" yAxis="axeHistogramY" zValue="12" fontSize="6" viewportUID="${GENERIC_UID}_Viewport" histogramPointUID="${GENERIC_UID}_HistogramPoint" />
+                            </adaptor>
+
+                            <adaptor id="tf2" class="::scene2D::adaptor::TransferFunction" objectId="imageKey">
+                                <config lineColor="lightGray" circleColor="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="7" viewportUID="${GENERIC_UID}_Viewport" selectedTFKey="SelectedTF" tfSelectionFwID="${GENERIC_UID}_TFSelections" />
+                            </adaptor>
+
+                            <adaptor id="viewportRangeUpdater" class="::scene2D::adaptor::ViewportUpdater" objectId="viewport">
+                                <config xAxis="xAxis" yAxis="yAxis" zValue="9" />
+                            </adaptor>
+
+                            <adaptor id="scaleValuesLeft" class="::scene2D::adaptor::ScaleValues" objectId="self">
+                                <config min="0.0" max="1.0" interval="0.1" fontSize="7" align="left" unit="%" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                            </adaptor>
+
+                            <adaptor id="axisLeft" class="::scene2D::adaptor::Axis" objectId="self">
+                                <config min="0.0" max="1.0" interval="0.1" align="left" tickSize="5" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                            </adaptor>
+
+                            <adaptor id="scaleValuesBottom" class="::scene2D::adaptor::ScaleValues" objectId="self">
+                                <config min="-1024" max="1024" interval="200" fontSize="7" align="bottom" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                            </adaptor>
+
+                            <adaptor id="axisBottom" class="::scene2D::adaptor::Axis" objectId="self">
+                                <config min="-1024" max="1024" interval="100" align="bottom" tickSize="5" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="11" />
+                            </adaptor>
+
+                        </scene>
+
+                    </service>
+
+                    <service uid="${GENERIC_UID}_Scene2D_Shutter" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+                        <scene>
+
+                            <scene x="-1100" y="-1.1" width="2400" height="1.2" />
+
+                            <viewport id="view1" x="-1100" y="-1.1" width="2400" height="1.2" />
+
+                            <axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" />
+                            <axis id="yAxis" origin="0.0" scale="-1.0" scaleType="LINEAR" />
+
+                            <axis id="axeHistogramY" origin="0.0" scale="-0.000001" scaleType="LINEAR" />
+
+                            <adaptor id="shutterGrid" class="::scene2D::adaptor::Grid2D" objectId="self">
+                                <config xMin="-1200" xMax="1400" yMin="-0.7" yMax="1.7" xSpacing="200" ySpacing="0.2" viewportUID="${GENERIC_UID}_Viewport" color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="1" />
+                            </adaptor>
+
+                            <adaptor id="shutterAbscissa" class="::scene2D::adaptor::Line" objectId="self">
+                                <config x1="-1200" x2="1400" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" />
+                            </adaptor>
+
+                            <adaptor id="shutterOrdinate" class="::scene2D::adaptor::Line" objectId="self">
+                                <config x1="0" x2="0" y1="-0.1" y2="1.2" color="white" xAxis="xAxis" yAxis="yAxis" zValue="3" />
+                            </adaptor>
+
+                            <adaptor id="shutterHistogram" class="::scene2D::adaptor::Histogram" objectId="histogram">
+                                <config color="green" xAxis="xAxis" yAxis="axeHistogramY" zValue="4" />
+                            </adaptor>
+
+                            <adaptor id="viewportRangeSelector" class="::scene2D::adaptor::ViewportRangeSelector" objectId="viewport">
+                                <config xAxis="xAxis" yAxis="yAxis" zValue="5" initialWidth="1200" initialPos="-700" />
+                            </adaptor>
+
+                        </scene>
+
+                    </service>
+
+
+                    <item key="TFSelectionsKey">
+                        <object uid="${GENERIC_UID}_TFSelections" type="::fwData::Composite" />
+                    </item>
+
+                    <item key="optionalModelSeriesCompositeKey">
+                        <object uid="${optionalModelSeriesCompositeUid}" src="ref" type="::fwData::Composite">
+                        </object>
+                    </item>
+
+                    <item key="imageKey">
+                        <object uid="${imageUid}" src="ref" type="::fwData::Image">
+
+                            <service uid="${GENERIC_UID}_LockImageSrv" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+
+                            <service uid="${GENERIC_UID}_MedicalImageSrv" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="no" />
+
+                            <service uid="${GENERIC_UID}_cfgNegato" impl="::fwServices::SConfigController" autoConnect="no">
+                                <config>
+                                    <appConfig id="2DNegatoWithTF" >
+                                        <parameters>
+                                            <parameter replace="imageUid" by="self"  />
+                                            <parameter replace="TFSelectionsUid" by="${GENERIC_UID}_TFSelections"  />
+                                            <parameter replace="selectedTFKey" by="SelectedTF"  />
+                                            <parameter replace="patient_name" by="${patient_name}" />
+                                            <parameter replace="WID_PARENT" by="${GENERIC_UID}_view_negato"  />
+                                        </parameters>
+                                    </appConfig>
+                                </config>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_ActionHideCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                <crossType>hide</crossType>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_ActionShowNormalCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                <crossType>half</crossType>
+                                <state active="true" />
+                            </service>
+
+                            <service uid="${GENERIC_UID}_ActionShowFullCross" type="::fwGui::IActionSrv" impl="::uiVisu::action::CrossTypeAction" autoConnect="no">
+                                <crossType>full</crossType>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_ActionShowHideBoxWidget" type="::fwGui::IActionSrv" impl="::gui::action::ActionNotifyService" autoConnect="no">
+                                <notify type="::fwServices::ObjectMsg" event="SHOWHIDE_BOX_WIDGET" />
+                            </service>
+
+                            <service uid="${GENERIC_UID}_ActionResetBoxWidget" type="::fwGui::IActionSrv" impl="::gui::action::ActionNotifyService" autoConnect="no">
+                                <notify type="::fwServices::ObjectMsg" event="RESET_BOX_WIDGET" />
+                            </service>
+
+                            <service uid="${GENERIC_UID}_FieldManager" impl="::ctrlSelection::manager::SField" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+                                <mode type="stop" />
+                                <config>
+                                    <field id="m_transferFunctionCompositeId" type="::fwData::Composite">
+                                        <service uid="${GENERIC_UID}_tfm" type="::gui::editor::IEditor" impl="::uiTF::TransferFunctionEditor" autoConnect="yes">
+                                            <config selectedTFKey="SelectedTF" tfSelectionFwID="${GENERIC_UID}_TFSelections" />
+                                        </service>
+                                    </field>
+                                </config>
+                            </service>
+
+                            <service uid="${GENERIC_UID}_computeHistogram" type="::fwServices::IController" impl="::scene2D::processing::SComputeHistogram" autoConnect="yes" worker="COMPUTING_THREAD" >
+                                <histogramId>${GENERIC_UID}_Histogram</histogramId>
+                                <binsWidth>5.0</binsWidth>
+                            </service>
+
+                        </object>
+                    </item>
+
+
+
+                    <item key="viewport">
+                        <object uid="${GENERIC_UID}_Viewport" type="::scene2D::data::Viewport" />
+                    </item>
+
+                    <item key="histogram">
+                        <object uid="${GENERIC_UID}_Histogram" type="::fwData::Histogram" />
+                    </item>
+
+                    <item key="histogramPoint">
+                        <object uid="${GENERIC_UID}_HistogramPoint" type="::fwData::Point" />
+                    </item>
+
+                    <item key="LightSelection">
+                        <object uid="${GENERIC_UID}_LightSelection" type="::fwData::Composite">
+
+                            <service uid="${GENERIC_UID}_LightSwapper" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+                                <mode type="stop" />
+                                <config>
+                                    <object id="selectedLight" type="::fwData::Composite">
+                                    </object>
+                                </config>
+                            </service>
+
+                        </object>
+                    </item>
+
+
+                </object>
+            </item>
+
+
+            <!-- START AND STOP SERVICES -->
+            <start uid="${GENERIC_UID}_LockImageSrv" />
+            <start uid="${GENERIC_UID}_mainView" />
+            <start uid="${GENERIC_UID}_Scene2D_Shutter" />
+            <start uid="${GENERIC_UID}_Scene2D" />
+            <start uid="${GENERIC_UID}_computeHistogram" />
+            <start uid="${GENERIC_UID}_MedicalImageSrv" />
+            <start uid="${GENERIC_UID}_LightSwapper" />
+            <start uid="${GENERIC_UID}_vr" />
+            <start uid="${GENERIC_UID}_FieldManager" />
+            <start uid="${GENERIC_UID}_cfgNegato" />
+            <start uid="${GENERIC_UID}_managerModelSeries" />
+
+        </object>
+
+
+    </config>
+</extension>
diff --git a/Bundles/LeafActivity/volumeRenderingActivity/rc/plugin.xml b/Bundles/LeafActivity/volumeRenderingActivity/rc/plugin.xml
new file mode 100644
index 0000000..4981ce1
--- /dev/null
+++ b/Bundles/LeafActivity/volumeRenderingActivity/rc/plugin.xml
@@ -0,0 +1,33 @@
+<plugin id="volumeRenderingActivity">
+
+    <requirement id="servicesReg" />
+    <requirement id="2DVisualizationActivity" />
+    <requirement id="3DVisualizationActivity" />
+    <requirement id="visuVTKVRAdaptor" />
+    <requirement id="scene2D" />
+    <requirement id="uiTF" />
+    <requirement id="uiIO" />
+    <requirement id="media" />
+
+    <xi:include href="configurations/VolumeRendering.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>VolumeRendering</id>
+        <title>Volume rendering</title>
+        <desc>Volume rendering activity</desc>
+        <icon>Bundles/media_0-1/icons/icon-VR.png</icon>
+        <requirements>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="1" maxOccurs="1" />
+            <requirement name="modelSeries" type="::fwMedData::ModelSeries" minOccurs="0" maxOccurs="1" >
+                <key>optionalModelSeriesKey</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="VolumeRendering">
+            <parameters>
+                <parameter replace="imageUid" by="@values.imageSeries.image" />
+                <parameter replace="optionalModelSeriesCompositeUid" by="@values.modelSeries" />
+            </parameters>
+        </appConfig>
+    </extension>
+</plugin>
diff --git a/Bundles/LeafAtomFilter/filterVRRender/CMakeLists.txt b/Bundles/LeafAtomFilter/filterVRRender/CMakeLists.txt
new file mode 100644
index 0000000..c7db60f
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/CMakeLists.txt
@@ -0,0 +1,4 @@
+
+fwLoadProperties()
+
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/Properties.cmake b/Bundles/LeafAtomFilter/filterVRRender/Properties.cmake
new file mode 100644
index 0000000..48b33d9
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/Properties.cmake
@@ -0,0 +1,15 @@
+
+
+set( NAME filterVRRender )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES 
+    fwCore
+    fwAtoms
+    fwAtomsFilter
+    fwAtomsPatch
+    fwRuntime
+)
+
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/bin/build.options b/Bundles/LeafAtomFilter/filterVRRender/bin/build.options
new file mode 100644
index 0000000..ea4584b
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/bin/build.options
@@ -0,0 +1,11 @@
+TYPE = 'bundle'
+VERSION = '0-1'
+USE = []
+LIB = [
+    'fwCore_0-1',
+    'fwAtoms_0-1',
+    'fwAtomsFilter_0-1',
+    'fwAtomsPatch_0-1',
+    'fwRuntime_0-3',
+    'fwActivities_0-1',
+    ]
diff --git a/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV1.hpp b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV1.hpp
new file mode 100644
index 0000000..30f06e8
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV1.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FILTERVRRENDER_MEDICALDATAV1_HPP__
+#define __FILTERVRRENDER_MEDICALDATAV1_HPP__
+
+#include <fwAtomsFilter/IFilter.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "filterVRRender/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace filterVRRender
+{
+
+/**
+ * @class MedicalDataV1
+ * @brief Filter associated to context "MedicalData" version "V1" in VR-Render.
+ *
+ * This filter clears "processingDB" and "planningDB" keys from a "MedicalWorkspace" composite.
+ */
+class FILTERVRRENDER_CLASS_API MedicalDataV1 : public ::fwAtomsFilter::IFilter
+{
+
+public:
+    /// Constructor.
+    MedicalDataV1(::fwAtomsFilter::IFilter::Key key);
+
+    /// Destructor.
+    ~MedicalDataV1();
+
+    /// Apply filter onto given atom object.
+    FILTERVRRENDER_API virtual void apply(const SPTR(::fwAtoms::Object)& atom);
+};
+
+} // namespace filterVRRender
+
+#endif // __FILTERVRRENDER_MEDICALDATAV1_HPP__
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV2.hpp b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV2.hpp
new file mode 100644
index 0000000..5719e8d
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/MedicalDataV2.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FILTERVRRENDER_MEDICALDATAV2_HPP__
+#define __FILTERVRRENDER_MEDICALDATAV2_HPP__
+
+#include <fwAtomsFilter/IFilter.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "filterVRRender/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace filterVRRender
+{
+
+/**
+ * @class MedicalDataV2
+ * @brief Filter associated to context "MedicalData" version "V2" in VR-Render.
+ *
+ */
+class FILTERVRRENDER_CLASS_API MedicalDataV2 : public ::fwAtomsFilter::IFilter
+{
+
+public:
+    /// Constructor.
+    MedicalDataV2(::fwAtomsFilter::IFilter::Key key);
+
+    /// Destructor.
+    ~MedicalDataV2();
+
+    /// Apply filter onto given atom object.
+    FILTERVRRENDER_API virtual void apply(const SPTR(::fwAtoms::Object)& atom);
+};
+
+} // namespace filterVRRender
+
+#endif // __FILTERVRRENDER_MEDICALDATAV2_HPP__
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/Plugin.hpp b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/Plugin.hpp
new file mode 100644
index 0000000..1ac4f83
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/Plugin.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FILTERVRRENDER_PLUGIN_HPP__
+#define __FILTERVRRENDER_PLUGIN_HPP__
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace filterVRRender
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    //! @brief Destructor.
+    ~Plugin() throw();
+
+    /**
+     * @brief Start method.
+     *
+     * This method is used by runtime in order to initialize the bundle.
+     *
+     * @exception ::fwRuntime::RuntimeException
+     */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief Stop method.
+     *
+     * This method is used by runtime in order to close the bundle.
+     */
+    void stop() throw();
+
+};
+
+} // namespace filterVRRender
+
+#endif //__FILTERVRRENDER_PLUGIN_HPP__
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/config.hpp b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/config.hpp
new file mode 100644
index 0000000..c9f8dbe
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/include/filterVRRender/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FILTERVRRENDER_CONFIG_HPP_
+#define _FILTERVRRENDER_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FILTERVRRENDER_EXPORTS
+    #define FILTERVRRENDER_API __declspec(dllexport)
+    #else
+    #define FILTERVRRENDER_API __declspec(dllimport)
+    #endif
+
+    #define FILTERVRRENDER_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FILTERVRRENDER_EXPORTS
+    #define FILTERVRRENDER_API __attribute__ ((visibility("default")))
+    #define FILTERVRRENDER_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define FILTERVRRENDER_API __attribute__ ((visibility("hidden")))
+    #define FILTERVRRENDER_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define FILTERVRRENDER_API
+    #define FILTERVRRENDER_CLASS_API
+
+#endif
+
+#endif //_FILTERVRRENDER_CONFIG_HPP_
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/rc/plugin.xml b/Bundles/LeafAtomFilter/filterVRRender/rc/plugin.xml
new file mode 100644
index 0000000..f41d57e
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/rc/plugin.xml
@@ -0,0 +1,6 @@
+<plugin id="filterVRRender" class="::filterVRRender::Plugin" >
+
+    <library name="filterVRRender" />
+
+</plugin>
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV1.cpp b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV1.cpp
new file mode 100644
index 0000000..d481abc
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV1.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwAtomsFilter/registry/macros.hpp>
+
+#include "filterVRRender/MedicalDataV1.hpp"
+
+namespace filterVRRender
+{
+
+fwAtomsFilterRegisterMacro( ::filterVRRender::MedicalDataV1, "VRRenderMedicalDataV1" );
+
+MedicalDataV1::MedicalDataV1(::fwAtomsFilter::IFilter::Key key)
+{}
+
+MedicalDataV1::~MedicalDataV1()
+{}
+
+void clearMapAttribute(const std::string& key, const ::fwAtoms::Map::sptr& values)
+{
+    if(values->find(key) != values->end())
+    {
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast( (*values)[key] );
+        SLM_ASSERT("Failed to retrieve key '" + key + "' from atom", obj);
+
+        ::fwAtoms::Map::sptr objValues = obj->getAttribute< ::fwAtoms::Map >("values");
+        SLM_ASSERT("Failed to retrieve 'values' attribute as ::fwAtoms::Map", objValues);
+        objValues->clear();
+    }
+}
+
+void MedicalDataV1::apply(const SPTR(::fwAtoms::Object)& atom)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Unable to filter atom : invalid object", atom);
+
+    const std::string& classname = ::fwAtomsPatch::helper::getClassname(atom);
+    FW_RAISE_IF("Unable to filter atom of class '" << classname << "'. Expected class is '::fwData::Composite'",
+            classname != "::fwData::Composite");
+
+    ::fwAtoms::Map::sptr values = atom->getAttribute< ::fwAtoms::Map >("values");
+    SLM_ASSERT("Failed to retrieve 'values' attribute as ::fwAtoms::Map", values);
+
+    clearMapAttribute("processingDB", values);
+    clearMapAttribute("planningDB", values);
+}
+
+}
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV2.cpp b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV2.cpp
new file mode 100644
index 0000000..0371469
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/MedicalDataV2.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwAtomsFilter/registry/macros.hpp>
+#include <fwAtomsFilter/functions.hpp>
+
+#include "filterVRRender/MedicalDataV2.hpp"
+
+namespace filterVRRender
+{
+
+fwAtomsFilterRegisterMacro( ::filterVRRender::MedicalDataV2, "VRRenderMedicalDataV2" );
+
+MedicalDataV2::MedicalDataV2(::fwAtomsFilter::IFilter::Key key)
+{}
+
+MedicalDataV2::~MedicalDataV2()
+{}
+
+void MedicalDataV2::apply(const SPTR(::fwAtoms::Object)& atom)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Unable to filter atom : invalid object", atom);
+
+    const std::string expName = "::fwMedData::SeriesDB";    // expected classname 
+    const std::string& classname = ::fwAtomsPatch::helper::getClassname(atom);
+    FW_RAISE_IF("Unable to filter atom of class '" << classname << "'. Expected class is '" + expName + "'",
+            classname != expName);
+
+    ::fwAtoms::Sequence::sptr series = atom->getAttribute< ::fwAtoms::Sequence >("values");
+    SLM_ASSERT("Failed to retrieve 'values' attribute as ::fwAtoms::Sequence", series);
+
+    ::fwAtoms::Sequence::sptr knownSeries = ::fwAtoms::Sequence::New();
+    BOOST_FOREACH(::fwAtoms::Base::sptr serie, series->getValue())
+    {
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast(serie);
+        SLM_ASSERT("Failed to cast sequence element as ::fwAtoms::Object", obj);
+
+        if(::fwAtomsFilter::isSeriesKnown(obj))
+        {
+            knownSeries->push_back(serie);
+        }
+    }
+
+    series->clear();
+    BOOST_FOREACH(::fwAtoms::Base::sptr serie, knownSeries->getValue())
+    {
+        series->push_back(serie);
+    }
+}
+
+} // namespace filterVRRender
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/Plugin.cpp b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/Plugin.cpp
new file mode 100644
index 0000000..d4371bf
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/src/filterVRRender/Plugin.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "filterVRRender/Plugin.hpp"
+
+namespace filterVRRender
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::filterVRRender::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace filterVRRender
+
diff --git a/Bundles/LeafAtomFilter/filterVRRender/test/cppunit.options b/Bundles/LeafAtomFilter/filterVRRender/test/cppunit.options
new file mode 100644
index 0000000..a46a55c
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/test/cppunit.options
@@ -0,0 +1,16 @@
+CLASSTEST=[
+          'MedicalDataV1Test',
+          ]
+
+USE = ['boost']
+LIB = [
+       'fwAtomsFilter_0-1',
+       'fwAtomsPatch_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwTest_0-1',
+       ]
+
+BUNDLES = []
+REQUIREMENTS = ['filterVRRender_0-1', 'dataReg_0-1', 'servicesReg_0-1']
+CONSOLE = 'yes'
diff --git a/Bundles/LeafAtomFilter/filterVRRender/test/tu/include/MedicalDataV1Test.hpp b/Bundles/LeafAtomFilter/filterVRRender/test/tu/include/MedicalDataV1Test.hpp
new file mode 100644
index 0000000..d2db152
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/test/tu/include/MedicalDataV1Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FILTERVRRENDER_UT_MEDICALDATAV1TEST_HPP__
+#define __FILTERVRRENDER_UT_MEDICALDATAV1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace filterVRRender
+{
+namespace ut
+{
+
+/**
+ * @brief Test ::fwAtomsFilter::IFilter::apply method.
+ */
+class MedicalDataV1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MedicalDataV1Test );
+    CPPUNIT_TEST( applyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    /**
+     * @name Interface
+     * @{ */
+    void setUp();
+    void tearDown();
+    /**  @} */
+
+    void applyTest();
+
+};
+
+} // namespace ut
+} // namespace filterVRRender
+
+#endif //__FILTERVRRENDER_UT_MEDICALDATAV1TEST_HPP__
diff --git a/Bundles/LeafAtomFilter/filterVRRender/test/tu/rc/profile.xml b/Bundles/LeafAtomFilter/filterVRRender/test/tu/rc/profile.xml
new file mode 100644
index 0000000..bda90bf
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/test/tu/rc/profile.xml
@@ -0,0 +1,10 @@
+<profile name="MedicalDataV1Test" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="filterVRRender" version="0-1" />
+
+    <start id="filterVRRender" />
+
+</profile>
diff --git a/Bundles/LeafAtomFilter/filterVRRender/test/tu/src/MedicalDataV1Test.cpp b/Bundles/LeafAtomFilter/filterVRRender/test/tu/src/MedicalDataV1Test.cpp
new file mode 100644
index 0000000..c63fd04
--- /dev/null
+++ b/Bundles/LeafAtomFilter/filterVRRender/test/tu/src/MedicalDataV1Test.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwAtomsFilter/IFilter.hpp>
+
+#include "MedicalDataV1Test.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::filterVRRender::ut::MedicalDataV1Test );
+
+namespace filterVRRender
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void MedicalDataV1Test::setUp()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalDataV1Test::tearDown()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalDataV1Test::applyTest()
+{
+    ::fwAtomsFilter::IFilter::sptr filter = ::fwAtomsFilter::factory::New("VRRenderMedicalDataV1");
+    SLM_ASSERT("Failed to instantiate filter", filter);
+
+    ::fwAtoms::Map::sptr valuesPatientDB = ::fwAtoms::Map::New();
+    valuesPatientDB->insert("patient1", ::fwAtoms::Object::New());
+    valuesPatientDB->insert("patient2", ::fwAtoms::Object::New());
+
+    ::fwAtoms::Map::sptr valuesProcessingDB = ::fwAtoms::Map::New();
+    valuesProcessingDB->insert("processing1", ::fwAtoms::Object::New());
+    valuesProcessingDB->insert("processing2", ::fwAtoms::Object::New());
+
+    ::fwAtoms::Map::sptr valuesPlanningDB = ::fwAtoms::Map::New();
+    valuesPlanningDB->insert("planning1", ::fwAtoms::Object::New());
+    valuesPlanningDB->insert("planning2", ::fwAtoms::Object::New());
+
+
+    // Create patientDB
+    ::fwAtoms::Object::sptr patientDB = ::fwAtoms::Object::New();
+    patientDB->setAttribute("values", valuesPatientDB);
+
+    // Create processingDB
+    ::fwAtoms::Object::sptr processingDB = ::fwAtoms::Object::New();
+    processingDB->setAttribute("values", valuesProcessingDB);
+
+    // Create planningDB
+    ::fwAtoms::Object::sptr planningDB = ::fwAtoms::Object::New();
+    planningDB->setAttribute("values", valuesPlanningDB);
+
+    // Create medical workspace
+    ::fwAtoms::Map::sptr valuesMedicalWorkspace = ::fwAtoms::Map::New();
+    valuesMedicalWorkspace->insert("processingDB", processingDB);
+    valuesMedicalWorkspace->insert("planningDB", planningDB);
+    valuesMedicalWorkspace->insert("patientDB", patientDB);
+
+    ::fwAtoms::Object::sptr medicalWorkspace = ::fwAtoms::Object::New();
+    ::fwAtomsPatch::helper::setClassname(medicalWorkspace, "::fwData::Composite");
+    medicalWorkspace->setAttribute("values", valuesMedicalWorkspace);
+
+    filter->apply(medicalWorkspace);
+
+    CPPUNIT_ASSERT(valuesPlanningDB->empty());
+    CPPUNIT_ASSERT(valuesProcessingDB->empty());
+    CPPUNIT_ASSERT(valuesPatientDB->size() == 2);
+    CPPUNIT_ASSERT(valuesMedicalWorkspace->find("processingDB") != valuesMedicalWorkspace->end());
+    CPPUNIT_ASSERT(valuesMedicalWorkspace->find("planningDB") != valuesMedicalWorkspace->end());
+    CPPUNIT_ASSERT(valuesMedicalWorkspace->find("patientDB") != valuesMedicalWorkspace->end());
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace filterVRRender
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/CMakeLists.txt b/Bundles/LeafCtrl/ctrlMemory/CMakeLists.txt
new file mode 100644
index 0000000..839fa76
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/CMakeLists.txt
@@ -0,0 +1,10 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRuntime
+    fwServices
+
+    ctrlSelection
+)
+
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/COPYING b/Bundles/LeafCtrl/ctrlMemory/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/COPYING.LESSER b/Bundles/LeafCtrl/ctrlMemory/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/Properties.cmake b/Bundles/LeafCtrl/ctrlMemory/Properties.cmake
new file mode 100644
index 0000000..6c19e42
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ctrlMemory )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwRuntime fwServices ctrlSelection )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/bin/build.options b/Bundles/LeafCtrl/ctrlMemory/bin/build.options
new file mode 100644
index 0000000..82b9df5
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/bin/build.options
@@ -0,0 +1,7 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = ['fwData_0-1','fwServices_0-1','fwComEd_0-1','fwRuntime_0-3','fwCore_0-1','fwMemory_0-1','fwTools_0-1']
+BUNDLES = ['ctrlSelection_0-1']
+
+
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/LockDumpSrv.hpp b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/LockDumpSrv.hpp
new file mode 100644
index 0000000..cf55725
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/LockDumpSrv.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __CTRLMEMORY_LOCKDUMPSRV_HPP__
+#define __CTRLMEMORY_LOCKDUMPSRV_HPP__
+
+#include <fwData/ObjectLock.hpp>
+
+#include <fwServices/IController.hpp>
+
+#include "ctrlMemory/config.hpp"
+
+namespace fwServices
+{
+    class ObjectMsg;
+}
+
+namespace ctrlMemory
+{
+
+/**
+ * @class  LockDumpSrv
+ * @brief  This services dump lock object. Unlock it on stopping.
+ */
+class CTRLMEMORY_CLASS_API LockDumpSrv : public ::fwServices::IController
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (LockDumpSrv)(::fwServices::IController) ) ;
+
+    /// Constructor. Does nothing
+    CTRLMEMORY_API LockDumpSrv() throw() ;
+
+    /// Destructor. Does nothing
+    CTRLMEMORY_API virtual ~LockDumpSrv() throw() ;
+
+protected:
+
+    /// Uses ::fwData::ObjectLock to dump lock the associated data
+    CTRLMEMORY_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Dump unlock the associated data
+    CTRLMEMORY_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void info( std::ostream &_sstream );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    ::fwData::ObjectLock m_objLock;
+
+};
+
+} // ctrlMemory
+
+#endif // __CTRLMEMORY_LOCKDUMPSRV_HPP__
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/Plugin.hpp b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/Plugin.hpp
new file mode 100644
index 0000000..2b9470d
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/Plugin.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLMEMORY_PLUGIN_HPP_
+#define _CTRLMEMORY_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace ctrlMemory
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+
+public :
+
+    /// PLugin destructor
+    ~Plugin() throw();
+
+    /// This method is used by runtime to initialize the bundle.
+    void start() throw( ::fwRuntime::RuntimeException );
+
+    /// This method is used by runtime to stop the bundle.
+    void stop() throw();
+
+};
+
+} // namespace ctrlMemory
+
+#endif // _CTRLMEMORY_PLUGIN_HPP_
diff --git a/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/config.hpp b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/config.hpp
new file mode 100644
index 0000000..4955121
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLMEMORY_CONFIG_HPP_
+#define _CTRLMEMORY_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef CTRLMEMORY_EXPORTS
+    #define CTRLMEMORY_API __declspec(dllexport)
+    #else
+    #define CTRLMEMORY_API __declspec(dllimport)
+    #endif
+
+    #define CTRLMEMORY_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef CTRLMEMORY_EXPORTS
+    #define CTRLMEMORY_API __attribute__ ((visibility("default")))
+    #define CTRLMEMORY_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define CTRLMEMORY_API __attribute__ ((visibility("hidden")))
+    #define CTRLMEMORY_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define CTRLMEMORY_API
+    #define CTRLMEMORY_CLASS_API
+
+#endif
+
+#endif // _CTRLMEMORY_CONFIG_HPP_
diff --git a/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/manager/LockDumpManagerSrv.hpp b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/manager/LockDumpManagerSrv.hpp
new file mode 100644
index 0000000..dfaa183
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/manager/LockDumpManagerSrv.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __CTRLMEMORY_MANAGER_LOCKDUMPMANAGERSRV_HPP__
+#define __CTRLMEMORY_MANAGER_LOCKDUMPMANAGERSRV_HPP__
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include <ctrlSelection/IManagerSrv.hpp>
+
+#include "ctrlMemory/config.hpp"
+
+namespace fwData
+{
+    class ObjectLock;
+    class Composite;
+}
+
+namespace fwServices
+{
+    class ObjectMsg;
+}
+
+namespace ctrlMemory
+{
+
+namespace manager
+{
+
+/**
+ * @brief This service allows to lock an object for dump when it is contained in the composite.
+ * @class LockDumpManagerSrv
+ */
+class CTRLMEMORY_CLASS_API LockDumpManagerSrv : public ::ctrlSelection::IManagerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (LockDumpManagerSrv)(::ctrlSelection::IManagerSrv) ) ;
+
+    /// Constructor.  Does nothing.
+    CTRLMEMORY_API LockDumpManagerSrv() throw() ;
+
+    /// Destructor. Does nothing.
+    CTRLMEMORY_API virtual ~LockDumpManagerSrv() throw() ;
+
+protected :
+
+    /// Dump lock composite objects
+    CTRLMEMORY_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Dump unlock composite objects
+    CTRLMEMORY_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Does nothing
+    CTRLMEMORY_API virtual void info( std::ostream &_sstream );
+
+    /**
+     * @brief Implements configuring method.
+     * configuration \<manageLockOn key="CompositeObjectKey" /\>
+     * if configuration is empty, service locks all composite objects
+     */
+    CTRLMEMORY_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Updates dump locks when object are pushed removed or swaped in composite
+    CTRLMEMORY_API virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    typedef std::string CompositeKeyType;
+
+    typedef std::map< CompositeKeyType, ::fwData::ObjectLock > LockMapType;
+
+    /// Add or remove lock ( _isLocked parameter ) on composite objects
+    void setDumpLockOnImages(LockMapType &lockMap, SPTR(::fwData::Composite) _composite, bool _isLocked );
+
+    /// Composite keys managed by this service
+    std::vector< std::string > m_managedKeys;
+
+    /// Container to manages dump lock on composite sub object
+    LockMapType m_lockedObjects;
+};
+
+} // manager
+} // ctrlMemory
+
+#endif // __CTRLMEMORY_MANAGER_LOCKDUMPMANAGERSRV_HPP__
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/namespace.hpp b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/namespace.hpp
new file mode 100644
index 0000000..e35d27f
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/include/ctrlMemory/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __CTRLMEMORY_MANAGER_NAMESPACE_HPP__
+#define __CTRLMEMORY_MANAGER_NAMESPACE_HPP__
+
+
+/**
+ * @brief   The namespace ctrlMemory contains services to lock objects to prevent dump.
+ * @namespace   ctrlMemory
+ */
+namespace ctrlMemory
+{
+/**
+ * @brief       The namespace ctrlMemory::manager contains a lock dump manager for image.
+ * @namespace   ctrlMemory::manager
+ *
+ */
+namespace manager
+{
+}
+
+#endif // __CTRLMEMORY_MANAGER_NAMESPACE_HPP__
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/rc/plugin.xml b/Bundles/LeafCtrl/ctrlMemory/rc/plugin.xml
new file mode 100644
index 0000000..731f052
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/rc/plugin.xml
@@ -0,0 +1,24 @@
+<plugin id="ctrlMemory" class="::ctrlMemory::Plugin" >
+    
+    <library name="ctrlMemory" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="ctrlSelection" />
+        
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IManagerSrv</type>
+        <service>::ctrlMemory::manager::LockDumpManagerSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::ctrlMemory::LockDumpSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+</plugin>
+
+
+
diff --git a/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/LockDumpSrv.cpp b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/LockDumpSrv.cpp
new file mode 100644
index 0000000..5bb3c6e
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/LockDumpSrv.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include "ctrlMemory/LockDumpSrv.hpp"
+
+namespace ctrlMemory
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController, ::ctrlMemory::LockDumpSrv, ::fwData::Object );
+
+//-----------------------------------------------------------------------------
+
+LockDumpSrv::LockDumpSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+LockDumpSrv::~LockDumpSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::starting()  throw ( ::fwTools::Failed )
+{
+   m_objLock = ::fwData::ObjectLock( this->getObject() );
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    m_objLock = ::fwData::ObjectLock();
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::configuring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // ctrlMemory
diff --git a/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/Plugin.cpp b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/Plugin.cpp
new file mode 100644
index 0000000..4a3372f
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/Plugin.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "ctrlMemory/Plugin.hpp"
+
+namespace ctrlMemory
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::ctrlMemory::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace ctrlMemory
diff --git a/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/manager/LockDumpManagerSrv.cpp b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/manager/LockDumpManagerSrv.cpp
new file mode 100644
index 0000000..fb528d6
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlMemory/src/ctrlMemory/manager/LockDumpManagerSrv.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/ObjectLock.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+
+#include "ctrlMemory/manager/LockDumpManagerSrv.hpp"
+
+namespace ctrlMemory
+{
+
+namespace manager
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IManagerSrv, ::ctrlMemory::manager::LockDumpManagerSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+LockDumpManagerSrv::LockDumpManagerSrv() throw()
+{
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS );
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS );
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS );
+}
+
+//-----------------------------------------------------------------------------
+
+LockDumpManagerSrv::~LockDumpManagerSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(message);
+    if(compositeMsg)
+    {
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getAddedKeys();
+            this->setDumpLockOnImages(m_lockedObjects, fields,true);
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields;
+            LockMapType newLocks = m_lockedObjects;
+
+            fields = compositeMsg->getOldChangedKeys();
+            this->setDumpLockOnImages(newLocks, fields,false);
+
+            fields = compositeMsg->getNewChangedKeys();
+            this->setDumpLockOnImages(newLocks, fields,true);
+
+            m_lockedObjects = newLocks;
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getRemovedKeys();
+            this->setDumpLockOnImages(m_lockedObjects, fields,false);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::setDumpLockOnImages( LockMapType &lockMap, ::fwData::Composite::sptr _composite, bool _isLocked )
+{
+    BOOST_FOREACH( ::fwData::Composite::value_type objectId, *_composite )
+    {
+        if ( m_managedKeys.empty()
+                || std::find(m_managedKeys.begin(), m_managedKeys.end(), objectId.first) != m_managedKeys.end() )
+        {
+            if (_isLocked)
+            {
+                lockMap.insert( LockMapType::value_type( objectId.first, ::fwData::ObjectLock( objectId.second ) ) );
+                OSLM_TRACE("Locking Key : " << objectId.first);
+            }
+            else
+            {
+                SLM_ASSERT( "ERROR image not locked !!!", lockMap.find(objectId.first) != lockMap.end() );
+                lockMap.erase( objectId.first );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::starting()  throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    this->setDumpLockOnImages(m_lockedObjects, composite, true);
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    m_lockedObjects.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    ::fwRuntime::ConfigurationElementContainer updaters = m_configuration->findAllConfigurationElement("manageLockOn");
+
+    m_managedKeys.clear();
+
+    for(    ::fwRuntime::ConfigurationElementContainer::Iterator item = updaters.begin();
+            item != updaters.end();
+            ++item )
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"key\" is missing", !(*item)->hasAttribute("key") );
+        std::string key =  (*item)->getExistingAttributeValue("key");
+        m_managedKeys.push_back(key);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void LockDumpManagerSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // manager
+
+} // ctrlMemory
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/CMakeLists.txt b/Bundles/LeafCtrl/ctrlSelection/CMakeLists.txt
new file mode 100644
index 0000000..234dea5
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/CMakeLists.txt
@@ -0,0 +1,11 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwData
+    fwRuntime
+    fwServices
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/COPYING b/Bundles/LeafCtrl/ctrlSelection/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/COPYING.LESSER b/Bundles/LeafCtrl/ctrlSelection/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/Properties.cmake b/Bundles/LeafCtrl/ctrlSelection/Properties.cmake
new file mode 100644
index 0000000..998ec1e
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ctrlSelection )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwComEd fwCore fwData fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/bin/build.options b/Bundles/LeafCtrl/ctrlSelection/bin/build.options
new file mode 100644
index 0000000..9c64cf4
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/bin/build.options
@@ -0,0 +1,14 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwComEd_0-1',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1'
+          ]
+BUNDLE  = []
+USE = [
+    'boost',
+    ]
\ No newline at end of file
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/BookmarkSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/BookmarkSrv.hpp
new file mode 100644
index 0000000..494606d
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/BookmarkSrv.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_BOOKMARKSRV_HPP_
+#define _CTRLSELECTION_BOOKMARKSRV_HPP_
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IController.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+namespace ctrlSelection
+{
+
+
+/**
+ * @class  BookmarkSrv
+ * @brief  This service bookmark its object with the name given in configuration.
+ * 
+
+ * @date   2011.
+ */
+class CTRLSELECTION_CLASS_API BookmarkSrv : public ::fwServices::IController
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (BookmarkSrv)(::fwServices::IController) ) ;
+
+    CTRLSELECTION_API BookmarkSrv() throw() ;
+
+    CTRLSELECTION_API virtual ~BookmarkSrv() throw() ;
+
+protected:
+
+    /// Adds the object in bookmark.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Removes the object from bookmark
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Do nothing
+    CTRLSELECTION_API virtual void swapping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @verbatim
+       <service impl="::ctrlSelection::BookmarkSrv" type="::fwServices::IController" autoConnect="no">
+           <bookmark fromString="..." name="..." />
+       </service>
+       @endverbatim
+     * - \b fromString : prefix of the bookmark key
+     * - \b name : name of the bookmark
+     * The prefix and the name are concatenated as 'prefix_name'.
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Do nothing
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Do nothing
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    /// Do nothing
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+    std::string m_bookmarkName;
+};
+
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_BOOKMARKSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IManagerSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IManagerSrv.hpp
new file mode 100644
index 0000000..d943ae1
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IManagerSrv.hpp
@@ -0,0 +1,137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_IMANAGERSRV_HPP_
+#define _CTRLSELECTION_IMANAGERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+
+namespace ctrlSelection
+{
+
+/**
+ * @class   IManagerSrv
+ * @brief   Base class for manager.
+ * A manager starts, stops or swaps services on object contained in a composite when it receives specific message.
+ * 
+ * @date    2007-2009.
+ */
+class CTRLSELECTION_CLASS_API IManagerSrv : public ::fwServices::IService
+{
+
+public:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::string ObjectIdType;
+
+    fwCoreServiceClassDefinitionsMacro ( (IManagerSrv)(::fwServices::IService) ) ;
+
+    ///@brief IManagerSrv constructor. Do nothing.
+    CTRLSELECTION_API IManagerSrv();
+
+    ///@brief IManagerSrv destructor. Do nothing.
+    CTRLSELECTION_API virtual ~IManagerSrv();
+
+protected:
+
+    /**
+     * @brief Swaps the service from associated object to another object. Stops and starts this service.
+     */
+    CTRLSELECTION_API virtual void swapping() throw ( ::fwTools::Failed );
+
+    typedef std::map< ObjectIdType, ::fwServices::helper::SigSlotConnection::sptr > ObjectConnectionsMapType;
+
+
+
+    /// Used to register proxy connection in order to properly disconnect it.
+    struct ProxyConnections
+    {
+        typedef std::string UIDType;
+        typedef std::string KeyType;
+        typedef std::pair<UIDType, KeyType> ProxyEltType;
+        typedef std::vector<ProxyEltType> ProxyEltVectType;
+
+        std::string m_channel;
+        ProxyEltVectType m_slots;
+        ProxyEltVectType m_signals;
+
+        ProxyConnections(const std::string& channel) : m_channel(channel)
+        {}
+
+        ~ProxyConnections()
+        {}
+
+        void addSlotConnection(UIDType uid, KeyType key)
+        {
+            m_slots.push_back(std::make_pair(uid, key));
+        }
+        void addSignalConnection(UIDType uid, KeyType key)
+        {
+            m_signals.push_back(std::make_pair(uid, key));
+        }
+    };
+    typedef std::vector<ProxyConnections> ProxyConnectionsVectType;
+    typedef std::map< ObjectIdType, ProxyConnectionsVectType > ProxyConnectionsMapType;
+
+    /**
+     * @brief Manages all connections define in config associated to object.
+     * Call manageConnection()
+     *
+     * @param objectId Id of the object
+     * @param object Object associated with the id
+     * @param config configuration for this object
+     */
+    void manageConnections(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config);
+
+    /**
+     * @brief Manages a connection define in config associated to object.
+     *
+     * @param objectId Id of the object
+     * @param object Object associated with the id
+     * @param config configuration for a \<connect\> tag associated this object
+     */
+    void manageConnection(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config);
+
+    /// Disconnects all registred connection for objectId.
+    void removeConnections(const std::string &objectId);
+
+    /**
+     * @brief Manages all proxies connections define in config associated to object
+     * Call manageProxy()
+     *
+     * @param objectId Id of the object
+     * @param object Object associated with the id
+     * @param config configuration for this object
+     */
+    void manageProxies(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config);
+
+    /**
+     * @brief Manages proxy connections define in config associated to object
+     *
+     * @param objectId Id of the object
+     * @param object Object associated with the id
+     * @param config configuration for a \<proxy\> tag associated this object
+     */
+    void manageProxy(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config);
+
+    /// Disconnects all proxies associated to objectId;
+    void disconnectProxies(const std::string &objectId);
+
+    /// Registers connection associated to an object. Connections are connected/disconnected when the object is added/removed.
+    ObjectConnectionsMapType m_objectConnections;
+
+    /// Proxy connection information map : used to properly disconnect proxies
+    ProxyConnectionsMapType m_proxyCtns;
+
+
+};
+
+}
+
+#endif // _CTRLSELECTION_IMANAGERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IUpdaterSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IUpdaterSrv.hpp
new file mode 100644
index 0000000..453433a
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IUpdaterSrv.hpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_IUPDATERSRV_HPP_
+#define _CTRLSELECTION_IUPDATERSRV_HPP_
+
+#include <boost/tuple/tuple.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+
+namespace ctrlSelection
+{
+
+/**
+ * @class   IUpdaterSrv
+ * @brief   An updater is attached on a composite. It is use to add, swap and remove object in the composite when it
+ * receives specific message (declared in configuration) and sends corresponding message message.
+ * It work mainly with a IManager.
+ * 
+ * @date    2007-2009.
+ */
+class CTRLSELECTION_CLASS_API IUpdaterSrv : public ::fwServices::IService
+{
+
+public:
+
+    /// Action to do on object in the composite
+    enum ActionType {
+        ADD,
+        SWAP,
+        REMOVE,
+        DO_NOTHING,
+        REMOVE_IF_PRESENT,
+        ADD_OR_SWAP
+    };
+
+    fwCoreServiceClassDefinitionsMacro ( (IUpdaterSrv)(::fwServices::IService) ) ;
+
+    ///@brief IUpdaterSrv constructor. Do nothing.
+    CTRLSELECTION_API IUpdaterSrv();
+
+    ///@brief IUpdaterSrv destructor. Do nothing.
+    CTRLSELECTION_API virtual ~IUpdaterSrv();
+
+protected:
+
+    /**
+     * @brief Update the object in the composite
+     * @param composite Composite which will contain the object
+     * @param _obj object to add in the composite
+     * @param _compositeKey key of the object in the composite
+     * @param _action action to do with the object
+     * @note the _obj can be null if the action is REMOVE, REMOVE_IF_PRESENT or DO_NOTHING
+     */
+    void updateComposite( ::fwData::Composite::sptr composite, ::fwData::Object::sptr _obj, std::string _compositeKey, ActionType _action );
+
+    /**
+     * @brief Configure the event to manage and its corresponding action
+     * @param configuration configuration of the service
+     *
+     * Sample of declaration configuration :
+     *
+     * @verbatim
+         <update compositeKey="reconstructionKey" onEvent="NEW_RECONSTRUCTION" fromUID="modelSeriesUid" actionType="ADD_OR_SWAP" />
+         <update compositeKey="reconstructionKey" onEvent="CLEAR" fromUID="modelSeriesUid" actionType="REMOVE" />
+       @endverbatim
+     * Here, when the updater receives a message with the NEW_RECONSTRUCTION event from the object "modelSeriesUid" the object reconstructionKey is added or swapped in the composite.
+     * When the updater receives a message with the CLEAR event from the object "modelSeriesUid" the object reconstructionKey is removed from the composite
+     *
+     * The actionType can be : ADD, ADD_OR_SWAP, SWAP, REMOVE, REMOVE_IF_PRESENT and DO_NOTHING
+     */
+    void configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration);
+
+    typedef std::vector < ::boost::tuple< std::string, std::string, std::string, ActionType > > ManagedEvents;
+
+    /// List of the managed event
+    ManagedEvents m_managedEvents;
+};
+
+}
+
+#endif // _CTRLSELECTION_IUPDATERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IWrapperSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IWrapperSrv.hpp
new file mode 100644
index 0000000..d3d1cdc
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/IWrapperSrv.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_IWRAPPERSRV_HPP_
+#define _CTRLSELECTION_IWRAPPERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+
+namespace ctrlSelection
+{
+
+/**
+ * @class   IWrapperSrv
+ * 
+ * @date    2007-2009.
+ * @brief The purpose of this service is to wrap messages incoming to the object to new messages.
+ *
+ * Typically when a generic message as ::fwServices::ObjectMsg::UPDATED_OBJECT is received by the object then a
+ * specific service can translate it to "NEW_BUFFER" for fwData::Image, "CAMERA_MOVING" for camera ....
+ */
+
+
+class CTRLSELECTION_CLASS_API IWrapperSrv : public ::fwServices::IService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (IWrapperSrv)(::fwServices::IService) ) ;
+
+    ///@brief IWrapperSrv constructor. Do nothing.
+    CTRLSELECTION_API IWrapperSrv();
+
+    ///@brief IWrapperSrv destructor. Do nothing.
+    CTRLSELECTION_API virtual ~IWrapperSrv();
+
+};
+
+}
+
+#endif // _CTRLSELECTION_IWRAPPERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/ImageUpdateAxis.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/ImageUpdateAxis.hpp
new file mode 100644
index 0000000..2dd8ee2
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/ImageUpdateAxis.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_IMAGEUPDATEAXIS_HPP_
+#define _CTRLSELECTION_IMAGEUPDATEAXIS_HPP_
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IController.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+namespace ctrlSelection
+{
+
+
+/**
+ * @class  ImageUpdateAxis
+ * @brief  This service updates a fwData::Float given in configuration with the image axis.
+ * 
+
+ * @date   2011.
+ */
+class CTRLSELECTION_CLASS_API ImageUpdateAxis : public ::fwServices::IController
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageUpdateAxis)(::fwServices::IController) ) ;
+
+    CTRLSELECTION_API ImageUpdateAxis() throw() ;
+
+    CTRLSELECTION_API virtual ~ImageUpdateAxis() throw() ;
+
+protected:
+
+    /// Calls updating().
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Does nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Does nothing.
+    CTRLSELECTION_API virtual void swapping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configures the service.
+     *
+     * @verbatim
+       <service type="::fwServices::IController" impl="::ctrlSelection::ImageUpdateAxis" autoConnect="yes">
+           <axis uid="imageAxis" orientation="axial" />
+       </service>
+       @endverbatim
+     * - \b uid : fwID of the ::fwData::Float to update
+     * - \b orientation : image orientation (axial, frontal or sagittal)
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Does nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Updates the float from the image axis orientation.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    /// Receives image event to change axis orientation.
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+
+    /// fwID of the float to update.
+    std::string m_floatID;
+
+    /// Orientation of the image axis.
+    ::fwComEd::helper::MedicalImageAdaptor::Orientation m_orientation;
+};
+
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_IMAGEUPDATEAXIS_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/MedicalImageSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/MedicalImageSrv.hpp
new file mode 100644
index 0000000..2cd97de
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/MedicalImageSrv.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MEDICALIMAGESRV_HPP_
+#define _CTRLSELECTION_MEDICALIMAGESRV_HPP_
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IController.hpp>
+
+#include "ctrlSelection/config.hpp"
+
+namespace ctrlSelection
+{
+
+
+/**
+ * @class  MedicalImageSrv
+ * @brief  This service convert its attached image to a medical image by adding specific fields.
+ * 
+
+ * @date   2010.
+ */
+class CTRLSELECTION_CLASS_API MedicalImageSrv : public ::fwServices::IController
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MedicalImageSrv)(::fwServices::IController) ) ;
+
+
+    CTRLSELECTION_API MedicalImageSrv() throw() ;
+
+    CTRLSELECTION_API virtual ~MedicalImageSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Convert the image.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Implements swapping method derived from IService. Convert the image.
+    CTRLSELECTION_API virtual void swapping()  throw ( ::fwTools::Failed );
+
+    /// Implements configuring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    void convertImage();
+
+    std::vector< std::string > m_imageCompositeKeys;
+};
+
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MEDICALIMAGESRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Namespace.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Namespace.hpp
new file mode 100644
index 0000000..c95f609
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef CTRLSELECTIONNAMESPACE_HPP_
+#define CTRLSELECTIONNAMESPACE_HPP_
+
+/**
+ * @brief      The namespace ctrlSelection contains several interfaces for manager, updater and wrapper.
+ * @namespace  ctrlSelection
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace ctrlSelection
+{
+
+}
+#endif /* CTRLSELECTIONNAMESPACE_HPP_ */
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Plugin.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Plugin.hpp
new file mode 100644
index 0000000..e7ef949
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/Plugin.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_PLUGIN_HPP_
+#define _CTRLSELECTION_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ctrlSelection
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+
+public :
+
+    /// PLugin destructor
+    ~Plugin() throw();
+
+    /// This method is used by runtime to initialize the bundle.
+    void start() throw( ::fwRuntime::RuntimeException );
+
+    /// This method is used by runtime to stop the bundle.
+    void stop() throw();
+
+};
+
+} // namespace ctrlSelection
+
+#endif // _CTRLSELECTION_PLUGIN_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/config.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/config.hpp
new file mode 100644
index 0000000..448daba
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_CONFIG_HPP_
+#define _CTRLSELECTION_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef CTRLSELECTION_EXPORTS
+    #define CTRLSELECTION_API __declspec(dllexport)
+    #else
+    #define CTRLSELECTION_API __declspec(dllimport)
+    #endif
+
+    #define CTRLSELECTION_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef CTRLSELECTION_EXPORTS
+    #define CTRLSELECTION_API __attribute__ ((visibility("default")))
+    #define CTRLSELECTION_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define CTRLSELECTION_API __attribute__ ((visibility("hidden")))
+    #define CTRLSELECTION_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define CTRLSELECTION_API
+    #define CTRLSELECTION_CLASS_API
+
+#endif
+
+#endif // _CTRLSELECTION_CONFIG_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/MedicalImageManagerSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/MedicalImageManagerSrv.hpp
new file mode 100644
index 0000000..49cb2df
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/MedicalImageManagerSrv.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_MEDICALIMAGEMANAGERSRV_HPP_
+#define _CTRLSELECTION_MANAGER_MEDICALIMAGEMANAGERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IManagerSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace manager
+{
+
+/**
+ * @brief  This manager converts the images specified by key to medical image (with landmarks, transfer function fields)
+ * @class  MedicalImageManagerSrv
+ */
+class CTRLSELECTION_CLASS_API MedicalImageManagerSrv : public ::ctrlSelection::IManagerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MedicalImageManagerSrv)(::ctrlSelection::IManagerSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API MedicalImageManagerSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~MedicalImageManagerSrv() throw() ;
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the service.
+     * @verbatim
+     <service uid="medicalImageManager" impl="::ctrlSelection::manager::MedicalImageManagerSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes">
+         <update imageCompositeKey="image" />
+     </service>
+      @endverbatim
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    /// Converts the images specified by key to medical image (with landmarks, transfer function fields).
+    void convertImages( ::fwData::Composite::sptr _composite );
+
+    std::vector< std::string > m_imageCompositeKeys;
+};
+
+} // manager
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_MEDICALIMAGEMANAGERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/Namespace.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/Namespace.hpp
new file mode 100644
index 0000000..f2ad25c
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef CTRLSELECTIONMANAGERNAMESPACE_HPP_
+#define CTRLSELECTIONMANAGERNAMESPACE_HPP_
+
+namespace ctrlSelection
+{
+/**
+ * @brief      The namespace ctrlSelection::manager contains the manager services.
+ * @namespace  ctrlSelection::manager
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace manager
+{
+
+}
+}
+#endif /* CTRLSELECTIONMANAGERNAMESPACE_HPP_ */
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SField.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SField.hpp
new file mode 100644
index 0000000..cb5dd8b
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SField.hpp
@@ -0,0 +1,150 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_SFIELD_HPP_
+#define _CTRLSELECTION_MANAGER_SFIELD_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IManagerSrv.hpp"
+
+namespace ctrlSelection
+{
+namespace manager
+{
+
+/**
+ * @class  SField
+ * @brief  This services is a manager which starts, stops or swaps services on field contained in a composite when
+ * it receive specific message (mainly sent by updater).
+ */
+class CTRLSELECTION_CLASS_API SField : public ::ctrlSelection::IManagerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SField)(::ctrlSelection::IManagerSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API SField() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~SField() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Starts the managed services if their fields are in the composite.
+    /// If the mode is "dummy", starts the the managed services on dummy fields if their fields are not in the composite.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Stops and erases all the managed services.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+    * @brief Implements configuring method derived from IService. .
+    *
+    * Sample of declaration configuration for a simple swapper service
+    *
+    * @verbatim
+        <service uid="FieldManager" impl="::ctrlSelection::manager::SField" type="::ctrlSelection::IManagerSrv" autoConnect="yes" >
+            <mode type="dummy" />
+            <config>
+                <field id="TFSelection" type="::fwData::TransferFunction" >
+                    <service uid="myServices" impl="..." type="..." autoConnect="yes" />
+                    <connect>
+                        <signal>key</signal>
+                        <slot>uid/key</slot>
+                    </connect>
+                </field>
+                <field id="AxialSliceIndex" type="::fwData::Integer" >
+                    <service uid="Services2" impl="..." type="..." autoConnect="yes" />
+                    <proxy channel="...">
+                        <signal>...</signal>
+                        <signal>.../...</signal>
+                        <slot>.../...</slot>
+                        <slot>.../...</slot>
+                    </proxy>
+                </field>
+            </config>
+        </service>
+    @endverbatim
+    * With:
+    * @li mode : must be "stop" or "dummy". The dummy mode doesn't stop the services when its attached field is deleted but swap it on a dummy field.
+    * @li the fields, services, connect and proxy tags are defined as same as the configuration of fields and services.
+    */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    /// Reacts on specifics event (ADDED_FIELDS, REMOVED_FIELDS and SWAPPED_FIELDS) and start, stop or swap the managed services
+    /// on the fields defined in the message or dummy fields
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef ::fwData::Object::FieldNameType FieldNameType;
+    typedef ::fwServices::ObjectMsg::ModifiedFieldsContainerType ModifiedFieldsContainerType;
+
+    class SubService
+    {
+    public:
+
+        SubService()
+        {
+            m_hasAutoConnection = false;
+        }
+
+        ~SubService()
+        { }
+
+        SPTR (::fwServices::IService) getService()
+                    { return m_service.lock(); }
+
+        ::fwData::Object::sptr m_dummy;
+        ConfigurationType m_config;
+        WPTR(::fwServices::IService) m_service;
+        ::fwServices::helper::SigSlotConnection::sptr m_connections;
+        bool m_hasAutoConnection;
+    };
+
+    typedef std::vector< SPTR(SubService) > SubServicesVecType;
+    typedef std::map< FieldNameType, SubServicesVecType > SubServicesMapType ;
+
+
+    void initOnDummyObject( const FieldNameType& fieldName );
+    void addFields( const ModifiedFieldsContainerType& fields );
+    void addField( const FieldNameType& fieldName, ::fwData::Object::sptr field );
+    void swapFields( const ModifiedFieldsContainerType& fields );
+    void swapField(const FieldNameType& fieldName, ::fwData::Object::sptr field);
+    void removeFields( const ModifiedFieldsContainerType& fields );
+    void removeField( const FieldNameType& fieldName );
+
+    ::fwServices::IService::sptr add( ::fwData::Object::sptr obj , ::fwRuntime::ConfigurationElement::sptr _elt );
+
+private:
+
+    std::string m_mode;
+    bool m_dummyStopMode;
+    ConfigurationType m_managerConfiguration;
+    SubServicesMapType m_fieldsSubServices;
+};
+
+} // manager
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_SFIELD_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SwapperSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SwapperSrv.hpp
new file mode 100644
index 0000000..10a6579
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/manager/SwapperSrv.hpp
@@ -0,0 +1,151 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_SWAPPER_HPP_
+#define _CTRLSELECTION_MANAGER_SWAPPER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IManagerSrv.hpp"
+
+namespace ctrlSelection
+{
+namespace manager
+{
+
+/**
+ * @class  SwapperSrv
+ * @brief  This services is a manager which starts, stops or swaps services on object contained in a composite when
+ * it receive specific message (mainly sent by updater).
+ */
+class CTRLSELECTION_CLASS_API SwapperSrv : public ::ctrlSelection::IManagerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SwapperSrv)(::ctrlSelection::IManagerSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API SwapperSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~SwapperSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Starts the managed services if their objects are in the composite.
+    /// If the mode is "dummy", starts the the managed services on dummy objects if their objects are not in the composite.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Stops and erases all the managed services.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+    * @brief Implements configuring method derived from IService. .
+    *
+    * Sample of declaration configuration for a simple swapper service
+    *
+    * @verbatim
+        <service uid="myManager" impl="::ctrlSelection::manager::SwapperSrv" type="::ctrlSelection::IManagerSrv" autoConnect="yes" >
+            <mode type="dummy" />
+            <config>
+                <object id="myImage" type="::fwData::Image" >
+                    <service uid="myMedicalImageConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController"  autoConnect="no" />
+                    <service uid="myServices" impl="..." type="..." autoConnect="yes" />
+
+                    <connect>
+                        <signal>key</signal>
+                        <slot>uid/key</slot>
+                    </connect>
+
+                </object>
+                <object id="myAcquisition" type="::fwData::Acquisition" >
+                    <service uid="myServices2" impl="..." type="..." autoConnect="yes" />
+
+                    <proxy channel="...">
+                        <signal>...</signal>
+                        <signal>.../...</signal>
+                        <slot>.../...</slot>
+                        <slot>.../...</slot>
+                    </proxy>
+                </object>
+            </config>
+        </service>
+    @endverbatim
+    * With:
+    * @li mode : must be "stop" or "dummy". The dummy mode doesn't stop the services when its attached object is deleted but swap it on a dummy object.
+    * @li the objects and services tags are defined as same as the configuration of objects and services.
+    */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    /// Reacts on specifics event (ADDED_KEYS, REMOVED_KEYS and CHANGED_KEYS) and start, stop or swap the managed services
+    /// on the objects defined in the message or dummy objects
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::string ObjectIdType;
+
+
+    class SubService
+    {
+    public:
+
+        SubService() : m_hasAutoConnection(false)
+        {}
+
+        ~SubService()
+        {}
+
+        SPTR (::fwServices::IService) getService()
+                    { return m_service.lock(); }
+
+        ::fwData::Object::sptr m_dummy;
+        ConfigurationType m_config;
+        WPTR(::fwServices::IService) m_service;
+        ::fwServices::helper::SigSlotConnection::sptr m_connections;
+        bool m_hasAutoConnection;
+    };
+
+    typedef std::vector< SPTR(SubService) > SubServicesVecType;
+    typedef std::map< ObjectIdType, SubServicesVecType > SubServicesMapType ;
+
+    void initOnDummyObject( std::string objectId );
+    void addObjects( ::fwData::Composite::sptr _composite );
+    void addObject( const std::string &objectId, ::fwData::Object::sptr object );
+    void swapObjects( ::fwData::Composite::sptr _composite );
+    void swapObject(const std::string &objectId, ::fwData::Object::sptr object);
+    void removeObjects( ::fwData::Composite::sptr _composite );
+    void removeObject( const std::string &objectId );
+
+    ::fwServices::IService::sptr add( ::fwData::Object::sptr obj , ::fwRuntime::ConfigurationElement::sptr _elt );
+
+private:
+
+    std::string m_mode;
+    bool m_dummyStopMode;
+    ConfigurationType m_managerConfiguration;
+    SubServicesMapType m_objectsSubServices;
+
+};
+
+} // manager
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_SWAPPER_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.hpp
new file mode 100644
index 0000000..59dd7f7
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.hpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_DATAINFOFROMMSGUPDATERSRV_HPP_
+#define _CTRLSELECTION_DATAINFOFROMMSGUPDATERSRV_HPP_
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class   DataInfoFromMsgUpdaterSrv
+ * @brief   Updates the composite related to this service according to the data stored (dataInfo) in the event :
+ * @warning datainfo MUST be always provided (but can be null), dataInfo MUST have the same type
+ * 
+
+ * @date    2009-2010.
+ */
+class CTRLSELECTION_CLASS_API DataInfoFromMsgUpdaterSrv : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DataInfoFromMsgUpdaterSrv)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API DataInfoFromMsgUpdaterSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~DataInfoFromMsgUpdaterSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the services : declare the event to react.
+     * @verbatim
+         <service uid="myUpdater" impl="::ctrlSelection::updater::DataInfoFromMsgUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no"  >
+            <update compositeKey="myObject" onEvent="NEW_OBJECT" fromUID="myPatient" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="myObject" onEvent="CLEAR_OBJECT" fromUID="myPatient" actionType="REMOVE"/>
+        </service>
+      @endverbatim
+     * @see IUpdaterSrv::configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration);
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_DATAINFOFROMMSGUPDATERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/Namespace.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/Namespace.hpp
new file mode 100644
index 0000000..2d2b543
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef CTRLSELECTIONUPDATERNAMESPACE_HPP_
+#define CTRLSELECTIONUPDATERNAMESPACE_HPP_
+
+
+namespace ctrlSelection
+{
+/**
+ * @brief      The namespace ctrlSelection::updater contains the updater services.
+ * @namespace  ctrlSelection::updater
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace updater
+{
+
+}
+}
+#endif /* CTRLSELECTIONUPDATERNAMESPACE_HPP_ */
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ObjFromMsgUpdaterSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ObjFromMsgUpdaterSrv.hpp
new file mode 100644
index 0000000..6edcb40
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ObjFromMsgUpdaterSrv.hpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_OBJFROMMSGUPDATERSRV_HPP_
+#define _CTRLSELECTION_OBJFROMMSGUPDATERSRV_HPP_
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class  ObjFromMsgUpdaterSrv
+ * @brief  Update the composite with the object which send the message.
+ * 
+
+ * @date    2009-2010.
+ */
+class CTRLSELECTION_CLASS_API ObjFromMsgUpdaterSrv : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ObjFromMsgUpdaterSrv)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API ObjFromMsgUpdaterSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~ObjFromMsgUpdaterSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the services : declare the event to react.
+     * @verbatim
+         <service uid="myUpdater" impl="::ctrlSelection::updater::ObjFromMsgUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+            <update compositeKey="myImage" onEvent="NEW_IMAGE_SELECTED" fromUID="myImage" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="myObject" onEvent="NEW_OBJECT" fromUID="myObject" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="myObject" onEvent="REMOVE_OBJECT" fromUID="myObject" actionType="REMOVE"/>
+        </service>
+      @endverbatim
+     * @see IUpdaterSrv::configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration);
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_OBJFROMMSGUPDATERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.hpp
new file mode 100644
index 0000000..9e1bca3
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_RECONSTRUCTIONFROMRESECUPDATERSRV_HPP_
+#define _CTRLSELECTION_RECONSTRUCTIONFROMRESECUPDATERSRV_HPP_
+
+#include <fwData/Reconstruction.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class  ReconstructionFromResecUpdaterSrv
+ * @brief  Specific updater to update PlaneList from a resection.
+ */
+class CTRLSELECTION_CLASS_API ReconstructionFromResecUpdaterSrv : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ReconstructionFromResecUpdaterSrv)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API ReconstructionFromResecUpdaterSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~ReconstructionFromResecUpdaterSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the services : declare the event to react.
+     * @verbatim
+         <service uid="myUpdater" impl="::ctrlSelection::updater::ReconstructionFromResecUpdaterSrv" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+            <update compositeKey="myReconstruction" onEvent="NEW_RECONSTRUCTION" fromUID="myResection" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="myReconstruction" onEvent="NEW_RECONSTRUCTION" fromUID="*" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="myReconstruction" onEvent="CLEAR" fromUID="myResection" actionType="REMOVE"/>
+        </service>
+      @endverbatim
+     * The '*' value for "fromUID" means that the message could be received from every objects
+     * @see IUpdaterSrv::configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration);
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+
+    ::fwData::Reconstruction::sptr getReconstruction(::fwServices::ObjectMsg::csptr _msg);
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_RECONSTRUCTIONFROMRESECUPDATERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SDrop.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SDrop.hpp
new file mode 100644
index 0000000..873a167
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SDrop.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_SDROP_HPP_
+#define _CTRLSELECTION_SDROP_HPP_
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class  SDrop
+ * @brief  Drop received object to associated ::fwData::Composite.
+ * 
+ */
+class CTRLSELECTION_CLASS_API SDrop : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SDrop)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API SDrop() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~SDrop() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Implements configuring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_SDROP_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.hpp
new file mode 100644
index 0000000..ecacd09
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __CTRLSELECTION_RECONSTRUCTIONFROMMODELSERIESUPDATERSRV_HPP__
+#define __CTRLSELECTION_RECONSTRUCTIONFROMMODELSERIESUPDATERSRV_HPP__
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace fwData
+{
+    class Reconstruction;
+}
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class  SReconstructionFromModelSeriesUpdater
+
+ * @date   2013
+ */
+class CTRLSELECTION_CLASS_API SReconstructionFromModelSeriesUpdater : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SReconstructionFromModelSeriesUpdater)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API SReconstructionFromModelSeriesUpdater() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~SReconstructionFromModelSeriesUpdater() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the services : declare the event to react.
+     * @verbatim
+         <service uid="myUpdater" impl="::ctrlSelection::updater::SReconstructionFromModelSeriesUpdater" type="::ctrlSelection::IUpdaterSrv" autoConnect="no">
+            <update compositeKey="reconstructionKey" onEvent="NEW_RECONSTRUCTION" fromUID="modelSeriesUid" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="reconstructionKey" onEvent="NEW_RECONSTRUCTION" fromUID="*" actionType="ADD_OR_SWAP"/>
+            <update compositeKey="reconstructionKey" onEvent="CLEAR" fromUID="modelSeries" actionType="REMOVE"/>
+        </service>
+      @endverbatim
+     * The '*' value for "fromUID" mean that the message could be received from every objects
+     * @see IUpdaterSrv::configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration);
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+
+    /**
+     * @brief Retrieves the reconstruction object attached to the given message.
+     * @note The message must be of class ::fwComEd::ModelSeriesMsg.
+     */
+    SPTR(::fwData::Reconstruction) getReconstruction(::fwServices::ObjectMsg::csptr _msg);
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // __CTRLSELECTION_RECONSTRUCTIONFROMMODELSERIESUPDATERSRV_HPP__
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/TranslateUpdater.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/TranslateUpdater.hpp
new file mode 100644
index 0000000..4308c5f
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/updater/TranslateUpdater.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_TRANSLATEUPDATER_HPP_
+#define _CTRLSELECTION_TRANSLATEUPDATER_HPP_
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+/**
+ * @class   TranslateUpdater
+ * @brief   Update the composite related to this service according to the receiving composite message and translate the composite keys.
+ * 
+ * @date    2011.
+ */
+class CTRLSELECTION_CLASS_API TranslateUpdater : public ::ctrlSelection::IUpdaterSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (TranslateUpdater)(::ctrlSelection::IUpdaterSrv) ) ;
+
+    /// Constructor.  Do nothing.
+    CTRLSELECTION_API TranslateUpdater() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~TranslateUpdater() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configure the services : declare the events to react.
+     * @verbatim
+         <service uid="myUpdater" impl="::ctrlSelection::updater::TranslateUpdater" type="::ctrlSelection::IUpdaterSrv" autoConnect="no"  >
+            <translate fromKey="myObject1Key1" toKey="myObject1Key2" fromUID="myComposite" />
+            <translate fromKey="myObject2Key1" toKey="myObject2Key2" fromUID="myComposite" />
+        </service>
+      @endverbatim
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void reconfiguring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Do nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private:
+
+    /// Managed translation : fromUID, fromKey, toKey
+    typedef std::vector < ::boost::tuple< std::string, std::string, std::string > > ManagedTranslations;
+    /// List of the managed translations
+    ManagedTranslations m_managedTranslations;
+};
+
+} // updater
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_TRANSLATEUPDATER_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/GraphWrapperSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/GraphWrapperSrv.hpp
new file mode 100644
index 0000000..918b153
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/GraphWrapperSrv.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_GRAPHWRAPPERSRV_HPP_
+#define _CTRLSELECTION_MANAGER_GRAPHWRAPPERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+/**
+ * @class  GraphWrapperSrv
+ * @brief  Convert generic message by specific message from Graph
+ * 
+
+ * @date   2007-2009.
+ */
+class CTRLSELECTION_CLASS_API GraphWrapperSrv : public ::ctrlSelection::IWrapperSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (GraphWrapperSrv)(::ctrlSelection::IWrapperSrv) ) ;
+
+//    /// Constructor.  Do nothing.
+    CTRLSELECTION_API GraphWrapperSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~GraphWrapperSrv() throw();
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+   virtual void starting()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements stopping method derived from IService. Do nothing.
+    virtual void stopping()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements configuring method derived from IService. Do nothing.
+    virtual void configuring()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    virtual void reconfiguring()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements updating method derived from IService. Do nothing.
+    virtual void updating() throw ( ::fwTools::Failed ) {};
+
+    /// Implements info method derived from IService. Print classname.
+    virtual void info( std::ostream &_sstream ) {};
+
+    /**
+     * @brief Convert the Object message with "UPDATED_OBJECT" event sent on Graph by GraphMsg with "NEW_GRAPH" event
+     */
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+
+};
+
+} // wrapper
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_MEDICALIMAGEMANAGERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ImageWrapperSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ImageWrapperSrv.hpp
new file mode 100644
index 0000000..304e895
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ImageWrapperSrv.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_GRAPHWRAPPERSRV_HPP_
+#define _CTRLSELECTION_MANAGER_GRAPHWRAPPERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+/**
+ * @class  ImageWrapperSrv
+ * @brief  Convert generic message by specific message from Image
+ * 
+
+ * @date   2007-2009.
+ */
+class CTRLSELECTION_CLASS_API ImageWrapperSrv : public ::ctrlSelection::IWrapperSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageWrapperSrv)(::ctrlSelection::IWrapperSrv) ) ;
+
+//    /// Constructor.  Do nothing.
+    CTRLSELECTION_API ImageWrapperSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~ImageWrapperSrv() throw();
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+   virtual void starting()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements stopping method derived from IService. Do nothing.
+    virtual void stopping()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements configuring method derived from IService. Do nothing.
+    virtual void configuring()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    virtual void reconfiguring()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements updating method derived from IService. Do nothing.
+    virtual void updating() throw ( ::fwTools::Failed ) {};
+
+    /// Implements info method derived from IService. Print classname.
+    virtual void info( std::ostream &_sstream ) {};
+
+    /**
+     * @brief Convert the Object message with "UPDATED_OBJECT" event sent on Graph by GraphMsg with "NEW_GRAPH" event
+     */
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+
+};
+
+} // wrapper
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_MEDICALIMAGEMANAGERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgForwarderSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgForwarderSrv.hpp
new file mode 100644
index 0000000..39ea92d
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgForwarderSrv.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MSGFORWARDERSRV_HPP_
+#define _CTRLSELECTION_MSGFORWARDERSRV_HPP_
+
+#include <boost/tuple/tuple.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IController.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+/**
+ * @class  MsgForwarderSrv
+ * @brief  This service forwards an event from specific object to object specified with key in in composite.
+ * 
+
+ * @date   2011.
+ */
+class CTRLSELECTION_CLASS_API MsgForwarderSrv : public ::ctrlSelection::IWrapperSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MsgForwarderSrv)(::ctrlSelection::IWrapperSrv) ) ;
+
+    CTRLSELECTION_API MsgForwarderSrv() throw() ;
+
+    CTRLSELECTION_API virtual ~MsgForwarderSrv() throw() ;
+
+protected:
+
+    /// Implements starting method derived from IService. Does nothing.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Implements stopping method derived from IService. Does nothing.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Implements swapping method derived from IService. Convert the image.
+    CTRLSELECTION_API virtual void swapping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configures the service.
+     *
+     * @verbatim
+       <service uid="forwarderMsg" impl="::ctrlSelection::wrapper::MsgForwarderSrv" type="::ctrlSelection::IWrapperSrv" autoConnect="no">
+           <forward compositeKey="frontImage" onEvent="SLICE_INDEX" fromUID="*" msgType="::fwComEd::ImageMsg" />
+           <forward compositeKey="frontImage" onEvent="CHANGE_SLICE_TYPE" fromUID="*" msgType="::fwComEd::ImageMsg" />
+       </service>
+       @endverbatim
+     * With :
+     * - \b compositeKey : key of the object in the composite,
+     * - \b onEvent : event of the message to receive,
+     * - \b fromUID : uid of the object which sent the message. If "*" the message can be received from any object,
+     * - \b msgType : type of the message to receive.
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements updating method derived from IService. Does nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    typedef ::boost::tuple< std::string, std::string, std::string, std::string > EventType;
+    typedef std::vector < EventType > ManagedEventsType;
+
+    /// List of the managed event
+    ManagedEventsType m_managedEvents;
+};
+
+} // wrapper
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MSGFORWARDERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgWrapperSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgWrapperSrv.hpp
new file mode 100644
index 0000000..eaf0886
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/MsgWrapperSrv.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_MANAGER_MSGWRAPPERSRV_HPP_
+#define _CTRLSELECTION_MANAGER_MSGWRAPPERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+/**
+ * @class  MsgWrapperSrv
+ * @brief  Convert generic message by specific message
+ * 
+
+ * @date   2007-2009.
+ */
+class CTRLSELECTION_CLASS_API MsgWrapperSrv : public ::ctrlSelection::IWrapperSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MsgWrapperSrv)(::ctrlSelection::IWrapperSrv) ) ;
+
+//    /// Constructor.  Do nothing.
+    CTRLSELECTION_API MsgWrapperSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    CTRLSELECTION_API virtual ~MsgWrapperSrv() throw();
+
+protected:
+
+    /// Implements starting method derived from IService. Do nothing.
+   virtual void starting()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements stopping method derived from IService. Do nothing.
+    virtual void stopping()  throw ( ::fwTools::Failed ) {};
+
+    /**
+     * Convert message with event by a specific message with another event and type.
+     *
+     * @verbatim
+     <wrapper onEvent="UPDATED_OBJECT" toEvent="NEW_IMAGE" toMsgType="::fwComEd::ImageMsg" />
+     @endverbatim
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Implements reconfiguring method derived from IService. Do nothing.
+    virtual void reconfiguring()  throw ( ::fwTools::Failed ) {};
+
+    /// Implements updating method derived from IService. Do nothing.
+    virtual void updating() throw ( ::fwTools::Failed ) {};
+
+    /// Implements info method derived from IService. Print classname.
+    virtual void info( std::ostream &_sstream ) {};
+
+    /// Convert message with event by a specific message with another event and type.
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    // < onEvent, toEvent, msgType >
+    typedef ::boost::tuple< std::string, std::string, std::string > EventType;
+    typedef std::vector < EventType > ManagedEventsType;
+    ManagedEventsType m_managedEvents;
+};
+
+} // wrapper
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_MANAGER_MSGWRAPPERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/Namespace.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/Namespace.hpp
new file mode 100644
index 0000000..955d9fd
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef CTRLSELECTIONWRAPPERNAMESPACE_HPP_
+#define CTRLSELECTIONWRAPPERNAMESPACE_HPP_
+
+namespace ctrlSelection
+{
+/**
+ * @brief      The namespace ctrlSelection::wrapper contains the wrapper services.
+ * @namespace  ctrlSelection::wrapper
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace wrapper
+{
+
+}
+}
+#endif /* CTRLSELECTIONWRAPPERNAMESPACE_HPP_ */
diff --git a/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.hpp b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.hpp
new file mode 100644
index 0000000..a329741
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/include/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.hpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _CTRLSELECTION_COMPOSITEMSGFORWARDERSRV_HPP_
+#define _CTRLSELECTION_COMPOSITEMSGFORWARDERSRV_HPP_
+
+#include <boost/tuple/tuple.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IController.hpp>
+
+#include "ctrlSelection/config.hpp"
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+/**
+ * @class  ObjToCompositeMsgForwarderSrv
+ * @brief  This service forwards an event from all objects of composite to the composite .
+ * 
+
+ * @date   2011.
+ */
+class CTRLSELECTION_CLASS_API ObjToCompositeMsgForwarderSrv : public ::ctrlSelection::IWrapperSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ObjToCompositeMsgForwarderSrv)(::ctrlSelection::IWrapperSrv) ) ;
+
+
+    CTRLSELECTION_API ObjToCompositeMsgForwarderSrv() throw() ;
+
+    CTRLSELECTION_API virtual ~ObjToCompositeMsgForwarderSrv() throw() ;
+
+protected:
+
+    /// Creates connections to receives signals from all the objects of the composite.
+    CTRLSELECTION_API virtual void starting()  throw ( ::fwTools::Failed );
+
+    /// Removes all the object connections.
+    CTRLSELECTION_API virtual void stopping()  throw ( ::fwTools::Failed );
+
+    /// Does nothing.
+    CTRLSELECTION_API virtual void swapping()  throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Configures the service.
+     *
+     * @verbatim
+     <forward fromKey="objKey" onEvent="UPDATED_OBJECT" msgType="::fwComEd::ImageMsg" />
+     @endverbatim
+     * With this configuration : message with event "UPDATED_OBJECT" received from oject with key objKey" are
+     * forwarded to the composite. New message of type ::fwComEd::ImageMsg will be created and sent to the composite.
+     *
+     * @note fromKey attibute can be "*", so the message can be received from any object.
+     */
+    CTRLSELECTION_API virtual void configuring()  throw ( ::fwTools::Failed );
+
+    /// Does nothing.
+    CTRLSELECTION_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Implements info method derived from IService. Print classname.
+    CTRLSELECTION_API virtual void info( std::ostream &_sstream );
+
+    CTRLSELECTION_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+private :
+
+    // < fromKey, onEvent, msgType >
+    typedef ::boost::tuple< std::string, std::string, std::string > EventType;
+    typedef std::vector < EventType > ManagedEventsType;
+
+    typedef std::map< std::string, ::fwCom::Connection > ObjConnectionMap;
+    /// Map to register objects connections
+    ObjConnectionMap m_objConnections;
+    /// List of the managed event
+    ManagedEventsType m_managedEvents;
+};
+
+} // wrapper
+} // ctrlSelection
+
+#endif // _CTRLSELECTION_COMPOSITEMSGFORWARDERSRV_HPP_
diff --git a/Bundles/LeafCtrl/ctrlSelection/rc/plugin.xml b/Bundles/LeafCtrl/ctrlSelection/rc/plugin.xml
new file mode 100644
index 0000000..8dfc09f
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/rc/plugin.xml
@@ -0,0 +1,113 @@
+<plugin id="ctrlSelection" class="::ctrlSelection::Plugin" >
+
+    <library name="ctrlSelection" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::SReconstructionFromModelSeriesUpdater</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::ReconstructionFromResecUpdaterSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::ObjFromMsgUpdaterSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+   <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::DataInfoFromMsgUpdaterSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::TranslateUpdater</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IManagerSrv</type>
+        <service>::ctrlSelection::manager::SwapperSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IManagerSrv</type>
+        <service>::ctrlSelection::manager::SField</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IManagerSrv</type>
+        <service>::ctrlSelection::manager::MedicalImageManagerSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::ctrlSelection::MedicalImageSrv</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::ctrlSelection::ImageUpdateAxis</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::ctrlSelection::BookmarkSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IWrapperSrv</type>
+        <service>::ctrlSelection::wrapper::GraphWrapperSrv</service>
+        <object>::fwData::Graph</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IWrapperSrv</type>
+        <service>::ctrlSelection::wrapper::ImageWrapperSrv</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IWrapperSrv</type>
+        <service>::ctrlSelection::wrapper::MsgForwarderSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IWrapperSrv</type>
+        <service>::ctrlSelection::wrapper::ObjToCompositeMsgForwarderSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IWrapperSrv</type>
+        <service>::ctrlSelection::wrapper::MsgWrapperSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::ctrlSelection::IUpdaterSrv</type>
+        <service>::ctrlSelection::updater::SDrop</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/BookmarkSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/BookmarkSrv.cpp
new file mode 100644
index 0000000..1562532
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/BookmarkSrv.cpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/Bookmarks.hpp>
+
+#include <fwData/String.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/BookmarkSrv.hpp"
+
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController, ::ctrlSelection::BookmarkSrv, ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+BookmarkSrv::BookmarkSrv() throw()
+{
+    //handlingEventOff();
+}
+
+//-----------------------------------------------------------------------------
+
+BookmarkSrv::~BookmarkSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    ::fwRuntime::ConfigurationElement::sptr config = m_configuration->findConfigurationElement("bookmark");
+    SLM_ASSERT("Problem with configuration for BookmarkSrv type, one element \"bookmark\" must be present", m_configuration->findAllConfigurationElement("bookmark").size() == 1 );
+
+    m_bookmarkName = "";
+
+    if (config->hasAttribute("fromString"))
+    {
+        std::string uid = config->getExistingAttributeValue("fromString");
+        OSLM_ASSERT("Object '" << uid << "' does not exist", ::fwTools::fwID::exist(uid));
+        ::fwData::String::sptr str = ::fwData::String::dynamicCast(::fwTools::fwID::getObject(uid));
+        OSLM_ASSERT("Object '" << uid << "' is not a '::fwData::String'", str);
+        m_bookmarkName = str->value();
+    }
+    if (config->hasAttribute("fromString") && config->hasAttribute("name"))
+    {
+        m_bookmarkName += "_";
+    }
+    if (config->hasAttribute("name"))
+    {
+        m_bookmarkName += config->getExistingAttributeValue("name");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::starting()  throw ( ::fwTools::Failed )
+{
+    ::fwTools::Bookmarks::add( m_bookmarkName , this->getObject());
+}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    OSLM_WARN_IF("Bookmark \""<< m_bookmarkName << "\" already removed", ::fwTools::Bookmarks::exist( m_bookmarkName ));
+    if(::fwTools::Bookmarks::exist( m_bookmarkName ))
+    {
+        ::fwTools::Bookmarks::remove( m_bookmarkName);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::swapping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void BookmarkSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IManagerSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IManagerSrv.cpp
new file mode 100644
index 0000000..c541c9d
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IManagerSrv.cpp
@@ -0,0 +1,233 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/regex.hpp>
+
+#include <fwServices/registry/Proxy.hpp>
+
+#include "ctrlSelection/IManagerSrv.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+IManagerSrv::IManagerSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+IManagerSrv::~IManagerSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::swapping() throw ( ::fwTools::Failed )
+{
+    this->stopping();
+    this->starting();
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::manageConnections(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config)
+{
+    BOOST_FOREACH(ConfigurationType connectCfg, config->find("connect"))
+    {
+        this->manageConnection(objectId, object, connectCfg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::manageConnection(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config)
+{
+    typedef std::pair< std::string, ::fwCom::Signals::SignalKeyType > SignalInfoType;
+    typedef std::pair< std::string, ::fwCom::Slots::SlotKeyType > SlotInfoType;
+    typedef std::vector< SlotInfoType > SlotInfoContainerType;
+
+    SignalInfoType signalInfo;
+    SlotInfoContainerType slotInfos;
+
+    ::boost::regex re("(.*)/(.*)");
+    ::boost::smatch match;
+    std::string src, uid, key;
+
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  config->getElements())
+    {
+        SLM_ASSERT("Bad tag '" <<elem->getName() << "', only <signal> or <slot> are allowed.",
+                   elem->getName() == "signal" || elem->getName() == "slot");
+
+        src = elem->getValue();
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            uid.assign(match[1].first, match[1].second);
+            key.assign(match[2].first, match[2].second);
+
+            OSLM_ASSERT(src << " configuration is not correct for "<< elem->getName() ,
+                        !uid.empty() && !key.empty());
+
+            if (elem->getName() == "signal")
+            {
+                SLM_ASSERT("There must be only one signal by connection",
+                           signalInfo.first.empty() && signalInfo.second.empty());
+                signalInfo = std::make_pair(uid, key);
+            }
+            else if (elem->getName() == "slot")
+            {
+                slotInfos.push_back( std::make_pair(uid, key) );
+            }
+        }
+        else
+        {
+            uid = object->getID();
+            key = src;
+            SLM_ASSERT("Element must be a signal or must be written as <fwID/Key>", elem->getName() == "signal");
+            SLM_ASSERT("There must be only one signal by connection",
+                       signalInfo.first.empty() && signalInfo.second.empty());
+            signalInfo = std::make_pair(uid, key);
+        }
+    }
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(signalInfo.first);
+    ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(obj);
+
+    ::fwServices::helper::SigSlotConnection::sptr connection;
+    ObjectConnectionsMapType::iterator iter = m_objectConnections.find(objectId);
+    if (iter != m_objectConnections.end())
+    {
+        connection = iter->second;
+    }
+    else
+    {
+        connection = ::fwServices::helper::SigSlotConnection::New();
+        m_objectConnections[objectId] = connection;
+    }
+
+    BOOST_FOREACH(SlotInfoType slotInfo,  slotInfos)
+    {
+        ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(slotInfo.first);
+        ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+
+        connection->connect(hasSignals, signalInfo.second, hasSlots, slotInfo.second);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::removeConnections(const std::string &objectId)
+{
+    ObjectConnectionsMapType::iterator iter = m_objectConnections.find(objectId);
+    if (iter != m_objectConnections.end())
+    {
+        ::fwServices::helper::SigSlotConnection::sptr connection = iter->second;
+        connection->disconnect();
+    }
+    m_objectConnections.erase(objectId);
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::manageProxies(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config)
+{
+    BOOST_FOREACH(ConfigurationType proxyCfg, config->find("proxy"))
+    {
+        this->manageProxy(objectId, object, proxyCfg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::manageProxy(const std::string &objectId, ::fwData::Object::sptr object, ConfigurationType config)
+{
+    ::fwServices::registry::Proxy::sptr proxy = ::fwServices::registry::Proxy::getDefault();
+
+    SLM_ASSERT("Missing 'channel' attribute", config->hasAttribute("channel"));
+    const std::string channel = config->getExistingAttributeValue("channel");
+    ProxyConnections proxyCnt(channel);
+
+    ::boost::regex re("(.*)/(.*)");
+    ::boost::smatch match;
+    std::string src, uid, key;
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  config->getElements())
+    {
+        src = elem->getValue();
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            uid.assign(match[1].first, match[1].second);
+            key.assign(match[2].first, match[2].second);
+
+            OSLM_ASSERT(src << " configuration is not correct for "<< elem->getName() ,
+                        !uid.empty() && !key.empty());
+
+            ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(uid);
+
+            if (elem->getName() == "signal")
+            {
+                ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(obj);
+                ::fwCom::SignalBase::sptr sig = hasSignals->signal(key);
+                proxy->connect(channel, sig);
+                proxyCnt.addSignalConnection(uid, key);
+            }
+            else if (elem->getName() == "slot")
+            {
+                ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+                ::fwCom::SlotBase::sptr slot = hasSlots->slot(key);
+                proxy->connect(channel, slot);
+                proxyCnt.addSlotConnection(uid, key);
+            }
+        }
+        else
+        {
+            uid = object->getID();
+            key = src;
+            SLM_ASSERT("Element must be a signal or must be written as <fwID/Key>", elem->getName() == "signal");
+            ::fwCom::SignalBase::sptr sig = object->signal(key);
+            proxy->connect(channel, sig);
+            proxyCnt.addSignalConnection(uid, key);
+        }
+    }
+    m_proxyCtns[objectId].push_back(proxyCnt);
+}
+
+//-----------------------------------------------------------------------------
+
+void IManagerSrv::disconnectProxies(const std::string &objectId)
+{
+    ProxyConnectionsMapType::iterator iter = m_proxyCtns.find(objectId);
+    if (iter != m_proxyCtns.end())
+    {
+        ::fwServices::registry::Proxy::sptr proxy = ::fwServices::registry::Proxy::getDefault();
+
+        ProxyConnectionsVectType vectProxyConnections = iter->second;
+
+        BOOST_FOREACH(ProxyConnectionsVectType::value_type proxyConnections,  vectProxyConnections)
+        {
+            BOOST_FOREACH(ProxyConnections::ProxyEltType signalElt, proxyConnections.m_signals)
+            {
+                ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(signalElt.first);
+                ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(obj);
+                ::fwCom::SignalBase::sptr sig = hasSignals->signal(signalElt.second);
+                proxy->disconnect(proxyConnections.m_channel, sig);
+            }
+            BOOST_FOREACH(ProxyConnections::ProxyEltType slotElt, proxyConnections.m_slots)
+            {
+                ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(slotElt.first);
+                ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+                ::fwCom::SlotBase::sptr slot = hasSlots->slot(slotElt.second);
+                proxy->disconnect(proxyConnections.m_channel, slot);
+            }
+        }
+        vectProxyConnections.clear();
+    }
+    m_proxyCtns.erase(objectId);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IUpdaterSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IUpdaterSrv.cpp
new file mode 100644
index 0000000..992cc44
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IUpdaterSrv.cpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include "ctrlSelection/IUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+IUpdaterSrv::IUpdaterSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+IUpdaterSrv::~IUpdaterSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IUpdaterSrv::configureManagedEvents(::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::ConfigurationElementContainer handleEvents = configuration->findAllConfigurationElement("update");
+
+    SLM_ASSERT("Problem with configuration for ObjFromMsgUpdaterSrv type, missing element \"update\"", handleEvents.size() != 0 );
+    OSLM_DEBUG( "handleEvents.size() = " << handleEvents.size() );
+    m_managedEvents.clear();
+    for(    ::fwRuntime::ConfigurationElementContainer::Iterator item = handleEvents.begin();
+            item != handleEvents.end();
+            ++item )
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"compositeKey\" is missing", !(*item)->hasAttribute("compositeKey") );
+        std::string compositeKey =  (*item)->getExistingAttributeValue("compositeKey");
+
+        SLM_FATAL_IF( "Sorry, attribute \"onEvent\" is missing", !(*item)->hasAttribute("onEvent") );
+        std::string onEvent =  (*item)->getExistingAttributeValue("onEvent");
+
+        SLM_FATAL_IF( "Sorry, attribute \"fromUID\" is missing", !(*item)->hasAttribute("fromUID") );
+        std::string fromUID =  (*item)->getExistingAttributeValue("fromUID");
+
+        SLM_FATAL_IF( "Sorry, attribute \"actionType\" is missing", !(*item)->hasAttribute("actionType") );
+        std::string actionType =  (*item)->getExistingAttributeValue("actionType");
+
+        ActionType action;
+        if ( actionType == "ADD" )                    { action = ADD; }
+        else if ( actionType == "SWAP" )              { action = SWAP; }
+        else if ( actionType == "REMOVE" )            { action = REMOVE; }
+        else if ( actionType == "ADD_OR_SWAP" )       { action = ADD_OR_SWAP; }
+        else if ( actionType == "REMOVE_IF_PRESENT" ) { action = REMOVE_IF_PRESENT; }
+        else if ( actionType == "DO_NOTHING" )        { action = DO_NOTHING; }
+        else
+        {
+            SLM_FATAL("Sorry this type of \"actionType\" is not managed by ObjFromMsgUpdaterSrv type");
+        }
+
+        OSLM_INFO( "Manage event "<< onEvent <<" from this object "<< fromUID <<" and "<< actionType << " "<< compositeKey <<" in my composite.");
+        ::boost::tuple< std::string, std::string, std::string, ActionType > managedEvent (onEvent, fromUID, compositeKey, action);
+        m_managedEvents.push_back( managedEvent );
+        //addNewHandledEvent( onEvent );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IUpdaterSrv::updateComposite(::fwData::Composite::sptr pComposite, ::fwData::Object::sptr _obj, std::string _compositeKey, ActionType _action )
+{
+
+    // Manage special action
+    if ( _action == ADD_OR_SWAP )
+    {
+        if ( pComposite->find(_compositeKey) != pComposite->end() )
+        {
+            _action = SWAP;
+        }
+        else
+        {
+            _action = ADD;
+        }
+    }
+    else if(_action == REMOVE_IF_PRESENT )
+    {
+        if ( pComposite->find(_compositeKey) != pComposite->end() )
+        {
+            _action = REMOVE;
+        }
+        else
+        {
+            _action = DO_NOTHING;
+        }
+    }
+
+    // Use helper on composite
+    ::boost::shared_ptr< ::fwComEd::helper::Composite > pCompositeHelper ( new ::fwComEd::helper::Composite( pComposite ) );
+
+    if(_action != DO_NOTHING)
+    {
+        switch ( _action )
+        {
+        case REMOVE :
+        {
+            pCompositeHelper->remove(_compositeKey);
+            break;
+        }
+        case SWAP :
+        {
+            pCompositeHelper->swap(_compositeKey,_obj);
+            break;
+        }
+        case ADD :
+        {
+            pCompositeHelper->add(_compositeKey,_obj);
+            break;
+        }
+        default :
+        {
+            SLM_FATAL("Sorry, this action type is not managed");
+            break;
+        }
+        }
+
+        // Notification of message
+        pCompositeHelper->notify( this->getSptr() );
+    }
+    else
+    {
+        OSLM_INFO("Do nothing for objectID " << _compositeKey);
+    }
+}
+
+}
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IWrapperSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IWrapperSrv.cpp
new file mode 100644
index 0000000..a779e6a
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/IWrapperSrv.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "ctrlSelection/IWrapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+IWrapperSrv::IWrapperSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+IWrapperSrv::~IWrapperSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/ImageUpdateAxis.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/ImageUpdateAxis.cpp
new file mode 100644
index 0000000..035abb4
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/ImageUpdateAxis.cpp
@@ -0,0 +1,147 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/algorithm/string/case_conv.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Float.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/FloatMsg.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "ctrlSelection/ImageUpdateAxis.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController, ::ctrlSelection::ImageUpdateAxis, ::fwData::Image ) ;
+
+//-----------------------------------------------------------------------------
+
+ImageUpdateAxis::ImageUpdateAxis() throw()
+{
+    //handlingEventOff ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//-----------------------------------------------------------------------------
+
+ImageUpdateAxis::~ImageUpdateAxis() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast(message);
+    if (imageMsg && imageMsg->hasEvent(::fwComEd::ImageMsg::CHANGE_SLICE_TYPE))
+    {
+        ::fwData::Object::csptr cObjInfo = imageMsg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+        ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+        ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+        ::fwData::Integer::sptr fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] );
+        ::fwData::Integer::sptr toSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] );
+
+        if( toSliceType->value() == static_cast< int > ( m_orientation ) )
+        {
+            m_orientation = static_cast< ::fwComEd::helper::MedicalImageAdaptor::Orientation > ( fromSliceType->value() );
+        }
+        else if(fromSliceType->value() == static_cast<int>(m_orientation))
+        {
+            m_orientation = static_cast< ::fwComEd::helper::MedicalImageAdaptor::Orientation >( toSliceType->value() );
+        }
+
+        this->updating();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::starting()  throw ( ::fwTools::Failed )
+{
+    this->updating();
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::swapping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::configuring()  throw ( ::fwTools::Failed )
+{
+    ::fwRuntime::ConfigurationElement::sptr config = m_configuration->findConfigurationElement("axis");
+    SLM_ASSERT("Problem with configuration for ImageUpdateAxis type, one element \"axis\" must be present", m_configuration->findAllConfigurationElement("axis").size() == 1 );
+
+    SLM_FATAL_IF( "Sorry, attribute \"uid\" is missing", !config->hasAttribute("uid") );
+    m_floatID =  config->getExistingAttributeValue("uid");
+
+    SLM_FATAL_IF( "Sorry, attribute \"orientation\" is missing", !config->hasAttribute("orientation") );
+    std::string  orientation = config->getExistingAttributeValue("orientation");
+    ::boost::algorithm::trim(orientation);
+    ::boost::algorithm::to_lower(orientation);
+
+    if(orientation == "axial" )
+    {
+        m_orientation = ::fwComEd::helper::MedicalImageAdaptor::Z_AXIS;
+    }
+    else if(orientation == "frontal" )
+    {
+        m_orientation = ::fwComEd::helper::MedicalImageAdaptor::Y_AXIS;
+    }
+    else if(orientation == "sagittal" )
+    {
+        m_orientation = ::fwComEd::helper::MedicalImageAdaptor::X_AXIS;
+    }
+    else
+    {
+        SLM_FATAL("The value for the xml element \"value\" can only be axial, frontal or sagittal.");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::updating() throw ( ::fwTools::Failed )
+{
+    OSLM_ASSERT("Missing object " << m_floatID, ::fwTools::fwID::exist(m_floatID));
+    ::fwData::Float::sptr dataFloat = ::fwData::Float::dynamicCast(::fwTools::fwID::getObject(m_floatID));
+    OSLM_ASSERT("Object " << m_floatID << " is not a valid ::fwData::Float", dataFloat);
+
+    dataFloat->value() = (float) m_orientation;
+    OSLM_TRACE(dataFloat->getID() << " new value : " << *dataFloat);
+    ::fwComEd::FloatMsg::sptr msg = ::fwComEd::FloatMsg::New();
+    msg->addEvent( ::fwComEd::FloatMsg::VALUE_IS_MODIFIED );
+    ::fwServices::IEditionService::notify(this->getSptr(), dataFloat, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageUpdateAxis::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/MedicalImageSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/MedicalImageSrv.cpp
new file mode 100644
index 0000000..b5087e4
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/MedicalImageSrv.cpp
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/helper/Image.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include "ctrlSelection/MedicalImageSrv.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController, ::ctrlSelection::MedicalImageSrv, ::fwData::Image ) ;
+
+//-----------------------------------------------------------------------------
+
+MedicalImageSrv::MedicalImageSrv() throw()
+{
+    //addNewHandledEvent(::fwComEd::ImageMsg::BUFFER );
+}
+
+//-----------------------------------------------------------------------------
+
+MedicalImageSrv::~MedicalImageSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    if(message->hasEvent(::fwComEd::ImageMsg::BUFFER))
+    {
+        this->convertImage();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::convertImage()
+{
+    ::fwData::Image::sptr pImg = this->getObject< ::fwData::Image >();
+    if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(pImg))
+    {
+        ::fwComEd::helper::Image helper ( pImg );
+
+        helper.createLandmarks();
+        helper.createTransferFunctionPool(this->getSptr());
+        helper.createImageSliceIndex();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::starting()  throw ( ::fwTools::Failed )
+{
+    this->convertImage();
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::swapping()  throw ( ::fwTools::Failed )
+{
+    this->convertImage();
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::configuring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/Plugin.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/Plugin.cpp
new file mode 100644
index 0000000..4ddb764
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/Plugin.cpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "ctrlSelection/Plugin.hpp"
+
+namespace ctrlSelection
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::ctrlSelection::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace uiIO
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/MedicalImageManagerSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/MedicalImageManagerSrv.cpp
new file mode 100644
index 0000000..2445ac7
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/MedicalImageManagerSrv.cpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include "ctrlSelection/manager/MedicalImageManagerSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace manager
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IManagerSrv, ::ctrlSelection::manager::MedicalImageManagerSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+MedicalImageManagerSrv::MedicalImageManagerSrv() throw()
+{
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS );
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS );
+}
+
+//-----------------------------------------------------------------------------
+
+MedicalImageManagerSrv::~MedicalImageManagerSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(message);
+    if (compositeMsg)
+    {
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getAddedKeys();
+            convertImages( fields );
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getNewChangedKeys();
+            convertImages( fields );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::convertImages( ::fwData::Composite::sptr _composite )
+{
+    for(    ::fwData::Composite::IteratorType  objectId = _composite->begin();
+            objectId != _composite->end();
+            ++objectId )
+    {
+        BOOST_FOREACH( std::string key, m_imageCompositeKeys )
+        {
+            if( objectId->first == key )
+            {
+                ::fwData::Image::sptr pImg = ::fwData::Image::dynamicCast( objectId->second );
+
+                ::fwComEd::helper::Image helper ( pImg );
+                helper.createLandmarks();
+                helper.createTransferFunctionPool(this->getSptr());
+                helper.createImageSliceIndex();
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::starting()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    ::fwRuntime::ConfigurationElementContainer updaters = m_configuration->findAllConfigurationElement("update");
+
+    SLM_ASSERT("Problem with configuration for MedicalImageManagerSrv type, missing element \"update\"", updaters.size() != 0 );
+    OSLM_DEBUG( "updaters.size() = " << updaters.size() );
+    m_imageCompositeKeys.clear();
+    for(    ::fwRuntime::ConfigurationElementContainer::Iterator item = updaters.begin();
+            item != updaters.end();
+            ++item )
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"imageCompositeKey\" is missing", !(*item)->hasAttribute("imageCompositeKey") );
+        std::string imageCompositeKey =  (*item)->getExistingAttributeValue("imageCompositeKey");
+        m_imageCompositeKeys.push_back(imageCompositeKey);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MedicalImageManagerSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // manager
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SField.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SField.cpp
new file mode 100644
index 0000000..9bf0214
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SField.cpp
@@ -0,0 +1,444 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+
+#include "ctrlSelection/manager/SField.hpp"
+
+namespace ctrlSelection
+{
+
+namespace manager
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IManagerSrv, ::ctrlSelection::manager::SField, ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+SField::SField() throw() : m_dummyStopMode(false)
+{
+    //this->addNewHandledEvent( ::fwServices::ObjectMsg::ADDED_FIELDS );
+    //this->addNewHandledEvent( ::fwServices::ObjectMsg::REMOVED_FIELDS );
+    //this->addNewHandledEvent( ::fwServices::ObjectMsg::CHANGED_FIELDS );
+}
+
+//-----------------------------------------------------------------------------
+
+SField::~SField() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SField::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwServices::ObjectMsg::csptr fieldMsg = ::fwServices::ObjectMsg::dynamicConstCast(message);
+    SLM_FATAL_IF("Received message must be fieldMsg", fieldMsg == 0 );
+
+    if ( fieldMsg->hasEvent( ::fwServices::ObjectMsg::ADDED_FIELDS ) )
+    {
+        this->addFields( fieldMsg->getAddedFields() );
+    }
+
+    if ( fieldMsg->hasEvent( ::fwServices::ObjectMsg::REMOVED_FIELDS ) )
+    {
+        this->removeFields( fieldMsg->getRemovedFields() );
+    }
+
+    if ( fieldMsg->hasEvent( ::fwServices::ObjectMsg::CHANGED_FIELDS ) )
+    {
+        this->swapFields( fieldMsg->getNewChangedFields() );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SField::updating() throw ( ::fwTools::Failed )
+{
+    this->stopping();
+    this->starting();
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SField::stopping()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    BOOST_FOREACH(SubServicesMapType::value_type elt, m_fieldsSubServices)
+    {
+        SubServicesVecType subServices = elt.second;
+        BOOST_REVERSE_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on "<< elt.first <<" expired !", subSrv->getService() );
+
+            if( subSrv->m_hasAutoConnection )
+            {
+                subSrv->m_connections->disconnect();
+            }
+            subSrv->getService()->stop();
+            ::fwServices::OSR::unregisterService(subSrv->getService());
+            subSrv->m_service.reset();
+        }
+    }
+    m_fieldsSubServices.clear();
+
+    while( !m_objectConnections.empty())
+    {
+        this->removeConnections(m_objectConnections.begin()->first);
+    }
+    SLM_ASSERT("Connections must be empty", m_objectConnections.empty());
+
+    while( !m_proxyCtns.empty())
+    {
+        this->disconnectProxies(m_proxyCtns.begin()->first);
+    }
+    SLM_ASSERT("Proxy connections must be empty", m_proxyCtns.empty());
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    std::vector < ConfigurationType > vectMode = m_configuration->find("mode");
+    if(!vectMode.empty())
+    {
+        ConfigurationType modeConfiguration = vectMode.at(0);
+        SLM_ASSERT("Missing 'type' attribute", modeConfiguration->hasAttribute("type"));
+        std::string mode = modeConfiguration->getAttributeValue("type");
+        SLM_ASSERT("Wrong mode type", (mode == "dummy" ) || (mode == "stop" ) || mode=="startAndUpdate");
+        m_dummyStopMode = (mode == "dummy" );
+        m_mode = mode;
+    }
+
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+    SLM_ASSERT("Missing <config> tag!", !vectConfig.empty());
+    m_managerConfiguration = vectConfig.at(0);
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Object::sptr object = this->getObject() ;
+    const ::fwData::Object::FieldMapType& fieldsMap = object->getFields();
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+    for (iter = m_managerConfiguration->begin() ; iter != m_managerConfiguration->end() ; ++iter)
+    {
+        if ((*iter)->getName() == "field")
+        {
+            const std::string fieldName = (*iter)->getAttributeValue("id");
+
+            if (fieldsMap.find(fieldName) != fieldsMap.end())
+            {
+                this->addField(fieldName, fieldsMap.at(fieldName));
+            }
+            else if (m_dummyStopMode)
+            {
+                // Initialize on dummy fields
+                this->initOnDummyObject( fieldName );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::addFields( const ModifiedFieldsContainerType& fields )
+{
+    BOOST_FOREACH( ModifiedFieldsContainerType::value_type addedObjectId, fields)
+    {
+        if(m_fieldsSubServices.find(addedObjectId.first) != m_fieldsSubServices.end())
+        {
+            // Services are on dummyObject
+            this->swapField(addedObjectId.first, addedObjectId.second);
+        }
+        else
+        {
+            this->addField(addedObjectId.first, addedObjectId.second);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwServices::IService::sptr SField::add( ::fwData::Object::sptr obj , ::fwRuntime::ConfigurationElement::sptr _elt )
+{
+    OSLM_ASSERT("ConfigurationElement node name must be \"service\" not "<<_elt->getName(), _elt->getName() == "service" ) ;
+    SLM_ASSERT("Attribute \"type\" is missing", _elt->hasAttribute("type") ) ;
+    SLM_ASSERT("Attribute \"impl\" is missing", _elt->hasAttribute("impl") ) ;
+
+    ::fwServices::IService::sptr service ;
+
+    std::string serviceType = _elt->getExistingAttributeValue("type") ;
+    std::string implementationType = _elt->getExistingAttributeValue("impl");
+
+    // Add service with possible id
+    if( _elt->hasAttribute("uid")  )
+    {
+        service = ::fwServices::add( obj , serviceType , implementationType , _elt->getExistingAttributeValue("uid") );
+    }
+    else
+    {
+        service =  ::fwServices::add( obj , serviceType , implementationType )  ;
+    }
+
+    // Search for configuration : inline or offline
+    ::fwRuntime::ConfigurationElement::sptr cfg = _elt;
+    if( _elt->hasAttribute("config"))
+    {
+        cfg = ::fwRuntime::ConfigurationElement::constCast( ::fwServices::registry::ServiceConfig::getDefault()->getServiceConfig( _elt->getExistingAttributeValue("config") , implementationType ) );
+    }
+
+    // Set configuration
+    service->setConfiguration( cfg ) ;
+
+    // Configure
+    service->configure();
+
+    // Return
+    return service ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::addField( const FieldNameType& fieldName, ::fwData::Object::sptr field )
+{
+    if(!m_managerConfiguration->find("field", "id", fieldName).empty())
+    {
+        ConfigurationType conf = m_managerConfiguration->find("field", "id", fieldName).at(0);
+        const std::string fieldType   = conf->getAttributeValue("type");
+
+        OSLM_ASSERT("FieldType "<<fieldType<<" does not match ObjectType in Object "<<field->getClassname(),
+                fieldType == field->getClassname());
+        SubServicesVecType subVecSrv;
+        std::vector< ConfigurationType > services = conf->find("service");
+        BOOST_FOREACH( ConfigurationType cfg, services)
+        {
+            ::fwServices::IService::sptr srv = this->add( field, cfg );
+            OSLM_ASSERT("Instantiation Service failed on field "<<fieldName, srv);
+            srv->configure();
+            SPTR(SubService) subSrv =  SPTR(SubService)( new SubService());
+            subSrv->m_config = cfg;
+            subSrv->m_service = srv;
+
+            // Standard communication management
+            SLM_ASSERT("autoConnect attribute missing in service "<< srv->getClassname(),
+                       cfg->hasAttribute("autoConnect"));
+
+            if ( cfg->getExistingAttributeValue("autoConnect") == "yes" )
+            {
+                subSrv->m_hasAutoConnection = true;
+                if (!subSrv->m_connections)
+                {
+                    subSrv->m_connections = ::fwServices::helper::SigSlotConnection::New();
+                }
+                subSrv->m_connections->connect( field, srv, srv->getObjSrvConnections() );
+            }
+
+            subVecSrv.push_back(subSrv);
+            subSrv->getService()->start();
+            if (m_mode =="startAndUpdate")
+            {
+                subSrv->getService()->update();
+            }
+        }
+        m_fieldsSubServices[fieldName] = subVecSrv;
+
+        this->manageConnections(fieldName, field, conf);
+        this->manageProxies(fieldName, field, conf);
+    }
+    else
+    {
+        OSLM_DEBUG("Field "<<fieldName<<" not managed.");
+    }
+}
+//-----------------------------------------------------------------------------
+
+void SField::swapFields( const ModifiedFieldsContainerType& fields )
+{
+    BOOST_FOREACH( ModifiedFieldsContainerType::value_type swappedObjectId, fields)
+    {
+        this->swapField(swappedObjectId.first, swappedObjectId.second);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::swapField(const FieldNameType& fieldName, ::fwData::Object::sptr field)
+{
+    std::vector< ConfigurationType > fields = m_managerConfiguration->find("field", "id", fieldName);
+    BOOST_FOREACH( ConfigurationType cfg, fields)
+    {
+        SubServicesVecType subServices = m_fieldsSubServices[fieldName];
+        BOOST_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on " << fieldName <<" expired !", subSrv->getService() );
+            OSLM_ASSERT( subSrv->getService()->getID() <<  " is not started ", subSrv->getService()->isStarted());
+
+            OSLM_TRACE("Swapping subService " << subSrv->getService()->getID() << " on "<< fieldName );
+            if(subSrv->getService()->getObject() != field)
+            {
+                subSrv->getService()->swap(field);
+                subSrv->m_dummy.reset();
+
+                if (subSrv->m_hasAutoConnection)
+                {
+                    subSrv->m_connections->disconnect();
+                    subSrv->m_connections->connect( field, subSrv->getService(),
+                                                    subSrv->getService()->getObjSrvConnections() );
+                }
+            }
+            else
+            {
+                OSLM_WARN( subSrv->getService()->getID()
+                           << "'s field already is '"
+                           << subSrv->getService()->getObject()->getID()
+                           << "', no need to swap");
+            }
+        }
+        this->manageConnections(fieldName, field, cfg);
+        this->manageProxies(fieldName, field, cfg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::removeFields( const ModifiedFieldsContainerType& fields )
+{
+    BOOST_FOREACH( ModifiedFieldsContainerType::value_type swappedObjectId, fields)
+    {
+        this->removeField(swappedObjectId.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::removeField( const FieldNameType& fieldName )
+{
+    if(!m_managerConfiguration->find("field", "id", fieldName).empty())
+    {
+        ConfigurationType conf = m_managerConfiguration->find("field", "id", fieldName).at(0);
+        const std::string fieldType   = conf->getAttributeValue("type");
+
+        this->removeConnections(fieldName);
+        this->disconnectProxies(fieldName);
+
+        SubServicesVecType subServices = m_fieldsSubServices[fieldName];
+        ::fwData::Object::sptr dummyObj;
+        dummyObj = ::fwData::factory::New(fieldType);
+        BOOST_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on " << fieldName <<" expired !", subSrv->getService() );
+            OSLM_ASSERT( subSrv->getService()->getID() <<  " is not started ", subSrv->getService()->isStarted());
+            if(m_dummyStopMode)
+            {
+                subSrv->getService()->swap(dummyObj);
+                subSrv->m_dummy = dummyObj;
+            }
+            else
+            {
+                if( subSrv->m_hasAutoConnection )
+                {
+                    subSrv->m_connections->disconnect();
+                }
+
+                subSrv->getService()->stop();
+                ::fwServices::OSR::unregisterService(subSrv->getService());
+                subSrv->m_service.reset();
+            }
+        }
+        if(!m_dummyStopMode)
+        {
+            m_fieldsSubServices.erase(fieldName);
+        }
+        else
+        {
+            this->manageConnections(fieldName, dummyObj, conf);
+            this->manageProxies(fieldName, dummyObj, conf);
+        }
+    }
+    else
+    {
+        OSLM_DEBUG("Object "<<fieldName<<" not managed.");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SField::initOnDummyObject( const FieldNameType& fieldName )
+{
+    SLM_ASSERT( "'fieldName' required attribute missing or empty", !fieldName.empty() );
+
+    ::fwData::Object::sptr object = this->getObject() ;
+
+    OSLM_ASSERT(fieldName << " not found in object.",
+            object->getFields().find(fieldName) == object->getFields().end());
+
+    ConfigurationType conf = m_managerConfiguration->find("field", "id", fieldName).at(0);
+    const std::string fieldType    = conf->getAttributeValue("type");
+    SLM_ASSERT( "'type' required attribute missing or empty", !fieldType.empty() );
+
+    // Any subServices have been registered with field.
+    if ( m_fieldsSubServices.count(fieldName) == 0 )
+    {
+        OSLM_TRACE ( "'"<< fieldName << "' nonexistent'");
+
+        ::fwData::Object::sptr dummyObj;
+        dummyObj = ::fwData::factory::New(fieldType);
+        SubServicesVecType subVecSrv;
+        std::vector< ConfigurationType > services = conf->find("service");
+        BOOST_FOREACH( ConfigurationType cfg, services)
+        {
+            ::fwServices::IService::sptr srv = this->add( dummyObj, cfg );
+            OSLM_ASSERT("Instantiation Service failed ofieldct "<<fieldName, srv);
+            srv->configure();
+            SPTR(SubService) subSrv =  SPTR(SubService)( new SubService());
+            subSrv->m_config = cfg;
+            subSrv->m_service = srv;
+            subSrv->m_dummy = dummyObj;
+            subVecSrv.push_back(subSrv);
+            subSrv->getService()->start();
+
+            if ( cfg->getExistingAttributeValue("autoConnect") == "yes" )
+            {
+                subSrv->m_hasAutoConnection = true;
+                subSrv->m_connections = ::fwServices::helper::SigSlotConnection::New();
+            }
+        }
+        m_fieldsSubServices[fieldName] = subVecSrv;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // manager
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SwapperSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SwapperSrv.cpp
new file mode 100644
index 0000000..f06433c
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/manager/SwapperSrv.cpp
@@ -0,0 +1,458 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCom/HasSignals.hpp>
+#include <fwCom/HasSlots.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwData/Composite.hpp>
+
+#include "ctrlSelection/manager/SwapperSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace manager
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IManagerSrv, ::ctrlSelection::manager::SwapperSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+SwapperSrv::SwapperSrv() throw() : m_dummyStopMode(false)
+{
+    //handlingEventOff ::fwComEd::CompositeMsg::ADDED_KEYS );
+    //handlingEventOff ::fwComEd::CompositeMsg::REMOVED_KEYS );
+    //handlingEventOff ::fwComEd::CompositeMsg::CHANGED_KEYS );
+}
+
+//-----------------------------------------------------------------------------
+
+SwapperSrv::~SwapperSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(message);
+    if (compositeMsg)
+    {
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getAddedKeys();
+            this->addObjects( fields );
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getRemovedKeys();
+            this->removeObjects( fields );
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getNewChangedKeys();
+            this->swapObjects( fields );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::updating() throw ( ::fwTools::Failed )
+{
+    stopping();
+    starting();
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    while( !m_objectConnections.empty())
+    {
+        this->removeConnections(m_objectConnections.begin()->first);
+    }
+    SLM_ASSERT("Connections must be empty", m_objectConnections.empty());
+
+    while( !m_proxyCtns.empty())
+    {
+        this->disconnectProxies(m_proxyCtns.begin()->first);
+    }
+    SLM_ASSERT("Proxy connections must be empty", m_proxyCtns.empty());
+
+
+    BOOST_FOREACH(SubServicesMapType::value_type elt, m_objectsSubServices)
+    {
+        SubServicesVecType subServices = elt.second;
+        BOOST_REVERSE_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on "<< elt.first <<" expired !", subSrv->getService() );
+
+            if( subSrv->m_hasAutoConnection )
+            {
+                subSrv->m_connections->disconnect();
+            }
+            subSrv->getService()->stop();
+            ::fwServices::OSR::unregisterService(subSrv->getService());
+            subSrv->m_service.reset();
+        }
+    }
+    m_objectsSubServices.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    std::vector < ConfigurationType > vectMode = m_configuration->find("mode");
+    if(!vectMode.empty())
+    {
+        ConfigurationType modeConfiguration = vectMode.at(0);
+        SLM_ASSERT("Missing attribute type", modeConfiguration->hasAttribute("type"));
+        std::string mode = modeConfiguration->getAttributeValue("type");
+        SLM_ASSERT("Wrong type mode", (mode == "dummy" ) || (mode == "stop" ) || mode=="startAndUpdate");
+        m_dummyStopMode = (mode == "dummy" );
+        m_mode = mode;
+    }
+
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+    SLM_ASSERT("Missing <config> tag!", !vectConfig.empty());
+    m_managerConfiguration = vectConfig.at(0);
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >() ;
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+    for (iter = m_managerConfiguration->begin() ; iter != m_managerConfiguration->end() ; ++iter)
+    {
+        if ((*iter)->getName() == "object")
+        {
+            const std::string objectId      = (*iter)->getAttributeValue("id");
+
+            if (composite->find(objectId) != composite->end())
+            {
+                this->addObject(objectId, (*composite)[objectId]);
+            }
+            else if (m_dummyStopMode)
+            {
+                // Initialize on dummy objects
+                this->initOnDummyObject( objectId );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::addObjects( ::fwData::Composite::sptr _composite )
+{
+    BOOST_FOREACH( ::fwData::Composite::ValueType addedObjectId, _composite->getContainer())
+    {
+        if(m_objectsSubServices.find(addedObjectId.first) != m_objectsSubServices.end())
+        {
+            // Services are on dummyObject
+            this->swapObject(addedObjectId.first, addedObjectId.second);
+        }
+        else
+        {
+            this->addObject(addedObjectId.first, addedObjectId.second);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwServices::IService::sptr SwapperSrv::add( ::fwData::Object::sptr obj , ::fwRuntime::ConfigurationElement::sptr _elt )
+{
+    OSLM_ASSERT("ConfigurationElement node name must be \"service\" not "<<_elt->getName(), _elt->getName() == "service" ) ;
+    SLM_ASSERT("Attribute \"type\" is missing", _elt->hasAttribute("type") ) ;
+    SLM_ASSERT("Attribute \"impl\" is missing", _elt->hasAttribute("impl") ) ;
+
+    ::fwServices::IService::sptr service ;
+
+    std::string serviceType = _elt->getExistingAttributeValue("type") ;
+    std::string implementationType = _elt->getExistingAttributeValue("impl");
+
+    // Add service with possible id
+    if( _elt->hasAttribute("uid")  )
+    {
+        service = ::fwServices::add( obj , serviceType , implementationType , _elt->getExistingAttributeValue("uid") );
+    }
+    else
+    {
+        service =  ::fwServices::add( obj , serviceType , implementationType )  ;
+    }
+
+    // Search for configuration : inline or offline
+    ::fwRuntime::ConfigurationElement::sptr cfg = _elt;
+    if( _elt->hasAttribute("config"))
+    {
+        cfg = ::fwRuntime::ConfigurationElement::constCast(
+                ::fwServices::registry::ServiceConfig::getDefault()->getServiceConfig(
+                        _elt->getExistingAttributeValue("config") , implementationType ) );
+    }
+
+    // Set configuration
+    service->setConfiguration( cfg ) ;
+
+    // Configure
+    service->configure();
+
+    // Return
+    return service ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::addObject( const std::string &objectId, ::fwData::Object::sptr object )
+{
+    if(!m_managerConfiguration->find("object", "id", objectId).empty())
+    {
+        ConfigurationType conf = m_managerConfiguration->find("object", "id", objectId).at(0);
+        const std::string objectType   = conf->getAttributeValue("type");
+
+        OSLM_ASSERT("ObjectType "<<objectType<<" does not match ObjectType in Composite "<<object->getClassname(),
+                objectType == object->getClassname());
+        SubServicesVecType subVecSrv;
+        std::vector< ConfigurationType > confVec = conf->find("service");
+        BOOST_FOREACH( ConfigurationType cfg, confVec )
+        {
+            ::fwServices::IService::sptr srv = this->add( object, cfg );
+            OSLM_ASSERT("Instantiation Service failed on object "<<objectId, srv);
+
+            SPTR(SubService) subSrv =  SPTR(SubService)( new SubService());
+            subSrv->m_config = cfg;
+            subSrv->m_service = srv;
+
+            // Standard communication management
+            SLM_ASSERT("autoConnect attribute missing in service "<< srv->getClassname(),
+                       cfg->hasAttribute("autoConnect"));
+
+            if ( cfg->getExistingAttributeValue("autoConnect") == "yes" )
+            {
+                subSrv->m_hasAutoConnection = true;
+                if (!subSrv->m_connections)
+                {
+                    subSrv->m_connections = ::fwServices::helper::SigSlotConnection::New();
+                }
+                subSrv->m_connections->connect( object, srv, srv->getObjSrvConnections() );
+            }
+
+            subVecSrv.push_back(subSrv);
+            subSrv->getService()->start();
+            if (m_mode =="startAndUpdate")
+            {
+                subSrv->getService()->update();
+            }
+        }
+        m_objectsSubServices[objectId] = subVecSrv;
+
+
+        this->manageConnections(objectId, object, conf);
+        this->manageProxies(objectId, object, conf);
+    }
+    else
+    {
+        OSLM_DEBUG("Object "<<objectId<<" not managed.");
+    }
+}
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::swapObjects( ::fwData::Composite::sptr _composite )
+{
+    BOOST_FOREACH( ::fwData::Composite::ValueType swappedObjectId, _composite->getContainer())
+    {
+        this->swapObject(swappedObjectId.first, swappedObjectId.second);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::swapObject(const std::string &objectId, ::fwData::Object::sptr object)
+{
+    std::vector< ConfigurationType > confVec = m_managerConfiguration->find("object", "id", objectId);
+    BOOST_FOREACH( ConfigurationType cfg, confVec )
+    {
+        this->removeConnections(objectId);
+        this->disconnectProxies(objectId);
+
+        SubServicesVecType subServices = m_objectsSubServices[objectId];
+        BOOST_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on " << objectId <<" expired !", subSrv->getService() );
+            OSLM_ASSERT( subSrv->getService()->getID() <<  " is not started ", subSrv->getService()->isStarted());
+
+            OSLM_TRACE("Swapping subService " << subSrv->getService()->getID() << " on "<< objectId );
+            if(subSrv->getService()->getObject() != object)
+            {
+                subSrv->getService()->swap(object);
+                subSrv->m_dummy.reset();
+
+                if (subSrv->m_hasAutoConnection)
+                {
+                    subSrv->m_connections->disconnect();
+                    subSrv->m_connections->connect( object, subSrv->getService(),
+                                                    subSrv->getService()->getObjSrvConnections() );
+                }
+            }
+            else
+            {
+                OSLM_WARN( subSrv->getService()->getID()
+                           << "'s object already is '"
+                           << subSrv->getService()->getObject()->getID()
+                           << "', no need to swap");
+            }
+        }
+
+        this->manageConnections(objectId, object, cfg);
+        this->manageProxies(objectId, object, cfg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::removeObjects( ::fwData::Composite::sptr _composite )
+{
+    BOOST_FOREACH( ::fwData::Composite::ValueType swappedObjectId, _composite->getContainer())
+    {
+        this->removeObject(swappedObjectId.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::removeObject( const std::string &objectId )
+{
+    if(!m_managerConfiguration->find("object", "id", objectId).empty())
+    {
+        ConfigurationType conf = m_managerConfiguration->find("object", "id", objectId).at(0);
+        const std::string objectType   = conf->getAttributeValue("type");
+
+        this->removeConnections(objectId);
+        this->disconnectProxies(objectId);
+
+        SubServicesVecType subServices = m_objectsSubServices[objectId];
+        ::fwData::Object::sptr dummyObj;
+        dummyObj = ::fwData::factory::New(objectType);
+        BOOST_FOREACH( SPTR(SubService) subSrv, subServices )
+        {
+            OSLM_ASSERT("SubService on " << objectId <<" expired !", subSrv->getService() );
+            OSLM_ASSERT( subSrv->getService()->getID() <<  " is not started ", subSrv->getService()->isStarted());
+
+            if (subSrv->m_hasAutoConnection)
+            {
+                subSrv->m_connections->disconnect();
+            }
+            if(m_dummyStopMode)
+            {
+                subSrv->getService()->swap(dummyObj);
+                subSrv->m_dummy = dummyObj;
+            }
+            else
+            {
+                subSrv->getService()->stop();
+                ::fwServices::OSR::unregisterService(subSrv->getService());
+                subSrv->m_service.reset();
+            }
+        }
+        if(!m_dummyStopMode)
+        {
+            m_objectsSubServices.erase(objectId);
+        }
+        else
+        {
+            this->manageConnections(objectId, dummyObj, conf);
+            this->manageProxies(objectId, dummyObj, conf);
+        }
+    }
+    else
+    {
+        OSLM_DEBUG("Object "<<objectId<<" not managed.");
+    }
+}
+//-----------------------------------------------------------------------------
+
+void SwapperSrv::initOnDummyObject( std::string objectId )
+{
+    SLM_ASSERT( "'objectId' required attribute missing or empty", !objectId.empty() );
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >() ;
+
+    OSLM_ASSERT(objectId << " not found in composite.", composite->find(objectId) == composite->end());
+
+    ConfigurationType conf = m_managerConfiguration->find("object", "id", objectId).at(0);
+    const std::string objectType    = conf->getAttributeValue("type");
+    SLM_ASSERT( "'type' required attribute missing or empty", !objectType.empty() );
+
+    // Any subServices have been registered with object.
+    if ( m_objectsSubServices.count(objectId) == 0 )
+    {
+        OSLM_TRACE ( "'"<< objectId << "' nonexistent'");
+
+        ::fwData::Object::sptr dummyObj;
+        dummyObj = ::fwData::factory::New(objectType);
+        SubServicesVecType subVecSrv;
+        std::vector < ConfigurationType > confVec = conf->find("service");
+        BOOST_FOREACH( ConfigurationType cfg, confVec )
+        {
+            ::fwServices::IService::sptr srv = this->add( dummyObj, cfg );
+            OSLM_ASSERT("Instantiation Service failed on object "<<objectId, srv);
+
+            SPTR(SubService) subSrv =  SPTR(SubService)( new SubService());
+            subSrv->m_config = cfg;
+            subSrv->m_service = srv;
+            subSrv->m_dummy = dummyObj;
+
+            if ( cfg->getExistingAttributeValue("autoConnect") == "yes" )
+            {
+                subSrv->m_hasAutoConnection = true;
+                subSrv->m_connections = ::fwServices::helper::SigSlotConnection::New();
+            }
+
+            subVecSrv.push_back(subSrv);
+            subSrv->getService()->start();
+        }
+        m_objectsSubServices[objectId] = subVecSrv;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // manager
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.cpp
new file mode 100644
index 0000000..739dd6d
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/updater/DataInfoFromMsgUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::DataInfoFromMsgUpdaterSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+DataInfoFromMsgUpdaterSrv::DataInfoFromMsgUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DataInfoFromMsgUpdaterSrv::~DataInfoFromMsgUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    for (   ManagedEvents::iterator it = m_managedEvents.begin();
+            it != m_managedEvents.end();
+            ++it )
+    {
+        std::string event         = it->get<0>();
+        std::string uuid          = it->get<1>();
+        std::string compositeKey  = it->get<2>();
+        ctrlSelection::IUpdaterSrv::ActionType action        = it->get<3>();
+
+        //  test if message correspond to a defined event
+        if( _msg->hasEvent( event ) )
+        {
+            ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast( _msg->getSubject().lock() );
+            SLM_ASSERT("Sorry, the subject of message is not a ::fwData::Object", obj);
+
+            // Test if we manage this event from this object message uid
+            if( obj->getID() == uuid || uuid == "*")
+            {
+                ::fwData::Object::sptr dataInfo = ::boost::const_pointer_cast< ::fwData::Object >(_msg->getDataInfo(  event ));
+                SLM_ASSERT("no dataInfo set!!!" ,  dataInfo
+                        ||  action== ctrlSelection::IUpdaterSrv::REMOVE
+                        ||  action== ctrlSelection::IUpdaterSrv::REMOVE_IF_PRESENT
+                );
+                // Udpate the composite object referenced by the composite key
+                this->updateComposite(composite, dataInfo , compositeKey , action );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->configureManagedEvents(m_configuration);
+}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void DataInfoFromMsgUpdaterSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // updater
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ObjFromMsgUpdaterSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ObjFromMsgUpdaterSrv.cpp
new file mode 100644
index 0000000..c9c01c8
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ObjFromMsgUpdaterSrv.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/updater/ObjFromMsgUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::ObjFromMsgUpdaterSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+ObjFromMsgUpdaterSrv::ObjFromMsgUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+ObjFromMsgUpdaterSrv::~ObjFromMsgUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    for (   ManagedEvents::iterator it = m_managedEvents.begin();
+            it != m_managedEvents.end();
+            ++it )
+    {
+        // First element of tuple ( it->get<0>() ) is the event, test if message correspond to a defined event
+        if( _msg->hasEvent( it->get<0>() ) )
+        {
+            ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast( _msg->getSubject().lock() );
+            SLM_ASSERT(obj,"Sorry, the subject of message is not a ::fwData::Object");
+
+            // Test if we manage this event from this object message uid ( it->get<1>() )
+            if( it->get<1>() == "*" || obj->getID() == it->get<1>() )
+            {
+                // Udapte the composite object referenced by the composite key ( it->get<2>() )
+                this->updateComposite(composite, obj, it->get<2>(), it->get<3>() );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->configureManagedEvents(m_configuration);
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjFromMsgUpdaterSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // updater
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.cpp
new file mode 100644
index 0000000..1f5a1ec
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.cpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwComEd/ResectionMsg.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/updater/ReconstructionFromResecUpdaterSrv.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::ReconstructionFromResecUpdaterSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+ReconstructionFromResecUpdaterSrv::ReconstructionFromResecUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+ReconstructionFromResecUpdaterSrv::~ReconstructionFromResecUpdaterSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    for (   ManagedEvents::iterator it = m_managedEvents.begin();
+            it != m_managedEvents.end();
+            ++it )
+    {
+        // First element of tuple ( it->get<0>() ) is the event, test if message correspond to a defined event
+        if( _msg->hasEvent( it->get<0>() ) )
+        {
+            ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast( _msg->getSubject().lock() );
+            SLM_ASSERT(obj,"Sorry, the subject of message is not a ::fwData::Object");
+
+            // Test if we manage this event from this object message uid ( it->get<1>() )
+            if( it->get<1>() == "*" || obj->getID() == it->get<1>() )
+            {
+                ::fwData::Reconstruction::sptr reconst;
+                ActionType action = it->get<3>();
+                if( action != REMOVE && action != REMOVE_IF_PRESENT && action != DO_NOTHING)
+                {
+                    reconst = this->getReconstruction(_msg);
+                }
+                // Udapte the composite object referenced by the composite key ( it->get<2>() )
+                this->updateComposite(composite, reconst, it->get<2>(), it->get<3>() );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Reconstruction::sptr ReconstructionFromResecUpdaterSrv::getReconstruction(::fwServices::ObjectMsg::csptr msg)
+{
+    ::fwData::Reconstruction::sptr reconst;
+    ::fwComEd::ResectionMsg::csptr pResectionMsg = ::fwComEd::ResectionMsg::dynamicConstCast( msg );
+    SLM_FATAL_IF("Sorry, it's not an ResectionMsg", !pResectionMsg);
+
+    SLM_ASSERT("Sorry, there's not NEW_RECONSTRUCTION_SELECTED in ResectionMsg", pResectionMsg->hasEvent( ::fwComEd::ResectionMsg::NEW_RECONSTRUCTION_SELECTED ));
+    ::fwData::Object::csptr dataInfo = pResectionMsg->getDataInfo(::fwComEd::ResectionMsg::NEW_RECONSTRUCTION_SELECTED);
+    SLM_ASSERT("Sorry, there is no dataInfo", dataInfo);
+    ::fwData::String::csptr reconstructionSelectedUID = ::fwData::String::dynamicConstCast( dataInfo ) ;
+    SLM_ASSERT("Sorry,  there is no reconstruction selected", reconstructionSelectedUID);
+    reconst =  ::fwData::Reconstruction::dynamicCast(  ::fwTools::fwID::getObject( reconstructionSelectedUID->value()) );
+
+    return reconst;
+}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->configureManagedEvents(m_configuration);
+}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ReconstructionFromResecUpdaterSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // updater
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SDrop.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SDrop.cpp
new file mode 100644
index 0000000..a8ec821
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SDrop.cpp
@@ -0,0 +1,130 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/updater/SDrop.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::SDrop, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+SDrop::SDrop() throw()
+{
+    //this->addNewHandledEvent("DROPPED_UUID");
+}
+
+//-----------------------------------------------------------------------------
+
+SDrop::~SDrop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    if (_msg->hasEvent("DROPPED_UUID"))
+    {
+        ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+        ::fwData::Object::csptr msgObject = _msg->getDataInfo("DROPPED_UUID");
+
+        ::fwData::String::csptr id = ::fwData::String::dynamicConstCast(msgObject);
+
+        ::fwData::Object::sptr object = ::fwData::Object::dynamicCast(::fwTools::UUID::get(id->getValue()));
+        if(object)
+        {
+
+            ::fwComEd::helper::Composite helper( this->getObject< ::fwData::Composite >() );
+            helper.clear();
+            if(object->isA("::fwData::Image"))
+            {
+                helper.add("image", object);
+            }
+            else if(object->isA("::fwData::Mesh"))
+            {
+                helper.add("mesh", object);
+            }
+            else if(object->isA("::fwData::Reconstruction"))
+            {
+                helper.add("reconstruction", object);
+            }
+            else if(object->isA("::fwData::Resection"))
+            {
+                helper.add("resection", object);
+            }
+            else if(object->isA("::fwData::ResectionDB"))
+            {
+                helper.add("resectionDB", object);
+            }
+            else if(object->isA("::fwData::Plane"))
+            {
+                helper.add("plane", object);
+            }
+            else if(object->isA("::fwData::PlaneList"))
+            {
+                helper.add("planeList", object);
+            }
+            helper.notify(this->getSptr());
+        }
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+
+void SDrop::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SDrop::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // updater
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.cpp
new file mode 100644
index 0000000..5c545b5
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwComEd/ModelSeriesMsg.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "ctrlSelection/updater/SReconstructionFromModelSeriesUpdater.hpp"
+
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::SReconstructionFromModelSeriesUpdater, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+SReconstructionFromModelSeriesUpdater::SReconstructionFromModelSeriesUpdater() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+SReconstructionFromModelSeriesUpdater::~SReconstructionFromModelSeriesUpdater() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    for (   ManagedEvents::iterator it = m_managedEvents.begin();
+            it != m_managedEvents.end();
+            ++it )
+    {
+        // First element of tuple ( it->get<0>() ) is the event, test if message correspond to a defined event
+        if( _msg->hasEvent( it->get<0>() ) )
+        {
+            ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast( _msg->getSubject().lock() );
+            SLM_ASSERT(obj,"Sorry, the subject of message is not a ::fwData::Object");
+
+            // Test if we manage this event from this object message uid ( it->get<1>() )
+            if( it->get<1>() == "*" || obj->getID() == it->get<1>() )
+            {
+                ::fwData::Reconstruction::sptr reconst;
+                ActionType action = it->get<3>();
+                if( action != REMOVE && action != REMOVE_IF_PRESENT && action != DO_NOTHING)
+                {
+                    reconst = this->getReconstruction(_msg);
+                }
+                // Udapte the composite object referenced by the composite key ( it->get<2>() )
+                this->updateComposite(composite, reconst, it->get<2>(), it->get<3>() );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Reconstruction::sptr SReconstructionFromModelSeriesUpdater::getReconstruction(::fwServices::ObjectMsg::csptr msg)
+{
+    ::fwData::Reconstruction::sptr reconst;
+    ::fwComEd::ModelSeriesMsg::csptr pModelSeriesMsg = ::fwComEd::ModelSeriesMsg::dynamicConstCast( msg );
+    SLM_FATAL_IF("Received message isn't a ModelSeriesMsg", !pModelSeriesMsg);
+
+    SLM_ASSERT("Sorry, there's not NEW_RECONSTRUCTION_SELECTED in ModelSeriesMsg", pModelSeriesMsg->hasEvent( ::fwComEd::ModelSeriesMsg::NEW_RECONSTRUCTION_SELECTED ));
+    ::fwData::Object::csptr dataInfo = pModelSeriesMsg->getDataInfo(::fwComEd::ModelSeriesMsg::NEW_RECONSTRUCTION_SELECTED);
+    SLM_ASSERT("Sorry, there is no dataInfo", dataInfo);
+    ::fwData::String::csptr reconstructionSelectedUID = ::fwData::String::dynamicConstCast( dataInfo ) ;
+    SLM_ASSERT("Sorry,  there is no reconstruction selected", reconstructionSelectedUID);
+    reconst =  ::fwData::Reconstruction::dynamicCast( ::fwTools::fwID::getObject(reconstructionSelectedUID->value() ));
+
+    return reconst;
+}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->configureManagedEvents(m_configuration);
+}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReconstructionFromModelSeriesUpdater::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace updater
+} // namespace ctrlSelection
+
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/TranslateUpdater.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/TranslateUpdater.cpp
new file mode 100644
index 0000000..e789b7f
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/updater/TranslateUpdater.cpp
@@ -0,0 +1,175 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+
+#include "ctrlSelection/updater/TranslateUpdater.hpp"
+
+#include <boost/property_tree/xml_parser.hpp>
+namespace ctrlSelection
+{
+
+namespace updater
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IUpdaterSrv, ::ctrlSelection::updater::TranslateUpdater, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+TranslateUpdater::TranslateUpdater() throw()
+{
+    //handlingEventOff::fwComEd::CompositeMsg::ADDED_KEYS);
+    //handlingEventOff::fwComEd::CompositeMsg::CHANGED_KEYS);
+    //handlingEventOff::fwComEd::CompositeMsg::REMOVED_KEYS);
+}
+
+//-----------------------------------------------------------------------------
+
+TranslateUpdater::~TranslateUpdater() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(_msg);
+    SLM_ASSERT("Sorry, this service only manage compositeMsg", compositeMsg);
+
+    ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast( _msg->getSubject().lock() );
+    SLM_ASSERT(obj,"Sorry, the subject of message is not a ::fwData::Object");
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    for (   ManagedTranslations::const_iterator it = m_managedTranslations.begin();
+            it != m_managedTranslations.end();
+            ++it )
+    {
+        const std::string &fwid     = it->get<0>();
+        const std::string &fromKey  = it->get<1>();
+        const std::string &toKey    = it->get<2>();
+
+        // Test if we manage this event from this object message uid
+        if( obj->getID() == fwid)
+        {
+            //  test if message correspond to a defined event
+            if( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+            {
+                ::fwData::Composite::sptr addedFields = compositeMsg->getAddedKeys();
+                if (addedFields->find(fromKey) != addedFields->end())
+                {
+                    // Udpate the composite object referenced by the composite key
+                    this->updateComposite(composite, (*addedFields)[fromKey] , toKey , ADD );
+                }
+            }
+            else if (compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ))
+            {
+                ::fwData::Composite::sptr swappedFields = compositeMsg->getNewChangedKeys();
+                if (swappedFields->find(fromKey) != swappedFields->end())
+                {
+                    // Udpate the composite object referenced by the composite key
+                    this->updateComposite(composite, (*swappedFields)[fromKey] , toKey , SWAP );
+                }
+            }
+            else if( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS ))
+            {
+                ::fwData::Composite::sptr removedFields = compositeMsg->getRemovedKeys();
+                if (removedFields->find(fromKey) != removedFields->end())
+                {
+                    // Udpate the composite object referenced by the composite key
+                    this->updateComposite(composite, ::fwData::Object::sptr() , toKey , REMOVE );
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    BOOST_FOREACH( const ManagedTranslations::value_type & trans, m_managedTranslations )
+    {
+        const std::string &fwid     = trans.get<0>();
+        const std::string &fromKey  = trans.get<1>();
+        const std::string &toKey    = trans.get<2>();
+
+        ::fwData::Composite::sptr compositeFrom = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject(fwid) );
+        if (compositeFrom)
+        {
+            ::fwData::Composite::const_iterator iter = compositeFrom->find(fromKey);
+            if (iter != compositeFrom->end())
+            {
+                this->updateComposite(composite, iter->second , toKey , ADD_OR_SWAP );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::configuring()  throw ( ::fwTools::Failed )
+{
+    const ::fwServices::IService::ConfigType conf = this->getConfigTree().get_child("service");
+
+    SLM_ASSERT("Problem with configuration for ObjFromMsgUpdaterSrv type, missing element \"translate\"",
+               conf.count("translate") > 0);
+
+    OSLM_DEBUG( "nb of translations = " << conf.count("translate") );
+    m_managedTranslations.clear();
+    BOOST_FOREACH( const ::fwServices::IService::ConfigType::value_type &v, conf.equal_range("translate") )
+    {
+        const ::fwServices::IService::ConfigType &translate = v.second;
+        const ::fwServices::IService::ConfigType xmlattr = translate.get_child("<xmlattr>");
+
+        SLM_FATAL_IF( "Sorry, attribute \"fromKey\" is missing", xmlattr.count("fromKey") != 1 );
+        SLM_FATAL_IF( "Sorry, attribute \"toKey\" is missing", xmlattr.count("toKey") != 1 );
+        SLM_FATAL_IF( "Sorry, attribute \"fromUID\" is missing", xmlattr.count("fromUID") != 1 );
+
+        std::string fromKey = xmlattr.get<std::string>("fromKey");
+        std::string toKey   = xmlattr.get<std::string>("toKey");
+        std::string fromUID = xmlattr.get<std::string>("fromUID");
+
+        OSLM_INFO( "Manage translation from this object "<< fromUID <<", from "<< fromKey << " to "<< toKey <<" in my composite.");
+        ::boost::tuple< std::string, std::string, std::string > managedTranslation (fromUID, fromKey, toKey);
+        m_managedTranslations.push_back( managedTranslation );
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::reconfiguring()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void TranslateUpdater::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // updater
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/GraphWrapperSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/GraphWrapperSrv.cpp
new file mode 100644
index 0000000..e484ca6
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/GraphWrapperSrv.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/Graph.hpp>
+
+#include <fwComEd/GraphMsg.hpp>
+
+
+#include "ctrlSelection/wrapper/GraphWrapperSrv.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+fwServicesRegisterMacro( ::ctrlSelection::IWrapperSrv, ::ctrlSelection::wrapper::GraphWrapperSrv, ::fwData::Graph ) ;
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+//-----------------------------------------------------------------------------
+
+GraphWrapperSrv::GraphWrapperSrv() throw()
+{
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::NEW_OBJECT );
+    //handlingEventOff ::fwServices::ObjectMsg::UPDATED_OBJECT );
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::DELETE_OBJECT );
+}
+
+//-----------------------------------------------------------------------------
+
+GraphWrapperSrv::~GraphWrapperSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void GraphWrapperSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    if ( message->hasEvent( ::fwServices::ObjectMsg::UPDATED_OBJECT ) )
+    {
+        assert( message->getDataInfo( ::fwServices::ObjectMsg::UPDATED_OBJECT   ) == this->getObject() );
+        fwComEd::GraphMsg::sptr msg = fwComEd::GraphMsg::New();
+        msg->addEvent( fwComEd::GraphMsg::NEW_GRAPH , this->getObject() );
+        ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+    }
+    //TODO other event
+}
+
+//-----------------------------------------------------------------------------
+
+} // wrapper
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ImageWrapperSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ImageWrapperSrv.cpp
new file mode 100644
index 0000000..d66cba2
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ImageWrapperSrv.cpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+
+#include "ctrlSelection/wrapper/ImageWrapperSrv.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+fwServicesRegisterMacro( ::ctrlSelection::IWrapperSrv, ::ctrlSelection::wrapper::ImageWrapperSrv, ::fwData::Image ) ;
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+//-----------------------------------------------------------------------------
+
+ImageWrapperSrv::ImageWrapperSrv() throw()
+{
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::NEW_OBJECT );
+    //handlingEventOff ::fwServices::ObjectMsg::UPDATED_OBJECT );
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::DELETE_OBJECT );
+}
+
+//-----------------------------------------------------------------------------
+
+ImageWrapperSrv::~ImageWrapperSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageWrapperSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    if ( message->hasEvent( ::fwServices:: ObjectMsg::UPDATED_OBJECT ) )
+    {
+        assert( message->getDataInfo( ::fwServices:: ObjectMsg::UPDATED_OBJECT   ) == this->getObject() );
+        fwComEd::ImageMsg::sptr msg = fwComEd::ImageMsg::New();
+        msg->addEvent( fwComEd::ImageMsg::NEW_IMAGE , this->getObject() );
+        msg->addEvent( fwComEd::ImageMsg::BUFFER , this->getObject() );
+        ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+    }
+    //TODO other event
+}
+
+//-----------------------------------------------------------------------------
+
+} // wrapper
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgForwarderSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgForwarderSrv.cpp
new file mode 100644
index 0000000..00326d1
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgForwarderSrv.cpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "ctrlSelection/wrapper/MsgForwarderSrv.hpp"
+
+namespace ctrlSelection
+{
+namespace wrapper
+{
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IWrapperSrv, ::ctrlSelection::wrapper::MsgForwarderSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+MsgForwarderSrv::MsgForwarderSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+MsgForwarderSrv::~MsgForwarderSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    BOOST_FOREACH( EventType item, m_managedEvents)
+    {
+        std::string compositeKey = item.get<0>();
+        std::string event        = item.get<1>();
+        std::string fromUID      = item.get<2>();
+        std::string msgType      = item.get<3>();
+        // First element of tuple ( it->get<0>() ) is the event, test if message correspond to a defined event
+        if(  message->isA(msgType))
+        {
+            if(composite->find(compositeKey) != composite->end())
+            {
+                ::fwData::Object::sptr object = (*composite)[compositeKey];
+                ::fwData::Object::sptr objMsg = message->getSubject().lock();
+                // Test if we manage this event from this object message uid ( it->get<1>() )
+                if( objMsg->getID() == fromUID || fromUID == "*")
+                {
+                    if(event == "*" || message->hasEvent( event ) )
+                    {
+                        ::fwServices::IEditionService::notify( this->getSptr(), object, ::fwServices::ObjectMsg::constCast(message) );
+                    }
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::starting()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::stopping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::swapping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::ConfigurationElementContainer handleEvents = m_configuration->findAllConfigurationElement("forward");
+
+    SLM_ASSERT("Problem with configuration for MsgForwarderSrv type, missing element \"forward\"", handleEvents.size() != 0 );
+    m_managedEvents.clear();
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElementContainer::Container::value_type item ,handleEvents.getElements())
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"compositeKey\" is missing", !item->hasAttribute("compositeKey") );
+        std::string compositeKey =  item->getExistingAttributeValue("compositeKey");
+
+        SLM_FATAL_IF( "Sorry, attribute \"onEvent\" is missing", !item->hasAttribute("onEvent") );
+        std::string onEvent =  item->getExistingAttributeValue("onEvent");
+
+        SLM_FATAL_IF( "Sorry, attribute \"fromUID\" is missing", !item->hasAttribute("fromUID") );
+        std::string fromUID =  item->getExistingAttributeValue("fromUID");
+
+        SLM_FATAL_IF( "Sorry, attribute \"typeMsg\" is missing", !item->hasAttribute("msgType") );
+        std::string msgType =  item->getExistingAttributeValue("msgType");
+
+        OSLM_INFO( "Manage event "<< onEvent <<" from this object "<< fromUID <<".");
+        EventType managedEvent (compositeKey, onEvent, fromUID, msgType);
+        m_managedEvents.push_back( managedEvent );
+        //addNewHandledEvent( onEvent );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgForwarderSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // wrapper
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgWrapperSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgWrapperSrv.cpp
new file mode 100644
index 0000000..5c225a8
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/MsgWrapperSrv.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/GraphMsg.hpp>
+
+
+#include "ctrlSelection/wrapper/MsgWrapperSrv.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+fwServicesRegisterMacro( ::ctrlSelection::IWrapperSrv, ::ctrlSelection::wrapper::MsgWrapperSrv, ::fwData::Object ) ;
+
+namespace ctrlSelection
+{
+
+namespace wrapper
+{
+
+//-----------------------------------------------------------------------------
+
+MsgWrapperSrv::MsgWrapperSrv() throw()
+{
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::NEW_OBJECT );
+    //handlingEventOff ::fwServices::ObjectMsg::UPDATED_OBJECT );
+    //TODO addNewHandledEvent( ::fwServices:: ObjectMsg::DELETE_OBJECT );
+}
+
+//-----------------------------------------------------------------------------
+
+MsgWrapperSrv::~MsgWrapperSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MsgWrapperSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::ConfigurationElementContainer handleEvents = m_configuration->findAllConfigurationElement("wrapper");
+
+    SLM_ASSERT("Problem with configuration for ObjToCompositeMsgForwarderSrv type, missing element \"wrapper\"", handleEvents.size() != 0 );
+    m_managedEvents.clear();
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElementContainer::Container::value_type item ,handleEvents.getElements())
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"onEvent\" is missing", !item->hasAttribute("onEvent") );
+        std::string onEvent =  item->getExistingAttributeValue("onEvent");
+
+        SLM_FATAL_IF( "Sorry, attribute \"toEvent\" is missing", !item->hasAttribute("toEvent") );
+        std::string toEvent =  item->getExistingAttributeValue("toEvent");
+
+        SLM_FATAL_IF( "Sorry, attribute \"toMsgType\" is missing", !item->hasAttribute("toMsgType") );
+        std::string msgType =  item->getExistingAttributeValue("toMsgType");
+
+        OSLM_INFO( "Manage event "<< onEvent <<" to " << toEvent << ".");
+        EventType managedEvent ( onEvent, toEvent, msgType);
+        m_managedEvents.push_back( managedEvent );
+        //addNewHandledEvent( onEvent );
+    }
+}
+//-----------------------------------------------------------------------------
+
+void MsgWrapperSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    BOOST_FOREACH( EventType item, m_managedEvents)
+    {
+        std::string onEvent      = item.get<0>();
+        std::string toEvent      = item.get<1>();
+        std::string msgType      = item.get<2>();
+
+        if(message->hasEvent( onEvent ))
+        {
+            ::fwServices::ObjectMsg::sptr wrappedMsg = ::fwServices::factory::message::New(msgType);
+            OSLM_ASSERT(msgType << " creation failed", wrappedMsg);
+            wrappedMsg->addEvent(toEvent, message->getDataInfo(onEvent));
+            ::fwServices::IEditionService::notify( this->getSptr(), this->getObject(), wrappedMsg);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // wrapper
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.cpp b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.cpp
new file mode 100644
index 0000000..a8bdfe9
--- /dev/null
+++ b/Bundles/LeafCtrl/ctrlSelection/src/ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.cpp
@@ -0,0 +1,190 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Composite.hpp>
+
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+
+#include "ctrlSelection/wrapper/ObjToCompositeMsgForwarderSrv.hpp"
+
+namespace ctrlSelection
+{
+namespace wrapper
+{
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::ctrlSelection::IWrapperSrv, ::ctrlSelection::wrapper::ObjToCompositeMsgForwarderSrv, ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+ObjToCompositeMsgForwarderSrv::ObjToCompositeMsgForwarderSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+ObjToCompositeMsgForwarderSrv::~ObjToCompositeMsgForwarderSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::receiving( ::fwServices::ObjectMsg::csptr message ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(message);
+    if (compositeMsg)
+    {
+        if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::ADDED_KEYS))
+        {
+            BOOST_FOREACH(::fwData::Composite::value_type elt, *compositeMsg->getAddedKeys())
+            {
+                std::string key = elt.first;
+                ::fwData::Object::sptr obj = elt.second;
+
+                ::fwCom::Connection connection;
+                connection = obj->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                     this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+                m_objConnections[key] = connection;
+            }
+        }
+        else if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::CHANGED_KEYS))
+        {
+            BOOST_FOREACH(::fwData::Composite::value_type elt, *compositeMsg->getNewChangedKeys())
+            {
+                std::string key = elt.first;
+                ::fwData::Object::sptr obj = elt.second;
+
+                m_objConnections[key].disconnect();
+                ::fwCom::Connection connection;
+                connection = obj->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                    this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+                m_objConnections[key] = connection;
+            }
+        }
+        else if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::REMOVED_KEYS))
+        {
+            BOOST_FOREACH(::fwData::Composite::value_type elt, *compositeMsg->getRemovedKeys())
+            {
+                std::string key = elt.first;
+
+                m_objConnections[key].disconnect();
+                m_objConnections.erase(key);
+            }
+        }
+    }
+    else
+    {
+        ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+        BOOST_FOREACH( EventType item, m_managedEvents)
+        {
+            std::string fromKey      = item.get<0>();
+            std::string event        = item.get<1>();
+            std::string msgType      = item.get<2>();
+
+            if(  message->isA(msgType))
+            {
+                if(fromKey == "*" || (composite->find(fromKey) != composite->end() && (*composite)[fromKey] == message->getSubject().lock()))
+                {
+                    if(event == "*"  )
+                    {
+                        ::fwServices::IEditionService::notify( this->getSptr(), composite, ::fwServices::ObjectMsg::constCast(message) );
+                    }
+                    else if(message->hasEvent( event ))
+                    {
+
+                        ::fwServices::ObjectMsg::sptr forwardMsg = ::fwServices::factory::message::New(msgType);
+                        OSLM_ASSERT(msgType << " creation failed", forwardMsg);
+                        forwardMsg->addEvent(event, message->getDataInfo(event));
+                        ::fwServices::IEditionService::notify( this->getSptr(), composite, forwardMsg);
+                    }
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::starting()  throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *composite)
+    {
+        std::string key = elt.first;
+        ::fwData::Object::sptr obj = elt.second;
+
+        ::fwCom::Connection connection;
+        connection = obj->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                             this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+        m_objConnections[key] = connection;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    BOOST_FOREACH(ObjConnectionMap::value_type elt, m_objConnections)
+    {
+        m_objConnections[elt.first].disconnect();
+    }
+    m_objConnections.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::swapping()  throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::ConfigurationElementContainer handleEvents = m_configuration->findAllConfigurationElement("forward");
+
+    SLM_ASSERT("Problem with configuration for ObjToCompositeMsgForwarderSrv type, missing element \"forward\"", handleEvents.size() != 0 );
+    m_managedEvents.clear();
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElementContainer::Container::value_type item ,handleEvents.getElements())
+    {
+        SLM_FATAL_IF( "Sorry, attribute \"fromKey\" is missing", !item->hasAttribute("fromKey") );
+        std::string fromKey =  item->getExistingAttributeValue("fromKey");
+
+        SLM_FATAL_IF( "Sorry, attribute \"onEvent\" is missing", !item->hasAttribute("onEvent") );
+        std::string onEvent =  item->getExistingAttributeValue("onEvent");
+
+        SLM_FATAL_IF( "Sorry, attribute \"typeMsg\" is missing", !item->hasAttribute("msgType") );
+        std::string msgType =  item->getExistingAttributeValue("msgType");
+
+        OSLM_INFO( "Manage event "<< onEvent <<" from object " << fromKey << ".");
+        EventType managedEvent ( fromKey, onEvent, msgType);
+        m_managedEvents.push_back( managedEvent );
+        //addNewHandledEvent( onEvent );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::updating() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjToCompositeMsgForwarderSrv::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // wrapper
+} // ctrlSelection
diff --git a/Bundles/LeafCtrl/monitor/CMakeLists.txt b/Bundles/LeafCtrl/monitor/CMakeLists.txt
new file mode 100644
index 0000000..5948e36
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/CMakeLists.txt
@@ -0,0 +1,15 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
+if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+    #TODO write FindDbgHelp ...
+    target_link_libraries(${FWPROJECT_NAME} dbghelp)
+endif()
+
diff --git a/Bundles/LeafCtrl/monitor/Properties.cmake b/Bundles/LeafCtrl/monitor/Properties.cmake
new file mode 100644
index 0000000..c189828
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME monitor )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwData fwGui fwMemory fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafCtrl/monitor/bin/build.options b/Bundles/LeafCtrl/monitor/bin/build.options
new file mode 100644
index 0000000..90dc3a7
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/bin/build.options
@@ -0,0 +1,19 @@
+TYPE     = 'bundle'
+VERSION  = '0-1'
+USE      = ['boost','libxml2']
+
+LIB      = [
+           'fwTools_0-1',
+           'fwCore_0-1',
+           'fwRuntime_0-3',
+           'fwData_0-1',
+           'fwServices_0-1',
+           'fwMemory_0-1',
+           'fwGui_0-1',
+           ]
+BUNDLES  = [ 'gui_0-1' ]
+
+if racy.renv.system() == 'windows':
+    USE += ['dbghelp']
+
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/Plugin.hpp b/Bundles/LeafCtrl/monitor/include/monitor/Plugin.hpp
new file mode 100644
index 0000000..63b59f4
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/Plugin.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_PLUGIN_HPP__
+#define __MONITOR_PLUGIN_HPP__
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace monitor
+{
+
+/// Class called when the bundle is loaded and stopped.
+struct Plugin : public ::fwRuntime::Plugin
+{
+
+    /// Destructor
+    ~Plugin() throw();
+
+    // Install a callback which print the backtrace on a SIGSEV and SIGUSR1 signal
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+
+} // namespace monitor
+
+#endif //__MONITOR_PLUGIN_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryConsumption.hpp b/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryConsumption.hpp
new file mode 100644
index 0000000..6a9776f
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryConsumption.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_ACTION_MEMORYCONSUMPTION_HPP__
+#define __MONITOR_ACTION_MEMORYCONSUMPTION_HPP__
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitor/config.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+/// Increase or decrease the memory consumption by storing a new image, use to experiment dump process
+class MONITOR_CLASS_API MemoryConsumption : public  ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MemoryConsumption)(  ::fwGui::IActionSrv ) ) ;
+
+    /// Does nothing
+    MONITOR_API MemoryConsumption() throw() ;
+
+    /// Does nothing
+    MONITOR_API virtual ~MemoryConsumption() throw() ;
+
+protected :
+
+    /**
+     * @brief Implements configuring method derived from IService. .
+     *
+     * Sample of declaration configuration :
+     *
+     * @verbatim
+         <service uid="myIncMemConsum"  type="::fwGui::IActionSrv"
+            implementation="::monitor::action::MemoryConsumption" autoComChannel="no" >
+            <config mode="increase" value="256" />
+        </service>
+     @endverbatim
+     * With:
+     * @li mode : increase or decrease.
+     * @li value : optional, consuming memory size in Mo (in "increase" mode).
+     */
+    void configuring() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to start
+    void starting() throw (::fwTools::Failed);
+
+    /// Increase or decrease memory with size defined during configuration
+    void updating() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to stop
+    void stopping() throw (::fwTools::Failed);
+
+private:
+
+    /// Intern method to create a new array
+    void pushNewArray(size_t memorySizeInBytes);
+
+    /// To manage allocation or free memory ( data are saved in a static member )
+    bool m_isIncreaseMode;
+
+    /// Memory allocated in "increase" mode
+    size_t m_memorySizeInBytes;
+
+};
+
+
+} // namespace action
+} // namespace monitor
+
+#endif //__MONITOR_ACTION_MEMORYCONSUMPTION_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryInfo.hpp b/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryInfo.hpp
new file mode 100644
index 0000000..746d961
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/action/MemoryInfo.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_MEMORYINFO_HPP__
+#define __MONITOR_MEMORYINFO_HPP__
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitor/config.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+/// Implements an action to show in a message box few memory information
+class MONITOR_CLASS_API MemoryInfo : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (MemoryInfo)( ::fwGui::IActionSrv ) ) ;
+
+    /// Does nothing
+    MONITOR_API MemoryInfo() throw() ;
+
+    /// Does nothing
+    MONITOR_API virtual ~MemoryInfo() throw() ;
+
+protected :
+
+    /// Calls classic IAction methods to configure
+    void configuring() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to start
+    void starting() throw (::fwTools::Failed);
+
+    /// Shows in a message box few memory information
+    void updating() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to stop
+    void stopping() throw (::fwTools::Failed);
+
+};
+
+} // namespace action
+} // namespace monitor
+
+#endif // __MONITOR_MEMORYINFO_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/action/SDumpAll.hpp b/Bundles/LeafCtrl/monitor/include/monitor/action/SDumpAll.hpp
new file mode 100644
index 0000000..c37fe4f
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/action/SDumpAll.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_ACTION_SDUMPALL_HPP__
+#define __MONITOR_ACTION_SDUMPALL_HPP__
+
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitor/config.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+
+/// Implements an action that dump all buffer (if possible)
+class MONITOR_CLASS_API SDumpAll : public ::fwGui::IActionSrv
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SDumpAll)(::fwGui::IActionSrv) ) ;
+
+    /// Does nothing
+    MONITOR_API SDumpAll() throw() ;
+
+    /// Does nothing
+    MONITOR_API virtual ~SDumpAll() throw() ;
+
+protected :
+
+    /// Calls classic IAction methods to configure
+    void configuring() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to start
+    void starting() throw (::fwTools::Failed);
+
+    /// Dump all unlocked array/image etc
+    void updating() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to stop
+    void stopping() throw (::fwTools::Failed);
+
+};
+
+
+} // namespace action
+} // namespace monitor
+
+#endif //__MONITOR_ACTION_SDUMPALL_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/action/fwMetrics.hpp b/Bundles/LeafCtrl/monitor/include/monitor/action/fwMetrics.hpp
new file mode 100644
index 0000000..6c27128
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/action/fwMetrics.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_FWMETRICS_HPP__
+#define __MONITOR_FWMETRICS_HPP__
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitor/config.hpp"
+
+namespace monitor
+{
+
+namespace action
+{
+/// Implements an action for show metrics about f4s factories (number of data, message and service in factories).
+class MONITOR_CLASS_API fwMetrics : public ::fwGui::IActionSrv
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (fwMetrics)( ::fwGui::IActionSrv ) ) ;
+
+    /// Does nothing
+    MONITOR_API fwMetrics() throw() ;
+
+    /// Does nothing
+    MONITOR_API virtual ~fwMetrics() throw() ;
+
+protected :
+
+    /// Calls classic IAction methods to configure
+    void configuring() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to start
+    void starting() throw (::fwTools::Failed);
+
+    /// Show metrics in a dialog message box
+    void updating() throw (::fwTools::Failed);
+
+    /// Calls classic IAction methods to stop
+    void stopping() throw (::fwTools::Failed);
+};
+
+} // namespace action
+
+} // namespace monitor
+
+#endif //__MONITOR_FWMETRICS_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/action/namespace.hpp b/Bundles/LeafCtrl/monitor/include/monitor/action/namespace.hpp
new file mode 100644
index 0000000..9e9e209
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/action/namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_ACTION_NAMESPACE_HPP__
+#define __MONITOR_ACTION_NAMESPACE_HPP__
+
+namespace monitor
+{
+/**
+ * @brief       The namespace monitor::action contains tools for monitoring an application built with FW4SPL.
+ * @namespace   monitor::action
+ */
+namespace action
+{
+
+}
+
+} // namespace monitor
+
+#endif // __MONITOR_ACTION_NAMESPACE_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/config.hpp b/Bundles/LeafCtrl/monitor/include/monitor/config.hpp
new file mode 100644
index 0000000..ed65fac
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MONITOR_CONFIG_HPP_
+#define _MONITOR_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef MONITOR_EXPORTS
+    #define MONITOR_API __declspec(dllexport)
+    #else
+    #define MONITOR_API __declspec(dllimport)
+    #endif
+
+    #define MONITOR_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef MONITOR_EXPORTS
+    #define MONITOR_API __attribute__ ((visibility("default")))
+    #define MONITOR_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define MONITOR_API __attribute__ ((visibility("hidden")))
+    #define MONITOR_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define MONITOR_API
+    #define MONITOR_CLASS_API
+
+#endif
+
+#endif // _MONITOR_CONFIG_HPP_
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/installSIGSEVBacktrace.hpp b/Bundles/LeafCtrl/monitor/include/monitor/installSIGSEVBacktrace.hpp
new file mode 100644
index 0000000..cc6943f
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/installSIGSEVBacktrace.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITOR_INSTALLSIGSEVBACKTRACE_HPP__
+#define __MONITOR_INSTALLSIGSEVBACKTRACE_HPP__
+
+#include "monitor/config.hpp"
+
+
+namespace monitor
+{
+
+
+/**
+ * @brief Function installing  a callback which print the backtrace on a SIGSEV and SIGUSR1 signal
+ *for posix only intern use only for this bundle.
+ */
+MONITOR_API void installSIGSEVBacktrace();
+
+
+/**
+ * @brief Generates segmentation fault for test.
+ */
+MONITOR_API void generateSIGSEV();
+
+
+} // namespace monitor
+
+#endif // __MONITOR_INSTALLSIGSEVBACKTRACE_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/include/monitor/namespace.hpp b/Bundles/LeafCtrl/monitor/include/monitor/namespace.hpp
new file mode 100644
index 0000000..79f99e1
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/include/monitor/namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITORNAMESPACE_HPP__
+#define __MONITORNAMESPACE_HPP__
+
+/**
+ * @brief       The namespace monitor contains tools for monitoring an application built with FW4SPL.
+ * @namespace   monitor
+ */
+namespace monitor
+{
+
+}
+
+#endif // __MONITORNAMESPACE_HPP__
+
diff --git a/Bundles/LeafCtrl/monitor/rc/plugin.xml b/Bundles/LeafCtrl/monitor/rc/plugin.xml
new file mode 100644
index 0000000..a8be2f5
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/rc/plugin.xml
@@ -0,0 +1,29 @@
+<plugin id="monitor" class="::monitor::Plugin">
+    <library name="monitor" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::MemoryInfo</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::fwMetrics</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::MemoryConsumption</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::SDumpAll</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/Plugin.cpp b/Bundles/LeafCtrl/monitor/src/monitor/Plugin.cpp
new file mode 100644
index 0000000..baf0c4c
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/Plugin.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "monitor/installSIGSEVBacktrace.hpp"
+#include "monitor/Plugin.hpp"
+
+namespace monitor
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::monitor::Plugin");
+
+//------------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC() ;
+
+    installSIGSEVBacktrace();
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace monitor
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryConsumption.cpp b/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryConsumption.cpp
new file mode 100644
index 0000000..d946dc5
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryConsumption.cpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <boost/lexical_cast.hpp>
+
+#include <fwData/Array.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "monitor/action/MemoryConsumption.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+/// Static variable shared by both actions
+static std::vector< ::fwData::Array::sptr > memoryConsumer ;
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::monitor::action::MemoryConsumption , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+void MemoryConsumption::pushNewArray(size_t memorySizeInBytes)
+{
+    try
+    {
+        ::fwData::Array::sptr buffer = ::fwData::Array::New();
+        ::fwData::Array::SizeType size(1, memorySizeInBytes);
+        buffer->resize(::fwTools::Type::s_UINT8_TYPENAME, size, 1, true);
+
+        OSLM_INFO("Creating a fwData::array consuming "<< memorySizeInBytes/(1024*1024) << " Mo ") ;
+
+        memoryConsumer.push_back( buffer ) ;
+    }
+    catch( std::exception &e )
+    {
+        std::stringstream msg ;
+        msg << "Cannot allocate buffer (256 Mo) :\n" << e.what() << std::endl ;
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                            "Action increase memory",
+                            msg.str(),
+                            ::fwGui::dialog::IMessageDialog::CRITICAL);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+MemoryConsumption::MemoryConsumption( ) throw() :
+        m_isIncreaseMode(true), m_memorySizeInBytes(1024*1024*256) // 256 Mo
+{}
+
+//------------------------------------------------------------------------------
+
+MemoryConsumption::~MemoryConsumption() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void MemoryConsumption::updating() throw(::fwTools::Failed)
+{
+    if(m_isIncreaseMode)
+    {
+        this->pushNewArray(m_memorySizeInBytes) ;
+    }
+    else
+    {
+        if( !memoryConsumer.empty() )
+        {
+            SLM_INFO("Removing one fwData::Array") ;
+            memoryConsumer.pop_back() ;
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MemoryConsumption::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+
+    ::fwRuntime::ConfigurationElement::sptr consumptionCfg;
+    consumptionCfg = m_configuration->findConfigurationElement("config");
+    SLM_ASSERT("Missing mode tag", consumptionCfg);
+
+    SLM_ASSERT("Missing attribute 'value'", consumptionCfg->hasAttribute("mode"));
+    std::string mode = consumptionCfg->getAttributeValue("mode");
+    OSLM_ASSERT("Wrong value ("<< mode <<") for mode tag", mode == "increase" || mode == "decrease");
+    m_isIncreaseMode = (mode == "increase");
+
+    if(m_isIncreaseMode && consumptionCfg->hasAttribute("value"))
+    {
+        std::string value = consumptionCfg->getAttributeValue("value");
+        size_t sizeInMo = ::boost::lexical_cast<size_t>(value);
+        m_memorySizeInBytes = sizeInMo * 1024 * 1024;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MemoryConsumption::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+void MemoryConsumption::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace basicOpCtrl
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryInfo.cpp b/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryInfo.cpp
new file mode 100644
index 0000000..3ab366c
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/action/MemoryInfo.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+
+#include <fwServices/macros.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/tools/MemoryMonitorTools.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "monitor/action/MemoryInfo.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::monitor::action::MemoryInfo , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+MemoryInfo::MemoryInfo( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+MemoryInfo::~MemoryInfo() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+
+void MemoryInfo::updating( ) throw(::fwTools::Failed)
+{
+    // Memory information
+    ::boost::uint64_t mo = 1024*1024;
+    ::boost::uint64_t totalSystemMemory     = ::fwMemory::tools::MemoryMonitorTools::getTotalSystemMemory();
+    ::boost::uint64_t freeSystemMemory      = ::fwMemory::tools::MemoryMonitorTools::getFreeSystemMemory();
+    ::boost::uint64_t usedProcessMemory     = ::fwMemory::tools::MemoryMonitorTools::getUsedProcessMemory();
+    ::boost::uint64_t estimateFreeMem       = ::fwMemory::tools::MemoryMonitorTools::estimateFreeMem();
+
+    ::fwMemory::BufferManager::SizeType managedBufferSize = 0;
+    ::fwMemory::BufferManager::SizeType dumpedBufferSize = 0;
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    if( manager )
+    {
+        ::fwMemory::BufferManager::BufferStats stats = manager->getBufferStats().get();
+        managedBufferSize = stats.totalManaged;
+        dumpedBufferSize  = stats.totalDumped;
+    }
+    std::stringstream stream;
+    stream << "Total system memory = "  << totalSystemMemory/mo << " Mo" << std::endl;
+    stream << "Free system memory  = "   << freeSystemMemory/mo  << " Mo" << std::endl;
+    stream << "Used process memory = "  << usedProcessMemory/mo << " Mo" << std::endl;
+    stream << "Estimed Free memory = "  << estimateFreeMem/mo << " Mo" << std::endl;
+    stream << "ManagedBuffer size  = "  << managedBufferSize/mo << " Mo" << std::endl;
+    stream << "DumpedBuffer size   = "  << dumpedBufferSize/mo << " Mo" << std::endl;
+
+    // Information message box
+    ::fwGui::dialog::MessageDialog::showMessageDialog(
+            "MemoryInfo",
+            stream.str(),
+            ::fwGui::dialog::IMessageDialog::INFO);
+}
+
+//------------------------------------------------------------------------------
+
+void MemoryInfo::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void MemoryInfo::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void MemoryInfo::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace basicVisuCtrl
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/action/SDumpAll.cpp b/Bundles/LeafCtrl/monitor/src/monitor/action/SDumpAll.cpp
new file mode 100644
index 0000000..4a2bc1a
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/action/SDumpAll.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/BufferInfo.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "monitor/action/SDumpAll.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::monitor::action::SDumpAll , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+SDumpAll::SDumpAll( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SDumpAll::~SDumpAll() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SDumpAll::updating( ) throw(::fwTools::Failed)
+{
+    size_t nbBuffDumped = 0;
+    ::fwMemory::BufferManager::BufferInfoMapType buffInfoMap;
+    ::fwMemory::BufferManager::sptr buffManager = ::fwMemory::BufferManager::getDefault();
+    if(buffManager)
+    {
+        buffInfoMap = buffManager->getBufferInfos().get();
+    }
+    BOOST_FOREACH(::fwMemory::BufferManager::BufferInfoMapType::value_type elt, buffInfoMap)
+    {
+        ::fwMemory::BufferInfo dumpBuffInfo = elt.second;
+        bool loaded = dumpBuffInfo.loaded;
+        bool isLock = dumpBuffInfo.lockCount() > 0;
+        if(loaded && !isLock)
+        {
+            bool dumped = buffManager->dumpBuffer(elt.first).get();
+            if(dumped)
+            {
+                ++nbBuffDumped;
+            }
+        }
+    }
+    std::stringstream stream;
+    stream << nbBuffDumped << " buffer dumped (" << nbBuffDumped <<"/"<<buffInfoMap.size()<<").";
+    ::fwGui::dialog::MessageDialog::showMessageDialog(
+                        "Dump all",
+                        stream.str(),
+                        ::fwGui::dialog::IMessageDialog::INFO);
+}
+
+//------------------------------------------------------------------------------
+
+void SDumpAll::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void SDumpAll::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+void SDumpAll::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace monitor
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/action/fwMetrics.cpp b/Bundles/LeafCtrl/monitor/src/monitor/action/fwMetrics.cpp
new file mode 100644
index 0000000..039ff57
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/action/fwMetrics.cpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/registry/detail.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/message/detail.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "monitor/action/fwMetrics.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::monitor::action::fwMetrics, ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+fwMetrics::fwMetrics( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+fwMetrics::~fwMetrics() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void fwMetrics::updating() throw(::fwTools::Failed)
+{
+    std::stringstream stream;
+
+    stream << "Registered factory keys";
+    stream << std::endl;
+
+    stream << "fwData: ";
+    stream << ::fwData::registry::get()->getFactoryKeys().size();
+    stream << std::endl;
+
+    stream << "ObjectMsg: ";
+    stream << ::fwServices::registry::message::get()->getFactoryKeys().size();
+    stream << std::endl;
+
+    stream << "IService: ";
+    stream << ::fwServices::registry::ServiceFactory::getDefault()->getFactoryKeys().size();
+
+    ::fwGui::dialog::MessageDialog messageBox;
+    messageBox.setTitle("FactoryRegistry Information");
+    messageBox.setMessage( stream.str() );
+    messageBox.setIcon(::fwGui::dialog::IMessageDialog::INFO);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+    messageBox.show();
+}
+
+//------------------------------------------------------------------------------
+
+void fwMetrics::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void fwMetrics::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void fwMetrics::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace action
+} // namespace monitor
diff --git a/Bundles/LeafCtrl/monitor/src/monitor/installSIGSEVBacktrace.cpp b/Bundles/LeafCtrl/monitor/src/monitor/installSIGSEVBacktrace.cpp
new file mode 100644
index 0000000..f265b66
--- /dev/null
+++ b/Bundles/LeafCtrl/monitor/src/monitor/installSIGSEVBacktrace.cpp
@@ -0,0 +1,310 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#ifdef __APPLE__
+#define _XOPEN_SOURCE
+#endif
+
+#include "monitor/installSIGSEVBacktrace.hpp"
+
+#ifndef WIN32
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+#include <execinfo.h>
+
+#include <cxxabi.h>
+#include <cstdlib>
+#include <iostream>
+#include <string>
+#include <string.h>
+#include <sstream>
+
+
+/* get REG_EIP from ucontext.h */
+//#define __USE_GNU // already defined
+#if !defined(__APPLE__) || (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ - 1060) <= 0
+#include <ucontext.h>
+#else
+#include <sys/ucontext.h>
+#endif
+//VAG hack :
+#define REG_EIP 14
+//VAG : ucontext.h define REG_EIP but compiler doesn't see it ... I simulate its value
+
+#else // WIN32
+
+#include <list>
+#include <string>
+#include <sstream>
+
+#include <boost/lexical_cast.hpp>
+#include <windows.h>
+#include <dbghelp.h>
+
+#endif
+
+namespace monitor
+{
+
+void generateSIGSEV()
+{
+    char *p = (char *)0xdeadbeef;
+    *p = 10;    /* CRASH here!! */
+}
+
+#ifndef WIN32
+std::string demangle( std::string mangled )
+{
+    char * c_demangled = abi::__cxa_demangle( mangled.c_str() , 0, 0, 0);
+    if (c_demangled)
+    {
+        std::string res(c_demangled);
+        free(c_demangled);
+        return res;
+    }
+    else
+    {
+        return mangled;
+    }
+}
+
+std::string decode( char *message)
+{
+    std::string msg(message);
+    std::string res(message);
+
+    std::string::size_type popen = msg.find('(');
+    if ( popen != std::string::npos )
+    {
+        std::string::size_type plus = msg.find('+');
+        res = std::string(message,popen+1) + " ";
+        std::string mangled( message, popen+1, plus -popen -1 );
+        res +=  demangle(mangled) + " ";
+        res += std::string( message + plus, message + strlen(message) );
+    }
+    return res;
+}
+
+void bt_sighandler(int sig, siginfo_t *info,
+        void *secret) {
+
+    void *trace[16];
+    char **messages = (char **)NULL;
+    int i, trace_size = 0;
+    ucontext_t *uc = (ucontext_t *)secret;
+
+    std::stringstream ss;
+    ss << "Got signal " << sig;
+
+    /* Do something useful with siginfo_t */
+    if (sig == SIGSEGV)
+    {
+        ss << " faulty address is " << info->si_addr;
+#ifndef __MACOSX__
+        ss << " from " << uc->uc_mcontext.gregs[REG_EIP];
+#endif
+    }
+    ss << std::endl;
+
+    trace_size = backtrace(trace, 16);
+    /* overwrite sigaction with caller's address */
+#ifndef __MACOSX__
+    trace[1] = (void *) uc->uc_mcontext.gregs[REG_EIP];
+#endif
+
+    messages = backtrace_symbols(trace, trace_size);
+    /* skip first stack frame (points here) */
+    ss <<  "    [bt] Execution path:" << std::endl;
+    for (i=1; i<trace_size; ++i)
+    {
+        ss <<  "    [bt] " <<  decode(messages[i]) << std::endl;
+    }
+
+    if (sig == SIGSEGV)
+    {
+        SLM_FATAL("SIGSEV signal " + ss.str() );
+        exit(0);
+    }
+    else
+    {
+        SLM_ERROR("SIGUSR1 signal " + ss.str() );
+    }
+
+}
+void installSIGSEVBacktrace()
+{
+    struct sigaction sa;
+
+    sa.sa_sigaction = bt_sighandler;
+    sigemptyset (&sa.sa_mask);
+    sa.sa_flags = SA_RESTART | SA_SIGINFO;
+
+    sigaction(SIGSEGV, &sa, NULL);
+    sigaction(SIGUSR1, &sa, NULL);
+}
+
+
+#else // if  win32
+
+const size_t nbChar = 100;
+#if _MSC_VER > 1499 // Visual C++ 2008 only
+BOOL CALLBACK EnumerateLoadedModules(LPCSTR ModuleName, DWORD64 ModuleBase, ULONG ModuleSize, PVOID UserContext)
+#else
+BOOL CALLBACK EnumerateLoadedModules(LPSTR ModuleName, DWORD64 ModuleBase, ULONG ModuleSize, PVOID UserContext)
+#endif
+{
+    std::list<std::string>* pLoadedModules = reinterpret_cast<std::list<std::string>*>(UserContext);
+    pLoadedModules->push_back(std::string((char *)ModuleName) + "\t" + ::boost::lexical_cast<std::string>(ModuleBase));
+    return true;
+}
+
+/**
+ * Dumps the backtrace on a stream
+ */
+void printDump(std::list<std::string> &loadedModules, std::list<std::string> &callStack, std::list<std::string> &fileStack)
+{
+    std::stringstream stream;
+
+    // Dumps the loaded modules on the stream
+    stream << "-----------------------------------------" << std::endl;
+    stream << "\nLoaded Modules\n";
+    for(std::list<std::string>::const_iterator it = loadedModules.begin(); it != loadedModules.end(); ++it)
+    {
+        stream << "> " << *it << std::endl;
+    }
+    stream << "-----------------------------------------" << std::endl;
+    // Dumps the call stack on the stream
+    stream << "\nCallStack\n";
+    for(std::list<std::string>::const_iterator it = callStack.begin(), it2 = fileStack.begin(); it != callStack.end() && it2 != fileStack.end(); ++it, ++it2)
+    {
+        stream << "> " << *it << std::endl;
+        stream << "   " << *it2 << std::endl;
+    }
+    stream << "-----------------------------------------" << std::endl;
+
+    SLM_ERROR(stream.str() );
+}
+
+/**
+ * Loads the elements of the call stack in a list
+ * @param exceptionInfos are useful information on the exception
+ */
+void LoadCallStack(EXCEPTION_POINTERS* exceptionInfos, HANDLE &hProcess, std::list<std::string> &callStack, std::list<std::string> &fileStack)
+{
+    STACKFRAME64 tempStackFrame;
+    CONTEXT context = *(exceptionInfos->ContextRecord);
+    memset( &tempStackFrame, 0, sizeof(STACKFRAME64) );
+    DWORD machineType;
+
+#ifdef _M_IX86
+    machineType = IMAGE_FILE_MACHINE_I386;
+    tempStackFrame.AddrPC.Offset       = context.Eip;
+    tempStackFrame.AddrPC.Mode         = AddrModeFlat;
+    tempStackFrame.AddrStack.Offset    = context.Esp;
+    tempStackFrame.AddrStack.Mode      = AddrModeFlat;
+    tempStackFrame.AddrFrame.Offset    = context.Ebp;
+    tempStackFrame.AddrFrame.Mode      = AddrModeFlat;
+#elif _M_X64
+    machineType = IMAGE_FILE_MACHINE_AMD64;
+    tempStackFrame.AddrPC.Offset = context.Rip;
+    tempStackFrame.AddrPC.Mode = AddrModeFlat;
+    tempStackFrame.AddrFrame.Offset = context.Rsp;
+    tempStackFrame.AddrFrame.Mode = AddrModeFlat;
+    tempStackFrame.AddrStack.Offset = context.Rsp;
+    tempStackFrame.AddrStack.Mode = AddrModeFlat;
+#elif _M_IA64
+    machineType = IMAGE_FILE_MACHINE_IA64;
+    tempStackFrame.AddrPC.Offset = context.StIIP;
+    tempStackFrame.AddrPC.Mode = AddrModeFlat;
+    tempStackFrame.AddrFrame.Offset = context.IntSp;
+    tempStackFrame.AddrFrame.Mode = AddrModeFlat;
+    tempStackFrame.AddrBStore.Offset = context.RsBSP;
+    tempStackFrame.AddrBStore.Mode = AddrModeFlat;
+    tempStackFrame.AddrStack.Offset = context.IntSp;
+    tempStackFrame.AddrStack.Mode = AddrModeFlat;
+#else
+#error "Platform not supported!"
+#endif
+
+    ULONG64 buffer[(sizeof(SYMBOL_INFO) + nbChar*sizeof(TCHAR) + sizeof(ULONG64) + 1) / sizeof(ULONG64)];
+    PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>(buffer);
+    PSTR undecoratedName = (PSTR)malloc(sizeof(TCHAR) * nbChar);
+
+    pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
+    pSymbol->MaxNameLen = nbChar;
+    DWORD lineDisplacement;
+    IMAGEHLP_LINE64 lineInfo = { sizeof(IMAGEHLP_LINE64) };
+
+    while(StackWalk64(machineType, hProcess, GetCurrentThread(), &tempStackFrame, &context, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
+    {
+        // Sanity stack check
+        if(tempStackFrame.AddrPC.Offset == 0)
+            break;
+
+        DWORD64 symDisplacement = 0;
+        // Try to get the symbol name
+        if(SymFromAddr(hProcess, tempStackFrame.AddrPC.Offset, &symDisplacement, pSymbol))
+        {
+            UnDecorateSymbolName(pSymbol->Name, undecoratedName, MAX_SYM_NAME, UNDNAME_COMPLETE);
+            callStack.push_back(std::string((char*)undecoratedName) + "+" + ::boost::lexical_cast<std::string>(symDisplacement));
+
+            if(SymGetLineFromAddr64(hProcess, tempStackFrame.AddrPC.Offset, &lineDisplacement, &lineInfo))
+            {
+                fileStack.push_back(std::string(lineInfo.FileName) + "\tl:" + ::boost::lexical_cast<std::string>(lineInfo.LineNumber));
+            }
+            else
+            {
+                fileStack.push_back("No info");
+            }
+        }
+        else
+        {
+        }
+    }
+    free(undecoratedName);
+}
+
+/// The exception filter that will display the stack
+static LONG WINAPI UnhandledExpFilter(PEXCEPTION_POINTERS pExceptionInfo)
+{
+    /// Handle to the process
+    HANDLE hProcess;
+    /// List of the loaded modules
+    std::list<std::string> loadedModules;
+    /// List of the elements on the call stack
+    std::list<std::string> callStack;
+    /// List of the elements on the file stack
+    std::list<std::string> fileStack;
+
+    SymSetOptions(SYMOPT_UNDNAME|SYMOPT_DEFERRED_LOADS|SYMOPT_LOAD_LINES);
+    hProcess = GetCurrentProcess();
+
+    if(SymInitialize(hProcess, NULL, TRUE))
+    {
+        LoadCallStack(pExceptionInfo, hProcess, callStack, fileStack);
+        ::EnumerateLoadedModules64(hProcess, EnumerateLoadedModules, &loadedModules);
+        ::SymCleanup(hProcess);
+    }
+
+    printDump(loadedModules, callStack, fileStack);
+
+    return EXCEPTION_CONTINUE_SEARCH;
+}
+
+void installSIGSEVBacktrace()
+{
+    SetUnhandledExceptionFilter(UnhandledExpFilter);
+}
+
+#endif
+
+
+
+} // namespace monitor
+
diff --git a/Bundles/LeafIO/ioAtoms/CMakeLists.txt b/Bundles/LeafIO/ioAtoms/CMakeLists.txt
new file mode 100644
index 0000000..d0b8b52
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/CMakeLists.txt
@@ -0,0 +1,11 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwAtomsBoostIO
+    fwRuntime
+
+    io
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/Bundles/LeafIO/ioAtoms/COPYING b/Bundles/LeafIO/ioAtoms/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafIO/ioAtoms/COPYING.LESSER b/Bundles/LeafIO/ioAtoms/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafIO/ioAtoms/Properties.cmake b/Bundles/LeafIO/ioAtoms/Properties.cmake
new file mode 100644
index 0000000..b5e9ae1
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/Properties.cmake
@@ -0,0 +1,22 @@
+
+set( NAME ioAtoms )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES
+    fwAtomConversion
+    fwAtomsBoostIO
+    fwAtomsHdf5IO
+    fwAtomsPatch
+    fwAtomsFilter
+    fwComEd
+    fwData
+    fwDataCamp
+    fwGui
+    fwMemory
+    fwRuntime
+    fwServices
+    fwZip
+    io
+    )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioAtoms/bin/build.options b/Bundles/LeafIO/ioAtoms/bin/build.options
new file mode 100644
index 0000000..ce4ec48
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/bin/build.options
@@ -0,0 +1,23 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwAtomsBoostIO_0-1',
+          'fwAtomsHdf5IO_0-1',
+          'fwAtomConversion_0-1',
+          'fwAtomsFilter_0-1',
+          'fwAtomsPatch_0-1',
+          'fwCore_0-1',
+          'fwData_0-1',
+          'fwComEd_0-1',
+          'fwGui_0-1',
+          'fwRuntime_0-3',
+          'fwServices_0-1',
+          'fwTools_0-1',
+          'fwMemory_0-1',
+          'fwZip_0-1',
+          'fwAtomsPatch_0-1'
+          ]
+BUNDLES  = ['io_0-1']
+USE = [
+    'boost',
+    ]
diff --git a/Bundles/LeafIO/ioAtoms/include/ioAtoms/Plugin.hpp b/Bundles/LeafIO/ioAtoms/include/ioAtoms/Plugin.hpp
new file mode 100644
index 0000000..e2e30b3
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/include/ioAtoms/Plugin.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOATOMS_PLUGIN_HPP__
+#define __IOATOMS_PLUGIN_HPP__
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioAtoms
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    //! @brief Destructor.
+    ~Plugin() throw();
+
+    /**
+    * @brief Start method.
+    *
+    * This method is used by runtime in order to initialize the bundle.
+    *
+    * @exception ::fwRuntime::RuntimeException
+    */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief Stop method.
+    *
+    * This method is used by runtime in order to close the bundle.
+    */
+    void stop() throw();
+
+};
+
+} // namespace ioAtoms
+
+#endif //__IOATOMS_PLUGIN_HPP__
+
diff --git a/Bundles/LeafIO/ioAtoms/include/ioAtoms/SReader.hpp b/Bundles/LeafIO/ioAtoms/include/ioAtoms/SReader.hpp
new file mode 100644
index 0000000..6457679
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/include/ioAtoms/SReader.hpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOATOMS_SREADER_HPP__
+#define __IOATOMS_SREADER_HPP__
+
+#include <map>
+#include <set>
+
+#include <io/IReader.hpp>
+
+#include "ioAtoms/config.hpp"
+
+namespace fwMemory
+{
+    class IPolicy;
+}
+
+namespace ioAtoms
+{
+
+/**
+ * @brief Atoms reader. Service to load data from Atoms format
+ * @class SReader
+ * @date 2013
+ */
+class IOATOMS_CLASS_API SReader : public ::io::IReader
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro( (SReader)(::io::IReader) );
+
+    /// Does nothing
+    SReader();
+
+    /// Does nothing
+    virtual ~SReader() throw() {};
+
+    /// Propose to choose a medical data file (*.json,*.jsonz,*.xml or *.xmlz)
+    IOATOMS_API void configureWithIHM();
+
+    /// Maps file extension to format name.
+    typedef std::map< std::string, std::string > FileExtension2NameType;
+
+    /// Managed file extensions
+    static const FileExtension2NameType s_EXTENSIONS;
+
+protected:
+
+    /// Does nothing
+    IOATOMS_API void starting() throw(::fwTools::Failed);
+
+    /// Does nothing
+    IOATOMS_API void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configures the reader.
+     * @verbatim
+     <config>
+        <inject>ReadData</inject>
+        <uuidPolicy>Strict|Change|Reuse</uuidPolicy>
+        <patcher context="..." version="..." />
+
+        <archive backend="json">
+            <extension>.j</extension>
+        </archive> 
+
+        <archive backend="jsonz">
+            <extension>.vpz</extension>
+        </archive>
+
+        <archive backend="hdf5">
+            <extension>.f4s</extension>
+            <extension>.mw</extension>
+        </archive> 
+
+        <extensions>
+            <extension label="XML">.xml</extension>
+            <extension label="Zipped XML>.xmlz</extension>
+            <extension>.f4s</extension>
+            <extension>.j</extension>
+            <extension label="Medical workspace">.mw</extension>
+            <extension>.vpz</extension>
+        </extensions>
+
+     </config>
+     @endverbatim
+     *
+     * archive : defines custom file extensions. The file to be read with an extension given in 'archive' tag will be
+     * processed with the given backend in archive tag (the 'backend' attribute is mandatory). Extensions must begin 
+     * with '.'.
+     * Available 'backend' values are json, xml, jsonz, xmlz, and hdf5.
+     *
+     * extensions : defines available extensions displayed in dialog to read file. If the 'extensions' is empty or not
+     * specified, all the extensions (.json, .xml, .jsonz, .xmlz, .hdf5 extensions and custom extensions) are available.
+     * The attribute label (not mandatory) allows to display a label in front of extension when the file dialog is
+     * shown.
+     *
+     * @see ::io::IReader
+     * @throw ::fwTools::Failed
+     */
+    IOATOMS_API void configuring() throw(::fwTools::Failed);
+
+    /**
+     * @brief Tests file extension, applies the good atom reader, and converts atom in fwData::Composite
+     * @note  Before reading, set dump policy to 'barrier dump' if policy is 'never dump', then reset old policy.
+     */
+    IOATOMS_API void updating() throw(::fwTools::Failed);
+
+    /// Returns managed path type, here service manages only single file
+    IOATOMS_API ::io::IOPathType getIOPathType() const;
+
+private:
+
+    /// Notify modification on associated object if reading succeeded
+    void notificationOfUpdate();
+
+    /// Initial dump policy
+    SPTR(::fwMemory::IPolicy) m_oldPolicy;
+
+    /// fwAtomsConversion uuid policy
+    std::string m_inject;
+
+    /// fwAtomsConversion uuid policy
+    std::string m_uuidPolicy;
+
+    /// To enable atom patcher
+    bool m_useAtomsPatcher;
+
+    /// Defines context of data
+    std::string m_context;
+
+    /// Current version of format
+    std::string m_version;
+
+    /// Allowed file extensions
+    std::set< std::string > m_allowedExts;
+
+    /// IFilter name used to make an atom compliant with current context
+    std::string m_filter;
+
+    /// Maps custom extensions to knwon format.
+    FileExtension2NameType m_customExts;
+
+    /// Labels shown in file dialog for each allowed extension
+    FileExtension2NameType m_allowedExtLabels;
+};
+
+} // namespace ioAtoms
+
+#endif // __IOATOMS_SREADER_HPP__
+
diff --git a/Bundles/LeafIO/ioAtoms/include/ioAtoms/SWriter.hpp b/Bundles/LeafIO/ioAtoms/include/ioAtoms/SWriter.hpp
new file mode 100644
index 0000000..d975856
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/include/ioAtoms/SWriter.hpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOATOMS_SWRITER_HPP__
+#define __IOATOMS_SWRITER_HPP__
+
+#include <set>
+
+#include <io/IWriter.hpp>
+
+#include <fwAtomsBoostIO/Writer.hpp>
+
+#include "ioAtoms/config.hpp"
+
+namespace ioAtoms
+{
+
+/**
+ * @brief Atoms writer. Service to write an fwData medical data converted in fwAtoms.
+ * @class SWriter
+ * @date 2013
+ */
+class IOATOMS_CLASS_API SWriter : public ::io::IWriter
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro( (SWriter)(::io::IWriter) );
+
+    /// Does nothing
+    IOATOMS_API SWriter();
+
+    /// Does nothing
+    IOATOMS_API  virtual ~SWriter() throw() {};
+
+    /// Propose to create a medical data file
+    IOATOMS_API void configureWithIHM();
+
+protected:
+
+    /// Maps file extension to format name.
+    typedef std::map< std::string, std::string > FileExtension2NameType;
+
+    /**
+     * @brief Configures the writer
+     @verbatim
+     <config>
+        <patcher context="..." version="..." />
+
+        <archive backend="json">
+            <extension>.j</extension>
+        </archive> 
+
+        <archive backend="jsonz">
+            <extension>.vpz</extension>
+        </archive>
+
+        <archive backend="hdf5">
+            <extension>.f4s</extension>
+            <extension>.mw</extension>
+        </archive> 
+
+        <extensions>
+            <extension label="XML">.xml</extension>
+            <extension label="Zipped XML>.xmlz</extension>
+            <extension>.f4s</extension>
+            <extension>.j</extension>
+            <extension label="Medical workspace">.mw</extension>
+            <extension>.vpz</extension>
+        </extensions>
+
+     </config>
+     @endverbatim
+     *
+     * archive : defines custom file extensions. The file to be saved with an extension given in 'archive' tag will be
+     * written with the given backend in archive tag (the 'backend' attribute is mandatory). Extensions must begin with
+     * '.'.
+     * Available 'backend' values are json, xml, jsonz, xmlz, and hdf5.
+     *
+     * extensions : defines available extensions displayed in dialog to save file. If the 'extensions' is empty or not
+     * specified, all the extensions (.json, .xml, .jsonz, .xmlz, .hdf5 extensions and custom extensions) are available.
+     * The attribute label (not mandatory) allows to display a label in front of extension when the file dialog is
+     * shown.
+     *
+     * @see ::io::IWriter
+     * @throw ::fwTools::Failed
+     */
+    IOATOMS_API void configuring() throw(::fwTools::Failed);
+
+    /// Does nothing
+    IOATOMS_API void starting() throw(::fwTools::Failed);
+
+    /// Does nothing
+    IOATOMS_API void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Convert fwData to fwAtoms, and apply the writer chosen from file extension
+     * @note Data is locked (mutex) recursively during writing
+     */
+    IOATOMS_API void updating() throw(::fwTools::Failed);
+
+    /// Returns managed path type, here service manages only single file
+    IOATOMS_API ::io::IOPathType getIOPathType() const;
+
+    /// To activate atom patcher
+    bool m_useAtomsPatcher;
+
+    /// Selected exported version of atom
+    std::string m_exportedVersion;
+
+    /// Defines context of data
+    std::string m_context;
+
+    /// Current version of format
+    std::string m_version;
+
+    /// Proposes a gui to select available exports (set m_exportedVersion). Returns false if user cancel the selection
+    bool versionSelection();
+
+    /// Allowed file extensions
+    std::set< std::string > m_allowedExts;
+
+    /// Maps custom extensions to known format.
+    FileExtension2NameType m_customExts;
+
+    /// Labels shown in file dialog for each allowed extension
+    FileExtension2NameType m_allowedExtLabels;
+};
+
+} // namespace ioAtoms
+
+#endif // __IOATOMS_SWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioAtoms/include/ioAtoms/config.hpp b/Bundles/LeafIO/ioAtoms/include/ioAtoms/config.hpp
new file mode 100644
index 0000000..a862d6f
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/include/ioAtoms/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOATOMS_CONFIG_HPP_
+#define _IOATOMS_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef IOATOMS_EXPORTS
+    #define IOATOMS_API __declspec(dllexport)
+    #else
+    #define IOATOMS_API __declspec(dllimport)
+    #endif
+
+    #define IOATOMS_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IOATOMS_EXPORTS
+    #define IOATOMS_API __attribute__ ((visibility("default")))
+    #define IOATOMS_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IOATOMS_API __attribute__ ((visibility("hidden")))
+    #define IOATOMS_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IOATOMS_API
+    #define IOATOMS_CLASS_API
+
+#endif
+
+#endif // #ifndef _IOATOMS_CONFIG_HPP_
diff --git a/Bundles/LeafIO/ioAtoms/include/ioAtoms/namespace.hpp b/Bundles/LeafIO/ioAtoms/include/ioAtoms/namespace.hpp
new file mode 100644
index 0000000..d9d31d6
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/include/ioAtoms/namespace.hpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOATOMS_NAMESPACE_HPP__
+#define __IOATOMS_NAMESPACE_HPP__
+
+/**
+ * @brief      Contains services to read and write data via atom conversion.
+ * @namespace  ioAtoms
+ * @date       2013.
+ *
+ */
+namespace ioAtoms
+{
+
+}
+
+#endif /* __IOATOMS_NAMESPACE_HPP__ */
+
diff --git a/Bundles/LeafIO/ioAtoms/rc/plugin.xml b/Bundles/LeafIO/ioAtoms/rc/plugin.xml
new file mode 100644
index 0000000..8237270
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/rc/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="ioAtoms" class="::ioAtoms::Plugin" >
+
+    <library name="ioAtoms" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="io" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioAtoms::SReader</service>
+        <object>::fwData::Object</object>
+        <desc>Atoms reader</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioAtoms::SWriter</service>
+        <object>::fwData::Object</object>
+        <desc>Atoms writer</desc>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafIO/ioAtoms/src/ioAtoms/Plugin.cpp b/Bundles/LeafIO/ioAtoms/src/ioAtoms/Plugin.cpp
new file mode 100644
index 0000000..b87cb8a
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/src/ioAtoms/Plugin.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "ioAtoms/Plugin.hpp"
+
+namespace ioAtoms
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::ioAtoms::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace ioAtoms
+
diff --git a/Bundles/LeafIO/ioAtoms/src/ioAtoms/SReader.cpp b/Bundles/LeafIO/ioAtoms/src/ioAtoms/SReader.cpp
new file mode 100644
index 0000000..5f61e98
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/src/ioAtoms/SReader.cpp
@@ -0,0 +1,452 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/assign/list_of.hpp>
+#include <boost/algorithm/string/join.hpp>
+
+#include <fwAtomsBoostIO/Reader.hpp>
+#include <fwAtomsBoostIO/types.hpp>
+
+#include <fwAtomsHdf5IO/Reader.hpp>
+
+#include <fwAtomConversion/convert.hpp>
+
+#include <fwAtomsFilter/IFilter.hpp>
+#include <fwAtomsFilter/factory/new.hpp>
+
+
+#include <fwData/Object.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwZip/ReadDirArchive.hpp>
+#include <fwZip/ReadZipArchive.hpp>
+
+#include <fwMemory/IPolicy.hpp>
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/policy/BarrierDump.hpp>
+#include <fwMemory/policy/NeverDump.hpp>
+#include <fwMemory/tools/MemoryMonitorTools.hpp>
+
+#include <fwAtomsPatch/PatchingManager.hpp>
+
+#include "ioAtoms/SReader.hpp"
+
+namespace ioAtoms
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioAtoms::SReader , ::fwData::Object );
+
+const SReader::FileExtension2NameType SReader::s_EXTENSIONS
+    = ::boost::assign::map_list_of(".xml", "XML")
+        (".xmlz", "Zipped XML")
+        (".json", "JSON")
+        (".jsonz", "Zipped JSON")
+        (".hdf5", "HDF5");
+
+//-----------------------------------------------------------------------------
+
+SReader::SReader() :
+        m_useAtomsPatcher(false),
+        m_context ("Undefined"),
+        m_version ("Undefined"),
+        m_filter  ("")
+{
+    BOOST_FOREACH(SReader::FileExtension2NameType::value_type ext, s_EXTENSIONS)
+    {
+        m_allowedExts.insert(m_allowedExts.end(), ext.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SReader::starting() throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReader::stopping() throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SReader::configuring() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::io::IReader::configuring();
+
+    typedef SPTR(::fwRuntime::ConfigurationElement) ConfigurationElement;
+    typedef std::vector < ConfigurationElement >    ConfigurationElementContainer;
+
+    m_customExts.clear();
+    m_allowedExtLabels.clear();
+
+    ConfigurationElementContainer customExtsList = m_configuration->find("archive");
+    BOOST_FOREACH(ConfigurationElement archive, customExtsList)
+    {
+        const std::string& backend = archive->getAttributeValue("backend");
+        SLM_ASSERT("No backend attribute given in archive tag", backend != "");
+        SLM_ASSERT("Unsupported backend '" + backend + "'", s_EXTENSIONS.find("." + backend) != s_EXTENSIONS.end());
+
+        ConfigurationElementContainer exts = archive->find("extension");
+        BOOST_FOREACH(ConfigurationElement ext, exts)
+        {
+            const std::string& extension = ext->getValue();
+            SLM_ASSERT("No extension given for backend '" + backend + "'", !extension.empty());
+            SLM_ASSERT("Extension must begin with '.'", extension[0] == '.');
+
+            m_customExts[extension] = backend;
+            m_allowedExtLabels[extension] = ext->getAttributeValue("label");
+        }
+    }
+
+    ConfigurationElementContainer extensionsList = m_configuration->find("extensions");
+    SLM_ASSERT("The <extensions> element can be set at most once.", extensionsList.size() <= 1);
+
+    if(extensionsList.size() == 1)
+    {
+        m_allowedExts.clear();
+
+        ConfigurationElementContainer extensions = extensionsList.at(0)->find("extension");
+        BOOST_FOREACH(ConfigurationElement extension, extensions)
+        {
+            const std::string& ext = extension->getValue();
+
+            // The extension must be found either in custom extensions list or in known extensions
+            FileExtension2NameType::const_iterator itKnown = s_EXTENSIONS.find(ext);
+            FileExtension2NameType::const_iterator itCustom = m_customExts.find(ext);
+
+            const bool extIsKnown = (itKnown != SReader::s_EXTENSIONS.end() || itCustom != m_customExts.end());
+            SLM_ASSERT("Extension '" + ext + "' is not allowed in configuration", extIsKnown);
+
+            if(extIsKnown)
+            {
+                m_allowedExts.insert(m_allowedExts.end(), ext);
+                m_allowedExtLabels[ext] = extension->getAttributeValue("label");
+            }
+        }
+    }
+    else
+    {
+        m_allowedExts.clear();
+
+        BOOST_FOREACH(FileExtension2NameType::value_type ext, m_customExts)
+        {
+            m_allowedExts.insert(m_allowedExts.end(), ext.first);
+        }
+
+        BOOST_FOREACH(SReader::FileExtension2NameType::value_type ext, SReader::s_EXTENSIONS)
+        {
+            m_allowedExts.insert(m_allowedExts.end(), ext.first);
+            m_allowedExtLabels[ext.first] = ext.second;
+        }
+    }
+
+    ConfigurationElementContainer inject = m_configuration->find("inject");
+    SLM_ASSERT("The <inject> element can be set at most once.", inject.size() <= 1);
+    if (inject.size() == 1)
+    {
+        m_inject = inject.at(0)->getValue();
+    }
+
+    ConfigurationElementContainer filter = m_configuration->find("filter");
+    SLM_ASSERT("The <filter> element can be set at most once.", filter.size() <= 1);
+    if (filter.size() == 1)
+    {
+        m_filter = filter.at(0)->getValue();
+    }
+
+    ConfigurationElementContainer uuidPolicy = m_configuration->find("uuidPolicy");
+    SLM_ASSERT("The <uuidPolicy> element can be set at most once.", uuidPolicy.size() <= 1);
+    if (uuidPolicy.size() == 1)
+    {
+        m_uuidPolicy = uuidPolicy.at(0)->getValue();
+        SLM_ASSERT("Unknown policy : '"
+                   + m_uuidPolicy +
+                   "', available policies : 'Strict','Change' or 'Reuse'.",
+                   "Strict" == m_uuidPolicy || "Change" == m_uuidPolicy || "Reuse" == m_uuidPolicy );
+
+        SLM_ASSERT("'Reuse' policy is available only with inject mode",
+                   ("Reuse" == m_uuidPolicy && !m_inject.empty()) || "Reuse" != m_uuidPolicy
+                  );
+    }
+
+    ConfigurationElementContainer patcher = m_configuration->find("patcher");
+    SLM_ASSERT("The <patcher> element can be set at most once.", patcher.size() <= 1 );
+    if (patcher.size() == 1)
+    {
+        m_context = patcher.at(0)->getExistingAttributeValue("context");
+        m_version = patcher.at(0)->getExistingAttributeValue("version");
+        m_useAtomsPatcher = true;
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+
+struct SetDumpPolicy
+{
+    SetDumpPolicy()
+    {
+        ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+        m_lock = ::fwCore::mt::WriteLock( manager->getMutex() );
+        if( manager )
+        {
+            ::fwMemory::IPolicy::sptr policy = manager->getDumpPolicy();
+            if( ::fwMemory::policy::NeverDump::dynamicCast(policy) )
+            {
+                ::fwMemory::policy::BarrierDump::sptr newDumpPolicy = ::fwMemory::policy::BarrierDump::New();
+                ::fwMemory::BufferManager::BufferStats stats = manager->getBufferStats().get();
+                size_t aliveMemory = stats.totalManaged - stats.totalDumped;
+                size_t freeMemory = ::fwMemory::tools::MemoryMonitorTools::estimateFreeMem() / 2;
+                size_t barrier = std::max( aliveMemory, std::max( freeMemory, static_cast<size_t>(500L * 1024 * 1024) ) );
+
+                newDumpPolicy->setBarrier( barrier );
+                manager->setDumpPolicy( newDumpPolicy );
+                m_oldPolicy = policy;
+            }
+        }
+    }
+
+    ~SetDumpPolicy()
+    {
+        try
+        {
+            ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+            if( manager && m_oldPolicy )
+            {
+                manager->setDumpPolicy( m_oldPolicy );
+                m_oldPolicy.reset();
+            }
+        }
+        catch(...)
+        {
+            SLM_ASSERT("Failed to restore old policy", 0);
+        }
+    }
+
+    ::fwMemory::IPolicy::sptr m_oldPolicy;
+    ::fwCore::mt::WriteLock m_lock;
+};
+
+void SReader::updating() throw(::fwTools::Failed)
+{
+
+    if(this->hasLocationDefined())
+    {
+        SetDumpPolicy policy;
+
+        ::fwData::Object::sptr data = this->getObject< ::fwData::Object >();
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        try
+        {
+            const ::boost::filesystem::path& filePath = this->getFile();
+            const ::boost::filesystem::path folderPath = filePath.parent_path();
+            const ::boost::filesystem::path filename = filePath.filename();
+            std::string extension = ::boost::filesystem::extension(filePath);
+
+            FW_RAISE_IF( "Unable to guess file format (missing extension)", extension.empty() );
+
+
+            if(m_customExts.find(extension) != m_customExts.end())
+            {
+                extension = "." + m_customExts[extension];
+            }
+
+            ::fwAtoms::Object::sptr atom;
+            if ( extension == ".hdf5" )
+            {
+                ::fwAtomsHdf5IO::Reader reader;
+                atom = ::fwAtoms::Object::dynamicCast( reader.read( filePath ) );
+            }
+            else
+            {
+                // Read atom
+                ::fwZip::IReadArchive::sptr readArchive;
+                ::boost::filesystem::path archiveRootName;
+                ::fwAtomsBoostIO::FormatType format = ::fwAtomsBoostIO::UNSPECIFIED;
+
+                if ( extension == ".json" )
+                {
+                    readArchive = ::fwZip::ReadDirArchive::New(folderPath.string());
+                    archiveRootName = filename;
+                    format = ::fwAtomsBoostIO::JSON;
+                }
+                else if ( extension == ".jsonz" )
+                {
+                    readArchive = ::fwZip::ReadZipArchive::New(filePath.string());
+                    archiveRootName = "root.json";
+                    format = ::fwAtomsBoostIO::JSON;
+                }
+                else if ( extension == ".xml" )
+                {
+                    readArchive = ::fwZip::ReadDirArchive::New(folderPath.string());
+                    archiveRootName = filename;
+                    format = ::fwAtomsBoostIO::XML;
+                }
+                else if ( extension == ".xmlz" )
+                {
+                    readArchive = ::fwZip::ReadZipArchive::New(filePath.string());
+                    archiveRootName = "root.xml";
+                    format = ::fwAtomsBoostIO::XML;
+                }
+                else
+                {
+                    FW_RAISE( "This file extension '" << extension << "' is not managed" );
+                }
+
+                ::fwAtomsBoostIO::Reader reader;
+                atom = ::fwAtoms::Object::dynamicCast( reader.read( readArchive, archiveRootName, format ) );
+            }
+
+            FW_RAISE_IF( "Invalid atoms file :'" << filePath << "'", ! atom );
+
+            /// patch atom
+            if ( m_useAtomsPatcher )
+            {
+                FW_RAISE_IF( "Unable to load data, found '" << atom->getMetaInfo("context")
+                             << "' context, but '" << m_context << "' was excepted.",
+                             atom->getMetaInfo("context") != m_context);
+
+                ::fwAtomsPatch::PatchingManager globalPatcher(atom);
+                atom = globalPatcher.transformTo( m_version );
+            }
+
+            if(!m_filter.empty())
+            {
+                ::fwAtomsFilter::IFilter::sptr filter = ::fwAtomsFilter::factory::New(m_filter);
+                OSLM_ASSERT("Failed to create IFilter implementation '" << m_filter << "'", filter);
+                filter->apply(atom);
+            }
+
+
+            ::fwData::Object::sptr newData ;
+
+            if("Strict" == m_uuidPolicy)
+            {
+                newData = ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::StrictPolicy());
+            }
+            else if("Reuse" == m_uuidPolicy)
+            {
+                newData = ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::ReusePolicy());
+            }
+            else
+            {
+                newData = ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::ChangePolicy());
+            }
+
+            FW_RAISE_IF( "Unable to load '" << filePath << "' : invalid data.", ! newData );
+
+            if(m_inject.empty())
+            {
+                FW_RAISE_IF( "Unable to load '" << filePath
+                        << "' : trying to load a '" << newData->getClassname()
+                        << "' where a '" << data->getClassname() << "' was expected",
+                        newData->getClassname() != data->getClassname() );
+
+                data->shallowCopy(newData);
+            }
+            else
+            {
+                ::fwData::Composite::sptr composite = ::fwData::Composite::dynamicCast(data);
+                SLM_ASSERT("Inject mode works only on a Composite object", composite );
+
+                ::fwComEd::helper::Composite helper(composite);
+                helper.add(m_inject, newData);
+                helper.notify(this->getSptr());
+            }
+
+            this->notificationOfUpdate();
+        }
+        catch( std::exception & e )
+        {
+            OSLM_ERROR( e.what() );
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Atoms reader failed", e.what(),
+                    ::fwGui::dialog::MessageDialog::CRITICAL);
+        }
+        catch( ... )
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Atoms reader failed", "Aborting operation.",
+                    ::fwGui::dialog::MessageDialog::CRITICAL);
+        }
+
+        cursor.setDefaultCursor();
+
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType SReader::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void SReader::notificationOfUpdate()
+{
+    ::fwData::Object::sptr object = this->getObject();
+    ::fwServices::ObjectMsg::sptr msg = ::fwServices::ObjectMsg::New();
+    msg->addEvent( ::fwServices::ObjectMsg::UPDATED_OBJECT , object );
+    ::fwServices::IEditionService::notify( this->getSptr(),  object, msg );
+}
+
+//-----------------------------------------------------------------------------
+
+void SReader::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Enter file name");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setType(::fwGui::dialog::ILocationDialog::SINGLE_FILE);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::LocationDialog::FILE_MUST_EXIST);
+
+    dialogFile.addFilter("Medical data", "*" + ::boost::algorithm::join(m_allowedExts, " *"));
+
+    BOOST_FOREACH(const std::string& ext, m_allowedExts)
+    {
+        dialogFile.addFilter(m_allowedExtLabels[ext], "*" + ext);
+    }
+
+    ::fwData::location::SingleFile::sptr result
+        = ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+
+    if (result)
+    {
+        _sDefaultPath = result->getPath();
+        this->setFile( _sDefaultPath );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath.parent_path()) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace ioAtoms
+
diff --git a/Bundles/LeafIO/ioAtoms/src/ioAtoms/SWriter.cpp b/Bundles/LeafIO/ioAtoms/src/ioAtoms/SWriter.cpp
new file mode 100644
index 0000000..74318ff
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/src/ioAtoms/SWriter.cpp
@@ -0,0 +1,374 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/algorithm/string/join.hpp>
+
+#include <fwAtomsBoostIO/types.hpp>
+#include <fwAtomsBoostIO/Writer.hpp>
+
+#include <fwAtomsHdf5IO/Writer.hpp>
+
+#include <fwAtomConversion/convert.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/SelectorDialog.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwZip/WriteDirArchive.hpp>
+#include <fwZip/WriteZipArchive.hpp>
+
+#include <fwDataCamp/visitor/RecursiveLock.hpp>
+
+#include <fwAtomsPatch/VersionsManager.hpp>
+#include <fwAtomsPatch/VersionsGraph.hpp>
+#include <fwAtomsPatch/PatchingManager.hpp>
+
+#include "ioAtoms/SReader.hpp"
+#include "ioAtoms/SWriter.hpp"
+
+namespace ioAtoms
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioAtoms::SWriter , ::fwData::Object );
+
+//-----------------------------------------------------------------------------
+
+SWriter::SWriter() :
+        m_useAtomsPatcher(false),
+        m_exportedVersion ("Undefined"),
+        m_context ("Undefined"),
+        m_version ("Undefined")
+{
+    BOOST_FOREACH(SReader::FileExtension2NameType::value_type ext, SReader::s_EXTENSIONS)
+    {
+        m_allowedExts.insert(m_allowedExts.end(), ext.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SWriter::starting() throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SWriter::stopping() throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SWriter::configuring() throw(::fwTools::Failed)
+{
+    ::io::IWriter::configuring();
+
+    typedef SPTR(::fwRuntime::ConfigurationElement) ConfigurationElement;
+    typedef std::vector < ConfigurationElement >    ConfigurationElementContainer;
+
+    m_customExts.clear();
+    m_allowedExtLabels.clear();
+
+    ConfigurationElementContainer customExtsList = m_configuration->find("archive");
+    BOOST_FOREACH(ConfigurationElement archive, customExtsList)
+    {
+        const std::string& backend = archive->getAttributeValue("backend");
+        SLM_ASSERT("No backend attribute given in archive tag", backend != "");
+        SLM_ASSERT("Unsupported backend '" + backend + "'",
+                SReader::s_EXTENSIONS.find("." + backend) != SReader::s_EXTENSIONS.end());
+
+        ConfigurationElementContainer exts = archive->find("extension");
+        BOOST_FOREACH(ConfigurationElement ext, exts)
+        {
+            const std::string& extension = ext->getValue();
+            SLM_ASSERT("No extension given for backend '" + backend + "'", !extension.empty());
+            SLM_ASSERT("Extension must begin with '.'", extension[0] == '.');
+
+            m_customExts[extension] = backend;
+            m_allowedExtLabels[extension] = ext->getAttributeValue("label");
+        }
+    }
+
+    ConfigurationElementContainer extensionsList = m_configuration->find("extensions");
+    SLM_ASSERT("The <extensions> element can be set at most once.", extensionsList.size() <= 1);
+
+    if(extensionsList.size() == 1)
+    {
+        m_allowedExts.clear();
+
+        ConfigurationElementContainer extensions = extensionsList.at(0)->find("extension");
+        BOOST_FOREACH(ConfigurationElement extension, extensions)
+        {
+            const std::string& ext = extension->getValue();
+
+            // The extension must be found either in custom extensions list or in known extensions
+            FileExtension2NameType::const_iterator itKnown = SReader::s_EXTENSIONS.find(ext);
+            FileExtension2NameType::const_iterator itCustom = m_customExts.find(ext);
+
+            const bool extIsKnown = (itKnown != SReader::s_EXTENSIONS.end() || itCustom != m_customExts.end());
+            OSLM_ASSERT("Extension '" << ext << "' is not allowed in configuration", extIsKnown);
+
+            if(extIsKnown)
+            {
+                m_allowedExts.insert(m_allowedExts.end(), ext);
+                m_allowedExtLabels[ext] = extension->getAttributeValue("label");
+            }
+        }
+    }
+    else
+    {
+        m_allowedExts.clear();
+
+        BOOST_FOREACH(FileExtension2NameType::value_type ext, m_customExts)
+        {
+            m_allowedExts.insert(m_allowedExts.end(), ext.first);
+        }
+
+        BOOST_FOREACH(SReader::FileExtension2NameType::value_type ext, SReader::s_EXTENSIONS)
+        {
+            m_allowedExts.insert(m_allowedExts.end(), ext.first);
+            m_allowedExtLabels[ext.first] = ext.second;
+        }
+    }
+
+    ConfigurationElementContainer patcher = m_configuration->find("patcher");
+    SLM_ASSERT("The <patcher> element can be set at most once.", patcher.size() <= 1 );
+    if (patcher.size() == 1)
+    {
+        m_context = patcher.at(0)->getExistingAttributeValue("context");
+        m_version = patcher.at(0)->getExistingAttributeValue("version");
+        m_exportedVersion = m_version;
+        m_useAtomsPatcher = true;
+    }
+}
+
+//----------------------------------------------------------------------------
+
+bool SWriter::versionSelection()
+{
+    using namespace boost::assign;
+
+    ::fwAtomsPatch::VersionsGraph::sptr vg = ::fwAtomsPatch::VersionsManager::getDefault()->getGraph(m_context);
+
+    // have some information about this format
+    if ( vg )
+    {
+        std::vector< std::string > versions = vg->getConnectedVersions(m_version);
+        if ( versions.size() == 0 )
+        {
+            m_exportedVersion = m_version;
+            return true;
+        }
+        else
+        {
+            versions.push_back(m_version);
+            ::fwGui::dialog::SelectorDialog dialogVersion;
+
+            dialogVersion.setTitle("Archive version");
+            dialogVersion.setMessage("Select an archive version");
+
+            dialogVersion.setSelections(versions);
+            std::string result = dialogVersion.show();
+            if ( ! result.empty() )
+            {
+                m_exportedVersion = result;
+            }
+            return ! result.empty();
+        }
+    }
+    else
+    {
+        m_exportedVersion = m_version;
+        return true;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SWriter::updating() throw(::fwTools::Failed)
+{
+    if( this->hasLocationDefined() )
+    {
+        ::fwData::Object::sptr obj = this->getObject< ::fwData::Object >();
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        try
+        {
+            const ::boost::filesystem::path& requestedFilePath = this->getFile();
+            ::boost::filesystem::path filePath = requestedFilePath;
+
+            if( ::boost::filesystem::exists( requestedFilePath ) )
+            {
+                FW_RAISE_IF( "can't write to : " << requestedFilePath << ", it is a directory.",
+                             ::boost::filesystem::is_directory(requestedFilePath)
+                             );
+
+                filePath.replace_extension("%%%%%%" + filePath.extension().string() );
+                filePath = ::boost::filesystem::unique_path(filePath);
+            }
+
+
+            const ::boost::filesystem::path folderPath = filePath.parent_path();
+            const ::boost::filesystem::path filename = filePath.filename();
+            std::string extension = ::boost::filesystem::extension(filePath);
+
+            FW_RAISE_IF( "Extension is empty", extension.empty() );
+
+            // Mutex data lock
+            ::fwDataCamp::visitor::RecursiveLock recursiveLock (obj);
+
+            // Convert data to atom
+            ::fwAtoms::Object::sptr atom = ::fwAtomConversion::convert(obj);
+
+            // Path atom
+            atom->setMetaInfo("context", m_context);
+            atom->setMetaInfo("version_name", m_version);
+            if( m_useAtomsPatcher )
+            {
+                ::fwAtomsPatch::PatchingManager globalPatcher( atom );
+                atom = globalPatcher.transformTo( m_exportedVersion );
+            }
+
+            FW_RAISE_IF("The file extension '" << extension << "' is not managed",
+                    m_allowedExts.find(extension) == m_allowedExts.end());
+
+            if(m_customExts.find(extension) != m_customExts.end())
+            {
+                extension = "." + m_customExts[extension];
+            }
+
+            if (extension == ".hdf5")
+            {
+                ::fwAtomsHdf5IO::Writer(atom).write( filePath );
+            }
+            else
+            {
+                // Write atom
+                ::fwZip::IWriteArchive::sptr writeArchive;
+                ::fwAtomsBoostIO::FormatType format;
+                ::boost::filesystem::path archiveRootName;
+                if ( extension == ".json" )
+                {
+                    writeArchive = ::fwZip::WriteDirArchive::New(folderPath.string());
+                    archiveRootName = filename;
+                    format = ::fwAtomsBoostIO::JSON;
+                }
+                else if ( extension == ".jsonz" )
+                {
+                    if ( ::boost::filesystem::exists( filePath ) )
+                    {
+                        ::boost::filesystem::remove( filePath );
+                    }
+                    writeArchive = ::fwZip::WriteZipArchive::New(filePath.string());
+                    archiveRootName = "root.json";
+                    format = ::fwAtomsBoostIO::JSON;
+                }
+                else if ( extension == ".xml" )
+                {
+                    writeArchive = ::fwZip::WriteDirArchive::New(folderPath.string());
+                    archiveRootName = filename;
+                    format = ::fwAtomsBoostIO::XML;
+                }
+                else if ( extension == ".xmlz" )
+                {
+                    if ( ::boost::filesystem::exists( filePath ) )
+                    {
+                        ::boost::filesystem::remove( filePath );
+                    }
+                    writeArchive = ::fwZip::WriteZipArchive::New(filePath.string());
+                    archiveRootName = "root.xml";
+                    format = ::fwAtomsBoostIO::XML;
+                }
+                else
+                {
+                    FW_RAISE( "This file extension '" << extension << "' is not managed" );
+                }
+
+                ::fwAtomsBoostIO::Writer(atom).write( writeArchive, archiveRootName, format );
+                writeArchive.reset();
+            }
+
+            if (filePath != requestedFilePath)
+            {
+                ::boost::filesystem::rename(filePath, requestedFilePath);
+            }
+        }
+        catch( std::exception & e )
+        {
+            OSLM_ERROR( e.what() );
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Medical data writer failed",
+                    e.what(),
+                    ::fwGui::dialog::MessageDialog::CRITICAL);
+        }
+        catch( ... )
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Medical data writer failed",
+                    "Writing process aborted",
+                    ::fwGui::dialog::MessageDialog::CRITICAL);
+        }
+        cursor.setDefaultCursor();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType SWriter::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//-----------------------------------------------------------------------------
+
+void SWriter::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    if( ! m_useAtomsPatcher || versionSelection() )
+    {
+        ::fwGui::dialog::LocationDialog dialogFile;
+        dialogFile.setTitle("Enter file name");
+        dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+        dialogFile.setType(::fwGui::dialog::LocationDialog::SINGLE_FILE);
+
+        dialogFile.addFilter("Medical data", "*" + ::boost::algorithm::join(m_allowedExts, " *"));
+
+        BOOST_FOREACH(const std::string& ext, m_allowedExts)
+        {
+            dialogFile.addFilter(m_allowedExtLabels[ext], "*" + ext);
+        }
+
+        ::fwData::location::SingleFile::sptr result
+            = ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+
+        if (result)
+        {
+            _sDefaultPath = result->getPath();
+            this->setFile( _sDefaultPath );
+            dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath.parent_path()) );
+        }
+        else
+        {
+            this->clearLocations();
+        }
+
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace ioAtoms
+
diff --git a/Bundles/LeafIO/ioAtoms/test/CMakeLists.txt b/Bundles/LeafIO/ioAtoms/test/CMakeLists.txt
new file mode 100644
index 0000000..c7bb8af
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/Bundles/LeafIO/ioAtoms/test/Properties.cmake b/Bundles/LeafIO/ioAtoms/test/Properties.cmake
new file mode 100644
index 0000000..29fc7fe
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME ioAtomsTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataTools fwDataCamp fwAtomConversion)
+set( REQUIREMENTS ioAtoms)
+
+set(CPPUNITTEST_OPTIONS BUNDLE ioAtoms WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafIO/ioAtoms/test/cppunit.options b/Bundles/LeafIO/ioAtoms/test/cppunit.options
new file mode 100644
index 0000000..b7dae09
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/cppunit.options
@@ -0,0 +1,18 @@
+CLASSTEST=[
+          'IoAtomsTest',
+          ]
+
+USE = ['boost']
+LIB = ['fwData_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwDataTools_0-1',
+       'fwDataCamp_0-1',
+       'fwTest_0-1',
+      ]
+
+BUNDLES = []
+REQUIREMENTS = ['dataReg_0-1','servicesReg_0-1','ioAtoms_0-1','gui_0-1']
+
+CONSOLE = 'yes'
+
diff --git a/Bundles/LeafIO/ioAtoms/test/tu/include/IoAtomsTest.hpp b/Bundles/LeafIO/ioAtoms/test/tu/include/IoAtomsTest.hpp
new file mode 100644
index 0000000..c3f3aa8
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/tu/include/IoAtomsTest.hpp
@@ -0,0 +1,44 @@
+
+#ifndef __IOATOMS_UT_IOATOMSTEST_HPP__
+#define __IOATOMS_UT_IOATOMSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ioAtoms
+{
+namespace ut
+{
+
+/**
+ * @brief Test basic reader/writer for SeriesDB.
+ */
+class IoAtomsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( IoAtomsTest );
+    CPPUNIT_TEST( JSONTest );
+    CPPUNIT_TEST( JSONZTest );
+    CPPUNIT_TEST( XMLTest );
+    CPPUNIT_TEST( XMLZTest );
+    CPPUNIT_TEST( HDF5Test );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void JSONTest();
+    void JSONZTest();
+    void XMLTest();
+    void XMLZTest();
+    void HDF5Test();
+
+
+
+};
+
+} // namespace ut
+} // namespace ioAtoms
+
+#endif //__IOBASIC_UT_IOBASICTEST_HPP__
diff --git a/Bundles/LeafIO/ioAtoms/test/tu/rc/profile.xml b/Bundles/LeafIO/ioAtoms/test/tu/rc/profile.xml
new file mode 100644
index 0000000..1ba1469
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/tu/rc/profile.xml
@@ -0,0 +1,13 @@
+<profile name="IoAtomsTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioAtoms" version="0-1" />
+
+    <start id="ioAtoms" />
+
+</profile>
diff --git a/Bundles/LeafIO/ioAtoms/test/tu/src/IoAtomsTest.cpp b/Bundles/LeafIO/ioAtoms/test/tu/src/IoAtomsTest.cpp
new file mode 100644
index 0000000..cb8c59a
--- /dev/null
+++ b/Bundles/LeafIO/ioAtoms/test/tu/src/IoAtomsTest.cpp
@@ -0,0 +1,244 @@
+#include <boost/filesystem.hpp>
+
+#include <fwAtomConversion/exception/DuplicatedDataUUID.hpp>
+
+#include <fwTools/System.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwTest/Exception.hpp>
+#include <fwTest/generator/SeriesDB.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include "IoAtomsTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioAtoms::ut::IoAtomsTest );
+
+namespace ioAtoms
+{
+namespace ut
+{
+
+static ::fwTest::Exception fwTestException(""); // force link with fwTest
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+template <typename T>
+void compareLog(T &comparator)
+{
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = comparator.getDifferences();
+    BOOST_FOREACH(::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " != " << prop.second );
+    }
+}
+
+
+
+//------------------------------------------------------------------------------
+
+template <typename T>
+void write(const ::fwRuntime::EConfigurationElement::sptr &srvCfg, const SPTR(T) &obj, const std::string &writer)
+{
+    ::fwServices::IService::sptr writerSrv = ::fwServices::registry::ServiceFactory::getDefault()->create( writer );
+    CPPUNIT_ASSERT(writerSrv);
+
+    ::fwServices::OSR::registerService( obj , writerSrv );
+    writerSrv->setConfiguration(srvCfg);
+    writerSrv->configure();
+    writerSrv->start();
+    writerSrv->update();
+    writerSrv->stop();
+    ::fwServices::OSR::unregisterService( writerSrv );
+}
+
+
+template <typename T>
+SPTR(T) read(const ::fwRuntime::EConfigurationElement::sptr &srvCfg, const std::string &reader)
+{
+
+    typename T::sptr readObj = T::New();
+    ::fwServices::IService::sptr readerSrv = ::fwServices::registry::ServiceFactory::getDefault()->create( reader );
+    CPPUNIT_ASSERT(readerSrv);
+
+    ::fwServices::OSR::registerService( readObj , readerSrv );
+    readerSrv->setConfiguration(srvCfg);
+    readerSrv->configure();
+    readerSrv->start();
+    readerSrv->update();
+    readerSrv->stop();
+    ::fwServices::OSR::unregisterService( readerSrv );
+
+    return readObj;
+}
+
+
+template <typename T>
+void writeReadFile(const ::fwRuntime::EConfigurationElement::sptr &srvCfg, const SPTR(T) &obj,
+                   const std::string &writer, const std::string &reader)
+{
+    write(srvCfg, obj, writer);
+
+    SPTR(T) readObj = read<T>(srvCfg, reader);
+
+        // Compare
+    using namespace ::fwDataCamp::visitor;
+    CompareObjects visitor;
+
+    visitor.compare(readObj, obj);
+    compareLog(visitor);
+
+    CPPUNIT_ASSERT_MESSAGE("Objects not equal" , visitor.getDifferences()->empty() );
+}
+
+//------------------------------------------------------------------------------
+
+void atomTest(const ::boost::filesystem::path & filePath)
+{
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileCfg->setValue(filePath.string());
+    srvCfg->addConfigurationElement(fileCfg);
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwTest::generator::SeriesDB::createSeriesDB(2,2,2);
+    ::fwData::Composite::sptr workspace = ::fwData::Composite::New();
+    workspace->getContainer()["processingDB"] = ::fwData::Composite::New();
+    workspace->getContainer()["planningDB"] = ::fwData::Composite::New();
+
+    ::boost::filesystem::create_directories( filePath.parent_path() );
+    writeReadFile< ::fwData::Composite>( srvCfg, workspace, "::ioAtoms::SWriter",  "::ioAtoms::SReader" );
+    writeReadFile< ::fwMedData::SeriesDB >( srvCfg, seriesDB, "::ioAtoms::SWriter",  "::ioAtoms::SReader" );
+
+    ::fwMedData::SeriesDB::sptr readSeriesDB;
+
+    // Default policy
+    readSeriesDB = read< ::fwMedData::SeriesDB >(srvCfg, "::ioAtoms::SReader");
+
+    {
+        ::fwDataCamp::visitor::CompareObjects visitor;
+        visitor.compare(readSeriesDB, seriesDB);
+        compareLog(visitor);
+        CPPUNIT_ASSERT_MESSAGE("Objects not equal" , visitor.getDifferences()->empty() );
+    }
+
+
+    // 'Change' UUID policy
+    ::fwRuntime::EConfigurationElement::sptr uuidPolicyCfg = ::fwRuntime::EConfigurationElement::New("uuidPolicy");
+    uuidPolicyCfg->setValue("Change");
+
+    srvCfg->addConfigurationElement(uuidPolicyCfg);
+
+    readSeriesDB = read< ::fwMedData::SeriesDB >(srvCfg, "::ioAtoms::SReader");
+
+    {
+        ::fwDataCamp::visitor::CompareObjects visitor;
+        visitor.compare(readSeriesDB, seriesDB);
+        compareLog(visitor);
+        CPPUNIT_ASSERT_MESSAGE("Objects not equal" , visitor.getDifferences()->empty() );
+    }
+
+
+    // 'Strict' UUID policy
+    uuidPolicyCfg->setValue("Strict");
+    readSeriesDB = read< ::fwMedData::SeriesDB >(srvCfg, "::ioAtoms::SReader");
+
+    {
+        // DuplicatedDataUUID exception should have been thrown and catch by reader before any data/atom conversion.
+        // We can only check that loaded data is empty.
+        CPPUNIT_ASSERT_MESSAGE("Written data should not be empty", !seriesDB->empty());
+        CPPUNIT_ASSERT_MESSAGE("Loaded data should be empty", readSeriesDB->empty());
+    }
+
+
+    // 'Reuse' UUID policy
+    uuidPolicyCfg->setValue("Reuse");
+
+    ::fwRuntime::EConfigurationElement::sptr injectCfg = ::fwRuntime::EConfigurationElement::New("inject");
+    injectCfg->setValue("seriesDB");
+    srvCfg->addConfigurationElement(injectCfg);
+
+    ::fwData::Composite::sptr composite = read< ::fwData::Composite >(srvCfg, "::ioAtoms::SReader");
+
+    {
+        ::fwDataCamp::visitor::CompareObjects visitor;
+        visitor.compare(workspace, composite);
+        compareLog(visitor);
+        CPPUNIT_ASSERT_MESSAGE("Objects should  be different" , !visitor.getDifferences()->empty() );
+        CPPUNIT_ASSERT(composite->find("seriesDB") != composite->end());
+
+        {
+            ::fwMedData::SeriesDB::sptr newSeriesDB = ::fwMedData::SeriesDB::dynamicCast( (*composite)["seriesDB"] );
+            CPPUNIT_ASSERT_MESSAGE("Failed to retrieve SeriesDB inside composite with key 'seriesDB'", newSeriesDB);
+
+            ::fwDataCamp::visitor::CompareObjects visitor;
+            visitor.compare(seriesDB, newSeriesDB);
+            compareLog(visitor);
+            CPPUNIT_ASSERT_MESSAGE("Objects not equal" , visitor.getDifferences()->empty() );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::JSONTest()
+{
+    atomTest(::fwTools::System::getTemporaryFolder() / "JSONTest" / "ioAtomsTest.json");
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::JSONZTest()
+{
+    atomTest(::fwTools::System::getTemporaryFolder() / "JSONZTest" / "ioAtomsTest.jsonz");
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::XMLTest()
+{
+    atomTest(::fwTools::System::getTemporaryFolder() / "XMLTest" / "ioAtomsTest.xml");
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::XMLZTest()
+{
+    atomTest(::fwTools::System::getTemporaryFolder() / "XMLZTest" / "ioAtomsTest.xmlz");
+}
+
+//------------------------------------------------------------------------------
+
+void IoAtomsTest::HDF5Test()
+{
+    atomTest(::fwTools::System::getTemporaryFolder() / "HDF5Test" / "ioAtomsTest.hdf5");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace ioAtoms
+
diff --git a/Bundles/LeafIO/ioData/CMakeLists.txt b/Bundles/LeafIO/ioData/CMakeLists.txt
new file mode 100644
index 0000000..5c4b5a0
--- /dev/null
+++ b/Bundles/LeafIO/ioData/CMakeLists.txt
@@ -0,0 +1,18 @@
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwData
+    fwDataTools
+    fwGui
+    fwRuntime
+    fwServices
+
+    io
+)
+
+
+find_package (Boost COMPONENTS system regex filesystem date_time chrono thread log log_setup REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+
diff --git a/Bundles/LeafIO/ioData/COPYING b/Bundles/LeafIO/ioData/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafIO/ioData/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafIO/ioData/COPYING.LESSER b/Bundles/LeafIO/ioData/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafIO/ioData/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafIO/ioData/Properties.cmake b/Bundles/LeafIO/ioData/Properties.cmake
new file mode 100644
index 0000000..6b61753
--- /dev/null
+++ b/Bundles/LeafIO/ioData/Properties.cmake
@@ -0,0 +1,17 @@
+
+set( NAME ioData )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES
+    fwComEd
+    fwCore
+    fwData
+    fwDataIO
+    fwDataTools
+    fwGui
+    fwRuntime
+    fwServices
+    io
+    )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioData/bin/build.options b/Bundles/LeafIO/ioData/bin/build.options
new file mode 100644
index 0000000..58e3d58
--- /dev/null
+++ b/Bundles/LeafIO/ioData/bin/build.options
@@ -0,0 +1,17 @@
+TYPE    = 'bundle'
+VERSION  = '0-1'
+USE     = ['boost', 'boostFilesystem']
+LIB     = [
+          'fwTools_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwDataTools_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwCore_0-1',
+          'fwComEd_0-1',
+          'fwGui_0-1',
+          ]
+BUNDLES = ['io_0-1']
+
+
diff --git a/Bundles/LeafIO/ioData/include/ioData/CameraReaderService.hpp b/Bundles/LeafIO/ioData/include/ioData/CameraReaderService.hpp
new file mode 100644
index 0000000..654d23d
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/CameraReaderService.hpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_CAMERAREADER_HPP_
+#define _IODATA_CAMERAREADER_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+#include <fwData/Camera.hpp>
+
+#include "ioData/export.hpp"
+
+
+namespace ioData
+{
+/**
+ * @brief   Camera calibration file reader service.
+ * @class   CameraReaderService
+ * 
+ * @date    2009.
+ *
+ * Service reading camera calibration file and create a camera object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the filename.
+ * @li Use update() to load the file, create the camera object and notify reading to observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioData::CameraReaderService , ::fwData::Camera )
+ */
+class IODATA_CLASS_API CameraReaderService : public ::io::IReader
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (CameraReaderService)( ::io::IReader) ) ;
+    /// Super class of reader services
+    typedef ::io::IReader   SuperClass;
+
+    /**
+     * @brief Configure the path : default does nothing.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    virtual void configureWithIHM(){};
+
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+    * @brief Starting method : default does nothing.
+    *
+    * This method is used to initialize the service.
+    */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /**
+    * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+    *
+    * This method is used to update the service.
+    * Call this method after configuring() to load calibration file.
+    * Notify reading.
+    */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+    /** @name Specified reader service methods ( override from ::io::IReader )
+     * @{
+    */
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+private:
+    /**
+     * @brief Load calibration file
+     *
+     * This method is called by updating method to load the file and create camera object.
+     *
+     * @param[in] fileName calibration filename
+     * @param[out] cam camera created with readed calibration file
+     */
+    bool loadCalibration( const std::string &fileName, ::boost::shared_ptr< ::fwData::Camera > cam );
+
+};
+
+}
+
+#endif /*_IODATA_CAMERAREADER_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/MeshReaderService.hpp b/Bundles/LeafIO/ioData/include/ioData/MeshReaderService.hpp
new file mode 100644
index 0000000..7da71b2
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/MeshReaderService.hpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_MESHREADERSERVICE_HPP_
+#define _IODATA_MESHREADERSERVICE_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Mesh reader service.
+ * @class   MeshReaderService
+ * 
+ * @date    2009.
+ *
+ * Service reading a trian file into a fwData::Mesh object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the mesh filename.
+ * @li Use update() to read the mesh and notify observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioData::MeshReaderService , ::fwData::Mesh )
+ */
+class IODATA_CLASS_API MeshReaderService : public ::io::IReader
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshReaderService)(::io::IReader) ) ;
+
+     /// Super class of reader services
+    typedef ::io::IReader   SuperClass;
+
+
+    /** @name Specified reader service methods ( override from ::io::IReader )
+     * @{
+     */
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API void configureWithIHM();
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The mesh is read with the reader ::fwDataIO::reader::MeshReader.
+     * Notify reading.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+}
+
+#endif /*_IODATA_MESHREADERSERVICE_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/MeshWriterService.hpp b/Bundles/LeafIO/ioData/include/ioData/MeshWriterService.hpp
new file mode 100644
index 0000000..456dca4
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/MeshWriterService.hpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_MESHWRITERSERVICE_HPP_
+#define _IODATA_MESHWRITERSERVICE_HPP_
+
+#include <io/IWriter.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Mesh writer service.
+ * @class   MeshWriterService
+ * 
+ * @date    2011.
+ *
+ * Service writing a mesh object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the mesh filename.
+ * @li Use update() to write the mesh and notify observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioData::MeshWriterService , ::fwData::Mesh )
+ */
+class IODATA_CLASS_API MeshWriterService : public ::io::IWriter
+{
+
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshWriterService)(::io::IWriter) ) ;
+
+     /// Super class of writer services
+    typedef ::io::IWriter   SuperClass;
+
+    /**
+     * @brief   Constructor : does nothing
+     */
+    IODATA_API MeshWriterService() ;
+
+    /**
+     * @brief   destructor
+     */
+    IODATA_API ~MeshWriterService() throw() ;
+
+    /** @name Specified writer service methods ( override from ::io::IWriter )
+     * @{
+     */
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API void configureWithIHM();
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The mesh is written with the writer ::fwDataIO::writer::MeshWriter.
+     * Notify writing.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+}
+
+#endif /*_IODATA_MESHWRITERSERVICE_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/Namespace.hpp b/Bundles/LeafIO/ioData/include/ioData/Namespace.hpp
new file mode 100644
index 0000000..d53edd7
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IODATANAMESPACE_HPP_
+#define IODATANAMESPACE_HPP_
+
+/**
+ * @brief       The namespace ioData contains reader and writer services for basic ::fwData::Object which doesn't need external library.
+ * @namespace   ioData
+ * 
+ * @date        2009.
+ *
+ */
+namespace ioData
+{
+
+}
+#endif /* IODATANAMESPACE_HPP_ */
diff --git a/Bundles/LeafIO/ioData/include/ioData/Plugin.hpp b/Bundles/LeafIO/ioData/include/ioData/Plugin.hpp
new file mode 100644
index 0000000..29c61b7
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/Plugin.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_PLUGIN_HPP_
+#define _IODATA_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioData
+{
+
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+
+    /**
+     * @brief Start method.
+     *
+     * @exception ::fwRuntime::RuntimeException.
+     * This method is used by runtime in order to initialize the bundle.
+     */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief Stop method.
+     *
+     * This method is used by runtime in order to close the bundle.
+     */
+    void stop() throw();
+
+};
+
+} // namespace ioData
+
+#endif //_IODATA_PLUGIN_HPP_
diff --git a/Bundles/LeafIO/ioData/include/ioData/SplineReaderService.hpp b/Bundles/LeafIO/ioData/include/ioData/SplineReaderService.hpp
new file mode 100644
index 0000000..fa8f828
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/SplineReaderService.hpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_SPLINEREADER_HPP_
+#define _IODATA_SPLINEREADER_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <boost/weak_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Spline reader service.
+ * @class   SplineReaderService
+ * 
+ * @date    2009.
+ *
+ * Service reading a spline object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the spline.
+ * @li Use update() to read the spline and notify observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioData::SplineReaderService , ::fwData::Spline )
+ */
+class IODATA_CLASS_API SplineReaderService : public ::io::IReader
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SplineReaderService)( ::io::IReader) ) ;
+    /// Super class of reader services
+    typedef ::io::IReader   SuperClass;
+    /**
+     * @brief   Constructor
+     */
+    IODATA_API SplineReaderService() ;
+
+    /**
+     * @brief   Destructor
+     */
+    IODATA_API ~SplineReaderService() throw() ;
+
+    /** @name Specified reader service methods ( override from ::io::IReader )
+     * @{
+     */
+    /**
+     * @brief Configure the path : default does nothing.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    virtual void configureWithIHM(){};
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /// @}
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Configure service. This method is called by configure() from base service ( ::fwServices::IService )
+     *
+     * XML configuration sample:
+     * @verbatim
+     <service uid="tubeReader" type="::io::IReader" impl="::ioData::SplineReaderService">
+       <spline id="0" matrix="../matrix.trf" nbSides="10" radius="10">
+        <point id="0"/>
+        <point id="4"/>
+        <point id="1"/>
+        <point id="5"/>
+      </spline>
+    </service>
+      @endverbatim
+     */
+    IODATA_API virtual void configuring( ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * Read the spline and notify.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+private:
+    /*!
+     * Charge la matrice de transformation 4X4 permettant de positionner l'objet
+     *
+     * @param m_file fichier contenat la matrice de transformation.
+     * @return TransformationMatrix3D
+     */
+     ::boost::shared_ptr< ::fwData::TransformationMatrix3D > loadObjectTransformationMatrix3D(std::string m_file);
+
+    /**
+     * @brief   matrice 4X4 permettant de positionner l'objet
+     */
+     ::boost::shared_ptr< ::fwData::TransformationMatrix3D> objectMatrix;
+    /**
+     * @brief   true s'il existe matrice 4X4 permettant de positionner l'objet
+     */
+    bool isTransfo;
+    typedef std::vector< ::fwData::Spline::point > Points ;
+    Points      m_points;
+    double      m_radius;
+    int         m_nbSides;
+    int         m_idSpline;
+};
+
+}
+
+#endif /*_IODATA_SPLINEREADER_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DReaderService.hpp b/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DReaderService.hpp
new file mode 100644
index 0000000..d44267a
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DReaderService.hpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_TRANSFORMATIONMATRIX3DREADER_HPP_
+#define _IODATA_TRANSFORMATIONMATRIX3DREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Transformation matrix 3D reader service.
+ * @class   TransformationMatrix3DReaderService
+ * 
+ * @date    2009.
+ *
+ * Service reading a TransformationMatrix3D object.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the matrix filename.
+ * @li Use start() to initialize the service.
+ * @li Use update() to read the transformation matrix.
+ * @li Use stop() to stop service before to destroy it.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioData::TransformationMatrix3DReaderService , ::fwData::TransformationMatrix3D )
+ */
+class IODATA_CLASS_API TransformationMatrix3DReaderService : public ::io::IReader
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (TransformationMatrix3DReaderService)(::io::IReader) ) ;
+
+    /// Super class of reader services
+    typedef ::io::IReader   SuperClass;
+
+    /** @name Specified reader service methods ( override from ::io::IReader )
+     * @{
+     */
+
+    /**
+     * @brief Configure the image path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API virtual void configureWithIHM();
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method. This method is called by start() from base service ( ::fwServices::IService )
+     *
+     * This method is used to initialize the service. The starting method is empty for this service.
+     */
+    IODATA_API virtual void starting( ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method. This method is called by stop() from base service ( ::fwServices::IService )
+     *
+     * The stopping method is empty for this service.
+     */
+    IODATA_API virtual void stopping( ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The transformation matrix is read with the reader ::fwDataIO::reader::TransformationMatrix3DReader.
+     * Notify reading.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+} // namespace ioData
+
+#endif // _IODATA_TRANSFORMATIONMATRIX3DREADER_HPP_
diff --git a/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DWriterService.hpp b/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DWriterService.hpp
new file mode 100644
index 0000000..ab32e4c
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/TransformationMatrix3DWriterService.hpp
@@ -0,0 +1,119 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_TRANSFORMATIONMATRIX3DWRITER_HPP_
+#define _IODATA_TRANSFORMATIONMATRIX3DWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Transformation matrix 3D writer service.
+ * @class   TransformationMatrix3DWriterService
+ * 
+ * @date    2009.
+ *
+ * Service writing a TransformationMatrix3D object
+ * @li Use setConfiguration(cfg) and configure() methods to configure the matrix filename.
+ * @li Use start() to initialize the service.
+ * @li Use update() to write the transformation matrix.
+ * @li Use stop() to stop service before to destroy it.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioData::TransformationMatrix3DWriterService , ::fwData::TransformationMatrix3D )
+ */
+class IODATA_CLASS_API TransformationMatrix3DWriterService : public ::io::IWriter
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (TransformationMatrix3DWriterService)(::io::IWriter) ) ;
+
+    /// Super class of writer services
+    typedef ::io::IWriter   SuperClass;
+
+
+    /** @name Specified writer service methods ( override from ::io::IWriter )
+     * @{
+     */
+
+    /**
+     * @brief Configure the matrix path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API virtual void configureWithIHM();
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+    ///@}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method. This method is called by start() from base service ( ::fwServices::IService )
+     *
+     * This method is used to initialize the service. The starting method is empty for this service.
+     */
+    IODATA_API virtual void starting( ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method. This method is called by stop() from base service ( ::fwServices::IService )
+     *
+     * The stopping method is empty for this service.
+     */
+    IODATA_API virtual void stopping( ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The transformation matrix is written with the writer ::fwDataIO::writer::TransformationMatrix3DWriter.
+     * Notify writing.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+} // namespace ioData
+
+#endif // _IODATA_TRANSFORMATIONMATRIX3DWRITER_HPP_
diff --git a/Bundles/LeafIO/ioData/include/ioData/TriangularMeshReaderService.hpp b/Bundles/LeafIO/ioData/include/ioData/TriangularMeshReaderService.hpp
new file mode 100644
index 0000000..8617a59
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/TriangularMeshReaderService.hpp
@@ -0,0 +1,116 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_TRIANGULARMESHREADERSERVICE_HPP_
+#define _IODATA_TRIANGULARMESHREADERSERVICE_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Triangular mesh reader service.
+ * @class   TriangularMeshReaderService
+ * 
+ * @date    2009.
+ *
+ * Service reading a mesh object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the mesh filename.
+ * @li Use update() to read the mesh and notify observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioData::TriangularMeshReaderService , ::fwData::TriangularMesh )
+ */
+class IODATA_CLASS_API TriangularMeshReaderService : public ::io::IReader
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (TriangularMeshReaderService)(::io::IReader) ) ;
+
+     /// Super class of reader services
+    typedef ::io::IReader   SuperClass;
+
+    /** @name Specified reader service methods ( override from ::io::IReader )
+     * @{
+     */
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API void configureWithIHM();
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The mesh is read with the reader ::fwDataIO::reader::TriangularMeshReader.
+     * Notify reading.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+}
+
+#endif /*_IODATA_TRIANGULARMESHREADERSERVICE_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/TriangularMeshWriterService.hpp b/Bundles/LeafIO/ioData/include/ioData/TriangularMeshWriterService.hpp
new file mode 100644
index 0000000..03afa8e
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/TriangularMeshWriterService.hpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_TRIANGULARMESHWRITER_HPP_
+#define _IODATA_TRIANGULARMESHWRITER_HPP_
+
+#include <io/IWriter.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+/**
+ * @brief   Triangular mesh writer service.
+ * @class   TriangularMeshWriterService
+ * 
+ * @date    2009.
+ *
+ * Service writing a mesh object.
+ * @li This service has no specified start and stop method.
+ * @li Use setConfiguration(cfg) and configure() methods to configure the mesh filename.
+ * @li Use update() to write the mesh and notify observers.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioData::TriangularMeshWriterService , ::fwData::TriangularMesh )
+ */
+class IODATA_CLASS_API TriangularMeshWriterService : public ::io::IWriter
+{
+
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (TriangularMeshWriterService)(::io::IWriter) ) ;
+
+     /// Super class of writer services
+    typedef ::io::IWriter   SuperClass;
+
+
+    /** @name Specified writer service methods ( override ::io::IWriter )
+     * @{
+     */
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IODATA_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IODATA_API void configureWithIHM();
+    /// @}
+
+    /// Return path type managed by the service, here FILE
+    IODATA_API virtual ::io::IOPathType getIOPathType() const;
+
+protected:
+
+    /** @name Service methods ( override ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     * The mesh is written with the writer ::fwDataIO::writer::TriangularMeshWriter.
+     * Notify writing.
+     */
+    IODATA_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automaticaly called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+};
+
+}
+
+#endif /*_IODATA_TRIANGULARMESHWRITER_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/action/SMeshModifier.hpp b/Bundles/LeafIO/ioData/include/ioData/action/SMeshModifier.hpp
new file mode 100644
index 0000000..a0666ba
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/action/SMeshModifier.hpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_ACTION_SMESHMODIFIER_HPP_
+#define _IODATA_ACTION_SMESHMODIFIER_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+#include <fwDataTools/AlgoMeshDeformation.hpp>
+
+#include "ioData/export.hpp"
+
+namespace ioData
+{
+namespace action
+{
+
+/**
+ * @brief   This action modifies a mesh using specified functor in configuration.
+ * The purpose is to test all possibilities provide by the new mesh structure.
+ * @class   SMeshModifier
+ */
+class IODATA_CLASS_API SMeshModifier : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SMeshModifier)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    IODATA_API SMeshModifier() throw() ;
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    IODATA_API virtual ~SMeshModifier() throw() ;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+      * @brief Configure the functor used to generate the mesh.
+      *
+      * Example of configuration :
+      * @verbatim
+         <service ... >
+             <config functor="ShakeMeshPoint" />
+         </service>
+        @endverbatim
+      * Functor available :
+      *  - ShakeMeshPoint
+      *  - ColorizeMeshPoints
+      *  - ColorizeMeshCells
+      *  - ComputePointNormals
+      *  - ComputeCellNormals
+      *  - ShakePointNormals
+      *  - ShakeCellNormals
+      *  - MeshDeformation
+      */
+    IODATA_API virtual void configuring() throw( ::fwTools::Failed ) ;
+
+    IODATA_API virtual void starting() throw(::fwTools::Failed);
+
+    IODATA_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    IODATA_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Process the action: modifies the mesh using the selected functor.
+     */
+    IODATA_API virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method gives information about the class.
+     */
+    IODATA_API virtual void info(std::ostream &_sstream ) ;
+
+    ///@}
+
+private:
+
+    /// Functor name used to generate mesh.
+    std::string m_functor;
+
+    /// Algo use to animate a deformation on the mesh
+    ::fwDataTools::AlgoMeshDeformation m_animator;
+};
+
+
+} // namespace action
+} // namespace ioData
+
+
+#endif /*_IODATA_ACTION_SMESHMODIFIER_HPP_*/
diff --git a/Bundles/LeafIO/ioData/include/ioData/export.hpp b/Bundles/LeafIO/ioData/include/ioData/export.hpp
new file mode 100644
index 0000000..68bf951
--- /dev/null
+++ b/Bundles/LeafIO/ioData/include/ioData/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IODATA_CONFIG_HPP_
+#define _IODATA_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef IODATA_EXPORTS
+    #define IODATA_API __declspec(dllexport)
+    #else
+    #define IODATA_API __declspec(dllimport)
+    #endif
+
+    #define IODATA_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IODATA_EXPORTS
+    #define IODATA_API __attribute__ ((visibility("default")))
+    #define IODATA_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IODATA_API __attribute__ ((visibility("hidden")))
+    #define IODATA_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IODATA_API
+    #define IODATA_CLASS_API
+
+#endif
+
+#endif // #ifndef _IODATA_CONFIG_HPP_
diff --git a/Bundles/LeafIO/ioData/rc/plugin.xml b/Bundles/LeafIO/ioData/rc/plugin.xml
new file mode 100644
index 0000000..ec5af1b
--- /dev/null
+++ b/Bundles/LeafIO/ioData/rc/plugin.xml
@@ -0,0 +1,66 @@
+<plugin id="ioData" class="::ioData::Plugin" >
+    <library name="ioData" />
+
+    <requirement id="io" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioData::CameraReaderService</service>
+        <object>::fwData::Camera</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioData::SplineReaderService</service>
+        <object>::fwData::Spline</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioData::MeshReaderService</service>
+        <object>::fwData::Mesh</object>
+        <desc>Trian file reader</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioData::TriangularMeshReaderService</service>
+        <object>::fwData::TriangularMesh</object>
+        <desc>Trian file reader</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioData::TransformationMatrix3DReaderService</service>
+        <object>::fwData::TransformationMatrix3D</object>
+        <desc>TransformationMatrix3D Reader</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioData::TransformationMatrix3DWriterService</service>
+        <object>::fwData::TransformationMatrix3D</object>
+        <desc>TransformationMatrix3D Writer</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioData::TriangularMeshWriterService</service>
+        <object>::fwData::TriangularMesh</object>
+        <desc>Trian file writer</desc>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioData::MeshWriterService</service>
+        <object>::fwData::Mesh</object>
+        <desc>Trian file writer</desc>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::ioData::action::SMeshModifier</service>
+        <object>::fwData::Mesh</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafIO/ioData/src/ioData/CameraReaderService.cpp b/Bundles/LeafIO/ioData/src/ioData/CameraReaderService.cpp
new file mode 100644
index 0000000..2fde41d
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/CameraReaderService.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Camera.hpp>
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwComEd/CameraMsg.hpp>
+
+#include "ioData/CameraReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioData::CameraReaderService , ::fwData::Camera ) ;
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+void CameraReaderService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " camera calibration file reader" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > CameraReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".cal");
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType CameraReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//-----------------------------------------------------------------------------
+
+void CameraReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve object
+        ::fwData::Camera::sptr cam = this->getObject< ::fwData::Camera>( );
+        SLM_ASSERT("cam not instanced", cam);
+
+        OSLM_INFO("path: " << this->getFile().string());
+        this->loadCalibration(this->getFile().string(), cam);
+
+        // Notify reading
+        ::fwComEd::CameraMsg::sptr msg = ::fwComEd::CameraMsg::New();
+        msg->addEvent( ::fwComEd::CameraMsg::NEW_CAMERA ) ;
+
+        ::fwServices::IEditionService::notify(this->getSptr(), cam, msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool CameraReaderService::loadCalibration( const std::string &fileName, ::fwData::Camera::sptr cam )
+{
+    std::ifstream f;
+    f.open (fileName.c_str(), std::fstream::in);
+    if (!f.is_open())
+        return false;
+    double M[5];
+    unsigned int i, j;
+    ::fwData::TransformationMatrix3D::sptr m_extrinsicMatrix = ::fwData::TransformationMatrix3D::New();
+    for( i=0 ; i<4 ; ++i )
+    {
+        for( j=0; j<4; ++j )
+        {
+            f>>M[j];
+            m_extrinsicMatrix->setCoefficient(i,j,M[j]);
+        }
+    }
+    cam->setExtrinsicCameraTransformation(m_extrinsicMatrix);
+    // alpha values : Focale en X ; Focale en Y
+    for( i=0; i<5; ++i )
+    {
+        f>>M[i];
+    }
+
+    cam->setFx(M[0]); // AlphaU
+    cam->setFy(M[1]); // AlphaV
+    // Principal point : Position du centre optique u0 ; v0
+    cam->setCx(M[2]); // u0
+    cam->setCy(M[3]); // v0
+    /*
+    //TODO
+    // ajouter coeff de distortion et skew � ::fwData::Video
+    cam->setAlphaC(M[4]); // skew (Orthogonalit� de la plaque CCD)
+    // Radial 1er ordre ; 2�me ordre ; Tangentiel 1er ordre ; 2�me ordre ; Radial 3�me ordre
+    for( i=0 ; i<5 ; ++i )
+    {
+        f>>M[i];
+        setkc(i,M[i]);
+    }
+    */
+    f.close();
+
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/MeshReaderService.cpp b/Bundles/LeafIO/ioData/src/ioData/MeshReaderService.cpp
new file mode 100644
index 0000000..c185ece
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/MeshReaderService.cpp
@@ -0,0 +1,132 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <io/IReader.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwDataIO/reader/MeshReader.hpp>
+
+#include <fwComEd/MeshMsg.hpp>
+
+#include "ioData/MeshReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioData::MeshReaderService , ::fwData::Mesh ) ;
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+void MeshReaderService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << "Trian file reader" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > MeshReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trian");
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType MeshReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a trian file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Trian file","*.trian");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve object
+        ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >( );
+        SLM_ASSERT("mesh not instanced", mesh);
+
+        ::fwDataIO::reader::MeshReader::sptr reader = ::fwDataIO::reader::MeshReader::New();
+        reader->setObject( mesh );
+        reader->setFile(this->getFile());
+
+        try
+        {
+            // Launch reading process
+            reader->read();
+            // Notify reading
+            ::fwComEd::MeshMsg::sptr msg = ::fwComEd::MeshMsg::New();
+            msg->addEvent( ::fwComEd::MeshMsg::NEW_MESH );
+            ::fwServices::IEditionService::notify(this->getSptr(), mesh, msg);
+        }
+        catch (const std::exception & e)
+        {
+            std::stringstream ss;
+            ss << "Warning during loading : " << e.what();
+
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Warning",
+                    ss.str(),
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+        catch( ... )
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Warning",
+                    "Warning during loading.",
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+    }
+}
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/MeshWriterService.cpp b/Bundles/LeafIO/ioData/src/ioData/MeshWriterService.cpp
new file mode 100644
index 0000000..e2ad240
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/MeshWriterService.cpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwDataIO/writer/MeshWriter.hpp>
+
+#include "ioData/MeshWriterService.hpp"
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioData::MeshWriterService , ::fwData::Mesh ) ;
+
+namespace ioData
+{
+
+MeshWriterService::MeshWriterService()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshWriterService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " Mesh writer" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > MeshWriterService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trian");
+    return extensions ;
+}
+
+//-----------------------------------------------------------------------------
+
+MeshWriterService::~MeshWriterService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType MeshWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a TrianMesh file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("TrianMesh","*.trian");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if(this->hasLocationDefined())
+    {
+        // Retrieve object
+        ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >( );
+        SLM_ASSERT("Mesh not instanced", mesh);
+
+        ::fwDataIO::writer::MeshWriter::sptr writer = ::fwDataIO::writer::MeshWriter::New();
+        writer->setObject( mesh );
+        writer->setFile(this->getFile());
+
+        try
+        {
+            writer->write();
+        }
+        catch (const std::exception & e)
+        {
+            std::stringstream ss;
+            ss << "Warning during writing Mesh : " << e.what();
+
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Warning",
+                    ss.str(),
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/Plugin.cpp b/Bundles/LeafIO/ioData/src/ioData/Plugin.cpp
new file mode 100644
index 0000000..f452f0f
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "ioData/Plugin.hpp"
+
+namespace ioData
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::ioData::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace ioData
diff --git a/Bundles/LeafIO/ioData/src/ioData/SplineReaderService.cpp b/Bundles/LeafIO/ioData/src/ioData/SplineReaderService.cpp
new file mode 100644
index 0000000..b7d57c8
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/SplineReaderService.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <io/IReader.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/SplineMsg.hpp>
+
+#include <fwData/Spline.hpp>
+#include <fstream>
+#include <fwCore/base.hpp>
+#include <iostream>
+#include <boost/lexical_cast.hpp>
+#include <fwServices/macros.hpp>
+
+#include "ioData/SplineReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioData::SplineReaderService , ::fwData::Spline ) ;
+
+namespace ioData
+{
+
+SplineReaderService::SplineReaderService()
+{
+    isTransfo = false;
+}
+
+//-----------------------------------------------------------------------------
+
+void SplineReaderService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream  << " spline reader" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > SplineReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".spline");
+    return extensions ;
+}
+
+//-----------------------------------------------------------------------------
+
+SplineReaderService::~SplineReaderService() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SplineReaderService::configuring( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+    for (iter = m_configuration->begin() ; iter != m_configuration->end() ; ++iter) {
+        SLM_INFO((*iter)->getName());
+        if ((*iter)->getName() == "spline")
+        {
+            if((*iter)->hasAttribute("id"))
+            {
+                m_idSpline = boost::lexical_cast<int >((*iter)->getExistingAttributeValue("id").c_str());
+                SLM_INFO((*iter)->getExistingAttributeValue("id"));
+            }
+            if((*iter)->hasAttribute("nbSides"))
+            {
+                m_nbSides = boost::lexical_cast<int >((*iter)->getExistingAttributeValue("nbSides").c_str());
+                SLM_INFO((*iter)->getExistingAttributeValue("nbSides"));
+            }
+            if((*iter)->hasAttribute("radius"))
+            {
+                m_radius = boost::lexical_cast<double >((*iter)->getExistingAttributeValue("radius").c_str());
+                SLM_INFO((*iter)->getExistingAttributeValue("radius"));
+            }
+            if((*iter)->hasAttribute("matrix"))
+            {
+                objectMatrix = loadObjectTransformationMatrix3D((*iter)->getExistingAttributeValue("matrix"));
+                isTransfo = true;
+                OSLM_INFO("spline matrix: " << (*iter)->getExistingAttributeValue("matrix"));
+            }
+
+            ::fwRuntime::ConfigurationElementContainer::Iterator iter2;
+            ::fwRuntime::ConfigurationElement::sptr m_configuration2 = m_configuration->findConfigurationElement("spline");
+            for (iter2 = m_configuration2->begin() ; iter2 != m_configuration2->end() ; ++iter2)
+            {
+                if ((*iter2)->getName() == "point"
+                    && (*iter2)->hasAttribute("id"))
+                {
+                    ::fwData::Spline::point pt;
+                    pt.id = boost::lexical_cast<int >((*iter2)->getExistingAttributeValue("id").c_str());
+                    SLM_INFO((*iter2)->getExistingAttributeValue("id"));
+                    pt.p[0] = pt.id * 100.0;
+                    pt.p[1] = 0.0;
+                    pt.p[2] = 0.0;
+                    pt.isVisible = false;
+                    m_points.push_back( pt ) ;
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SplineReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    // Retrieve object
+    ::fwData::Spline::sptr spline = this->getObject< ::fwData::Spline >( );
+
+    spline->points() = m_points ;
+    spline->setRadius(m_radius);
+    spline->setNbSides(m_nbSides);
+    spline->setIdSpline(m_idSpline);
+
+    // Notify reading
+    ::fwComEd::SplineMsg::sptr msg = ::fwComEd::SplineMsg::New();
+    msg->addEvent( ::fwComEd::SplineMsg::NEW_SPLINE ) ;
+
+    if(isTransfo)
+    {
+        spline->setField( ::fwComEd::Dictionary::position, objectMatrix ) ;
+        msg->addEvent( ::fwComEd::Dictionary::position ) ;
+    }
+    ::fwServices::IEditionService::notify(this->getSptr(), spline, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::TransformationMatrix3D::sptr SplineReaderService::loadObjectTransformationMatrix3D(std::string m_file)
+{
+    ::fwData::TransformationMatrix3D::sptr matrix = ::fwData::TransformationMatrix3D::New();
+    ::boost::filesystem::path location(m_file) ;
+
+    std::fstream file;
+    file.open(location.string().c_str(), std::fstream::in);
+    if (!file.is_open())
+    {
+        OSLM_WARN( "Object Matrix file loading error for " + location.string());
+        return matrix;
+    }
+    double val;
+    for( int l=0 ; l < 4 ; l++ )
+    {
+        for( int c=0 ; c < 4 ; c++ )
+        {
+            file >> val;
+            matrix->setCoefficient(l, c, val);
+        }
+    }
+    return matrix;
+}
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DReaderService.cpp b/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DReaderService.cpp
new file mode 100644
index 0000000..cff8680
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DReaderService.cpp
@@ -0,0 +1,130 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+#include <iostream>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwDataIO/reader/TransformationMatrix3DReader.hpp>
+#include <io/IReader.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+
+#include "ioData/TransformationMatrix3DReaderService.hpp"
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::io::IReader , ::ioData::TransformationMatrix3DReaderService , ::fwData::TransformationMatrix3D ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType TransformationMatrix3DReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DReaderService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " TransformationMatrix3D object reader" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > TransformationMatrix3DReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trf");
+    return extensions ;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DReaderService::starting( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a file to load a transformation matrix");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("TRF files","*.trf");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result = ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DReaderService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if(this->hasLocationDefined())
+    {
+        // Retrieve object
+        ::fwData::TransformationMatrix3D::sptr matrix = this->getObject< ::fwData::TransformationMatrix3D >( );
+        SLM_ASSERT("matrix not instanced", matrix);
+
+        ::fwDataIO::reader::TransformationMatrix3DReader::sptr reader = ::fwDataIO::reader::TransformationMatrix3DReader::New();
+        reader->setObject( matrix );
+        reader->setFile(this->getFile());
+        reader->read();
+
+        // Notify reading
+        ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+        msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED );
+        ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DWriterService.cpp b/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DWriterService.cpp
new file mode 100644
index 0000000..f45f5ad
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/TransformationMatrix3DWriterService.cpp
@@ -0,0 +1,130 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+#include <iostream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include <fwDataIO/writer/TransformationMatrix3DWriter.hpp>
+
+#include "ioData/TransformationMatrix3DWriterService.hpp"
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioData::TransformationMatrix3DWriterService , ::fwData::TransformationMatrix3D ) ;
+
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DWriterService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " TransformationMatrix3D object writer" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > TransformationMatrix3DWriterService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trf");
+    return extensions ;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DWriterService::starting( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType TransformationMatrix3DWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a file to save a transformation matrix");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("TRF files","*.trf");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3DWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if(this->hasLocationDefined())
+    {
+        // Retrieve object
+        ::fwData::TransformationMatrix3D::sptr matrix = this->getObject< ::fwData::TransformationMatrix3D >( );
+        SLM_ASSERT("matrix not instanced", matrix);
+
+        ::fwDataIO::writer::TransformationMatrix3DWriter::sptr writer = ::fwDataIO::writer::TransformationMatrix3DWriter::New();
+        writer->setObject( matrix );
+        writer->setFile(this->getFile());
+        writer->write();
+
+        // Notify writing
+        ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+        msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED );
+        ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/TriangularMeshReaderService.cpp b/Bundles/LeafIO/ioData/src/ioData/TriangularMeshReaderService.cpp
new file mode 100644
index 0000000..756884b
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/TriangularMeshReaderService.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <io/IReader.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwDataIO/reader/TriangularMeshReader.hpp>
+
+#include <fwComEd/TriangularMeshMsg.hpp>
+
+#include "ioData/TriangularMeshReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioData::TriangularMeshReaderService , ::fwData::TriangularMesh ) ;
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+void TriangularMeshReaderService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " Triangular Mesh reader" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > TriangularMeshReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trian");
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType TriangularMeshReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an triangular mesh file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("TrianMesh","*.trian");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if(this->hasLocationDefined())
+    {
+        // Retrieve object
+        ::fwData::TriangularMesh::sptr mesh = this->getObject< ::fwData::TriangularMesh >( );
+        SLM_ASSERT("mesh not instanced", mesh);
+
+        ::fwDataIO::reader::TriangularMeshReader::sptr reader = ::fwDataIO::reader::TriangularMeshReader::New();
+        reader->setObject( mesh );
+        reader->setFile(this->getFile());
+        reader->read();
+
+        // Notify reading
+        ::fwComEd::TriangularMeshMsg::sptr msg = ::fwComEd::TriangularMeshMsg::New();
+        msg->addEvent( ::fwComEd::TriangularMeshMsg::NEW_MESH );
+        ::fwServices::IEditionService::notify(this->getSptr(), mesh, msg);
+    }
+}
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/TriangularMeshWriterService.cpp b/Bundles/LeafIO/ioData/src/ioData/TriangularMeshWriterService.cpp
new file mode 100644
index 0000000..c6025da
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/TriangularMeshWriterService.cpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <io/IReader.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwDataIO/writer/TriangularMeshWriter.hpp>
+
+#include "ioData/TriangularMeshWriterService.hpp"
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioData::TriangularMeshWriterService , ::fwData::TriangularMesh ) ;
+
+namespace ioData
+{
+
+//-----------------------------------------------------------------------------
+
+void TriangularMeshWriterService::info(std::ostream &_sstream )
+{
+    this->SuperClass::info( _sstream ) ;
+    _sstream << std::endl << " Triangular Mesh writer" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > TriangularMeshWriterService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".trian");
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType TriangularMeshWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a TrianMesh file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("TrianMesh","*.trian");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve object
+        ::fwData::TriangularMesh::sptr mesh = this->getObject< ::fwData::TriangularMesh >( );
+        SLM_ASSERT("mesh not instanced", mesh);
+
+        ::fwDataIO::writer::TriangularMeshWriter::sptr writer = ::fwDataIO::writer::TriangularMeshWriter::New();
+        writer->setObject( mesh );
+        writer->setFile(this->getFile());
+        writer->write();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafIO/ioData/src/ioData/action/SMeshModifier.cpp b/Bundles/LeafIO/ioData/src/ioData/action/SMeshModifier.cpp
new file mode 100644
index 0000000..b45e4ac
--- /dev/null
+++ b/Bundles/LeafIO/ioData/src/ioData/action/SMeshModifier.cpp
@@ -0,0 +1,169 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwData/Mesh.hpp>
+
+#include <fwDataTools/Mesh.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "ioData/action/SMeshModifier.hpp"
+
+namespace ioData
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::ioData::action::SMeshModifier , ::fwData::Mesh ) ;
+
+//-----------------------------------------------------------------------------
+
+SMeshModifier::SMeshModifier() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+SMeshModifier::~SMeshModifier() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+
+    SLM_ASSERT("Sorry you must have one (and only one) <config functor=... /> element.", vectConfig.size() == 1 );
+    ::fwRuntime::ConfigurationElement::sptr configElement = vectConfig.at(0);
+
+    SLM_ASSERT( "Sorry, missing attribute functor in <config> xml element.", configElement->hasAttribute("functor") );
+    m_functor = configElement->getExistingAttributeValue("functor");
+    OSLM_ASSERT("Wrong functor name "<<m_functor << " (required GenTriangle, GenQuad or GenTriangleQuad)",
+                       m_functor == "ShakeMeshPoint"
+                    || m_functor == "ColorizeMeshPoints"
+                    || m_functor == "ColorizeMeshCells"
+                    || m_functor == "ComputePointNormals"
+                    || m_functor == "ComputeCellNormals"
+                    || m_functor == "ShakePointNormals"
+                    || m_functor == "ShakeCellNormals"
+                    || m_functor == "MeshDeformation"
+                    );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+    ::fwDataTools::Mesh::initRand();
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+    SLM_ASSERT("Mesh dynamicCast failed", mesh);
+    ::fwComEd::MeshMsg::sptr msg = ::fwComEd::MeshMsg::New();
+    try
+    {
+        if(m_functor == "ShakeMeshPoint")
+        {
+            ::fwDataTools::Mesh::shakePoint(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::VERTEX_MODIFIED );
+        }
+        else if(m_functor == "ColorizeMeshCells")
+        {
+            ::fwDataTools::Mesh::colorizeMeshCells(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::CELL_COLORS_MODIFIED );
+        }
+        else if(m_functor == "ColorizeMeshPoints")
+        {
+            ::fwDataTools::Mesh::colorizeMeshPoints(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::POINT_COLORS_MODIFIED );
+        }
+        else if(m_functor == "ComputeCellNormals")
+        {
+            ::fwDataTools::Mesh::generateCellNormals(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED );
+        }
+        else if(m_functor == "ComputePointNormals")
+        {
+            ::fwDataTools::Mesh::generatePointNormals(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED );
+        }
+        else if(m_functor == "ShakeCellNormals")
+        {
+            ::fwDataTools::Mesh::shakeCellNormals(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED );
+        }
+        else if(m_functor == "ShakePointNormals")
+        {
+            ::fwDataTools::Mesh::shakePointNormals(mesh);
+            msg->addEvent( ::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED );
+        }
+        else if(m_functor == "MeshDeformation")
+        {
+            m_animator.computeDeformation( mesh, 100, 50 );
+            msg->addEvent( ::fwComEd::MeshMsg::VERTEX_MODIFIED );
+            msg->addEvent( ::fwComEd::MeshMsg::POINT_COLORS_MODIFIED );
+        }
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during generating : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+
+    ::fwServices::IEditionService::notify(this->getSptr(), mesh, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void SMeshModifier::info(std::ostream &_sstream )
+{
+    _sstream << "MeshGenerator Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/LeafIO/ioITK/CMakeLists.txt b/Bundles/LeafIO/ioITK/CMakeLists.txt
new file mode 100644
index 0000000..28f5b7d
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/CMakeLists.txt
@@ -0,0 +1,44 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwRuntime
+
+    io
+)
+
+
+find_package(Boost REQUIRED)
+find_package(ITK REQUIRED)
+
+find_library(VNL_ALGO_LIBRARY   vnl_algo )
+find_library(VNL_LIBRARY        vnl )
+find_library(VCL_LIBRARY        vcl )
+find_library(V3P_NETLIB_LIBRARY v3p_netlib )
+find_library(NETLIB_LIBRARY     netlib )
+find_path( VNL_INCLUDE_PATH  vxl/core/vnl/vnl_alloc.h)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwInclude(
+    ${ITK_INCLUDE_DIRS}
+    ${VNL_INCLUDE_PATH}
+    )
+fwLink(
+    ITKCommon
+    ITKDICOMParser
+    ITKEXPAT
+    ITKIO
+    ITKMetaIO
+    ITKNrrdIO
+    ITKSpatialObject
+    ITKniftiio
+    ITKznz
+    itkjpeg8
+    itksys
+
+    ${VNL_ALGO_LIBRARY}
+    ${VNL_LIBRARY}
+    ${VCL_LIBRARY}
+    ${V3P_NETLIB_LIBRARY}
+    ${NETLIB_LIBRARY}
+    )
+
diff --git a/Bundles/LeafIO/ioITK/Properties.cmake b/Bundles/LeafIO/ioITK/Properties.cmake
new file mode 100644
index 0000000..7c1d281
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ioITK )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwItkIO fwMedData fwRuntime fwServices fwTools io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioITK/bin/build.options b/Bundles/LeafIO/ioITK/bin/build.options
new file mode 100644
index 0000000..31e909c
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/bin/build.options
@@ -0,0 +1,18 @@
+TYPE = 'bundle'
+VERSION  = '0-1'
+USE = ['boost','itkCommon']
+LIB = [
+    'fwTools_0-1',
+    'fwRuntime_0-3',
+    'fwData_0-1',
+    'fwDataIO_0-2',
+    'fwServices_0-1',
+    'fwCore_0-1',
+    'fwComEd_0-1',
+    'fwItkIO_0-1',
+    'fwGui_0-1',
+    ]
+
+BUNDLES = ['io_0-1','gui_0-1']
+
+
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/InrImageReaderService.hpp b/Bundles/LeafIO/ioITK/include/ioITK/InrImageReaderService.hpp
new file mode 100644
index 0000000..a583411
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/InrImageReaderService.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_INRIMAGEREADERSERVICE_HPP__
+#define __IOITK_INRIMAGEREADERSERVICE_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace fwData
+{
+class Image;
+}
+
+namespace ioITK
+{
+
+class IOITK_CLASS_API InrImageReaderService : public ::io::IReader
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (InrImageReaderService)( ::io::IReader) ) ;
+
+    IOITK_API InrImageReaderService() throw();
+
+    IOITK_API virtual ~InrImageReaderService() throw();
+
+protected:
+
+    /// Override
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /// Override
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    IOITK_API virtual void updating() throw(::fwTools::Failed) ;
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) {} ;
+
+    /// Override
+    IOITK_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOITK_API virtual void configureWithIHM();
+
+    /// Return managed file type, here FILE
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+private :
+
+    void notificationOfDBUpdate();
+
+    bool createImage( const ::boost::filesystem::path &inrFileDir, const SPTR(::fwData::Image) &_pImg );
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_INRIMAGEREADERSERVICE_HPP__
+
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/InrImageWriterService.hpp b/Bundles/LeafIO/ioITK/include/ioITK/InrImageWriterService.hpp
new file mode 100644
index 0000000..05717d4
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/InrImageWriterService.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_INRIMAGEWRITERSERVICE_HPP__
+#define __IOITK_INRIMAGEWRITERSERVICE_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace fwData
+{
+class Image;
+}
+
+namespace ioITK
+{
+
+class IOITK_CLASS_API InrImageWriterService : public ::io::IWriter
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (InrImageWriterService)( ::io::IWriter) ) ;
+
+    IOITK_API InrImageWriterService() throw();
+
+    IOITK_API virtual ~InrImageWriterService() throw();
+
+    IOITK_API static void saveImage( const ::boost::filesystem::path &inrFile, const SPTR(::fwData::Image) &image );
+
+protected:
+
+    /// Override
+    IOITK_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) {} ;
+
+    /// Override
+    IOITK_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOITK_API virtual void configureWithIHM();
+
+    /// Return managed file type, here FILE
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_INRIMAGEWRITERSERVICE_HPP__
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/JpgImageWriterService.hpp b/Bundles/LeafIO/ioITK/include/ioITK/JpgImageWriterService.hpp
new file mode 100644
index 0000000..6712977
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/JpgImageWriterService.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_JPGIMAGEWRITERSERVICE_HPP__
+#define __IOITK_JPGIMAGEWRITERSERVICE_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace fwData
+{
+    class Image;
+}
+
+namespace ioITK
+{
+
+class IOITK_CLASS_API JpgImageWriterService : public ::io::IWriter
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (JpgImageWriterService)( ::io::IWriter) ) ;
+
+    IOITK_API JpgImageWriterService() throw();
+
+    IOITK_API virtual ~JpgImageWriterService() throw();
+
+    IOITK_API static void saveImage(
+            const ::boost::filesystem::path& imgPath,
+            const SPTR(::fwData::Image)& img);
+
+protected:
+
+    /// Override
+    IOITK_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) {} ;
+
+    /// Override
+    IOITK_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOITK_API virtual void configureWithIHM();
+
+    /// Return managed file type, here FOLDER
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_JPGIMAGEWRITERSERVICE_HPP__
+
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/Plugin.hpp b/Bundles/LeafIO/ioITK/include/ioITK/Plugin.hpp
new file mode 100644
index 0000000..1054e0f
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/Plugin.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOITK_PLUGIN_HPP_
+#define _IOITK_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioITK
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009-2011
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace ioITK
+
+#endif //_IOITK_PLUGIN_HPP_
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/SImageSeriesWriter.hpp b/Bundles/LeafIO/ioITK/include/ioITK/SImageSeriesWriter.hpp
new file mode 100644
index 0000000..16b7dcc
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/SImageSeriesWriter.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_SIMAGESERIESWRITER_HPP__
+#define __IOITK_SIMAGESERIESWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace ioITK
+{
+
+class IOITK_CLASS_API SImageSeriesWriter : public ::io::IWriter
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SImageSeriesWriter)( ::io::IWriter) ) ;
+
+    IOITK_API SImageSeriesWriter() throw();
+
+    IOITK_API virtual ~SImageSeriesWriter() throw();
+
+protected:
+
+    /// Override
+    IOITK_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) {} ;
+
+    /// Override
+    IOITK_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOITK_API virtual void configureWithIHM();
+
+    /// Return managed file type, here FILE
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_SIMAGESERIESWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/SInrSeriesDBReader.hpp b/Bundles/LeafIO/ioITK/include/ioITK/SInrSeriesDBReader.hpp
new file mode 100644
index 0000000..5602077
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/SInrSeriesDBReader.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_SINRSERIESDBREADER_HPP__
+#define __IOITK_SINRSERIESDBREADER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace fwData
+{
+class Image;
+}
+
+namespace fwMedData
+{
+class Series;
+}
+
+
+namespace ioITK
+{
+
+/**
+ * @brief Reads inr files and pushes them into SeriesDB.
+ * @class SInrSeriesDBReader
+ */
+class IOITK_CLASS_API SInrSeriesDBReader : public ::io::IReader
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SInrSeriesDBReader)( ::io::IReader) ) ;
+
+    IOITK_API SInrSeriesDBReader() throw();
+
+    IOITK_API virtual ~SInrSeriesDBReader() throw();
+
+protected:
+
+    /// Does nothing.
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /// Does nothing.
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /// Reads inr files specified by user (configure or configureWithIHM) and pushes them into SeriesDB.
+    IOITK_API virtual void updating() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Configure the inr files path.
+     *
+     * This method is used to find the inr files path using a files selector.
+     */
+    IOITK_API virtual void configureWithIHM();
+
+    /// Returns managed file type, here FILES
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+private :
+
+    /// Initializes Series with dummy values and Study with specified instanceUID.
+    void  initSeries(SPTR(::fwMedData::Series) series, const std::string& instanceUID);
+
+    /// Reads specified inr file in image.
+    bool createImage( const ::boost::filesystem::path inrFile, SPTR(::fwData::Image) image );
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_SINRSERIESDBREADER_HPP__
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/SJpgImageSeriesWriter.hpp b/Bundles/LeafIO/ioITK/include/ioITK/SJpgImageSeriesWriter.hpp
new file mode 100644
index 0000000..d272d52
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/SJpgImageSeriesWriter.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOITK_SJPGIMAGESERIESWRITER_HPP__
+#define __IOITK_SJPGIMAGESERIESWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioITK/export.hpp"
+
+namespace ioITK
+{
+
+class IOITK_CLASS_API SJpgImageSeriesWriter : public ::io::IWriter
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SJpgImageSeriesWriter)( ::io::IWriter) ) ;
+
+    IOITK_API SJpgImageSeriesWriter() throw();
+
+    IOITK_API virtual ~SJpgImageSeriesWriter() throw();
+
+protected:
+
+    /// Override
+    IOITK_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOITK_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) {} ;
+
+    /// Override
+    IOITK_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOITK_API virtual void configureWithIHM();
+
+    /// Return managed file type, here FOLDER
+    IOITK_API ::io::IOPathType getIOPathType() const;
+
+};
+
+} // namespace ioITK
+
+#endif //__IOITK_SJPGIMAGESERIESWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioITK/include/ioITK/export.hpp b/Bundles/LeafIO/ioITK/include/ioITK/export.hpp
new file mode 100644
index 0000000..8e5ecd0
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/include/ioITK/export.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOITK_CONFIG_HPP_
+#define _IOITK_CONFIG_HPP_
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef IOITK_EXPORTS
+    #define IOITK_API __declspec(dllexport)
+    #else
+    #define IOITK_API __declspec(dllimport)
+    #endif
+
+    #define IOITK_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IOITK_EXPORTS
+    #define IOITK_API __attribute__ ((visibility("default")))
+    #define IOITK_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IOITK_API __attribute__ ((visibility("hidden")))
+    #define IOITK_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IOITK_API
+    #define IOITK_CLASS_API
+
+#endif
+
+#endif // #ifndef _IOITK_CONFIG_HPP_
diff --git a/Bundles/LeafIO/ioITK/rc/plugin.xml b/Bundles/LeafIO/ioITK/rc/plugin.xml
new file mode 100644
index 0000000..2154c6f
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/rc/plugin.xml
@@ -0,0 +1,50 @@
+<plugin id="ioITK" class="ioITK::Plugin">
+    <library name="ioITK" />
+
+    <requirement id="io" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioITK::InrImageReaderService</service>
+        <object>::fwData::Image</object>
+        <desc>Inrimage Reader (ITK/Ircad)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioITK::InrImageWriterService</service>
+        <object>::fwData::Image</object>
+        <desc>Inrimage Writer (ITK/Ircad)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioITK::JpgImageWriterService</service>
+        <object>::fwData::Image</object>
+        <desc>Jpeg Writer (ITK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioITK::SJpgImageSeriesWriter</service>
+        <object>::fwMedData::ImageSeries</object>
+        <desc>ImageSeries Jpeg Writer (ITK)</desc>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioITK::SInrSeriesDBReader</service>
+        <object>::fwMedData::SeriesDB</object>
+        <desc>SeriesDB Inrimage Reader (ITK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioITK::SImageSeriesWriter</service>
+        <object>::fwMedData::ImageSeries</object>
+        <desc>ImageSeries Inr Writer (ITK)</desc>
+    </extension>
+
+
+</plugin>
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/InrImageReaderService.cpp b/Bundles/LeafIO/ioITK/src/ioITK/InrImageReaderService.cpp
new file mode 100644
index 0000000..182d3ea
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/InrImageReaderService.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwItkIO/ImageReader.hpp>
+
+#include "ioITK/InrImageReaderService.hpp"
+
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioITK::InrImageReaderService , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+InrImageReaderService::InrImageReaderService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+InrImageReaderService::~InrImageReaderService() throw()
+{}
+
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType InrImageReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an Inrimage file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Inrimage","*.inr.gz");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        this->setFile(result->getPath());
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageReaderService::info(std::ostream &_sstream )
+{
+    _sstream << "InrImageReaderService::info";
+}
+
+//------------------------------------------------------------------------------
+
+bool InrImageReaderService::createImage( const ::boost::filesystem::path &inrFileDir, const ::fwData::Image::sptr &_pImg )
+{
+    SLM_TRACE_FUNC();
+    ::fwItkIO::ImageReader::sptr myLoader = ::fwItkIO::ImageReader::New();
+    bool ok = true;
+
+    myLoader->setObject(_pImg);
+    myLoader->setFile(inrFileDir);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Image ");
+        myLoader->addHandler( progressMeterGUI );
+        myLoader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                "Warning during loading",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+    return ok;
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        if ( this->createImage( this->getFile(), this->getObject< ::fwData::Image >() ) )
+        {
+            ::fwGui::Cursor cursor;
+            cursor.setCursor(::fwGui::ICursor::BUSY);
+            notificationOfDBUpdate();
+            cursor.setDefaultCursor();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageReaderService::notificationOfDBUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr pImage = this->getObject< ::fwData::Image >();
+    SLM_ASSERT("pImage not instanced", pImage);
+
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::NEW_IMAGE ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::BUFFER ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::REGION ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::SPACING ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::PIXELTYPE ) ;
+
+    ::fwServices::IEditionService::notify(this->getSptr(), pImage, msg);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/InrImageWriterService.cpp b/Bundles/LeafIO/ioITK/src/ioITK/InrImageWriterService.cpp
new file mode 100644
index 0000000..5594f15
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/InrImageWriterService.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwItkIO/ImageWriter.hpp>
+
+#include "ioITK/InrImageWriterService.hpp"
+
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioITK::InrImageWriterService , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+InrImageWriterService::InrImageWriterService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+InrImageWriterService::~InrImageWriterService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType InrImageWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an inrimage file to save image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Inrimage","*.inr.gz");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        this->setFile( result->getPath() );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::info(std::ostream &_sstream )
+{
+    _sstream << "InrImageWriterService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::saveImage( const ::boost::filesystem::path &inrFile, const ::fwData::Image::sptr &image )
+{
+    SLM_TRACE_FUNC();
+    ::fwItkIO::ImageWriter::sptr myWriter = ::fwItkIO::ImageWriter::New();
+
+    myWriter->setObject(image);
+    myWriter->setFile(inrFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving Image ");
+        myWriter->addHandler( progressMeterGUI );
+        myWriter->write();
+
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+               ss << "Warning during saving : " << e.what();
+               ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                                                                  ss.str(),
+                                                                  ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                                    "Warning during saving",
+                                    ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Image::sptr associatedImage = this->getObject< ::fwData::Image >();
+        SLM_ASSERT("associatedImage not instanced", associatedImage);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        saveImage(this->getFile(),associatedImage);
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/JpgImageWriterService.cpp b/Bundles/LeafIO/ioITK/src/ioITK/JpgImageWriterService.cpp
new file mode 100644
index 0000000..be9b72d
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/JpgImageWriterService.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwItkIO/JpgImageWriter.hpp>
+
+#include "ioITK/JpgImageWriterService.hpp"
+
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioITK::JpgImageWriterService , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+JpgImageWriterService::JpgImageWriterService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+JpgImageWriterService::~JpgImageWriterService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType JpgImageWriterService::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a directory to save image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+    dialogFile.setType(::fwGui::dialog::ILocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr  result;
+    result = ::fwData::location::Folder::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getFolder();
+        this->setFolder(result->getFolder());
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::info(std::ostream &_sstream )
+{
+    _sstream << "JpgImageWriterService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::saveImage(const ::boost::filesystem::path& imgPath, const SPTR(::fwData::Image)& img)
+{
+    SLM_TRACE_FUNC();
+    ::fwItkIO::JpgImageWriter::sptr writer = ::fwItkIO::JpgImageWriter::New();
+    ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving image... ");
+
+    ::fwData::location::Folder::sptr loc = ::fwData::location::Folder::New();
+    loc->setFolder(imgPath);
+    writer->setLocation(loc);
+    writer->setObject(img);
+
+    try
+    {
+        writer->addHandler( progressMeterGUI );
+        writer->write();
+
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during saving : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                                "Warning during saving",
+                                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Image::sptr associatedImage = this->getObject< ::fwData::Image >();
+        SLM_ASSERT("associatedImage not instanced", associatedImage);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        saveImage(this->getFolder(),associatedImage);
+        cursor.setDefaultCursor();
+    }
+}
+
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/Plugin.cpp b/Bundles/LeafIO/ioITK/src/ioITK/Plugin.cpp
new file mode 100644
index 0000000..d77dacc
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/Plugin.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include <inr2itk/itkInrImageIO.h>
+
+#include "ioITK/Plugin.hpp"
+
+
+
+namespace ioITK
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("ioITK::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    // force use of code in LIB itkInrImageIO ...
+    typedef ::itk::InrImageIO::Self Dummy;
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/SImageSeriesWriter.cpp b/Bundles/LeafIO/ioITK/src/ioITK/SImageSeriesWriter.cpp
new file mode 100644
index 0000000..f589c0d
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/SImageSeriesWriter.cpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwItkIO/ImageWriter.hpp>
+
+#include "ioITK/InrImageWriterService.hpp"
+#include "ioITK/SImageSeriesWriter.hpp"
+
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioITK::SImageSeriesWriter , ::fwMedData::ImageSeries ) ;
+
+//------------------------------------------------------------------------------
+
+SImageSeriesWriter::SImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SImageSeriesWriter::~SImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SImageSeriesWriter::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an inrimage file to save image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Inrimage","*.inr.gz");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        this->setFile( result->getPath() );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::info(std::ostream &_sstream )
+{
+    _sstream << "SImageSeriesWriter::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+
+        ::fwMedData::ImageSeries::sptr iseries = this->getObject< ::fwMedData::ImageSeries >();
+        const ::fwData::Image::sptr &associatedImage = iseries->getImage();
+        SLM_ASSERT("associatedImage not instanced", associatedImage);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        InrImageWriterService::saveImage(this->getFile(), associatedImage);
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/SInrSeriesDBReader.cpp b/Bundles/LeafIO/ioITK/src/ioITK/SInrSeriesDBReader.cpp
new file mode 100644
index 0000000..2649b20
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/SInrSeriesDBReader.cpp
@@ -0,0 +1,205 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwItkIO/ImageReader.hpp>
+
+#include "ioITK/SInrSeriesDBReader.hpp"
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioITK::SInrSeriesDBReader , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+SInrSeriesDBReader::SInrSeriesDBReader() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SInrSeriesDBReader::~SInrSeriesDBReader() throw()
+{}
+
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SInrSeriesDBReader::getIOPathType() const
+{
+    return ::io::FILES;
+}
+
+//------------------------------------------------------------------------------
+
+void SInrSeriesDBReader::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an Inrimage file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Inrimage","*.inr.gz");
+    dialogFile.setType(::fwGui::dialog::ILocationDialog::MULTI_FILES);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::MultiFiles::sptr  result;
+    result = ::fwData::location::MultiFiles::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        const ::fwData::location::ILocation::VectPathType paths = result->getPaths();
+        if(!paths.empty())
+        {
+            _sDefaultPath = paths[0].parent_path();
+            dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        }
+        this->setFiles(paths);
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool SInrSeriesDBReader::createImage( const ::boost::filesystem::path inrFile, ::fwData::Image::sptr image )
+{
+    SLM_TRACE_FUNC();
+    ::fwItkIO::ImageReader::sptr myLoader = ::fwItkIO::ImageReader::New();
+    bool ok = true;
+
+    myLoader->setObject(image);
+    myLoader->setFile(inrFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Image ");
+        myLoader->addHandler( progressMeterGUI );
+        myLoader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Warning",
+                "Warning during loading",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+    return ok;
+}
+
+//------------------------------------------------------------------------------
+
+void SInrSeriesDBReader::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >() ;
+        SLM_ASSERT("SeriesDB not instanced", seriesDB);
+
+        ::fwMedData::SeriesDB::sptr localSeriesDB = ::fwMedData::SeriesDB::New();
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        const std::string instanceUID = ::fwTools::UUID::generateUUID();
+
+        BOOST_FOREACH(const ::boost::filesystem::path &path, this->getFiles())
+        {
+            ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::New();
+            this->initSeries(imgSeries, instanceUID);
+
+            ::fwData::Image::sptr image = ::fwData::Image::New();
+            this->createImage( path, image );
+            imgSeries->setImage(image);
+
+            localSeriesDB->getContainer().push_back(imgSeries);
+        }
+
+        ::fwComEd::helper::SeriesDB sDBhelper(seriesDB);
+
+        ::fwData::mt::ObjectWriteLock lock(seriesDB);
+        sDBhelper.merge(localSeriesDB);
+        sDBhelper.notify(this->getSptr());
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void  SInrSeriesDBReader::initSeries(::fwMedData::Series::sptr series, const std::string& instanceUID)
+{
+    const std::string unknown = "unknown";
+    series->setModality("OT");
+    ::boost::posix_time::ptime now = ::boost::posix_time::second_clock::local_time();
+    const std::string date = ::fwTools::getDate(now);
+    const std::string time = ::fwTools::getTime(now);
+    series->setDate(date);
+    series->setTime(time);
+    //series->setDescription(??);
+    //series->setPerformingPhysiciansName(??);
+
+    series->getEquipment()->setInstitutionName(unknown);
+
+    series->getPatient()->setName(unknown);
+    series->getPatient()->setPatientId(unknown);
+    series->getPatient()->setBirthdate(unknown);
+    series->getPatient()->setSex(unknown);
+
+    series->getStudy()->setInstanceUID(instanceUID);
+    series->getStudy()->setDate(date);
+    series->getStudy()->setTime(time);
+    series->getStudy()->setReferringPhysicianName(unknown);
+    series->getStudy()->setDescription(unknown);
+    series->getStudy()->setPatientAge(unknown);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
diff --git a/Bundles/LeafIO/ioITK/src/ioITK/SJpgImageSeriesWriter.cpp b/Bundles/LeafIO/ioITK/src/ioITK/SJpgImageSeriesWriter.cpp
new file mode 100644
index 0000000..f3b60f6
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/src/ioITK/SJpgImageSeriesWriter.cpp
@@ -0,0 +1,143 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include "ioITK/JpgImageWriterService.hpp"
+#include "ioITK/SJpgImageSeriesWriter.hpp"
+
+
+namespace ioITK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioITK::SJpgImageSeriesWriter , ::fwMedData::ImageSeries ) ;
+
+//------------------------------------------------------------------------------
+
+SJpgImageSeriesWriter::SJpgImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SJpgImageSeriesWriter::~SJpgImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SJpgImageSeriesWriter::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+void SJpgImageSeriesWriter::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialog;
+    dialog.setTitle("Choose a directory to save image");
+    dialog.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialog.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+    dialog.setType(::fwGui::dialog::ILocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr  result;
+
+    while (result = ::fwData::location::Folder::dynamicCast( dialog.show() ))
+    {
+        if( ::boost::filesystem::is_empty(result->getFolder()) )
+        {
+            break;
+        }
+        // message box
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Overwrite confirmation");
+        messageBox.setMessage("The selected directory is not empty. Write anyway ?");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::QUESTION);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::YES);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::CANCEL);
+        if( messageBox.show() == ::fwGui::dialog::IMessageDialog::YES)
+        {
+            break;
+        }
+    }
+
+    if (result)
+    {
+        _sDefaultPath = result->getFolder().parent_path();
+        dialog.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFolder(result->getFolder());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SJpgImageSeriesWriter::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SJpgImageSeriesWriter::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SJpgImageSeriesWriter::info(std::ostream &_sstream )
+{
+    _sstream << "SJpgImageSeriesWriter::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SJpgImageSeriesWriter::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ImageSeries::sptr imageSeries = this->getObject< ::fwMedData::ImageSeries >();
+        SLM_ASSERT("Image series is not instanced", imageSeries);
+        SLM_ASSERT("Image from image series is not instanced", imageSeries->getImage());
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        JpgImageWriterService::saveImage(this->getFolder(), imageSeries->getImage());
+        cursor.setDefaultCursor();
+    }
+}
+
+
+//------------------------------------------------------------------------------
+
+} // namespace ioITK
+
diff --git a/Bundles/LeafIO/ioITK/test/CMakeLists.txt b/Bundles/LeafIO/ioITK/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/Bundles/LeafIO/ioITK/test/Properties.cmake b/Bundles/LeafIO/ioITK/test/Properties.cmake
new file mode 100644
index 0000000..d864d30
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME ioITKTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataTools fwItkIO )
+set( REQUIREMENTS ioITK )
+
+set(CPPUNITTEST_OPTIONS BUNDLE ioITK WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafIO/ioITK/test/cppunit.options b/Bundles/LeafIO/ioITK/test/cppunit.options
new file mode 100644
index 0000000..3c18989
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/cppunit.options
@@ -0,0 +1,18 @@
+CLASSTEST=[
+          'IoItkTest',
+          ]
+
+USE = ['boost']
+LIB = ['fwData_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwDataTools_0-1',
+       'fwTest_0-1',
+       'fwItkIO_0-1',]
+
+BUNDLES = []
+REQUIREMENTS = ['ioITK_0-1']
+
+CONSOLE = 'yes'
+
+LOGLEVEL='trace'
diff --git a/Bundles/LeafIO/ioITK/test/tu/include/IoItkTest.hpp b/Bundles/LeafIO/ioITK/test/tu/include/IoItkTest.hpp
new file mode 100644
index 0000000..f5b0845
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/tu/include/IoItkTest.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef __IOITK_TEST_TU_IOITKTEST_HPP__
+#define __IOITK_TEST_TU_IOITKTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwRuntime
+{
+    class EConfigurationElement;
+}
+
+namespace ioITK
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh.
+ */
+class IoItkTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( IoItkTest );
+    CPPUNIT_TEST( testImageWriterJPG );
+    CPPUNIT_TEST( testImageSeriesWriterJPG );
+    CPPUNIT_TEST( testSaveLoadInr );
+    CPPUNIT_TEST( ImageSeriesInrTest );
+    CPPUNIT_TEST( SeriesDBInrTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testImageWriterJPG();
+    void testImageSeriesWriterJPG();
+    void testSaveLoadInr();
+    void ImageSeriesInrTest();
+    void SeriesDBInrTest();
+
+private :
+
+    void executeService(
+            const SPTR(::fwData::Object)& obj,
+            const std::string& srvType,
+            const std::string& srvImpl,
+            const SPTR(::fwRuntime::EConfigurationElement)& cfg);
+
+};
+
+} //namespace ut
+} //namespace ioITK
+
+#endif //__IOITK_TEST_TU_IOITKTEST_HPP__
+
diff --git a/Bundles/LeafIO/ioITK/test/tu/rc/profile.xml b/Bundles/LeafIO/ioITK/test/tu/rc/profile.xml
new file mode 100644
index 0000000..24ab135
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/tu/rc/profile.xml
@@ -0,0 +1,14 @@
+<profile name="IoMfoTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioITK" version="0-1" />
+
+    <start id="ioITK" />
+
+</profile>
diff --git a/Bundles/LeafIO/ioITK/test/tu/src/IoItkTest.cpp b/Bundles/LeafIO/ioITK/test/tu/src/IoItkTest.cpp
new file mode 100644
index 0000000..b7c3b2f
--- /dev/null
+++ b/Bundles/LeafIO/ioITK/test/tu/src/IoItkTest.cpp
@@ -0,0 +1,291 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/filesystem.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/System.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwTest/Data.hpp>
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataTools/Image.hpp>
+
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+
+#include "IoItkTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioITK::ut::IoItkTest );
+
+
+namespace ioITK
+{
+namespace ut
+{
+
+static const double EPSILON = 0.00001;
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::executeService(
+        const SPTR(::fwData::Object)& obj,
+        const std::string& srvType,
+        const std::string& srvImpl,
+        const SPTR(::fwRuntime::EConfigurationElement)& cfg )
+{
+    ::fwServices::IService::sptr srv
+        = ::fwServices::registry::ServiceFactory::getDefault()->create(srvType, srvImpl);
+
+    CPPUNIT_ASSERT(srv);
+    ::fwServices::OSR::registerService( obj , srv );
+    srv->setConfiguration(cfg);
+    CPPUNIT_ASSERT_NO_THROW(srv->configure());
+    CPPUNIT_ASSERT_NO_THROW(srv->start());
+    CPPUNIT_ASSERT_NO_THROW(srv->update());
+    CPPUNIT_ASSERT_NO_THROW(srv->stop());
+    ::fwServices::OSR::unregisterService( srv );
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::testImageSeriesWriterJPG()
+{
+    // Create image series
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::New();
+    imageSeries->setImage(image);
+
+    // Create path
+    const ::boost::filesystem::path path = "imageSeriesJPG";
+    ::boost::filesystem::create_directories(path);
+
+    // Create Config
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr folderCfg = ::fwRuntime::EConfigurationElement::New("folder");
+    folderCfg->setValue(path.string());
+    srvCfg->addConfigurationElement(folderCfg);
+
+    // Create and execute service
+    this->executeService(imageSeries, "::io::IWriter", "::ioITK::SJpgImageSeriesWriter", srvCfg);
+
+    // Remove path
+    ::boost::filesystem::remove_all( path.string() );
+}
+
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::testImageWriterJPG()
+{
+    // Create Image
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    // Create path
+    const ::boost::filesystem::path path = "imageJPG";
+    ::boost::filesystem::create_directories( path );
+
+    // Create Config
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr folderCfg = ::fwRuntime::EConfigurationElement::New("folder");
+    folderCfg->setValue(path.string());
+    srvCfg->addConfigurationElement(folderCfg);
+
+    // Create and execute service
+    this->executeService( image, "::io::IWriter", "::ioITK::JpgImageWriterService", srvCfg );
+
+    // Remove path
+    ::boost::filesystem::remove_all( path.string() );
+}
+
+//------------------------------------------------------------------------------
+
+double tolerance(double num)
+{
+    return std::floor(num * 100. + .5) / 100.;
+}
+
+void IoItkTest::testSaveLoadInr()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    // inr only support image origin (0,0,0)
+    ::fwData::Image::OriginType origin(3,0);
+    image->setOrigin(origin);
+
+    // save image in inr
+    const ::boost::filesystem::path PATH = "imageInrTest/image.inr.gz";
+    ::boost::filesystem::create_directories( PATH.parent_path() );
+
+    // Create Config
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileCfg->setValue(PATH.string());
+    srvCfg->addConfigurationElement(fileCfg);
+
+    // Create and execute service
+    this->executeService( image, "::io::IWriter", "::ioITK::InrImageWriterService", srvCfg );
+
+    // load Image
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    this->executeService( image2, "::io::IReader", "::ioITK::InrImageReaderService", srvCfg );
+
+    ::boost::filesystem::remove_all( PATH.parent_path().string() );
+
+    ::fwData::Image::SpacingType spacing = image2->getSpacing();
+    std::transform (spacing.begin(), spacing.end(), spacing.begin(), tolerance);
+    image2->setSpacing(spacing);
+
+    // check Image
+    compare(image, image2);
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::ImageSeriesInrTest()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    imageSeries->setImage(image);
+
+    // inr only support image origin (0,0,0)
+    ::fwData::Image::OriginType origin(3,0);
+    image->setOrigin(origin);
+
+    // save image in inr
+    const ::boost::filesystem::path PATH = "imageInrTest/imageseries.inr.gz";
+    ::boost::filesystem::create_directories( PATH.parent_path() );
+
+    // Create Config
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileCfg->setValue(PATH.string());
+    srvCfg->addConfigurationElement(fileCfg);
+
+    // Create and execute service
+    this->executeService( imageSeries, "::io::IWriter", "::ioITK::SImageSeriesWriter", srvCfg );
+
+    // load Image
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    this->executeService( image2, "::io::IReader", "::ioITK::InrImageReaderService", srvCfg );
+
+    ::boost::filesystem::remove_all( PATH.parent_path().string() );
+
+    ::fwData::Image::SpacingType spacing = image2->getSpacing();
+    std::transform (spacing.begin(), spacing.end(), spacing.begin(), tolerance);
+    image2->setSpacing(spacing);
+
+    // check Image
+    compare(image, image2);
+}
+
+//------------------------------------------------------------------------------
+
+void IoItkTest::SeriesDBInrTest()
+{
+    /*
+     * - image.inr.gz : CT, type int16, size: 512x512x134, spacing 0.781:0.781:1.6
+     * - skin.inr.gz : mask skin, type uint8, size: 512x512x134, spacing 0.781:0.781:1.6
+     */
+    const ::boost::filesystem::path imageFile = ::fwTest::Data::dir() / "fw4spl/image/inr/image.inr.gz";
+    const ::boost::filesystem::path skinFile = ::fwTest::Data::dir() / "fw4spl/image/inr/skin.inr.gz";
+    // Create Config
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr fileImageCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileImageCfg->setValue(imageFile.string());
+    srvCfg->addConfigurationElement(fileImageCfg);
+
+    ::fwRuntime::EConfigurationElement::sptr fileSkinCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileSkinCfg->setValue(skinFile.string());
+    srvCfg->addConfigurationElement(fileSkinCfg);
+
+    // load SeriesDB
+    ::fwMedData::SeriesDB::sptr sdb = ::fwMedData::SeriesDB::New();
+    this->executeService( sdb, "::io::IReader", "::ioITK::SInrSeriesDBReader", srvCfg );
+
+    ::fwData::Image::SpacingType spacing = list_of(0.781)(0.781)(1.6);
+    ::fwData::Image::SizeType size = list_of(512)(512)(134);
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2), sdb->getContainer().size());
+    ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(sdb->getContainer()[0]);
+    CPPUNIT_ASSERT(imgSeries);
+    CPPUNIT_ASSERT_EQUAL(std::string("OT"), imgSeries->getModality());
+
+    ::fwData::Image::sptr image = imgSeries->getImage();
+    CPPUNIT_ASSERT(image);
+    CPPUNIT_ASSERT_EQUAL(std::string("int16"), image->getType().string());
+    CPPUNIT_ASSERT(size == image->getSize());
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[0], image->getSpacing()[0], EPSILON);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[1], image->getSpacing()[1], EPSILON);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[2], image->getSpacing()[2], EPSILON);
+
+    imgSeries = ::fwMedData::ImageSeries::dynamicCast(sdb->getContainer()[1]);
+    CPPUNIT_ASSERT(imgSeries);
+    CPPUNIT_ASSERT_EQUAL(std::string("OT"), imgSeries->getModality());
+    CPPUNIT_ASSERT(imgSeries->getImage());
+
+    image = imgSeries->getImage();
+    CPPUNIT_ASSERT(image);
+    CPPUNIT_ASSERT_EQUAL(std::string("uint8"), image->getType().string());
+    CPPUNIT_ASSERT(size == image->getSize());
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[0], image->getSpacing()[0], EPSILON);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[1], image->getSpacing()[1], EPSILON);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(spacing[2], image->getSpacing()[2], EPSILON);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace ioITK
+
diff --git a/Bundles/LeafIO/ioTuto/CMakeLists.txt b/Bundles/LeafIO/ioTuto/CMakeLists.txt
new file mode 100644
index 0000000..42eddae
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/CMakeLists.txt
@@ -0,0 +1,13 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+
+    io
+)
+
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+
diff --git a/Bundles/LeafIO/ioTuto/COPYING b/Bundles/LeafIO/ioTuto/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafIO/ioTuto/COPYING.LESSER b/Bundles/LeafIO/ioTuto/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafIO/ioTuto/Properties.cmake b/Bundles/LeafIO/ioTuto/Properties.cmake
new file mode 100644
index 0000000..24c95fe
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ioTuto )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwData fwGui fwRuntime fwServices io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioTuto/bin/build.options b/Bundles/LeafIO/ioTuto/bin/build.options
new file mode 100644
index 0000000..0b78427
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/bin/build.options
@@ -0,0 +1,20 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['boost', 'boostFilesystem']
+LIB = [
+      'fwTools_0-1',
+      'fwRuntime_0-3',
+      'fwData_0-1',
+      'fwDataIO_0-2',
+      'fwServices_0-1',
+      'fwCore_0-1',
+      'fwGui_0-1',
+      'fwAtomConversion_0-1',
+      'fwZip_0-1',
+      'fwAtomsBoostIO_0-1',
+      ]
+BUNDLES = ['io_0-1']
+
+
+
+
diff --git a/Bundles/LeafIO/ioTuto/include/ioTuto/ExternalDataReaderService.hpp b/Bundles/LeafIO/ioTuto/include/ioTuto/ExternalDataReaderService.hpp
new file mode 100644
index 0000000..c3a8a92
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/include/ioTuto/ExternalDataReaderService.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOTUTO_EXTERNALDATAREADER_HPP_
+#define _IOTUTO_EXTERNALDATAREADER_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioTuto/config.hpp"
+
+namespace ioTuto
+{
+
+class IOTUTO_CLASS_API ExternalDataReaderService : public ::io::IReader
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ExternalDataReaderService)( ::io::IReader) ) ;
+    /**
+     * @brief Constructor : does nothing
+    */
+    IOTUTO_API ExternalDataReaderService() ;
+
+    /**
+     * @brief Destructor
+     */
+        IOTUTO_API ~ExternalDataReaderService() throw() ;
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IOTUTO_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Starting method : default does nothing.
+     *
+     * This method is used to initialize the service.
+     */
+    IOTUTO_API virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOTUTO_API virtual void stopping() throw(::fwTools::Failed){};
+
+
+    /**
+     * @brief Configure service. This method is called by configure() from base service ( ::fwServices::IService )
+     *
+     * XML configuration sample:
+     * @verbatim
+    <service type="::ioTuto::ExternalDataReaderService">
+    </service>
+     @endverbatim
+     *
+     * Configure External data info filename.
+     */
+IOTUTO_API virtual void configuring( ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the image path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IOTUTO_API void configureWithIHM();
+
+    /**
+     * @brief Updating method. This method is called by update() from base service ( ::fwServices::IService )
+     *
+     * This method is used to update the service.
+     */
+    IOTUTO_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     *
+     * @param[out] _sstream output stream
+     */
+    IOTUTO_API virtual void info(std::ostream &_sstream ) ;
+    /// @}
+
+    /// Returns managed path type, here service manages only single file
+    IOTUTO_API ::io::IOPathType getIOPathType() const;
+};
+}
+#endif /*_IOTUTO_EXTERNALDATAREADER_HPP_*/
diff --git a/Bundles/LeafIO/ioTuto/include/ioTuto/Plugin.hpp b/Bundles/LeafIO/ioTuto/include/ioTuto/Plugin.hpp
new file mode 100644
index 0000000..0fecabc
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/include/ioTuto/Plugin.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOTUTO_PLUGIN_HPP_
+#define _IOTUTO_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioTuto
+{
+
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace ioTuto
+
+#endif //_IOTUTO_PLUGIN_HPP_
diff --git a/Bundles/LeafIO/ioTuto/include/ioTuto/config.hpp b/Bundles/LeafIO/ioTuto/include/ioTuto/config.hpp
new file mode 100644
index 0000000..8c7c15f
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/include/ioTuto/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IOTUTO_CONFIG_HPP_
+#define IOTUTO_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef IOTUTO_EXPORTS
+    #define IOTUTO_API __declspec(dllexport)
+    #else
+    #define IOTUTO_API __declspec(dllimport)
+    #endif
+
+    #define IOTUTO_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IOTUTO_EXPORTS
+    #define IOTUTO_API __attribute__ ((visibility("default")))
+    #define IOTUTO_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IOTUTO_API __attribute__ ((visibility("hidden")))
+    #define IOTUTO_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IOTUTO_API
+    #define IOTUTO_CLASS_API
+
+#endif
+
+#endif //IOTUTO_CONFIG_HPP_
diff --git a/Bundles/LeafIO/ioTuto/rc/plugin.xml b/Bundles/LeafIO/ioTuto/rc/plugin.xml
new file mode 100644
index 0000000..77db1fc
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/rc/plugin.xml
@@ -0,0 +1,22 @@
+<plugin id="ioTuto" class="ioTuto::Plugin">
+
+    <library name="ioTuto" />
+
+    <requirement id="io" />
+
+<!-- All Reader/Writer can extended by providing a specific configuration, being a user info for instance -->
+<!--     <extension-point id="::ioTuto::ioTuto1" /> -->
+
+<!-- User info like extensions -->
+<!--    <extension implements="::ioTuto::ioTuto1" >
+        <info text="Tuto(Ircad)"/>
+    </extension> -->
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioTuto::ExternalDataReaderService</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafIO/ioTuto/src/ioTuto/ExternalDataReaderService.cpp b/Bundles/LeafIO/ioTuto/src/ioTuto/ExternalDataReaderService.cpp
new file mode 100644
index 0000000..bf940fa
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/src/ioTuto/ExternalDataReaderService.cpp
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include "ioTuto/ExternalDataReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioTuto::ExternalDataReaderService , ::fwData::Composite ) ;
+
+namespace ioTuto
+{
+
+//-----------------------------------------------------------------------------
+
+ExternalDataReaderService::ExternalDataReaderService()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ExternalDataReaderService::info(std::ostream &_sstream )
+{
+    this->::io::IReader::info( _sstream ) ;
+    _sstream << std::endl << " External data file reader" ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > ExternalDataReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".us");
+    return extensions ;
+}
+
+//-----------------------------------------------------------------------------
+
+ExternalDataReaderService::~ExternalDataReaderService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ExternalDataReaderService::configuring( ) throw(::fwTools::Failed)
+{
+    if( m_configuration->findConfigurationElement("filename") )
+    {
+        std::string filename = m_configuration->findConfigurationElement("filename")->getValue() ;
+        OSLM_INFO( "ExternalDataReaderService::configure filename: " << filename );
+        this->setFile(filename);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ExternalDataReaderService::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an external data file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("us", "*.us");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath();
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ExternalDataReaderService::updating() throw(::fwTools::Failed)
+{
+    this->configureWithIHM();
+
+    std::string imageName;
+    ::fwData::Composite::sptr dataComposite = this->getObject< ::fwData::Composite >();
+    ::fwComEd::helper::Composite compositeHelper(dataComposite);
+    SLM_ASSERT("dataComposite not instanced", dataComposite);
+    try
+    {
+        if (this->hasLocationDefined())
+        {
+            // reading of the file
+            std::fstream file;
+            file.open(this->getFile().string().c_str(), std::fstream::in);
+            if (!file.is_open())
+            {
+                OSLM_ERROR( "External data file loading error for " << this->getFile());
+                std::string str = "Unable to open ";
+                str+= this->getFile().string();
+                throw std::ios_base::failure(str);
+            }
+            file >> imageName;
+            int readedValue = 0;
+            double value;
+            ::fwData::TransformationMatrix3D::sptr transformation1 = ::fwData::TransformationMatrix3D::New();
+            ::fwData::TransformationMatrix3D::sptr transformation2 = ::fwData::TransformationMatrix3D::New();
+            while(!file.eof())
+            {
+                readedValue = 0;
+                while ( !file.eof() && readedValue<32 )
+                {
+                    file >> value;
+                    if  (readedValue<16)
+                    {
+                        transformation1->getRefCoefficients().push_back( value );
+                    }
+                    else
+                    {
+                        transformation2->getRefCoefficients().push_back( value );
+                    }
+                    readedValue++;
+                }
+            }
+            file.close();
+            // TF1 contains the first and third transformations
+            if(dataComposite->find("TF1") == dataComposite->end() )
+            {
+                compositeHelper.add("TF1", transformation1);
+            }
+            else
+            {
+                compositeHelper.swap("TF1", transformation1);
+            }
+            // TF2 contains the first and third transformations
+            if(dataComposite->find("TF2") == dataComposite->end() )
+            {
+                compositeHelper.add("TF2", transformation2);
+            }
+            else
+            {
+                compositeHelper.swap("TF2", transformation2);
+            }
+            ::fwData::String::sptr imageNameStr = ::fwData::String::New(imageName);
+            if(dataComposite->find("filename") == dataComposite->end() )
+            {
+                compositeHelper.add("filename", imageNameStr);
+            }
+            else
+            {
+                compositeHelper.swap("filename", imageNameStr);
+            }
+            SLM_ASSERT("Unable to open '"+this->getFile().string()+"'.", readedValue == 32 );
+        }
+    }
+    catch(std::ios_base::failure &exception)
+    {
+        OSLM_ERROR( "External data file loading error for " << exception.what());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType ExternalDataReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafIO/ioTuto/src/ioTuto/Plugin.cpp b/Bundles/LeafIO/ioTuto/src/ioTuto/Plugin.cpp
new file mode 100644
index 0000000..8e51c38
--- /dev/null
+++ b/Bundles/LeafIO/ioTuto/src/ioTuto/Plugin.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include "ioTuto/Plugin.hpp"
+
+
+namespace ioTuto
+{
+using namespace ::fwRuntime::utils;
+static GenericExecutableFactoryRegistrar<Plugin> registrar("ioTuto::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void Plugin::stop() throw()
+{}
+
+}
+
diff --git a/Bundles/LeafIO/ioVTK/CMakeLists.txt b/Bundles/LeafIO/ioVTK/CMakeLists.txt
new file mode 100644
index 0000000..11851e4
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/CMakeLists.txt
@@ -0,0 +1,22 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRuntime
+    fwServices
+
+    io
+)
+
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    vtkHybrid
+    )
+
diff --git a/Bundles/LeafIO/ioVTK/COPYING b/Bundles/LeafIO/ioVTK/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafIO/ioVTK/COPYING.LESSER b/Bundles/LeafIO/ioVTK/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafIO/ioVTK/Properties.cmake b/Bundles/LeafIO/ioVTK/Properties.cmake
new file mode 100644
index 0000000..a9a1198
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ioVTK )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwDataIO fwGui fwMedData fwRuntime fwServices fwTools fwVtkIO io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioVTK/bin/build.options b/Bundles/LeafIO/ioVTK/bin/build.options
new file mode 100644
index 0000000..a1ffcd6
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['boost', 'boostFilesystem','vtkHybrid']
+LIB     = [
+          'fwTools_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwMedData_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwCore_0-1',
+          'fwComEd_0-1',
+          'fwVtkIO_0-1',
+          'fwGui_0-1',
+          ]
+BUNDLES = ['io_0-1']
+
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/ImageReaderService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/ImageReaderService.hpp
new file mode 100644
index 0000000..65934d4
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/ImageReaderService.hpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_IMAGEREADERSERVICE_HPP_
+#define _IOVTK_IMAGEREADERSERVICE_HPP_
+
+#include <boost/filesystem/path.hpp> // Used to save the file system path of loaded image
+
+#include <io/IReader.hpp> // Definition of abstract reader class
+
+#include "ioVTK/export.hpp"  // Declaration of class and function export
+
+// Pre-definition of ::fwData::Image to avoid inclusion file
+namespace fwData
+{
+    class Image;
+}
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Image reader service.
+ * @class   ImageReaderService
+ *
+ * Service reading a VTK Image using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::ImageReaderService , ::fwData::Image )
+ */
+class IOVTK_CLASS_API ImageReaderService : public ::io::IReader
+{
+
+public :
+    ~ImageReaderService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageReaderService)( ::io::IReader) ) ;
+
+    /**
+     * @brief Configure the image path with an wxWidget dialogBox.
+     *
+     * This method is used to find the file path using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+//    IOVTK_API virtual void setFile(const ::boost::filesystem::path &file);
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /// Method called when the service is started, does nothing.
+    IOVTK_API virtual void starting() throw ( ::fwTools::Failed );
+
+    /// Method called when the service is stopped, does nothing.
+    IOVTK_API virtual void stopping() throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Updating method execute the read process.
+     *
+     * This method is used to update the service.
+     * The image is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : here, this method does nothing.
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     * @param[in] _msg information message for modification
+     */
+    IOVTK_API void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw ( ::fwTools::Failed );
+
+    /// Info method gives some informations on service.
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+private :
+
+    /**
+    * @brief This method is used to load an vtk image using a file path.
+    * @param[in] _vtkFile file system path of vtk image
+    * @param[out] _pImage new empty image that will contain image loaded, if reading process is a success.
+    * @return bool  \b true if the image loading is a success and \b false if it fails
+    */
+    bool loadImage( const ::boost::filesystem::path _vtkFile, ::boost::shared_ptr< ::fwData::Image > _pImage );
+
+    /// This method notifies other image services that a new image has been loaded.
+    void notificationOfDBUpdate();
+
+    /// This value is \b true if the path image is known.
+    bool m_bServiceIsConfigured;
+
+    /// Image path, location of image on filesystem.
+    ::boost::filesystem::path m_fsImgPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_IMAGEREADERSERVICE_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/ImageWriterService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/ImageWriterService.hpp
new file mode 100644
index 0000000..ed10a5d
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/ImageWriterService.hpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_IMAGEWRITERSERVICE_HPP_
+#define _IOVTK_IMAGEWRITERSERVICE_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class Image;
+}
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   VTK image writer service.
+ * @class   ImageWriterService
+ *
+ * Service writing a VTK Image using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::ImageWriterService , ::fwData::Image )
+ */
+class IOVTK_CLASS_API ImageWriterService : public ::io::IWriter
+{
+
+public :
+    ~ImageWriterService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageWriterService)( ::io::IWriter) ) ;
+
+    /**
+     * @brief Configure the image path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+    /**
+    * @brief Save a VTK image.
+    * @param[in] imgFile ::boost::filesystem::path.
+    * @param[out] image ::boost::shared_ptr< ::fwData::Image >.
+    * @return bool.
+    *
+    * This method is used to save an image using the file path.
+    * Returns \b true if the image saving is a success and \b false if it fails
+    */
+    IOVTK_API static bool saveImage( const ::boost::filesystem::path& imgFile, const SPTR(::fwData::Image)& image );
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method.
+     *
+     * This method is used to update the service.
+     * The image is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+private :
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the image path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief Image path.
+    */
+    ::boost::filesystem::path m_fsImgPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_IMAGEWRITERSERVICE_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/MaxMeshReaderService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/MaxMeshReaderService.hpp
new file mode 100644
index 0000000..6fd64d1
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/MaxMeshReaderService.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MAX_MESHREADER_SERVICE_HPP_
+#define _MAX_MESHREADER_SERVICE_HPP_
+
+#include <io/IReader.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "ioVTK/export.hpp"
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   3ds Max reader service.
+ * @class   MaxMeshReaderService
+ *
+ * Service reading a 3ds Max file using the fwVtkIO lib
+ * (for .3ds at this time).
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::MaxMeshReaderService , ::fwData::Model )
+ */
+class IOVTK_CLASS_API MaxMeshReaderService : public ::io::IReader
+{
+public:
+    ~MaxMeshReaderService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (MaxMeshReaderService)( ::io::IReader) ) ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+    /*!
+    * @brief Get the supported extensions.
+    *
+    * @return std::vector< std::string >.
+    *
+    * Return a std::vector< std::string > that contains the supported extensions.
+    */
+    IOVTK_API virtual std::vector< std::string > getSupportedExtensions();
+
+
+protected:
+
+    /**
+    * @brief Starting method : default does nothing.
+    *
+    * This method is used to initialize the service.
+    */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API virtual void info(std::ostream &_sstream );
+
+
+private:
+
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the path image is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    ::boost::filesystem::path m_fsMeshPath;
+};
+
+}
+
+#endif /*_MAX_MESHREADER_SERVICE_HPP_*/
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/MeshReaderService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/MeshReaderService.hpp
new file mode 100644
index 0000000..e174563
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/MeshReaderService.hpp
@@ -0,0 +1,130 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_MESHREADERSERVICE_HPP_
+#define _IOVTK_MESHREADERSERVICE_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <io/IReader.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Mesh reader service.
+ * @class   MeshReaderService
+ *
+ * Service reading a VTK mesh using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::MeshReaderService , ::fwData::Mesh )
+ */
+class IOVTK_CLASS_API MeshReaderService : public ::io::IReader
+{
+
+public :
+    ~MeshReaderService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshReaderService)( ::io::IReader) ) ;
+
+    /**
+    * @brief Configure the image path.
+    *
+    * This method is used to find
+    * the file path  using a file selector.
+    */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * The stopping method is empty for this service.
+    */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * The image is read.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+    * @brief Load a VTK mesh.
+    * @param[in] _vtkFile ::boost::filesystem::path.
+    * @param[out] _pMesh ::boost::shared_ptr< ::fwData::Mesh >.
+    * @return bool.
+    *
+    * This method is used to load a mesh using the file path.
+    */
+    void loadMesh( const ::boost::filesystem::path _vtkFile, ::fwData::Mesh::sptr _pMesh );
+
+    /**
+     * @brief Notification method.
+     *
+     * This method is used to notify
+     * the mesh services.
+     */
+    void notificationOfUpdate();
+
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the mesh path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief Mesh path.
+    */
+    ::boost::filesystem::path m_fsMeshPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_MESHREADERSERVICE_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/MeshWriterService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/MeshWriterService.hpp
new file mode 100644
index 0000000..67395c9
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/MeshWriterService.hpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_MESHWRITERSERVICE_HPP_
+#define _IOVTK_MESHWRITERSERVICE_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class Mesh;
+}
+
+namespace fwServices
+{
+    class ObjectMsg;
+}
+
+namespace ioVTK
+{
+
+/**
+ * @brief   VTK mesh writer service.
+ * @class   MeshWriterService
+ *
+ * Service writing a VTK Mesh using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::MeshWriterService , ::fwData::Mesh )
+ */
+class IOVTK_CLASS_API MeshWriterService : public ::io::IWriter
+{
+
+public :
+    ~MeshWriterService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshWriterService)( ::io::IWriter) ) ;
+
+    /**
+    * @brief Configure the mesh path.
+    *
+    * This method is used to find
+    * the file path  using a file selector.
+    */
+    IOVTK_API virtual void configureWithIHM();
+
+    /**
+     * @brief Save a VTK mesh.
+     * @param[in] meshFile \b const ::boost::filesystem::path.
+     * @param[out] mesh ::boost::shared_ptr< ::fwData::Mesh >.
+     *
+     * This method is used to save a mesh using the file path.
+     */
+    IOVTK_API static void saveMesh( const ::boost::filesystem::path& meshFile, const SPTR(::fwData::Mesh)& mesh );
+
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * The stopping method is empty for this service.
+    */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * The mesh is read.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+private :
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the image path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief Mesh path .
+    */
+    ::boost::filesystem::path m_fsMeshPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_MESHWRITERSERVICE_HPP_
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/Namespace.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/Namespace.hpp
new file mode 100644
index 0000000..6ddd637
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/Namespace.hpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IOVTKNAMESPACE_HPP_
+#define IOVTKNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace ioVTK contains reader, writer and helper using the fwVtkIO lib for output and input actions between data and the frameWork.
+ * @namespace   ioVTK
+ *
+ */
+namespace ioVTK
+{
+
+}
+#endif /* IOVTKNAMESPACE_HPP_ */
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/Plugin.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/Plugin.hpp
new file mode 100644
index 0000000..e11d7a7
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/Plugin.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ioVTK_PLUGIN_HPP_
+#define _ioVTK_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioVTK
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    //! @brief Destructor.
+    ~Plugin() throw();
+
+    /**
+    * @brief Start method.
+    *
+    * This method is used by runtime in order to initialize the bundle.
+    *
+    * @exception ::fwRuntime::RuntimeException
+    */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief Stop method.
+    *
+    * This method is used by runtime in order to close the bundle.
+    */
+    void stop() throw();
+
+};
+
+} // namespace ioVTK
+
+#endif //_ioVTK_PLUGIN_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/SImageSeriesWriter.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/SImageSeriesWriter.hpp
new file mode 100644
index 0000000..0376b58
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/SImageSeriesWriter.hpp
@@ -0,0 +1,107 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_SIMAGESERIESWRITER_HPP__
+#define __IOVTK_SIMAGESERIESWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class Image;
+}
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Image series writer service.
+ * @class   SImageSeriesWriter
+ *
+ * Service writing an image series using the fwVtkIO lib.
+ */
+class IOVTK_CLASS_API SImageSeriesWriter : public ::io::IWriter
+{
+
+public :
+    ~SImageSeriesWriter() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (SImageSeriesWriter)( ::io::IWriter) ) ;
+
+    /**
+     * @brief Configure the image path.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Starting method.
+     *
+     * This method is used to initialize the service.
+     */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method.
+     *
+     * This method is used to update the service.
+     * The image is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed) {};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+     * @brief the m_bServiceIsConfigured value is \b true
+     * if the image path is known.
+     */
+    bool m_bServiceIsConfigured;
+
+    /**
+     * @brief Image path.
+     */
+    ::boost::filesystem::path m_fsImgPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //__IOVTK_SIMAGESERIESWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesObjWriter.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesObjWriter.hpp
new file mode 100644
index 0000000..5914d9d
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesObjWriter.hpp
@@ -0,0 +1,112 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_SMODELSERIESOBJWRITER_HPP__
+#define __IOVTK_SMODELSERIESOBJWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class Mesh;
+}
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Model series .obj writer service.
+ * @class   SModelSeriesObjWriter
+ *
+ * Service writing a model series as .obj files using the fwVtkIO lib.
+ */
+class IOVTK_CLASS_API SModelSeriesObjWriter : public ::io::IWriter
+{
+
+public :
+    ~SModelSeriesObjWriter() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (SModelSeriesObjWriter)( ::io::IWriter) ) ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Starting method.
+     *
+     * This method is used to initialize the service.
+     */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method.
+     *
+     * This method is used to update the service.
+     * The mesh is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+     * @brief the m_bServiceIsConfigured value is \b true
+     * if the image path is known.
+     */
+    bool m_bServiceIsConfigured;
+
+    /**
+     * @brief Mesh path.
+     */
+    ::boost::filesystem::path m_fsMeshPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //__IOVTK_SMODELSERIESOBJWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesReader.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesReader.hpp
new file mode 100644
index 0000000..eb6f465
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesReader.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_SMODELSERIESREADER_HPP__
+#define __IOVTK_SMODELSERIESREADER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioVTK/export.hpp"
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Model series reader service.
+ * @class   SModelSeriesReader
+ *
+ * Service reading a model series as .vtk files using the fwVtkIO lib.
+ */
+class IOVTK_CLASS_API SModelSeriesReader : public ::io::IReader
+{
+
+public :
+    ~SModelSeriesReader() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (SModelSeriesReader)( ::io::IReader) ) ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Starting method.
+     *
+     * This method is used to initialize the service.
+     */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method.
+     *
+     * This method is used to update the service.
+     * The mesh is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+private:
+
+    IOVTK_API void loadMesh( const ::boost::filesystem::path file, ::fwData::Mesh::sptr mesh );
+
+};
+
+} // namespace ioVTK
+
+#endif //__IOVTK_SMODELSERIESREADER_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesWriter.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesWriter.hpp
new file mode 100644
index 0000000..2972178
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/SModelSeriesWriter.hpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_SMODELSERIESWRITER_HPP__
+#define __IOVTK_SMODELSERIESWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class Mesh;
+}
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Model series writer service.
+ * @class   SModelSeriesWriter
+ *
+ * Service writing a model series as .vtk files using the fwVtkIO lib.
+ */
+class IOVTK_CLASS_API SModelSeriesWriter : public ::io::IWriter
+{
+
+public :
+    ~SModelSeriesWriter() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (SModelSeriesWriter)( ::io::IWriter) ) ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Starting method.
+     *
+     * This method is used to initialize the service.
+     */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Stopping method.
+     *
+     * The stopping method is empty for this service.
+     */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Updating method.
+     *
+     * This method is used to update the service.
+     * The mesh is read.
+     */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+     * @brief Info method.
+     *
+     * This method is used to give
+     * informations about the service.
+     */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+};
+
+} // namespace ioVTK
+
+#endif //__IOVTK_SMODELSERIESWRITER_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/SSeriesDBReader.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/SSeriesDBReader.hpp
new file mode 100644
index 0000000..716b83a
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/SSeriesDBReader.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_SSERIESDBREADER_HPP_
+#define _IOVTK_SSERIESDBREADER_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <io/IReader.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   SeriesDB reader service.
+ * @class   SSeriesDBReader
+ * @date    2013.
+ *
+ * Service reading a VTK file (mesh or image) using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::SSeriesDBReader , ::fwMedData::SeriesDB )
+ */
+class IOVTK_CLASS_API SSeriesDBReader : public ::io::IReader
+{
+
+public :
+    ~SSeriesDBReader() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesDBReader)( ::io::IReader) ) ;
+
+    /**
+    * @brief Configure the vtk file path.
+    *
+    * This method is used to find
+    * the file path  using a file selector.
+    */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * The stopping method is empty for this service.
+    */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * The image is read.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    IOVTK_API void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+    * @brief Load VTK mesh or image and push it into SeriesDB.
+    * @param[in] vtkFiles vector of boost::filesystem::path.
+    * @param[out] seriesDB ::boost::shared_ptr< ::fwMedData::SeriesDB >.
+    * @return bool.
+    *
+    * This method is used to load a mesh using the file path.
+    */
+    void loadSeriesDB( const ::fwData::location::ILocation::VectPathType& vtkFiles,
+                       ::fwMedData::SeriesDB::sptr seriesDB );
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_SSERIESDBREADER_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshReaderService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshReaderService.hpp
new file mode 100644
index 0000000..1949c54
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshReaderService.hpp
@@ -0,0 +1,131 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_TRIANGULARMESHREADERSERVICE_HPP_
+#define _IOVTK_TRIANGULARMESHREADERSERVICE_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IReader.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class TriangularMesh;
+}
+
+namespace ioVTK
+{
+
+/**
+ * @brief   Mesh reader service.
+ * @class   TriangularMeshReaderService
+ *
+ * Service reading a VTK mesh using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::TriangularMeshReaderService , ::fwData::TriangularMesh )
+ */
+class IOVTK_CLASS_API TriangularMeshReaderService : public ::io::IReader
+{
+
+public :
+    ~TriangularMeshReaderService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (TriangularMeshReaderService)( ::io::IReader) ) ;
+
+    /**
+    * @brief Configure the image path.
+    *
+    * This method is used to find
+    * the file path  using a file selector.
+    */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * The stopping method is empty for this service.
+    */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * The image is read.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+    * @brief Load a VTK mesh.
+    * @param[in] _vtkFile ::boost::filesystem::path.
+    * @param[out] _pTriangularMesh ::boost::shared_ptr< ::fwData::TriangularMesh >.
+    * @return bool.
+    *
+    * This method is used to load a mesh using the file path.
+    */
+    void loadMesh( const ::boost::filesystem::path _vtkFile, ::boost::shared_ptr< ::fwData::TriangularMesh > _pTriangularMesh );
+
+    /**
+     * @brief Notification method.
+     *
+     * This method is used to notify
+     * the mesh services.
+     */
+    void notificationOfUpdate();
+
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the mesh path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief Mesh path.
+    */
+    ::boost::filesystem::path m_fsMeshPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_TRIANGULARMESHREADERSERVICE_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshWriterService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshWriterService.hpp
new file mode 100644
index 0000000..3a95ad8
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/TriangularMeshWriterService.hpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_TRIANGULARMESHWRITERSERVICE_HPP_
+#define _IOVTK_TRIANGULARMESHWRITERSERVICE_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+
+#include "ioVTK/export.hpp"
+
+namespace fwData
+{
+    class TringularMesh;
+}
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   VTK mesh writer service.
+ * @class   TriangularMeshWriterService
+ *
+ * Service writing a VTK Mesh using the fwVtkIO lib.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::TriangularMeshWriterService , ::fwData::TriangularMesh )
+ */
+class IOVTK_CLASS_API TriangularMeshWriterService : public ::io::IWriter
+{
+
+public :
+    ~TriangularMeshWriterService() throw() {}
+
+    fwCoreServiceClassDefinitionsMacro ( (TriangularMeshWriterService)( ::io::IWriter) ) ;
+
+    /**
+    * @brief Configure the mesh path.
+    *
+    * This method is used to find
+    * the file path  using a file selector.
+    */
+    IOVTK_API virtual void configureWithIHM();
+
+
+protected:
+
+    IOVTK_API virtual ::io::IOPathType getIOPathType() const;
+
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    */
+    IOVTK_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * The stopping method is empty for this service.
+    */
+    IOVTK_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * The mesh is read.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void info(std::ostream &_sstream ) ;
+
+
+private :
+
+    /**
+    * @brief Save a VTK image.
+    * @param[in] _vtkFile \b const ::boost::filesystem::path.
+    * @param[out] _pTriangularMesh ::boost::shared_ptr< ::fwData::TriangularMesh >.
+    *
+    * This method is used to save an image using the file path.
+    */
+    void saveMesh( const ::boost::filesystem::path _vtkFile, ::boost::shared_ptr< ::fwData::TriangularMesh > _pTriangularMesh );
+
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the image path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief Mesh path .
+    */
+    ::boost::filesystem::path m_fsMeshPath;
+
+};
+
+} // namespace ioVTK
+
+#endif //_IOVTK_TRIANGULARMESHWRITERSERVICE_HPP_
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/VtkModelReaderService.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/VtkModelReaderService.hpp
new file mode 100644
index 0000000..f5718c3
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/VtkModelReaderService.hpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_VTKMODELREADERSERVICE_HPP_
+#define _IOVTK_VTKMODELREADERSERVICE_HPP_
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <fwData/Color.hpp>
+#include <io/IReader.hpp>
+
+#include "ioVTK/export.hpp"
+
+
+namespace ioVTK
+{
+
+/**
+ * @brief   vtk reader service.
+ * @class   VtkModelReaderService
+ *
+ * Service reading a vtk file using the fwVtkIO lib
+ * (for .vtk at this time).
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::io::IReader , ::ioVTK::VtkModelReaderService , ::fwData::Model )
+ */
+class IOVTK_CLASS_API VtkModelReaderService : public ::io::IReader
+{
+public:
+    ~VtkModelReaderService() throw() {}
+
+
+    fwCoreServiceClassDefinitionsMacro ( (VtkModelReaderService)( ::io::IReader) ) ;
+
+    /**
+     * @brief Configure the mesh path.
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IOVTK_API virtual void configureWithIHM();
+
+    /*!
+    * @brief Get the supported extensions.
+    *
+    * @return std::vector< std::string >.
+    *
+    * Return a std::vector< std::string > that contains the supported extensions.
+    */
+    IOVTK_API virtual std::vector< std::string > getSupportedExtensions();
+
+    /**
+     * @brief   Constructor
+     */
+    IOVTK_API VtkModelReaderService() throw() ;
+
+protected:
+
+    /**
+    * @brief Starting method : default does nothing.
+    *
+    * This method is used to initialize the service.
+    */
+    virtual void starting() throw(::fwTools::Failed){};
+
+    /**
+     * @brief Stopping method : default does nothing.
+     *
+     * The stopping method is empty for this service.
+     */
+    virtual void stopping() throw(::fwTools::Failed){};
+
+    /**
+    * @brief Configuring method.
+    *
+    * XML configuration sample:
+    * @verbatim
+    <service impl="::ioVTK::ImageReaderService" type="::io::IReader">
+        <filename id=".../imageTest.vtk"/>
+    </service>
+    @endverbatim
+    * This method is used to configure the service.
+    */
+    IOVTK_API virtual void configuring( ) throw(::fwTools::Failed);
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief React on modifications : default does nothing.
+     *
+     * @note This method is automatically called by update( msg ) method from base service ( ::fwServices::IService ).
+     *
+     * @param[in] _msg information message for modification
+     */
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /**
+    * @brief Info method.
+    *
+    * This method is used to give
+    * informations about the service.
+    */
+    IOVTK_API virtual void info(std::ostream &_sstream );
+
+
+private:
+
+    /**
+    * @brief Load a VTK mesh.
+    * @param[in] _vtkFile ::boost::filesystem::path.
+    * @param[out] _pTriangularMesh ::boost::shared_ptr< ::fwData::TriangularMesh >.
+    * @return bool.
+    *
+    * This method is used to load a mesh using the file path.
+    */
+    void loadMesh( const ::boost::filesystem::path _vtkFile, ::boost::shared_ptr< ::fwData::TriangularMesh > _pTriangularMesh );
+
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the path image is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    ::fwData::Color::sptr m_color;
+
+    ::boost::filesystem::path m_fsMeshPath;
+};
+
+}
+
+#endif // _IOVTK_VTKMODELREADERSERVICE_HPP_
+
diff --git a/Bundles/LeafIO/ioVTK/include/ioVTK/export.hpp b/Bundles/LeafIO/ioVTK/include/ioVTK/export.hpp
new file mode 100644
index 0000000..ae432a5
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/include/ioVTK/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_CONFIG_HPP_
+#define _IOVTK_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef IOVTK_EXPORTS
+    #define IOVTK_API __declspec(dllexport)
+    #else
+    #define IOVTK_API __declspec(dllimport)
+    #endif
+
+    #define IOVTK_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IOVTK_EXPORTS
+    #define IOVTK_API __attribute__ ((visibility("default")))
+    #define IOVTK_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IOVTK_API __attribute__ ((visibility("hidden")))
+    #define IOVTK_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IOVTK_API
+    #define IOVTK_CLASS_API
+
+#endif
+
+#endif // #ifndef _IOVTK_CONFIG_HPP_
diff --git a/Bundles/LeafIO/ioVTK/rc/plugin.xml b/Bundles/LeafIO/ioVTK/rc/plugin.xml
new file mode 100644
index 0000000..180d23b
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/rc/plugin.xml
@@ -0,0 +1,100 @@
+<plugin id="ioVTK" class="::ioVTK::Plugin" >
+    <library name="ioVTK" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+
+    <requirement id="io" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::MaxMeshReaderService</service>
+        <object>::fwData::Model</object>
+        <desc>3ds Reader (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::ImageWriterService</service>
+        <object>::fwData::Image</object>
+        <desc>VTK Image Writer (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::SImageSeriesWriter</service>
+        <object>::fwMedData::ImageSeries</object>
+        <desc>VTK Image Writer (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::ImageReaderService</service>
+        <object>::fwData::Image</object>
+        <desc>VTK Image Reader (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::TriangularMeshReaderService</service>
+        <object>::fwData::TriangularMesh</object>
+        <desc>VTK triangle mesh Reader (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::TriangularMeshWriterService</service>
+        <object>::fwData::TriangularMesh</object>
+        <desc>VTK triangle mesh Writer (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::MeshReaderService</service>
+        <object>::fwData::Mesh</object>
+        <desc>VTK Mesh Reader (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::MeshWriterService</service>
+        <object>::fwData::Mesh</object>
+        <desc>VTK Mesh Writer (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::SModelSeriesWriter</service>
+        <object>::fwMedData::ModelSeries</object>
+        <desc>VTK files (VTK)</desc>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::SModelSeriesReader</service>
+        <object>::fwMedData::ModelSeries</object>
+        <desc>VTK files (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVTK::SModelSeriesObjWriter</service>
+        <object>::fwMedData::ModelSeries</object>
+        <desc>Wavefront OBJ files (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::VtkModelReaderService</service>
+        <object>::fwData::Model</object>
+        <desc>Model Reader (VTK)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVTK::SSeriesDBReader</service>
+        <object>::fwMedData::SeriesDB</object>
+        <desc>VTK File Reader (VTK)</desc>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/ImageReaderService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/ImageReaderService.cpp
new file mode 100644
index 0000000..ef9a031
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/ImageReaderService.cpp
@@ -0,0 +1,236 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwDataIO/reader/IObjectReader.hpp>
+#include <fwVtkIO/ImageReader.hpp>
+#include <fwVtkIO/MetaImageReader.hpp>
+#include <fwVtkIO/VtiImageReader.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include "ioVTK/ImageReaderService.hpp"
+
+namespace ioVTK
+{
+
+//------------------------------------------------------------------------------
+
+// Register a new reader of ::fwData::Image
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::ImageReaderService , ::fwData::Image );
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType ImageReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a file to load an image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.addFilter("Vti","*.vti");
+    dialogFile.addFilter("MetaImage","*.mhd");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result = ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::starting() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    // This method does nothing
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::stopping() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    // This method does nothing
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::info( std::ostream &_sstream )
+{
+    _sstream << "ImageReaderService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Image::sptr pImage = this->getObject< ::fwData::Image >() ;
+        SLM_ASSERT("pImage not instanced", pImage);
+
+        // Read new image path and update image. If the reading process is a success, we notify all listeners that image has been modified.
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        try
+        {
+            if ( this->loadImage( this->getFile(), pImage ) )
+            {
+                notificationOfDBUpdate();
+            }
+        }
+        catch(::fwTools::Failed& e)
+        {
+            OSLM_TRACE("Error : " << e.what());
+            FW_RAISE_EXCEPTION(e);
+        }
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool ImageReaderService::loadImage( const ::boost::filesystem::path imgFile, ::fwData::Image::sptr _pImg )
+{
+    SLM_TRACE_FUNC();
+    bool ok = true;
+
+    // Use a reader of fwVtkIO library to read an image
+    ::fwDataIO::reader::IObjectReader::sptr myReader;
+    // Create a progress bar and attach it to reader
+    ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Image ");
+    std::string ext = ::boost::filesystem::extension(imgFile);
+    ::boost::algorithm::to_lower(ext);
+
+    if(ext == ".vtk")
+    {
+        ::fwVtkIO::ImageReader::sptr vtkReader = ::fwVtkIO::ImageReader::New();
+        vtkReader->addHandler( progressMeterGUI );
+        // Set the file system path
+        vtkReader->setFile(imgFile);
+        myReader = vtkReader;
+    }
+    else if(ext == ".vti")
+    {
+        ::fwVtkIO::VtiImageReader::sptr vtiReader = ::fwVtkIO::VtiImageReader::New();
+        vtiReader->addHandler( progressMeterGUI );
+        vtiReader->setFile(imgFile);
+        myReader = vtiReader;
+    }
+    else if(ext == ".mhd")
+    {
+        ::fwVtkIO::MetaImageReader::sptr mhdReader = ::fwVtkIO::MetaImageReader::New();
+        mhdReader->addHandler( progressMeterGUI );
+        mhdReader->setFile(imgFile);
+        myReader = mhdReader;
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION(::fwTools::Failed("Only .vtk, .vti and .mhd are supported."));
+    }
+
+    // Set the image (already created, but empty) that will be modified
+    myReader->setObject(_pImg);
+
+    try
+    {
+        // Launch reading process
+        myReader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                        "Warning",
+                        "Warning during loading.",
+                        ::fwGui::dialog::IMessageDialog::WARNING);
+        ok = false;
+    }
+
+    return ok;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    // This method does nothing
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderService::notificationOfDBUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr pImage = this->getObject< ::fwData::Image >();
+    SLM_ASSERT("pImage not instanced", pImage);
+
+    // Creation of an image message to say that image is an new image ( or all fields are modified (old version of msg ) )
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::NEW_IMAGE ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::BUFFER ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::REGION ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::SPACING ) ;
+    msg->addEvent( ::fwComEd::ImageMsg::PIXELTYPE ) ;
+
+    // Notify message to all service listeners
+    ::fwServices::IEditionService::notify(this->getSptr(), pImage, msg);
+}
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/ImageWriterService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/ImageWriterService.cpp
new file mode 100644
index 0000000..8a9ab39
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/ImageWriterService.cpp
@@ -0,0 +1,198 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+
+#include <fwDataIO/reader/IObjectReader.hpp>
+#include <fwVtkIO/ImageWriter.hpp>
+#include <fwVtkIO/MetaImageWriter.hpp>
+#include <fwVtkIO/VtiImageWriter.hpp>
+
+#include "ioVTK/ImageWriterService.hpp"
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::ImageWriterService , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType ImageWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an file to save an image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.addFilter("Vti","*.vti");
+    dialogFile.addFilter("MetaImage","*.mhd");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriterService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriterService::info(std::ostream &_sstream )
+{
+    _sstream << "ImageWriterService::info";
+}
+
+//------------------------------------------------------------------------------
+
+bool ImageWriterService::saveImage( const ::boost::filesystem::path& imgFile, const SPTR(::fwData::Image)& image )
+{
+    SLM_TRACE_FUNC();
+    bool bValue = true;
+
+    ::fwDataIO::writer::IObjectWriter::sptr myWriter;
+    fwGui::dialog::ProgressDialog progressMeterGUI("Saving images... ");
+    std::string ext = ::boost::filesystem::extension(imgFile);
+    ::boost::algorithm::to_lower(ext);
+
+    if(ext == ".vtk")
+    {
+        ::fwVtkIO::ImageWriter::sptr vtkWriter = ::fwVtkIO::ImageWriter::New();
+        vtkWriter->addHandler( progressMeterGUI );
+        // Set the file system path
+        vtkWriter->setFile(imgFile);
+        myWriter = vtkWriter;
+    }
+    else if(ext == ".vti")
+    {
+        ::fwVtkIO::VtiImageWriter::sptr vtiWriter = ::fwVtkIO::VtiImageWriter::New();
+        vtiWriter->addHandler( progressMeterGUI );
+        vtiWriter->setFile(imgFile);
+        myWriter = vtiWriter;
+    }
+    else if(ext == ".mhd")
+    {
+        ::fwVtkIO::MetaImageWriter::sptr mhdWriter = ::fwVtkIO::MetaImageWriter::New();
+        mhdWriter->addHandler( progressMeterGUI );
+        mhdWriter->setFile(imgFile);
+        myWriter = mhdWriter;
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION(::fwTools::Failed("Only .vtk, .vti and .mhd are supported."));
+    }
+
+    myWriter->setObject(image);
+
+    try
+    {
+        // Launch writing process
+        myWriter->write();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during saving : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                        "Warning",
+                        ss.str(),
+                        ::fwGui::dialog::IMessageDialog::WARNING);
+        bValue = false;
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                                "Warning",
+                                "Warning during saving.",
+                                ::fwGui::dialog::IMessageDialog::WARNING);
+        bValue = false;
+    }
+    return bValue;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Image::sptr pImage = this->getObject< ::fwData::Image >() ;
+        SLM_ASSERT("Image not instanced", pImage);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        try
+        {
+            this->saveImage(this->getFile() ,pImage);
+        }
+        catch(::fwTools::Failed& e)
+        {
+            OSLM_TRACE("Error : " << e.what());
+            FW_RAISE_EXCEPTION(e);
+        }
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/MaxMeshReaderService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/MaxMeshReaderService.cpp
new file mode 100644
index 0000000..3139b23
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/MaxMeshReaderService.cpp
@@ -0,0 +1,179 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <vtk3DSImporter.h>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Model.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+
+#include <fwCore/base.hpp>
+
+#include <fwComEd/ModelMsg.hpp>
+
+#include "ioVTK/MaxMeshReaderService.hpp"
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::MaxMeshReaderService , ::fwData::Model );
+
+//------------------------------------------------------------------------------
+
+/* Find the node with the specified name */
+static void *list_find (vtk3DSList **root, const char *name)
+{
+    OSLM_DEBUG("list_find: " << name);
+    vtk3DSList *p;
+    int i = 0;
+    for (p = *root; p != (vtk3DSList *) NULL; p = (vtk3DSList *) p->next) {
+        OSLM_DEBUG("List_find - " << i << " name: " << p->name);
+        ++i;
+        if (strcmp(p->name, name) == 0) {
+            break;
+        }
+    }
+    return (void *) p;
+}
+
+namespace ioVTK
+{
+
+//------------------------------------------------------------------------------
+
+void MaxMeshReaderService::info(std::ostream &_sstream )
+{
+    this->BaseClass::info( _sstream ) ;
+    _sstream << std::endl << " 3ds file reader" ;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< std::string > MaxMeshReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".3ds");
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+void MaxMeshReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an 3ds file");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("3DS","*.3ds");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+
+::io::IOPathType MaxMeshReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void MaxMeshReaderService::updating() throw(::fwTools::Failed)
+{
+    if( this->hasLocationDefined() )
+    {
+        /// Retrieve object
+        ::fwData::Model::sptr model = this->getObject< ::fwData::Model >( );
+        SLM_ASSERT("model not instanced", model);
+        ::fwData::Model::sptr backupModel = ::fwData::Model::New();
+        backupModel->shallowCopy(model);
+        model->getRefMap().clear();
+
+        vtk3DSImporter *importer1 = vtk3DSImporter::New();
+        importer1->SetFileName(this->getFile().string().c_str());
+        importer1->ComputeNormalsOn();
+        importer1->Read();
+
+        vtk3DSMesh * MeshList = importer1->MeshList;
+        vtk3DSMesh *mesh3ds;
+        // walk the list of meshes, creating actors
+        for (mesh3ds = MeshList; mesh3ds != (vtk3DSMesh *) NULL; mesh3ds = (vtk3DSMesh *) mesh3ds->next)
+        {
+            OSLM_DEBUG("read : " << mesh3ds->name);
+            ::fwData::TriangularMesh::sptr mesh = ::fwData::TriangularMesh::New();
+            vtk3DSFace *face;
+            face = mesh3ds->face;
+            OSLM_DEBUG("mesh->faces : " << mesh3ds->faces);
+            for (int i = 0; i < mesh3ds->faces; i++, face++)
+            {
+                std::vector< int > cell(3) ;
+                cell[0] = face->a;
+                cell[1] = face->b;
+                cell[2] = face->c;
+                mesh->cells().push_back( cell ) ;
+            }
+
+            OSLM_DEBUG("mesh->vertices : " << mesh3ds->vertices);
+            for (int i = 0; i < mesh3ds->vertices; i++)
+            {
+                float *p = mesh3ds->vertex[i];
+                std::vector< float > point(3) ;
+                point[0] = p[0];
+                point[1] = p[1];
+                point[2] = p[2];
+                mesh->points().push_back( point) ;
+            }
+            vtk3DSMatProp *vtkMmat;
+            vtkMmat = (vtk3DSMatProp *)list_find((vtk3DSList **)&importer1->MatPropList, mesh3ds->mtl[0]->name);
+            ::fwData::Color::ColorArray  m_vRGBA;
+            m_vRGBA[0] = vtkMmat->ambient.red;
+            m_vRGBA[1] = vtkMmat->ambient.green;
+            m_vRGBA[2] = vtkMmat->ambient.blue;
+            m_vRGBA[3] = 1.0;
+            ::fwData::Material::sptr dataMat = ::fwData::Material::New();
+            dataMat->ambient()->setCRefRGBA(m_vRGBA);
+            model->getRefMap().insert (
+                    std::pair< ::fwData::TriangularMesh::sptr , ::fwData::Material::sptr >(mesh, dataMat));
+
+        }
+        /// Notify reading
+        ::fwComEd::ModelMsg::sptr msg = ::fwComEd::ModelMsg::New();;
+        msg->addEvent( ::fwComEd::ModelMsg::NEW_MODEL, backupModel ) ;
+        ::fwServices::IEditionService::notify(this->getSptr(), model, msg);
+        importer1->Delete();
+    }
+}
+
+}
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/MeshReaderService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/MeshReaderService.cpp
new file mode 100644
index 0000000..c7126ea
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/MeshReaderService.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/mt/ObjectWriteLock.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwVtkIO/MeshReader.hpp>
+
+#include "ioVTK/MeshReaderService.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::MeshReaderService , ::fwData::Mesh ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType MeshReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a vtk file to load Mesh");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::info(std::ostream &_sstream )
+{
+    _sstream << "MeshReaderService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::loadMesh( const ::boost::filesystem::path vtkFile, ::fwData::Mesh::sptr _pMesh )
+{
+    SLM_TRACE_FUNC();
+    ::fwVtkIO::MeshReader::sptr myReader = ::fwVtkIO::MeshReader::New();
+
+    myReader->setObject(_pMesh);
+    myReader->setFile(vtkFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Mesh");
+        myReader->addHandler( progressMeterGUI );
+        ::fwData::mt::ObjectWriteLock lock(_pMesh);
+        myReader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        std::stringstream ss;
+        ss << "Warning during loading. ";
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during loading.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Mesh::sptr pMesh = this->getObject< ::fwData::Mesh >() ;
+        SLM_ASSERT("pMesh not instanced", pMesh);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        this->loadMesh(this->getFile(), pMesh);
+        this->notificationOfUpdate();
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReaderService::notificationOfUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Mesh::sptr pMesh = this->getObject< ::fwData::Mesh >();
+    SLM_ASSERT("pMesh not instanced", pMesh);
+
+    ::fwComEd::MeshMsg::sptr msg = ::fwComEd::MeshMsg::New();;
+    msg->addEvent( ::fwComEd::MeshMsg::NEW_MESH ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), pMesh, msg);
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/MeshWriterService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/MeshWriterService.cpp
new file mode 100644
index 0000000..ea5d018
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/MeshWriterService.cpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwVtkIO/MeshWriter.hpp>
+
+#include "ioVTK/MeshWriterService.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::MeshWriterService , ::fwData::Mesh ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType MeshWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a vtk file to save Mesh");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::info(std::ostream &_sstream )
+{
+    _sstream << "MeshWriterService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::saveMesh(const ::boost::filesystem::path& meshFile, const SPTR( ::fwData::Mesh)& mesh)
+{
+    SLM_TRACE_FUNC();
+    ::fwVtkIO::MeshWriter::sptr writer = ::fwVtkIO::MeshWriter::New();
+
+    writer->setObject(mesh);
+    writer->setFile(meshFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving mesh...");
+        writer->addHandler( progressMeterGUI );
+        writer->write();
+
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during saving : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during saving",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if(  this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::Mesh::sptr pMesh = this->getObject< ::fwData::Mesh >() ;
+        SLM_ASSERT("pMesh not instanced", pMesh);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        this->saveMesh(this->getFile(),pMesh);
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/Plugin.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/Plugin.cpp
new file mode 100644
index 0000000..563317f
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "ioVTK/Plugin.hpp"
+
+namespace ioVTK
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::ioVTK::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace ioVTK
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/SImageSeriesWriter.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/SImageSeriesWriter.cpp
new file mode 100644
index 0000000..e8e1163
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/SImageSeriesWriter.cpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+
+#include <fwDataIO/reader/IObjectReader.hpp>
+#include <fwVtkIO/ImageWriter.hpp>
+#include <fwVtkIO/MetaImageWriter.hpp>
+#include <fwVtkIO/VtiImageWriter.hpp>
+
+#include "ioVTK/ImageWriterService.hpp"
+#include "ioVTK/SImageSeriesWriter.hpp"
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::SImageSeriesWriter , ::fwMedData::ImageSeries ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SImageSeriesWriter::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an file to save an image");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.addFilter("Vti","*.vti");
+    dialogFile.addFilter("MetaImage","*.mhd");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::info(std::ostream &_sstream )
+{
+    _sstream << "SImageSeriesWriter::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ImageSeries::sptr imageSeries = this->getObject< ::fwMedData::ImageSeries >() ;
+        SLM_ASSERT("ImageSeries is not instanced", imageSeries);
+        SLM_ASSERT("Image from ImageSeries is not instanced", imageSeries->getImage());
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        try
+        {
+            ImageWriterService::saveImage(this->getFile(), imageSeries->getImage());
+        }
+        catch(::fwTools::Failed& e)
+        {
+            OSLM_TRACE("Error : " << e.what());
+            FW_RAISE_EXCEPTION(e);
+        }
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesObjWriter.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesObjWriter.cpp
new file mode 100644
index 0000000..6429dbe
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesObjWriter.cpp
@@ -0,0 +1,176 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ILocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwVtkIO/ModelSeriesObjWriter.hpp>
+
+#include <fwVtkIO/ModelSeriesObjWriter.hpp>
+
+#include "ioVTK/MeshWriterService.hpp"
+#include "ioVTK/SModelSeriesObjWriter.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::SModelSeriesObjWriter , ::fwMedData::ModelSeries ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SModelSeriesObjWriter::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesObjWriter::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialog;
+    dialog.setTitle("Choose a directory to save meshes");
+    dialog.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialog.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+    dialog.setType(::fwGui::dialog::ILocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr result;
+
+    while (result = ::fwData::location::Folder::dynamicCast( dialog.show() ))
+    {
+        if( ::boost::filesystem::is_empty(result->getFolder()) )
+        {
+            break;
+        }
+        // message box
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Overwrite confirmation");
+        messageBox.setMessage("The selected directory is not empty. Write anyway ?");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::QUESTION);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::YES);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::CANCEL);
+        if( messageBox.show() == ::fwGui::dialog::IMessageDialog::YES)
+        {
+            break;
+        }
+    }
+
+    if (result)
+    {
+        _sDefaultPath = result->getFolder().parent_path();
+        dialog.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFolder(result->getFolder());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesObjWriter::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesObjWriter::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesObjWriter::info(std::ostream &_sstream )
+{
+    _sstream << "SModelSeriesObjWriter::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesObjWriter::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if(  this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >() ;
+        SLM_ASSERT("ModelSeries is not instanced", modelSeries);
+
+        ::fwVtkIO::ModelSeriesObjWriter::sptr writer = ::fwVtkIO::ModelSeriesObjWriter::New();
+        writer->setObject(modelSeries);
+        writer->setFolder(this->getFolder());
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        try
+        {
+            ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving reconstructions...");
+            writer->addHandler( progressMeterGUI );
+            writer->write();
+
+        }
+        catch (const std::exception & e)
+        {
+            std::stringstream ss;
+            ss << "Warning during saving : " << e.what();
+
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Warning");
+            messageBox.setMessage( ss.str() );
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+        catch( ... )
+        {
+            std::stringstream ss;
+            ss << "Warning during saving.";
+
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Warning");
+            messageBox.setMessage( ss.str() );
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
+
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesReader.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesReader.cpp
new file mode 100644
index 0000000..80316ec
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesReader.cpp
@@ -0,0 +1,176 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/mt/ObjectWriteLock.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+#include <fwData/location/ILocation.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwComEd/ModelSeriesMsg.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ILocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/ProgressDialog.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwVtkIO/MeshReader.hpp>
+
+#include "ioVTK/MeshWriterService.hpp"
+#include "ioVTK/SModelSeriesReader.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::SModelSeriesReader , ::fwMedData::ModelSeries ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SModelSeriesReader::getIOPathType() const
+{
+    return ::io::FILES;
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setType(::fwGui::dialog::ILocationDialog::MULTI_FILES);
+    dialogFile.setTitle("Choose vtk files to load Series");
+    dialogFile.addFilter("Vtk files","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::MultiFiles::sptr  result;
+    result = ::fwData::location::MultiFiles::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        const ::fwData::location::ILocation::VectPathType paths = result->getPaths();
+        if(!paths.empty())
+        {
+            _sDefaultPath = paths[0].parent_path();
+            dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        }
+        this->setFiles(paths);
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::info(std::ostream &_sstream )
+{
+    _sstream << "SModelSeriesReader::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::updating() throw(::fwTools::Failed)
+{
+    if(  this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >() ;
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        ::fwMedData::ModelSeries::ReconstructionVectorType recDB = modelSeries->getReconstructionDB();
+        BOOST_FOREACH(const ::fwData::location::ILocation::PathType& file, this->getFiles())
+        {
+            ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+            this->loadMesh(file, mesh);
+
+            ::fwData::Reconstruction::sptr rec = ::fwData::Reconstruction::New();
+            rec->setMesh(mesh);
+            rec->setIsVisible(true);
+            rec->setOrganName(file.stem().string());
+            recDB.push_back(rec);
+        }
+        cursor.setDefaultCursor();
+        modelSeries->setReconstructionDB(recDB);
+
+        ::fwComEd::ModelSeriesMsg::sptr msg = ::fwComEd::ModelSeriesMsg::New();
+        msg->addEvent( ::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION ) ;
+        ::fwServices::IEditionService::notify(this->getSptr(), modelSeries, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesReader::loadMesh( const ::boost::filesystem::path file, ::fwData::Mesh::sptr mesh )
+{
+    ::fwVtkIO::MeshReader::sptr reader = ::fwVtkIO::MeshReader::New();
+
+    reader->setObject(mesh);
+    reader->setFile(file);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Mesh");
+        reader->addHandler( progressMeterGUI );
+        ::fwData::mt::ObjectWriteLock lock(mesh);
+        reader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream stream;
+        stream << "Warning during loading : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                stream.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during loading.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
+
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesWriter.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesWriter.cpp
new file mode 100644
index 0000000..66bf3c5
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/SModelSeriesWriter.cpp
@@ -0,0 +1,148 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/ILocationDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwVtkIO/MeshWriter.hpp>
+
+#include "ioVTK/MeshWriterService.hpp"
+#include "ioVTK/SModelSeriesWriter.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::SModelSeriesWriter , ::fwMedData::ModelSeries ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SModelSeriesWriter::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesWriter::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialog;
+    dialog.setTitle("Choose a directory to save meshes");
+    dialog.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialog.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+    dialog.setType(::fwGui::dialog::ILocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr result;
+
+    while (result = ::fwData::location::Folder::dynamicCast( dialog.show() ))
+    {
+        if( ::boost::filesystem::is_empty(result->getFolder()) )
+        {
+            break;
+        }
+        // message box
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Overwrite confirmation");
+        messageBox.setMessage("The selected directory is not empty. Write anyway ?");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::QUESTION);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::YES);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::CANCEL);
+        if( messageBox.show() == ::fwGui::dialog::IMessageDialog::YES)
+        {
+            break;
+        }
+    }
+
+    if (result)
+    {
+        _sDefaultPath = result->getFolder().parent_path();
+        dialog.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFolder(result->getFolder());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesWriter::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesWriter::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesWriter::info(std::ostream &_sstream )
+{
+    _sstream << "SModelSeriesWriter::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesWriter::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if(  this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >() ;
+        SLM_ASSERT("ModelSeries is not instanced", modelSeries);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        const ::fwMedData::ModelSeries::ReconstructionVectorType& recs = modelSeries->getReconstructionDB();
+        BOOST_FOREACH(const SPTR(::fwData::Reconstruction)& rec, recs)
+        {
+            SLM_ASSERT("Reconstruction from model series is not instanced", rec);
+            ::fwData::Mesh::sptr mesh = rec->getMesh();
+            SLM_ASSERT("Mesh from reconstruction is not instanced", mesh);
+            MeshWriterService::saveMesh(
+                    this->getFolder() / (rec->getOrganName() + "_" + ::fwTools::UUID::get(mesh) + ".vtk"),
+                    mesh);
+        }
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
+
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/SSeriesDBReader.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/SSeriesDBReader.cpp
new file mode 100644
index 0000000..a7f94f4
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/SSeriesDBReader.cpp
@@ -0,0 +1,167 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/mt/ObjectWriteLock.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwVtkIO/SeriesDBReader.hpp>
+
+#include "ioVTK/SSeriesDBReader.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::SSeriesDBReader , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+::io::IOPathType SSeriesDBReader::getIOPathType() const
+{
+    return ::io::FILES;
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setType(::fwGui::dialog::ILocationDialog::MULTI_FILES);
+    dialogFile.setTitle("Choose vtk files to load Series");
+    dialogFile.addFilter("Vtk","*.vtk *.vti *.mhd");
+    dialogFile.addFilter("Vtk files","*.vtk");
+    dialogFile.addFilter("Vti files","*.vti");
+    dialogFile.addFilter("MetaImage files","*.mhd");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::MultiFiles::sptr  result;
+    result = ::fwData::location::MultiFiles::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        const ::fwData::location::ILocation::VectPathType paths = result->getPaths();
+        if(!paths.empty())
+        {
+            _sDefaultPath = paths[0].parent_path();
+            dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        }
+        this->setFiles(paths);
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::info(std::ostream &_sstream )
+{
+    _sstream << "SSeriesDBReader::info";
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::loadSeriesDB( const ::fwData::location::ILocation::VectPathType& vtkFiles,
+                                    ::fwMedData::SeriesDB::sptr seriesDB )
+{
+    ::fwVtkIO::SeriesDBReader::sptr reader = ::fwVtkIO::SeriesDBReader::New();
+    reader->setObject(seriesDB);
+    reader->setFiles(vtkFiles);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading SeriesDB");
+        reader->addHandler( progressMeterGUI );
+        reader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        std::stringstream ss;
+        ss << "Warning during loading. ";
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during loading.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::updating() throw(::fwTools::Failed)
+{
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >() ;
+        SLM_ASSERT("SeriesDB not instanced", seriesDB);
+
+        ::fwMedData::SeriesDB::sptr localSeriesDB = ::fwMedData::SeriesDB::New();
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        this->loadSeriesDB(this->getFiles(), localSeriesDB);
+
+        ::fwComEd::helper::SeriesDB sDBhelper(seriesDB);
+
+        ::fwData::mt::ObjectWriteLock lock(seriesDB);
+        sDBhelper.merge(localSeriesDB);
+        sDBhelper.notify(this->getSptr());
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshReaderService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshReaderService.cpp
new file mode 100644
index 0000000..bf9fa85
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshReaderService.cpp
@@ -0,0 +1,175 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/TriangularMeshMsg.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwVtkIO/TriangularMeshReader.hpp>
+
+#include "ioVTK/TriangularMeshReaderService.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::TriangularMeshReaderService , ::fwData::TriangularMesh ) ;
+
+//------------------------------------------------------------------------------
+
+
+::io::IOPathType TriangularMeshReaderService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a vtk file to load triangle mesh");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::info(std::ostream &_sstream )
+{
+    _sstream << "TriangularMeshReaderService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::loadMesh( const ::boost::filesystem::path vtkFile, ::fwData::TriangularMesh::sptr _pTriangularMesh )
+{
+    SLM_TRACE_FUNC();
+    ::fwVtkIO::TriangularMeshReader::sptr myReader = ::fwVtkIO::TriangularMeshReader::New();
+
+    myReader->setObject(_pTriangularMesh);
+    myReader->setFile(vtkFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Mesh");
+        myReader->addHandler( progressMeterGUI );
+        myReader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        std::stringstream ss;
+        ss << "Warning during loading. ";
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during loading.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::TriangularMesh::sptr pTriangularMesh = this->getObject< ::fwData::TriangularMesh >() ;
+        SLM_ASSERT("pTriangularMesh not instanced", pTriangularMesh);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        loadMesh( this->getFile(), pTriangularMesh);
+        notificationOfUpdate();
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReaderService::notificationOfUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwData::TriangularMesh::sptr pTriangularMesh = this->getObject< ::fwData::TriangularMesh >();
+    SLM_ASSERT("pTriangularMesh not instanced", pTriangularMesh);
+
+    ::fwComEd::TriangularMeshMsg::sptr msg = ::fwComEd::TriangularMeshMsg::New();;
+    msg->addEvent( ::fwComEd::TriangularMeshMsg::NEW_MESH ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), pTriangularMesh, msg);
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshWriterService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshWriterService.cpp
new file mode 100644
index 0000000..1b9608d
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/TriangularMeshWriterService.cpp
@@ -0,0 +1,151 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwVtkIO/TriangularMeshWriter.hpp>
+
+#include "ioVTK/TriangularMeshWriterService.hpp"
+
+
+namespace ioVTK
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVTK::TriangularMeshWriterService , ::fwData::TriangularMesh ) ;
+
+//------------------------------------------------------------------------------
+
+
+::io::IOPathType TriangularMeshWriterService::getIOPathType() const
+{
+    return ::io::FILE;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath("");
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a vtk file to save triangle mesh");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        this->setFile(result->getPath());
+    }
+    else
+    {
+        this->clearLocations();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::info(std::ostream &_sstream )
+{
+    _sstream << "TriangularMeshWriterService::info";
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::saveMesh( const ::boost::filesystem::path vtkFile, ::fwData::TriangularMesh::sptr _pMesh )
+{
+    SLM_TRACE_FUNC();
+    ::fwVtkIO::TriangularMeshWriter::sptr myWriter = ::fwVtkIO::TriangularMeshWriter::New();
+
+    myWriter->setObject(_pMesh);
+    myWriter->setFile(vtkFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving Mesh");
+        myWriter->addHandler( progressMeterGUI );
+        myWriter->write();
+
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during saving : " << e.what();
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                ss.str(),
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning",
+                "Warning during saving",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriterService::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwData::TriangularMesh::sptr pTriangularMesh = this->getObject< ::fwData::TriangularMesh >() ;
+        SLM_ASSERT("pTriangularMesh not instanced", pTriangularMesh);
+
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+
+        saveMesh( this->getFile(), pTriangularMesh);
+
+        cursor.setDefaultCursor();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtk
diff --git a/Bundles/LeafIO/ioVTK/src/ioVTK/VtkModelReaderService.cpp b/Bundles/LeafIO/ioVTK/src/ioVTK/VtkModelReaderService.cpp
new file mode 100644
index 0000000..631e39d
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/src/ioVTK/VtkModelReaderService.cpp
@@ -0,0 +1,188 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Model.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwComEd/ModelMsg.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwVtkIO/TriangularMeshReader.hpp>
+
+#include "ioVTK/VtkModelReaderService.hpp"
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVTK::VtkModelReaderService , ::fwData::Model );
+
+//------------------------------------------------------------------------------
+
+namespace ioVTK
+{
+
+VtkModelReaderService::VtkModelReaderService() throw():
+    m_bServiceIsConfigured(false)
+{
+    SLM_TRACE_FUNC();
+    m_color = ::fwData::Color::New();
+    m_color->setRGBA( 0.5, 0.5, 0.5, 1.0 );
+}
+
+//------------------------------------------------------------------------------
+
+void VtkModelReaderService::info(std::ostream &_sstream )
+{
+    this->BaseClass::info( _sstream ) ;
+    _sstream << std::endl << " vtk file reader" ;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< std::string > VtkModelReaderService::getSupportedExtensions()
+{
+    std::vector< std::string > extensions ;
+    extensions.push_back(".vtk");
+    return extensions ;
+}
+
+
+//------------------------------------------------------------------------------
+
+void VtkModelReaderService::configureWithIHM()
+{
+    SLM_TRACE_FUNC();
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose an vtk file to load a model");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Vtk","*.vtk");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getPath().parent_path();
+        m_fsMeshPath = result->getPath();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+        m_bServiceIsConfigured = true;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void VtkModelReaderService::configuring( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if( m_configuration->findConfigurationElement("filename") )
+    {
+        std::string filename = m_configuration->findConfigurationElement("filename")->getExistingAttributeValue("id") ;
+        OSLM_ASSERT( "vtk file doesn't exist: " << filename, ::boost::filesystem::exists(filename) );
+        m_fsMeshPath = ::boost::filesystem::path( filename ) ;
+        m_bServiceIsConfigured = ::boost::filesystem::exists(filename);
+    }
+    if( m_configuration->findConfigurationElement("color") )
+    {
+        ::std::string hexColor = m_configuration->findConfigurationElement("color")->getExistingAttributeValue("id") ;
+        m_color->setRGBA( hexColor );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void VtkModelReaderService::updating() throw(::fwTools::Failed)
+{
+    if( ! m_bServiceIsConfigured )
+    {
+        configureWithIHM();
+    }
+
+    ::fwData::Model::sptr model = this->getObject< ::fwData::Model >( );
+    SLM_ASSERT("model not instanced", model);
+
+    ::fwData::Model::sptr backupModel = ::fwData::Model::New();
+    backupModel->shallowCopy(model);
+
+    model->getRefMap().clear();
+
+    /// Create a empty triangularMesh
+    ::fwData::TriangularMesh::sptr mesh = ::fwData::TriangularMesh::New();
+    this->loadMesh( m_fsMeshPath, mesh );
+
+    ::fwData::Material::sptr dataMat = ::fwData::Material::New();
+    dataMat->ambient()->setCRefRGBA(m_color->getCRefRGBA());
+    model->getRefMap()[ mesh ] = dataMat ;
+
+    ::fwComEd::ModelMsg::sptr msg = ::fwComEd::ModelMsg::New();;
+    msg->addEvent( ::fwComEd::ModelMsg::NEW_MODEL, backupModel ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), model, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void VtkModelReaderService::loadMesh( const ::boost::filesystem::path vtkFile, ::fwData::TriangularMesh::sptr _pTriangularMesh )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwVtkIO::TriangularMeshReader::sptr myReader = ::fwVtkIO::TriangularMeshReader::New();
+    myReader->setObject(_pTriangularMesh);
+    myReader->setFile(vtkFile);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Mesh");
+        myReader->addHandler( progressMeterGUI );
+        myReader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage( ss.str() );
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+    }
+    catch( ... )
+    {
+        std::stringstream ss;
+        ss << "Warning during loading.";
+
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage( ss.str() );
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+}
+
diff --git a/Bundles/LeafIO/ioVTK/test/CMakeLists.txt b/Bundles/LeafIO/ioVTK/test/CMakeLists.txt
new file mode 100644
index 0000000..c7bb8af
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/Bundles/LeafIO/ioVTK/test/Properties.cmake b/Bundles/LeafIO/ioVTK/test/Properties.cmake
new file mode 100644
index 0000000..3ade144
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME ioVTKTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataTools fwMedData fwDataCamp fwVtkIO )
+set( REQUIREMENTS ioVTK )
+
+set(CPPUNITTEST_OPTIONS BUNDLE ioVTK WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafIO/ioVTK/test/cppunit.options b/Bundles/LeafIO/ioVTK/test/cppunit.options
new file mode 100644
index 0000000..895767b
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/cppunit.options
@@ -0,0 +1,22 @@
+CLASSTEST=[
+          'ImageReaderWriterTest',
+          'SeriesDBReaderTest',
+          'ModelSeriesWriterTest',
+          ]
+USE = []
+LIB = [
+      'fwVtkIO_0-1',
+      'fwTest_0-1',
+      'fwData_0-1',
+      'fwDataCamp_0-1',
+      'fwMedData_0-1',
+      'fwTools_0-1',
+      'fwDataTools_0-1',
+      'fwDataCamp_0-1',
+      ]
+
+REQUIREMENTS = ['dataReg_0-1', 'servicesReg_0-1', 'io_0-1', 'ioVTK_0-1']
+
+CONSOLE = 'yes'
+
+LOGLEVEL='trace'
diff --git a/Bundles/LeafIO/ioVTK/test/tu/include/ImageReaderWriterTest.hpp b/Bundles/LeafIO/ioVTK/test/tu/include/ImageReaderWriterTest.hpp
new file mode 100644
index 0000000..3e23693
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/include/ImageReaderWriterTest.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_TEST_TU_IMAGEREADERWRITERTEST_HPP__
+#define __IOVTK_TEST_TU_IMAGEREADERWRITERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+    class Image;
+}
+
+namespace ioVTK
+{
+namespace ut
+{
+
+/**
+ * @brief Test the reader and the writer of Image using VTK.
+ */
+class ImageReaderWriterTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageReaderWriterTest );
+    CPPUNIT_TEST( testVtkImageReader );
+    CPPUNIT_TEST( testVtiImageReader );
+    CPPUNIT_TEST( testMhdImageReader );
+    CPPUNIT_TEST( testImageReaderExtension);
+    CPPUNIT_TEST( testVtkImageWriter );
+    CPPUNIT_TEST( testVtkImageSeriesWriter );
+    CPPUNIT_TEST( testVtiImageWriter );
+    CPPUNIT_TEST( testMhdImageWriter );
+    CPPUNIT_TEST( testImageWriterExtension );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testVtkImageReader();
+    void testVtiImageReader();
+    void testMhdImageReader();
+    void testImageReaderExtension();
+    void testVtkImageWriter();
+    void testVtkImageSeriesWriter();
+    void testVtiImageWriter();
+    void testMhdImageWriter();
+    void testImageWriterExtension();
+
+
+private :
+    void runImageSrv(
+            const std::string &srvtype,
+            const std::string &srv,
+            const SPTR(::fwRuntime::EConfigurationElement)& cfg,
+            const SPTR(::fwData::Object)& image);
+
+
+};
+
+} //namespace ut
+} //namespace ioVTK
+
+#endif //__IOVTK_TEST_TU_IMAGEREADERWRITERTEST_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/test/tu/include/ModelSeriesWriterTest.hpp b/Bundles/LeafIO/ioVTK/test/tu/include/ModelSeriesWriterTest.hpp
new file mode 100644
index 0000000..45366c1
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/include/ModelSeriesWriterTest.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTK_TEST_TU_MODELSERIESWRITERTEST_HPP__
+#define __IOVTK_TEST_TU_MODELSERIESWRITERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ioVTK
+{
+namespace ut
+{
+
+/**
+ * @brief Test the reader and the writer of Mesh/Image using VTK.
+ */
+class ModelSeriesWriterTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ModelSeriesWriterTest );
+    CPPUNIT_TEST( testWriteMeshes );
+    CPPUNIT_TEST( testWriteReconstructions );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testWriteMeshes();
+    void testWriteReconstructions();
+};
+
+} //namespace ut
+} //namespace ioVTK
+
+#endif //__IOVTK_TEST_TU_MODELSERIESWRITERTEST_HPP__
+
diff --git a/Bundles/LeafIO/ioVTK/test/tu/include/SeriesDBReaderTest.hpp b/Bundles/LeafIO/ioVTK/test/tu/include/SeriesDBReaderTest.hpp
new file mode 100644
index 0000000..29048e2
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/include/SeriesDBReaderTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IOVTK_TEST_TU_SERIESDBREADERTEST_HPP_
+#define _IOVTK_TEST_TU_SERIESDBREADERTEST_HPP_
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ioVTK
+{
+namespace ut
+{
+
+/**
+ * @brief Test the reader and the writer of Mesh/Image using VTK.
+ */
+class SeriesDBReaderTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBReaderTest );
+    CPPUNIT_TEST( testSeriesDBReader );
+    CPPUNIT_TEST( testMergeSeriesDBReader );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testSeriesDBReader();
+    void testMergeSeriesDBReader();
+};
+
+} //namespace ut
+} //namespace ioVTK
+
+#endif //_IOVTK_TEST_TU_SERIESDBREADERTEST_HPP_
diff --git a/Bundles/LeafIO/ioVTK/test/tu/rc/profile.xml b/Bundles/LeafIO/ioVTK/test/tu/rc/profile.xml
new file mode 100644
index 0000000..71e8ce2
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/rc/profile.xml
@@ -0,0 +1,11 @@
+<profile name="ImageReaderWriterTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+
+    <start id="ioVTK" />
+
+</profile>
diff --git a/Bundles/LeafIO/ioVTK/test/tu/src/ImageReaderWriterTest.cpp b/Bundles/LeafIO/ioVTK/test/tu/src/ImageReaderWriterTest.cpp
new file mode 100644
index 0000000..8184977
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/src/ImageReaderWriterTest.cpp
@@ -0,0 +1,564 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+
+#include <boost/filesystem.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwTools/System.hpp>
+#include <fwTools/Type.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataTools/Image.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwTest/Data.hpp>
+
+#include "ImageReaderWriterTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioVTK::ut::ImageReaderWriterTest );
+
+static const double epsilon = 0.00001;
+
+namespace ioVTK
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+::fwRuntime::EConfigurationElement::sptr getIOConfiguration(const ::boost::filesystem::path &file)
+{
+    ::fwRuntime::EConfigurationElement::sptr readerSrvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr readerCfg = ::fwRuntime::EConfigurationElement::New("file");
+    readerCfg->setValue(file.string());
+    readerSrvCfg->addConfigurationElement(readerCfg);
+
+    return readerSrvCfg;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testVtkImageReader()
+{
+
+    const ::boost::filesystem::path file = ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk";
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+
+    // Data expected
+    const size_t dim = 3;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 1.732;
+    spacingExpected[1] = 1.732;
+    spacingExpected[2] = 3.2;
+
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = 34.64;
+    originExpected[1] = 86.6;
+    originExpected[2] = 56;
+
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 230;
+    sizeExpected[1] = 170;
+    sizeExpected[2] = 58;
+
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), image);
+
+    // Data read.
+    ::fwData::Image::SpacingType spacingRead = image->getSpacing();
+    ::fwData::Image::SpacingType originRead = image->getOrigin();
+    ::fwData::Image::SizeType sizeRead = image->getSize();
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testVtiImageReader()
+{
+    const ::boost::filesystem::path file = ::fwTest::Data::dir() /"fw4spl/image/vti/BostonTeapot.vti";
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), image);
+
+    // Data expected
+    const size_t dim = 3;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 1.0;
+    spacingExpected[1] = 1.0;
+    spacingExpected[2] = 1.0;
+
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = 1.1;
+    originExpected[1] = 2.2;
+    originExpected[2] = 3.3;
+
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 256;
+    sizeExpected[1] = 256;
+    sizeExpected[2] = 178;
+
+    ::fwTools::Type expectedType("int8"); // MHD File image type : MET_CHAR
+
+    // Data read.
+    ::fwData::Image::SpacingType spacingRead = image->getSpacing();
+    ::fwData::Image::SpacingType originRead = image->getOrigin();
+    ::fwData::Image::SizeType sizeRead = image->getSize();
+
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+    CPPUNIT_ASSERT_EQUAL( expectedType, image->getType());
+}
+
+//------------------------------------------------------------------------------
+void ImageReaderWriterTest::testMhdImageReader()
+{
+
+    const ::boost::filesystem::path file = ::fwTest::Data::dir() / "fw4spl/image/mhd/BostonTeapot.mhd";
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), image);
+
+    // Data expected
+    const size_t dim = 3;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 1.0;
+    spacingExpected[1] = 1.0;
+    spacingExpected[2] = 1.0;
+
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = 1.1;
+    originExpected[1] = 2.2;
+    originExpected[2] = 3.3;
+
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 256;
+    sizeExpected[1] = 256;
+    sizeExpected[2] = 178;
+
+    ::fwTools::Type expectedType("int8"); // MHD File image type : MET_CHAR
+
+    // Data read.
+    ::fwData::Image::SpacingType spacingRead = image->getSpacing();
+    ::fwData::Image::SpacingType originRead = image->getOrigin();
+    ::fwData::Image::SizeType sizeRead = image->getSize();
+
+
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+    CPPUNIT_ASSERT_EQUAL( expectedType, image->getType());
+
+}
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testImageReaderExtension()
+{
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder() / "img.xxx";
+
+    std::ofstream ofile;
+    ofile.open(file.string().c_str());
+    ofile.close();
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+
+    {
+        const std::string srvtype("::io::IReader");
+        const std::string srvname("::ioVTK::ImageReaderService");
+
+
+        ::fwServices::IService::sptr srv;
+        srv = ::fwServices::registry::ServiceFactory::getDefault()->create( srvtype, srvname );
+
+        CPPUNIT_ASSERT_MESSAGE(std::string("Failed to create service ") + srvname, srv);
+
+        ::fwServices::OSR::registerService( image , srv );
+
+        CPPUNIT_ASSERT_NO_THROW( srv->setConfiguration(getIOConfiguration(file)) );
+        CPPUNIT_ASSERT_NO_THROW( srv->configure() );
+        CPPUNIT_ASSERT_NO_THROW( srv->start() );
+        CPPUNIT_ASSERT_THROW( srv->update(), ::fwTools::Failed);
+        CPPUNIT_ASSERT_NO_THROW( srv->stop() );
+        ::fwServices::OSR::unregisterService( srv );
+    }
+    ::boost::filesystem::remove(file);
+
+}
+
+//------------------------------------------------------------------------------
+void ImageReaderWriterTest::testVtkImageWriter()
+{
+    // Data to write
+    const size_t dim = 3;
+    ::fwTools::Type type("uint8");
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 10;
+    sizeExpected[1] = 20;
+    sizeExpected[2] = 30;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 0.24;
+    spacingExpected[1] = 1.07;
+    spacingExpected[2] = 2.21;
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = -05.6;
+    originExpected[1] = 15.16;
+    originExpected[2] = 11.11;
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateImage(image, sizeExpected, spacingExpected, originExpected, type);
+
+    // Write to vtk image.
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder() / "temporaryFile.vtk";
+
+    this->runImageSrv("::io::IWriter","::ioVTK::ImageWriterService",getIOConfiguration(file), image);
+
+
+    // Read image from disk
+    ::fwData::Image::sptr imageFromDisk = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), imageFromDisk);
+
+    ::boost::filesystem::remove(file);
+
+    // Data read
+    ::fwData::Image::SpacingType spacingRead = imageFromDisk->getSpacing();
+    ::fwData::Image::SpacingType originRead = imageFromDisk->getOrigin();
+    ::fwData::Image::SizeType sizeRead = imageFromDisk->getSize();
+
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+    ::fwComEd::helper::Image imageHelper(image);
+    ::fwComEd::helper::Image imageFromDiskHelper(imageFromDisk);
+
+    char *ptrOnGeneratedImage = static_cast<char*>(imageHelper.getBuffer());
+    char *ptrOnReadImage = static_cast<char*>(imageFromDiskHelper.getBuffer());
+
+    CPPUNIT_ASSERT_EQUAL( image->getType(), imageFromDisk->getType() );
+    CPPUNIT_ASSERT( std::equal(ptrOnGeneratedImage, ptrOnGeneratedImage + image->getSizeInBytes(), ptrOnReadImage) );
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testVtkImageSeriesWriter()
+{
+    ::fwTools::Type type = ::fwTools::Type::create< float >();
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, type);
+
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::New();
+    imageSeries->setImage(image);
+
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder() / "imageSeries.vtk";
+
+    // Write image series
+    this->runImageSrv("::io::IWriter", "::ioVTK::SImageSeriesWriter", getIOConfiguration(file), imageSeries);
+
+    // Read image series
+    ::fwData::Image::sptr newImage = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService", getIOConfiguration(file), newImage);
+
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(image, newImage);
+    CPPUNIT_ASSERT_EQUAL(visitor.getDifferences()->size(), (size_t)0);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testVtiImageWriter()
+{
+    // Data to write
+    const size_t dim = 3;
+    ::fwTools::Type type("uint8");
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 10;
+    sizeExpected[1] = 20;
+    sizeExpected[2] = 30;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 0.24;
+    spacingExpected[1] = 1.07;
+    spacingExpected[2] = 2.21;
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = -05.6;
+    originExpected[1] = 15.16;
+    originExpected[2] = 11.11;
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateImage(image, sizeExpected, spacingExpected, originExpected, type);
+
+    // Write to vtk image.
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder() / "temporaryFile.vti";
+
+    this->runImageSrv("::io::IWriter","::ioVTK::ImageWriterService",getIOConfiguration(file), image);
+
+
+    // Read image from disk
+    ::fwData::Image::sptr imageFromDisk = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), imageFromDisk);
+
+    // Data read
+    ::fwData::Image::SpacingType spacingRead = imageFromDisk->getSpacing();
+    ::fwData::Image::SpacingType originRead = imageFromDisk->getOrigin();
+    ::fwData::Image::SizeType sizeRead = imageFromDisk->getSize();
+
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+    ::fwComEd::helper::Image imageHelper(image);
+    ::fwComEd::helper::Image imageFromDiskHelper(imageFromDisk);
+    char *ptrOnGeneratedImage = static_cast<char*>(imageHelper.getBuffer());
+    char *ptrOnReadImage = static_cast<char*>(imageFromDiskHelper.getBuffer());
+
+    CPPUNIT_ASSERT_EQUAL( image->getType(), imageFromDisk->getType());
+    CPPUNIT_ASSERT( std::equal(ptrOnGeneratedImage, ptrOnGeneratedImage + image->getSizeInBytes(), ptrOnReadImage) );
+
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testMhdImageWriter()
+{
+    // Data to write
+    const size_t dim = 3;
+    ::fwTools::Type type("uint8");
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 10;
+    sizeExpected[1] = 20;
+    sizeExpected[2] = 30;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 0.24;
+    spacingExpected[1] = 1.07;
+    spacingExpected[2] = 2.21;
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = -05.6;
+    originExpected[1] = 15.16;
+    originExpected[2] = 11.11;
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateImage(image, sizeExpected, spacingExpected, originExpected, type);
+
+    // Write to vtk image.
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder()/ "temporaryFile.mhd";
+
+    this->runImageSrv("::io::IWriter","::ioVTK::ImageWriterService",getIOConfiguration(file), image);
+
+    // Read image from disk
+    ::fwData::Image::sptr imageFromDisk = ::fwData::Image::New();
+    this->runImageSrv("::io::IReader","::ioVTK::ImageReaderService",getIOConfiguration(file), imageFromDisk);
+
+    // Data read
+    ::fwData::Image::SpacingType spacingRead = imageFromDisk->getSpacing();
+    ::fwData::Image::SpacingType originRead = imageFromDisk->getOrigin();
+    ::fwData::Image::SizeType sizeRead = imageFromDisk->getSize();
+
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+
+    ::fwComEd::helper::Image imageHelper(image);
+    ::fwComEd::helper::Image imageFromDiskHelper(imageFromDisk);
+    char *ptrOnGeneratedImage = static_cast<char*>(imageHelper.getBuffer());
+    char *ptrOnReadImage = static_cast<char*>(imageFromDiskHelper.getBuffer());
+
+    CPPUNIT_ASSERT_EQUAL( image->getType(), imageFromDisk->getType());
+    CPPUNIT_ASSERT( std::equal(ptrOnGeneratedImage, ptrOnGeneratedImage + image->getSizeInBytes(), ptrOnReadImage) );
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testImageWriterExtension()
+{
+    // Data to write
+    const size_t dim = 3;
+    ::fwTools::Type type("uint8");
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 10;
+    sizeExpected[1] = 20;
+    sizeExpected[2] = 30;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 0.24;
+    spacingExpected[1] = 1.07;
+    spacingExpected[2] = 2.21;
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = -05.6;
+    originExpected[1] = 15.16;
+    originExpected[2] = 11.11;
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateImage(image, sizeExpected, spacingExpected, originExpected, type);
+
+    // Write to vtk image.
+    const ::boost::filesystem::path file = ::fwTools::System::getTemporaryFolder()/ "temporaryFile.xxx";
+
+
+    {
+        const std::string srvtype("::io::IWriter");
+        const std::string srvname("::ioVTK::ImageWriterService");
+
+
+        ::fwServices::IService::sptr srv;
+        srv = ::fwServices::registry::ServiceFactory::getDefault()->create( srvtype, srvname );
+
+        CPPUNIT_ASSERT_MESSAGE(std::string("Failed to create service ") + srvname, srv);
+
+        ::fwServices::OSR::registerService( image , srv );
+
+        CPPUNIT_ASSERT_NO_THROW( srv->setConfiguration(getIOConfiguration(file)) );
+        CPPUNIT_ASSERT_NO_THROW( srv->configure() );
+        CPPUNIT_ASSERT_NO_THROW( srv->start() );
+        CPPUNIT_ASSERT_THROW( srv->update(), ::fwTools::Failed);
+        CPPUNIT_ASSERT_NO_THROW( srv->stop() );
+        ::fwServices::OSR::unregisterService( srv );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::runImageSrv(
+        const std::string &srvtype,
+        const std::string &srvname,
+        const SPTR(::fwRuntime::EConfigurationElement)& cfg,
+        const SPTR(::fwData::Object)& image)
+{
+
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create( srvtype, srvname );
+
+    CPPUNIT_ASSERT_MESSAGE(std::string("Failed to create service ") + srvname, srv);
+
+    ::fwServices::OSR::registerService( image , srv );
+
+    CPPUNIT_ASSERT_NO_THROW( srv->setConfiguration(cfg) );
+    CPPUNIT_ASSERT_NO_THROW( srv->configure() );
+    CPPUNIT_ASSERT_NO_THROW( srv->start() );
+    CPPUNIT_ASSERT_NO_THROW( srv->update() );
+    CPPUNIT_ASSERT_NO_THROW( srv->stop() );
+    ::fwServices::OSR::unregisterService( srv );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace ioVTK
+
diff --git a/Bundles/LeafIO/ioVTK/test/tu/src/ModelSeriesWriterTest.cpp b/Bundles/LeafIO/ioVTK/test/tu/src/ModelSeriesWriterTest.cpp
new file mode 100644
index 0000000..1f542e5
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/src/ModelSeriesWriterTest.cpp
@@ -0,0 +1,250 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <string>
+#include <set>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/functional/hash.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Array.hpp>
+
+#include <fwMemory/BufferObject.hpp>
+#include <fwTools/System.hpp>
+
+#include <fwTest/generator/SeriesDB.hpp>
+
+#include "ModelSeriesWriterTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioVTK::ut::ModelSeriesWriterTest );
+
+namespace ioVTK
+{
+namespace ut
+{
+
+namespace fs = ::boost::filesystem;
+typedef std::vector< std::string >  FileContainerType;
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesWriterTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesWriterTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void runModelSeriesSrv(
+        const std::string& impl,
+        const SPTR(::fwRuntime::EConfigurationElement)& cfg,
+        const SPTR(::fwData::Object)& obj)
+{
+   ::fwServices::IService::sptr srv = ::fwServices::registry::ServiceFactory::getDefault()->create(impl);
+
+    CPPUNIT_ASSERT_MESSAGE(std::string("Failed to create service ") + impl, srv);
+
+    ::fwServices::OSR::registerService(obj, srv);
+
+    CPPUNIT_ASSERT_NO_THROW( srv->setConfiguration( cfg ) );
+    CPPUNIT_ASSERT_NO_THROW( srv->configure() );
+    CPPUNIT_ASSERT_NO_THROW( srv->start() );
+    CPPUNIT_ASSERT_NO_THROW( srv->update() );
+    CPPUNIT_ASSERT_NO_THROW( srv->stop() );
+    ::fwServices::OSR::unregisterService( srv );
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::EConfigurationElement::sptr getIOCfgFromFolder(const fs::path& file)
+{
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr cfg = ::fwRuntime::EConfigurationElement::New("folder");
+    cfg->setValue(file.string());
+    srvCfg->addConfigurationElement(cfg);
+
+    return srvCfg;
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::EConfigurationElement::sptr getIOCfgFromFiles(const FileContainerType& files)
+{
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+
+    BOOST_FOREACH(std::string file, files)
+    {
+        ::fwRuntime::EConfigurationElement::sptr cfg = ::fwRuntime::EConfigurationElement::New("file");
+        cfg->setValue(file);
+        srvCfg->addConfigurationElement(cfg);
+    }
+
+    return srvCfg;
+}
+
+//------------------------------------------------------------------------------
+
+size_t recHash(const ::fwData::Reconstruction::sptr &rec)
+{
+    ::fwData::Mesh::sptr mesh = rec->getMesh();
+
+    ::fwData::Array::sptr points = mesh->getPointsArray();
+    ::fwData::Array::sptr cellTypes = mesh->getCellTypesArray();
+    ::fwData::Array::sptr cellData = mesh->getCellDataArray();
+    ::fwData::Array::sptr cellDataOffsets = mesh->getCellDataOffsetsArray();
+
+    std::string buf;
+
+    ::fwMemory::BufferObject::sptr bo;
+    ::fwMemory::BufferObject::Lock lock;
+
+    bo = points->getBufferObject();
+    lock = (bo->lock());
+    buf.append(static_cast< char * >(lock.getBuffer()), bo->getSize());
+
+    bo = cellTypes->getBufferObject();
+    lock = (bo->lock());
+    buf.append(static_cast< char * >(lock.getBuffer()), bo->getSize());
+
+    bo = cellData->getBufferObject();
+    lock = (bo->lock());
+    buf.append(static_cast< char * >(lock.getBuffer()), bo->getSize());
+
+    bo = cellDataOffsets->getBufferObject();
+    lock = (bo->lock());
+    buf.append(static_cast< char * >(lock.getBuffer()), bo->getSize());
+
+    ::boost::hash<std::string> stringHash;
+    return stringHash(buf);
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesWriterTest::testWriteMeshes()
+{
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwTest::generator::SeriesDB::createModelSeries(5);
+
+    const fs::path dir = ::fwTools::System::getTemporaryFolder() / "modelSeries";
+
+    if( fs::exists(dir) )
+    {
+        CPPUNIT_ASSERT_MESSAGE(std::string("Directory ") + dir.string() + " must be empty",
+                fs::is_empty(dir));
+    }
+    else
+    {
+        fs::create_directories(dir);
+    }
+
+    runModelSeriesSrv(
+            "::ioVTK::SModelSeriesWriter",
+            getIOCfgFromFolder(dir),
+            modelSeries);
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    FileContainerType files;
+    for(fs::directory_iterator it(dir); it != fs::directory_iterator(); ++it)
+    {
+        files.push_back(it->path().string());
+    }
+
+    CPPUNIT_ASSERT_EQUAL(modelSeries->getReconstructionDB().size(), files.size());
+
+    runModelSeriesSrv(
+            "::ioVTK::SSeriesDBReader",
+            getIOCfgFromFiles(files),
+            seriesDB);
+
+    const ::fwMedData::SeriesDB::ContainerType& series = seriesDB->getContainer();
+    CPPUNIT_ASSERT_EQUAL((size_t)1, series.size());
+
+    ::fwMedData::ModelSeries::sptr readSeries = ::fwMedData::ModelSeries::dynamicCast(series[0]);
+    CPPUNIT_ASSERT_MESSAGE("A ModelSeries was expected", readSeries);
+
+    typedef ::fwMedData::ModelSeries::ReconstructionVectorType RecVecType;
+    const RecVecType& readRecs = readSeries->getReconstructionDB();
+    CPPUNIT_ASSERT_EQUAL(files.size(), readRecs.size());
+
+    std::set< size_t > refHashes;
+    std::set< size_t > readHashes;
+
+    const RecVecType& refRecs = modelSeries->getReconstructionDB();
+    RecVecType::const_iterator itRef = refRecs.begin();
+    RecVecType::const_iterator itRead = readRecs.begin();
+
+    for(; itRef != refRecs.end(); ++itRef, ++itRead)
+    {
+        refHashes.insert(recHash(*itRef));
+        CPPUNIT_ASSERT_MESSAGE("No valid mesh found in reconstruction", (*itRef)->getMesh());
+        readHashes.insert(recHash(*itRead));
+        CPPUNIT_ASSERT_MESSAGE("No valid mesh found in read reconstruction", (*itRead)->getMesh());
+    }
+
+    CPPUNIT_ASSERT(refHashes == readHashes);
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesWriterTest::testWriteReconstructions()
+{
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwTest::generator::SeriesDB::createModelSeries(5);
+
+    const fs::path dir = ::fwTools::System::getTemporaryFolder() / "modelSeriesObj";
+
+    if( fs::exists(dir) )
+    {
+        CPPUNIT_ASSERT_MESSAGE(std::string("Directory ") + dir.string() + " must be empty",
+                fs::is_empty(dir));
+    }
+    else
+    {
+        fs::create_directories(dir);
+    }
+
+    runModelSeriesSrv(
+            "::ioVTK::SModelSeriesObjWriter",
+            getIOCfgFromFolder(dir),
+            modelSeries);
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    FileContainerType files;
+    for(fs::directory_iterator it(dir); it != fs::directory_iterator(); ++it)
+    {
+        files.push_back(it->path().string());
+    }
+
+    // Writer generates a .mtl file for each .obj file
+    CPPUNIT_ASSERT_EQUAL(modelSeries->getReconstructionDB().size() * 2, files.size());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace ioVTK
+
diff --git a/Bundles/LeafIO/ioVTK/test/tu/src/SeriesDBReaderTest.cpp b/Bundles/LeafIO/ioVTK/test/tu/src/SeriesDBReaderTest.cpp
new file mode 100644
index 0000000..2151e31
--- /dev/null
+++ b/Bundles/LeafIO/ioVTK/test/tu/src/SeriesDBReaderTest.cpp
@@ -0,0 +1,199 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwTools/System.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwData/location/ILocation.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/Series.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwDataTools/Image.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwTest/Data.hpp>
+
+#include "SeriesDBReaderTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioVTK::ut::SeriesDBReaderTest );
+
+static const double epsilon = 0.00001;
+
+namespace ioVTK
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::testSeriesDBReader()
+{
+    const ::boost::filesystem::path imageFile = ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk";
+    const ::boost::filesystem::path meshFile = ::fwTest::Data::dir() / "fw4spl/mesh/vtk/sphere.vtk";
+
+    ::fwRuntime::EConfigurationElement::sptr readerSrvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr file1Cfg = ::fwRuntime::EConfigurationElement::New("file");
+    ::fwRuntime::EConfigurationElement::sptr file2Cfg = ::fwRuntime::EConfigurationElement::New("file");
+    file1Cfg->setValue(imageFile.string());
+    readerSrvCfg->addConfigurationElement(file1Cfg);
+    file2Cfg->setValue(meshFile.string());
+    readerSrvCfg->addConfigurationElement(file2Cfg);
+    readerSrvCfg->addConfigurationElement(file2Cfg);
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create("::io::IReader", "::ioVTK::SSeriesDBReader" );
+
+    CPPUNIT_ASSERT_MESSAGE("Create SSeriesDBReader failed", srv);
+
+    ::fwServices::OSR::registerService(seriesDB, srv);
+    srv->setConfiguration(readerSrvCfg);
+    srv->configure();
+    srv->start();
+    srv->update();
+    srv->stop();
+    ::fwServices::OSR::unregisterService(srv);
+
+    // Data expected
+    const size_t dim = 3;
+    ::fwData::Image::SpacingType spacingExpected(dim);
+    spacingExpected[0] = 1.732;
+    spacingExpected[1] = 1.732;
+    spacingExpected[2] = 3.2;
+
+    ::fwData::Image::OriginType originExpected(dim);
+    originExpected[0] = 34.64;
+    originExpected[1] = 86.6;
+    originExpected[2] = 56;
+
+    ::fwData::Image::SizeType sizeExpected(dim);
+    sizeExpected[0] = 230;
+    sizeExpected[1] = 170;
+    sizeExpected[2] = 58;
+
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2), seriesDB->size());
+
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::dynamicCast(seriesDB->getContainer()[0]);
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(seriesDB->getContainer()[1]);
+    CPPUNIT_ASSERT_MESSAGE("ImageSeries dynamicCast failed", imageSeries);
+    CPPUNIT_ASSERT_MESSAGE("ModelSeries dynamicCast failed", modelSeries);
+
+    // Data read.
+    ::fwData::Image::sptr image = imageSeries->getImage();
+    ::fwData::Image::SpacingType spacingRead = image->getSpacing();
+    ::fwData::Image::SpacingType originRead = image->getOrigin();
+    ::fwData::Image::SizeType sizeRead = image->getSize();
+
+    CPPUNIT_ASSERT_EQUAL(spacingExpected.size(), spacingRead.size() );
+    CPPUNIT_ASSERT_EQUAL(originExpected.size(), originRead.size() );
+    CPPUNIT_ASSERT_EQUAL(sizeExpected.size(), sizeRead.size() );
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on x", spacingExpected[0], spacingRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on y", spacingExpected[1], spacingRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect spacing on z", spacingExpected[2], spacingRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on x", originExpected[0], originRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on y", originExpected[1], originRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect origin on z", originExpected[2], originRead[2], epsilon);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on x", sizeExpected[0], sizeRead[0], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on y", sizeExpected[1], sizeRead[1], epsilon);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Incorrect size on z", sizeExpected[2], sizeRead[2], epsilon);
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2),  modelSeries->getReconstructionDB().size());
+
+    ::fwData::Reconstruction::sptr rec1 = modelSeries->getReconstructionDB()[0];
+    ::fwData::Reconstruction::sptr rec2 = modelSeries->getReconstructionDB()[1];
+    ::fwData::Mesh::sptr mesh1 = rec1->getMesh();
+    ::fwData::Mesh::sptr mesh2 = rec2->getMesh();
+
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id)720, mesh1->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id)362, mesh1->getNumberOfPoints());
+
+    compare(mesh1, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::testMergeSeriesDBReader()
+{
+    const ::boost::filesystem::path imageFile = ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk";
+
+    ::fwRuntime::EConfigurationElement::sptr readerSrvCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileCfg->setValue(imageFile.string());
+    readerSrvCfg->addConfigurationElement(fileCfg);
+
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::New();
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+    seriesDB->getContainer().push_back(imageSeries);
+
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create("::io::IReader", "::ioVTK::SSeriesDBReader" );
+
+    CPPUNIT_ASSERT_MESSAGE("Create SSeriesDBReader failed", srv);
+
+    ::fwServices::OSR::registerService(seriesDB, srv);
+    srv->setConfiguration(readerSrvCfg);
+    srv->configure();
+    srv->start();
+    srv->update();
+    srv->stop();
+    ::fwServices::OSR::unregisterService(srv);
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2), seriesDB->size());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace ioVTK
diff --git a/Bundles/LeafIO/ioVtkGdcm/CMakeLists.txt b/Bundles/LeafIO/ioVtkGdcm/CMakeLists.txt
new file mode 100644
index 0000000..f113a37
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/CMakeLists.txt
@@ -0,0 +1,10 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+
+    io
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/Bundles/LeafIO/ioVtkGdcm/Properties.cmake b/Bundles/LeafIO/ioVtkGdcm/Properties.cmake
new file mode 100644
index 0000000..9857fe5
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ioVtkGdcm )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwMedData fwRuntime fwServices fwTools vtkGdcmIO io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafIO/ioVtkGdcm/bin/build.options b/Bundles/LeafIO/ioVtkGdcm/bin/build.options
new file mode 100644
index 0000000..3c65665
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['boost']
+LIB     = [
+          'fwTools_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwMedData_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwCore_0-1',
+          'fwComEd_0-1',
+          'vtkGdcmIO_0-1',
+          'fwGui_0-1'
+          ]
+BUNDLES = ['io_0-1']
+
+
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/Plugin.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/Plugin.hpp
new file mode 100644
index 0000000..ec6ce71
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/Plugin.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_PLUGIN_HPP__
+#define __IOVTKGDCM_PLUGIN_HPP__
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace ioVtkGdcm
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009-2011
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace ioVtkGdcm
+
+#endif //__IOVTKGDCM_PLUGIN_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SImageSeriesWriter.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SImageSeriesWriter.hpp
new file mode 100644
index 0000000..dbd5ade
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SImageSeriesWriter.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_SIMAGESERIESWRITER_HPP__
+#define __IOVTKGDCM_SIMAGESERIESWRITER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IWriter.hpp>
+
+#include "ioVtkGdcm/config.hpp"
+
+namespace fwMedData
+{
+    class ImageSeries;
+}
+
+
+namespace ioVtkGdcm
+{
+
+/**
+ * @brief Services to write an ImageSeries in DICOM format.
+ * @class SImageSeriesWriter
+ */
+class IOVTKGDCM_CLASS_API SImageSeriesWriter : public ::io::IWriter
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SImageSeriesWriter)( ::io::IWriter) ) ;
+
+    /**
+     * @brief   constructor
+     */
+    IOVTKGDCM_API SImageSeriesWriter() throw();
+
+    /**
+     * @brief   destructor
+     */
+    IOVTKGDCM_API virtual ~SImageSeriesWriter() throw();
+
+    /// Propose select a directory where to save the DICOM files.
+    IOVTKGDCM_API virtual void configureWithIHM();
+
+protected:
+
+    /// Does nothing
+    IOVTKGDCM_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Does nothing
+    IOVTKGDCM_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Write the ImageSeries in DICOM format.
+    IOVTKGDCM_API void updating() throw(::fwTools::Failed);
+
+
+    /// Return path type managed by the service, here FOLDER
+    IOVTKGDCM_API ::io::IOPathType getIOPathType() const;
+
+private :
+
+    void saveImageSeries( const ::boost::filesystem::path folder, SPTR(::fwMedData::ImageSeries) series );
+};
+
+} // namespace ioVtkGdcm
+
+#endif //__IOVTKGDCM_SIMAGESERIESWRITER_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBLazyReader.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBLazyReader.hpp
new file mode 100644
index 0000000..4d1802e
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBLazyReader.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_SSERIESDBLAZYREADER_HPP__
+#define __IOVTKGDCM_SSERIESDBLAZYREADER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioVtkGdcm/config.hpp"
+
+namespace fwMedData
+{
+    class SeriesDB;
+    class Patient;
+}
+
+namespace ioVtkGdcm
+{
+
+/// This service reads a dicom dir in lazy mode, and provides a ::fwMedData::SeriesDB.
+class IOVTKGDCM_CLASS_API SSeriesDBLazyReader : public ::io::IReader
+{
+
+public :
+    typedef std::string                  ExtensionType;
+    typedef std::vector< ExtensionType > ExtensionsType;
+
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesDBLazyReader)( ::io::IReader) ) ;
+
+    /// constructor
+    IOVTKGDCM_API SSeriesDBLazyReader() throw();
+
+    /// destructor
+    IOVTKGDCM_API virtual ~SSeriesDBLazyReader() throw();
+
+protected:
+
+    /// Override
+    IOVTKGDCM_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOVTKGDCM_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOVTKGDCM_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /// Override
+    IOVTKGDCM_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOVTKGDCM_API virtual ExtensionsType getSupportedExtensions() ;
+
+    /// Override
+    IOVTKGDCM_API virtual std::string getSelectorDialogTitle();
+
+    /// Override
+    IOVTKGDCM_API virtual void configureWithIHM();
+
+    /// Return path type managed by the service, here FOLDER
+    IOVTKGDCM_API ::io::IOPathType getIOPathType() const;
+
+private :
+
+    /// Notifies seriesDB that few series are added
+    void notificationOfDBUpdate();
+
+    /// Creates ::fwMedData::SeriesDB from a path
+    SPTR(::fwMedData::SeriesDB) createSeriesDB(const ::boost::filesystem::path& dicomDir);
+
+};
+
+} // namespace ioVtkGdcm
+
+#endif //__IOVTKGDCM_SSERIESDBLAZYREADER_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBReader.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBReader.hpp
new file mode 100644
index 0000000..f18d6f2
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/SSeriesDBReader.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_SSERIESDBREADER_HPP__
+#define __IOVTKGDCM_SSERIESDBREADER_HPP__
+
+#include <string>
+#include <boost/filesystem/path.hpp>
+
+#include <io/IReader.hpp>
+
+#include "ioVtkGdcm/config.hpp"
+
+namespace fwMedData
+{
+    class SeriesDB;
+    class Patient;
+}
+
+
+namespace ioVtkGdcm
+{
+
+class IOVTKGDCM_CLASS_API SSeriesDBReader : public ::io::IReader
+{
+
+public :
+    typedef std::string                  ExtensionType;
+    typedef std::vector< ExtensionType > ExtensionsType;
+
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesDBReader)( ::io::IReader) ) ;
+    /**
+     * @brief   constructor
+     *
+     */
+    IOVTKGDCM_API SSeriesDBReader() throw();
+
+    /**
+     * @brief   destructor
+     */
+    IOVTKGDCM_API virtual ~SSeriesDBReader() throw();
+
+protected:
+
+    /// Override
+    IOVTKGDCM_API virtual void starting() throw(::fwTools::Failed);
+
+    /// Override
+    IOVTKGDCM_API virtual void stopping() throw(::fwTools::Failed);
+
+    /// Override
+    IOVTKGDCM_API void updating() throw(::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed){};
+
+    /// Override
+    IOVTKGDCM_API void info(std::ostream &_sstream ) ;
+
+    /// Override
+    IOVTKGDCM_API virtual ExtensionsType getSupportedExtensions() ;
+
+    /// Override
+    IOVTKGDCM_API virtual std::string getSelectorDialogTitle();
+
+    /// Override
+    IOVTKGDCM_API virtual void configureWithIHM();
+
+    /// Return path type managed by the service, here FOLDER
+    IOVTKGDCM_API ::io::IOPathType getIOPathType() const;
+
+private :
+
+    void notificationOfDBUpdate();
+
+    SPTR(::fwMedData::SeriesDB) createSeriesDB(const ::boost::filesystem::path& dicomDir);
+
+};
+
+} // namespace ioVtkGdcm
+
+#endif //__IOVTKGDCM_SSERIESDBREADER_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/config.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/config.hpp
new file mode 100644
index 0000000..5df4f00
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_CONFIG_HPP__
+#define __IOVTKGDCM_CONFIG_HPP__
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef IOVTKGDCM_EXPORTS
+    #define IOVTKGDCM_API __declspec(dllexport)
+    #else
+    #define IOVTKGDCM_API __declspec(dllimport)
+    #endif
+
+    #define IOVTKGDCM_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IOVTKGDCM_EXPORTS
+    #define IOVTKGDCM_API __attribute__ ((visibility("default")))
+    #define IOVTKGDCM_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IOVTKGDCM_API __attribute__ ((visibility("hidden")))
+    #define IOVTKGDCM_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IOVTKGDCM_API
+    #define IOVTKGDCM_CLASS_API
+
+#endif
+
+#endif // #ifndef __IOVTKGDCM_CONFIG_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/namespace.hpp b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/namespace.hpp
new file mode 100644
index 0000000..fec92ea
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/include/ioVtkGdcm/namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C), 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_NAMESPACE_HPP__
+#define __IOVTKGDCM_NAMESPACE_HPP__
+
+/**
+ * @namespace ioVtkGdcm
+ * @brief ioVtkGdcm contains services to read and write Series using vtk and gdcm libraries.
+ * @date 2013.
+ */
+namespace ioVtkGdcm
+{
+}
+
+#endif /* __IOVTKGDCM_NAMESPACE_HPP__ */
+
diff --git a/Bundles/LeafIO/ioVtkGdcm/rc/plugin.xml b/Bundles/LeafIO/ioVtkGdcm/rc/plugin.xml
new file mode 100644
index 0000000..decbe02
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/rc/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="ioVtkGdcm" class="ioVtkGdcm::Plugin" >
+    <library name="ioVtkGdcm" />
+
+    <requirement id="io" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVtkGdcm::SSeriesDBReader</service>
+        <object>::fwMedData::SeriesDB</object>
+        <desc>Series DB Reader (VTK/gdcm)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IReader</type>
+        <service>::ioVtkGdcm::SSeriesDBLazyReader</service>
+        <object>::fwMedData::SeriesDB</object>
+        <desc>Series DB Lazy Reader (VTK/gdcm)</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::io::IWriter</type>
+        <service>::ioVtkGdcm::SImageSeriesWriter</service>
+        <object>::fwMedData::ImageSeries</object>
+        <desc>Dicom Writer (VTK/gdcm)</desc>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/Plugin.cpp b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/Plugin.cpp
new file mode 100644
index 0000000..c45531b
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/Plugin.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "ioVtkGdcm/Plugin.hpp"
+
+namespace ioVtkGdcm
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("ioVtkGdcm::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace ioVtkGdcm
diff --git a/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SImageSeriesWriter.cpp b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SImageSeriesWriter.cpp
new file mode 100644
index 0000000..be9ba52
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SImageSeriesWriter.cpp
@@ -0,0 +1,171 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwTools/ProgressToLogger.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <io/IWriter.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <vtkGdcmIO/ImageSeriesWriter.hpp>
+
+#include "ioVtkGdcm/SImageSeriesWriter.hpp"
+
+
+namespace ioVtkGdcm
+{
+
+fwServicesRegisterMacro( ::io::IWriter , ::ioVtkGdcm::SImageSeriesWriter , ::fwMedData::ImageSeries ) ;
+
+//------------------------------------------------------------------------------
+
+SImageSeriesWriter::SImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SImageSeriesWriter::~SImageSeriesWriter() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a directory for DICOM images");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+    dialogFile.setType(::fwGui::dialog::LocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr  result;
+    result= ::fwData::location::Folder::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getFolder();
+        this->setFolder( result->getFolder() );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+    else
+    {
+        this->clearLocations();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::starting() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::stopping() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::updating() throw(::fwTools::Failed)
+{
+    if( this->hasLocationDefined() )
+    {
+        // Retrieve dataStruct associated with this service
+        ::fwMedData::ImageSeries::sptr series = this->getObject< ::fwMedData::ImageSeries >();
+        const ::boost::filesystem::path& folder = this->getFolder();
+        if(!::boost::filesystem::is_empty(folder))
+        {
+            ::fwGui::dialog::MessageDialog dialog;
+            dialog.setMessage("Folder '"+folder.string()+"' isn't empty, files can be overwritten."
+                    "\nDo you want to continue ?");
+            dialog.setTitle("Folder not empty.");
+            dialog.setIcon(::fwGui::dialog::MessageDialog::QUESTION);
+            dialog.addButton( ::fwGui::dialog::MessageDialog::YES_NO );
+            ::fwGui::dialog::MessageDialog::Buttons button = dialog.show();
+
+            if(button == ::fwGui::dialog::MessageDialog::NO)
+            {
+                return;
+            }
+        }
+
+        if (series->getModality() == "OT")
+        {
+            ::fwGui::dialog::MessageDialog dialog;
+            dialog.setMessage("Series modality is '" + series->getModality() + "' some information can be lost."
+                              "\nDo you want to continue ?");
+            dialog.setTitle("Series modality.");
+            dialog.setIcon(::fwGui::dialog::MessageDialog::QUESTION);
+            dialog.addButton( ::fwGui::dialog::MessageDialog::YES_NO );
+            ::fwGui::dialog::MessageDialog::Buttons button = dialog.show();
+
+            if(button == ::fwGui::dialog::MessageDialog::NO)
+            {
+                return;
+            }
+        }
+        ::fwGui::Cursor cursor;
+        cursor.setCursor(::fwGui::ICursor::BUSY);
+        this->saveImageSeries(folder, series);
+        cursor.setDefaultCursor();
+    }
+}
+
+
+//------------------------------------------------------------------------------
+
+void SImageSeriesWriter::saveImageSeries( const ::boost::filesystem::path folder,
+        ::fwMedData::ImageSeries::sptr series )
+{
+    ::vtkGdcmIO::ImageSeriesWriter::sptr writer = ::vtkGdcmIO::ImageSeriesWriter::New();
+
+    writer->setObject(series);
+    ::fwData::location::Folder::sptr loc = ::fwData::location::Folder::New();
+    loc->setFolder(folder);
+    writer->setLocation(loc);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Saving series ");
+        writer->addHandler( progressMeterGUI );
+        writer->write();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during saving : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", ss.str(), ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", "Warning during saving", ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType SImageSeriesWriter::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioVtkGdcm
diff --git a/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBLazyReader.cpp b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBLazyReader.cpp
new file mode 100644
index 0000000..6e75251
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBLazyReader.cpp
@@ -0,0 +1,195 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwTools/ProgressToLogger.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwComEd/SeriesDBMsg.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <vtkGdcmIO/SeriesDBLazyReader.hpp>
+
+#include "ioVtkGdcm/SSeriesDBLazyReader.hpp"
+
+
+namespace ioVtkGdcm
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVtkGdcm::SSeriesDBLazyReader , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+SSeriesDBLazyReader::SSeriesDBLazyReader() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SSeriesDBLazyReader::~SSeriesDBLazyReader() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle(this->getSelectorDialogTitle());
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setType(::fwGui::dialog::LocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr  result;
+    result= ::fwData::location::Folder::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getFolder();
+        this->setFolder( result->getFolder() );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::info(std::ostream &_sstream )
+{
+    _sstream << "SSeriesDBLazyReader::info" ;
+}
+
+//------------------------------------------------------------------------------
+
+SSeriesDBLazyReader::ExtensionsType SSeriesDBLazyReader::getSupportedExtensions()
+{
+    ExtensionsType extensions ;
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+std::string SSeriesDBLazyReader::getSelectorDialogTitle()
+{
+    return "Choose a directory with DICOM images";
+}
+
+
+//------------------------------------------------------------------------------
+
+::fwMedData::SeriesDB::sptr SSeriesDBLazyReader::createSeriesDB(const ::boost::filesystem::path& dicomDir)
+{
+    SLM_TRACE_FUNC();
+    ::vtkGdcmIO::SeriesDBLazyReader::sptr myLoader = ::vtkGdcmIO::SeriesDBLazyReader::New();
+    ::fwMedData::SeriesDB::sptr dummy = ::fwMedData::SeriesDB::New();
+    myLoader->setObject(dummy);
+    myLoader->setFolder(dicomDir);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Dicom Image");
+        myLoader->addHandler( progressMeterGUI );
+        myLoader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", ss.str(), ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", "Warning during loading", ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+
+    return myLoader->getConcreteObject();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if( this->hasLocationDefined() )
+    {
+        ::fwMedData::SeriesDB::sptr seriesDB = createSeriesDB( this->getFolder() );
+
+        if( seriesDB->size() > 0 )
+        {
+            // Retrieve dataStruct associated with this service
+            ::fwMedData::SeriesDB::sptr associatedSeriesDB = this->getObject< ::fwMedData::SeriesDB >();
+            SLM_ASSERT("associated SeriesDB not instanced", associatedSeriesDB);
+            associatedSeriesDB->shallowCopy( seriesDB ) ;
+
+            ::fwGui::Cursor cursor;
+            cursor.setCursor(::fwGui::ICursor::BUSY);
+            this->notificationOfDBUpdate();
+            cursor.setDefaultCursor();
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Image Reader","This file can not be read. Retry with another file reader.", ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBLazyReader::notificationOfDBUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >() ;
+    SLM_ASSERT("Unable to get seriesDB", seriesDB);
+
+    ::fwComEd::SeriesDBMsg::sptr msg = ::fwComEd::SeriesDBMsg::New();
+    BOOST_FOREACH( ::fwMedData::Series::sptr s, seriesDB->getContainer() )
+    {
+        msg->appendAddedSeries(s);
+    }
+
+    ::fwServices::IEditionService::notify(this->getSptr(),  seriesDB, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType SSeriesDBLazyReader::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioInr
diff --git a/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBReader.cpp b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBReader.cpp
new file mode 100644
index 0000000..37f1be2
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/src/ioVtkGdcm/SSeriesDBReader.cpp
@@ -0,0 +1,195 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwTools/ProgressToLogger.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include <io/IReader.hpp>
+
+#include <fwComEd/SeriesDBMsg.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <vtkGdcmIO/SeriesDBReader.hpp>
+
+#include "ioVtkGdcm/SSeriesDBReader.hpp"
+
+
+namespace ioVtkGdcm
+{
+
+fwServicesRegisterMacro( ::io::IReader , ::ioVtkGdcm::SSeriesDBReader , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+SSeriesDBReader::SSeriesDBReader() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SSeriesDBReader::~SSeriesDBReader() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::configureWithIHM()
+{
+    static ::boost::filesystem::path _sDefaultPath;
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle(this->getSelectorDialogTitle());
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+    dialogFile.setType(::fwGui::dialog::LocationDialog::FOLDER);
+
+    ::fwData::location::Folder::sptr  result;
+    result= ::fwData::location::Folder::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        _sDefaultPath = result->getFolder();
+        this->setFolder( result->getFolder() );
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::info(std::ostream &_sstream )
+{
+    _sstream << "SSeriesDBReader::info" ;
+}
+
+//------------------------------------------------------------------------------
+
+SSeriesDBReader::ExtensionsType SSeriesDBReader::getSupportedExtensions()
+{
+    ExtensionsType extensions ;
+    return extensions ;
+}
+
+//------------------------------------------------------------------------------
+
+std::string SSeriesDBReader::getSelectorDialogTitle()
+{
+    return "Choose a directory with DICOM images";
+}
+
+
+//------------------------------------------------------------------------------
+
+::fwMedData::SeriesDB::sptr SSeriesDBReader::createSeriesDB(const ::boost::filesystem::path& dicomDir)
+{
+    SLM_TRACE_FUNC();
+    ::vtkGdcmIO::SeriesDBReader::sptr myLoader = ::vtkGdcmIO::SeriesDBReader::New();
+    ::fwMedData::SeriesDB::sptr dummy = ::fwMedData::SeriesDB::New();
+    myLoader->setObject(dummy);
+    myLoader->setFolder(dicomDir);
+
+    try
+    {
+        ::fwGui::dialog::ProgressDialog progressMeterGUI("Loading Dicom Image");
+        myLoader->addHandler( progressMeterGUI );
+        myLoader->read();
+    }
+    catch (const std::exception & e)
+    {
+        std::stringstream ss;
+        ss << "Warning during loading : " << e.what();
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", ss.str(), ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+    catch( ... )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Warning", "Warning during loading", ::fwGui::dialog::IMessageDialog::WARNING);
+    }
+
+    return myLoader->getConcreteObject();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if( this->hasLocationDefined() )
+    {
+        ::fwMedData::SeriesDB::sptr seriesDB = createSeriesDB( this->getFolder() );
+
+        if( seriesDB->size() > 0 )
+        {
+            // Retrieve dataStruct associated with this service
+            ::fwMedData::SeriesDB::sptr associatedSeriesDB = this->getObject< ::fwMedData::SeriesDB >();
+            SLM_ASSERT("associated SeriesDB not instanced", associatedSeriesDB);
+            associatedSeriesDB->shallowCopy( seriesDB ) ;
+
+            ::fwGui::Cursor cursor;
+            cursor.setCursor(::fwGui::ICursor::BUSY);
+            this->notificationOfDBUpdate();
+            cursor.setDefaultCursor();
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Image Reader","This file can not be read. Retry with another file reader.", ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBReader::notificationOfDBUpdate()
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >() ;
+    SLM_ASSERT("Unable to get seriesDB", seriesDB);
+
+    ::fwComEd::SeriesDBMsg::sptr msg = ::fwComEd::SeriesDBMsg::New();
+    BOOST_FOREACH( ::fwMedData::Series::sptr s, seriesDB->getContainer() )
+    {
+        msg->appendAddedSeries(s);
+    }
+
+    ::fwServices::IEditionService::notify(this->getSptr(),  seriesDB, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType SSeriesDBReader::getIOPathType() const
+{
+    return ::io::FOLDER;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ioInr
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/CMakeLists.txt b/Bundles/LeafIO/ioVtkGdcm/test/CMakeLists.txt
new file mode 100644
index 0000000..c7bb8af
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/Properties.cmake b/Bundles/LeafIO/ioVtkGdcm/test/Properties.cmake
new file mode 100644
index 0000000..22f89ad
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME ioVtkGdcmTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwTest vtkGdcmIO )
+set( REQUIREMENTS io ioVtkGdcm )
+
+set(CPPUNITTEST_OPTIONS BUNDLE ioVtkGdcm WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/cppunit.options b/Bundles/LeafIO/ioVtkGdcm/test/cppunit.options
new file mode 100644
index 0000000..40eecc2
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/cppunit.options
@@ -0,0 +1,12 @@
+CLASSTEST=[
+          'IoVtkGdcmTest',
+          ]
+
+USE = []
+LIB = ['vtkGdcmIO_0-1', 'fwTest_0-1' ]
+
+REQUIREMENTS = ['io_0-1', 'ioVtkGdcm_0-1']
+
+CONSOLE = 'yes'
+
+LOGLEVEL='trace'
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/tu/include/IoVtkGdcmTest.hpp b/Bundles/LeafIO/ioVtkGdcm/test/tu/include/IoVtkGdcmTest.hpp
new file mode 100644
index 0000000..538f5d1
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/tu/include/IoVtkGdcmTest.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __IOVTKGDCM_TEST_TU_IOVTKGDCMTEST_HPP__
+#define __IOVTKGDCM_TEST_TU_IOVTKGDCMTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ioVtkGdcm
+{
+namespace ut
+{
+
+/**
+ * @brief Test the reading of Dicom file with vtkGdcm.
+ */
+class IoVtkGdcmTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( IoVtkGdcmTest );
+    CPPUNIT_TEST( seriesDBReaderTest );
+    CPPUNIT_TEST( seriesDBLazyReaderTest );
+    CPPUNIT_TEST( imageSeriesWriterTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void seriesDBReaderTest();
+    void seriesDBLazyReaderTest();
+    void imageSeriesWriterTest();
+
+    void readerDicomTest( std::string srvImpl );
+};
+
+} //namespace ut
+} //namespace ioVtkGdcm
+
+#endif //__IOVTKGDCM_TEST_TU_IOVTKGDCMTEST_HPP__
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/tu/rc/profile.xml b/Bundles/LeafIO/ioVtkGdcm/test/tu/rc/profile.xml
new file mode 100644
index 0000000..85730bc
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/tu/rc/profile.xml
@@ -0,0 +1,11 @@
+<profile name="IoVtkGdcmTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioVtkGdcm" version="0-1" />
+
+    <start id="ioVtkGdcm" />
+
+</profile>
diff --git a/Bundles/LeafIO/ioVtkGdcm/test/tu/src/IoVtkGdcmTest.cpp b/Bundles/LeafIO/ioVtkGdcm/test/tu/src/IoVtkGdcmTest.cpp
new file mode 100644
index 0000000..cc4baa2
--- /dev/null
+++ b/Bundles/LeafIO/ioVtkGdcm/test/tu/src/IoVtkGdcmTest.cpp
@@ -0,0 +1,227 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/System.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+
+#include <fwTest/generator/SeriesDB.hpp>
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/helper/compare.hpp>
+#include <fwTest/Data.hpp>
+
+#include "IoVtkGdcmTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ioVtkGdcm::ut::IoVtkGdcmTest );
+
+
+namespace ioVtkGdcm
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void IoVtkGdcmTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void IoVtkGdcmTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void IoVtkGdcmTest::readerDicomTest( std::string srvImpl )
+{
+    ::boost::filesystem::path dicomDataPath(::fwTest::Data::dir() / "fw4spl/Patient/Dicom/image_281433");
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+    ::fwRuntime::EConfigurationElement::sptr readerCfg = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr folderCfg = ::fwRuntime::EConfigurationElement::New("folder");
+    folderCfg->setValue(dicomDataPath.string());
+    readerCfg->addConfigurationElement(folderCfg);
+
+    ::fwServices::IService::sptr srv =
+            ::fwServices::registry::ServiceFactory::getDefault()->create( "::io::IReader", srvImpl );
+    CPPUNIT_ASSERT(srv);
+
+    ::fwServices::OSR::registerService( seriesDB, srv );
+
+    srv->setConfiguration( readerCfg );
+    srv->configure();
+    srv->start();
+    srv->update();
+    srv->stop();
+    ::fwServices::OSR::unregisterService( srv );
+
+    // Patient expected
+    const std::string nameExpected("anonymous^anonymous");
+    const std::string sexExpected("F");
+
+    //Info image expected.
+    const size_t imgDimensionExpected   = 3;
+    double imgSpacingX = 0.667969;
+    double imgSpacingY = 0.667969;
+    double imgSpacingZ = 1.5;
+
+    ::fwData::Image::OriginType imgOriginExpected (3,0);
+
+    size_t imgSizeX_Expected =  512;
+    size_t imgSizeY_Expected =  512;
+    size_t imgSizeZ_Expected =  166;
+    // int imgSize = imgSizeX_Expected*imgSizeY_Expected*imgSizeZ_Expected;
+
+    const double imgWindowCenter = 50;
+    const double imgWindowWidth = 500;
+    ::fwTools::Type imgPixelType = ::fwTools::Type::create<signed int>();
+
+    CPPUNIT_ASSERT_EQUAL(size_t(1), seriesDB->getContainer().size());
+
+    ::fwMedData::Series::sptr series = seriesDB->getContainer()[0];
+
+    ::fwMedData::Patient::sptr patient = series->getPatient();
+    ::fwMedData::Study::sptr study = series->getStudy();
+
+    CPPUNIT_ASSERT_EQUAL(nameExpected, patient->getName());
+    CPPUNIT_ASSERT_EQUAL(sexExpected, patient->getSex());
+
+    ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(series);
+    CPPUNIT_ASSERT(imgSeries);
+    ::fwData::Image::csptr fisrtImage = imgSeries->getImage();
+
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on image dimension.",
+            fisrtImage->getNumberOfDimensions(),
+            imgDimensionExpected);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on origin on X ",
+            static_cast< ::fwData::Image::OriginType::value_type > (fisrtImage->getOrigin()[0]),
+            imgOriginExpected[0]);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on origin on Y ",
+            static_cast< ::fwData::Image::OriginType::value_type > (fisrtImage->getOrigin()[1]),
+            imgOriginExpected[1]);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on origin on Z ",
+            static_cast< ::fwData::Image::OriginType::value_type > (fisrtImage->getOrigin()[2]),
+            imgOriginExpected[2]);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on window center ",
+            fisrtImage->getWindowCenter(),
+            imgWindowCenter);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on window width ",
+            fisrtImage->getWindowWidth(),
+            imgWindowWidth);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on size x ",
+            static_cast< ::fwData::Image::SizeType::value_type > (fisrtImage->getSize()[0]),
+            static_cast< ::fwData::Image::SizeType::value_type > (imgSizeX_Expected));
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on size y ",
+            static_cast< ::fwData::Image::SizeType::value_type > (fisrtImage->getSize()[1]),
+            static_cast< ::fwData::Image::SizeType::value_type > (imgSizeY_Expected));
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on size z ",
+            static_cast< ::fwData::Image::SizeType::value_type > (fisrtImage->getSize()[2]),
+            static_cast< ::fwData::Image::SizeType::value_type > (imgSizeZ_Expected));
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on spacing x ",
+            static_cast< ::fwData::Image::SpacingType::value_type > (fisrtImage->getSpacing()[0]),
+            imgSpacingX);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on spacing y ",
+            static_cast< ::fwData::Image::SpacingType::value_type > (fisrtImage->getSpacing()[1]),
+            imgSpacingY);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed on spacing z ",
+            static_cast< ::fwData::Image::SpacingType::value_type > (fisrtImage->getSpacing()[2]),
+            imgSpacingZ);
+}
+
+//------------------------------------------------------------------------------
+
+void IoVtkGdcmTest::seriesDBLazyReaderTest()
+{
+    this->readerDicomTest("::ioVtkGdcm::SSeriesDBLazyReader");
+}
+
+//------------------------------------------------------------------------------
+
+void IoVtkGdcmTest::seriesDBReaderTest()
+{
+    this->readerDicomTest("::ioVtkGdcm::SSeriesDBReader");
+}
+
+//------------------------------------------------------------------------------
+
+void IoVtkGdcmTest::imageSeriesWriterTest()
+{
+    const ::boost::filesystem::path PATH = ::fwTools::System::getTemporaryFolder() / "DicomWriterTest";
+
+    ::boost::filesystem::create_directories( PATH );
+
+    ::fwRuntime::EConfigurationElement::sptr srvConfig = ::fwRuntime::EConfigurationElement::New("service");
+    ::fwRuntime::EConfigurationElement::sptr folderCfg = ::fwRuntime::EConfigurationElement::New("folder");
+    folderCfg->setValue(PATH.string());
+    srvConfig->addConfigurationElement(folderCfg);
+
+    ::fwTest::generator::Image::initRand();
+    ::fwMedData::ImageSeries::sptr imgSeries;
+    imgSeries = ::fwTest::generator::SeriesDB::createImageSeries();
+
+    ::fwServices::IService::sptr writerSrv = ::fwServices::registry::ServiceFactory::getDefault()->create( "::io::IWriter", "::ioVtkGdcm::SImageSeriesWriter" );
+    CPPUNIT_ASSERT(writerSrv);
+
+    ::fwServices::OSR::registerService( imgSeries, writerSrv );
+
+    writerSrv->setConfiguration( srvConfig );
+    writerSrv->configure();
+    writerSrv->start();
+    writerSrv->update();
+    writerSrv->stop();
+    ::fwServices::OSR::unregisterService( writerSrv );
+
+
+    // Load Dicom from disk
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    ::fwServices::IService::sptr readerSrv = ::fwServices::registry::ServiceFactory::getDefault()->create( "::io::IReader", "::ioVtkGdcm::SSeriesDBReader" );
+    CPPUNIT_ASSERT(readerSrv);
+
+    ::fwServices::OSR::registerService( seriesDB , readerSrv );
+
+    readerSrv->setConfiguration( srvConfig ); // use same config as writer
+    readerSrv->configure();
+    readerSrv->start();
+    readerSrv->update();
+    readerSrv->stop();
+    ::fwServices::OSR::unregisterService( readerSrv );
+
+    // Clean the written data
+    ::boost::filesystem::remove_all( PATH.string() );
+
+    // check series
+    CPPUNIT_ASSERT_EQUAL(size_t(1), seriesDB->getContainer().size());
+
+    CPPUNIT_ASSERT(::fwTest::helper::compare(imgSeries, seriesDB->getContainer().front()));
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace ioVtkGdcm
diff --git a/Bundles/LeafOp/opImageFilter/CMakeLists.txt b/Bundles/LeafOp/opImageFilter/CMakeLists.txt
new file mode 100644
index 0000000..d89c961
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/CMakeLists.txt
@@ -0,0 +1,10 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+)
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
diff --git a/Bundles/LeafOp/opImageFilter/COPYING b/Bundles/LeafOp/opImageFilter/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafOp/opImageFilter/COPYING.LESSER b/Bundles/LeafOp/opImageFilter/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafOp/opImageFilter/Properties.cmake b/Bundles/LeafOp/opImageFilter/Properties.cmake
new file mode 100644
index 0000000..9943b38
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME opImageFilter )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwData fwGui fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafOp/opImageFilter/bin/build.options b/Bundles/LeafOp/opImageFilter/bin/build.options
new file mode 100644
index 0000000..bc1416a
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/bin/build.options
@@ -0,0 +1,17 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['boost']
+LIB     = [
+          'fwTools_0-1',
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwGui_0-1',
+          ]
+BUNDLES = ['gui_0-1']
+
+
+
+
diff --git a/Bundles/LeafOp/opImageFilter/include/opImageFilter/Namespace.hpp b/Bundles/LeafOp/opImageFilter/include/opImageFilter/Namespace.hpp
new file mode 100644
index 0000000..506f982
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/include/opImageFilter/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef OPIMAGEFILTERNAMESPACE_HPP_
+#define OPIMAGEFILTERNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace opImageFilter contains several operators on image.
+ * @namespace   opImageFilter
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace opImageFilter
+{
+
+}
+#endif /* OPIMAGEFILTERNAMESPACE_HPP_ */
diff --git a/Bundles/LeafOp/opImageFilter/include/opImageFilter/Plugin.hpp b/Bundles/LeafOp/opImageFilter/include/opImageFilter/Plugin.hpp
new file mode 100644
index 0000000..2956e47
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/include/opImageFilter/Plugin.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPIMAGEFILTER_PLUGIN_HPP_
+#define _OPIMAGEFILTER_PLUGIN_HPP_
+
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace opImageFilter
+{
+
+
+/**
+ * @brief   Implements a plugin for the opImageFilter bundle.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+
+} // namespace opImageFilter
+
+
+#endif //_OPIMAGEFILTER_PLUGIN_HPP_
diff --git a/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/ImageFilter.hpp b/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/ImageFilter.hpp
new file mode 100644
index 0000000..964cf58
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/ImageFilter.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPIMAGEFILTER_ACTION_IMAGEFILTER_HPP_
+#define _OPIMAGEFILTER_ACTION_IMAGEFILTER_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "opImageFilter/config.hpp"
+
+namespace opImageFilter
+{
+
+namespace action
+{
+
+class OPIMAGEFILTER_CLASS_API ImageFilter : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageFilter)(::fwGui::IActionSrv) ) ;
+
+    OPIMAGEFILTER_API ImageFilter() throw() ;
+
+    OPIMAGEFILTER_API virtual ~ImageFilter() throw() ;
+
+protected:
+
+    OPIMAGEFILTER_API void starting() throw ( ::fwTools::Failed );
+
+    OPIMAGEFILTER_API void stopping() throw ( ::fwTools::Failed );
+
+    OPIMAGEFILTER_API void receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed );
+
+    OPIMAGEFILTER_API void configuring() throw ( ::fwTools::Failed );
+
+    OPIMAGEFILTER_API void updating() throw ( ::fwTools::Failed );
+
+    OPIMAGEFILTER_API void info ( std::ostream &_sstream ) ;
+
+private :
+
+    std::string m_image1UID;
+    std::string m_image2UID;
+
+};
+
+
+} // namespace action
+} // namespace opImageFilter
+
+
+#endif // _OPIMAGEFILTER_ACTION_IMAGEFILTER_HPP_
diff --git a/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/Namespace.hpp b/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/Namespace.hpp
new file mode 100644
index 0000000..9cc2ca5
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/include/opImageFilter/action/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef OPIMAGEFILTERACTIONNAMESPACE_HPP_
+#define OPIMAGEFILTERACTIONNAMESPACE_HPP_
+
+namespace opImageFilter
+{
+/**
+ * @brief       The namespace opImageFilter::action contains several operators on image .
+ * @namespace   opImageFilter::action
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace action
+{
+
+}
+}
+#endif /* OPIMAGEFILTERACTIONNAMESPACE_HPP_ */
diff --git a/Bundles/LeafOp/opImageFilter/include/opImageFilter/config.hpp b/Bundles/LeafOp/opImageFilter/include/opImageFilter/config.hpp
new file mode 100644
index 0000000..6c70496
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/include/opImageFilter/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPIMAGEFILTER_CONFIG_HPP_
+#define _OPIMAGEFILTER_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef OPIMAGEFILTER_EXPORTS
+    #define OPIMAGEFILTER_API __declspec(dllexport)
+    #else
+    #define OPIMAGEFILTER_API __declspec(dllimport)
+    #endif
+
+    #define OPIMAGEFILTER_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef OPIMAGEFILTER_EXPORTS
+    #define OPIMAGEFILTER_API __attribute__ ((visibility("default")))
+    #define OPIMAGEFILTER_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define OPIMAGEFILTER_API __attribute__ ((visibility("hidden")))
+    #define OPIMAGEFILTER_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define OPIMAGEFILTER_API
+    #define OPIMAGEFILTER_CLASS_API
+
+#endif
+
+#endif //_OPIMAGEFILTER_CONFIG_HPP_
diff --git a/Bundles/LeafOp/opImageFilter/rc/plugin.xml b/Bundles/LeafOp/opImageFilter/rc/plugin.xml
new file mode 100644
index 0000000..8df4bc0
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/rc/plugin.xml
@@ -0,0 +1,14 @@
+<plugin id="opImageFilter" class="::opImageFilter::Plugin">
+    
+    <library name="opImageFilter" />
+
+    <requirement id="dataReg" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::opImageFilter::action::ImageFilter</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/LeafOp/opImageFilter/src/opImageFilter/Plugin.cpp b/Bundles/LeafOp/opImageFilter/src/opImageFilter/Plugin.cpp
new file mode 100644
index 0000000..32cea8d
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/src/opImageFilter/Plugin.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "opImageFilter/Plugin.hpp"
+
+namespace opImageFilter
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::opImageFilter::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace opImageFilter
diff --git a/Bundles/LeafOp/opImageFilter/src/opImageFilter/action/ImageFilter.cpp b/Bundles/LeafOp/opImageFilter/src/opImageFilter/action/ImageFilter.cpp
new file mode 100644
index 0000000..317fc43
--- /dev/null
+++ b/Bundles/LeafOp/opImageFilter/src/opImageFilter/action/ImageFilter.cpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "opImageFilter/action/ImageFilter.hpp"
+
+namespace opImageFilter
+{
+
+namespace action
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro(  ::fwGui::IActionSrv, ::opImageFilter::action::ImageFilter, ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+ImageFilter::ImageFilter() throw() :
+    m_image1UID(""),
+    m_image2UID("")
+{}
+
+//-----------------------------------------------------------------------------
+
+ImageFilter::~ImageFilter() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::starting() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::stopping() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+
+    m_image1UID = m_configuration->findConfigurationElement("imageIn")->getExistingAttributeValue("uid");
+    m_image2UID = m_configuration->findConfigurationElement("imageOut")->getExistingAttributeValue("uid");
+
+    OSLM_INFO( "ImageIn UID = " << m_image1UID);
+    OSLM_INFO( "ImageOut UID = " << m_image2UID);
+}
+
+//-----------------------------------------------------------------------------
+
+struct ThresholdFilter
+{
+    struct Parameter
+    {
+        double thresholdValue;
+        ::fwData::Image::sptr  imageIn;
+        ::fwData::Image::sptr  imageOut;
+    };
+
+    template<class PIXELTYPE>
+    void operator()(Parameter &param)
+    {
+        ::fwData::Image::sptr imageIn = param.imageIn;
+        ::fwData::Image::sptr imageOut = param.imageOut;
+        SLM_ASSERT("Sorry, image must be 3D", imageIn->getNumberOfDimensions() == 3 );
+        imageOut->copyInformation(imageIn);
+        imageOut->allocate();
+
+        ::fwComEd::helper::Image imageInHelper(imageIn);
+        ::fwComEd::helper::Image imageOutHelper(imageOut);
+        PIXELTYPE *buffer1 = (PIXELTYPE *)imageInHelper.getBuffer();
+        PIXELTYPE *buffer2 = (PIXELTYPE *)imageOutHelper.getBuffer();
+        const unsigned int NbPixels = imageIn->getSize()[0] * imageIn->getSize()[1] * imageIn->getSize()[2];
+        const PIXELTYPE ThresholdValue = ( PIXELTYPE )param.thresholdValue;
+        unsigned int i;
+        for( i=0 ; i<NbPixels ; ++i , ++buffer1, ++buffer2 )
+        {
+            *buffer2 = ( *buffer1 < ThresholdValue ) ? 0 : std::numeric_limits<PIXELTYPE>::max();
+        }
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    const double Threshold = 50.0;
+
+    ThresholdFilter::Parameter param;
+    OSLM_ASSERT("Image 1 not found. UID : " << m_image1UID, ::fwTools::fwID::exist(m_image1UID)) ;
+    param.imageIn = ::fwData::Image::dynamicCast( ::fwTools::fwID::getObject(m_image1UID) ) ;
+    OSLM_ASSERT("Image 2 not found. UID : " << m_image2UID, ::fwTools::fwID::exist(m_image2UID)) ;
+    param.imageOut = ::fwData::Image::dynamicCast( ::fwTools::fwID::getObject(m_image2UID) ) ;
+    param.thresholdValue = Threshold;
+
+    ::fwTools::DynamicType type = param.imageIn->getPixelType();
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , ThresholdFilter >::invoke( type , param );
+
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::NEW_IMAGE ) ;
+//  msg->addEvent( ::fwComEd::ImageMsg::BUFFER ) ;
+
+    // Notify message to all service listeners
+    ::fwServices::IEditionService::notify(this->getSptr(), param.imageOut, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageFilter::info ( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace action
+} // namespace opImageFilter
diff --git a/Bundles/LeafOp/opSofa/CMakeLists.txt b/Bundles/LeafOp/opSofa/CMakeLists.txt
new file mode 100644
index 0000000..1c9b661
--- /dev/null
+++ b/Bundles/LeafOp/opSofa/CMakeLists.txt
@@ -0,0 +1,62 @@
+if(CLASSIC_INSTALL)
+find_package (SOFA)
+if(SOFA_FOUND)
+    fwBundle(opSofa 0.1)
+
+    fwUse(
+        fwComEd
+        fwCore
+        fwData
+        fwDataIO
+        fwGui
+        fwGuiQt
+        fwMedData
+        fwRenderVTK
+        fwRuntime
+        fwServices
+        fwTools
+        fwVtkIO
+
+        visuVTKAdaptor
+        gui
+        io
+    )
+    fwUseForwardInclude(
+        fwComEd
+        fwData
+        fwGui
+        fwRenderVTK
+        fwRuntime
+        fwServices
+        fwTools
+
+        gui
+        io
+    )
+
+    add_definitions('-DSOFA_HAVE_GLEW -DSOFA_HAVE_ZLIB -DSOFA_HAVE_PNG')
+
+    find_package (Boost COMPONENTS filesystem REQUIRED)
+    find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+    include(${QT_USE_FILE})
+
+    find_package(OpenGL)
+
+    fwForwardInclude(
+        ${Boost_INCLUDE_DIRS} 
+        ${QT_INCLUDE_DIR}
+        ${SOFA_INCLUDE_DIRS}
+        ${OPENGL_INCLUDE_DIR}
+        )
+    fwLink(
+        ${QT_LIBRARIES}
+        ${Boost_LIBRARIES}
+        ${SOFA_LIBRARIES}
+        ${OPENGL_LIBRARIES}
+        )
+
+    set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+else(SOFA_FOUND)
+    message(WARNING "Required package Sofa not found, bundle 'opSofa' disabled.")
+endif(SOFA_FOUND)
+endif()
diff --git a/Bundles/LeafOp/opSofa/Properties.cmake b/Bundles/LeafOp/opSofa/Properties.cmake
new file mode 100644
index 0000000..3e90f50
--- /dev/null
+++ b/Bundles/LeafOp/opSofa/Properties.cmake
@@ -0,0 +1,23 @@
+
+set( NAME opSofa )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES
+    fwComEd
+    fwCore
+    fwData
+    fwDataIO
+    fwGui
+    fwGuiQt
+    fwMedData
+    fwRenderVTK
+    fwRuntime
+    fwServices
+    fwTools
+    fwVtkIO
+    visuVTKAdaptor
+    gui
+    io
+    )
+set( REQUIREMENTS )
+
diff --git a/Bundles/LeafOp/opVTKMesh/CMakeLists.txt b/Bundles/LeafOp/opVTKMesh/CMakeLists.txt
new file mode 100644
index 0000000..9483b1e
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/CMakeLists.txt
@@ -0,0 +1,20 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+    fwServices
+)
+
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    vtkWidgets
+    )
+
diff --git a/Bundles/LeafOp/opVTKMesh/COPYING b/Bundles/LeafOp/opVTKMesh/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafOp/opVTKMesh/COPYING.LESSER b/Bundles/LeafOp/opVTKMesh/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafOp/opVTKMesh/Properties.cmake b/Bundles/LeafOp/opVTKMesh/Properties.cmake
new file mode 100644
index 0000000..f48ba9e
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME opVTKMesh )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwData fwGui fwMedData fwRuntime fwServices fwTools fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafOp/opVTKMesh/bin/build.options b/Bundles/LeafOp/opVTKMesh/bin/build.options
new file mode 100644
index 0000000..a29b3de
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['vtkWidgets','boost']
+LIB     = [
+          'fwTools_0-1',
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwVtkIO_0-1',
+          'fwGui_0-1',
+          ]
+BUNDLES = ['gui_0-1']
+
+
+
+
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/IMesher.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/IMesher.hpp
new file mode 100644
index 0000000..49e2277
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/IMesher.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef OPVTKMESH_IMESHER_HPP_
+#define OPVTKMESH_IMESHER_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "opVTKMesh/config.hpp"
+
+namespace opVTKMesh
+{
+
+/**
+ * @brief   This interface defines mesher service API.
+ * Does nothing particularly, to be implemented by mesher services.
+ *
+ * @class  IMesher
+ * 
+ * @date   2009-2010.
+ */
+class OPVTKMESH_CLASS_API IMesher : public ::fwServices::IService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (IMesher)(::fwServices::IService) ) ;
+
+    ///@brief IMesher constructor. Do nothing.
+    OPVTKMESH_API IMesher();
+
+    ///@brief IMesher destructor. Do nothing.
+    OPVTKMESH_API virtual ~IMesher();
+
+};
+
+}
+
+#endif // OPVTKMESH_IMESHER_HPP_
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Namespace.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Namespace.hpp
new file mode 100644
index 0000000..44c9266
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef OPVTKMESHNAMESPACE_HPP_
+#define OPVTKMESHNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace opVTKMesh contains interface class for mesh and an implementation of a VTK mesher.
+ * @namespace   opVTKMesh
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace opVTKMesh
+{
+
+}
+#endif /* OPVTKMESHNAMESPACE_HPP_ */
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Plugin.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Plugin.hpp
new file mode 100644
index 0000000..47d2e92
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/Plugin.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPVTKMESH_PLUGIN_HPP_
+#define _OPVTKMESH_PLUGIN_HPP_
+
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace opVTKMesh
+{
+
+
+/**
+ * @brief   Implements a plugin for the opVTKMesh bundle.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+
+} // namespace opVTKMesh
+
+
+#endif //_OPVTKMESH_PLUGIN_HPP_
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/SVTKMesher.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/SVTKMesher.hpp
new file mode 100644
index 0000000..21452e8
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/SVTKMesher.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPVTKMESH_SVTKMESHER_HPP_
+#define _OPVTKMESH_SVTKMESHER_HPP_
+
+#include <string>
+
+#include "opVTKMesh/IMesher.hpp"
+#include "opVTKMesh/config.hpp"
+
+namespace opVTKMesh
+{
+
+class OPVTKMESH_CLASS_API SVTKMesher : public ::opVTKMesh::IMesher
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SVTKMesher)(::opVTKMesh::IMesher) ) ;
+
+    OPVTKMESH_API SVTKMesher() throw() ;
+
+    OPVTKMESH_API virtual ~SVTKMesher() throw() ;
+
+protected:
+
+    OPVTKMESH_API virtual void starting() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API virtual void stopping() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API virtual void receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Declare the configuration to define percent of reduction, image source and ModelSeries destination.
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::opVTKMesh::SVTKMesher" type="::opVTKMesh::IMesher">
+           <config>
+                <percentReduction>80</percentReduction>
+                <image>IMAGE_KEY</image>
+                <modelSeries>MODELSERIES_KEY</modelSeries>
+            </config>
+       </service>
+        @endverbatim
+     */
+    OPVTKMESH_API virtual void configuring() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API virtual void updating() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API virtual  void info ( std::ostream &_sstream ) ;
+
+private :
+
+    unsigned int m_reduction;
+    std::string m_imageKey;
+    std::string m_modelSeriesKey;
+
+};
+
+} // namespace opVTKMesh
+
+
+#endif // _OPVTKMESH_SVTKMESHER_HPP_
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/Namespace.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/Namespace.hpp
new file mode 100644
index 0000000..c69d9f3
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef OPVTKMESHACTIONNAMESPACE_HPP_
+#define OPVTKMESHACTIONNAMESPACE_HPP_
+
+namespace opVTKMesh
+{
+/**
+ * @brief       The namespace opVTKMesh::action contains operator to create mesh with VTK .
+ * @namespace   opVTKMesh::action
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace action
+{
+
+}
+}
+#endif /* OPVTKMESHACTIONNAMESPACE_HPP_ */
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/VTKMeshCreation.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/VTKMeshCreation.hpp
new file mode 100644
index 0000000..b59ab3c
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/action/VTKMeshCreation.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPVTKMESH_ACTION_VTKMESHCREATION_HPP_
+#define _OPVTKMESH_ACTION_VTKMESHCREATION_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "opVTKMesh/config.hpp"
+
+namespace opVTKMesh
+{
+
+namespace action
+{
+
+class OPVTKMESH_CLASS_API VTKMeshCreation : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (VTKMeshCreation)(::fwGui::IActionSrv) ) ;
+
+    OPVTKMESH_API VTKMeshCreation() throw() ;
+
+    OPVTKMESH_API virtual ~VTKMeshCreation() throw() ;
+
+protected:
+
+    OPVTKMESH_API void starting() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API void stopping() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API void receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API void configuring() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API void updating() throw ( ::fwTools::Failed );
+
+    OPVTKMESH_API void info ( std::ostream &_sstream ) ;
+
+private :
+
+    std::string m_imageUID;
+    std::string m_meshUID;
+    unsigned int m_reduction;
+};
+
+
+} // namespace action
+} // namespace opVTKMesh
+
+
+#endif // _OPVTKMESH_ACTION_VTKMESHCREATION_HPP_
diff --git a/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/config.hpp b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/config.hpp
new file mode 100644
index 0000000..2c9ac38
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/include/opVTKMesh/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _OPVTKMESH_CONFIG_HPP_
+#define _OPVTKMESH_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef OPVTKMESH_EXPORTS
+    #define OPVTKMESH_API __declspec(dllexport)
+    #else
+    #define OPVTKMESH_API __declspec(dllimport)
+    #endif
+
+    #define OPVTKMESH_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef OPVTKMESH_EXPORTS
+    #define OPVTKMESH_API __attribute__ ((visibility("default")))
+    #define OPVTKMESH_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define OPVTKMESH_API __attribute__ ((visibility("hidden")))
+    #define OPVTKMESH_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define OPVTKMESH_API
+    #define OPVTKMESH_CLASS_API
+
+#endif
+
+#endif //_OPVTKMESH_CONFIG_HPP_
diff --git a/Bundles/LeafOp/opVTKMesh/rc/plugin.xml b/Bundles/LeafOp/opVTKMesh/rc/plugin.xml
new file mode 100644
index 0000000..06f9929
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/rc/plugin.xml
@@ -0,0 +1,20 @@
+<plugin id="opVTKMesh" class="::opVTKMesh::Plugin">
+
+    <library name="opVTKMesh" />
+
+    <requirement id="dataReg" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::opVTKMesh::action::VTKMeshCreation</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::opVTKMesh::IMesher</type>
+        <service>::opVTKMesh::SVTKMesher</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/IMesher.cpp b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/IMesher.cpp
new file mode 100644
index 0000000..b94bc91
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/IMesher.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "opVTKMesh/IMesher.hpp"
+
+namespace opVTKMesh
+{
+
+//-----------------------------------------------------------------------------
+
+IMesher::IMesher()
+{}
+
+//-----------------------------------------------------------------------------
+
+IMesher::~IMesher()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/Plugin.cpp b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/Plugin.cpp
new file mode 100644
index 0000000..0f18ede
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/Plugin.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "opVTKMesh/Plugin.hpp"
+
+namespace opVTKMesh
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::opVTKMesh::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace opVTKMesh
diff --git a/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/SVTKMesher.cpp b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/SVTKMesher.cpp
new file mode 100644
index 0000000..2eaaeca
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/SVTKMesher.cpp
@@ -0,0 +1,189 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/lexical_cast.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/ModelSeriesMsg.hpp>
+
+#include <fwVtkIO/helper/Mesh.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkDiscreteMarchingCubes.h>
+#include <vtkWindowedSincPolyDataFilter.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkDecimatePro.h>
+#include <vtkSmartPointer.h>
+#include <vtkImageData.h>
+
+#include "opVTKMesh/SVTKMesher.hpp"
+
+namespace opVTKMesh
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::opVTKMesh::IMesher , ::opVTKMesh::SVTKMesher , ::fwData::Composite ) ;
+
+//-----------------------------------------------------------------------------
+
+SVTKMesher::SVTKMesher() throw() :
+    m_reduction(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+SVTKMesher::~SVTKMesher() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::starting() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::stopping() throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::configuring() throw ( ::fwTools::Failed )
+{
+    const ::fwServices::IService::ConfigType& srvConfig = this->getConfigTree();
+
+    SLM_ASSERT("You must have one <config/> element.", srvConfig.get_child("service").count("config") == 1 );
+
+    const ::fwServices::IService::ConfigType& config = srvConfig.get_child("service.config");
+
+    SLM_ASSERT("You must have one <percentReduction/> element.", config.count("percentReduction") == 1);
+    SLM_ASSERT("You must have one <image/> element.", config.count("image") == 1);
+    SLM_ASSERT("You must have one <modelSeries/> element.", config.count("modelSeries") == 1);
+
+    const ::fwServices::IService::ConfigType& reductionCfg = config.get_child("percentReduction");
+    const ::fwServices::IService::ConfigType& imageCfg = config.get_child("image");
+    const ::fwServices::IService::ConfigType& modelSeriesCfg = config.get_child("modelSeries");
+
+    m_reduction = reductionCfg.get_value<unsigned int>();
+    m_imageKey = imageCfg.get_value<std::string>();
+    m_modelSeriesKey = modelSeriesCfg.get_value<std::string>();
+}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::updating() throw ( ::fwTools::Failed )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    ::fwData::Composite::iterator iterImg = composite->find(m_imageKey);
+    ::fwData::Composite::iterator iterModelSeries = composite->find(m_modelSeriesKey);
+
+    SLM_ASSERT("Key '"+m_imageKey+"' not found in composite.", iterImg != composite->end());
+    SLM_ASSERT("Key '"+m_modelSeriesKey+"' not found in composite.", iterModelSeries != composite->end());
+
+    ::fwData::Image::sptr image = ::fwData::Image::dynamicCast(iterImg->second);
+    SLM_ASSERT("Image '"+m_imageKey+"' is not valid.", image);
+
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(iterModelSeries->second);
+    SLM_ASSERT("ModelSeries '"+m_modelSeriesKey+"' is not valid.", modelSeries);
+
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+
+    // vtk img
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( image, vtkImage );
+
+    // contour filter
+    vtkSmartPointer< vtkDiscreteMarchingCubes > contourFilter = vtkSmartPointer< vtkDiscreteMarchingCubes >::New();
+    contourFilter->SetInput(vtkImage);
+    contourFilter->SetValue(0, 255);
+    contourFilter->ComputeScalarsOn();
+    contourFilter->ComputeNormalsOn();
+    contourFilter->Update();
+
+    // smooth filter
+    vtkSmartPointer< vtkWindowedSincPolyDataFilter > smoothFilter = vtkSmartPointer< vtkWindowedSincPolyDataFilter >::New();
+    smoothFilter->SetInput(contourFilter->GetOutput());
+    smoothFilter->SetNumberOfIterations( 50 );
+    smoothFilter->BoundarySmoothingOn();
+    smoothFilter->SetPassBand ( 0.1 );
+    smoothFilter->SetFeatureAngle(120.0);
+    smoothFilter->SetEdgeAngle(90);
+    smoothFilter->FeatureEdgeSmoothingOn();
+    smoothFilter->Update();
+
+
+    // Get polyData
+    vtkSmartPointer< vtkPolyData > polyData;
+
+    // decimate filter
+    unsigned int reduction = m_reduction;
+    if( reduction > 0 )
+    {
+        vtkSmartPointer< vtkDecimatePro > decimate = vtkSmartPointer< vtkDecimatePro >::New();
+        decimate->SetInput( smoothFilter->GetOutput() );
+        decimate->SetTargetReduction( reduction/100.0 );
+        decimate->PreserveTopologyOff();
+        decimate->SplittingOn();
+        decimate->BoundaryVertexDeletionOn();
+        decimate->SetSplitAngle( 120 );
+        decimate->Update();
+        polyData = decimate->GetOutput();
+        OSLM_TRACE("final GetNumberOfCells = " << polyData->GetNumberOfCells());
+        ::fwVtkIO::helper::Mesh::fromVTKMesh( polyData, mesh);
+    }
+    else
+    {
+        polyData = smoothFilter->GetOutput();
+        OSLM_TRACE("final GetNumberOfCells = " << polyData->GetNumberOfCells());
+        ::fwVtkIO::helper::Mesh::fromVTKMesh( polyData, mesh);
+    }
+
+
+
+    ::fwData::Reconstruction::sptr reconstruction = ::fwData::Reconstruction::New();
+
+    static unsigned int organNumber = 0;
+    ++organNumber;
+    reconstruction->setCRefOrganName("OrganMesher_VTK_" + ::boost::lexical_cast<std::string>(organNumber));
+    reconstruction->setCRefStructureType("OrganType");
+    reconstruction->setIsVisible(true);
+    // Set Triangular Mesh
+    reconstruction->setMesh(mesh);
+
+    ::fwMedData::ModelSeries::ReconstructionVectorType recs = modelSeries->getReconstructionDB();
+    recs.push_back(reconstruction);
+    modelSeries->setReconstructionDB(recs);
+
+    /// Notification
+    ::fwComEd::ModelSeriesMsg::sptr msg = ::fwComEd::ModelSeriesMsg::New();
+    msg->addEvent( ::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION ) ;
+    ::fwServices::IEditionService::notify( this->getSptr(), modelSeries, msg );
+}
+
+//-----------------------------------------------------------------------------
+
+void SVTKMesher::info ( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/action/VTKMeshCreation.cpp b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/action/VTKMeshCreation.cpp
new file mode 100644
index 0000000..80fc228
--- /dev/null
+++ b/Bundles/LeafOp/opVTKMesh/src/opVTKMesh/action/VTKMeshCreation.cpp
@@ -0,0 +1,181 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwVtkIO/helper/Mesh.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkDiscreteMarchingCubes.h>
+#include <vtkWindowedSincPolyDataFilter.h>
+#include <vtkThreshold.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkDecimatePro.h>
+#include <vtkGeometryFilter.h>
+#include <vtkSmartPointer.h>
+#include <vtkImageData.h>
+
+#include "opVTKMesh/action/VTKMeshCreation.hpp"
+
+namespace opVTKMesh
+{
+
+namespace action
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::opVTKMesh::action::VTKMeshCreation , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+VTKMeshCreation::VTKMeshCreation() throw() :
+    m_imageUID(""),
+    m_meshUID(""),
+    m_reduction(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+VTKMeshCreation::~VTKMeshCreation() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::starting() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::stopping() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::receiving( ::fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed )
+{}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+
+    SLM_ASSERT( "Mesh UID andImage UID must be defined in the service configuration",  m_configuration->findConfigurationElement("image") && m_configuration->findConfigurationElement("mesh") );
+
+
+    m_imageUID = m_configuration->findConfigurationElement("image")->getExistingAttributeValue("uid");
+
+    m_meshUID = m_configuration->findConfigurationElement("mesh")->getExistingAttributeValue("uid");
+
+    if (m_configuration->findConfigurationElement("percentReduction") && m_configuration->findConfigurationElement("percentReduction")->hasAttribute("value"))
+    {
+        std::string reduce = m_configuration->findConfigurationElement("percentReduction")->getExistingAttributeValue("value");
+        m_reduction = boost::lexical_cast<unsigned int>(reduce);
+    }
+
+    OSLM_INFO( "Image UID = " << m_imageUID);
+    OSLM_INFO( "Mesh UID = " << m_meshUID);
+    OSLM_INFO( "Reduction value = " << m_reduction);
+}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    /// Retreive object
+    OSLM_ASSERT("Not found the image defined by uid : " << m_imageUID, ::fwTools::fwID::exist(m_imageUID)) ;
+    ::fwData::Image::sptr pImage = ::fwData::Image::dynamicCast( ::fwTools::fwID::getObject(m_imageUID) ) ;
+    OSLM_ASSERT("Not found the mesh defined by uid : " << m_meshUID, ::fwTools::fwID::exist(m_meshUID)) ;
+    ::fwData::Mesh::sptr pMesh = ::fwData::Mesh::dynamicCast( ::fwTools::fwID::getObject(m_meshUID) ) ;
+
+    ///VTK Mesher
+
+    // vtk img
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( pImage, vtkImage );
+
+    // contour filter
+    vtkSmartPointer< vtkDiscreteMarchingCubes > contourFilter = vtkSmartPointer< vtkDiscreteMarchingCubes >::New();
+    contourFilter->SetInput(vtkImage);
+    contourFilter->SetValue(0, 255);
+    contourFilter->ComputeScalarsOn();
+    contourFilter->ComputeNormalsOn();
+    contourFilter->Update();
+
+    // smooth filter
+    vtkSmartPointer< vtkWindowedSincPolyDataFilter > smoothFilter = vtkSmartPointer< vtkWindowedSincPolyDataFilter >::New();
+    smoothFilter->SetInput(contourFilter->GetOutput());
+    smoothFilter->SetNumberOfIterations( 50 );
+    smoothFilter->BoundarySmoothingOn();
+    smoothFilter->SetPassBand ( 0.1 );
+    smoothFilter->SetFeatureAngle(120.0);
+    smoothFilter->SetEdgeAngle(90);
+    smoothFilter->FeatureEdgeSmoothingOn();
+    smoothFilter->Update();
+
+
+    // Get polyData
+    vtkSmartPointer< vtkPolyData > polyData;
+
+    // decimate filter
+    unsigned int reduction = m_reduction;
+    if( reduction > 0 )
+    {
+        vtkSmartPointer< vtkDecimatePro > decimate = vtkSmartPointer< vtkDecimatePro >::New();
+        decimate->SetInput( smoothFilter->GetOutput() );
+        decimate->SetTargetReduction( reduction/100.0 );
+        decimate->PreserveTopologyOff();
+        decimate->SplittingOn();
+        decimate->BoundaryVertexDeletionOn();
+        decimate->SetSplitAngle( 120 );
+        decimate->Update();
+        polyData = decimate->GetOutput();
+        OSLM_TRACE("final GetNumberOfCells = " << polyData->GetNumberOfCells());
+        ::fwVtkIO::helper::Mesh::fromVTKMesh( polyData, pMesh);
+    }
+    else
+    {
+        polyData = smoothFilter->GetOutput();
+        OSLM_TRACE("final GetNumberOfCells = " << polyData->GetNumberOfCells());
+        ::fwVtkIO::helper::Mesh::fromVTKMesh( polyData, pMesh);
+    }
+
+
+//    OSLM_TRACE("final GetNumberOfCells = " << polyData->GetNumberOfCells());
+//    bool res = ::fwVtkIO::fromVTKMesh( polyData, pMesh);
+
+    /// Notification
+    ::fwComEd::MeshMsg::sptr msg = ::fwComEd::MeshMsg::New();;
+    msg->addEvent( ::fwComEd::MeshMsg::NEW_MESH ) ;
+    ::fwServices::IEditionService::notify( this->getSptr(), pMesh, msg );
+}
+
+//-----------------------------------------------------------------------------
+
+void VTKMeshCreation::info ( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+} }
diff --git a/Bundles/LeafPatch/patchMedicalData/CMakeLists.txt b/Bundles/LeafPatch/patchMedicalData/CMakeLists.txt
new file mode 100644
index 0000000..91baede
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/CMakeLists.txt
@@ -0,0 +1,4 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
diff --git a/Bundles/LeafPatch/patchMedicalData/COPYING b/Bundles/LeafPatch/patchMedicalData/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafPatch/patchMedicalData/COPYING.LESSER b/Bundles/LeafPatch/patchMedicalData/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafPatch/patchMedicalData/Properties.cmake b/Bundles/LeafPatch/patchMedicalData/Properties.cmake
new file mode 100644
index 0000000..2e0e20f
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME patchMedicalData )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwMDSemanticPatch fwRuntime fwStructuralPatch )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafPatch/patchMedicalData/bin/build.options b/Bundles/LeafPatch/patchMedicalData/bin/build.options
new file mode 100644
index 0000000..13c0676
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/bin/build.options
@@ -0,0 +1,3 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = ['fwRuntime_0-3','fwStructuralPatch_0-1','fwMDSemanticPatch_0-1']
diff --git a/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/Plugin.hpp b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/Plugin.hpp
new file mode 100644
index 0000000..2799e70
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/Plugin.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _PATCHMEDICALDATA_PLUGIN_HPP_
+#define _PATCHMEDICALDATA_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "patchMedicalData/config.hpp"
+
+namespace patchMedicalData
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+struct PATCHMEDICALDATA_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /// Destructor. Do nothing.
+    PATCHMEDICALDATA_API ~Plugin() throw();
+
+    /**
+     * @brief Overrides start method. Object declarations.
+     * @todo All data are not register in this method, what data must be registered ?
+     */
+    PATCHMEDICALDATA_API void start() throw( ::fwRuntime::RuntimeException );
+
+    /// Overrides stop method. Do nothing
+    PATCHMEDICALDATA_API void stop() throw();
+
+};
+
+} // namespace patchMedicalData
+
+#endif //_PATCHMEDICALDATA_PLUGIN_HPP_
diff --git a/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/config.hpp b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/config.hpp
new file mode 100644
index 0000000..fb6cf90
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _PATCHMEDICALDATA_CONFIG_HPP_
+#define _PATCHMEDICALDATA_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef PATCHMEDICALDATA_EXPORTS
+    #define PATCHMEDICALDATA_API __declspec(dllexport)
+    #else
+    #define PATCHMEDICALDATA_API __declspec(dllimport)
+    #endif
+
+    #define PATCHMEDICALDATA_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef PATCHMEDICALDATA_EXPORTS
+    #define PATCHMEDICALDATA_API __attribute__ ((visibility("default")))
+    #define PATCHMEDICALDATA_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define PATCHMEDICALDATA_API __attribute__ ((visibility("hidden")))
+    #define PATCHMEDICALDATA_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define PATCHMEDICALDATA_API
+    #define PATCHMEDICALDATA_CLASS_API
+
+#endif
+
+#endif //PATCHMEDICALDATA_API
diff --git a/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/namespace.hpp b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/namespace.hpp
new file mode 100644
index 0000000..67a3e65
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/include/patchMedicalData/namespace.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __PATCHMEDICALDATA_NAMESPACE_HPP__
+#define __PATCHMEDICALDATA_NAMESPACE_HPP__
+
+/**
+ * @brief       The bundle patchMedicalData allows to load patches from fwStructuralPatch and fwMDSemanticPatch library.
+ * @namespace   patchMedicalData
+ */
+namespace patchMedicalData
+{
+
+}
+#endif /* __PATCHMEDICALDATA_NAMESPACE_HPP__ */
diff --git a/Bundles/LeafPatch/patchMedicalData/rc/plugin.xml b/Bundles/LeafPatch/patchMedicalData/rc/plugin.xml
new file mode 100644
index 0000000..1cce200
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/rc/plugin.xml
@@ -0,0 +1,3 @@
+<plugin id="patchMedicalData" class="::patchMedicalData::Plugin" >
+    <library name="patchMedicalData" />
+</plugin>
diff --git a/Bundles/LeafPatch/patchMedicalData/src/patchMedicalData/Plugin.cpp b/Bundles/LeafPatch/patchMedicalData/src/patchMedicalData/Plugin.cpp
new file mode 100644
index 0000000..90f87c8
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/src/patchMedicalData/Plugin.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwStructuralPatch/PatchLoader.hpp>
+
+#include <fwMDSemanticPatch/PatchLoader.hpp>
+
+#include "patchMedicalData/Plugin.hpp"
+
+namespace patchMedicalData
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::patchMedicalData::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    //Hack: force link with fwStructuralPatch
+    ::fwStructuralPatch::PatchLoader::loadPatches();
+
+    /* Force link with fwMDSemanticPatch and compute version/link tables
+     * for fwMDSemanticPatch data.
+     */
+    ::fwMDSemanticPatch::PatchLoader::loadPatches();
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace patchMedicalData
diff --git a/Bundles/LeafPatch/patchMedicalData/test/CMakeLists.txt b/Bundles/LeafPatch/patchMedicalData/test/CMakeLists.txt
new file mode 100644
index 0000000..b23b5b0
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/CMakeLists.txt
@@ -0,0 +1,8 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/Bundles/LeafPatch/patchMedicalData/test/Properties.cmake b/Bundles/LeafPatch/patchMedicalData/test/Properties.cmake
new file mode 100644
index 0000000..9fd0224
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME patchMedicalDataTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwTest fwCore fwTools fwData fwDataTools fwStructuralPatch fwMDSemanticPatch )
+set( REQUIREMENTS dataReg servicesReg ioAtoms gui patchMedicalData )
+
+set(CPPUNITTEST_OPTIONS BUNDLE patchMedicalData WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafPatch/patchMedicalData/test/cppunit.options b/Bundles/LeafPatch/patchMedicalData/test/cppunit.options
new file mode 100644
index 0000000..886cb95
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/cppunit.options
@@ -0,0 +1,21 @@
+CLASSTEST=[
+          'PatchTest',
+          ]
+
+CONSOLE = 'yes'
+LOGLEVEL='trace'
+
+USE = ['boost']
+
+LIB = ['fwData_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwDataTools_0-1',
+       'fwTest_0-1',
+       'fwStructuralPatch_0-1',
+       'fwMDSemanticPatch_0-1']
+
+BUNDLES = []
+
+REQUIREMENTS = ['dataReg_0-1','servicesReg_0-1','ioAtoms_0-1','gui_0-1']
+
diff --git a/Bundles/LeafPatch/patchMedicalData/test/tu/include/PatchTest.hpp b/Bundles/LeafPatch/patchMedicalData/test/tu/include/PatchTest.hpp
new file mode 100644
index 0000000..b7ff4ca
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/tu/include/PatchTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __PATCHMEDICALDATA_TEST_TU_PATCHTEST_HPP__
+#define __PATCHMEDICALDATA_TEST_TU_PATCHTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwRuntime
+{
+    class EConfigurationElement;
+}
+
+namespace patchMedicalData
+{
+namespace ut
+{
+
+class PatchTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( PatchTest );
+    CPPUNIT_TEST( patchMedicalDataTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void patchMedicalDataTest();
+};
+
+} //namespace ut
+} //namespace patchMedicalData
+
+#endif //__PATCHMEDICALDATA_TEST_TU_PATCHTEST_HPP__
+
diff --git a/Bundles/LeafPatch/patchMedicalData/test/tu/rc/profile.xml b/Bundles/LeafPatch/patchMedicalData/test/tu/rc/profile.xml
new file mode 100644
index 0000000..460e297
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/tu/rc/profile.xml
@@ -0,0 +1,16 @@
+<profile name="MedicalDataPatchTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioAtoms" version="0-1" />
+    <activate id="patchMedicalData" version="0-1" />
+
+    <start id="patchMedicalData" />
+    <start id="ioAtoms" />
+    
+</profile>
diff --git a/Bundles/LeafPatch/patchMedicalData/test/tu/src/PatchTest.cpp b/Bundles/LeafPatch/patchMedicalData/test/tu/src/PatchTest.cpp
new file mode 100644
index 0000000..a857e1f
--- /dev/null
+++ b/Bundles/LeafPatch/patchMedicalData/test/tu/src/PatchTest.cpp
@@ -0,0 +1,206 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/System.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwTest/Data.hpp>
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataTools/Image.hpp>
+
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+
+#include "PatchTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::patchMedicalData::ut::PatchTest );
+
+namespace patchMedicalData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void PatchTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void PatchTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+template <typename T>
+SPTR(T) read(const ::fwRuntime::EConfigurationElement::sptr &srvCfg, const std::string &reader)
+{
+
+    typename T::sptr readObj = T::New();
+    ::fwServices::IService::sptr readerSrv = ::fwServices::registry::ServiceFactory::getDefault()->create( reader );
+    CPPUNIT_ASSERT(readerSrv);
+
+    ::fwServices::OSR::registerService( readObj , readerSrv );
+    readerSrv->setConfiguration(srvCfg);
+    readerSrv->configure();
+    readerSrv->start();
+    readerSrv->update();
+    readerSrv->stop();
+    ::fwServices::OSR::unregisterService( readerSrv );
+
+    return readObj;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::Series::sptr getACHSeries( const ::fwMedData::SeriesDB::sptr & sdb )
+{
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, sdb->getContainer() )
+    {
+        if ( series->getPatient()->getName() == "CHARNOZ ARNAUD" )
+        {
+            return series;
+        }
+    }
+
+    return ::fwMedData::Series::sptr();
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< ::fwMedData::Series::sptr > getOtherSeries( const ::fwMedData::SeriesDB::sptr & sdb )
+{
+    std::vector< ::fwMedData::Series::sptr > otherSeries;
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, sdb->getContainer() )
+    {
+        if ( series->getPatient()->getName() != "CHARNOZ ARNAUD" )
+        {
+            otherSeries.push_back( series );
+        }
+    }
+
+    return otherSeries;
+}
+
+//------------------------------------------------------------------------------
+
+void PatchTest::patchMedicalDataTest()
+{
+    const ::boost::filesystem::path file = ::fwTest::Data::dir() /"fw4spl/patch/md_1.jsonz";
+
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+
+    ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+    fileCfg->setValue(file.string());
+    srvCfg->addConfigurationElement(fileCfg);
+
+    //<patcher context="..." version="..." />
+    ::fwRuntime::EConfigurationElement::sptr patcherCfg = ::fwRuntime::EConfigurationElement::New("patcher");
+    patcherCfg->setAttributeValue("context","MedicalData");
+    patcherCfg->setAttributeValue("version","V2");
+    srvCfg->addConfigurationElement(patcherCfg);
+
+    ::fwMedData::SeriesDB::sptr sdb = read< ::fwMedData::SeriesDB >(srvCfg, "::ioAtoms::SReader" );
+
+    // check data
+    CPPUNIT_ASSERT_EQUAL( (size_t) 3, sdb->size() );
+
+    // Check ACH Data
+    ::fwMedData::Series::sptr series = getACHSeries( sdb );
+    CPPUNIT_ASSERT( series );
+    CPPUNIT_ASSERT( ::fwMedData::ImageSeries::dynamicCast(series) );
+    CPPUNIT_ASSERT_EQUAL(std::string("1.2.392.200036.9116.2.6.1.48.1211418863.1225184516.765855"),
+            series->getInstanceUID());
+    CPPUNIT_ASSERT_EQUAL(std::string("20081028"), series->getDate());
+    CPPUNIT_ASSERT_EQUAL(std::string("174446"), series->getTime());
+    CPPUNIT_ASSERT_EQUAL(std::string("Original image"),series->getDescription());
+    CPPUNIT_ASSERT_EQUAL(std::string("CT"), series->getModality());
+
+
+    ::fwMedData::Patient::sptr patient = series->getPatient();
+    CPPUNIT_ASSERT( patient );
+    CPPUNIT_ASSERT_EQUAL(std::string("12592 ARTHRO GENOU  G"), patient->getPatientId());
+    CPPUNIT_ASSERT_EQUAL(std::string("19790618"), patient->getBirthdate());
+    CPPUNIT_ASSERT_EQUAL(std::string("M"), patient->getSex());
+
+
+    ::fwMedData::Study::sptr study = series->getStudy();
+    CPPUNIT_ASSERT( study );
+    CPPUNIT_ASSERT_EQUAL(std::string("1.2.392.200036.9116.2.6.1.48.1211418863.1225183167.375775"),
+            study->getInstanceUID());
+    CPPUNIT_ASSERT_EQUAL(std::string("20081028"), study->getDate());
+    CPPUNIT_ASSERT_EQUAL(std::string("174446"), study->getTime());
+    CPPUNIT_ASSERT_EQUAL(std::string(""), study->getReferringPhysicianName());
+    CPPUNIT_ASSERT_EQUAL(std::string(""), study->getDescription());
+    CPPUNIT_ASSERT_EQUAL(std::string(""), study->getPatientAge());
+
+    ::fwMedData::Equipment::sptr equipment = series->getEquipment();
+    CPPUNIT_ASSERT( equipment );
+    CPPUNIT_ASSERT_EQUAL(std::string("SCANNER DE LA MODER"), equipment->getInstitutionName());
+
+    // Test split between meshes and image
+    std::vector< ::fwMedData::Series::sptr > otherSeries = getOtherSeries( sdb );
+    CPPUNIT_ASSERT_EQUAL( (size_t) 2, otherSeries.size() );
+    CPPUNIT_ASSERT( otherSeries[0]->getStudy()     !=  otherSeries[1]->getStudy() );
+    CPPUNIT_ASSERT( otherSeries[0]->getPatient()   !=  otherSeries[1]->getPatient() );
+    CPPUNIT_ASSERT( otherSeries[0]->getEquipment() !=  otherSeries[1]->getEquipment() );
+
+    ::fwMedData::Patient::sptr p1 = otherSeries[0]->getPatient();
+    ::fwMedData::Patient::sptr p2 = otherSeries[1]->getPatient();
+    CPPUNIT_ASSERT_EQUAL( p1->getName(), p2->getName() );
+    CPPUNIT_ASSERT_EQUAL( p1->getPatientId(), p2->getPatientId() );
+    CPPUNIT_ASSERT_EQUAL( p1->getBirthdate(), p2->getBirthdate() );
+    CPPUNIT_ASSERT_EQUAL( p1->getSex(), p2->getSex() );
+
+    ::fwMedData::Study::sptr s1 = otherSeries[0]->getStudy();
+    ::fwMedData::Study::sptr s2 = otherSeries[1]->getStudy();
+    CPPUNIT_ASSERT_EQUAL( s1->getInstanceUID(), s2->getInstanceUID() );
+    CPPUNIT_ASSERT_EQUAL( s1->getDate(), s2->getDate() );
+    CPPUNIT_ASSERT_EQUAL( s1->getTime(), s2->getTime() );
+    CPPUNIT_ASSERT_EQUAL( s1->getDescription(), s2->getDescription() );
+    CPPUNIT_ASSERT_EQUAL( s1->getReferringPhysicianName(), s2->getReferringPhysicianName() );
+    CPPUNIT_ASSERT_EQUAL( s1->getPatientAge(), s2->getPatientAge() );
+
+    ::fwMedData::Equipment::sptr e1 = otherSeries[0]->getEquipment();
+    ::fwMedData::Equipment::sptr e2 = otherSeries[1]->getEquipment();
+    CPPUNIT_ASSERT_EQUAL( e1->getInstitutionName(), e2->getInstitutionName() );
+
+    ::fwMedData::Series::sptr se1 = otherSeries[0];
+    ::fwMedData::Series::sptr se2 = otherSeries[1];
+    CPPUNIT_ASSERT( se1->getInstanceUID() != se2->getInstanceUID() );
+    CPPUNIT_ASSERT( se1->getModality() != se2->getModality() );
+    CPPUNIT_ASSERT_EQUAL( se1->getDate(), se2->getDate() );
+    CPPUNIT_ASSERT_EQUAL( se1->getTime(), se2->getTime() );
+    CPPUNIT_ASSERT_EQUAL( se1->getDescription(), se2->getDescription() );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace patchMedicalData
+
diff --git a/Bundles/LeafUI/guiQt/CMakeLists.txt b/Bundles/LeafUI/guiQt/CMakeLists.txt
new file mode 100644
index 0000000..623c136
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/CMakeLists.txt
@@ -0,0 +1,25 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwActivities
+    fwGuiQt
+    fwRuntime
+    fwServices
+    fwTools
+
+    gui
+)
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/guiQt/COPYING b/Bundles/LeafUI/guiQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/guiQt/COPYING.LESSER b/Bundles/LeafUI/guiQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/guiQt/Properties.cmake b/Bundles/LeafUI/guiQt/Properties.cmake
new file mode 100644
index 0000000..19dda25
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME guiQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwActivities fwComEd fwCore fwData fwDataCamp fwGui fwGuiQt fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/guiQt/bin/build.options b/Bundles/LeafUI/guiQt/bin/build.options
new file mode 100644
index 0000000..b62da35
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/bin/build.options
@@ -0,0 +1,19 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwActivities_0-1',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          'fwDataCamp_0-1',
+          ]
+USE     = ['qtCore','boost']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/Namespace.hpp b/Bundles/LeafUI/guiQt/include/guiQt/Namespace.hpp
new file mode 100644
index 0000000..95f70d6
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIQTNAMESPACE_HPP_
+#define GUIQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace guiQt contains the basic services to build the application IHM with Qt.
+ * @namespace   guiQt
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace guiQt
+{
+
+}
+#endif /* GUIQTNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/Plugin.hpp b/Bundles/LeafUI/guiQt/include/guiQt/Plugin.hpp
new file mode 100644
index 0000000..b25edfe
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/Plugin.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIQT_PLUGIN_HPP_
+#define _GUIQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "guiQt/config.hpp"
+
+namespace fwThread
+{
+    class Worker;
+} //namespace fwThread
+
+
+namespace guiQt
+{
+/**
+ * 
+ * @date    2009-2010.
+ */
+class GUIQT_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public:
+
+    /**
+     * @brief   destructor
+     */
+    GUIQT_API ~Plugin() throw();
+
+    // Overrides
+    GUIQT_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    GUIQT_API void stop() throw();
+
+
+    GUIQT_API int run() throw();
+
+protected:
+
+    GUIQT_API void loadStyleSheet();
+
+private:
+
+    SPTR(::fwThread::Worker) m_workerQt;
+
+};
+
+} // namespace guiQt
+
+#endif //_GUIQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/config.hpp b/Bundles/LeafUI/guiQt/include/guiQt/config.hpp
new file mode 100644
index 0000000..3debe16
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIQT_CONFIG_HPP_
+#define _GUIQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef GUIQT_EXPORTS
+    #define GUIQT_API __declspec(dllexport)
+    #else
+    #define GUIQT_API __declspec(dllimport)
+    #endif
+
+    #define GUIQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef GUIQT_EXPORTS
+    #define GUIQT_API __attribute__ ((visibility("default")))
+    #define GUIQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define GUIQT_API __attribute__ ((visibility("hidden")))
+    #define GUIQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define GUIQT_API
+    #define GUIQT_CLASS_API
+
+#endif
+
+#endif //_GUIQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/editor/Code.hpp b/Bundles/LeafUI/guiQt/include/guiQt/editor/Code.hpp
new file mode 100644
index 0000000..05b89ef
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/editor/Code.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIQT_EDITOR_CODE_HPP_
+#define _GUIQT_EDITOR_CODE_HPP_
+
+#include <QPointer>
+#include <QObject>
+#include <QTextEdit>
+#include <QString>
+#include <QSyntaxHighlighter>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+
+#include "guiQt/config.hpp"
+
+namespace guiQt
+{
+
+namespace editor
+{
+
+/**
+ * @class   Code
+ * @brief   Code Editor working on a ::fwData::String
+ * 
+ * @date    2010.
+ */
+class GUIQT_CLASS_API Code : public QObject,public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (Code)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    GUIQT_API Code() throw() ;
+
+    /// Destructor. Do nothing.
+    GUIQT_API virtual ~Code() throw() ;
+
+protected:
+
+
+    /// Install the layout.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Destroy the layout
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations ( overrides ). Update the value from the String object.
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Update the value from the String object.
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Update the value from the String object.
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /// Do nothing.
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected:
+    static const std::string PYTHON;
+    static const std::string CPP;
+
+protected Q_SLOTS:
+    /**
+     * @brief This method is called when the value change.
+     *
+     * Update the String object value and notify the modification.
+     */
+    void onModifyValue();
+
+private:
+    std::string                    m_language;
+    QPointer< QTextEdit >          m_valueCtrl;
+    QPointer< QSyntaxHighlighter > m_highlighter;
+};
+
+} // namespace editor
+
+} // namespace guiQt
+
+#endif /*_GUIQT_EDITOR_CODE_HPP_*/
+
+
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/editor/DummyEditor.hpp b/Bundles/LeafUI/guiQt/include/guiQt/editor/DummyEditor.hpp
new file mode 100644
index 0000000..0200d2a
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/editor/DummyEditor.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIQT_EDITOR_DUMMYIEDITOR_HPP_
+#define _GUIQT_EDITOR_DUMMYIEDITOR_HPP_
+
+#include <QPointer>
+#include <QLabel>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "guiQt/config.hpp"
+
+namespace gui
+{
+
+namespace editor
+{
+
+
+/**
+ * @brief   Defines the service interface managing the basic editor service for object. Do nothing.
+ * @class   DummyEditor
+ * 
+
+ * @date    2009.
+ *
+ * @todo ACH: This class has been created in order to build test application. Do we remove it now ??
+ */
+class GUIQT_CLASS_API DummyEditor : public ::gui::editor::IEditor
+{
+
+public :
+
+
+    fwCoreServiceClassDefinitionsMacro ( (DummyEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    GUIQT_API DummyEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    GUIQT_API virtual ~DummyEditor() throw() ;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+    /**
+     * @brief This method launches the IEditor::starting method.
+     */
+    GUIQT_API virtual void starting() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief This method launches the IEditor::stopping method.
+     */
+    GUIQT_API virtual void stopping() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUIQT_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method is used to update services. Do nothing.
+     */
+    GUIQT_API virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the class parameters. Do nothing.
+    */
+    GUIQT_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to give information about the service. Do nothing.
+     */
+    GUIQT_API virtual void info(std::ostream &_sstream );
+
+    ///@}
+
+private:
+    /**
+     * @brief optional text
+     */
+    std::string m_text;
+
+    QPointer< QLabel > m_staticText;
+};
+
+}
+}
+
+#endif /*_GUIQT_EDITOR_DUMMYIEDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/editor/DynamicView.hpp b/Bundles/LeafUI/guiQt/include/guiQt/editor/DynamicView.hpp
new file mode 100644
index 0000000..fbd2285
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/editor/DynamicView.hpp
@@ -0,0 +1,183 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIQT_EDITOR_DYNAMICVIEW_HPP_
+#define _GUIQT_EDITOR_DYNAMICVIEW_HPP_
+
+#include <map>
+#include <set>
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/view/IView.hpp>
+
+#include <fwServices/AppConfigManager.hpp>
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include "guiQt/config.hpp"
+
+
+class QTabWidget;
+namespace fwData
+{
+class Composite;
+}
+namespace guiQt
+{
+namespace editor
+{
+
+typedef const ::fwServices::IService::ConfigType ConfigType;
+
+struct AppConfig
+{
+    typedef ::fwActivities::registry::ActivityAppConfigParam ParameterType;
+    typedef std::vector< ParameterType > ParametersType;
+
+    AppConfig(){};
+    AppConfig(const ConfigType &config);
+
+    std::string id;
+    std::string title;
+    std::string tabInfo;
+    bool closable;
+    ParametersType parameters;
+};
+
+
+/**
+ * @class   DynamicView
+ * @brief   This editor manages tabs. It receive message with NEW_CONFIGURATION_HELPER event containing the view config id.
+ *
+ * @date    2010.
+ *
+ * @note The ::activities::action::SActivityLauncher action sends message to be receive by the editor.
+ */
+class GUIQT_CLASS_API DynamicView : public QObject, public ::gui::view::IView
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DynamicView)(::gui::view::IView) ) ;
+
+    /// Constructor. Do nothing.
+    GUIQT_API DynamicView() throw() ;
+
+    /// Destructor. Do nothing.
+    GUIQT_API virtual ~DynamicView() throw() ;
+
+protected:
+
+    /**
+     * @brief Install the container.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the container.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Analyses received message with NEW_CONFIGURATION_HELPER helper.
+     * Creates the view defines by the config given in message.
+     */
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Update
+     *
+     */
+    virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief Swap
+     *
+     * Update the editors.
+     */
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+    * @brief Configure the view
+    * @see fwGui::IGuiContainerSrv::initialize()
+    *
+    * @verbatim
+    <service type="::gui::view::IView" impl="::guiQt::editor::DynamicView" autoConnect="yes" >
+        <config dynamicConfigStartStop="false">
+            <appConfig id="Visu2DID" title="Visu2D" >
+                <parameters>
+                    <parameter replace="SERIESDB" by="medicalData"  />
+                    <parameter replace="IMAGE" by="@values.image"  />
+                </parameters>
+            </appConfig>
+        </config>
+    </service>
+    @endverbatim
+    */
+    virtual void configuring() throw(fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream ) ;
+
+
+    struct DynamicViewInfo
+    {
+        ::fwGuiQt::container::QtContainer::sptr   container;
+        ::fwServices::AppConfigManager::sptr helper;
+        std::string wid;
+        std::string title;
+        bool closable;
+        std::string icon;
+        std::string tooltip;
+        std::string tabID;
+        std::string viewConfigID;
+        SPTR(::fwData::Composite) replaceMap;
+    };
+
+    typedef std::map< QWidget* , DynamicViewInfo > DynamicViewInfoMapType;
+
+    /**
+     * @brief Launch tab
+     */
+    void launchTab(DynamicViewInfo& info);
+
+    /**
+     * @brief Build a DynamicViewInfo from an AppConfig
+     */
+    DynamicViewInfo buildDynamicViewInfo(const AppConfig& appConfig);
+
+    QPointer<QTabWidget> m_tabWidget;
+    QPointer<QWidget> m_currentWidget;
+
+    std::map< std::string, unsigned int > m_titleToCount;
+    std::set< std::string > m_tabIDList;
+
+    DynamicViewInfoMapType m_dynamicInfoMap;
+    bool m_dynamicConfigStartStop;
+
+    AppConfig m_appConfig;
+
+protected Q_SLOTS:
+
+    void closeTab( int index, bool forceClose );
+
+    void closeTabSignal(int index);
+
+    void changedTab(int index);
+
+};
+
+}//namespace editor
+} // guiQt
+
+#endif /*_GUIQT_EDITOR_DYNAMICVIEW_HPP_*/
+
+
diff --git a/Bundles/LeafUI/guiQt/include/guiQt/editor/Namespace.hpp b/Bundles/LeafUI/guiQt/include/guiQt/editor/Namespace.hpp
new file mode 100644
index 0000000..d5604c0
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/include/guiQt/editor/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIQT_EDITOR_NAMESPACE_HPP_
+#define GUIQT_EDITOR_NAMESPACE_HPP_
+
+namespace guiQt
+{
+/**
+ * @brief       The namespace guiQt::editor contains a basic editor written with Qt.
+ * @namespace   guiQt::editor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace editor
+{
+
+}
+}
+#endif /* GUIQT_EDITOR_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/guiQt/rc/plugin.xml b/Bundles/LeafUI/guiQt/rc/plugin.xml
new file mode 100644
index 0000000..e287c1f
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/rc/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="guiQt" class="::guiQt::Plugin">
+    <library name="guiQt" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::gui::editor::DummyEditor</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::guiQt::editor::Code</service>
+        <object>::fwData::String</object>
+        <desc>a multi line editor</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::view::IView</type>
+        <service>::guiQt::editor::DynamicView</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafUI/guiQt/src/guiQt/Plugin.cpp b/Bundles/LeafUI/guiQt/src/guiQt/Plugin.cpp
new file mode 100644
index 0000000..610b038
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/src/guiQt/Plugin.cpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QDir>
+#include <QStringList>
+#include <QFile>
+#include <QString>
+#include <QTextStream>
+
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwGuiQt/App.hpp>
+#include <fwGuiQt/WorkerQt.hpp>
+
+#include "guiQt/Plugin.hpp"
+
+namespace guiQt
+{
+//-----------------------------------------------------------------------------
+
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::guiQt::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::profile::getCurrentProfile();
+    SLM_ASSERT("Profile is not initialized", profile);
+    int &argc = profile->getRawArgCount();
+    char** argv = profile->getRawParams();
+
+    m_workerQt = ::fwGuiQt::getQtWorker(argc, argv);
+
+
+    m_workerQt->post( ::boost::bind( &Plugin::loadStyleSheet, this ) );
+
+    ::fwRuntime::profile::getCurrentProfile()->setRunCallback(::boost::bind(&Plugin::run, this));
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void setup()
+{
+    ::fwRuntime::profile::getCurrentProfile()->setup();
+}
+
+int Plugin::run() throw()
+{
+    m_workerQt->post( ::boost::bind( &setup ) );
+    m_workerQt->getFuture().wait(); // This is required to start WorkerQt loop
+
+    ::fwRuntime::profile::getCurrentProfile()->cleanup();
+    int result = ::boost::any_cast<int>(m_workerQt->getFuture().get());
+#ifdef _WIN32
+    m_workerQt.reset();
+#endif
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::loadStyleSheet()
+{
+    if( this->getBundle()->hasParameter("style") )
+    {
+        std::string styleFile = this->getBundle()->getParameterValue("style") ;
+
+        QFile data(QString::fromStdString(styleFile));
+        QString style;
+        if(data.open(QFile::ReadOnly))
+        {
+            QTextStream styleIn(&data);
+            style = styleIn.readAll();
+            data.close();
+            qApp->setStyleSheet(style);
+        }
+    }
+}
+
+} // namespace guiQt
diff --git a/Bundles/LeafUI/guiQt/src/guiQt/editor/Code.cpp b/Bundles/LeafUI/guiQt/src/guiQt/editor/Code.cpp
new file mode 100644
index 0000000..bb686fb
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/src/guiQt/editor/Code.cpp
@@ -0,0 +1,178 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QHBoxLayout>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/StringMsg.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+#include <fwGuiQt/highlighter/CppHighlighter.hpp>
+#include <fwGuiQt/highlighter/PythonHighlighter.hpp>
+
+#include "guiQt/editor/Code.hpp"
+
+namespace guiQt
+{
+
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::guiQt::editor::Code , ::fwData::String ) ;
+
+//------------------------------------------------------------------------------
+
+const std::string Code::PYTHON = "Python";
+const std::string Code::CPP    = "Cpp";
+
+//------------------------------------------------------------------------------
+
+Code::Code() throw() : m_language(PYTHON)
+{
+    //addNewHandledEvent(::fwComEd::StringMsg::VALUE_IS_MODIFIED);
+}
+
+//------------------------------------------------------------------------------
+
+Code::~Code() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Code::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    ::fwData::String::sptr stringObj = this->getObject< ::fwData::String >();
+
+    QHBoxLayout* layout = new QHBoxLayout();
+    m_valueCtrl = new QTextEdit( container );
+    layout->addWidget( m_valueCtrl, 1);
+
+    if(m_language == PYTHON )
+    {
+        m_highlighter = new ::fwGuiQt::highlighter::PythonHighlighter(m_valueCtrl->document());
+    }
+    else if(m_language == CPP )
+    {
+        m_highlighter = new ::fwGuiQt::highlighter::CppHighlighter(m_valueCtrl->document());
+    }
+    else
+    {
+        OSLM_WARN("Language "<<m_language<<" not yet supported.");
+    }
+
+    container->setLayout( layout );
+
+    QObject::connect(m_valueCtrl, SIGNAL(textChanged()), this, SLOT(onModifyValue()));
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void Code::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_valueCtrl, SIGNAL(textChanged(QString)), this, SLOT(onModifyValue(QString)));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void Code::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+    if(!vectConfig.empty())
+    {
+        std::vector < ConfigurationType > vectLanguage = vectConfig.at(0)->find("language");
+        if(!vectLanguage.empty())
+        {
+            ConfigurationType configLanguage = vectLanguage.at(0);
+            SLM_ASSERT("missing 'name' attribute in language tag", configLanguage->hasAttribute("name"));
+            m_language = configLanguage->getAttributeValue("name");
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Code::updating() throw(::fwTools::Failed)
+{
+    ::fwData::String::sptr stringObj = this->getObject< ::fwData::String >();
+    SLM_ASSERT("Sorry, the object is null", stringObj);
+
+    m_valueCtrl->setText(QString::fromStdString(stringObj->value()));
+    OSLM_TRACE(stringObj->getID() << " updated value : " << stringObj->value());
+}
+
+//------------------------------------------------------------------------------
+
+void Code::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+//------------------------------------------------------------------------------
+
+void Code::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::StringMsg::csptr stringMsg = ::fwComEd::StringMsg::dynamicConstCast(_msg);
+
+    if (stringMsg && stringMsg->hasEvent(::fwComEd::StringMsg::VALUE_IS_MODIFIED))
+    {
+        this->updating();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Code::info( std::ostream &_sstream )
+{
+    _sstream << "String Editor";
+}
+
+//------------------------------------------------------------------------------
+
+void Code::onModifyValue()
+{
+    QString value = m_valueCtrl->toPlainText();
+    ::fwData::String::sptr stringObj = this->getObject< ::fwData::String >();
+    ::fwData::String::sptr oldValue;
+    oldValue = ::fwData::Object::copy(stringObj);
+
+    std::string strValue = value.toStdString();
+    stringObj->value() = strValue;
+
+    if ( oldValue->value() != stringObj->value() )
+    {
+        OSLM_TRACE( stringObj->getID() << " modified");
+        ::fwComEd::StringMsg::sptr msg = ::fwComEd::StringMsg::New();
+        msg->addEvent( ::fwComEd::StringMsg::VALUE_IS_MODIFIED );
+        ::fwServices::IEditionService::notify(this->getSptr(), stringObj, msg);
+    }
+}
+
+
+} // namespace editor
+
+} // namespace guiQt
+
diff --git a/Bundles/LeafUI/guiQt/src/guiQt/editor/DummyEditor.cpp b/Bundles/LeafUI/guiQt/src/guiQt/editor/DummyEditor.cpp
new file mode 100644
index 0000000..4c59b68
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/src/guiQt/editor/DummyEditor.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <QVBoxLayout>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "guiQt/editor/DummyEditor.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::gui::editor::DummyEditor , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+DummyEditor::DummyEditor() throw() : m_text("")
+{}
+
+//-----------------------------------------------------------------------------
+
+DummyEditor::~DummyEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QVBoxLayout* layout = new QVBoxLayout();
+    std::string text = m_text.empty() ? this->getID() : m_text;
+    m_staticText = new QLabel( QString::fromStdString(text), container);
+    layout->addWidget( m_staticText );
+    container->setLayout( layout );
+    QPalette palette;
+    QColor color(rand()%256, rand()%256, rand()%256);
+    palette.setBrush(QPalette::Window, QBrush(color));
+    m_staticText->setPalette(palette);
+    m_staticText->setAutoFillBackground(true);
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    SLM_ASSERT("container not instanced", qtContainer->getQtContainer());
+
+    // deletes contained widgets
+    qtContainer->clean();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    ::fwRuntime::ConfigurationElement::sptr viewsCfgElt = m_configuration->findConfigurationElement("text");
+    if(viewsCfgElt)
+    {
+        m_text = viewsCfgElt->getValue();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    QPalette palette;
+    QColor color(rand()%256, rand()%256, rand()%256);
+    palette.setBrush(QPalette::Window, QBrush(color));
+    m_staticText->setPalette(palette);
+    m_staticText->setAutoFillBackground(true);
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::receiving(::fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::info( std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace editor
+} // namespace gui
+
diff --git a/Bundles/LeafUI/guiQt/src/guiQt/editor/DynamicView.cpp b/Bundles/LeafUI/guiQt/src/guiQt/editor/DynamicView.cpp
new file mode 100644
index 0000000..a9b9a5d
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/src/guiQt/editor/DynamicView.cpp
@@ -0,0 +1,408 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QtGui>
+
+#include <fwCore/base.hpp>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwGui/GuiRegistry.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include "guiQt/editor/DynamicView.hpp"
+
+namespace guiQt
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::view::IView , ::guiQt::editor::DynamicView , ::fwData::Object ) ;
+
+AppConfig::AppConfig(const DynamicView::ConfigType& config) :
+    id(config.get<std::string>("<xmlattr>.id")),
+    title(config.get<std::string>("<xmlattr>.title"))
+{
+    std::string closableStr = config.get_optional<std::string>("<xmlattr>.closable").get_value_or("true");
+    closable = (closableStr == "true");
+
+
+    tabInfo = config.get_optional<std::string>("<xmlattr>.tabinfo").get_value_or("");
+
+    if(config.count("parameters") == 1 )
+    {
+        const ConfigType &configParameters = config.get_child("parameters");
+        BOOST_FOREACH( const ConfigType::value_type &v, configParameters.equal_range("parameter") )
+        {
+            ParameterType parameter( v.second );
+            parameters.push_back( parameter );
+        }
+    }
+    OSLM_ASSERT("At most 1 <parameters> tag is allowed", config.count("parameters") < 2);
+}
+
+//------------------------------------------------------------------------------
+
+DynamicView::DynamicView() throw()
+{
+    m_dynamicConfigStartStop = false;
+    //addNewHandledEvent( "NEW_CONFIGURATION_HELPER" );
+}
+
+//------------------------------------------------------------------------------
+
+DynamicView::~DynamicView() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr parentContainer ;
+    parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+
+    QWidget* qtContainer = parentContainer->getQtContainer();
+    m_tabWidget = new QTabWidget(qtContainer);
+    m_tabWidget->setTabsClosable ( true );
+    m_tabWidget->setDocumentMode( true );
+    m_tabWidget->setMovable( true );
+
+    QObject::connect(m_tabWidget, SIGNAL(tabCloseRequested( int )), this, SLOT( closeTabSignal( int )));
+    QObject::connect(m_tabWidget, SIGNAL(currentChanged( int )), this, SLOT(changedTab( int )));
+
+
+    QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom);
+    if (qtContainer->layout())
+    {
+        QWidget().setLayout(qtContainer->layout());
+    }
+    qtContainer->setLayout(layout);
+
+    layout->addWidget( m_tabWidget );
+    m_currentWidget = 0;
+
+    if(!m_appConfig.id.empty())
+    {
+        DynamicViewInfo info = this->buildDynamicViewInfo(m_appConfig);
+        this->launchTab(info);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    while(m_tabWidget->count())
+    {
+        this->closeTab(0,true);
+    }
+    m_tabWidget->clear();
+    ::fwGuiQt::container::QtContainer::sptr parentContainer ;
+    parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    parentContainer->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+    m_tabWidget = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::configuring() throw(fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::initialize();
+
+    if(this->getConfigTree().get_child("service").count("config") > 0)
+    {
+        SLM_ASSERT("Sorry you must have one (and only one) <config/> element.",
+                this->getConfigTree().get_child("service").count("config") == 1 );
+        const ::fwServices::IService::ConfigType srvconfig = this->getConfigTree().get_child("service");
+        const ::fwServices::IService::ConfigType &config = srvconfig.get_child("config");
+
+        const std::string dynamicConfig =
+                config.get_optional<std::string>("<xmlattr>.dynamicConfigStartStop").get_value_or("false");
+        m_dynamicConfigStartStop = (dynamicConfig == "true");
+
+        if(config.count("appConfig") == 1 )
+        {
+            const ::fwServices::IService::ConfigType &appConfig = config.get_child("appConfig");
+            m_appConfig = AppConfig(appConfig);
+        }
+        OSLM_ASSERT("At most 1 <appConfig> tag is allowed", config.count("appConfig") < 2);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+DynamicView::DynamicViewInfo DynamicView::buildDynamicViewInfo(const AppConfig& appConfig)
+{
+    DynamicViewInfo info;
+    info.tabID = "TABID_" + this->getID();
+
+    if(appConfig.tabInfo.empty())
+    {
+        info.title = appConfig.title;
+    }
+    else
+    {
+        info.title = appConfig.tabInfo;
+    }
+    info.viewConfigID = appConfig.id;
+    info.closable = appConfig.closable;
+
+    ::fwData::Object::sptr currentObj = this->getObject();
+    ::fwData::Composite::sptr replaceMap = ::fwData::Composite::New();
+    BOOST_FOREACH(const AppConfig::ParametersType::value_type& param, appConfig.parameters)
+    {
+        if(!param.isSeshat())
+        {
+            (*replaceMap)[param.replace] = ::fwData::String::New(param.by);
+        }
+        else
+        {
+            std::string parameterToReplace = param.by;
+            if (parameterToReplace.substr(0,1) == "!")
+            {
+                parameterToReplace.replace(0, 1, "@");
+            }
+
+            ::fwData::Object::sptr obj = ::fwDataCamp::getObject(currentObj, parameterToReplace);
+            OSLM_ASSERT("Invalid seshat path : '"<<param.by<<"'", obj);
+
+            ::fwData::String::sptr stringParameter = ::fwData::String::dynamicCast(obj);
+
+            std::string parameterValue = obj->getID();
+
+            if(stringParameter && param.by.substr(0,1) == "!")
+            {
+                parameterValue = stringParameter->getValue();
+            }
+            (*replaceMap)[param.replace] = ::fwData::String::New(parameterValue);
+        }
+    }
+    std::string genericUidAdaptor = ::fwServices::registry::AppConfig::getUniqueIdentifier(appConfig.id);
+    (*replaceMap)["GENERIC_UID"] = ::fwData::String::New(genericUidAdaptor);
+    info.replaceMap = replaceMap;
+    return info;
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::updating() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::swapping() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    if (msg->hasEvent("NEW_CONFIGURATION_HELPER"))
+    {
+        DynamicViewInfo info;
+        ::fwData::String::csptr titleData = ::fwData::String::dynamicConstCast(msg->getDataInfo( "NEW_CONFIGURATION_HELPER" ) );
+
+        const std::string eventID              = "NEW_CONFIGURATION_HELPER";
+        const std::string fieldID              = "APPCONFIG";
+        const std::string viewConfigFieldID    = "VIEWCONFIGID";
+        const std::string closableFieldID      = "CLOSABLE";
+        const std::string iconFieldID          = "ICON";
+        const std::string tooltipFieldID       = "TOOLTIP";
+        const std::string tabIDFieldID         = "TABID";
+        const std::string asFieldID            = "ACTIVITYSERIES";
+        const std::string tabInfo              = "TABINFO";
+
+        SLM_ASSERT("Missing field 'tabID' in message", titleData->getField(tabIDFieldID));
+        info.title         = titleData->getField< ::fwData::String >("TABINFO")->value();
+        info.tabID         = titleData->getField< ::fwData::String >(tabIDFieldID)->value();
+        info.closable      = titleData->getField(closableFieldID, ::fwData::Boolean::New(true))->value();
+        info.icon          = titleData->getField(iconFieldID, ::fwData::String::New(""))->value();
+        info.tooltip       = titleData->getField(tooltipFieldID, ::fwData::String::New(""))->value();
+        info.viewConfigID  = titleData->getField(viewConfigFieldID, ::fwData::String::New(""))->value();
+        info.replaceMap    = titleData->getField(fieldID, ::fwData::Composite::New());
+
+
+        this->launchTab(info);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::launchTab(DynamicViewInfo& info)
+{
+    static int count = 0;
+    if(m_tabIDList.find(info.tabID) != m_tabIDList.end() )
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("New tab",
+                "Sorry, the tab " + info.title + " cannot be opened twice.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        return;
+    }
+
+    if ( m_titleToCount.find( info.title ) !=  m_titleToCount.end() )
+    {
+        m_titleToCount[ info.title ] ++;
+    }
+    else
+    {
+        m_titleToCount[ info.title ] = 1;
+    }
+
+    QString finalTitle = QString("%1 %2").arg( info.title.c_str(),"(%1)" ).arg( m_titleToCount[ info.title ] );
+    info.wid = QString("DynamicView-%1").arg(count++).toStdString();
+
+    ::fwGuiQt::container::QtContainer::sptr subContainer = ::fwGuiQt::container::QtContainer::New();
+    QWidget *widget = new QWidget();
+    subContainer->setQtContainer(widget);
+    ::fwGui::GuiRegistry::registerWIDContainer(info.wid, subContainer);
+
+    (*(info.replaceMap))[ "WID_PARENT" ] = fwData::String::New( info.wid );
+
+
+    ::fwRuntime::ConfigurationElement::csptr config =
+            ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( info.viewConfigID, info.replaceMap);
+
+    ::fwServices::AppConfigManager::sptr helper = ::fwServices::AppConfigManager::New();
+    helper->setConfig( config );
+
+    if (!m_dynamicConfigStartStop)
+    {
+        helper->launch();
+    }
+    else
+    {
+        helper->create();
+    }
+
+    info.container = subContainer;
+    info.helper    = helper;
+
+
+    m_dynamicInfoMap[widget] = info;
+    m_tabIDList.insert(info.tabID);
+
+    int index = m_tabWidget->addTab(widget, finalTitle );
+    if(!info.tooltip.empty())
+    {
+        m_tabWidget->setTabToolTip(index, QString::fromStdString(info.tooltip));
+    }
+    if(!info.icon.empty())
+    {
+        m_tabWidget->setTabIcon(index, QIcon(QString::fromStdString(info.icon)) );
+    }
+    m_tabWidget->setCurrentWidget(widget);
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::info( std::ostream &_sstream )
+{}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::closeTabSignal( int index )
+{
+    closeTab( index, false );
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::closeTab( int index, bool forceClose )
+{
+    QWidget *widget = m_tabWidget->widget(index);
+
+    SLM_ASSERT("Widget is not in dynamicInfoMap", m_dynamicInfoMap.find(widget) != m_dynamicInfoMap.end());
+    DynamicViewInfo info = m_dynamicInfoMap[widget];
+    if ( info.closable || forceClose )
+    {
+        m_tabIDList.erase(info.tabID);
+        if (!m_dynamicConfigStartStop)
+        {
+            info.helper->stopAndDestroy();
+        }
+        else
+        {
+            if (info.helper->isStarted())
+            {
+                info.helper->stop();
+            }
+            info.helper->destroy();
+        }
+        info.helper.reset();
+
+        //Remove tab first, to avoid tab beeing removed by container->destroy
+        m_currentWidget = 0;
+        m_tabWidget->removeTab(index);
+
+        ::fwGui::GuiRegistry::unregisterWIDContainer(info.wid);
+
+        info.container->clean();
+        info.container->destroyContainer();
+        info.container.reset();
+        m_dynamicInfoMap.erase(widget);
+    }
+    else
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Close tab",
+                "Sorry, the tab " + info.title + " can not be closed.",
+                ::fwGui::dialog::IMessageDialog::INFO);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void DynamicView::changedTab( int index )
+{
+    QWidget *widget = m_tabWidget->widget(index);
+
+    if (m_dynamicConfigStartStop && widget != m_currentWidget)
+    {
+        if (m_currentWidget)
+        {
+            DynamicViewInfo oldinfo = m_dynamicInfoMap[m_currentWidget];
+            oldinfo.helper->stop();
+        }
+
+        if (widget)
+        {
+            DynamicViewInfo newinfo = m_dynamicInfoMap[widget];
+            if (!newinfo.helper->isStarted())
+            {
+                newinfo.helper->start();
+                newinfo.helper->update();
+            }
+        }
+
+    }
+
+    m_currentWidget = widget;
+}
+
+//------------------------------------------------------------------------------
+
+}// namespace editor
+}// namespace guiQt
+
diff --git a/Bundles/LeafUI/guiQt/test/CMakeLists.txt b/Bundles/LeafUI/guiQt/test/CMakeLists.txt
new file mode 100644
index 0000000..b259bca
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/Bundles/LeafUI/guiQt/test/Properties.cmake b/Bundles/LeafUI/guiQt/test/Properties.cmake
new file mode 100644
index 0000000..98841ca
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME guiQtTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwTest fwCore fwTools fwData fwGuiQt )
+set( REQUIREMENTS dataReg servicesReg gui guiQt io ioVTK visu visuVTKQt vtkSimpleNegato Tuto01Basic Tuto02DataServiceBasic )
+
+set(CPPUNITTEST_OPTIONS BUNDLE guiQt WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafUI/guiQt/test/cppunit.options b/Bundles/LeafUI/guiQt/test/cppunit.options
new file mode 100644
index 0000000..f4c0ab4
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/cppunit.options
@@ -0,0 +1,26 @@
+CLASSTEST=[
+          'GuiQtTest',
+          ]
+
+USE = ['qtCore']
+LIB = ['fwData_0-1','fwTools_0-1','fwCore_0-1','fwGuiQt_0-1', 'fwTest_0-1']
+
+BUNDLES = []
+
+REQUIREMENTS = [
+                'dataReg_0-1',
+                'servicesReg_0-1',
+                'gui_0-1',
+                'guiQt_0-1',
+                'io_0-1',
+                'ioVTK_0-1',
+                'visu_0-1',
+                'visuVTKQt_0-1',
+                'vtkSimpleNegato_0-1',
+                'Tuto01Basic_0-1',
+                'Tuto02DataServiceBasic_0-1',
+                ] 
+
+CONSOLE = 'yes'
+
+LOGLEVEL='trace'
diff --git a/Bundles/LeafUI/guiQt/test/tu/include/GuiQtTest.hpp b/Bundles/LeafUI/guiQt/test/tu/include/GuiQtTest.hpp
new file mode 100644
index 0000000..9dd2caa
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/tu/include/GuiQtTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_TEST_TU_MESHGENERATORTEST_HPP_
+#define _FWDATATOOLS_TEST_TU_MESHGENERATORTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Array.hpp>
+
+namespace guiQt
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh.
+ */
+class GuiQtTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( GuiQtTest );
+    CPPUNIT_TEST( testDefaultFrame );
+    CPPUNIT_TEST( testTuto01 );
+    CPPUNIT_TEST( testTuto02 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testDefaultFrame();
+    void testTuto01();
+    void testTuto02();
+
+};
+
+} //namespace ut
+} //namespace guiQt
+
+#endif //_FWDATATOOLS_TEST_TU_MESHGENERATORTEST_HPP_
diff --git a/Bundles/LeafUI/guiQt/test/tu/rc/profile.xml b/Bundles/LeafUI/guiQt/test/tu/rc/profile.xml
new file mode 100644
index 0000000..426d497
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/tu/rc/profile.xml
@@ -0,0 +1,23 @@
+<profile name="GuiQtTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+
+    <activate id="gui" version="0-1" />
+    <activate id="guiQt" version="0-1" />
+
+    <activate id="io" version="0-1" />
+    <activate id="ioVTK" version="0-1" />
+    
+    <activate id="visu" version="0-1" />
+    <activate id="visuVTK" version="0-1" />
+    <activate id="visuVTKQt" version="0-1" />
+    <activate id="vtkSimpleNegato" version="0-1" />
+    
+    <activate id="Tuto01Basic" />
+    <activate id="Tuto02DataServiceBasic" />
+
+    <start id="visuVTKQt" />
+    <start id="guiQt" />  
+    
+</profile>
diff --git a/Bundles/LeafUI/guiQt/test/tu/src/GuiQtTest.cpp b/Bundles/LeafUI/guiQt/test/tu/src/GuiQtTest.cpp
new file mode 100644
index 0000000..63115b9
--- /dev/null
+++ b/Bundles/LeafUI/guiQt/test/tu/src/GuiQtTest.cpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QMainWindow>
+
+#include <fwData/String.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwGuiQt/App.hpp>
+
+
+#include "GuiQtTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::guiQt::ut::GuiQtTest );
+
+namespace guiQt
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void GuiQtTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void GuiQtTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void GuiQtTest::testDefaultFrame()
+{
+    ::fwData::String::sptr object = ::fwData::String::New();
+
+    ::fwServices::IService::ConfigType frameConfig;
+
+    frameConfig.put("service.gui.frame.name", "guiQtUnitTest");
+    frameConfig.put("service.gui.frame.minSize.<xmlattr>.width", "800");
+    frameConfig.put("service.gui.frame.minSize.<xmlattr>.height", "600");
+
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create(  "::fwGui::IFrameSrv", "::gui::frame::DefaultFrame" );
+    CPPUNIT_ASSERT(srv);
+
+    ::fwServices::OSR::registerService( object , srv );
+
+    srv->setConfiguration( frameConfig ) ;
+    srv->configure();
+    srv->start();
+
+    QMainWindow *window = qobject_cast<QMainWindow *>(qApp->activeWindow());
+
+    CPPUNIT_ASSERT(qApp);
+    CPPUNIT_ASSERT(qApp->activeWindow());
+    CPPUNIT_ASSERT(window);
+    CPPUNIT_ASSERT_EQUAL(std::string("guiQtUnitTest"), window->windowTitle().toStdString());
+
+    srv->stop();
+    ::fwServices::OSR::unregisterService( srv );
+}
+
+//------------------------------------------------------------------------------
+
+void GuiQtTest::testTuto01()
+{
+    ::fwServices::AppConfigManager::sptr appConfigMng = ::fwServices::AppConfigManager::New();
+    ::fwRuntime::ConfigurationElement::csptr config = ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( "tutoBasicConfig" );
+    appConfigMng->setConfig( ::fwRuntime::ConfigurationElement::constCast( config ) );
+    appConfigMng->launch();
+    appConfigMng->stopAndDestroy();
+}
+
+//------------------------------------------------------------------------------
+
+void GuiQtTest::testTuto02()
+{
+    ::fwServices::AppConfigManager::sptr appConfigMng = ::fwServices::AppConfigManager::New();
+    ::fwRuntime::ConfigurationElement::csptr config = ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( "tutoDataServiceBasicConfig" );
+    appConfigMng->setConfig( ::fwRuntime::ConfigurationElement::constCast( config ) );
+    appConfigMng->launch();
+    appConfigMng->stopAndDestroy();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace guiQt
diff --git a/Bundles/LeafUI/guiWx/CMakeLists.txt b/Bundles/LeafUI/guiWx/CMakeLists.txt
new file mode 100644
index 0000000..20826ee
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/CMakeLists.txt
@@ -0,0 +1,21 @@
+find_package(wxWidgets COMPONENTS core)
+if(wxWidgets_FOUND)
+    fwLoadProperties()
+    
+    fwUseForwardInclude(
+          fwActivities
+          fwGuiWx
+          fwRuntime
+          fwServices
+          fwTools
+          gui
+    )
+
+    find_package(Boost REQUIRED)
+    include(${wxWidgets_USE_FILE})
+
+    fwForwardInclude(${Boost_INCLUDE_DIRS} ${wxWidgets_INCLUDE_DIRS})
+    fwLink(${wxWidgets_LIBRARIES})
+else(wxWidgets_FOUND)
+    message(WARNING "Required package wxWidgets not found, bundle 'guiWx' disabled.")
+endif(wxWidgets_FOUND)
diff --git a/Bundles/LeafUI/guiWx/COPYING b/Bundles/LeafUI/guiWx/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/guiWx/COPYING.LESSER b/Bundles/LeafUI/guiWx/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/guiWx/Properties.cmake b/Bundles/LeafUI/guiWx/Properties.cmake
new file mode 100644
index 0000000..7fc0b51
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME guiWx )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwActivities fwComEd fwCore fwData fwDataCamp fwGui fwGuiWx fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/guiWx/bin/build.options b/Bundles/LeafUI/guiWx/bin/build.options
new file mode 100644
index 0000000..99b65c5
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/bin/build.options
@@ -0,0 +1,17 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwGuiWx_0-1',
+          ]
+USE     = ['wxCore','boost']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/guiWx/include/guiWx/Namespace.hpp b/Bundles/LeafUI/guiWx/include/guiWx/Namespace.hpp
new file mode 100644
index 0000000..19ba8a8
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/include/guiWx/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIWXNAMESPACE_HPP_
+#define GUIWXNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace guiWx contains the basic services to build the application IHM with WxWidgets.
+ * @namespace   guiWx
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace guiWx
+{
+
+}
+#endif /* GUIWXNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/guiWx/include/guiWx/Plugin.hpp b/Bundles/LeafUI/guiWx/include/guiWx/Plugin.hpp
new file mode 100644
index 0000000..540b159
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/include/guiWx/Plugin.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIWX_PLUGIN_HPP_
+#define _GUIWX_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "guiWx/config.hpp"
+
+namespace fwThread
+{
+    class Worker;
+} //namespace fwThread
+
+namespace guiWx
+{
+/**
+ * 
+ * @date    2009-2010.
+ */
+class GUIWX_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public:
+
+    /**
+     * @brief   destructor
+     */
+    GUIWX_API ~Plugin() throw();
+
+    // Overrides
+    GUIWX_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    GUIWX_API void stop() throw();
+
+    GUIWX_API int run() throw();
+
+private:
+    SPTR(::fwThread::Worker) m_workerWx;
+};
+
+} // namespace guiWx
+
+#endif //_GUIWX_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/guiWx/include/guiWx/config.hpp b/Bundles/LeafUI/guiWx/include/guiWx/config.hpp
new file mode 100644
index 0000000..a6fd0b1
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/include/guiWx/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIWX_CONFIG_HPP_
+#define _GUIWX_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef GUIWX_EXPORTS
+    #define GUIWX_API __declspec(dllexport)
+    #else
+    #define GUIWX_API __declspec(dllimport)
+    #endif
+
+    #define GUIWX_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef GUIWX_EXPORTS
+    #define GUIWX_API __attribute__ ((visibility("default")))
+    #define GUIWX_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define GUIWX_API __attribute__ ((visibility("hidden")))
+    #define GUIWX_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define GUIWX_API
+    #define GUIWX_CLASS_API
+
+#endif
+
+#endif //_GUIWX_CONFIG_HPP_
diff --git a/Bundles/LeafUI/guiWx/include/guiWx/editor/DummyEditor.hpp b/Bundles/LeafUI/guiWx/include/guiWx/editor/DummyEditor.hpp
new file mode 100644
index 0000000..bdc2c4c
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/include/guiWx/editor/DummyEditor.hpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUIWX_EDITOR_DUMMYIEDITOR_HPP_
+#define _GUIWX_EDITOR_DUMMYIEDITOR_HPP_
+
+#include <wx/stattext.h>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "guiWx/config.hpp"
+
+namespace gui
+{
+
+namespace editor
+{
+
+
+/**
+ * @brief   Defines the service interface managing the basic editor service for object. Do nothing.
+ * @class   DummyEditor
+ * 
+
+ * @date    2009.
+ *
+ * @todo ACH: This class has been created in order to build test application. Do we remove it now ??
+ */
+class GUIWX_CLASS_API DummyEditor : public ::gui::editor::IEditor
+{
+
+public :
+
+
+    fwCoreServiceClassDefinitionsMacro ( (DummyEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    GUIWX_API DummyEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    GUIWX_API virtual ~DummyEditor() throw() ;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+    /**
+     * @brief This method launches the IEditor::starting method.
+     */
+    GUIWX_API virtual void starting() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief This method launches the IEditor::stopping method.
+     */
+    GUIWX_API virtual void stopping() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUIWX_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method is used to update services. Do nothing.
+     */
+    GUIWX_API virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the class parameters. Do nothing.
+    */
+    GUIWX_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to give information about the service. Do nothing.
+     */
+    GUIWX_API virtual void info(std::ostream &_sstream );
+
+    ///@}
+
+private:
+    /**
+     * @brief optional text
+     */
+    std::string m_text;
+    wxStaticText*  m_staticText;
+};
+
+}
+}
+
+#endif /*_GUIWX_EDITOR_DUMMYIEDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/guiWx/include/guiWx/editor/Namespace.hpp b/Bundles/LeafUI/guiWx/include/guiWx/editor/Namespace.hpp
new file mode 100644
index 0000000..9282467
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/include/guiWx/editor/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIWX_EDITOR_NAMESPACE_HPP_
+#define GUIWX_EDITOR_NAMESPACE_HPP_
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::editor contains a basic editor written with Wx.
+ * @namespace   gui::editor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace editor
+{
+
+}
+}
+#endif /* GUIWX_EDITOR_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/guiWx/rc/plugin.xml b/Bundles/LeafUI/guiWx/rc/plugin.xml
new file mode 100644
index 0000000..945dfbe
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/rc/plugin.xml
@@ -0,0 +1,14 @@
+<plugin id="guiWx" class="::guiWx::Plugin">
+    <library name="guiWx"/>
+    
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::gui::editor::DummyEditor</service>
+        <object>::fwData::Object</object>
+    </extension>
+        
+</plugin>
diff --git a/Bundles/LeafUI/guiWx/src/guiWx/Plugin.cpp b/Bundles/LeafUI/guiWx/src/guiWx/Plugin.cpp
new file mode 100644
index 0000000..738bc34
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/src/guiWx/Plugin.cpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwGuiWx/WorkerWx.hpp>
+
+#include "guiWx/Plugin.hpp"
+
+namespace guiWx
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::guiWx::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::profile::getCurrentProfile();
+    SLM_ASSERT("Profile is not initialized", profile);
+    int &argc = profile->getRawArgCount();
+    char** argv = profile->getRawParams();
+
+    m_workerWx = ::fwGuiWx::getWxWorker(argc, argv);
+
+    ::fwRuntime::profile::getCurrentProfile()->setRunCallback(::boost::bind(&Plugin::run, this));
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void setup()
+{
+    ::fwRuntime::profile::getCurrentProfile()->setup();
+}
+
+//-----------------------------------------------------------------------------
+
+int Plugin::run() throw()
+{
+    m_workerWx->post( ::boost::bind( &setup ) );
+    m_workerWx->getFuture().wait(); // This is required to start WorkerWx loop
+
+    ::fwRuntime::profile::getCurrentProfile()->cleanup();
+    return ::boost::any_cast<int>(m_workerWx->getFuture().get());
+}
+
+} // namespace guiWx
diff --git a/Bundles/LeafUI/guiWx/src/guiWx/editor/DummyEditor.cpp b/Bundles/LeafUI/guiWx/src/guiWx/editor/DummyEditor.cpp
new file mode 100644
index 0000000..4519f11
--- /dev/null
+++ b/Bundles/LeafUI/guiWx/src/guiWx/editor/DummyEditor.cpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <wx/wx.h>
+#include <wx/window.h>
+#include <wx/colour.h>
+
+#include <wx/sizer.h>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwData/Object.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwGuiWx/convert.hpp>
+#include <fwGuiWx/container/WxContainer.hpp>
+
+#include "guiWx/editor/DummyEditor.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::gui::editor::DummyEditor , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+DummyEditor::DummyEditor() throw() : m_text("")
+{}
+
+//-----------------------------------------------------------------------------
+
+DummyEditor::~DummyEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiWx::container::WxContainer::sptr wxContainer =  ::fwGuiWx::container::WxContainer::dynamicCast( this->getContainer() );
+    wxWindow* const container = wxContainer->getWxContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    wxBoxSizer* bSizer;
+    bSizer = new wxBoxSizer( wxVERTICAL );
+    std::string text = m_text.empty() ? this->getID() : m_text;
+    m_staticText = new wxStaticText( container, wxID_ANY, ::fwGuiWx::std2wx(text), wxDefaultPosition, wxDefaultSize, 0 );
+    m_staticText->SetBackgroundColour(wxColour(rand()%256, rand()%256, rand()%256));
+    bSizer->Add( m_staticText, 1, wxALL|wxEXPAND, 5 );
+
+    container->SetSizer( bSizer );
+    container->Refresh();
+    container->Layout();
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    ::fwRuntime::ConfigurationElement::sptr viewsCfgElt = m_configuration->findConfigurationElement("text");
+    if(viewsCfgElt)
+    {
+        m_text = viewsCfgElt->getValue();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    m_staticText->SetBackgroundColour(wxColour(rand()%256, rand()%256, rand()%256));
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::receiving(::fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DummyEditor::info( std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace editor
+} // namespace gui
+
diff --git a/Bundles/LeafUI/monitorQt/CMakeLists.txt b/Bundles/LeafUI/monitorQt/CMakeLists.txt
new file mode 100644
index 0000000..16db738
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/CMakeLists.txt
@@ -0,0 +1,30 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCom
+    fwGui
+    fwMemory
+    fwRuntime
+    fwTools
+
+    gui
+)
+
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+find_package (LibXml2)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    ${LIBXML2_INCLUDE_DIR}
+    )
+fwLink(
+    ${QT_LIBRARIES}
+    ${LIBXML2_LIBRARIES} 
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/monitorQt/Properties.cmake b/Bundles/LeafUI/monitorQt/Properties.cmake
new file mode 100644
index 0000000..21c7e5e
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME monitorQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwCore fwData fwGui fwGuiQt fwMemory fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/monitorQt/bin/build.options b/Bundles/LeafUI/monitorQt/bin/build.options
new file mode 100644
index 0000000..3660cc7
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/bin/build.options
@@ -0,0 +1,18 @@
+TYPE     = 'bundle'
+VERSION  = '0-1'
+USE      = ['qtCore','qtGui','boost','libxml2']
+
+LIB      = [
+           'fwTools_0-1',
+           'fwCore_0-1',
+           'fwRuntime_0-3',
+           'fwData_0-1',
+           'fwServices_0-1',
+           'fwMemory_0-1',
+           'fwGui_0-1',
+           'fwGuiQt_0-1',
+           ]
+BUNDLES  = [ 'gui_0-1', 'monitor_0-1' ]
+
+
+
diff --git a/Bundles/LeafUI/monitorQt/include/monitorQt/DumpEditor.hpp b/Bundles/LeafUI/monitorQt/include/monitorQt/DumpEditor.hpp
new file mode 100644
index 0000000..48537d7
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/include/monitorQt/DumpEditor.hpp
@@ -0,0 +1,131 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITORQT_DUMPEDITOR_HPP__
+#define __MONITORQT_DUMPEDITOR_HPP__
+
+#include <vector>
+
+#include <boost/signals/connection.hpp>
+
+#include <QPointer>
+#include <QPushButton>
+#include <QSignalMapper>
+#include <QTableView>
+#include <QTableWidget>
+#include <QFutureWatcher>
+
+#include <fwTools/Failed.hpp>
+#include <fwCom/Connection.hpp>
+#include <fwMemory/BufferManager.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "monitorQt/config.hpp"
+
+class QTimer;
+
+namespace fwCom
+{
+template< typename F >
+struct Slot;
+};
+
+namespace monitor
+{
+
+/**
+ * @class   DumpEditor
+ * @brief   Editor to dump or restore selected buffer.
+ * @date    2010-2013
+ */
+class MONITORQT_CLASS_API DumpEditor : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DumpEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Does nothing.
+    MONITORQT_API DumpEditor() throw() ;
+
+    /// Destructor. Does nothing.
+    MONITORQT_API virtual ~DumpEditor() throw() ;
+
+protected:
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /// Install the layout and call updating() method
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stop the layout.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Update the choice selection
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Call updating() method
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /// Calls classic IAction methods to configure
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides. Does nothing.
+    virtual void info( std::ostream &_sstream ) ;
+
+    /// Start m_updateTimer, call on buffManager signal emit ( see m_refreshSignal )
+    void onUpdate();
+
+protected Q_SLOTS:
+
+    /// This method is called when an item is pressed.
+    void changeStatus(int);
+
+    /// Slot called when user click on button m_refresh, call updating() method
+    void onRefreshButton();
+
+    void onBufferInfo();
+
+private:
+
+    typedef ::fwCom::Slot<void()> UpdateSlotType;
+
+    QFutureWatcher< ::fwMemory::BufferManager::BufferInfoMapType > m_watcher;
+
+    // Managed buffers
+    std::vector< const void * const * > m_objectsUID;
+
+    /// Widget to print some information on managed buffer by system
+    QTableWidget* m_list;
+
+    /// Button to force refresh
+    QPushButton*  m_refresh;
+
+    /// Mapper use in list widget to map each dump button to an action
+    QSignalMapper* m_mapper;
+
+    /// Editor to manage dump policy
+    QTableView* m_policyEditor;
+
+    /// Editor to show few memory information
+    QTableView* m_infoEditor;
+
+    SPTR(UpdateSlotType) m_updateSlot;
+
+    /// Manage connection between buffManager updated signal and onUpdate method
+    ::fwCom::Connection m_connection;
+
+    /// Timer use to call each 300 ms onRefreshButton() slot
+    QPointer<QTimer> m_updateTimer;
+};
+
+} // monitor
+
+#endif //__MONITORQT_DUMPEDITOR_HPP__
+
diff --git a/Bundles/LeafUI/monitorQt/include/monitorQt/Plugin.hpp b/Bundles/LeafUI/monitorQt/include/monitorQt/Plugin.hpp
new file mode 100644
index 0000000..51839f1
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/include/monitorQt/Plugin.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITORQT_PLUGIN_HPP__
+#define __MONITORQT_PLUGIN_HPP__
+
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace monitor
+{
+
+/**
+ * @date    2010.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace monitor
+
+#endif //__MONITORQT_PLUGIN_HPP__
+
diff --git a/Bundles/LeafUI/monitorQt/include/monitorQt/action/ClassFactoryRegistryInfo.hpp b/Bundles/LeafUI/monitorQt/include/monitorQt/action/ClassFactoryRegistryInfo.hpp
new file mode 100644
index 0000000..0d1e2a9
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/include/monitorQt/action/ClassFactoryRegistryInfo.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITORQT_CLASSFACTORYREGISTRYINFO_HPP__
+#define __MONITORQT_CLASSFACTORYREGISTRYINFO_HPP__
+
+#include <QApplication>
+#include <QDialog>
+#include <QTreeWidget>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitorQt/config.hpp"
+
+namespace monitor
+{
+namespace action
+{
+/**
+ * @brief   Implements an action to show services registered in factory
+ */
+class MONITORQT_CLASS_API ClassFactoryRegistryInfo : public ::fwGui::IActionSrv
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ClassFactoryRegistryInfo)( ::fwGui::IActionSrv ) ) ;
+
+    /// Does nothing
+    MONITORQT_API ClassFactoryRegistryInfo() throw() ;
+
+    /// Does nothing
+    MONITORQT_API virtual ~ClassFactoryRegistryInfo() throw() ;
+
+protected :
+
+    /// Calls classic IAction methods to configure
+    void configuring() throw (::fwTools::Failed);
+
+    /// Prepare dialog box
+    void starting() throw (::fwTools::Failed);
+
+    /// Fill factory information in m_tree and show the dialog
+    void updating() throw (::fwTools::Failed);
+
+    /// Delete dialog box
+    void stopping() throw (::fwTools::Failed);
+
+private:
+
+    /// Dialog shown on update method
+    QDialog* m_dialog;
+
+    /// Widget used to show association ( service impl , data impl )
+    QTreeWidget *m_tree;
+
+};
+
+} // namespace action
+} // namespace monitor
+
+#endif // __MONITORQT_CLASSFACTORYREGISTRYINFO_HPP__
+
diff --git a/Bundles/LeafUI/monitorQt/include/monitorQt/action/ComponentsTree.hpp b/Bundles/LeafUI/monitorQt/include/monitorQt/action/ComponentsTree.hpp
new file mode 100644
index 0000000..0f8a101
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/include/monitorQt/action/ComponentsTree.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MONITORQT_UI_ACTION_COMPONENTSTREE_HPP__
+#define __MONITORQT_UI_ACTION_COMPONENTSTREE_HPP__
+
+#include <QDialog>
+#include <QPointer>
+#include <QObject>
+#include <QTreeWidget>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "monitorQt/config.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+/**
+ * @brief  Implements an action that show bundle information.
+ */
+class MONITORQT_CLASS_API ComponentsTree : public ::fwGui::IActionSrv
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ComponentsTree)(::fwGui::IActionSrv) ) ;
+
+    /// Does nothing
+    MONITORQT_API ComponentsTree() throw() ;
+
+    /// Does nothing
+    MONITORQT_API virtual ~ComponentsTree() throw() ;
+
+protected :
+
+    /// Calls classic IAction methods to configure
+    void configuring() throw (::fwTools::Failed);
+
+    /// Prepare dialog box
+    void starting() throw (::fwTools::Failed);
+
+    /// Fill factory information in m_tree and show the dialog
+    void updating() throw (::fwTools::Failed);
+
+    /// Delete dialog box
+    void stopping() throw (::fwTools::Failed);
+
+private:
+
+    /// Dialog shown on update method
+    QPointer< QDialog > m_dialog;
+
+    /// Widget used to show association ( service impl , data impl )
+    QPointer< QTreeWidget > m_treeContainer;
+};
+
+
+} // namespace action
+} // namespace monitor
+
+#endif //__MONITORQT_UI_ACTION_COMPONENTSTREE_HPP__
+
diff --git a/Bundles/LeafUI/monitorQt/include/monitorQt/config.hpp b/Bundles/LeafUI/monitorQt/include/monitorQt/config.hpp
new file mode 100644
index 0000000..f252a3d
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/include/monitorQt/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MONITORQT_CONFIG_HPP_
+#define _MONITORQT_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef MONITORQT_EXPORTS
+    #define MONITORQT_API __declspec(dllexport)
+    #else
+    #define MONITORQT_API __declspec(dllimport)
+    #endif
+
+    #define MONITORQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef MONITORQT_EXPORTS
+    #define MONITORQT_API __attribute__ ((visibility("default")))
+    #define MONITORQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define MONITORQT_API __attribute__ ((visibility("hidden")))
+    #define MONITORQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define MONITORQT_API
+    #define MONITORQT_CLASS_API
+
+#endif
+
+#endif // _MONITORQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/monitorQt/rc/DumpFrameConfig.xml b/Bundles/LeafUI/monitorQt/rc/DumpFrameConfig.xml
new file mode 100644
index 0000000..f43512c
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/rc/DumpFrameConfig.xml
@@ -0,0 +1,56 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>DumpFrameConfig</id>
+    <type>parameters</type>
+    <parameters/>
+        <config>
+        
+    <object type="::fwData::Composite">
+        <!-- MAIN FRAME -->
+        <service uid="GENERIC_UID_dumpFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+            <window onclose="notify" />
+            <gui>
+                <frame>
+                    <name>Dump editor</name>
+                    <minSize width="600" height="400" />
+                </frame>
+                <toolBar align="left" />
+            </gui>
+            <registry>
+                <toolBar sid="GENERIC_UID_toolBar" start="yes" />
+                <view sid="GENERIC_UID_dumpView_Frame" start="yes" />
+            </registry>
+        </service>
+
+        <service uid="GENERIC_UID_dumpView_Frame" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+            <gui>
+                <layout type="::fwGui::LineLayoutManager">
+                    <orientation value="vertical" />
+                    <view proportion="1" />
+                </layout>
+            </gui>
+            <registry>
+                <view sid="GENERIC_UID_dumpEditor" start="yes" />
+            </registry>
+        </service>
+        
+        <service uid="GENERIC_UID_toolBar" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no">
+            <gui>
+                <layout>
+                    <menuItem name="Dump all" icon="Bundles/monitorQt_0-1/icon-dump.svg" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="GENERIC_UID_dumpAll" start="yes" />
+            </registry>
+        </service>
+    
+        <service uid="GENERIC_UID_dumpEditor" impl="::monitor::DumpEditor" type="::gui::editor::IEditor" autoConnect="no" />
+        <service uid="GENERIC_UID_dumpAll" impl="::monitor::action::SDumpAll" type="::fwGui::IActionSrv" autoConnect="no" />
+        
+        
+        <start uid="GENERIC_UID_dumpFrame" />
+        
+    </object>
+
+        </config>
+    </extension>
diff --git a/Bundles/LeafUI/monitorQt/rc/plugin.xml b/Bundles/LeafUI/monitorQt/rc/plugin.xml
new file mode 100644
index 0000000..04bca69
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/rc/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="monitorQt" class="::monitorQt::Plugin">
+
+    <library name="monitorQt" />
+    <requirement id="monitor" />
+    <requirement id="gui" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::ClassFactoryRegistryInfo</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::monitor::action::ComponentsTree</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::monitor::DumpEditor</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <xi:include href="DumpFrameConfig.xml" xmlns:xi="http://www.w3.org/2003/XInclude"/>
+    
+</plugin>
diff --git a/Bundles/LeafUI/monitorQt/src/monitorQt/DumpEditor.cpp b/Bundles/LeafUI/monitorQt/src/monitorQt/DumpEditor.cpp
new file mode 100644
index 0000000..13313b5
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/src/monitorQt/DumpEditor.cpp
@@ -0,0 +1,736 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/lexical_cast.hpp>
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+
+#include <QComboBox>
+#include <QHeaderView>
+#include <QItemDelegate>
+#include <QStringList>
+#include <QTableWidgetItem>
+#include <QTimer>
+#include <QVBoxLayout>
+#include <QFuture>
+#include <QtConcurrentRun>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwTools/Stringizer.hpp>
+
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slot.hxx>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/ByteSize.hpp>
+#include <fwMemory/tools/MemoryMonitorTools.hpp>
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/IPolicy.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/IMessageDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "monitorQt/DumpEditor.hpp"
+
+namespace monitor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::monitor::DumpEditor , ::fwData::Object ) ;
+
+::fwMemory::BufferManager::BufferInfoMapType m_bufferInfos;
+::fwMemory::BufferManager::BufferStats m_bufferStats = {0,0};
+
+QString getHumanReadableSize(::fwMemory::ByteSize::SizeType bytes)
+{
+    return QString::fromStdString(::fwMemory::ByteSize(bytes));
+}
+
+//------------------------------------------------------------------------------
+
+
+class PolicyComboBoxDelegate : public QItemDelegate
+{
+
+public:
+    PolicyComboBoxDelegate(QObject *parent = 0) : QItemDelegate(parent){}
+
+    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+    void setEditorData(QWidget *editor, const QModelIndex &index) const;
+    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+
+    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+
+QWidget *PolicyComboBoxDelegate::createEditor(QWidget *parent,
+                                              const QStyleOptionViewItem & option,
+                                              const QModelIndex & index ) const
+{
+    QComboBox *policyComboBox = new QComboBox(parent);
+
+    const std::string value = index.model()->data(index, Qt::DisplayRole).toString().toStdString();
+
+    const ::fwMemory::policy::registry::Type::KeyVectorType &factories =
+            ::fwMemory::policy::registry::get()->getFactoryKeys();
+
+    BOOST_FOREACH( const ::fwMemory::policy::registry::KeyType &policy, factories)
+    {
+        policyComboBox->addItem(QString::fromStdString(policy));
+        if(value == policy)
+        {
+            policyComboBox->setCurrentIndex(policyComboBox->count()-1);
+        }
+    }
+    return policyComboBox;
+}
+
+void PolicyComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    QString value = index.model()->data(index, Qt::DisplayRole).toString();
+
+    QComboBox *policyComboBox = static_cast<QComboBox*>(editor);
+
+    int idx = policyComboBox->findText(value);
+    if( idx != -1 )
+    {
+        policyComboBox->setCurrentIndex(idx);
+    }
+}
+
+void PolicyComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
+{
+    QComboBox *policyComboBox = static_cast<QComboBox*>(editor);
+    QString value = policyComboBox->currentText();
+
+    model->setData(index, value, Qt::EditRole);
+}
+
+void PolicyComboBoxDelegate::updateEditorGeometry(QWidget *editor,
+                                                  const QStyleOptionViewItem &option,
+                                                  const QModelIndex & index ) const
+{
+    editor->setGeometry(option.rect);
+}
+
+
+
+
+
+class PolicyTableModel : public QAbstractTableModel
+{
+
+public:
+    PolicyTableModel(QObject *parent=0);
+
+    int rowCount(const QModelIndex &parent) const;
+    int columnCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    Qt::ItemFlags flags(const QModelIndex &index) const;
+    bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole);
+
+    static const int s_EXTRA_INFO_NB;
+private:
+
+    ::fwMemory::BufferManager::sptr m_buffManager;
+};
+
+const int PolicyTableModel::s_EXTRA_INFO_NB = 1;
+
+PolicyTableModel::PolicyTableModel(QObject *parent)
+    : QAbstractTableModel(parent)
+{
+    m_buffManager = ::fwMemory::BufferManager::getDefault();
+}
+
+int PolicyTableModel::rowCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    size_t nbParam = 0;
+    if(m_buffManager)
+    {
+        ::fwCore::mt::ReadLock lock( m_buffManager->getMutex() );
+        ::fwMemory::IPolicy::sptr currentPolicy = m_buffManager->getDumpPolicy();
+        nbParam = currentPolicy->getParamNames().size();
+    }
+
+    return static_cast<int>(nbParam + s_EXTRA_INFO_NB);
+}
+
+int PolicyTableModel::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return 1;
+}
+
+QVariant PolicyTableModel::data(const QModelIndex &index, int role) const
+{
+    if (!m_buffManager && !index.isValid())
+    {
+        return QVariant();
+    }
+    ::fwCore::mt::ReadLock lock( m_buffManager->getMutex() );
+    ::fwMemory::IPolicy::sptr currentPolicy = m_buffManager->getDumpPolicy();
+
+    if (index.row() > (s_EXTRA_INFO_NB + currentPolicy->getParamNames().size()) || index.row() < 0)
+    {
+        return QVariant();
+    }
+
+    if (role == Qt::DisplayRole)
+    {
+
+        if (index.column() == 0)
+        {
+            const ::fwMemory::IPolicy::ParamNamesType &names = currentPolicy->getParamNames();
+            if(index.row() == 0)
+            {
+                return QString::fromStdString(currentPolicy->getLeafClassname());
+            }
+            else if( (unsigned int)index.row() <= names.size())
+            {
+                const ::fwMemory::IPolicy::ParamNamesType::value_type &name = names.at(index.row() - 1);
+
+                return QString::fromStdString(currentPolicy->getParam(name));
+
+            }
+        }
+    }
+    return QVariant();
+}
+
+
+QVariant PolicyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (role != Qt::DisplayRole)
+    {
+        return QVariant();
+    }
+
+    if (m_buffManager && orientation == Qt::Vertical)
+    {
+        ::fwCore::mt::ReadLock lock( m_buffManager->getMutex() );
+        ::fwMemory::IPolicy::sptr currentPolicy = m_buffManager->getDumpPolicy();
+        const ::fwMemory::IPolicy::ParamNamesType &names = currentPolicy->getParamNames();
+        if (section <= 0)
+        {
+            return QString("Current policy");
+        }
+        else if( (unsigned int)section <= names.size() )
+        {
+            const ::fwMemory::IPolicy::ParamNamesType::value_type &name = names.at(section - 1);
+            return QString::fromStdString(name);
+        }
+    }
+    return QVariant();
+}
+
+
+ bool PolicyTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
+ {
+     if (m_buffManager && index.isValid() && role == Qt::EditRole)
+     {
+         int row = index.row();
+         int col = index.column();
+         const std::string strvalue = value.toString().toStdString();
+
+         ::fwCore::mt::ReadLock lock( m_buffManager->getMutex() );
+         ::fwMemory::IPolicy::sptr currentPolicy = m_buffManager->getDumpPolicy();
+         const ::fwMemory::IPolicy::ParamNamesType &names = currentPolicy->getParamNames();
+
+         if (col == 0 && (unsigned int)row <= names.size() )
+         {
+             ::fwMemory::IPolicy::sptr dumpPolicy;
+             switch (row)
+             {
+             case 0 :
+                 if(strvalue != currentPolicy->getLeafClassname())
+                 {
+                     dumpPolicy = ::fwMemory::policy::registry::get()->create(strvalue);
+                     if(dumpPolicy)
+                     {
+                         ::fwCore::mt::ReadToWriteLock lock( m_buffManager->getMutex() );
+                         m_buffManager->setDumpPolicy(dumpPolicy);
+                     }
+                     this->reset();
+                 }
+                 break;
+             default:
+                 const ::fwMemory::IPolicy::ParamNamesType::value_type &name = names.at(row - 1);
+                 currentPolicy->setParam(name, strvalue);
+                 return true;
+             }
+         }
+     }
+     return false;
+ }
+
+Qt::ItemFlags PolicyTableModel::flags(const QModelIndex &index) const
+{
+    if (!index.isValid())
+        return Qt::ItemIsEnabled;
+
+    return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
+}
+
+
+//------------------------------------------------------------------------------
+
+
+class InfoTableModel : public QAbstractTableModel
+{
+
+public:
+    InfoTableModel(QObject *parent=0);
+
+    int rowCount(const QModelIndex &parent) const;
+    int columnCount(const QModelIndex &parent) const;
+    QVariant data(const QModelIndex &index, int role) const;
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+
+private:
+
+    ::fwMemory::BufferManager::sptr m_buffManager;
+};
+
+
+
+InfoTableModel::InfoTableModel(QObject *parent)
+    : QAbstractTableModel(parent)
+{
+    m_buffManager = ::fwMemory::BufferManager::getDefault();
+}
+
+int InfoTableModel::rowCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return 4;
+}
+
+int InfoTableModel::columnCount(const QModelIndex &parent) const
+{
+    Q_UNUSED(parent);
+    return 1;
+}
+
+QVariant InfoTableModel::data(const QModelIndex &index, int role) const
+{
+    if (! m_buffManager || !index.isValid())
+    {
+        return QVariant();
+    }
+
+    if (index.row() > this->rowCount(index))
+    {
+        return QVariant();
+    }
+
+    if (role == Qt::DisplayRole)
+    {
+        if (index.column() == 0)
+        {
+            ::boost::uint64_t sysMem;
+            ::fwMemory::BufferManager::SizeType bufferManagerMem;
+            switch (index.row())
+            {
+            case 0 :
+                sysMem = ::fwMemory::tools::MemoryMonitorTools::getTotalSystemMemory();
+                return QString(getHumanReadableSize(sysMem));
+                break;
+            case 1 :
+                sysMem = ::fwMemory::tools::MemoryMonitorTools::getFreeSystemMemory();
+                return QString(getHumanReadableSize(sysMem));
+                break;
+            case 2 :
+                bufferManagerMem = m_bufferStats.totalManaged;
+                return QString(getHumanReadableSize(bufferManagerMem));
+                break;
+            case 3 :
+                bufferManagerMem = m_bufferStats.totalDumped;
+                return QString(getHumanReadableSize(bufferManagerMem));
+                break;
+            }
+        }
+    }
+    return QVariant();
+}
+
+
+QVariant InfoTableModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+    if (role == Qt::DisplayRole && orientation == Qt::Vertical)
+    {
+        switch (section)
+        {
+            case 0 :
+                return QString("Total System Memory");
+                break;
+            case 1 :
+                return QString("Free System Memory");
+                break;
+            case 2 :
+                return QString("Managed");
+                break;
+            case 3 :
+                return QString("Dumped");
+                break;
+        }
+
+    }
+
+    return QVariant();
+}
+
+//------------------------------------------------------------------------------
+
+
+DumpEditor::DumpEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+DumpEditor::~DumpEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::starting() throw(::fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_updateTimer = new QTimer(container);
+    m_updateTimer->setInterval(300);
+    m_updateTimer->setSingleShot(true);
+
+    m_list = new QTableWidget(container);
+    m_mapper = new QSignalMapper();
+
+    m_list->setColumnCount(5);
+    QStringList header;
+    header.push_back("Size");
+    header.push_back("Status");
+    header.push_back("Timestamp");
+    header.push_back("Locked");
+    header.push_back("Action");
+    m_list->setHorizontalHeaderLabels(header);
+
+    m_refresh = new QPushButton(tr("Refresh"), container);
+    QVBoxLayout* sizer = new QVBoxLayout();
+
+    QHBoxLayout* sizerButton = new QHBoxLayout();
+    sizerButton->addWidget(m_refresh);
+
+    sizerButton->addItem(new QSpacerItem(10, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
+    QFrame* verticalLine = new QFrame(container);
+    verticalLine->setFrameShape(QFrame::VLine);
+    verticalLine->setFrameShadow(QFrame::Sunken);
+    sizerButton->addWidget(verticalLine);
+
+    sizer->addLayout(sizerButton);
+    sizer->addWidget(m_list,2);
+    container->setLayout( sizer );
+
+    PolicyComboBoxDelegate *policyComboBoxDelegate = new PolicyComboBoxDelegate(container);
+    PolicyTableModel *policyTableModel = new PolicyTableModel(container);
+    m_policyEditor = new QTableView(container);
+    m_policyEditor->setModel(policyTableModel);
+    m_policyEditor->setItemDelegateForRow(0, policyComboBoxDelegate);
+    m_policyEditor->setSortingEnabled(false);
+    m_policyEditor->horizontalHeader()->hide();
+
+    InfoTableModel *infoTableModel = new InfoTableModel(container);
+    m_infoEditor = new QTableView(container);
+    m_infoEditor->setModel(infoTableModel);
+    m_infoEditor->horizontalHeader()->hide();
+
+
+    QHBoxLayout* tablesLayout = new QHBoxLayout();
+    tablesLayout->addWidget(m_infoEditor);
+    tablesLayout->addWidget(m_policyEditor);
+
+    sizer->addLayout(tablesLayout);
+    // sizer->addWidget(m_policyEditor);
+
+    QObject::connect(m_refresh, SIGNAL(clicked ()), this, SLOT(onRefreshButton( )));
+    QObject::connect(m_mapper, SIGNAL(mapped(int)), this, SLOT(changeStatus(int)));
+
+    QObject::connect(m_updateTimer, SIGNAL(timeout ()), this, SLOT(onRefreshButton( )));
+    QObject::connect(&m_watcher, SIGNAL(finished()), this, SLOT(onBufferInfo()));
+
+    ::fwMemory::BufferManager::sptr buffManager = ::fwMemory::BufferManager::getDefault();
+    if (buffManager)
+    {
+        m_updateSlot = ::fwCom::newSlot( &DumpEditor::onUpdate, this ) ;
+        ::fwServices::registry::ActiveWorkers::sptr workers = ::fwServices::registry::ActiveWorkers::getDefault();
+        m_updateSlot->setWorker( workers->getWorker( ::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER ));
+        m_connection = buffManager->getUpdatedSignal()->connect( m_updateSlot );
+    }
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::stopping() throw(::fwTools::Failed)
+{
+    m_connection.disconnect();
+    QObject::disconnect(m_refresh, SIGNAL(clicked ()), this, SLOT(onRefreshButton()));
+    QObject::disconnect(m_mapper, SIGNAL(mapped(int)), this, SLOT(changeStatus(int)));
+    QObject::disconnect(&m_watcher, SIGNAL(finished()), this, SLOT(onBufferInfo()));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+
+class SizeTableWidgetItem : public QTableWidgetItem
+{
+public:
+
+    SizeTableWidgetItem(const QString &text) : QTableWidgetItem(text) {}
+
+    virtual bool operator< ( const QTableWidgetItem & other ) const
+    {
+        return data(Qt::UserRole).toULongLong() < other.data(Qt::UserRole).toULongLong();
+    }
+
+protected:
+
+    size_t m_size;
+};
+
+//------------------------------------------------------------------------------
+
+::fwMemory::BufferManager::BufferInfoMapType getInfoMap()
+{
+    ::fwMemory::BufferManager::BufferInfoMapType infoMap;
+    ::fwMemory::BufferManager::sptr buffManager = ::fwMemory::BufferManager::getDefault();
+    if(buffManager)
+    {
+        infoMap = buffManager->getBufferInfos().get();
+    }
+    return infoMap;
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::updating() throw(::fwTools::Failed)
+{
+    m_policyEditor->reset();
+    m_policyEditor->resizeColumnsToContents();
+
+    QFuture< ::fwMemory::BufferManager::BufferInfoMapType > qFuture = QtConcurrent::run(getInfoMap);
+    m_watcher.setFuture(qFuture);
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::onBufferInfo()
+{
+    m_bufferInfos = m_watcher.result();
+    m_bufferStats = ::fwMemory::BufferManager::computeBufferStats(m_bufferInfos);
+
+    m_mapper->blockSignals(true);
+   ::fwCom::Connection::Blocker block(m_connection);
+
+   for(int row = 0; row < m_list->rowCount(); row++)
+   {
+       m_mapper->removeMappings( m_list->cellWidget(row, 4) );
+   }
+   m_list->clearContents();
+   m_objectsUID.clear();
+
+
+   int itemCount = 0;
+   m_list->setSortingEnabled(false);
+   m_list->setRowCount(static_cast<int>(m_bufferInfos.size()));
+   m_list->setColumnCount(5);
+   QColor backColor;
+   BOOST_FOREACH(const ::fwMemory::BufferManager::BufferInfoMapType::value_type &elt, m_bufferInfos)
+   {
+       m_objectsUID.push_back(elt.first);
+
+       std::string status      = "?";
+       std::string date        = "?";
+       std::string lockStatus  = "?";
+
+
+       const ::fwMemory::BufferInfo &dumpBuffInfo = elt.second;
+       bool loaded = dumpBuffInfo.loaded;
+       if(!loaded)
+       {
+           backColor = Qt::darkYellow;
+           status = "Dumped";
+       }
+       else
+       {
+           backColor = Qt::white;
+           status = "-";
+       }
+
+       bool isLock = dumpBuffInfo.lockCount() > 0;
+       if ( isLock )
+       {
+           lockStatus = "locked(" +  ::fwTools::getString(dumpBuffInfo.lockCount()) +")";
+       }
+       else
+       {
+           lockStatus = "unlocked";
+       }
+
+
+       date = ::fwTools::getString(dumpBuffInfo.lastAccess.getLogicStamp());
+
+       QTableWidgetItem* currentSizeItem = new SizeTableWidgetItem( getHumanReadableSize(dumpBuffInfo.size) );
+       currentSizeItem->setData(Qt::UserRole, (qulonglong)dumpBuffInfo.size );
+       currentSizeItem->setFlags(Qt::ItemIsEnabled);
+       currentSizeItem->setBackgroundColor(backColor);
+       m_list->setItem(itemCount, 0, currentSizeItem );
+
+       QTableWidgetItem* statusItem = new QTableWidgetItem( QString::fromStdString(status));
+       statusItem->setFlags(Qt::ItemIsEnabled);
+       statusItem->setBackgroundColor(backColor);
+       m_list->setItem(itemCount, 1, statusItem );
+
+       QTableWidgetItem* dateItem = new QTableWidgetItem( QString::fromStdString(date));
+       dateItem->setFlags(Qt::ItemIsEnabled);
+       dateItem->setBackgroundColor(backColor);
+       m_list->setItem(itemCount, 2, dateItem );
+
+       QTableWidgetItem* lockStatusItem = new QTableWidgetItem( QString::fromStdString(lockStatus));
+       lockStatusItem->setFlags(Qt::ItemIsEnabled);
+       lockStatusItem->setBackgroundColor(backColor);
+       m_list->setItem(itemCount, 3, lockStatusItem );
+
+
+       QPushButton* actionItem = new QPushButton(QString::fromStdString((loaded)?"Dump":"Restore"), m_list);
+       actionItem->setEnabled(!isLock && (dumpBuffInfo.size > 0) );
+       m_list->setCellWidget(itemCount, 4, actionItem );
+       QObject::connect(actionItem, SIGNAL(pressed()), m_mapper, SLOT(map()));
+       m_mapper->setMapping(actionItem, itemCount);
+
+       ++itemCount;
+   }
+   m_list->setSortingEnabled(true);
+
+   m_mapper->blockSignals(false);
+
+   m_infoEditor->reset();
+   m_infoEditor->resizeColumnsToContents();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::info( std::ostream &_sstream )
+{
+    _sstream << "Dump Editor";
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::onUpdate()
+{
+    m_updateTimer->start();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::onRefreshButton()
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void DumpEditor::changeStatus( int index )
+{
+    ::fwMemory::BufferManager::sptr buffManager = ::fwMemory::BufferManager::getDefault();
+    if(buffManager)
+    {
+        const ::fwMemory::BufferManager::BufferInfoMapType buffInfoMap = m_bufferInfos;
+        ::fwMemory::BufferManager::ConstBufferPtrType selectedBuffer = m_objectsUID[index];
+
+        ::fwMemory::BufferManager::BufferInfoMapType::const_iterator iter;
+        iter = buffInfoMap.find(selectedBuffer);
+        if( iter != buffInfoMap.end())
+        {
+            ::fwGui::Cursor cursor;
+            cursor.setCursor(::fwGui::ICursor::BUSY);
+            const ::fwMemory::BufferInfo &dumpBuffInfo = iter->second;
+
+            bool isLock = dumpBuffInfo.lockCount() > 0;
+            if ( !isLock )
+            {
+                if ( dumpBuffInfo.loaded )
+                {
+                    buffManager->dumpBuffer(selectedBuffer);
+                }
+                else
+                {
+                    buffManager->restoreBuffer(selectedBuffer);
+                }
+            }
+            else
+            {
+                ::fwGui::dialog::MessageDialog::showMessageDialog(
+                        "Dump process information",
+                        "Dump process is locked. It is impossible to dump or restore this object.",
+                        ::fwGui::dialog::IMessageDialog::WARNING);
+            }
+
+            cursor.setDefaultCursor();
+
+            this->updating();
+        }
+        else
+        {
+            std::stringstream stream;
+            stream << "Object " << selectedBuffer << " not found, please refresh the grid.";
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Dump process information",
+                    stream.str(),
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafUI/monitorQt/src/monitorQt/Plugin.cpp b/Bundles/LeafUI/monitorQt/src/monitorQt/Plugin.cpp
new file mode 100644
index 0000000..fa35468
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/src/monitorQt/Plugin.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/operations.hpp>
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include "monitorQt/Plugin.hpp"
+
+namespace monitor
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::monitorQt::Plugin");
+
+//------------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace monitor
diff --git a/Bundles/LeafUI/monitorQt/src/monitorQt/action/ClassFactoryRegistryInfo.cpp b/Bundles/LeafUI/monitorQt/src/monitorQt/action/ClassFactoryRegistryInfo.cpp
new file mode 100644
index 0000000..70b47c3
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/src/monitorQt/action/ClassFactoryRegistryInfo.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QHBoxLayout>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+
+#include "monitorQt/action/ClassFactoryRegistryInfo.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::monitor::action::ClassFactoryRegistryInfo , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+ClassFactoryRegistryInfo::ClassFactoryRegistryInfo( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+ClassFactoryRegistryInfo::~ClassFactoryRegistryInfo() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ClassFactoryRegistryInfo::updating( ) throw(::fwTools::Failed)
+{
+    m_tree->clearSelection();
+    m_tree->clear();
+
+    typedef ::fwServices::registry::ServiceFactory ServiceRegistry;
+    const ServiceRegistry::KeyVectorType& factoryKeys = ServiceRegistry::getDefault()->getFactoryKeys();
+
+    BOOST_FOREACH( ServiceRegistry::KeyVectorType::value_type key, factoryKeys )
+    {
+        const std::string objImpl = ServiceRegistry::getDefault()->getObjectImplementation(key);
+        QTreeWidgetItem* srvItem = new QTreeWidgetItem();
+        srvItem->setText(0, QString::fromStdString(key));
+        srvItem->setText(1, QString::fromStdString(objImpl));
+        m_tree->addTopLevelItem( srvItem );
+    }
+    m_dialog->show();
+}
+
+//------------------------------------------------------------------------------
+
+void ClassFactoryRegistryInfo::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void ClassFactoryRegistryInfo::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+
+    QWidget *parent = qApp->activeWindow();
+    m_dialog = new QDialog(parent);
+    m_dialog->setWindowTitle("ServiceFactoryRegistry");
+    m_dialog->setMinimumSize(800, 600);
+
+    QHBoxLayout* sizer  = new QHBoxLayout();
+    m_tree = new QTreeWidget( m_dialog );
+    QStringList headerList = (QStringList() << "Service" << "Object");
+    m_tree->setColumnCount(2);
+    m_tree->setHeaderLabels(headerList);
+    m_tree->setColumnWidth(0, 300);
+    m_tree->setColumnWidth(1, 460);
+    m_tree->setSelectionMode(QAbstractItemView::SingleSelection);
+    m_tree->setAlternatingRowColors( true );
+
+    sizer->addWidget( m_tree ) ;
+    m_dialog->setLayout( sizer ) ;
+}
+
+//------------------------------------------------------------------------------
+
+void ClassFactoryRegistryInfo::stopping() throw (::fwTools::Failed)
+{
+    m_dialog->hide();
+    delete m_tree;
+    delete m_dialog;
+
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace monitor
+
diff --git a/Bundles/LeafUI/monitorQt/src/monitorQt/action/ComponentsTree.cpp b/Bundles/LeafUI/monitorQt/src/monitorQt/action/ComponentsTree.cpp
new file mode 100644
index 0000000..1d77999
--- /dev/null
+++ b/Bundles/LeafUI/monitorQt/src/monitorQt/action/ComponentsTree.cpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QVBoxLayout>
+
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/Bundle.hpp>
+#include <fwRuntime/ExtensionPoint.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include "monitorQt/action/ComponentsTree.hpp"
+
+namespace monitor
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::monitor::action::ComponentsTree , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+ComponentsTree::ComponentsTree( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+ComponentsTree::~ComponentsTree() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ComponentsTree::updating( ) throw(::fwTools::Failed)
+{
+    m_treeContainer->clearSelection();
+    m_treeContainer->clear();
+
+    ::fwRuntime::Runtime * defaultRuntime = ::fwRuntime::Runtime::getDefault() ;
+    ::fwRuntime::Runtime::BundleIterator iter_bundles = defaultRuntime->bundlesBegin() ;
+    while (iter_bundles != defaultRuntime->bundlesEnd())
+    {
+        const std::string bundleName = (*iter_bundles)->getIdentifier();
+        bool isBundleEnable = (*iter_bundles)->isEnable();
+        QTreeWidgetItem* bundleItem = new QTreeWidgetItem();
+        if(!isBundleEnable)
+        {
+            bundleItem->setBackground(0, QBrush(QColor(155,155,155)));
+        }
+        bundleItem->setText(0, QString::fromStdString(bundleName));
+        m_treeContainer->addTopLevelItem( bundleItem );
+
+        //Extensions
+        QTreeWidgetItem* extensionsItem = new QTreeWidgetItem();
+        extensionsItem->setText(0, QObject::tr("Extensions"));
+        bundleItem->addChild( extensionsItem );
+        ::fwRuntime::Bundle::ExtensionConstIterator iter_extension = (*iter_bundles)->extensionsBegin();
+        while (iter_extension != (*iter_bundles)->extensionsEnd())
+        {
+            std::string point = (*iter_extension)->getPoint() ;
+            bool isExtensionEnable = (*iter_extension)->isEnable();
+            QTreeWidgetItem* item = new QTreeWidgetItem();
+            if(!isExtensionEnable)
+            {
+                item->setBackground(0, QBrush(QColor(155,155,155)));
+            }
+            item->setText(0, QString::fromStdString(point));
+            extensionsItem->addChild( item );
+
+            ++iter_extension;
+        }
+        ++iter_bundles;
+    }
+
+    m_dialog->show();
+}
+
+//------------------------------------------------------------------------------
+
+void ComponentsTree::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void ComponentsTree::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+
+    QWidget *parent = qApp->activeWindow();
+    m_dialog = new QDialog(parent);
+    m_dialog->setWindowTitle("Components Tree");
+    m_treeContainer = new QTreeWidget(m_dialog);
+    m_treeContainer->setHeaderHidden(true);
+
+    QVBoxLayout* topsizer = new QVBoxLayout();
+    topsizer->addWidget(m_treeContainer);
+    topsizer->setContentsMargins(0,0,0,0);
+    m_dialog->setLayout(topsizer);
+}
+
+//------------------------------------------------------------------------------
+void ComponentsTree::stopping() throw (::fwTools::Failed)
+{
+    m_dialog->hide();
+    delete m_treeContainer;
+    delete m_dialog;
+
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace monitor
+
diff --git a/Bundles/LeafUI/uiGenericQt/CMakeLists.txt b/Bundles/LeafUI/uiGenericQt/CMakeLists.txt
new file mode 100644
index 0000000..15e59fe
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/CMakeLists.txt
@@ -0,0 +1,23 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+    fwTools
+)
+
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui QtHelp REQUIRED)
+find_package(Qt4 COMPONENTS QtWebKit)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiGenericQt/COPYING b/Bundles/LeafUI/uiGenericQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiGenericQt/COPYING.LESSER b/Bundles/LeafUI/uiGenericQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiGenericQt/Properties.cmake b/Bundles/LeafUI/uiGenericQt/Properties.cmake
new file mode 100644
index 0000000..a5fa6c6
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiGenericQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwData fwGui fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiGenericQt/bin/build.options b/Bundles/LeafUI/uiGenericQt/bin/build.options
new file mode 100644
index 0000000..5b48ebd
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/bin/build.options
@@ -0,0 +1,19 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwRender_0-1',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          ]
+USE     = ['qtCore','qtWebKit','qtSqldriversPlugins','qtHelp','boost']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Namespace.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Namespace.hpp
new file mode 100644
index 0000000..f9eb2ff
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIGENERICQT_NAMESPACE_HPP_
+#define UIGENERICQT_NAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiGeneric contains actions to show help, acknowledgments and about frame.
+ * @namespace   uiGeneric
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiGeneric
+{
+
+}
+#endif /* UIGENERICQT_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Plugin.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Plugin.hpp
new file mode 100644
index 0000000..0bf7b6f
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/Plugin.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_PLUGIN_HPP_
+#define _UIGENERICQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiGeneric
+{
+
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiGeneric
+
+#endif //_UIGENERICQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/LaunchBrowserActionService.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/LaunchBrowserActionService.hpp
new file mode 100644
index 0000000..e383e22
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/LaunchBrowserActionService.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_ACTION_OPENURLACTIONSERVICE_HPP_
+#define _UIGENERICQT_ACTION_OPENURLACTIONSERVICE_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiGenericQt/config.hpp"
+
+namespace uiGeneric
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action launch a browser on the url given in configuration.
+ * @class   LaunchBrowserActionService
+ * 
+ * @date    2010.
+ */
+class UIGENERICQT_CLASS_API LaunchBrowserActionService : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (LaunchBrowserActionService)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    UIGENERICQT_API LaunchBrowserActionService() throw() ;
+
+    /// Destructor. Do nothing.
+    UIGENERICQT_API virtual ~LaunchBrowserActionService() throw() ;
+
+protected:
+
+
+    /**
+     * @brief configure the action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiGeneric::action::LaunchBrowserActionService" autoConnect="no">
+        <url>http://www.ircad.fr</url>
+    </service>
+       @endverbatim
+     */
+    void configuring() throw( ::fwTools::Failed );
+
+    /// Starts action
+    void starting() throw (::fwTools::Failed);
+
+    /// Does nothing
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Launch a browser on the url given in the configuration
+    void updating() throw(::fwTools::Failed);
+
+    /// Stops action
+    void stopping() throw (::fwTools::Failed);
+
+    void info( std::ostream &_sstream ) ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+private:
+
+    std::string m_url;
+
+};
+
+} // action
+
+} // uiGeneric
+
+#endif /*_UIGENERICQT_ACTION_OPENURLACTIONSERVICE_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/SShowAbout.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/SShowAbout.hpp
new file mode 100644
index 0000000..2e2e7c8
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/SShowAbout.hpp
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIGENERICQT_ACTION_SSHOWABOUT_HPP__
+#define __UIGENERICQT_ACTION_SSHOWABOUT_HPP__
+
+#include <QObject>
+#include <QSize>
+#include <QUrl>
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiGenericQt/config.hpp"
+
+namespace uiGeneric
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action show the about frame.
+ * @class   SShowAbout
+ */
+class UIGENERICQT_CLASS_API SShowAbout : public QObject, public ::fwGui::IActionSrv
+{
+
+    Q_OBJECT
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SShowAbout)( ::fwGui::IActionSrv) ) ;
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+    UIGENERICQT_API SShowAbout() throw() ;
+    UIGENERICQT_API virtual ~SShowAbout() throw() ;
+    /**  @} */
+
+protected:
+    /**
+     * @brief Configuring method.
+     *
+     * XML configuration sample:
+     @verbatim
+     <service impl="::uiGeneric::action::SShowAbout" type="::fwGui::IActionSrv">
+         <filename id=".../aboutFile.html"/>
+         <title>title</title>
+         <size width="200" height="200" />
+     </service>
+     @endverbatim
+     * This method is used to configure the service.
+     */
+    void configuring() throw( ::fwTools::Failed ) ;
+
+    /// Starts action
+    void starting() throw (::fwTools::Failed);
+
+    /// Does nothing
+    void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Shows the frame
+    void updating() throw(::fwTools::Failed);
+
+    /// Stops action
+    void stopping() throw (::fwTools::Failed);
+
+    /// Prints service info
+    void info(std::ostream &_sstream) ;
+
+protected Q_SLOTS:
+
+    /**
+     * @brief Triggered when an URL is clicked in the about frame.
+     *
+     * @param url clicked URL
+     */
+    void onUrlClicked(const QUrl & url);
+
+private:
+    /// Set to 'true' if the about file path is known.
+    bool m_bServiceIsConfigured;
+
+    /**
+     * @brief about file path.
+     */
+    ::boost::filesystem::path m_fsAboutPath;
+
+    /// Frame title (default value set to "About").
+    std::string m_title;
+
+    /// Frame size.
+    QSize m_size;
+};
+
+} // namespace action
+
+} // namespace uiGeneric
+
+#endif // __UIGENERICQT_ACTION_SSHOWABOUT_HPP__
+
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowAcknowledgments.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowAcknowledgments.hpp
new file mode 100644
index 0000000..80cf76d
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowAcknowledgments.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_UI_ACTION_SHOWACK_HPP_
+#define _UIGENERICQT_UI_ACTION_SHOWACK_HPP_
+
+#include <QObject>
+#include <QUrl>
+#include <boost/filesystem/path.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiGenericQt/config.hpp"
+
+namespace uiGeneric
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action show the acknowlegments frame.
+ * @class   ShowAcknowledgments
+ * 
+ * @date    2010.
+ */
+class UIGENERICQT_CLASS_API ShowAcknowledgments : public QObject, public ::fwGui::IActionSrv
+{
+    Q_OBJECT
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ShowAcknowledgments)( ::fwGui::IActionSrv) ) ;
+    UIGENERICQT_API ShowAcknowledgments() throw() ;
+
+    UIGENERICQT_API virtual ~ShowAcknowledgments() throw() ;
+
+protected:
+
+    /**
+     * @brief configure the action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiGeneric::action::ShowAcknowledgments" autoConnect="no">
+        <filename id=".../ack.html" />
+    </service>
+       @endverbatim
+     */
+    UIGENERICQT_API void configuring() throw( ::fwTools::Failed ) ;
+
+    /// Starts action
+    void starting() throw (::fwTools::Failed);
+
+    /// Show the frame
+    void updating() throw (::fwTools::Failed);
+
+    /// Does nothing
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    /// Stops action
+    void stopping() throw (::fwTools::Failed);
+
+    UIGENERICQT_API void info(std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+
+    void onUrlClicked(const QUrl & url );
+
+private:
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the help files path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief acknowledge file path.
+    */
+    ::boost::filesystem::path m_fsAckPath;
+};
+
+} // namespace action
+} // namespace uiGeneric
+
+#endif /*_UIGENERICQT_ACTION_SHOWACK_HPP_*/
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowHelpContents.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowHelpContents.hpp
new file mode 100644
index 0000000..8bb2861
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowHelpContents.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_UI_ACTION_SHOWHELPCONTENTS_HPP_
+#define _UIGENERICQT_UI_ACTION_SHOWHELPCONTENTS_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiGenericQt/config.hpp"
+
+namespace uiGeneric
+{
+namespace action
+{
+
+/**
+ * @brief   This action show the help contents.
+ * @class   ShowHelpContents
+ * 
+ * @date    2010.
+ */
+class UIGENERICQT_CLASS_API ShowHelpContents : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ShowHelpContents)( ::fwGui::IActionSrv) ) ;
+    UIGENERICQT_API ShowHelpContents() throw() ;
+
+    UIGENERICQT_API virtual ~ShowHelpContents() throw() ;
+
+protected:
+
+    /**
+    * @brief Configuring method.
+    *
+    * XML configuration sample:
+    * @verbatim
+    <service impl="::uiGeneric::ui::action::ShowHelpContents" type="::fwGui::IActionSrv">
+        <filename id=".../doc.qhc"/>
+    </service>
+    @endverbatim
+    * This method is used to configure the service.
+    */
+    void configuring() throw (::fwTools::Failed);
+
+    /// Starts action
+    void starting() throw (::fwTools::Failed);
+
+    /// Does nothing
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /// Show the frame
+    void updating() throw(::fwTools::Failed);
+
+    /// Stops action
+    void stopping() throw (::fwTools::Failed);
+
+    UIGENERICQT_API void info(std::ostream &_sstream ) ;
+
+private:
+    /**
+    * @brief the m_bServiceIsConfigured value is \b true
+    * if the help files path is known.
+    */
+    bool m_bServiceIsConfigured;
+
+    /**
+    * @brief help files path.
+    */
+    ::boost::filesystem::path m_fsHelpPath;
+};
+
+} // namespace action
+
+} // namespace uiGeneric
+
+#endif /*_UIGENERICQT_ACTION_SHOWHELPCONTENTS_HPP_*/
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowRevInfo.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowRevInfo.hpp
new file mode 100644
index 0000000..e55aaa8
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/action/ShowRevInfo.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_UI_ACTION_SHOWREVINFO_HPP_
+#define _UIGENERICQT_UI_ACTION_SHOWREVINFO_HPP_
+
+#include <map>
+#include <set>
+
+#include <QObject>
+#include <QTextDocument>
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiGenericQt/config.hpp"
+
+namespace uiGeneric
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action show the revision info for bundle and lib.
+ * @class   ShowRevInfo
+ * 
+ * @date    2011.
+ */
+class UIGENERICQT_CLASS_API ShowRevInfo : public QObject, public ::fwGui::IActionSrv
+{
+    Q_OBJECT
+public:
+
+    typedef std::map<std::string, ::boost::filesystem::path> FindMapType;
+    typedef std::set<std::string> BundleNameSet;
+    typedef std::set<std::string> LibNameSet;
+    typedef std::pair<BundleNameSet, LibNameSet> BundleLibPairType;
+    typedef std::map<std::string, BundleLibPairType> RevMapType;
+
+    fwCoreServiceClassDefinitionsMacro ( (ShowRevInfo)( ::fwGui::IActionSrv) ) ;
+
+    UIGENERICQT_API ShowRevInfo() throw() ;
+
+    UIGENERICQT_API virtual ~ShowRevInfo() throw() ;
+
+protected:
+
+    /**
+     * @brief configure the action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiGeneric::action::ShowRevInfo" autoConnect="no" />
+       @endverbatim
+     */
+    UIGENERICQT_API void configuring() throw( ::fwTools::Failed ) ;
+
+    /// Starts action
+    UIGENERICQT_API void starting() throw (::fwTools::Failed);
+
+    /// Show the frame
+    UIGENERICQT_API void updating() throw (::fwTools::Failed);
+
+    /// Does nothing
+    UIGENERICQT_API void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    /// Stops action
+    UIGENERICQT_API void stopping() throw (::fwTools::Failed);
+
+    UIGENERICQT_API void info(std::ostream &_sstream ) ;
+
+private:
+
+    const FindMapType findRevInfo(const ::boost::filesystem::path& findPath);
+    void getRevMap(const FindMapType& findMap, RevMapType& revMap, bool isBundle = false);
+
+    QTextDocument* generateReport();
+
+protected Q_SLOTS:
+
+    void saveReport();
+
+};
+
+} // namespace action
+} // namespace uiGeneric
+
+#endif /*_UIGENERICQT_UI_ACTION_SHOWREVINFO_HPP_*/
diff --git a/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/config.hpp b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/config.hpp
new file mode 100644
index 0000000..eaa3bfe
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/include/uiGenericQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIGENERICQT_CONFIG_HPP_
+#define _UIGENERICQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIGENERICQT_EXPORTS
+    #define UIGENERICQT_API __declspec(dllexport)
+    #else
+    #define UIGENERICQT_API __declspec(dllimport)
+    #endif
+
+    #define UIGENERICQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIGENERICQT_EXPORTS
+    #define UIGENERICQT_API __attribute__ ((visibility("default")))
+    #define UIGENERICQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIGENERICQT_API __attribute__ ((visibility("hidden")))
+    #define UIGENERICQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIGENERICQT_API
+    #define UIGENERICQT_CLASS_API
+
+#endif
+
+#endif //_UIGENERICQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiGenericQt/rc/plugin.xml b/Bundles/LeafUI/uiGenericQt/rc/plugin.xml
new file mode 100644
index 0000000..84ea4d0
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/rc/plugin.xml
@@ -0,0 +1,39 @@
+<plugin id="uiGenericQt" class="::uiGenericQt::Plugin">
+    <library name="uiGenericQt"/>
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiGeneric::action::LaunchBrowserActionService</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiGeneric::action::SShowAbout</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiGeneric::action::ShowAcknowledgments</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiGeneric::action::ShowHelpContents</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiGeneric::action::ShowRevInfo</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/Plugin.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/Plugin.cpp
new file mode 100644
index 0000000..e1df96c
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/Plugin.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiGenericQt/Plugin.hpp"
+
+namespace uiGeneric
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiGenericQt::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/LaunchBrowserActionService.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/LaunchBrowserActionService.cpp
new file mode 100644
index 0000000..e73f0b5
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/LaunchBrowserActionService.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <QCoreApplication>
+#include <QDesktopServices>
+#include <QUrl>
+
+#include <fwCore/base.hpp>
+#include <fwData/Object.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiGenericQt/action/LaunchBrowserActionService.hpp"
+
+namespace uiGeneric
+{
+
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiGeneric::action::LaunchBrowserActionService , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+LaunchBrowserActionService::LaunchBrowserActionService( ) throw()
+{
+    m_url = "";
+}
+
+//------------------------------------------------------------------------------
+
+LaunchBrowserActionService::~LaunchBrowserActionService() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void LaunchBrowserActionService::info(std::ostream &_sstream )
+{
+    _sstream << "Action for manage url" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void LaunchBrowserActionService::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IActionSrv::initialize();
+
+    std::vector < Configuration > urlConfig = m_configuration->find("url");
+    if(!urlConfig.empty())
+    {
+        m_url = urlConfig.at(0)->getValue();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void LaunchBrowserActionService::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_WARN_IF("URL is empty.", m_url.empty());
+    QUrl url(QString::fromStdString(m_url), QUrl::TolerantMode);
+
+    if(url.isRelative()) // no scheme
+    {
+        ::boost::filesystem::path path(QCoreApplication::applicationDirPath().toStdString());
+        path = path.parent_path(); // install folder path
+        path /= url.path().toStdString();
+
+        QString urlStr = QString::fromStdString("file:///" + path.string());
+        url = QUrl(urlStr, QUrl::TolerantMode);
+    }
+
+    bool isSuccess = QDesktopServices::openUrl(url);
+    SLM_WARN_IF("Browser wasn't successfully launched.", !isSuccess);
+}
+
+//------------------------------------------------------------------------------
+
+void LaunchBrowserActionService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void LaunchBrowserActionService::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void LaunchBrowserActionService::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/SShowAbout.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/SShowAbout.cpp
new file mode 100644
index 0000000..eb29709
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/SShowAbout.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#if defined(QT_WEBKIT)
+#include <QWebView>
+#include <QWebPage>
+#else
+#include <QTextBrowser>
+#endif
+#include <QDesktopServices>
+#include <QDialog>
+#include <QFrame>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <boost/filesystem/operations.hpp>
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiGenericQt/action/SShowAbout.hpp"
+
+namespace uiGeneric
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiGeneric::action::SShowAbout , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+SShowAbout::SShowAbout( ) throw():
+    m_bServiceIsConfigured(false),
+    m_fsAboutPath(""),
+    m_title("About"),
+    m_size(500, 300)
+{}
+
+//------------------------------------------------------------------------------
+
+SShowAbout::~SShowAbout() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::info(std::ostream &_sstream )
+{
+    _sstream << "SShowAbout" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+
+    typedef SPTR(::fwRuntime::ConfigurationElement) ConfigurationElement;
+
+    ConfigurationElement cfgFilename = m_configuration->findConfigurationElement("filename");
+    ConfigurationElement cfgTitle = m_configuration->findConfigurationElement("title");
+    ConfigurationElement cfgSize = m_configuration->findConfigurationElement("size");
+
+    if(cfgFilename)
+    {
+        const std::string& filename = cfgFilename->getExistingAttributeValue("id");
+
+        m_fsAboutPath = ::boost::filesystem::path( std::string(SHAREPATH) + filename.substr(8) );
+        m_bServiceIsConfigured = ::boost::filesystem::exists(m_fsAboutPath);
+        SLM_WARN_IF("About file " + filename + " doesn't exist", !m_bServiceIsConfigured);
+        SLM_TRACE("Filename found '" + filename + "'");
+    }
+
+    if(cfgTitle)
+    {
+        m_title = cfgTitle->getValue();
+        SLM_TRACE("Set title to '" + m_title + "'");
+    }
+
+    if(cfgSize)
+    {
+        const std::string& w = cfgSize->getExistingAttributeValue("width");
+        const std::string& h = cfgSize->getExistingAttributeValue("height");
+
+        m_size.setWidth(::boost::lexical_cast< int >(w));
+        m_size.setHeight(::boost::lexical_cast< int >(h));
+
+        OSLM_TRACE("Set frame size to (" << m_size.width() << ", " << m_size.height() << ")");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::updating( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    SLM_ASSERT("The about service isn't configured properly.", m_bServiceIsConfigured );
+
+    QDialog* dialog = new QDialog(qApp->activeWindow());
+    dialog->setWindowTitle(QString::fromStdString(m_title));
+    QUrl url(QString::fromStdString(m_fsAboutPath.string()));
+#if defined(QT_WEBKIT)
+    QWebView* htmlView = new QWebView(dialog);
+    htmlView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    htmlView->load( url );
+    QObject::connect( htmlView, SIGNAL(linkClicked(const QUrl&)),this, SLOT(onUrlClicked(const QUrl&)));
+#else
+    QTextBrowser * htmlView = new QTextBrowser(dialog);
+    htmlView->setSource(url);
+    htmlView->setOpenExternalLinks(true);
+    htmlView->setMinimumSize(m_size);
+#endif
+    QPushButton* okButton = new QPushButton(QObject::tr("Ok"));
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addStretch();
+    hLayout->addWidget(okButton);
+    hLayout->setContentsMargins(5, 5, 5, 5);
+
+    QFrame* line = new QFrame(dialog);
+    line->setFrameShape(QFrame::HLine);
+    line->setFrameShadow(QFrame::Sunken);
+
+    QVBoxLayout* layout = new QVBoxLayout();
+    layout->addWidget(htmlView, 0);
+    layout->addWidget(line, 0);
+    layout->addLayout(hLayout, 0);
+    layout->setContentsMargins(0, 0, 0, 0);
+    layout->setSpacing(0);
+    dialog->setLayout( layout );
+
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    QObject::connect(dialog, SIGNAL(accepted()), dialog, SLOT(deleteLater()));
+    dialog->setModal(true);
+    dialog->show();
+}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SShowAbout::onUrlClicked(const QUrl & url )
+{
+    QDesktopServices::openUrl(url);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowAcknowledgments.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowAcknowledgments.cpp
new file mode 100644
index 0000000..75c0104
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowAcknowledgments.cpp
@@ -0,0 +1,141 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#if defined(QT_WEBKIT)
+#include <QWebView>
+#include <QWebPage>
+#else
+#include <QTextBrowser>
+#endif
+#include <QDialog>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QFrame>
+#include <QDesktopServices>
+
+#include <boost/filesystem/operations.hpp>
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiGenericQt/action/ShowAcknowledgments.hpp"
+
+namespace uiGeneric
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiGeneric::action::ShowAcknowledgments , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+ShowAcknowledgments::ShowAcknowledgments( ) throw():
+m_bServiceIsConfigured(false),
+m_fsAckPath("")
+{}
+
+//------------------------------------------------------------------------------
+
+ShowAcknowledgments::~ShowAcknowledgments() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowAcknowledgments::info(std::ostream &_sstream )
+{
+    _sstream << "ShowAcknowledgments" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+void ShowAcknowledgments::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+    if( m_configuration->findConfigurationElement("filename") )
+    {
+        std::string filename = m_configuration->findConfigurationElement("filename")->getExistingAttributeValue("id") ;
+        m_fsAckPath = ::boost::filesystem::path( std::string(SHAREPATH) + filename.substr(8) ) ;
+        m_bServiceIsConfigured = ::boost::filesystem::exists(m_fsAckPath);
+        OSLM_WARN_IF("Acknowledgments file " <<filename<< " doesn't exist", !m_bServiceIsConfigured);
+        OSLM_TRACE("Filename found " << filename ) ;
+    }
+}
+
+//------------------------------------------------------------------------------
+void ShowAcknowledgments::updating( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    SLM_ASSERT("The Acknowledgments service isn't configured properly.", m_bServiceIsConfigured);
+
+    QDialog* dialog = new QDialog(qApp->activeWindow());
+    dialog->setWindowTitle(QString("Acknowledgments"));
+    QUrl url(QString::fromStdString(m_fsAckPath.string()));
+#if defined(QT_WEBKIT)
+    QWebView* htmlView = new QWebView(dialog);
+    htmlView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    htmlView->load( url );
+    QObject::connect( htmlView, SIGNAL(linkClicked(const QUrl&)),this, SLOT(onUrlClicked(const QUrl&)));
+#else
+    QTextBrowser * htmlView = new QTextBrowser (dialog);
+    htmlView->setSource(url);
+    htmlView->setOpenExternalLinks(true);
+    htmlView->setMinimumSize(500, 400);
+#endif
+    QPushButton* okButton = new QPushButton(QObject::tr("Ok"));
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addStretch();
+    hLayout->addWidget(okButton);
+    hLayout->setContentsMargins(5,5,5,5);
+
+    QFrame* line = new QFrame(dialog);
+    line->setFrameShape(QFrame::HLine);
+    line->setFrameShadow(QFrame::Sunken);
+
+    QVBoxLayout* layout = new QVBoxLayout();
+    layout->addWidget(htmlView, 0);
+    layout->addWidget(line, 0);
+    layout->addLayout(hLayout, 0);
+    layout->setContentsMargins(0,0,0,0);
+    layout->setSpacing(0);
+    dialog->setLayout( layout );
+
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    dialog->exec();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowAcknowledgments::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowAcknowledgments::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowAcknowledgments::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowAcknowledgments::onUrlClicked(const QUrl & url )
+{
+    QDesktopServices::openUrl(url);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowHelpContents.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowHelpContents.cpp
new file mode 100644
index 0000000..66372e5
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowHelpContents.cpp
@@ -0,0 +1,158 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QObject>
+#include <QApplication>
+#include <QDialog>
+#include <QHBoxLayout>
+#include <QSplitter>
+#include <QHelpEngine>
+#include <QHelpContentWidget>
+#include <QTextBrowser>
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "uiGenericQt/action/ShowHelpContents.hpp"
+
+namespace uiGeneric
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+/** @brief Help browser */
+class HelpBrowser : public QTextBrowser
+{
+public:
+    HelpBrowser(QHelpEngine *helpEngine, QWidget *parent = 0)
+        : QTextBrowser(parent), helpEngine(helpEngine)
+    {
+    }
+
+    QVariant loadResource(int type, const QUrl &url)
+    {
+        if (url.scheme() == "qthelp")
+            return QVariant(helpEngine->fileData(url));
+        else
+            return QTextBrowser::loadResource(type, url);
+    }
+
+private:
+    QHelpEngine *helpEngine;
+};
+//------------------------------------------------------------------------------
+
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiGeneric::action::ShowHelpContents , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+ShowHelpContents::ShowHelpContents( ) throw():
+    m_bServiceIsConfigured(false),
+    m_fsHelpPath("")
+{}
+
+//------------------------------------------------------------------------------
+
+ShowHelpContents::~ShowHelpContents() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::info(std::ostream &_sstream )
+{
+    _sstream << "Action for show help contents" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::configuring() throw(::fwTools::Failed)
+{
+    /*
+     * .qhp/.qch (source/binary) : Contains a table of contents,
+     *                             an index of items in the documentation, and a file manifest.
+     * .qhcp/.qhc (source/binary): Contains information that is used to customize
+     *                             the appearance and available features of Qt Assistant.
+    */
+    this->::fwGui::IActionSrv::initialize();
+    if( m_configuration->findConfigurationElement("filename") )
+    {
+        std::string filename = m_configuration->findConfigurationElement("filename")->getExistingAttributeValue("id") ;
+        m_fsHelpPath = ::boost::filesystem::path( filename ) ;
+        m_bServiceIsConfigured = ::boost::filesystem::exists(m_fsHelpPath);
+        OSLM_WARN_IF("Help file " <<filename<< " doesn't exist", !m_bServiceIsConfigured);
+        OSLM_TRACE("Filename found " << filename ) ;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    SLM_ASSERT("The Help service isn't configured properly.", m_bServiceIsConfigured);
+
+    QDialog* dialog = new QDialog(qApp->activeWindow());
+    dialog->setWindowTitle(QString("Help"));
+    QHelpEngine* helpEngine = new QHelpEngine(QString::fromStdString(m_fsHelpPath.string()), dialog);
+    if (!helpEngine->setupData())
+    {
+        OSLM_ERROR("HelpEngine error: " << helpEngine->error().toStdString());
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage( "Help file is missing or not correct." );
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+       // Setup help engine information failed.
+       // qhc (Qt Help Collection) or qch (Qt Compressed Help) file is not correct.
+    }
+    else
+    {
+        QSplitter *helpPanel = new QSplitter(Qt::Horizontal);
+        HelpBrowser *helpBrowser = new HelpBrowser(helpEngine, dialog);
+        helpPanel->insertWidget(0, helpEngine->contentWidget());
+        helpPanel->insertWidget(1, helpBrowser);
+        helpPanel->setStretchFactor(1, 1);
+
+        QHBoxLayout *hLayout = new QHBoxLayout();
+        hLayout->addWidget(helpPanel);
+        dialog->setLayout( hLayout );
+        QObject::connect(helpEngine->contentWidget(), SIGNAL(linkActivated(const QUrl &)), helpBrowser, SLOT(setSource(const QUrl &)));
+
+        dialog->exec();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowHelpContents::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace action
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowRevInfo.cpp b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowRevInfo.cpp
new file mode 100644
index 0000000..22feed5
--- /dev/null
+++ b/Bundles/LeafUI/uiGenericQt/src/uiGenericQt/action/ShowRevInfo.cpp
@@ -0,0 +1,326 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <QApplication>
+#include <QTextBrowser>
+#include <QDialog>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QFrame>
+
+#include <QTextDocumentWriter>
+#include <QTextBlockFormat>
+#include <QTextCharFormat>
+#include <QTextCursor>
+#include <QTextTableFormat>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include "uiGenericQt/action/ShowRevInfo.hpp"
+
+namespace uiGeneric
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiGeneric::action::ShowRevInfo , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+ShowRevInfo::ShowRevInfo( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+ShowRevInfo::~ShowRevInfo() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowRevInfo::info(std::ostream &_sstream )
+{
+    _sstream << "ShowRevInfo" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+void ShowRevInfo::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+void ShowRevInfo::updating( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QDialog* dialog = new QDialog(qApp->activeWindow());
+    dialog->setWindowTitle(QString("Revision info"));
+
+    QTextBrowser * htmlView = new QTextBrowser (dialog);
+    htmlView->setDocument(this->generateReport());
+    htmlView->setOpenExternalLinks(true);
+    htmlView->setMinimumSize(800, 600);
+
+    QPushButton* okButton = new QPushButton(QObject::tr("Ok"));
+    QPushButton* genButton = new QPushButton(QObject::tr("Save report"));
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addStretch();
+    hLayout->addWidget(genButton);
+    hLayout->addWidget(okButton);
+    hLayout->setContentsMargins(5,5,5,5);
+
+    QFrame* line = new QFrame(dialog);
+    line->setFrameShape(QFrame::HLine);
+    line->setFrameShadow(QFrame::Sunken);
+
+    QVBoxLayout* layout = new QVBoxLayout();
+    layout->addWidget(htmlView, 0);
+    layout->addWidget(line, 0);
+    layout->addLayout(hLayout, 0);
+    layout->setContentsMargins(0,0,0,0);
+    layout->setSpacing(0);
+    dialog->setLayout( layout );
+
+    QObject::connect(genButton, SIGNAL(clicked()), this, SLOT(saveReport()));
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    dialog->exec();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowRevInfo::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowRevInfo::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowRevInfo::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+QTextDocument* ShowRevInfo::generateReport()
+{
+    QTextDocument* document = new QTextDocument();
+    QTextCursor cursor(document);
+
+    QTextCharFormat defaultFormat;
+    defaultFormat.setFontPointSize(12);
+
+    QTextCharFormat boldFormat = defaultFormat;
+    boldFormat.setFontWeight(QFont::Bold);
+
+    QTextCharFormat titleFormat = boldFormat;
+
+    titleFormat.setFontPointSize(20);
+
+    QTextBlockFormat centerFormat;
+    centerFormat.setAlignment(Qt::AlignHCenter);
+
+    cursor.setBlockFormat(centerFormat);
+    cursor.insertText(QString("Revision info"), titleFormat);
+    cursor.insertBlock();
+    cursor.insertBlock();
+
+    QTextBlockFormat leftFormat;
+    leftFormat.setAlignment(Qt::AlignLeft);
+    cursor.setBlockFormat(leftFormat);
+
+    QTextTableFormat tableFormat;
+    tableFormat.setCellPadding(5);
+    tableFormat.setMargin(0);
+    tableFormat.setBorder(1);
+    tableFormat.setPadding(0);
+    tableFormat.setHeaderRowCount(0);
+    tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);
+    tableFormat.setWidth(QTextLength(QTextLength::PercentageLength, 100));
+
+#ifdef SPECIALINSTALL
+    ::boost::filesystem::path bundlePath = BUNDLEPATH;
+    ::boost::filesystem::path libPath    = SHAREPATH;
+#else
+    ::boost::filesystem::path bundlePath = ::boost::filesystem::current_path() / "Bundles";
+    ::boost::filesystem::path libPath    = ::boost::filesystem::current_path() / "share";
+#endif
+    const FindMapType& bundleMap = this->findRevInfo(bundlePath);
+    const FindMapType& libMap =  this->findRevInfo(libPath);
+
+    RevMapType revMap;
+    this->getRevMap(bundleMap, revMap, true);
+    this->getRevMap(libMap, revMap, false);
+
+    cursor.movePosition(QTextCursor::EndOfBlock);
+    cursor.movePosition(QTextCursor::NextBlock);
+
+    cursor.insertBlock();
+    cursor.insertTable( revMap.size()+1, 3, tableFormat);
+
+    cursor.setBlockFormat(centerFormat);
+    cursor.insertText(tr("Revision"), boldFormat);
+    cursor.movePosition(QTextCursor::NextCell);
+
+    cursor.setBlockFormat(centerFormat);
+    cursor.insertText(tr("Bundle"), boldFormat);
+    cursor.movePosition(QTextCursor::NextCell);
+
+    cursor.setBlockFormat(centerFormat);
+    cursor.insertText(tr("Lib"), boldFormat);
+    cursor.movePosition(QTextCursor::NextCell);
+
+    BOOST_FOREACH(RevMapType::value_type val, revMap)
+    {
+        cursor.insertHtml(QString::fromStdString(val.first).replace("\n","<br/>"));
+        cursor.movePosition(QTextCursor::NextCell);
+        cursor.setBlockFormat(centerFormat);
+        BOOST_FOREACH(std::string name, val.second.first)
+        {
+            cursor.insertHtml(QString::fromStdString("<br/>" + name));
+        }
+
+        cursor.movePosition(QTextCursor::NextCell);
+        cursor.setBlockFormat(centerFormat);
+        BOOST_FOREACH(std::string name, val.second.second)
+        {
+            cursor.insertHtml(QString::fromStdString("<br/>" + name));
+        }
+        cursor.movePosition(QTextCursor::NextCell);
+    }
+    return document;
+}
+
+//------------------------------------------------------------------------------
+
+const ShowRevInfo::FindMapType ShowRevInfo::findRevInfo(const ::boost::filesystem::path& findPath)
+{
+    FindMapType findMap;
+
+    std::string filename;
+    std::string findname;
+    for (::boost::filesystem::recursive_directory_iterator iter(findPath), end; iter != end; ++iter)
+    {
+#if BOOST_FILESYSTEM_VERSION > 2
+        filename = iter->path().filename().string();
+#else
+        filename =  iter->path().leaf();
+#endif
+        if(filename == "rev.info")
+        {
+#if BOOST_FILESYSTEM_VERSION > 2
+            findname = iter->path().parent_path().filename().string();
+#else
+            findname = iter->path().leaf();
+#endif
+            findname = iter->path().parent_path().filename().string();
+            findMap[findname] = iter->path();
+        }
+    }
+    return findMap;
+}
+
+//------------------------------------------------------------------------------
+
+
+void ShowRevInfo::getRevMap(const ShowRevInfo::FindMapType& findMap, ShowRevInfo::RevMapType& revMap, bool isBundle)
+{
+    BOOST_FOREACH(FindMapType::value_type val, findMap)
+    {
+        size_t length;
+        std::string buf;
+        std::ifstream file;
+        file.open(val.second.string().c_str(), std::ios::binary );
+
+        if (!file.is_open())
+        {
+            OSLM_ERROR( "RevInfo file loading error for " << val.second.string());
+            throw std::ios_base::failure("Unable to open " + val.second.string());
+        }
+
+        file.seekg (0, std::ios::end);
+        length = file.tellg();
+        file.seekg (0, std::ios::beg);
+        buf.resize(length);
+        char *buffer = &buf[0];
+
+        file.read (buffer, length);
+        file.close();
+
+        if(isBundle)
+        {
+            revMap[buf].first.insert(val.first);
+        }
+        else
+        {
+            revMap[buf].second.insert(val.first);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowRevInfo::saveReport()
+{
+    static ::boost::filesystem::path _sDefaultPath("");
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a location to save revision info report");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("ODT","*.odt");
+    dialogFile.addFilter("HTML","*.html");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result = ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+
+    if( result )
+    {
+        ::boost::filesystem::path filename = result->getPath();
+        _sDefaultPath = filename.parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+
+        QTextDocument* document = this->generateReport();
+
+        QTextDocumentWriter writer(QString::fromStdString(filename.string()));
+        if( ::boost::filesystem::extension(filename) == ".odt" )
+        {
+            writer.setFormat("ODF");
+        }
+        else
+        {
+            writer.setFormat("HTML");
+        }
+        writer.write(document);
+        delete document;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiGeneric
diff --git a/Bundles/LeafUI/uiIO/CMakeLists.txt b/Bundles/LeafUI/uiIO/CMakeLists.txt
new file mode 100644
index 0000000..be0b3cd
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/CMakeLists.txt
@@ -0,0 +1,8 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwMedData
+    fwRuntime
+
+    gui
+)
diff --git a/Bundles/LeafUI/uiIO/COPYING b/Bundles/LeafUI/uiIO/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiIO/COPYING.LESSER b/Bundles/LeafUI/uiIO/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiIO/Properties.cmake b/Bundles/LeafUI/uiIO/Properties.cmake
new file mode 100644
index 0000000..f05cc38
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiIO )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwMedData fwRuntime fwServices gui io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiIO/bin/build.options b/Bundles/LeafUI/uiIO/bin/build.options
new file mode 100644
index 0000000..42ae638
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/bin/build.options
@@ -0,0 +1,13 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwMedData_0-1',
+          'fwServices_0-1',
+          'fwTools_0-1',
+          'fwComEd_0-1',
+          'fwGui_0-1'
+          ]
+BUNDLES = ['gui_0-1','io_0-1']
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/Namespace.hpp b/Bundles/LeafUI/uiIO/include/uiIO/Namespace.hpp
new file mode 100644
index 0000000..b7e68a5
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIIONAMESPACE_HPP_
+#define UIIONAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiIO contains a simple service to manipulate IO with IHM..
+ * @namespace   uiIO
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiIO
+{
+
+}
+#endif /* UIIONAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/Plugin.hpp b/Bundles/LeafUI/uiIO/include/uiIO/Plugin.hpp
new file mode 100644
index 0000000..8202c0e
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/Plugin.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIO_PLUGIN_HPP_
+#define _UIIO_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace uiIO
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+
+public :
+
+    /// PLugin destructor
+    ~Plugin() throw();
+    
+    /// This method is used by runtime to initialize the bundle.
+    void start() throw( ::fwRuntime::RuntimeException );
+
+    /// This method is used by runtime to stop the bundle.
+    void stop() throw();
+    
+};
+
+} // namespace uiIO
+
+#endif //_UIIO_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/action/SSeriesDBMerger.hpp b/Bundles/LeafUI/uiIO/include/uiIO/action/SSeriesDBMerger.hpp
new file mode 100644
index 0000000..5810b5a
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/action/SSeriesDBMerger.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIO_ACTION_SSERIESDBMERGER_HPP_
+#define _UIIO_ACTION_SSERIESDBMERGER_HPP_
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiIO/config.hpp"
+
+namespace uiIO
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows to load a new SeriesDB and merge it with the current SeriesDB
+ * @class   SSeriesDBMerger
+ * @date    2013.
+ *
+ * The available reader can be configured
+ * @verbatim
+    <service uid="action_seriesDBMerger" type="::fwGui::IActionSrv" impl="::uiIO::action::SSeriesDBMerger" autoConnect="no">
+        <IOSelectorSrvConfig name="seriesDBImporterConfig" />
+    </service>
+   @endverbatim
+ * With :
+ *  - \b seriesDBImporterConfig : the id of a configuration for IOSelectorService
+ *  for example
+ *  @verbatim
+    <extension implements="::fwServices::registry::ServiceConfig">
+        <id>seriesDBImporterConfig</id>
+        <service>::uiIO::editor::IOSelectorService</service>
+        <desc>IOSelector config to import SeriesDB</desc>
+        <config>
+            <type mode="reader" />
+            <selection mode="exclude" />
+            <addSelection service="::ioAtoms::SReader" />
+        </config>
+    </extension>
+    @endverbatim
+ */
+class UIIO_CLASS_API SSeriesDBMerger : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesDBMerger)( ::fwGui::IActionSrv) ) ;
+
+    UIIO_API SSeriesDBMerger() throw() ;
+
+    UIIO_API virtual ~SSeriesDBMerger() throw() ;
+
+protected:
+
+    /// Configure action. Retrieves the IOSelector config
+    void configuring() throw( ::fwTools::Failed ) ;
+
+    /// Start action.
+    void starting() throw (::fwTools::Failed);
+
+    /// Show the SeriesDB reader selector, load the new SeriesDB and merge it the the current SeriesDB
+    void updating() throw (::fwTools::Failed);
+
+    /// Does nothing
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    /// Stop action.
+    void stopping() throw (::fwTools::Failed);
+    void info(std::ostream &_sstream ) ;
+
+private:
+    std::string m_ioSelectorSrvConfig;
+
+};
+
+} // namespace action
+} // namespace uiIO
+
+#endif // _UIIO_ACTION_SSERIESDBMERGER_HPP_
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/config.hpp b/Bundles/LeafUI/uiIO/include/uiIO/config.hpp
new file mode 100644
index 0000000..4c209a4
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIO_CONFIG_HPP_
+#define _UIIO_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIIO_EXPORTS
+    #define UIIO_API __declspec(dllexport)
+    #else
+    #define UIIO_API __declspec(dllimport)
+    #endif
+
+    #define UIIO_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIIO_EXPORTS
+    #define UIIO_API __attribute__ ((visibility("default")))
+    #define UIIO_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIIO_API __attribute__ ((visibility("hidden")))
+    #define UIIO_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIIO_API
+    #define UIIO_CLASS_API
+
+#endif
+
+#endif //_UIIO_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/editor/IOSelectorService.hpp b/Bundles/LeafUI/uiIO/include/uiIO/editor/IOSelectorService.hpp
new file mode 100644
index 0000000..3e6ccea
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/editor/IOSelectorService.hpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIO_EDITOR_IOSELECTORSERVICE_HPP_
+#define _UIIO_EDITOR_IOSELECTORSERVICE_HPP_
+
+#include <gui/editor/IDialogEditor.hpp>
+
+#include "uiIO/config.hpp"
+
+namespace uiIO
+{
+namespace editor
+{
+
+/**
+ * @brief   Defines the service interface managing the editor service for object.
+ * @class   IOSelectorService
+ * 
+ * @date    2009.
+ */
+class UIIO_CLASS_API IOSelectorService : public ::gui::editor::IDialogEditor
+{
+
+public :
+
+    /// IOMode enum definition
+    typedef enum {
+        READER_MODE, /**< this mode allows to configure the service as a reader */
+        WRITER_MODE  /**< this mode allows to configure the service as a writer */
+    } IOMode;
+
+    fwCoreServiceClassDefinitionsMacro ( (IOSelectorService)( ::gui::editor::IDialogEditor) ) ;
+
+    /**
+     * @brief   Constructor. Do nothing (Just initialize parameters).
+     *
+     * By default, the IOSelectorService::m_mode is defined as READER_MODE, and IOSelectorService::m_servicesAreExcluded as true.
+     */
+    UIIO_API IOSelectorService();
+
+    /// Destructor. Do nothing.
+    UIIO_API virtual ~IOSelectorService() throw() ;
+
+    /**
+     * @brief This method allows to configure the service in reader or writer mode (set IOSelectorService::m_mode).
+     *
+     *@param[in] _mode the value can be IOSelectorService::READER_MODE or IOSelectorService::WRITER_MODE.
+     */
+    UIIO_API void setIOMode( IOMode _mode ) ;
+
+protected:
+
+    ///Starts the service. Do nothing.
+    UIIO_API void starting() throw( ::fwTools::Failed ) ;
+
+    /// Stops the service. Do nothing.
+    UIIO_API void stopping() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief   This method initializes class member parameters from configuration elements.
+     *
+     * The method verifies if the configuration is well written and retrieves user parameter values.
+     * Thanks to this method, IOSelectorService::m_selectedServices value is up to date (cleared before reconfiguring).
+     *
+     * Sample of configuration :
+     * @verbatim
+          <service uid="GENERIC_UID_writer" type="::gui::editor::IDialogEditor" impl="::uiIO::editor::IOSelectorService" autoConnect="no">
+              <type mode="writer" />
+              <selection mode="include" />
+              <addSelection service="::ioAtoms::SWriter" />
+              <config id="ioAtomsConfig" service="::ioAtoms::SWriter" />
+          </service>
+     * @endverbatim
+     * With :
+     * None of these parameters are mandatory.
+     *  - \b type
+     *      - \b mode (mandatory) : selector type must be "reader" (to open file) or "writer" (to write a new file).
+     *  - \b selection
+     *      - \b mode (mandatory) : must be include (to add the selection to selector list ) or exclude (to exclude the selection of the selector list).
+     *  - \b addSelection
+     *      - \b service (mandatory) : Name of the service to include/exclude to the choice list of the selector.
+     *  - \b config
+     *      - \b id (mandatory) : the id of the configuration to use.
+     *      - \b service (mandatory) :  the name of the service.
+    **/
+    UIIO_API void configuring() throw( ::fwTools::Failed ) ;
+
+    /// Create a dialogue box to provide the user different available readers (writer) for the IOSelector associated objects. Then, the selected reader (writer) is executed.
+    UIIO_API void updating() throw( ::fwTools::Failed ) ;
+
+    /// SLM_FATAL require an implementation gui::editor::IEditor::updating(msg)
+    UIIO_API void receiving( ::fwServices::ObjectMsg::csptr ) throw( ::fwTools::Failed );
+
+    /// Gives the name of the class. Do nothing.
+    UIIO_API void info( std::ostream &_sstream ) ;
+
+private :
+
+    /// Configure the service as writer or reader.
+    IOMode m_mode;
+
+    /// Configure if selected services are included or excluded.
+    bool m_servicesAreExcluded;
+
+    /**
+    * @brief List of services to be included or excluded.
+    *
+    * @see IOSelectorService::m_servicesAreExcluded.
+    */
+    std::vector< std::string > m_selectedServices;
+
+    /// Map that specifies a configuration extension for a service
+    std::map< std::string, std::string > m_serviceToConfig;
+
+    std::string m_inject;
+};
+
+} // namespace editor
+
+} // namespace uiIO
+
+#endif // _UIIO_EDITOR_IOSELECTORSERVICE_HPP_
+
diff --git a/Bundles/LeafUI/uiIO/include/uiIO/editor/Namespace.hpp b/Bundles/LeafUI/uiIO/include/uiIO/editor/Namespace.hpp
new file mode 100644
index 0000000..f47618f
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/include/uiIO/editor/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIIOEDITORNAMESPACE_HPP_
+#define UIIOEDITORNAMESPACE_HPP_
+
+namespace uiIO
+{
+/**
+ * @brief       The namespace uiIO::editor contains a simple IO selector service.
+ * @namespace   uiIO::editor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace editor
+{
+
+}
+}
+#endif /* UIIOEDITORNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiIO/rc/plugin.xml b/Bundles/LeafUI/uiIO/rc/plugin.xml
new file mode 100644
index 0000000..b6f3a93
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/rc/plugin.xml
@@ -0,0 +1,25 @@
+<plugin id="uiIO" class="::uiIO::Plugin" >
+
+    <library name="uiIO" />
+
+    <requirement id="dataReg" />
+    <requirement id="gui" />
+    <requirement id="io" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IDialogEditor</type>
+        <service>::uiIO::editor::IOSelectorService</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiIO::action::SSeriesDBMerger</service>
+        <object>::fwMedData::SeriesDB</object>
+        <desc>Merge SeriesDB</desc>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafUI/uiIO/src/uiIO/Plugin.cpp b/Bundles/LeafUI/uiIO/src/uiIO/Plugin.cpp
new file mode 100644
index 0000000..b7ddc45
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/src/uiIO/Plugin.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "uiIO/Plugin.hpp"
+
+namespace uiIO
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiIO::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace uiIO
diff --git a/Bundles/LeafUI/uiIO/src/uiIO/action/SSeriesDBMerger.cpp b/Bundles/LeafUI/uiIO/src/uiIO/action/SSeriesDBMerger.cpp
new file mode 100644
index 0000000..4ef0e2b
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/src/uiIO/action/SSeriesDBMerger.cpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/Series.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGui/Cursor.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include "uiIO/action/SSeriesDBMerger.hpp"
+
+namespace uiIO
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiIO::action::SSeriesDBMerger , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+SSeriesDBMerger::SSeriesDBMerger( ) throw() : m_ioSelectorSrvConfig ("IOSelectorServiceConfigVRRenderReader")
+{}
+
+//------------------------------------------------------------------------------
+
+SSeriesDBMerger::~SSeriesDBMerger() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::info(std::ostream &_sstream )
+{
+    _sstream << "Action for add SeriesDB" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    this->::fwGui::IActionSrv::initialize();
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("IOSelectorSrvConfig");
+    if(!vectConfig.empty())
+    {
+        ConfigurationType selectorConfig = vectConfig.at(0);
+        SLM_ASSERT("Missing 'name' attribute", selectorConfig->hasAttribute("name")) ;
+        m_ioSelectorSrvConfig = selectorConfig->getAttributeValue("name") ;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::updating( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::LockAction lock(this->getSptr());
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+    SLM_ASSERT("SeriesDB not instanced", seriesDB);
+
+    // Create a new SeriesDB
+    ::fwMedData::SeriesDB::sptr localSeriesDB = ::fwMedData::SeriesDB::New();
+
+    /// Create IOSelectorService on the new SeriesDB and execute it.
+
+    // Get the config
+    ::fwRuntime::ConfigurationElement::csptr ioCfg;
+    ioCfg = ::fwServices::registry::ServiceConfig::getDefault()->getServiceConfig(m_ioSelectorSrvConfig ,
+                                                                                  "::uiIO::editor::IOSelectorService");
+    SLM_ASSERT("Sorry, there is not service configuration "
+               << m_ioSelectorSrvConfig
+               << " for ::uiIO::editor::IOSelectorService", ioCfg) ;
+
+    // Init and execute the service
+    ::fwServices::IService::sptr ioSelectorSrv;
+    ioSelectorSrv = ::fwServices::add(localSeriesDB,
+                                      "::gui::editor::IDialogEditor",
+                                      "::uiIO::editor::IOSelectorService");
+    ioSelectorSrv->setConfiguration( ::fwRuntime::ConfigurationElement::constCast(ioCfg) ) ;
+    ioSelectorSrv->configure() ;
+    ioSelectorSrv->start();
+    ioSelectorSrv->update();
+    ioSelectorSrv->stop();
+    ::fwServices::OSR::unregisterService( ioSelectorSrv );
+
+    ::fwComEd::helper::SeriesDB sDBhelper(seriesDB);
+    sDBhelper.merge(localSeriesDB);
+    sDBhelper.notify(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SSeriesDBMerger::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiIO
diff --git a/Bundles/LeafUI/uiIO/src/uiIO/editor/IOSelectorService.cpp b/Bundles/LeafUI/uiIO/src/uiIO/editor/IOSelectorService.cpp
new file mode 100644
index 0000000..bc7cb11
--- /dev/null
+++ b/Bundles/LeafUI/uiIO/src/uiIO/editor/IOSelectorService.cpp
@@ -0,0 +1,369 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+#include <sstream>
+
+#include <boost/foreach.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwGui/dialog/SelectorDialog.hpp>
+#include <fwGui/Cursor.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <io/IReader.hpp>
+#include <io/IWriter.hpp>
+
+#include "uiIO/editor/IOSelectorService.hpp"
+
+namespace uiIO
+{
+
+namespace editor
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::gui::editor::IDialogEditor , ::uiIO::editor::IOSelectorService , ::fwData::Object );
+
+//------------------------------------------------------------------------------
+
+IOSelectorService::IOSelectorService() :
+    m_mode                  ( READER_MODE ),
+    m_servicesAreExcluded   ( true ),
+    m_selectedServices      ( std::vector< std::string >() )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+IOSelectorService::~IOSelectorService()  throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    bool vectorIsAlreadyCleared = false;
+
+    //  Config Elem
+    //  <selection mode="include" />
+    //  <addSelection service="::ioAtoms::SWriter" />
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter = this->m_configuration->begin() ;
+    for( ; iter != this->m_configuration->end() ; ++iter )
+    {
+        OSLM_INFO( "IOSelectorService "  << (*iter)->getName());
+
+        if( (*iter)->getName() == "selection" )
+        {
+            SLM_ASSERT( "Sorry, xml elemenet <selection> must have attribute 'mode'.", (*iter)->hasAttribute("mode")) ;
+            std::string mode = (*iter)->getExistingAttributeValue("mode") ;
+            m_servicesAreExcluded = ( mode == "exclude" );
+            SLM_ASSERT( "Sorry, xml attribut <mode> must be 'exclude' or 'include'.", mode == "exclude" || mode == "include" );
+            OSLM_DEBUG( "mode => " << mode );
+        }
+
+        if( (*iter)->getName() == "addSelection" )
+        {
+            if( ! vectorIsAlreadyCleared )
+            {
+                vectorIsAlreadyCleared = true;
+                m_selectedServices.clear();
+            }
+            SLM_ASSERT( "Sorry, xml elemenet <addSelection> must have attribute 'service'.", (*iter)->hasAttribute("service")) ;
+            m_selectedServices.push_back( (*iter)->getExistingAttributeValue("service") ) ;
+            OSLM_DEBUG( "add selection => " << (*iter)->getExistingAttributeValue("service") );
+        }
+
+        if( (*iter)->getName() == "type" )
+        {
+            SLM_ASSERT( "Sorry, xml elemenet <type> must have attribute 'mode'.", (*iter)->hasAttribute("mode")) ;
+            std::string mode = (*iter)->getExistingAttributeValue("mode") ;
+            SLM_ASSERT( "Sorry, xml attribut <mode> must be 'writer' or 'reader'.",  mode == "writer" || mode == "reader" );
+            m_mode = ( mode == "writer" ) ? WRITER_MODE : READER_MODE;
+            OSLM_DEBUG( "mode => " << mode );
+        }
+
+        if( (*iter)->getName() == "config" )
+        {
+            SLM_ASSERT( "Sorry, xml elemenet <config> must have attribute 'id'.", (*iter)->hasAttribute("id")) ;
+            SLM_ASSERT( "Sorry, xml elemenet <config> must have attribute 'service'.", (*iter)->hasAttribute("service")) ;
+            std::string configId = (*iter)->getExistingAttributeValue("id") ;
+            std::string configSrv = (*iter)->getExistingAttributeValue("service") ;
+            m_serviceToConfig[ configSrv ] = configId;
+        }
+
+    }
+
+    typedef std::vector < SPTR(::fwRuntime::ConfigurationElement) >  ConfigurationElementContainer;
+    ConfigurationElementContainer inject = m_configuration->find("inject");
+
+    if(!inject.empty())
+    {
+        m_inject = inject.at(0)->getValue();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Retrieve implementation of type ::io::IReader for this object
+    std::vector< std::string > availableExtensionsId;
+    if ( m_mode == READER_MODE )
+    {
+        availableExtensionsId = ::fwServices::registry::ServiceFactory::getDefault()->getImplementationIdFromObjectAndType(this->getObject()->getClassname(),"::io::IReader") ;
+    }
+    else // m_mode == WRITER_MODE
+    {
+        availableExtensionsId = ::fwServices::registry::ServiceFactory::getDefault()->getImplementationIdFromObjectAndType(this->getObject()->getClassname(),"::io::IWriter") ;
+    }
+
+    // Filter available extensions and replace id by service description
+    std::vector< std::pair < std::string, std::string > > availableExtensionsMap;
+    std::vector< std::string > availableExtensionsSelector;
+
+    BOOST_FOREACH( const std::string &serviceId, availableExtensionsId )
+    {
+        bool serviceIsSelectedByUser = std::find( m_selectedServices.begin(), m_selectedServices.end(), serviceId ) != m_selectedServices.end();
+
+        // Test if the service is considered here as available by users, if yes push in availableExtensionsSelector
+        // excluded mode => add services that are not selected by users
+        // included mode => add services selected by users
+        if( (m_servicesAreExcluded && ! serviceIsSelectedByUser) ||
+            (! m_servicesAreExcluded && serviceIsSelectedByUser) )
+        {
+            // Add this service
+            std::string infoUser = ::fwServices::registry::ServiceFactory::getDefault()->getServiceDescription(serviceId);
+
+            std::map< std::string, std::string >::const_iterator iter = m_serviceToConfig.find( serviceId );
+            if ( iter != m_serviceToConfig.end() )
+            {
+                infoUser = ::fwServices::registry::ServiceConfig::getDefault()->getConfigDesc(iter->second);
+            }
+
+            if (infoUser != "")
+            {
+                availableExtensionsMap.push_back( std::pair < std::string, std::string > (serviceId, infoUser) );
+                availableExtensionsSelector.push_back( infoUser );
+            }
+            else
+            {
+                availableExtensionsMap.push_back( std::pair < std::string, std::string > (serviceId, serviceId) );
+                availableExtensionsSelector.push_back( serviceId );
+            }
+        }
+    }
+
+    // Sort available services (lexical string sort)
+    std::sort( availableExtensionsSelector.begin(), availableExtensionsSelector.end() );
+
+    // Test if we have an extension
+    if ( ! availableExtensionsMap.empty() )
+    {
+        std::string extensionId = availableExtensionsMap[0].first ;
+        bool extensionSelectionIsCanceled = false;
+
+        // Selection of extension when availableExtensions.size() > 1
+        if ( availableExtensionsSelector.size() > 1 )
+        {
+            ::fwGui::dialog::SelectorDialog::sptr selector = ::fwGui::dialog::SelectorDialog::New();
+
+            if ( m_mode != READER_MODE )
+            {
+                selector->setTitle("Writer to use");
+            }
+            else
+            {
+                selector->setTitle("Reader to use");
+            }
+            selector->setSelections(availableExtensionsSelector);
+            std::string selection = selector->show();
+            if( !selection.empty() )
+            {
+                bool extensionIdFound = false;
+
+                typedef std::pair < std::string, std::string > PairType;
+                BOOST_FOREACH(PairType pair, availableExtensionsMap)
+                {
+                    if (pair.second == selection )
+                    {
+                        extensionId = pair.first ;
+                        extensionIdFound = true;
+                    }
+                }
+                OSLM_ASSERT("Problem to find the selected string.", extensionIdFound );
+            }
+            else
+            {
+                extensionSelectionIsCanceled = true;
+            }
+        }
+
+        if ( ! extensionSelectionIsCanceled )
+        {
+
+            // Get Config
+            bool hasConfigForService = false;
+            ::fwRuntime::ConfigurationElement::csptr srvCfg;
+            if ( m_serviceToConfig.find( extensionId ) != m_serviceToConfig.end() )
+            {
+                hasConfigForService = true;
+                srvCfg = ::fwServices::registry::ServiceConfig::getDefault()->getServiceConfig(  m_serviceToConfig[extensionId] , extensionId ) ;
+                SLM_ASSERT("Sorry, there is not service configuration of type ::fwServices::registry::ServiceConfig found", srvCfg ) ;
+            }
+
+            // Configure and start service
+            if ( m_mode == READER_MODE )
+            {
+                ::fwData::Object::sptr object;
+                if(m_inject.empty() ||  this->getObject()->getClassname().compare("::fwData::Composite") )
+                {
+                    object = this->getObject< ::fwData::Object >();
+                }
+                else
+                {
+                    ::fwServices::registry::ServiceFactory::sptr services = ::fwServices::registry::ServiceFactory::getDefault();
+                    std::string objType = services->getObjectImplementation(extensionId);
+                    if(!objType.compare("::fwData::Object"))
+                    {
+                        object = this->getObject< ::fwData::Composite>();
+                    }
+                    else
+                    {
+                        object = ::fwData::factory::New(objType);
+                        ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite>();
+                        ::fwComEd::helper::Composite helper(composite);
+                        helper.add(m_inject, object);
+
+                        helper.notify(this->getSptr());
+                    }
+                }
+
+                ::io::IReader::sptr reader = ::fwServices::add< ::io::IReader >( object , extensionId ) ;
+                if ( hasConfigForService )
+                {
+                    reader->setConfiguration( ::fwRuntime::ConfigurationElement::constCast(srvCfg) );
+                    reader->configure();
+                }
+                reader->start();
+                reader->configureWithIHM();
+
+                ::fwGui::Cursor cursor;
+                cursor.setCursor(::fwGui::ICursor::BUSY);
+                reader->update();
+                cursor.setDefaultCursor();
+
+                reader->stop();
+                ::fwServices::OSR::unregisterService(reader);
+            }
+            else
+            {
+                ::io::IWriter::sptr writer = ::fwServices::add< ::io::IWriter >( this->getObject() , extensionId ) ;
+                if ( hasConfigForService )
+                {
+                    writer->setConfiguration( ::fwRuntime::ConfigurationElement::constCast(srvCfg) );
+                    writer->configure();
+                }
+                writer->start();
+                writer->configureWithIHM();
+
+                ::fwGui::Cursor cursor;
+                cursor.setCursor(::fwGui::ICursor::BUSY);
+                writer->update();
+                cursor.setDefaultCursor();
+
+                writer->stop();
+                ::fwServices::OSR::unregisterService(writer);
+            }
+        }
+    }
+    else
+    {
+        SLM_WARN("IOSelectorService::load : availableExtensions is empty.");
+        if ( m_mode == READER_MODE )
+        {
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Reader not found");
+            messageBox.setMessage( "Sorry, there are not available readers for this data type." );
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+        else // m_mode == WRITER_MODE
+        {
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Writer not found");
+            messageBox.setMessage( "Sorry, there are not available writers for this data type." );
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::receiving( ::fwServices::ObjectMsg::csptr ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::info( std::ostream &_sstream )
+{
+    // Update message
+    _sstream << "IOSelectorService";
+}
+
+//------------------------------------------------------------------------------
+
+void IOSelectorService::setIOMode( IOMode _mode )
+{
+    m_mode = _mode;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace editor
+
+} // namespace gui
diff --git a/Bundles/LeafUI/uiImageQt/CMakeLists.txt b/Bundles/LeafUI/uiImageQt/CMakeLists.txt
new file mode 100644
index 0000000..d8bc7c7
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/CMakeLists.txt
@@ -0,0 +1,27 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwData
+    fwGuiQt
+    fwRuntime
+    fwTools
+    gui
+)
+
+find_package(Boost COMPONENTS filesystem REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui QtHelp REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(
+    ${QT_LIBRARIES}
+    ${Boost_LIBRARIES}
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiImageQt/COPYING b/Bundles/LeafUI/uiImageQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiImageQt/COPYING.LESSER b/Bundles/LeafUI/uiImageQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiImageQt/Properties.cmake b/Bundles/LeafUI/uiImageQt/Properties.cmake
new file mode 100644
index 0000000..70abe6a
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiImageQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGuiQt fwMath fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiImageQt/bin/build.options b/Bundles/LeafUI/uiImageQt/bin/build.options
new file mode 100644
index 0000000..4f5d70d
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/bin/build.options
@@ -0,0 +1,19 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          ]
+USE     = ['qtCore','boost', 'boostFilesystem']
+BUNDLES = [
+    'gui_0-1',
+    ]
+
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageInfo.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageInfo.hpp
new file mode 100644
index 0000000..869695f
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageInfo.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_IMAGEINFO_HPP
+#define _UIIMAGEQT_IMAGEINFO_HPP
+
+
+#include <QObject>
+#include <QLineEdit>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwData/Point.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+namespace uiImage
+{
+
+/**
+ * @brief   ImageInfo service allows to display image pixel information.
+ * @class   ImageInfo
+ * 
+ * @date    2010.
+ */
+class UIIMAGEQT_CLASS_API ImageInfo : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageInfo)(::gui::editor::IEditor) ) ;
+
+    UIIMAGEQT_API ImageInfo() throw() ;
+
+    UIIMAGEQT_API virtual ~ImageInfo() throw() ;
+
+protected:
+
+    /// Starts editor.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops editor.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Receive InteractionMsg and updates text informations
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void swapping() throw(::fwTools::Failed);
+
+    virtual void configuring() throw( ::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream ) ;
+
+
+private:
+
+    QPointer< QLineEdit >   m_valueText;
+
+};
+
+} // uiImage
+
+#endif /*_UIIMAGEQT_IMAGEINFO_HPP*/
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageTransparency.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageTransparency.hpp
new file mode 100644
index 0000000..99e2948
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ImageTransparency.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_IMAGETRANSPARENCY_HPP
+#define _UIIMAGEQT_IMAGETRANSPARENCY_HPP
+
+
+#include <QObject>
+#include <QSlider>
+#include <QCheckBox>
+#include <QPointer>
+#include <QAction>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwData/Point.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+namespace uiImage
+{
+
+/**
+ * @brief   ImageTransparency service allows to change image transparency.
+ * @class   ImageTransparency
+ * 
+ * @date    2011.
+ */
+class UIIMAGEQT_CLASS_API ImageTransparency : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageTransparency)(::gui::editor::IEditor) ) ;
+
+    UIIMAGEQT_API ImageTransparency() throw() ;
+
+    UIIMAGEQT_API virtual ~ImageTransparency() throw() ;
+
+protected:
+    /// Starts editor.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops editor.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Receive InteractionMsg and updates text informations
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void swapping() throw(::fwTools::Failed);
+
+    virtual void configuring() throw( ::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+
+    /**
+     * @brief This method is called when the visibility value change using action shortcut.
+     */
+    void onModifyVisibility(bool value);
+
+    /**
+     * @brief This method is called when the visibility value change clicking on checkbox.
+     */
+    void onModifyVisibility(int value);
+
+    /**
+     * @brief This method is called when the transparency value change moving slider.
+     */
+    void onModifyTransparency(int value);
+
+private:
+
+    /// Notify VISIBILITY event on image
+    void notifyVisibility(bool isVisible);
+
+    QPointer< QSlider >   m_valueSlider;
+    QPointer< QCheckBox > m_valueCheckBox;
+    QPointer< QAction >   m_action;
+    std::string m_shortcut;
+
+};
+
+} // uiImage
+
+#endif /*_UIIMAGEQT_IMAGETRANSPARENCY_HPP*/
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/Namespace.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/Namespace.hpp
new file mode 100644
index 0000000..63d430a
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIIMAGEQTNAMESPACE_HPP_
+#define UIIMAGEQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiImage contains several editors on image written with Qt. This namespace is included in uiImageQt bundle.
+ * @namespace   uiImage
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiImage
+{
+
+}
+#endif /* UIIMAGEQTNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/Plugin.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/Plugin.hpp
new file mode 100644
index 0000000..17ad940
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/Plugin.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_PLUGIN_HPP_
+#define _UIIMAGEQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiImage
+{
+/**
+ * @namespace uiImage
+ * @brief   Contains editors attached to image.
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiImage
+
+#endif //_UIIMAGEQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/ShowScanEditor.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ShowScanEditor.hpp
new file mode 100644
index 0000000..93dd7fb
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/ShowScanEditor.hpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_SHOW_SCAN_EDITOR_HPP_
+#define _UIIMAGEQT_SHOW_SCAN_EDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+#include <QIcon>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+class QPushButton;
+
+namespace uiImage
+{
+
+/**
+ * @brief   This editor service represent a button to show/hide scan in a generic scene.
+ * @class   ShowScanEditor
+ * 
+ * @date    2010.
+ */
+class UIIMAGEQT_CLASS_API ShowScanEditor : public QObject, public ::gui::editor::IEditor
+{
+
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ShowScanEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIIMAGEQT_API ShowScanEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIIMAGEQT_API virtual ~ShowScanEditor() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+     <service uid="showScanNegato3DEditor" type="::gui::editor::IEditor" impl="::uiImage::ShowScanEditor" autoConnect="no">
+         <negatoAdaptor uid="myNegatoMPR" />
+     </service>
+       @endverbatim
+       \b myNegatoMPR is the uid of the ::visuVTKAdaptor::NegatoMPR service where the scan will be show/hide.
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /**
+     * @brief This method is called when the scan button is clicked.
+     *
+     * This service notifies the modification.
+     */
+    void onChangeScanMode();
+
+private:
+
+    std::string m_adaptorUID;
+
+    QIcon m_imageShowScan;
+    QIcon m_imageHideScan;
+    bool m_scanAreShown;
+    QPointer< QPushButton > m_showScanButton;
+
+};
+
+} // uiImage
+
+#endif /*_UIIMAGEQT_SHOW_SCAN_EDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceIndexPositionEditor.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceIndexPositionEditor.hpp
new file mode 100644
index 0000000..b30ee6a
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceIndexPositionEditor.hpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_SLICEINDEXPOSITIONEDITOR_HPP_
+#define _UIIMAGEQT_SLICEINDEXPOSITIONEDITOR_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwGuiQt/SliceSelector.hpp>
+
+#include "uiImageQt/config.hpp"
+
+namespace uiImage
+{
+
+/**
+ * @brief   SliceIndexPositionEditor service allows to change the slice index of an image.
+ * @class   SliceIndexPositionEditor
+ * 
+ * @date    2010.
+ *
+ * This is represented by
+ *  - a slider to select the slice index
+ *  - a choice list to select the slice orientation (axial, frontal, sagittal)
+ */
+class UIIMAGEQT_CLASS_API SliceIndexPositionEditor : public ::gui::editor::IEditor, public ::fwComEd::helper::MedicalImageAdaptor
+{
+
+public :
+
+
+    fwCoreServiceClassDefinitionsMacro ( (SliceIndexPositionEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIIMAGEQT_API SliceIndexPositionEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIIMAGEQT_API virtual ~SliceIndexPositionEditor() throw() ;
+
+protected:
+
+    /// @brief The slice type: axial, frontal, sagittal.
+    using ::fwComEd::helper::MedicalImageAdaptor::Orientation ;
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations : update editor according to the received message
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Update editor information from the image
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Swap of image
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+     <service uid="slider_negato1" impl="::uiImage::SliceIndexPositionEditor" type="::gui::editor::IEditor" autoConnect="yes">
+        <sliceIndex>axial</sliceIndex>
+     </service>
+       @endverbatim
+       \b sliceIndex must be "axial", "frontal" or "sagittal".
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    UIIMAGEQT_API virtual void info( std::ostream &_sstream ) ;
+
+    /// Update the editor slider from the image slice index.
+    UIIMAGEQT_API void updateSliceIndex();
+
+    /// Update the editor slice type choice from the image slice type.
+    UIIMAGEQT_API void updateSliceType(Orientation type );
+
+    /// This method is called when the slider is move. Notify the slice index is modified.
+    UIIMAGEQT_API void sliceIndexNotification(unsigned int index);
+
+    /// This method is called when the slice type selected change. Notify the slice type is modified.
+    UIIMAGEQT_API void sliceTypeNotification( int type );
+
+private:
+
+    /// @brief The field IDs for the slice index.
+    static const std::string* SLICE_INDEX_FIELDID[ 3 ];
+
+    ::fwGuiQt::SliceSelector* m_sliceSelectorPanel;
+
+};
+
+} // uiImage
+
+#endif /*_UIIMAGEQT_SLICEINDEXPOSITIONEDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor.hpp
new file mode 100644
index 0000000..30f45fb
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor.hpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_SLICE_LIST_EDITOR_HPP_
+#define _UIIMAGEQT_SLICE_LIST_EDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+class QMenu;
+class QAction;
+class QPushButton;
+
+
+namespace uiImage
+{
+
+/**
+ * @brief   SliceListEditor service allows to change the number of slice to show.
+ * @class   SliceListEditor
+ * 
+ * @date    2010.
+ */
+class UIIMAGEQT_CLASS_API SliceListEditor : public QObject, public ::gui::editor::IEditor
+{
+
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SliceListEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIIMAGEQT_API SliceListEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIIMAGEQT_API virtual ~SliceListEditor() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations : update editor according to the received message
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+     <service uid="sliceListNegato3DEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor" autoConnect="yes">
+         <negatoAdaptor uid="myNegatoMPR" slices="1"/>
+     </service>
+       @endverbatim
+        - \b uid is the uid of the ::visuVTKAdaptor::NegatoMPR service where the scan will be show/hide.
+        - \b slices is the number of slide to show
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /// This method is called when the popup menu is clicked. Notify the slice mode changed.
+    void onChangeSliceMode(bool checked = false);
+
+private:
+
+    std::string m_adaptorUID;
+
+    QPointer < QMenu > m_pDropDownMenu;
+    QPointer < QPushButton > m_dropDownButton;
+    QPointer < QAction > m_oneSliceItem;
+    QPointer < QAction > m_threeSlicesItem;
+    QPointer < QAction > m_obliqueSliceItem;
+    int m_nbSlice;
+
+};
+
+} // uiImageQt
+
+#endif /*_UIIMAGEQT_SLICE_LIST_EDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor2.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor2.hpp
new file mode 100644
index 0000000..540347d
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/SliceListEditor2.hpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_SLICELISTEDITOR2_HPP_
+#define _UIIMAGEQT_SLICELISTEDITOR2_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+class QMenu;
+class QAction;
+class QPushButton;
+
+
+namespace uiImage
+{
+
+/**
+ * @brief   SliceListEditor2 service allows to change the number of slice to show.
+ * @class   SliceListEditor2
+ * 
+ * @date    2010.
+ */
+class UIIMAGEQT_CLASS_API SliceListEditor2 : public QObject, public ::gui::editor::IEditor
+{
+
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SliceListEditor2)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIIMAGEQT_API SliceListEditor2() throw() ;
+
+    /// Destructor. Do nothing.
+    UIIMAGEQT_API virtual ~SliceListEditor2() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations : update editor according to the received message
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+     <service uid="sliceListNegato3DEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceListEditor2" autoConnect="yes">
+         <negatoAdaptor uid="myNegatoMPR" slices="1"/>
+     </service>
+       @endverbatim
+        - \b uid is the uid of the ::visuVTKAdaptor::NegatoMPR service where the scan will be show/hide.
+        - \b slices is the number of slide to show
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /// This method is called when the popup menu is clicked. Notify the slice mode changed.
+    void onChangeSliceMode(bool checked = false);
+
+private:
+
+    std::string m_adaptorUID;
+
+    QPointer < QMenu > m_pDropDownMenu;
+    QPointer < QPushButton > m_dropDownButton;
+    QPointer < QAction > m_noSliceItem;
+    QPointer < QAction > m_oneSliceItem;
+    QPointer < QAction > m_threeSlicesItem;
+    QPointer < QAction > m_obliqueSliceItem;
+    int m_nbSlice;
+
+};
+
+} // uiImageQt
+
+#endif /*_UIIMAGEQT_SLICELISTEDITOR2_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/WindowLevel.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/WindowLevel.hpp
new file mode 100644
index 0000000..0ca1706
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/WindowLevel.hpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_WINDOWLEVEL_HPP_
+#define _UIIMAGEQT_WINDOWLEVEL_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+#include <fwData/Integer.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "uiImageQt/config.hpp"
+
+class QAction;
+class QComboBox;
+class QLabel;
+class QLineEdit;
+class QMenu;
+class QSlider;
+class QToolButton;
+class QSignalMapper;
+
+fwCorePredeclare( (fwGuiQt)(widget)(QRangeSlider) );
+
+namespace uiImage
+{
+
+/**
+ * @brief   WindowLevel service allows to change the min / max value of windowing.
+ * @class   WindowLevel
+ * 
+ * @date    2010-2011.
+ *
+ * This is represented by
+ *  - two sliders to modify the min, max value of windowing
+ */
+class UIIMAGEQT_CLASS_API WindowLevel : public QObject, public ::fwComEd::helper::MedicalImageAdaptor, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+
+    fwCoreServiceClassDefinitionsMacro ( (WindowLevel)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIIMAGEQT_API WindowLevel() throw() ;
+
+    /// Destructor. Do nothing.
+    UIIMAGEQT_API virtual ~WindowLevel() throw() ;
+
+    UIIMAGEQT_API void notifyWindowLevelCallback();
+
+protected:
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations : update editor according to the received message
+    virtual void receiving( ::boost::shared_ptr< const fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed);
+
+    /// Update editor information from the image
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Swap of image
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+         <service uid="windowLevel" impl="::uiImage::WindowLevel" type="::gui::editor::IEditor" autoConnect="yes">
+             <config autoWindowing="yes" selectedTFKey="mySelectedTF" tfSelectionFwID="myTFSelection" useImageGreyLevelTF="yes" />
+         </service>
+       @endverbatim
+     * With :
+     *  - \b autoWindowing : if 'yes', image windowing will be automatically compute from image pixel min/max
+     *  intensity when this service receive BUFFER event
+     *  - \b tfSelection : configure the identifier of the field containing the specific TF selection. By default, it use default selection field.
+     *  - \b useImageGreyLevelTF : if 'yes' and if tfSelection is configured, then we use the grey level tf of image
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    UIIMAGEQT_API virtual void info( std::ostream &_sstream ) ;
+
+    virtual void setEnabled(bool enable);
+
+
+protected Q_SLOTS:
+
+    void onTextEditingFinished();
+    void onToggleTF(bool squareTF);
+    void onToggleAutoWL(bool autoWL);
+
+    void onWindowLevelWidgetChanged(double _min, double _max);
+    void onDynamicRangeSelectionChanged(QAction *action);
+
+protected:
+    typedef ::fwData::TransferFunction::TFValuePairType WindowLevelMinMaxType;
+
+    double toWindowLevel(double _val);
+    double fromWindowLevel(double _val);
+
+    WindowLevelMinMaxType getImageWindowMinMax();
+
+    void onImageWindowLevelChanged(double _imageMin, double _imageMax);
+    void notifyWindowLevel(double _imageMin, double _imageMax);
+
+    void updateWidgetMinMax(double _imageMin, double _imageMax);
+    void updateImageWindowLevel(double _imageMin, double _imageMax);
+    void updateTextWindowLevel(double _imageMin, double _imageMax);
+
+    void setWidgetDynamicRange(double min, double max);
+    bool getWidgetDoubleValue(QLineEdit *widget, double &val);
+
+    /// Returns the current grey level tf of image
+    ::fwData::TransferFunction::sptr getImageGreyLevelTF();
+
+    /// Swap current tf and notify other services
+    void swapCurrentTFAndNotify( ::fwData::TransferFunction::sptr newTF );
+
+private:
+
+    QPointer< QLineEdit >   m_valueTextMin;
+    QPointer< QLineEdit >   m_valueTextMax;
+    QPointer< QToolButton > m_toggleTFButton;
+    QPointer< QToolButton > m_toggleAutoButton;
+    QPointer< QToolButton >   m_dynamicRangeSelection;
+    QPointer< QMenu >         m_dynamicRangeMenu;
+    QPointer< QSignalMapper > m_dynamicRangeSignalMapper;
+
+    QPointer< ::fwGuiQt::widget::QRangeSlider > m_rangeSlider;
+
+    double m_widgetDynamicRangeMin;
+    double m_widgetDynamicRangeWidth;
+    double m_imageMin;
+    double m_imageMax;
+    double m_notifiedImageMin;
+    double m_notifiedImageMax;
+    bool m_isNotifying;
+    bool m_autoWindowing;
+    bool m_useImageGreyLevelTF;
+
+    /// Identifier of the field containing the specific selection of TransferFunction
+    /// if m_tfSelection is empty => use default TF selection
+    std::string m_tfSelection;
+
+};
+
+} // uiImage
+
+#endif /*_UIIMAGEQT_WINDOWLEVEL_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiImageQt/include/uiImageQt/config.hpp b/Bundles/LeafUI/uiImageQt/include/uiImageQt/config.hpp
new file mode 100644
index 0000000..4c6febe
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/include/uiImageQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIIMAGEQT_CONFIG_HPP_
+#define _UIIMAGEQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIIMAGEQT_EXPORTS
+    #define UIIMAGEQT_API __declspec(dllexport)
+    #else
+    #define UIIMAGEQT_API __declspec(dllimport)
+    #endif
+
+    #define UIIMAGEQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIIMAGEQT_EXPORTS
+    #define UIIMAGEQT_API __attribute__ ((visibility("default")))
+    #define UIIMAGEQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIIMAGEQT_API __attribute__ ((visibility("hidden")))
+    #define UIIMAGEQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIIMAGEQT_API
+    #define UIIMAGEQT_CLASS_API
+
+#endif
+
+#endif //_UIIMAGEQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiImageQt/rc/plugin.xml b/Bundles/LeafUI/uiImageQt/rc/plugin.xml
new file mode 100644
index 0000000..cbf4a62
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/rc/plugin.xml
@@ -0,0 +1,51 @@
+<plugin id="uiImageQt" class="::uiImage::Plugin">
+    <library name="uiImageQt"/>
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::SliceIndexPositionEditor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::SliceListEditor</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::SliceListEditor2</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::ShowScanEditor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::ImageInfo</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::WindowLevel</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiImage::ImageTransparency</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageInfo.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageInfo.cpp
new file mode 100644
index 0000000..40fa9f2
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageInfo.cpp
@@ -0,0 +1,141 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QHBoxLayout>
+#include <QWidget>
+#include <QLabel>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwComEd/InteractionMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/ImageInfo.hpp"
+
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::ImageInfo , ::fwData::Image ) ;
+
+
+ImageInfo::ImageInfo() throw()
+{
+//    addNewHandledEvent(::fwComEd::InteractionMsg::MOUSE_MOVE);
+}
+
+//------------------------------------------------------------------------------
+
+ImageInfo::~ImageInfo() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::create();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QHBoxLayout* hLayout = new QHBoxLayout();
+
+    QLabel* staticText = new QLabel( QObject::tr("intensity:"), container);
+    hLayout->addWidget( staticText, 0, Qt::AlignVCenter );
+
+    m_valueText = new QLineEdit( container );
+    m_valueText->setReadOnly(true);
+    hLayout->addWidget( m_valueText, 1, Qt::AlignVCenter );
+
+    container->setLayout( hLayout );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::updating() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::swapping() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+    m_valueText->setEnabled(imageIsValid);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::InteractionMsg::csptr interactionMsg = ::fwComEd::InteractionMsg::dynamicConstCast(_msg);
+
+    if (interactionMsg && _msg->hasEvent(::fwComEd::InteractionMsg::MOUSE_MOVE))
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+        bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+        m_valueText->setEnabled(imageIsValid);
+        if (imageIsValid)
+        {
+            ::fwData::Point::csptr point = interactionMsg->getEventPoint();
+            SLM_ASSERT("Sorry, the object is null", point);
+            if(point)
+            {
+                fwVec3d  pointCoord = point->getCoord();
+                ::fwComEd::helper::Image imageHelper(image);
+
+                std::string intensity = imageHelper.getPixelAsString(pointCoord[0], pointCoord[1], pointCoord[2] );;
+                m_valueText->setText(QString::fromStdString(intensity));
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageInfo::info( std::ostream &_sstream )
+{
+    _sstream << "Image Info Editor";
+}
+
+//------------------------------------------------------------------------------
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageTransparency.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageTransparency.cpp
new file mode 100644
index 0000000..93e6f62
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ImageTransparency.cpp
@@ -0,0 +1,240 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QWidget>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/ImageTransparency.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::ImageTransparency , ::fwData::Image ) ;
+
+
+ImageTransparency::ImageTransparency() throw()
+{
+//    addNewHandledEvent(::fwComEd::ImageMsg::TRANSPARENCY);
+//    addNewHandledEvent(::fwComEd::ImageMsg::VISIBILITY);
+//    addNewHandledEvent(::fwComEd::ImageMsg::BUFFER);
+}
+
+//------------------------------------------------------------------------------
+
+ImageTransparency::~ImageTransparency() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::create();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QHBoxLayout* hLayout = new QHBoxLayout();
+
+    QLabel* staticText = new QLabel( QObject::tr("Transparency: "), container);
+    hLayout->addWidget( staticText, 0, Qt::AlignVCenter );
+
+    m_valueSlider = new QSlider( Qt::Horizontal, container );
+    hLayout->addWidget( m_valueSlider, 1, Qt::AlignVCenter );
+    m_valueSlider->setRange(0, 100);
+    m_valueSlider->setMinimumWidth(100);
+
+    m_valueCheckBox = new QCheckBox( QObject::tr("visible"), container);
+    m_action = new QAction(container);
+    m_action->setCheckable(true);
+    if (!m_shortcut.empty())
+    {
+        m_action->setShortcut(QKeySequence(QString::fromStdString(m_shortcut)));
+    }
+    m_valueCheckBox->addAction(m_action);
+    hLayout->addWidget( m_valueCheckBox, 0, Qt::AlignVCenter );
+
+    container->setLayout( hLayout );
+
+    QObject::connect(m_valueSlider, SIGNAL(valueChanged(int)), this, SLOT(onModifyTransparency(int)));
+    QObject::connect(m_valueCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onModifyVisibility(int)));
+    QObject::connect(m_action, SIGNAL(triggered(bool)), this, SLOT(onModifyVisibility(bool)));
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    QObject::disconnect(m_valueSlider, SIGNAL(valueChanged(int)), this, SLOT(onModifyTransparency(int)));
+    QObject::disconnect(m_valueCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onModifyVisibility(int)));
+    QObject::disconnect(m_action, SIGNAL(triggered(bool)), this, SLOT(onModifyVisibility(bool)));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+
+    //<shortcut value="X"/>
+    std::vector < ConfigurationType > vectCfg = m_configuration->find("shortcut");
+    if(!vectCfg.empty())
+    {
+        ConfigurationType config = vectCfg.at(0);
+        SLM_ASSERT("Missing attribute value", config->hasAttribute("value"));
+        m_shortcut = config->getAttributeValue("value");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( img );
+    m_valueSlider->setEnabled(imageIsValid);
+    m_valueCheckBox->setEnabled(imageIsValid);
+    if (imageIsValid)
+    {
+        QObject::disconnect(m_valueSlider, SIGNAL(valueChanged(int)), this, SLOT(onModifyTransparency(int)));
+        QObject::disconnect(m_valueCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onModifyVisibility(int)));
+        QObject::disconnect(m_action, SIGNAL(triggered(bool)), this, SLOT(onModifyVisibility(bool)));
+
+        if(img->getField( "TRANSPARENCY" ) )
+        {
+            ::fwData::Integer::sptr transparency = img->getField< ::fwData::Integer >( "TRANSPARENCY" );
+            m_valueSlider->setValue( *transparency );
+        }
+        else
+        {
+            img->setField( "TRANSPARENCY", ::fwData::Integer::New(0) );
+            m_valueSlider->setValue( 0 );
+        }
+        if(img->getField( "VISIBILITY" ) )
+        {
+            ::fwData::Boolean::sptr visible = img->getField< ::fwData::Boolean >( "VISIBILITY" );
+            m_valueCheckBox->setChecked( *visible );
+            m_action->setChecked(*visible);
+        }
+        else
+        {
+            img->setField( "VISIBILITY", ::fwData::Boolean::New(true) );
+            m_valueCheckBox->setChecked( true );
+            m_action->setChecked(true);
+        }
+        QObject::connect(m_valueSlider, SIGNAL(valueChanged(int)), this, SLOT(onModifyTransparency(int)));
+        QObject::connect(m_valueCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onModifyVisibility(int)));
+        QObject::connect(m_action, SIGNAL(triggered(bool)), this, SLOT(onModifyVisibility(bool)));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast(_msg);
+    if(imageMsg)
+    {
+        if ( imageMsg->hasEvent( ::fwComEd::ImageMsg::TRANSPARENCY ) ||
+             imageMsg->hasEvent( ::fwComEd::ImageMsg::VISIBILITY )   ||
+             imageMsg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) )
+        {
+            this->updating();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::info( std::ostream &_sstream )
+{
+    _sstream << "Image Features Editor";
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::onModifyTransparency(int value)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+    img->setField( "TRANSPARENCY",  ::fwData::Integer::New(value) );
+    ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+    imageMsg->addEvent( "TRANSPARENCY" );
+    ::fwServices::IEditionService::notify(this->getSptr(), img, imageMsg);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::onModifyVisibility(bool value)
+{
+    SLM_TRACE_FUNC();
+    m_valueCheckBox->setCheckState(value ? Qt::Checked : Qt::Unchecked);
+    this->notifyVisibility(value);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::onModifyVisibility(int value)
+{
+    SLM_TRACE_FUNC();
+    m_action->setChecked(value == Qt::Checked);
+
+    this->notifyVisibility(value == Qt::Checked);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTransparency::notifyVisibility(bool isVisible)
+{
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+    img->setField( "VISIBILITY",  ::fwData::Boolean::New(isVisible) );
+    ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+    imageMsg->addEvent( "VISIBILITY" );
+    ::fwServices::IEditionService::notify(this->getSptr(), img, imageMsg);
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/Plugin.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/Plugin.cpp
new file mode 100644
index 0000000..d8d0a2e
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/Plugin.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiImageQt/Plugin.hpp"
+
+namespace uiImage
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiImage::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiImage
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/ShowScanEditor.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ShowScanEditor.cpp
new file mode 100644
index 0000000..ab1306f
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/ShowScanEditor.cpp
@@ -0,0 +1,172 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QString>
+#include <QVBoxLayout>
+#include <QPushButton>
+
+#include <fwCore/base.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/String.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/op/Get.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/ShowScanEditor.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::ShowScanEditor , ::fwData::Image ) ;
+
+
+ShowScanEditor::ShowScanEditor() throw(): m_scanAreShown(true)
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+ShowScanEditor::~ShowScanEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    ::boost::filesystem::path pathImageScan (std::string(LIBSFW4SPL)+"Bundles/media_0-1/sliceShow.png");
+    OSLM_ASSERT("Image "<< pathImageScan << "is missing", ::boost::filesystem::exists(pathImageScan));
+    m_imageShowScan = QIcon(QString::fromStdString(pathImageScan.string()));
+
+    pathImageScan  = std::string(LIBSFW4SPL)+"Bundles/media_0-1/sliceHide.png";
+    OSLM_ASSERT("Image "<< pathImageScan << "is missing", ::boost::filesystem::exists(pathImageScan));
+    m_imageHideScan = QIcon(QString::fromStdString(pathImageScan.string()));
+
+
+    m_showScanButton = new QPushButton( m_imageShowScan, "", container) ;
+    m_showScanButton->setToolTip(QObject::tr("Show/Hide Scan"));
+    m_showScanButton->setIconSize( QSize( 40, 16 ) );
+
+    QVBoxLayout* layout = new QVBoxLayout( container );
+    layout->addWidget( m_showScanButton );
+    layout->setContentsMargins(0,0,0,0);
+
+    QObject::connect(m_showScanButton, SIGNAL(clicked()), this, SLOT(onChangeScanMode()));
+
+    container->setLayout( layout );
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_showScanButton, SIGNAL(clicked()), this, SLOT(onChangeScanMode()));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    std::vector < Configuration > placeInSceneConfig = m_configuration->find("negatoAdaptor");
+    SLM_ASSERT("Tag negatoAdaptor required!", !placeInSceneConfig.empty());
+    SLM_ASSERT("UID attribute is missing", placeInSceneConfig.at(0)->hasAttribute("uid"));
+    m_adaptorUID = placeInSceneConfig.at(0)->getAttributeValue("uid");
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::swapping() throw(::fwTools::Failed)
+{
+}
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ShowScanEditor::onChangeScanMode()
+{
+    if(::fwTools::fwID::exist(m_adaptorUID))
+    {
+        m_scanAreShown = !m_scanAreShown;
+
+        if (!m_scanAreShown)
+        {
+            m_showScanButton->setIcon(m_imageHideScan);
+        }
+        else
+        {
+            m_showScanButton->setIcon(m_imageShowScan);
+        }
+
+        ::fwServices::IService::sptr service = ::fwServices::get(m_adaptorUID);
+        ::fwData::Image::sptr image = service->getObject< ::fwData::Image >();
+        SLM_ASSERT("ShowScanEditor adaptorUID " << m_adaptorUID <<" isn't an Adaptor on an Image?" , image);
+
+        ::fwData::Boolean::sptr dataInfo = ::fwData::Boolean::New();
+        dataInfo->value() = m_scanAreShown;
+
+        dataInfo->setField(::fwComEd::Dictionary::m_relatedServiceId ,  ::fwData::String::New( m_adaptorUID ) );
+        ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+        imageMsg->addEvent( "SCAN_SHOW", dataInfo );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, imageMsg);
+    }
+    else
+    {
+        OSLM_TRACE("Service "<< m_adaptorUID << " is not yet present.");
+    }
+}
+
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceIndexPositionEditor.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceIndexPositionEditor.cpp
new file mode 100644
index 0000000..8e90bee
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceIndexPositionEditor.cpp
@@ -0,0 +1,291 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QWidget>
+#include <QVBoxLayout>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/SliceIndexPositionEditor.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::SliceIndexPositionEditor , ::fwData::Image ) ;
+
+const std::string* SliceIndexPositionEditor::SLICE_INDEX_FIELDID[ 3 ] =
+{
+    &fwComEd::Dictionary::m_sagittalSliceIndexId,
+    &fwComEd::Dictionary::m_frontalSliceIndexId,
+    &fwComEd::Dictionary::m_axialSliceIndexId
+};
+
+//------------------------------------------------------------------------------
+
+SliceIndexPositionEditor::SliceIndexPositionEditor() throw()
+{
+//    addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+//    addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+//    addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+}
+
+//------------------------------------------------------------------------------
+
+SliceIndexPositionEditor::~SliceIndexPositionEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::starting() throw(::fwTools::Failed)
+{
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget * const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QVBoxLayout* layout = new QVBoxLayout( container );
+
+    m_sliceSelectorPanel = new ::fwGuiQt::SliceSelector( container );
+    m_sliceSelectorPanel->setEnable(false);
+
+    ::fwGuiQt::SliceSelector::ChangeIndexCallback changeIndexCallback;
+    changeIndexCallback = ::boost::bind( &::uiImage::SliceIndexPositionEditor::sliceIndexNotification, this, _1);
+    m_sliceSelectorPanel->setChangeIndexCallback(changeIndexCallback);
+
+    ::fwGuiQt::SliceSelector::ChangeIndexCallback changeTypeCallback;
+    changeTypeCallback = ::boost::bind( &::uiImage::SliceIndexPositionEditor::sliceTypeNotification, this, _1);
+    m_sliceSelectorPanel->setChangeTypeCallback(changeTypeCallback);
+    layout->addWidget( m_sliceSelectorPanel );
+    layout->setContentsMargins(0,0,0,0);
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->updateSliceType(m_orientation);
+
+    container->setLayout( layout );
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::stopping() throw(::fwTools::Failed)
+{
+    if(m_sliceSelectorPanel)
+    {
+        delete m_sliceSelectorPanel;
+        m_sliceSelectorPanel = 0;
+    }
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::configuring() throw(fwTools::Failed)
+{
+    this->initialize();
+
+    if( this->m_configuration->size() > 0 )
+    {
+        ::fwRuntime::ConfigurationElementContainer::Iterator iter = this->m_configuration->begin() ;
+        SLM_ASSERT("Sorry, only one xml element \"sliceIndex\" is accepted.", this->m_configuration->size() == 1 && (*iter)->getName() == "sliceIndex" );
+        SLM_ASSERT("Sorry, xml element \"sliceIndex\" is empty.", ! (*iter)->getValue().empty() );
+        std::string  orientation = (*iter)->getValue();
+        ::boost::algorithm::trim(orientation);
+        ::boost::algorithm::to_lower(orientation);
+
+        if(orientation == "axial" )
+        {
+            m_orientation = Z_AXIS;
+        }
+        else if(orientation == "frontal" )
+        {
+            m_orientation = Y_AXIS;
+        }
+        else if(orientation == "sagittal" )
+        {
+            m_orientation = X_AXIS;
+        }
+        else
+        {
+            SLM_FATAL("The value for the xml element \"sliceIndex\" can only be axial, frontal or sagittal.");
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+    m_sliceSelectorPanel->setEnable(imageIsValid);
+    this->updateImageInfos(image);
+    this->updateSliceIndex();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::ImageMsg::csptr imageMessage = fwComEd::ImageMsg::dynamicConstCast( _msg );
+
+    if ( imageMessage )
+    {
+        if ( imageMessage->hasEvent( fwComEd::ImageMsg::BUFFER ) )
+        {
+            this->updating();
+        }
+        if ( imageMessage->hasEvent( fwComEd::ImageMsg::SLICE_INDEX ) )
+        {
+            imageMessage->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+            ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+            image->setField( fwComEd::Dictionary::m_axialSliceIndexId  , m_axialIndex);
+            image->setField( fwComEd::Dictionary::m_frontalSliceIndexId , m_frontalIndex);
+            image->setField( fwComEd::Dictionary::m_sagittalSliceIndexId, m_sagittalIndex);
+            this->updateSliceIndex();
+        }
+        if ( imageMessage->hasEvent( fwComEd::ImageMsg::CHANGE_SLICE_TYPE ) )
+        {
+            ::fwData::Object::csptr cObjInfo = imageMessage->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+            ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+            ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+            ::fwData::Integer::sptr fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] );
+            ::fwData::Integer::sptr toSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] );
+
+            if( toSliceType->value() == static_cast< int > ( m_orientation ) )
+            {
+                m_orientation = static_cast< Orientation > ( fromSliceType->value() );
+            }
+            else if(fromSliceType->value() == static_cast<int>(m_orientation))
+            {
+                m_orientation = static_cast< Orientation >( toSliceType->value() );
+            }
+            this->updateSliceType(m_orientation);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::info( std::ostream &_sstream )
+{}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::updateSliceIndex()
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    if (::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        // Get Index
+        std::string fieldID = *SLICE_INDEX_FIELDID[m_orientation];
+        OSLM_ASSERT("Field "<<fieldID<<" is missing", image->getField( fieldID ) );
+        unsigned int index = image->getField< ::fwData::Integer >( fieldID )->value();
+
+        // Update QSlider
+        int max = 0;
+        if(image->getNumberOfDimensions() > m_orientation)
+        {
+            max = static_cast<int>(image->getSize()[m_orientation]-1);
+        }
+        m_sliceSelectorPanel->setSliceRange( 0, max );
+        m_sliceSelectorPanel->setSliceValue( index );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::updateSliceType(Orientation type )
+{
+    // Update Type Choice
+    m_sliceSelectorPanel->setTypeSelection( static_cast< int >( type ) );
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateSliceIndex();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::sliceIndexNotification( unsigned int index)
+{
+    // Fire the message
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->setSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    std::string fieldID = *SLICE_INDEX_FIELDID[m_orientation];
+    OSLM_ASSERT("Field "<<fieldID<<" is missing", image->getField( fieldID ));
+    image->getField< ::fwData::Integer >( fieldID )->value() = index;
+
+    ::fwServices::IEditionService::notify(this->getSptr(),  image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void SliceIndexPositionEditor::sliceTypeNotification( int _type )
+{
+    Orientation type = static_cast< Orientation >( _type );
+    OSLM_ASSERT("Bad slice type "<<type, type == X_AXIS ||
+            type == Y_AXIS ||
+            type == Z_AXIS );
+
+    // Change data info
+    ::fwData::Composite::sptr info = ::fwData::Composite::New();
+    ::fwData::Integer::sptr fromSliceType = ::fwData::Integer::New();
+    ::fwData::Integer::sptr toSliceType = ::fwData::Integer::New();
+    fromSliceType->value() = static_cast< int > ( m_orientation ) ;
+    toSliceType->value() = static_cast< int > ( type ) ;
+    info->getContainer()["fromSliceType"] = fromSliceType;
+    info->getContainer()["toSliceType"] = toSliceType;
+
+    // Change slice type
+    m_orientation = type;
+
+    // Fire the message
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE, info ) ;
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwServices::IEditionService::notify(this->getSptr(),  image, msg);
+    this->updateSliceIndex();
+}
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor.cpp
new file mode 100644
index 0000000..96c90d1
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor.cpp
@@ -0,0 +1,220 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QWidget>
+#include <QString>
+#include <QMenu>
+#include <QAction>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <fwCore/base.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/SliceListEditor.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::SliceListEditor , ::fwData::Image ) ;
+
+
+SliceListEditor::SliceListEditor() throw()
+{
+    m_nbSlice = 1;
+//    addNewHandledEvent( "SCAN_SHOW" );
+}
+
+//------------------------------------------------------------------------------
+
+SliceListEditor::~SliceListEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_dropDownButton = new QPushButton( QObject::tr(">"), container );
+    m_dropDownButton->setToolTip( QObject::tr("Manage slice visibility"));
+    m_dropDownButton->setMaximumWidth(40);
+
+    m_pDropDownMenu = new QMenu(container);
+    QActionGroup * actionGroup = new QActionGroup(m_pDropDownMenu);
+
+    m_oneSliceItem = new QAction(QObject::tr("One slice"), m_pDropDownMenu);
+    m_threeSlicesItem = new QAction(QObject::tr("three slices"), m_pDropDownMenu);
+//  m_obliqueSliceItem = new QAction(QObject::tr("Oblique slice"), m_pDropDownMenu);
+    m_oneSliceItem->setCheckable(true);
+    m_threeSlicesItem->setCheckable(true);
+
+    actionGroup->addAction(m_oneSliceItem);
+    actionGroup->addAction(m_threeSlicesItem);
+
+    m_pDropDownMenu->addAction(m_oneSliceItem);
+    m_pDropDownMenu->addAction(m_threeSlicesItem);
+//    m_pDropDownMenu->addAction(m_obliqueSliceItem);
+    m_dropDownButton->setMenu(m_pDropDownMenu);
+
+    QObject::connect(m_oneSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::connect(m_threeSlicesItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+//    QObject::connect(m_obliqueSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+
+    QVBoxLayout * vLayout = new QVBoxLayout(container);
+    vLayout->addWidget( m_dropDownButton);
+    vLayout->setContentsMargins(0,0,0,0);
+
+    m_oneSliceItem->setChecked(m_nbSlice == 1);
+    m_threeSlicesItem->setChecked(m_nbSlice == 3);
+//  m_obliqueSliceItem->setChecked(m_nbSlice == -1);
+
+    container->setLayout( vLayout );
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    QObject::disconnect(m_oneSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::disconnect(m_threeSlicesItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->initialize();
+
+    std::vector < Configuration > placeInSceneConfig = m_configuration->find("negatoAdaptor");
+    SLM_ASSERT("Tag negatoAdaptor required!", !placeInSceneConfig.empty());
+    SLM_ASSERT("UID attribute is missing", placeInSceneConfig.at(0)->hasAttribute("uid"));
+    m_adaptorUID = placeInSceneConfig.at(0)->getAttributeValue("uid");
+
+    if (placeInSceneConfig.at(0)->hasAttribute("slices"))
+    {
+        std::string value(placeInSceneConfig.at(0)->getAttributeValue("slices"));
+        m_nbSlice = ::boost::lexical_cast<int >(value.c_str());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void SliceListEditor::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    if( imageMsg && imageMsg->hasEvent( "SCAN_SHOW"))
+    {
+        ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("SCAN_SHOW");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        SLM_ASSERT("m_relatedServiceId is missing", dataInfo->getField( ::fwComEd::Dictionary::m_relatedServiceId ) );
+        std::string servId = dataInfo->getField< ::fwData::String >(::fwComEd::Dictionary::m_relatedServiceId)->value();
+        if( servId ==  m_adaptorUID )
+        {
+            ::fwData::Boolean::csptr isShowScan = ::fwData::Boolean::dynamicConstCast(dataInfo);
+            m_dropDownButton->setEnabled(isShowScan->value());
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor::onChangeSliceMode( bool checked )
+{
+    if(::fwTools::fwID::exist(m_adaptorUID))
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get(m_adaptorUID);
+        ::fwData::Image::sptr image = service->getObject< ::fwData::Image >();
+        SLM_ASSERT("SliceListEditor adaptorUID " << m_adaptorUID <<" isn't an Adaptor on an Image?" , image);
+
+        ::fwData::Integer::sptr dataInfo = ::fwData::Integer::New();
+
+        if(m_oneSliceItem->isChecked())
+        {
+            dataInfo->value() = 1;
+            m_nbSlice = 1;
+        }
+        else if(m_threeSlicesItem->isChecked())
+        {
+            dataInfo->value() = 3;
+            m_nbSlice = 3;
+        }
+        else if(m_obliqueSliceItem->isChecked())
+        {
+            dataInfo->value() = -1;
+            m_nbSlice = -1;
+        }
+        else
+        {
+            OSLM_FATAL("Unknown slice mode");
+        }
+        dataInfo->setField(::fwComEd::Dictionary::m_relatedServiceId ,  ::fwData::String::New( m_adaptorUID ) );
+        ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+        imageMsg->addEvent( "SLICE_MODE", dataInfo );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, imageMsg);
+    }
+    else
+    {
+        OSLM_TRACE("Service "<< m_adaptorUID << " is not yet present.");
+    }
+}
+
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor2.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor2.cpp
new file mode 100644
index 0000000..76e0860
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/SliceListEditor2.cpp
@@ -0,0 +1,231 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QWidget>
+#include <QString>
+#include <QMenu>
+#include <QAction>
+#include <QPushButton>
+#include <QVBoxLayout>
+
+#include <fwCore/base.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiImageQt/SliceListEditor2.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::SliceListEditor2 , ::fwData::Image ) ;
+
+
+SliceListEditor2::SliceListEditor2() throw()
+{
+    m_nbSlice = 1;
+//    addNewHandledEvent( "SCAN_SHOW" );
+}
+
+//------------------------------------------------------------------------------
+
+SliceListEditor2::~SliceListEditor2() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_dropDownButton = new QPushButton( QObject::tr(">"), container );
+    m_dropDownButton->setToolTip( QObject::tr("Manage slice visibility"));
+    m_dropDownButton->setMaximumWidth(40);
+
+    m_pDropDownMenu = new QMenu(container);
+    QActionGroup * actionGroup = new QActionGroup(m_pDropDownMenu);
+
+    m_noSliceItem = new QAction(QObject::tr("No slices"), m_pDropDownMenu);
+    m_oneSliceItem = new QAction(QObject::tr("One slice"), m_pDropDownMenu);
+    m_threeSlicesItem = new QAction(QObject::tr("Three slices"), m_pDropDownMenu);
+//  m_obliqueSliceItem = new QAction(QObject::tr("Oblique slice"), m_pDropDownMenu);
+    m_noSliceItem->setCheckable(true);
+    m_oneSliceItem->setCheckable(true);
+    m_threeSlicesItem->setCheckable(true);
+
+    actionGroup->addAction(m_noSliceItem);
+    actionGroup->addAction(m_oneSliceItem);
+    actionGroup->addAction(m_threeSlicesItem);
+
+    m_pDropDownMenu->addAction(m_noSliceItem);
+    m_pDropDownMenu->addAction(m_oneSliceItem);
+    m_pDropDownMenu->addAction(m_threeSlicesItem);
+//    m_pDropDownMenu->addAction(m_obliqueSliceItem);
+    m_dropDownButton->setMenu(m_pDropDownMenu);
+
+    QObject::connect(m_noSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::connect(m_oneSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::connect(m_threeSlicesItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+//    QObject::connect(m_obliqueSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+
+    QVBoxLayout * vLayout = new QVBoxLayout(container);
+    vLayout->addWidget( m_dropDownButton);
+    vLayout->setContentsMargins(0,0,0,0);
+
+    m_noSliceItem->setChecked(m_nbSlice == 0);
+    m_oneSliceItem->setChecked(m_nbSlice == 1);
+    m_threeSlicesItem->setChecked(m_nbSlice == 3);
+//  m_obliqueSliceItem->setChecked(m_nbSlice == -1);
+
+    container->setLayout( vLayout );
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    QObject::disconnect(m_noSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::disconnect(m_oneSliceItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+    QObject::disconnect(m_threeSlicesItem, SIGNAL(triggered(bool)), this, SLOT(onChangeSliceMode(bool)));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->initialize();
+
+    std::vector < Configuration > placeInSceneConfig = m_configuration->find("negatoAdaptor");
+    SLM_ASSERT("Tag negatoAdaptor required!", !placeInSceneConfig.empty());
+    SLM_ASSERT("UID attribute is missing", placeInSceneConfig.at(0)->hasAttribute("uid"));
+    m_adaptorUID = placeInSceneConfig.at(0)->getAttributeValue("uid");
+
+    if (placeInSceneConfig.at(0)->hasAttribute("slices"))
+    {
+        std::string value(placeInSceneConfig.at(0)->getAttributeValue("slices"));
+        m_nbSlice = ::boost::lexical_cast<int >(value.c_str());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    if( imageMsg && imageMsg->hasEvent( "SCAN_SHOW"))
+    {
+        ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("SCAN_SHOW");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        SLM_ASSERT("m_relatedServiceId is missing", dataInfo->getField( ::fwComEd::Dictionary::m_relatedServiceId ) );
+        std::string servId = dataInfo->getField< ::fwData::String >(::fwComEd::Dictionary::m_relatedServiceId)->value();
+        if( servId ==  m_adaptorUID )
+        {
+            ::fwData::Boolean::csptr isShowScan = ::fwData::Boolean::dynamicConstCast(dataInfo);
+            m_noSliceItem->setChecked(!isShowScan->value());
+            m_oneSliceItem->setChecked(isShowScan->value() && m_nbSlice == 1);
+            m_threeSlicesItem->setChecked(isShowScan->value() && m_nbSlice == 3);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SliceListEditor2::onChangeSliceMode( bool checked )
+{
+    if(::fwTools::fwID::exist(m_adaptorUID))
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get(m_adaptorUID);
+        ::fwData::Image::sptr image = service->getObject< ::fwData::Image >();
+        SLM_ASSERT("SliceListEditor2 adaptorUID " << m_adaptorUID <<" isn't an Adaptor on an Image?" , image);
+
+        ::fwData::Integer::sptr dataInfo = ::fwData::Integer::New();
+
+        if(m_noSliceItem->isChecked())
+        {
+            dataInfo->value() = 0;
+        }
+        else if(m_oneSliceItem->isChecked())
+        {
+            dataInfo->value() = 1;
+            m_nbSlice = 1;
+        }
+        else if(m_threeSlicesItem->isChecked())
+        {
+            dataInfo->value() = 3;
+            m_nbSlice = 3;
+        }
+//        else if(m_obliqueSliceItem->isChecked())
+//        {
+//            dataInfo->value() = -1;
+//            m_nbSlice = -1;
+//        }
+        else
+        {
+            OSLM_FATAL("Unknown slice mode");
+        }
+        dataInfo->setField(::fwComEd::Dictionary::m_relatedServiceId ,  ::fwData::String::New( m_adaptorUID ) );
+        ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+        imageMsg->addEvent( "SLICE_MODE", dataInfo );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, imageMsg);
+    }
+    else
+    {
+        OSLM_TRACE("Service "<< m_adaptorUID << " is not yet present.");
+    }
+}
+
+}
+
diff --git a/Bundles/LeafUI/uiImageQt/src/uiImageQt/WindowLevel.cpp b/Bundles/LeafUI/uiImageQt/src/uiImageQt/WindowLevel.cpp
new file mode 100644
index 0000000..66de16b
--- /dev/null
+++ b/Bundles/LeafUI/uiImageQt/src/uiImageQt/WindowLevel.cpp
@@ -0,0 +1,629 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QComboBox>
+#include <QGridLayout>
+#include <QDoubleValidator>
+#include <QLabel>
+#include <QLineEdit>
+#include <QMenu>
+#include <QSignalMapper>
+#include <QToolButton>
+#include <QWidget>
+
+#include <boost/math/special_functions/fpclassify.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+#include <fwGuiQt/widget/QRangeSlider.hpp>
+
+
+#include "uiImageQt/WindowLevel.hpp"
+
+namespace uiImage
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiImage::WindowLevel , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+WindowLevel::WindowLevel() throw()
+{
+    m_widgetDynamicRangeMin   = -1024.;
+    m_widgetDynamicRangeWidth =  4000.;
+    m_autoWindowing = false;
+    m_imageMin = -200;
+    m_imageMax = 300;
+    m_isNotifying = false;
+    m_useImageGreyLevelTF = false;
+
+    //this->installTFSelectionEventHandler(this);
+    //this->addNewHandledEvent(::fwComEd::ImageMsg::BUFFER);
+    //this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+}
+
+//------------------------------------------------------------------------------
+
+WindowLevel::~WindowLevel() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::starting() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    this->create();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget * const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QGridLayout* layout = new QGridLayout();
+
+    m_valueTextMin = new QLineEdit( container );
+    QDoubleValidator *minValidator = new QDoubleValidator(m_valueTextMin);
+    m_valueTextMin->setValidator(minValidator);
+
+    m_valueTextMax = new QLineEdit( container );
+    QDoubleValidator*  maxValidator = new QDoubleValidator(m_valueTextMax);
+    m_valueTextMax->setValidator(maxValidator);
+
+    m_rangeSlider = new ::fwGuiQt::widget::QRangeSlider(container);
+
+    m_toggleTFButton = new QToolButton(container);
+    QIcon ico;
+    QString squareIcon(LIBSFW4SPL "Bundles/media_0-1/square.png");
+    QString rampIcon(LIBSFW4SPL "Bundles/media_0-1/ramp.png");
+    ico.addPixmap(QPixmap(squareIcon), QIcon::Normal,QIcon::On);
+    ico.addPixmap(QPixmap(rampIcon), QIcon::Normal,QIcon::Off);
+    m_toggleTFButton->setIcon(ico);
+    m_toggleTFButton->setCheckable(true);
+
+    m_toggleAutoButton = new QToolButton(container);
+    QIcon icon;
+    QString windo(LIBSFW4SPL "Bundles/media_0-1/windowing.svg");
+    icon.addFile(windo, QSize(), QIcon::Normal,QIcon::On);
+    QString nowindo(LIBSFW4SPL "Bundles/media_0-1/nowindowing.svg");
+    icon.addFile(nowindo, QSize(), QIcon::Normal,QIcon::Off);
+    m_toggleAutoButton->setIcon(icon);
+    m_toggleAutoButton->setToolTip("Automatic Windowing");
+    m_toggleAutoButton->setCheckable(true);
+    m_toggleAutoButton->setChecked(m_autoWindowing);
+
+    m_dynamicRangeSelection = new QToolButton(container);
+    m_dynamicRangeSelection->setPopupMode(QToolButton::InstantPopup);
+
+    m_dynamicRangeMenu = new QMenu(m_dynamicRangeSelection);
+    QAction *action1 = m_dynamicRangeMenu->addAction( "-1024; 1023" );
+    QAction *action2 = m_dynamicRangeMenu->addAction( "-100; 300" );
+    QAction *action3 = m_dynamicRangeMenu->addAction( "Fit W/L" );
+    QAction *action4 = m_dynamicRangeMenu->addAction( "Fit Data" ); // TODO
+    //QAction *action5 = m_dynamicRangeMenu->addAction( "Custom ..." ); // TODO
+    m_dynamicRangeSelection->setMenu(m_dynamicRangeMenu);
+
+    action1->setData(QVariant(1));
+    action2->setData(QVariant(2));
+    action3->setData(QVariant(3));
+    action4->setData(QVariant(4));
+    //action5->setData(QVariant(5));
+
+
+    layout->addWidget( m_rangeSlider,  0, 0, 1, -1 );
+    layout->addWidget( m_valueTextMin, 1, 0 );
+    layout->addWidget( m_toggleTFButton, 1, 1 );
+    layout->addWidget( m_toggleAutoButton, 1, 2 );
+    layout->addWidget( m_dynamicRangeSelection, 1, 3 );
+    layout->addWidget( m_valueTextMax, 1, 4 );
+
+
+    container->setLayout( layout );
+    this->updating();
+
+    m_dynamicRangeSignalMapper = new QSignalMapper(this);
+
+    QObject::connect(m_valueTextMin, SIGNAL(editingFinished()), this, SLOT(onTextEditingFinished()));
+    QObject::connect(m_valueTextMax, SIGNAL(editingFinished()), this, SLOT(onTextEditingFinished()));
+    QObject::connect(m_rangeSlider, SIGNAL(sliderRangeEdited( double, double )) , this, SLOT(onWindowLevelWidgetChanged( double, double )));
+    QObject::connect(m_toggleTFButton, SIGNAL(toggled( bool )), this, SLOT(onToggleTF( bool )));
+    QObject::connect(m_toggleAutoButton, SIGNAL(toggled( bool )), this, SLOT(onToggleAutoWL( bool )));
+    QObject::connect(m_dynamicRangeSelection, SIGNAL(triggered( QAction * )), this, SLOT(onDynamicRangeSelectionChanged( QAction * )));
+
+    this->installTFObserver( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::stopping() throw(::fwTools::Failed)
+{
+    this->removeTFObserver();
+    QObject::disconnect(m_dynamicRangeSelection, SIGNAL(triggered( QAction * )), this, SLOT(onDynamicRangeSelectionChanged( QAction * )));
+    QObject::disconnect(m_toggleTFButton, SIGNAL(toggled( bool )), this, SLOT(onToggleTF( bool )));
+    QObject::disconnect(m_rangeSlider, SIGNAL(sliderRangeEdited( double, double )), this, SLOT(onWindowLevelWidgetChanged( double, double )));
+    QObject::disconnect(m_valueTextMin, SIGNAL(editingFinished( QString )), this, SLOT(onTextEditingFinished( QString )));
+    QObject::disconnect(m_valueTextMax, SIGNAL(editingFinished( QString )), this, SLOT(onTextEditingFinished( QString )));
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+
+    // deletes contained widgets
+    this->getContainer()->clean();
+
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > configs = m_configuration->find("config");
+    SLM_ASSERT("WindowLevel config is empty.", configs.size() == 1);
+
+    ::fwRuntime::ConfigurationElement::sptr config = configs.front();
+    if (config->hasAttribute("autoWindowing"))
+    {
+        std::string autoWindowing = config->getExistingAttributeValue("autoWindowing");
+        SLM_ASSERT("Bad value for 'autoWindowing' attribute. It must be 'yes' or 'no'!", autoWindowing == "yes" || autoWindowing == "no");
+        m_autoWindowing = (autoWindowing == "yes");
+    }
+
+    if ( config->hasAttribute("useImageGreyLevelTF") )
+    {
+        std::string useImageGreyLevelTF = config->getExistingAttributeValue("useImageGreyLevelTF");
+        SLM_ASSERT("Bad value for 'useImageGreyLevelTF' attribute. It must be 'yes' or 'no'!", useImageGreyLevelTF == "yes" || useImageGreyLevelTF == "no");
+        m_useImageGreyLevelTF = (useImageGreyLevelTF == "yes");
+    }
+
+    this->parseTFConfig(config);
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+    this->setEnabled(imageIsValid);
+
+    this->updateTransferFunction(image, this->getSptr());
+    if(imageIsValid)
+    {
+        this->updateImageInfos(image);
+
+        // test if service must use image grey level tf ( when another tf pool is defined )
+        if( m_useImageGreyLevelTF &&
+            ! this->getTFSelectionFwID().empty() )
+        {
+            ::fwData::TransferFunction::sptr newTF = this->getImageGreyLevelTF();
+            this->swapCurrentTFAndNotify( newTF );
+            m_toggleTFButton->setCheckable(true);
+        }
+
+        if(m_autoWindowing)
+        {
+            double min, max;
+            ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+            this->updateImageWindowLevel(min, max);
+        }
+
+        ::fwData::TransferFunction::sptr pTF = this->getTransferFunction();
+        SLM_ASSERT("TransferFunction null pointer", pTF);
+        ::fwData::TransferFunction::TFValuePairType minMax = pTF->getWLMinMax();
+        this->onImageWindowLevelChanged( minMax.first, minMax.second );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::swapping() throw(::fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->updating();
+    this->installTFObserver( this->getSptr() );
+}
+//------------------------------------------------------------------------------
+
+void WindowLevel::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->upadteTFObserver(msg, this->getSptr());
+
+    if (msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ))
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+        bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+        if (imageIsValid)
+        {
+            this->updateImageInfos(image);
+            this->updateTransferFunction(image, this->getSptr());
+
+
+            if(m_autoWindowing)
+            {
+                double min, max;
+                ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+                this->updateImageWindowLevel(min, max);
+            }
+
+            ::fwData::TransferFunction::sptr pTF = this->getTransferFunction();
+            SLM_ASSERT("TransferFunction null pointer", pTF);
+            ::fwData::TransferFunction::TFValuePairType minMax = pTF->getWLMinMax();
+            this->onImageWindowLevelChanged( minMax.first, minMax.second );
+        }
+        this->setEnabled(imageIsValid);
+
+    }
+    if (msg->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING ))
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+        bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+        SLM_ASSERT("Image is not valid",imageIsValid);
+        this->updateTransferFunction(image, this->getSptr());
+
+        ::fwData::TransferFunction::sptr pTF = this->getTransferFunction();
+        SLM_ASSERT("TransferFunction null pointer", pTF);
+        ::fwData::TransferFunction::TFValuePairType minMax = pTF->getWLMinMax();
+        this->onImageWindowLevelChanged( minMax.first, minMax.second );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::info( std::ostream & _sstream )
+{
+    _sstream << "Window level editor";
+}
+
+//------------------------------------------------------------------------------
+
+WindowLevel::WindowLevelMinMaxType WindowLevel::getImageWindowMinMax()
+{
+    ::fwData::TransferFunction::sptr pTF = this->getTransferFunction();
+    SLM_ASSERT("TransferFunction null pointer", pTF);
+
+    return pTF->getWLMinMax();
+}
+
+//------------------------------------------------------------------------------
+void WindowLevel::updateWidgetMinMax(double _imageMin, double _imageMax)
+{
+    double rangeMin = this->fromWindowLevel(_imageMin);
+    double rangeMax = this->fromWindowLevel(_imageMax);
+
+    m_rangeSlider->setPos(rangeMin, rangeMax);
+}
+
+//------------------------------------------------------------------------------
+
+double WindowLevel::fromWindowLevel(double val)
+{
+    double valMin = m_widgetDynamicRangeMin;
+    double valMax = valMin + m_widgetDynamicRangeWidth;
+
+    valMin = std::min(val, valMin);
+    valMax = std::max(val, valMax);
+
+    this->setWidgetDynamicRange(valMin, valMax);
+
+    double res = (val - m_widgetDynamicRangeMin) / m_widgetDynamicRangeWidth;
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+double WindowLevel::toWindowLevel(double _val)
+{
+    return m_widgetDynamicRangeMin + m_widgetDynamicRangeWidth * _val;
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::updateImageWindowLevel(double _imageMin, double _imageMax)
+{
+    m_imageMin = _imageMin;
+    m_imageMax = _imageMax;
+
+    if (!m_isNotifying)
+    {
+        this->notifyWindowLevel(_imageMin, _imageMax);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::onWindowLevelWidgetChanged(double _min, double _max)
+{
+    double imageMin = this->toWindowLevel(_min);
+    double imageMax = this->toWindowLevel(_max);
+    this->updateImageWindowLevel(imageMin, imageMax);
+    this->updateTextWindowLevel (imageMin, imageMax);
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::onDynamicRangeSelectionChanged(QAction *action)
+{
+    WindowLevelMinMaxType wl = this->getImageWindowMinMax();
+    double min = m_widgetDynamicRangeMin;
+    double max = m_widgetDynamicRangeWidth + min;
+    int index = action->data().toInt();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    switch (index)
+    {
+        case 0:
+            break;
+        case 1: // -1024; 1023
+            min = -1024;
+            max =  1023;
+            break;
+        case 2: // -100; 300
+            min = -100;
+            max =  300;
+            break;
+        case 3: // Fit Window/Level
+            min = std::min(wl.first, wl.second);
+            max = std::max(wl.first, wl.second);
+            break;
+        case 4: // Fit Image Range
+            ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+            break;
+        case 5: // Custom : TODO
+            break;
+        default:
+            SLM_ASSERT("Unknown range selector index", 0);
+    }
+
+    this->setWidgetDynamicRange(min, max);
+    this->updateWidgetMinMax(wl.first, wl.second);
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::onImageWindowLevelChanged(double _imageMin, double _imageMax)
+{
+    this->updateWidgetMinMax( _imageMin, _imageMax );
+    this->updateTextWindowLevel( _imageMin, _imageMax );
+}
+
+//------------------------------------------------------------------------------
+
+// Check if service that registered the callback is still alive
+struct WLCallback
+{
+    typedef void result_type;
+
+    WLCallback(WindowLevel::sptr wl)
+    {
+        m_wl = wl;
+    }
+
+    void operator()()
+    {
+        if ( !m_wl.expired() )
+        {
+            m_wl.lock()->notifyWindowLevelCallback();
+        }
+    }
+
+    WindowLevel::wptr m_wl;
+};
+
+void  WindowLevel::notifyWindowLevel(double _imageMin, double _imageMax)
+{
+    m_notifiedImageMin = _imageMin;
+    m_notifiedImageMax = _imageMax;
+
+    this->setWindowLevel(m_imageMin, m_imageMax);
+    ::fwComEd::TransferFunctionMsg::sptr msg = this->notifyTFWindowing(this->getSptr());
+    msg->setMessageCallback(::boost::bind( WLCallback(WindowLevel::dynamicCast(this->getSptr())) ));
+
+    m_isNotifying = true;
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::notifyWindowLevelCallback()
+{
+    m_isNotifying = false;
+
+    if (m_notifiedImageMin != m_imageMin || m_notifiedImageMax != m_imageMax)
+    {
+        this->updateImageWindowLevel(m_imageMin, m_imageMax);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::updateTextWindowLevel(double _imageMin, double _imageMax)
+{
+    m_valueTextMin->setText(QString("%1").arg(_imageMin));
+    m_valueTextMax->setText(QString("%1").arg(_imageMax));
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::onToggleTF(bool squareTF)
+{
+    bool usedGreyLevelTF = false;
+
+    ::fwData::TransferFunction::sptr oldTF = this->getTransferFunction();
+    ::fwData::TransferFunction::sptr newTF;
+
+    if( squareTF )
+    {
+        newTF = ::fwData::TransferFunction::New();
+        ::fwData::TransferFunction::TFColor color(1.,1.,1.,1.);
+        newTF->setName("SquareTF");
+        newTF->addTFColor(0.0, color);
+        newTF->addTFColor(1.0, color);
+        newTF->setIsClamped(true);
+    }
+    else
+    {
+        // test if service must use image grey level tf ( when another tf pool is defined )
+        if(     m_useImageGreyLevelTF &&
+                ! this->getTFSelectionFwID().empty() )
+        {
+            newTF = this->getImageGreyLevelTF();
+            usedGreyLevelTF = true;
+        }
+        else
+        {
+            newTF = ::fwData::TransferFunction::createDefaultTF();
+        }
+    }
+
+    newTF->setWindow( oldTF->getWindow() );
+    newTF->setLevel( oldTF->getLevel() );
+
+    this->swapCurrentTFAndNotify( newTF );
+
+    if ( usedGreyLevelTF )
+    {
+        this->notifyTFWindowing( this->getSptr() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::onToggleAutoWL(bool autoWL)
+{
+     m_autoWindowing = autoWL;
+
+     if (m_autoWindowing)
+     {
+         ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+         double min, max;
+         ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+         this->updateImageWindowLevel(min, max);
+         this->onImageWindowLevelChanged(min, max);
+     }
+}
+
+//------------------------------------------------------------------------------
+
+void  WindowLevel::onTextEditingFinished()
+{
+    double min, max;
+    if(this->getWidgetDoubleValue(m_valueTextMin, min) && this->getWidgetDoubleValue(m_valueTextMax, max))
+    {
+        this->updateWidgetMinMax( min, max );
+        this->updateImageWindowLevel(min, max);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool WindowLevel::getWidgetDoubleValue(QLineEdit *widget, double &val)
+{
+    bool ok=false;
+    val = widget->text().toDouble(&ok);
+
+    QPalette palette;
+    if (!ok)
+    {
+        palette.setBrush(QPalette::Base, QBrush(Qt::red));
+    }
+    else
+    {
+        palette.setBrush(QPalette::Base, QApplication::palette().brush(QPalette::Base));
+    }
+    widget->setPalette(palette);
+    return ok;
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::setEnabled(bool enable)
+{
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget * const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+    container->setEnabled(enable);
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::setWidgetDynamicRange(double min, double max)
+{
+    if(fabs(max - min) < 1.e-05)
+    {
+        max = min + 1.e-05;
+    }
+    m_widgetDynamicRangeMin = min;
+    m_widgetDynamicRangeWidth = max - min;
+
+    m_dynamicRangeSelection->setText(QString("%1, %2 ").arg(min).arg(max));
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr WindowLevel::getImageGreyLevelTF()
+{
+    ::fwData::TransferFunction::sptr defaultTF;
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    // Create pool
+    ::fwComEd::helper::Image helper(image);
+    helper.createTransferFunctionPool( this->getSptr() ); // do nothing if image tf pool already exist
+
+    // Get pool
+    const std::string poolFieldName = ::fwComEd::Dictionary::m_transferFunctionCompositeId;
+    ::fwData::Composite::sptr pool = image->getField< ::fwData::Composite >(poolFieldName);
+
+    // Get image default image tf
+    const std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+    defaultTF = ::fwData::TransferFunction::dynamicCast((*pool)[defaultTFName]);
+
+    return defaultTF;
+}
+
+//------------------------------------------------------------------------------
+
+void WindowLevel::swapCurrentTFAndNotify( ::fwData::TransferFunction::sptr newTF )
+{
+    // Change TF
+    std::string tfSelectionFwID = this->getTFSelectionFwID();
+    ::fwData::Composite::sptr pool = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject( tfSelectionFwID ) );
+    OSLM_ASSERT( "Sorry, object with fwID " << tfSelectionFwID << " doesn't exist.", pool );
+    ::fwComEd::helper::Composite compositeHelper( pool );
+    compositeHelper.swap( this->getSelectedTFKey(), newTF );
+
+    // Notify change
+    compositeHelper.notify( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafUI/uiMeasurement/CMakeLists.txt b/Bundles/LeafUI/uiMeasurement/CMakeLists.txt
new file mode 100644
index 0000000..2605701
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/CMakeLists.txt
@@ -0,0 +1,14 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwGui
+    fwRuntime
+)
+
+
+find_package(Boost REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    )
+
diff --git a/Bundles/LeafUI/uiMeasurement/COPYING b/Bundles/LeafUI/uiMeasurement/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiMeasurement/COPYING.LESSER b/Bundles/LeafUI/uiMeasurement/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiMeasurement/Properties.cmake b/Bundles/LeafUI/uiMeasurement/Properties.cmake
new file mode 100644
index 0000000..659d19e
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiMeasurement )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiMeasurement/bin/build.options b/Bundles/LeafUI/uiMeasurement/bin/build.options
new file mode 100644
index 0000000..1adb0be
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/bin/build.options
@@ -0,0 +1,15 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          ]
+USE     = ['boost']
+BUNDLES = ['gui_0-1',]
+REQUIREMENTS = ['ioAtoms_0-1']
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Namespace.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Namespace.hpp
new file mode 100644
index 0000000..cdc3712
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIMEASUREMENT_NAMESPACE_HPP_
+#define UIMEASUREMENT_NAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiMeasurement contains actions to add/show/remove distances and landmarks.
+ * @namespace   uiMeasurement
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiMeasurement
+{
+
+}
+#endif /* UIMEASUREMENT_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Plugin.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Plugin.hpp
new file mode 100644
index 0000000..e87786b
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/Plugin.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_PLUGIN_HPP_
+#define _UIMEASUREMENT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiMeasurement
+{
+
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiMeasurement
+
+#endif //_UIMEASUREMENT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddDistance.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddDistance.hpp
new file mode 100644
index 0000000..cb3406d
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddDistance.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_ADDISTANCE_HPP_
+#define _UIMEASUREMENT_ACTION_ADDISTANCE_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action adds distance on image.
+ * @class   AddDistance
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API AddDistance : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (AddDistance)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API AddDistance() throw() ;
+
+    UIMEASUREMENT_API virtual ~AddDistance() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+private:
+    int m_actionCheckId;
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_ADDISTANCE_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddLandmark.hpp
new file mode 100644
index 0000000..48a1057
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/AddLandmark.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_ADDLANDMARK_HPP_
+#define _UIMEASUREMENT_ACTION_ADDLANDMARK_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action adds landmaks on image.
+ * @class   AddLandmark
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API AddLandmark : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (AddLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API AddLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~AddLandmark() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+private:
+    int m_actionCheckId;
+};
+
+} // namespace action
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_ADDLANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/FocusLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/FocusLandmark.hpp
new file mode 100644
index 0000000..04d67ed
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/FocusLandmark.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_FOCUSLANDMARK_HPP_
+#define _UIMEASUREMENT_ACTION_FOCUSLANDMARK_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action moves the image slice on chosen landmark.
+ * @class   FocusLandmark
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API FocusLandmark : public ::fwGui::IActionSrv
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (FocusLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API FocusLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~FocusLandmark() throw() ;
+
+protected:
+
+    UIMEASUREMENT_API void starting() throw ( ::fwTools::Failed );
+
+    UIMEASUREMENT_API void stopping() throw ( ::fwTools::Failed );
+
+    UIMEASUREMENT_API void receiving( fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed );
+
+    UIMEASUREMENT_API void configuring() throw ( ::fwTools::Failed );
+
+    UIMEASUREMENT_API void updating() throw ( ::fwTools::Failed );
+
+    UIMEASUREMENT_API void info ( std::ostream &_sstream ) ;
+
+};
+
+} // namespace action
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_FOCUSLANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/LoadLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/LoadLandmark.hpp
new file mode 100644
index 0000000..a422999
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/LoadLandmark.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
+#define _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+class UIMEASUREMENT_CLASS_API LoadLandmark : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (LoadLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API LoadLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~LoadLandmark() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    void info(std::ostream &_sstream ) ;
+
+    void load(const ::boost::filesystem::path& path);
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveDistance.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveDistance.hpp
new file mode 100644
index 0000000..55ca1f8
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveDistance.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_REMOVEDISTANCE_HPP_
+#define _UIMEASUREMENT_ACTION_REMOVEDISTANCE_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+
+namespace uiMeasurement
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action removes distances.
+ * @class   RemoveDistance
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API RemoveDistance : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (RemoveDistance)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API RemoveDistance() throw() ;
+
+    UIMEASUREMENT_API virtual ~RemoveDistance() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+private:
+    void notifyNewDistance(::fwData::Image::sptr image, ::fwData::Object::sptr backup);
+
+    void notifyDeleteDistance(::fwData::Image::sptr image, ::fwData::Object::sptr distance);
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_REMOVEDISTANCE_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveLandmark.hpp
new file mode 100644
index 0000000..9514896
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/RemoveLandmark.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_REMOVELANDMARK_HPP_
+#define _UIMEASUREMENT_ACTION_REMOVELANDMARK_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+
+namespace uiMeasurement
+{
+
+namespace action
+{
+
+/**
+ * @brief   This action removes landmarks.
+ * @class   RemoveLandmark
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API RemoveLandmark : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (RemoveLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API RemoveLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~RemoveLandmark() throw() ;
+
+protected:
+
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    void info(std::ostream &_sstream ) ;
+
+private:
+    void notify( ::fwData::Image::sptr image, ::fwData::Object::sptr backup );
+
+    ::fwData::Point::sptr  getLandmarkToRemove(::fwData::Image::sptr image, bool &removeAll);
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_REMOVELANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SAddLabeledPoint.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SAddLabeledPoint.hpp
new file mode 100644
index 0000000..8b60f45
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SAddLabeledPoint.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_SADDLABELEDPOINT_HPP_
+#define _UIMEASUREMENT_ACTION_SADDLABELEDPOINT_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action adds landmaks on image.
+ * @class   SAddLabeledPoint
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API SAddLabeledPoint : public ::fwGui::IActionSrv
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SAddLabeledPoint)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API SAddLabeledPoint() throw() ;
+
+    UIMEASUREMENT_API virtual ~SAddLabeledPoint() throw() ;
+
+protected:
+
+
+    UIMEASUREMENT_API void configuring() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void starting() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void updating() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    UIMEASUREMENT_API void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+private:
+
+    /// Helper to build point label
+    bool defineLabel(std::string &name);
+
+    int m_actionCheckId;
+
+    unsigned int m_count;
+};
+
+} // namespace action
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_SADDLABELEDPOINT_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SaveLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SaveLandmark.hpp
new file mode 100644
index 0000000..b47d71f
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/SaveLandmark.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
+#define _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+class UIMEASUREMENT_CLASS_API SaveLandmark : public ::fwGui::IActionSrv
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SaveLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API SaveLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~SaveLandmark() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    void info(std::ostream &_sstream ) ;
+
+    void save(const ::boost::filesystem::path& path);
+
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_UI_ACTION_SAVELANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowDistance.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowDistance.hpp
new file mode 100644
index 0000000..1f409a2
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowDistance.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_SHOWDISTANCE_HPP_
+#define _UIMEASUREMENT_ACTION_SHOWDISTANCE_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+#include <fwData/Image.hpp>
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows to show/hide image distances.
+ * @class   ShowDistance
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API ShowDistance : public ::fwGui::IActionSrv
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ShowDistance)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API ShowDistance() throw() ;
+
+    UIMEASUREMENT_API virtual ~ShowDistance() throw() ;
+
+protected:
+
+    // update its show/hide flag according image ShowDistance field notification
+    UIMEASUREMENT_API void receiving(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed);
+
+    UIMEASUREMENT_API void swapping() throw(::fwTools::Failed) ;
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+
+protected :
+
+    ::fwData::Image::wptr m_observedImage;
+
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_SHOWDISTANCE_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowLandmark.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowLandmark.hpp
new file mode 100644
index 0000000..e0f0208
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/action/ShowLandmark.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_ACTION_SHOWLANDMARK_HPP_
+#define _UIMEASUREMENT_ACTION_SHOWLANDMARK_HPP_
+
+#include <fwGui/IActionSrv.hpp>
+#include <fwData/Image.hpp>
+#include "uiMeasurement/config.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows to show/hide image landmarks.
+ * @class   ShowLandmark
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENT_CLASS_API ShowLandmark : public ::fwGui::IActionSrv
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ShowLandmark)( ::fwGui::IActionSrv) ) ;
+
+    UIMEASUREMENT_API ShowLandmark() throw() ;
+
+    UIMEASUREMENT_API virtual ~ShowLandmark() throw() ;
+
+protected:
+
+    void configuring() throw (::fwTools::Failed);
+
+    void starting() throw (::fwTools::Failed);
+
+    void updating() throw (::fwTools::Failed);
+
+    void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed) ;
+
+    void stopping() throw (::fwTools::Failed);
+
+    UIMEASUREMENT_API void swapping() throw(::fwTools::Failed) ;
+    UIMEASUREMENT_API void info(std::ostream &_sstream ) ;
+
+protected :
+
+    ::fwData::Image::wptr m_observedImage;
+
+};
+
+} // namespace action
+
+} // namespace uiMeasurement
+
+#endif // _UIMEASUREMENT_ACTION_SHOWLANDMARK_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/config.hpp b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/config.hpp
new file mode 100644
index 0000000..a8da7b1
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/include/uiMeasurement/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENT_CONFIG_HPP_
+#define _UIMEASUREMENT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIMEASUREMENT_EXPORTS
+    #define UIMEASUREMENT_API __declspec(dllexport)
+    #else
+    #define UIMEASUREMENT_API __declspec(dllimport)
+    #endif
+
+    #define UIMEASUREMENT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIMEASUREMENT_EXPORTS
+    #define UIMEASUREMENT_API __attribute__ ((visibility("default")))
+    #define UIMEASUREMENT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIMEASUREMENT_API __attribute__ ((visibility("hidden")))
+    #define UIMEASUREMENT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIMEASUREMENT_API
+    #define UIMEASUREMENT_CLASS_API
+
+#endif
+
+#endif //_UIMEASUREMENT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiMeasurement/rc/plugin.xml b/Bundles/LeafUI/uiMeasurement/rc/plugin.xml
new file mode 100644
index 0000000..e2c4f39
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/rc/plugin.xml
@@ -0,0 +1,110 @@
+<plugin id="uiMeasurement" class="::uiMeasurement::Plugin">
+    <library name="uiMeasurement"/>
+    
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+    <requirement id="io"/>
+    <requirement id="ioAtoms"/>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::SaveLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::LoadLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::AddDistance</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::ShowDistance</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::RemoveDistance</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::AddLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::RemoveLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::FocusLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+        
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::ShowLandmark</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMeasurement::action::SAddLabeledPoint</service>
+        <object>::fwData::PointList</object>
+    </extension>
+    
+     <extension implements="::fwServices::registry::AppConfig">
+        <id>LoadLandmark</id>
+        <type>parameters</type>
+        <parameters>
+            <param name="GENERIC_UID" />
+            <param name="landmark" />
+            <param name="file" />
+        </parameters>
+        <config>
+            <object uid="${landmark}" src="ref">
+                <service uid="${GENERIC_UID}_LoadLandmark" impl="::ioAtoms::SReader" >
+                    <file>${file}</file>
+                    <patcher context="Landmark" version="V1" />
+                </service>
+                <start uid="${GENERIC_UID}_LoadLandmark" />
+                <update uid="${GENERIC_UID}_LoadLandmark" />
+            </object>
+        </config>
+    </extension>
+    
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>SaveLandmark</id>
+        <type>parameters</type>
+        <parameters>
+            <param name="GENERIC_UID" />
+            <param name="landmark" />
+            <param name="file" />
+        </parameters>
+        <config>
+            <object uid="${landmark}" src="ref">
+                <service uid="${GENERIC_UID}_SaveLandmark" impl="::ioAtoms::SWriter" >
+                    <file>${file}</file>
+                    <patcher context="Landmark" version="V1" />
+                </service>
+                <start uid="${GENERIC_UID}_SaveLandmark" />
+                <update uid="${GENERIC_UID}_SaveLandmark" />
+            </object>
+        </config>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/Plugin.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/Plugin.cpp
new file mode 100755
index 0000000..51df4be
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "uiMeasurement/Plugin.hpp"
+
+namespace uiMeasurement
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiMeasurement::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace operators
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddDistance.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddDistance.cpp
new file mode 100644
index 0000000..1e77d2a
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddDistance.cpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Vector.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+
+#include "uiMeasurement/action/AddDistance.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::AddDistance , ::fwData::Image ) ;
+
+
+//------------------------------------------------------------------------------
+
+
+AddDistance::AddDistance( ) throw():
+    m_actionCheckId(-1)
+{}
+
+//------------------------------------------------------------------------------
+
+AddDistance::~AddDistance() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::info(std::ostream &_sstream )
+{
+    _sstream << "Action for remove distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE("AddDistance::updating");
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    if (!image) {return; }
+
+    ::fwData::Point::sptr pt1 = ::fwData::Point::New();
+    std::copy( image->getOrigin().begin(),  image->getOrigin().begin() +3, pt1->getRefCoord().begin() );
+
+    ::fwData::Point::sptr pt2 = ::fwData::Point::New();
+    std::copy( image->getSize().begin(),  image->getSize().begin() +3, pt2->getRefCoord().begin() );
+
+    std::transform( pt2->getRefCoord().begin(),pt2->getRefCoord().end(),
+            image->getSpacing().begin(),
+            pt2->getRefCoord().begin(),
+            std::multiplies<double>() );
+    std::transform( pt2->getRefCoord().begin(),pt2->getRefCoord().end(),
+            image->getOrigin().begin(),
+            pt2->getRefCoord().begin(),
+            std::plus<double>() );
+
+    ::fwData::PointList::sptr pl = ::fwData::PointList::New();
+
+    pl->getRefPoints().push_back( pt1 );
+    pl->getRefPoints().push_back( pt2 );
+
+    ::fwData::Vector::sptr vectDist;
+    vectDist = image->setDefaultField(::fwComEd::Dictionary::m_imageDistancesId, ::fwData::Vector::New());
+
+    vectDist->getContainer().push_back(pl);
+
+    // force distance to be shown
+    image->setField("ShowDistances",  ::fwData::Boolean::New(true));
+
+
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::DISTANCE );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void AddDistance::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddLandmark.cpp
new file mode 100644
index 0000000..77a4564
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/AddLandmark.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/InputDialog.hpp>
+
+#include "uiMeasurement/action/AddLandmark.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::AddLandmark , ::fwData::Image ) ;
+
+
+//------------------------------------------------------------------------------
+
+
+AddLandmark::AddLandmark( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+AddLandmark::~AddLandmark() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for remove distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+// return true if label setting is NOT Canceled , name is modified !!!
+bool defineLabel(std::string &name)
+{
+    bool res = false;
+    static int count = 1;
+    name = "Label" + ::boost::lexical_cast< std::string >(count );
+
+    ::fwData::String::sptr url = ::fwData::String::New();
+    ::fwGui::dialog::InputDialog inputDlg;
+    inputDlg.setTitle("Label");
+    inputDlg.setMessage("Which label for the point?");
+    inputDlg.setInput (name);
+    std::string inputText = inputDlg.getInput();
+
+    if(!inputText.empty())
+    {
+        name = inputText;
+        count++; // reset count if operation canceled
+        res = true;
+    }
+    return res ;
+}
+
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    if (!::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Add landmarks",
+                "Sorry, it is impossible to add image landmarks. There is not loaded image in the software.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        return;
+    }
+
+    std::string value;
+    if ( defineLabel(value) )
+    {
+        //get landmarks
+        ::fwComEd::fieldHelper::MedicalImageHelpers::checkLandmarks(  image );
+        ::fwData::PointList::sptr landmarks =  image->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId);
+        SLM_ASSERT("landmarks not instanced", landmarks);
+
+        // create a new point
+        ::fwData::Point::sptr newPoint = ::fwComEd::fieldHelper::MedicalImageHelpers::getImageSliceIndices( image );
+        // transform slice to mm
+        std::transform( newPoint->getRefCoord().begin(),newPoint->getRefCoord().end(),
+                image->getSpacing().begin(),
+                newPoint->getRefCoord().begin(),
+                std::multiplies<double>() );
+        std::transform( newPoint->getRefCoord().begin(),newPoint->getRefCoord().end(),
+                image->getOrigin().begin(),
+                newPoint->getRefCoord().begin(),
+                std::plus<double>() );
+        // append to landmark
+        landmarks->getRefPoints().push_back( newPoint );
+
+        // append to point the label
+        ::fwData::String::sptr label = ::fwData::String::New();
+        label->value() = value;
+        newPoint->setField( ::fwComEd::Dictionary::m_labelId , label );
+
+        image->setField("ShowLandmarks", ::fwData::Boolean::New(true));
+
+        // notify
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->addEvent( ::fwComEd::ImageMsg::LANDMARK );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void AddLandmark::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/FocusLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/FocusLandmark.cpp
new file mode 100644
index 0000000..e8cdd65
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/FocusLandmark.cpp
@@ -0,0 +1,179 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwGui/dialog/SelectorDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "uiMeasurement/action/FocusLandmark.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::FocusLandmark , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+FocusLandmark::FocusLandmark( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+FocusLandmark::~FocusLandmark() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::starting() throw ( ::fwTools::Failed )
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::stopping() throw ( ::fwTools::Failed )
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::configuring() throw ( ::fwTools::Failed )
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::receiving( fwServices::ObjectMsg::csptr _pMsg ) throw ( ::fwTools::Failed )
+{
+    // Do nothing. this method must be not used.
+    SLM_FATAL("Action should not receive a message, correct your configuration");
+}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for focus a landmark distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void FocusLandmark::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr pImage = this->getObject< ::fwData::Image >();
+    if (!::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(pImage))
+    {
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Add landmarks");
+        messageBox.setMessage( "Sorry, it is impossible to add image landmarks. There is not loaded image in the software." );
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+        return;
+    }
+
+    else // Image is defined
+    {
+        // get landmarks
+        namespace ns = ::fwComEd::fieldHelper;
+        ns::MedicalImageHelpers::checkLandmarks(  pImage );
+        ::fwData::PointList::sptr landmarks =  pImage->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId);
+        SLM_ASSERT("landmarks not instanced", landmarks);
+
+        if( landmarks->getCRefPoints().empty() )
+        {
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Focus landmarks");
+            messageBox.setMessage( "Sorry, it is impossible to focus image landmarks. There are not defined landmarks for this selected image." );
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+        else
+        {
+            // Retrieve point names
+            std::vector< std::string > names;
+            std::map< std::string, ::fwData::Point::sptr > name2Point;
+
+            ::fwData::PointList::PointListContainer points = landmarks->getCRefPoints();
+            BOOST_FOREACH(::fwData::Point::sptr point, points)
+            {
+                std::string name =  point->getField< ::fwData::String >( ::fwComEd::Dictionary::m_labelId )->value();
+                OSLM_DEBUG( "Point name " << name );
+                names.push_back( name );
+                name2Point[name] = point;
+            }
+
+            // Propose to user to choose a landmark
+            ::fwGui::dialog::SelectorDialog::sptr selector = ::fwGui::dialog::SelectorDialog::New();
+            selector->setTitle("Select a landmark");
+            selector->setSelections(names);
+            std::string selection = selector->show();
+            if( ! selection.empty() )
+            {
+                ::fwData::Point::sptr selectedPoint = name2Point[ selection ];
+                SLM_ASSERT("selectedPoint not instanced", selectedPoint);
+                ::fwData::Integer::sptr paramA = ::fwData::Integer::New();
+                paramA->value() = static_cast<int>((selectedPoint->getRefCoord()[2] - pImage->getOrigin()[2] )/  pImage->getSpacing()[2] +0.5);
+                ::fwData::Integer::sptr paramF = ::fwData::Integer::New();
+                paramF->value() = static_cast<int>((selectedPoint->getRefCoord()[1] -  pImage->getOrigin()[1])/  pImage->getSpacing()[1] +0.5);
+                ::fwData::Integer::sptr paramS = ::fwData::Integer::New();
+                paramS->value() = static_cast<int>((selectedPoint->getRefCoord()[0] -  pImage->getOrigin()[0])/  pImage->getSpacing()[0] +0.5);
+                if( paramS->value() >= 0 &&
+                        paramF->value() >= 0 &&
+                        paramA->value() >= 0 &&
+                        pImage->getSize()[0] > paramS->value() &&
+                        pImage->getSize()[1] > paramF->value() &&
+                        pImage->getSize()[2] > paramA->value() )
+                {
+                    pImage->setField( ::fwComEd::Dictionary::m_axialSliceIndexId, paramA );
+                    pImage->setField( ::fwComEd::Dictionary::m_frontalSliceIndexId, paramF );
+                    pImage->setField( ::fwComEd::Dictionary::m_sagittalSliceIndexId, paramS );
+
+                    // notify
+                    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+                    msg->setSliceIndex( paramA, paramF, paramS );
+                    ::fwServices::IEditionService::notify(this->getSptr(), pImage, msg);
+                }
+                else
+                {
+                    ::fwGui::dialog::MessageDialog::showMessageDialog("Focus landmarks",
+                            "Sorry, it is impossible to focus image landmarks: landmark outside image.",
+                            ::fwGui::dialog::IMessageDialog::WARNING);
+                }
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/LoadLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/LoadLandmark.cpp
new file mode 100644
index 0000000..f44b66f
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/LoadLandmark.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <exception>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include "uiMeasurement/action/LoadLandmark.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::LoadLandmark , ::fwData::Image) ;
+
+
+//------------------------------------------------------------------------------
+
+
+LoadLandmark::LoadLandmark( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+LoadLandmark::~LoadLandmark() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for load landmarks" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image =  this->getObject< ::fwData::Image >();
+    if (!::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Load landmarks",
+                "Sorry, it is impossible to load image landmarks. There is not loaded image in the software.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        return;
+    }
+    static ::boost::filesystem::path _sDefaultPath("");
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a file to load landmarks");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Landmark file","*.json");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::READ);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+
+    if( result )
+    {
+        ::boost::filesystem::path path = result->getPath();
+        _sDefaultPath = path.parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+
+        this->load(path);
+
+        // notify
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->addEvent( ::fwComEd::ImageMsg::LANDMARK );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void LoadLandmark::load(const ::boost::filesystem::path& path)
+{
+    ::fwData::Image::sptr image =  this->getObject< ::fwData::Image >();
+
+    //get landmarks
+    ::fwComEd::fieldHelper::MedicalImageHelpers::checkLandmarks(  image );
+    ::fwData::PointList::sptr landmarks =  image->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId);
+    SLM_ASSERT("landmarks not instanced", landmarks);
+
+    ::fwData::PointList::sptr newLandmarks = ::fwData::PointList::New();
+    ::fwData::Composite::sptr replaceMap = ::fwData::Composite::New();
+    (*replaceMap)["GENERIC_UID"] = ::fwData::String::New(
+            ::fwServices::registry::AppConfig::getUniqueIdentifier("LoadLandmarkApp")
+    );
+    (*replaceMap)["landmark"] = ::fwData::String::New(newLandmarks->getID());
+    (*replaceMap)["file"] = ::fwData::String::New(path.string());
+    ::fwRuntime::ConfigurationElement::csptr config =
+        ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig("LoadLandmark", replaceMap);
+
+    ::fwServices::AppConfigManager::sptr helper = ::fwServices::AppConfigManager::New();
+    helper->setConfig( config );
+    helper->launch();
+    helper->stopAndDestroy();
+
+    BOOST_FOREACH(::fwData::Point::sptr landmark, newLandmarks->getCRefPoints())
+    {
+        landmarks->getRefPoints().push_back( landmark );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveDistance.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveDistance.cpp
new file mode 100644
index 0000000..dbefb06
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveDistance.cpp
@@ -0,0 +1,205 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+#include <exception>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Vector.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwGui/dialog/SelectorDialog.hpp>
+
+#include "uiMeasurement/action/RemoveDistance.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::RemoveDistance , ::fwData::Image ) ;
+
+//------------------------------------------------------------------------------
+
+RemoveDistance::RemoveDistance( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+RemoveDistance::~RemoveDistance() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::info(std::ostream &_sstream )
+{
+    _sstream << "Action for remove distance" << std::endl;
+}
+//------------------------------------------------------------------------------
+
+std::string distanceToStr(double dist)
+{
+    std::stringstream ss;
+    ss.precision(3);
+    ss << dist << " mm";
+    return ss.str();
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::PointList::sptr  getDistanceToRemove(::fwData::Image::sptr image, bool &removeAll)
+{
+    ::fwData::PointList::sptr distToRemove;
+    removeAll = false;
+    ::fwData::Vector::sptr vectDist;
+    vectDist = image->getField< ::fwData::Vector >(::fwComEd::Dictionary::m_imageDistancesId);
+
+    if(vectDist)
+    {
+        std::vector< std::string > selections;
+        selections.push_back("ALL");
+        std::map< std::string , ::fwData::PointList::sptr > correspondance;
+
+        BOOST_FOREACH(::fwData::Object::sptr obj, *vectDist)
+        {
+            ::fwData::PointList::sptr pl = ::fwData::PointList::dynamicCast(obj);
+
+            if ( pl->getPoints().size()!=2 ) { continue; } // we skip no paired pointList
+            ::fwData::Point::sptr pt1 =  pl->getPoints().front();
+            ::fwData::Point::sptr pt2 =  pl->getPoints().back();
+
+            double dist=0;
+            double delta = pt1->getCRefCoord()[0] - pt2->getCRefCoord()[0];
+            dist += delta*delta;
+            delta = pt1->getCRefCoord()[1] - pt2->getCRefCoord()[1];
+            dist += delta*delta;
+            delta = pt1->getCRefCoord()[2] - pt2->getCRefCoord()[2];
+            dist += delta*delta;
+            dist = sqrt(dist);
+
+            selections.push_back( distanceToStr(dist) );
+            correspondance[ selections.back() ] = pl;
+        }
+
+        if ( !selections.empty() )
+        {
+            ::fwGui::dialog::SelectorDialog::sptr selector = ::fwGui::dialog::SelectorDialog::New();
+            selector->setTitle("Select a distance to remove");
+            selector->setSelections(selections);
+            std::string selection = selector->show();
+            if( ! selection.empty() )
+            {
+                if (selection=="ALL")
+                {
+                    removeAll=true;
+                }
+                else
+                {
+                    removeAll=false;
+                    distToRemove = correspondance[selection];
+                }
+            }
+        }
+    }
+    return distToRemove;
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::notifyDeleteDistance(::fwData::Image::sptr image, ::fwData::Object::sptr distance)
+{
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::DELETE_DISTANCE, distance );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::notifyNewDistance(::fwData::Image::sptr image, ::fwData::Object::sptr backup)
+{
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::DISTANCE, backup );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::updating( ) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::Vector::sptr vectDist;
+    vectDist = image->getField< ::fwData::Vector >(::fwComEd::Dictionary::m_imageDistancesId);
+
+    if (::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image)
+        && vectDist)
+    {
+        bool requestAll;
+        ::fwData::PointList::sptr distToRemove = getDistanceToRemove(image, requestAll );
+
+        // perform action only available distance
+        if ( distToRemove )
+        {
+            SLM_ASSERT("No Field ImageDistancesId",vectDist);
+            ::fwData::Vector::IteratorType newEnd = std::remove(vectDist->begin(), vectDist->end(), distToRemove);
+            vectDist->getContainer().erase(newEnd, vectDist->end());
+
+            this->notifyDeleteDistance(image, distToRemove);
+        }
+        if ( requestAll )
+        {
+            // backup
+            ::fwData::Object::sptr backupDistance = image->getField( ::fwComEd::Dictionary::m_imageDistancesId );
+
+            image->removeField( ::fwComEd::Dictionary::m_imageDistancesId );
+            this->notifyNewDistance(image, backupDistance);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void RemoveDistance::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveLandmark.cpp
new file mode 100644
index 0000000..c26b37e
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/RemoveLandmark.cpp
@@ -0,0 +1,177 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+#include <boost/lexical_cast.hpp>
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Vector.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwGui/dialog/SelectorDialog.hpp>
+
+#include "uiMeasurement/action/RemoveLandmark.hpp"
+
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::RemoveLandmark , ::fwData::Image ) ;
+
+
+//------------------------------------------------------------------------------
+
+
+RemoveLandmark::RemoveLandmark( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+RemoveLandmark::~RemoveLandmark() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for remove landmark" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Point::sptr  RemoveLandmark::getLandmarkToRemove(::fwData::Image::sptr image, bool &removeAll)
+{
+    ::fwData::Point::sptr landmarkToRemove;
+    removeAll = false;
+
+    ::fwData::PointList::sptr landmarksBackup = image->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId );
+    SLM_ASSERT("No Field ImageLandmarks", landmarksBackup);
+
+    std::vector< std::string > selections;
+    selections.push_back("ALL");
+    std::map< std::string , ::fwData::Point::sptr > correspondance;
+
+    BOOST_FOREACH(::fwData::Point::sptr landmark, landmarksBackup->getRefPoints())
+    {
+        ::fwData::String::sptr name = landmark->getField< ::fwData::String >(::fwComEd::Dictionary::m_labelId);
+        SLM_ASSERT("No Field LabelId", name);
+        selections.push_back( *name );
+        correspondance[ *name ] = landmark;
+    }
+
+    ::fwGui::dialog::SelectorDialog::sptr selector = ::fwGui::dialog::SelectorDialog::New();
+    selector->setTitle("Select a landmark to remove");
+    selector->setSelections(selections);
+    std::string selection = selector->show();
+    if( ! selection.empty() )
+    {
+        if (selection=="ALL")
+        {
+            removeAll=true;
+        }
+        else
+        {
+            removeAll=false;
+            landmarkToRemove = correspondance[selection];
+        }
+    }
+
+    return landmarkToRemove;
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::notify( ::fwData::Image::sptr image , ::fwData::Object::sptr backup)
+{
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::LANDMARK, backup );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::updating( ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwData::PointList::sptr landmarks = image->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId );
+
+    if (::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image) && landmarks)
+    {
+        if (!landmarks->getRefPoints().empty())
+        {
+            bool requestAll;
+            ::fwData::Point::sptr landmarkToRemove = this->getLandmarkToRemove(image, requestAll );
+
+            // perform action only available distance
+            if ( landmarkToRemove )
+            {
+
+                ::fwData::PointList::PointListContainer::iterator itr;
+                itr = std::find( landmarks->getRefPoints().begin(), landmarks->getRefPoints().end(), landmarkToRemove );
+                if (itr != landmarks->getRefPoints().end())
+                {
+                    landmarks->getRefPoints().erase(itr);
+                    this->notify(image, landmarkToRemove);
+                }
+            }
+            if ( requestAll )
+            {
+                // backup
+                image->removeField( ::fwComEd::Dictionary::m_imageLandmarksId ); // erase field
+                this->notify(image, landmarks);
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void RemoveLandmark::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SAddLabeledPoint.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SAddLabeledPoint.cpp
new file mode 100644
index 0000000..8c92873
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SAddLabeledPoint.cpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/PointListMsg.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/InputDialog.hpp>
+
+#include "uiMeasurement/action/SAddLabeledPoint.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::SAddLabeledPoint , ::fwData::PointList ) ;
+
+
+//------------------------------------------------------------------------------
+
+
+SAddLabeledPoint::SAddLabeledPoint( ) throw()
+         : m_count(1)
+{}
+
+//------------------------------------------------------------------------------
+
+SAddLabeledPoint::~SAddLabeledPoint() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::info(std::ostream &_sstream )
+{
+    _sstream << "Action for remove distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+// return true if label setting is NOT Canceled , name is modified !!!
+bool SAddLabeledPoint::defineLabel(std::string &name)
+{
+    bool res = false;
+    name = "Label" + ::boost::lexical_cast< std::string >(m_count);
+
+    ::fwData::String::sptr url = ::fwData::String::New();
+    ::fwGui::dialog::InputDialog inputDlg;
+    inputDlg.setTitle("Label");
+    inputDlg.setMessage("Which label for the point?");
+    inputDlg.setInput (name);
+    std::string inputText = inputDlg.getInput();
+
+    if(!inputText.empty())
+    {
+        name = inputText;
+        m_count++;
+        res = true;
+    }
+    return res ;
+}
+
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::PointList::sptr landmarks = this->getObject< ::fwData::PointList >();
+    SLM_ASSERT("landmarks not instanced", landmarks);
+
+    std::string value;
+    if ( this->defineLabel(value) )
+    {
+        // create a new point
+        ::fwData::Point::sptr newPoint = ::fwData::Point::New();
+
+        // append to landmark
+        landmarks->getRefPoints().push_back( newPoint );
+
+        // append to point the label
+        ::fwData::String::sptr label = ::fwData::String::New();
+        label->value() = value;
+        newPoint->setField( ::fwComEd::Dictionary::m_labelId , label );
+
+        // notify
+        ::fwComEd::PointListMsg::sptr msgPointList = ::fwComEd::PointListMsg::New();
+        msgPointList->addEvent( ::fwComEd::PointListMsg::ELEMENT_ADDED, newPoint );
+        ::fwServices::IEditionService::notify( this->getSptr(), landmarks, msgPointList);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SAddLabeledPoint::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SaveLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SaveLandmark.cpp
new file mode 100644
index 0000000..c452d79
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/SaveLandmark.cpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <exception>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+#include <fwGui/dialog/SelectorDialog.hpp>
+
+#include "uiMeasurement/action/SaveLandmark.hpp"
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::SaveLandmark , ::fwData::Image) ;
+
+
+//------------------------------------------------------------------------------
+
+
+SaveLandmark::SaveLandmark( ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+SaveLandmark::~SaveLandmark() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for save landmarks" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image =  this->getObject< ::fwData::Image >();
+    if (!::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        ::fwGui::dialog::MessageDialog::showMessageDialog(
+                "Save landmarks",
+                "Sorry, it is impossible to save image landmarks. There is not loaded image in the software.",
+                ::fwGui::dialog::IMessageDialog::WARNING);
+        return;
+    }
+    static ::boost::filesystem::path _sDefaultPath("");
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Choose a file to save landmarks");
+    dialogFile.setDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+    dialogFile.addFilter("Landmark file","*.json");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+
+    if( result )
+    {
+        ::boost::filesystem::path path = result->getPath();
+        _sDefaultPath = path.parent_path();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(_sDefaultPath) );
+
+       this->save(path);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw (::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SaveLandmark::save(const ::boost::filesystem::path& path)
+{
+    ::fwData::Image::sptr image =  this->getObject< ::fwData::Image >();
+
+    //get landmarks
+    ::fwComEd::fieldHelper::MedicalImageHelpers::checkLandmarks(  image );
+    ::fwData::PointList::sptr landmarks =  image->getField< ::fwData::PointList >( ::fwComEd::Dictionary::m_imageLandmarksId);
+    SLM_ASSERT("landmarks not instanced", landmarks);
+
+    ::fwData::Composite::sptr replaceMap = ::fwData::Composite::New();
+    (*replaceMap)["GENERIC_UID"] = ::fwData::String::New(
+            ::fwServices::registry::AppConfig::getUniqueIdentifier("SaveLandmarkApp")
+    );
+    (*replaceMap)["landmark"] = ::fwData::String::New(landmarks->getID());
+    (*replaceMap)["file"] = ::fwData::String::New(path.string());
+    ::fwRuntime::ConfigurationElement::csptr config =
+        ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig("SaveLandmark", replaceMap);
+
+    ::fwServices::AppConfigManager::sptr helper = ::fwServices::AppConfigManager::New();
+    helper->setConfig( config );
+    helper->launch();
+
+    helper->stopAndDestroy();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowDistance.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowDistance.cpp
new file mode 100644
index 0000000..e4642f5
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowDistance.cpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include "uiMeasurement/action/ShowDistance.hpp"
+
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::ShowDistance , ::fwData::Image ) ;
+
+
+//------------------------------------------------------------------------------
+
+ShowDistance::ShowDistance( ) throw()
+{
+    //addNewHandledEvent( ::fwComEd::ImageMsg::DISTANCE );
+}
+
+//------------------------------------------------------------------------------
+
+ShowDistance::~ShowDistance() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::info(std::ostream &_sstream )
+{
+    _sstream << "Action for show distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    if ( !::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image) )
+    {
+        this->::fwGui::IActionSrv::setIsActive(false);
+    }
+    else
+    {
+        ::fwData::Boolean::sptr showDistances = image->getField< ::fwData::Boolean >("ShowDistances", ::fwData::Boolean::New(true));
+        bool isShown = showDistances->value();
+
+        bool toShow = !isShown;
+        image->setField("ShowDistances", ::fwData::Boolean::New(toShow));
+
+        // auto manage hide/show : use Field Information instead let gui manage checking
+        this->::fwGui::IActionSrv::setIsActive(!toShow);
+
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->addEvent( ::fwComEd::ImageMsg::DISTANCE );
+        ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::swapping() throw(::fwTools::Failed)
+{
+    ::fwData::Image::csptr img = this->getObject< ::fwData::Image >();
+    ::fwData::Boolean::sptr showDistances = img->getField< ::fwData::Boolean >("ShowDistances", ::fwData::Boolean::New(true));
+
+    this->::fwGui::IActionSrv::setIsActive( !(showDistances->value()) );
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::ImageMsg::csptr imgMsg =  ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::DISTANCE ) )
+    {
+        ::fwData::Image::csptr img = this->getObject< ::fwData::Image >();
+        ::fwData::Boolean::sptr showDistances = img->getField< ::fwData::Boolean >("ShowDistances", ::fwData::Boolean::New(true));
+
+        this->::fwGui::IActionSrv::setIsActive( !(showDistances->value()) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowDistance::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowLandmark.cpp b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowLandmark.cpp
new file mode 100644
index 0000000..ce96584
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurement/src/uiMeasurement/action/ShowLandmark.cpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <exception>
+
+#include <fwData/Boolean.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+
+#include "uiMeasurement/action/ShowLandmark.hpp"
+
+
+namespace uiMeasurement
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMeasurement::action::ShowLandmark , ::fwData::Image) ;
+
+
+//------------------------------------------------------------------------------
+
+ShowLandmark::ShowLandmark( ) throw()
+{
+    //addNewHandledEvent( ::fwComEd::ImageMsg::LANDMARK );
+}
+
+//------------------------------------------------------------------------------
+
+ShowLandmark::~ShowLandmark() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::info(std::ostream &_sstream )
+{
+    _sstream << "Action for show distance" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    if (   !::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image) ||
+            ! image->getField( ::fwComEd::Dictionary::m_imageLandmarksId ))
+    {
+        this->::fwGui::IActionSrv::setIsActive(false);
+        return;
+    }
+
+    ::fwData::Boolean::sptr showLandmarks = image->getField< ::fwData::Boolean >("ShowLandmarks", ::fwData::Boolean::New(true));
+    bool isShown = showLandmarks->value();
+
+    bool toShow = !isShown;
+    image->setField("ShowLandmarks",  ::fwData::Boolean::New(toShow));
+
+    std::vector< ::fwServices::IService::sptr > services = ::fwServices::OSR::getServices < ::fwServices::IService > (image);
+
+    this->::fwGui::IActionSrv::setIsActive(isShown);
+
+    // notify
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::LANDMARK );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::swapping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::csptr img = this->getObject< ::fwData::Image >();
+    ::fwData::Boolean::sptr showLandmarks = img->getField< ::fwData::Boolean >("ShowLandmarks", ::fwData::Boolean::New(true));
+
+    // set check correctly
+    this->::fwGui::IActionSrv::setIsActive( !(showLandmarks->value()) );
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::receiving(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwComEd::ImageMsg::csptr imgMsg =  ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::LANDMARK ) )
+    {
+        this->swapping();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::configuring() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::starting() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ShowLandmark::stopping() throw (::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace action
+} // namespace uiMeasurement
diff --git a/Bundles/LeafUI/uiMeasurementQt/CMakeLists.txt b/Bundles/LeafUI/uiMeasurementQt/CMakeLists.txt
new file mode 100644
index 0000000..937fb7a
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/CMakeLists.txt
@@ -0,0 +1,23 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+    fwTools
+
+    gui
+)
+
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiMeasurementQt/COPYING b/Bundles/LeafUI/uiMeasurementQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiMeasurementQt/COPYING.LESSER b/Bundles/LeafUI/uiMeasurementQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiMeasurementQt/Properties.cmake b/Bundles/LeafUI/uiMeasurementQt/Properties.cmake
new file mode 100644
index 0000000..48e0184
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiMeasurementQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGuiQt fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiMeasurementQt/bin/build.options b/Bundles/LeafUI/uiMeasurementQt/bin/build.options
new file mode 100644
index 0000000..5c9d5c6
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/bin/build.options
@@ -0,0 +1,15 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwDataIO_0-2',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          ]
+USE     = ['boost','qtCore']
+BUNDLES = ['gui_0-1',]
diff --git a/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/Plugin.hpp b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/Plugin.hpp
new file mode 100644
index 0000000..1c5be34
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/Plugin.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENTQT_PLUGIN_HPP_
+#define _UIMEASUREMENTQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiMeasurementQt
+{
+
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiMeasurementQt
+
+#endif //_UIMEASUREMENTQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/config.hpp b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/config.hpp
new file mode 100644
index 0000000..3f7c65a
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENTQT_CONFIG_HPP_
+#define _UIMEASUREMENTQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIMEASUREMENTQT_EXPORTS
+    #define UIMEASUREMENTQT_API __declspec(dllexport)
+    #else
+    #define UIMEASUREMENTQT_API __declspec(dllimport)
+    #endif
+
+    #define UIMEASUREMENTQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIMEASUREMENTQT_EXPORTS
+    #define UIMEASUREMENTQT_API __attribute__ ((visibility("default")))
+    #define UIMEASUREMENTQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIMEASUREMENTQT_API __attribute__ ((visibility("hidden")))
+    #define UIMEASUREMENTQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIMEASUREMENTQT_API
+    #define UIMEASUREMENTQT_CLASS_API
+
+#endif
+
+#endif //_UIMEASUREMENTQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Distance.hpp b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Distance.hpp
new file mode 100644
index 0000000..8f0e1b8
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Distance.hpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENTQT_DISTANCE_EDITOR_HPP_
+#define _UIMEASUREMENTQT_DISTANCE_EDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+#include <QPushButton>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiMeasurementQt/config.hpp"
+
+namespace uiMeasurement
+{
+namespace editor
+{
+/**
+ * @brief   Distance service is represented by a button. It allows to show distances in a generic scene.
+ * @class   Distance
+ * 
+ * @date    2010.
+ */
+class UIMEASUREMENTQT_CLASS_API Distance : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (Distance)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIMEASUREMENTQT_API Distance() throw() ;
+
+    /// Destructor. Do nothing.
+    UIMEASUREMENTQT_API virtual ~Distance() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Install the layout.
+     *
+     * This method launches the IEditor::starting method.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     *
+     * This method launches the IEditor::stopping method.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+    <service uid="distanceEditor" type="::gui::editor::IEditor" impl="::uiMeasurement::editor::Distance" autoConnect="no">
+        <placeInScene uid="genericScene" />
+    </service>
+     @endverbatim
+     \b genericScene is the uid of the ::fwRenderVTK::VtkRenderService representing the generic scene which will be printed.
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /**
+     * @brief Notify the scene that a distance is added.
+     */
+    void onDistanceButton();
+
+private:
+
+    std::string m_scenesUID;
+    QPointer< QPushButton > m_distButton;
+
+
+
+};
+} // namespace editor
+} // uiMeasurement
+
+#endif /*_UIMEASUREMENTQT_DISTANCE_EDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Namespace.hpp b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Namespace.hpp
new file mode 100644
index 0000000..f91e860
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/include/uiMeasurementQt/editor/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEASUREMENTQT_EDITOR_NAMESPACE_HPP_
+#define _UIMEASUREMENTQT_EDITOR_NAMESPACE_HPP_
+
+
+namespace uiMeasurement
+{
+/**
+ * @brief       The namespace uiMeasurement::editor contains editors to add distances
+ * @namespace   uiMeasurement::editor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace editor
+{
+
+}
+}
+#endif /* _UIMEASUREMENTQT_EDITOR_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiMeasurementQt/rc/plugin.xml b/Bundles/LeafUI/uiMeasurementQt/rc/plugin.xml
new file mode 100644
index 0000000..7fffb26
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/rc/plugin.xml
@@ -0,0 +1,14 @@
+<plugin id="uiMeasurementQt" class="::uiMeasurementQt::Plugin">
+    <library name="uiMeasurementQt"/>
+    
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+    <requirement id="io"/>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiMeasurement::editor::Distance</service>
+        <object>::fwData::Image</object>
+    </extension>
+</plugin>
diff --git a/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/Plugin.cpp b/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/Plugin.cpp
new file mode 100755
index 0000000..38de632
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "uiMeasurementQt/Plugin.hpp"
+
+namespace uiMeasurementQt
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiMeasurementQt::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiMeasurementQt
diff --git a/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/editor/Distance.cpp b/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/editor/Distance.cpp
new file mode 100644
index 0000000..075c7ba
--- /dev/null
+++ b/Bundles/LeafUI/uiMeasurementQt/src/uiMeasurementQt/editor/Distance.cpp
@@ -0,0 +1,152 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QVBoxLayout>
+#include <QIcon>
+
+#include <fwCore/base.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiMeasurementQt/editor/Distance.hpp"
+
+
+namespace uiMeasurement
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiMeasurement::editor::Distance , ::fwData::Image ) ;
+
+
+Distance::Distance() throw()
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+Distance::~Distance() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Distance::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    namespace fs = ::boost::filesystem;
+    fs::path pathImageDist (std::string(LIBSFW4SPL)+"Bundles/media_0-1/distance.png"); //ever in a commit
+    OSLM_ASSERT("Image "<< pathImageDist << "is missing", fs::exists(pathImageDist));
+
+    QIcon imageDist(QString::fromStdString(pathImageDist.string()));
+
+    m_distButton = new QPushButton( imageDist, tr(""), container) ;
+    m_distButton->setToolTip(tr("Distance"));
+
+    QVBoxLayout* layout  = new QVBoxLayout();
+    layout->addWidget( m_distButton, 1 );
+    layout->setContentsMargins(0, 0, 0, 0);
+    QObject::connect(m_distButton, SIGNAL(clicked()), this, SLOT(onDistanceButton()));
+
+    container->setLayout( layout );
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_distButton, SIGNAL(clicked()), this, SLOT(onDistanceButton()));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+
+    std::vector < Configuration > placeInSceneConfig = m_configuration->find("placeInScene");
+    if(!placeInSceneConfig.empty())
+    {
+        SLM_ASSERT("UID attribute is missing", placeInSceneConfig.at(0)->hasAttribute("uid"));
+        m_scenesUID = placeInSceneConfig.at(0)->getAttributeValue("uid");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void Distance::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::onDistanceButton()
+{
+    SLM_ASSERT("No scene UID!", !m_scenesUID.empty());
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    // force distance to be shown
+    image->setField("ShowDistances",  ::fwData::Boolean::New(true));
+
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->addEvent( ::fwComEd::ImageMsg::NEW_DISTANCE, ::fwData::String::New(m_scenesUID) );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//------------------------------------------------------------------------------
+} // namespace editor
+} // namespace uiMeasurement
+
diff --git a/Bundles/LeafUI/uiMedDataQt/CMakeLists.txt b/Bundles/LeafUI/uiMedDataQt/CMakeLists.txt
new file mode 100644
index 0000000..0a1ccbb
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/CMakeLists.txt
@@ -0,0 +1,35 @@
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwData
+    fwGui
+    fwMedData
+    fwRuntime
+    fwServices
+    fwTools
+
+    gui
+)
+
+fwReq(
+    visuVTKAdaptor
+    uiImageQt
+    ctrlSelection
+    )
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+
+fwLink(
+    ${QT_LIBRARIES}
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiMedDataQt/COPYING b/Bundles/LeafUI/uiMedDataQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiMedDataQt/COPYING.LESSER b/Bundles/LeafUI/uiMedDataQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiMedDataQt/Properties.cmake b/Bundles/LeafUI/uiMedDataQt/Properties.cmake
new file mode 100644
index 0000000..e110795
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/Properties.cmake
@@ -0,0 +1,25 @@
+
+set( NAME uiMedDataQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES
+    fwMedDataTools
+    fwActivities
+    fwComEd
+    fwCore
+    fwData
+    fwDataCamp
+    fwGui
+    fwGuiQt
+    fwMedData
+    fwRuntime
+    fwServices
+    fwTools
+    gui
+    )
+set( REQUIREMENTS
+    visuVTKAdaptor
+    uiImageQt
+    ctrlSelection
+    )
+
diff --git a/Bundles/LeafUI/uiMedDataQt/bin/build.options b/Bundles/LeafUI/uiMedDataQt/bin/build.options
new file mode 100644
index 0000000..21865bf
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          'fwMedData_0-1',
+          'fwActivities_0-1',
+          'fwDataCamp_0-1',
+          'fwMedDataTools_0-1',
+          ]
+USE     = ['boost','qtCore']
+BUNDLES = ['gui_0-1']
+REQUIREMENTS = [
+               'visuVTKAdaptor_0-1',
+               'ctrlSelection_0-1',
+               ]
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/InsertSeries.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/InsertSeries.hpp
new file mode 100644
index 0000000..208dde4
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/InsertSeries.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_INSERTSERIES_HPP__
+#define __UIMEDDATAQT_INSERTSERIES_HPP__
+
+#include <fwData/Object.hpp>
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include <fwMedData/Series.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+namespace uiMedData
+{
+
+/**
+ * @class InsertSeries
+ * Used as a placeholder in ::uiMedData::editor::SSelector UI to insert create and insert new series in a series DB.
+ */
+class UIMEDDATAQT_CLASS_API InsertSeries : public ::fwMedData::Series
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (InsertSeries)(::fwData::Object), (()), ::fwData::factory::New< InsertSeries >) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    UIMEDDATAQT_API InsertSeries(::fwData::Object::Key key);
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~InsertSeries();
+
+    /// Defines shallow copy
+    UIMEDDATAQT_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    UIMEDDATAQT_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+};
+
+}   //end namespace uiMedData
+
+#endif // __UIMEDDATAQT_INSERTSERIES_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/Plugin.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/Plugin.hpp
new file mode 100644
index 0000000..54f0c01
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/Plugin.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_PLUGIN_HPP__
+#define __UIMEDDATAQT_PLUGIN_HPP__
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiMedDataQt
+{
+
+/**
+ * 
+ * @date    2009-2013.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiMedDataQt
+
+#endif //__UIMEDDATAQT_PLUGIN_HPP__
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/SSeriesViewer.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/SSeriesViewer.hpp
new file mode 100644
index 0000000..df4f09a
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/SSeriesViewer.hpp
@@ -0,0 +1,119 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEDDATAQT_SSERIESVIEWER_HPP_
+#define _UIMEDDATAQT_SSERIESVIEWER_HPP_
+
+#include <map>
+
+#include <fwServices/IController.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+namespace uiMedData
+{
+/**
+ * @brief  This Service allows to preview the selected series in the Vector. For the moment, it works only on a
+ * single selection.
+ * @class   SSeriesViewer
+ * 
+ * @date    2013.
+ */
+class UIMEDDATAQT_CLASS_API SSeriesViewer : public ::fwServices::IController
+{
+
+    public :
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesViewer)(::fwServices::IController) ) ;
+
+    /// Constructor
+    UIMEDDATAQT_API SSeriesViewer();
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~SSeriesViewer() throw() ;
+
+protected:
+
+    /// Calls updating on starting.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops the config if it is running.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configures the service.
+     * @verbatim
+    <service uid="seriesViewer" type="::fwServices::IController" impl="::uiMedData::SSeriesViewer" autoConnect="yes">
+        <parentView>preview</parentView>
+        <configs>
+            <config id="2DSimpleConfig" type="::fwMedData::ImageSeries">
+                <extract path="@image" pattern="imageID" />
+            </config>
+            <config id="2DPacsPreviewConfig" type="::fwDicomData::DicomSeries" >
+                <parameter replace="PACS_CONFIGURATION" by="None" />
+            </config>
+            <config id="3DSimpleConfig" type="::fwMedData::ModelSeries" />
+        </configs>
+    </service>
+     @endverbatim
+     * - \b parentView : wid of the view where the config will install its windows.
+     * - \b config : gives the available association between data type and associated config.
+     *   - \b id : identifier of the AppConfig to launch
+     *   - \b type : classname of the object stored in Vector associated to this config.
+     *   - \b parameter : allow to pass specific value to the associ config 
+     *     - \b replace : name of the parameter to be replaced
+     *     - \b by : specific value to replace for the parameter
+     * - \b extract : extracts the object from the path and replaces pattern with its fwID
+     */
+    virtual void configuring() throw (::fwTools::Failed);
+
+    /**
+     * @brief Launch the config on the object if possible.
+     *
+     * If there is a single selection : it launchs an AppConfig on the object defined in this service configuration
+     * (stored in m_seriesConfigs). The selected object fwID replaces the 'objectID' parameter in the AppConfig.
+     * no configuration are launched if there is no selection, a multiple selection or if there is no configuration
+     * associated with the selected object.
+     */
+    virtual void updating() throw (::fwTools::Failed);
+
+    /// Listen Vector notification when objects are added or deleted.
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream );
+
+private:
+
+    typedef std::map<std::string, std::string> ReplaceValuesMapType;
+
+    /// Stucture to register configuration informations.
+    struct SeriesConfigInfo
+    {
+        /// Id of the configuration to launch.
+        std::string configId;
+
+        /// Stores the pattern to replace in the config by the fwID of the object given by a path.
+        ReplaceValuesMapType extractValues;
+
+        /// Stores the parameters to pass to config.
+        ReplaceValuesMapType parameters;
+    };
+
+    typedef std::map<std::string, SeriesConfigInfo> SeriesConfigMapType;
+
+    /// Config manager
+    ::fwServices::AppConfigManager::sptr m_configTemplateManager;
+
+    /// Stores the wid of the view where the config will install its windows.
+    std::string m_parentView;
+
+    /// Stores the association between data type and associated configuration.
+    SeriesConfigMapType m_seriesConfigs;
+};
+} // namespace uiMedData
+
+#endif // _UIMEDDATAQT_SSERIESVIEWER_HPP_
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SExportSeries.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SExportSeries.hpp
new file mode 100644
index 0000000..0c06445
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SExportSeries.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_ACTION_SEXPORTSERIES_HPP__
+#define __UIMEDDATAQT_ACTION_SEXPORTSERIES_HPP__
+
+#include <fwMedData/Series.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+
+namespace uiMedData
+{
+namespace action
+{
+/**
+ * @brief   This action allows to export the series specified in config to the SeriesDB.
+ * @class   SExportSeries
+ * 
+ * @date    2013.
+ * @note This action is not executable if the series already exists in the SeriesDB.
+ */
+class UIMEDDATAQT_CLASS_API SExportSeries : public ::fwGui::IActionSrv
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SExportSeries)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor
+    UIMEDDATAQT_API SExportSeries();
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~SExportSeries() throw() ;
+
+protected:
+
+    /// Starts service. If series associated with m_seriesId exists in SeriesDB, this action is not executable.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops service. Does nothing.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     *
+     * @verbatim
+     <service uid="selector" impl="::uiMedData::action::SExportSeries" type="::fwGui::IActionSrv" autoConnect="yes">
+        <seriesId>activitySeries</seriesId>
+     </service>
+     @endverbatim
+     * - \b seriesId : defines the fwId of the series to export in the current SeriesDB.
+     */
+    virtual void configuring() throw (::fwTools::Failed);
+
+    /// Adds the series specified by m_seriesId in the SeriesDB.
+    virtual void updating() throw (::fwTools::Failed);
+
+    /**
+     * @brief Receive SeriesDBMsg to check if series specified by m_seriesId already exist in SeriesDB,
+     * thus set action not executable.
+     */
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream );
+
+private:
+
+    /// Returns current series given by its fwID m_seriesId.
+    ::fwMedData::Series::sptr getSeries();
+
+    /// fwID of the series to add in SeriesDB
+    std::string m_seriesId;
+};
+} // namespace action
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_ACTION_SEXPORTSERIES_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SInitNewSeries.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SInitNewSeries.hpp
new file mode 100644
index 0000000..616abbf
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/action/SInitNewSeries.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_ACTION_SINITNEWSERIES_HPP__
+#define __UIMEDDATAQT_ACTION_SINITNEWSERIES_HPP__
+
+#include <fwMedData/Series.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+
+namespace uiMedData
+{
+namespace action
+{
+/**
+ * @brief   This action allows to update ::uiMedData::editor::SSelector UI in order to add new series.
+ * @class   SInitNewSeries
+ * 
+ * @date    2014.
+ * @note The action adds an empty series in each patient/study group to select where the series must be added.
+ */
+class UIMEDDATAQT_CLASS_API SInitNewSeries : public ::fwGui::IActionSrv
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SInitNewSeries)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor
+    UIMEDDATAQT_API SInitNewSeries();
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~SInitNewSeries() throw() ;
+
+protected:
+
+    /// Starts service.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops service. Does nothing.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     *
+     * @verbatim
+     <service uid="initSeriesUid" impl="::uiMedData::action::SInitNewSeries" type="::fwGui::IActionSrv" autoConnect="yes">
+         <seriesDB>seriesDB_UID</seriesDB>
+         <institution>My great company</institution>
+     </service>
+     @endverbatim
+     * \b seriesDB : UID of series DB used to add new series for each patient/study group
+     * \b institution (not mandatory) : default value to be set for new series equipment's institution
+     */
+    virtual void configuring() throw (::fwTools::Failed);
+
+    /// Adds the fake series in series DB.
+    virtual void updating() throw (::fwTools::Failed);
+
+    /// Override
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream );
+
+private:
+
+    /// UID of referring seriesDB
+    std::string m_seriesDBId;
+
+    /// Default value for Dicom series attribute "Institution".
+    std::string m_defaultInstitution;
+};
+
+} // namespace action
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_ACTION_SINITNEWSERIES_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/config.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/config.hpp
new file mode 100644
index 0000000..6e91cfc
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEDDATAQT_CONFIG_HPP_
+#define _UIMEDDATAQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIMEDDATAQT_EXPORTS
+    #define UIMEDDATAQT_API __declspec(dllexport)
+    #else
+    #define UIMEDDATAQT_API __declspec(dllimport)
+    #endif
+
+    #define UIMEDDATAQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIMEDDATAQT_EXPORTS
+    #define UIMEDDATAQT_API __attribute__ ((visibility("default")))
+    #define UIMEDDATAQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIMEDDATAQT_API __attribute__ ((visibility("hidden")))
+    #define UIMEDDATAQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIMEDDATAQT_API
+    #define UIMEDDATAQT_CLASS_API
+
+#endif
+
+#endif //_UIMEDDATAQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/constants.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/constants.hpp
new file mode 100644
index 0000000..e5fa51f
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/constants.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDDATAQT_CONSTANTS_HPP__
+#define __UIMEDDDATAQT_CONSTANTS_HPP__
+
+#include <string>
+
+#include "uiMedDataQt/config.hpp"
+
+namespace uiMedData
+{
+
+    /// Placeholder text used to identify a new patient that must be initialized within the series selector widget.
+    static const std::string s_NEW_PATIENT_TEXT = "< New patient... >";
+
+    /// Placeholder text used to identify a new study that must be initialized within the series selector widget.
+    static const std::string s_NEW_STUDY_TEXT = "< New study... >";
+
+    /// Placeholder text used to identify a new series that must be initialized within the series selector widget.
+    static const std::string s_INSERT_NEW_SERIES_TEXT = "< Insert new series here... >";
+
+    /// Field name used to identify a ::fwMedData::Patient to be initialized.
+    static const std::string s_NEW_PATIENT_FIELD_NAME = "NEW_PATIENT";
+
+    /// Field name used to identify a ::fwMedData::Study to be initialized.
+    static const std::string s_NEW_STUDY_FIELD_NAME = "NEW_STUDY";
+
+} // namespace uiMedData
+
+#endif // __UIMEDDDATAQT_CONSTANTS_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SModelSeriesList.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SModelSeriesList.hpp
new file mode 100644
index 0000000..313d5ec
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SModelSeriesList.hpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEDDATAQT_EDITOR_SMODELSERIESLIST_HPP__
+#define _UIMEDDATAQT_EDITOR_SMODELSERIESLIST_HPP__
+
+#include <QPointer>
+#include <QObject>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QListWidget;
+class QCheckBox;
+class QListWidgetItem;
+
+namespace fwData
+{
+    class Reconstruction;
+}
+
+namespace fwServices
+{
+    class ObjectMsg;
+}
+
+namespace uiMedData
+{
+namespace editor
+{
+
+/**
+ * @brief   SModelSeriesList service.
+ * @class   SModelSeriesList
+ * @date    2013.
+ */
+class UIMEDDATAQT_CLASS_API SModelSeriesList :  public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SModelSeriesList)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIMEDDATAQT_API SModelSeriesList() throw() ;
+
+    /// Destructor. Do nothing.
+    UIMEDDATAQT_API virtual ~SModelSeriesList() throw() ;
+
+protected:
+
+    ///This method launches the IEditor::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IEditor::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Managment of observations ( overides )
+    virtual void receiving( SPTR(const ::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configures the editor.
+     *
+     * Configuration example :
+     @verbatim
+     <config enable_hide_all="true" />
+     @endverbatim
+     *
+     * \b enable_hide_all : if 'true', allows to hide all models through a single checkbox displayed in UI (default
+     * value is 'true', allowed values are 'true' and 'false').
+     *
+     * @throw fwTools::Failed
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+    typedef std::map< std::string, SPTR(::fwData::Reconstruction) > OrganNameReconstruction;
+
+    void updateReconstructions();
+
+protected Q_SLOTS:
+
+    /// Slot called when new current item is setted in m_organChoice
+    void onCurrentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous );
+
+    void onShowReconstructions(int state);
+
+    void onOrganChoiceVisibility(QListWidgetItem * item);
+
+private:
+
+    void refreshVisibility();
+    QPointer< QCheckBox > m_showCheckBox;
+    QPointer< QListWidget > m_organChoice;
+    OrganNameReconstruction m_map ;
+
+    bool m_enableHideAll;
+
+};
+
+} // namespace editor
+} // namespace uiMedData
+
+#endif /*_UIMEDDATAQT_EDITOR_SMODELSERIESLIST_HPP__*/
+
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SOrganTransformation.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SOrganTransformation.hpp
new file mode 100644
index 0000000..db14173
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SOrganTransformation.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEDDATAQT_EDITOR_SORGANTRANSFORMATION_HPP__
+#define _UIMEDDATAQT_EDITOR_SORGANTRANSFORMATION_HPP__
+
+#include <QPointer>
+#include <QObject>
+
+#include <map>
+#include <string>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+
+class QListWidget;
+class QPushButton;
+class QListWidgetItem;
+class QComboBox;
+
+namespace uiMedData
+{
+namespace editor
+{
+
+// SOrganTransformation
+class UIMEDDATAQT_CLASS_API SOrganTransformation : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public:
+
+    fwCoreServiceClassDefinitionsMacro( (SOrganTransformation)(::gui::editor::IEditor) );
+
+    UIMEDDATAQT_API              SOrganTransformation() throw();
+    UIMEDDATAQT_API virtual     ~SOrganTransformation() throw();
+
+protected:
+
+    UIMEDDATAQT_API virtual void configuring() throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void starting()    throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void stopping()    throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void swapping()    throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void updating()    throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void receiving( ::fwServices::ObjectMsg::csptr msg ) throw( ::fwTools::Failed );
+    UIMEDDATAQT_API virtual void info    ( ::std::ostream& stream );
+
+private Q_SLOTS:
+    void onReconstructionCheck(QListWidgetItem *currentItem);
+    void onResetClick();
+    void onSaveClick();
+    void onLoadClick();
+
+    //test
+    void onTestClick();
+
+private:
+
+    void refresh();
+    void notitfyTransformationMatrix(::fwData::TransformationMatrix3D::sptr aTransMat);
+
+    // ReconstructionMapType
+    typedef ::std::map< ::std::string, ::fwData::Reconstruction::sptr > ReconstructionMapType;
+    typedef ::std::map< ::std::string, ::fwData::TransformationMatrix3D::sptr> InnerMatMappingType;
+    typedef ::std::map< ::std::string, InnerMatMappingType> SaveMappingType;
+
+    ReconstructionMapType m_reconstructionMap;
+    ::std::string      m_TMSUid;
+    QPointer< QPushButton > m_saveButton;
+    QPointer< QPushButton > m_loadButton;
+    QPointer< QPushButton > m_resetButton;
+    QPointer< QListWidget > m_reconstructionListBox;
+    QPointer< QComboBox > m_saveSelectionComboBox;
+
+    //for testing
+    QPointer< QPushButton > m_testButton;
+
+    //variables for the functionalities of saving & loading
+    SaveMappingType m_saveListing;
+    unsigned int m_saveCount;
+};
+
+} // namespace editor
+} // namespace uiMedData
+
+
+#endif // _UIMEDDATAQT_EDITOR_SORGANTRANSFORMATION_HPP__
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSelector.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSelector.hpp
new file mode 100644
index 0000000..3699948
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSelector.hpp
@@ -0,0 +1,141 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIMEDDATAQT_EDITOR_SSELECTOR_HPP_
+#define _UIMEDDATAQT_EDITOR_SSELECTOR_HPP_
+
+#include <QAbstractItemView>
+#include <QPointer>
+#include <QObject>
+#include <QVector>
+
+#include <fwData/Vector.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiMedDataQt/config.hpp"
+#include "uiMedDataQt/widget/Selector.hpp"
+
+
+namespace uiMedData
+{
+namespace editor
+{
+/**
+ * @brief   This editor shows information about the medical data. It allows to manipulate
+ *          (select, erase, ...) studies and series.
+ * @class   SSelector
+ * 
+ * @date    2013.
+ */
+class UIMEDDATAQT_CLASS_API SSelector : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+    fwCoreServiceClassDefinitionsMacro ( (SSelector)(::gui::editor::IEditor) ) ;
+
+    /// Constructor
+    UIMEDDATAQT_API SSelector();
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~SSelector() throw() ;
+
+    typedef ::fwCom::Signal< void ( SPTR( ::fwMedData::Series ) ) > SeriesDoubleClickedSignalType;
+
+    /// Key in m_signals map of signal m_sigSeriesDoubleClicked
+    UIMEDDATAQT_API static const ::fwCom::Signals::SignalKeyType s_SERIES_DOUBLE_CLICKED_SIG;
+
+protected:
+
+    /// Installs GUI : create container and add selector.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Destroys GUI.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     *
+     * @verbatim
+     <service uid="selector" impl="::uiMedData::editor::SSelector" type="::gui::editor::IEditor" autoConnect="yes">
+        <selectionId>selections</selectionId>
+        <selectionMode>single|extended</selectionMode>
+        <allowedRemove>yes|no</allowedRemove>
+        <insertMode>yes|no</insertMode>
+     </service>
+     @endverbatim
+     * - \b selectionId : defines the fwId of the ::fwData::Vector where the selection will be put or get.
+     * - \b selectionMode : defines the selection mode for the series
+     * - \b allowedRemove : allows user to remove series
+     * - \b insertMode : only allows selection of uiMedData::InsertSeries
+     */
+    virtual void configuring() throw (::fwTools::Failed);
+
+    /// Fill selector with the series contained in SeriesDB.
+    virtual void updating() throw (::fwTools::Failed);
+
+    /**
+     * @brief Manages events (::fwComEd::SeriesDBMsg::ADDED_OBJECTS, ::fwComEd::SeriesDBMsg::REMOVED_OBJECTS)
+     *  This method adds/removes series in the selector widget.
+     */
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream );
+
+
+
+protected Q_SLOTS:
+
+    /**
+     * @brief Manages the selection vector according to selection/deselection.
+     * @param[in] selection series to add in selection vector.
+     * @param[in] deselection series to remove from selection vector.
+     */
+    void onSelectedSeries(QVector< ::fwMedData::Series::sptr > selection,
+                          QVector< ::fwMedData::Series::sptr > deselection);
+
+    /**
+     * @brief Send a 'seriesDoubleClicked' signal when the user double click on a series. This signal holds the
+     * clicked series.
+     * @param[in] index index of the clicked item in the selector.
+     * @todo  Manages double click on a study.
+     */
+    void onDoubleClick(const QModelIndex &index);
+
+    /**
+     * @brief Removes series from seriesDB and notify.
+     * @param[in] selection series to remove from seriesDB.
+     */
+    void onRemoveSeries(QVector< ::fwMedData::Series::sptr > selection);
+
+private :
+
+    /// Returns current selection vector given by its fwID m_selectionId.
+    ::fwData::Vector::sptr getSelection();
+
+    /// fwID of the vector of selections
+    std::string m_selectionId;
+
+    /// Selector widget.
+    QPointer< ::uiMedData::widget::Selector > m_selectorWidget;
+
+    /// Signal emitted when there is a double click on a series
+    SeriesDoubleClickedSignalType::sptr m_sigSeriesDoubleClicked;
+
+    /// Permits the user to remove series. Default is yes
+    bool m_allowedRemove;
+
+    /// Change the behaviour of the treeview selection mode
+    QAbstractItemView::SelectionMode m_selectionMode;
+
+    /// If true, allows selection of uiMedData::InsertSeries only
+    bool m_insertMode;
+
+};
+} // namespace editor
+} // namespace uiMedData
+
+#endif // _UIMEDDATAQT_EDITOR_SSELECTOR_HPP_
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSeries.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSeries.hpp
new file mode 100644
index 0000000..3420d84
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/editor/SSeries.hpp
@@ -0,0 +1,144 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_EDITOR_SSERIES_HPP__
+#define __UIMEDDATAQT_EDITOR_SSERIES_HPP__
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwCom/Signal.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QPushButton;
+
+namespace uiMedData
+{
+
+namespace widget
+{
+    class PatientEditor;
+    class StudyEditor;
+    class EquipmentEditor;
+    class SeriesEditor;
+}
+
+namespace editor
+{
+/**
+ * @brief Shows and edit fwMedData::Series information
+ */
+class UIMEDDATAQT_CLASS_API SSeries : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SSeries)(::gui::editor::IEditor) ) ;
+
+    /// Constructor
+    UIMEDDATAQT_API SSeries();
+
+    /// Destructor
+    UIMEDDATAQT_API virtual ~SSeries() throw() ;
+
+    /**
+     * @brief Signal type and key triggered when the series has been exported to related series DB.
+     * @{ */
+    typedef ::fwCom::Signal< void() > SeriesExportedSignalType;
+    UIMEDDATAQT_API static const ::fwCom::Signals::SignalKeyType s_SERIES_EXPORTED_SIG;
+    /**  @} */
+
+    /**
+     * @brief Signal type and key triggered when the service export ability changes
+     * @{ */
+    typedef ::fwCom::Signal< void( bool ) > CanExportSignalType;
+    UIMEDDATAQT_API static const ::fwCom::Signals::SignalKeyType s_CAN_EXPORT_SIG;
+    /**  @} */
+
+    /**
+     * @brief Slot triggering export
+     * @{ */
+    typedef ::fwCom::Slot<void()> ExportSlotType;
+    UIMEDDATAQT_API static const ::fwCom::Slots::SlotKeyType s_EXPORT_SLOT;
+    /**  @} */
+
+protected:
+
+    /// Installs GUI : create container and add selector.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Destroys GUI.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     *
+     * @verbatim
+     <service uid="selector" impl="::uiMedData::editor::SSeries" type="::gui::editor::IEditor" autoConnect="yes">
+        <selectionId>selections</selectionId>
+        <selectionMode>single|extended</selectionMode>
+        <allowedRemove>yes|no</allowedRemove>
+     </service>
+     @endverbatim
+     * - \b selectionId : defines the fwId of the ::fwData::Vector where the selection will be put or get.
+     * - \b selectionMode : defines the selection mode for the series
+     * - \b allowedRemove : allows user to remove series
+     */
+    virtual void configuring() throw (::fwTools::Failed);
+
+    /// Fill selector with the series contained in SeriesDB.
+    virtual void updating() throw (::fwTools::Failed);
+
+    /**
+     * @brief Manages events (::fwComEd::SeriesDBMsg::ADDED_OBJECTS, ::fwComEd::SeriesDBMsg::REMOVED_OBJECTS)
+     *  This method adds/removes series in the selector widget.
+     */
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+protected Q_SLOTS:
+
+    /// Triggered when export button is clicked
+    void onExportClicked();
+
+private:
+
+    /// Widget to allow patient information editing
+    QPointer< ::uiMedData::widget::PatientEditor > m_patientEditor;
+
+    /// Widget for study edition/creation
+    QPointer< ::uiMedData::widget::StudyEditor > m_studyEditor;
+
+    /// Widget for study edition/creation
+    QPointer< ::uiMedData::widget::EquipmentEditor > m_equipmentEditor;
+
+    /// Widget for series edition/creation
+    QPointer< ::uiMedData::widget::SeriesEditor > m_seriesEditor;
+
+    /// Widget to export information into target series
+    QPointer< QPushButton > m_btnExport;
+
+    /// UID of series to be exported
+    std::string m_seriesId;
+
+    /// UID of destination series DB
+    std::string m_seriesDBId;
+
+    /// Signal triggered when the series has been exported to the series DB
+    SeriesExportedSignalType::sptr m_sigSeriesExported;
+
+    /// Signal triggered when the service export ability changes
+    CanExportSignalType::sptr m_sigCanExport;
+
+    /// Slot triggering the export
+    ExportSlotType::sptr m_slotExport;
+};
+} // namespace editor
+} // namespace uiMedData
+
+#endif // _UIMEDDATAQT_EDITOR_SSERIES_HPP_
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/namespace.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/namespace.hpp
new file mode 100644
index 0000000..7991416
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/namespace.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_NAMESPACE_HPP__
+#define __UIMEDDATAQT_NAMESPACE_HPP__
+
+/**
+ * @brief       The namespace uiMedData contains editors for medical data.
+ * @namespace   uiMedData
+ * 
+ * @date        2009-2013.
+ *
+ */
+namespace uiMedData
+{
+
+/**
+ * @brief       The namespace ::uiMedData::action contains actions interacting on medical data.
+ * @namespace   ::uiMedData::action
+ * @date        2013.
+ *
+ */
+namespace action
+{
+}
+
+/**
+ * @brief       The namespace ::uiMedData::widget contains widgets for medical data.
+ * @namespace   ::uiMedData::widget
+ * 
+ * @date        2009-2013.
+ *
+ */
+namespace widget
+{
+}
+
+/**
+ * @brief       The namespace ::uiMedData::editor contains editors for medical data.
+ * @namespace   ::uiMedData::editor
+ * 
+ * @date        2009-2013.
+ *
+ */
+namespace editor
+{
+}
+
+
+}
+#endif /* __UIMEDDATAQT_NAMESPACE_HPP__ */
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/EquipmentEditor.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/EquipmentEditor.hpp
new file mode 100644
index 0000000..fbc9c64
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/EquipmentEditor.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_EQUIPMENTEDITOR_HPP__
+#define __UIMEDDATAQT_WIDGET_EQUIPMENTEDITOR_HPP__
+
+#include <QWidget>
+#include <QPointer>
+
+#include <fwCore/macros.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QLineEdit;
+
+namespace fwMedData
+{
+    class Series;
+    class Equipment;
+}
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief   Widget to edit ::fwMedData::Equipment information
+ * @class   EquipmentEditor
+ * @date    2014.
+ */
+class UIMEDDATAQT_CLASS_API EquipmentEditor : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    /// Constructor.
+    UIMEDDATAQT_API EquipmentEditor(QWidget *parent = 0);
+
+    /// Destructor
+    UIMEDDATAQT_API ~EquipmentEditor();
+
+    /// Set referring series
+    UIMEDDATAQT_API void setSeries(SPTR(::fwMedData::Series) series);
+
+    /// Get the current Equipment
+    UIMEDDATAQT_API SPTR(::fwMedData::Equipment) getEquipment() const;
+
+    /// Check if the equipment information entered in UI is valid
+    UIMEDDATAQT_API bool isValid() const;
+protected :
+
+    SPTR(::fwMedData::Series) m_series;
+
+    QPointer<QLineEdit> m_institutionName;
+
+};
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_EQUIPMENTEDITOR_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/PatientEditor.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/PatientEditor.hpp
new file mode 100644
index 0000000..8c618b0
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/PatientEditor.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_PATIENTEDITOR_HPP__
+#define __UIMEDDATAQT_WIDGET_PATIENTEDITOR_HPP__
+
+#include <QWidget>
+#include <QPointer>
+
+#include <fwCore/macros.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QLineEdit;
+class QComboBox;
+
+namespace fwMedData
+{
+    class Series;
+    class Patient;
+}
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief   Widget to edit ::fwMedData::Patient information
+ * @class   PatientEditor
+ * @date    2014.
+ */
+class UIMEDDATAQT_CLASS_API PatientEditor : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    /// Constructor.
+    UIMEDDATAQT_API PatientEditor(QWidget *parent = 0);
+
+    /// Destructor
+    UIMEDDATAQT_API ~PatientEditor();
+
+    /// Set referring series
+    UIMEDDATAQT_API void setSeries(SPTR(::fwMedData::Series) series);
+
+    /// Returns the patient object created by this editor
+    UIMEDDATAQT_API SPTR(::fwMedData::Patient) getPatient() const;
+
+    /// Returns true if the patient information given through the editor is valid.
+    UIMEDDATAQT_API bool isValid() const;
+
+protected Q_SLOTS:
+    void onNameChanged(const QString&);
+    void onBirthChanged(const QString&);
+
+protected :
+
+    SPTR(::fwMedData::Series) m_series;
+
+    QPointer< QLineEdit > m_txtName;
+    QPointer< QLineEdit > m_txtBirthdate;
+    QPointer< QComboBox > m_cbSex;
+
+    QPalette m_paletteName;
+    QPalette m_paletteBirthdate;
+};
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_PATIENTEDITOR_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/Selector.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/Selector.hpp
new file mode 100644
index 0000000..1420055
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/Selector.hpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_SELECTOR_HPP__
+#define __UIMEDDATAQT_WIDGET_SELECTOR_HPP__
+
+#include <map>
+
+#include <QString>
+#include <QTreeView>
+#include <QPointer>
+#include <QStandardItemModel>
+#include <QStandardItem>
+#include <QModelIndex>
+#include <QVector>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "uiMedDataQt/config.hpp"
+#include "uiMedDataQt/widget/SelectorModel.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief   This selector represents the Series in a hierarchical view (Study/Patient->Series).
+ * @class   Selector
+ * @date    2013.
+ */
+class UIMEDDATAQT_CLASS_API Selector : public QTreeView
+{
+    Q_OBJECT
+
+public:
+
+    typedef QVector< ::fwMedData::Series::sptr > SeriesVectorType;
+
+    /// Constructor. Init tree view.
+    UIMEDDATAQT_API Selector(QWidget *parent = 0);
+
+    /// Destrucotr
+    UIMEDDATAQT_API ~Selector();
+
+    /// Clear all items in the tree.
+    UIMEDDATAQT_API void clear();
+
+    /**
+     * @brief Adds the Series in the tree. If the associated study already exists in the tree, the series is added to
+     * this study.
+     * @param[in] series series to add in the tree.
+     */
+    UIMEDDATAQT_API void addSeries(::fwMedData::Series::sptr series);
+
+    /**
+     * @brief Removes the Series from the tree. After deletion, if the study is empty, it will be removed.
+     * @param[in] series series to remove from the tree.
+     */
+    UIMEDDATAQT_API void removeSeries(::fwMedData::Series::sptr series);
+
+    /// Returns the type of the item (SERIES or STUDY)
+    UIMEDDATAQT_API SelectorModel::ItemType getItemType(const QModelIndex &index);
+
+    /// Catch the delete key event and remove the selected items.
+    UIMEDDATAQT_API void keyPressEvent(QKeyEvent * event);
+
+    /// Allows removing items or not.
+    UIMEDDATAQT_API void setAllowedRemove(bool allowed);
+
+    /// Sets if the selector must be in insert mode.
+    UIMEDDATAQT_API void setInsertMode(bool insert);
+
+Q_SIGNALS:
+    /**
+     * @brief Signal emitted when the selection change.
+     * @param selection contains the new selection of series.
+     * @param deselection contains the new deselection of series.
+     * @note selection and deselection contain only the change of selection. The series always selected or deselected
+     * don't appear in this selection/deselection.
+     */
+    void selectSeries(QVector< ::fwMedData::Series::sptr > selection, QVector< ::fwMedData::Series::sptr > deselection);
+
+    /**
+     * @brief Signal emitted when series are deleted.
+     * @param selection contains the deleted series.
+     */
+    void removeSeries(QVector< ::fwMedData::Series::sptr > selection);
+
+
+protected Q_SLOTS:
+    /**
+     * @brief Slot called when the selection changed. Emits a signal containing the new selected/deselected series. If a
+     * Study is selected, no series are added in signal.
+     * @param selected contains the new selected items.
+     * @param deselected contains the new deselected items.
+     * @note selection and deselection contain only the change of selection. The items always selected or deselected
+     * don't appear in this selection/deselection.
+     */
+    void selectionChanged( const QItemSelection & selected, const QItemSelection & deselected );
+
+protected :
+
+    /**
+     * @brief Returns all the Series associated to the selection.
+     * @note If a study is selected, return an empty selection.
+     */
+    SeriesVectorType getSeries( const QItemSelection & selection );
+
+    /**
+     * @brief Returns all the Series associated to the selection.
+     * @note It ignores the studies.
+     */
+    SeriesVectorType getSeries(const QModelIndexList& indexList);
+
+    /// Returns all the study indexes contained in the given indexList
+    QModelIndexList getStudyIndexes(const QModelIndexList& indexList);
+
+    /// Returns all the series associated with the study index
+    SeriesVectorType getSeriesFromStudyIndex(const QModelIndex& index);
+
+    /// Deletes the selected items and notify the deleted series.
+    void deleteSelection();
+
+private:
+
+    /// Tree model
+    QPointer<SelectorModel> m_model;
+
+    /// Allows to remove items.
+    bool m_allowedRemove;
+
+};
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_SELECTOR_HPP__
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SelectorModel.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SelectorModel.hpp
new file mode 100644
index 0000000..d141a9c
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SelectorModel.hpp
@@ -0,0 +1,165 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_SELECTORMODEL_HPP__
+#define __UIMEDDATAQT_WIDGET_SELECTORMODEL_HPP__
+
+#include <map>
+
+#include <QString>
+#include <QTreeView>
+#include <QPointer>
+#include <QStandardItemModel>
+#include <QStandardItem>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief   This class represents the Selector Model.
+ * @class   SelectorModel
+ * @date    2013.
+ */
+class UIMEDDATAQT_CLASS_API SelectorModel : public QStandardItemModel
+{
+    Q_OBJECT
+
+public:
+
+    /// Defines the role of the items data (ITEM_TYPE or UID)
+    typedef enum
+    {
+        ITEM_TYPE = Qt::UserRole, ///< Role for the item type (STUDY or SERIES)
+        UID                       ///< Role for the fwID of the object
+    }Role;
+
+    /// Defines item type (STUDY or SERIES), it is used in items data (ITEM_TYPE role).
+    typedef enum
+    {
+        STUDY = 1,  ///< Type to represent Study/Patient
+        SERIES      ///< Type to represent Series
+    }ItemType;
+
+    /// Constructor. Inits the model.
+    UIMEDDATAQT_API SelectorModel(QWidget *parent = 0);
+
+    /// Destructor. Does nothing
+    UIMEDDATAQT_API ~SelectorModel();
+
+    /**
+     * @brief Add the Series in the tree. If the associated study already exist in the tree, the series is added to
+     * this study.
+     */
+    UIMEDDATAQT_API void addSeries(::fwMedData::Series::sptr series);
+
+    /**
+     * @brief Removes the Series from the tree. After deletion, if the study is empty, it will be removed.
+     * @param[in] series series to remove from the tree.
+     */
+    UIMEDDATAQT_API void removeSeries(::fwMedData::Series::sptr series);
+
+    /// Clears all items in the model.
+    UIMEDDATAQT_API void clear();
+
+    /// Returns item flags with non editable flag
+    UIMEDDATAQT_API Qt::ItemFlags flags(const QModelIndex& index) const
+    {
+        return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable);
+    }
+
+    /// Returns the type of the item (SERIES or STUDY) associated to the ITEM_TYPE role.
+    UIMEDDATAQT_API ItemType getItemType(const QModelIndex &index);
+
+    /**
+     * @brief Returns the index in the same row as the given index and at the specified column.
+     * @param[in] index index used to get the associated row.
+     * @param[in] column the column of the index to return.
+     */
+    UIMEDDATAQT_API QModelIndex getIndex(const QModelIndex& index, int column );
+
+    /// Removes the rows given by the indexes.
+    UIMEDDATAQT_API void removeRows(const QModelIndexList indexes);
+
+    /// Returns the series item representing the series.
+    UIMEDDATAQT_API QStandardItem* findSeriesItem(::fwMedData::Series::sptr series);
+
+    /// Returns the item representing the study.
+    UIMEDDATAQT_API QStandardItem* findStudyItem(::fwMedData::Study::sptr study);
+
+    /// Sets if the selector must be in insert mode.
+    UIMEDDATAQT_API void setInsertMode(bool insert);
+
+private:
+
+    typedef std::map< ::fwMedData::DicomValueType, QStandardItem* > StudyUidItemMapType;
+
+    /**
+     * @brief Returns the informations contained in the data container as a string, all items are separated by the
+     * separator.
+     */
+    template <typename T>
+    QStandardItem* getInfo(T data, QString separator);
+
+    /// Removes the study item and all the series associated.
+    bool removeStudyItem(QStandardItem *item);
+
+    /// Removes the series item and the parent study if it is the last series in the study.
+    bool removeSeriesItem(QStandardItem *item);
+
+    /// Add the icon corresponding to the type of series.
+    void addSeriesIcon(::fwMedData::Series::sptr series, QStandardItem *item);
+
+    /// Initializes model. Sets headers of the selector.
+    void init();
+
+    /// Number of study rows in the tree.
+    int m_studyRowCount;
+
+    /**
+     * @brief Map to register the association of study Instance UID  and study root item.
+     * It is used to associate the series to its study in the tree.
+     */
+    StudyUidItemMapType m_items;
+
+    /// Sets if the selector is in insert mode (adding new series, forbid selection of existing series).
+    bool m_insert;
+};
+
+
+template <typename T>
+QStandardItem* SelectorModel::getInfo(T data, QString separator)
+{
+    QString dataStr;
+    if(!data.empty())
+    {
+        typename T::iterator itr = data.begin();
+        std::ostringstream str;
+        str << *itr++;
+        dataStr = QString::fromStdString(str.str());
+
+        for(;itr!= data.end(); ++itr)
+        {
+            str.str("");
+            str << *itr;
+            dataStr.append(separator + QString::fromStdString(str.str()));
+        }
+    }
+    QStandardItem *item = new QStandardItem(dataStr);
+    return item;
+}
+
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_SELECTORMODEL_HPP__
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SeriesEditor.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SeriesEditor.hpp
new file mode 100644
index 0000000..67b7623
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/SeriesEditor.hpp
@@ -0,0 +1,144 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_SERIESEDITOR_HPP__
+#define __UIMEDDATAQT_WIDGET_SERIESEDITOR_HPP__
+
+#include <QWidget>
+#include <QPointer>
+#include <QListWidget>
+#include <QPalette>
+
+#include <fwCore/macros.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QLineEdit;
+class QPushButton;
+
+namespace fwMedData
+{
+    class Series;
+}
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief Simple list widget where items can be added/removed from an input widget with add/remove buttons.
+ * @class ListInput
+ */
+class ListInput : public QWidget
+{
+    Q_OBJECT
+
+public:
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+    ListInput();
+    ~ListInput() {}
+    /**  @} */
+
+    /// Erases all items in the list
+    QListWidget* getListWidget() { return m_performingPhysiciansName; }
+
+protected Q_SLOTS: 
+
+    /// Triggered when the add button is clicked, if the input text is not empty
+    void onAddPhysician();
+
+    /// Triggered when the remove button is clicked, if an item is selected in the list
+    void onRemovePhysician();
+
+    /// Triggered when the input text changes
+    void onInputChanged(const QString&);
+
+    /// Triggered when the selection in the list changes
+    void onSelectionChanged();
+
+protected:
+    /// Input widget to edit items
+    QPointer<QLineEdit> m_physicianInput;
+
+    /**
+     * @name Buttons to add/remove items
+     * @{ */
+    QPointer<QPushButton> m_addPhysicianButton;
+    QPointer<QPushButton> m_removePhysicianButton;
+    /**  @} */
+
+    /// List widget
+    QPointer<QListWidget> m_performingPhysiciansName;
+};
+
+/**
+ * @brief   Widget to edit ::fwMedData::Series information
+ * @class   SeriesEditor
+ * @date    2014.
+ */
+class UIMEDDATAQT_CLASS_API SeriesEditor : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+    UIMEDDATAQT_API SeriesEditor(QWidget *parent = 0);
+    UIMEDDATAQT_API ~SeriesEditor();
+    /**  @} */
+
+    /// Set referring series
+    UIMEDDATAQT_API void setSeries(SPTR(::fwMedData::Series) series);
+
+    /// Get the current Series
+    UIMEDDATAQT_API SPTR(::fwMedData::Series) getSeries();
+
+    /// Check if the equipment information entered in UI is valid
+    UIMEDDATAQT_API bool isValid() const;
+
+protected Q_SLOTS:
+
+    /// Triggered when series date text changes
+    void onDateChanged(const QString&);
+
+    /// Triggered when series time text changes
+    void onTimeChanged(const QString&);
+
+    /// Triggered when series description text changes
+    void onDescChanged(const QString&);
+
+protected :
+
+    /// Series to edit information
+    SPTR(::fwMedData::Series) m_series;
+
+    /**
+     * @name Widgets allowing series information editing.
+     * @{ */
+    QPointer<QLineEdit> m_modality;
+    QPointer<QLineEdit> m_date;
+    QPointer<QLineEdit> m_time;
+    QPointer<QLineEdit> m_description;
+    QPointer<QLineEdit> m_physicianInput;
+    QPointer<QPushButton> m_addPhysicianButton;
+    QPointer<QPushButton> m_removePhysicianButton;
+    QPointer<ListInput> m_physicians;
+    /**  @} */
+
+    /// Style applied oon widgets when input errors are detected
+    QPalette m_palette;
+};
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_SERIESEDITOR_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/StudyEditor.hpp b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/StudyEditor.hpp
new file mode 100644
index 0000000..0f96e75
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/include/uiMedDataQt/widget/StudyEditor.hpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIMEDDATAQT_WIDGET_STUDYEDITOR_HPP__
+#define __UIMEDDATAQT_WIDGET_STUDYEDITOR_HPP__
+
+#include <QWidget>
+#include <QPointer>
+#include <QPalette>
+
+#include <fwCore/macros.hpp>
+
+#include "uiMedDataQt/config.hpp"
+
+class QLineEdit;
+
+namespace fwMedData
+{
+    class Series;
+    class Study;
+}
+
+namespace uiMedData
+{
+namespace widget
+{
+
+/**
+ * @brief   Widget to edit ::fwMedData::Study information
+ * @class   StudyEditor
+ * @date    2014.
+ */
+class UIMEDDATAQT_CLASS_API StudyEditor : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    /// Constructor.
+    UIMEDDATAQT_API StudyEditor(QWidget *parent = 0);
+
+    /// Destructor
+    UIMEDDATAQT_API ~StudyEditor();
+
+    /// Set referring series
+    UIMEDDATAQT_API void setSeries(SPTR(::fwMedData::Series) series);
+
+    /// Returns the study object created by this editor
+    UIMEDDATAQT_API SPTR(::fwMedData::Study) getStudy();
+
+    /// Returns true if the study information given through the editor is valid.
+    UIMEDDATAQT_API bool isValid() const;
+
+protected Q_SLOTS:
+
+    /// Triggered when study date text changes
+    void onDateChanged(const QString&);
+
+    /// Triggered when study time text changes
+    void onTimeChanged(const QString&);
+
+    /// Triggered when study description text changes
+    void onDescChanged(const QString&);
+
+protected :
+
+    SPTR(::fwMedData::Series) m_series;
+
+    /**
+     * @name Widgets allowing study information editing.
+     * @{ */
+    QPointer<QLineEdit> m_date;
+    QPointer<QLineEdit> m_time;
+    QPointer<QLineEdit> m_referringPhysicianName;
+    QPointer<QLineEdit> m_description;
+    QPointer<QLineEdit> m_patientAge;
+    /**  @} */
+
+    /**
+     * @name Styles applied oon widgets when input errors are detected
+     * @{ */
+    QPalette m_paletteDate;
+    QPalette m_paletteTime;
+    /**  @} */
+};
+
+} // namespace widget
+} // namespace uiMedData
+
+#endif // __UIMEDDATAQT_WIDGET_STUDYEDITOR_HPP__
+
diff --git a/Bundles/LeafUI/uiMedDataQt/rc/SeriesExportCfg.xml b/Bundles/LeafUI/uiMedDataQt/rc/SeriesExportCfg.xml
new file mode 100644
index 0000000..4cec537
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/rc/SeriesExportCfg.xml
@@ -0,0 +1,87 @@
+<extension implements="::fwServices::registry::AppConfig">
+    <id>SeriesExportCfg</id>
+    <type>parameters</type>
+    <parameters>
+        <param name="SERIESDB_UID" />
+        <param name="SERIES_UID" />
+    </parameters>
+
+    <config>
+
+        <object type="::fwData::Composite">
+
+            <service uid="${GENERIC_UID}_notify_close" impl="::gui::action::ActionNotifyService" autoConnect="no">
+                <notify type="::fwServices::ObjectMsg" event="WINDOW_CLOSED" />
+            </service>
+
+            <service uid="${GENERIC_UID}_seriesExportFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="yes">
+                <window onclose="notify" />
+                <gui>
+                    <frame>
+                        <name>Export series in SDB</name>
+                        <style mode="STAY_ON_TOP" />
+                    </frame>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_seriesExportView" start="yes" />
+                </registry>
+            </service>
+
+            <service uid="${GENERIC_UID}_seriesExportView" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                <gui>
+                    <layout type="::fwGui::LineLayoutManager">
+                        <orientation value="vertical" />
+                        <view proportion="1" caption="Series" />
+                        <view proportion="0" />
+                    </layout>
+                </gui>
+                <registry>
+                    <view sid="${GENERIC_UID}_selector" start="yes" />
+                    <view sid="${GENERIC_UID}_selectedSeriesEditor" start="yes" />
+                </registry>
+            </service>
+
+            <item key="seriesDB">
+                <object uid="${GENERIC_UID}_newSeriesDB" type="::fwMedData::SeriesDB">
+
+                    <service uid="${GENERIC_UID}_selector" impl="::uiMedData::editor::SSelector" autoConnect="yes">
+                        <selectionId>${GENERIC_UID}_selections</selectionId>
+                        <selectionMode>single</selectionMode>
+                        <allowedRemove>no</allowedRemove>
+                        <insertMode>yes</insertMode>
+                    </service>
+
+                    <service uid="${GENERIC_UID}_sdbInitializer" impl="::uiMedData::action::SInitNewSeries" autoConnect="yes">
+                        <seriesDB>${SERIESDB_UID}</seriesDB>
+                    </service>
+
+                </object>
+            </item>
+
+            <item key="selections">
+                <object uid="${GENERIC_UID}_selections" type="::fwData::Vector">
+
+                    <service uid="${GENERIC_UID}_selectedSeriesEditor" impl="::uiMedData::editor::SSeries" autoConnect="yes">
+                        <seriesId>${SERIES_UID}</seriesId>
+                        <seriesDBId>${SERIESDB_UID}</seriesDBId>
+                    </service>
+                </object>
+            </item>
+
+            <connect>
+                <signal>${GENERIC_UID}_selectedSeriesEditor/seriesExported</signal>
+                <slot>${GENERIC_UID}_notify_close/update</slot>
+            </connect>
+
+            <start uid="${GENERIC_UID}_seriesExportFrame" />
+            <start uid="${GENERIC_UID}_sdbInitializer" />
+            <start uid="${GENERIC_UID}_notify_close" />
+
+            <update uid="${GENERIC_UID}_selector" />
+            <update uid="${GENERIC_UID}_sdbInitializer" />
+
+        </object>
+
+    </config>
+</extension>
+
diff --git a/Bundles/LeafUI/uiMedDataQt/rc/plugin.xml b/Bundles/LeafUI/uiMedDataQt/rc/plugin.xml
new file mode 100644
index 0000000..bdc3180
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/rc/plugin.xml
@@ -0,0 +1,162 @@
+<plugin id="uiMedDataQt" class="::uiMedDataQt::Plugin">
+    <library name="uiMedDataQt" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="gui" />
+    <requirement id="visuVTKAdaptor" />
+    <requirement id="uiImageQt" />
+    <requirement id="ctrlSelection" />
+
+    <xi:include href="SeriesExportCfg.xml" xmlns:xi="http://www.w3.org/2003/XInclude" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiMedData::editor::SSelector</service>
+        <object>::fwMedData::SeriesDB</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiMedData::editor::SSeries</service>
+        <object>::fwData::Vector</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::uiMedData::SSeriesViewer</service>
+        <object>::fwData::Vector</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMedData::action::SExportSeries</service>
+        <object>::fwMedData::SeriesDB</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiMedData::action::SInitNewSeries</service>
+        <object>::fwMedData::SeriesDB</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiMedData::editor::SModelSeriesList</service>
+        <object>::fwMedData::ModelSeries</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiMedData::editor::SOrganTransformation</service>
+        <object>::fwMedData::ModelSeries</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>2DSimpleConfig</id>
+        <type>parameters</type>
+        <parameters>
+            <param name="GENERIC_UID" />
+            <param name="WID_PARENT" />
+            <param name="objectID" />
+            <param name="imageID" />
+        </parameters>
+        <config>
+            <object type="::fwData::Composite">
+
+                <service uid="${GENERIC_UID}_mainview" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no">
+                    <gui>
+                        <layout type="::fwGui::CardinalLayoutManager">
+                            <view align="center" />
+                            <view align="bottom" minWidth="200" minHeight="30" resizable="no" />
+                        </layout>
+                    </gui>
+                    <registry>
+                        <parent wid="${WID_PARENT}" />
+                        <view sid="${GENERIC_UID}_gs" start="yes" />
+                        <view sid="${GENERIC_UID}_sliderIndexEditor" start="yes" />
+                    </registry>
+                </service>
+
+                <service uid="${GENERIC_UID}_gs" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                    <scene>
+                        <picker id="picker" vtkclass="fwVtkCellPicker" />
+                        <renderer id="default" background="0.0" />
+                        <adaptor id="renderAdaptor" class="::visuVTKAdaptor::Render" objectId="self">
+                            <config renderer="default" picker="" />
+                        </adaptor>
+                        <adaptor id="interactor4Negato" class="::visuVTKAdaptor::InteractorStyle" objectId="self">
+                            <config renderer="default" style="InteractorStyle2DForNegato" />
+                        </adaptor>
+                        <adaptor id="imageText" class="::visuVTKAdaptor::ImageText" objectId="image">
+                            <config renderer="default" picker="picker" text="" color="#FFFFFF" />
+                        </adaptor>
+                        <adaptor id="seriesAdaptor" class="::visuVTKAdaptor::ImageSeries" objectId="imageSeries">
+                            <config renderer="default" picker="picker" autoresetcamera="yes" mode="2D" slices="1" sliceIndex="axial" />
+                        </adaptor>
+                        <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="imageSeries">
+                            <config renderer="default" text="@patient.name" fontSize="15" hAlign="right" vAlign="top" />
+                        </adaptor>
+                    </scene>
+                </service>
+
+                <item key="imageSeries">
+                    <object type="::fwMedData::ImageSeries" uid="${objectID}" src="ref">
+                    </object>
+                </item>
+
+                <item key="image">
+                    <object type="::fwData::Image" uid="${imageID}" src="ref">
+                        <service uid="${GENERIC_UID}_imageDumpLocker" impl="::ctrlMemory::LockDumpSrv" type="::fwServices::IController" autoConnect="no" />
+                        <service uid="${GENERIC_UID}_medicalImgConverter" impl="::ctrlSelection::MedicalImageSrv" type="::fwServices::IController" autoConnect="no" />
+                        <service uid="${GENERIC_UID}_sliderIndexEditor" type="::gui::editor::IEditor" impl="::uiImage::SliceIndexPositionEditor" autoConnect="yes">
+                            <sliceIndex>axial</sliceIndex>
+                        </service>
+                    </object>
+                </item>
+
+                <start uid="${GENERIC_UID}_imageDumpLocker" />
+                <start uid="${GENERIC_UID}_medicalImgConverter" />
+                <start uid="${GENERIC_UID}_mainview" />
+            </object>
+        </config>
+    </extension>
+
+    <extension implements="::fwServices::registry::AppConfig">
+        <id>3DSimpleConfig</id>
+        <type>parameters</type>
+        <parameters>
+            <param name="GENERIC_UID" />
+            <param name="WID_PARENT" />
+            <param name="objectID" />
+        </parameters>
+        <config>
+            <object type="::fwData::Composite">
+                <service uid="${GENERIC_UID}_gs" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender" autoConnect="yes">
+                    <registry>
+                        <parent wid="${WID_PARENT}" />
+                    </registry>
+                    <scene>
+                        <picker id="picker" vtkclass="fwVtkCellPicker" />
+                        <renderer id="default" background="0.0" />
+
+                        <adaptor id="modelAdaptor" class="::visuVTKAdaptor::ModelSeries" objectId="modelSeries">
+                            <config renderer="default" picker="picker" autoresetcamera="yes" />
+                        </adaptor>
+
+                        <adaptor id="nameAdaptor" class="::visuVTKAdaptor::Text" objectId="modelSeries">
+                            <config renderer="default" text="@patient.name" fontSize="15" hAlign="right" vAlign="top" />
+                        </adaptor>
+                    </scene>
+                </service>
+                
+                <item key="modelSeries">
+                    <object type="::fwMedData::ModelSeries" uid="${objectID}" src="ref">
+                    </object>
+                </item>
+                
+                <start uid="${GENERIC_UID}_gs" />
+            </object>
+        </config>
+    </extension>
+</plugin>
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/InsertSeries.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/InsertSeries.cpp
new file mode 100644
index 0000000..10acb49
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/InsertSeries.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "uiMedDataQt/InsertSeries.hpp"
+
+fwDataRegisterMacro( ::uiMedData::InsertSeries );
+
+namespace uiMedData
+{
+
+InsertSeries::InsertSeries(::fwData::Object::Key key): Series(key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+InsertSeries::~InsertSeries()
+{}
+
+//------------------------------------------------------------------------------
+
+void InsertSeries::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    InsertSeries::csptr other = InsertSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::shallowCopy(_source);
+}
+
+//------------------------------------------------------------------------------
+
+void InsertSeries::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    InsertSeries::csptr other = InsertSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::cachedDeepCopy(_source, cache);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/Plugin.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/Plugin.cpp
new file mode 100644
index 0000000..61bb77c
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "uiMedDataQt/Plugin.hpp"
+
+namespace uiMedDataQt
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiMedDataQt::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiMedDataQt
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/SSeriesViewer.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/SSeriesViewer.cpp
new file mode 100644
index 0000000..d0f87a1
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/SSeriesViewer.cpp
@@ -0,0 +1,189 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Vector.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwComEd/VectorMsg.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include <fwMedData/Series.hpp>
+
+#include "uiMedDataQt/SSeriesViewer.hpp"
+
+
+namespace uiMedData
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController , ::uiMedData::SSeriesViewer , ::fwData::Vector);
+
+//------------------------------------------------------------------------------
+
+SSeriesViewer::SSeriesViewer()
+{
+}
+
+//------------------------------------------------------------------------------
+
+SSeriesViewer::~SSeriesViewer() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::info(std::ostream &_sstream )
+{
+    // Update message
+    _sstream << std::string("SSeriesViewer");
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::starting() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::VectorMsg::csptr vectorMsg = ::fwComEd::VectorMsg::dynamicConstCast(msg);
+
+    if ( vectorMsg && (vectorMsg->hasEvent( ::fwComEd::VectorMsg::ADDED_OBJECTS )
+                      || vectorMsg->hasEvent( ::fwComEd::VectorMsg::REMOVED_OBJECTS ) ))
+    {
+        this->updating();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::stopping() throw(::fwTools::Failed)
+{
+    if(m_configTemplateManager)
+    {
+        m_configTemplateManager->stopAndDestroy();
+        m_configTemplateManager.reset();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Vector::sptr vector = this->getObject< ::fwData::Vector >();
+
+    if(m_configTemplateManager)
+    {
+        m_configTemplateManager->stopAndDestroy();
+        m_configTemplateManager.reset();
+    }
+
+    if(vector->size() == 1)
+    {
+        ::fwData::Object::sptr obj = vector->front();
+        std::string classname = obj->getClassname();
+        SeriesConfigMapType::iterator itr = m_seriesConfigs.find(classname);
+
+        if(itr != m_seriesConfigs.end())
+        {
+            SeriesConfigInfo info = itr->second;
+            std::string configId =  info.configId;
+
+            std::map< std::string, std::string > replaceMap;
+            // Generate generic UID
+            std::string genericUidAdaptor = ::fwServices::registry::AppConfig::getUniqueIdentifier( this->getID() );
+            replaceMap["GENERIC_UID"] = genericUidAdaptor;
+            replaceMap["WID_PARENT"] = m_parentView;
+            replaceMap["objectID"] = obj->getID();
+
+            BOOST_FOREACH(const ReplaceValuesMapType::value_type &elt, info.extractValues)
+            {
+                ::fwData::Object::sptr object = ::fwDataCamp::getObject( obj, elt.second );
+                OSLM_ASSERT("Object from name "<< elt.second <<" not found", object);
+                replaceMap[elt.first] = object->getID();
+            }
+
+            BOOST_FOREACH(const ReplaceValuesMapType::value_type &elt, info.parameters)
+            {
+                SLM_ASSERT("Value '" << elt.first << "' already used in extracted values.",
+                           replaceMap.find(elt.first) == replaceMap.end());
+                replaceMap[elt.first] = elt.second;
+            }
+
+            // Init manager
+            ::fwRuntime::ConfigurationElement::csptr config =
+                   ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( configId, replaceMap );
+            m_configTemplateManager = ::fwServices::AppConfigManager::New();
+            m_configTemplateManager->setConfig( config );
+
+            // Launch config
+            m_configTemplateManager->launch();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeriesViewer::configuring() throw(::fwTools::Failed)
+{
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > viewCfg = m_configuration->find("parentView");
+    SLM_ASSERT("Missing tag 'parentView'", viewCfg.size() == 1);
+    m_parentView = viewCfg[0]->getValue();
+    SLM_ASSERT("'parentView' value must not be empty ", !m_parentView.empty());
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > configsCfg = m_configuration->find("configs");
+    SLM_ASSERT("Missing tag 'configs'", configsCfg.size() == 1);
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > config = configsCfg[0]->find("config");
+    SLM_ASSERT("Missing tag 'config'", !config.empty());
+
+    BOOST_FOREACH(const ::fwRuntime::ConfigurationElement::sptr &elt, config)
+    {
+        SeriesConfigInfo info;
+        info.configId = elt->getAttributeValue("id");
+        SLM_ASSERT("'id' attribute must not be empty", !info.configId.empty());
+        std::string seriesType = elt->getAttributeValue("type");
+        SLM_ASSERT("'type' attribute must not be empty", !seriesType.empty());
+        OSLM_ASSERT("Type " << seriesType << " is already defined.",
+                    m_seriesConfigs.find(seriesType)== m_seriesConfigs.end() );
+
+        BOOST_FOREACH(const ::fwRuntime::ConfigurationElement::sptr &extractElt, elt->find("extract"))
+        {
+            std::string path = extractElt->getAttributeValue("path");
+            SLM_ASSERT("'path' attribute must not be empty", !path.empty());
+            std::string pattern = extractElt->getAttributeValue("pattern");
+            SLM_ASSERT("'pattern' attribute must not be empty", !pattern.empty());
+            info.extractValues[pattern] = path;
+        }
+
+        BOOST_FOREACH(const ::fwRuntime::ConfigurationElement::sptr &param, elt->find("parameter"))
+        {
+            std::string replace = param->getAttributeValue("replace");
+            SLM_ASSERT("'replace' attribute must not be empty", !replace.empty());
+            std::string by = param->getAttributeValue("by");
+            SLM_ASSERT("'by' attribute must not be empty", !by.empty());
+            info.parameters[replace] = by;
+        }
+
+        m_seriesConfigs[seriesType] = info;
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace uiMedData
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SExportSeries.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SExportSeries.cpp
new file mode 100644
index 0000000..025fc6f
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SExportSeries.cpp
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Os.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include <fwGui/dialog/InputDialog.hpp>
+
+#include "uiMedDataQt/action/SExportSeries.hpp"
+
+
+namespace uiMedData
+{
+
+namespace action
+{
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiMedData::action::SExportSeries , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+SExportSeries::SExportSeries()
+{
+}
+
+//------------------------------------------------------------------------------
+
+SExportSeries::~SExportSeries() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::info(std::ostream &_sstream )
+{
+    // Update message
+    _sstream << std::string("SExportSeries");
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::starting() throw(::fwTools::Failed)
+{
+    this->actionServiceStarting();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, seriesDB->getContainer() )
+    {
+        if(series == this->getSeries())
+        {
+            this->setIsExecutable(false);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::SeriesDBMsg::csptr seriesDBMsg = ::fwComEd::SeriesDBMsg::dynamicConstCast(msg);
+
+    if ( seriesDBMsg && seriesDBMsg->hasEvent( ::fwComEd::SeriesDBMsg::ADDED_OBJECTS ) )
+    {
+        ::fwData::Vector::sptr addedObject = seriesDBMsg->getAddedSeries();
+        BOOST_FOREACH( ::fwData::Object::sptr obj, addedObject->getContainer() )
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+            if(series == this->getSeries())
+            {
+                this->setIsExecutable(false);
+            }
+        }
+    }
+    if ( seriesDBMsg && seriesDBMsg->hasEvent( ::fwComEd::SeriesDBMsg::REMOVED_OBJECTS ) )
+    {
+        ::fwData::Vector::sptr removedObject = seriesDBMsg->getRemovedSeries();
+        BOOST_FOREACH( ::fwData::Object::sptr obj, removedObject->getContainer() )
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+            if(series == this->getSeries())
+            {
+                this->setIsExecutable(true);
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::stopping() throw(::fwTools::Failed)
+{
+    this->actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::updating() throw(::fwTools::Failed)
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+    ::fwMedData::Series::sptr series = this->getSeries();
+
+    std::string description = series->getDescription();
+
+    ::fwMedData::ActivitySeries::sptr activitySeries = ::fwMedData::ActivitySeries::dynamicCast(series);
+    if (activitySeries)
+    {
+        ::fwActivities::registry::Activities::sptr registry = ::fwActivities::registry::Activities::getDefault();
+        std::string id = activitySeries->getActivityConfigId();
+        OSLM_ASSERT("Activity information not found for" << id, registry->hasInfo(id));
+
+        ::fwActivities::registry::ActivityInfo activityInfo;
+        activityInfo = registry->getInfo(id);
+
+        description = activitySeries->getDescription();
+        if(description.empty())
+        {
+            description = activityInfo.description;
+        }
+    }
+
+    description = ::fwGui::dialog::InputDialog::showInputDialog(
+            "Export activity", "Enter the series description", description);
+
+    if(!description.empty())
+    {
+        ::fwMedData::DicomValuesType physicians = series->getPerformingPhysiciansName();
+        if(physicians.empty())
+        {
+            std::string username = ::fwTools::os::getEnv("USERNAME", fwTools::os::getEnv("LOGNAME", "Unknown"));
+            physicians.push_back(username);
+        }
+
+        series->setPerformingPhysiciansName(physicians);
+        series->setDescription(description);
+
+        ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+        seriesDBHelper.add(series);
+        seriesDBHelper.notify(this->getSptr());
+        this->setIsExecutable(false);
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void SExportSeries::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > seriesCfg = m_configuration->find("seriesId");
+    SLM_ASSERT("Missing tag 'seriesId'", !seriesCfg.empty());
+
+    m_seriesId = seriesCfg.front()->getValue();
+    SLM_ASSERT("seriesId must not be empty", !m_seriesId.empty());
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::Series::sptr SExportSeries::getSeries()
+{
+    SLM_ASSERT("Object " << m_seriesId << " doesn't exist", ::fwTools::fwID::exist(m_seriesId));
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_seriesId);
+    ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+    SLM_ASSERT("Object " << m_seriesId << " is not a '::fwMedData::Series'", series);
+
+    return series;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+} // namespace uiMedData
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SInitNewSeries.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SInitNewSeries.cpp
new file mode 100644
index 0000000..30a5f29
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/action/SInitNewSeries.cpp
@@ -0,0 +1,184 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+#include <vector>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+
+#include "uiMedDataQt/constants.hpp"
+#include "uiMedDataQt/InsertSeries.hpp"
+#include "uiMedDataQt/action/SInitNewSeries.hpp"
+
+
+namespace uiMedData
+{
+
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro(::fwGui::IActionSrv, ::uiMedData::action::SInitNewSeries, ::fwMedData::SeriesDB);
+
+//------------------------------------------------------------------------------
+
+SInitNewSeries::SInitNewSeries() : m_defaultInstitution("")
+{
+}
+
+//------------------------------------------------------------------------------
+
+SInitNewSeries::~SInitNewSeries() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::info(std::ostream &_sstream )
+{
+    // Update message
+    _sstream << std::string("SInitNewSeries");
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::starting() throw(::fwTools::Failed)
+{
+    this->actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::stopping() throw(::fwTools::Failed)
+{
+    this->actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::updating() throw(::fwTools::Failed)
+{
+    using namespace ::boost::posix_time;
+
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+    seriesDB->getContainer().clear();
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_seriesDBId);
+    SLM_ASSERT("Didn't find object with UID '" + m_seriesDBId + "'", obj);
+    ::fwMedData::SeriesDB::sptr srcSeriesDB = ::fwMedData::SeriesDB::dynamicCast(obj);
+
+    ::fwComEd::helper::SeriesDB helper(seriesDB);
+
+    BOOST_FOREACH(const ::fwMedData::Series::sptr& series, srcSeriesDB->getContainer())
+    {
+        helper.add(series);
+    }
+
+    typedef std::map< std::string, ::fwMedData::Patient::sptr> StudyToPatientType;
+    typedef std::map< std::string, ::fwMedData::Study::sptr> StudyMapType;
+
+    StudyToPatientType studyToPatient;
+    StudyMapType studies;
+
+    BOOST_FOREACH(const ::fwMedData::Series::sptr& series, seriesDB->getContainer())
+    {
+        const std::string& studyUID = series->getStudy()->getInstanceUID();
+
+        studies[studyUID] = series->getStudy();
+        studyToPatient[studyUID] = series->getPatient();
+    }
+
+    ptime now = second_clock::local_time();
+
+    const std::string date = ::fwTools::getDate(now);
+    const std::string time = ::fwTools::getTime(now);
+
+    BOOST_FOREACH(const StudyMapType::value_type& study, studies)
+    {
+        ::fwMedData::Series::sptr newSeries = ::uiMedData::InsertSeries::New();
+        newSeries->setDescription(s_INSERT_NEW_SERIES_TEXT);
+        newSeries->setDate(date);
+        newSeries->setTime(time);
+        newSeries->setStudy(study.second);
+        newSeries->setPatient(studyToPatient[study.first]);
+
+        helper.add(newSeries);
+    }
+
+    ::fwMedData::Study::sptr newStudy = ::fwMedData::Study::New();
+    newStudy->setField(s_NEW_STUDY_FIELD_NAME, ::fwData::String::New("NEW_STUDY"));
+    newStudy->setDate(date);
+    newStudy->setTime(time);
+    newStudy->setDescription(s_NEW_STUDY_TEXT);
+
+    ::fwMedData::Patient::sptr newPatient = ::fwMedData::Patient::New();
+    newPatient->setField(s_NEW_PATIENT_FIELD_NAME, ::fwData::String::New("NEW_PATIENT"));
+    newPatient->setName(s_NEW_PATIENT_TEXT);
+    newPatient->setBirthdate(date + " " + time);
+
+    ::fwMedData::Equipment::sptr newEquipment = ::fwMedData::Equipment::New();
+    newEquipment->setInstitutionName(m_defaultInstitution);
+
+    ::fwMedData::Series::sptr newSeries = ::uiMedData::InsertSeries::New();
+    newSeries->setDescription(s_INSERT_NEW_SERIES_TEXT);
+    newSeries->setStudy(newStudy);
+    newSeries->setPatient(newPatient);
+    newSeries->setEquipment(newEquipment);
+    newSeries->setDate(date);
+    newSeries->setTime(time);
+
+    helper.add(newSeries);
+    helper.notify(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void SInitNewSeries::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > seriesCfg = m_configuration->find("seriesDB");
+    SLM_ASSERT("Missing tag 'seriesDB'", !seriesCfg.empty());
+
+    m_seriesDBId = seriesCfg.front()->getValue();
+    SLM_ASSERT("seriesDB must not be empty", !m_seriesDBId.empty());
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > institutionCfg = m_configuration->find("institution");
+    if(!institutionCfg.empty())
+    {
+        m_defaultInstitution = institutionCfg.front()->getValue();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace action
+}
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SModelSeriesList.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SModelSeriesList.cpp
new file mode 100644
index 0000000..b0b1039
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SModelSeriesList.cpp
@@ -0,0 +1,283 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QCheckBox>
+#include <QString>
+#include <QVBoxLayout>
+#include <QGroupBox>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/String.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwComEd/ReconstructionMsg.hpp>
+#include <fwComEd/ModelSeriesMsg.hpp>
+
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiMedDataQt/editor/SModelSeriesList.hpp"
+
+namespace uiMedData
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiMedData::editor::SModelSeriesList , ::fwMedData::ModelSeries) ;
+
+
+SModelSeriesList::SModelSeriesList() throw() : m_enableHideAll(true)
+{}
+
+//------------------------------------------------------------------------------
+
+SModelSeriesList::~SModelSeriesList() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer
+        = ::fwGuiQt::container::QtContainer::dynamicCast(this->getContainer());
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QVBoxLayout* layout = new QVBoxLayout(container);
+
+
+    if (m_enableHideAll)
+    {
+        m_showCheckBox = new QCheckBox( tr("Hide all organs"));
+        m_showCheckBox->setToolTip(tr("Show or hide all organs"));
+        layout->addWidget( m_showCheckBox, 0 );
+        QObject::connect(m_showCheckBox, SIGNAL(stateChanged(int )), this, SLOT(onShowReconstructions(int)));
+    }
+
+    m_organChoice = new QListWidget();
+
+    layout->addWidget( m_organChoice, 1 );
+
+    container->setLayout( layout );
+
+    QObject::connect(m_organChoice, SIGNAL(itemClicked(QListWidgetItem*)),
+            this, SLOT(onOrganChoiceVisibility(QListWidgetItem*)));
+    QObject::connect(m_organChoice, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
+            this, SLOT(onCurrentItemChanged(QListWidgetItem*, QListWidgetItem*)));
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if(m_showCheckBox)
+    {
+        QObject::disconnect(m_showCheckBox, SIGNAL(stateChanged(int )), this, SLOT(onShowReconstructions(int)));
+    }
+
+    QObject::disconnect(m_organChoice, SIGNAL(itemClicked (QListWidgetItem * )),
+            this, SLOT(onOrganChoiceVisibility(QListWidgetItem *)));
+    QObject::disconnect(m_organChoice, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
+            this, SLOT(onCurrentItemChanged(QListWidgetItem*, QListWidgetItem*)));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    if( m_configuration->findConfigurationElement( "enable_hide_all" ) )
+    {
+        const std::string& hide = m_configuration->findConfigurationElement("enable_hide_all")->getValue();
+        SLM_ASSERT("'enable_hide_all' attribute value must be 'true' or 'false' (found '" + hide + "')",
+                hide == "true" || hide == "false");
+        m_enableHideAll = (hide == "true");
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::updating() throw(::fwTools::Failed)
+{
+    this->updateReconstructions();
+    this->refreshVisibility();
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::ModelSeriesMsg::csptr acquisitionMsg = ::fwComEd::ModelSeriesMsg::dynamicConstCast( msg ) ;
+    if ( acquisitionMsg )
+    {
+        if ( acquisitionMsg->hasEvent(::fwComEd::ModelSeriesMsg::SHOW_RECONSTRUCTIONS) )
+        {
+            this->updating();
+        }
+        else if ( acquisitionMsg->hasEvent(::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION) )
+        {
+            this->updating();
+        }
+        else if ( acquisitionMsg->hasEvent(::fwComEd::ModelSeriesMsg::REMOVED_RECONSTRUCTIONS) )
+        {
+            this->updating();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::updateReconstructions()
+{
+    m_organChoice->blockSignals(true);
+    m_organChoice->clear();
+    m_map.clear();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer
+        = ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+
+    SLM_ASSERT("container not instanced", container);
+    ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >();
+
+    bool hasReconstructions = !modelSeries->getReconstructionDB().empty();
+    container->setEnabled( hasReconstructions );
+
+    if(hasReconstructions)
+    {
+        BOOST_FOREACH(::fwData::Reconstruction::sptr rec, modelSeries->getReconstructionDB())
+        {
+            m_map[ rec->getOrganName() ] = rec;
+        }
+
+        for( OrganNameReconstruction::iterator iter = m_map.begin(); iter != m_map.end(); ++iter )
+        {
+            QListWidgetItem* item = new QListWidgetItem(QString::fromStdString((*iter).first), m_organChoice);
+            item->setCheckState(Qt::Unchecked);
+            m_organChoice->addItem(item);
+        }
+
+        const bool showAllRec
+            = modelSeries->getField("ShowReconstructions", ::fwData::Boolean::New(true))->value();
+
+        if(m_showCheckBox)
+        {
+            m_showCheckBox->setCheckState(showAllRec ? Qt::Unchecked : Qt::Checked );
+            m_organChoice->setEnabled(m_showCheckBox->checkState() == Qt::Unchecked);
+        }
+    }
+
+    m_organChoice->blockSignals(false);
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::onCurrentItemChanged( QListWidgetItem * current, QListWidgetItem * previous )
+{
+    SLM_ASSERT( "Current selected item is null", current );
+
+    QListWidgetItem * currentItem = m_organChoice->currentItem();
+    std::string organSelected = currentItem->text().toStdString();
+
+    if( m_map.find(organSelected) != m_map.end() )
+    {
+        ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >();
+        ::fwData::Reconstruction::sptr rec = m_map[organSelected] ;
+
+        ::fwComEd::ModelSeriesMsg::sptr msg = ::fwComEd::ModelSeriesMsg::New();
+        msg->addEvent( ::fwComEd::ModelSeriesMsg::NEW_RECONSTRUCTION_SELECTED, ::fwData::String::New(rec->getID()));
+        ::fwServices::IEditionService::notify(this->getSptr(), modelSeries, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::onOrganChoiceVisibility(QListWidgetItem * item )
+{
+    std::string organSelected = item->text().toStdString();
+    ::fwData::Reconstruction::sptr rec = m_map[organSelected] ;
+    SLM_ASSERT("rec not instanced", rec);
+
+    bool itemIsChecked = (item->checkState() == Qt::Checked);
+
+    if (rec->getIsVisible() != itemIsChecked)
+    {
+        rec->setIsVisible(item->checkState());
+
+        ::fwComEd::ReconstructionMsg::sptr msg = ::fwComEd::ReconstructionMsg::New();
+        msg->addEvent( ::fwComEd::ReconstructionMsg::VISIBILITY ) ;
+        ::fwServices::IEditionService::notify(this->getSptr(), rec, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::onShowReconstructions(int state )
+{
+    ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >();
+    modelSeries->setField("ShowReconstructions",  ::fwData::Boolean::New(state == Qt::Unchecked) );
+
+    ::fwComEd::ModelSeriesMsg::sptr msg = ::fwComEd::ModelSeriesMsg::New();
+    msg->addEvent( ::fwComEd::ModelSeriesMsg::SHOW_RECONSTRUCTIONS );
+    ::fwServices::IEditionService::notify(this->getSptr(), modelSeries, msg);
+
+    m_organChoice->setEnabled(state == Qt::Unchecked);
+}
+
+//------------------------------------------------------------------------------
+
+void SModelSeriesList::refreshVisibility()
+{
+    int item = 0;
+    for( OrganNameReconstruction::iterator iter = m_map.begin(); iter != m_map.end(); ++iter, ++item )
+    {
+        QListWidgetItem *  currentItem = m_organChoice->item (item);
+        currentItem->setCheckState( iter->second->getIsVisible() ? Qt::Checked : Qt::Unchecked );
+    }
+}
+
+} // namespace editor
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SOrganTransformation.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SOrganTransformation.cpp
new file mode 100644
index 0000000..8d6cf02
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SOrganTransformation.cpp
@@ -0,0 +1,393 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QListWidget>
+#include <QListWidgetItem>
+#include <QStringList>
+#include <QString>
+#include <QVBoxLayout>
+#include <QGroupBox>
+#include <QPushButton>
+#include <QComboBox>
+
+#include <map>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/ModelSeriesMsg.hpp>
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiMedDataQt/editor/SOrganTransformation.hpp"
+
+namespace uiMedData
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor, ::uiMedData::editor::SOrganTransformation, ::fwMedData::ModelSeries );
+
+SOrganTransformation::SOrganTransformation() throw() :
+    m_saveButton( 0 ),
+    m_loadButton( 0 ),
+    m_resetButton( 0 ),
+    m_reconstructionListBox( 0 ),
+    m_testButton( 0 ),
+    m_saveCount( 0 )
+{
+    //addNewHandledEvent( ::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION );
+}
+
+//------------------------------------------------------------------------------
+
+SOrganTransformation::~SOrganTransformation() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+    if( m_configuration->findConfigurationElement( "TMSUid" ) )
+    {
+        m_TMSUid = m_configuration->findConfigurationElement( "TMSUid" )->getValue();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::starting() throw( ::fwTools::Failed )
+{
+    this->create();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =
+            ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QVBoxLayout* layout = new QVBoxLayout(container);
+
+    QGroupBox* groupBox = new QGroupBox(tr("Organs"), container );
+    layout->addWidget( groupBox);
+
+    QVBoxLayout* layoutGroupBox = new QVBoxLayout(container);
+    groupBox->setLayout(layoutGroupBox);
+
+    m_reconstructionListBox = new QListWidget( groupBox);
+    m_resetButton           = new QPushButton(tr("Reset"), container );
+    m_saveButton            = new QPushButton(tr("Save"), container );
+    m_loadButton            = new QPushButton(tr("Load"), container );
+    m_saveSelectionComboBox = new QComboBox(container);
+
+
+    QObject::connect(m_reconstructionListBox,
+                     SIGNAL(itemClicked (QListWidgetItem * )),
+                     this,
+                     SLOT(onReconstructionCheck(QListWidgetItem *)));
+    QObject::connect(m_resetButton, SIGNAL(clicked( )), this, SLOT(onResetClick()));
+    QObject::connect(m_saveButton, SIGNAL(clicked( )), this, SLOT(onSaveClick()));
+    QObject::connect(m_loadButton, SIGNAL(clicked( )), this, SLOT(onLoadClick()));
+
+    //testing
+    m_testButton = new QPushButton(tr("Test"), container);
+    QObject::connect(m_testButton, SIGNAL(clicked()), this, SLOT(onTestClick()));
+
+    layoutGroupBox->addWidget( m_reconstructionListBox, 1);
+    layoutGroupBox->addWidget( m_resetButton, 0);
+    layoutGroupBox->addWidget( m_saveButton, 0);
+    layoutGroupBox->addWidget( m_saveSelectionComboBox,0);
+    layoutGroupBox->addWidget( m_loadButton, 0);
+
+    //test
+    layoutGroupBox->addWidget( m_testButton, 0);
+
+    container->setLayout( layout );
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::stopping() throw( ::fwTools::Failed )
+{
+    QObject::disconnect(m_reconstructionListBox,
+                        SIGNAL(itemClicked (QListWidgetItem * )),
+                        this,
+                        SLOT(onReconstructionCheck(QListWidgetItem *)));
+    QObject::disconnect(m_resetButton, SIGNAL(clicked( )), this, SLOT(onResetClick()));
+    QObject::disconnect(m_saveButton, SIGNAL(clicked( )), this, SLOT(onSaveClick()));
+    QObject::disconnect(m_loadButton, SIGNAL(clicked( )), this, SLOT(onLoadClick()));
+
+    //test
+    QObject::disconnect(m_testButton, SIGNAL(clicked( )), this, SLOT(onTestClick()));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::swapping() throw( ::fwTools::Failed )
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::updating() throw( ::fwTools::Failed )
+{
+    this->refresh();
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::receiving( ::fwServices::ObjectMsg::csptr msg ) throw( ::fwTools::Failed )
+{
+    ::fwComEd::ModelSeriesMsg::csptr pMessage = ::fwComEd::ModelSeriesMsg::dynamicConstCast( msg );
+
+    if( pMessage && pMessage->hasEvent( ::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION ) )
+    {
+        this->updating();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::info( ::std::ostream& sstream )
+{}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::refresh()
+{
+    m_reconstructionMap.clear();
+    m_reconstructionListBox->clear();
+
+    ::fwMedData::ModelSeries::sptr series = this->getObject< ::fwMedData::ModelSeries >();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =
+            ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    bool hasReconstructions = !series->getReconstructionDB().empty();
+    container->setEnabled( hasReconstructions );
+
+    if(hasReconstructions)
+    {
+        ::fwData::Composite::sptr pComposite;
+        if (::fwTools::fwID::exist(m_TMSUid))
+        {
+            pComposite = ::fwData::Composite::dynamicCast(::fwTools::fwID::getObject(m_TMSUid));
+            SLM_ASSERT("Sorry, '"<< m_TMSUid <<"' object is not a composite", pComposite);
+        }
+
+        BOOST_FOREACH(::fwData::Reconstruction::sptr rec, series->getReconstructionDB())
+        {
+            m_reconstructionMap[ rec->getOrganName() ] = rec;
+        }
+
+        for( ReconstructionMapType::iterator it = m_reconstructionMap.begin(); it != m_reconstructionMap.end(); ++it )
+        {
+            std::string organName = it->first;
+            QListWidgetItem* item = new QListWidgetItem(QString::fromStdString(organName), m_reconstructionListBox);
+            if( pComposite && pComposite->find(organName) != pComposite->end())
+            {
+                item->setCheckState(Qt::Checked);
+            }
+            else
+            {
+                item->setCheckState(Qt::Unchecked);
+            }
+            m_reconstructionListBox->addItem (item);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::notitfyTransformationMatrix(::fwData::TransformationMatrix3D::sptr aTransMat)
+{
+    ::fwComEd::TransformationMatrix3DMsg::sptr message = ::fwComEd::TransformationMatrix3DMsg::New();
+    message->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED );
+    ::fwServices::IEditionService::notify( getSptr(), aTransMat, message );
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::onReconstructionCheck(QListWidgetItem *currentItem)
+{
+    ::fwData::Composite::sptr pComposite;
+    if (::fwTools::fwID::exist(m_TMSUid))
+    {
+        pComposite = ::fwData::Composite::dynamicCast(::fwTools::fwID::getObject(m_TMSUid));
+        SLM_ASSERT("Sorry, '"<< m_TMSUid <<"' object is not a composite", pComposite);
+
+        ::std::string item_name = currentItem->text().toStdString();
+        ::fwData::Reconstruction::sptr pReconstruction = m_reconstructionMap[item_name];
+        ::fwData::Mesh::sptr pMesh = pReconstruction->getMesh();
+
+        ::fwComEd::helper::Composite aCompositeHelper(pComposite);
+        if ((currentItem->checkState()) == Qt::Checked)
+        {
+            if (pComposite->find(item_name) == pComposite->end())
+            {
+                aCompositeHelper.add(item_name, pMesh);
+            }
+            else
+            {
+                aCompositeHelper.swap(item_name, pMesh);
+            }
+        }
+        else
+        {
+            if (pComposite->find(item_name) != pComposite->end())
+            {
+                aCompositeHelper.remove(item_name);
+            }
+        }
+        aCompositeHelper.notify(this->getSptr());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::onResetClick()
+{
+    ::fwMedData::ModelSeries::sptr series = this->getObject< ::fwMedData::ModelSeries >();
+
+    //search the corresponding triangular mesh
+    BOOST_FOREACH(::fwData::Reconstruction::sptr rec, series->getReconstructionDB())
+    {
+        ::fwData::Mesh::sptr pTmpTrMesh = rec->getMesh();
+
+        ::fwData::TransformationMatrix3D::sptr pTmpMat =
+                pTmpTrMesh->getField< ::fwData::TransformationMatrix3D>( "TransformMatrix" );
+        if (pTmpMat)
+        {
+            ::fwData::TransformationMatrix3D::sptr pIdentMat;
+            pTmpMat = ::fwData::Object::copy(pIdentMat);
+            this->notitfyTransformationMatrix(pTmpMat);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::onSaveClick()
+{
+    InnerMatMappingType matMap;
+
+    ::fwMedData::ModelSeries::sptr series = this->getObject< ::fwMedData::ModelSeries >();
+
+    if(!series->getReconstructionDB().empty())
+    {
+        BOOST_FOREACH(::fwData::Reconstruction::sptr rec, series->getReconstructionDB())
+        {
+            ::fwData::Mesh::sptr pTmpTrMesh = rec->getMesh();
+            ::fwData::TransformationMatrix3D::sptr pTmpMat =
+                    pTmpTrMesh->getField< ::fwData::TransformationMatrix3D>( "TransformMatrix" );
+            if (pTmpMat)
+            {
+                ::fwData::TransformationMatrix3D::sptr pCpyTmpMat;
+                pCpyTmpMat = ::fwData::Object::copy(pTmpMat);
+                matMap[pTmpTrMesh->getID()] = pCpyTmpMat;
+            }
+        }
+
+        ::std::stringstream tmpSaveName;
+        tmpSaveName << "save_" << m_saveCount;
+        m_saveListing[tmpSaveName.str()] = matMap;
+        m_saveSelectionComboBox->addItem(QString::fromStdString(tmpSaveName.str()));
+        m_saveCount++;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::onLoadClick()
+{
+    if (m_saveSelectionComboBox->count() != 0)
+    {
+        InnerMatMappingType matMap = m_saveListing[m_saveSelectionComboBox->currentText().toStdString()];
+
+        ::fwMedData::ModelSeries::sptr series = this->getObject< ::fwMedData::ModelSeries >();
+
+        //search the corresponding triangular mesh
+        BOOST_FOREACH(::fwData::Reconstruction::sptr rec, series->getReconstructionDB())
+        {
+            ::fwData::Mesh::sptr pTmpTrMesh = rec->getMesh();
+            if (matMap.find(pTmpTrMesh->getID()) != matMap.end())
+            {
+                ::fwData::TransformationMatrix3D::sptr pTmpMat =
+                        pTmpTrMesh->getField< ::fwData::TransformationMatrix3D>( "TransformMatrix" );
+                if (pTmpMat)
+                {
+                    pTmpMat->shallowCopy(matMap[pTmpTrMesh->getID()]);
+                    this->notitfyTransformationMatrix(pTmpMat);
+                }
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SOrganTransformation::onTestClick()
+{
+    ::fwData::TransformationMatrix3D::sptr pRandTmpMat = ::fwData::TransformationMatrix3D::New();
+    srand(time(NULL));
+
+    //randomize the translation parts
+    //pRandTmpMat->setCoefficient(0, 3, (double)(-rand()%50) + 25);
+    //pRandTmpMat->setCoefficient(1, 3, (double)(-rand()%50) + 25);
+    //pRandTmpMat->setCoefficient(2, 3, (double)(-rand()%50) + 25);
+
+    //randomize the 12 parameters of affine transformation matrix
+    for (unsigned int i = 0; i < 3; i++)
+    {
+        for(unsigned int j = 0; j < 4; j++)
+        {
+            pRandTmpMat->setCoefficient(i, j, (double)(-rand()%4 + 2));
+        }
+    }
+
+    InnerMatMappingType matMap = m_saveListing[m_saveSelectionComboBox->currentText().toStdString()];
+
+    ::fwMedData::ModelSeries::sptr series = this->getObject< ::fwMedData::ModelSeries >();
+
+    //search the corresponding triangular mesh
+    BOOST_FOREACH(::fwData::Reconstruction::sptr rec, series->getReconstructionDB())
+    {
+        ::fwData::Mesh::sptr pTmpTrMesh = rec->getMesh();
+
+        ::fwData::TransformationMatrix3D::sptr pTmpMat =
+                pTmpTrMesh->getField< ::fwData::TransformationMatrix3D>( "TransformMatrix" );
+        if (pTmpMat)
+        {
+            pTmpMat->setCoefficients(pRandTmpMat->getCoefficients());
+            this->notitfyTransformationMatrix(pTmpMat);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace editor
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSelector.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSelector.cpp
new file mode 100644
index 0000000..8cab64d
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSelector.cpp
@@ -0,0 +1,328 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QVBoxLayout>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/helper/Vector.hpp>
+#include <fwComEd/helper/SeriesDB.hpp>
+#include <fwComEd/SeriesDBMsg.hpp>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiMedDataQt/editor/SSelector.hpp"
+#include "uiMedDataQt/widget/Selector.hpp"
+
+
+namespace uiMedData
+{
+
+namespace editor
+{
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiMedData::editor::SSelector , ::fwMedData::SeriesDB ) ;
+
+//------------------------------------------------------------------------------
+
+const ::fwCom::Signals::SignalKeyType SSelector::s_SERIES_DOUBLE_CLICKED_SIG = "seriesDoubleClicked";
+
+//------------------------------------------------------------------------------
+
+SSelector::SSelector() :
+    m_allowedRemove(true),
+    m_selectionMode(QAbstractItemView::ExtendedSelection),
+    m_insertMode(false)
+{
+    // Init
+    m_sigSeriesDoubleClicked = SeriesDoubleClickedSignalType::New();
+
+    // Register
+    m_signals( s_SERIES_DOUBLE_CLICKED_SIG,  m_sigSeriesDoubleClicked);
+
+#ifdef COM_LOG
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+SSelector::~SSelector() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::info(std::ostream &_sstream )
+{
+    // Update message
+    _sstream << std::string("SSelector");
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::starting() throw(::fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_selectorWidget = new ::uiMedData::widget::Selector();
+    m_selectorWidget->setSelectionMode(m_selectionMode);
+    m_selectorWidget->setAllowedRemove(m_allowedRemove);
+    m_selectorWidget->setInsertMode(m_insertMode);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->addWidget(m_selectorWidget);
+    container->setLayout(layout);
+
+    QObject::connect(m_selectorWidget, SIGNAL(selectSeries(QVector< ::fwMedData::Series::sptr >,
+                                                           QVector< ::fwMedData::Series::sptr >)),
+                     this, SLOT(onSelectedSeries(QVector< ::fwMedData::Series::sptr >,
+                                                 QVector< ::fwMedData::Series::sptr >)));
+
+    if(!m_insertMode)
+    {
+        QObject::connect(m_selectorWidget, SIGNAL(doubleClicked(const QModelIndex &)),
+                this, SLOT(onDoubleClick(const QModelIndex &)));
+    }
+
+    if(m_allowedRemove)
+    {
+        SLM_TRACE("CONNECT remove series slot");
+        QObject::connect(m_selectorWidget, SIGNAL(removeSeries(QVector< ::fwMedData::Series::sptr >)),
+                         this, SLOT(onRemoveSeries(QVector< ::fwMedData::Series::sptr >)));
+    }
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::SeriesDBMsg::csptr seriesDBMsg = ::fwComEd::SeriesDBMsg::dynamicConstCast(msg);
+
+    if ( seriesDBMsg && seriesDBMsg->hasEvent( ::fwComEd::SeriesDBMsg::ADDED_OBJECTS ) )
+    {
+        ::fwData::Vector::sptr addedObject = seriesDBMsg->getAddedSeries();
+        BOOST_FOREACH( ::fwData::Object::sptr obj, addedObject->getContainer() )
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+            if(series)
+            {
+                m_selectorWidget->addSeries(series);
+            }
+        }
+    }
+    if ( seriesDBMsg && seriesDBMsg->hasEvent( ::fwComEd::SeriesDBMsg::REMOVED_OBJECTS ) )
+    {
+        ::fwData::Vector::sptr removedObject = seriesDBMsg->getRemovedSeries();
+        BOOST_FOREACH( ::fwData::Object::sptr obj, removedObject->getContainer() )
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+            if(series)
+            {
+                m_selectorWidget->removeSeries(series);
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::stopping() throw(::fwTools::Failed)
+{
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::updating() throw(::fwTools::Failed)
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+
+    m_selectorWidget->clear();
+
+    BOOST_FOREACH(::fwMedData::Series::sptr series, seriesDB->getContainer())
+    {
+        m_selectorWidget->addSeries(series);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::initialize();
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > selectionCfg = m_configuration->find("selectionId");
+    SLM_ASSERT("Missing tag 'selectionId'", !selectionCfg.empty());
+
+    m_selectionId = selectionCfg.front()->getValue();
+    SLM_ASSERT("selectionId must not be empty", !m_selectionId.empty());
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > selectionModeCfg = m_configuration->find("selectionMode");
+    if(!selectionModeCfg.empty())
+    {
+        const std::string& selectionMode = selectionModeCfg.front()->getValue();
+
+        if(!selectionMode.empty())
+        {
+            if(selectionMode == "single")
+            {
+                m_selectionMode = QAbstractItemView::SingleSelection;
+            }
+            else if(selectionMode == "extended")
+            {
+                m_selectionMode = QAbstractItemView::ExtendedSelection;
+            }
+            else
+            {
+                SLM_WARN("value " + selectionMode + " is not managed for <selectionMode>");
+            }
+        }
+    }
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > allowedRemoveCfg = m_configuration->find("allowedRemove");
+    if(!allowedRemoveCfg.empty())
+    {
+        const std::string& allowedRemove = allowedRemoveCfg.front()->getValue();
+
+        if(allowedRemove == "yes")
+        {
+            m_allowedRemove = true;
+        }
+        else if(allowedRemove == "no")
+        {
+            m_allowedRemove = false;
+        }
+        else
+        {
+            SLM_WARN("value " + allowedRemove + " is not managed for <allowedRemove>");
+        }
+    }
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > insertCfg = m_configuration->find("insertMode");
+    if(!insertCfg.empty())
+    {
+        const std::string& insert = insertCfg.front()->getValue();
+
+        if(insert == "yes")
+        {
+            m_insertMode = true;
+        }
+        else if(insert == "no")
+        {
+            m_insertMode = false;
+        }
+        else
+        {
+            SLM_WARN("value " + insert + " is not managed for <insertMode>");
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::onSelectedSeries(QVector< ::fwMedData::Series::sptr > selection,
+                                 QVector< ::fwMedData::Series::sptr > deselection)
+{
+    ::fwData::Vector::sptr selectionVector = this->getSelection();
+    ::fwComEd::helper::Vector vectorHelper(selectionVector);
+
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, deselection)
+    {
+        vectorHelper.remove(series);
+    }
+
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, selection)
+    {
+        vectorHelper.add(series);
+    }
+
+    vectorHelper.notify(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::onDoubleClick(const QModelIndex &index)
+{
+    m_selectorWidget->clearSelection();
+    m_selectorWidget->setCurrentIndex(index);
+
+    ::fwData::Vector::sptr selectionVector = this->getSelection();
+
+    if (m_selectorWidget->getItemType(index) == ::uiMedData::widget::SelectorModel::STUDY)
+    {
+        std::stringstream str;
+        str << "Selected study. TODO";
+
+        ::fwGui::dialog::MessageDialog::showMessageDialog("Double click",
+                                                          str.str());
+    }
+    else if (m_selectorWidget->getItemType(index) == ::uiMedData::widget::SelectorModel::SERIES)
+    {
+        SLM_ASSERT("There must be only one object selected", selectionVector->size() == 1);
+        ::fwData::Object::sptr obj = selectionVector->front();
+        ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+        SLM_ASSERT("Object must be a '::fwMedData::Series'", series);
+
+        fwServicesNotifyMacro(this->getLightID(), m_sigSeriesDoubleClicked, (series));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSelector::onRemoveSeries(QVector< ::fwMedData::Series::sptr > selection)
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getObject< ::fwMedData::SeriesDB >();
+    ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+
+    // Remove duplicated series
+    std::set< ::fwMedData::Series::sptr > seriesSet;
+    std::copy(selection.begin(), selection.end(), std::inserter(seriesSet, seriesSet.begin()));
+
+    BOOST_FOREACH( ::fwMedData::Series::sptr series, seriesSet)
+    {
+        seriesDBHelper.remove(series);
+    }
+
+    seriesDBHelper.notify(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Vector::sptr SSelector::getSelection()
+{
+    SLM_ASSERT("Object " << m_selectionId << " doesn't exist", ::fwTools::fwID::exist(m_selectionId));
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_selectionId);
+    ::fwData::Vector::sptr selection = ::fwData::Vector::dynamicCast(obj);
+    SLM_ASSERT("Object " << m_selectionId << " is not a '::fwData::Vector'", selection);
+
+    return selection;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace editor
+} // namespace uiMedData
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSeries.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSeries.cpp
new file mode 100644
index 0000000..a4b26c7
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/editor/SSeries.cpp
@@ -0,0 +1,273 @@
+#include <QWidget>
+#include <QLabel>
+#include <QLineEdit>
+#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QPushButton>
+
+#include <fwTools/Object.hpp>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include <fwComEd/VectorMsg.hpp>
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+
+#include <fwMedDataTools/functions.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "uiMedDataQt/widget/PatientEditor.hpp"
+#include "uiMedDataQt/widget/StudyEditor.hpp"
+#include "uiMedDataQt/widget/EquipmentEditor.hpp"
+#include "uiMedDataQt/widget/SeriesEditor.hpp"
+#include "uiMedDataQt/editor/SSeries.hpp"
+
+namespace uiMedData
+{
+namespace editor
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiMedData::editor::SSeries , ::fwData::Vector ) ;
+
+const ::fwCom::Signals::SignalKeyType SSeries::s_EXPORT_SLOT = "export";
+const ::fwCom::Signals::SignalKeyType SSeries::s_SERIES_EXPORTED_SIG = "seriesExported";
+const ::fwCom::Signals::SignalKeyType SSeries::s_CAN_EXPORT_SIG = "canExport";
+
+//------------------------------------------------------------------------------
+
+SSeries::SSeries()
+{
+    m_slotExport  = ::fwCom::newSlot( &SSeries::onExportClicked, this ) ;
+    ::fwCom::HasSlots::m_slots( s_EXPORT_SLOT, m_slotExport );
+
+    m_sigCanExport = CanExportSignalType::New();
+    m_sigSeriesExported = SeriesExportedSignalType::New();
+
+    ::fwCom::HasSignals::m_signals
+        (s_CAN_EXPORT_SIG, m_sigCanExport)
+        (s_SERIES_EXPORTED_SIG, m_sigSeriesExported)
+        ;
+
+#ifdef COM_LOG
+    m_slotExport->setID(s_EXPORT_SLOT);
+    m_sigCanExport->setID(s_CAN_EXPORT_SIG);
+    m_sigSeriesExported->setID(s_SERIES_EXPORTED_SIG);
+#endif
+
+    // worker was set by IService
+    ::fwCom::HasSlots::m_slots.setWorker( m_associatedWorker );
+}
+
+//------------------------------------------------------------------------------
+
+SSeries::~SSeries() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SSeries::starting() throw(::fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer
+        = ::fwGuiQt::container::QtContainer::dynamicCast(this->getContainer());
+
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_patientEditor = new ::uiMedData::widget::PatientEditor();
+    m_studyEditor = new ::uiMedData::widget::StudyEditor();
+    m_equipmentEditor = new ::uiMedData::widget::EquipmentEditor();
+    m_seriesEditor = new ::uiMedData::widget::SeriesEditor();
+
+
+    QVBoxLayout* studyEquipmentLayout = new QVBoxLayout();
+    studyEquipmentLayout->addWidget(m_studyEditor);
+    studyEquipmentLayout->addWidget(m_equipmentEditor);
+
+    QHBoxLayout* editorLayout = new QHBoxLayout();
+    editorLayout->addWidget(m_patientEditor);
+    editorLayout->addLayout(studyEquipmentLayout);
+    editorLayout->addWidget(m_seriesEditor);
+
+
+    QVBoxLayout* layout = new QVBoxLayout(container);
+    layout->addLayout(editorLayout);
+
+    m_btnExport = new QPushButton(tr("Export series"));
+    m_btnExport->setEnabled(false);
+    m_btnExport->setVisible(m_sigCanExport->getNumberOfConnections() == 0);
+    fwServicesNotifyMacro(this->getLightID(), m_sigCanExport, (false));
+    QHBoxLayout* btnLayout = new QHBoxLayout();
+    btnLayout->setAlignment(Qt::AlignRight);
+    btnLayout->setSizeConstraint(QLayout::SetFixedSize);
+    btnLayout->addWidget(m_btnExport);
+    layout->addLayout(btnLayout);
+    QObject::connect(m_btnExport, SIGNAL(clicked()), this, SLOT(onExportClicked()));
+}
+
+//------------------------------------------------------------------------------
+
+void SSeries::stopping() throw(::fwTools::Failed)
+{
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SSeries::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Vector::sptr vector = this->getObject< ::fwData::Vector >();
+    SLM_ASSERT("Failed to retrieve vector", vector);
+
+    m_btnExport->setVisible(m_sigCanExport->getNumberOfConnections() == 0);
+
+    if(!vector->empty())
+    {
+
+        ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_seriesId);
+        SLM_ASSERT("Failed to retrieve object with UID '" + m_seriesId + "'", obj);
+        ::fwMedData::Series::sptr seriesSrc = ::fwMedData::Series::dynamicCast(obj);
+        SLM_ASSERT("Failed to retrieve a ::fwMedData::Series from object '" << m_seriesId << "'", seriesSrc);
+
+        ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast((*vector)[0]);
+        SLM_ASSERT("Failed to retrieve ::fwMedData::Series from vector", series);
+        series->setDescription(seriesSrc->getDescription());
+        series->setPerformingPhysiciansName(seriesSrc->getPerformingPhysiciansName());
+
+        m_patientEditor->setSeries(series);
+        m_studyEditor->setSeries(series);
+        m_equipmentEditor->setSeries(series);
+        m_seriesEditor->setSeries(series);
+        m_btnExport->setEnabled(true);
+        fwServicesNotifyMacro(this->getLightID(), m_sigCanExport, (true));
+    }
+    else
+    {
+        m_btnExport->setEnabled(false);
+        fwServicesNotifyMacro(this->getLightID(), m_sigCanExport, (false));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeries::onExportClicked()
+{
+    SLM_TRACE_FUNC();
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_seriesId);
+    SLM_ASSERT("Failed to retrieve object with UID '" + m_seriesId + "'", obj);
+    ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+    SLM_ASSERT("Failed to retrieve a ::fwMedData::Series from object '" << m_seriesId << "'", series);
+
+    ::fwTools::Object::sptr objDB = ::fwTools::fwID::getObject(m_seriesDBId);
+    SLM_ASSERT("Failed to retrieve object with UID '" + m_seriesDBId + "'", objDB);
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::dynamicCast(objDB);
+    SLM_ASSERT("Failed to retrieve a ::fwMedData::SeriesDB from object '" << m_seriesDBId << "'", seriesDB);
+
+    if(m_patientEditor->isValid() && m_studyEditor->isValid()
+            && m_equipmentEditor->isValid() && m_seriesEditor->isValid())
+    {
+
+        ::fwData::Vector::sptr vector = this->getObject< ::fwData::Vector >();
+        SLM_ASSERT("Failed to retrieve vector", vector);
+        ::fwMedData::Series::sptr seriesVec = ::fwMedData::Series::dynamicCast((*vector)[0]);
+        SLM_ASSERT("Failed to retrieve ::fwMedData::Series from vector", seriesVec);
+
+        ::fwMedData::Patient::sptr patient = m_patientEditor->getPatient();
+        ::fwMedData::Study::sptr study = m_studyEditor->getStudy();
+
+        // If a new patient is being created but the study edition didn't change a new study instance UID must be set
+        if(patient->getPatientId() != seriesVec->getPatient()->getPatientId())
+        {
+            study->setInstanceUID(::fwMedDataTools::generateStudyInstanceUid());
+        }
+
+        series->setPatient(patient);
+        series->setStudy(study);
+        series->setEquipment(m_equipmentEditor->getEquipment());
+
+        ::fwMedData::Series::sptr seriesInfo = m_seriesEditor->getSeries();
+        series->setModality(seriesInfo->getModality());
+        series->setDate(seriesInfo->getDate());
+        series->setTime(seriesInfo->getTime());
+        series->setDescription(seriesInfo->getDescription());
+        series->setPerformingPhysiciansName(seriesInfo->getPerformingPhysiciansName());
+
+        ::fwComEd::helper::SeriesDB helper(seriesDB);
+        ::fwMedData::SeriesDB::iterator it = std::find(seriesDB->begin(), seriesDB->end(), series);
+        if(it != seriesDB->end())
+        {
+            ::fwGui::dialog::MessageDialog dlg;
+            dlg.setTitle("The series already exists");
+            dlg.setMessage("This series has already been exported in series selector");
+            dlg.setIcon(::fwGui::dialog::IMessageDialog::INFO);
+
+            dlg.show();
+        }
+        else
+        {
+            helper.add(series);
+            helper.notify(this->getSptr());
+        }
+
+        fwServicesNotifyMacro(this->getLightID(), m_sigSeriesExported, ());
+    }
+    else
+    {
+        ::fwGui::dialog::MessageDialog dlg;
+        dlg.setTitle("Error : information validation failed");
+        dlg.setMessage("Given information are not valid : please fix incorrect values before exporting");
+        dlg.setIcon(::fwGui::dialog::IMessageDialog::CRITICAL);
+
+        dlg.show();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSeries::configuring() throw(::fwTools::Failed)
+{
+    this->::fwGui::IGuiContainerSrv::initialize();
+
+    std::vector< ::fwRuntime::ConfigurationElement::sptr > seriesCfg = m_configuration->find("seriesId");
+    SLM_ASSERT("Missing tag 'seriesId'", !seriesCfg.empty());
+
+    m_seriesId = seriesCfg.front()->getValue();
+    SLM_ASSERT("seriesId must not be empty", !m_seriesId.empty());
+
+    std::vector< ::fwRuntime::ConfigurationElement::sptr > seriesDBCfg = m_configuration->find("seriesDBId");
+    SLM_ASSERT("Missing tag 'seriesDBId'", !seriesDBCfg.empty());
+
+    m_seriesDBId = seriesDBCfg.front()->getValue();
+    SLM_ASSERT("seriesDBId must not be empty", !m_seriesDBId.empty());
+}
+
+//------------------------------------------------------------------------------
+
+void SSeries::receiving(::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::VectorMsg::csptr vectorMsg = ::fwComEd::VectorMsg::dynamicConstCast(_msg);
+
+    if ( vectorMsg && (vectorMsg->hasEvent( ::fwComEd::VectorMsg::ADDED_OBJECTS )
+                      || vectorMsg->hasEvent( ::fwComEd::VectorMsg::REMOVED_OBJECTS ) ))
+    {
+        this->updating();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}   // namespace editor
+}   // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/EquipmentEditor.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/EquipmentEditor.cpp
new file mode 100644
index 0000000..0f17a9c
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/EquipmentEditor.cpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <QFormLayout>
+#include <QGroupBox>
+#include <QLineEdit>
+
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/Series.hpp>
+
+#include "uiMedDataQt/widget/EquipmentEditor.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+EquipmentEditor::EquipmentEditor(QWidget *parent) : QWidget(parent)
+{
+    m_institutionName = new QLineEdit();
+
+    QFormLayout* layout = new QFormLayout();
+
+    layout->addRow(tr("Institution name"), m_institutionName);
+
+    QGroupBox* group = new QGroupBox(tr("Equipment"));
+    group->setLayout(layout);
+    QVBoxLayout* topLayout = new QVBoxLayout();
+    topLayout->addWidget(group);
+    this->setLayout(topLayout);
+}
+
+//-----------------------------------------------------------------------------
+
+EquipmentEditor::~EquipmentEditor()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void EquipmentEditor::setSeries(SPTR(::fwMedData::Series) series)
+{
+    SLM_ASSERT("Given series is null", series);
+    m_series = series;
+
+    ::fwMedData::Equipment::sptr equipment = m_series->getEquipment();
+    SLM_ASSERT("Given series equipment is null", equipment);
+
+    m_institutionName->setText(QString::fromStdString(equipment->getInstitutionName()).trimmed());
+
+}
+
+
+SPTR(::fwMedData::Equipment) EquipmentEditor::getEquipment() const
+{
+    ::fwMedData::Equipment::sptr equipment = ::fwMedData::Equipment::New();
+    equipment->setInstitutionName(m_institutionName->text().trimmed().toStdString());
+
+    return equipment;
+}
+
+bool EquipmentEditor::isValid() const
+{
+    //TODO
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/PatientEditor.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/PatientEditor.cpp
new file mode 100644
index 0000000..6805806
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/PatientEditor.cpp
@@ -0,0 +1,197 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <QFormLayout>
+#include <QPalette>
+#include <QGroupBox>
+#include <QComboBox>
+#include <QLineEdit>
+
+#include <fwData/String.hpp>
+
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+
+#include <fwMedDataTools/functions.hpp>
+
+#include "uiMedDataQt/constants.hpp"
+#include "uiMedDataQt/widget/PatientEditor.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+PatientEditor::PatientEditor(QWidget *parent) : QWidget(parent)
+{
+    m_txtName = new QLineEdit();
+
+    m_txtBirthdate = new QLineEdit();
+
+    m_cbSex = new QComboBox();
+    m_cbSex->addItem(QString::fromStdString("Male"));
+    m_cbSex->addItem(QString::fromStdString("Female"));
+    m_cbSex->addItem(QString::fromStdString("Unknown"));
+
+    QFormLayout* layout = new QFormLayout();
+    layout->addRow(tr("&Name"), m_txtName);
+    layout->addRow(tr("&Birthdate"), m_txtBirthdate);
+    layout->addRow(tr("&Sex"), m_cbSex);
+
+    QObject::connect(m_txtName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&)));
+    QObject::connect(m_txtBirthdate, SIGNAL(textChanged(const QString&)), this, SLOT(onBirthChanged(const QString&)));
+
+    QGroupBox* group = new QGroupBox(tr("Patient"));
+    group->setLayout(layout);
+    QVBoxLayout* topLayout = new QVBoxLayout();
+    topLayout->addWidget(group);
+    this->setLayout(topLayout);
+}
+
+//-----------------------------------------------------------------------------
+
+PatientEditor::~PatientEditor()
+{
+    QObject::disconnect(m_txtName, SIGNAL(textChanged(QString)), this, SLOT(onNameChanged));
+    QObject::disconnect(m_txtBirthdate, SIGNAL(textChanged(QString)), this, SLOT(onBirthdateChanged));
+}
+
+//-----------------------------------------------------------------------------
+
+bool PatientEditor::isValid() const
+{
+    return !m_txtName->text().trimmed().isEmpty()
+        && m_txtName->text().trimmed().toStdString() != s_NEW_PATIENT_TEXT
+        && !m_txtBirthdate->text().trimmed().isEmpty();
+;
+}
+
+//-----------------------------------------------------------------------------
+
+void PatientEditor::onNameChanged(const QString& text)
+{
+    if(m_txtName->text().trimmed().isEmpty() || m_txtName->text().trimmed().toStdString() == s_NEW_PATIENT_TEXT)
+    {
+        m_paletteName.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_paletteName.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_txtName->setPalette(m_paletteName);
+}
+
+//-----------------------------------------------------------------------------
+
+void PatientEditor::onBirthChanged(const QString& text)
+{
+    if(m_txtBirthdate->text().trimmed().isEmpty())
+    {
+        m_paletteBirthdate.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_paletteBirthdate.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_txtBirthdate->setPalette(m_paletteBirthdate);
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(::fwMedData::Patient) PatientEditor::getPatient() const
+{
+    ::fwMedData::Patient::sptr srcPatient = m_series->getPatient();
+    ::fwMedData::Patient::sptr patient = ::fwMedData::Patient::New();
+    patient->setName(m_txtName->text().trimmed().toStdString());
+    patient->setBirthdate(m_txtBirthdate->text().trimmed().toStdString());
+    patient->setPatientId(srcPatient->getPatientId());
+
+    const std::string sex = m_cbSex->currentText().toStdString();
+    if(sex == "Male")
+    {
+        patient->setSex("M");
+    }
+    else if(sex == "Female")
+    {
+        patient->setSex("F");
+    }
+    else
+    {
+        patient->setSex("O");
+    }
+
+    // Tell to not compare patient sex if value is not managed
+    std::string srcPatientSex = srcPatient->getSex();
+    ::boost::algorithm::trim(srcPatientSex);
+    const bool compareSex = (srcPatientSex == "M" || srcPatientSex == "F" || srcPatientSex == "O");
+
+    std::string name = patient->getName();
+    ::boost::algorithm::trim(name);
+    std::string birth = patient->getBirthdate();
+    ::boost::algorithm::trim(birth);
+    std::string sexStr = patient->getSex();
+    ::boost::algorithm::trim(sexStr);
+
+    const bool same = srcPatient->getName() == name
+        && srcPatient->getBirthdate() == birth
+        && (compareSex ? (srcPatientSex == sexStr) : true)
+        && srcPatient->getPatientId() == patient->getPatientId();
+
+    ::fwData::String::sptr fieldPatient = srcPatient->getField< ::fwData::String >(s_NEW_PATIENT_FIELD_NAME);
+    if(fieldPatient || !same)
+    {
+        patient->setPatientId(::fwMedDataTools::generatePatientId());
+    }
+
+    return patient;
+}
+
+//-----------------------------------------------------------------------------
+
+void PatientEditor::setSeries(SPTR(::fwMedData::Series) series)
+{
+    SLM_ASSERT("Given series is null", series);
+    m_series = series;
+
+    ::fwMedData::Patient::sptr patient = m_series->getPatient();
+    SLM_ASSERT("Given series patient is null", patient);
+
+    m_txtName->setText(QString::fromStdString(patient->getName()).trimmed());
+    m_txtBirthdate->setText(QString::fromStdString(patient->getBirthdate()).trimmed());
+
+    // force signal (manage empty text case)
+    this->onNameChanged(m_txtName->text());
+    this->onBirthChanged(m_txtBirthdate->text());
+
+    std::string sex = patient->getSex();
+    ::boost::algorithm::trim(sex);
+
+    if(sex == "M")
+    {
+        m_cbSex->setCurrentIndex(0);
+    }
+    else if(sex == "F")
+    {
+        m_cbSex->setCurrentIndex(1);
+    }
+    else
+    {
+        m_cbSex->setCurrentIndex(2);
+        SLM_WARN_IF("Unknown patient sex for value '" + patient->getSex() + "'", patient->getSex() != "O");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/Selector.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/Selector.cpp
new file mode 100644
index 0000000..f8488bf
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/Selector.cpp
@@ -0,0 +1,212 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QStandardItem>
+#include <QString>
+#include <QItemSelectionModel>
+#include <QModelIndexList>
+#include <QKeyEvent>
+
+#include <fwData/Image.hpp>
+
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwComEd/SeriesDBMsg.hpp>
+
+#include "uiMedDataQt/widget/Selector.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+Selector::Selector(QWidget *parent) :
+    QTreeView(parent), m_allowedRemove(true)
+{
+    m_model = new SelectorModel();
+    this->setModel(m_model);
+
+    this->setSelectionMode(QAbstractItemView::ExtendedSelection);
+    this->setAlternatingRowColors( true );
+}
+
+//-----------------------------------------------------------------------------
+
+Selector::~Selector()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::clear()
+{
+    m_model->clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::setInsertMode(bool insert)
+{
+    m_model->setInsertMode(insert);
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::addSeries(::fwMedData::Series::sptr series)
+{
+    m_model->addSeries(series);
+    QStandardItem * studyItem = m_model->findStudyItem(series->getStudy());
+    this->expand(m_model->indexFromItem(studyItem));
+
+    for (int i=0 ; i < m_model->columnCount() ; ++i)
+    {
+        this->resizeColumnToContents(i);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::removeSeries(::fwMedData::Series::sptr series)
+{
+    m_model->removeSeries(series);
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::setAllowedRemove(bool allowed)
+{
+    m_allowedRemove = allowed;
+}
+
+//-----------------------------------------------------------------------------
+
+void Selector::selectionChanged( const QItemSelection & selected, const QItemSelection & deselected )
+{
+    QTreeView::selectionChanged(selected, deselected);
+
+    SeriesVectorType selectedSeries = this->getSeries(selected);
+
+    SeriesVectorType deselectedSeries = this->getSeries(deselected);
+
+    Q_EMIT selectSeries(selectedSeries, deselectedSeries);
+}
+
+//-----------------------------------------------------------------------------
+
+Selector::SeriesVectorType Selector::getSeries( const QItemSelection & selection  )
+{
+    SeriesVectorType vSeries;
+
+    QModelIndexList selectedIndexes = selection.indexes();
+    vSeries = this->getSeries(selectedIndexes);
+    return vSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+Selector::SeriesVectorType Selector::getSeries(const QModelIndexList& indexList)
+{
+    SeriesVectorType vSeries;
+    BOOST_FOREACH(QModelIndex index, indexList)
+    {
+        std::string uid = index.data(SelectorModel::UID).toString().toStdString();
+        ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(uid);
+
+        if (index.data(SelectorModel::ITEM_TYPE)  == SelectorModel::SERIES)
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+            vSeries.push_back(series);
+        }
+    }
+    return vSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+QModelIndexList Selector::getStudyIndexes(const QModelIndexList& indexList)
+{
+    QModelIndexList studiesIndex;
+    BOOST_FOREACH(QModelIndex index, indexList)
+    {
+        if (index.data(SelectorModel::ITEM_TYPE)  == SelectorModel::STUDY)
+        {
+            studiesIndex.push_back(index);
+        }
+    }
+    return studiesIndex;
+}
+
+//-----------------------------------------------------------------------------
+
+Selector::SeriesVectorType Selector::getSeriesFromStudyIndex(const QModelIndex& index )
+{
+    SeriesVectorType vSeries;
+    QStandardItem* item = m_model->itemFromIndex(index);
+    int nbRow = item->rowCount();
+    for(int row =0; row < nbRow; ++row)
+    {
+        QStandardItem *child = item->child(row);
+        std::string uid = child->data(SelectorModel::UID).toString().toStdString();
+        SLM_ASSERT("UID must not be empty.", !uid.empty());
+        ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(uid);
+        ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(obj);
+        vSeries.push_back(series);
+    }
+    return vSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+SelectorModel::ItemType Selector::getItemType(const QModelIndex &index)
+{
+    return m_model->getItemType(index);
+}
+
+ //-----------------------------------------------------------------------------
+
+ void Selector::keyPressEvent(QKeyEvent * event)
+ {
+     if(event->matches(QKeySequence::Delete) && m_allowedRemove)
+     {
+         this->deleteSelection();
+         event->accept();
+     }
+     else
+     {
+         QTreeView::keyPressEvent(event);
+     }
+ }
+
+ //-----------------------------------------------------------------------------
+
+ void Selector::deleteSelection()
+ {
+     QModelIndexList selection = this->selectionModel()->selectedRows(0);
+
+     SeriesVectorType vSeries = this->getSeries(selection);
+     QModelIndexList studyIndexes = this->getStudyIndexes(selection);
+     BOOST_FOREACH(QModelIndex index, studyIndexes)
+     {
+         SeriesVectorType series = getSeriesFromStudyIndex(index);
+         std::copy(series.begin(), series.end(), std::back_inserter(vSeries));
+     }
+
+     Q_EMIT removeSeries(vSeries);
+
+     // Remove item in Selector.
+     m_model->removeRows(selection);
+ }
+
+ //-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SelectorModel.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SelectorModel.cpp
new file mode 100644
index 0000000..8c51841
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SelectorModel.cpp
@@ -0,0 +1,448 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/regex.hpp>
+
+#include <QFont>
+#include <QStandardItem>
+#include <QString>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwActivities/registry/Activities.hpp>
+
+#include "uiMedDataQt/InsertSeries.hpp"
+#include "uiMedDataQt/widget/SelectorModel.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+SelectorModel::SelectorModel(QWidget *parent) :
+    QStandardItemModel(parent),
+    m_studyRowCount(0),
+    m_insert(false)
+{
+    this->init();
+}
+
+//-----------------------------------------------------------------------------
+
+SelectorModel::~SelectorModel()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::init()
+{
+    m_studyRowCount = 0;
+    m_items.clear();
+
+    QStringList headers;
+    headers << "Patient name" << "Modality" << "Acquisition date" << "Image dimension" << "Voxel size"
+            << "Patient position" << "Study description" <<  "Patient ID" << "Age"
+            << "Referring physician / Performing physician " << "Sex" << "Birthdate" << "Institution";
+    this->setHorizontalHeaderLabels(headers);
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::setInsertMode(bool insert)
+{
+    m_insert = insert;
+}
+
+//-----------------------------------------------------------------------------
+
+
+SelectorModel::ItemType SelectorModel::getItemType(const QModelIndex &index)
+{
+    QModelIndex idx = this->createIndex(index.row(), 0, index.internalPointer());
+    QStandardItem *item = this->itemFromIndex(idx);
+    return (SelectorModel::ItemType) item->data(SelectorModel::ITEM_TYPE).toInt();
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::clear()
+{
+    this->QStandardItemModel::clear();
+    this->init();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Image::SpacingType roundSpacing(const ::fwData::Image::SpacingType& spacing)
+{
+    ::fwData::Image::SpacingType roundSpacing;
+    BOOST_FOREACH(::fwData::Image::SpacingType::value_type val, spacing)
+    {
+        ::fwData::Image::SpacingType::value_type roundVal = ::boost::math::round(val * 100.)/100.;
+        roundSpacing.push_back(roundVal);
+    }
+    return roundSpacing;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string formatDate(const std::string& date)
+{
+    std::string formatDate = date;
+    ::boost::algorithm::trim(formatDate);
+
+    const std::string regexYyear = "[0-9]{4}";
+    const std::string regexMonth = "[0-9]{2}";
+    const std::string regexDay   = "[0-9]{2}";
+
+    const std::string regexStr = "("+regexYyear+")"+"("+regexMonth+")"+"("+regexDay+")";
+    ::boost::regex re(regexStr);
+    ::boost::smatch match;
+    if( ::boost::regex_match(formatDate, match, re) )
+    {
+        std::string year, month, day, hour, min, sec;
+        OSLM_ASSERT("Wrong match for "<<formatDate, match.size() >= 4);
+        year.assign(match[1].first, match[1].second);
+        month.assign(match[2].first, match[2].second);
+        day.assign(match[3].first, match[3].second);
+
+        formatDate = year +  "/" + month + "/" + day;
+    }
+
+    return formatDate;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string formatTime(const std::string& time)
+{
+    std::string formatTime = time;
+    ::boost::algorithm::trim(formatTime);
+
+    const std::string regexHour  = "[0-9]{2}";
+    const std::string regexMin   = "[0-9]{2}";
+    const std::string regexSec   = "[0-9]{2}";
+    const std::string regexEnd   = "[.0-9]*";
+
+    const std::string regexStr = "("+regexHour+")"+"("+regexMin+")"+"("+regexSec+")"+regexEnd;
+    ::boost::regex re(regexStr);
+    ::boost::smatch match;
+    if( ::boost::regex_match(formatTime, match, re) )
+    {
+        std::string year, month, day, hour, min, sec;
+        OSLM_ASSERT("Wrong match for "<<formatTime, match.size() >= 4);
+        hour.assign(match[1].first, match[1].second);
+        min.assign(match[2].first, match[2].second);
+        sec.assign(match[3].first, match[3].second);
+
+        formatTime = hour + ":" + min + ":" + sec;
+    }
+
+    return formatTime;
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::addSeries(::fwMedData::Series::sptr series)
+{
+    ::fwMedData::Study::sptr study = series->getStudy();
+    ::fwMedData::DicomValueType studyUID = study->getInstanceUID();
+    StudyUidItemMapType::iterator itr = m_items.find(studyUID);
+    QStandardItem* studyRootItem;
+
+    if(itr != m_items.end())
+    {
+        studyRootItem = itr->second;
+    }
+    else
+    {
+        ::fwMedData::Patient::sptr patient = series->getPatient();
+        ::fwMedData::Equipment::sptr equipment = series->getEquipment();
+
+        QStandardItem *patientName = new QStandardItem( QString::fromStdString(patient->getName()) );
+        patientName->setData(QVariant((int)SelectorModel::STUDY), SelectorModel::ITEM_TYPE);
+        patientName->setData(QVariant(QString::fromStdString(study->getInstanceUID())), UID);
+        QStandardItem *patientId   = new QStandardItem( QString::fromStdString(patient->getPatientId()) );
+        std::string birthDate = formatDate(patient->getBirthdate());
+        QStandardItem *patientBirthdate   = new QStandardItem( QString::fromStdString(birthDate) );
+        QStandardItem *patientSex   = new QStandardItem( QString::fromStdString(patient->getSex()) );
+
+        std::string studyDateTime = formatDate(study->getDate()) + " " + formatTime(study->getTime());
+        QStandardItem *studyDate = new QStandardItem( QString::fromStdString(studyDateTime));
+        QStandardItem *studyReferringPhysicianName = new QStandardItem(
+                QString::fromStdString(study->getReferringPhysicianName()));
+        QStandardItem *studyDescription = new QStandardItem( QString::fromStdString(study->getDescription()));
+        QStandardItem *studyPatientAge = new QStandardItem( QString::fromStdString(study->getPatientAge()));
+
+        QStandardItem *institution = new QStandardItem( QString::fromStdString(equipment->getInstitutionName()));
+
+        this->setItem(m_studyRowCount, 0, patientName);
+        this->setItem(m_studyRowCount, 1, new QStandardItem());
+        this->setItem(m_studyRowCount, 2, studyDate);
+        this->setItem(m_studyRowCount, 3, new QStandardItem());
+        this->setItem(m_studyRowCount, 4, new QStandardItem());
+        this->setItem(m_studyRowCount, 5, new QStandardItem());
+        this->setItem(m_studyRowCount, 6, studyDescription);
+        this->setItem(m_studyRowCount, 7, patientId);
+        this->setItem(m_studyRowCount, 8, studyPatientAge);
+        this->setItem(m_studyRowCount, 9, studyReferringPhysicianName);
+        this->setItem(m_studyRowCount, 10, patientSex);
+        this->setItem(m_studyRowCount, 11, patientBirthdate);
+        this->setItem(m_studyRowCount, 12, institution);
+
+        const int nbColumns = institution->index().column() + 1;
+        for (int i = 0; i < nbColumns; ++i)
+        {
+            QStandardItem *item = this->item(m_studyRowCount, i);
+            item->setFlags(item->flags() & ~Qt::ItemIsSelectable );
+        }
+
+        m_studyRowCount++;
+        studyRootItem = patientName;
+        m_items[studyUID] = studyRootItem;
+    }
+
+    QStandardItem *seriesModality = new QStandardItem(QString::fromStdString(series->getModality()));
+    std::string seriesDateTime = formatDate(series->getDate()) + " " + formatTime(series->getTime());
+    QStandardItem *seriesDate = new QStandardItem( QString::fromStdString(seriesDateTime));
+
+    QStandardItem* seriesPerformingPhysician =
+            this->getInfo< ::fwMedData::DicomValuesType >(series->getPerformingPhysiciansName(), ", ");
+
+    QStandardItem * seriesDescription1 = new QStandardItem(QString::fromStdString(series->getDescription()));
+    seriesDescription1->setData(QVariant((int)SelectorModel::SERIES), SelectorModel::ITEM_TYPE);
+    seriesDescription1->setData(QVariant(QString::fromStdString(series->getID())), UID);
+    QStandardItem * seriesDescription2 = new QStandardItem(QString::fromStdString(series->getDescription()));
+
+    const int nbRow = studyRootItem->rowCount();
+    studyRootItem->setChild(nbRow, 0, seriesDescription1);
+    studyRootItem->setChild(nbRow, 1, seriesModality);
+    studyRootItem->setChild(nbRow, 2, seriesDate);
+    studyRootItem->setChild(nbRow, 6, seriesDescription2);
+    studyRootItem->setChild(nbRow, 9, seriesPerformingPhysician);
+    studyRootItem->setChild(nbRow, 12, new QStandardItem());
+
+
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::dynamicCast(series);
+    if(imageSeries)
+    {
+
+        ::fwData::Image::sptr image =  imageSeries->getImage();
+
+        ::fwData::Image::SizeType imageNumber = image->getSize();
+        QStandardItem* imageSize = this->getInfo< ::fwData::Image::SizeType>(imageNumber, " x ");
+        studyRootItem->setChild(nbRow, 3, imageSize);
+
+        ::fwData::Image::SpacingType voxelSize = roundSpacing(image->getSpacing());
+        QStandardItem* voxelSizeItem = this->getInfo< ::fwData::Image::SpacingType>(voxelSize, " x ");
+        studyRootItem->setChild(nbRow, 4, voxelSizeItem);
+
+        ::fwData::Image::OriginType patientPosition = image->getOrigin();
+        QStandardItem* originItem = this->getInfo< ::fwData::Image::OriginType>(patientPosition, ", ");
+        studyRootItem->setChild(nbRow, 5, originItem);
+    }
+
+    if(m_insert)
+    {
+        ::uiMedData::InsertSeries::sptr insertSeries = ::uiMedData::InsertSeries::dynamicCast(series);
+
+        const int nbColumns = studyRootItem->columnCount();
+        for(int i = 0; i < nbColumns; ++i)
+        {
+            QStandardItem *item = studyRootItem->child(nbRow, i);
+            if(!item)
+            {
+                studyRootItem->setChild(nbRow, i, new QStandardItem());
+                item = studyRootItem->child(nbRow, i);
+            }
+
+            if(insertSeries)
+            {
+                QFont f = item->font();
+                f.setBold(true);
+                item->setFont(f);
+            }
+            else
+            {
+                item->setFlags(item->flags() & ~Qt::ItemIsSelectable);
+            }
+        }
+    }
+
+    this->addSeriesIcon(series, seriesDescription1);
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::addSeriesIcon(::fwMedData::Series::sptr series, QStandardItem *item)
+{
+    ::fwMedData::ImageSeries::sptr imageSeries = ::fwMedData::ImageSeries::dynamicCast(series);
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(series);
+    ::fwMedData::ActivitySeries::sptr activitySeries = ::fwMedData::ActivitySeries::dynamicCast(series);
+    if(imageSeries)
+    {
+        item->setIcon(QIcon(QString((std::string(LIBSFW4SPL) + "Bundles/media_0-1/icons/ImageSeries.svg").c_str()))); //in an other commit
+    }
+    else if (modelSeries)
+    {
+       item->setIcon(QIcon(QString((std::string(LIBSFW4SPL) + "Bundles/media_0-1/icons/ModelSeries.svg").c_str()))); //in an other commit
+    }
+    else if (activitySeries)
+    {
+        ::fwActivities::registry::Activities::sptr registry = ::fwActivities::registry::Activities::getDefault();
+        std::string id = activitySeries->getActivityConfigId();
+        OSLM_ASSERT("Activity information not found for" << id, registry->hasInfo(id));
+
+        ::fwActivities::registry::ActivityInfo activityInfo;
+        activityInfo = registry->getInfo(id);
+        item->setIcon(QIcon(QString::fromStdString(activityInfo.icon)));
+    }
+    else
+    {
+        OSLM_WARN("This type of series is not defined (" << series->getClassname() << ")");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::removeSeries(::fwMedData::Series::sptr series)
+{
+    QStandardItem* seriesItem = this->findSeriesItem(series);
+    this->removeSeriesItem(seriesItem);
+}
+
+//-----------------------------------------------------------------------------
+
+QModelIndex SelectorModel::getIndex(const QModelIndex& index, int column )
+{
+    QModelIndex idx = this->createIndex(index.row(), column, index.internalPointer());
+    return idx;
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorModel::removeRows(const QModelIndexList indexes)
+{
+    QList<QStandardItem *> seriesItems;
+    QList<QStandardItem *> studyItems;
+
+    BOOST_FOREACH(QModelIndex index, indexes)
+    {
+        SLM_ASSERT("Index must be in first column.", index.column() == 0);
+        QStandardItem * item = this->itemFromIndex(index);
+        if (item->data(SelectorModel::ITEM_TYPE) == SelectorModel::STUDY)
+        {
+            studyItems.append(item);
+        }
+        else if (item->data(SelectorModel::ITEM_TYPE) == SelectorModel::SERIES)
+        {
+            seriesItems.append(item);
+        }
+    }
+
+    // Remove series items from selector
+    BOOST_FOREACH(QStandardItem *item, seriesItems)
+    {
+        QStandardItem * studyItem = item->parent();
+
+        // Remove series item if it is not included in a study which will be remove.
+        if (std::find(studyItems.begin(), studyItems.end(), studyItem) == studyItems.end())
+        {
+            this->removeSeriesItem(item);
+        }
+    }
+
+    // Remove study items from selector
+    BOOST_FOREACH(QStandardItem *item, studyItems)
+    {
+        this->removeStudyItem(item);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool SelectorModel::removeStudyItem(QStandardItem *item)
+{
+    bool isRemoved = false;
+    SLM_ASSERT("Index must represent a study.", item->data(SelectorModel::ITEM_TYPE) == SelectorModel::STUDY);
+    QString uid = item->data(SelectorModel::UID).toString();
+    ::fwMedData::DicomValueType instanceUID = uid.toStdString();
+
+    isRemoved = this->QStandardItemModel::removeRow(item->row());
+    SLM_ASSERT("Remove can not be done!", isRemoved);
+    m_items.erase(instanceUID);
+    --m_studyRowCount;
+
+    return isRemoved;
+}
+
+//-----------------------------------------------------------------------------
+
+bool SelectorModel::removeSeriesItem(QStandardItem *item)
+{
+    bool isRemoved = false;
+
+    SLM_ASSERT("Index must represent series", item->data(SelectorModel::ITEM_TYPE) == SelectorModel::SERIES);
+    QStandardItem* parent = item->parent();
+    isRemoved = this->QStandardItemModel::removeRow(item->row(), this->indexFromItem(parent));
+    SLM_ASSERT("Remove can not be done!", isRemoved);
+    if(parent && parent->rowCount() == 0)
+    {
+        this->removeStudyItem(parent);
+    }
+    return isRemoved;
+}
+
+//-----------------------------------------------------------------------------
+
+QStandardItem* SelectorModel::findSeriesItem(::fwMedData::Series::sptr series)
+{
+    QStandardItem* seriesItem;
+    ::fwMedData::Study::sptr study = series->getStudy();
+    QStandardItem* studyItem = this->findStudyItem(study);
+
+    int nbRow = studyItem->rowCount();
+    for(int row =0; row < nbRow; ++row)
+    {
+        QStandardItem *child = studyItem->child(row);
+        std::string seriesId = child->data(SelectorModel::UID).toString().toStdString();
+        if(seriesId == series->getID())
+        {
+            seriesItem = child;
+            break;
+        }
+    }
+    return seriesItem;
+}
+
+//-----------------------------------------------------------------------------
+
+QStandardItem* SelectorModel::findStudyItem(::fwMedData::Study::sptr study)
+{
+    ::fwMedData::DicomValueType studyInstanceUid = study->getInstanceUID();
+
+    QStandardItem* studyItem = m_items[studyInstanceUid];
+    return studyItem;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SeriesEditor.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SeriesEditor.cpp
new file mode 100644
index 0000000..2fda8bd
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/SeriesEditor.cpp
@@ -0,0 +1,237 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <QFormLayout>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QGroupBox>
+#include <QPushButton>
+#include <QLineEdit>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/types.hpp>
+
+#include "uiMedDataQt/constants.hpp"
+#include "uiMedDataQt/widget/SeriesEditor.hpp"
+#include "uiMedDataQt/InsertSeries.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+ListInput::ListInput()
+{
+    m_physicianInput = new QLineEdit();
+    m_addPhysicianButton = new QPushButton(tr("+"));
+    m_addPhysicianButton->setEnabled(false);
+    m_removePhysicianButton = new QPushButton(tr("-"));
+    m_removePhysicianButton->setEnabled(false);
+    m_performingPhysiciansName = new QListWidget();
+
+    QHBoxLayout* inputLayout = new QHBoxLayout();
+    inputLayout->addWidget(m_physicianInput);
+    inputLayout->addWidget(m_addPhysicianButton);
+    inputLayout->addWidget(m_removePhysicianButton);
+    QVBoxLayout* vLayout = new QVBoxLayout();
+
+    vLayout->addLayout(inputLayout);
+    vLayout->addWidget(m_performingPhysiciansName);
+
+    QObject::connect(m_physicianInput, SIGNAL(textChanged(const QString&)),
+            this, SLOT(onInputChanged(const QString&))); 
+    QObject::connect(m_addPhysicianButton, SIGNAL(clicked()),
+            this, SLOT(onAddPhysician()));
+    QObject::connect(m_removePhysicianButton, SIGNAL(clicked()),
+            this, SLOT(onRemovePhysician()));
+    QObject::connect(m_performingPhysiciansName, SIGNAL(itemSelectionChanged()), this, SLOT(onSelectionChanged()));
+    this->setLayout(vLayout);
+}
+
+//-----------------------------------------------------------------------------
+
+void ListInput::onInputChanged(const QString& text)
+{
+    m_addPhysicianButton->setEnabled(m_physicianInput->text().count() > 0);
+}
+
+//-----------------------------------------------------------------------------
+
+void ListInput::onAddPhysician()
+{
+    m_performingPhysiciansName->addItem(new QListWidgetItem(m_physicianInput->text().trimmed()));
+    m_physicianInput->clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void ListInput::onRemovePhysician()
+{
+    QList< QListWidgetItem* > selectedItems = m_performingPhysiciansName->selectedItems();
+    for(int i = 0; i < selectedItems.count(); ++i)
+    {
+        delete selectedItems.at(i);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ListInput::onSelectionChanged()
+{
+    m_removePhysicianButton->setEnabled(m_performingPhysiciansName->selectedItems().count() > 0);
+}
+//-----------------------------------------------------------------------------
+
+SeriesEditor::SeriesEditor(QWidget *parent) : QWidget(parent)
+{
+    m_modality = new QLineEdit();
+    m_date = new QLineEdit();
+    m_time = new QLineEdit();
+    m_description = new QLineEdit();
+    m_physicians = new ListInput();
+
+    QFormLayout* layout = new QFormLayout();
+
+    layout->addRow(tr("Modality"), m_modality);
+    layout->addRow(tr("Date"), m_date);
+    layout->addRow(tr("Time"), m_time);
+    layout->addRow(tr("Description"), m_description);
+
+    layout->addRow(tr("Physicians"), m_physicians);
+
+    QObject::connect(m_date, SIGNAL(textChanged(const QString&)), this, SLOT(onDateChanged(const QString&)));
+    QObject::connect(m_time, SIGNAL(textChanged(const QString&)), this, SLOT(onTimeChanged(const QString&)));
+    QObject::connect(m_description, SIGNAL(textChanged(const QString&)), this, SLOT(onDescChanged(const QString&)));
+
+    QGroupBox* group = new QGroupBox(tr("Series"));
+    group->setLayout(layout);
+    QVBoxLayout* topLayout = new QVBoxLayout();
+    topLayout->addWidget(group);
+    this->setLayout(topLayout);
+}
+
+//-----------------------------------------------------------------------------
+
+SeriesEditor::~SeriesEditor()
+{
+    QObject::disconnect(m_date, SIGNAL(textChanged(const QString&)), this, SLOT(onDateChanged(const QString&)));
+    QObject::disconnect(m_time, SIGNAL(textChanged(const QString&)), this, SLOT(onTimeChanged(const QString&)));
+    QObject::disconnect(m_description, SIGNAL(textChanged(const QString&)), this, SLOT(onDescChanged(const QString&)));
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesEditor::onDateChanged(const QString& text)
+{
+    if(m_date->text().trimmed().isEmpty())
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_date->setPalette(m_palette);
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesEditor::onTimeChanged(const QString& text)
+{
+    if(m_time->text().trimmed().isEmpty())
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_time->setPalette(m_palette);
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesEditor::onDescChanged(const QString& text)
+{
+    if(m_description->text().trimmed().toStdString() == s_INSERT_NEW_SERIES_TEXT)
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_palette.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_description->setPalette(m_palette);
+}
+
+
+//-----------------------------------------------------------------------------
+
+void SeriesEditor::setSeries(SPTR(::fwMedData::Series) series)
+{
+    SLM_ASSERT("Given series is null", series);
+    m_series = series;
+
+    m_modality->setText(QString::fromStdString(m_series->getModality()).trimmed());
+    m_description->setText(QString::fromStdString(m_series->getDescription()).trimmed());
+    m_date->setText(QString::fromStdString(series->getDate()).trimmed());
+    m_time->setText(QString::fromStdString(series->getTime()).trimmed());
+
+    // force signal (manage empty text case)
+    this->onTimeChanged(m_time->text());
+    this->onDateChanged(m_date->text());
+
+    m_physicians->getListWidget()->clear();
+    BOOST_FOREACH(::fwMedData::DicomValueType value, m_series->getPerformingPhysiciansName())
+    {
+        QListWidgetItem* newVal
+            = new QListWidgetItem(QString::fromStdString(value).trimmed(), m_physicians->getListWidget());
+    } 
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(::fwMedData::Series) SeriesEditor::getSeries()
+{
+    ::fwMedData::Series::sptr series = ::uiMedData::InsertSeries::New();
+    series->setModality(m_modality->text().trimmed().toStdString());
+    series->setDate(m_date->text().trimmed().toStdString());
+    series->setTime(m_time->text().trimmed().toStdString());
+    series->setDescription(m_description->text().trimmed().toStdString());
+
+    ::fwMedData::DicomValuesType newPerformingPhysiciansName;
+    for(int i = 0; i < m_physicians->getListWidget()->count(); ++i)
+    {
+        newPerformingPhysiciansName.push_back(m_physicians->getListWidget()->item(i)->text().trimmed().toStdString());
+    }
+
+    series->setPerformingPhysiciansName(newPerformingPhysiciansName);
+
+    return series;
+}
+
+//-----------------------------------------------------------------------------
+
+bool SeriesEditor::isValid() const
+{
+    return !m_date->text().trimmed().isEmpty()
+        && !m_time->text().trimmed().isEmpty()
+        && m_description->text().trimmed().toStdString() != s_INSERT_NEW_SERIES_TEXT;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/StudyEditor.cpp b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/StudyEditor.cpp
new file mode 100644
index 0000000..93fdb7f
--- /dev/null
+++ b/Bundles/LeafUI/uiMedDataQt/src/uiMedDataQt/widget/StudyEditor.cpp
@@ -0,0 +1,188 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <QFormLayout>
+#include <QGroupBox>
+#include <QLineEdit>
+
+#include <fwData/String.hpp>
+
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Series.hpp>
+
+#include <fwMedDataTools/functions.hpp>
+
+#include "uiMedDataQt/constants.hpp"
+#include "uiMedDataQt/InsertSeries.hpp"
+#include "uiMedDataQt/widget/StudyEditor.hpp"
+
+namespace uiMedData
+{
+namespace widget
+{
+
+//-----------------------------------------------------------------------------
+
+StudyEditor::StudyEditor(QWidget *parent) : QWidget(parent)
+{
+    m_date = new QLineEdit();
+    m_time = new QLineEdit();
+    m_referringPhysicianName = new QLineEdit();
+    m_description = new QLineEdit();
+    m_patientAge = new QLineEdit();
+
+    QFormLayout* layout = new QFormLayout();
+
+    layout->addRow(tr("Date"), m_date);
+    layout->addRow(tr("Time"), m_time);
+    layout->addRow(tr("Referring physician name"), m_referringPhysicianName);
+    layout->addRow(tr("Description"), m_description);
+    layout->addRow(tr("Patient age"), m_patientAge);
+
+    QObject::connect(m_date, SIGNAL(textChanged(const QString&)), this, SLOT(onDateChanged(const QString&)));
+    QObject::connect(m_time, SIGNAL(textChanged(const QString&)), this, SLOT(onTimeChanged(const QString&)));
+    QObject::connect(m_description, SIGNAL(textChanged(const QString&)), this, SLOT(onDescChanged(const QString&)));
+
+    QGroupBox* group = new QGroupBox(tr("Study"));
+    group->setLayout(layout);
+    QVBoxLayout* topLayout = new QVBoxLayout();
+    topLayout->addWidget(group);
+    this->setLayout(topLayout);
+}
+
+//-----------------------------------------------------------------------------
+
+StudyEditor::~StudyEditor()
+{
+    QObject::disconnect(m_date, SIGNAL(textChanged(const QString&)), this, SLOT(onDateChanged(const QString&)));
+    QObject::disconnect(m_time, SIGNAL(textChanged(const QString&)), this, SLOT(onTimeChanged(const QString&)));
+    QObject::disconnect(m_description, SIGNAL(textChanged(const QString&)), this, SLOT(onDescChanged(const QString&)));
+}
+
+//-----------------------------------------------------------------------------
+
+bool StudyEditor::isValid() const
+{
+    return !m_date->text().trimmed().isEmpty()
+        && m_description->text().trimmed().toStdString() != s_NEW_STUDY_TEXT
+        && !m_time->text().trimmed().isEmpty();
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(::fwMedData::Study) StudyEditor::getStudy()
+{
+    ::fwMedData::Study::sptr srcStudy = m_series->getStudy();
+    ::fwMedData::Study::sptr study = ::fwMedData::Study::New();
+    study->setDescription(m_description->text().trimmed().toStdString());
+    study->setDate(m_date->text().trimmed().toStdString());
+    study->setTime(m_time->text().trimmed().toStdString());
+    study->setReferringPhysicianName(m_referringPhysicianName->text().trimmed().toStdString());
+    study->setInstanceUID(srcStudy->getInstanceUID());
+    study->setPatientAge(srcStudy->getPatientAge());
+
+    std::string date = srcStudy->getDate();
+    ::boost::algorithm::trim(date);
+    std::string time = srcStudy->getTime();
+    ::boost::algorithm::trim(time);
+    std::string refP = srcStudy->getReferringPhysicianName();
+    ::boost::algorithm::trim(refP);
+    std::string age = srcStudy->getPatientAge();
+    ::boost::algorithm::trim(age);
+
+    // Study description comparison ommitted here
+    const bool same = study->getDate() == date
+        && study->getTime() == time
+        && study->getReferringPhysicianName() == refP
+        && study->getInstanceUID() == srcStudy->getInstanceUID()
+        && study->getPatientAge() == age;
+
+    ::fwData::String::sptr fieldNewStudy = srcStudy->getField< ::fwData::String>(s_NEW_STUDY_FIELD_NAME);
+    if(fieldNewStudy || !same)
+    {
+        study->setInstanceUID(::fwMedDataTools::generateStudyInstanceUid());
+    }
+
+    return study;
+}
+
+//-----------------------------------------------------------------------------
+
+void StudyEditor::onDateChanged(const QString& text)
+{
+    if(m_date->text().trimmed().isEmpty())
+    {
+        m_paletteDate.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_paletteDate.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_date->setPalette(m_paletteDate);
+}
+
+//-----------------------------------------------------------------------------
+
+void StudyEditor::onTimeChanged(const QString& text)
+{
+    if(m_time->text().trimmed().isEmpty())
+    {
+        m_paletteTime.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_paletteTime.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_time->setPalette(m_paletteTime);
+}
+
+//-----------------------------------------------------------------------------
+
+void StudyEditor::onDescChanged(const QString& text)
+{
+    if(m_description->text().trimmed().toStdString() == s_NEW_STUDY_TEXT)
+    {
+        m_paletteTime.setColor(QPalette::Base, QColor(Qt::red));
+    }
+    else
+    {
+        m_paletteTime.setColor(QPalette::Base, QColor(Qt::white));
+    }
+
+    m_description->setPalette(m_paletteTime);
+}
+
+//-----------------------------------------------------------------------------
+
+void StudyEditor::setSeries(SPTR(::fwMedData::Series) series)
+{
+    SLM_ASSERT("Given series is null", series);
+    m_series = series;
+
+    ::fwMedData::Study::sptr study = m_series->getStudy();
+    SLM_ASSERT("Given series study is null", study);
+
+    m_date->setText(QString::fromStdString(study->getDate()).trimmed());
+    m_time->setText(QString::fromStdString(study->getTime()).trimmed());
+    m_referringPhysicianName->setText(QString::fromStdString(study->getReferringPhysicianName()).trimmed());
+    m_description->setText(QString::fromStdString(study->getDescription()).trimmed());
+    m_patientAge->setText(QString::fromStdString(study->getPatientAge()).trimmed());
+
+    // force signal (manage empty text case)
+    this->onTimeChanged(m_time->text());
+    this->onDateChanged(m_date->text());
+
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace uiMedData
+
diff --git a/Bundles/LeafUI/uiPython/CMakeLists.txt b/Bundles/LeafUI/uiPython/CMakeLists.txt
new file mode 100644
index 0000000..13ec465
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/CMakeLists.txt
@@ -0,0 +1,11 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+    fwServices
+)
+
+fwReq(
+    binding
+    )
+
diff --git a/Bundles/LeafUI/uiPython/COPYING b/Bundles/LeafUI/uiPython/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiPython/COPYING.LESSER b/Bundles/LeafUI/uiPython/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiPython/Properties.cmake b/Bundles/LeafUI/uiPython/Properties.cmake
new file mode 100644
index 0000000..997baf5
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiPython )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwData fwGui fwPython fwRuntime fwServices )
+set( REQUIREMENTS binding )
+
diff --git a/Bundles/LeafUI/uiPython/bin/build.options b/Bundles/LeafUI/uiPython/bin/build.options
new file mode 100644
index 0000000..426b41b
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/bin/build.options
@@ -0,0 +1,7 @@
+TYPE     = 'bundle'
+VERSION  = '0-1'
+USE      = []
+LIB      = [ 'fwGui_0-1', 'fwPython_0-1' ]
+Bundle   = [ 'binding_0-1' ]
+
+
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/Namespace.hpp b/Bundles/LeafUI/uiPython/include/uiPython/Namespace.hpp
new file mode 100644
index 0000000..ac9144d
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIPYTHONNAMESPACE_HPP_
+#define UIPYTHONNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiPython contains the basic UI for fwPython
+ * @namespace   uiPython
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiPython
+{
+
+}
+#endif /* UIPYTHONNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/Plugin.hpp b/Bundles/LeafUI/uiPython/include/uiPython/Plugin.hpp
new file mode 100644
index 0000000..44b0bab
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/Plugin.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIPYTHON_PLUGIN_HPP_
+#define _UIPYTHON_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "uiPython/config.hpp"
+
+namespace uiPython
+{
+
+/**
+ * @brief   This class is called when the uiPython bundle is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009.
+ */
+
+class UIPYTHON_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public:
+
+     ///@brief  Destructor. Do nothing.
+    UIPYTHON_API virtual ~Plugin() throw();
+
+    /**
+     * @brief This method is used by runtime to initialize the bundle.
+     *
+     * @exception ::fwRuntime::RuntimeException.
+     *
+     * Register first basic services of type IAction, IEditor and IView.
+     * Secondly, verifies if the command line and profile.xml are well formed and starts the wxWidgets IHM.
+     */
+    UIPYTHON_API void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief This method is used by runtime to close the bundle. Do nothing.
+    */
+    UIPYTHON_API void stop() throw();
+
+};
+
+} // namespace uiPython
+
+#endif //_UIPYTHON_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/action/Namespace.hpp b/Bundles/LeafUI/uiPython/include/uiPython/action/Namespace.hpp
new file mode 100644
index 0000000..9586999
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/action/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIPYTHON_ACTION_NAMESPACE_HPP_
+#define _UIPYTHON_ACTION_NAMESPACE_HPP_
+
+namespace uiPython
+{
+/**
+ * @brief       The namespace uiPython::action contains basic services managing action.
+ * @namespace   uiPython::action
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace action
+{
+
+}
+}
+#endif /* UIPYTHONACTIONNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/action/StringRun.hpp b/Bundles/LeafUI/uiPython/include/uiPython/action/StringRun.hpp
new file mode 100644
index 0000000..e9da52b
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/action/StringRun.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIPYTHON_ACTION_QUITACTION_HPP_
+#define _UIPYTHON_ACTION_QUITACTION_HPP_
+
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiPython/config.hpp"
+
+namespace uiPython
+{
+namespace action
+{
+
+/**
+ * @brief   This action tries to close the window and reset root object.
+ * @class   StringRun
+ * 
+
+ * @date    2009-2010.
+ */
+class UIPYTHON_CLASS_API StringRun : public ::fwGui::IActionSrv
+{
+
+public :
+
+     fwCoreServiceClassDefinitionsMacro ( (StringRun)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    UIPYTHON_API StringRun() throw() ;
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    UIPYTHON_API virtual ~StringRun() throw() ;
+
+protected:
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    UIPYTHON_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which services must be started or stopped
+     */
+    UIPYTHON_API void configuring() throw( ::fwTools::Failed );
+
+    UIPYTHON_API virtual void starting() throw(::fwTools::Failed);
+
+    UIPYTHON_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method tries to close the window and reset root object.
+     */
+    UIPYTHON_API virtual void updating() throw(::fwTools::Failed);
+
+    /*
+     * @brief This method gives information about the class.
+     */
+    UIPYTHON_API virtual void info(std::ostream &_sstream ) ;
+
+};
+
+
+} // namespace action
+} // namespace uiPython
+
+
+#endif /*_UIPYTHON_ACTION_QUITACTION_HPP_*/
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/action/Test.hpp b/Bundles/LeafUI/uiPython/include/uiPython/action/Test.hpp
new file mode 100644
index 0000000..1720998
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/action/Test.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIPYTHON_ACTION_QUITACTION_HPP_
+#define _UIPYTHON_ACTION_QUITACTION_HPP_
+
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiPython/config.hpp"
+
+namespace uiPython
+{
+namespace action
+{
+
+/**
+ * @brief   This action tries to close the window and reset root object.
+ * @class   Test
+ * 
+
+ * @date    2009-2010.
+ */
+class UIPYTHON_CLASS_API Test : public ::fwGui::IActionSrv
+{
+
+public :
+
+     fwCoreServiceClassDefinitionsMacro ( (Test)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    UIPYTHON_API Test() throw() ;
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    UIPYTHON_API virtual ~Test() throw() ;
+
+protected:
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    UIPYTHON_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which services must be started or stopped
+     */
+    UIPYTHON_API void configuring() throw( ::fwTools::Failed );
+
+    UIPYTHON_API virtual void starting() throw(::fwTools::Failed);
+
+    UIPYTHON_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method tries to close the window and reset root object.
+     */
+    UIPYTHON_API virtual void updating() throw(::fwTools::Failed);
+
+    /*
+     * @brief This method gives information about the class.
+     */
+    UIPYTHON_API virtual void info(std::ostream &_sstream ) ;
+
+};
+
+
+} // namespace action
+} // namespace uiPython
+
+
+#endif /*_UIPYTHON_ACTION_QUITACTION_HPP_*/
diff --git a/Bundles/LeafUI/uiPython/include/uiPython/config.hpp b/Bundles/LeafUI/uiPython/include/uiPython/config.hpp
new file mode 100644
index 0000000..a698f6d
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/include/uiPython/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIPYTHON_CONFIG_HPP_
+#define _UIPYTHON_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef UIPYTHON_EXPORTS
+    #define UIPYTHON_API __declspec(dllexport)
+    #else
+    #define UIPYTHON_API __declspec(dllimport)
+    #endif
+
+    #define UIPYTHON_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIPYTHON_EXPORTS
+    #define UIPYTHON_API __attribute__ ((visibility("default")))
+    #define UIPYTHON_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIPYTHON_API __attribute__ ((visibility("hidden")))
+    #define UIPYTHON_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIPYTHON_API
+    #define UIPYTHON_CLASS_API
+
+#endif
+
+#endif // #ifndef _UIPYTHON_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiPython/rc/plugin.xml b/Bundles/LeafUI/uiPython/rc/plugin.xml
new file mode 100644
index 0000000..23aaaff
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/rc/plugin.xml
@@ -0,0 +1,24 @@
+<plugin class="::uiPython::Plugin" id="uiPython">
+
+    <library name="uiPython" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="binding" />
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiPython::action::Test</service>
+        <object>::fwData::Object</object>
+        <desc>exec python script print hello</desc>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiPython::action::StringRun</service>
+        <object>::fwData::String</object>
+        <desc>exec python script from the string</desc>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafUI/uiPython/src/uiPython/Plugin.cpp b/Bundles/LeafUI/uiPython/src/uiPython/Plugin.cpp
new file mode 100644
index 0000000..969fd2d
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/src/uiPython/Plugin.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "uiPython/Plugin.hpp"
+
+namespace uiPython
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiPython::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiPython
diff --git a/Bundles/LeafUI/uiPython/src/uiPython/action/StringRun.cpp b/Bundles/LeafUI/uiPython/src/uiPython/action/StringRun.cpp
new file mode 100644
index 0000000..db23ef4
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/src/uiPython/action/StringRun.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwPython/Interpreter.hpp>
+
+#include "uiPython/action/StringRun.hpp"
+
+namespace uiPython
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiPython::action::StringRun , ::fwData::String ) ;
+
+//-----------------------------------------------------------------------------
+
+StringRun::StringRun() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+StringRun::~StringRun() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::info(std::ostream &_sstream )
+{
+    _sstream << "StringRun Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void StringRun::updating() throw( ::fwTools::Failed )
+{
+    ::fwData::String::sptr str = this->getObject< ::fwData::String >();
+    ::fwPython::Interpreter python;
+    python.execute(str->value().c_str());
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
diff --git a/Bundles/LeafUI/uiPython/src/uiPython/action/Test.cpp b/Bundles/LeafUI/uiPython/src/uiPython/action/Test.cpp
new file mode 100644
index 0000000..a892da1
--- /dev/null
+++ b/Bundles/LeafUI/uiPython/src/uiPython/action/Test.cpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwPython/Interpreter.hpp>
+
+#include "uiPython/action/Test.hpp"
+
+namespace uiPython
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiPython::action::Test , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+Test::Test() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+Test::~Test() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Test::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void Test::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Test::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void Test::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void Test::info(std::ostream &_sstream )
+{
+    _sstream << "Test Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void Test::updating() throw( ::fwTools::Failed )
+{
+    ::fwPython::Interpreter python;
+    python.execute("print \"Hello fw4spl world\"");
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
diff --git a/Bundles/LeafUI/uiReconstructionQt/CMakeLists.txt b/Bundles/LeafUI/uiReconstructionQt/CMakeLists.txt
new file mode 100644
index 0000000..ced82d2
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/CMakeLists.txt
@@ -0,0 +1,23 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRuntime
+    fwTools
+    gui
+)
+
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/COPYING b/Bundles/LeafUI/uiReconstructionQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/COPYING.LESSER b/Bundles/LeafUI/uiReconstructionQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/Properties.cmake b/Bundles/LeafUI/uiReconstructionQt/Properties.cmake
new file mode 100644
index 0000000..95bcc67
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiReconstructionQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGuiQt fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/bin/build.options b/Bundles/LeafUI/uiReconstructionQt/bin/build.options
new file mode 100644
index 0000000..6a0d6d9
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/bin/build.options
@@ -0,0 +1,16 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwRuntime_0-3',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwGuiQt_0-1'
+          ]
+USE     = ['qtCore','boost']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Namespace.hpp b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Namespace.hpp
new file mode 100644
index 0000000..4fb8185
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIRECONSTRUCTIONQTNAMESPACE_HPP_
+#define UIRECONSTRUCTIONQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiReconstruction contains several editors using Qt related on reconstruction. This namespace is included in uiReconstructionQt bundle.
+ * @namespace   uiReconstruction
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiReconstruction
+{
+}
+#endif /* UIRECONSTRUCTIONQTNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/OrganMaterialEditor.hpp b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/OrganMaterialEditor.hpp
new file mode 100644
index 0000000..ec74e3f
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/OrganMaterialEditor.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIRECONSTRUCTIONQT_ORGAN_MATERIAL_EDITOR_HPP_
+#define _UIRECONSTRUCTIONQT_ORGAN_MATERIAL_EDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiReconstructionQt/config.hpp"
+
+class QSlider;
+class QPushButton;
+class QLabel;
+
+namespace uiReconstruction
+{
+/**
+ * @brief   OrganMaterialEditor service.
+ * @class   OrganMaterialEditor
+ * 
+ * @date    2010.
+ */
+class UIRECONSTRUCTIONQT_CLASS_API OrganMaterialEditor : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (OrganMaterialEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIRECONSTRUCTIONQT_API OrganMaterialEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIRECONSTRUCTIONQT_API virtual ~OrganMaterialEditor() throw() ;
+
+protected:
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    ///This method launches the IEditor::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IEditor::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations ( overrides )
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void swapping() throw(::fwTools::Failed);
+
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+    void refreshMaterial( );
+    void materialNotification( );
+
+protected Q_SLOTS:
+
+    void onOpacitySlider( int value);
+    void onColorButton();
+
+private:
+
+    QPointer<QPushButton> m_colourButton ;
+    QPointer<QSlider> m_opacitySlider ;
+    QPointer<QLabel> m_transparencyValue;
+};
+
+} // uiReconstruction
+
+#endif /*_UIRECONSTRUCTIONQT_ORGAN_MATERIAL_EDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Plugin.hpp b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Plugin.hpp
new file mode 100644
index 0000000..6f93b3d
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/Plugin.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIRECONSTRUCTIONQT_PLUGIN_HPP_
+#define _UIRECONSTRUCTIONQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiReconstruction
+{
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiReconstruction
+
+#endif //_UIRECONSTRUCTIONQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/RepresentationEditor.hpp b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/RepresentationEditor.hpp
new file mode 100644
index 0000000..7a1f39d
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/RepresentationEditor.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIRECONSTRUCTIONQT_REPRESENTATION_EDITOR_HPP_
+#define _UIRECONSTRUCTIONQT_REPRESENTATION_EDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+#include <fwData/Material.hpp>
+
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiReconstructionQt/config.hpp"
+
+class QRadioButton;
+class QCheckBox;
+class QButtonGroup;
+class QAbstractButton;
+
+namespace uiReconstruction
+{
+
+/**
+ * @brief   RepresentationEditor service.
+ * @class   RepresentationEditor
+ * 
+ * @date    2010.
+ */
+class UIRECONSTRUCTIONQT_CLASS_API RepresentationEditor : public  QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (RepresentationEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIRECONSTRUCTIONQT_API RepresentationEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIRECONSTRUCTIONQT_API virtual ~RepresentationEditor() throw() ;
+
+protected:
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    ///This method launches the IEditor::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IEditor::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations ( overrides )
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+    virtual void swapping() throw(::fwTools::Failed);
+
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+    void notifyMaterial();
+    void notifyMesh();
+
+protected Q_SLOTS:
+
+    void onChangeRepresentation( int id );
+    void onChangeShading( int id );
+    void onShowNormals(int state );
+
+
+private:
+
+    void refreshNormals();
+    void refreshRepresentation() ;
+    void refreshShading() ;
+
+    QPointer<QButtonGroup> m_buttonGroup;
+    QPointer<QButtonGroup> m_buttonGroupShading;
+    QPointer<QButtonGroup> m_normalsRadioBox ;
+
+    ::fwData::Material::sptr m_material ;
+
+};
+
+} // uiReconstruction
+
+#endif /*_UIRECONSTRUCTIONQT_REPRESENTATION_EDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/config.hpp b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/config.hpp
new file mode 100644
index 0000000..e4b2717
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/include/uiReconstructionQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIRECONSTRUCTIONQT_CONFIG_HPP_
+#define _UIRECONSTRUCTIONQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIRECONSTRUCTIONQT_EXPORTS
+    #define UIRECONSTRUCTIONQT_API __declspec(dllexport)
+    #else
+    #define UIRECONSTRUCTIONQT_API __declspec(dllimport)
+    #endif
+
+    #define UIRECONSTRUCTIONQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIRECONSTRUCTIONQT_EXPORTS
+    #define UIRECONSTRUCTIONQT_API __attribute__ ((visibility("default")))
+    #define UIRECONSTRUCTIONQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIRECONSTRUCTIONQT_API __attribute__ ((visibility("hidden")))
+    #define UIRECONSTRUCTIONQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIRECONSTRUCTIONQT_API
+    #define UIRECONSTRUCTIONQT_CLASS_API
+
+#endif
+
+#endif //_UIRECONSTRUCTIONQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiReconstructionQt/rc/plugin.xml b/Bundles/LeafUI/uiReconstructionQt/rc/plugin.xml
new file mode 100644
index 0000000..39102cb
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/rc/plugin.xml
@@ -0,0 +1,22 @@
+<plugin id="uiReconstructionQt" class="::uiReconstruction::Plugin">
+    <library name="uiReconstructionQt"/>
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiReconstruction::RepresentationEditor</service>
+        <object>::fwData::Reconstruction</object>
+    </extension>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiReconstruction::OrganMaterialEditor</service>
+        <object>::fwData::Reconstruction</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/OrganMaterialEditor.cpp b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/OrganMaterialEditor.cpp
new file mode 100644
index 0000000..eadba12
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/OrganMaterialEditor.cpp
@@ -0,0 +1,241 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QColor>
+#include <QColorDialog>
+#include <QPushButton>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QSlider>
+#include <QPixmap>
+#include <QStyle>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwComEd/MaterialMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiReconstructionQt/OrganMaterialEditor.hpp"
+
+namespace uiReconstruction
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiReconstruction::OrganMaterialEditor , ::fwData::Reconstruction ) ;
+
+
+OrganMaterialEditor::OrganMaterialEditor() throw()
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+OrganMaterialEditor::~OrganMaterialEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_colourButton = new QPushButton(tr("Color"), container) ;
+    m_colourButton->setToolTip(tr("Selected organ's color"));
+    m_colourButton->setMinimumSize (m_colourButton->sizeHint());
+//    m_colourButton->setMinimumSize (120,35);
+
+    QLabel* transparencyLabel = new QLabel(tr("Transparency : "), container);
+    m_opacitySlider = new QSlider( Qt::Horizontal, container) ;
+    m_opacitySlider->setToolTip(tr("Selected organ's opacity"));
+    m_opacitySlider->setRange(0,100);
+    m_opacitySlider->setTickInterval(20);
+    m_opacitySlider->setTickPosition(QSlider::TicksBelow);
+    m_opacitySlider->setMinimumSize (m_opacitySlider->sizeHint());
+
+    m_transparencyValue = new QLabel("", container);
+    m_transparencyValue->setMinimumSize (m_transparencyValue->sizeHint());
+
+    QVBoxLayout* layout = new QVBoxLayout(container);
+    layout->addWidget( m_colourButton, 0 ) ;
+
+    QHBoxLayout* transparencyLayout= new QHBoxLayout( container );
+    transparencyLayout->addWidget( transparencyLabel, 0) ;
+    transparencyLayout->addWidget( m_opacitySlider, 1 );
+    transparencyLayout->addWidget( m_transparencyValue, 0) ;
+    layout->addLayout( transparencyLayout, 0) ;
+
+    container->setLayout( layout );
+    container->setEnabled(false);
+
+    QObject::connect(m_opacitySlider, SIGNAL(valueChanged( int )), this, SLOT(onOpacitySlider( int )));
+    QObject::connect(m_colourButton, SIGNAL(clicked ()), this, SLOT(onColorButton( )));
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_opacitySlider, SIGNAL(valueChanged( int )), this, SLOT(onOpacitySlider( int )));
+    QObject::disconnect(m_colourButton, SIGNAL(clicked ()), this, SLOT(onColorButton( )));
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::updating() throw(::fwTools::Failed)
+{
+    this->refreshMaterial();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::onColorButton()
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    SLM_ASSERT("No Reconstruction!", reconstruction);
+
+    ::fwData::Material::sptr material = reconstruction->getMaterial() ;
+    int red = material->ambient()->red()*255;
+    int green = material->ambient()->green()*255;
+    int blue = material->ambient()->blue()*255;
+
+    // Create Color choice dialog.
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QColor oldColor(red, green, blue);
+    QColor color = QColorDialog::getColor(oldColor, container);
+    if(color.isValid())
+    {
+        material->ambient()->red() = color.redF();
+        material->ambient()->green() = color.greenF();
+        material->ambient()->blue() = color.blueF();
+        this->materialNotification();
+        refreshMaterial();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::onOpacitySlider(int value )
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    SLM_ASSERT("No Reconstruction!", reconstruction);
+
+    ::fwData::Material::sptr material = reconstruction->getMaterial() ;
+    material->ambient()->alpha() = value/100.0;
+    std::stringstream ss;
+    ss << value << "%";
+    m_transparencyValue->setText(QString::fromStdString(ss.str()));
+
+    this->materialNotification();
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::refreshMaterial( )
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    SLM_ASSERT("No Reconstruction!", reconstruction);
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    container->setEnabled(!reconstruction->getOrganName().empty());
+
+    ::fwData::Material::sptr material = reconstruction->getMaterial() ;
+    QColor materialColor = QColor (
+                material->ambient()->red()*255,
+                material->ambient()->green()*255,
+                material->ambient()->blue()*255,
+                material->ambient()->alpha()*255
+                );
+
+    int iconSize = m_colourButton->style()->pixelMetric(QStyle::PM_LargeIconSize);
+    QPixmap pix(iconSize, iconSize);
+    pix.fill(materialColor);
+
+    m_colourButton->setIcon(QIcon(pix));
+
+    int a = material->ambient()->alpha()*100;
+    m_opacitySlider->setValue( a ) ;
+    std::stringstream ss;
+    ss << a << "%";
+    m_transparencyValue->setText(QString::fromStdString(ss.str()));
+}
+
+//------------------------------------------------------------------------------
+
+void OrganMaterialEditor::materialNotification( )
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    SLM_ASSERT("No Reconstruction!", reconstruction);
+
+    ::fwComEd::MaterialMsg::sptr msg = ::fwComEd::MaterialMsg::New();
+    msg->addEvent( ::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), reconstruction->getMaterial(), msg);
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/Plugin.cpp b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/Plugin.cpp
new file mode 100644
index 0000000..0de8e96
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/Plugin.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiReconstructionQt/Plugin.hpp"
+
+namespace uiReconstruction
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiReconstruction::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiReconstruction
diff --git a/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/RepresentationEditor.cpp b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/RepresentationEditor.cpp
new file mode 100644
index 0000000..146a552
--- /dev/null
+++ b/Bundles/LeafUI/uiReconstructionQt/src/uiReconstructionQt/RepresentationEditor.cpp
@@ -0,0 +1,407 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QAbstractButton>
+#include <QRadioButton>
+#include <QVBoxLayout>
+#include <QGroupBox>
+#include <QButtonGroup>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwComEd/MaterialMsg.hpp>
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiReconstructionQt/RepresentationEditor.hpp"
+
+namespace uiReconstruction
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiReconstruction::RepresentationEditor , ::fwData::Reconstruction ) ;
+
+
+RepresentationEditor::RepresentationEditor() throw()
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+RepresentationEditor::~RepresentationEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QVBoxLayout * layout = new QVBoxLayout(container);
+
+    QGroupBox *groupBox =new QGroupBox(tr("Representation"), container);
+    QVBoxLayout * layoutGroupBox = new QVBoxLayout(groupBox);
+    groupBox->setLayout(layoutGroupBox);
+
+    m_buttonGroup = new QButtonGroup(groupBox);
+
+    QRadioButton *buttonSurface = new QRadioButton ( tr("Surface"), groupBox );
+    buttonSurface->setMinimumSize(buttonSurface->sizeHint());
+    m_buttonGroup->addButton(buttonSurface, 0);
+    layoutGroupBox->addWidget(buttonSurface);
+    buttonSurface->setChecked(true);
+
+    QRadioButton *buttonPoint = new QRadioButton ( tr("Point"), groupBox );
+    buttonPoint->setMinimumSize(buttonPoint->sizeHint());
+    m_buttonGroup->addButton(buttonPoint, 1);
+    layoutGroupBox->addWidget(buttonPoint);
+
+    QRadioButton *buttonWireframe = new QRadioButton ( tr("Wireframe"), groupBox );
+    buttonWireframe->setMinimumSize(buttonWireframe->sizeHint());
+    m_buttonGroup->addButton(buttonWireframe, 2);
+    layoutGroupBox->addWidget(buttonWireframe);
+
+    QRadioButton *buttonEdge = new QRadioButton ( tr("Edge"), groupBox );
+    buttonEdge->setMinimumSize(buttonEdge->sizeHint());
+    m_buttonGroup->addButton(buttonEdge, 3);
+    layoutGroupBox->addWidget(buttonEdge);
+
+    // Shading group box
+    QGroupBox *groupBoxShading =new QGroupBox(tr("Shading"), container);
+    QVBoxLayout * layoutGroupBoxShading = new QVBoxLayout(groupBoxShading);
+    groupBoxShading->setLayout(layoutGroupBoxShading);
+    m_buttonGroupShading = new QButtonGroup(groupBoxShading);
+
+    QRadioButton *buttonFlat = new QRadioButton ( tr("Flat"), groupBoxShading );
+    buttonFlat->setMinimumSize(buttonFlat->sizeHint());
+    m_buttonGroupShading->addButton(buttonFlat, 0);
+    layoutGroupBoxShading->addWidget(buttonFlat);
+    buttonFlat->setChecked(true);
+
+    QRadioButton *buttonGouraud = new QRadioButton ( tr("Gouraud"), groupBoxShading );
+    buttonGouraud->setMinimumSize(buttonGouraud->sizeHint());
+    m_buttonGroupShading->addButton(buttonGouraud, 1);
+    layoutGroupBoxShading->addWidget(buttonGouraud);
+
+    QRadioButton *buttonPhong = new QRadioButton ( tr("Phong"), groupBoxShading );
+    buttonPhong->setMinimumSize(buttonPhong->sizeHint());
+    m_buttonGroupShading->addButton(buttonPhong, 2);
+    layoutGroupBoxShading->addWidget(buttonPhong);
+
+    layout->addWidget( groupBox);
+    layout->addWidget( groupBoxShading);
+
+#ifdef _DEBUG
+    QGroupBox *groupBoxNormals =new QGroupBox(tr("Normals"), container);
+    QVBoxLayout * layoutGroupBoxNormals = new QVBoxLayout(groupBoxNormals);
+    m_normalsRadioBox = new QButtonGroup(container);
+    QRadioButton* pointNormalsButton = new QRadioButton(tr("Show point normals"), container);
+    QRadioButton* cellNormalsButton = new QRadioButton(tr("Show cell normals"), container);
+    QRadioButton* hideNormalsButton = new QRadioButton(tr("Hide normals"), container);
+
+    m_normalsRadioBox->addButton(pointNormalsButton, 2);
+    m_normalsRadioBox->addButton(cellNormalsButton, 1);
+    m_normalsRadioBox->addButton(hideNormalsButton, 0);
+
+    layoutGroupBoxNormals->addWidget( pointNormalsButton);
+    layoutGroupBoxNormals->addWidget( cellNormalsButton);
+    layoutGroupBoxNormals->addWidget( hideNormalsButton);
+
+    layout->addWidget(groupBoxNormals);
+
+    QObject::connect(m_normalsRadioBox, SIGNAL(buttonClicked(int)), this, SLOT(onShowNormals(int)));
+
+#endif
+
+    container->setLayout( layout );
+    container->setEnabled(false);
+
+    QObject::connect(m_buttonGroup, SIGNAL(buttonClicked ( int )), this, SLOT(onChangeRepresentation( int )));
+    QObject::connect(m_buttonGroupShading, SIGNAL(buttonClicked ( int )), this, SLOT(onChangeShading( int )));
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_buttonGroup, SIGNAL(buttonClicked ( QAbstractButton *)), this, SLOT(onChangeRepresentation(QAbstractButton *)));
+    QObject::disconnect(m_buttonGroupShading, SIGNAL(buttonClicked ( QAbstractButton *)), this, SLOT(onChangeShading(QAbstractButton *)));
+
+#ifdef _DEBUG
+    QObject::connect(m_normalsRadioBox, SIGNAL(buttonClicked(int)), this, SLOT(onShowNormals(int)));
+#endif
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    SLM_ASSERT("No Reconstruction!", reconstruction);
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    m_material = reconstruction->getMaterial() ;
+    container->setEnabled(!reconstruction->getOrganName().empty());
+
+    this->refreshRepresentation();
+    this->refreshNormals();
+    this->refreshShading() ;
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::onChangeRepresentation( int id )
+{
+
+    ::fwData::Material::REPRESENTATION_MODE selectedMode = ::fwData::Material::MODE_SURFACE;
+
+    switch(id)
+    {
+        case 0 :
+        {
+            selectedMode = ::fwData::Material::MODE_SURFACE;
+            break ;
+        }
+        case 1 :
+        {
+            selectedMode = ::fwData::Material::MODE_POINT;
+            break ;
+        }
+        case 2 :
+        {
+            selectedMode = ::fwData::Material::MODE_WIREFRAME;
+            break ;
+        }
+        case 3 :
+        {
+            selectedMode = ::fwData::Material::MODE_EDGE;
+            break ;
+        }
+    }
+
+    m_material->setRepresentationMode( selectedMode );
+    this->notifyMaterial();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::onChangeShading(  int id )
+{
+    ::fwData::Material::SHADING_MODE selectedMode = ::fwData::Material::MODE_PHONG;
+
+    switch(id)
+    {
+        case 0 :
+        {
+            selectedMode = ::fwData::Material::MODE_FLAT;
+            break ;
+        }
+        case 1 :
+        {
+            selectedMode = ::fwData::Material::MODE_GOURAUD;
+            break ;
+        }
+        case 2 :
+        {
+            selectedMode = ::fwData::Material::MODE_PHONG;
+            break ;
+        }
+    }
+
+    m_material->setShadingMode( selectedMode );
+    this->notifyMaterial();
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::refreshRepresentation()
+{
+    int representationMode = m_material->getRepresentationMode();
+    QAbstractButton * button;
+
+    switch(representationMode)
+    {
+    case ::fwData::Material::MODE_SURFACE:
+    {
+        button = m_buttonGroup->button(0);
+        button->setChecked(true);
+        break ;
+    }
+    case ::fwData::Material::MODE_POINT:
+    {
+        button = m_buttonGroup->button(1);
+        button->setChecked(true);
+        break ;
+    }
+    case ::fwData::Material::MODE_WIREFRAME:
+    {
+        button= m_buttonGroup->button(2);
+        button->setChecked(true);
+        break ;
+    }
+    case ::fwData::Material::MODE_EDGE:
+    {
+        button = m_buttonGroup->button(3);
+        button->setChecked(true);
+        break ;
+    }
+    default :
+        button = m_buttonGroup->button(0);
+        button->setChecked(true);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::refreshShading()
+{
+    int shadingMode = m_material->getShadingMode();
+    QAbstractButton * button;
+
+    switch(shadingMode)
+    {
+    case ::fwData::Material::MODE_FLAT:
+    {
+        button = m_buttonGroupShading->button(0);
+        button->setChecked(true);
+        break ;
+    }
+    case ::fwData::Material::MODE_GOURAUD:
+    {
+        button = m_buttonGroupShading->button(1);
+        button->setChecked(true);
+        break ;
+    }
+    case ::fwData::Material::MODE_PHONG:
+    {
+        button = m_buttonGroupShading->button(2);
+        button->setChecked(true);
+        break ;
+    }
+    default :
+        button = m_buttonGroupShading->button(2);
+        button->setChecked(true);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::refreshNormals()
+{
+#ifdef _DEBUG
+    QAbstractButton *buttonHide = m_normalsRadioBox->button(0);
+    buttonHide->setChecked(m_material->getOptionsMode() == ::fwData::Material::MODE_STANDARD);
+    QAbstractButton *buttonNormals = m_normalsRadioBox->button(1);
+    buttonNormals->setChecked(m_material->getOptionsMode() == ::fwData::Material::MODE_NORMALS);
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::onShowNormals(int state )
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+    ::fwComEd::MeshMsg::sptr meshMsg = ::fwComEd::MeshMsg::New();
+    switch (state)
+    {
+        case 0:
+            m_material->setOptionsMode( ::fwData::Material::MODE_STANDARD );
+            meshMsg->addEvent("HIDE_NORMALS");
+            break;
+        case 1:
+            m_material->setOptionsMode( ::fwData::Material::MODE_NORMALS );
+            meshMsg->addEvent("SHOW_CELL_NORMALS");
+            break;
+        case 2:
+            m_material->setOptionsMode( ::fwData::Material::MODE_NORMALS );
+            meshMsg->addEvent("SHOW_POINT_NORMALS");
+            break;
+    }
+    ::fwComEd::MaterialMsg::sptr msg = ::fwComEd::MaterialMsg::New();
+    msg->addEvent( ::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), reconstruction->getMesh(), msg);
+    ::fwServices::IEditionService::notify(this->getSptr(), reconstruction->getMesh(), meshMsg);
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::notifyMaterial()
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+
+    ::fwComEd::MaterialMsg::sptr msg = ::fwComEd::MaterialMsg::New();
+    msg->addEvent( ::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), reconstruction->getMaterial(), msg);
+}
+
+//------------------------------------------------------------------------------
+
+void RepresentationEditor::notifyMesh()
+{
+    ::fwData::Reconstruction::sptr reconstruction = this->getObject< ::fwData::Reconstruction>();
+
+    ::fwComEd::MaterialMsg::sptr msg = ::fwComEd::MaterialMsg::New();
+    msg->addEvent( ::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), reconstruction->getMesh(), msg);
+}
+}
+
diff --git a/Bundles/LeafUI/uiTF/CMakeLists.txt b/Bundles/LeafUI/uiTF/CMakeLists.txt
new file mode 100644
index 0000000..8f78fdf
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/CMakeLists.txt
@@ -0,0 +1,26 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRuntime
+
+    gui
+)
+
+
+
+find_package(Boost COMPONENTS filesystem REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(
+    ${Boost_LIBRARIES}
+    ${QT_LIBRARIES}
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiTF/Properties.cmake b/Bundles/LeafUI/uiTF/Properties.cmake
new file mode 100644
index 0000000..7229012
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiTF )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwGuiQt fwRuntime fwServices gui io )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiTF/bin/build.options b/Bundles/LeafUI/uiTF/bin/build.options
new file mode 100644
index 0000000..a211fe3
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/bin/build.options
@@ -0,0 +1,6 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['qtCore', 'boostFilesystem' ]
+LIB = ['fwData_0-1', 'fwGui_0-1','fwGuiQt_0-1', 'fwComEd_0-1']
+BUNDLES = ['gui_0-1', 'io_0-1']
+REQUIREMENTS = ['ioAtoms_0-1']
diff --git a/Bundles/LeafUI/uiTF/include/uiTF/Plugin.hpp b/Bundles/LeafUI/uiTF/include/uiTF/Plugin.hpp
new file mode 100644
index 0000000..3462dd4
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/include/uiTF/Plugin.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UITF_PLUGIN_HPP_
+#define _UITF_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "uiTF/export.hpp"
+
+namespace uiTF
+{
+/**
+ * 
+ * @date    2009-2010.
+ */
+class UITF_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public:
+
+    /**
+     * @brief   destructor
+     */
+ UITF_API ~Plugin() throw();
+
+    // Overrides
+    UITF_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    UITF_API void stop() throw();
+
+};
+
+} // namespace uiTF
+
+#endif //_P_
diff --git a/Bundles/LeafUI/uiTF/include/uiTF/TransferFunctionEditor.hpp b/Bundles/LeafUI/uiTF/include/uiTF/TransferFunctionEditor.hpp
new file mode 100644
index 0000000..1de94d7
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/include/uiTF/TransferFunctionEditor.hpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UITF_TRANSFERFUNCTIONEDITOR_HPP_
+#define _UITF_TRANSFERFUNCTIONEDITOR_HPP_
+
+#include <QObject>
+
+#include <fwData/Composite.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "export.hpp"
+
+class QComboBox;
+class QPushButton;
+class QIcon;
+
+namespace uiTF
+{
+
+/**
+ * @brief   TransferFunctionEditor service.
+ * @class   TransferFunctionEditor
+ * 
+ * @date    2011.
+ */
+class UITF_CLASS_API TransferFunctionEditor : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (TransferFunctionEditor)(::gui::editor::IEditor) ) ;
+
+    /// Basic constructor, do nothing.
+    UITF_API TransferFunctionEditor();
+
+    /// Basic destructor, do nothing.
+    UITF_API virtual ~TransferFunctionEditor() throw ();
+
+protected:
+
+    /**
+    * @brief Configuring the transfer function editor.
+    *
+    * Example of configuration
+    * @verbatim
+    <service uid="GENERIC_UID_tfm" type="::gui::editor::IEditor" impl="::uiTF::TransferFunctionEditor" autoConnect="yes" >
+        <config selectedTFKey="SelectedTF" tfSelectionFwID="TFSelections" />
+    </service>
+    @endverbatim
+    * - \<image id="myImage" /\> : Set the link between the service and the associated image.
+    *
+    * \b id : mandatory (no default value) : set the id of the associated image.
+    */
+    UITF_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /// Start the TransferFunctionEditor, create Container, place in Buttons, ComboBox, Layout, and connect them.
+    UITF_API virtual void starting() throw( ::fwTools::Failed );
+
+    /// Update the TransferFunctionEditor, do nothing.
+    UITF_API virtual void updating() throw( ::fwTools::Failed );
+
+    /// Update the TransferFunctionEditor when message, do nothing.
+    UITF_API virtual void receiving(::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed );
+
+    /// Stop the TransferFunctionEditor, disconnect Buttons and Combo Box, delete them and clean the container.
+    UITF_API virtual void stopping() throw( ::fwTools::Failed );
+
+    /// Initialize the transfer functions, get fields m_transferFunctionCompositeId and m_transferFunctionId associated to the related image, add their names to the ComboBox. If the image does not contain any TF, the create a few from the ressources of the Bundle.
+    UITF_API void initTransferFunctions();
+
+    /// Check if the image contain the specified TF.
+    UITF_API bool hasTransferFunctionName(const std::string & _sName);
+
+    /// Create a string that represents a TF name not already present in the image. For example, if blabla is already used, it will return blabla_1.
+    UITF_API std::string createTransferFunctionName( const std::string & _sBasename );
+
+    /// Update the image with the selected TF in the ComboBox.
+    UITF_API void updateTransferFunction();
+
+    /// Update the TF preset from the TF pool
+    UITF_API void updateTransferFunctionPreset();
+
+    /// Get the current transfer function pool
+    UITF_API ::fwData::Composite::sptr getTFSelection() const;
+
+    /// Get the current transfer function
+    UITF_API ::fwData::TransferFunction::sptr getSelectedTransferFunction() const;
+
+private Q_SLOTS:
+
+    void deleteTF();
+    void newTF();
+    void reinitializeTFPool();
+    void renameTF();
+    void importTF();
+    void exportTF();
+    void presetChoice(int index);
+
+private:
+
+    QComboBox *m_pTransferFunctionPreset;
+    QPushButton *m_deleteButton;
+    QPushButton *m_newButton;
+    QPushButton *m_reinitializeButton;
+    QPushButton *m_renameButton;
+    QPushButton *m_importButton;
+    QPushButton *m_exportButton;
+    QWidget* m_container;
+
+    /// fwID of tf selection ( used during configuration )
+    std::string m_tfSelectionFwID;
+
+    /// Identifier of the key containing the current selection of TransferFunction in TFSelection.
+    std::string m_selectedTFKey;
+};
+
+}
+#endif
diff --git a/Bundles/LeafUI/uiTF/include/uiTF/export.hpp b/Bundles/LeafUI/uiTF/include/uiTF/export.hpp
new file mode 100644
index 0000000..0d0c66f
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/include/uiTF/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UITF_CONFIG_HPP_
+#define _UITF_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef UITF_EXPORTS
+    #define UITF_API __declspec(dllexport)
+    #else
+    #define UITF_API __declspec(dllimport)
+    #endif
+
+    #define UITF_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UITF_EXPORTS
+    #define UITF_API __attribute__ ((visibility("default")))
+    #define UITF_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UITF_API __attribute__ ((visibility("hidden")))
+    #define UITF_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UITF_API
+    #define UITF_CLASS_API
+
+#endif
+
+#endif // #ifndef _MYCOMPONENT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiTF/rc/plugin.xml b/Bundles/LeafUI/uiTF/rc/plugin.xml
new file mode 100644
index 0000000..3f3709b
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/plugin.xml
@@ -0,0 +1,17 @@
+<plugin id="uiTF" class="::uiTF::Plugin">
+    <library name="uiTF" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+
+    <requirement id="gui" />
+    <requirement id="io" />
+    <requirement id="ioAtoms" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiTF::TransferFunctionEditor</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Bones-U16.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Bones-U16.json
new file mode 100644
index 0000000..f11d41d
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Bones-U16.json
@@ -0,0 +1,132 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "8ba11417-6451-4bc2-832a-fd6025347774"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "1262"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Bones-U16"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "1184",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "1191",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.30991700291633606;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "1247",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0.72548997402191162;0.59504097700119019;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "1341",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.79178899526596069;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "157"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Bones.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Bones.json
new file mode 100644
index 0000000..f343171
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Bones.json
@@ -0,0 +1,132 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "7a073147-d8e7-47fb-bb4d-d1b083d61925"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "262"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Bones"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "184",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "191",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.30991700291633606;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "247",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0.72548997402191162;0.59504097700119019;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "341",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.79178899526596069;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "157"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-2.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-2.json
new file mode 100644
index 0000000..cead6a5
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-2.json
@@ -0,0 +1,176 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "0089ccd1-740a-4466-a2cd-5840f3c88b25"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "222"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Liver-2"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "102",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.35294100642204285;0.27450999617576599;0.12999999523162842;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "171",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.77647101879119873;1;1;0.18208999931812286;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "221",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.88627499341964722;0.74901998043060303;0.49803900718688965;0.54925400018692017;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "283",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.6328359842300415;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "327",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0.76862698793411255;0.9134330153465271;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "394",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "50",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_7":
+                    {
+                        "key": "82",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "344"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-U16.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-U16.json
new file mode 100644
index 0000000..a6690c6
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver-U16.json
@@ -0,0 +1,165 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "4ed8b7c7-9eec-4bf0-b942-1334bd8d4d24"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "1138"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Liver-U16"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "1050",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0.086274497210979462;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "1100",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.28235301375389099;0.28235301375389099;0.20000000298023224;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "1150",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.40000000596046448;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "1200",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.60000002384185791;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "1250",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.80000001192092896;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "1300",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "977",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "323"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Liver.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver.json
new file mode 100644
index 0000000..31f105d
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Liver.json
@@ -0,0 +1,165 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "84cfa107-9ce9-4ca4-ae29-3ec6c08c0543"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "138"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Liver"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "-23",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "100",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.28235301375389099;0.28235301375389099;0.20000000298023224;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "150",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.40000000596046448;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "200",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.60000002384185791;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "250",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.80000001192092896;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "300",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "50",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0.086274497210979462;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "323"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs-U16.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs-U16.json
new file mode 100644
index 0000000..e7fe096
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs-U16.json
@@ -0,0 +1,143 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "b40a1f1c-6be2-486a-b229-f847e5292945"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "375"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Lungs-U16"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "100",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9882349967956543;0.83921599388122559;0.63529402017593384;0.60000002384185791;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "200",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9803919792175293;0.67843097448348999;0.27058801054954529;0.5;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "400",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.28623199462890625;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "50",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "700",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "650"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs.json
new file mode 100644
index 0000000..e123e14
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Lungs.json
@@ -0,0 +1,143 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "548a6534-45ef-44ee-b572-48e8580855d7"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "-625"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Lungs"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "-300",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "-600",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.28623199462890625;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "-800",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9803919792175293;0.67843097448348999;0.27058801054954529;0.5;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "-900",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9882349967956543;0.83921599388122559;0.63529402017593384;0.60000002384185791;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "-950",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "650"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles-U16.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles-U16.json
new file mode 100644
index 0000000..191aae2
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles-U16.json
@@ -0,0 +1,220 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "b12123aa-301e-4c66-9db3-9af1b77090a9"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "1073"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Muscles-U16"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "1005",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.43921598792076111;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "1006",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.47058799862861633;0;0;0.20527899265289307;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "1041",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.24666699767112732;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "1074",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.62352901697158813;0.21960799396038055;0.16078400611877441;0.41333299875259399;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "1110",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.35294100642204285;0.27450999617576599;0.53666698932647705;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "1144",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0;0;0.65333300828933716;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "1184",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.72333300113677979;"
+                            }
+                        }
+                    },
+                    "item_7":
+                    {
+                        "key": "1246",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.89333301782608032;"
+                            }
+                        }
+                    },
+                    "item_8":
+                    {
+                        "key": "900",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0;"
+                            }
+                        }
+                    },
+                    "item_9":
+                    {
+                        "key": "947",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_10":
+                    {
+                        "key": "994",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.25097998976707458;0;0;0.17595300078392029;"
+                            }
+                        }
+                    },
+                    "item_11":
+                    {
+                        "key": "995",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.37647101283073425;0;0;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "346"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles.json
new file mode 100644
index 0000000..c6b592d
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Muscles.json
@@ -0,0 +1,154 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "9b3ab52a-bb4f-4f24-ad35-b777a93322a5"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "96.5"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Muscles"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "-53",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "110",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.35294100642204285;0.27450999617576599;0.53666698932647705;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "184",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.72333300113677979;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "246",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.89333301782608032;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "6",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.47058799862861633;0;0;0.20527899265289307;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "74",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.62352901697158813;0.21960799396038055;0.16078400611877441;0.41333299875259399;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "299"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Skin-U16.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Skin-U16.json
new file mode 100644
index 0000000..bfe373c
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Skin-U16.json
@@ -0,0 +1,242 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "9f7f870a-560a-49de-ae7a-825aa784d113"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "741"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Skin-U16"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "1001",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "1036",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.18778300285339355;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "1076",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.61960798501968384;0.22745099663734436;0.1568630039691925;0.39592799544334412;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "1120",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.34902000427246094;0.27450999617576599;0.55656099319458008;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "1177",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0;0;0.71040701866149902;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "1221",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.79637998342514038;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "1320",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.87556600570678711;"
+                            }
+                        }
+                    },
+                    "item_7":
+                    {
+                        "key": "163",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_8":
+                    {
+                        "key": "302",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.81176501512527466;0.72548997402191162;0.20362000167369843;"
+                            }
+                        }
+                    },
+                    "item_9":
+                    {
+                        "key": "442",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9803919792175293;0.67843097448348999;0.27058801054954529;0.24886900186538696;"
+                            }
+                        }
+                    },
+                    "item_10":
+                    {
+                        "key": "612",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.23755699396133423;"
+                            }
+                        }
+                    },
+                    "item_11":
+                    {
+                        "key": "777",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_12":
+                    {
+                        "key": "872",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.7098039984703064;0.41568601131439209;0.27149298787117004;"
+                            }
+                        }
+                    },
+                    "item_13":
+                    {
+                        "key": "908",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.25097998976707458;0.30316698551177979;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "1157"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Skin.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Skin.json
new file mode 100644
index 0000000..7cb83e0
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Skin.json
@@ -0,0 +1,231 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "6cdf0093-eff5-4e64-a8aa-f62bf0e348b3"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "-327.802"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Skin"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "-297.30700000000002",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.7098039984703064;0.41176500916481018;0.50020599365234375;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "-401.21800000000002",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;-0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "-62.296999999999997",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.24705900251865387;0.50069200992584229;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "-745.12900000000002",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "-837.60400000000004",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;-1.994930012139858e-017;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "-976.60400000000004",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;-0;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "1",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_7":
+                    {
+                        "key": "120",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.34902000427246094;0.27450999617576599;0.55656099319458008;"
+                            }
+                        }
+                    },
+                    "item_8":
+                    {
+                        "key": "177",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0;0;0.71040701866149902;"
+                            }
+                        }
+                    },
+                    "item_9":
+                    {
+                        "key": "221",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.79637998342514038;"
+                            }
+                        }
+                    },
+                    "item_10":
+                    {
+                        "key": "320",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;0.87556600570678711;"
+                            }
+                        }
+                    },
+                    "item_11":
+                    {
+                        "key": "36",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.18778300285339355;"
+                            }
+                        }
+                    },
+                    "item_12":
+                    {
+                        "key": "76",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.61960798501968384;0.22745099663734436;0.1568630039691925;0.39592799544334412;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "1296.6"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Thorax.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Thorax.json
new file mode 100644
index 0000000..bbef685
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Thorax.json
@@ -0,0 +1,209 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "c9cc3bfc-35c8-4c18-bc8c-ed75f1726850"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "-418"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Thorax"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "-1011",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "-195",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "-480",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.28623199462890625;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "-597",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9803919792175293;0.67843097448348999;0.27058801054954529;0.51906198263168335;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "-690",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.9882349967956543;0.83921599388122559;0.63529402017593384;0.72727298736572266;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "121",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0.39882698655128479;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "135",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.52199399471282959;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "155",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0.69019597768783569;0.7536659836769104;"
+                            }
+                        }
+                    },
+                    "item_8":
+                    {
+                        "key": "176",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    },
+                    "item_9":
+                    {
+                        "key": "5",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_9":
+                    {
+                        "key": "95",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.25097998976707458;0;0;0;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "1187"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/CT-Vessels.json b/Bundles/LeafUI/uiTF/rc/tf/CT-Vessels.json
new file mode 100644
index 0000000..dfe724d
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/CT-Vessels.json
@@ -0,0 +1,154 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "4a0cd8be-af5d-4cbe-875e-3613ba88a738"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "216"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "CT-Vessels"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "128",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "140",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.62352901697158813;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "159",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.30000001192092896;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "187",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.60000002384185791;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "219",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0.64313697814941406;0.90149301290512085;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "304",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "176"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Kidneys.json b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Kidneys.json
new file mode 100644
index 0000000..a400d22
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Kidneys.json
@@ -0,0 +1,154 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "1860ecea-9c9d-4b97-9d06-e242b475b679"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "573"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "MRI-T2-kidneys"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "432",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "445",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "482",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.13966499269008636;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "554",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.43575400114059448;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "657",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.79329597949981689;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "715",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "283"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Liver.json b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Liver.json
new file mode 100644
index 0000000..dcb90a2
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-Liver.json
@@ -0,0 +1,187 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "492769ba-e48d-407e-8963-6dbd85251acf"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "324"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "MRI-T2-Liver"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "109",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.74901998043060303;0.34509798884391785;0.19607800245285034;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "147",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "21",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "295",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.25097998976707458;0;0;0.047485999763011932;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "402",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.74901998043060303;0.17254899442195892;0.137254998087883;0.34357500076293945;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "466",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.35294100642204285;0.27450999617576599;0.67318397760391235;"
+                            }
+                        }
+                    },
+                    "item_6":
+                    {
+                        "key": "539",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.83240199089050293;"
+                            }
+                        }
+                    },
+                    "item_7":
+                    {
+                        "key": "62",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.69411802291870117;0.39215698838233948;0;"
+                            }
+                        }
+                    },
+                    "item_8":
+                    {
+                        "key": "627",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "606"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-vessels.json b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-vessels.json
new file mode 100644
index 0000000..9028c31
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/rc/tf/MRI-T2-vessels.json
@@ -0,0 +1,154 @@
+{
+    "versions":
+    {
+        "atoms_version": "1",
+        "writer_version": "1"
+    },
+    "object":
+    {
+        "meta_infos":
+        {
+            "item_0":
+            {
+                "key": "CLASSNAME_METAINFO",
+                "value": "::fwData::TransferFunction"
+            },
+            "item_1":
+            {
+                "key": "ID_METAINFO",
+                "value": "712e7709-9d70-4474-807a-00bde9b7f0fb"
+            },
+            "item_2":
+            {
+                "key": "lib_name",
+                "value": "fwData"
+            },
+            "item_3":
+            {
+                "key": "object_version",
+                "value": "1"
+            }
+        },
+        "attributes":
+        {
+            "background_color":
+            {
+                "string":
+                {
+                    "value": "0;0;0;0;"
+                }
+            },
+            "fields":
+            {
+                "map": ""
+            },
+            "interpolation_mode":
+            {
+                "string":
+                {
+                    "value": "LINEAR"
+                }
+            },
+            "is_clamped":
+            {
+                "boolean":
+                {
+                    "value": "false"
+                }
+            },
+            "level":
+            {
+                "numeric":
+                {
+                    "value": "526"
+                }
+            },
+            "name":
+            {
+                "string":
+                {
+                    "value": "MRI-T2-vessels"
+                }
+            },
+            "tf_data":
+            {
+                "map":
+                {
+                    "item_0":
+                    {
+                        "key": "401",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_1":
+                    {
+                        "key": "416",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "0.50196099281311035;0;0;0;"
+                            }
+                        }
+                    },
+                    "item_2":
+                    {
+                        "key": "480",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0.50196099281311035;0.30726298689842224;"
+                            }
+                        }
+                    },
+                    "item_3":
+                    {
+                        "key": "549",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;0.50196099281311035;0;0.60614502429962158;"
+                            }
+                        }
+                    },
+                    "item_4":
+                    {
+                        "key": "604",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;0;0.79329597949981689;"
+                            }
+                        }
+                    },
+                    "item_5":
+                    {
+                        "key": "652",
+                        "value":
+                        {
+                            "string":
+                            {
+                                "value": "1;1;1;1;"
+                            }
+                        }
+                    }
+                }
+            },
+            "window":
+            {
+                "numeric":
+                {
+                    "value": "251"
+                }
+            }
+        }
+    }
+}
diff --git a/Bundles/LeafUI/uiTF/src/uiTF/Plugin.cpp b/Bundles/LeafUI/uiTF/src/uiTF/Plugin.cpp
new file mode 100644
index 0000000..22447a6
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/src/uiTF/Plugin.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include "uiTF/Plugin.hpp"
+
+namespace uiTF
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiTF::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace uiTF
diff --git a/Bundles/LeafUI/uiTF/src/uiTF/TransferFunctionEditor.cpp b/Bundles/LeafUI/uiTF/src/uiTF/TransferFunctionEditor.cpp
new file mode 100644
index 0000000..128c48e
--- /dev/null
+++ b/Bundles/LeafUI/uiTF/src/uiTF/TransferFunctionEditor.cpp
@@ -0,0 +1,628 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/convenience.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <QWidget>
+#include <QBoxLayout>
+#include <QComboBox>
+#include <QString>
+#include <QPushButton>
+#include <QIcon>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/InputDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include <io/IWriter.hpp>
+#include <io/IReader.hpp>
+
+#include "uiTF/TransferFunctionEditor.hpp"
+
+namespace uiTF
+{
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::gui::editor::IEditor, ::uiTF::TransferFunctionEditor, ::fwData::Composite );
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+TransferFunctionEditor::TransferFunctionEditor() : m_selectedTFKey("")
+{
+//    this->addNewHandledEvent(::fwComEd::CompositeMsg::CHANGED_KEYS);
+//    this->addNewHandledEvent(::fwComEd::CompositeMsg::ADDED_KEYS);
+//    this->addNewHandledEvent(::fwComEd::CompositeMsg::REMOVED_KEYS);
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+TransferFunctionEditor::~TransferFunctionEditor() throw ()
+{}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+    ::fwRuntime::ConfigurationElement::sptr configuration = m_configuration->findConfigurationElement("config");
+    SLM_ASSERT("Sorry, analyzed configuration is not conformed.", configuration);
+
+    SLM_ASSERT("Sorry, analyzed configuration is not conformed.", configuration->getName() == "config");
+    if ( configuration->hasAttribute("selectedTFKey") )
+    {
+        m_selectedTFKey = configuration->getAttributeValue("selectedTFKey");
+        SLM_FATAL_IF("'selectedTFKey' must not be empty", m_selectedTFKey.empty());
+    }
+    if ( configuration->hasAttribute("tfSelectionFwID") )
+    {
+        m_tfSelectionFwID = configuration->getAttributeValue("tfSelectionFwID");
+        SLM_FATAL_IF("'tfSelectionFwID' must not be empty", m_tfSelectionFwID.empty());
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    // Get the Qt container
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast(this->getContainer());
+    m_container = qtContainer->getQtContainer();
+    SLM_ASSERT("Sorry, the qt container is not valid", m_container);
+
+    // Buttons creation
+    m_pTransferFunctionPreset = new QComboBox(m_container);
+
+    ::boost::filesystem::path deletePath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/delete.png"); //ever in a commit
+    m_deleteButton = new QPushButton(QIcon(deletePath.string().c_str()), "", m_container);
+    m_deleteButton->setToolTip(QString("Delete"));
+
+    ::boost::filesystem::path newPath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/new.png"); //ever in a commit
+    m_newButton = new QPushButton(QIcon(newPath.string().c_str()), "", m_container);
+    m_newButton->setToolTip(QString("New"));
+
+    ::boost::filesystem::path reinitializePath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/reinitialize.png"); //ever in a commit
+    m_reinitializeButton = new QPushButton(QIcon(reinitializePath.string().c_str()), "", m_container);
+    m_reinitializeButton->setToolTip(QString("Reinitialize"));
+
+    ::boost::filesystem::path renamePath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/rename.png"); //ever in a commit
+    m_renameButton = new QPushButton(QIcon(renamePath.string().c_str()), "", m_container);
+    m_renameButton->setToolTip(QString("Rename"));
+
+    ::boost::filesystem::path importPath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/import.png"); //ever in a commit
+    m_importButton = new QPushButton(QIcon(importPath.string().c_str()), "", m_container);
+    m_importButton->setToolTip(QString("Import"));
+
+    ::boost::filesystem::path exportPath (std::string(LIBSFW4SPL)+"Bundles/media_0-1/export.png"); //ever in a commit
+    m_exportButton = new QPushButton(QIcon(exportPath.string().c_str()), "", m_container);
+    m_exportButton->setToolTip(QString("Export"));
+
+    // Layout management
+    QBoxLayout* layout =  new QBoxLayout(QBoxLayout::LeftToRight, m_container);
+
+    layout->addWidget(m_pTransferFunctionPreset);
+    layout->addWidget(m_deleteButton);
+    layout->addWidget(m_newButton);
+    layout->addWidget(m_reinitializeButton);
+    layout->addWidget(m_renameButton);
+    layout->addWidget(m_importButton);
+    layout->addWidget(m_exportButton);
+
+    m_container->setLayout(layout);
+
+    // Qt signals management ( connection to buttons )
+    QObject::connect(m_pTransferFunctionPreset, SIGNAL(   activated(int)), this, SLOT(presetChoice(int)));
+    QObject::connect(m_deleteButton, SIGNAL(   clicked()), this, SLOT(deleteTF()));
+    QObject::connect(m_newButton, SIGNAL(   clicked()), this, SLOT(newTF()));
+    QObject::connect(m_reinitializeButton, SIGNAL(   clicked()), this, SLOT(reinitializeTFPool()));
+    QObject::connect(m_renameButton, SIGNAL(   clicked()), this, SLOT(renameTF()));
+    QObject::connect(m_importButton, SIGNAL(   clicked()), this, SLOT(importTF()));
+    QObject::connect(m_exportButton, SIGNAL(   clicked()), this, SLOT(exportTF()));
+
+    // preset initialization
+    this->initTransferFunctions();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::receiving(::fwServices::ObjectMsg::csptr msg) throw( ::fwTools::Failed )
+{
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(msg);
+    if(compositeMsg &&
+            ( compositeMsg->hasEvent(::fwComEd::CompositeMsg::CHANGED_KEYS) ||
+              compositeMsg->hasEvent(::fwComEd::CompositeMsg::ADDED_KEYS)   ||
+              compositeMsg->hasEvent(::fwComEd::CompositeMsg::REMOVED_KEYS) ) )
+    {
+        this->updateTransferFunctionPreset();
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Qt signals management ( disconnection )
+    QObject::disconnect(m_pTransferFunctionPreset, SIGNAL(   activated(int)), this, SLOT(presetChoice(int)));
+    QObject::disconnect(m_deleteButton, SIGNAL(   clicked()), this, SLOT(deleteTF()));
+    QObject::disconnect(m_newButton, SIGNAL(   clicked()), this, SLOT(newTF()));
+    QObject::disconnect(m_reinitializeButton, SIGNAL(   clicked()), this, SLOT(reinitializeTFPool()));
+    QObject::disconnect(m_renameButton, SIGNAL(   clicked()), this, SLOT(renameTF()));
+    QObject::disconnect(m_importButton, SIGNAL(   clicked()), this, SLOT(importTF()));
+    QObject::disconnect(m_exportButton, SIGNAL(   clicked()), this, SLOT(exportTF()));
+
+    // deletes contained widgets
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast(this->getContainer());
+    qtContainer->clean();
+
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::presetChoice(int index)
+{
+    SLM_TRACE_FUNC();
+    m_pTransferFunctionPreset->setCurrentIndex(index);
+    this->updateTransferFunction();
+
+    std::string tfName = m_pTransferFunctionPreset->currentText().toStdString();
+    bool isEnabled = (tfName != ::fwData::TransferFunction::s_DEFAULT_TF_NAME);
+
+    m_renameButton->setEnabled(isEnabled);
+    m_deleteButton->setEnabled(isEnabled);
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::deleteTF()
+{
+    ::fwGui::dialog::MessageDialog messageBox;
+    messageBox.setTitle("Deleting confirmation");
+    messageBox.setMessage("Are you sure you want to delete this transfer function?");
+    messageBox.setIcon(::fwGui::dialog::IMessageDialog::QUESTION);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::YES);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::CANCEL);
+    ::fwGui::dialog::IMessageDialog::Buttons answerCopy = messageBox.show();
+
+    if (answerCopy != ::fwGui::dialog::IMessageDialog::CANCEL)
+    {
+        ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite > ();
+
+        if( poolTF->size() > 1 )
+        {
+            int indexSelectedTF = m_pTransferFunctionPreset->currentIndex();
+            std::string selectedTFKey = m_pTransferFunctionPreset->currentText().toStdString();
+
+            ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite >();
+
+            ::fwComEd::helper::Composite compositeHelper(poolTF);
+            OSLM_ASSERT("TF "<< m_selectedTFKey <<" missing in pool", this->hasTransferFunctionName(selectedTFKey));
+            compositeHelper.remove(selectedTFKey);
+            compositeHelper.notify(this->getSptr());
+
+            m_pTransferFunctionPreset->removeItem(indexSelectedTF);
+            std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+
+            int index = m_pTransferFunctionPreset->findText(QString::fromStdString(defaultTFName));
+            index = std::max(index, 0);
+            this->presetChoice(index);
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Warning",
+                    "You can not remove this transfer function because the program requires at least one.",
+                    ::fwGui::dialog::IMessageDialog::WARNING );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::newTF()
+{
+    std::string newName = this->getSelectedTransferFunction()->getName();
+    if( this->hasTransferFunctionName(newName) )
+    {
+        newName = this->createTransferFunctionName(newName);
+    }
+
+    fwGui::dialog::InputDialog inputDialog;
+    inputDialog.setTitle("Creating transfer function");
+    inputDialog.setMessage("Transfer function name:");
+    inputDialog.setInput( newName );
+    newName = inputDialog.getInput();
+
+    if (!newName.empty())
+    {
+        if(!this->hasTransferFunctionName(newName))
+        {
+            ::fwData::TransferFunction::sptr pNewTransferFunction ;
+            ::fwData::TransferFunction::sptr selectedTF = this->getSelectedTransferFunction();
+
+            pNewTransferFunction = ::fwData::Object::copy(selectedTF);
+            pNewTransferFunction->setName(newName);
+            ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite >();
+            ::fwComEd::helper::Composite compositeHelper(poolTF);
+            compositeHelper.add(newName, pNewTransferFunction);
+
+            m_pTransferFunctionPreset->addItem(QString(newName.c_str()));
+            m_pTransferFunctionPreset->setCurrentIndex(m_pTransferFunctionPreset->count()-1);
+            this->updateTransferFunction();
+
+            compositeHelper.notify(this->getSptr());
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Warning",
+                    "This transfer function name already exists so you can not overwrite it.",
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::reinitializeTFPool()
+{
+    ::fwGui::dialog::MessageDialog messageBox;
+    messageBox.setTitle("Reinitializing confirmation");
+    messageBox.setMessage("Are you sure you want to reinitialize all transfer functions?");
+    messageBox.setIcon(::fwGui::dialog::IMessageDialog::QUESTION);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::YES);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::CANCEL);
+    ::fwGui::dialog::IMessageDialog::Buttons answerCopy = messageBox.show();
+
+    if (answerCopy != ::fwGui::dialog::IMessageDialog::CANCEL)
+    {
+        ::fwData::Composite::sptr tfPool = this->getObject< ::fwData::Composite > ();
+
+        ::fwComEd::helper::Composite compositeHelper(tfPool);
+        compositeHelper.clear();
+        compositeHelper.notify(this->getSptr());
+
+        this->initTransferFunctions();
+
+        this->updateTransferFunction();
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::renameTF()
+{
+    if ( m_selectedTFKey.find("STD") != std::string::npos )
+    {
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage("STD transfer function can not be renamed.");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+        return;
+    }
+
+    std::string str = m_pTransferFunctionPreset->currentText().toStdString();
+    std::string newName (str);
+
+    fwGui::dialog::InputDialog inputDialog;
+    inputDialog.setTitle("Creating transfer function");
+    inputDialog.setMessage("Transfer function name:");
+    inputDialog.setInput( newName );
+    newName = inputDialog.getInput();
+
+    if (    ! newName.empty() &&
+            newName != str)
+    {
+        if( ! this->hasTransferFunctionName(newName) )
+        {
+
+            ::fwData::Composite::sptr tfPool = this->getObject< ::fwData::Composite >();
+            ::fwData::TransferFunction::sptr pTF;
+            pTF = ::fwData::TransferFunction::dynamicCast((*tfPool)[str]);
+            pTF->setName(newName);
+
+            ::fwComEd::helper::Composite compositeHelper(tfPool);
+            compositeHelper.remove(str);
+            compositeHelper.add(newName, pTF);
+            compositeHelper.notify(this->getSptr());
+
+            m_pTransferFunctionPreset->setItemText(m_pTransferFunctionPreset->currentIndex(), QString(newName.c_str()));
+            m_pTransferFunctionPreset->setCurrentIndex(m_pTransferFunctionPreset->findText(QString(newName.c_str())));
+
+            this->updateTransferFunction();
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog messageBox;
+            messageBox.setTitle("Warning");
+            messageBox.setMessage("This transfer function name already exists so you can not overwrite it.");
+            messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+            messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+            messageBox.show();
+        }
+    }
+    if ( newName.empty() )
+    {
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage("You have to give a name to your transfer function.");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::importTF()
+{
+    ::fwData::Composite::sptr tfPool = this->getObject< ::fwData::Composite >();
+    ::fwComEd::helper::Composite compositeHelper(tfPool);
+
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+    ::fwServices::IService::sptr srv =
+            ::fwServices::registry::ServiceFactory::getDefault()->create("::ioAtoms::SReader");
+
+    ::fwServices::OSR::registerService(tf, srv);
+
+    ::io::IReader::sptr reader = ::io::IReader::dynamicCast(srv);
+    reader->start();
+    reader->configureWithIHM();
+    reader->update();
+    reader->stop();
+    ::fwServices::OSR::unregisterService(srv);
+
+    if (!tf->getName().empty())
+    {
+        if( this->hasTransferFunctionName( tf->getName() ) )
+        {
+            tf->setName( this->createTransferFunctionName( tf->getName() ) );
+        }
+
+        compositeHelper.add(tf->getName(), tf);
+        m_pTransferFunctionPreset->addItem(QString(tf->getName().c_str()));
+        this->presetChoice((*tfPool).size()-1);
+
+        compositeHelper.notify(this->getSptr());
+    }
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::exportTF()
+{
+    SLM_TRACE_FUNC();
+
+    if (m_selectedTFKey.find("STD")!=std::string::npos)
+    {
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Warning");
+        messageBox.setMessage("STD transfer function can not be exported.");
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+        return;
+    }
+    ::fwData::TransferFunction::sptr tf = this->getSelectedTransferFunction();
+    ::fwServices::IService::sptr srv =
+            ::fwServices::registry::ServiceFactory::getDefault()->create("::ioAtoms::SWriter");
+
+    ::fwServices::OSR::registerService(tf, srv);
+
+    ::io::IWriter::sptr writer = ::io::IWriter::dynamicCast(srv);
+    writer->start();
+    writer->configureWithIHM();
+    writer->update();
+    writer->stop();
+    ::fwServices::OSR::unregisterService(srv);
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::initTransferFunctions()
+{
+    // Get transfer function composite (pool TF)
+    ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite >( );
+
+    ::fwComEd::helper::Composite compositeHelper(poolTF);
+
+    const std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+    if(!this->hasTransferFunctionName(defaultTFName))
+    {
+        ::fwData::TransferFunction::sptr defaultTf = ::fwData::TransferFunction::createDefaultTF();
+        defaultTf->setWindow( 50. );
+        defaultTf->setLevel( 500. );
+        compositeHelper.add(defaultTFName, defaultTf);
+    }
+
+    // Test if transfer function composite has few TF
+    if( poolTF->size() <= 1 )
+    {
+        // Parse all TF contained in uiTF Bundle's resources
+        std::vector< ::boost::filesystem::path > paths;
+        ::boost::filesystem::path pathRoot (std::string(LIBSFW4SPL)+"Bundles/uiTF_" + std::string(UITF_VER) + "/tf");
+        for(::boost::filesystem::directory_iterator it(pathRoot);
+            it != ::boost::filesystem::directory_iterator();
+            ++it )
+        {
+            if(! ::boost::filesystem::is_directory(*it) &&
+                 ::boost::filesystem::extension(*it) == ".json")
+            {
+                paths.push_back(*it);
+            }
+        }
+
+        ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+        ::fwServices::IService::sptr srv =
+                ::fwServices::registry::ServiceFactory::getDefault()->create("::ioAtoms::SReader");
+        ::fwServices::OSR::registerService(tf, srv);
+        ::io::IReader::sptr reader = ::io::IReader::dynamicCast(srv);
+
+        ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+        ::fwRuntime::EConfigurationElement::sptr fileCfg = ::fwRuntime::EConfigurationElement::New("file");
+        srvCfg->addConfigurationElement(fileCfg);
+
+        BOOST_FOREACH( ::boost::filesystem::path file, paths )
+        {
+            fileCfg->setValue(file.string());
+            reader->setConfiguration(srvCfg);
+            reader->configure();
+            reader->start();
+            reader->update();
+            reader->stop();
+
+            if (!tf->getName().empty())
+            {
+                ::fwData::TransferFunction::sptr newTF = ::fwData::Object::copy< ::fwData::TransferFunction >(tf);
+                if( this->hasTransferFunctionName( newTF->getName() ) )
+                {
+                    newTF->setName( this->createTransferFunctionName( newTF->getName() ) );
+                }
+
+                compositeHelper.add(newTF->getName(), newTF);
+            }
+            tf->initTF();
+        }
+        ::fwServices::OSR::unregisterService(srv);
+    }
+    compositeHelper.notify(this->getSptr());
+
+    this->updateTransferFunctionPreset();
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+
+
+void TransferFunctionEditor::updateTransferFunctionPreset()
+{
+    ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite >( );
+    const std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+    // Manage TF preset
+    m_pTransferFunctionPreset->clear();
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *poolTF)
+    {
+        m_pTransferFunctionPreset->addItem( elt.first.c_str() );
+    }
+
+    int index = m_pTransferFunctionPreset->findText( QString::fromStdString(defaultTFName) );
+    index = std::max(index, 0);
+    ::fwData::TransferFunction::sptr selectedTF = this->getSelectedTransferFunction();
+    if(selectedTF)
+    {
+        std::string tfName = selectedTF->getName();
+        int tmpIdx = m_pTransferFunctionPreset->findText(QString::fromStdString(tfName));
+        if(tmpIdx >= 0)
+        {
+            index = tmpIdx;
+        }
+    }
+    this->presetChoice(index);
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+bool TransferFunctionEditor::hasTransferFunctionName(const std::string & _sName)
+{
+    ::fwData::Composite::sptr poolTf = this->getObject< ::fwData::Composite >();
+    return poolTf->find(_sName) != poolTf->end();
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+std::string TransferFunctionEditor::createTransferFunctionName(const std::string & _sBasename)
+{
+    bool bHasTransferFunctionName = true;
+    std::string newName = _sBasename;
+    int cpt = 1;
+    while (bHasTransferFunctionName)
+    {
+        std::stringstream tmpStr;
+        tmpStr <<  _sBasename <<  "_" <<  cpt;
+        newName = tmpStr.str();
+        bHasTransferFunctionName = this->hasTransferFunctionName(newName);
+        cpt++;
+    }
+
+    return  newName;
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+void TransferFunctionEditor::updateTransferFunction()
+{
+    std::string newSelectedTFKey = m_pTransferFunctionPreset->currentText().toStdString();
+    OSLM_DEBUG("Transfer function selected : " <<  newSelectedTFKey);
+
+    ::fwData::Composite::sptr tfSelection = this->getTFSelection();
+
+    OSLM_ASSERT("TF "<< newSelectedTFKey <<" missing in pool", this->hasTransferFunctionName(newSelectedTFKey));
+    ::fwData::Composite::sptr poolTF = this->getObject< ::fwData::Composite >();
+    ::fwData::Object::sptr newSelectedTF = (*poolTF)[newSelectedTFKey];
+    if(this->getSelectedTransferFunction() != newSelectedTF)
+    {
+        ::fwComEd::helper::Composite compositeHelper(tfSelection);
+        if(tfSelection->getContainer().find(m_selectedTFKey) != tfSelection->getContainer().end())
+        {
+            compositeHelper.swap(m_selectedTFKey, newSelectedTF);
+        }
+        else
+        {
+            compositeHelper.add(m_selectedTFKey, newSelectedTF);
+        }
+        compositeHelper.notify(this->getSptr());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Composite::sptr TransferFunctionEditor::getTFSelection() const
+{
+    ::fwData::Composite::sptr tfSelection = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject( m_tfSelectionFwID ) );
+    return tfSelection;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr TransferFunctionEditor::getSelectedTransferFunction() const
+{
+    ::fwData::Composite::sptr tfSelection = this->getTFSelection();
+    return ::fwData::TransferFunction::dynamicCast((*tfSelection)[m_selectedTFKey]);
+}
+
+//-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+} // end namespace
diff --git a/Bundles/LeafUI/uiVisu/CMakeLists.txt b/Bundles/LeafUI/uiVisu/CMakeLists.txt
new file mode 100644
index 0000000..737f685
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/CMakeLists.txt
@@ -0,0 +1,14 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwRuntime
+    fwTools
+)
+
+
+find_package(Boost REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    )
+
diff --git a/Bundles/LeafUI/uiVisu/COPYING b/Bundles/LeafUI/uiVisu/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiVisu/COPYING.LESSER b/Bundles/LeafUI/uiVisu/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiVisu/Properties.cmake b/Bundles/LeafUI/uiVisu/Properties.cmake
new file mode 100644
index 0000000..0444ab2
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiVisu )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiVisu/bin/build.options b/Bundles/LeafUI/uiVisu/bin/build.options
new file mode 100644
index 0000000..f1ad3c3
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/bin/build.options
@@ -0,0 +1,17 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+           'fwData_0-1',
+           'fwDataIO_0-2',
+           'fwServices_0-1',
+           'fwComEd_0-1',
+           'fwRuntime_0-3',
+           'fwCore_0-1',
+           'fwTools_0-1',
+           'fwGui_0-1',
+           ]
+USE     = ['boost']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/Namespace.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/Namespace.hpp
new file mode 100644
index 0000000..d5368cc
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIVISU_NAMESPACE_HPP_
+#define UIVISU_NAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiVisu contains action to modifies cross type and 3D camera orientation
+ * @namespace   uiVisu
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiVisu
+{
+}
+#endif /* UIVISU_NAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/Plugin.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/Plugin.hpp
new file mode 100644
index 0000000..222b02d
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/Plugin.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISU_PLUGIN_HPP_
+#define _UIVISU_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiVisu
+{
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiVisu
+
+#endif //_UIVISU_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/action/CameraOrientationAction.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/action/CameraOrientationAction.hpp
new file mode 100644
index 0000000..8b91078
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/action/CameraOrientationAction.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISU_CAMERA_ORIENTATION_ACTION_HPP_
+#define _UIVISU_CAMERA_ORIENTATION_ACTION_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiVisu/config.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows change 3D camera orientation (axial, frontal, sagittal)
+ * @class   CameraOrientationAction
+ * 
+ * @date    2010.
+ */
+class UIVISU_CLASS_API CameraOrientationAction : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (CameraOrientationAction)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISU_API CameraOrientationAction() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISU_API virtual ~CameraOrientationAction() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Configure action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiData::action::CameraOrientationAction" autoConnect="no">
+        <orientation>frontal</orientation>
+    </service>
+    @endverbatim
+     * - \b orientation : must be axial, frontal or sagittal
+     */
+    void configuring() throw(fwTools::Failed);
+
+    /// Starts action
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops action
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Does nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Notifies message to change camera orientation
+    void updating() throw(::fwTools::Failed);
+
+    /// Does nothing
+    void swapping() throw(::fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+
+    std::string m_orientation;
+};
+
+} // action
+} // uiVisu
+
+#endif /*_UIVISU_CAMERA_ORIENTATION_ACTION_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/action/CrossTypeAction.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/action/CrossTypeAction.hpp
new file mode 100644
index 0000000..6452920
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/action/CrossTypeAction.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISU_CROSSTYPE_ACTION_HPP_
+#define _UIVISU_CROSSTYPE_ACTION_HPP_
+
+#include <string>
+#include <map>
+
+#include <fwTools/Failed.hpp>
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiVisu/config.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows change the cross type
+ * @class   CrossTypeAction
+ * 
+ * @date    2010.
+ */
+class UIVISU_CLASS_API CrossTypeAction : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (CrossTypeAction)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISU_API CrossTypeAction() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISU_API virtual ~CrossTypeAction() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /// Starts action
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops action
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Does nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Notifies message to change cross type
+    void updating() throw(::fwTools::Failed);
+
+    /// Does nothing
+    void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiData::action::CrossTypeAction" autoConnect="no">
+        <crossType>hide</crossType>
+    </service>
+    @endverbatim
+     * - \b crossType : must be full, half or hide
+     */
+    void configuring() throw(fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+
+    static std::map< std::string, float > m_scaleConversion;
+    std::string m_crossType;
+};
+
+} // action
+} // uiVisu
+
+#endif /*_UIVISU_CROSSTYPE_ACTION_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/action/SSnapshot.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/action/SSnapshot.hpp
new file mode 100644
index 0000000..4377cf6
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/action/SSnapshot.hpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __UIVISU_ACTION_SSNAPSHOT_HPP__
+#define __UIVISU_ACTION_SSNAPSHOT_HPP__
+
+#include <string>
+#include <map>
+
+#include <fwTools/Failed.hpp>
+#include <fwGui/IActionSrv.hpp>
+
+#include "uiVisu/config.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+/**
+ * @brief   This action allows to snapshot a generic scene
+ * @class   SSnapshot
+ * 
+ * @date    2012.
+ *
+ * Send a CompositeMsg with SNAP event containing the uid of the scene to the scene's composite.
+ */
+class UIVISU_CLASS_API SSnapshot : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SSnapshot)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISU_API SSnapshot() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISU_API virtual ~SSnapshot() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /// Starts action
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops action
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Does nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Show a file dialog and notify the scene which must be printed.
+    void updating() throw(::fwTools::Failed);
+
+    /// Does nothing
+    void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure action.
+     * @verbatim
+    <service type="::fwGui::IActionSrv" impl="::uiData::action::SSnapshot" autoConnect="no">
+        <snap>
+            <scene uid="genericScene" />
+        </snap>
+    </service>
+    @endverbatim
+     * - \b genericScene is the uid of the ::fwRenderVTK::VtkRenderService representing the generic scene which will be printed.
+     */
+    void configuring() throw(fwTools::Failed);
+
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+    std::string requestFileName();
+
+    std::vector< std::string > m_scenesUID;
+
+};
+
+} // action
+} // uiVisu
+
+#endif // __UIVISU_ACTION_SSNAPSHOT_HPP__
+
+
diff --git a/Bundles/LeafUI/uiVisu/include/uiVisu/config.hpp b/Bundles/LeafUI/uiVisu/include/uiVisu/config.hpp
new file mode 100644
index 0000000..189e252
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/include/uiVisu/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISU_CONFIG_HPP_
+#define _UIVISU_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIVISU_EXPORTS
+    #define UIVISU_API __declspec(dllexport)
+    #else
+    #define UIVISU_API __declspec(dllimport)
+    #endif
+
+    #define UIVISU_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIVISU_EXPORTS
+    #define UIVISU_API __attribute__ ((visibility("default")))
+    #define UIVISU_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIVISU_API __attribute__ ((visibility("hidden")))
+    #define UIVISU_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIVISU_API
+    #define UIVISU_CLASS_API
+
+#endif
+
+#endif //_UIVISU_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiVisu/rc/plugin.xml b/Bundles/LeafUI/uiVisu/rc/plugin.xml
new file mode 100644
index 0000000..7afb63b
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/rc/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="uiVisu" class="::uiVisu::Plugin">
+    <library name="uiVisu"/>
+    
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiVisu::action::CrossTypeAction</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiVisu::action::CameraOrientationAction</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::uiVisu::action::SSnapshot</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    
+</plugin>
diff --git a/Bundles/LeafUI/uiVisu/src/uiVisu/Plugin.cpp b/Bundles/LeafUI/uiVisu/src/uiVisu/Plugin.cpp
new file mode 100644
index 0000000..a863453
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/src/uiVisu/Plugin.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiVisu/Plugin.hpp"
+
+namespace uiVisu
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiVisu::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiVisu
diff --git a/Bundles/LeafUI/uiVisu/src/uiVisu/action/CameraOrientationAction.cpp b/Bundles/LeafUI/uiVisu/src/uiVisu/action/CameraOrientationAction.cpp
new file mode 100644
index 0000000..789f9d8
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/src/uiVisu/action/CameraOrientationAction.cpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+
+#include "uiVisu/action/CameraOrientationAction.hpp"
+#include "fwServices/IEditionService.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiVisu::action::CameraOrientationAction , ::fwData::Image ) ;
+
+
+CameraOrientationAction::CameraOrientationAction() throw() : m_orientation("axial")
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+CameraOrientationAction::~CameraOrientationAction() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::initialize();
+
+    if( this->m_configuration->size() > 0 )
+    {
+        ::fwRuntime::ConfigurationElementContainer::Iterator iter = this->m_configuration->begin() ;
+        SLM_ASSERT("Sorry, only one xml element \"orientation\" is accepted.", this->m_configuration->size() == 1 && (*iter)->getName() == "orientation" );
+        SLM_ASSERT("Sorry, xml element \"orientation\" is empty.", ! (*iter)->getValue().empty() );
+        m_orientation = (*iter)->getValue();
+        ::boost::algorithm::trim(m_orientation);
+        ::boost::algorithm::to_lower(m_orientation);
+
+        if(m_orientation != "axial" && m_orientation != "frontal" && m_orientation != "sagittal")
+        {
+            SLM_FATAL("The value for the xml element \"orientation\" can only be axial, frontal or sagittal.");
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::String::sptr dataInfo = ::fwData::String::New();
+    dataInfo->value() = m_orientation;
+
+    ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+    imageMsg->addEvent( "CAMERA_ORIENTATION", dataInfo );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, imageMsg);
+}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void CameraOrientationAction::info( std::ostream &_sstream )
+{
+}
+
+
+//------------------------------------------------------------------------------
+
+} // action
+} // uiVisu
+
diff --git a/Bundles/LeafUI/uiVisu/src/uiVisu/action/CrossTypeAction.cpp b/Bundles/LeafUI/uiVisu/src/uiVisu/action/CrossTypeAction.cpp
new file mode 100644
index 0000000..3892c41
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/src/uiVisu/action/CrossTypeAction.cpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Float.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+
+#include "uiVisu/action/CrossTypeAction.hpp"
+#include "fwServices/IEditionService.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiVisu::action::CrossTypeAction , ::fwData::Image ) ;
+
+
+std::map< std::string, float >
+CrossTypeAction::m_scaleConversion
+        = ::boost::assign::map_list_of(std::string("full"),1.0)
+                                      (std::string("half"),0.5)
+                                      (std::string("hide"),0.0);
+
+CrossTypeAction::CrossTypeAction() throw()
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+CrossTypeAction::~CrossTypeAction() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::initialize();
+
+    if( this->m_configuration->size() > 0 )
+    {
+        std::vector < ConfigurationType > vectConfig = this->m_configuration->find("crossType");
+        SLM_ASSERT("Missing <crossType> tag!", !vectConfig.empty());
+        m_crossType = vectConfig.at(0)->getValue();
+        ::boost::algorithm::trim(m_crossType);
+        ::boost::algorithm::to_lower(m_crossType);
+        SLM_ASSERT("Unknown crossType", m_scaleConversion.find(m_crossType) != m_scaleConversion.end());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::Float::sptr dataInfo = ::fwData::Float::New();
+    dataInfo->value() = m_scaleConversion[m_crossType];
+
+    ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+    imageMsg->addEvent( "CROSS_TYPE", dataInfo );
+    ::fwServices::IEditionService::notify(this->getSptr(), image, imageMsg);
+}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void CrossTypeAction::info( std::ostream &_sstream )
+{
+}
+
+
+//------------------------------------------------------------------------------
+
+} // action
+} // uiVisu
+
diff --git a/Bundles/LeafUI/uiVisu/src/uiVisu/action/SSnapshot.cpp b/Bundles/LeafUI/uiVisu/src/uiVisu/action/SSnapshot.cpp
new file mode 100644
index 0000000..3e2693d
--- /dev/null
+++ b/Bundles/LeafUI/uiVisu/src/uiVisu/action/SSnapshot.cpp
@@ -0,0 +1,159 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include "uiVisu/action/SSnapshot.hpp"
+
+namespace uiVisu
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::uiVisu::action::SSnapshot , ::fwData::Object ) ;
+
+
+SSnapshot::SSnapshot() throw()
+{
+    //this->handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+SSnapshot::~SSnapshot() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::IActionSrv::initialize();
+
+
+    std::vector < Configuration > snapConfig = m_configuration->find("snap");
+    if(!snapConfig.empty())
+    {
+        std::vector < Configuration > sceneConfig = snapConfig.at(0)->find("scene");
+        for(unsigned int i =0; i < sceneConfig.size(); i++)
+        {
+            OSLM_ASSERT("Wrong tag name: " << sceneConfig.at(i)->getName(), sceneConfig.at(i)->getName() == "scene");
+            SLM_ASSERT("UID attribute is missing", sceneConfig.at(i)->hasAttribute("uid"));
+
+            std::string value(sceneConfig.at(i)->getAttributeValue("uid"));
+            m_scenesUID.push_back(value);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    for(unsigned int i=0; i < m_scenesUID.size(); i++)
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get(m_scenesUID.at(i));
+        ::fwData::Composite::sptr composite = service->getObject< ::fwData::Composite >();
+        SLM_ASSERT("SnapshotEditor sceneUID " << m_scenesUID.at(i) <<" isn't a GenericScene?" , composite);
+
+        ::fwData::String::sptr dataInfo = ::fwData::String::New();
+
+        ::fwData::String::sptr sceneID = ::fwData::String::New();
+        sceneID->value() = m_scenesUID.at(i);
+        ::fwData::String::sptr filename = ::fwData::String::New();
+
+        filename->value() = this->requestFileName();
+        if(!filename->value().empty())
+        {
+            dataInfo->setField("sceneID", sceneID);
+            dataInfo->setField("filename", filename);
+            ::fwComEd::CompositeMsg::sptr compositeMsg = ::fwComEd::CompositeMsg::New();
+            compositeMsg->addEvent( "SNAP", dataInfo );
+            ::fwServices::IEditionService::notify(this->getSptr(), composite, compositeMsg);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void SSnapshot::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SSnapshot::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+std::string SSnapshot::requestFileName()
+{
+    std::string fileName = "";
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Save snapshot as");
+    dialogFile.addFilter("Image file","*.jpg *.jpeg *.bmp *.png *.tiff");
+    dialogFile.addFilter("jpeg","*.jpg *.jpeg");
+    dialogFile.addFilter("bmp","*.bmp");
+    dialogFile.addFilter("png","*.png");
+    dialogFile.addFilter("tiff","*.tiff");
+    dialogFile.addFilter("all","*.*");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        fileName = result->getPath().string();
+    }
+
+    return fileName;
+}
+
+//------------------------------------------------------------------------------
+
+} // action
+} // uiVisu
+
diff --git a/Bundles/LeafUI/uiVisuQt/CMakeLists.txt b/Bundles/LeafUI/uiVisuQt/CMakeLists.txt
new file mode 100644
index 0000000..6acb944
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/CMakeLists.txt
@@ -0,0 +1,25 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRuntime
+    fwTools
+    gui
+)
+
+find_package(Boost COMPONENTS filesystem REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(
+    ${Boost_LIBRARIES}
+    ${QT_LIBRARIES}
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafUI/uiVisuQt/COPYING b/Bundles/LeafUI/uiVisuQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafUI/uiVisuQt/COPYING.LESSER b/Bundles/LeafUI/uiVisuQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafUI/uiVisuQt/Properties.cmake b/Bundles/LeafUI/uiVisuQt/Properties.cmake
new file mode 100644
index 0000000..abee5d0
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME uiVisuQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGui fwGuiQt fwMath fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafUI/uiVisuQt/bin/build.options b/Bundles/LeafUI/uiVisuQt/bin/build.options
new file mode 100644
index 0000000..f563848
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/bin/build.options
@@ -0,0 +1,18 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+LIB     = [
+           'fwData_0-1',
+           'fwDataIO_0-2',
+           'fwServices_0-1',
+           'fwComEd_0-1',
+           'fwRuntime_0-3',
+           'fwCore_0-1',
+           'fwTools_0-1',
+           'fwGui_0-1',
+           'fwGuiQt_0-1'
+           ]
+USE     = ['qtCore','boost', 'boostFilesystem']
+BUNDLES = ['gui_0-1']
+
+
+
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/BasicFloatEditor.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/BasicFloatEditor.hpp
new file mode 100644
index 0000000..c79dcbd
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/BasicFloatEditor.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_BASICFLOATEDITOR_HPP_
+#define _UIVISUQT_BASICFLOATEDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+#include <QLineEdit>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiVisuQt/config.hpp"
+
+namespace uiVisu
+{
+
+/**
+ * @brief   BasicFloatEditor service permits to edit a float value.
+ * @class   BasicFloatEditor
+ * 
+ * @date    2011.
+ */
+class UIVISUQT_CLASS_API BasicFloatEditor : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (BasicFloatEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISUQT_API BasicFloatEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISUQT_API virtual ~BasicFloatEditor() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /// Install the layout.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Destroy the layout.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /// Configure the editor. Do nothing.
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+
+    /**
+     * @brief This method is called when the value change.
+     *
+     * Check if the value is a valid float, update the Float object value and notify the modification.
+     */
+    void onModifyValue(QString value);
+
+private:
+
+    QPointer< QLineEdit > m_valueCtrl;
+
+};
+
+} // uiVisu
+
+#endif // _UIVISUQT_BASICFLOATEDITOR_HPP_
+
+
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Namespace.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Namespace.hpp
new file mode 100644
index 0000000..d21f00f
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIVISUQTNAMESPACE_HPP_
+#define UIVISUQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace uiVisu supplies a service to take a snapshot of current scene. The graphic part was done with Qt
+ * @namespace   uiVisu
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace uiVisu
+{
+}
+#endif /* UIVISUQTNAMESPACE_HPP_ */
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Plugin.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Plugin.hpp
new file mode 100644
index 0000000..0645542
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/Plugin.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_PLUGIN_HPP_
+#define _UIVISUQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace uiVisu
+{
+/**
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+} // namespace uiVisu
+
+#endif //_UIVISUQT_PLUGIN_HPP_
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/PointEditor.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/PointEditor.hpp
new file mode 100644
index 0000000..d500c45
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/PointEditor.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_POINT_EDITOR_HPP
+#define _UIVISUQT_POINT_EDITOR_HPP
+
+
+#include <QObject>
+#include <QLineEdit>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwData/Point.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiVisuQt/config.hpp"
+
+namespace uiVisu
+{
+
+/**
+ * @brief   PointEditor service allows to display point information.
+ * @class   PointEditor
+ * 
+ * @date    2010.
+ */
+class UIVISUQT_CLASS_API PointEditor : public QObject, public ::gui::editor::IEditor
+{
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (PointEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISUQT_API PointEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISUQT_API virtual ~PointEditor() throw() ;
+
+protected:
+
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    ///This method launches the IEditor::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IEditor::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Management of observations ( overrides )
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    void updating() throw(::fwTools::Failed);
+
+    void swapping() throw(::fwTools::Failed);
+
+    void configuring() throw( ::fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+
+private:
+
+    QPointer< QLineEdit >   m_textCtrl_x;
+    QPointer< QLineEdit >   m_textCtrl_y;
+    QPointer< QLineEdit >   m_textCtrl_z;
+
+};
+
+} // uiData
+
+#endif /*_UIVISUQT_POINT_EDITOR_HPP_*/
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/SnapshotEditor.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/SnapshotEditor.hpp
new file mode 100644
index 0000000..10f79a1
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/SnapshotEditor.hpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_SNAPSHOTEDITOR_HPP_
+#define _UIVISUQT_SNAPSHOTEDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+
+#include <fwTools/Failed.hpp>
+#include <gui/editor/IEditor.hpp>
+
+#include "uiVisuQt/config.hpp"
+
+class QPushButton;
+
+namespace uiVisu
+{
+
+/**
+ * @brief   SnapshotEditor service is represented by a button. It allows to snap shot a generic scene.
+ * @class   SnapshotEditor
+ * 
+ * @date    2010.
+ */
+class UIVISUQT_CLASS_API SnapshotEditor : public QObject, public ::gui::editor::IEditor
+{
+
+    Q_OBJECT
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SnapshotEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISUQT_API SnapshotEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISUQT_API virtual ~SnapshotEditor() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /**
+     * @brief Install the layout.
+     */
+    virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Destroy the layout.
+     */
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configure the editor.
+     *
+     * Example of configuration
+     * @verbatim
+    <service uid="snapshotEditor" type="::gui::editor::IEditor" impl="::uiVisu::SnapshotEditor" autoConnect="no">
+        <snap>
+            <scene uid="genericScene" />
+        </snap>
+    </service>
+       @endverbatim
+       \b genericScene is the uid of the ::fwRenderVTK::VtkRenderService representing the generic scene which will be printed.
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /**
+     * @brief Show a file dialog and notify the scene must be printed.
+     */
+    void onSnapButton();
+
+private:
+    std::string requestFileName();
+
+    std::vector< std::string > m_scenesUID;
+
+    QPointer< QPushButton > m_snapButton;
+
+};
+
+} // uiVisu
+
+#endif /*_UIVISUQT_SNAPSHOTEDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/TransformationMatrixEditor.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/TransformationMatrixEditor.hpp
new file mode 100644
index 0000000..3175264
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/TransformationMatrixEditor.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_TRANSFORMATIONMATRIXEDITOR_HPP_
+#define _UIVISUQT_TRANSFORMATIONMATRIXEDITOR_HPP_
+
+#include <QObject>
+#include <QPointer>
+#include <QSlider>
+
+#include <fwTools/Failed.hpp>
+
+#include <gui/editor/IEditor.hpp>
+
+#include "uiVisuQt/config.hpp"
+
+namespace uiVisu
+{
+
+/**
+ * @brief   TransformationMatrixEditor service is represented by a slider. It update the rotation matrix from the slider angle value.
+ * @class   TransformationMatrixEditor
+ * 
+ * @date    2010.
+ */
+class UIVISUQT_CLASS_API TransformationMatrixEditor : public QObject, public ::gui::editor::IEditor
+{
+
+    Q_OBJECT
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (TransformationMatrixEditor)(::gui::editor::IEditor) ) ;
+
+    /// Constructor. Do nothing.
+    UIVISUQT_API TransformationMatrixEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    UIVISUQT_API virtual ~TransformationMatrixEditor() throw() ;
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    /// Install the layout.
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Destroy the layout.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+    /// Do nothing
+    virtual void swapping() throw(::fwTools::Failed);
+
+    /// Configure the editor. Do nothing.
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+protected Q_SLOTS:
+    /// Called when the slider value change.
+    void onSliderChange(int value);
+
+private:
+    QPointer< QSlider > m_angleSlider;
+
+
+};
+
+} // uiVisu
+
+#endif /*_UIVISUQT_TRANSFORMATIONMATRIXEDITOR_HPP_*/
+
+
diff --git a/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/config.hpp b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/config.hpp
new file mode 100644
index 0000000..e97f6d9
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/include/uiVisuQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _UIVISUQT_CONFIG_HPP_
+#define _UIVISUQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef UIVISUQT_EXPORTS
+    #define UIVISUQT_API __declspec(dllexport)
+    #else
+    #define UIVISUQT_API __declspec(dllimport)
+    #endif
+
+    #define UIVISUQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef UIVISUQT_EXPORTS
+    #define UIVISUQT_API __attribute__ ((visibility("default")))
+    #define UIVISUQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define UIVISUQT_API __attribute__ ((visibility("hidden")))
+    #define UIVISUQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define UIVISUQT_API
+    #define UIVISUQT_CLASS_API
+
+#endif
+
+#endif //_UIVISUQT_CONFIG_HPP_
diff --git a/Bundles/LeafUI/uiVisuQt/rc/plugin.xml b/Bundles/LeafUI/uiVisuQt/rc/plugin.xml
new file mode 100644
index 0000000..e30f6b4
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/rc/plugin.xml
@@ -0,0 +1,35 @@
+<plugin id="uiVisuQt" class="::uiVisuQt::Plugin">
+    <library name="uiVisuQt"/>
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiVisu::SnapshotEditor</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiVisu::TransformationMatrixEditor</service>
+        <object>::fwData::TransformationMatrix3D</object>
+    </extension>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiVisu::PointEditor</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::editor::IEditor</type>
+        <service>::uiVisu::BasicFloatEditor</service>
+        <object>::fwData::Float</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/BasicFloatEditor.cpp b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/BasicFloatEditor.cpp
new file mode 100644
index 0000000..ef22365
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/BasicFloatEditor.cpp
@@ -0,0 +1,185 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QHBoxLayout>
+#include <QDoubleValidator>
+#include <QApplication>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Float.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/FloatMsg.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiVisuQt/BasicFloatEditor.hpp"
+
+namespace uiVisu
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiVisu::BasicFloatEditor , ::fwData::Float ) ;
+
+
+BasicFloatEditor::BasicFloatEditor() throw()
+{
+//    addNewHandledEvent(::fwComEd::FloatMsg::VALUE_IS_MODIFIED);
+}
+
+//------------------------------------------------------------------------------
+
+BasicFloatEditor::~BasicFloatEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    ::fwData::Float::sptr floatObj = this->getObject< ::fwData::Float >();
+
+    QHBoxLayout* layout = new QHBoxLayout();
+    QDoubleValidator* doubleValidator = new QDoubleValidator( m_valueCtrl );
+
+    m_valueCtrl = new QLineEdit( container );
+    m_valueCtrl->setValidator( doubleValidator );
+    layout->addWidget( m_valueCtrl, 1);
+
+    container->setLayout( layout );
+
+    QObject::connect(m_valueCtrl, SIGNAL(textChanged(QString)), this, SLOT(onModifyValue(QString)));
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    QObject::disconnect(m_valueCtrl, SIGNAL(textChanged(QString)), this, SLOT(onModifyValue(QString)));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::fwGui::IGuiContainerSrv::initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Float::sptr floatObj = this->getObject< ::fwData::Float >();
+    SLM_ASSERT("Sorry, the object is null", floatObj);
+
+    std::stringstream ss;
+    ss << floatObj->value();
+    QString newText = QString::fromStdString(ss.str());
+    if(newText != m_valueCtrl->text())
+    {
+        m_valueCtrl->setText(newText);
+    }
+    OSLM_TRACE(floatObj->getID() << " updated value : " << ss.str());
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::swapping() throw(::fwTools::Failed)
+{
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::FloatMsg::csptr floatMsg = ::fwComEd::FloatMsg::dynamicConstCast(_msg);
+
+    if (floatMsg)
+    {
+        if(floatMsg->hasEvent(::fwComEd::FloatMsg::VALUE_IS_MODIFIED))
+        {
+            this->updating();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::info( std::ostream &_sstream )
+{
+    _sstream << "Float Editor";
+}
+
+//------------------------------------------------------------------------------
+
+void BasicFloatEditor::onModifyValue(QString value)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Float::sptr floatObj = this->getObject< ::fwData::Float >();
+    ::fwData::Float::sptr oldValue;
+    oldValue = ::fwData::Object::copy(floatObj);
+
+    std::string strValue = value.toStdString();
+
+    if (strValue.empty() || strValue == "-")
+    {
+        floatObj->value() = 0;
+    }
+    else if (value.endsWith( QString(",") ))
+    {
+        m_valueCtrl->setText( m_valueCtrl->text().replace(QChar(','), QChar('.')) );
+    }
+    else
+    {
+        int pos = 0;
+        QString str = m_valueCtrl->text();
+        bool isValid = (m_valueCtrl->validator()->validate(str, pos) == QValidator::Acceptable);
+
+        if (isValid)
+        {
+            floatObj->value() = ::boost::lexical_cast< ::fwData::Float::ValueType >(strValue);
+        }
+        else
+        {
+            this->updating();
+        }
+    }
+
+    if ( *oldValue != *floatObj )
+    {
+        OSLM_TRACE(floatObj->getID() << " new value : " << *floatObj);
+        ::fwComEd::FloatMsg::sptr msg = ::fwComEd::FloatMsg::New();
+        msg->addEvent( ::fwComEd::FloatMsg::VALUE_IS_MODIFIED );
+        ::fwServices::IEditionService::notify(this->getSptr(), floatObj, msg);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/Plugin.cpp b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/Plugin.cpp
new file mode 100644
index 0000000..9623399
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/Plugin.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/macros.hpp>
+
+#include "uiVisuQt/Plugin.hpp"
+
+namespace uiVisu
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::uiVisuQt::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace uiVisu
diff --git a/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/PointEditor.cpp b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/PointEditor.cpp
new file mode 100644
index 0000000..e282843
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/PointEditor.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QWidget>
+#include <QStringList>
+#include <QDoubleValidator>
+#include <QLabel>
+#include <QPalette>
+#include <QSpacerItem>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwComEd/InteractionMsg.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include "uiVisuQt/PointEditor.hpp"
+
+namespace uiVisu
+{
+
+    fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiVisu::PointEditor , ::fwData::Composite ) ;
+
+
+    PointEditor::PointEditor() throw()
+    {
+//        addNewHandledEvent(::fwComEd::InteractionMsg::MOUSE_MOVE);
+    }
+
+    //------------------------------------------------------------------------------
+
+    PointEditor::~PointEditor() throw()
+    {}
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::starting() throw(::fwTools::Failed)
+    {
+        SLM_TRACE_FUNC();
+        this->::fwGui::IGuiContainerSrv::create();
+
+        ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+        QWidget* const container = qtContainer->getQtContainer();
+        SLM_ASSERT("container not instanced", container);
+
+        QHBoxLayout* hLayout = new QHBoxLayout();
+
+        QLabel* staticText_x = new QLabel( tr("x:"), container);
+        hLayout->addWidget( staticText_x, 0, Qt::AlignVCenter );
+
+        m_textCtrl_x = new QLineEdit( container );
+        m_textCtrl_x->setValidator( new QDoubleValidator(m_textCtrl_x) );
+        hLayout->addWidget( m_textCtrl_x, 1, Qt::AlignVCenter );
+
+        QLabel* staticText_y = new QLabel( tr("y:"), container );
+        hLayout->addWidget( staticText_y, 0, Qt::AlignVCenter );
+
+        m_textCtrl_y = new QLineEdit( container );
+        m_textCtrl_y->setValidator( new QDoubleValidator(m_textCtrl_y) );
+        hLayout->addWidget( m_textCtrl_y, 1, Qt::AlignVCenter );
+
+        QLabel* staticText_z = new QLabel( tr("z:"), container );
+        hLayout->addWidget( staticText_z, 0, Qt::AlignVCenter );
+
+        m_textCtrl_z = new QLineEdit( container );
+        m_textCtrl_z->setValidator( new QDoubleValidator(m_textCtrl_z) );
+        hLayout->addWidget( m_textCtrl_z, 1, Qt::AlignVCenter );
+
+
+        container->setLayout( hLayout );
+        this->updating();
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::stopping() throw(::fwTools::Failed)
+    {
+        SLM_TRACE_FUNC();
+
+        this->getContainer()->clean();
+        this->::fwGui::IGuiContainerSrv::destroy();
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::configuring() throw(fwTools::Failed)
+    {
+        SLM_TRACE_FUNC();
+        this->::fwGui::IGuiContainerSrv::initialize();
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::updating() throw(::fwTools::Failed)
+    {
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::swapping() throw(::fwTools::Failed)
+    {
+        this->updating();
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+    {
+        SLM_TRACE_FUNC();
+        ::fwComEd::InteractionMsg::csptr interactionMsg = ::fwComEd::InteractionMsg::dynamicConstCast(_msg);
+
+        if (interactionMsg)
+        {
+            if ( interactionMsg->hasEvent( ::fwComEd::InteractionMsg::MOUSE_MOVE ) )
+            {
+                ::fwData::Point::csptr point = interactionMsg->getEventPoint();
+                SLM_ASSERT("Sorry, the object is null", point);
+                if(point)
+                {
+                    fwVec3d  pointCoord = point->getCoord();
+                    m_textCtrl_x->setText(QString("%1").arg(pointCoord[0], 0, 'f', 0));
+                    m_textCtrl_y->setText(QString("%1").arg(pointCoord[1], 0, 'f', 0));
+                    m_textCtrl_z->setText(QString("%1").arg(pointCoord[2], 0, 'f', 0));
+                }
+                //        this->updating();
+            }
+        }
+    }
+
+    //------------------------------------------------------------------------------
+
+    void PointEditor::info( std::ostream &_sstream )
+    {
+        _sstream << "Point Editor";
+    }
+
+    //------------------------------------------------------------------------------
+}
+
diff --git a/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/SnapshotEditor.cpp b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/SnapshotEditor.cpp
new file mode 100644
index 0000000..909ef68
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/SnapshotEditor.cpp
@@ -0,0 +1,216 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QWidget>
+#include <QString>
+#include <QIcon>
+#include <QPushButton>
+#include <QHBoxLayout>
+
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/op/Get.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/dialog/LocationDialog.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiVisuQt/SnapshotEditor.hpp"
+
+namespace uiVisu
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiVisu::SnapshotEditor , ::fwData::Object ) ;
+
+
+SnapshotEditor::SnapshotEditor() throw()
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+SnapshotEditor::~SnapshotEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget *container = qtContainer->getQtContainer();
+
+    ::boost::filesystem::path path(std::string(LIBSFW4SPL)+"Bundles/media_0-1/camera-photo.png"); //ever in a commit
+    QIcon icon(QString::fromStdString(path.string()));
+    m_snapButton = new QPushButton(icon, "", container);
+    m_snapButton->setToolTip(QObject::tr("Snapshot"));
+
+    QHBoxLayout *hlayout = new QHBoxLayout(container);
+    hlayout->addWidget(m_snapButton);
+    hlayout->setContentsMargins(0,0,0,0);
+
+    container->setLayout(hlayout);
+
+    QObject::connect(m_snapButton, SIGNAL(clicked()), this, SLOT(onSnapButton()));
+
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+
+    QObject::disconnect(m_snapButton, SIGNAL(clicked()), this, SLOT(onSnapButton()));
+
+    qtContainer->clean();
+    this->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->initialize();
+
+    std::vector < Configuration > snapConfig = m_configuration->find("snap");
+    if(!snapConfig.empty())
+    {
+        std::vector < Configuration > sceneConfig = snapConfig.at(0)->find("scene");
+        for(unsigned int i =0; i < sceneConfig.size(); i++)
+        {
+            OSLM_ASSERT("Wrong tag name: " << sceneConfig.at(i)->getName(), sceneConfig.at(i)->getName() == "scene");
+            SLM_ASSERT("UID attribute is missing", sceneConfig.at(i)->hasAttribute("uid"));
+
+            std::string value(sceneConfig.at(i)->getAttributeValue("uid"));
+            m_scenesUID.push_back(value);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::swapping() throw(::fwTools::Failed)
+{
+
+}
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SnapshotEditor::onSnapButton()
+{
+    SLM_TRACE_FUNC();
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget *container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+    if( container->isVisible() )
+    {
+        for(unsigned int i=0; i < m_scenesUID.size(); i++)
+        {
+            ::fwServices::IService::sptr service = ::fwServices::get(m_scenesUID.at(i));
+            ::fwData::Composite::sptr composite = service->getObject< ::fwData::Composite >();
+            SLM_ASSERT("SnapshotEditor sceneUID " << m_scenesUID.at(i) <<" isn't a GenericScene?" , composite);
+
+            ::fwData::String::sptr dataInfo = ::fwData::String::New();
+
+            ::fwData::String::sptr sceneID = ::fwData::String::New();
+            sceneID->value() = m_scenesUID.at(i);
+            ::fwData::String::sptr filename = ::fwData::String::New();
+
+            filename->value() = this->requestFileName();
+            if(!filename->value().empty())
+            {
+                dataInfo->setField("sceneID", sceneID);
+                dataInfo->setField("filename", filename);
+                ::fwComEd::CompositeMsg::sptr compositeMsg = ::fwComEd::CompositeMsg::New();
+                compositeMsg->addEvent( "SNAP", dataInfo );
+                ::fwServices::IEditionService::notify(this->getSptr(), composite, compositeMsg);
+            }
+        }
+    }
+    else
+    {
+        std::string msgInfo("Sorry, it is not possible to snapshot the negato view. This view is not shown on screen.");
+        ::fwGui::dialog::MessageDialog messageBox;
+        messageBox.setTitle("Negato view snapshot");
+        messageBox.setMessage( msgInfo );
+        messageBox.setIcon(::fwGui::dialog::IMessageDialog::WARNING);
+        messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+        messageBox.show();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string SnapshotEditor::requestFileName()
+{
+    std::string fileName = "";
+
+    ::fwGui::dialog::LocationDialog dialogFile;
+    dialogFile.setTitle("Save snapshot as");
+    dialogFile.addFilter("Image file","*.jpg *.jpeg *.bmp *.png *.tiff");
+    dialogFile.addFilter("jpeg","*.jpg *.jpeg");
+    dialogFile.addFilter("bmp","*.bmp");
+    dialogFile.addFilter("png","*.png");
+    dialogFile.addFilter("tiff","*.tiff");
+    dialogFile.addFilter("all","*.*");
+    dialogFile.setOption(::fwGui::dialog::ILocationDialog::WRITE);
+
+    ::fwData::location::SingleFile::sptr  result;
+    result= ::fwData::location::SingleFile::dynamicCast( dialogFile.show() );
+    if (result)
+    {
+        fileName = result->getPath().string();
+        dialogFile.saveDefaultLocation( ::fwData::location::Folder::New(result->getPath().parent_path()) );
+    }
+
+    return fileName;
+}
+//------------------------------------------------------------------------------
+
+}// namespace uiVisu
diff --git a/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/TransformationMatrixEditor.cpp b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/TransformationMatrixEditor.cpp
new file mode 100644
index 0000000..f4956ed
--- /dev/null
+++ b/Bundles/LeafUI/uiVisuQt/src/uiVisuQt/TransformationMatrixEditor.cpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QHBoxLayout>
+
+#include <cmath>
+#ifndef M_PI
+#define M_PI           3.14159265358979323846
+#endif
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "uiVisuQt/TransformationMatrixEditor.hpp"
+
+namespace uiVisu
+{
+
+fwServicesRegisterMacro( ::gui::editor::IEditor , ::uiVisu::TransformationMatrixEditor , ::fwData::TransformationMatrix3D ) ;
+
+
+TransformationMatrixEditor::TransformationMatrixEditor() throw()
+{
+//    addNewHandledEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED);
+}
+
+//------------------------------------------------------------------------------
+
+TransformationMatrixEditor::~TransformationMatrixEditor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->::fwGui::IGuiContainerSrv::create();
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( this->getContainer() );
+    QWidget* const container = qtContainer->getQtContainer();
+    SLM_ASSERT("container not instanced", container);
+
+    QHBoxLayout* layout = new QHBoxLayout();
+
+    m_angleSlider = new QSlider( Qt::Horizontal, container );
+    m_angleSlider->setRange(0, 360);
+
+    layout->addWidget( m_angleSlider, 1);
+
+    QObject::connect(m_angleSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChange(int)));
+
+    container->setLayout( layout );
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    QObject::disconnect(m_angleSlider, SIGNAL(valueChanged(int)), this, SLOT(onSliderChange(int)));
+
+    this->getContainer()->clean();
+    this->::fwGui::IGuiContainerSrv::destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::updating() throw(::fwTools::Failed)
+{
+    ::fwData::TransformationMatrix3D::sptr tm3D = this->getObject< ::fwData::TransformationMatrix3D >();
+
+    int angle = acos (tm3D->getCoefficient(0,0)) * 180.0 / M_PI;
+    m_angleSlider->setValue(angle);
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::swapping() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    if(_msg->hasEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED))
+    {
+        this->updating();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrixEditor::onSliderChange( int angle  )
+{
+    ::fwData::TransformationMatrix3D::sptr tm3D = this->getObject< ::fwData::TransformationMatrix3D >();
+
+    double angleRad = angle*M_PI/180.0;
+
+    double cosAngle = cos(angleRad);
+    double sinAngle = sin(angleRad);
+
+    tm3D->setCoefficient(0,0, cosAngle); tm3D->setCoefficient(0,1, -sinAngle); tm3D->setCoefficient(0,2, 0); tm3D->setCoefficient(0,3, 0);
+    tm3D->setCoefficient(1,0, sinAngle); tm3D->setCoefficient(1,1, cosAngle);  tm3D->setCoefficient(1,2, 0); tm3D->setCoefficient(1,2, 0);
+    tm3D->setCoefficient(2,0, 0);        tm3D->setCoefficient(2,1, 0);         tm3D->setCoefficient(2,2, 1); tm3D->setCoefficient(2,3, 0);
+    tm3D->setCoefficient(3,0, 0);        tm3D->setCoefficient(3,1, 0);         tm3D->setCoefficient(3,2, 0); tm3D->setCoefficient(3,3, 1);
+
+    ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+    msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), tm3D, msg);
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/LeafVisu/scene2D/CMakeLists.txt b/Bundles/LeafVisu/scene2D/CMakeLists.txt
new file mode 100644
index 0000000..9172e47
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/CMakeLists.txt
@@ -0,0 +1,22 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwData
+    fwRender
+    fwRuntime
+    fwServices
+)
+
+
+add_definitions("-DQT_NO_KEYWORDS")
+
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(${QT_INCLUDE_DIR})
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/LeafVisu/scene2D/COPYING b/Bundles/LeafVisu/scene2D/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/scene2D/COPYING.LESSER b/Bundles/LeafVisu/scene2D/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/scene2D/Properties.cmake b/Bundles/LeafVisu/scene2D/Properties.cmake
new file mode 100644
index 0000000..2f668ef
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME scene2D )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwCore fwData fwGuiQt fwRender fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/scene2D/bin/build.options b/Bundles/LeafVisu/scene2D/bin/build.options
new file mode 100644
index 0000000..1f4ca8d
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/bin/build.options
@@ -0,0 +1,14 @@
+TYPE = 'bundle'
+VERSION = '0-1'
+USE = ['qtGui']
+LIB     = [
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwRender_0-1',
+          'fwGuiQt_0-1'
+          ]
+BUNDLES = []
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/Plugin.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/Plugin.hpp
new file mode 100644
index 0000000..8155923
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/Plugin.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _SCENE2D_PLUGIN_HPP_
+#define _SCENE2D_PLUGIN_HPP_
+
+
+#include <fwRuntime/Plugin.hpp>
+
+
+namespace scene2D
+{
+/**
+* @brief   This class is started when the bundles is loaded.
+* @class   Plugin
+* 
+* @date    2010.
+*/
+
+struct Plugin : public ::fwRuntime::Plugin
+{
+
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    void stop() throw();
+
+};
+
+
+} // namespace scene2D
+
+
+#endif //_SCENE2D_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/Render.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/Render.hpp
new file mode 100644
index 0000000..09b8496
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/Render.hpp
@@ -0,0 +1,306 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_RENDER_HPP_
+#define _SCENE2D_RENDER_HPP_
+
+#include <Qt>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+#include <QResizeEvent>
+
+
+#include <fwRender/IRender.hpp>
+#include <scene2D/data/Axis.hpp>
+#include <scene2D/data/Viewport.hpp>
+
+
+#include "scene2D/config.hpp"
+#include "scene2D/data/Event.hpp"
+#include "scene2D/data/Coord.hpp"
+
+namespace  fwData
+{
+    class Composite;
+} //namespace fwData
+
+namespace scene2D
+{
+    // Not declared in the #include because of mutual inclusion.
+    class Scene2DGraphicsView;
+
+namespace adaptor
+{
+    // Not declared in the #include because of mutual inclusion.
+    class IAdaptor;
+}
+
+class SCENE2D_CLASS_API Render : public ::fwRender::IRender
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Render)(::fwRender::IRender) ) ;
+
+    /// A string type representing adaptors id.
+    typedef std::string AdaptorIDType;
+
+    /// A string type representing objects id.
+    typedef std::string ObjectIDType;
+
+    /// A float type representing adaptors zValue.
+    typedef float AdaptorZValueType;
+
+    /// Constructor, set coordinates m_sceneStart to (-100, -100), m_sceneWidth to (200, 200) and add new handle events
+    //  ADDED_KEYS, REMOVED_KEYS and CHANGED_KEYS.
+    SCENE2D_API Render() throw();
+
+    /// Basic destructor, do nothing.
+    SCENE2D_API virtual ~Render() throw();
+
+    /// Get the scene.
+    SCENE2D_API QGraphicsScene* getScene();
+
+    /// Get the view.
+    SCENE2D_API Scene2DGraphicsView* getView();
+
+    /// Get the viewport.
+    SCENE2D_API SPTR(::scene2D::data::Viewport) getViewport();
+
+    /// Get the object referenced in m_objectID2Object by the key _objectID.
+    SCENE2D_API SPTR(::fwData::Object) getRegisteredObject(ObjectIDType _objectID);
+
+    /// Iterate on the m_zValue2AdaptorID map and, if the event hasn't been accepted yet, call the adaptor processInteraction function.
+    SCENE2D_API void dispatchInteraction( SPTR(::scene2D::data::Event) _event );
+
+    /// Returns the viewport coordinate point mapped to scene coordinates.
+    SCENE2D_API ::scene2D::data::Coord mapToScene( const ::scene2D::data::Coord & coord ) const;
+
+    /// Returns what happens to scene's aspect ratio on view resize events
+    SCENE2D_API Qt::AspectRatioMode getAspectRatioMode();
+
+    /// Update scene size from items bounding rect, this bounding can be enlarged with ratioPercent parameter
+    SCENE2D_API void updateSceneSize( float ratioPercent = 0 );
+
+protected:
+    /**
+    * @brief Configuring the Render service.
+    *
+    * Example of configuration
+    * @verbatim
+    <service uid="GENERIC_UID_Scene2D" impl="::scene2D::Render" type="::fwRender::IRender" autoConnect="yes">
+
+        <scene>
+
+            <scene x="-1100" y="-1.1" width="2500" height="1.2" />
+
+            <viewport id="view1" x="-500" y="-1.1" width="500" height="1.2" />
+
+            <axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" />
+            <axis id="yAxis" origin="0.0" scale="-1.0" scaleType="LINEAR" />
+
+            <axis id="axeHistogramY" origin="0.0" scale="-0.000005" scaleType="LINEAR" />
+
+            <adaptor id="grid" class="::scene2D::adaptor::GridFromFloat" objectId="myData">
+                <config xMin="-1200" xMax="1500" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1"
+                    color="darkGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/>
+            </adaptor>
+
+        </scene>
+
+    </service>
+    @endverbatim
+    *
+    * - \<scene x="-1100" y="-1.1" width="2500" height="1.2" /\> : Set the scene coordinates
+    *
+    * \b x : mandatory : Set the x coordinate of the top left scene corner
+    *
+    * \b y : mandatory : Set the y coordinate of the top left scene corner
+    *
+    * \b width : mandatory : Set the width of the scene
+    *
+    * \b height : mandatory : Set the height of the scene
+    *
+    * \b antialiasing :  not mandatory : activate scene antialiasing if attribute's value set to 'true'
+    *
+    * - \<viewport id="view1" x="-500" y="-1.1" width="500" height="1.2" /\> : Set a viewport coordinates
+    *
+    * \b id : mandatory : Set the viewport id
+    *
+    * \b x : mandatory : Set the x coordinate of the top left viewport corner
+    *
+    * \b y : mandatory : Set the y coordinate of the top left viewport corner
+    *
+    * \b width : mandatory : Set the width of the viewport
+    *
+    * \b height : mandatory : Set the height of the viewport
+    *
+    * - \<axis id="xAxis" origin="0.0" scale="1.0" scaleType="LINEAR" /\> : Set an axis specifications
+    *
+    * \b id : mandatory : Set the axis id
+    *
+    * \b origin : mandatory : Set the axis origin
+    *
+    * \b scale : mandatory : Set the axis scale
+    *
+    * \b scaleType : mandatory : Set the axis scaleType
+    *
+    * - \<adaptor id="grid" class="::scene2D::adaptor::GridFromFloat" objectId="myData"\> : Set an adaptor
+    *
+    * \b id : mandatory : Set the adaptor id
+    *
+    * \b class : mandatory : Set the adaptor type
+    *
+    * \b objectId : mandatory : Set the adaptor related object id
+    *
+    * \b uid : no mandatory : Set the adaptor uid
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Call startContext to set the scene, the viewport and the view, and add'em to the QtContainer and start the adaptors
+    //  contained in the adaptors id vector of the ObjectsID2AdaptorIDVector map.
+    SCENE2D_API void starting()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void updating()    throw ( ::fwTools::Failed );
+
+    /// If the message is ADDED_KEYS, call the startAdaptorsFromComposite function to start all the adaptors contained
+    //  in the message composite.
+    SCENE2D_API void receiving( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// ToDo IM
+    SCENE2D_API void swapping()    throw ( ::fwTools::Failed );
+
+    /// Stop all the adaptors attached to the render related composite, stop all those rattached to the objects contained
+    //  by the render related composite, clear the maps and call stopContext().
+    SCENE2D_API void stopping()    throw ( ::fwTools::Failed );
+
+private:
+
+    /// A ConfigurationElement type representing a configuration.
+    typedef SPTR(::fwRuntime::ConfigurationElement) ConfigurationType;
+
+    /// An internal class to store adaptors representations.
+    class SceneAdaptor2D {
+
+        public:
+
+        /// Basic construtor, do nothing.
+        SceneAdaptor2D()
+        { }
+
+        /// Basic destructor, do nothing.
+        ~SceneAdaptor2D()
+        { }
+
+        /// Get the related service.
+        SPTR (adaptor::IAdaptor) getService()
+        {
+            return m_service.lock();
+        }
+
+        /// The adaptor uid.
+        std::string m_uid;
+
+        /// The adaptor type.
+        std::string m_type;
+
+        /// The adaptor config.
+        ConfigurationType m_config;
+
+        /// The adaptor service.
+        WPTR(::scene2D::adaptor::IAdaptor) m_service;
+
+    };
+
+    /// Create the QtContainer, the scene, the viewport, the view.
+    void startContext();
+
+    /// Delete m_scene and m_view;
+    void stopContext();
+
+    /// Ensure that the given adaptor has a unique value among all other adaptors.
+    void ensureUniqueZValue( SceneAdaptor2D _adaptee );
+
+    /// Get the axis configuration specifications, create a new axis, store it in the m_objectID2Object map and set its attributes.
+    void configureAxis ( ConfigurationType _conf );
+
+    /// Get the viewport configuration specifications, create a new viewport, store it in the m_objectID2Object map and set its attributes.
+    void configureViewport ( ConfigurationType _conf );
+
+    /// Get the scene configuration specifications and set them to m_sceneStart and m_sceneWidth.
+    void configureScene( ConfigurationType _conf );
+
+    /// Get the adaptor configuration specifications, push back the id attribute in the m_objectsID2AdaptorIDVector map, create a SceneAdaptor2D,
+    //  set its attributes and push it back in the m_adaptorID2SceneAdaptor2D map.
+    void configureAdaptor ( ConfigurationType _conf );
+
+    /// Get all the objects of the render related composite, and start all their related adaptors.
+    void startAdaptorsFromComposite( SPTR(::fwData::Composite) _composite);
+
+    /// Get all the objects of the render related composite, and stop all their related adaptors.
+    void stopAdaptorsFromComposite( SPTR(::fwData::Composite) _composite);
+
+    /// Get all the objects of the render related composite, and swap all their related adaptors.
+    void swapAdaptorsFromComposite( SPTR(::fwData::Composite) _composite);
+
+    /// Get the SceneAdaptor2D related to the _adaptorID key in the m_adaptorID2SceneAdaptor2D map, add a service corresponding to _object,
+    ///  set its render, its configuration, configure it, star it, check if its zValue is unique, store it in the m_zValue2AdaptorID map.
+    void startAdaptor(AdaptorIDType _adaptorID, SPTR(::fwData::Object) _object);
+
+    /// Swap the SceneAdaptor2D to _object.
+    void swapAdaptor(AdaptorIDType _adaptorID, SPTR(::fwData::Object) _object);
+
+    /// Stops the adaptor service, unregister it, reset it and erase the SceneAdaptor2D in
+    ////  the m_adaptorID2SceneAdaptor2D map.
+    void stopAdaptor(AdaptorIDType _adaptorID);
+
+    typedef std::map< ObjectIDType, std::vector<AdaptorIDType> > ObjectsID2AdaptorIDVector;
+
+    /// Map of std::vector<AdaptorIDType> referenced by ObjectIDType;
+    ObjectsID2AdaptorIDVector m_objectsID2AdaptorIDVector;
+    typedef std::map< AdaptorIDType, SceneAdaptor2D > AdaptorID2SceneAdaptor2D ;
+
+    /// Map of SceneAdaptor2D referenced by AdaptorIDType;
+    AdaptorID2SceneAdaptor2D m_adaptorID2SceneAdaptor2D;
+    typedef std::map< ObjectIDType, SPTR(::fwData::Object) > ObjectID2Object ;
+
+    /// Map of SPTR(::fwData::Object) referenced by ObjectIDType;
+    ObjectID2Object m_objectID2Object;
+    typedef std::map< AdaptorZValueType, AdaptorIDType > ZValue2AdaptorID;
+
+    /// Map of AdaptorIDType referenced by AdaptorZValueType;
+    ZValue2AdaptorID m_zValue2AdaptorID;
+
+    /// The render configuration.
+    ConfigurationType m_sceneConfiguration;
+
+    /// Coordinates of the scene top left corner.
+    ::scene2D::data::Coord m_sceneStart;
+
+    /// Width and height of the scene.
+    ::scene2D::data::Coord m_sceneWidth;
+
+    /// The scene.
+    QGraphicsScene * m_scene;
+
+    /// The view.
+    Scene2DGraphicsView * m_view;
+
+    /// If antialiasing is requested (deactivated by default because of a potential lack of performance)
+    bool m_antialiasing;
+
+    /// How the scene should behave on view resize events
+    Qt::AspectRatioMode m_aspectRatioMode;
+};
+
+
+
+} // namespace scene2D
+
+
+#endif // _SCENE2D_RENDER_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/Scene2DGraphicsView.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/Scene2DGraphicsView.hpp
new file mode 100644
index 0000000..fc30228
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/Scene2DGraphicsView.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_SCENE2DGRAPHICVIEW_HPP_
+#define _SCENE2D_SCENE2DGRAPHICVIEW_HPP_
+
+#include <QGraphicsView>
+#include <QResizeEvent>
+#include <QGraphicsScene>
+#include <QPaintEvent>
+
+#include "scene2D/config.hpp"
+#include "scene2D/data/Viewport.hpp"
+#include "scene2D/data/Event.hpp"
+
+namespace scene2D
+{
+
+class Render;
+
+class SCENE2D_CLASS_API Scene2DGraphicsView : public QGraphicsView
+{
+    Q_OBJECT
+
+public :
+
+    SCENE2D_API Scene2DGraphicsView(QGraphicsScene* scene, QWidget* widget);
+
+    /// Events
+
+    SCENE2D_API void keyPressEvent(QKeyEvent* _event);
+    
+    SCENE2D_API void keyReleaseEvent(QKeyEvent* _event);
+
+    SCENE2D_API void resizeEvent(QResizeEvent *_event);
+
+    SCENE2D_API void mouseReleaseEvent ( QMouseEvent * _event );
+
+    SCENE2D_API void mousePressEvent ( QMouseEvent * _event );
+
+    SCENE2D_API void mouseMoveEvent ( QMouseEvent * _event );
+
+    SCENE2D_API void mouseDoubleClickEvent ( QMouseEvent * _event );
+
+    SCENE2D_API void wheelEvent ( QWheelEvent * _event );
+
+
+
+    SCENE2D_API void updateFromViewport();
+
+    SCENE2D_API void setViewport( SPTR(::scene2D::data::Viewport) viewport );
+
+    SCENE2D_API void setSceneRender( SPTR(::scene2D::Render) sceneRender );
+
+protected :
+
+    WPTR(::scene2D::data::Viewport) m_viewport;
+    WPTR(::scene2D::Render) m_scene2DRender;
+
+    ::scene2D::data::Event::Button getScene2DButtonFromEvent( QMouseEvent* _event );
+    ::scene2D::data::Event::Modifier getScene2DModifierFromEvent( QInputEvent* _event );
+
+    void paintEvent ( QPaintEvent * event );
+
+};
+} // namespace scene2D
+
+
+#endif // _SCENE2D_SCENE2DGRAPHICVIEW_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Axis.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Axis.hpp
new file mode 100644
index 0000000..b5152df
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Axis.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_AXIS_HPP_
+#define _SCENE2D_AXIS_HPP_
+
+#include <scene2D/config.hpp>
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+
+class SCENE2D_CLASS_API Axis : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Axis)(::scene2D::adaptor::IAdaptor) ) ;
+
+    SCENE2D_API Axis() throw();
+    SCENE2D_API virtual ~Axis() throw();
+
+protected:
+
+    void doStart() throw( ::fwTools::Failed);
+    void doStop() throw( ::fwTools::Failed);
+    void doSwap() throw( ::fwTools::Failed);
+    void doUpdate() throw( ::fwTools::Failed);
+    void doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed);
+    void configuring() throw( ::fwTools::Failed);
+
+    /// Manage the given events
+    SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+private:
+
+    /// Builds axis graphic items.
+    void buildAxis();
+
+    ///
+    double getStartVal();
+
+    ///
+    double getEndVal();
+
+    // Specify where the axis must be aligned: left, right, top or bottom.
+    // Left and right side axis are aligned/floating relatively to the view.
+    std::string m_align;
+
+    /// The required interval between two consecutive values of the axis.
+    float m_interval;
+
+    /// Minimal value of the axis.
+    float m_min;
+
+    /// Maximal value of the axis.
+    float m_max;
+
+    /// Size of a tick.
+    float m_tickSize;
+
+    /// Color.
+    QPen m_color;
+
+    /// Tells if the line of the axis must be displayed in addition to ticks.
+    bool m_showLine;
+
+    // A layer that gathers all the graphic items.
+    QGraphicsItemGroup* m_layer;
+
+    /// The line of the axis.
+    QGraphicsLineItem* m_line;
+
+    /// The graphic items that refer to ticks of the axis.
+    std::vector< QGraphicsLineItem* > m_ticks;
+
+    /// The viewport that help us to scale the axis.
+    ::scene2D::data::Viewport::sptr m_viewport;
+
+    /// fWID of the viewport
+    std::string m_viewportID;
+
+    /// Connection to the viewport
+    ::fwCom::Connection m_connection;
+};
+
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
+#endif
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/CurvedHistogram.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/CurvedHistogram.hpp
new file mode 100644
index 0000000..b303010
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/CurvedHistogram.hpp
@@ -0,0 +1,144 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_CURVEDHISTOGRAM_HPP_
+#define _SCENE2D_ADAPTOR_CURVEDHISTOGRAM_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+/**
+ * @brief IAdaptor implementation for histogram data.
+ *
+ * Configuration example:
+ *
+   @verbatim
+   <adaptor id="histogram" class="::scene2D::adaptor::CurvedHistogram" objectId="myCurvedHistogram">
+       <config xAxis="xAxis" yAxis="axeCurvedHistogramY" borderColor="lightGray" innerColor="gray" opacity="0.25"
+               zValue="6" histogramPointUID="HistogramPointID" borderWidth="2.0" />
+   </adaptor>
+   @endverbatim
+ *
+ * - \b innerColor         : the background color of the histogram
+ * - \b borderColor        : the color of the histogram border
+ * - \b borderWidth        : the width of the histogram border
+ * - \b histogramPointUID  : the fwId of the histogram point. It is used with HistogramCursor and/or HistogramValue
+ *      adaptor to show information at the current histogram index pointed by the mouse.
+ * - \b opacity            : the opacity of the histogram (from 0.0 to 1.0)
+ * - \b xAxis              : see ::scene2D::adaptor::IAdaptor
+ * - \b yAxis              : see ::scene2D::adaptor::IAdaptor
+ * - \b zValue             : see ::scene2D::adaptor::IAdaptor
+ */
+class SCENE2D_CLASS_API CurvedHistogram : public ::scene2D::adaptor::IAdaptor
+{
+    public:
+        fwCoreServiceClassDefinitionsMacro( (CurvedHistogram)( ::scene2D::adaptor::IAdaptor) );
+
+        typedef ::scene2D::adaptor::IAdaptor::Point2DType Point;
+        typedef std::vector< Point > Points;
+
+        SCENE2D_API CurvedHistogram() throw();
+        SCENE2D_API virtual ~CurvedHistogram() throw();
+
+    protected:
+        SCENE2D_API void configuring()  throw ( ::fwTools::Failed );
+        SCENE2D_API void doStart()      throw ( ::fwTools::Failed );
+        SCENE2D_API void doUpdate()     throw ( ::fwTools::Failed );
+        SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+        SCENE2D_API void doSwap()       throw ( ::fwTools::Failed );
+        SCENE2D_API void doStop()       throw ( ::fwTools::Failed );
+
+        SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+        /// Ratio used for vertical scaling (default value: 1.1)
+        static const float SCALE;
+
+        /// The number of points between to points of the final Bezier curve to compute
+        static const float NB_POINTS_BEZIER;
+
+    private:
+
+        Points getControlPoints( ::fwData::Histogram::sptr _histogram );
+
+        Points getBSplinePoints( Points & _controlPoints );
+
+        Points getResampledBSplinePoints( Points & _bSplinePoints );
+
+        void buildBSplineFromPoints( Points & _bSplinePoints );
+
+        void computePointToPathLengthMapFromBSplinePoints( Points & _bSplinePoints );
+
+        /// Update the value of m_ordinateValueUID according to the value pointed by mouse cursor.
+        void updateCurrentPoint( ::scene2D::data::Event::sptr _event );
+
+        /// Build and add a part of histogram's border, according to the given path.
+        void addBorderItem( const QPainterPath & _path );
+
+        /// Build and add a part of the histogram, according to the given path.
+        void addInnerItem( const QPainterPath & _path );
+
+
+        Points linearInterpolation( const Point _p1, const Point _p2 );
+
+        Points cosinusInterpolation( const Point _p0, const Point _p1 );
+
+        Points quadraticInterpolation( const Point _p0, const Point _p1, const Point _p2 );
+
+        Points cubicInterpolation(
+                const Point _p0, const Point _p1, const Point _p2, const Point _p3 );
+
+
+        // Map the absciss of the points to the corresponding length within the path.
+        std::map<double, double> m_positionsToPathLength;
+
+        /// Color used for graphic histogram's border color
+        QPen m_borderColor;
+
+        // Color used for graphic histogram's inner color. If no value is supplied in the configuration,
+        // item's inner will be transparent
+        QPen m_innerColor;
+
+        /// Inner color.
+        QBrush m_brush;
+
+        // A Qt painter that is used to build a curve representing the shape of the histogram.
+        // Note that the histogram won't be built thanks to this path because of a lack of performance.
+        // In other words, this painter path won't be used to build a graphic item that will be added to 
+        // a Qt graphics scene. The graphic representation of the histogram will composed of multiple items
+        // build thanks to painters like this one, because it improves significantly the rendering performance.
+        // This painter path will be used to provide information about the hsitogram: for instance, it will help 
+        // to retrieve the coordinates of path's points.
+        QPainterPath * m_painterPath;
+
+        /// Width of histram's border
+        float m_borderWidth;
+
+        /// Current vertical scaling ratio
+        float m_scale;
+
+        // Graphis items contained into m_items are also added to this group item,
+        // which is then added to the scene.
+        // (This is the only graphic item which has to be added into the scene).
+        QGraphicsItemGroup* m_layer;
+
+        // Curve point at the current index of the histogram pointed by the mouse. This adaptor looks for 
+        // mouse move events: when the mouse cursor is onto the histogram, the corresponding point of the 
+        // histogram is informed into the object this UID is all about.
+        std::string m_histogramPointUID;
+};
+
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
+#endif  // _SCENE2D_ADAPTOR_CURVEDHISTOGRAM_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Grid2D.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Grid2D.hpp
new file mode 100644
index 0000000..6029559
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Grid2D.hpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_GRID2D_HPP_
+#define _SCENE2D_ADAPTOR_GRID2D_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+
+class SCENE2D_CLASS_API Grid2D : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Grid2D)(::scene2D::adaptor::IAdaptor) ) ;
+
+    enum LineType
+   {
+      PLAIN,
+      DOTTED
+   };
+
+    /// Constructor, set the x and y spacing to 10
+    SCENE2D_API Grid2D() throw();
+
+    /// Basic destructor, do nothing
+    SCENE2D_API virtual ~Grid2D() throw();
+
+protected:
+    /**
+    * @brief Configuring the Grid2D adaptor.
+    *
+    * Example of configuration
+    * @verbatim
+    <adaptor id="grid1" class="::scene2D::adaptor::Grid2D" objectId="self">
+        <config xMin="-1100" xMax="750" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1" 
+            color="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/>
+    </adaptor>
+    @endverbatim
+    * - \<config xMin="-1100" xMax="750" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1"
+    *   color="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/\> : Set the config.
+    *
+    * \b xMin : mandatory : Set the minimum x value of the grid.
+    *
+    * \b xMax : mandatory : Set the maximum x value of the grid.
+    *
+    * \b yMin : mandatory : Set the minimum y value of the grid.
+    *
+    * \b yMax : mandatory : Set the maximum y value of the grid.
+    *
+    * \b xSpacing : no mandatory (default value : 10) : Set the grid spacing (space between 2 consecutive lines) in x.
+    *
+    * \b ySpacing : no mandatory (default value : 10) : Set the grid spacing (space between 2 consecutive lines) in y.
+    *
+    * \b color : no mandatory (default value : black) : Set the color of the lines.
+    *
+    * \b xAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : 
+    * Set the x Axis of the grid layer.
+    *
+    * \b yAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : 
+    * Set the y Axis of the grid layer.
+    *
+    * \b zValue : no mandatory (default value : 0) : Set the zValue of the grid layer 
+    * (the higher the zValue, the higher the layer is).
+    *
+    * \b viewportUID : mandatory : a viewport that help us to manage the scaling of the graphic object
+    *
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Initialize the layer, set the pen style to DashLine and call the draw() function.
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    /// Clean the lines vector and remove the layer from the scene.
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    /// Manage the given events
+    SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+private:
+
+    /// Calculate the x/y start/end values, create the lines, set'em m_pen, push'em back in 
+    /// the m_lines vector, add'em to the layer, set the layer position and zValue and add it 
+    /// to the scene.
+    void draw();
+
+    ///
+    float getXStartVal();
+    
+    ///
+    float getXEndVal();
+    
+    ///
+    float getYStartVal();
+    
+    ///
+    float getYEndVal();
+
+    /// Bounds of the grid and spacing values for each axis.
+    float m_xMin, m_xMax, m_yMin, m_yMax, m_xSpacing, m_ySpacing;
+
+    // The type of the lines.
+    LineType m_lineType;
+
+    /// The pen.
+    QPen m_pen;
+
+    /// A vector containing QGraphicsItems representing the lines of the grid.
+    std::vector<QGraphicsItem*> m_lines;
+
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_GRID2D_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/GridFromFloat.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/GridFromFloat.hpp
new file mode 100644
index 0000000..262e141
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/GridFromFloat.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_GRIDFROMFLOAT_HPP_
+#define _SCENE2D_ADAPTOR_GRIDFROMFLOAT_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+
+class SCENE2D_CLASS_API GridFromFloat : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (GridFromFloat)(::scene2D::adaptor::IAdaptor) ) ;
+
+    enum LineType
+   {
+      PLAIN,
+      DOTTED
+   };
+
+    /// Constructor, set the x and y spacing to 10
+    SCENE2D_API GridFromFloat() throw();
+
+    /// Basic destructor, do nothing
+    SCENE2D_API virtual ~GridFromFloat() throw();
+
+protected:
+    /**
+    * @brief Configuring the GridFromFloat adaptor.
+    *
+    * Example of configuration
+    * @verbatim
+    <adaptor id="grid1" class="::scene2D::adaptor::GridFromFloat" objectId="myData">
+        <config xMin="-750" xMax="750" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1" color="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/>
+    </adaptor>
+    @endverbatim
+    *
+    * - objectId : ::fwData::Float
+    *
+    * - \<config xMin="-750" xMax="750" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1" color="lightGray"
+    * xAxis="xAxis" yAxis="yAxis" zValue="1"/\> : Set the config.
+    *
+    * \b xMin : mandatory : Set the minimum x value of the grid.
+    *
+    * \b xMax : mandatory : Set the maximum x value of the grid.
+    *
+    * \b yMin : mandatory : Set the minimum y value of the grid.
+    *
+    * \b yMax : mandatory : Set the maximum y value of the grid.
+    *
+    * \b xSpacing : no mandatory (default value : 10) : Set the grid spacing (space between 2 consecutive lines) in x.
+    *
+    * \b ySpacing : no mandatory (default value : 10) : Set the grid spacing (space between 2 consecutive lines) in y.
+    *
+    * \b color : no mandatory (default value : black) : Set the color of the lines.
+    *
+    * \b xAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the x Axis of the grid layer.
+    *
+    * \b yAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the y Axis of the grid layer.
+    *
+    * \b zValue : no mandatory (default value : 0) : Set the zValue of the grid layer (the higher the zValue, the higher the layer is).
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Initialize the layer, set the pen style to DashLine and call the draw() function.
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    /// If a VALUE_IS_MODIFIED message is catched, check if the float object isn't negative and if not, set the xSpacing its value.
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    /// Clean the lines vector and remove the layer from the scene.
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+private:
+
+    /// Remove the lines from the scene, clear the lines vector, calculate the x/y start/end values, create the lines, set'em m_pen, push'em back in the m_lines vector, add'em to the layer, set the layer position and zValue and add it to the scene.
+    void draw();
+
+    float m_xMin, m_xMax, m_yMin, m_yMax, m_xSpacing, m_ySpacing;
+    // The type of the lines.
+    LineType m_lineType;
+    /// The pen.
+    QPen m_pen;
+    /// A vector containing QGraphicsItems representing the lines of the grid.
+    std::vector<QGraphicsItem*> m_lines;
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_GRIDFROMFLOAT_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Histogram.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Histogram.hpp
new file mode 100644
index 0000000..3c995d9
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Histogram.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_HISTOGRAM_HPP_
+#define _SCENE2D_ADAPTOR_HISTOGRAM_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+/**
+ * @brief   IAdaptor implementation for histogram data.
+ *
+ * Configuration example:
+ *
+   @verbatim
+   <adaptor id="histogram" class="::scene2D::adaptor::Histogram" objectId="myHistogram">
+       <config xAxis="xAxis" yAxis="axeHistogramY" color="gray" opacity="0.25" zValue="5"/>
+   </adaptor>
+   @endverbatim
+ * 
+ * \b color (mandatory)     : the background color of the histogram
+ *
+ * \b opacity (mandatory)   : the opacity of the histogram (from 0.0 to 1.0)
+ *
+ * \b xAxis                 : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b yAxis                 : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b zValue                : see ::scene1D::adaptor::IAdaptor
+ */
+class SCENE2D_CLASS_API Histogram : public ::scene2D::adaptor::IAdaptor
+{
+    public:
+        fwCoreServiceClassDefinitionsMacro( (Histogram)( ::scene2D::adaptor::IAdaptor) );
+
+        SCENE2D_API Histogram() throw();
+        SCENE2D_API virtual ~Histogram() throw();
+
+    protected:
+        SCENE2D_API void configuring()  throw ( ::fwTools::Failed );
+        SCENE2D_API void doStart()      throw ( ::fwTools::Failed );
+        SCENE2D_API void doUpdate()     throw ( ::fwTools::Failed );
+        SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+        SCENE2D_API void doSwap()       throw ( ::fwTools::Failed );
+        SCENE2D_API void doStop()       throw ( ::fwTools::Failed );
+
+        SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+        /// Ratio used for vertical scaling (default value: 1.1)
+        static const float SCALE;
+        
+    private:
+        /// Update the value of m_ordinateValueUID according to the value pointed by mouse cursor.
+        void updateCurrentPoint( ::scene2D::data::Event::sptr _event );
+        
+        /// Color used for graphic item's inner and border color
+        QPen m_color;
+
+        /// Opacity
+        float m_opacity;
+
+        /// Current vertical scaling ratio
+        float m_scale;
+
+        // Graphis items contained into m_items are also added to this group item, 
+        // which is then added to the scene.
+        // (This is the only graphic item which has to be added into the scene).
+        QGraphicsItemGroup* m_layer;
+
+        // Curve point at the current index of the histogram pointed by the mouse. This adaptor looks for 
+        // mouse move events: when the mouse cursor is onto the histogram, the corresponding point of the 
+        // histogram is informed into the object this UID is all about.
+        std::string m_histogramPointUID;
+};
+
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
+#endif  // _SCENE2D_ADAPTOR_HISTOGRAM_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramCursor.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramCursor.hpp
new file mode 100644
index 0000000..bc9c4b7
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramCursor.hpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_HISTOGRAMCURSOR_HPP_
+#define _SCENE2D_HISTOGRAMCURSOR_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+#include <QGraphicsTextItem>
+
+#include "scene2D/data/Viewport.hpp"
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+/**
+ * @brief IAdaptor implementation to show a cursor on histogram pointed by mouse.
+ *
+ *
+ * \b xAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b yAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b zValue    : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b color     : inner color
+ *
+ * \b borderColor   : border color
+ *
+ * \b opacity   : from 0.0 to 1.0, default value is 0.8
+ *
+ * \b viewportUID : a viewport that help us to manage the scaling of the graphic object
+ *
+ */
+class HistogramCursor : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (HistogramCursor)(::scene2D::adaptor::IAdaptor) ) ;
+    SCENE2D_API HistogramCursor() throw();
+    SCENE2D_API virtual ~HistogramCursor() throw();
+
+protected:
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+    /// Color used for graphic item's inner color
+    QPen m_color;
+
+    /// Color used for graphic item's border color
+    QPen m_borderColor;
+
+    /// Opacity
+    float m_opacity;
+
+    // A graphics item that is located onto hsitogram's upper border and moves along this border
+    // according to the position of mouse's cursor. The goal of this graphical index is to show
+    // the associated value within the histogram pointed buy this index.
+    QGraphicsEllipseItem* m_index;
+
+    /// Coordinates of the current event.
+    ::scene2D::data::Coord m_coord;
+
+    ///
+    float m_pointSize;
+
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+
+    /// Curve point value at the current index of the histogram pointed by the mouse.
+    std::string m_histogramPointUID;
+
+private:
+
+    ::scene2D::data::Viewport::sptr m_viewport;
+
+    /// fWID of the viewport
+    std::string m_viewportID;
+
+    /// Connection to the viewport
+    ::fwCom::Connection m_connection;
+};
+
+
+}   // namespace adaptor
+}   // namespace scene2D
+
+#endif  // _SCENE2D_HISTOGRAMCURSOR_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramValue.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramValue.hpp
new file mode 100644
index 0000000..ffe7bfa
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/HistogramValue.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_HISTOGRAMVALUE_HPP_
+#define _SCENE2D_HISTOGRAMVALUE_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+#include <QGraphicsTextItem>
+
+#include "scene2D/data/Viewport.hpp"
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+/**
+ * @brief IAdaptor implementation to show the histogram values clicked by mouse.
+ *
+ *
+ * \b xAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b yAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b zValue    : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b color     : inner color
+ *
+ * \b fontSize  : size of the font used to display the current value
+ *
+ * \b opacity   : from 0.0 to 1.0, default value is 0.8
+ *
+ * \b viewportUID : a viewport that help us to manage the scaling of the graphic object
+ *
+ */
+class HistogramValue : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (HistogramValue)(::scene2D::adaptor::IAdaptor) ) ;
+    SCENE2D_API HistogramValue() throw();
+    SCENE2D_API virtual ~HistogramValue() throw();
+
+protected:
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+    /// Color used for graphic item's inner color
+    QPen m_color;
+
+    /// An item which display the current values of the associated histogram pointed by this cursor.
+    QGraphicsSimpleTextItem* m_text;
+
+    /// If true, display the currently pointed intensity value
+    bool m_isInteracting;
+
+    ///
+    QFont m_font;
+
+    /// Coordinates of the current event.
+    ::scene2D::data::Coord m_coord;
+
+    /// Size of the font used for rendering the current value of this tracker.
+    float m_fontSize;
+
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+
+    /// Curve point value at the current index of the histogram pointed by the mouse.
+    std::string m_histogramPointUID;
+
+private:
+
+    ::scene2D::data::Viewport::sptr m_viewport;
+
+    /// fWID of the viewport
+    std::string m_viewportID;
+
+    /// Connection to the viewport
+    ::fwCom::Connection m_connection;
+};
+
+
+}   // namespace adaptor
+}   // namespace scene2D
+
+#endif  // _SCENE2D_HISTOGRAMVALUEHPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/IAdaptor.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/IAdaptor.hpp
new file mode 100644
index 0000000..d178bd1
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/IAdaptor.hpp
@@ -0,0 +1,178 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_IADAPTOR_HPP_
+#define _SCENE2D_ADAPTOR_IADAPTOR_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "scene2D/config.hpp"
+#include "scene2D/Render.hpp"
+#include "scene2D/data/Axis.hpp"
+#include "scene2D/data/Event.hpp"
+
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+class SCENE2D_CLASS_API IAdaptor : public ::fwServices::IService
+{
+
+public:
+
+    // Point2D coordinate <X, Y>
+    typedef std::pair< double, double > Point2DType;
+
+    // <width, height>
+    typedef std::pair<float, float> ViewSizeRatio;
+
+    // <width, height>
+    typedef std::pair<float, float> ViewportSizeRatio;
+
+    // <width, height>
+    typedef std::pair<float, float> Scene2DRatio;
+
+    fwCoreServiceClassDefinitionsMacro ( (IAdaptor)(::fwServices::IService) ) ;
+
+    /// Set the zValue.
+    SCENE2D_API void setZValue(float _zValue);
+
+    /// Get the zValue.
+    SCENE2D_API float getZValue();
+
+    /// Set the render that manage the IAdaptor.
+    SCENE2D_API void setScene2DRender( ::scene2D::Render::sptr _scene2DRender);
+
+    /// Get the render that manage the IAdaptor.
+    SCENE2D_API SPTR(::scene2D::Render) getScene2DRender();
+
+    /// Get the object associated to the IAdaptor.
+    SCENE2D_API ::fwData::Object::sptr getRegisteredObject(::scene2D::Render::ObjectIDType _objectId);
+
+    /// Interact with the mouse events catched on the IAdaptor (virtual function, its behavior is only defined in the specific adaptors).
+    SCENE2D_API virtual void processInteraction( ::scene2D::data::Event::sptr _event );
+
+protected:
+
+    /// Constructor, set the zValue to 0.
+    SCENE2D_API IAdaptor() throw();
+
+    /// Basic destructor, do nothing.
+    SCENE2D_API virtual ~IAdaptor() throw();
+
+
+    /// ToDo IM
+    SCENE2D_API virtual void info(std::ostream &_sstream ) ;
+
+    /// Not implemented in IAdaptor but in its subclasses
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Call doStart() function.
+    SCENE2D_API void starting() throw ( ::fwTools::Failed );
+
+    /// Call DoUpdate() function.
+    SCENE2D_API void updating() throw ( ::fwTools::Failed );
+
+    /// Call DoUpdate(_msg) function.
+    SCENE2D_API void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Start and stop the IAdaptor.
+    SCENE2D_API void swapping() throw ( ::fwTools::Failed );
+
+    /// Call doStop() function and reset the axis.
+    SCENE2D_API void stopping()    throw ( ::fwTools::Failed );
+
+    /// Pure virtual -> implemented in the subclasses
+    SCENE2D_API virtual void doStart() = 0;
+
+    /// Pure virtual -> implemented in the subclasses
+    SCENE2D_API virtual void doUpdate() = 0;
+
+    /// Pure virtual -> implemented in the subclasses
+    SCENE2D_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) = 0;
+
+    /// Pure virtual -> implemented in the subclasses
+    SCENE2D_API virtual void doSwap() = 0;
+
+    /// Pure virtual -> implemented in the subclasses
+    SCENE2D_API virtual void doStop() = 0;
+
+    /// Get a pair of doubles (a point), two axis, and convert the pair of doubles values from adaptor
+    //  coordinates to scene coordinates
+    SCENE2D_API Point2DType mapAdaptorToScene(Point2DType _xy, ::scene2D::data::Axis::sptr _xAxis, ::scene2D::data::Axis::sptr _yAxis);
+
+    /// Get a pair of doubles (a point), two axis, and convert the pair of doubles values from scene
+    //  coordinates to adaptor coordinates
+    SCENE2D_API Point2DType mapSceneToAdaptor(Point2DType _xy, ::scene2D::data::Axis::sptr _xAxis, ::scene2D::data::Axis::sptr _yAxis);
+
+    /// Return the ratio between view's initial size and its current size
+    SCENE2D_API ViewSizeRatio getViewSizeRatio();
+
+    /// Return the ratio between viewport's initial size and its current size
+    SCENE2D_API ViewportSizeRatio getViewportSizeRatio();
+
+    /// Initialize the source values used for computing view's size ratio.
+    SCENE2D_API void initializeViewSize();
+
+    /// Initialize the source values used for computing viewport's size ratio.
+    SCENE2D_API void initializeViewportSize();
+
+    SCENE2D_API Scene2DRatio getRatio();
+
+    /// The x Axis.
+    SPTR(::scene2D::data::Axis) m_xAxis;
+
+    /// The y Axis.
+    SPTR(::scene2D::data::Axis) m_yAxis;
+
+    /// The adaptor zValue (depth within the scene). The adaptor with the highest zValue is displayed on top of all adaptors.
+    float m_zValue;
+
+    /// Opacity of the adaptor. Default value set to 1 (opaque).
+    float m_opacity;
+
+    /// Initial size of the widget (view). The goal of keeping a reference on the initial size is to
+    /// avoid unwanted scaling onto some objects (such as transfer function points, histogram cursor,
+    /// etc) when a resize event is caught.
+    ViewSizeRatio m_viewInitialSize;
+
+    /// Initial size of the viewport. The goal of keeping a reference on the initial size of the
+    /// viewport is the same as preceding.
+    ViewportSizeRatio m_viewportInitialSize;
+
+    typedef std::vector< ::scene2D::adaptor::IAdaptor::wptr > ManagedAdaptorVector;
+
+    /// Return all managed adaptor
+    SCENE2D_API ManagedAdaptorVector & getRegisteredServices() { return m_managedAdaptors; };
+
+    /// Register new adaptor
+    SCENE2D_API void registerService( ::scene2D::adaptor::IAdaptor::sptr srv );
+
+    /// Unregister all adaptors
+    SCENE2D_API void unregisterServices();
+private:
+
+    /// Register automatic connection on object
+    ::fwServices::helper::SigSlotConnection::sptr m_connections;
+
+    /// All managed adaptors
+    ManagedAdaptorVector m_managedAdaptors;
+
+    /// The render that manage the IAdaptor.
+    ::scene2D::Render::wptr m_scene2DRender;
+
+};
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_IADAPTOR_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Line.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Line.hpp
new file mode 100644
index 0000000..ab3fc27
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Line.hpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_LINE_HPP_
+#define _SCENE2D_ADAPTOR_LINE_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+class SCENE2D_CLASS_API Line : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Line)(::scene2D::adaptor::IAdaptor) ) ;
+
+    enum LineType
+   {
+      PLAIN,
+      DOTTED
+   };
+
+    /// Basic constructor, do nothing.
+    SCENE2D_API Line() throw();
+
+    /// Basic destructor, do nothing.
+    SCENE2D_API virtual ~Line() throw();
+
+protected:
+    /**
+    * @brief Configuring the Line adaptor.
+    *
+    * Example of configuration
+    * @verbatim
+    <adaptor id="abscissa" class="::scene2D::adaptor::Line" objectId="self">
+        <config x1="-500" x2="500" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" />
+    </adaptor>
+    @endverbatim
+    * - \<config x1="-500" x2="500" y1="0" y2="0" color="white" xAxis="xAxis" yAxis="yAxis" zValue="2" /\> : Set the config.
+    *
+    * \b x1 : mandatory : Set the line begining coordinate x value.
+    *
+    * \b x2 : mandatory : Set the line ending coordinate x value.
+    *
+    * \b y1 : mandatory : Set the line begining coordinate y value.
+    *
+    * \b y2 : mandatory : Set the line ending coordinate y value.
+    *
+    * \b color : no mandatory (default value : black) : Set the color of the line.
+    *
+    * \b xAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the x Axis of the line layer.
+    *
+    * \b yAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the y Axis of the line layer.
+    *
+    * \b zValue : no mandatory (default value : 0) : Set the zValue of the line layer (the higher the zValue, the higher the layer is).
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Initialize the layer and call the draw() function.
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    /// Remove the layer from the scene.
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+private:
+
+    /// Create the line, set it m_pen, add it to the layer, set the layer position and zValue and add it to the scene.
+    void draw();
+
+    // The coordinates of the line.
+    float m_x1, m_x2, m_y1, m_y2;
+    // The type of the line.
+    LineType m_lineType;
+    /// The pen.
+    QPen m_pen;
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_LINE_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Negato.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Negato.hpp
new file mode 100644
index 0000000..69794ac
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Negato.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_NEGATO_HPP_
+#define _SCENE2D_ADAPTOR_NEGATO_HPP_
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "scene2D/adaptor/IAdaptor.hpp"
+#include "scene2D/data/Coord.hpp"
+
+#include <QImage>
+#include <QGraphicsItemGroup>
+#include <QPointF>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+class SCENE2D_CLASS_API Negato : public ::fwComEd::helper::MedicalImageAdaptor, public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Negato)(::scene2D::adaptor::IAdaptor) ) ;
+
+    SCENE2D_API Negato() throw();
+    SCENE2D_API virtual ~Negato() throw();
+
+protected:
+
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+private:
+
+    QImage * createQImage();
+    void updateBufferFromImage( QImage * qimg );
+    void changeImageMinMaxFromCoord( scene2D::data::Coord & oldCoord, scene2D::data::Coord & newCoord );
+
+    QRgb getQImageVal(const unsigned int index, signed short* buffer,
+            const double wlMin, const double wlMax, const double window,
+            const double tfMin, const double tfMax,
+            ::fwData::TransferFunction::sptr tf);
+
+    QImage * m_qimg;
+    QGraphicsPixmapItem * m_pixmapItem;
+    QGraphicsItemGroup* m_layer;
+
+    /// The current orientation of the negato
+    ::fwComEd::helper::MedicalImageAdaptor::Orientation m_orientation;
+
+    /// Used during negato interaction to manage window/level
+    bool m_pointIsCaptured;
+
+    /// Ref. position when changing image window/level
+    scene2D::data::Coord m_oldCoord;
+
+    /// Specify if the negato allow slice type events
+    bool m_changeSliceTypeAllowed;
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_NEGATO_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ScaleValues.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ScaleValues.hpp
new file mode 100644
index 0000000..bbe80f0
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ScaleValues.hpp
@@ -0,0 +1,168 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_SCALEVALUES_HPP_
+#define _SCENE2D_ADAPTOR_SCALEVALUES_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+
+class SCENE2D_CLASS_API ScaleValues : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ScaleValues)(::scene2D::adaptor::IAdaptor) ) ;
+
+    /// Constructor, set the x and y spacing to 10
+    SCENE2D_API ScaleValues() throw();
+
+    /// Basic destructor, do nothing
+    SCENE2D_API virtual ~ScaleValues() throw();
+
+protected:
+    /**
+    * @brief Configuring the ScaleValues adaptor.
+    *
+    * Example of configuration
+    * @verbatim
+    <adaptor id="scaleValues" class="::scene2D::adaptor::ScaleValues" objectId="self">
+        <config xMin="-1100" xMax="750" yMin="0" yMax="1" xSpacing="100" ySpacing="0.1" 
+            color="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/>
+    </adaptor>
+    @endverbatim
+    * - \<config xMin="-1100" xMax="750" yMin="-0.7" yMax="1.7" xSpacing="100" ySpacing="0.1"
+    *   color="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="1"/\> : Set the config.
+    *
+    * \b xMin : mandatory : Set the minimum X value to display.
+    *
+    * \b xMax : mandatory : Set the maximum X value to display.
+    *
+    * \b yMin : mandatory : Set the minimum Y value to display.
+    *
+    * \b yMax : mandatory : Set the maximum Y value to display.
+    *
+    * \b xInterval : no mandatory (default value : 10) : Set the interval between 2 consecutive values on the X axis.
+    *
+    * \b yInterval : no mandatory (default value : 10) : Set the interval between 2 consecutive values on the Y axis.
+    *
+    * \b color : no mandatory (default value : white) : Set the foreground color of the values.
+    *
+    * \b xAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : 
+    * Set the X axis of this adaptor.
+    *
+    * \b yAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : 
+    * Set the Y axis of this adaptor.
+    *
+    * \b zValue : no mandatory (default value : 0) : Set the zValue of this adaptor
+    * (the higher the zValue, the higher the layer is).
+    *
+    * \b viewportUID : mandatory : a viewport that help us to manage the scaling of the graphic object
+    *
+    * \b showXScale : no mandatory : tells if the scale on the X axis has to be shown (value: "true" or "false")
+    *
+    * \b showYScale : no mandatory : tells if the scale on the Y axis has to be shown (value: "true" or "false")
+    *
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Initialize the layer, set the pen style to DashLine and call the draw() function.
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Do nothing.
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    /// Clean the lines vector and remove the layer from the scene.
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    /// Manage the given events
+    SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+private:
+
+    void buildValues();
+
+    ///
+    void rescaleValues();
+
+    ///
+    double getStartVal();
+
+    ///
+    double getEndVal();
+
+    /// Show or hide values which don't have enough space to be displayed correctly.
+    void showHideScaleValues();
+
+    /// Bounds of the grid and spacing values for each axis.
+    float m_min, m_max;
+
+    ///
+    double m_interval;
+
+    /// Tells if the unit of the axis must be displayed.
+    bool m_showUnit;
+
+    /// The unit of this values as text.
+    QGraphicsSimpleTextItem* m_unit;
+
+    /// The unit  of the axis (as text) that will be displayed.
+    std::string m_displayedUnit;
+
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+
+    // Specify where the axis must be aligned: left, right, top or bottom.
+    // Left and right side axis are aligned/floating relatively to the view.
+    std::string m_align;
+
+    /// The font applied to grid's values.
+    QFont m_font;
+
+    /// The color applied to grid's values.
+    QBrush m_brush;
+
+    /// A vector containing QGraphicsItem-s representing the scale values of the axis.
+    std::vector<QGraphicsItem*> m_values;
+
+    /// Communication channel between this adaptor and the viewport.
+    ::fwCom::Connection m_connection;
+
+    /// fWID of the viewport
+    std::string m_viewportID;
+
+    /// The viewport that help us to scale the graphic items which represent axis values.
+    ::scene2D::data::Viewport::sptr m_viewport;
+
+    /// The pen.
+    QPen m_pen;
+
+    // The step which defines when a value of the axis should be displayedn if there is not
+    // enough space to display all the values.
+    int m_step;
+
+    /// Size of the font used for rendering grid values.
+    float m_fontSize;
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_GRID2D_HPP_
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Sin.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Sin.hpp
new file mode 100644
index 0000000..5e39007
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Sin.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_SIN_HPP_
+#define _SCENE2D_ADAPTOR_SIN_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+class SCENE2D_CLASS_API Sin : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Sin)(::scene2D::adaptor::IAdaptor) ) ;
+
+    SCENE2D_API Sin() throw();
+    SCENE2D_API virtual ~Sin() throw();
+
+protected:
+    SCENE2D_API void configuring() throw (::fwTools::Failed);
+    SCENE2D_API void doStart();
+    SCENE2D_API void doUpdate();
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg );
+    SCENE2D_API void doSwap();
+    SCENE2D_API void doStop();
+
+private:
+    float m_xMin, m_xMax;
+};
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_SIN_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Square.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Square.hpp
new file mode 100644
index 0000000..323eb35
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/Square.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_SQUARE_HPP_
+#define _SCENE2D_ADAPTOR_SQUARE_HPP_
+
+#include <QGraphicsItem>
+
+#include "scene2D/adaptor/IAdaptor.hpp"
+#include "scene2D/data/Coord.hpp"
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+class SCENE2D_CLASS_API Square : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Square)(::scene2D::adaptor::IAdaptor) ) ;
+
+    SCENE2D_API Square() throw();
+    SCENE2D_API virtual ~Square() throw();
+
+protected:
+
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart() throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate() throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop() throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+    SCENE2D_API void setColor( std::string _color );
+    SCENE2D_API bool coordViewIsInItem( const ::scene2D::data::Coord & coord, QGraphicsItem * item );
+    SCENE2D_API ::scene2D::data::Coord coordViewToCoordItem( const ::scene2D::data::Coord & coord, QGraphicsItem * item );
+
+private:
+
+    ::scene2D::data::Coord m_coord;
+    ::boost::uint32_t m_size;
+    QColor m_color;
+    QGraphicsItemGroup* m_layer;
+    QGraphicsRectItem* m_rec;
+    ::scene2D::data::Coord m_oldCoord;
+
+    bool m_pointIsCaptured;
+};
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_SQUARE_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/TransferFunction.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/TransferFunction.hpp
new file mode 100644
index 0000000..624f8fc
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/TransferFunction.hpp
@@ -0,0 +1,197 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_TRANSFERFUNCTION_HPP_
+#define _SCENE2D_ADAPTOR_TRANSFERFUNCTION_HPP_
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+class SCENE2D_CLASS_API TransferFunction : public ::fwComEd::helper::MedicalImageAdaptor, public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (TransferFunction)(::scene2D::adaptor::IAdaptor) ) ;
+
+    /// Enumeration of authorized line types
+    enum LineType
+   {
+      PLAIN,
+      DOTTED
+   };
+
+    /// Constructor, add handle events TRANSFERFUNCTION and WINDOWING.
+    SCENE2D_API TransferFunction() throw();
+
+    /// Basic destructor, do nothing.
+    SCENE2D_API virtual ~TransferFunction() throw();
+
+protected:
+    /**
+    * @brief Configuring the TransferFunction adaptor.
+    *
+    * Example of configuration
+    * @verbatim
+    <adaptor id="tf2" class="::scene2D::adaptor::TransferFunction" objectId="myImage">
+        <config lineColor="lightGray" circleColor="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="4"/>
+    </adaptor>
+    @endverbatim
+    * - \<config lineColor="lightGray" circleColor="lightGray" xAxis="xAxis" yAxis="yAxis" zValue="4"/\> : Set the config.
+    *
+    * \b lineColor : no mandatory (default value : black) : Set the color of the lines between the TF points.
+    *
+    * \b circleColor : no mandatory (default value : black) : Set the outline color of the circles representing the TF points.
+    *
+    * \b xAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the x Axis of the TF layer.
+    *
+    * \b yAxis : no mandatory (default value : ::scene2D::data::Axis::New() : m_origin (0), m_scale (1), m_scaleType (LINEAR)) : Set the y Axis of the TF layer.
+    *
+    * \b zValue : no mandatory (default value : 0) : Set the zValue of the TF layer (the higher the zValue, the higher the layer is).
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Initialize the layer m_layer (QGraphicsGroupItem), m_circleWidth and m_circleHeight from the viewport
+    ///  dimensions, and call DoUpdate().
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    /// Call buildTFPoints(), buildCircles(), buildLinesAndPolygons() and buildLayer() to build the tf points map,
+    ///  the circles vector, the lines and polygons vector, and to add'em all to the layer and add it to the scene.
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    /// If the message is TRANSFERFUNCTION or WINDOWING, call DoUpdate().
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// @todo
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    /// Clear the m_circles and m_linesAndPolygons vectors and remove the layer (and therefore all it's related
+    ///  items) from the scene.
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    /// Iterate m_circles vector (and in parallel m_TFPoints map) and, as the case, call the function associated
+    ///  to a specific event.
+    SCENE2D_API void processInteraction( SPTR(::scene2D::data::Event) _event );
+
+private:
+
+    /// Convert the view coordinates to item coordinates.
+    SCENE2D_API ::scene2D::data::Coord coordViewToCoordItem( const ::scene2D::data::Coord & _coord );
+
+    /// Get the selected tf of the image, calculate the window and the level, clear the m_TFPoints map and fill
+    ///  it with the tf points of the selected tf.
+    SCENE2D_API void buildTFPoints();
+
+    /// Remove all circle items from the scene, clear the m_circles vector and push it back circles generated
+    ///  from m_TFPoints.
+    SCENE2D_API void buildCircles();
+
+    /// From an iterator on the m_TFPoints map, create a QGraphicsEllipseItem, give it the appropriated color
+    ///  and pen, and return it.
+    SCENE2D_API QGraphicsEllipseItem* buildCircle(::fwData::TransferFunction::TFValueType value,
+                                    ::fwData::TransferFunction::TFColor color);
+
+    /// Remove all line and polygon items from the scene, clear the m_linesAndPolygons vector, and push it back
+    ///  lines and gradient polygons generated from m_circles.
+    SCENE2D_API void buildLinesAndPolygons();
+
+    /// Create lines and gradient polygons generated from m_circles
+    SCENE2D_API void buildLinearLinesAndPolygons();
+
+    /// Create lines and polygons generated from m_circles
+    SCENE2D_API void buildNearestLinesAndPolygons();
+
+    /// Build lines on TF bounds with color of first/last point (use when TF is not clamped)
+    SCENE2D_API void buildBounds();
+
+    /// Add the items from m_circles and m_linesAndPolygons to m_layer, set its position and its zValue and add
+    /// it to the scene.
+    SCENE2D_API void buildLayer();
+
+    /// Clear the selected tf, rebuilt it from m_TFPoints (building TransferFunctionPoints and inserting'em),
+    ///  update image min and max, and notify the image with a TRANSFERFUNCTION message.
+    SCENE2D_API void updateImageTF();
+
+    /// Open a color dialog and change the selected tf point color
+    SCENE2D_API void doubleClickEvent(QGraphicsEllipseItem* circle, ::fwData::TransferFunction::TFColor& tfColor);
+
+    /// Store the circle selected and its coordinates, and set its outline yellow
+    SCENE2D_API void leftButtonEvent(QGraphicsEllipseItem* circle, ::scene2D::data::Event::sptr _event);
+
+    /// Check if the mouse is out of bounds, as the case, move the circle on x and y, x or y, destroy the related
+    /// point in the tf points map, create a new one with the new coord as key and alpha, rescale the tf map
+    /// to 0-1 and update the image tf.
+    SCENE2D_API void mouseMoveEvent(QGraphicsEllipseItem* circle,
+            ::fwData::TransferFunction::TFValueType tfPoint, ::scene2D::data::Event::sptr _event);
+
+    /// Reset the circle pen to the selected circle
+    SCENE2D_API void mouseButtonReleaseEvent(QGraphicsEllipseItem* circle, ::scene2D::data::Event::sptr _event);
+
+    /// Erase the selected point
+    SCENE2D_API void rightButtonEvent(::fwData::TransferFunction::TFValueType tfPoint, ::scene2D::data::Event::sptr _event);
+
+    /// Create a new point without modifying the TF (placed between the 2 encompassing points with linear
+    /// interpolation)
+    SCENE2D_API void doubleClickEvent( ::scene2D::data::Event::sptr _event);
+
+    /// Return the x coordinate of the center of the circle in a 0-1 scale (for storage in m_TFPoints).
+    SCENE2D_API double pointValue(QGraphicsEllipseItem* circle);
+
+    /// The line pen (see "lineColor" config attribute) and circle pen (see "circleColor" config attribute).
+    QPen m_linePen, m_circlePen;
+
+    /// A vector containing QGraphicsItems representing the lines between tf points and the filling gradient
+    /// polygons.
+    std::vector< QGraphicsItem* > m_linesAndPolygons;
+
+    /// A vector containing QGraphicsEllipseItems representing the circles representing the tf points.
+    std::vector< QGraphicsEllipseItem* > m_circles;
+
+    /// The layer.
+    QGraphicsItemGroup* m_layer;
+
+    /// The selected tf level and window, and width/height of the circles.
+    double m_circleWidth, m_circleHeight;
+
+    /// The map associating a key representing the value of a tf point to the ::fwData::Color associated.
+    ::fwData::TransferFunction::TFDataType m_TFPoints;
+
+    /// Coordinates saved to calculate circles moves.
+    ::scene2D::data::Coord m_oldCoord;
+
+    /// Is a point captured by a mouse click?
+    bool m_pointIsCaptured;
+
+    /// The captured circle.
+    QGraphicsEllipseItem* m_capturedCircle;
+
+    /// fWID of the viewport
+    std::string m_viewportID;
+
+    /// Connection to the viewport
+    ::fwCom::Connection m_connection;
+
+    ::scene2D::data::Viewport::sptr m_viewport;
+
+    float m_pointSize;
+};
+
+
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+#endif // _SCENE2D_ADAPTOR_TRANSFERFUNCTION_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportInteractor.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportInteractor.hpp
new file mode 100644
index 0000000..96d2753
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportInteractor.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_VIEWPORTINTERACTOR_HPP_
+#define _SCENE2D_VIEWPORTINTERACTOR_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+/**
+ * @brief Adaptor implementation that manages the camera on the view.
+ */
+class ViewportInteractor : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ViewportInteractor)(::scene2D::adaptor::IAdaptor) ) ;
+
+    ViewportInteractor() throw();
+
+    ~ViewportInteractor() throw();
+
+protected:
+
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+    SCENE2D_API void zoom( bool zoomIn );
+
+    bool m_viewportIsTranslated;
+    ::scene2D::data::Coord m_lastCoordEvent;
+};
+
+
+}   // namespace adaptor
+}   // namespace scene2D
+
+#endif  // _SCENE2D_VIEWPORTINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportRangeSelector.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportRangeSelector.hpp
new file mode 100644
index 0000000..a06cc48
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportRangeSelector.hpp
@@ -0,0 +1,112 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_VIEWPORTRANGESELECTOR_HPP_
+#define _SCENE2D_VIEWPORTRANGESELECTOR_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+/**
+ * @brief <p>The viewport range selector adaptor allows to select a delimited range of a viewport.
+ * It uses a graphical delimiter (called shutter) that can be moved from both left to right 
+ * and right to left directions (in those cases, shutter's width is changing).</p>
+ *
+ * <p>Clicking onto the approximative center of the shutter allows the user to change its position, 
+ * according to mouse's cursor position (width won't change).</p>
+ *
+ * <p>Clicking onto the approximative left/right (respectively) border of the shutter allows the 
+ * user to change the width of the shutter: the right/left (respectively) border doesn't move
+ * during resizing.</p>
+ *
+ * <p>Each change onto the shutter will cause this adaptor to update the managed
+ * ::scene2D::data::Viewport object.</p>
+ *
+ * Configuration example:
+   @verbatim
+   <adaptor id="viewSelector" class="::scene2D::adaptor::ViewportRangeSelector" objectId="myViewport">
+       <config xAxis="xAxis" yAxis="yAxis" zValue="5" />
+   </adaptor>
+   @endverbatim
+ * 
+ * \b objectId  :   the viewport object that is updated by this adaptor
+ *
+ * \b xAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b yAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b zValue    : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b initialX  : initial position of the shutter on the X axis
+ *
+ * \b initialWidth  : initial width of the shutter
+ *
+ * This adaptor is intended to be used with a ::scene2D::adaptor::ViewportUpdater adaptor.
+ */
+class ViewportRangeSelector : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ViewportRangeSelector)(::scene2D::adaptor::IAdaptor) ) ;
+    ViewportRangeSelector() throw();
+    ~ViewportRangeSelector() throw();
+
+protected:
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+
+    /// Update the viewport object according to the current state of the shutter (coordinates are
+    /// mapped from the scene).
+    SCENE2D_API void updateViewportFromShutter( double x, double y, double width, double height );
+ 
+    QGraphicsRectItem* m_shutter;
+    bool m_isLeftInteracting;                       // interaction onto shutter's left border
+    bool m_isRightInteracting;                      // interaction onto shutter's right border
+    bool m_isInteracting;                           // interaction onto the whole shutter
+    ::scene2D::data::Coord m_dragStartPoint;        // dragging origin point
+    ::scene2D::data::Coord m_dragStartShutterPos;   // shutter position when dragging starts
+
+    /// A spacing value for an easier picking onto shutter borders
+    const int m_clickCatchRange;
+        
+    /// (This is the only graphic item which has to be added into the scene).
+    QGraphicsItemGroup* m_layer;
+
+    /// Initial position of the shutter on the X axis
+    float m_initialX;
+
+    /// Initial width of the shutter
+    float m_initialWidth;
+
+private:
+
+    /// Tells if the mouse cursor is at the good position to start interacting on shutter's left border
+    bool mouseOnShutterLeft( ::scene2D::data::Coord _coord);
+    
+    /// Tells if the mouse cursor is at the good position to start interacting on shutter's right border
+    bool mouseOnShutterRight( ::scene2D::data::Coord _coord);
+    
+    /// Tells if the mouse cursor is at the good position to start interacting on shutter's middle part
+    bool mouseOnShutterMiddle( ::scene2D::data::Coord _coord);
+};
+
+
+}   // namespace adaptor
+}   // namespace scene2D
+
+#endif  // _SCENE2D_VIEWPORTRANGESELECTOR_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportUpdater.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportUpdater.hpp
new file mode 100644
index 0000000..eea2430
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/ViewportUpdater.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_VIEWPORTUPDATER_HPP_
+#define _SCENE2D_VIEWPORTUPDATER_HPP_
+
+#include <scene2D/adaptor/IAdaptor.hpp>
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+/**
+ * @brief Adaptor implementation that manages the camera on the view (by updating the viewport object).
+ *
+ * The ViewportUpdater updates the viewport of the scene it is attached to, by picking values from the
+ * managed ::scene2D::data::Viewport object.
+ *
+ * Configuration example:
+   @verbatim
+   <adaptor id="viewportRangeUpdater" class="::scene2D::adaptor::ViewportUpdater" objectId="myViewport">
+       <config xAxis="xAxis" yAxis="yAxis" zValue="7" />
+   </adaptor>
+   @endverbatim
+ *
+ * \b objectID  : the viewport object this updater takes values from.
+ *
+ * \b xAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b yAxis     : see ::scene2D::adaptor::IAdaptor
+ *
+ * \b zValue    : see ::scene2D::adaptor::IAdaptor
+ *
+ * This adaptor is intended to be used with a ::scene2D::adaptor::ViewportRangeSelector adaptor.
+ */
+class ViewportUpdater : public ::scene2D::adaptor::IAdaptor
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ViewportUpdater)(::scene2D::adaptor::IAdaptor) ) ;
+    ViewportUpdater() throw();
+    ~ViewportUpdater() throw();
+
+protected:
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+    SCENE2D_API void doStart()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doUpdate()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doReceive( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+    SCENE2D_API void doSwap()    throw ( ::fwTools::Failed );
+    SCENE2D_API void doStop()    throw ( ::fwTools::Failed );
+
+    SCENE2D_API void processInteraction( ::scene2D::data::Event::sptr _event );
+};
+
+
+}   // namespace adaptor
+}   // namespace scene2D
+
+#endif  // _SCENE2D_VIEWPORTUPDATER_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/namespace.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/namespace.hpp
new file mode 100644
index 0000000..c6092ed
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/adaptor/namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+
+/**
+*
+*     TODO Doxygen documentation
+*
+**/
+
+namespace scene2D
+{
+
+} // namespace scene2D
+
+
+
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/bspline.h b/Bundles/LeafVisu/scene2D/include/scene2D/bspline.h
new file mode 100644
index 0000000..50add0a
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/bspline.h
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _BSPLINE_H
+#define _BSPLINE_H
+
+#include <iostream>
+#include <cmath>
+#include <list>
+#include <vector>
+
+#define BUFFER_SIZE 128
+#define DEFAULT_PRECISION 40
+
+using namespace std;
+
+struct point
+{
+    float x;
+    float y;
+
+    point(float _x = 0, float _y = 0): x(_x), y(_y) { }
+    point(const point & _which)
+    {
+        this->x = _which.x;
+        this->y = _which.y;
+    }
+    ~point() {}
+
+    point & operator = (const point & _which)
+    {
+        this->x = _which.x;
+        this->y = _which.y;
+        return *this;
+    }
+};
+class point_list
+{
+public:
+    point_list() {}
+    point_list(const point_list & _which)
+    {
+        this->list = _which.list;
+    }
+    ~point_list()
+    {
+        for (unsigned int i = 0; i<this->list.size(); i++) delete list[i];
+    }
+
+    point & get_point(int which)
+    {
+        std::vector<point*>::iterator _it = this->list.begin();
+        for (int i = 0; i < which; i++) _it++;
+        return **_it;
+    }
+
+    void add_point(point * _which)
+    {
+        this->list.push_back(_which);
+    }
+
+    std::vector<point*> list;
+};
+
+
+class cat_curve
+{
+public:
+    cat_curve(const point_list & _which)
+    {
+        this->plist = new point_list(_which);
+        this->curve_point = NULL;
+        this->nb_curve_point = 0;
+        this->nb_point = this->plist->list.size();
+        this->precision = DEFAULT_PRECISION;
+        this->draw_number = true;
+    }
+    ~cat_curve()
+    {
+        if (this->curve_point != NULL) delete[] this->curve_point;
+    }
+
+    void compute()
+    {
+        if (this->curve_point != NULL) delete[] this->curve_point;
+        this->curve_point = new point[this->precision+1];
+        this->nb_curve_point = this->precision+1;
+
+        float t=1.0f, p = (float)(this->nb_point-3)/(float)this->precision;
+
+        int i;
+        float ti;
+        for(int k=0; k<this->nb_curve_point; k++)
+        {
+            i = (int)floor(t);
+            ti = (float)i;
+            if (i < this->nb_point-2)
+            {
+                this->curve_point[k].x =
+                    (3.0f*this->plist->list[i]->x-3.0f*this->plist->list[i+1]->x+
+                    this->plist->list[i+2]->x-this->plist->list[i-1]->x)*pow(t-ti,3)/2.0f+
+                    ( 2.0f*this->plist->list[i-1]->x - 5.0f*this->plist->list[i]->x +
+                    4.0f*this->plist->list[i+1]->x - this->plist->list[i+2]->x)*pow(t-ti,2)/2.0f+
+                    ( this->plist->list[i+1]->x - this->plist->list[i-1]->x ) *(t-ti)/2.0f + this->plist->list[i]->x;
+
+                this->curve_point[k].y =
+                    (3.0f*this->plist->list[i]->y-3.0f*this->plist->list[i+1]->y+
+                    this->plist->list[i+2]->y-this->plist->list[i-1]->y)*pow(t-ti,3)/2.0f+
+                    ( 2.0f*this->plist->list[i-1]->y - 5.0f*this->plist->list[i]->y +
+                    4.0f*this->plist->list[i+1]->y - this->plist->list[i+2]->y)*pow(t-ti,2)/2.0f+
+                    ( this->plist->list[i+1]->y - this->plist->list[i-1]->y ) *(t-ti)/2.0f + this->plist->list[i]->y;
+            }
+            else if(i < this->nb_point)
+            {
+                this->curve_point[k].x = this->plist->list[i]->x;
+                this->curve_point[k].y = this->plist->list[i]->y;
+            }
+
+            t += p;
+        }
+    }
+
+    point * curve_point;
+    int nb_curve_point;
+
+    point_list * plist;
+    int nb_point;
+
+    int precision;
+    bool draw_number;
+};
+#endif
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/config.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/config.hpp
new file mode 100644
index 0000000..e7518b1
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_CONFIG_HPP_
+#define _SCENE2D_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef SCENE2D_EXPORTS
+            #define SCENE2D_API __declspec(dllexport)
+        #else
+            #define SCENE2D_API __declspec(dllimport)
+        #endif
+
+        #define SCENE2D_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef SCENE2D_EXPORTS
+            #define SCENE2D_API __attribute__ ((visibility("default")))
+            #define SCENE2D_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define SCENE2D_API __attribute__ ((visibility("hidden")))
+            #define SCENE2D_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define SCENE2D_API
+        #define SCENE2D_CLASS_API
+
+    #endif
+
+#endif //SCENE2D_API
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/Axis.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/Axis.hpp
new file mode 100644
index 0000000..aa71c57
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/Axis.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_AXIS_HPP_
+#define _SCENE2D_DATA_AXIS_HPP_
+
+#include <fwData/Object.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+
+
+class SCENE2D_CLASS_API Axis : public ::fwData::Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Axis)(::fwData::Object), (()), ::fwData::factory::New< Axis >) ;
+
+    typedef enum
+   {
+      LINEAR,
+      LOG
+   }  ScaleType;
+
+   /**
+    * @brief Constructor, set origin to 0, scale to 1 and type to LINEAR.
+    * @param key Private construction key
+    */
+    SCENE2D_API Axis( ::fwData::Object::Key key );
+
+    /// Defines shallow copy
+    SCENE2D_API void shallowCopy( const ::fwData::Object::csptr& _source );
+
+    /// Defines deep copy
+    SCENE2D_API void cachedDeepCopy( const ::fwData::Object::csptr& _source, DeepCopyCacheType &cache );
+
+    /// Basic destructor, do nothing.
+    SCENE2D_API virtual ~Axis();
+
+    /// Get m_origin attribute.
+    SCENE2D_API float getOrigin();
+
+    /// Set m_origin attribute.
+    SCENE2D_API void setOrigin (float _origin);
+
+    /// Get m_scale attribute.
+    SCENE2D_API float getScale();
+
+    /// Set m_scale attribute.
+    SCENE2D_API void setScale (float _scale);
+
+    /// Get m_scaleType attribute.
+    SCENE2D_API std::string getScaleType();
+
+    /// Set m_scaleType attribute.
+    SCENE2D_API void setScaleType (std::string _scaleType);
+
+private:
+    /// The origin and scale.
+    float m_origin, m_scale;
+
+    /// The scaleType (LINEAR/LOG).
+    ScaleType m_scaleType;
+
+};
+
+
+} // namespace data
+} // namespace scene2D
+
+
+#endif // _SCENE2D_DATA_AXIS_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/Coord.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/Coord.hpp
new file mode 100644
index 0000000..0771da3
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/Coord.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_COORD_HPP_
+#define _SCENE2D_DATA_COORD_HPP_
+
+#include <fwData/Object.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+class SCENE2D_CLASS_API Coord
+{
+public :
+
+    SCENE2D_API Coord(){m_x=0;m_y=0;}
+    SCENE2D_API Coord( double x , double y ){m_x=x;m_y=y;}
+    SCENE2D_API double getX() const {return m_x;}
+    SCENE2D_API void setX ( double x ){m_x=x;}
+    SCENE2D_API double getY() const {return m_y;}
+    SCENE2D_API void setY ( double y ){m_y=y;}
+
+private :
+
+    double m_x;
+    double m_y;
+};
+
+} // namespace data
+} // namespace scene2D
+
+
+#endif // _SCENE2D_DATA_COORD_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/Event.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/Event.hpp
new file mode 100644
index 0000000..292aeff
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/Event.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_EVENT_HPP_
+#define _SCENE2D_DATA_EVENT_HPP_
+
+#include <Qt>
+
+#include "scene2D/config.hpp"
+#include "scene2D/data/Coord.hpp"
+#include "scene2D/data/Size.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+//-----------------------------------------------------------------------------
+
+class SCENE2D_CLASS_API Event : public ::fwData::Object
+{
+
+public:
+
+    typedef enum
+    { NoType,
+      Resize,                   // change within the size of the widget/view
+      Viewport,                 // change within the size of the sene (contained into the widget/view)
+      MouseButtonDoubleClick,
+      MouseButtonPress,
+      MouseButtonRelease,
+      MouseMove,
+      MouseWheelUp,
+      MouseWheelDown,
+      KeyPress,
+      KeyRelease
+    } Type;
+
+    typedef enum
+    {   NoButton,
+        LeftButton,
+        RightButton,
+        MidButton
+    } Button;
+
+    typedef enum
+    {  NoModifier,
+       ShiftModifier,
+       ControlModifier,
+       AltModifier
+    } Modifier;
+
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Event)(::fwData::Object), (()), ::fwData::factory::New< Event >) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    SCENE2D_API Event( ::fwData::Object::Key key );
+    SCENE2D_API virtual ~Event();
+
+    /// Defines shallow copy
+    SCENE2D_API void shallowCopy( const ::fwData::Object::csptr& _source );
+
+    /// Defines deep copy
+    SCENE2D_API void cachedDeepCopy( const ::fwData::Object::csptr& _source, DeepCopyCacheType &cache );
+
+    fwGettersSettersDocMacro(OldSize, oldSize, Size, no comment);
+    fwGettersSettersDocMacro(Size, size, Size, no comment);
+    fwGettersSettersDocMacro(Type, type, Type, no comment);
+    fwGettersSettersDocMacro(Coord, coord, Coord, no comment);
+    fwGettersSettersDocMacro(Button, button, Button, no comment);
+    fwGettersSettersDocMacro(Accepted, accepted, bool, no comment);
+    fwGettersSettersDocMacro(Modifier, modifier, Modifier, no comment);
+    fwGettersSettersDocMacro(Key, key, int, no comment);
+
+private:
+
+    Coord m_coord;
+    Type m_type;
+    Button m_button;
+    Modifier m_modifier;
+    Size m_size;
+    Size m_oldSize;
+    bool m_accepted;
+    int m_key;
+};
+
+
+} // namespace data
+} // namespace scene2D
+
+
+#endif // _SCENE2D_DATA_SCENEEVENT_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/InitQtPen.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/InitQtPen.hpp
new file mode 100644
index 0000000..4f977e6
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/InitQtPen.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_ADAPTOR_INITQTPEN_HPP_
+#define _SCENE2D_ADAPTOR_INITQTPEN_HPP_
+
+#include <QPen>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+class SCENE2D_CLASS_API InitQtPen
+{
+
+public:
+
+    /// Set a pen a color.
+    static SCENE2D_API void setPenColor(QPen & _pen, std::string _color);
+
+    /// Set a pen a color with opacity.
+    static SCENE2D_API void setPenColor(QPen & _pen, std::string _color, float _opacity);
+};
+
+} // namespace data
+} // namespace scene2D
+
+#endif // _SCENE2D_ADAPTOR_INITQTPEN_HPP_
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/Size.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/Size.hpp
new file mode 100644
index 0000000..b4780c8
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/Size.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_SIZE_HPP_
+#define _SCENE2D_DATA_SIZE_HPP_
+
+#include <fwData/Object.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+class SCENE2D_CLASS_API Size
+{
+public :
+
+    SCENE2D_API Size(){m_w=0;m_h=0;}
+    SCENE2D_API Size( double w , double h ){m_w=w;m_h=h;}
+    SCENE2D_API double getWidth() const {return m_w;}
+    SCENE2D_API void setWidth ( double w ){m_w=w;}
+    SCENE2D_API double getHeight() const {return m_h;}
+    SCENE2D_API void setHeight ( double h ){m_h=h;}
+
+private :
+
+    double m_w;
+    double m_h;
+};
+
+} // namespace data
+} // namespace scene2D
+
+
+#endif // _SCENE2D_DATA_SIZE_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/Viewport.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/Viewport.hpp
new file mode 100644
index 0000000..629a8dc
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/Viewport.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_VIEWPORT_HPP_
+#define _SCENE2D_DATA_VIEWPORT_HPP_
+
+#include <fwData/Object.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+
+
+class SCENE2D_CLASS_API Viewport : public ::fwData::Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Viewport)(::fwData::Object), (()), ::fwData::factory::New< Viewport >) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    SCENE2D_API Viewport( ::fwData::Object::Key key );
+    SCENE2D_API virtual ~Viewport();
+
+    /// Defines shallow copy
+    SCENE2D_API void shallowCopy( const ::fwData::Object::csptr& _source );
+
+    /// Defines deep copy
+    SCENE2D_API void cachedDeepCopy( const ::fwData::Object::csptr& _source, DeepCopyCacheType &cache );
+
+    SCENE2D_API float getX();
+    SCENE2D_API void setX (float _x);
+    SCENE2D_API float getY();
+    SCENE2D_API void setY (float _y);
+    SCENE2D_API float getWidth();
+    SCENE2D_API void setWidth (float _width);
+    SCENE2D_API float getHeight();
+    SCENE2D_API void setHeight (float _height);
+
+private:
+    float m_x, m_y, m_width, m_height;
+
+};
+
+
+} // namespace data
+} // namespace scene2D
+
+
+#endif // _SCENE2D_DATA_VIEWPORT_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/ViewportMsg.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/ViewportMsg.hpp
new file mode 100644
index 0000000..7b266da
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/ViewportMsg.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SCENE2D_DATA_VIEWPORTMSG_HPP_
+#define _SCENE2D_DATA_VIEWPORTMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "scene2D/config.hpp"
+
+
+namespace scene2D
+{
+namespace data
+{
+
+
+/**
+ * @brief   Object event message specialized for viewport.
+ */
+class SCENE2D_CLASS_API ViewportMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ViewportMsg) ( ::fwServices::ObjectMsg), ( () ),
+                                            ::fwServices::factory::message::New<ViewportMsg> );
+
+    /**
+     * @brief Constructor : does nothing.
+     * @param key Private construction key
+     */
+    SCENE2D_API ViewportMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : does nothing.
+     */
+    SCENE2D_API virtual ~ViewportMsg();
+
+    /**
+     * Event identifier used to inform for any modification among viewport parameters.
+     */
+    SCENE2D_API static std::string VALUE_IS_MODIFIED;
+};
+
+
+}   // namespace data
+}   // namespace scene2D
+
+#endif  // _SCENE2D_DATA_VIEWPORTMSG_HPP_
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/data/namespace.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/data/namespace.hpp
new file mode 100644
index 0000000..c6092ed
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/data/namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+
+/**
+*
+*     TODO Doxygen documentation
+*
+**/
+
+namespace scene2D
+{
+
+} // namespace scene2D
+
+
+
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/namespace.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/namespace.hpp
new file mode 100644
index 0000000..c6092ed
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+
+/**
+*
+*     TODO Doxygen documentation
+*
+**/
+
+namespace scene2D
+{
+
+} // namespace scene2D
+
+
+
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/processing/ComputeHistogramFunctor.hxx b/Bundles/LeafVisu/scene2D/include/scene2D/processing/ComputeHistogramFunctor.hxx
new file mode 100644
index 0000000..dec33fd
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/processing/ComputeHistogramFunctor.hxx
@@ -0,0 +1,64 @@
+#ifndef __SCENE2D_PROCESSING_COMPUTEHISTOGRAMFUNCTOR_HXX__
+#define __SCENE2D_PROCESSING_COMPUTEHISTOGRAMFUNCTOR_HXX__
+
+#include <fwComEd/helper/Image.hpp>
+#include <fwComEd/helper/Array.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include "scene2D/processing/SComputeHistogram.hpp"
+
+namespace scene2D
+{
+namespace processing
+{
+
+/**
+ * @brief Functor use to compute the histogram of the image.
+ */
+struct ComputeHistogramFunctor
+{
+    /// Parameters of the functor.
+    struct Parameter
+    {
+        ::fwData::Image::sptr  image;
+        ::fwData::Histogram::sptr histogram;
+        float binsWidth;
+    };
+
+    template<class IMAGETYPE>
+    void operator()(Parameter &param)
+    {
+        ::fwData::Image::sptr image = param.image;
+        ::fwData::Histogram::sptr histogram = param.histogram;
+
+        ::fwComEd::helper::Image imgHelper(image);
+
+        IMAGETYPE min = std::numeric_limits<IMAGETYPE>::max();
+        IMAGETYPE max = std::numeric_limits<IMAGETYPE>::min();
+
+        ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+        SLM_ASSERT("Wrong image", max > min) ;
+        if( max > min )
+        {
+            histogram->initialize( min, max, param.binsWidth );
+
+            ::fwData::Array::sptr array = image->getDataArray();
+            ::fwComEd::helper::Array arrayHelper(array);
+
+            IMAGETYPE* itr = arrayHelper.begin<IMAGETYPE>();
+            IMAGETYPE* itrEnd = arrayHelper.end<IMAGETYPE>();
+
+            for(; itr!= itrEnd; ++itr)
+            {
+                histogram->addPixel( static_cast< float >( *itr ) );
+            }
+        }
+
+    }
+};
+
+}   // namespace processing
+}   // namespace scene2D
+
+#endif  /* __SCENE2D_PROCESSING_COMPUTEHISTOGRAMFUNCTOR_HXX__ */
+
diff --git a/Bundles/LeafVisu/scene2D/include/scene2D/processing/SComputeHistogram.hpp b/Bundles/LeafVisu/scene2D/include/scene2D/processing/SComputeHistogram.hpp
new file mode 100644
index 0000000..a5af153
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/include/scene2D/processing/SComputeHistogram.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __SCENE2D_PROCESSING_SCOMPUTEHISTOGRAM_HPP__
+#define __SCENE2D_PROCESSING_SCOMPUTEHISTOGRAM_HPP__
+
+#include <fwData/Histogram.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwServices/IController.hpp>
+
+#include "scene2D/config.hpp"
+
+namespace scene2D
+{
+
+namespace processing
+{
+
+/**
+ * @brief The SComputeHistogram service computes the histogram of the image.
+ * @class SComputeHistogram
+ * @date 2013
+ */
+class SCENE2D_CLASS_API SComputeHistogram : public ::fwServices::IController
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SComputeHistogram)(::fwServices::IController) ) ;
+
+    /// Constructor. Does nothing.
+    SCENE2D_API SComputeHistogram() throw();
+
+    /// Destructor. Does nothing.
+    SCENE2D_API virtual ~SComputeHistogram() throw();
+
+protected:
+
+    /**
+    * @brief Configures the service.
+    * @verbatim
+    <service uid="computeHistogram" type="::fwServices::IController" impl="::scene2D::processing::SComputeHistogram" autoConnect="yes">
+        <histogramId>Histogram</histogramId>
+        <binsWidth>5.0</binsWidth>
+    </service>
+    @endverbatim
+    * - \b histogramId: Id of the histogram object.
+    * - \b binsWidth: desired bins width used to classified pixel.
+    */
+    SCENE2D_API void configuring() throw ( ::fwTools::Failed );
+
+    /// Starts the service. Calls updating().
+    SCENE2D_API void starting()    throw ( ::fwTools::Failed );
+
+    /// Computes the histogram and notifies VALUE_IS_MODIFIED.
+    SCENE2D_API void updating()    throw ( ::fwTools::Failed );
+
+    /// Updates the histogram object when it receives image message (BUFFER, MODIFIED, NEW_IMAGE).
+    SCENE2D_API void receiving( fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Swaps the service. Calls updating().
+    SCENE2D_API void swapping()    throw ( ::fwTools::Failed );
+
+    /// Stops the service. Does nothing.
+    SCENE2D_API void stopping()    throw ( ::fwTools::Failed );
+
+private:
+
+    /// Returns the histogram object from the id m_histogramId.
+    ::fwData::Histogram::sptr getHistogram();
+
+    /// FwID of the histogram
+    std::string m_histogramId;
+
+    /// Desired bins width used to classified pixel.
+    float m_binsWidth;
+
+};
+} // namespace processing
+} // namespace scene2D
+
+
+#endif // __SCENE2D_PROCESSING_SCOMPUTEHISTOGRAM_HPP__
+
diff --git a/Bundles/LeafVisu/scene2D/rc/plugin.xml b/Bundles/LeafVisu/scene2D/rc/plugin.xml
new file mode 100644
index 0000000..59dcfc9
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/rc/plugin.xml
@@ -0,0 +1,113 @@
+<plugin id="scene2D" class="::scene2D::Plugin">
+
+    <library name="scene2D" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::scene2D::processing::SComputeHistogram</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRender::IRender</type>
+        <service>::scene2D::Render</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Sin</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Grid2D</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Line</service>
+        <object>::fwData::Composite</object>
+    </extension>
+   
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Square</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::GridFromFloat</service>
+        <object>::fwData::Float</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::TransferFunction</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Negato</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Histogram</service>
+        <object>::fwData::Histogram</object>
+    </extension>
+   
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::CurvedHistogram</service>
+        <object>::fwData::Histogram</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::ViewportRangeSelector</service>
+        <object>::scene2D::data::Viewport</object>
+    </extension>
+ 
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::ViewportUpdater</service>
+        <object>::scene2D::data::Viewport</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::HistogramCursor</service>
+        <object>::fwData::Histogram</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::HistogramValue</service>
+        <object>::fwData::Histogram</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::ScaleValues</service>
+        <object>::fwData::Composite</object>
+    </extension>
+   
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::Axis</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::scene2D::adaptor::IAdaptor</type>
+        <service>::scene2D::adaptor::ViewportInteractor</service>
+        <object>::fwData::Composite</object>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/Plugin.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/Plugin.cpp
new file mode 100644
index 0000000..04c0490
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/Plugin.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "scene2D/Plugin.hpp"
+
+namespace scene2D
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::scene2D::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace scene2D
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/Render.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/Render.cpp
new file mode 100644
index 0000000..afe23b8
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/Render.cpp
@@ -0,0 +1,564 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QVBoxLayout>
+
+#include <QGraphicsRectItem>
+
+#include <fwData/Composite.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <scene2D/adaptor/IAdaptor.hpp>
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "scene2D/Render.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+fwServicesRegisterMacro( ::fwRender::IRender , ::scene2D::Render , ::fwData::Composite ) ;
+
+namespace scene2D
+{
+
+
+Render::Render() throw()
+        : m_sceneStart (-100,-100),
+          m_sceneWidth (200,200),
+          m_antialiasing(false)
+{
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS );
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS );
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS );
+}
+
+//-----------------------------------------------------------------------------
+
+Render::~Render() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+QGraphicsScene* Render::getScene()
+{
+    SLM_TRACE_FUNC();
+
+    return m_scene;
+}
+
+//-----------------------------------------------------------------------------
+
+Scene2DGraphicsView* Render::getView()
+{
+    SLM_TRACE_FUNC();
+
+    return m_view;
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(::scene2D::data::Viewport) Render::getViewport()
+{
+    SLM_TRACE_FUNC();
+
+    return ::scene2D::data::Viewport::dynamicCast( m_objectID2Object["view1"] );
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(::fwData::Object) Render::getRegisteredObject(ObjectIDType _objectID)
+{
+    SLM_TRACE_FUNC();
+
+    OSLM_ASSERT("Sorry, the object id '"<< _objectID <<"' does not exist in the registered objects map.", m_objectID2Object.find(_objectID) != m_objectID2Object.end() );
+    return m_objectID2Object[_objectID];
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::dispatchInteraction( SPTR(::scene2D::data::Event) _event)
+{
+    SLM_TRACE_FUNC();
+
+    /* std::map are sorted regarding to key values. Keys of m_zValue2AdaptorID are z-values (float).
+     *
+     * The dispatching is performed to the highest z-valued adaptors first, so we start iterating
+     * from the end of m_zValue2AdaptorID (with reverse_iterator).
+     */
+    for(ZValue2AdaptorID::reverse_iterator rit = m_zValue2AdaptorID.rbegin(); rit != m_zValue2AdaptorID.rend(); ++rit )
+    {
+        if ( ! _event->getAccepted() && ! m_adaptorID2SceneAdaptor2D[ rit->second ].m_service.expired() )
+        {
+            m_adaptorID2SceneAdaptor2D[ rit->second ].m_service.lock()->processInteraction( _event );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::data::Coord Render::mapToScene( const ::scene2D::data::Coord & coord ) const
+{
+    SLM_TRACE_FUNC();
+
+    /// Returns the viewport coordinate point mapped to scene coordinates.
+    QPoint qp ( coord.getX(), coord.getY() );
+    QPointF qps = m_view->mapToScene(qp);
+    return ::scene2D::data::Coord(qps.x(),qps.y());
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    this->initialize();
+
+    std::vector < SPTR(::fwRuntime::ConfigurationElement) > vectConfig = m_configuration->find("scene");
+    SLM_ASSERT("There is no implementation between \"scene\" tags", !vectConfig.empty());
+    m_sceneConfiguration = vectConfig.at(0);
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+    for (iter = m_sceneConfiguration->begin() ; iter != m_sceneConfiguration->end() ; ++iter)
+    {
+        if ((*iter)->getName() == "axis")
+        {
+            this->configureAxis(*iter);
+        }
+        else if ((*iter)->getName() == "viewport")
+        {
+            this->configureViewport(*iter);
+        }
+        else if ((*iter)->getName() == "scene")
+        {
+            this->configureScene(*iter);
+        }
+        else if ((*iter)->getName() == "adaptor")
+        {
+            this->configureAdaptor(*iter);
+        }
+        else
+        {
+            OSLM_ASSERT("Bad scene configurationType, unknown xml node : " << (*iter)->getName(), false);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::starting() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    this->create();
+
+    this->startContext();
+
+    SPTR(::fwData::Composite) composite = this->getObject< ::fwData::Composite >();
+
+    ObjectsID2AdaptorIDVector::iterator objectIter = m_objectsID2AdaptorIDVector.find( "self" );
+    if ( objectIter != m_objectsID2AdaptorIDVector.end() )
+    {
+        BOOST_FOREACH( AdaptorIDType adaptorId,  objectIter->second )
+        {
+            this->startAdaptor( adaptorId, composite );
+            SLM_ASSERT("Service is not started", m_adaptorID2SceneAdaptor2D[adaptorId].getService()->isStarted());
+        }
+    }
+
+    this->startAdaptorsFromComposite(composite);
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::receiving( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(_msg);
+
+    if(compositeMsg && compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+    {
+        SPTR(::fwData::Composite) field = compositeMsg->getAddedKeys();
+        this->startAdaptorsFromComposite(field);
+    }
+    else if(compositeMsg && compositeMsg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS ) )
+    {
+        SPTR(::fwData::Composite) field = compositeMsg->getRemovedKeys();
+        this->stopAdaptorsFromComposite(field);
+    }
+    else if(compositeMsg && compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ) )
+    {
+        this->swapAdaptorsFromComposite(compositeMsg->getNewChangedKeys());
+        //SLM_FATAL("ToDo IM");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::swapping() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    //SLM_FATAL("ToDo IM");
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::stopping() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SPTR(::fwData::Composite) composite = this->getObject< ::fwData::Composite >();
+
+    ObjectsID2AdaptorIDVector::iterator objectIter = m_objectsID2AdaptorIDVector.find( "self" );
+    if ( objectIter != m_objectsID2AdaptorIDVector.end() )
+    {
+        BOOST_FOREACH( AdaptorIDType adaptorId,  objectIter->second )
+        {
+            this->stopAdaptor( adaptorId );
+        }
+    }
+
+    this->stopAdaptorsFromComposite(composite);
+
+    m_adaptorID2SceneAdaptor2D.clear();
+    m_objectID2Object.clear();
+    m_objectsID2AdaptorIDVector.clear();
+
+    this->stopContext();
+
+    this->getContainer()->clean();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::startContext()
+{
+    SLM_TRACE_FUNC();
+
+    SPTR(::fwGuiQt::container::QtContainer) qtContainer =  ::fwGuiQt::container::QtContainer::dynamicCast(this->getContainer());
+
+    m_scene = new QGraphicsScene( m_sceneStart.getX(), m_sceneStart.getY(), m_sceneWidth.getX(), m_sceneWidth.getY());
+    m_scene->setBackgroundBrush(QBrush(QColor(0,0,0)));
+    m_scene->setFocus( Qt::MouseFocusReason );
+
+    SPTR(::scene2D::data::Viewport) viewport = ::scene2D::data::Viewport::dynamicCast( m_objectID2Object["view1"] );
+
+    m_view = new Scene2DGraphicsView( m_scene, qtContainer->getQtContainer() );
+    m_view->setViewport( viewport );
+    m_view->setSceneRender( ::scene2D::Render::dynamicCast( this->getSptr() ) );
+    m_view->setRenderHint( QPainter::Antialiasing, m_antialiasing );
+
+    QVBoxLayout *layout = new QVBoxLayout;
+    layout->addWidget(m_view);
+    qtContainer->getQtContainer()->setLayout(layout);
+
+    m_view->updateFromViewport();
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::stopContext()
+{
+    SLM_TRACE_FUNC();
+
+    delete m_scene;
+    delete m_view;
+}
+
+//-----------------------------------------------------------------------------
+
+Qt::AspectRatioMode Render::getAspectRatioMode()
+{
+    return m_aspectRatioMode;
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::ensureUniqueZValue( SceneAdaptor2D _adaptee )
+{
+    SLM_TRACE_FUNC();
+
+    const float zValue = _adaptee.m_service.lock()->getZValue();
+
+    if( m_zValue2AdaptorID.find( zValue ) != m_zValue2AdaptorID.end() )
+    {
+        _adaptee.m_service.lock()->setZValue( zValue + 1 );
+        ensureUniqueZValue( _adaptee );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::configureAxis( ConfigurationType _conf )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"axis\" tag required", _conf->getName() == "axis");
+
+    std::string id      = _conf->getAttributeValue("id");
+    std::string origin  = _conf->getAttributeValue("origin");
+    std::string scale   = _conf->getAttributeValue("scale");
+    std::string scaleType    = _conf->getAttributeValue("scaleType");
+
+
+    if(m_objectID2Object.count(id) == 0)
+    {
+        m_objectID2Object[id] = ::scene2D::data::Axis::New();
+        SLM_ASSERT( "Sorry, axis ptr is null",  m_objectID2Object[id] );
+        ::scene2D::data::Axis::dynamicCast(m_objectID2Object[id])->setOrigin (::boost::lexical_cast< float >( origin ));
+        ::scene2D::data::Axis::dynamicCast(m_objectID2Object[id])->setScale (::boost::lexical_cast< float >( scale ));
+        ::scene2D::data::Axis::dynamicCast(m_objectID2Object[id])->setScaleType ( scaleType );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::configureViewport( ConfigurationType _conf )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"viewport\" tag required", _conf->getName() == "viewport");
+
+    std::string id  = _conf->getAttributeValue("id");
+    std::string x  = _conf->getAttributeValue("x");
+    std::string y   = _conf->getAttributeValue("y");
+    std::string width    = _conf->getAttributeValue("width");
+    std::string height    = _conf->getAttributeValue("height");
+
+    m_objectID2Object[id] = ::scene2D::data::Viewport::New();
+    SLM_ASSERT( "Sorry, viewport ptr is null",  m_objectID2Object[id] );
+    ::scene2D::data::Viewport::dynamicCast(m_objectID2Object[id])->setX (::boost::lexical_cast< float >( x ));
+    ::scene2D::data::Viewport::dynamicCast(m_objectID2Object[id])->setY (::boost::lexical_cast< float >( y ));
+    ::scene2D::data::Viewport::dynamicCast(m_objectID2Object[id])->setWidth (::boost::lexical_cast< float >( width ));
+    ::scene2D::data::Viewport::dynamicCast(m_objectID2Object[id])->setHeight (::boost::lexical_cast< float >( height ));
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::configureScene( ConfigurationType _conf )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"viewport\" tag required", _conf->getName() == "scene");
+
+    std::string x = _conf->getAttributeValue("x");
+    std::string y = _conf->getAttributeValue("y");
+    std::string width = _conf->getAttributeValue("width");
+    std::string height = _conf->getAttributeValue("height");
+
+    m_sceneStart.setX( ::boost::lexical_cast< float >( x ) );
+    m_sceneStart.setY( ::boost::lexical_cast< float >( y ) );
+    m_sceneWidth.setX( ::boost::lexical_cast< float >( width ) );
+    m_sceneWidth.setY( ::boost::lexical_cast< float >( height ) );
+
+    if( _conf->hasAttribute("antialiasing"))
+    {
+        if( _conf->getAttributeValue("antialiasing") == "true")
+        {
+            m_antialiasing = true;
+        }
+    }
+
+    if( _conf->hasAttribute(("aspectRatioMode")))
+    {
+        m_aspectRatioMode = (_conf->getAttributeValue("aspectRatioMode") == "KeepAspectRatioByExpanding")
+            ? Qt::KeepAspectRatioByExpanding : Qt::IgnoreAspectRatio;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::configureAdaptor( ConfigurationType _conf )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"adaptor\" tag required", _conf->getName() == "adaptor");
+
+    const std::string id            = _conf->getAttributeValue("id");
+    const std::string objectId      = _conf->getAttributeValue("objectId");
+    const std::string type          = _conf->getAttributeValue("class");
+    const std::string uid           = _conf->getAttributeValue("uid");
+
+    SLM_ASSERT( "'id' required attribute missing or empty"      , !id.empty() );
+    SLM_ASSERT( "'objectId' required attribute missing or empty", !objectId.empty() );
+    SLM_ASSERT( "'class' required attribute missing or empty" , !type.empty() );
+
+    m_objectsID2AdaptorIDVector[objectId].push_back(id);
+
+    SceneAdaptor2D adaptee;
+    adaptee.m_uid = uid;
+    adaptee.m_type = type;
+    adaptee.m_config = * (_conf->begin());
+
+    m_adaptorID2SceneAdaptor2D[id] = adaptee;
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::startAdaptorsFromComposite( SPTR(::fwData::Composite) _composite)
+{
+    SLM_TRACE_FUNC();
+
+    BOOST_FOREACH( ::fwData::Composite::value_type elem, (*_composite) )
+    {
+        std::string compositeKey = elem.first;
+        ObjectsID2AdaptorIDVector::iterator objectIter = m_objectsID2AdaptorIDVector.find( compositeKey );
+        if ( objectIter != m_objectsID2AdaptorIDVector.end() )
+        {
+            BOOST_FOREACH( AdaptorIDType adaptorId,  objectIter->second )
+            {
+                this->startAdaptor( adaptorId, elem.second );
+                OSLM_ASSERT("Service "<<adaptorId<<" is not started", m_adaptorID2SceneAdaptor2D[adaptorId].getService()->isStarted());
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::swapAdaptorsFromComposite( SPTR(::fwData::Composite) _composite)
+{
+    SLM_TRACE_FUNC();
+    BOOST_FOREACH( ::fwData::Composite::value_type elem, (*_composite) )
+    {
+        std::string compositeKey = elem.first;
+        ObjectsID2AdaptorIDVector::iterator objectIter = m_objectsID2AdaptorIDVector.find( compositeKey );
+        if ( objectIter != m_objectsID2AdaptorIDVector.end() )
+        {
+            BOOST_FOREACH( AdaptorIDType adaptorId,  objectIter->second )
+            {
+                ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+                for (iter = m_sceneConfiguration->begin() ; iter != m_sceneConfiguration->end() ; ++iter)
+                {
+                    if ((*iter)->getName() == "adaptor" && (*iter)->getAttributeValue("id") == adaptorId)
+                    {
+                        this->swapAdaptor( adaptorId, elem.second );
+                    }
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::stopAdaptorsFromComposite( SPTR(::fwData::Composite) _composite)
+{
+    SLM_TRACE_FUNC();
+    BOOST_FOREACH( ::fwData::Composite::value_type elem, (*_composite) )
+    {
+        std::string compositeKey = elem.first;
+        ObjectsID2AdaptorIDVector::iterator objectIter = m_objectsID2AdaptorIDVector.find( compositeKey );
+        if ( objectIter != m_objectsID2AdaptorIDVector.end() )
+        {
+            BOOST_FOREACH( AdaptorIDType adaptorId,  objectIter->second )
+            {
+                this->stopAdaptor( adaptorId );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::startAdaptor(AdaptorIDType _adaptorID, SPTR(::fwData::Object) _object)
+{
+    SLM_TRACE_FUNC();
+
+    if (!m_adaptorID2SceneAdaptor2D[_adaptorID].m_uid.empty())
+    {
+        m_adaptorID2SceneAdaptor2D[_adaptorID].m_service = ::fwServices::add< ::scene2D::adaptor::IAdaptor >( _object , m_adaptorID2SceneAdaptor2D[_adaptorID].m_type, m_adaptorID2SceneAdaptor2D[_adaptorID].m_uid);
+    }
+    else
+    {
+        m_adaptorID2SceneAdaptor2D[_adaptorID].m_service = ::fwServices::add< ::scene2D::adaptor::IAdaptor >( _object , m_adaptorID2SceneAdaptor2D[_adaptorID].m_type);
+    }
+
+    SLM_ASSERT("\"config\" tag required", m_adaptorID2SceneAdaptor2D[_adaptorID].m_config->getName() == "config");
+    SLM_ASSERT("Adaptor service expired", m_adaptorID2SceneAdaptor2D[_adaptorID].getService());
+
+    m_adaptorID2SceneAdaptor2D[_adaptorID].getService()->setScene2DRender(Render::dynamicCast(this->shared_from_this()));
+    m_adaptorID2SceneAdaptor2D[_adaptorID].getService()->setConfiguration(m_adaptorID2SceneAdaptor2D[_adaptorID].m_config);
+    m_adaptorID2SceneAdaptor2D[_adaptorID].getService()->configure();
+    m_adaptorID2SceneAdaptor2D[_adaptorID].getService()->start();
+
+    // Fill the map of unique zValues
+    ensureUniqueZValue( m_adaptorID2SceneAdaptor2D[_adaptorID] );
+    m_zValue2AdaptorID[ m_adaptorID2SceneAdaptor2D[_adaptorID].m_service.lock()->getZValue() ] = _adaptorID;
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::swapAdaptor(AdaptorIDType _adaptorID, SPTR(::fwData::Object) _object)
+{
+    SLM_TRACE_FUNC();
+
+     m_adaptorID2SceneAdaptor2D[ _adaptorID ].getService()->swap( _object );
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::stopAdaptor(AdaptorIDType _adaptorID)
+{
+    SLM_TRACE_FUNC();
+
+    SceneAdaptor2D & info = m_adaptorID2SceneAdaptor2D[_adaptorID];
+
+    m_zValue2AdaptorID.erase( info.getService()->getZValue() );
+
+    info.getService()->stop();
+    SLM_ASSERT("Service is not stopped", info.getService()->isStopped());
+    ::fwServices::OSR::unregisterService(info.getService());
+    info.m_service.reset();
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Render::updateSceneSize( float ratioPercent )
+{
+    QRectF rec = m_scene->itemsBoundingRect();
+    qreal x,y,w,h;
+    rec.getRect(&x,&y,&w,&h);
+
+    if ( ratioPercent != 0 )
+    {
+        qreal centerX = x + w/2.0;
+        qreal centerY = y + h/2.0;
+        w = w + w * ratioPercent;
+        h = h + h * ratioPercent;
+        x = centerX - w/2.0;
+        y = centerY - h/2.0;
+        rec.setRect(x,y,w,h);
+    }
+    m_sceneStart.setX( x );
+    m_sceneStart.setY( y );
+    m_sceneWidth.setX( w );
+    m_sceneWidth.setY( h );
+
+    m_scene->setSceneRect( rec );
+
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/Scene2DGraphicsView.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/Scene2DGraphicsView.cpp
new file mode 100644
index 0000000..89432ba
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/Scene2DGraphicsView.cpp
@@ -0,0 +1,266 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+
+#include "scene2D/data/Size.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/Render.hpp"
+
+#include <QMouseEvent>
+
+namespace scene2D
+{
+
+//-----------------------------------------------------------------------------
+
+Scene2DGraphicsView::Scene2DGraphicsView(QGraphicsScene* scene, QWidget* widget) : QGraphicsView(scene,widget)
+{
+    if( !this->hasMouseTracking() )
+    {
+        this->setMouseTracking( true );
+    }
+
+    /* Change the method usedn by the scene to index its items:
+     * 'NoIndex' is better than the default method 'BspTreeIndex' (Binary Space Partioning)
+     * which consists in dividing the scene into multiple parts and store them into a tree.
+     * With 'NoIndex', searching an item is faster, especially for scenes with a lot of items
+     * (Histogram for instance) and for scenes which manage moves (ViewportRangeSelector and
+     * ViewportUpdater for instance).
+     */
+    scene->setItemIndexMethod( QGraphicsScene::NoIndex );
+
+    this->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
+    this->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
+
+    this->setViewportUpdateMode( QGraphicsView::BoundingRectViewportUpdate );
+    this->setOptimizationFlags( QGraphicsView::DontSavePainterState          //
+                              | QGraphicsView::DontAdjustForAntialiasing );  // Prevent from rendering artifacts
+    this->setCacheMode( QGraphicsView::CacheBackground );   // Activates background cache
+    this->setAttribute( Qt::WA_TranslucentBackground, false );
+    this->setFrameStyle( 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::setSceneRender( SPTR(::scene2D::Render) sceneRender )
+{
+    m_scene2DRender = sceneRender;
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::keyPressEvent(QKeyEvent* _event)
+{
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::KeyPress);
+    sceneEvent->setButton( ::scene2D::data::Event::NoButton);
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+    sceneEvent->setKey(_event->key());
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::keyReleaseEvent(QKeyEvent* _event)
+{
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::KeyRelease);
+    sceneEvent->setButton( ::scene2D::data::Event::NoButton);
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+    sceneEvent->setKey(_event->key());
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::resizeEvent(QResizeEvent *_event)
+{
+    this->updateFromViewport();
+
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::Resize);
+    sceneEvent->setButton( ::scene2D::data::Event::NoButton);
+    sceneEvent->setModifier( ::scene2D::data::Event::NoModifier);
+    sceneEvent->setSize( ::scene2D::data::Size( _event->size().width(), _event->size().height() ) );
+    sceneEvent->setOldSize( ::scene2D::data::Size( _event->oldSize().width(), _event->oldSize().height() ) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::mousePressEvent ( QMouseEvent * _event )
+{
+    SLM_TRACE_FUNC();
+
+    OSLM_TRACE("Press in x = " <<  _event->posF().x() << " y = " << _event->posF().y() );
+
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::MouseButtonPress );
+    sceneEvent->setCoord( ::scene2D::data::Coord( _event->posF().x(), _event->posF().y() ) );
+    sceneEvent->setButton( this->getScene2DButtonFromEvent( _event ) );
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::data::Event::Modifier Scene2DGraphicsView::getScene2DModifierFromEvent( QInputEvent* _event )
+{
+    ::scene2D::data::Event::Modifier modifier;
+
+    if(_event->modifiers() == Qt::ControlModifier)
+    {
+        modifier = ::scene2D::data::Event::ControlModifier;
+    }
+    else if(_event->modifiers() == Qt::AltModifier)
+    {
+        modifier = ::scene2D::data::Event::AltModifier;
+    }
+    else if(_event->modifiers() == Qt::ShiftModifier)
+    {
+        modifier = ::scene2D::data::Event::ShiftModifier;
+    }
+    // else if(_event->modifiers() == Qt::NoModifier)
+    // {
+    //     modifier = ::scene2D::data::Event::NoModifier;
+    // }
+    else
+    {
+        modifier = ::scene2D::data::Event::NoModifier;
+    }
+
+    // TODO: add support for combined modifiers
+    return modifier;
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::data::Event::Button Scene2DGraphicsView::getScene2DButtonFromEvent( QMouseEvent* _event )
+{
+    ::scene2D::data::Event::Button button;
+
+    if( _event->button() == Qt::LeftButton )
+    {
+        button = ::scene2D::data::Event::LeftButton;
+    }
+    else if( _event->button() == Qt::RightButton )
+    {
+        button = ::scene2D::data::Event::RightButton;
+    }
+    else if( _event->button() == Qt::MidButton )
+    {
+        button = ::scene2D::data::Event::MidButton;
+    }
+    else
+    {
+        button = ::scene2D::data::Event::NoButton;
+    }
+
+    return button;
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::mouseDoubleClickEvent ( QMouseEvent * _event )
+{
+    SLM_TRACE_FUNC();
+
+    OSLM_TRACE("DoubleClick in x = " <<  _event->posF().x() << " y = " << _event->posF().y() );
+
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::MouseButtonDoubleClick );
+    sceneEvent->setCoord( ::scene2D::data::Coord( _event->posF().x(), _event->posF().y() ) );
+    sceneEvent->setButton( this->getScene2DButtonFromEvent( _event ) );
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::mouseReleaseEvent ( QMouseEvent * _event )
+{
+    SLM_TRACE_FUNC();
+    OSLM_TRACE("Release in x = " <<  _event->posF().x() << " y = " << _event->posF().y() );
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::MouseButtonRelease );
+    sceneEvent->setCoord( ::scene2D::data::Coord( _event->posF().x(), _event->posF().y() ) );
+    sceneEvent->setButton( this->getScene2DButtonFromEvent( _event ) );
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::mouseMoveEvent ( QMouseEvent * _event )
+{
+    SLM_TRACE_FUNC();
+
+    OSLM_TRACE("Move in x = " <<  _event->posF().x() << " y = " << _event->posF().y() );
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( ::scene2D::data::Event::MouseMove );
+    sceneEvent->setCoord( ::scene2D::data::Coord( _event->posF().x(), _event->posF().y() ) );
+    sceneEvent->setButton( this->getScene2DButtonFromEvent( _event ) );
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::wheelEvent ( QWheelEvent * _event )
+{
+    SLM_TRACE_FUNC();
+
+    const bool scrollUp = _event->delta() > 0;
+    OSLM_TRACE("Scroll " << (scrollUp ? "up" : "down") << " _event");
+    ::scene2D::data::Event::sptr sceneEvent = ::scene2D::data::Event::New();
+    sceneEvent->setType( (scrollUp) ? ::scene2D::data::Event::MouseWheelUp : ::scene2D::data::Event::MouseWheelDown);
+    sceneEvent->setCoord( ::scene2D::data::Coord( _event->pos().x(), _event->pos().y() ) );
+    sceneEvent->setModifier( this->getScene2DModifierFromEvent( _event) );
+
+    m_scene2DRender.lock()->dispatchInteraction( sceneEvent );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::setViewport( ::scene2D::data::Viewport::sptr viewport )
+{
+    m_viewport = viewport;
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::updateFromViewport()
+{
+    ::scene2D::data::Viewport::sptr viewport = m_viewport.lock();
+
+    this->fitInView(
+        viewport->getX(), viewport->getY(), viewport->getWidth(), viewport->getHeight(),
+        m_scene2DRender.lock()->getAspectRatioMode() );
+}
+
+//-----------------------------------------------------------------------------
+
+void Scene2DGraphicsView::paintEvent(QPaintEvent * event)
+{
+    // QGraphicsView optimization
+    QPaintEvent* newEvent = new QPaintEvent( event->region().boundingRect() );
+    QGraphicsView::paintEvent(newEvent);
+
+    delete newEvent;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Axis.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Axis.cpp
new file mode 100644
index 0000000..c0180d0
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Axis.cpp
@@ -0,0 +1,311 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+#include "scene2D/adaptor/Axis.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::Axis, ::fwData::Composite );
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+Axis::Axis() throw() : m_showLine(true), m_tickSize(0.02), m_color("white")
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//--------------------------------------------------------------------------------------------------
+
+Axis::~Axis() throw()
+{
+
+}
+
+//--------------------------------------------------------------------------------------------------
+
+void Axis::doStart() throw( ::fwTools::Failed)
+{
+    m_viewport = ::scene2D::data::Viewport::dynamicCast( ::fwTools::fwID::getObject( m_viewportID ) );
+
+    m_connection = m_viewport->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    this->buildAxis();
+    this->doUpdate();
+}
+
+//--------------------------------------------------------------------------------------------------
+
+void Axis::doStop() throw( ::fwTools::Failed)
+{
+    m_connection.disconnect();
+
+    delete m_layer;
+}
+
+//--------------------------------------------------------------------------------------------------
+
+void Axis::doSwap() throw( ::fwTools::Failed)
+{
+
+}
+
+//--------------------------------------------------------------------------------------------------
+
+void Axis::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag is missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();  // Looks for 'xAxis', 'yAxis' and 'zValue'
+
+
+    // 'color'
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_color, m_configuration->getAttributeValue("color"));
+    }
+
+
+    // 'align' attribute configuration
+    m_align = m_configuration->getAttributeValue("align");
+    SLM_ASSERT("'align' attribute is missing. Please add an 'align' attribute with value 'left', 'right', 'top' or 'bottom'",
+            !m_align.empty());
+    SLM_ASSERT("Unsupported value for 'align' attribute.",
+           m_align == "left" || m_align == "right" || m_align == "top" || m_align == "bottom");
+
+
+    // Axis bounds
+    const std::string min = m_configuration->getAttributeValue("min");
+    const std::string max = m_configuration->getAttributeValue("max");
+
+    SLM_ASSERT("'min' attribute is missing.", !min.empty());
+    SLM_ASSERT("'max' attribute is missing.", !max.empty());
+
+    m_min = ::boost::lexical_cast< float >( min );
+    m_max = ::boost::lexical_cast< float >( max );
+
+
+    // Ticks size
+    const std::string tickSize = m_configuration->getAttributeValue("tickSize");
+    m_tickSize = ( tickSize.empty() ) ? 1.0 : ::boost::lexical_cast< float >( tickSize );
+
+
+    // Viewport
+    SLM_ASSERT("A viewport attribute must be specified with 'viewportUID'.",
+            !m_configuration->getAttributeValue("viewportUID").empty());
+
+    if( !m_configuration->getAttributeValue("viewportUID").empty() )
+    {
+        m_viewportID =  m_configuration->getAttributeValue("viewportUID");
+    }
+
+
+    // Step
+    const std::string interval = m_configuration->getAttributeValue("interval");
+    m_interval = ( interval.empty() ) ? 1.0f : ::boost::lexical_cast< float >( interval );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Axis::buildAxis()
+{
+    const int nbValues = (m_max - m_min) / m_interval + 1;
+    m_layer = new QGraphicsItemGroup();
+
+    for(int i = 0; i < nbValues; ++i)
+    {
+        QGraphicsLineItem* tick = new QGraphicsLineItem(0, 0, 0, 0);
+        tick->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+        tick->setPen( m_color );
+
+        m_ticks.push_back( tick );
+        m_layer->addToGroup( tick );
+    }
+
+    m_line = new QGraphicsLineItem();
+    m_line->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    m_line->setPen( m_color );
+
+    if( m_showLine )
+    {
+        m_layer->addToGroup( m_line );
+    }
+
+    // Adjust the layer's position and zValue depending on the associated axis
+    m_layer->setPos( m_xAxis->getOrigin(), m_yAxis->getOrigin() );
+    m_layer->setZValue( m_zValue );
+
+    // Add to the scene the unique item which gather the whole set of rectangle graphic items:
+    this->getScene2DRender()->getScene()->addItem( m_layer );
+}
+
+//---------------------------------------------------------------------------------------
+
+double Axis::getStartVal()
+{
+    return (int)( m_min / m_interval ) * m_interval;
+}
+
+//---------------------------------------------------------------------------------------
+
+double Axis::getEndVal()
+{
+    return (int)( m_max / m_interval ) * m_interval;
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Axis::doUpdate() throw( ::fwTools::Failed)
+{
+    this->initializeViewSize();
+    this->initializeViewportSize();
+
+    Scene2DRatio ratio = this->getRatio();
+
+    ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+    const double viewportHeight = viewport->getHeight();
+    const double viewportWidth = viewport->getWidth();
+
+    const double viewportSizeRatio = viewportHeight / viewportWidth;
+    const double viewInitialSizeRatio = m_viewInitialSize.first / m_viewInitialSize.second;
+
+    double viewportWidthRatio = this->getViewportSizeRatio().first;
+
+    double scaleX = m_tickSize;
+    double scaleY = m_tickSize * viewportSizeRatio;
+    scaleY /= viewportWidthRatio;
+    scaleY *= viewInitialSizeRatio;
+
+    scaleX = scaleX * ratio.first;
+    scaleY = scaleY * ratio.second;
+
+    const int nbValues = m_ticks.size();
+
+    const double min = this->getStartVal();
+    const double max = this->getEndVal();
+
+    float pos;
+    std::pair<double, double> tickSize;
+    std::pair<double, double> tickPos;
+
+    const std::pair<double, double> viewportSize = this->mapAdaptorToScene(
+            std::pair<double, double>(viewportWidth, viewportHeight), m_xAxis, m_yAxis);
+
+    if(m_align == "bottom")
+    {
+        tickSize = this->mapAdaptorToScene(std::pair<double, double>(0, m_tickSize), m_xAxis, m_yAxis);
+
+        const double tickPosY = m_viewport->getY();
+
+        for(int i = 0; i < nbValues; ++i)
+        {
+            pos = min + i * m_interval;
+            tickPos = this->mapAdaptorToScene(std::pair<double, double>(pos, tickPosY), m_xAxis, m_yAxis);
+            m_ticks.at(i)->setLine(
+                    tickPos.first, tickPos.second,
+                    tickPos.first, tickPos.second - tickSize.second * scaleY);
+        }
+
+        m_line->setLine(min, tickPos.second, max, tickPos.second);
+    }
+    else if(m_align == "top")
+    {
+        tickSize = this->mapAdaptorToScene(std::pair<double, double>(0, m_tickSize), m_xAxis, m_yAxis);
+
+        const double tickPosY = m_viewport->getHeight() * 0.9;
+
+        for(int i = 0; i < nbValues; ++i)
+        {
+            pos = min + i * m_interval;
+            tickPos = this->mapAdaptorToScene(std::pair<double, double>(pos, tickPosY), m_xAxis, m_yAxis);
+
+            m_ticks.at(i)->setLine(
+                    tickPos.first, tickPos.second,
+                    tickPos.first, tickPos.second - tickSize.second * scaleY);
+        }
+
+        m_line->setLine(min, tickPos.second, max, tickPos.second);
+    }
+    else if(m_align == "left")
+    {
+        tickSize = this->mapAdaptorToScene(std::pair<double, double>(m_tickSize, 0), m_xAxis, m_yAxis);
+
+        const double tickPosX = m_viewport->getX();
+
+        for(int i = 0; i < nbValues; ++i)
+        {
+            pos = min + i * m_interval;
+            tickPos = this->mapAdaptorToScene(std::pair<double, double>(tickPosX, pos), m_xAxis, m_yAxis);
+            m_ticks.at(i)->setLine(
+                    tickPos.first, tickPos.second,
+                    tickPos.first + tickSize.first * scaleX, tickPos.second);
+        }
+
+        m_line->setLine( tickPos.first, min, tickPos.first, tickPos.second);
+    }
+    else if(m_align == "right")
+    {
+        tickSize = this->mapAdaptorToScene(
+                std::pair<double, double>(m_tickSize, 0), m_xAxis, m_yAxis);
+
+        const double tickPosX = m_viewport->getX() + m_viewport->getWidth();
+
+        for(int i = 0; i < nbValues; ++i)
+        {
+            pos = min + i * m_interval;
+
+            tickPos = this->mapAdaptorToScene(
+                    std::pair<double, double>(tickPosX, pos), m_xAxis, m_yAxis);
+
+            m_ticks.at(i)->setLine(
+                  tickPos.first - tickSize.first * scaleX, tickPos.second,
+                  tickPos.first, tickPos.second);
+        }
+
+        m_line->setLine(tickPos.first, min, tickPos.first, tickPos.second);
+    }
+}
+
+//--------------------------------------------------------------------------------------------------
+
+void Axis::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    if( _msg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------
+
+void Axis::processInteraction( ::scene2D::data::Event::sptr _event)
+{
+    if( _event->getType() == ::scene2D::data::Event::Resize)
+    {
+        doUpdate();
+    }
+}
+
+//--------------------------------------------------------------------------------------------------
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/CurvedHistogram.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/CurvedHistogram.cpp
new file mode 100644
index 0000000..f6abf4b
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/CurvedHistogram.cpp
@@ -0,0 +1,565 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Float.hpp>
+#include <fwData/Histogram.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+
+#include <fwComEd/HistogramMsg.hpp>
+
+#include <QGraphicsRectItem>
+#include <QGraphicsView>
+
+#include "scene2D/bspline.h"    // test Alex
+
+#include "scene2D/adaptor/CurvedHistogram.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::CurvedHistogram, ::fwData::Histogram);
+
+
+#define PI 3.14159265
+
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+const float CurvedHistogram::SCALE = 1.1f; // vertical scaling factor applied at each mouse scroll
+const float CurvedHistogram::NB_POINTS_BEZIER = 100.0f;
+
+//-----------------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::CurvedHistogram() throw() : m_borderWidth(1.75f), m_scale(1.0)
+{
+    m_layer = NULL;
+    m_painterPath = NULL;
+}
+
+//-----------------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::~CurvedHistogram() throw()
+{
+}
+
+//-----------------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag is missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();  // Looks for 'xAxis', 'yAxis', 'opacity' and 'zValue'
+
+    m_innerColor = QPen( Qt::transparent );
+    m_borderColor = QPen( Qt::transparent );
+    m_brush = QBrush( Qt::NoBrush );
+
+    if (!m_configuration->getAttributeValue("borderColor").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(
+                m_borderColor, m_configuration->getAttributeValue("borderColor"), m_opacity );
+    }
+
+    if (!m_configuration->getAttributeValue("innerColor").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(
+                m_innerColor, m_configuration->getAttributeValue("innerColor"), m_opacity );
+    }
+
+    if (!m_configuration->getAttributeValue("borderWidth").empty())
+    {
+        m_borderWidth = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("borderWidth") );
+    }
+
+    m_histogramPointUID = m_configuration->getAttributeValue("histogramPointUID");
+
+    OSLM_WARN_IF("If an histogram cursor is used with this histogram, m_histogramPointUID must be set in order to "
+            << "inform about the position that the cursor should use.", m_histogramPointUID.empty());
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    // Init border style
+    m_borderColor.setCosmetic( true );
+    m_borderColor.setWidthF( m_borderWidth );
+    m_borderColor.setStyle( Qt::SolidLine );
+    m_borderColor.setJoinStyle( Qt::RoundJoin );
+    m_borderColor.setCapStyle( Qt::RoundCap );
+
+    m_brush = QBrush( m_innerColor.color() );
+
+    this->doUpdate();
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::getControlPoints( ::fwData::Histogram::sptr _histogram)
+{
+    ::fwData::Histogram::fwHistogramValues histogramValues = _histogram->getValues();
+    const float binsWidth = _histogram->getBinsWidth();
+    const float histogramMin = _histogram->getMinValue();
+
+    Point p;
+    Points controlPoints;
+    const unsigned int nbValues = (int) histogramValues.size();
+
+    // WARNING: we shouldn't add all the points of the histogram into the vector of controlPoints
+    // (testing...)
+    for(unsigned int i = 0; i < nbValues; ++i)
+    {
+        p.first = (double)(histogramMin + i * binsWidth);
+        p.second = histogramValues[i];
+
+        controlPoints.push_back( p );
+    }
+
+    return controlPoints;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::getBSplinePoints( Points & _points )
+{
+    Points bSplinePoints;
+    Points::iterator it;
+    point_list list;        // see bspline.h
+
+    // Add again the first point with a higher value in order to prevent B-Spline algorithm from removing
+    // the first value.
+    list.add_point(
+            new point(
+                (float) _points[0].first,
+                (float) _points[0].second * 2) );
+
+    // Add all the points
+    for( it = _points.begin(); it != _points.end(); ++it )
+    {
+        list.add_point(
+                new point(
+                    (float)((*it).first),
+                    (float)((*it).second)) );
+    }
+
+    // Add again the last point
+    list.add_point(
+            new point(
+                (float) _points.back().first,
+                (float) _points.back().second / 2 ) );
+
+
+    // Commpute the points of the B-Spline with external code from AHO (to be integrated here later).
+    cat_curve curve( list );
+    curve.precision = static_cast<int>(_points.size() * 5);
+    curve.compute();
+
+    for(int i = 0; i < curve.precision; ++i)
+    {
+        bSplinePoints.push_back( Point( curve.curve_point[i].x, curve.curve_point[i].y ) );
+    }
+
+    return bSplinePoints;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::getResampledBSplinePoints( Points & _bSplinePoints )
+{
+    SLM_TRACE_FUNC();
+
+    Points points;
+    Points::iterator it;
+
+    Point point = _bSplinePoints.front();
+
+    double dx, dy;
+    const double maxLength = 2000;
+    double segmentLength = 0;
+
+    points.push_back( point );
+
+    for(it = _bSplinePoints.begin() + 1; it != _bSplinePoints.end(); ++it)
+    {
+        dx = abs((*it).first - point.first);    // theoretically positive
+        dy = abs((*it).second - point.second);
+
+        segmentLength += sqrt( dx * dx + dy * dy );
+
+        if(segmentLength > maxLength)
+        {
+            points.push_back( *it );
+            segmentLength = 0;
+        }
+
+        point = *it;
+    }
+
+    points.push_back( _bSplinePoints.back() );
+
+    OSLM_TRACE("B-Spline points size moved from " << _bSplinePoints.size() << " to " << points.size());
+
+    return points;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::computePointToPathLengthMapFromBSplinePoints( Points & _bSplinePoints )
+{
+    Point p;
+    Points::iterator it;
+
+    for(it = _bSplinePoints.begin(); it != _bSplinePoints.end(); ++it)
+    {
+        p = this->mapAdaptorToScene( *it, m_xAxis, m_yAxis );
+
+        m_painterPath->lineTo( p.first, p.second );
+        m_positionsToPathLength[ (int) p.first ] = m_painterPath->length();
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->doStop();
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+
+    ::fwData::mt::ObjectReadLock lock(histogram);
+
+    if (!histogram->getValues().empty())
+    {
+        m_layer = new QGraphicsItemGroup();
+
+        m_painterPath = new QPainterPath();
+
+        Points controlPoints = this->getControlPoints( histogram );
+        Points bSplinePoints = this->getBSplinePoints( controlPoints );
+
+        this->computePointToPathLengthMapFromBSplinePoints( bSplinePoints );
+
+        // Try to remove unnecessary points of the B-Spline points
+        Points resampledBSplinePoints = this->getResampledBSplinePoints( bSplinePoints );
+        bSplinePoints = resampledBSplinePoints;
+
+        this->buildBSplineFromPoints( bSplinePoints );
+
+        // Adjust the layer's position and zValue depending on the associated axis
+        m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+        m_layer->setZValue(m_zValue);
+
+        // Add to the scene the unique item which gather the whole set of rectangle graphic items:
+        this->getScene2DRender()->getScene()->addItem( m_layer );
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::buildBSplineFromPoints( Points & _bSplinePoints )
+{
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+
+    const bool useBorderColor = (m_borderColor.color() != Qt::transparent);
+    const bool useInnerColor = (m_innerColor.color() != Qt::transparent);
+
+    Point currentPoint = this->mapAdaptorToScene( Point(histogram->getMinValue(), _bSplinePoints[0].second), m_xAxis, m_yAxis );
+    Point previousPoint = currentPoint;
+    Points::iterator it;
+
+    const QPointF startPoint( currentPoint.first, currentPoint.second / 10 );   // divide by 10 to cut meaningless values
+    QPainterPath path( QPointF(startPoint.x(), 0.0) );
+    path.lineTo( startPoint );
+
+    const int maxLinesPerPath = 10;
+    int lineCount = 0;
+
+    previousPoint.first = startPoint.x();
+    previousPoint.second = startPoint.y();
+
+    // Build the path with the B-Spline points
+    for(it = _bSplinePoints.begin() + 1; it != _bSplinePoints.end(); ++it)
+    {
+        currentPoint = this->mapAdaptorToScene(*it, m_xAxis, m_yAxis );
+
+        path.lineTo( currentPoint.first, currentPoint.second );
+    }
+
+    // Close the path:
+    m_painterPath->lineTo( histogram->getMaxValue(), _bSplinePoints.back().second);
+
+    if( useBorderColor )
+    {
+        path.lineTo( currentPoint.first, 0.0 );
+        this->addBorderItem( path );
+    }
+
+    if( useInnerColor )
+    {
+        path.lineTo( previousPoint.first, 0.0 );
+        this->addInnerItem( path );
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::addInnerItem( const QPainterPath & _path )
+{
+    QGraphicsPathItem* item = new QGraphicsPathItem( _path );
+    item->setPen( Qt::NoPen );
+    item->setBrush( m_brush );
+    item->setPath( _path );
+    item->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    item->setZValue(1);
+
+    m_layer->addToGroup( item );
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::addBorderItem( const QPainterPath & _path )
+{
+    QGraphicsPathItem* item = new QGraphicsPathItem( _path );
+    item->setPen( m_borderColor );
+    item->setBrush( Qt::NoBrush );
+    item->setPath( _path );
+    item->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    item->setZValue(2);
+
+    m_layer->addToGroup( item );
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::quadraticInterpolation(
+        const Point _p0, const Point _p1, const Point _p2 )
+{
+    Points points;
+    Point p;
+
+    const double d2 =
+        2 * ((_p2.second - _p1.second) / (_p2.first - _p1.first) - (_p1.second - _p0.second)
+                / (_p1.first - _p0.first))
+            / (_p2.first - _p0.first);
+
+    const double d1 = (_p2.second - _p1.second) / (_p2.first - _p1.first) - 0.5 * d2 * (_p2.first - _p1.first);
+    const double d0 = _p1.second;
+
+    points.push_back( _p0 );
+
+    for(double x = _p0.first; x < _p2.first; x += 0.5)
+    {
+        p.first = x;
+        p.second = 0.5 * d2 * pow(x - _p1.first, 2) + d1 * (x - _p1.first) + d0;
+
+        points.push_back( p );
+    }
+
+    return points;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::cosinusInterpolation(const Point _p0, const Point _p1)
+{
+    Points points;
+    Point p;
+    double mu2;
+    double deltaX = _p1.first - _p0.first;
+
+    for(double mu = 0.0; mu < 1.0; mu += 0.05)
+    {
+        mu2 = (1 - std::cos(mu * PI)) / 2;
+
+        p.first = _p0.first + mu * deltaX;
+        p.second = _p0.second * (1 - mu2) + _p1.second * mu2;
+
+        points.push_back( p );
+    }
+
+    return points;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::cubicInterpolation(
+        const Point _p0, const Point _p1, const Point _p2, const Point _p3 )
+{
+    Points points;
+    Point p;
+    double a0, a1, a2, a3, mu2;
+    const double deltaX = _p2.first - _p1.first;
+    for(double mu = 0.0; mu < 1.0; mu += 0.01)
+    {
+        mu2 = mu * mu;
+
+        /*
+        a0 = _p3.second - _p2.second - _p0.second + _p1.second;
+        a1 = _p0.second - _p1.second - a0;
+        a2 = _p2.second - _p0.second;
+        a3 = _p1.second;
+        */
+
+        // Smoother curves (Catmull-Rom s_plines)
+        a0 = -0.5*_p0.second + 1.5*_p1.second - 1.5*_p2.second + 0.5*_p3.second;
+        a1 = _p0.second - 2.5*_p1.second + 2*_p2.second - 0.5*_p3.second;
+        a2 = -0.5*_p0.second + 0.5*_p2.second;
+        a3 = _p1.second;
+
+        p.first = _p1.first + mu * deltaX;
+        p.second = a0 * mu * mu2 +a1 * mu2 + a2 * mu + a3;
+
+        points.push_back( p );
+    }
+
+    return points;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::updateCurrentPoint( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("m_histogramPointUID must be defined in order to update the related ::fwData::Point data.",
+            !m_histogramPointUID.empty());
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+    const float histogramMinValue = histogram->getMinValue();
+    const float histogramBinsWidth = histogram->getBinsWidth();
+
+    // Event coordinates in scene
+    ::scene2D::data::Coord sceneCoord = this->getScene2DRender()->mapToScene( _event->getCoord() );
+
+    const int histIndex = (int) sceneCoord.getX();
+    const int index = histIndex - histogramMinValue;
+    const int nbValues = (int)values.size() * histogramBinsWidth;
+
+    if(index >= 0 && index < nbValues && m_positionsToPathLength.find( histIndex ) != m_positionsToPathLength.end())
+    {
+        double key = m_positionsToPathLength[ histIndex ];
+        const double percent = m_painterPath->percentAtLength( key );
+        QPointF qPoint = m_painterPath->pointAtPercent( percent );
+
+        ::fwData::Point::sptr point =
+            ::fwData::Point::dynamicCast( ::fwTools::fwID::getObject( m_histogramPointUID ) );
+
+        SLM_ASSERT("m_histogramPointUID can't be null here.", point);
+
+        point->getRefCoord()[0] = sceneCoord.getX();
+        point->getRefCoord()[1] = qPoint.y() * m_scale;
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+CurvedHistogram::Points CurvedHistogram::linearInterpolation( const Point _p1, const Point _p2 )
+{
+
+    Points points;
+    float t = 0;
+    Point p;
+
+    for(int i = 0; i < 100; ++i)
+    {
+        t = i / 100;
+
+        p.first = _p1.first + ( _p2.first - _p1.first ) * t;
+        p.second = _p1.second + ( _p2.second - _p1.second ) * t;
+        points.push_back( p );
+    }
+
+    return points;
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    ::fwComEd::HistogramMsg::csptr histoMsg = ::fwComEd::HistogramMsg::dynamicConstCast(_msg);
+    if (histoMsg && histoMsg->hasEvent(::fwComEd::HistogramMsg::VALUE_IS_MODIFIED))
+    {
+        this->doUpdate();
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::doSwap() throw( ::fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::doStop() throw( ::fwTools::Failed)
+{
+    if (m_layer)
+    {
+        this->getScene2DRender()->getScene()->removeItem(m_layer);
+        delete m_layer;
+        m_layer = NULL;
+    }
+    m_positionsToPathLength.clear();
+    if (m_painterPath)
+    {
+        delete m_painterPath;
+        m_painterPath = NULL;
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------
+
+void CurvedHistogram::processInteraction( ::scene2D::data::Event::sptr _event)
+{
+    SLM_TRACE_FUNC();
+
+    bool updatePointedPos = false;
+
+    // Vertical scaling
+    if( _event->getType() == ::scene2D::data::Event::MouseWheelUp )
+    {
+        m_scale *= SCALE;
+        m_layer->scale(1, SCALE);
+
+        updatePointedPos = true;
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseWheelDown )
+    {
+        m_scale /= SCALE;
+        m_layer->scale(1, 1 / SCALE);
+
+        updatePointedPos = true;
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+        updatePointedPos = true;
+    }
+
+    if( !m_histogramPointUID.empty() )
+    {
+        updateCurrentPoint( _event );
+    }
+}
+
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Grid2D.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Grid2D.cpp
new file mode 100644
index 0000000..c41f531
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Grid2D.cpp
@@ -0,0 +1,234 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwData/Composite.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/adaptor/Grid2D.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::Grid2D  , ::fwData::Composite ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+Grid2D::Grid2D() throw() : m_xSpacing(10), m_ySpacing(10)
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+Grid2D::~Grid2D() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+
+    // Set the x/y min/max values
+    m_xMin = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xMin") );
+    m_xMax = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xMax") );
+    m_yMin = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("yMin") );
+    m_yMax = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("yMax") );
+
+
+    // If the corresponding attributes are present in the config, set the xSpacing, ySpacing between
+    // the lines and color of the lines:
+    if (!m_configuration->getAttributeValue("xSpacing").empty())
+    {
+        m_xSpacing = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xSpacing") );
+    }
+
+    if (!m_configuration->getAttributeValue("ySpacing").empty())
+    {
+        m_ySpacing = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("ySpacing") );
+    }
+
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_pen, m_configuration->getAttributeValue("color"), m_opacity);
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::draw()
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("m_xSpacing can not be equal to 0", m_xSpacing != 0);
+    SLM_ASSERT("m_ySpacing can not be equal to 0", m_ySpacing != 0);
+
+    this->getScene2DRender()->getScene()->removeItem( m_layer );
+    m_layer = new QGraphicsItemGroup();
+
+    // Calculate the start, end and step on x for the lines
+    const float xStartVal = getXStartVal();    // Allows to start drawing the grid from 0 with the correct step
+    const float xEndVal = getXEndVal();      // Allows to start drawing the grid from 0 with the correct step
+
+    // Calculate the start, end and step on y for the lines
+    const float yStartVal = getYStartVal();    // Allows to start drawing the grid from 0 with the correct step
+    const float yEndVal = getYEndVal();        // Allows to start drawing the grid from 0 with the correct step
+
+    // Holds the current computed coordinates:
+    std::pair< double, double > coord1, coord2;
+
+    // Draw the horizontal lines
+    for ( float yVal = yStartVal ; yVal <= yEndVal ; yVal += m_ySpacing )
+    {
+        coord1 = this->mapAdaptorToScene( std::pair< double, double >( xStartVal, yVal) , m_xAxis, m_yAxis );
+        coord2 = this->mapAdaptorToScene( std::pair< double, double >( xEndVal, yVal) , m_xAxis, m_yAxis );
+
+        QGraphicsLineItem* line = new QGraphicsLineItem(coord1.first, coord1.second, coord2.first, coord2.second);
+
+        // Set the line the pen and push it back in to the lines vector
+        line->setPen(m_pen);
+        m_lines.push_back(line);
+    }
+
+    // Draw the vertical lines
+    for ( float xVal = xStartVal ; xVal <= xEndVal ; xVal += m_xSpacing )
+    {
+        coord1 = this->mapAdaptorToScene(std::pair< double, double >( xVal, yStartVal) , m_xAxis, m_yAxis);
+        coord2 = this->mapAdaptorToScene(std::pair< double, double >( xVal, yEndVal) , m_xAxis, m_yAxis);
+
+        QGraphicsLineItem* line = new QGraphicsLineItem(coord1.first, coord1.second, coord2.first, coord2.second);
+
+        // Set the line the pen and push it back in to the lines vector
+        line->setPen(m_pen);
+        m_lines.push_back(line);
+    }
+
+    // Add the lines contained in the lines vector to the layer
+    for ( unsigned int i = 0 ; i < m_lines.size() ; i++)
+    {
+        m_layer->addToGroup(m_lines.at(i));
+    }
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+
+    // Add the layer containing grid's lines to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::doStart() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+
+    // Set the pen a style
+    m_pen.setStyle(Qt::DashLine);
+
+    this->draw();
+    this->doUpdate();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+float Grid2D::getXStartVal()
+{
+    return (int)( m_xMin / m_xSpacing ) * m_xSpacing;
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+float Grid2D::getXEndVal()
+{
+    return (int)( m_xMax / m_xSpacing ) * m_xSpacing;
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+float Grid2D::getYStartVal()
+{
+    return (int)( m_yMin / m_ySpacing ) * m_ySpacing;
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+float Grid2D::getYEndVal()
+{
+    return (int)( m_yMax / m_ySpacing ) * m_ySpacing;
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::doReceive( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    if( _msg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::processInteraction( ::scene2D::data::Event::sptr _event)
+{
+    if( _event->getType() == ::scene2D::data::Event::Resize)
+    {
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::doSwap() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void Grid2D::doStop() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Clear the lines vector
+    m_lines.clear();
+
+    // Remove the layer (and therefore all its related items) from the scene
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+}
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/GridFromFloat.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/GridFromFloat.cpp
new file mode 100644
index 0000000..4f21698
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/GridFromFloat.cpp
@@ -0,0 +1,188 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwData/Float.hpp>
+#include <fwComEd/FloatMsg.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/adaptor/GridFromFloat.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::GridFromFloat  , ::fwData::Float ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+GridFromFloat::GridFromFloat() throw()
+: m_xSpacing (10),
+  m_ySpacing (10)
+{
+//    addNewHandledEvent( ::fwComEd::FloatMsg::VALUE_IS_MODIFIED );
+}
+
+GridFromFloat::~GridFromFloat() throw()
+{
+}
+
+void GridFromFloat::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+    // Set the x/y min/max values
+    m_xMin = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xMin") );
+    m_xMax = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xMax") );
+    m_yMin = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("yMin") );
+    m_yMax = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("yMax") );
+
+    // If the corresponding attributes are present in the config, set the xSpacing, ySpacing between the lines and color of the lines
+    if (!m_configuration->getAttributeValue("xSpacing").empty())
+    {
+        m_xSpacing = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("xSpacing") );
+    }
+    if (!m_configuration->getAttributeValue("ySpacing").empty())
+    {
+        m_ySpacing = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("ySpacing") );
+    }
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_pen, m_configuration->getAttributeValue("color"));
+    }
+}
+
+void GridFromFloat::draw()
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("m_xSpacing can not equal 0", m_xSpacing != 0);
+    SLM_ASSERT("m_ySpacing can not equal 0", m_ySpacing != 0);
+
+    // Remove all lines from the scene
+    for (std::vector<QGraphicsItem*>::iterator it = m_lines.begin(); it != m_lines.end(); ++it)
+    {
+        this->getScene2DRender()->getScene()->removeItem(*it);
+    }
+    // Clear the lines vector
+    m_lines.clear();
+
+    // Calculate the start, end and step on x for the lines
+    float xStartVal = (int)( m_xMin / m_xSpacing ) * m_xSpacing;
+    float xEndVal = (int)( m_xMax / m_xSpacing ) * m_xSpacing;
+    float xStep = m_xSpacing;
+
+    // Calculate the start, end and step on y for the lines
+    float yStartVal = (int)( m_yMin / m_ySpacing ) * m_ySpacing;
+    float yEndVal = (int)( m_yMax / m_ySpacing ) * m_ySpacing;
+    float yStep = m_ySpacing;
+
+    // Draw the horizontal lines
+    for ( float yVal = yStartVal ; yVal <= yEndVal ; yVal += yStep )
+    {
+        QGraphicsLineItem* line = new QGraphicsLineItem(
+            this->mapAdaptorToScene(std::pair< double , double >( xStartVal, yVal) , m_xAxis, m_yAxis).first,
+            this->mapAdaptorToScene(std::pair< double , double >( xStartVal, yVal) , m_xAxis, m_yAxis).second,
+            this->mapAdaptorToScene(std::pair< double , double >( xEndVal, yVal) , m_xAxis, m_yAxis).first,
+            this->mapAdaptorToScene(std::pair< double , double >( xEndVal, yVal) , m_xAxis, m_yAxis).second
+        );
+        // Set the line the pen and push it back in to the lines vector
+        line->setPen(m_pen);
+        m_lines.push_back(line);
+    }
+
+    // Draw the vertical lines
+    for ( float xVal = xStartVal ; xVal <= xEndVal ; xVal += xStep )
+    {
+        QGraphicsLineItem* line = new QGraphicsLineItem(
+            this->mapAdaptorToScene(std::pair< double , double >( xVal, yStartVal) , m_xAxis, m_yAxis).first,
+            this->mapAdaptorToScene(std::pair< double , double >( xVal, yStartVal) , m_xAxis, m_yAxis).second,
+            this->mapAdaptorToScene(std::pair< double , double >( xVal, yEndVal) , m_xAxis, m_yAxis).first,
+            this->mapAdaptorToScene(std::pair< double , double >( xVal, yEndVal) , m_xAxis, m_yAxis).second
+        );
+        // Set the line the pen and push it back in to the lines vector
+        line->setPen(m_pen);
+        m_lines.push_back(line);
+    }
+
+    // Add the lines contained in the lines vector to the layer
+    for ( unsigned int i = 0 ; i < m_lines.size() ; i++)
+    {
+        m_layer->addToGroup(m_lines.at(i));
+    }
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+    // Add the layer to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+void GridFromFloat::doStart() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+    // Set the pen a style
+    m_pen.setStyle(Qt::DashLine);
+    this->draw();  
+}
+
+void GridFromFloat::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void GridFromFloat::doReceive( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Get and cast the ObjectMsg to FloatMsg
+    ::fwComEd::FloatMsg::csptr floatMsg = ::fwComEd::FloatMsg::dynamicConstCast(_msg);
+
+    // If the message is VALUE_IS_MODIFIED
+    if(floatMsg && floatMsg->hasEvent( ::fwComEd::FloatMsg::VALUE_IS_MODIFIED ) )
+    {
+        // Check if the float object isn't negative
+        if (this->getObject< ::fwData::Float >()->getValue() > 0)
+        {
+            // Set the xSpacing the float object value
+            m_xSpacing = this->getObject< ::fwData::Float >()->getValue();
+        }
+
+        this->draw();
+    }
+}
+
+void GridFromFloat::doSwap() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void GridFromFloat::doStop() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Clear the lines vector
+    m_lines.clear();
+    // Remove the layer (and therefore all its related items) from the scene
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+}
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Histogram.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Histogram.cpp
new file mode 100644
index 0000000..d9b9356
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Histogram.cpp
@@ -0,0 +1,250 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Histogram.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwComEd/HistogramMsg.hpp>
+
+#include <QGraphicsRectItem>
+#include <QGraphicsView>
+
+#include "scene2D/adaptor/Histogram.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::Histogram, ::fwData::Histogram);
+
+namespace scene2D
+{
+
+namespace adaptor
+{
+
+const float Histogram::SCALE = 1.1f; // vertical scaling factor applied at each mouse scroll
+
+//---------------------------------------------------------------------------------------------------------
+
+Histogram::Histogram() throw() : m_color("green"), m_opacity( 0.80f ), m_scale(1.0)
+{
+    m_layer = NULL;
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+Histogram::~Histogram() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag is missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();  // Looks for 'xAxis', 'yAxis' and 'zValue'
+
+    m_scale = m_yAxis->getScale();
+
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_color, m_configuration->getAttributeValue("color"));
+    }
+
+    if (!m_configuration->getAttributeValue("opacity").empty())
+    {
+        m_opacity = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("opacity") );
+    }
+
+    m_histogramPointUID = m_configuration->getAttributeValue("histogramPointUID");
+
+    OSLM_WARN_IF("If an histogram cursor is used with this histogram, m_histogramPointUID must be set in order to "
+            << "inform about the position that the cursor should use.", m_histogramPointUID.empty());
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    doUpdate();
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->doStop();
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+
+    if (!values.empty())
+    {
+        m_layer = new QGraphicsItemGroup();
+        // Update color with opacity
+        QColor color = m_color.color();
+        color.setAlphaF( m_opacity );
+        m_color.setColor( color );
+
+        const float min = histogram->getMinValue();
+        const float binsWidth = histogram->getBinsWidth();
+
+        // Initialize the path with a start point:
+        // The value preceding the current value that we'll use to build the arcs of the path
+        std::pair< double, double > startPoint = this->mapAdaptorToScene(
+                std::pair<double, double>(min, values[0]), m_xAxis, m_yAxis);
+
+        std::pair<double, double> pair;
+
+        QBrush brush = QBrush(m_color.color());
+
+        // Build the graphic items:
+        const int nbValues = (int)values.size();
+        for(int i = 1; i < nbValues; ++i)
+        {
+            pair = this->mapAdaptorToScene(
+                    std::pair<double, double>(min + i * binsWidth, values[i]), m_xAxis, m_yAxis);
+
+            QPainterPath painter( QPointF(startPoint.first, 0) );
+            painter.lineTo( startPoint.first, startPoint.second );
+            painter.lineTo( pair.first, pair.second );
+            painter.lineTo( pair.first, 0 );
+
+            QGraphicsPathItem* item = new QGraphicsPathItem( painter );
+            item->setPath( painter );
+            item->setBrush( brush );
+            item->setPen( Qt::NoPen );
+            item->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+
+            m_layer->addToGroup( item );
+
+            startPoint = pair;
+        }
+
+        // Adjust the layer's position and zValue depending on the associated axis
+        m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+        m_layer->setZValue(m_zValue);
+
+        // Add to the scene the unique item which gather the whole set of rectangle graphic items:
+        this->getScene2DRender()->getScene()->addItem( m_layer );
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::updateCurrentPoint( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("m_histogramPointUID must be defined in order to update the related ::fwData::Point data.",
+            !m_histogramPointUID.empty());
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+    const float histogramMinValue = histogram->getMinValue();
+    const float histogramBinsWidth = histogram->getBinsWidth();
+
+    // Event coordinates in scene
+    ::scene2D::data::Coord sceneCoord = this->getScene2DRender()->mapToScene( _event->getCoord() );
+
+    const int histIndex = (int) sceneCoord.getX();
+    const int index = histIndex - histogramMinValue;
+    const int nbValues = (int)values.size() * histogramBinsWidth;
+
+    if(index >= 0 && index < nbValues)
+    {
+        ::fwData::Point::sptr point =
+            ::fwData::Point::dynamicCast( ::fwTools::fwID::getObject( m_histogramPointUID ) );
+
+        SLM_ASSERT("m_histogramPointUID can't be null here.", point);
+
+        point->getRefCoord()[0] = sceneCoord.getX();
+        point->getRefCoord()[1] = values.at( index / histogramBinsWidth ) * m_scale;
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    ::fwComEd::HistogramMsg::csptr histoMsg = ::fwComEd::HistogramMsg::dynamicConstCast(_msg);
+    if (histoMsg && histoMsg->hasEvent(::fwComEd::HistogramMsg::VALUE_IS_MODIFIED))
+    {
+        this->doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::doSwap() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::doStop() throw( ::fwTools::Failed)
+{
+    if (m_layer)
+    {
+        this->getScene2DRender()->getScene()->removeItem(m_layer);
+        delete m_layer;
+        m_layer = NULL;
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------
+
+void Histogram::processInteraction( ::scene2D::data::Event::sptr _event)
+{
+    SLM_TRACE_FUNC();
+
+    bool updatePointedPos = false;
+
+    // Vertical scaling
+    if( _event->getType() == ::scene2D::data::Event::MouseWheelUp )
+    {
+        m_scale *= SCALE;
+        m_layer->scale(1, SCALE);
+
+        //_event->setAccepted( true );
+        m_yAxis->setScale( m_scale );
+
+        updatePointedPos = true;
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseWheelDown )
+    {
+        m_scale /= SCALE;
+        m_layer->scale(1, 1 / SCALE);
+
+        //_event->setAccepted( true );
+        m_yAxis->setScale( m_scale );
+
+        updatePointedPos = true;
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+        updatePointedPos = true;
+    }
+
+    if( !m_histogramPointUID.empty() && updatePointedPos )
+    {
+        updateCurrentPoint( _event );
+    }
+}
+
+}   // namespace adaptor
+
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramCursor.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramCursor.cpp
new file mode 100644
index 0000000..867f869
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramCursor.cpp
@@ -0,0 +1,216 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Histogram.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwComEd/HistogramMsg.hpp>
+
+#include <QGraphicsEllipseItem>
+#include <QFont>
+
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/adaptor/HistogramCursor.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::HistogramCursor, ::fwData::Histogram);
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+HistogramCursor::HistogramCursor() throw()
+: m_color("red"), m_borderColor("gray"), m_opacity(0.8), m_pointSize(6)
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+HistogramCursor::~HistogramCursor() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->IAdaptor::configuring();
+
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_color, m_configuration->getAttributeValue("color"));
+    }
+
+    if (!m_configuration->getAttributeValue("opacity").empty())
+    {
+        m_opacity = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("opacity") );
+    }
+
+    if (!m_configuration->getAttributeValue("borderColor").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_borderColor, m_configuration->getAttributeValue("borderColor"));
+    }
+
+    if (!m_configuration->getAttributeValue("pointSize").empty())
+    {
+        m_pointSize = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("pointSize") );
+    }
+
+    SLM_ASSERT("A viewport attribute must be specified with 'viewportUID'.",
+            !m_configuration->getAttributeValue("viewportUID").empty());
+
+    if( !m_configuration->getAttributeValue("viewportUID").empty() )
+    {
+        m_viewportID =  m_configuration->getAttributeValue("viewportUID");
+    }
+
+    SLM_ASSERT("'histogramPointUID' attribute is missing.", !m_configuration->getAttributeValue("histogramPointUID").empty());
+    m_histogramPointUID = m_configuration->getAttributeValue("histogramPointUID");
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_index = new QGraphicsEllipseItem();
+    m_index->setBrush( m_color.color() );
+    m_index->setPen( m_borderColor );
+    m_index->setZValue(m_zValue);
+    m_index->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+
+    m_layer->addToGroup( m_index );
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+
+    m_viewport = ::scene2D::data::Viewport::dynamicCast( ::fwTools::fwID::getObject( m_viewportID ) );
+
+    m_connection = m_viewport->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    // Add the layer containing grid's lines to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::doStop() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_connection.disconnect();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+    const float histogramMinValue = histogram->getMinValue();
+    const float histogramBinsWidth = histogram->getBinsWidth();
+
+    // Event coordinates in scene
+    ::scene2D::data::Coord sceneCoord = this->getScene2DRender()->mapToScene( m_coord );
+
+    int histIndex = (int) sceneCoord.getX();
+    int index = (histIndex - histogramMinValue) / histogramBinsWidth;
+
+    if(index >= 0 && index < (int)values.size()) // avoid std out_of_range on MS Windows
+    {
+        ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+        const double viewportHeight = viewport->getHeight();
+        const double viewportWidth = viewport->getWidth();
+
+        const double viewportSizeRatio = viewportHeight / viewportWidth;
+        const double viewInitialSizeRatio = m_viewInitialSize.first / m_viewInitialSize.second;
+
+        const Scene2DRatio ratio = this->getRatio();  // Total ratio
+        const double viewportRatio = this->getViewportSizeRatio().first;
+
+        double diameterH  = m_pointSize;
+        double diameterV  = m_pointSize * viewportSizeRatio;
+
+        diameterV /= viewportRatio;
+        diameterV *= viewInitialSizeRatio;
+
+        // Apply the ratio of the scene 2D in order to keep the same size for the circles if viewport's size or
+        // view's size change:
+        diameterH *= ratio.first;
+        diameterV *= ratio.second;
+
+        ::fwData::Point::sptr point = ::fwData::Point::dynamicCast( ::fwTools::fwID::getObject( m_histogramPointUID ) );
+
+        double x = point->getRefCoord()[0] - diameterH / 2;
+        double y = point->getRefCoord()[1] - diameterV / 2;
+
+        m_index->setRect( x, y, diameterH, diameterV );
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    ::fwComEd::HistogramMsg::csptr histoMsg = ::fwComEd::HistogramMsg::dynamicConstCast(_msg);
+    ::scene2D::data::ViewportMsg::csptr viewportMsg = ::scene2D::data::ViewportMsg::dynamicConstCast(_msg);
+    if (histoMsg && histoMsg->hasEvent(::fwComEd::HistogramMsg::VALUE_IS_MODIFIED))
+    {
+        this->doUpdate();
+    }
+    else if( viewportMsg && viewportMsg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        this->initializeViewSize();
+        this->initializeViewportSize();
+
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::doSwap() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramCursor::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    this->initializeViewSize();
+    this->initializeViewportSize();
+
+    if( _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+       m_coord = _event->getCoord();
+    }
+
+    doUpdate();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+}   // namespace adaptor
+}   // namespace scene2D
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramValue.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramValue.cpp
new file mode 100644
index 0000000..cf64aa3
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/HistogramValue.cpp
@@ -0,0 +1,235 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Histogram.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwComEd/HistogramMsg.hpp>
+
+#include <QGraphicsEllipseItem>
+#include <QFont>
+
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/adaptor/HistogramValue.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::HistogramValue, ::fwData::Histogram);
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+HistogramValue::HistogramValue() throw()
+: m_color("white"), m_isInteracting(false), m_fontSize(8)
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+HistogramValue::~HistogramValue() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->IAdaptor::configuring();
+
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_color, m_configuration->getAttributeValue("color"));
+    }
+
+    if (!m_configuration->getAttributeValue("fontSize").empty())
+    {
+        m_fontSize = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("fontSize") );
+    }
+
+    SLM_ASSERT("A viewport attribute must be specified with 'viewportUID'.",
+            !m_configuration->getAttributeValue("viewportUID").empty());
+
+    if( !m_configuration->getAttributeValue("viewportUID").empty() )
+    {
+        m_viewportID =  m_configuration->getAttributeValue("viewportUID");
+    }
+
+    SLM_ASSERT("'histogramPointUID' attribute is missing.", !m_configuration->getAttributeValue("histogramPointUID").empty());
+    m_histogramPointUID = m_configuration->getAttributeValue("histogramPointUID");
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_font.setPointSize(m_fontSize);
+    m_font.setLetterSpacing( QFont::AbsoluteSpacing, 0.2 );
+    m_font.setKerning( true );
+    m_font.setFixedPitch( true );
+
+    m_text = new QGraphicsSimpleTextItem(0, this->getScene2DRender()->getScene());
+    m_text->setBrush( QBrush(m_color.color()) );
+    m_text->setFont( m_font );
+    m_text->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    m_text->setVisible( false );
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+
+    m_layer->addToGroup( m_text );
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+
+    m_viewport = ::scene2D::data::Viewport::dynamicCast( ::fwTools::fwID::getObject( m_viewportID ) );
+
+    m_connection = m_viewport->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    // Add the layer containing grid's lines to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::doStop() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_connection.disconnect();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Histogram::sptr histogram = this->getObject< ::fwData::Histogram>();
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+    const float histogramMinValue = histogram->getMinValue();
+    const float histogramBinsWidth = histogram->getBinsWidth();
+
+    // Event coordinates in scene
+    ::scene2D::data::Coord sceneCoord = this->getScene2DRender()->mapToScene( m_coord );
+
+    int histIndex = (int) sceneCoord.getX();
+    int index = (histIndex - histogramMinValue) / histogramBinsWidth;
+
+    if(index >= 0 && index < (int)values.size() && m_isInteracting) // avoid std out_of_range on Windows
+    {
+        ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+        const double viewportHeight = viewport->getHeight();
+        const double viewportWidth = viewport->getWidth();
+
+        const double viewportSizeRatio = viewportHeight / viewportWidth;
+        const double viewInitialSizeRatio = m_viewInitialSize.first / m_viewInitialSize.second;
+
+        Scene2DRatio ratio = this->getRatio();  // Total ratio
+        double viewportWidthRatio = this->getViewportSizeRatio().first;
+
+        double diameterH  = m_fontSize;
+        double diameterV  = m_fontSize * viewportSizeRatio;
+
+        diameterV /= viewportWidthRatio;
+        diameterV *= viewInitialSizeRatio;
+
+        diameterH *= ratio.first;
+        diameterV *= ratio.second;
+
+        m_text->setText( QString::number( histIndex ) );
+
+        double scaleX = m_fontSize;
+        double scaleY = m_fontSize * viewportSizeRatio;
+
+        scaleY /= viewportWidthRatio;
+        scaleY *= viewInitialSizeRatio;
+
+        scaleX = scaleX * ratio.first;
+        scaleY = scaleY * ratio.second;
+
+        QTransform transform;
+        transform.scale(scaleX, scaleY);
+
+        ::fwData::Point::sptr point = ::fwData::Point::dynamicCast( ::fwTools::fwID::getObject( m_histogramPointUID ) );
+
+        m_text->setTransform( transform );
+        m_text->setPos( point->getRefCoord()[0] + diameterH * 2, point->getRefCoord()[1] - diameterV * 2 );
+        m_text->setVisible( true );
+    }
+    else
+    {
+        m_text->setVisible( false );
+    }
+}
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::HistogramMsg::csptr histoMsg = ::fwComEd::HistogramMsg::dynamicConstCast(_msg);
+    ::scene2D::data::ViewportMsg::csptr viewportMsg = ::scene2D::data::ViewportMsg::dynamicConstCast(_msg);
+
+    if (histoMsg && histoMsg->hasEvent(::fwComEd::HistogramMsg::VALUE_IS_MODIFIED))
+    {
+        this->doUpdate();
+    }
+    else if( viewportMsg && viewportMsg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        this->initializeViewSize();
+        this->initializeViewportSize();
+
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::doSwap() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void HistogramValue::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    this->initializeViewSize();
+    this->initializeViewportSize();
+
+    if( _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+        m_coord = _event->getCoord();
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseButtonPress )
+    {
+        m_isInteracting = true;
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+    {
+        m_isInteracting = false;
+    }
+
+    doUpdate();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+}   // namespace adaptor
+}   // namespace scene2D
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/IAdaptor.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/IAdaptor.cpp
new file mode 100644
index 0000000..d22cb06
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/IAdaptor.cpp
@@ -0,0 +1,341 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QGraphicsItemGroup>
+
+#include <fwData/Composite.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include "scene2D/adaptor/IAdaptor.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+IAdaptor::IAdaptor() throw() : m_zValue(0), m_opacity(1)
+{
+    m_connections = ::fwServices::helper::SigSlotConnection::New();
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::~IAdaptor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::info(std::ostream &_sstream )
+{
+    /*_sstream << "IAdaptor : " ;
+    this->SuperClass::info( _sstream ) ;*/
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::setZValue(float _zValue)
+{
+    m_zValue = _zValue;
+}
+
+//-----------------------------------------------------------------------------
+
+float IAdaptor::getZValue()
+{
+    return m_zValue;
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::setScene2DRender( ::scene2D::Render::sptr _scene2DRender)
+{
+    SLM_ASSERT("Service not instanced", _scene2DRender);
+    SLM_ASSERT("Adaptor is already started", this->isStopped() ) ;
+    m_scene2DRender = _scene2DRender;
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::Render::sptr IAdaptor::getScene2DRender()
+{
+    return m_scene2DRender.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::ViewSizeRatio IAdaptor::getViewSizeRatio()
+{
+    return ViewSizeRatio(
+            (float) ( m_viewInitialSize.first / this->getScene2DRender()->getView()->width() ),
+            (float) ( m_viewInitialSize.second / this->getScene2DRender()->getView()->height() ) );
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::ViewportSizeRatio IAdaptor::getViewportSizeRatio()
+{
+    return ViewportSizeRatio(
+            (float) ( m_viewportInitialSize.first / this->getScene2DRender()->getViewport()->getWidth() ),
+            (float) ( m_viewportInitialSize.second / this->getScene2DRender()->getViewport()->getHeight() ) );
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::Scene2DRatio IAdaptor::getRatio()
+{
+    ViewSizeRatio ratioView = this->getViewSizeRatio();
+    ViewportSizeRatio ratioViewport = this->getViewportSizeRatio();
+
+    return Scene2DRatio(    ratioView.first / ratioViewport.first,
+                            ratioView.second / ratioViewport.second );
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::Point2DType IAdaptor::mapAdaptorToScene(Point2DType _xy, ::scene2D::data::Axis::sptr _xAxis, ::scene2D::data::Axis::sptr _yAxis )
+{
+    double x, y;
+
+    if (_xAxis->getScaleType() == "LOG")
+    {
+        // Logarithme 10 cannot get negative values
+        if (_xy.first <= 0)
+        {
+            x = 0;
+        }
+        else
+        {
+            // Apply the x scale and the log to the x value
+            x = _xAxis->getScale() * log10( _xy.first );
+        }
+    }
+    else
+    {
+        // Apply just the x scale to the x value
+        x = _xAxis->getScale() * _xy.first;
+    }
+
+    if (_yAxis->getScaleType() == "LOG")
+    {
+        // Logarithm 10 cannot get negative values
+        if (_xy.second <= 0)
+        {
+            y = 0;
+        }
+        else
+        {
+            // Apply the y scale and the log to the y value
+            y = _yAxis->getScale() * log10( _xy.second );
+        }
+    }
+    else
+    {
+        // Apply just the y scale to the y value
+        y = _yAxis->getScale() * _xy.second;
+    }
+
+    return Point2DType( x , y );
+}
+
+//-----------------------------------------------------------------------------
+
+IAdaptor::Point2DType IAdaptor::mapSceneToAdaptor(Point2DType _xy, ::scene2D::data::Axis::sptr _xAxis, ::scene2D::data::Axis::sptr _yAxis )
+{
+    // Do the reverse operation of the mapAdaptorToScene function
+    double x, y;
+
+    if (_xAxis->getScaleType() == "LOG")
+    {
+        x = 10 * exp( _xy.first ) / _xAxis->getScale();
+    }
+    else
+    {
+        x = ( _xy.first ) / _xAxis->getScale();
+    }
+
+    if (_yAxis->getScaleType() == "LOG")
+    {
+        y = 10 * ( _xy.second ) / _yAxis->getScale();
+    }
+    else
+    {
+        y = _xy.second / _yAxis->getScale();
+    }
+
+    return Point2DType( x , y );
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    m_viewInitialSize.first = -1.0f;
+    m_viewInitialSize.second = -1.0f;
+
+    m_viewportInitialSize.first = -1.0f;
+    m_viewportInitialSize.second = -1.0f;
+
+    // If the corresponding attributes are present in the config, set the xAxis, yAxis and the adaptor zValue
+    if ( m_configuration->hasAttribute("xAxis") )
+    {
+        m_xAxis = ::scene2D::data::Axis::dynamicCast(
+                this->getScene2DRender()->getRegisteredObject(m_configuration->getAttributeValue("xAxis")));
+    }
+    else
+    {
+        m_xAxis = ::scene2D::data::Axis::New();
+    }
+
+    if ( m_configuration->hasAttribute("yAxis") )
+    {
+        m_yAxis = ::scene2D::data::Axis::dynamicCast(
+                this->getScene2DRender()->getRegisteredObject(m_configuration->getAttributeValue("yAxis")));
+    }
+    else
+    {
+        m_yAxis = ::scene2D::data::Axis::New();
+    }
+
+    if ( m_configuration->hasAttribute("zValue") )
+    {
+        m_zValue = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("zValue"));
+    }
+
+    if ( m_configuration->hasAttribute("opacity") )
+    {
+        m_opacity = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("opacity"));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::initializeViewSize()
+{
+    // Initialize the initial width of the view
+    if(m_viewInitialSize.first == -1.0f)
+    {
+        m_viewInitialSize.first = this->getScene2DRender()->getView()->width();
+    }
+
+    // Initialize the initial height of the view
+    if(m_viewInitialSize.second == -1.0f)
+    {
+        m_viewInitialSize.second = this->getScene2DRender()->getView()->height();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::initializeViewportSize()
+{
+    // Initialize the initial width of the viewport
+    if(m_viewportInitialSize.first == -1.0f)
+    {
+        m_viewportInitialSize.first = this->getScene2DRender()->getViewport()->getWidth();
+    }
+
+    // Initialize the initial height of the viewport
+    if(m_viewportInitialSize.second == -1.0f)
+    {
+        m_viewportInitialSize.second = this->getScene2DRender()->getViewport()->getHeight();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::starting() throw ( ::fwTools::Failed )
+{
+    m_connections->connect(this->getObject(), this->getSptr(), this->getObjSrvConnections());
+
+    doStart();
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::updating() throw ( ::fwTools::Failed )
+{
+    doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::receiving( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    doReceive(_msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::swapping() throw(fwTools::Failed)
+{
+    m_connections->disconnect();
+    m_connections->connect(this->getObject(), this->getSptr(), this->getObjSrvConnections());
+    doSwap();
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::stopping() throw ( ::fwTools::Failed )
+{
+    m_connections->disconnect();
+    doStop();
+
+    m_xAxis.reset();
+    m_yAxis.reset();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr IAdaptor::getRegisteredObject(::scene2D::Render::ObjectIDType _objectId)
+{
+    ::fwData::Object::sptr obj;
+    if (!_objectId.empty())
+    {
+        // Get an object from an id
+        obj = m_scene2DRender.lock()->getRegisteredObject(_objectId);
+    }
+
+    return obj;
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::registerService( ::scene2D::adaptor::IAdaptor::sptr srv )
+{
+    m_managedAdaptors.push_back( srv );
+}
+
+//-----------------------------------------------------------------------------
+
+void IAdaptor::unregisterServices()
+{
+    BOOST_FOREACH( ManagedAdaptorVector::value_type adaptor, m_managedAdaptors )
+    {        
+        adaptor.lock()->stop();
+        ::fwServices::OSR::unregisterService(adaptor.lock());
+    }
+    m_managedAdaptors.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Line.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Line.cpp
new file mode 100644
index 0000000..b1275a2
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Line.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwData/Composite.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/adaptor/Line.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::Line  , ::fwData::Composite ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+Line::Line() throw()
+{
+}
+
+Line::~Line() throw()
+{
+}
+
+void Line::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+    // Set the beginning and ending coordinates values
+    m_x1 = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("x1") );
+    m_x2 = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("x2") );
+    m_y1 = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("y1") );
+    m_y2 = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("y2") );
+
+    // If the corresponding attributes are present in the config, set the color of the line
+    if (!m_configuration->getAttributeValue("color").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_pen, m_configuration->getAttributeValue("color"));
+    }
+}
+
+void Line::draw()
+{
+    SLM_TRACE_FUNC();
+
+    // Draw the line
+    QGraphicsLineItem* line = new QGraphicsLineItem(
+        this->mapAdaptorToScene(std::pair< double , double >( m_x1, m_y1) , m_xAxis, m_yAxis).first,
+        this->mapAdaptorToScene(std::pair< double , double >( m_x1, m_y1) , m_xAxis, m_yAxis).second,
+        this->mapAdaptorToScene(std::pair< double , double >( m_x2, m_y2) , m_xAxis, m_yAxis).first,
+        this->mapAdaptorToScene(std::pair< double , double >( m_x2, m_y2) , m_xAxis, m_yAxis).second
+    );
+    // Set the line the pen
+    line->setPen(m_pen);
+
+    // Add the line to the layer
+    m_layer->addToGroup(line);
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+    // Add the layer to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+void Line::doStart() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+    this->draw();
+}
+
+void Line::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void Line::doReceive( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void Line::doSwap() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+void Line::doStop() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    // Remove the layer (and therefore its related line item) from the scene
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+}
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Negato.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Negato.cpp
new file mode 100644
index 0000000..d13c0e0
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Negato.cpp
@@ -0,0 +1,428 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QGraphicsItemGroup>
+#include <QPoint>
+#include <QBitmap>
+#include <QPixmap>
+
+#include <fwData/Image.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include "scene2D/adaptor/Negato.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::Negato  , ::fwData::Image ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+typedef ::fwComEd::helper::MedicalImageAdaptor MedicalImageAdaptor;
+
+//-----------------------------------------------------------------------------
+
+Negato::Negato() throw()
+: m_pointIsCaptured (false),
+    m_orientation(MedicalImageAdaptor::Z_AXIS), m_changeSliceTypeAllowed(true)
+{
+    this->installTFSelectionEventHandler(this);
+//    this->addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+//    this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+//    this->addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//-----------------------------------------------------------------------------
+
+Negato::~Negato() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Negato::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+    if( !m_configuration->getAttributeValue("orientation").empty() )
+    {
+        const std::string orientationValue = m_configuration->getAttributeValue("orientation");
+
+        if ( orientationValue == "axial" )
+        {
+            m_orientation = MedicalImageAdaptor::Z_AXIS;
+        }
+        else if ( orientationValue == "sagittal" )
+        {
+            m_orientation = MedicalImageAdaptor::X_AXIS;
+        }
+        else if ( orientationValue == "frontal" )
+        {
+            m_orientation = MedicalImageAdaptor::Y_AXIS;
+        }
+    }
+
+    if(!m_configuration->getAttributeValue("changeSliceType").empty())
+    {
+        const std::string changeValue = m_configuration->getAttributeValue(("changeSliceType"));
+
+        if(changeValue == "true" || changeValue == "yes")
+        {
+            m_changeSliceTypeAllowed = true;
+        }
+        else if(changeValue == "no" || changeValue == "false")
+        {
+            m_changeSliceTypeAllowed = false;
+        }
+    }
+    this->parseTFConfig( m_configuration );
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::updateBufferFromImage( QImage * qimg )
+{
+    // Window min/max
+    ::fwData::TransferFunction::sptr tf = this->getTransferFunction();
+    const double wlMin = tf->getWLMinMax().first;
+    const double wlMax = tf->getWLMinMax().second;
+
+    // Window max
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwComEd::helper::Image imgHelper(image);
+    const ::fwData::Image::SizeType size = image->getSize();
+    signed short * imgBuff = (signed short *) imgHelper.getBuffer();
+    const double window = tf->getWindow();
+    const unsigned int imageZOffset = size[0] * size[1];
+
+    const double tfMin = tf->getMinMaxTFValues().first;
+    const double tfMax = tf->getMinMaxTFValues().second;
+
+
+    // Fill image according to current slice type:
+    if( m_orientation == MedicalImageAdaptor::X_AXIS )
+    {
+        for( ::boost::int32_t z = 0; z < size[2]; ++z)
+        {
+            const unsigned int zOffset = z * imageZOffset;
+            const unsigned int zPos = size[2] - 1 - z;
+            const unsigned int zxOffset = zOffset + m_sagittalIndex->value();
+
+            for( ::boost::int32_t y = 0; y < size[1]; y++ )
+            {
+                QRgb val = this->getQImageVal(zxOffset + y * size[0], imgBuff, wlMin, wlMax, window, tfMin, tfMax, tf);
+                qimg->setPixel(y, zPos, val);
+            }
+        }
+    }
+    else if( m_orientation == MedicalImageAdaptor::Y_AXIS )
+    {
+        const double yOffset = m_frontalIndex->value() * size[0];
+
+        for( ::boost::int32_t z = 0; z < size[2]; ++z)
+        {
+            const double zOffset = z * imageZOffset;
+            const double zPos = size[2] - 1 - z;
+            const double zyOffset = zOffset + yOffset;
+
+            for( ::boost::int32_t x = 0; x < size[0]; x++ )
+            {
+                QRgb val = this->getQImageVal(zyOffset + x, imgBuff, wlMin, wlMax, window, tfMin, tfMax, tf);
+                qimg->setPixel(x, zPos, val);
+            }
+        }
+    }
+    else if( m_orientation == MedicalImageAdaptor::Z_AXIS )
+    {
+        const double zOffset = m_axialIndex->value() * imageZOffset;
+
+        for( ::boost::int32_t y = 0; y < size[1]; y++ )
+        {
+            const unsigned int yOffset = y * size[0];
+            const unsigned int zyOffset = zOffset + yOffset;
+
+            for( ::boost::int32_t x = 0; x < size[0]; x++ )
+            {
+                QRgb val = this->getQImageVal(x + zyOffset, imgBuff, wlMin, wlMax, window, tfMin, tfMax, tf);
+                qimg->setPixel(x, y, val);
+            }
+        }
+    }
+
+    QPixmap m_pixmap = QPixmap::fromImage( *m_qimg );
+    m_pixmapItem->setPixmap(m_pixmap);
+}
+
+//-----------------------------------------------------------------------------
+
+QRgb Negato::getQImageVal(
+    const unsigned int index, signed short* buffer, const double wlMin, const double wlMax, const double window,
+    const double tfMin, const double tfMax, ::fwData::TransferFunction::sptr tf)
+{
+    signed short val16 = buffer[index];
+
+    double value = (val16 - wlMin) / window;
+    value = value * (tfMax - tfMin) + tfMin;
+
+    ::fwData::TransferFunction::TFColor color = tf->getInterpolatedColor(value);
+
+    return qRgba(color.r*255, color.g*255, color.b*255, color.a*255);
+}
+
+//---------------------------------------------------------------------------
+
+QImage * Negato::createQImage()
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+
+    const ::fwData::Image::SizeType size = img->getSize();
+    const ::fwData::Image::SpacingType spacing = img->getSpacing();
+    const ::fwData::Image::OriginType origin = img->getOrigin();
+
+    double qImageSpacing[2];
+    double qImageOrigin[2];
+    ::boost::int32_t qImageSize[2];
+
+    switch ( m_orientation )
+    {
+        case MedicalImageAdaptor::X_AXIS:
+            qImageSize[0]    = size[1];
+            qImageSize[1]    = size[2];
+            qImageSpacing[0] = spacing[1];
+            qImageSpacing[1] = spacing[2];
+            qImageOrigin[0]  = origin[1];
+            qImageOrigin[1]  = origin[2];
+            break;
+
+        case MedicalImageAdaptor::Y_AXIS:
+            qImageSize[0]    = size[0];
+            qImageSize[1]    = size[2];
+            qImageSpacing[0] = spacing[0];
+            qImageSpacing[1] = spacing[2];
+            qImageOrigin[0]  = origin[0];
+            qImageOrigin[1]  = origin[2];
+            break;
+
+        case MedicalImageAdaptor::Z_AXIS:
+            qImageSize[0]    = size[0];
+            qImageSize[1]    = size[1];
+            qImageSpacing[0] = spacing[0];
+            qImageSpacing[1] = spacing[1];
+            qImageOrigin[0]  = origin[0];
+            qImageOrigin[1]  = origin[1];
+            break;
+
+        default:
+            SLM_FATAL("Unsupported value for m_orientation");
+            break;
+    }
+
+    // Create empty QImage
+    QImage * qimage = new QImage(qImageSize[0], qImageSize[1], QImage::Format_RGB888);
+
+    // Place m_pixmapItem
+    m_pixmapItem->resetTransform();
+    m_pixmapItem->scale(qImageSpacing[0], qImageSpacing[1]);
+    m_pixmapItem->setPos(qImageOrigin[0], qImageOrigin[1]);
+
+    // Force bounding box recomputing ( Qt bug )
+    m_layer->removeFromGroup( m_pixmapItem );
+    m_layer->addToGroup( m_pixmapItem );
+
+    // Update image scene
+    this->getScene2DRender()->updateSceneSize( 0.20 );
+
+    return qimage;
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::doStart() throw ( ::fwTools::Failed )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos( image );
+    this->updateTransferFunction( image, this->getSptr() );
+
+    m_pixmapItem = new QGraphicsPixmapItem();
+    m_pixmapItem->setShapeMode( QGraphicsPixmapItem::BoundingRectShape );
+    m_layer = new QGraphicsItemGroup();
+    m_layer->resetTransform();
+    m_layer->addToGroup( m_pixmapItem );
+    m_layer->setPos( m_xAxis->getOrigin(), m_yAxis->getOrigin() );
+    m_layer->setZValue( m_zValue );
+    this->getScene2DRender()->getScene()->addItem( m_layer );
+
+    m_qimg = this->createQImage();
+    this->updateBufferFromImage( m_qimg );
+
+
+    this->installTFObserver( this->getSptr() );
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    m_qimg = this->createQImage();
+    this->updateBufferFromImage( m_qimg );
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::doReceive( fwServices::ObjectMsg::csptr msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    if( msg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE) && m_changeSliceTypeAllowed )
+    {
+        ::fwData::Object::csptr cObjInfo = msg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+        ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+        ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+        ::fwData::Integer::sptr fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] );
+        ::fwData::Integer::sptr toSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] );
+
+        if( toSliceType->value() == static_cast< int > ( m_orientation ) )
+        {
+            m_orientation = static_cast< MedicalImageAdaptor::Orientation > ( fromSliceType->value() );
+        }
+        else if(fromSliceType->value() == static_cast<int>(m_orientation))
+        {
+            m_orientation = static_cast< MedicalImageAdaptor::Orientation >( toSliceType->value() );
+        }
+
+        this->doUpdate();
+    }
+
+    if ( this->upadteTFObserver(msg, this->getSptr() )
+            || msg->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING )
+            || msg->hasEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS ) )
+    {
+        this->updateBufferFromImage( m_qimg );
+    }
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+        this->updateImageInfos( image );
+        this->updateBufferFromImage( m_qimg );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::doSwap() throw ( ::fwTools::Failed )
+{
+    this->doStop();
+    this->doStart();
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::doStop() throw ( ::fwTools::Failed )
+{
+    this->removeTFObserver();
+
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+
+    delete m_qimg;
+    delete m_pixmapItem;
+    delete m_layer;
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    ::scene2D::data::Coord coord = this->getScene2DRender()->mapToScene( _event->getCoord() );
+    coord.setX( coord.getX() / m_layer->scale());
+    coord.setY( coord.getY() / m_layer->scale());
+
+    if ( _event->getType() == ::scene2D::data::Event::MouseButtonPress
+            && _event->getButton() == ::scene2D::data::Event::RightButton
+            && _event->getModifier() == ::scene2D::data::Event::NoModifier )
+    {
+        m_pointIsCaptured = true;
+        m_oldCoord = _event->getCoord();
+        _event->setAccepted(true);
+    }
+    else if ( m_pointIsCaptured )
+    {
+        if( _event->getType() == ::scene2D::data::Event::MouseMove )
+        {
+            ::scene2D::data::Coord newCoord = _event->getCoord();
+            this->changeImageMinMaxFromCoord( m_oldCoord, newCoord );
+            m_oldCoord = newCoord;
+            _event->setAccepted(true);
+        }
+        else if( _event->getButton() == ::scene2D::data::Event::RightButton
+                && _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+        {
+            m_pointIsCaptured = false;
+            _event->setAccepted(true);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Negato::changeImageMinMaxFromCoord( scene2D::data::Coord & oldCoord, scene2D::data::Coord & newCoord )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwData::TransferFunction::sptr tf = this->getTransferFunction();
+
+    double min = tf->getWLMinMax().first;
+    double max = tf->getWLMinMax().second;
+
+    double window = newCoord.getX() - m_oldCoord.getX();
+    double level = newCoord.getY() - m_oldCoord.getY();
+
+    double imgWindow = max - min;
+    double imgLevel = min + imgWindow/2.0;
+
+
+    double newImgLevel = imgLevel + level;
+    double newImgWindow = imgWindow + imgWindow * window/100.0;
+
+    double newMin = newImgLevel - newImgWindow/2.0;
+    double newMax = newImgLevel + newImgWindow/2.0;
+
+    this->doUpdate();
+
+    // Fire the message
+    this->setWindowLevel(newMin, newMax);
+    this->notifyTFWindowing(this->getSptr());
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ScaleValues.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ScaleValues.cpp
new file mode 100644
index 0000000..af05845
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ScaleValues.cpp
@@ -0,0 +1,458 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/Base.hpp>
+#include <fwData/Composite.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/adaptor/ScaleValues.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::ScaleValues, ::fwData::Composite ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+ScaleValues::ScaleValues() throw() : m_interval(10), m_step(1), m_fontSize(8), m_displayedUnit(""), m_showUnit(true)
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+ScaleValues::~ScaleValues() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ScaleValues::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();  // xAxis, yAxis, zValue, opacity
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+    // Set the min/max values
+    const std::string min = m_configuration->getAttributeValue("min");
+    const std::string max = m_configuration->getAttributeValue("max");
+    SLM_ASSERT("'min' atttribute is missing.", !min.empty());
+    SLM_ASSERT("'min' atttribute is missing.", !max.empty());
+
+    m_min = ::boost::lexical_cast< double >( min );
+    m_max = ::boost::lexical_cast< double >( max );
+
+
+    // Interval configuration
+    if (!m_configuration->getAttributeValue("interval").empty())
+    {
+        m_interval = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("interval") );
+    }
+
+
+    // Color configuration
+    const std::string color = m_configuration->getAttributeValue("color");
+    if (!color.empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_pen, color, m_opacity);
+    }
+    else
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_pen, "white", m_opacity);
+    }
+
+
+    // Font size configuratiion
+    if (!m_configuration->getAttributeValue("fontSize").empty())
+    {
+        m_fontSize = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("fontSize") );
+    }
+
+
+    // Viewport configuratiion
+    SLM_ASSERT("A viewport attribute must be specified with 'viewportUID'.",
+            !m_configuration->getAttributeValue("viewportUID").empty());
+
+    if( !m_configuration->getAttributeValue("viewportUID").empty() )
+    {
+        m_viewportID =  m_configuration->getAttributeValue("viewportUID");
+    }
+
+
+    // Show unit
+    const std::string showUnit = m_configuration->getAttributeValue("showUnit");
+    if(showUnit == "true" || showUnit == "false")
+    {
+        m_showUnit = (showUnit == "true");
+    }
+
+
+    // Unit text configuration
+    m_displayedUnit = m_configuration->getAttributeValue("unit");
+
+
+    // 'align' attribute configuration
+    m_align = m_configuration->getAttributeValue("align");
+
+    SLM_ASSERT(
+        "'align' attribute is missing. Please add an 'align' attribute with value 'left', 'right', 'top' or 'bottom'",
+        !m_align.empty());
+
+    SLM_ASSERT("Unsupported value for 'align' attribute.",
+           m_align == "left" || m_align == "right" || m_align == "top" || m_align == "bottom");
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ScaleValues::buildValues()
+{
+    SLM_TRACE_FUNC();
+    SLM_ASSERT("m_interval can not be equal to 0", m_interval != 0);
+
+    m_values.clear();
+
+    double val = this->getStartVal();
+    const int range = (int) ceil(this->getEndVal() - val);
+    const int nbValues = (int)(ceil(range/ m_interval)) + 1 ;
+
+    std::string format;
+
+    if(m_align == "left")
+    {
+        format = "  %1";
+    }
+    else if(m_align == "right")
+    {
+        format = "%1  ";
+    }
+    else
+    {
+        format = "%1";
+    }
+
+    // Build the values as graphic items
+    for(int i = 0; i < nbValues; ++i, val += m_interval)
+    {
+        QGraphicsSimpleTextItem* text = new QGraphicsSimpleTextItem();
+        text->setText( QString::fromStdString(format).arg(val) );
+        text->setFont( m_font );
+        text->setBrush( m_brush );
+        text->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+
+        m_values.push_back( text );
+    }
+
+    // Add the values to the item group
+    BOOST_FOREACH( QGraphicsItem* item, m_values )
+    {
+        m_layer->addToGroup( item );
+    }
+
+    // Build the unit graphic item
+    m_unit = new QGraphicsSimpleTextItem();
+    m_unit->setText( QString::fromStdString( m_displayedUnit ) );
+    m_unit->setFont( m_font );
+    m_unit->setBrush( m_brush );
+    m_unit->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+
+    // Add it to the items to be displayed if required
+    if( m_showUnit )
+    {
+        m_layer->addToGroup( m_unit );
+    }
+
+    // Set the layer position (according to the related axis) and zValue
+    m_layer->setPos( m_xAxis->getOrigin(), m_yAxis->getOrigin() );
+    m_layer->setZValue( m_zValue );
+
+    // Add the layer containing grid's lines to the scene
+    this->getScene2DRender()->getScene()->addItem( m_layer );
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::doStart() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Initialize the layer
+    m_layer = new QGraphicsItemGroup();
+
+    m_brush = QBrush( m_pen.color() );
+
+    m_font.setPointSize( m_fontSize );
+    m_font.setLetterSpacing( QFont::AbsoluteSpacing, 0.25 );
+    m_font.setKerning( true );
+    m_font.setFixedPitch( true );
+
+    m_viewport = ::scene2D::data::Viewport::dynamicCast( ::fwTools::fwID::getObject( m_viewportID ) );
+
+    m_connection = m_viewport->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    this->buildValues();
+    this->doUpdate();
+}
+
+//---------------------------------------------------------------------------------------
+
+double ScaleValues::getStartVal()
+{
+    return (int)( m_min / m_interval ) * m_interval;
+}
+
+//---------------------------------------------------------------------------------------
+double ScaleValues::getEndVal()
+{
+    return (int)( m_max / m_interval ) * m_interval;
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    this->initializeViewSize();
+    this->initializeViewportSize();
+
+    rescaleValues();
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::rescaleValues()
+{
+    const double viewportX = m_viewport->getX();
+    const double viewportWidth = m_viewport->getWidth();
+    const double viewportHeight = m_viewport->getHeight();
+
+    const double viewportSizeRatio = viewportHeight / viewportWidth;
+    const double viewInitialSizeRatio = m_viewInitialSize.first / m_viewInitialSize.second;
+
+    Scene2DRatio ratio = this->getRatio();  // Total ratio
+    double viewportWidthRatio = this->getViewportSizeRatio().first;
+
+    double scaleX = m_fontSize;
+    double scaleY = m_fontSize * viewportSizeRatio;
+    scaleY /= viewportWidthRatio;
+    scaleY *= viewInitialSizeRatio;
+
+    scaleX = scaleX * ratio.first;
+    scaleY = scaleY * ratio.second;
+
+    QTransform transform;
+    transform.scale( scaleX, scaleY );
+
+    int step = 0;
+    double valueSize;                   // the size (width or height) of the current value
+    std::pair<double, double> coord;    // coordinates of the current scale value item
+    std::pair<double, double> size;     // size of the current scale value item
+    bool suggestResampling = false;     /* scale value items resampling is suggested because of
+                                           a lack of sufficient width to display all of them */
+
+    const int valuesSize = m_values.size();
+    float val = getStartVal();
+
+    if(m_align == "left" || m_align == "right")
+    {
+        const double valueSizeRatio = m_interval / scaleY;
+
+        float coeff = 0;
+
+        double textPosX;
+
+        if(m_align == "left")
+        {
+            textPosX = viewportX;
+        }
+        else
+        {
+            coeff = -1;
+            textPosX = viewportX + viewportWidth;
+        }
+
+        for(int i = 0; i < valuesSize; ++i, val += m_interval)
+        {
+            valueSize = m_values[i]->boundingRect().height();
+
+            size = this->mapAdaptorToScene(
+                    std::pair<double, double>(m_values[i]->boundingRect().width(), valueSize),
+                    m_xAxis, m_yAxis);
+
+            step = (int)(valueSize / valueSizeRatio) + 1;
+
+            if( step > m_step )
+            {
+                m_step = step;
+                suggestResampling = true;
+            }
+
+            coord = this->mapAdaptorToScene(
+                std::pair<double, double>(textPosX, val), m_xAxis, m_yAxis);
+
+            m_values[i]->setTransform( transform );
+
+            m_values[i]->setPos(
+                    coord.first + coeff * size.first * scaleX,
+                    coord.second - (m_interval - size.second / 2) * scaleY );
+        }
+
+        m_unit->setTransform( transform );
+
+        val = viewportHeight * 0.8;
+
+        coord = this->mapAdaptorToScene(
+                std::pair<double, double>(textPosX, val), m_xAxis, m_yAxis);
+
+        coeff = (m_align == "left") ? 1 : -1.5;
+
+        m_unit->setPos(
+                coord.first + coeff * 2 * size.first * scaleX,
+                coord.second + size.second * scaleY);
+    }
+    else    // axis centered on top or bottom
+    {
+        const double valueSizeRatio = m_interval / scaleX;
+
+        float coeff = 0.5;
+
+        double textPosY = (m_align == "bottom")
+            ? m_viewport->getY()
+            : viewportHeight * 0.9;
+
+        for(int i = 0; i < valuesSize; ++i, val += m_interval)
+        {
+            valueSize = m_values[i]->boundingRect().width();
+
+            size = this->mapAdaptorToScene(
+                std::pair<double, double>(valueSize, m_values[i]->boundingRect().height()),
+                m_xAxis, m_yAxis);
+
+            step = (int)(valueSize / valueSizeRatio) + 1;
+
+            if( step > m_step )
+            {
+                m_step = step;
+                suggestResampling = true;
+            }
+
+            coord = this->mapAdaptorToScene(std::pair<double, double>(val, textPosY),
+                    m_xAxis, m_yAxis);
+
+            m_values[i]->setTransform( transform );
+
+            m_values[i]->setPos(
+                    coord.first - size.first / 2 * scaleX,
+                    coord.second - coeff * size.second / 2 * scaleY );
+        }
+
+        m_unit->setTransform( transform );
+
+        val = viewportHeight * 0.8;
+
+        size = this->mapAdaptorToScene(
+                std::pair<double, double>(m_unit->boundingRect().width(), m_unit->boundingRect().height()),
+                m_xAxis, m_yAxis);
+
+        coord = this->mapAdaptorToScene(
+                std::pair<double, double>(
+                    viewportX + viewportWidth / 2, textPosY),
+                m_xAxis, m_yAxis);
+
+        coeff = (m_align == "left") ? 1 : -1.5;
+
+        m_unit->setPos(
+                coord.first - size.first * scaleX,
+                coord.second - 1.5 * size.second * scaleY);
+    }
+
+    if( suggestResampling )
+    {
+        showHideScaleValues();
+    }
+    else if( !suggestResampling && step != m_step )
+    {
+        m_step = step;
+        showHideScaleValues();
+    }
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::showHideScaleValues()
+{
+    double value;
+    const int size = (int)m_values.size();
+    const double startVal = this->getStartVal();
+
+    for(int i = 0; i < size; ++i)
+    {
+        value = i * m_interval + startVal;  // compute the value at index 'i'
+
+        // Display this value or not according to the current step between two consecutives values
+        // and in keeping the displaying of the value '0':
+        m_values[i]->setVisible( fmod(value, (m_step * m_interval)) == 0.0 );
+    }
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::doReceive( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    if( _msg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        doUpdate();
+    }
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::processInteraction( ::scene2D::data::Event::sptr _event)
+{
+    if( _event->getType() == ::scene2D::data::Event::Resize)
+    {
+        doUpdate();
+    }
+}
+
+//----------------------------------------------------------------------------------------
+
+void ScaleValues::doSwap() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------
+
+void ScaleValues::doStop() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    // Remove the layer (and therefore all its related items) from the scene
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+
+    m_connection.disconnect();
+}
+
+
+} // namespace adaptor
+
+} // namespace scene2D
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Sin.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Sin.cpp
new file mode 100644
index 0000000..98a145b
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Sin.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwData/Composite.hpp>
+
+#include "scene2D/adaptor/Sin.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::Sin  , ::fwData::Composite ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+Sin::Sin() throw()
+{
+}
+
+Sin::~Sin() throw()
+{
+}
+
+void Sin::configuring() throw (::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+
+    std::string xMinStr(m_configuration->getAttributeValue("xMinBound"));
+    std::string xMaxStr(m_configuration->getAttributeValue("xMaxBound"));
+    std::istringstream xMinISS(xMinStr);
+    std::istringstream xMaxISS(xMaxStr);
+    float xMin;
+    float xMax;
+    xMinISS >> xMin;
+    xMaxISS >> xMax;
+    m_xMin = xMin;
+    m_xMax = xMax;
+}
+
+void Sin::doStart()
+{
+    /*QGraphicsItemGroup* sinLayer = new QGraphicsItemGroup();
+    QEasingCurve* sinus = new QEasingCurve(QEasingCurve::InSine);
+    this->getScene2DRender->getScene()->addItem(sinLayer);*/
+}
+
+void Sin::doUpdate()
+{
+
+}
+
+void Sin::doReceive( fwServices::ObjectMsg::csptr _msg)
+{
+
+}
+
+void Sin::doSwap()
+{
+
+}
+
+void Sin::doStop()
+{
+
+}
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Square.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Square.cpp
new file mode 100644
index 0000000..91dbd45
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/Square.cpp
@@ -0,0 +1,179 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwData/Composite.hpp>
+
+#include <QGraphicsItemGroup>
+
+#include "scene2D/adaptor/Square.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::Square  , ::fwData::Composite ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+//-----------------------------------------------------------------------------
+
+Square::Square() throw() : m_pointIsCaptured (false)
+{}
+
+//-----------------------------------------------------------------------------
+
+Square::~Square() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Square::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    SLM_TRACE("IAdaptor configuring ok");
+
+    m_coord.setX( ::boost::lexical_cast< double >( m_configuration->getAttributeValue("x") ) );
+    m_coord.setY( ::boost::lexical_cast< double >( m_configuration->getAttributeValue("y") ) );
+    m_size = ::boost::lexical_cast< ::boost::uint32_t >( m_configuration->getAttributeValue("size") );
+    if ( m_configuration->hasAttribute("color") )
+    {
+        this->setColor(m_configuration->getAttributeValue("color"));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::doStart() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    m_layer = new QGraphicsItemGroup();
+
+    m_rec = new QGraphicsRectItem( m_coord.getX(), m_coord.getY(), m_size, m_size );
+    QPen pen;
+    pen.setColor( Qt::GlobalColor( Qt::black ) );
+    m_rec->setPen( pen );
+    m_rec->setBrush( m_color );
+    m_layer->addToGroup(m_rec);
+    m_layer->setOpacity(0.8);
+
+    m_layer->setPos( m_xAxis->getOrigin(), m_yAxis->getOrigin() );
+    m_layer->setZValue( m_zValue );
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::doUpdate() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::doReceive( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::doSwap() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::doStop() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::setColor( std::string _color )
+{
+    if (_color == "red")
+    {
+        m_color = Qt::GlobalColor(Qt::red);
+    }
+    else if (_color == "green")
+    {
+        m_color = Qt::GlobalColor(Qt::green);
+    }
+    else if (_color == "blue")
+    {
+        m_color = Qt::GlobalColor(Qt::blue);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Square::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+    if ( _event->getType() == ::scene2D::data::Event::MouseButtonPress && _event->getButton() == ::scene2D::data::Event::LeftButton )
+    {
+        if ( this->coordViewIsInItem( _event->getCoord(), m_rec ) )
+        {
+            OSLM_TRACE("Point is captured");
+            m_pointIsCaptured = true;
+            m_oldCoord = this->coordViewToCoordItem( _event->getCoord(), m_rec );
+            m_rec->setBrush( Qt::yellow );
+            _event->setAccepted(true);
+        }
+    }
+    else if ( m_pointIsCaptured && _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+        ::scene2D::data::Coord newCoord = this->coordViewToCoordItem( _event->getCoord(), m_rec );
+        m_rec->moveBy( newCoord.getX() - m_oldCoord.getX(), newCoord.getY() - m_oldCoord.getY() );
+        m_oldCoord = newCoord;
+        _event->setAccepted(true);
+    }
+    else if ( m_pointIsCaptured && _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+    {
+        m_rec->setBrush( m_color );
+        m_pointIsCaptured = false;
+        _event->setAccepted(true);
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+bool Square::coordViewIsInItem( const ::scene2D::data::Coord & coord, QGraphicsItem * item )
+{
+    ::scene2D::data::Coord scenePoint = this->getScene2DRender()->mapToScene( coord );
+    QPointF sp ( scenePoint.getX(), scenePoint.getY() );
+    QPointF ip = item->mapFromScene( sp );
+    return item->contains( ip );
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::data::Coord Square::coordViewToCoordItem( const ::scene2D::data::Coord & coord, QGraphicsItem * item )
+{
+    ::scene2D::data::Coord scenePoint = this->getScene2DRender()->mapToScene( coord );
+    //QPointF sp ( scenePoint.getX(), scenePoint.getY() );
+    //QPointF ip = item->mapFromScene( sp );
+    //return ::scene2D::data::Coord( ip.x(), ip.y() );
+    return scenePoint;
+}
+//-----------------------------------------------------------------------------
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/TransferFunction.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/TransferFunction.cpp
new file mode 100644
index 0000000..e215e68
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/TransferFunction.cpp
@@ -0,0 +1,970 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include <QGraphicsItemGroup>
+#include <QPoint>
+#include <QColorDialog>
+
+#include "scene2D/data/Viewport.hpp"
+#include "scene2D/adaptor/TransferFunction.hpp"
+#include "scene2D/data/InitQtPen.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+#include "scene2D/data/ViewportMsg.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor , ::scene2D::adaptor::TransferFunction  , ::fwData::Image ) ;
+
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+TransferFunction::TransferFunction() throw() : m_pointSize(10)
+{
+    this->installTFSelectionEventHandler(this);
+//    this->addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+//    this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS );
+//    this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+//    this->addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+//    this->addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+}
+
+//-----------------------------------------------------------------------------
+
+TransferFunction::~TransferFunction() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::configuring() throw ( ::fwTools::Failed )
+{
+    SLM_ASSERT("\"config\" tag missing", m_configuration->getName() == "config");
+
+    this->IAdaptor::configuring();
+
+    // Set the line and circle pens color if the respective attribute are present in the config
+    if (!m_configuration->getAttributeValue("lineColor").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_linePen, m_configuration->getAttributeValue("lineColor"));
+    }
+
+    if (!m_configuration->getAttributeValue("circleColor").empty())
+    {
+        ::scene2D::data::InitQtPen::setPenColor(m_circlePen, m_configuration->getAttributeValue("circleColor"));
+    }
+
+    if (!m_configuration->getAttributeValue("pointSize").empty())
+    {
+        m_pointSize = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("pointSize") );
+    }
+
+    SLM_ASSERT("A viewport attribute must be specified with 'viewportUID'.",
+               !m_configuration->getAttributeValue("viewportUID").empty());
+
+    if( !m_configuration->getAttributeValue("viewportUID").empty() )
+    {
+        m_viewportID =  m_configuration->getAttributeValue("viewportUID");
+    }
+    this->parseTFConfig( m_configuration );
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildTFPoints()
+{
+    // Get the selected tf of the image
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+
+    // Clear the tf points map
+    m_TFPoints.clear();
+
+    // Iterate on the selected tf and fill the tf points map with key = value and T = Color(RGBA)
+    ::fwData::TransferFunction::TFValuePairType minMax = selectedTF->getMinMaxTFValues();
+    ::fwData::TransferFunction::TFValueType wlMin = selectedTF->getWLMinMax().first;
+    ::fwData::TransferFunction::TFValueType window = selectedTF->getWindow();
+    ::fwData::TransferFunction::TFValueType width = minMax.second - minMax.first;
+
+    BOOST_FOREACH(::fwData::TransferFunction::TFDataType::value_type elt, selectedTF->getTFData())
+    {
+        ::fwData::TransferFunction::TFValueType val;
+        val = (elt.first - minMax.first) / width;
+        val = val * window + wlMin;
+        m_TFPoints[val] = elt.second;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildCircles()
+{
+    this->initializeViewSize();
+    this->initializeViewportSize();
+
+    ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+    const double viewportHeight = viewport->getHeight();
+    const double viewportWidth = viewport->getWidth();
+
+    // Total ratio
+    Scene2DRatio ratio = this->getRatio();
+
+    double viewportWidthRatio = this->getViewportSizeRatio().first;
+
+    // Initialize the width of the circle
+    m_circleWidth = m_pointSize;
+
+    // Initialize the height of the circles
+    m_circleHeight = m_pointSize * viewportHeight / viewportWidth;
+    m_circleHeight /= viewportWidthRatio;
+    m_circleHeight *= (m_viewInitialSize.first / m_viewInitialSize.second);
+
+    // Apply the ratio of the scene 2D in order to keep the same size for the circles if viewport's size or
+    // view's size change:
+    m_circleWidth *= ratio.first;
+    m_circleHeight *= ratio.second;
+
+    // Remove the circles items from the scene and clear the circles vector
+    for (std::vector< QGraphicsEllipseItem* >::iterator circleIt = m_circles.begin() ; circleIt != m_circles.end() ; ++circleIt)
+    {
+        this->getScene2DRender()->getScene()->removeItem(*circleIt);
+        delete *circleIt;
+    }
+
+    m_circles.clear();
+
+    // Iterate on the tf points map to add circle items to the circles vector
+    BOOST_FOREACH(::fwData::TransferFunction::TFDataType::value_type elt,  m_TFPoints)
+    {
+        // Build circle corresponding to the tf point and push it back into the circles vector
+        m_circles.push_back(this->buildCircle(elt.first, elt.second));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+QGraphicsEllipseItem* TransferFunction::buildCircle(::fwData::TransferFunction::TFValueType value, ::fwData::TransferFunction::TFColor color)
+{
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+    Point2DType valColor(value, color.a );
+    Point2DType coord = this->mapAdaptorToScene(valColor, m_xAxis, m_yAxis);
+
+    // Build a circle item, set its color, pen and zValue
+    QGraphicsEllipseItem* circle = new QGraphicsEllipseItem(
+        coord.first - m_circleWidth / 2,
+        coord.second - m_circleHeight / 2,
+        m_circleWidth,
+        m_circleHeight
+        );
+    circle->setBrush(QBrush(QColor(color.r*255, color.g*255, color.b*255)));
+    circle->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    circle->setPen(m_circlePen);
+    circle->setZValue( 3 );
+
+    return circle;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildLinesAndPolygons()
+{
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+
+    // Remove line and polygon items from the scene and clear the lines and polygons vector
+    std::vector< QGraphicsItem* >::iterator linesAndPolygonsIt;
+    for( linesAndPolygonsIt = m_linesAndPolygons.begin() ; linesAndPolygonsIt != m_linesAndPolygons.end() ; ++linesAndPolygonsIt)
+    {
+        this->getScene2DRender()->getScene()->removeItem(*linesAndPolygonsIt);
+        delete *linesAndPolygonsIt;
+    }
+
+    m_linesAndPolygons.clear();
+
+    if (selectedTF->getInterpolationMode() == ::fwData::TransferFunction::LINEAR)
+    {
+        this->buildLinearLinesAndPolygons();
+    }
+    else
+    {
+        this->buildNearestLinesAndPolygons();
+        if (!selectedTF->getIsClamped())
+        {
+            this->buildBounds();
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildBounds()
+{
+    ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+
+    QGraphicsEllipseItem* beginCircle = m_circles.front();
+    QGraphicsEllipseItem* endCircle = m_circles.back();
+
+    double x1 = viewport->getX() - 10;
+    double x2 = beginCircle->rect().x() + beginCircle->pos().x() + m_circleWidth /2;
+    double y = beginCircle->rect().y() + beginCircle->pos().y() + m_circleHeight / 2;
+    // Build the line between the actual and the next TF Point and push it back into the lines and polygons vector
+    QGraphicsLineItem* line = new QGraphicsLineItem(x1, y, x2, y);
+    line->setPen(m_linePen);
+    line->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    line->setZValue( 2 );
+
+    m_linesAndPolygons.push_back(line);
+
+    // Build the points vector defining the polygon and build the polygon
+    QVector<QPointF> vect;
+    vect.append(QPointF(line->line().x1(), 0));
+    vect.append(QPointF(line->line().x1(), line->line().y1()));
+    vect.append(QPointF(line->line().x2(), line->line().y2()));
+    vect.append(QPointF(line->line().x2(), 0));
+
+    QGraphicsPolygonItem* poly = new QGraphicsPolygonItem( QPolygonF( vect ) );
+
+    // Set gradient, opacity and pen to the polygon
+    poly->setBrush( beginCircle->brush() );
+    poly->setOpacity(0.8);
+    poly->setPen(QPen(Qt::NoPen));
+    poly->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    poly->setZValue( 1 );
+
+    // Push the polygon back into the lines and polygons vector
+    m_linesAndPolygons.push_back(poly);
+
+    x1 = endCircle->rect().x() + endCircle->pos().x() + m_circleWidth /2;
+    x2 = viewport->getX() + viewport->getWidth() + 10;
+    y = endCircle->rect().y() + endCircle->pos().y() + m_circleHeight / 2;
+    // Build the line between the actual and the next TF Point and push it back into the lines and polygons vector
+    QGraphicsLineItem* line2 = new QGraphicsLineItem(x1, y, x2, y);
+    line2->setPen(m_linePen);
+    line2->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    line2->setZValue( 2 );
+
+    m_linesAndPolygons.push_back(line2);
+
+    // Build the points vector defining the polygon and build the polygon
+    QVector<QPointF> vect2;
+    vect2.append(QPointF(line2->line().x1(), 0));
+    vect2.append(QPointF(line2->line().x1(), line2->line().y1()));
+    vect2.append(QPointF(line2->line().x2(), line2->line().y2()));
+    vect2.append(QPointF(line2->line().x2(), 0));
+
+    QGraphicsPolygonItem* poly2 = new QGraphicsPolygonItem( QPolygonF( vect2 ) );
+
+    // Set gradient, opacity and pen to the polygon
+    poly2->setBrush( endCircle->brush() );
+    poly2->setOpacity(0.8);
+    poly2->setPen(QPen(Qt::NoPen));
+    poly2->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    poly2->setZValue( 1 );
+
+    // Push the polygon back into the lines and polygons vector
+    m_linesAndPolygons.push_back(poly2);
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildLinearLinesAndPolygons()
+{
+    SLM_ASSERT("Circles must not be empty", !m_circles.empty());
+
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+    ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+
+    QVector<QPointF> vect;
+    QLinearGradient grad;
+
+    QGraphicsEllipseItem* firtsCircle = m_circles.front();
+    QGraphicsEllipseItem* lastCircle = m_circles.back();
+
+
+    double xBegin;
+    double xEnd;
+    xBegin = firtsCircle->rect().x() + firtsCircle->pos().x() + m_circleWidth / 2;
+    xEnd = lastCircle->rect().x() + lastCircle->pos().x() + m_circleWidth / 2;
+    if (selectedTF->getIsClamped())
+    {
+        vect.append(QPointF(xBegin, 0));
+    }
+    else
+    {
+        if (xBegin > viewport->getX())
+        {
+            xBegin = viewport->getX()-10;
+            vect.append(QPointF(xBegin, 0));
+            vect.append(QPointF(xBegin, firtsCircle->rect().y() + firtsCircle->pos().y() + m_circleHeight / 2));
+        }
+        else
+        {
+            vect.append(QPointF(xBegin, 0));
+        }
+        if (xEnd < viewport->getX() + viewport->getWidth())
+        {
+            xEnd = viewport->getX() + viewport->getWidth() +10 ;
+        }
+    }
+
+    grad.setColorAt(0 ,  firtsCircle->brush().color());
+
+    grad.setStart( xBegin, 0);
+    grad.setFinalStop( xEnd, 0 );
+
+    double distanceMax = xEnd - xBegin;
+
+    // Iterate on the circles vector to add line and polygon items to the lines and polygons vector
+    for ( std::vector< QGraphicsEllipseItem* >::iterator circleIt = m_circles.begin() ; circleIt != m_circles.end()-1 ; ++circleIt)
+    {
+        QPointF p1((*circleIt)->rect().x() + (*circleIt)->pos().x() + m_circleWidth / 2,
+                   (*circleIt)->rect().y() + (*circleIt)->pos().y() + m_circleHeight / 2);
+        QPointF p2((*(circleIt + 1))->rect().x() + (*(circleIt + 1))->pos().x() + m_circleWidth / 2,
+                   (*(circleIt + 1))->rect().y() + (*(circleIt + 1))->pos().y() + m_circleHeight / 2);
+
+        vect.append(p1);
+        vect.append(p2);
+
+        // Build the gradient
+        grad.setColorAt((p1.x() - xBegin)/distanceMax ,  (*circleIt)->brush().color());
+    }
+
+    if (!selectedTF->getIsClamped())
+    {
+        if (xEnd == viewport->getX() + viewport->getWidth() + 10)
+        {
+            vect.append(QPointF(xEnd, lastCircle->rect().y() + lastCircle->pos().y() + m_circleHeight / 2));
+        }
+        double lastCircleX = lastCircle->rect().x() + lastCircle->pos().x() + m_circleWidth / 2;
+        grad.setColorAt((lastCircleX-xBegin)/distanceMax , lastCircle->brush().color());
+    }
+    vect.append(QPointF(xEnd, 0));
+    grad.setColorAt(1 , lastCircle->brush().color());
+
+
+
+    QGraphicsPolygonItem* poly = new QGraphicsPolygonItem( QPolygonF( vect ) );
+    // Set gradient, opacity and pen to the polygon
+    poly->setBrush( QBrush( grad ) );
+    poly->setOpacity(0.8);
+    poly->setPen(m_linePen);
+    poly->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+    poly->setZValue( 1 );
+
+    // Push the polygon back into the lines and polygons vector
+    m_linesAndPolygons.push_back(poly);
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildNearestLinesAndPolygons()
+{
+    // Iterate on the circles vector to add line and polygon items to the lines and polygons vector
+    for ( std::vector< QGraphicsEllipseItem* >::iterator circleIt = m_circles.begin() ; circleIt != m_circles.end() ; ++circleIt)
+    {
+        QGraphicsEllipseItem* circle = *circleIt;
+        QGraphicsEllipseItem* previousCircle;
+        if (circleIt == m_circles.begin())
+        {
+            previousCircle = circle;
+        }
+        else
+        {
+            previousCircle = *(circleIt-1);
+        }
+        QGraphicsEllipseItem* nextCircle;
+        if (circleIt == m_circles.end()-1)
+        {
+            nextCircle = circle;
+        }
+        else
+        {
+            nextCircle = *(circleIt+1);
+        }
+
+        double x1 = previousCircle->rect().x() + previousCircle->pos().x() + (circle->pos().x() + circle->rect().x()
+                - (previousCircle->pos().x() + previousCircle->rect().x()))/2 + m_circleWidth /2;
+        double x2 = circle->rect().x() + circle->pos().x() + (nextCircle->pos().x() + nextCircle->rect().x()
+                - (circle->pos().x() + circle->rect().x()))/2 + m_circleWidth /2;
+        double y = circle->rect().y() + circle->pos().y() + m_circleHeight / 2;
+        // Build the line between the actual and the next TF Point and push it back into the lines and polygons vector
+        QGraphicsLineItem* line = new QGraphicsLineItem(x1, y, x2, y);
+        line->setPen(m_linePen);
+        line->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+        line->setZValue( 2 );
+
+        m_linesAndPolygons.push_back(line);
+
+        // Build the points vector defining the polygon and build the polygon
+        QVector<QPointF> vect;
+        vect.append(QPointF(line->line().x1(), 0));
+        vect.append(QPointF(line->line().x1(), line->line().y1()));
+        vect.append(QPointF(line->line().x2(), line->line().y2()));
+        vect.append(QPointF(line->line().x2(), 0));
+
+        QGraphicsPolygonItem* poly = new QGraphicsPolygonItem( QPolygonF( vect ) );
+
+        // Set gradient, opacity and pen to the polygon
+        poly->setBrush( circle->brush() );
+        poly->setOpacity(0.8);
+        poly->setPen(QPen(Qt::NoPen));
+        poly->setCacheMode( QGraphicsItem::DeviceCoordinateCache );
+        poly->setZValue( 1 );
+
+        // Push the polygon back into the lines and polygons vector
+        m_linesAndPolygons.push_back(poly);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::buildLayer()
+{
+    // Add graphics items vectors to the layer
+    for ( unsigned int i = 0 ; i < m_linesAndPolygons.size() ; i++)
+    {
+        m_layer->addToGroup(m_linesAndPolygons.at(i));
+    }
+
+    for ( unsigned int i = 0 ; i < m_circles.size() ; i++)
+    {
+        m_layer->addToGroup(m_circles.at(i));
+    }
+
+    // Adjust the layer's position and zValue depending on the associated axis
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+
+    // Add the layer item to the scene
+    this->getScene2DRender()->getScene()->addItem(m_layer);
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::updateImageTF()
+{
+    // Get the selected tf of the image
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+    ::fwData::TransferFunction::TFValuePairType minMax = selectedTF->getMinMaxTFValues();
+    ::fwData::TransferFunction::TFValueType window = selectedTF->getWindow();
+    ::fwData::TransferFunction::TFValueType wlMin = selectedTF->getWLMinMax().first;
+    ::fwData::TransferFunction::TFValueType val;
+    selectedTF->clear();
+
+    // Rebuild the selected tf from the tf points map
+    double width = minMax.second - minMax.first;
+    double min = m_TFPoints.begin()->first;
+    double max = m_TFPoints.rbegin()->first;
+    BOOST_FOREACH(::fwData::TransferFunction::TFDataType::value_type elt,  m_TFPoints)
+    {
+        val = (elt.first - wlMin) / window;
+        val = val * width + minMax.first;
+        selectedTF->addTFColor(val, elt.second);
+    }
+
+    if (window >= 0)
+    {
+        selectedTF->setWLMinMax(::fwData::TransferFunction::TFValuePairType(min, max));
+    }
+    else
+    {
+        selectedTF->setWLMinMax(::fwData::TransferFunction::TFValuePairType(max, min));
+    }
+
+    ::fwComEd::TransferFunctionMsg::sptr msg = ::fwComEd::TransferFunctionMsg::New();
+    msg->addEvent(::fwComEd::TransferFunctionMsg::MODIFIED_POINTS);
+    ::fwServices::IEditionService::notify( this->getSptr(), selectedTF, msg );
+
+    // Update image window and level
+    this->notifyTFWindowing(this->getSptr());
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doStart() throw ( ::fwTools::Failed )
+{
+    // Initialize the layer and the circle height and width
+    m_layer = new QGraphicsItemGroup();
+
+    m_linePen.setCosmetic( true );
+    m_linePen.setWidthF( 0 );
+
+    m_circlePen.setCosmetic( true );
+    m_circlePen.setWidthF( 0 );
+
+    m_viewport = ::scene2D::data::Viewport::dynamicCast( ::fwTools::fwID::getObject( m_viewportID ) );
+
+    m_connection = m_viewport->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doUpdate() throw ( ::fwTools::Failed )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->updateTransferFunction(image, this->getSptr());
+
+    // Build the tf map points, the circles vector, the lines and polygons vector, add the items to the layer and add it to the scene
+    this->buildTFPoints();
+    this->buildCircles();
+    this->buildLinesAndPolygons();
+    this->buildLayer();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doReceive( fwServices::ObjectMsg::csptr msg) throw ( ::fwTools::Failed )
+{
+    if(msg->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING )
+            || msg->hasEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS )
+            || msg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED)
+            || msg->hasEvent( ::fwComEd::ImageMsg::BUFFER)
+            || msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE)
+            || this->upadteTFObserver(msg, this->getSptr()))
+    {
+        this->doUpdate();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doSwap() throw ( ::fwTools::Failed )
+{
+    this->removeTFObserver();
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doStop() throw ( ::fwTools::Failed )
+{
+    this->removeTFObserver();
+    m_connection.disconnect();
+
+    // Clear the items vectors and remove the layer (and all its children) from the scene
+    for (std::vector< QGraphicsEllipseItem* >::iterator circleIt = m_circles.begin() ; circleIt != m_circles.end() ; ++circleIt )
+    {
+        delete *circleIt;
+    }
+
+    for( std::vector< QGraphicsItem* >::iterator linesPolyIt = m_linesAndPolygons.begin() ;
+            linesPolyIt != m_linesAndPolygons.end() ; ++linesPolyIt)
+    {
+        delete *linesPolyIt;
+    }
+
+    this->getScene2DRender()->getScene()->removeItem(m_layer);
+    delete m_layer;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_ASSERT("Sizes of circles vector and tf points map are different", m_TFPoints.size() == m_circles.size());
+
+    QPoint scenePos = QPoint(_event->getCoord().getX(), _event->getCoord().getY());
+
+    QList<QGraphicsItem*> items = this->getScene2DRender()->getView()->items(scenePos);
+
+    // Iterate parallely on the circles vector and the tf points map
+    ::fwData::TransferFunction::TFDataType::iterator TFPointIt = m_TFPoints.begin();
+    BOOST_FOREACH(QGraphicsEllipseItem* circle, m_circles)
+    {
+        if ( items.indexOf(circle) >=0)
+        {
+            // If there is a double click
+            if ( _event->getType() == ::scene2D::data::Event::MouseButtonDoubleClick )
+            {
+                this->doubleClickEvent(circle, TFPointIt->second);
+                return;
+            }
+            // If left button is pressed
+            else if ( _event->getType() == ::scene2D::data::Event::MouseButtonPress
+                    && _event->getButton() == ::scene2D::data::Event::LeftButton )
+            {
+
+                this->leftButtonEvent(circle, _event);
+                return;
+            }
+            else if ( _event->getType() == ::scene2D::data::Event::MouseButtonPress
+                    && _event->getButton() == ::scene2D::data::Event::RightButton
+                    && m_circles.size() > 2  )
+            {
+                this->rightButtonEvent(TFPointIt->first, _event);
+                return;
+            }
+        }
+        // If a point is captured, this is the good one, and the mouse move
+        if ( m_pointIsCaptured && m_capturedCircle == circle
+                && _event->getType() == ::scene2D::data::Event::MouseMove )
+        {
+            this->mouseMoveEvent(circle, TFPointIt->first, _event);
+            return;
+        }
+        // If a point is captured, this is the good one, and the button is released
+        else if ( m_pointIsCaptured && m_capturedCircle == circle
+                && _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+        {
+            this->mouseButtonReleaseEvent(circle, _event);
+            return;
+        }
+        ++TFPointIt;
+    }
+
+
+    // After iteration, due to return instruction in it, the events caught aren't on circles
+    if ( _event->getType() == ::scene2D::data::Event::MouseButtonDoubleClick && _event->getButton() == ::scene2D::data::Event::LeftButton )
+    {
+        // If no other event has been catched, a left click means a point creation
+        this->doubleClickEvent(_event);
+    }
+
+    if( _event->getType() == ::scene2D::data::Event::Resize)
+    {
+        ::scene2D::data::Size oldSize = _event->getOldSize();
+        ::scene2D::data::Size newSize = _event->getSize();
+
+        if( oldSize.getWidth() == -1.0f )
+        {
+            m_viewInitialSize.first = newSize.getWidth();
+        }
+
+        if( oldSize.getHeight() == -1.0f )
+        {
+            m_viewInitialSize.second = newSize.getHeight();
+        }
+
+        this->doUpdate();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doubleClickEvent(QGraphicsEllipseItem* circle, ::fwData::TransferFunction::TFColor& tfColor)
+{
+    // Open a QColorDialog with the selected circle color and the tf point alpha as default rgba color
+    const QColor shapeColor = ((QAbstractGraphicsShapeItem*)circle)->brush().color();
+    const QColor initialColor( shapeColor.red(), shapeColor.green(), shapeColor.blue(), tfColor.a*255);
+
+    QColor circleColor = QColorDialog::getColor(initialColor,
+                                this->getScene2DRender()->getView(),
+                                QString("Choose the point color"),
+                                QColorDialog::ShowAlphaChannel);
+
+    if (circleColor.isValid())
+    {
+        // If the color is valid, modify the selected tf point color
+        tfColor.r = circleColor.redF();
+        tfColor.g = circleColor.greenF();
+        tfColor.b = circleColor.blueF();
+        tfColor.a = circleColor.alphaF();
+
+        // Build circles, lines and polygons cause they're modified by the new tf point color
+        this->buildCircles();
+        this->buildLinesAndPolygons();
+        this->buildLayer();
+
+        // Update the selected tf (no need to rescale cause the selected circle position has not changed)
+        this->updateImageTF();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::leftButtonEvent(QGraphicsEllipseItem* circle, ::scene2D::data::Event::sptr _event)
+{
+    m_pointIsCaptured = true;
+
+    // Store the captured circle in case it's moved
+    m_capturedCircle = circle;
+
+    //Store the circle coordinates in case it's moved
+    m_oldCoord = this->coordViewToCoordItem( _event->getCoord() );
+
+    // Set the selected circle pen to yellow to get a visual feedback that the selected circle is selected
+    circle->setPen( QPen( Qt::GlobalColor( Qt::yellow ) ) );
+
+    _event->setAccepted(true);
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::mouseMoveEvent(QGraphicsEllipseItem* circle,
+        ::fwData::TransferFunction::TFValueType tfPoint,
+         ::scene2D::data::Event::sptr _event)
+{
+    QGraphicsEllipseItem* lastPoint = m_circles.back();
+
+    std::vector< QGraphicsEllipseItem* >::iterator circleIt;
+    circleIt = std::find(m_circles.begin(), m_circles.end(), circle);
+
+    // Get the previous circle
+    std::vector< QGraphicsEllipseItem* >::iterator previousCircle = circleIt;
+    if (circle != m_circles.front())
+    {
+        --previousCircle;
+    }
+
+    // Get the next circle
+    std::vector< QGraphicsEllipseItem* >::iterator nextCircle = circleIt;
+    if (circle != lastPoint)
+    {
+        ++nextCircle;
+    }
+
+    // Get the actual selected circle coordinates
+    ::scene2D::data::Coord newCoord = this->coordViewToCoordItem( _event->getCoord() );
+
+    // Calculate the real coordinates of the previous circle
+    double previousXCircleRealPos = (*previousCircle)->rect().x() + (*previousCircle)->pos().x();
+    double previousYRealNewPos = (*previousCircle)->rect().y() + (*previousCircle)->pos().y();
+
+    Point2DType previousValues;
+    Point2DType previousXY(previousXCircleRealPos, previousYRealNewPos );
+    previousValues = this->mapSceneToAdaptor(previousXY, m_xAxis, m_yAxis);
+
+
+    // Calculate the real coordinates of the next circle
+    double nextXCircleRealPos = (*nextCircle)->rect().x() + (*nextCircle)->pos().x();
+    double nextYRealNewPos = (*nextCircle)->rect().y() + (*nextCircle)->pos().y();
+
+    Point2DType nextValues;
+    Point2DType nextXY(nextXCircleRealPos, nextYRealNewPos);
+    nextValues = this->mapSceneToAdaptor(nextXY, m_xAxis, m_yAxis);
+
+
+    // Calculate the real coordinates of the selected circle
+    double circleXRealNewPos = circle->rect().x() + circle->pos().x() + newCoord.getX() - m_oldCoord.getX();
+    double circleYRealNewPos = circle->rect().y() + circle->pos().y() + newCoord.getY() - m_oldCoord.getY();
+
+    Point2DType realValues;
+    Point2DType circleXY( circleXRealNewPos , circleYRealNewPos );
+    realValues = this->mapSceneToAdaptor(circleXY, m_xAxis, m_yAxis);
+
+    Point2DType oldCoordPair;
+    Point2DType oldCoordXY( m_oldCoord.getX(), m_oldCoord.getY() );
+    oldCoordPair = this->mapSceneToAdaptor(oldCoordXY, m_xAxis, m_yAxis);
+
+    Point2DType newCoordPair;
+    Point2DType newCoordXY( newCoord.getX(), newCoord.getY() );
+    newCoordPair = this->mapSceneToAdaptor(newCoordXY, m_xAxis, m_yAxis);
+
+
+    // Check if the mouse isn't out of bounds vertically and horizontally
+    if (   (circle == m_circles.front() || realValues.first > previousValues.first)
+        && (circle == lastPoint || realValues.first < nextValues.first)
+        && (realValues.second - m_circleHeight/2) >= 0
+        && (realValues.second - m_circleHeight/2) <= 1 )
+    {
+        // Move the selected tf point by the difference between the old coordinates and the new ones
+        circle->moveBy( newCoord.getX() - m_oldCoord.getX(), newCoord.getY() - m_oldCoord.getY() );
+
+        // Set the actual coordinates as the old ones
+        m_oldCoord = newCoord;
+    }
+    else
+    {
+        // Check if the mouse is out of bounds only horizontally
+        if (  ((circle != m_circles.front() && realValues.first < previousValues.first)
+                    || (circle != lastPoint && realValues.first > nextValues.first))
+                && (realValues.second - m_circleHeight/2) >= 0
+                && (realValues.second - m_circleHeight/2) <= 1 )
+        {
+            // new abscissa of the moving TF point
+            double x = (newCoordPair.first > oldCoordPair.first) ? (nextValues.first - 1) : (previousValues.first + 1);
+            x = this->mapAdaptorToScene(Point2DType( x, 0 ), m_xAxis, m_yAxis).first;
+
+            QRectF rect = circle->rect();
+            const double width = rect.width();
+            rect.setX( x );
+            rect.setWidth( width );
+            circle->setRect( rect );
+
+            circle->setPos( 0, circle->pos().y() + (newCoord.getY() - m_oldCoord.getY()) );
+
+            m_oldCoord.setX( x );
+            m_oldCoord.setY(newCoord.getY());
+        }
+
+        // Check if the mouse is out of bounds only vertically
+        if (  (circle == m_circles.front() || realValues.first > previousValues.first)
+                && (circle == lastPoint || realValues.first < nextValues.first)
+                && ((realValues.second - m_circleHeight/2) < 0 || (realValues.second - m_circleHeight/2) > 1) ) // opacity
+        {
+            // If the mouse is vertically out of bounds, the TF point is moved to fit the nearest vertical bound (0 or 1).
+
+            double y = 0;   // new ordinate of the moving TF point
+
+            if( newCoordPair.second > oldCoordPair.second )
+            {
+                // Mouse's move goes toward (and outside) the top of the scene: the ordinate of the circle must be set to 1,
+                // which is the highest value for opacity
+                y = this->mapAdaptorToScene(Point2DType( 0, 1 ), m_xAxis, m_yAxis).second;
+            }
+
+            QRectF rect = circle->rect();
+            const double height = rect.height();
+            rect.setY( y - m_circleHeight / 2 );
+            rect.setHeight( height );
+            circle->setRect( rect );
+
+            circle->setPos( circle->pos().x() + (newCoord.getX() - m_oldCoord.getX()), 0);  // position within item's rect
+
+            m_oldCoord.setX(newCoord.getX());
+            m_oldCoord.setY( y );
+        }
+    }
+
+    this->buildLinesAndPolygons();
+    this->buildLayer();
+
+    // Erase the selected tf point cause it's key is const
+    m_TFPoints.erase(tfPoint);
+
+    Point2DType point(this->pointValue(circle) , circle->rect().y() + circle->pos().y() + m_circleHeight / 2 );
+    // Create a new tf point with the right value (key) and alpha
+    Point2DType pair = this->mapSceneToAdaptor(point, m_xAxis, m_yAxis);
+
+    m_TFPoints[pair.first] = ::fwData::TransferFunction::TFColor(
+            circle->brush().color().redF(),
+            circle->brush().color().greenF(),
+            circle->brush().color().blueF(),
+        pair.second);
+
+    // Update the image tf
+    this->updateImageTF();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::mouseButtonReleaseEvent(QGraphicsEllipseItem* circle, ::scene2D::data::Event::sptr _event)
+{
+    // Reset the circle pen to the selected circle to get a visual feedback that the circle is no more selected
+    circle->setPen(m_circlePen);
+    m_pointIsCaptured = false;
+    _event->setAccepted(true);
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::rightButtonEvent(::fwData::TransferFunction::TFValueType tfPoint,
+                                        ::scene2D::data::Event::sptr _event)
+{
+    _event->setAccepted(true);
+
+    // Erase the selected tf point
+    m_TFPoints.erase(tfPoint);
+
+    this->updateImageTF();
+    this->doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunction::doubleClickEvent( ::scene2D::data::Event::sptr _event)
+{
+    ::fwData::TransferFunction::sptr selectedTF = this->getTransferFunction();
+
+    // Get the x and y position in the scene coordinates
+    double x = this->getScene2DRender()->mapToScene(_event->getCoord()).getX();
+    double y = this->getScene2DRender()->mapToScene(_event->getCoord()).getY();
+
+    // Transform the x and y coordinates with axis scaling and type
+    Point2DType _xy(x , y );
+    Point2DType values = this->mapSceneToAdaptor(_xy , m_xAxis, m_yAxis);
+
+    ::fwData::TransferFunction::TFDataType::iterator nextTFPointIt = m_TFPoints.begin();
+    ::fwData::TransferFunction::TFDataType::reverse_iterator lastTFPointIt = m_TFPoints.rbegin();
+
+    if (values.first < (*nextTFPointIt).first)
+    {
+        ::fwData::TransferFunction::TFColor color((*nextTFPointIt).second.r, (*nextTFPointIt).second.g, (*nextTFPointIt).second.b, values.second);
+        m_TFPoints[values.first] = color;
+
+        this->updateImageTF();
+        this->doUpdate();
+    }
+    else if (values.first > (*lastTFPointIt).first)
+    {
+        ::fwData::TransferFunction::TFColor color((*lastTFPointIt).second.r, (*lastTFPointIt).second.g, (*lastTFPointIt).second.b, values.second);
+        m_TFPoints[values.first] = color;
+
+        this->updateImageTF();
+        this->doUpdate();
+    }
+    else
+    {
+        // Iterate on m_TFPoints to find the next and the previous point of our event position
+        while ((*nextTFPointIt).first < values.first)
+        {
+            ++nextTFPointIt;
+        }
+        ::fwData::TransferFunction::TFDataType::iterator prevTFPointIt = nextTFPointIt;
+        --prevTFPointIt;
+
+        // Check if the new point is not placed on an already existing point
+        if ( (values.first != (*nextTFPointIt).first) && (values.first != (*prevTFPointIt).first) )
+        {
+            // Calculate the relative position of the event between the 2 encompassing points
+            double coef = (values.first - (*prevTFPointIt).first) / ((*nextTFPointIt).first - (*prevTFPointIt).first);
+
+            // Calculate the new red, green, blue and alpha by linear interpolation in RGBA
+            double newRed = coef * ((*nextTFPointIt).second.r - (*prevTFPointIt).second.r) + (*prevTFPointIt).second.r;
+            double newGreen = coef * ((*nextTFPointIt).second.g - (*prevTFPointIt).second.g) + (*prevTFPointIt).second.g;
+            double newBlue = coef * ((*nextTFPointIt).second.b - (*prevTFPointIt).second.b) + (*prevTFPointIt).second.b;
+            double newAlpha = coef * ((*nextTFPointIt).second.a - (*prevTFPointIt).second.a) + (*prevTFPointIt).second.a;
+
+            // Add a point with the right values to the tf points map
+            m_TFPoints[values.first] = ::fwData::TransferFunction::TFColor(newRed, newGreen, newBlue, newAlpha);
+
+            this->updateImageTF();
+            this->doUpdate();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+double TransferFunction::pointValue(QGraphicsEllipseItem* circle)
+{
+    // Return the x coordinate of the center of a circle in a 0-1 scale
+    return (circle->rect().x() + circle->pos().x() + m_circleWidth / 2);
+}
+
+//-----------------------------------------------------------------------------
+
+::scene2D::data::Coord TransferFunction::coordViewToCoordItem( const ::scene2D::data::Coord & _coord )
+{
+    ::scene2D::data::Coord scenePoint = this->getScene2DRender()->mapToScene( _coord );
+    return scenePoint;
+}
+
+} // namespace adaptor
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportInteractor.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportInteractor.cpp
new file mode 100644
index 0000000..2a25d45
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportInteractor.cpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include "scene2D/adaptor/ViewportInteractor.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::ViewportInteractor,  ::fwData::Composite );
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+//-----------------------------------------------------------------------------
+
+ViewportInteractor::ViewportInteractor() throw() :
+        m_viewportIsTranslated(false)
+{
+//    this->handlingEventOff();
+}
+
+//-----------------------------------------------------------------------------
+
+ViewportInteractor::~ViewportInteractor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::configuring() throw( ::fwTools::Failed)
+{
+    this->IAdaptor::configuring();
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::doStart() throw( ::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::doStop() throw( ::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::doUpdate() throw( ::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::doSwap() throw( ::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    if ( _event->getType() == ::scene2D::data::Event::MouseWheelUp
+            && _event->getModifier() == ::scene2D::data::Event::ShiftModifier )
+    {
+        this->zoom(true);
+    }
+    else if ( _event->getType() == ::scene2D::data::Event::MouseWheelDown
+            && _event->getModifier() == ::scene2D::data::Event::ShiftModifier )
+    {
+        this->zoom(false);
+    }
+    else if ( _event->getType() == ::scene2D::data::Event::MouseButtonPress
+            && _event->getButton() == ::scene2D::data::Event::LeftButton
+            && _event->getModifier() == ::scene2D::data::Event::ShiftModifier )
+    {
+        m_viewportIsTranslated = true;
+        m_lastCoordEvent = _event->getCoord();
+    }
+    else if ( m_viewportIsTranslated )
+    {
+        if ( _event->getType() == ::scene2D::data::Event::MouseMove )
+        {
+            ::scene2D::data::Coord coord = _event->getCoord();
+            ::scene2D::data::Viewport::sptr sceneViewport = this->getScene2DRender()->getViewport();
+
+            float dx = coord.getX() - m_lastCoordEvent.getX();
+            float xTrans = dx * sceneViewport->getWidth() / (float) this->getScene2DRender()->getView()->width();
+
+            float dy = coord.getY() - m_lastCoordEvent.getY();
+            float yTrans = dy * sceneViewport->getHeight() / (float) this->getScene2DRender()->getView()->height();
+
+            sceneViewport->setX( sceneViewport->getX() - xTrans );
+            sceneViewport->setY( sceneViewport->getY() - yTrans );
+            this->getScene2DRender()->getView()->updateFromViewport();
+
+            m_lastCoordEvent = coord;
+        }
+        else if ( _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+        {
+            m_viewportIsTranslated = false;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportInteractor::zoom( bool zoomIn )
+{
+    ::scene2D::data::Viewport::sptr sceneViewport = this->getScene2DRender()->getViewport();
+
+    float zoomPercent = 10 / 100.0;
+    float y = sceneViewport->getY();
+    float x = sceneViewport->getX();
+    float width = sceneViewport->getWidth();
+    float height = sceneViewport->getHeight();
+    float centerX = x + width/2.0;
+    float centerY = x + height/2.0;
+
+    float newWidth;
+    float newHeight;
+    if ( zoomIn )
+    {
+        newWidth = width * zoomPercent;
+        newHeight = height * zoomPercent;
+    }
+    else
+    {
+        newWidth = - width * zoomPercent;
+        newHeight = - height * zoomPercent;
+    }
+
+    newWidth += width;
+    newHeight += height;
+
+    x = centerX - newWidth / 2;
+    y = centerY - newHeight / 2;
+
+    width = newWidth;
+    height = newHeight;
+
+    // Set viewport
+    sceneViewport->setX( x );
+    sceneViewport->setY( y );
+    sceneViewport->setWidth( width );
+    sceneViewport->setHeight( height );
+    this->getScene2DRender()->getView()->updateFromViewport();
+}
+
+//-----------------------------------------------------------------------------
+
+}   // namespace adaptor
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportRangeSelector.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportRangeSelector.cpp
new file mode 100644
index 0000000..8083bf9
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportRangeSelector.cpp
@@ -0,0 +1,371 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include <scene2D/data/Viewport.hpp>
+#include <scene2D/data/ViewportMsg.hpp>
+
+#include <QGraphicsRectItem>
+
+#include "scene2D/adaptor/ViewportRangeSelector.hpp"
+#include "scene2D/Scene2DGraphicsView.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::ViewportRangeSelector, ::scene2D::data::Viewport);
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+ViewportRangeSelector::ViewportRangeSelector() throw()
+    : m_isLeftInteracting( false ), m_isRightInteracting( false ), m_isInteracting( false ), m_clickCatchRange( 15 )
+{
+//     this->handlingEventOff(); // This service no handling event
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+ViewportRangeSelector::~ViewportRangeSelector() throw()
+{
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::scene2D::data::Viewport::sptr viewport = this->getScene2DRender()->getViewport();
+
+    this->IAdaptor::configuring();
+
+    const double viewportWidth = viewport->getWidth();
+    const double defaultWidth = 2 * viewportWidth / 4;
+
+    if (!m_configuration->getAttributeValue("initialWidth").empty())
+    {
+        m_initialWidth = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("initialWidth") );
+
+        if( m_initialWidth > viewportWidth || m_initialWidth < m_clickCatchRange )
+        {
+            OSLM_WARN("Set viewport width to a default value instead of the given one because it can't be accepted.");
+            m_initialWidth = defaultWidth;
+        }
+    }
+    else
+    {
+        m_initialWidth = defaultWidth;
+    }
+
+    const double defaultPos = (viewportWidth - m_initialWidth) / 2;
+
+    if (!m_configuration->getAttributeValue("initialPos").empty())
+    {
+        m_initialX = ::boost::lexical_cast< float >( m_configuration->getAttributeValue("initialPos") );
+
+        if( m_initialX < viewport->getX() || (m_initialX + m_initialWidth) > viewportWidth)
+        {
+            OSLM_WARN("Set viewport position to a default value since the given one is not correct.");
+            m_initialX = defaultPos;
+        }
+    }
+    else
+    {
+        m_initialX = defaultPos;
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::scene2D::data::Viewport::sptr viewport = this->getObject< ::scene2D::data::Viewport>();
+
+    QRectF sceneRect = this->getScene2DRender()->getScene()->sceneRect();
+
+    std::pair< double, double > pair = this->mapAdaptorToScene(
+            std::pair< double, double >( m_initialX, viewport->getHeight() ), m_xAxis, m_yAxis );
+    m_shutter = new QGraphicsRectItem(
+            pair.first, 0, m_initialWidth * m_xAxis->getScale(), pair.second );
+    m_shutter->setBrush( QBrush(QColor(127, 127, 127, 127)) );
+    m_shutter->setPen( Qt::NoPen );
+
+    m_layer = new QGraphicsItemGroup();
+    m_layer->addToGroup( m_shutter );
+
+    // Adjust the layer's position and zValue depending on the associated axis
+    m_layer->setPos(m_xAxis->getOrigin(), m_yAxis->getOrigin());
+    m_layer->setZValue(m_zValue);
+
+    this->getScene2DRender()->getScene()->addItem( m_layer );
+
+    QRectF rect = m_shutter->rect();
+    updateViewportFromShutter( rect.x(), rect.y(), rect.width(), rect.height() );
+
+    ::scene2D::data::ViewportMsg::sptr msg = ::scene2D::data::ViewportMsg::New();
+    msg->addEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+    ::fwServices::IEditionService::notify( this->getSptr(), viewport, msg );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::doStop() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::doSwap() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+    SLM_TRACE_FUNC();
+
+    // Event coordinates in scene
+    ::scene2D::data::Coord coord;
+    coord = this->getScene2DRender()->mapToScene( _event->getCoord() );
+
+    // Shutter coordinates in scene
+    std::pair< double, double > shutterCoordPair;
+    shutterCoordPair = this->mapAdaptorToScene(
+            std::pair< double, double >( m_shutter->rect().x(), m_shutter->rect().y() ), m_xAxis, m_yAxis);
+    double shutterWidth = m_shutter->rect().width() * m_xAxis->getScale();
+
+    QRectF sceneRect = this->getScene2DRender()->getScene()->sceneRect();
+
+    bool onShutterLeft = mouseOnShutterLeft( coord );
+    bool onShutterRight = mouseOnShutterRight( coord );
+    bool onShutterMiddle = mouseOnShutterMiddle( coord );
+
+    QRectF rect = m_shutter->rect();
+
+    if( _event->getType() == ::scene2D::data::Event::MouseButtonPress )
+    {
+        if( onShutterLeft )
+        {
+            m_isLeftInteracting = true;
+        }
+        else if( onShutterRight )
+        {
+            m_isRightInteracting = true;
+        }
+        else if( onShutterMiddle )
+        {
+            this->getScene2DRender()->getView()->setCursor( Qt::ClosedHandCursor );
+
+            // Interaction when clicking on the center of the shutter
+            m_isInteracting = true;
+            m_dragStartPoint = coord;
+            m_dragStartShutterPos.setX( shutterCoordPair.first );
+            m_dragStartShutterPos.setY( shutterCoordPair.second );
+        }
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseButtonRelease )
+    {
+        m_isInteracting = false;
+        m_isLeftInteracting = false;
+        m_isRightInteracting = false;
+
+        // Reset cursor
+        if( onShutterMiddle )
+        {
+            this->getScene2DRender()->getView()->setCursor( Qt::OpenHandCursor );
+        }
+        else
+        {
+            this->getScene2DRender()->getView()->setCursor( Qt::ArrowCursor );
+        }
+    }
+    else if( _event->getType() == ::scene2D::data::Event::MouseMove )
+    {
+        // If the mouse is moving onto the shutter, without interactions, the cursor is changed to an other cursor
+        // that symbolize the available interactions
+        if( !m_isLeftInteracting && !m_isRightInteracting && !m_isInteracting )
+        {
+            if( onShutterLeft || onShutterRight )
+            {
+                this->getScene2DRender()->getView()->setCursor( Qt::SizeHorCursor );    // horizontal double arrow
+            }
+            else if( onShutterMiddle )
+            {
+                this->getScene2DRender()->getView()->setCursor( Qt::OpenHandCursor );   // open hand, for moving the whole shutter
+            }
+            else
+            {
+                this->getScene2DRender()->getView()->setCursor( Qt::ArrowCursor );      // reset the cursor to the default cursor
+            }
+        }
+
+        bool update = false;    // if a viewport update will be requested
+
+        if( m_isLeftInteracting )
+        {
+            // Shutter right side position
+            double rightSide = rect.x() + rect.width();
+
+            if( coord.getX() < rightSide - m_clickCatchRange)
+            {
+                if( coord.getX() >= sceneRect.x() )
+                {
+                    rect.setX( coord.getX() );
+                }
+                else
+                {
+                    rect.setX( sceneRect.x() );
+                }
+            }
+            else
+            {
+                rect.setX( rightSide - m_clickCatchRange );
+            }
+
+            update = true;
+        }
+        else if( m_isRightInteracting )
+        {
+            double newWidth = coord.getX() - shutterCoordPair.first;
+            double shutterRightPos = abs(sceneRect.x()) + shutterCoordPair.first + newWidth;
+
+            if( newWidth > m_clickCatchRange ) // Shutter's width must be greater than the allowed picking range
+            {
+                if( shutterRightPos < sceneRect.width() )
+                {
+                    rect.setWidth( newWidth );
+                }
+                else
+                {
+                    rect.setWidth( sceneRect.width() - shutterCoordPair.first - abs(sceneRect.x()) );
+                }
+            }
+            else
+            {
+                rect.setWidth( m_clickCatchRange );
+            }
+
+            update = true;
+        }
+        else if( m_isInteracting )
+        {
+            double offset = coord.getX() - m_dragStartPoint.getX();
+            double newX = m_dragStartShutterPos.getX() + offset;
+            double shutterRightPos = abs(sceneRect.x()) + newX + shutterWidth;
+
+            if( newX >= sceneRect.x() && shutterRightPos < sceneRect.width() )
+            {
+                rect.setX( newX );
+            }
+            else if( newX < sceneRect.x() )
+            {
+                rect.setX( sceneRect.x() );
+            }
+            else if( shutterRightPos >= sceneRect.width() )
+            {
+                rect.setX( sceneRect.width() - shutterWidth - abs(sceneRect.x()) );
+            }
+
+            rect.setWidth( shutterWidth );
+            update = true;
+        }
+
+        if( update )
+        {
+            // Update graphical shutter
+            m_shutter->setRect( rect );
+            m_layer->removeFromGroup( m_shutter );
+            m_layer->addToGroup( m_shutter );
+
+            // Update object
+            updateViewportFromShutter( rect.x(), rect.y(), rect.width(), rect.height() );
+            ::scene2D::data::ViewportMsg::sptr msg = ::scene2D::data::ViewportMsg::New();
+            msg->addEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+            ::fwServices::IEditionService::notify( this->getSptr(), this->getObject< ::scene2D::data::Viewport>(), msg );
+        }
+    }
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+void ViewportRangeSelector::updateViewportFromShutter( double _x, double _y, double _width, double _height )
+{
+    SLM_TRACE_FUNC();
+
+    ::scene2D::data::Viewport::sptr viewport = this->getObject< ::scene2D::data::Viewport>();
+
+    Point2DType fromSceneCoord = this->mapSceneToAdaptor(Point2DType( _x, _y ), m_xAxis, m_yAxis );
+    viewport->setX( fromSceneCoord.first );
+    viewport->setY( fromSceneCoord.second );
+
+    Point2DType pair = this->mapSceneToAdaptor(Point2DType(_width, _height), m_xAxis, m_yAxis);
+    viewport->setWidth( pair.first );
+    viewport->setHeight( this->getScene2DRender()->getViewport()->getHeight() );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+bool ViewportRangeSelector::mouseOnShutterMiddle( ::scene2D::data::Coord _coord)
+{
+    Point2DType shutterCoordPair;
+    shutterCoordPair = this->mapAdaptorToScene( Point2DType( m_shutter->rect().x(), m_shutter->rect().y() ), m_xAxis, m_yAxis );
+
+    return ( _coord.getX() > m_shutter->rect().x() + m_clickCatchRange )
+        && ( _coord.getX() < m_shutter->rect().x() + m_shutter->rect().width() - m_clickCatchRange );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+bool ViewportRangeSelector::mouseOnShutterLeft( ::scene2D::data::Coord _coord)
+{
+    std::pair< double, double > shutterCoordPair;
+    shutterCoordPair = this->mapAdaptorToScene( std::pair< double, double >( m_shutter->rect().x(), m_shutter->rect().y() ), m_xAxis, m_yAxis );
+
+    return ( _coord.getX() >= shutterCoordPair.first - m_clickCatchRange )
+        && ( _coord.getX() <= shutterCoordPair.first + m_clickCatchRange );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+bool ViewportRangeSelector::mouseOnShutterRight( ::scene2D::data::Coord _coord)
+{
+    std::pair< double, double > shutterCoordPair;
+    shutterCoordPair = this->mapAdaptorToScene( std::pair< double, double >( m_shutter->rect().x(), m_shutter->rect().y() ), m_xAxis, m_yAxis );
+
+    double shutterRightPos = shutterCoordPair.first + m_shutter->rect().width() * m_xAxis->getScale();
+
+    return ( _coord.getX() >=  shutterRightPos - m_clickCatchRange )
+        && ( _coord.getX() <=  shutterRightPos + m_clickCatchRange );
+}
+
+//---------------------------------------------------------------------------------------------------------------
+
+}   // namespace adaptor
+}   // namespace scene2D
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportUpdater.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportUpdater.cpp
new file mode 100644
index 0000000..36a2a35
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/adaptor/ViewportUpdater.cpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <scene2D/Scene2DGraphicsView.hpp>
+
+#include <scene2D/data/Viewport.hpp>
+#include <scene2D/data/ViewportMsg.hpp>
+
+#include "scene2D/adaptor/ViewportUpdater.hpp"
+
+
+fwServicesRegisterMacro( ::scene2D::adaptor::IAdaptor, ::scene2D::adaptor::ViewportUpdater, ::scene2D::data::Viewport);
+
+namespace scene2D
+{
+namespace adaptor
+{
+
+
+ViewportUpdater::ViewportUpdater() throw()
+{
+//    addNewHandledEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED);
+}
+
+//-----------------------------------------------------------------------------
+
+ViewportUpdater::~ViewportUpdater() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->IAdaptor::configuring();
+
+    doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::doStop() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::doUpdate() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::scene2D::data::Viewport::sptr sceneViewport = this->getScene2DRender()->getViewport();
+    ::scene2D::data::Viewport::sptr viewportObject = this->getObject< ::scene2D::data::Viewport>();
+
+    std::pair< double, double > pairCoord = this->mapAdaptorToScene(
+            std::pair< double, double >( viewportObject->getX(), viewportObject->getY() ), m_xAxis, m_yAxis );
+
+    std::pair< double, double > pairSize = this->mapAdaptorToScene(
+            std::pair< double, double >( viewportObject->getWidth(), viewportObject->getHeight() ), m_xAxis, m_yAxis );
+
+    sceneViewport->setX( pairCoord.first );
+    sceneViewport->setY( pairCoord.second );
+    sceneViewport->setWidth( pairSize.first );
+    sceneViewport->setHeight( viewportObject->getHeight() );
+
+    this->getScene2DRender()->getView()->updateFromViewport();
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if( _msg->hasEvent( ::scene2D::data::ViewportMsg::VALUE_IS_MODIFIED) )
+    {
+        doUpdate();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::doSwap() throw( ::fwTools::Failed)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewportUpdater::processInteraction( ::scene2D::data::Event::sptr _event )
+{
+
+}
+
+}   // namespace adaptor
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/data/Axis.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/data/Axis.cpp
new file mode 100644
index 0000000..9a536e1
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/data/Axis.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "scene2D/data/Axis.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+fwDataRegisterMacro( ::scene2D::data::Axis );
+
+Axis::Axis( ::fwData::Object::Key key )
+: m_origin (0),
+  m_scale (1),
+  m_scaleType (LINEAR)
+{}
+
+//-----------------------------------------------------------------------------
+
+Axis::~Axis()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Axis::shallowCopy(const ::fwData::Object::csptr &_source )
+{
+    Axis::csptr other = Axis::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_origin = other->m_origin;
+    m_scale = other->m_scale;
+    m_scaleType = other->m_scaleType;
+}
+
+//------------------------------------------------------------------------------
+
+void Axis::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache )
+{
+    Axis::csptr other = Axis::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_origin = other->m_origin;
+    m_scale = other->m_scale;
+    m_scaleType = other->m_scaleType;
+}
+
+float Axis::getOrigin()
+{
+    return m_origin;
+}
+
+//-----------------------------------------------------------------------------
+
+void Axis::setOrigin (float _origin)
+{
+    m_origin = _origin;
+}
+
+//-----------------------------------------------------------------------------
+
+float Axis::getScale()
+{
+    return m_scale;
+}
+
+//-----------------------------------------------------------------------------
+
+void Axis::setScale (float _scale)
+{
+    m_scale = _scale;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string Axis::getScaleType()
+{
+    return (m_scaleType == LINEAR)?"LINEAR":"LOG";
+}
+
+//-----------------------------------------------------------------------------
+
+void Axis::setScaleType (std::string _scaleType)
+{
+    if (_scaleType == "LINEAR")
+    {
+        m_scaleType = LINEAR;
+    }
+    else if (_scaleType == "LOG")
+    {
+        m_scaleType = LOG;
+    }
+}
+
+} // namespace data
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/data/Event.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/data/Event.cpp
new file mode 100644
index 0000000..8a98342
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/data/Event.cpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "scene2D/data/Event.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+//-----------------------------------------------------------------------------
+
+fwDataRegisterMacro( ::scene2D::data::Event );
+
+//-----------------------------------------------------------------------------
+
+Event::Event(::fwData::Object::Key key)
+:   m_type(NoType),
+    m_button(NoButton),
+    m_modifier(NoModifier),
+    m_accepted(false),
+    m_key(Qt::Key_unknown)
+{}
+
+//-----------------------------------------------------------------------------
+
+Event::~Event()
+{}
+
+
+//------------------------------------------------------------------------------
+
+void Event::shallowCopy(const ::fwData::Object::csptr &_source )
+{
+    Event::csptr other = Event::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    Coord m_coord;
+    Size m_size;
+    Size m_oldSize;
+
+    m_type = other->m_type;
+    m_button = other->m_button;
+    m_modifier = other->m_modifier;
+    m_accepted = other->m_accepted;
+    m_key = other->m_key;
+    m_coord.setX(other->m_coord.getX());
+    m_coord.setY(other->m_coord.getY());
+    m_size.setHeight(other->m_size.getHeight());
+    m_size.setWidth(other->m_size.getWidth());
+    m_oldSize.setHeight(other->m_oldSize.getHeight());
+    m_oldSize.setWidth(other->m_oldSize.getWidth());
+}
+
+//------------------------------------------------------------------------------
+
+void Event::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache )
+{
+    Event::csptr other = Event::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_type = other->m_type;
+    m_button = other->m_button;
+    m_modifier = other->m_modifier;
+    m_accepted = other->m_accepted;
+    m_key = other->m_key;
+    m_coord.setX(other->m_coord.getX());
+    m_coord.setY(other->m_coord.getY());
+    m_size.setHeight(other->m_size.getHeight());
+    m_size.setWidth(other->m_size.getWidth());
+    m_oldSize.setHeight(other->m_oldSize.getHeight());
+    m_oldSize.setWidth(other->m_oldSize.getWidth());
+}
+//-----------------------------------------------------------------------------
+
+} // namespace data
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/data/InitQtPen.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/data/InitQtPen.cpp
new file mode 100644
index 0000000..75a4692
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/data/InitQtPen.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "scene2D/data/InitQtPen.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+//---------------------------------------------------------------------------------------
+
+void InitQtPen::setPenColor(QPen & _pen, std::string _color)
+{
+    QColor color(QString::fromStdString(_color));
+    if (color.isValid())
+    {
+        _pen.setColor(color);
+    }
+    else
+    {
+        // Default value: black (if the color id cannot be parsed)
+        _pen.setColor(Qt::GlobalColor(Qt::black));
+    }
+}
+
+//---------------------------------------------------------------------------------------
+
+void InitQtPen::setPenColor(QPen & _pen, std::string _color, float _opacity)
+{
+    InitQtPen::setPenColor( _pen, _color );
+
+    QColor color = _pen.color();
+    color.setAlphaF( _opacity );
+    _pen.setColor( color );
+}
+
+} // namespace data
+} // namespace scene2D
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/data/Viewport.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/data/Viewport.cpp
new file mode 100644
index 0000000..817a39d
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/data/Viewport.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "scene2D/data/Viewport.hpp"
+
+namespace scene2D
+{
+namespace data
+{
+
+fwDataRegisterMacro( ::scene2D::data::Viewport );
+
+//-----------------------------------------------------------------------------
+
+Viewport::Viewport(::fwData::Object::Key key)
+: m_x (200),
+  m_y (200),
+  m_width (400),
+  m_height (400)
+{}
+
+//-----------------------------------------------------------------------------
+
+Viewport::~Viewport()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Viewport::shallowCopy(const ::fwData::Object::csptr &_source )
+{
+    Viewport::csptr other = Viewport::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_x = other->m_x;
+    m_y = other->m_y;
+    m_width = other->m_width;
+    m_height = other->m_height;
+}
+
+//------------------------------------------------------------------------------
+
+void Viewport::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache )
+{
+    Viewport::csptr other = Viewport::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_x = other->m_x;
+    m_y = other->m_y;
+    m_width = other->m_width;
+    m_height = other->m_height;
+}
+
+//------------------------------------------------------------------------------
+
+float Viewport::getX()
+{
+    return m_x;
+}
+
+//-----------------------------------------------------------------------------
+
+void Viewport::setX (float _x)
+{
+    m_x = _x;
+}
+
+//-----------------------------------------------------------------------------
+
+float Viewport::getY()
+{
+    return m_y;
+}
+
+//-----------------------------------------------------------------------------
+
+void Viewport::setY (float _y)
+{
+    m_y = _y;
+}
+
+//-----------------------------------------------------------------------------
+
+float Viewport::getWidth()
+{
+    return m_width;
+}
+
+//-----------------------------------------------------------------------------
+
+void Viewport::setWidth (float _width)
+{
+    m_width = _width;
+}
+
+//-----------------------------------------------------------------------------
+
+float Viewport::getHeight()
+{
+    return m_height;
+}
+
+//-----------------------------------------------------------------------------
+
+void Viewport::setHeight (float _height)
+{
+    m_height = _height;
+}
+
+} // namespace data
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/data/ViewportMsg.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/data/ViewportMsg.cpp
new file mode 100644
index 0000000..02dad11
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/data/ViewportMsg.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "scene2D/data/ViewportMsg.hpp"
+
+
+fwServicesMessageRegisterMacro( ::scene2D::data::ViewportMsg );
+
+namespace scene2D
+{
+namespace data
+{
+
+
+std::string ViewportMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+ViewportMsg::ViewportMsg(::fwServices::ObjectMsg::Key key)
+{
+}
+
+ViewportMsg::~ViewportMsg()
+{
+}
+
+
+}   // namespace data
+}   // namespace scene2D
+
diff --git a/Bundles/LeafVisu/scene2D/src/scene2D/processing/SComputeHistogram.cpp b/Bundles/LeafVisu/scene2D/src/scene2D/processing/SComputeHistogram.cpp
new file mode 100644
index 0000000..8d7fd96
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/src/scene2D/processing/SComputeHistogram.cpp
@@ -0,0 +1,138 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ *
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/lexical_cast.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Histogram.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/HistogramMsg.hpp>
+
+#include "scene2D/processing/SComputeHistogram.hpp"
+#include "scene2D/processing/ComputeHistogramFunctor.hxx"
+
+fwServicesRegisterMacro( ::fwServices::IController , ::scene2D::processing::SComputeHistogram, ::fwData::Image ) ;
+
+namespace scene2D
+{
+namespace processing
+{
+
+SComputeHistogram::SComputeHistogram() throw() :
+    m_binsWidth(1.0)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+SComputeHistogram::~SComputeHistogram() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::configuring() throw ( ::fwTools::Failed )
+{
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > cfg = m_configuration->find("histogramId");
+    SLM_ASSERT("Missing tag 'histogramId'", !cfg.empty());
+
+    m_histogramId = cfg.front()->getValue();
+    SLM_ASSERT("'histogramId' must not be empty", !m_histogramId.empty());
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > binsWidthCfg = m_configuration->find("binsWidth");
+    SLM_ASSERT("Missing tag 'binsWidth'", !binsWidthCfg.empty());
+
+    std::string binsWidth = binsWidthCfg.front()->getValue();
+    SLM_ASSERT("'binsWidth' must not be empty", !binsWidth.empty());
+    m_binsWidth = ::boost::lexical_cast<float>(binsWidth);
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::starting() throw ( ::fwTools::Failed )
+{
+    m_slotUpdate->asyncRun();
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::updating() throw ( ::fwTools::Failed )
+{
+    ::fwData::Image::sptr image =  this->getObject< ::fwData::Image >();
+
+    ::fwData::mt::ObjectReadLock imgLock(image);
+
+    if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        ::fwData::Histogram::sptr histogram = this->getHistogram();
+
+        ::fwData::mt::ObjectWriteLock lock(histogram);
+
+        ComputeHistogramFunctor::Parameter param;
+        param.image = image;
+        param.histogram = histogram;
+        param.binsWidth = m_binsWidth;
+
+        ::fwTools::DynamicType type = image->getPixelType();
+        ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , ComputeHistogramFunctor >::invoke( type , param );
+
+        ::fwComEd::HistogramMsg::sptr msg = ::fwComEd::HistogramMsg::New();
+        msg->addEvent(::fwComEd::HistogramMsg::VALUE_IS_MODIFIED);
+        ::fwServices::IEditionService::notify(this->getSptr(), histogram, msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::receiving( fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+     if(_msg->hasEvent(::fwComEd::ImageMsg::NEW_IMAGE) ||
+        _msg->hasEvent(::fwComEd::ImageMsg::BUFFER) ||
+        _msg->hasEvent(::fwComEd::ImageMsg::MODIFIED))
+    {
+        this->updating();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::swapping() throw ( ::fwTools::Failed )
+{
+    this->updating();
+}
+
+//-----------------------------------------------------------------------------
+
+void SComputeHistogram::stopping() throw ( ::fwTools::Failed )
+{
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Histogram::sptr SComputeHistogram::getHistogram()
+{
+    SLM_ASSERT("Object " << m_histogramId << " doesn't exist", ::fwTools::fwID::exist(m_histogramId));
+
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(m_histogramId);
+    ::fwData::Histogram::sptr histogram = ::fwData::Histogram::dynamicCast(obj);
+    SLM_ASSERT("Object " << m_histogramId << " is not a '::fwData::Histogram'", histogram);
+
+    return histogram;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace processing
+} // namespace scene2D
+
+
+
diff --git a/Bundles/LeafVisu/scene2D/test/CMakeLists.txt b/Bundles/LeafVisu/scene2D/test/CMakeLists.txt
new file mode 100644
index 0000000..b23b5b0
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/CMakeLists.txt
@@ -0,0 +1,8 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/Bundles/LeafVisu/scene2D/test/Properties.cmake b/Bundles/LeafVisu/scene2D/test/Properties.cmake
new file mode 100644
index 0000000..db2de1a
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/Properties.cmake
@@ -0,0 +1,8 @@
+
+set( NAME scene2DTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwTest fwData )
+set( REQUIREMENTS dataReg servicesReg scene2D )
+
+set(CPPUNITTEST_OPTIONS BUNDLE scene2D WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
diff --git a/Bundles/LeafVisu/scene2D/test/cppunit.options b/Bundles/LeafVisu/scene2D/test/cppunit.options
new file mode 100644
index 0000000..ccd79e7
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/cppunit.options
@@ -0,0 +1,13 @@
+CLASSTEST=[
+          'ProcessingTest',
+          ]
+
+USE = ['boost']
+LIB = ['fwData_0-1','fwTest_0-1']
+
+BUNDLES = []
+REQUIREMENTS = ['dataReg_0-1','servicesReg_0-1','scene2D_0-1']
+
+CONSOLE = 'yes'
+
+#LOGLEVEL='trace'
diff --git a/Bundles/LeafVisu/scene2D/test/tu/include/ProcessingTest.hpp b/Bundles/LeafVisu/scene2D/test/tu/include/ProcessingTest.hpp
new file mode 100644
index 0000000..554ca8f
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/tu/include/ProcessingTest.hpp
@@ -0,0 +1,31 @@
+
+#ifndef __SCENE2D_UT_PROCESSINGTEST_HPP__
+#define __SCENE2D_UT_PROCESSINGTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace scene2D
+{
+namespace ut
+{
+
+class ProcessingTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ProcessingTest );
+    CPPUNIT_TEST( histogramTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void histogramTest();
+
+};
+
+} // namespace ut
+} // namespace scene2D
+
+#endif //__SCENE2D_UT_PROCESSINGTEST_HPP__
diff --git a/Bundles/LeafVisu/scene2D/test/tu/rc/profile.xml b/Bundles/LeafVisu/scene2D/test/tu/rc/profile.xml
new file mode 100644
index 0000000..0b137b6
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/tu/rc/profile.xml
@@ -0,0 +1,9 @@
+<profile name="ProcessingTest" version="0.1">
+
+    <activate id="dataReg" version="0-1" />
+    <activate id="servicesReg" version="0-1" />
+    <activate id="scene2D" version="0-1" />
+
+    <start id="scene2D" />
+    
+</profile>
diff --git a/Bundles/LeafVisu/scene2D/test/tu/src/ProcessingTest.cpp b/Bundles/LeafVisu/scene2D/test/tu/src/ProcessingTest.cpp
new file mode 100644
index 0000000..5fdcbbe
--- /dev/null
+++ b/Bundles/LeafVisu/scene2D/test/tu/src/ProcessingTest.cpp
@@ -0,0 +1,129 @@
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Histogram.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "ProcessingTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::scene2D::ut::ProcessingTest );
+
+namespace scene2D
+{
+namespace ut
+{
+
+static ::fwTest::Exception fwTestException(""); // force link with fwTest
+
+//------------------------------------------------------------------------------
+
+void ProcessingTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessingTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessingTest::histogramTest()
+{
+    ::fwServices::registry::ActiveWorkers::sptr activeWorkers = ::fwServices::registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    typedef signed short ImageType;
+    const int sizeX = 50;
+    const int sizeY = 50;
+    const int sizeZ = 50;
+    const int imageSize = sizeX * sizeY * sizeZ;
+
+    std::string implementation = "::scene2D::processing::SComputeHistogram";
+
+    // Configure data hirearchy
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwData::Histogram::sptr histogram = ::fwData::Histogram::New();
+
+    // Create image.
+    image->allocate(sizeX, sizeY,  sizeZ, ::fwTools::Type("int16"));
+    ::fwData::Array::sptr array = image->getDataArray();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    ImageType* itr = arrayHelper.begin< ImageType >();
+    ImageType* itrEnd = arrayHelper.end< ImageType >();
+
+    int count=0;
+    for(; itr!= itrEnd; ++itr)
+    {
+        if(count < imageSize/4)
+        {
+            *itr =10;
+        }
+        else if( count < imageSize/2)
+        {
+            *itr =20;
+        }
+        else if( count < 3*imageSize/4)
+        {
+            *itr =30;
+        }
+        else if( count < imageSize)
+        {
+            *itr =40;
+        }
+        ++count;
+    }
+
+    // Create service.
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create( implementation );
+    CPPUNIT_ASSERT(srv);
+
+    // Register service.
+    ::fwServices::OSR::registerService( image , srv );
+
+    ::fwRuntime::EConfigurationElement::sptr srvCfg = ::fwRuntime::EConfigurationElement::New("service");
+
+    ::fwRuntime::EConfigurationElement::sptr histogramIdCfg = ::fwRuntime::EConfigurationElement::New("histogramId");
+    histogramIdCfg->setValue(histogram->getID());
+    srvCfg->addConfigurationElement(histogramIdCfg);
+
+    ::fwRuntime::EConfigurationElement::sptr binsWidthCfg = ::fwRuntime::EConfigurationElement::New("binsWidth");
+    binsWidthCfg->setValue("1.0");
+    srvCfg->addConfigurationElement(binsWidthCfg);
+
+    srv->setConfiguration(srvCfg);
+    srv->configure();
+    srv->start().wait();
+    srv->stop().wait();
+    ::fwServices::OSR::unregisterService(srv);
+
+    ::fwData::Histogram::fwHistogramValues values = histogram->getValues();
+    CPPUNIT_ASSERT_EQUAL((size_t) 40-10+1, values.size());
+
+    CPPUNIT_ASSERT_EQUAL((float) 10, histogram->getMinValue());
+
+    CPPUNIT_ASSERT_EQUAL((float) 40, histogram->getMaxValue());
+
+    CPPUNIT_ASSERT_EQUAL((long) imageSize/4, histogram->getNbPixels(10,11));
+    CPPUNIT_ASSERT_EQUAL((long) imageSize/4, histogram->getNbPixels(20,21));
+    CPPUNIT_ASSERT_EQUAL((long) imageSize/4, histogram->getNbPixels(30,31));
+    CPPUNIT_ASSERT_EQUAL((long) imageSize/4, histogram->getNbPixels(40,41));
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace scene2D
diff --git a/Bundles/LeafVisu/visuVTK/CMakeLists.txt b/Bundles/LeafVisu/visuVTK/CMakeLists.txt
new file mode 100644
index 0000000..728f60c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/CMakeLists.txt
@@ -0,0 +1,8 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
+
+
+
+fwReq(visu)
diff --git a/Bundles/LeafVisu/visuVTK/COPYING b/Bundles/LeafVisu/visuVTK/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/visuVTK/COPYING.LESSER b/Bundles/LeafVisu/visuVTK/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/visuVTK/Properties.cmake b/Bundles/LeafVisu/visuVTK/Properties.cmake
new file mode 100644
index 0000000..c359989
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME visuVTK )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwRender fwRenderVTK fwRuntime fwServices )
+set( REQUIREMENTS visu )
+
diff --git a/Bundles/LeafVisu/visuVTK/bin/build.options b/Bundles/LeafVisu/visuVTK/bin/build.options
new file mode 100644
index 0000000..5716dc5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/bin/build.options
@@ -0,0 +1,15 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+USE     = ['boost']
+LIB     = [
+        'fwCore_0-1',
+        'fwTools_0-1',
+        'fwRuntime_0-3',
+        'fwData_0-1',
+        'fwServices_0-1',
+        'fwRenderVTK_0-1',
+        'fwRender_0-1'
+        ]
+REQUIREMENTS = [
+                'visu_0-1',
+                ]
diff --git a/Bundles/LeafVisu/visuVTK/include/visuVTK/Namespace.hpp b/Bundles/LeafVisu/visuVTK/include/visuVTK/Namespace.hpp
new file mode 100644
index 0000000..814fe5b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/include/visuVTK/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIVISUVTKNAMESPACE_HPP_
+#define UIVISUVTKNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace visuVTK supplies a  default plugin implementation for the visuVTK bundle.
+ * @namespace   visuVTK
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace visuVTK
+{
+}
+#endif /* UIVISUVTKNAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/visuVTK/include/visuVTK/Plugin.hpp b/Bundles/LeafVisu/visuVTK/include/visuVTK/Plugin.hpp
new file mode 100644
index 0000000..b37dfa9
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/include/visuVTK/Plugin.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTK_PLUGIN_HPP_
+#define _VISUVTK_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "visuVTK/config.hpp"
+
+namespace visuVTK
+{
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009.
+ */
+struct VISUVTK_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+    
+    // Overrides
+    VISUVTK_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides    
+    VISUVTK_API void stop() throw();
+    
+};
+
+} // namespace visuVTK
+
+#endif //_VISUVTK_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/visuVTK/include/visuVTK/config.hpp b/Bundles/LeafVisu/visuVTK/include/visuVTK/config.hpp
new file mode 100644
index 0000000..750067e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/include/visuVTK/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VISUVTK_CONFIG_HPP_
+#define VISUVTK_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VISUVTK_EXPORTS
+    #define VISUVTK_API __declspec(dllexport)
+    #else
+    #define VISUVTK_API __declspec(dllimport)
+    #endif
+
+    #define VISUVTK_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VISUVTK_EXPORTS
+    #define VISUVTK_API __attribute__ ((visibility("default")))
+    #define VISUVTK_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VISUVTK_API __attribute__ ((visibility("hidden")))
+    #define VISUVTK_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VISUVTK_API
+    #define VISUVTK_CLASS_API
+
+#endif
+
+#endif //VISUVTK_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/visuVTK/rc/plugin.xml b/Bundles/LeafVisu/visuVTK/rc/plugin.xml
new file mode 100644
index 0000000..2f8b312
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/rc/plugin.xml
@@ -0,0 +1,18 @@
+<plugin id="visuVTK" class="visuVTK::Plugin" >
+
+    <library name="visuVTK" />
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="visu" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRender::IRender</type>
+        <service>::fwRenderVTK::VtkRenderService</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/visuVTK/rc/visuVTKCfg.xsd b/Bundles/LeafVisu/visuVTK/rc/visuVTKCfg.xsd
new file mode 100644
index 0000000..3151f68
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/rc/visuVTKCfg.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?> 
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:element name="extension" type="ExtensionType"/>
+
+<xs:complexType name="ExtensionType">
+  <xs:sequence>
+    <xs:element name="service" type="VisualizationServiceType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:anyAttribute processContents="skip" />
+</xs:complexType>
+
+<xs:complexType name="VisualizationServiceType">
+  <xs:sequence>
+    <xs:element name="service" type="DelegateType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:attribute name="clockRateMSeconds" type="xs:integer" />  
+</xs:complexType>
+
+<xs:complexType name="DelegateType">
+  <xs:attribute name="config" type="xs:string" use="required" />
+  <xs:attribute name="type" type="xs:string" use="required" />
+</xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/Bundles/LeafVisu/visuVTK/src/visuVTK/Plugin.cpp b/Bundles/LeafVisu/visuVTK/src/visuVTK/Plugin.cpp
new file mode 100644
index 0000000..2bfe77a
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTK/src/visuVTK/Plugin.cpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwRender/IRender.hpp>
+#include <fwRenderVTK/VtkRenderService.hpp>
+#include <fwRenderVTK/vtk/Instantiator.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include "visuVTK/Plugin.hpp"
+
+namespace visuVTK
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("visuVTK::Plugin");
+
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRenderVTK::vtk::Instantiator::ClassInitialize();
+}
+
+void Plugin::stop() throw()
+{
+    ::fwRenderVTK::vtk::Instantiator::ClassFinalize();
+}
+
+} // namespace operators
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/CMakeLists.txt b/Bundles/LeafVisu/visuVTKAdaptor/CMakeLists.txt
new file mode 100644
index 0000000..07d3763
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/CMakeLists.txt
@@ -0,0 +1,22 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCom
+    fwComEd
+    fwData
+    fwRenderVTK
+    fwRuntime
+    fwServices
+)
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    vtkWidgets
+    )
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/COPYING b/Bundles/LeafVisu/visuVTKAdaptor/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/COPYING.LESSER b/Bundles/LeafVisu/visuVTKAdaptor/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/Properties.cmake b/Bundles/LeafVisu/visuVTKAdaptor/Properties.cmake
new file mode 100644
index 0000000..13cde73
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME visuVTKAdaptor )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwComEd fwCore fwData fwDataCamp fwGui fwMath fwMedData fwRenderVTK fwRuntime fwServices fwTools fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/bin/build.options b/Bundles/LeafVisu/visuVTKAdaptor/bin/build.options
new file mode 100644
index 0000000..217eefb
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/bin/build.options
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+
+TYPE = 'bundle'
+VERSION = '0-1'
+USE = ['vtkWidgets', 'boost']
+LIB = [
+    'fwComEd_0-1',
+    'fwCore_0-1',
+    'fwData_0-1',
+    'fwDataCamp_0-1',
+    'fwMath_0-1',
+    'fwRenderVTK_0-1',
+    'fwRender_0-1',
+    'fwRuntime_0-3',
+    'fwServices_0-1',
+    'fwTools_0-1',
+    'fwVtkIO_0-1',
+    'fwGui_0-1',
+    'fwMedData_0-1',
+    ]
+
+DEF += [
+#        'SHOW_ID_LABELS'   ,
+       ]
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Axes.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Axes.hpp
new file mode 100644
index 0000000..da11534
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Axes.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_AXES_HPP_
+#define _VISUVTKADAPTOR_AXES_HPP_
+
+// FW4SPL Includes
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+// Boost Includes
+#include <boost/logic/tribool.hpp>
+
+// Config include
+#include "visuVTKAdaptor/config.hpp"
+
+// VTK Includes
+#include <vtkAxesActor.h>
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Axes: public ::fwRenderVTK::IVtkAdaptorService
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Axes)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Axes() throw();
+    VISUVTKADAPTOR_API virtual ~Axes() throw();
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    void buildPipeline();
+
+    vtkAxesActor * m_axesActor;
+    double m_length;
+    bool m_labelOn;
+};
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_AXES_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/BoxWidget.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/BoxWidget.hpp
new file mode 100644
index 0000000..0072165
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/BoxWidget.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_BOXWIDGET_HPP_
+#define _VISUVTKADAPTOR_BOXWIDGET_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkTransform;
+class vtkBoxWidget2;
+
+
+namespace visuVTKAdaptor
+{
+
+class Transform;
+
+// BoxWidget
+class VISUVTKADAPTOR_CLASS_API BoxWidget : public ::fwRenderVTK::IVtkAdaptorService
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro( (BoxWidget)(::fwRenderVTK::IVtkAdaptorService) );
+
+    VISUVTKADAPTOR_API              BoxWidget() throw();
+    VISUVTKADAPTOR_API virtual     ~BoxWidget() throw();
+
+    VISUVTKADAPTOR_API void updateFromVtk();
+
+protected:
+
+    VISUVTKADAPTOR_API virtual void configuring() throw( ::fwTools::Failed );
+    VISUVTKADAPTOR_API virtual void doStart()     throw( ::fwTools::Failed );
+    VISUVTKADAPTOR_API virtual void doStop()      throw( ::fwTools::Failed );
+    VISUVTKADAPTOR_API virtual void doSwap()      throw( ::fwTools::Failed );
+    VISUVTKADAPTOR_API virtual void doUpdate()    throw( ::fwTools::Failed );
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr msg ) throw( ::fwTools::Failed );
+
+    vtkTransform* m_transform;
+    WPTR(::visuVTKAdaptor::Transform) m_transformService;
+
+private:
+
+    ::vtkBoxWidget2* m_vtkBoxWidget;
+    vtkCommand* m_boxWidgetCommand;
+
+    double m_scaleFactor;
+    bool m_enableScaling;
+};
+
+} // namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_BOXWIDGET_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera.hpp
new file mode 100644
index 0000000..adce4d7
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_CAMERA_HPP_
+#define _VISUVTKADAPTOR_CAMERA_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Camera: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Camera)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Camera() throw();
+
+    VISUVTKADAPTOR_API virtual ~Camera() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+
+    bool initCameraParameters();
+
+    bool bCam_init;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_CAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera2.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera2.hpp
new file mode 100644
index 0000000..174e4fc
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Camera2.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_CAMERA_HPP_
+#define _VISUVTKADAPTOR_CAMERA_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Camera2: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Camera2)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Camera2() throw();
+
+    VISUVTKADAPTOR_API virtual ~Camera2() throw();
+
+    VISUVTKADAPTOR_API void updateFromVtk();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+    vtkCommand* m_cameraCommand;
+    vtkPerspectiveTransform* m_transOrig;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_CAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Cube.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Cube.hpp
new file mode 100644
index 0000000..9305b3d
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Cube.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Cube: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Cube)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+protected:
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    void doSwap() throw(fwTools::Failed){};
+    void doUpdate() throw(fwTools::Failed){};
+    void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed){};
+    void configuring() throw(fwTools::Failed){};
+ 
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Distance.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Distance.hpp
new file mode 100644
index 0000000..185dead
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Distance.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_DISTANCE_HPP_
+#define _VISUVTKADAPTOR_DISTANCE_HPP_
+
+#include <vector>
+
+#include <fwData/Point.hpp>
+#include <fwData/Color.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+class vtkDistanceRepresentation2D;
+class vtkActor;
+class vtkLineSource;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Distance: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Distance)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Distance() throw();
+
+    VISUVTKADAPTOR_API virtual ~Distance() throw();
+
+    /// set Distance Axis color AND alpha
+    VISUVTKADAPTOR_API void setAxisColor( ::fwData::Color::sptr newColor) throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    VISUVTKADAPTOR_API void doStart();
+    VISUVTKADAPTOR_API void doStop();
+
+
+    vtkDistanceRepresentation2D * m_distanceRepresentation;
+//  typedef std::vector < ::fwRenderVTK::IVtkAdaptorService::wptr > ServiceVector;
+//  ServiceVector m_services;
+
+    vtkActor          *m_lineActor;
+//      vtkPolyDataMapper *LineMapper;
+    vtkLineSource     *m_lineSource;
+
+    ::fwData::Point::wptr m_point1;
+    ::fwData::Point::wptr m_point2;
+
+    /// Connection between point 1 objectModified and this service reveive
+    ::fwCom::Connection m_point1Connection;
+
+    /// Connection between point 2 objectModified and this service reveive
+    ::fwCom::Connection m_point2Connection;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_DISTANCE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image.hpp
new file mode 100644
index 0000000..cbb8fae
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGE_HPP_
+#define _VISUVTKADAPTOR_IMAGE_HPP_
+
+#include <vtkSmartPointer.h>
+
+#include <fwData/Image.hpp>
+
+
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkImageActor;
+class fwVtkWindowLevelLookupTable;
+class vtkImageMapToColors;
+class vtkImageData;
+class vtkPolyDataMapper;
+class vtkPolyData;
+class vtkActor;
+
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Image: public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Image)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Image() throw();
+
+    VISUVTKADAPTOR_API virtual ~Image() throw();
+
+    void setVtkImageRegisterId(std::string id) {m_imageRegisterId = id;};
+    void setVtkImageRegister(vtkObject *obj)   {m_imageRegister = obj;};
+    void setImageOpacity(double opacity)       {m_imageOpacity = opacity;};
+    void setAllowAlphaInTF(bool allow)         {m_allowAlphaInTF = allow;};
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+
+    virtual void buildPipeline();
+    virtual void destroyPipeline();
+
+    void updateImage( ::fwData::Image::sptr image  );
+    void updateImageOpacity();
+    void updateWindowing( ::fwData::Image::sptr image );
+    void updateImageTransferFunction( ::fwData::Image::sptr image );
+
+    std::string m_imageRegisterId;
+    vtkObject  *m_imageRegister;
+
+    int    m_imagePortId;
+    double m_imageOpacity;
+    bool   m_allowAlphaInTF;
+
+    vtkSmartPointer< fwVtkWindowLevelLookupTable > m_lut;
+    vtkImageMapToColors *m_map2colors;
+    vtkImageData *m_imageData;
+
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image3DCursor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image3DCursor.hpp
new file mode 100644
index 0000000..6e0edc3
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Image3DCursor.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGE3DCURSOR_HPP_
+#define _VISUVTKADAPTOR_IMAGE3DCURSOR_HPP_
+
+#include <vtkSmartPointer.h>
+
+#include <fwData/TransferFunction.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+class vtkActor;
+class vtkPolyData;
+class vtkPolyDataMapper;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Image3DCursor: public  ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Image3DCursor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Image3DCursor() throw();
+
+    VISUVTKADAPTOR_API virtual ~Image3DCursor() throw();
+
+    VISUVTKADAPTOR_API void updateCursorPosition( double world[3] );
+
+    VISUVTKADAPTOR_API void setVisibility( bool visibility );
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    void buildPolyData(float radius = 1.0);
+
+    double m_priority;
+
+    vtkSmartPointer<vtkPolyData>       m_cursorPolyData;
+    vtkSmartPointer<vtkPolyDataMapper> m_cursorMapper;
+    vtkSmartPointer<vtkActor>          m_cursorActor;
+
+
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGE3DCURSOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageLandmarks.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageLandmarks.hpp
new file mode 100644
index 0000000..8d51c98
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageLandmarks.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_ImageLandmarks_HPP_
+#define _VISUVTKADAPTOR_ImageLandmarks_HPP_
+
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API ImageLandmarks: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageLandmarks)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImageLandmarks() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImageLandmarks() throw();
+
+    VISUVTKADAPTOR_API virtual void show(bool b = true);
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    std::list< ::fwRenderVTK::IVtkAdaptorService::sptr > m_subServices;
+
+    vtkCommand * m_rightButtonCommand;
+
+    bool m_needSubservicesDeletion;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_ImageLandmarks_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageMultiDistances.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageMultiDistances.hpp
new file mode 100644
index 0000000..1a22944
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageMultiDistances.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGEMULTIDISTANCES_HPP_
+#define _VISUVTKADAPTOR_IMAGEMULTIDISTANCES_HPP_
+
+
+#include <fwData/PointList.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API ImageMultiDistances: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageMultiDistances)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImageMultiDistances() throw();
+
+    VISUVTKADAPTOR_API ~ImageMultiDistances() throw();
+
+    VISUVTKADAPTOR_API void setNeedSubservicesDeletion( bool _needSubservicesDeletion );
+
+    VISUVTKADAPTOR_API virtual void show(bool showDistances = true);
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    void installSubServices( ::fwData::PointList::sptr pl );
+    ::fwData::Point::sptr screenToWorld(int X,int Y);
+    void removeDistance(  ::fwData::PointList::sptr plToRemove ) throw(::fwTools::Failed);
+    void createNewDistance( std::string sceneId ) throw(::fwTools::Failed);
+
+    std::list< ::fwRenderVTK::IVtkAdaptorService::sptr > m_subServices;
+
+    vtkCommand * m_rightButtonCommand;
+
+    bool m_needSubservicesDeletion;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGEMULTIDISTANCES_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagePickerInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagePickerInteractor.hpp
new file mode 100644
index 0000000..5775917
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagePickerInteractor.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGEPICKERINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_IMAGEPICKERINTERACTOR_HPP_
+
+#include <vector>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API ImagePickerInteractor: public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImagePickerInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImagePickerInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImagePickerInteractor() throw();
+
+protected:
+    friend class ImagePickerInteractorCallback;
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void notifyEvent(::fwComEd::InteractionMsg::sptr msg);
+
+
+
+    vtkCommand *m_interactionCommand;
+    float m_priority;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGEPICKERINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSeries.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSeries.hpp
new file mode 100644
index 0000000..f17aebf
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSeries.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VISUVTKADAPTOR_IMAGESERIES_HPP__
+#define __VISUVTKADAPTOR_IMAGESERIES_HPP__
+
+#include <vector>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/NegatoMPR.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+/**
+ * @brief This adaptor shows ImageSeries. Creates an adaptor for the image in the series.
+ * @class ImageSeries
+ */
+class VISUVTKADAPTOR_CLASS_API ImageSeries : public ::fwComEd::helper::MedicalImageAdaptor,
+                                             public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageSeries)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImageSeries() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImageSeries() throw();
+
+    void setAllowAlphaInTF(bool allow) {m_allowAlphaInTF = allow;};
+    void setInterpolation(bool interpolation){m_interpolation = interpolation;};
+    void setVtkImageSourceId(std::string id) {m_imageSourceId = id;};
+
+protected:
+
+    /// Calls doUpdate()
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+
+    /// Configure the adaptor.
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+
+    /// Calls doUpdate()
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    /// Creates and starts image adaptor. Redraw all (stop then restart sub services).
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    /// Stops and unregister image subservice.
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    /// Does nothing.
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    /// Sets adaptor slice mode (NO_SLICE, ONE_SLICE, THREE_SLICES)
+    void setSliceMode(NegatoMPR::SliceMode sliceMode);
+
+    /// Gets adaptor slice mode (NO_SLICE, ONE_SLICE, THREE_SLICES)
+    NegatoMPR::SliceMode getSliceMode();
+
+    /// Returns true if 3d mode is enabled, false if it is not and indeterminate if it is not defined
+    ::boost::logic::tribool is3dModeEnabled();
+
+    /// Defines 3D mode
+    void set3dMode( bool enabled );
+
+private:
+    bool m_allowAlphaInTF;
+    bool m_interpolation;
+
+    std::string m_imageSourceId;
+
+    ::boost::logic::tribool m_3dModeEnabled;
+    NegatoMPR::SliceMode m_sliceMode;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // __VISUVTKADAPTOR_IMAGESERIES_HPP__
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSlice.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSlice.hpp
new file mode 100644
index 0000000..8089468
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageSlice.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGESLICE_HPP_
+#define _VISUVTKADAPTOR_IMAGESLICE_HPP_
+
+#include <fwCom/Connection.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkImageActor;
+class vtkLookupTable;
+class vtkImageMapToColors;
+class vtkImageData;
+class vtkPolyDataMapper;
+class vtkPolyData;
+class vtkActor;
+
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API ImageSlice: public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageSlice)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImageSlice() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImageSlice() throw();
+
+    void setCtrlImageId(std::string id)      {m_ctrlImageId = id;};
+    void setCtrlImage(::fwData::Image::sptr image)      {m_ctrlImage = image;};
+    void setVtkImageSourceId(std::string id) {m_imageSourceId = id;};
+    void setVtkImageSource(vtkObject *obj)   {m_imageSource = obj;};
+    void setInterpolation(bool interpolation){m_interpolation = interpolation;};
+
+    void setUseImageTF(bool use)               {m_useImageTF = use;};
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    virtual void buildPipeline();
+    virtual void buildOutline();
+
+    void setSlice( int slice, ::fwData::Image::sptr image  );
+
+    ::fwData::Image::sptr getCtrlImage();
+
+    void updateOutline();
+    void updateImage( ::fwData::Image::sptr ImageSlice  );
+    void updateSliceIndex( ::fwData::Image::sptr ImageSlice );
+
+
+    std::string m_ctrlImageId;
+    ::fwData::Image::wptr m_ctrlImage;
+
+    bool m_interpolation;
+    bool m_useImageTF;
+
+    std::string m_imageSourceId;
+    vtkObject  *m_imageSource;
+
+    vtkImageActor *m_imageActor;
+
+    vtkPolyData *m_planeOutlinePolyData;
+    vtkPolyDataMapper *m_planeOutlineMapper;
+    vtkActor *m_planeOutlineActor;
+
+    ::fwCom::Connection m_connection;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGESLICE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageText.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageText.hpp
new file mode 100644
index 0000000..c750ec0
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImageText.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <string>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/Text.hpp"
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkTextActor;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API ImageText: public Text, public ::fwComEd::helper::MedicalImageAdaptor
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImageText)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImageText() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImageText() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+};
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesBlend.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesBlend.hpp
new file mode 100644
index 0000000..3446d29
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesBlend.hpp
@@ -0,0 +1,102 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGESBLEND_HPP_
+#define _VISUVTKADAPTOR_IMAGESBLEND_HPP_
+
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkImageActor;
+class vtkLookupTable;
+class vtkImageMapToColors;
+class vtkImageData;
+class vtkPolyDataMapper;
+class vtkPolyData;
+class vtkActor;
+
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief   Manage blend for image given in configuration.
+ * @class   ImagesProbeCursor
+ * 
+ * @date    2010.
+ */
+class VISUVTKADAPTOR_CLASS_API ImagesBlend: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ImagesBlend)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImagesBlend() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImagesBlend() throw();
+
+    void setVtkImageRegisterId(std::string id) {m_imageRegisterId = id;};
+
+protected :
+
+    class ImageInfo
+    {
+
+    public:
+        ImageInfo():
+            m_useTFAlfa(false),
+            m_imageOpacity(1.0)
+        {}
+
+        bool   m_useTFAlfa;
+        double m_imageOpacity;
+        std::string m_tfSelectionFwID;
+        std::string m_selectedTFKey;
+
+        ::fwServices::helper::SigSlotConnection::sptr m_connections;
+    };
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    void addImageAdaptors();
+    void removeImageAdaptors();
+
+    /// Return true if images to blend have the same spacing, origin and size. Else show a message dialog and return false
+    bool checkImageInformations();
+
+    std::vector<std::string> m_imageIds;
+    typedef std::map< std::string, SPTR(ImageInfo) > ImageInfoMap;
+    ImageInfoMap m_imagesInfo;
+
+    /// map <fwId, adaptor>
+    typedef std::map< std::string, ::fwRenderVTK::IVtkAdaptorService::sptr > RegisteredImageMap;
+    RegisteredImageMap m_registeredImages;
+
+
+    vtkImageBlend *m_imageBlend;
+    std::string m_imageRegisterId;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGESBLEND_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesProbeCursor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesProbeCursor.hpp
new file mode 100644
index 0000000..b7f0eeb
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ImagesProbeCursor.hpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGESPROBECURSOR_HPP_
+#define _VISUVTKADAPTOR_IMAGESPROBECURSOR_HPP_
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+class vtkActor;
+class vtkActor2D;
+class vtkTextMapper;
+class vtkPolyData;
+class vtkPolyDataMapper;
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief   Draw pixel information from images given by id in composite.
+ * @class   ImagesProbeCursor
+ * 
+ * @date    2010.
+ */
+class VISUVTKADAPTOR_CLASS_API ImagesProbeCursor: public  ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ImagesProbeCursor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ImagesProbeCursor() throw();
+
+    VISUVTKADAPTOR_API virtual ~ImagesProbeCursor() throw();
+
+    VISUVTKADAPTOR_API void updateView( double world[3] );
+
+    VISUVTKADAPTOR_API void setVisibility( bool visibility );
+
+    VISUVTKADAPTOR_API void StartImagesProbeCursor();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    /**
+     * @verbatim
+     <adaptor id="GENERIC_UID_ImagesProbeCursor" class="::visuVTKAdaptor::ImagesProbeCursor" objectId="self">
+         <config renderer="default" picker="myPicker">
+             <image objectId="myRefImage" name="background" />
+             <image objectId="myObject" name="working" />
+         </config>
+     </adaptor>
+     @endverbatim
+     */
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    void buildTextActor();
+    void buildPolyData();
+
+    void computeCrossExtremity( const int probeSlice[3] , double worldCross[4][3] );
+
+    typedef std::pair< std::string, std::string > ImagesIdPair;
+    std::vector< ImagesIdPair > m_imagesId;
+    double m_priority;
+
+    vtkCommand *m_vtkObserver;
+
+    vtkActor2D * m_textActor; // rendering defect using a vtkTextActor
+    vtkTextMapper * m_textMapper;
+
+    vtkPolyData         *m_cursorPolyData;
+    vtkPolyDataMapper   *m_cursorMapper;
+    vtkActor            *m_cursorActor;
+
+
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGESPROBECURSOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/InteractorStyle.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/InteractorStyle.hpp
new file mode 100644
index 0000000..7380848
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/InteractorStyle.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_INTERACTORSTYLE_HPP_
+#define _VISUVTKADAPTOR_INTERACTORSTYLE_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkInteractorStyle;
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API InteractorStyle: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (InteractorStyle)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API InteractorStyle() throw();
+
+    VISUVTKADAPTOR_API virtual ~InteractorStyle() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    void setInteractorStyle(vtkInteractorStyle *interactor);
+
+    std::string m_configuredStyle;
+    vtkInteractorStyle *m_interactorStyle;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_INTERACTORSTYLE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/LabeledPointList.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/LabeledPointList.hpp
new file mode 100644
index 0000000..e98cc06
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/LabeledPointList.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_LABELEDPOINTLIST_HPP_
+#define _VISUVTKADAPTOR_LABELEDPOINTLIST_HPP_
+
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API LabeledPointList: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (LabeledPointList)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API LabeledPointList() throw();
+
+    VISUVTKADAPTOR_API virtual ~LabeledPointList() throw();
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    std::list< ::fwRenderVTK::IVtkAdaptorService::sptr > m_subServices;
+
+    vtkCommand * m_rightButtonCommand;
+
+    bool m_needSubservicesDeletion;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_LABELEDPOINTLIST_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Material.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Material.hpp
new file mode 100644
index 0000000..b381a07
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Material.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MATERIAL_HPP_
+#define _VISUVTKADAPTOR_MATERIAL_HPP_
+
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+
+class VISUVTKADAPTOR_CLASS_API vtkProperty;
+
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API Material: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Material)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Material() throw();
+
+    VISUVTKADAPTOR_API virtual ~Material() throw();
+
+    VISUVTKADAPTOR_API void setVtkProperty(vtkProperty *property);
+
+    VISUVTKADAPTOR_API vtkProperty *getVtkProperty();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    void updateMaterial( ::fwData::Material::sptr material );
+
+
+    vtkProperty *m_property;
+    bool m_manageProperty;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MATERIAL_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Medical3DCamera.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Medical3DCamera.hpp
new file mode 100644
index 0000000..d94b6ac
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Medical3DCamera.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MEDICAL3DCAMERA_HPP_
+#define _VISUVTKADAPTOR_MEDICAL3DCAMERA_HPP_
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Medical3DCamera: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Medical3DCamera)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Medical3DCamera() throw();
+
+    VISUVTKADAPTOR_API virtual ~Medical3DCamera() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+
+    void initializeCamera();
+
+private:
+    void updateView();
+    void resetSagittalView();
+    void resetFrontalView();
+    void resetAxialView();
+
+
+    vtkCamera* m_camera;
+    static std::map< std::string, ::fwComEd::helper::MedicalImageAdaptor::Orientation > m_orientationConversion;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MEDICAL3DCAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Mesh.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Mesh.hpp
new file mode 100644
index 0000000..79cc693
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Mesh.hpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MESH_HPP_
+#define _VISUVTKADAPTOR_MESH_HPP_
+
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+class vtkDepthSortPolyData;
+class vtkAlgorithm;
+class vtkAlgorithmOutput;
+class vtkPolyDataNormals;
+class vtkPlaneCollection;
+class vtkActorCollection;
+class vtkActor;
+class vtkPolyData;
+class vtkPolyDataMapper;
+class vtkTransform;
+
+namespace fwData
+{
+class Mesh;
+class Material;
+}
+
+namespace visuVTKAdaptor
+{
+
+class Transform;
+
+class VISUVTKADAPTOR_CLASS_API MeshVtkCommand ;
+
+class VISUVTKADAPTOR_CLASS_API Mesh: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Mesh)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Mesh() throw();
+    VISUVTKADAPTOR_API virtual ~Mesh() throw();
+
+    VISUVTKADAPTOR_API SPTR(::fwData::Material) getMaterial();
+    VISUVTKADAPTOR_API void setMaterial(SPTR(::fwData::Material) material);
+
+    VISUVTKADAPTOR_API SPTR(::fwData::Material) getUnclippedMaterial();
+    VISUVTKADAPTOR_API void setUnclippedPartMaterial(SPTR(::fwData::Material) material);
+
+    VISUVTKADAPTOR_API void setShowClippedPart ( bool show );
+    VISUVTKADAPTOR_API void setClippingPlanesId( ::fwRenderVTK::VtkRenderService::VtkObjectIdType id );
+
+    VISUVTKADAPTOR_API void setVtkClippingPlanes               ( vtkPlaneCollection *planes );
+    VISUVTKADAPTOR_API void setActorPropertyToUnclippedMaterial( bool opt );
+
+    /// Active/Inactive automatic reset on camera. By default =true.
+    VISUVTKADAPTOR_API void setAutoResetCamera(bool autoResetCamera);
+
+    VISUVTKADAPTOR_API void updateVisibility ( bool isVisible );
+    VISUVTKADAPTOR_API bool getVisibility();
+
+    VISUVTKADAPTOR_API void updateOptionsMode();
+
+protected:
+
+   VISUVTKADAPTOR_API void doStart    () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doStop     () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doSwap   () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doUpdate   () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doReceive   (::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+
+    vtkActor *newActor();
+    void buildPipeline();
+
+    void updateMesh ( SPTR(::fwData::Mesh) mesh );
+
+    void setServiceOnMaterial(
+        ::fwRenderVTK::IVtkAdaptorService::sptr &srv,
+        SPTR(::fwData::Material) material
+        );
+
+    void removePlaneCollectionShifterCommand();
+    void removeServicesStarterCommand();
+    void createServicesStarterCommand();
+
+    void createTransformService();
+    void createNormalsService();
+    void removeNormalsService();
+
+    bool   m_showClippedPart;
+    bool   m_autoResetCamera;
+
+    vtkPolyData        *m_polyData;
+    vtkPolyDataMapper  *m_mapper;
+    vtkActor           *m_actor;
+    vtkCommand         *m_depthSortCommand;
+
+    vtkPlaneCollection *m_clippingPlanes;
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanesId;
+
+    MeshVtkCommand *m_planeCollectionShifterCallback;
+    MeshVtkCommand *m_servicesStarterCallback;
+
+    SPTR(::fwData::Material)       m_material;
+    SPTR(::fwData::Material)       m_unclippedPartMaterial;
+
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_materialService;
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_unclippedPartMaterialService;
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_normalsService;
+
+    vtkTransform* m_transform;
+    WPTR(::visuVTKAdaptor::Transform) m_transformService;
+
+public :
+
+   vtkActor * getActor(){ return m_actor; }
+
+};
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MESH_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshFactory.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshFactory.hpp
new file mode 100644
index 0000000..31d54c1
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshFactory.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_VTKADAPTOR_MESHFACTORY_HPP_
+#define _VISUVTKADAPTOR_VTKADAPTOR_MESHFACTORY_HPP_
+
+
+#include <fwData/Material.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class  vtkActor;
+class  vtkDepthSortPolyData;
+class  vtkPolyDataNormals;
+class  vtkPlaneCollection;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API MeshFactory
+{
+
+public:
+
+    VISUVTKADAPTOR_API MeshFactory();
+
+    VISUVTKADAPTOR_API virtual ~MeshFactory();
+
+protected:
+
+    VISUVTKADAPTOR_API vtkActor* getActor();
+
+    VISUVTKADAPTOR_API void updateTriangulaMesh( ::fwData::TriangularMesh::sptr mesh);
+
+    VISUVTKADAPTOR_API void updateMaterial( ::fwData::Material::sptr material );
+
+    VISUVTKADAPTOR_API void updateVisibility( bool isVisible);
+
+    VISUVTKADAPTOR_API void setVtkClippingPlanes(vtkPlaneCollection *planes);
+
+    void setNormalsFeatureAngle(double angle){ m_normalsFeatureAngle = angle; }
+
+protected:
+    vtkPolyDataNormals * m_normals;
+    vtkPlaneCollection * m_clippingPlanes;
+    vtkActor * m_actor ;
+
+    double m_normalsFeatureAngle;
+};
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_VTKADAPTOR_MESHFACTORY_HPP_
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshNormals.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshNormals.hpp
new file mode 100644
index 0000000..890fbfb
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshNormals.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MESHNORMALS_HPP_
+#define _VISUVTKADAPTOR_MESHNORMALS_HPP_
+
+#include <vtkSmartPointer.h>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkPolyData;
+class vtkActor;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API MeshNormals: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    typedef enum
+    {
+        NONE,
+        POINT_NORMAL,
+        CELL_NORMAL
+    } NormalRepresentation;
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshNormals)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API MeshNormals() throw();
+
+    VISUVTKADAPTOR_API virtual ~MeshNormals() throw();
+
+    VISUVTKADAPTOR_API void setPolyData(vtkSmartPointer< vtkPolyData > polydata);
+
+protected:
+
+   VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+   VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    vtkActor* getActor();
+    void updateMeshNormals();
+
+private:
+
+    NormalRepresentation m_normalRepresentation;
+    vtkSmartPointer< vtkPolyData > m_polyData;
+    vtkSmartPointer< vtkActor >    m_actor;
+    static std::map< std::string, NormalRepresentation > m_normalRepresentationConversion;
+};
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MESHNORMALS_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshesBoxWidget.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshesBoxWidget.hpp
new file mode 100644
index 0000000..391eea5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/MeshesBoxWidget.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MESHESBOXWIDGET_HPP_
+#define _VISUVTKADAPTOR_MESHESBOXWIDGET_HPP_
+
+#include <fwCom/Connection.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkBoxWidget2;
+class vtkCommand;
+class vtkPolyData;
+
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief   Create a Box widget around the meshes contained in the composite.
+ * @class   MeshesBoxWidget
+ * 
+ * @date    2010.
+ */
+class VISUVTKADAPTOR_CLASS_API MeshesBoxWidget: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (MeshesBoxWidget)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API MeshesBoxWidget() throw();
+
+    VISUVTKADAPTOR_API virtual ~MeshesBoxWidget() throw();
+
+    /// Updates meshes transformation matrix from vtk box widget transform
+    void updateFromVtk();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    /// Updates vtk transformation from data meshes
+    void updateMeshTransform();
+
+    /// Updates map from composite meshes
+    void updateMeshMapFromComposite(::fwData::Composite::sptr composite);
+
+
+private:
+
+    typedef std::map< std::string, ::fwCom::Connection > ConnectionMapType;
+    typedef std::map< std::string, vtkActor* > MeshMapType;
+
+    MeshMapType m_meshMap;
+    ConnectionMapType m_connections;
+
+    vtkAssembly * m_assembly;
+    vtkCommand* m_boxWidgetCommand;
+    vtkBoxWidget2* m_vtkBoxWidget;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MESHESBOXWIDGET_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Model.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Model.hpp
new file mode 100644
index 0000000..747a322
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Model.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_MODEL_HPP_
+#define _VISUVTKADAPTOR_MODEL_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Model: public ::fwRenderVTK::IVtkAdaptorService, protected MeshFactory
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Model)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Model() throw();
+
+    VISUVTKADAPTOR_API virtual ~Model() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_MODEL_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ModelSeries.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ModelSeries.hpp
new file mode 100644
index 0000000..bb4e7ba
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ModelSeries.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VISUVTKADAPTOR_MODELSERIES_HPP__
+#define __VISUVTKADAPTOR_MODELSERIES_HPP__
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+/**
+ * @brief This adaptor shows ModelSeries. Creates adaptors for each reconstruction in model.
+ * @class ModelSeries
+ */
+class VISUVTKADAPTOR_CLASS_API ModelSeries : public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ModelSeries)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ModelSeries() throw();
+
+    VISUVTKADAPTOR_API virtual ~ModelSeries() throw();
+
+    void setClippingPlanes(::fwRenderVTK::VtkRenderService::VtkObjectIdType id){ m_clippingPlanes = id ; }
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    /// redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    /// manage SHOW/ADD/REMOVED_RECONSTRUCTIONS event
+   VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanes;
+
+private:
+    bool   m_autoResetCamera;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // __VISUVTKADAPTOR_MODELSERIES_HPP__
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Namespace.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Namespace.hpp
new file mode 100644
index 0000000..a6e090b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIVISUVTKADAPTORNAMESPACE_HPP_
+#define UIVISUVTKADAPTORNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace visuVTKAdaptor contains the list of adaptors available for the generic scene. .
+ * @namespace   visuVTKAdaptor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace visuVTKAdaptor
+{
+}
+#endif /* UIVISUVTKADAPTORNAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoMPR.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoMPR.hpp
new file mode 100644
index 0000000..40653e4
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoMPR.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_NEGATOMPR_HPP_
+#define _VISUVTKADAPTOR_NEGATOMPR_HPP_
+
+#include <boost/logic/tribool.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API NegatoMPR: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (NegatoMPR)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API NegatoMPR() throw();
+
+    VISUVTKADAPTOR_API virtual ~NegatoMPR() throw();
+
+    typedef enum
+    {
+        NO_SLICE = 0,
+        ONE_SLICE,
+        THREE_SLICES
+    } SliceMode;
+
+    void setAllowAlphaInTF(bool allow) {m_allowAlphaInTF = allow;};
+    void setInterpolation(bool interpolation){m_interpolation = interpolation;};
+    void setVtkImageSourceId(std::string id) {m_imageSourceId = id;};
+
+    void setSliceMode(SliceMode sliceMode);
+    SliceMode getSliceMode();
+    ::boost::logic::tribool is3dModeEnabled();
+    void set3dMode( bool enabled );
+
+protected :
+
+    typedef ::fwRuntime::ConfigurationElement::sptr Configuration;
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    void addAdaptor(std::string adaptor, int axis=-1);
+
+
+private:
+
+    bool m_allowAlphaInTF;
+    bool m_interpolation;
+
+    std::string m_imageSourceId;
+
+    ::boost::logic::tribool m_3dModeEnabled;
+    SliceMode m_sliceMode;
+    SliceMode m_backupedSliceMode;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_NEGATOMPR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoOneSlice.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoOneSlice.hpp
new file mode 100644
index 0000000..2a5b29e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoOneSlice.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_NEGATOONESLICE_HPP_
+#define _VISUVTKADAPTOR_NEGATOONESLICE_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkObject;
+
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API NegatoOneSlice: public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (NegatoOneSlice)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API NegatoOneSlice() throw();
+
+    VISUVTKADAPTOR_API virtual ~NegatoOneSlice() throw();
+
+    void setAllowAlphaInTF(bool allow) {m_allowAlphaInTF = allow;};
+    void setInterpolation(bool interpolation){m_interpolation = interpolation;};
+    void setVtkImageSourceId(std::string id) {m_imageSourceId = id;};
+    void setVtkImageSource(vtkObject *obj)   {m_imageSource = obj;};
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    bool m_manageImageSource;
+    std::string m_imageSourceId;
+    vtkObject  *m_imageSource;
+
+    bool m_allowAlphaInTF;
+    bool m_interpolation;
+
+    vtkObject* getImageSource();
+    void cleanImageSource();
+    ::fwRenderVTK::IVtkAdaptorService::sptr getImageSliceAdaptor();
+    ::fwRenderVTK::IVtkAdaptorService::sptr getImageAdaptor();
+
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_imageAdaptor;
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_imageSliceAdaptor;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_NEGATOONESLICE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoSlicingInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoSlicingInteractor.hpp
new file mode 100644
index 0000000..08de877
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoSlicingInteractor.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_NEGATOSLICINGINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_NEGATOSLICINGINTERACTOR_HPP_
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class VISUVTKADAPTOR_CLASS_API vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API NegatoSlicingInteractor: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (NegatoSlicingInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API NegatoSlicingInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~NegatoSlicingInteractor() throw();
+
+    VISUVTKADAPTOR_API void startSlicing(double pickedPoint[3]);
+
+    VISUVTKADAPTOR_API void stopSlicing();
+
+    VISUVTKADAPTOR_API void updateSlicing( double pickedPoint[3]);
+
+    VISUVTKADAPTOR_API void pushSlice( int factor, Orientation axis);
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    vtkCommand *m_vtkObserver;
+    double m_priority;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_NEGATOSLICINGINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoWindowingInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoWindowingInteractor.hpp
new file mode 100644
index 0000000..9d3ca95
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/NegatoWindowingInteractor.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_NEGATOWINDOWINGINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_NEGATOWINDOWINGINTERACTOR_HPP_
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API NegatoWindowingInteractor: public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService 
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (NegatoWindowingInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API NegatoWindowingInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~NegatoWindowingInteractor() throw();
+
+    VISUVTKADAPTOR_API void startWindowing();
+
+    VISUVTKADAPTOR_API void stopWindowing();
+
+    VISUVTKADAPTOR_API void updateWindowing( double , double);
+
+    VISUVTKADAPTOR_API void resetWindowing();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    vtkCommand *m_vtkObserver;
+    double m_initialWindow;
+    double m_initialLevel;
+    double m_priority;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_NEGATOWINDOWINGINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Normals.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Normals.hpp
new file mode 100644
index 0000000..0e5bce2
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Normals.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_NORMALS_HPP_
+#define _VISUVTKADAPTOR_NORMALS_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <vtkCommand.h>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkActor;
+class vtkActor2D;
+class vtkAlgorithmOutput;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Normals: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Normals)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Normals() throw();
+
+    VISUVTKADAPTOR_API virtual ~Normals() throw();
+
+    VISUVTKADAPTOR_API void setMapperInput(vtkAlgorithmOutput *input);
+
+protected:
+
+   VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+   VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+
+    vtkActor* getActor();
+    void updateNormals();
+
+private:
+
+    vtkAlgorithmOutput *m_mapperInput;
+
+    vtkActor   * m_actor ;
+    vtkActor2D * m_ptsIdActor2D ;
+    vtkActor2D * m_cellsIdActor2D ;
+};
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_NORMALS_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PickerInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PickerInteractor.hpp
new file mode 100644
index 0000000..97975e0
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PickerInteractor.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PICKERINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_PICKERINTERACTOR_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PickerInteractor: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PickerInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PickerInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~PickerInteractor() throw();
+
+protected:
+    friend class PickerInteractorCallback;
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed){};
+
+    VISUVTKADAPTOR_API void notifyEvent(::fwComEd::InteractionMsg::sptr msg);
+
+
+
+    vtkCommand *m_interactionCommand;
+    float m_priority;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PICKERINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plane.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plane.hpp
new file mode 100644
index 0000000..26d1874
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plane.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PLANE_HPP_
+#define _VISUVTKADAPTOR_PLANE_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkPlaneSource;
+class vtkPlaneCollection;
+class vtkPlane;
+class vtkObject;
+
+namespace fwData
+{
+    class Plane;
+}
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API Plane: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Plane)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Plane() throw();
+
+    VISUVTKADAPTOR_API virtual ~Plane() throw();
+
+    VISUVTKADAPTOR_API void setVtkPlaneCollection( vtkObject * col );
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    void selectPlane(bool select);
+
+private:
+
+    vtkPlaneSource* m_vtkPlane;
+    vtkActor *m_actorPlan;
+    fwData::Plane::wptr m_pPlane;
+
+    vtkPlane* m_vtkImplicitPlane;
+    vtkPlaneCollection* m_vtkPlaneCollection;
+
+    /// register connections between plane's points and this service
+    ::fwServices::helper::SigSlotConnection::sptr m_connections;
+};
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PLANE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneInteractor.hpp
new file mode 100644
index 0000000..ff5a2c3
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneInteractor.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PLANEINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_PLANEINTERACTOR_HPP_
+
+#include <fwData/TransferFunction.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PlaneInteractor: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PlaneInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PlaneInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~PlaneInteractor() throw();
+
+    VISUVTKADAPTOR_API void switchPlaneNormal();
+
+    VISUVTKADAPTOR_API void pushPlane(double factor);
+
+    VISUVTKADAPTOR_API void deselectPlane();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    vtkCommand *m_vtkObserver;
+    double m_priority;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PLANEINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneList.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneList.hpp
new file mode 100644
index 0000000..e69e096
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneList.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PLANELIST_HPP_
+#define _VISUVTKADAPTOR_PLANELIST_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API PlaneList: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PlaneList)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PlaneList() throw();
+
+    VISUVTKADAPTOR_API virtual ~PlaneList() throw();
+
+    void setPlaneCollectionId(::fwRenderVTK::VtkRenderService::VtkObjectIdType id) { m_planeCollectionId = id; }
+
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType getPlaneCollectionId() { return m_planeCollectionId; }
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+
+
+    vtkCommand * m_rightButtonCommand;
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_planeCollectionId;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PLANELIST_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelectionNotifier.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelectionNotifier.hpp
new file mode 100644
index 0000000..e02fcdb
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelectionNotifier.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _VISUVTKADAPTOR_PLANESELECTIONNOTIFIER_HPP_
+#define _VISUVTKADAPTOR_PLANESELECTIONNOTIFIER_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwData/PlaneList.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PlaneSelectionNotifier: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PlaneSelectionNotifier)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PlaneSelectionNotifier() throw();
+
+    VISUVTKADAPTOR_API virtual ~PlaneSelectionNotifier() throw();
+
+    VISUVTKADAPTOR_API void setPlaneListId(std::string id)
+    { m_planeListId = id; }
+
+    VISUVTKADAPTOR_API void setPlaneSelectionId(std::string id)
+    { m_planeSelectionId = id;}
+
+    VISUVTKADAPTOR_API void selectPlane( ::fwData::Object::sptr plane );
+
+    VISUVTKADAPTOR_API void deselectPlane();
+
+protected:
+
+    typedef std::map < std::string, ::fwCom::Connection > ConnetionMapType;
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    std::string m_planeListId;
+    std::string m_planeSelectionId;
+
+    ::fwData::PlaneList::wptr m_currentPlaneList;
+
+    /// Register connection between planelist and this adaptor
+    ::fwCom::Connection m_plConnection;
+
+    /// Register connection between plane and this service
+    ConnetionMapType m_planeConnections;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PLANESELECTIONNOTIFIER_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelector.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelector.hpp
new file mode 100644
index 0000000..e8471fc
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PlaneSelector.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _VISUVTKADAPTOR_PLANESELECTOR_HPP_
+#define _VISUVTKADAPTOR_PLANESELECTOR_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwData/PlaneList.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PlaneSelector: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PlaneSelector)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PlaneSelector() throw();
+
+    VISUVTKADAPTOR_API virtual ~PlaneSelector() throw();
+
+    VISUVTKADAPTOR_API void selectObject( ::fwData::Object::sptr object );
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    ::fwData::Object::wptr m_currentObject;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PLANESELECTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plugin.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plugin.hpp
new file mode 100644
index 0000000..e240d29
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Plugin.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PLUGIN_HPP_
+#define _VISUVTKADAPTOR_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+    
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides    
+    void stop() throw();
+    
+};
+
+} // namespace visuVTK
+
+#endif // _VISUVTKADAPTOR_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Point.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Point.hpp
new file mode 100644
index 0000000..380afbe
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Point.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_POINT_HPP_
+#define _VISUVTKADAPTOR_POINT_HPP_
+
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkHandleWidget;
+class vtkHandleRepresentation;
+class vtkCommand;
+
+
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Point: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Point)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Point() throw();
+
+    VISUVTKADAPTOR_API virtual ~Point() throw();
+
+    VISUVTKADAPTOR_API void setColor(double red, double green, double blue, double alpha = 1.0);
+
+    VISUVTKADAPTOR_API void setSelectedColor(double red, double green, double blue, double alpha = 1.0);
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+
+
+protected:
+    vtkHandleWidget         * m_handle;
+    vtkHandleRepresentation * m_representation;
+    vtkCommand              * m_pointUpdateCommand;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_POINT_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointLabel.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointLabel.hpp
new file mode 100644
index 0000000..947f537
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointLabel.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_POINTLABEL_HPP_
+#define _VISUVTKADAPTOR_POINTLABEL_HPP_
+
+#include <string>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/Text.hpp"
+
+class VISUVTKADAPTOR_CLASS_API vtkTextActor;
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API PointLabel: public Text
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (PointLabel)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PointLabel();
+
+protected:
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+    void starting() throw(::fwTools::Failed);
+    void stopping() throw(::fwTools::Failed);
+
+
+
+
+};
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif //  _VISUVTKADAPTOR_POINTLABEL_HPP_
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointList.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointList.hpp
new file mode 100644
index 0000000..b759a13
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointList.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_POINTLIST_HPP_
+#define _VISUVTKADAPTOR_POINTLIST_HPP_
+
+#include <set>
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PointList: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    typedef std::vector< WPTR(::fwData::Point) > WeakPointListType;
+    typedef std::set< WPTR(::fwData::Point) > WeakPointSetType;
+
+    fwCoreServiceClassDefinitionsMacro ( (PointList)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PointList() throw();
+
+    VISUVTKADAPTOR_API virtual ~PointList() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void createServices(WeakPointListType &wPtList);
+    VISUVTKADAPTOR_API WeakPointListType getWeakPointList();
+    VISUVTKADAPTOR_API WeakPointListType getNewPoints();
+
+     WeakPointListType m_oldWeakPointList;
+     WeakPointListType m_weakPointList;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_POINTLIST_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointListInteractor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointListInteractor.hpp
new file mode 100644
index 0000000..60e3d0c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/PointListInteractor.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_POINTLISTINTERACTOR_HPP_
+#define _VISUVTKADAPTOR_POINTLISTINTERACTOR_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+class vtkCommand;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API PointListInteractor: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (PointListInteractor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API PointListInteractor() throw();
+
+    VISUVTKADAPTOR_API virtual ~PointListInteractor() throw();
+
+
+    VISUVTKADAPTOR_API void resetPointList();
+    VISUVTKADAPTOR_API void addPoint(const double &x, const double &y, const double &z);
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed){};
+
+
+
+    vtkCommand *m_interactionCommand;
+    float m_priority;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_POINTLISTINTERACTOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ProbeCursor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ProbeCursor.hpp
new file mode 100644
index 0000000..ac3639d
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ProbeCursor.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_PROBECURSOR_HPP_
+#define _VISUVTKADAPTOR_PROBECURSOR_HPP_
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+class vtkActor;
+class vtkActor2D;
+class vtkTextMapper;
+class vtkPolyData;
+class vtkPolyDataMapper;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API ProbeCursor: public  ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ProbeCursor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ProbeCursor() throw();
+
+    VISUVTKADAPTOR_API virtual ~ProbeCursor() throw();
+
+    VISUVTKADAPTOR_API void updateView( double world[3] );
+
+    VISUVTKADAPTOR_API void setVisibility( bool visibility );
+
+    VISUVTKADAPTOR_API void StartProbeCursor();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    void buildTextActor();
+    void buildPolyData();
+
+    void computeCrossExtremity( const int probeSlice[3] , double worldCross[4][3] );
+
+
+    double m_priority;
+
+    vtkCommand *m_vtkObserver;
+
+    vtkActor2D * m_textActor; // rendering defect using a vtkTextActor
+    vtkTextMapper * m_textMapper;
+
+    vtkPolyData         *m_cursorPolyData;
+    vtkPolyDataMapper   *m_cursorMapper;
+    vtkActor            *m_cursorActor;
+
+
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_PROBECURSOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Reconstruction.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Reconstruction.hpp
new file mode 100644
index 0000000..0d75150
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Reconstruction.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_RECONSTRUCTION_HPP_
+#define _VISUVTKADAPTOR_RECONSTRUCTION_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Reconstruction: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Reconstruction)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Reconstruction() throw();
+
+    VISUVTKADAPTOR_API virtual ~Reconstruction() throw();
+
+    void setClippingPlanes(::fwRenderVTK::VtkRenderService::VtkObjectIdType id){ m_clippingPlanesId = id ; }
+
+    void setSharpEdgeAngle(double angle){ m_sharpEdgeAngle = angle; }
+
+    VISUVTKADAPTOR_API void setForceHide(bool hide);
+
+    /// Active/Inactive automatic reset on camera for triangular mesh adaptor. By default =true.
+    VISUVTKADAPTOR_API void setAutoResetCamera(bool autoResetCamera);
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API virtual void doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+
+    void createMeshService();
+
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanesId;
+
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_meshService;
+
+    double      m_sharpEdgeAngle;
+
+private:
+    bool   m_autoResetCamera;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_RECONSTRUCTION_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Render.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Render.hpp
new file mode 100644
index 0000000..d371ada
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Render.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_RENDER_HPP_
+#define _VISUVTKADAPTOR_RENDER_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Render: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Render)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Render() throw();
+
+    VISUVTKADAPTOR_API virtual ~Render() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    // manage only "ShowReconstructions" Field
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_RENDER_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Resection.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Resection.hpp
new file mode 100644
index 0000000..1945455
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Resection.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_RESECTION_HPP_
+#define _VISUVTKADAPTOR_RESECTION_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API Resection: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Resection)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Resection() throw();
+
+    VISUVTKADAPTOR_API virtual ~Resection() throw();
+
+    void setClippingPlanes(::fwRenderVTK::VtkRenderService::VtkObjectIdType id){ m_clippingPlanes = id ; }
+
+    void setSharpEdgeAngle(double angle){ m_sharpEdgeAngle = angle; }
+
+protected:
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanes;
+    double m_sharpEdgeAngle;
+    bool   m_autoResetCamera;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_RESECTION_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResectionDB.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResectionDB.hpp
new file mode 100644
index 0000000..b86463f
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResectionDB.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_RESECTIONDB_HPP_
+#define _VISUVTKADAPTOR_RESECTIONDB_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+
+class VISUVTKADAPTOR_CLASS_API ResectionDB: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (ResectionDB)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ResectionDB() throw();
+
+    VISUVTKADAPTOR_API virtual ~ResectionDB() throw();
+
+    void setClippingPlanes(::fwRenderVTK::VtkRenderService::VtkObjectIdType id){ m_clippingPlanes = id ; }
+
+    void setSharpEdgeAngle(double angle){ m_sharpEdgeAngle = angle; }
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanes;
+    double m_sharpEdgeAngle;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_RESECTIONDB_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResetCamera.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResetCamera.hpp
new file mode 100644
index 0000000..160c6ef
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/ResetCamera.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_RESETCAMERA_HPP_
+#define _VISUVTKADAPTOR_RESETCAMERA_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief   Do a reset camera.
+ * @class   ResetCamera
+ * @note    The priority  of the comChannel of this Adaptor is very low (0.1). The update of the GenericScene must be done before this reset.
+ * 
+ * @date    2010.
+ */
+class VISUVTKADAPTOR_CLASS_API ResetCamera: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (ResetCamera)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API ResetCamera() throw();
+
+    VISUVTKADAPTOR_API virtual ~ResetCamera() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+
+    bool bCameraReseted;
+
+};
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_RESETCAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SliceFollowerCamera.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SliceFollowerCamera.hpp
new file mode 100644
index 0000000..0b24136
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SliceFollowerCamera.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_SLICEFOLLOWERCAMERA_HPP_
+#define _VISUVTKADAPTOR_SLICEFOLLOWERCAMERA_HPP_
+
+#include <vector>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API SliceFollowerCamera: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SliceFollowerCamera)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API SliceFollowerCamera() throw();
+
+    VISUVTKADAPTOR_API virtual ~SliceFollowerCamera() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+
+    void initializeCamera();
+    void updateCamera(double distance = -1., double size=-1);
+
+    vtkCamera* m_camera;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_SLICEFOLLOWERCAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SlicesCursor.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SlicesCursor.hpp
new file mode 100644
index 0000000..c46721f
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/SlicesCursor.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_SLICESCURSOR_HPP_
+#define _VISUVTKADAPTOR_SLICECURSOR_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+
+class VISUVTKADAPTOR_CLASS_API vtkPolyData;
+class VISUVTKADAPTOR_CLASS_API vtkPolyDataMapper;
+class VISUVTKADAPTOR_CLASS_API vtkActor;
+
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API SlicesCursor: public ::fwComEd::helper::MedicalImageAdaptor,public ::fwRenderVTK::IVtkAdaptorService 
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (SlicesCursor)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API SlicesCursor()  throw();
+
+    VISUVTKADAPTOR_API virtual ~SlicesCursor()  throw();
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void reconfiguring() throw(fwTools::Failed);
+
+    /// set the scale for the cross : 1. means full cross, 0.5 half cross, 0. no cross
+    void setCrossScale(double scale);
+
+    void updateSliceIndex( ::fwData::Image::sptr image );
+    void buildPolyData();
+    void updateColors();
+    void buildColorAttribute();
+
+    vtkPolyData         *m_cursorPolyData;
+    vtkPolyDataMapper   *m_cursorMapper;
+    vtkActor            *m_cursorActor;
+    float m_scale;
+    bool  m_isSelected;
+
+private :
+
+
+    /// Compute the barycenter : result = scale*ptA + (1-scale)*ptB
+    static void barycenter( double ptA[3], double ptB[3], float scale, double result[3] );
+
+    /// Compute points A' and B' on A------A'<---P--->B'---B
+    static void computeCrossPoints( double _ptA[3], double _ptB[3], double _ptP[3], double _scale, double _ptAprime[3], double _ptBprime[3] );
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_SLICESCURSOR_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Snapshot.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Snapshot.hpp
new file mode 100644
index 0000000..b4e7003
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Snapshot.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_CAMERA_HPP_
+#define _VISUVTKADAPTOR_CAMERA_HPP_
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Snapshot: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Snapshot)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Snapshot() throw();
+
+    VISUVTKADAPTOR_API virtual ~Snapshot() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+
+    void snap(std::string filePath);
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_CAMERA_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Text.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Text.hpp
new file mode 100644
index 0000000..efdd6c6
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Text.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VISUVTKADAPTOR_TEXT_HPP__
+#define __VISUVTKADAPTOR_TEXT_HPP__
+
+#include "visuVTKAdaptor/config.hpp"
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include <string>
+
+
+class vtkTextActor;
+class vtkActor2D;
+class vtkTextMapper;
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API Text: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Text)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API Text();
+    VISUVTKADAPTOR_API virtual ~Text() throw();
+
+    VISUVTKADAPTOR_API virtual void setText(std::string str);
+    virtual std::string getText(){return m_text;};
+
+protected:
+
+    VISUVTKADAPTOR_API virtual void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API virtual void doStop() throw(fwTools::Failed);
+    virtual void doSwap() throw(fwTools::Failed){};
+    virtual void doUpdate() throw(fwTools::Failed){};
+    virtual void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed){};
+
+    /**
+     * @brief Configure the adaptor
+     *
+     * Example :
+     @verbatim
+     <adaptor id="text" class="::visuVTKAdaptor::Text" objectId="imageSeries">
+        <config renderer="default" text="@patient.name" fontSize="16" />
+     </adaptor>
+     @endverbatim
+     *
+     * - text : text to display. If a valid Seshat object attribute path is detected, the associated
+     *   value is used. Otherwise, it uses the given value in XML configuration.
+     * - fontSize : font size in points of displayed text (not mandatory, default value is set to 20)
+     * - hAlign : horizontal alignment ('left' or 'right', not mandatory, default value is set to 'left')
+     * - vAlign : vertical alignment ('top' or 'bottom', not mandatory, default value is set to 'bottom')
+     */
+    VISUVTKADAPTOR_API virtual void configuring() throw(fwTools::Failed);
+
+    std::string m_text;
+
+    vtkActor2D* m_actor;
+    vtkTextMapper * m_mapper;
+
+    /// Font size (in points) applied to VTK text mapper.
+    unsigned int m_fontSize;
+
+    /// Vertical alignment
+    std::string m_vAlign;
+
+    /// Horizontal alignment
+    std::string m_hAlign;
+
+private:
+    void setAlignment();
+};
+
+} //namespace visuVTKAdaptor
+
+#endif //__VISUVTKADAPTOR_TEXT_HPP__
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Transform.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Transform.hpp
new file mode 100644
index 0000000..7e8e382
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Transform.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_TRANSFORM_HPP_
+#define _VISUVTKADAPTOR_TRANSFORM_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkTransform;
+
+namespace visuVTKAdaptor
+{
+
+/**
+ * @brief Adaptor to manage a TransformationMatrix3D from a vtkTransform and vice versa
+ * @class Transform
+ */
+class VISUVTKADAPTOR_CLASS_API Transform: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Transform)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    /// Constructor
+    VISUVTKADAPTOR_API Transform() throw();
+    /// Destructor
+    VISUVTKADAPTOR_API virtual ~Transform() throw();
+    
+    /// Set a new vtkTransform
+    VISUVTKADAPTOR_API void setTransform(vtkTransform *t);
+    
+    /// Returns the current vtkTransform
+    VISUVTKADAPTOR_API vtkTransform *getTransform();
+
+    /// Updates the TransformationMatrix3D from the vtkTransform
+    VISUVTKADAPTOR_API void updateFromVtk();
+
+protected:
+
+    /// Calls doUpdate()
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    
+    /** 
+     * @brief Configure the adaptor.
+     * @verbatim
+    <adaptor id="tmAdaptor" class="::visuVTKAdaptor::Transform" objectId="tm3dKey" >
+        <config transform="transform" autoRender="true" />
+    </adaptor> 
+       @endverbatim
+     * With : 
+     *  - \b transform (mandatory) : the vtkTransform to associate to the adaptor
+     *  - \b autoRender (optional, "true" by default): if autoRender=true,  the scene is automatically rendered after
+     *    doStart, doUpdate, doSwap, doReceive and doStop if m_vtkPipelineModified=true.
+     */
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    
+    /// Calls doUpdate()
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    
+    /// Updates the vtkTransform from the TransformationMatrix3D
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    
+    /// Does nothing
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+ 
+    /// Calls doUpdate() when it receives MATRIX_IS_MODIFIED event
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+    /// Current vtkTransform
+    vtkTransform* m_transform;
+    
+    /// Command used to listen m_transform changes
+    vtkCommand* m_transformCommand;
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_TRANSFORM_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/TriangularMesh.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/TriangularMesh.hpp
new file mode 100644
index 0000000..836cc05
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/TriangularMesh.hpp
@@ -0,0 +1,143 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_TRIANGULARMESH_HPP_
+#define _VISUVTKADAPTOR_TRIANGULARMESH_HPP_
+
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkCommand;
+class vtkDepthSortPolyData;
+class vtkAlgorithm;
+class vtkAlgorithmOutput;
+class vtkPolyDataNormals;
+class vtkPlaneCollection;
+class vtkActorCollection;
+class vtkActor;
+class vtkPolyData;
+class vtkPolyDataMapper;
+class vtkTransform;
+
+namespace visuVTKAdaptor
+{
+
+class Transform;
+
+class VISUVTKADAPTOR_CLASS_API TriangularMeshVtkCommand ;
+
+class VISUVTKADAPTOR_CLASS_API TriangularMesh: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (TriangularMesh)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API TriangularMesh() throw();
+    VISUVTKADAPTOR_API virtual ~TriangularMesh() throw();
+
+    VISUVTKADAPTOR_API ::fwData::Material::sptr getMaterial();
+    VISUVTKADAPTOR_API void setMaterial(::fwData::Material::sptr material);
+
+    VISUVTKADAPTOR_API ::fwData::Material::sptr getUnclippedMaterial();
+    VISUVTKADAPTOR_API void setUnclippedPartMaterial(::fwData::Material::sptr material);
+
+
+    VISUVTKADAPTOR_API void setSharpEdgeAngle  ( double angle );
+    VISUVTKADAPTOR_API double getSharpEdgeAngle( );
+
+    VISUVTKADAPTOR_API void setShowClippedPart ( bool show );
+    VISUVTKADAPTOR_API void setClippingPlanesId( ::fwRenderVTK::VtkRenderService::VtkObjectIdType id );
+
+    VISUVTKADAPTOR_API void setVtkClippingPlanes               ( vtkPlaneCollection *planes );
+    VISUVTKADAPTOR_API void setMapperInput                     ( vtkAlgorithmOutput *input  );
+    VISUVTKADAPTOR_API vtkAlgorithmOutput *getMapperInput      ( );
+    VISUVTKADAPTOR_API void setActorPropertyToUnclippedMaterial( bool opt );
+
+    /// Active/Inactive automatic reset on camera. By default =true.
+    VISUVTKADAPTOR_API void setAutoResetCamera(bool autoResetCamera);
+
+    VISUVTKADAPTOR_API void updateVisibility ( bool isVisible );
+    VISUVTKADAPTOR_API bool getVisibility();
+
+    VISUVTKADAPTOR_API void updateOptionsMode();
+
+protected:
+
+   VISUVTKADAPTOR_API void doStart    () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doStop     () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doSwap   () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doUpdate   () throw(fwTools::Failed);
+   VISUVTKADAPTOR_API void doReceive   (::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+
+    vtkActor *newActor();
+    void buildPipeline();
+
+
+    void updateMapper();
+    void updateTriangularMesh ( ::fwData::TriangularMesh::sptr mesh );
+    void updateMaterial       ( ::fwData::Material::sptr material   );
+
+    void setServiceOnMaterial(
+        ::fwRenderVTK::IVtkAdaptorService::sptr &srv,
+        ::fwData::Material::sptr material
+        );
+
+    void removePlaneCollectionShifterCommand();
+    void removeServicesStarterCommand();
+    void createServicesStarterCommand();
+
+    void createTransformService();
+    void createNormalsService();
+    void removeNormalsService();
+
+
+
+
+    bool   m_showClippedPart;
+    double m_sharpEdgeAngle;
+    bool   m_manageMapperInput;
+    bool   m_autoResetCamera;
+
+    bool m_computeNormals;
+    bool m_computeNormalsAtUpdate;
+
+    vtkAlgorithm       *m_pipelineInput;
+    vtkAlgorithmOutput *m_mapperInput;
+    vtkPolyData        *m_polyData;
+    vtkPolyDataMapper  *m_mapper;
+    vtkPolyDataNormals *m_normals;
+    vtkActor           *m_actor;
+    vtkCommand         *m_depthSortCommand;
+
+    vtkPlaneCollection *m_clippingPlanes;
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanesId;
+
+    TriangularMeshVtkCommand *m_planeCollectionShifterCallback;
+    TriangularMeshVtkCommand *m_servicesStarterCallback;
+
+    ::fwData::Material::sptr       m_material;
+    ::fwData::Material::sptr       m_unclippedPartMaterial;
+
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_materialService;
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_unclippedPartMaterialService;
+    ::fwRenderVTK::IVtkAdaptorService::wptr m_normalsService;
+
+    vtkTransform* m_transform;
+    WPTR(::visuVTKAdaptor::Transform) m_transformService;
+
+public :
+
+   vtkActor * getActor(){ return m_actor; }
+
+};
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_TRIANGULARMESH_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/VectorField.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/VectorField.hpp
new file mode 100644
index 0000000..56a6850
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/VectorField.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_IMAGE_HPP_
+#define _VISUVTKADAPTOR_IMAGE_HPP_
+
+#include <vtkSmartPointer.h>
+
+#include <fwData/Image.hpp>
+
+
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+
+class vtkPolyDataAlgorithm;
+class vtkImageData;
+class vtkGlyph3D;
+
+
+
+namespace visuVTKAdaptor
+{
+
+class VISUVTKADAPTOR_CLASS_API VectorField: public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (VectorField)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKADAPTOR_API VectorField() throw();
+
+    VISUVTKADAPTOR_API virtual ~VectorField() throw();
+
+protected :
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+
+    virtual void buildPipeline();
+    virtual void destroyPipeline();
+
+    vtkSmartPointer<vtkPolyDataAlgorithm> m_arrowSource;
+    vtkSmartPointer<vtkImageData> m_imageData;
+    vtkSmartPointer<vtkGlyph3D> glyphFilter;
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_IMAGE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Video.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Video.hpp
new file mode 100644
index 0000000..02a576c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/Video.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_VIDEO_HPP_
+#define _VISUVTKADAPTOR_VIDEO_HPP_
+
+#include <vector>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include "visuVTKAdaptor/config.hpp"
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+
+class VISUVTKADAPTOR_CLASS_API vtkImageData;
+class VISUVTKADAPTOR_CLASS_API vtkUnsignedCharArray;
+class VISUVTKADAPTOR_CLASS_API vtkTexture;
+
+namespace visuVTKAdaptor
+{
+
+
+class VISUVTKADAPTOR_CLASS_API Video: public ::fwRenderVTK::IVtkAdaptorService, protected MeshFactory
+{
+
+public:
+    fwCoreServiceClassDefinitionsMacro ( (Video)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    Video() throw();
+    virtual ~Video() throw();
+
+protected:
+
+    VISUVTKADAPTOR_API void doStart() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void configuring() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doSwap() throw(fwTools::Failed);
+    // redraw all (stop then restart sub services)
+    VISUVTKADAPTOR_API void doUpdate() throw(fwTools::Failed);
+    VISUVTKADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKADAPTOR_API void doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+
+private:
+
+    vtkImageData* m_imageData;
+    vtkUnsignedCharArray* m_array;
+    vtkTexture* m_texture ;
+
+    bool bText_init;
+//  enum ARL_VIDEO_FLIP { VIDEO_FLIP_VERTICAL, VIDEO_FLIP_HORIZONTAL, VIDEO_FLIP_RADIAL, VIDEO_NBFLIP };
+
+};
+
+
+
+
+} //namespace visuVTKAdaptor
+
+#endif // _VISUVTKADAPTOR_VIDEO_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/config.hpp b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/config.hpp
new file mode 100644
index 0000000..9339c15
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/include/visuVTKAdaptor/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKADAPTOR_CONFIG_HPP_
+#define _VISUVTKADAPTOR_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VISUVTKADAPTOR_EXPORTS
+    #define VISUVTKADAPTOR_API __declspec(dllexport)
+    #else
+    #define VISUVTKADAPTOR_API __declspec(dllimport)
+    #endif
+
+    #define VISUVTKADAPTOR_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VISUVTKADAPTOR_EXPORTS
+    #define VISUVTKADAPTOR_API __attribute__ ((visibility("default")))
+    #define VISUVTKADAPTOR_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VISUVTKADAPTOR_API __attribute__ ((visibility("hidden")))
+    #define VISUVTKADAPTOR_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VISUVTKADAPTOR_API
+    #define VISUVTKADAPTOR_CLASS_API
+
+#endif
+
+#endif // _VISUVTKADAPTOR_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/rc/plugin.xml b/Bundles/LeafVisu/visuVTKAdaptor/rc/plugin.xml
new file mode 100644
index 0000000..a9b4f50
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/rc/plugin.xml
@@ -0,0 +1,339 @@
+<plugin id="visuVTKAdaptor" class="visuVTKAdaptor::Plugin" >
+
+    <library name="visuVTKAdaptor" />
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="visu" />
+    <requirement id="visuVTK" />
+
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Render</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Cube</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Axes</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Material</service>
+        <object>::fwData::Material</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::TriangularMesh</service>
+        <object>::fwData::TriangularMesh</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Reconstruction</service>
+        <object>::fwData::Reconstruction</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ResectionDB</service>
+        <object>::fwData::ResectionDB</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Resection</service>
+        <object>::fwData::Resection</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Point</service>
+        <object>::fwData::Point</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PointLabel</service>
+        <object>::fwData::Point</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PointList</service>
+        <object>::fwData::PointList</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PointListInteractor</service>
+        <object>::fwData::PointList</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PickerInteractor</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImagePickerInteractor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Distance</service>
+        <object>::fwData::PointList</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImageMultiDistances</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImageLandmarks</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Text</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImageText</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Model</service>
+        <object>::fwData::Model</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Transform</service>
+        <object>::fwData::TransformationMatrix3D</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::BoxWidget</service>
+        <object>::fwData::TransformationMatrix3D</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Video</service>
+        <object>::fwData::Video</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Camera</service>
+        <object>::fwData::Video</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Camera2</service>
+        <object>::fwData::TransformationMatrix3D</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ResetCamera</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::NegatoOneSlice</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::SlicesCursor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+     <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::SliceFollowerCamera</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Normals</service>
+        <object>::fwData::TriangularMesh</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::InteractorStyle</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::NegatoWindowingInteractor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::NegatoSlicingInteractor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ProbeCursor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImagesProbeCursor</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::NegatoMPR</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PlaneSelector</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PlaneSelectionNotifier</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PlaneInteractor</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::PlaneList</service>
+        <object>::fwData::PlaneList</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Plane</service>
+        <object>::fwData::Plane</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Snapshot</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Medical3DCamera</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Image</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImageSlice</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::MeshesBoxWidget</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Image3DCursor</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImagesBlend</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::Mesh</service>
+        <object>::fwData::Mesh</object>
+    </extension>
+
+   <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::MeshNormals</service>
+        <object>::fwData::Mesh</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::LabeledPointList</service>
+        <object>::fwData::PointList</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::VectorField</service>
+        <object>::fwData::Image</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ModelSeries</service>
+        <object>::fwMedData::ModelSeries</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKAdaptor::ImageSeries</service>
+        <object>::fwMedData::ImageSeries</object>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/rc/video.xml b/Bundles/LeafVisu/visuVTKAdaptor/rc/video.xml
new file mode 100644
index 0000000..5a227bb
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/rc/video.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<Material name="video" NumberOfVertexShaders="1" NumberOfFragmentShaders="1">
+
+  <Shader scope="Vertex" name="videoVert" location="Inline" language="GLSL" entry="main" args="-DVERTEX_PROGRAM">
+    <![CDATA[
+        varying vec2  texCoord;
+        void main(void)
+        {
+           texCoord = gl_MultiTexCoord0.st;
+           texCoord.y = 1.-texCoord.y;
+           
+          // normal transformation
+          gl_Position = ftransform();
+        }
+    ]]>
+  </Shader>
+
+  <Shader scope="Fragment" name="videoFrag" location="Inline" language="GLSL" entry="main" args="-DFRAGMENT_PROGRAM">
+    <![CDATA[
+        uniform sampler2D texture;   // input image
+        varying vec2  texCoord;
+        void main(void)
+        {
+          vec4 tmp_color;
+          tmp_color = texture2D(texture,texCoord);
+          gl_FragColor = tmp_color;
+          gl_FragColor.r = tmp_color.b;
+          gl_FragColor.b = tmp_color.r;
+        }
+    ]]>
+  </Shader>
+
+</Material>
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Axes.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Axes.cpp
new file mode 100644
index 0000000..1587009
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Axes.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/lexical_cast.hpp>
+
+/// FW4SPL Includes
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+/// VTK Includes
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+#include <vtkProp3D.h>
+
+#include "visuVTKAdaptor/Axes.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Axes, ::fwData::Object );
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Axes::Axes() throw()
+{
+    m_axesActor = vtkAxesActor::New();
+    m_length = 1;
+    m_labelOn = true;
+}
+
+//------------------------------------------------------------------------------
+
+Axes::~Axes() throw()
+{
+    m_axesActor->Delete();
+    m_axesActor = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::doStart() throw(fwTools::Failed)
+{
+    this->buildPipeline();
+    this->addToRenderer( m_axesActor );
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::doStop() throw(fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+    this->getRenderer()->RemoveActor(m_axesActor);
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::doSwap() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::doUpdate() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::configuring() throw(fwTools::Failed)
+{
+    assert( m_configuration->getName() == "config" );
+
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    if ( m_configuration->hasAttribute( "transform" ) )
+    {
+        this->setTransformId ( m_configuration->getAttributeValue ( "transform" ) );
+    }
+    if ( m_configuration->hasAttribute( "length" ) )
+    {
+        m_length = boost::lexical_cast<double>( m_configuration->getAttributeValue( "length" ) );
+    }
+    if ( m_configuration->hasAttribute( "label" ) )
+    {
+        std::string value = m_configuration->getAttributeValue( "label" );
+        std::transform( value.begin(), value.end(), value.begin(), tolower );
+        m_labelOn = ( value == "yes" );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Axes::buildPipeline()
+{
+    m_axesActor->SetTotalLength( m_length, m_length, m_length );
+    m_axesActor->SetShaftTypeToCylinder();
+    m_axesActor->SetTipTypeToCone();
+
+    if (!m_labelOn)
+    {
+        m_axesActor->SetXAxisLabelText( "x" );
+        m_axesActor->SetYAxisLabelText( "y" );
+        m_axesActor->SetZAxisLabelText( "z" );
+        m_axesActor->AxisLabelsOff();
+    }
+    m_axesActor->SetUserTransform( this->getTransform() );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/BoxWidget.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/BoxWidget.cpp
new file mode 100644
index 0000000..fe48d93
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/BoxWidget.cpp
@@ -0,0 +1,215 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/lexical_cast.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+#include <vtkCommand.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkBoxRepresentation.h>
+#include <vtkBoxWidget2.h>
+
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp>
+
+#include "visuVTKAdaptor/Transform.hpp"
+#include "visuVTKAdaptor/BoxWidget.hpp"
+#include <fwServices/IEditionService.hpp>
+
+namespace visuVTKAdaptor
+{
+
+class BoxClallback : public ::vtkCommand
+{
+public:
+
+    static BoxClallback* New(::visuVTKAdaptor::BoxWidget* adaptor) {
+        BoxClallback *cb = new BoxClallback;
+        cb->m_adaptor = adaptor;
+        return cb;
+    }
+
+     BoxClallback() : m_adaptor(NULL) {}
+    ~BoxClallback() {}
+
+    virtual void Execute( ::vtkObject* pCaller, unsigned long eventId, void* )
+    {
+        m_adaptor->updateFromVtk();
+    }
+
+    ::visuVTKAdaptor::BoxWidget *m_adaptor;
+};
+
+// BoxWidget
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::BoxWidget, ::fwData::TransformationMatrix3D );
+
+//------------------------------------------------------------------------------
+
+BoxWidget::BoxWidget() throw()
+: ::fwRenderVTK::IVtkAdaptorService(),
+  m_vtkBoxWidget( 0 ), m_scaleFactor(1.0), m_enableScaling(true)
+{
+    m_boxWidgetCommand = BoxClallback::New(this);
+
+    //addNewHandledEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+BoxWidget::~BoxWidget() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::configuring() throw( ::fwTools::Failed )
+{
+    setRenderId( m_configuration->getAttributeValue( "renderer" ) );
+    this->setTransformId( m_configuration->getAttributeValue("transform") );
+
+    if (m_configuration->hasAttribute("scaleFactor"))
+    {
+        m_scaleFactor = ::boost::lexical_cast<double>(m_configuration->getAttributeValue("scaleFactor"));
+    }
+
+    if (m_configuration->hasAttribute("enableScaling"))
+    {
+        SLM_ASSERT("Wrong value for 'enableScaling', must be 'true' or 'false'",
+                m_configuration->getAttributeValue("enableScaling") == "yes" ||
+                m_configuration->getAttributeValue("enableScaling") == "no");
+        m_enableScaling = (m_configuration->getAttributeValue("enableScaling") == "yes");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::doStart() throw( ::fwTools::Failed )
+{
+    m_transform = getTransform();
+    SLM_ASSERT("BoxWidget need a vtkTransform", m_transform);
+    fwVtkBoxRepresentation *boxRep = fwVtkBoxRepresentation::New();
+    boxRep->SetPlaceFactor(m_scaleFactor);
+
+    double bounds[] = {-1,1,-1,1,-1,1};
+    boxRep->PlaceWidget(bounds);
+
+    m_vtkBoxWidget = ::vtkBoxWidget2::New();
+    m_vtkBoxWidget->SetRepresentation(boxRep);
+    m_vtkBoxWidget->SetInteractor( this->getInteractor() );
+    if (!m_enableScaling)
+    {
+        boxRep->ScalingEnabledOff();
+    }
+    m_vtkBoxWidget->On();
+
+    boxRep->SetTransform(m_transform);
+
+    m_vtkBoxWidget->AddObserver( ::vtkCommand::InteractionEvent, m_boxWidgetCommand );
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::doStop() throw( ::fwTools::Failed )
+{
+    unregisterServices();
+
+    m_transform->Delete();
+    m_transform = 0;
+    m_vtkBoxWidget->RemoveObserver( m_boxWidgetCommand );
+    m_vtkBoxWidget->Delete();
+    m_vtkBoxWidget = 0;
+
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::doSwap() throw( ::fwTools::Failed )
+{
+    doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::updateFromVtk()
+{
+    m_vtkBoxWidget->RemoveObserver( m_boxWidgetCommand );
+
+    vtkBoxRepresentation *repr = vtkBoxRepresentation::SafeDownCast( m_vtkBoxWidget->GetRepresentation() );
+    if( repr )
+    {
+        repr->GetTransform(m_transform);
+        m_transform->Modified();
+    }
+
+    ::fwData::TransformationMatrix3D::sptr trf = this->getObject< ::fwData::TransformationMatrix3D >();
+    vtkMatrix4x4* mat = m_transform->GetMatrix();
+
+    for(int lt=0; lt<4; lt++)
+    {
+        for(int ct=0; ct<4; ct++)
+        {
+            trf->setCoefficient(lt,ct, mat->GetElement(lt,ct));
+        }
+    }
+
+    ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+    msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), trf, msg);
+
+    m_vtkBoxWidget->AddObserver( ::vtkCommand::InteractionEvent, m_boxWidgetCommand );
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::doUpdate() throw( ::fwTools::Failed )
+{
+    m_vtkBoxWidget->RemoveObserver( m_boxWidgetCommand );
+    vtkBoxRepresentation *repr = vtkBoxRepresentation::SafeDownCast( m_vtkBoxWidget->GetRepresentation() );
+    if( repr )
+    {
+        vtkMatrix4x4* mat = m_transform->GetMatrix();
+        ::fwData::TransformationMatrix3D::sptr transMat = this->getObject< ::fwData::TransformationMatrix3D >();
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                mat->SetElement(lt, ct, transMat->getCoefficient(lt,ct));
+            }
+        }
+
+        repr->SetTransform(m_transform);
+        this->setVtkPipelineModified();
+    }
+    m_vtkBoxWidget->AddObserver( ::vtkCommand::InteractionEvent, m_boxWidgetCommand );
+}
+
+//------------------------------------------------------------------------------
+
+void BoxWidget::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw( ::fwTools::Failed )
+{
+    ::fwComEd::TransformationMatrix3DMsg::csptr transfoMsg = ::fwComEd::TransformationMatrix3DMsg::dynamicConstCast(msg);
+    if (transfoMsg && transfoMsg->hasEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED)
+            &&  m_vtkBoxWidget->HasObserver(::vtkCommand::InteractionEvent, m_boxWidgetCommand))
+    {
+        doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera.cpp
new file mode 100644
index 0000000..6c53b71
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera.cpp
@@ -0,0 +1,202 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Camera.hpp>
+#include <fwData/Video.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/CameraMsg.hpp>
+#include <fwComEd/VideoMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkCamera.h>
+
+#include "visuVTKAdaptor/Camera.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Camera, ::fwData::Video ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+Camera::Camera() throw()
+{
+    bCam_init = false;
+}
+
+Camera::~Camera() throw()
+{
+}
+
+
+void Camera::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+void Camera::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+void Camera::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Video::sptr video = this->getObject< ::fwData::Video >();
+    if (!video->dataAvailable())
+        return;
+
+    if(!bCam_init)
+    {
+        bCam_init = this->initCameraParameters();
+    }
+}
+
+void Camera::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+void Camera::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+
+void Camera::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+
+    ::fwComEd::CameraMsg::csptr cameraMsg = ::fwComEd::CameraMsg::dynamicConstCast( msg );
+    ::fwComEd::VideoMsg::csptr videoMsg = ::fwComEd::VideoMsg::dynamicConstCast( msg );
+    if ( ( cameraMsg && cameraMsg->hasEvent( ::fwComEd::CameraMsg::NEW_CAMERA ) )
+            || ( videoMsg && videoMsg->hasEvent(::fwComEd::VideoMsg::VIDEO_IS_REFRESHED) ))
+    {
+        doUpdate();
+    }
+    else if( msg->hasEvent( fwComEd::Dictionary::position ) )
+    {
+        vtkCamera* camera = this->getRenderer()->GetActiveCamera();
+        ::fwData::TransformationMatrix3D::sptr transMat;
+        transMat = this->getObject()->getField< ::fwData::TransformationMatrix3D>(fwComEd::Dictionary::position);
+
+        vtkMatrix4x4* mat = vtkMatrix4x4::New();
+
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                mat->SetElement(lt, ct, transMat->getCoefficient(lt,ct));
+            }
+        }
+
+        double pos[3];
+        pos[0] = mat->Element[0][3];
+        pos[1] = mat->Element[1][3];
+        pos[2] = mat->Element[2][3];
+
+        double p1[]={0.0, 0.0, 100.0, 1.0};
+        double p2[4];
+        mat->MultiplyPoint( p1, p2);
+
+        mat->SetElement(0,3,0);
+        mat->SetElement(1,3,0);
+        mat->SetElement(2,3,0);
+
+        double p3[]={0.0, -1.0, 0.0, 1.0};
+        double p4[4];
+        mat->MultiplyPoint( p3, p4);
+
+        double p5[]={p4[0],p4[1],p4[2]};
+        camera->SetPosition(pos);
+        camera->SetFocalPoint(p2);
+        camera->SetViewUp(p5);
+
+        mat->Delete();
+        this->setVtkPipelineModified();
+    }
+}
+
+
+bool Camera::initCameraParameters()
+{
+    SLM_TRACE_FUNC();
+    vtkRenderer* renderer = this->getRenderer();
+
+    vtkCamera* camera = renderer->GetActiveCamera();
+    ::fwData::Video::sptr video = this->getObject< ::fwData::Video >();
+    ::fwData::TransformationMatrix3D::wptr extrinsic = video->getCamera()->getExtrinsicCameraTransformation();
+    ::fwData::TransformationMatrix3D::wptr intrinsic = video->getCamera()->getIntrinsicCameraTransformation();
+
+    /*****************************************************************/
+    // Intrinsic matrix
+//    double cx = intrinsic.lock()->getCoefficient(0,2);
+//    double cy = intrinsic.lock()->getCoefficient(1,2);
+//    double fx = intrinsic.lock()->getCoefficient(0,0);
+    double fy = intrinsic.lock()->getCoefficient(1,1);
+
+    int width, height, lowerLeftX, lowerLeftY;
+
+//    m_interactor->Render();
+    renderer->GetTiledSizeAndOrigin(&width, &height, &lowerLeftX, &lowerLeftY);
+
+    if(width <=  0 || height <= 0)
+        return false;
+
+    camera->SetViewAngle(2.0 * atan( (this->getObject< ::fwData::Video >()->getYSize()/2.0)/fy ) / 3.1415 * 180.0);
+//    camera->SetViewAngle(2.0 * atan( (600.0/2.0)/fy ) / 3.1415 * 180.0);
+    camera->GetCompositeProjectionTransformMatrix(width/height, -1, +1);
+
+    /*****************************************************************/
+    // Extrinsic matrix
+    vtkMatrix4x4 * mat = vtkMatrix4x4::New();
+    vtkTransform* trans = vtkTransform::New();
+
+    for(int l=0; l<4; l++)
+    {
+        for(int c=0; c <4; c++)
+        {
+            mat->SetElement(l,c, extrinsic.lock()->getCoefficient(l, c));
+        }
+    }
+
+    mat->Invert();
+    trans->Identity();
+    trans->SetMatrix(mat);
+
+    camera->SetPosition (0, 0, 0);
+    camera->SetFocalPoint(0, 0, 10);
+    camera->SetViewUp(0, -1, 0);
+    camera->ApplyTransform(trans);
+    camera->SetClippingRange(0.1, 10000);
+
+    mat->Delete();
+    trans->Delete();
+    this->setVtkPipelineModified();
+
+    return true;
+}
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera2.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera2.cpp
new file mode 100644
index 0000000..feea80e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Camera2.cpp
@@ -0,0 +1,214 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkIdentityTransform.h>
+#include <vtkCamera.h>
+#include <vtkCommand.h>
+#include <vtkPerspectiveTransform.h>
+
+#include "visuVTKAdaptor/Camera2.hpp"
+
+class Camera2Clallback : public ::vtkCommand
+{
+public:
+
+    static Camera2Clallback* New(::visuVTKAdaptor::Camera2* adaptor) {
+        Camera2Clallback *cb = new Camera2Clallback;
+        cb->m_adaptor = adaptor;
+        return cb;
+    }
+
+     Camera2Clallback() : m_adaptor(NULL) {}
+    ~Camera2Clallback() {}
+
+    virtual void Execute( ::vtkObject* pCaller, unsigned long eventId, void* )
+    {
+        m_adaptor->updateFromVtk();
+    }
+
+    ::visuVTKAdaptor::Camera2 *m_adaptor;
+};
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Camera2, ::fwData::TransformationMatrix3D ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Camera2::Camera2() throw()
+{
+    m_cameraCommand = Camera2Clallback::New(this);
+}
+
+//------------------------------------------------------------------------------
+
+Camera2::~Camera2() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Camera2::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Camera2::doStart() throw(fwTools::Failed)
+{
+    vtkCamera* camera = this->getRenderer()->GetActiveCamera();
+
+    double position[]={0.0, 0.0, 0.0};
+    double focal[]={1.0, 0.0, 0.0};
+    double viewUp[]={0.0, 0.0, 1.0};
+
+    m_transOrig = vtkPerspectiveTransform::New();
+    m_transOrig->Identity();
+    m_transOrig->SetupCamera(position, focal, viewUp );
+
+    camera->SetPosition (position);
+    camera->SetFocalPoint(focal);
+    camera->SetViewUp(viewUp);
+    //camera->SetClippingRange(0.1, 10000);
+
+    camera->AddObserver( ::vtkCommand::ModifiedEvent, m_cameraCommand );
+}
+
+//------------------------------------------------------------------------------
+
+void Camera2::doUpdate() throw(fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void Camera2::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Camera2::doStop() throw(fwTools::Failed)
+{
+    vtkCamera* camera = this->getRenderer()->GetActiveCamera();
+    camera->RemoveObserver( m_cameraCommand );
+    this->unregisterServices();
+    m_transOrig->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+void Camera2::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    if( msg->hasEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) )
+    {
+        vtkCamera* camera = this->getRenderer()->GetActiveCamera();
+        camera->RemoveObserver( m_cameraCommand );
+
+        ::fwData::TransformationMatrix3D::sptr transMat = this->getObject< ::fwData::TransformationMatrix3D >();
+
+        vtkMatrix4x4* mat = vtkMatrix4x4::New();
+
+        ::fwData::mt::ObjectReadLock lock(transMat);
+
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                mat->SetElement(lt, ct, transMat->getCoefficient(lt,ct));
+            }
+        }
+
+        lock.unlock();
+
+        // Position camera on origin
+        vtkPerspectiveTransform* oldTrans = vtkPerspectiveTransform::New();
+        oldTrans->Identity();
+        oldTrans->SetupCamera(camera->GetPosition(), camera->GetFocalPoint(), camera->GetViewUp());
+        oldTrans->Inverse();
+        oldTrans->Concatenate(m_transOrig);
+        oldTrans->Inverse();
+
+        // Apply new transform
+        vtkTransform* trans =  vtkTransform::New();
+        trans->SetMatrix(mat);
+        trans->Concatenate(oldTrans->GetMatrix());
+        camera->ApplyTransform(trans);
+
+        this->getRenderer()->ResetCameraClippingRange();
+        this->setVtkPipelineModified();
+
+        camera->AddObserver( ::vtkCommand::ModifiedEvent, m_cameraCommand );
+
+        mat->Delete();
+        oldTrans->Delete();
+        trans->Delete();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Camera2::updateFromVtk()
+{
+    vtkCamera* camera = this->getRenderer()->GetActiveCamera();
+    camera->RemoveObserver( m_cameraCommand );
+
+    ::fwData::TransformationMatrix3D::sptr trf = this->getObject< ::fwData::TransformationMatrix3D >();
+    ::fwData::mt::ObjectWriteLock lock(trf);
+
+    vtkPerspectiveTransform* trans = vtkPerspectiveTransform::New();
+    trans->Identity();
+    trans->SetupCamera(camera->GetPosition(), camera->GetFocalPoint(), camera->GetViewUp());
+
+    trans->Inverse();
+    trans->Concatenate(m_transOrig);
+    vtkMatrix4x4* mat = trans->GetMatrix();
+
+    for(int lt=0; lt<4; lt++)
+    {
+        for(int ct=0; ct<4; ct++)
+        {
+            trf->setCoefficient(lt,ct, mat->GetElement(lt,ct));
+        }
+    }
+
+    lock.unlock();
+
+    ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+    msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), trf, msg);
+
+    camera->AddObserver( ::vtkCommand::ModifiedEvent, m_cameraCommand );
+
+    trans->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Cube.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Cube.cpp
new file mode 100644
index 0000000..6da33c6
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Cube.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/macros.hpp>
+
+#include <vtkCubeSource.h>
+#include <vtkRenderer.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+
+#include "visuVTKAdaptor/Cube.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Cube, ::fwData::Object ) ;
+
+namespace visuVTKAdaptor
+{
+
+void Cube::doStart() throw(fwTools::Failed)
+{
+    vtkCubeSource *cube = vtkCubeSource::New();
+    vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
+    mapper->SetInput(cube->GetOutput());
+    vtkActor *actor = vtkActor::New();
+    actor->SetMapper(mapper);
+    this->addToRenderer(actor);
+    this->setVtkPipelineModified();
+}
+
+
+void Cube::doStop() throw(fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+}
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Distance.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Distance.cpp
new file mode 100644
index 0000000..8ec1446
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Distance.cpp
@@ -0,0 +1,194 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/PointList.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/PointMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkCommand.h>
+#include <vtkAxisActor2D.h>
+#include <vtkDistanceRepresentation2D.h>
+#include <vtkHandleRepresentation.h>
+#include <vtkLineSource.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkTextProperty.h>
+#include <vtkProperty2D.h>
+#include <vtkRenderer.h>
+
+#include "visuVTKAdaptor/Distance.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Distance, ::fwData::PointList ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+Distance::Distance() throw():
+    m_distanceRepresentation( vtkDistanceRepresentation2D::New())
+{
+    m_distanceRepresentation->InstantiateHandleRepresentation();
+    m_distanceRepresentation->SetLabelFormat("%-#6.3gmm");
+    vtkPolyDataMapper *LineMapper;
+
+    m_lineSource = vtkLineSource::New();
+    m_lineSource->SetResolution(1);
+    LineMapper = vtkPolyDataMapper::New();
+    LineMapper->SetInput(m_lineSource->GetOutput());
+    m_lineActor = vtkActor::New();
+    m_lineActor->SetMapper(LineMapper);
+    m_lineActor->GetProperty()->SetLineWidth(5.);
+    m_lineActor->GetProperty()->SetColor(1.,1.,0.);
+    m_lineActor->GetProperty()->SetOpacity(0.4);
+
+    LineMapper->Delete();
+    m_distanceRepresentation->GetAxis()->GetProperty()->SetColor(1.0,0.0,1.);
+    m_distanceRepresentation->GetAxis()->SetTitlePosition(0.9);
+
+    //fixed font size for displaying distance
+    //m_distanceRepresentation->GetAxis()->SizeFontRelativeToAxisOn();
+    //m_distanceRepresentation->GetAxis()->GetMapper();
+    //m_distanceRepresentation->GetAxis()->SetFontFactor(0.8);
+
+    //addNewHandledEvent(::fwComEd::PointMsg::POINT_IS_MODIFIED);
+}
+
+//------------------------------------------------------------------------------
+
+Distance::~Distance() throw()
+{
+    m_distanceRepresentation->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::setAxisColor( ::fwData::Color::sptr newColor) throw()
+{
+    SLM_ASSERT("newColor not instanced", newColor);
+    m_distanceRepresentation->GetAxis()->GetProperty()->SetColor(
+            newColor->red(),newColor->green(),newColor->blue() );
+    m_distanceRepresentation->GetAxis()->GetProperty()->SetOpacity(newColor->alpha() );
+    m_lineActor->GetProperty()->SetColor(newColor->red(),newColor->green(),newColor->blue());
+    m_lineActor->GetProperty()->SetOpacity( newColor->alpha() * 0.4);
+
+    m_distanceRepresentation->GetAxis()->GetTitleTextProperty()->SetColor(
+            newColor->red(),newColor->green(),newColor->blue() );
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::doStart()
+{
+    ::fwData::PointList::sptr ptList = this->getObject< ::fwData::PointList >();
+
+    m_point1 = ptList->getPoints().front();
+    m_point2 = ptList->getPoints().back();
+
+    m_point1Connection = m_point1.lock()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                    this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+    m_point2Connection = m_point2.lock()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                    this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    // set color to distance if Point List have Color Field
+    if ( ptList->getField( ::fwComEd::Dictionary::m_colorId ) )
+    {
+        ::fwData::Color::sptr color;
+        color = ptList->getField< ::fwData::Color >( ::fwComEd::Dictionary::m_colorId );
+        this->setAxisColor( color );
+    }
+
+    this->addToRenderer(m_lineActor);
+    this->addToRenderer(m_distanceRepresentation);
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Point::sptr p1 = m_point1.lock();
+    ::fwData::Point::sptr p2 = m_point2.lock();
+
+    double ps1[3];
+    std::copy(p1->getCRefCoord().begin(),(p1)->getCRefCoord().end(), ps1 );
+
+    double ps2[3];
+    std::copy(p2->getCRefCoord().begin(),(p2)->getCRefCoord().end(), ps2 );
+
+    m_distanceRepresentation->GetPoint1Representation()->SetWorldPosition(ps1);
+    m_distanceRepresentation->GetPoint2Representation()->SetWorldPosition(ps2);
+
+    m_distanceRepresentation->SetPoint1DisplayPosition(ps1);
+    m_distanceRepresentation->SetPoint2DisplayPosition(ps2);
+
+    m_distanceRepresentation->BuildRepresentation();
+
+    m_lineSource->SetPoint1(ps1);
+    m_lineSource->SetPoint2(ps2);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::PointMsg::csptr pointMsg = ::fwComEd::PointMsg::dynamicConstCast( _msg );
+    SLM_ASSERT("Message received is not PointMsg",  pointMsg);
+    if ( pointMsg && pointMsg->hasEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED ) )
+    {
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::doSwap() throw(fwTools::Failed)
+{
+    this->doStop();
+    this->doStart();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Distance::doStop()
+{
+    m_point1Connection.disconnect();
+    m_point2Connection.disconnect();
+
+    m_point1.reset();
+    m_point2.reset();
+
+    this->removeAllPropFromRenderer();
+}
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image.cpp
new file mode 100644
index 0000000..11ce879
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image.cpp
@@ -0,0 +1,336 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/TransferFunction.hpp>
+
+#include <vtkImageBlend.h>
+#include <vtkImageData.h>
+#include <vtkImageMapToColors.h>
+
+#include <fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp>
+
+#include "visuVTKAdaptor/Image.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Image, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+Image::Image() throw()
+{
+    SLM_TRACE_FUNC();
+    m_lut        = fwVtkWindowLevelLookupTable::New();
+    m_map2colors = vtkImageMapToColors::New();
+    m_imageData  = vtkImageData::New();
+
+    m_imageRegister = NULL;
+
+    m_imagePortId = -1;
+    m_allowAlphaInTF = false;
+
+    // Manage events
+    this->installTFSelectionEventHandler(this);
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER                     );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::MODIFIED                   );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE                  );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::TRANSPARENCY               );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::VISIBILITY                 );
+    //addNewHandledEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS );
+    //addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING       );
+}
+
+//------------------------------------------------------------------------------
+
+Image::~Image() throw()
+{
+    SLM_TRACE_FUNC();
+    m_lut->Delete();
+    m_lut = NULL;
+
+    m_map2colors->Delete();
+    m_map2colors = NULL;
+
+    m_imageData->Delete();
+    m_imageData = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void Image::doStop() throw(fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->destroyPipeline();
+}
+
+//------------------------------------------------------------------------------
+
+void Image::doSwap() throw(fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void Image::doUpdate() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        this->updateImage(image);
+        this->buildPipeline();
+        this->updateImageTransferFunction(image);
+        this->updateWindowing(image);
+        this->updateImageOpacity();
+    }
+    else
+    {
+        this->updateTransferFunction(image, this->getSptr());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Image::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            this->doUpdate();
+
+            // Hack to force imageSlice update until it is not able to detect a new image
+            ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+            msg->setSliceIndex(m_axialIndex, m_frontalIndex, m_sagittalIndex);
+            ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+        }
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::MODIFIED ) )
+        {
+            m_imageData->Modified();
+
+            this->setVtkPipelineModified();
+        }
+
+        if (this->upadteTFObserver(msg, this->getSptr()) || msg->hasEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS ) )
+        {
+            this->updateImageTransferFunction(image);
+        }
+
+        if ( msg->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING ) )
+        {
+            ::fwComEd::TransferFunctionMsg::csptr tfmsg = ::fwComEd::TransferFunctionMsg::dynamicConstCast(msg);
+            this->setWindow(tfmsg->getWindow());
+            this->setLevel(tfmsg->getLevel());
+            updateWindowing(image);
+        }
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::TRANSPARENCY ) || msg->hasEvent( ::fwComEd::ImageMsg::VISIBILITY ) )
+        {
+            this->updateImageOpacity();
+        }
+    }
+    else
+    {
+        this->destroyPipeline();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Image::configuring() throw(fwTools::Failed)
+{
+    assert(m_configuration->getName() == "config");
+    if(m_configuration->hasAttribute("vtkimageregister") )
+    {
+        this->setVtkImageRegisterId( m_configuration->getAttributeValue("vtkimageregister") );
+    }
+    if(m_configuration->hasAttribute("opacity") )
+    {
+        this->setImageOpacity(::boost::lexical_cast<double>(m_configuration->getAttributeValue("opacity")));
+    }
+    if(m_configuration->hasAttribute("tfalpha") )
+    {
+        this->setAllowAlphaInTF(m_configuration->getAttributeValue("tfalpha") == "yes");
+    }
+
+    this->parseTFConfig( m_configuration );
+}
+
+//------------------------------------------------------------------------------
+
+
+void Image::updateImage( ::fwData::Image::sptr image  )
+{
+    ::fwVtkIO::toVTKImage(image,m_imageData);
+
+    this->updateImageInfos(image);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Image::updateWindowing( ::fwData::Image::sptr image )
+{
+    m_lut->SetWindow(this->getWindow());
+    m_lut->SetLevel(this->getLevel());
+    m_lut->Modified();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Image::updateImageTransferFunction( ::fwData::Image::sptr image )
+{
+    this->updateTransferFunction(image, this->getSptr());
+    ::fwData::TransferFunction::sptr tf = this->getTransferFunction();
+
+    ::fwVtkIO::helper::TransferFunction::toVtkLookupTable( tf, m_lut, m_allowAlphaInTF, 256 );
+
+    m_lut->SetClamping( !tf->getIsClamped() );
+
+    this->setWindow(tf->getWindow());
+    this->setLevel(tf->getLevel());
+
+    this->updateWindowing(image);
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Image::updateImageOpacity()
+{
+    if (m_imagePortId>= 0)
+    {
+        ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+        if(img->getField( "TRANSPARENCY" ) )
+        {
+            ::fwData::Integer::sptr transparency = img->getField< ::fwData::Integer >( "TRANSPARENCY" );
+            m_imageOpacity = (100 - (*transparency) ) / 100.0 ;
+        }
+        if(img->getField( "VISIBILITY" ) )
+        {
+            ::fwData::Boolean::sptr visible = img->getField< ::fwData::Boolean >( "VISIBILITY" );
+            m_imageOpacity = (*visible)?m_imageOpacity:0.0;
+        }
+        vtkImageBlend *imageBlend = vtkImageBlend::SafeDownCast(m_imageRegister);
+        imageBlend->SetOpacity(m_imagePortId, m_imageOpacity);
+        OSLM_TRACE( "vtkImageBlend " << this->m_imageRegisterId << " opacity :" << m_imagePortId << "," << m_imageOpacity );
+        this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Image::buildPipeline( )
+{
+    SLM_TRACE_FUNC();
+    m_map2colors->SetInput(m_imageData);
+    m_map2colors->SetLookupTable(m_lut);
+    m_map2colors->SetOutputFormatToRGBA();
+
+    if (!m_imageRegisterId.empty())
+    {
+        m_imageRegister = this->getVtkObject(m_imageRegisterId);
+    }
+
+    vtkImageAlgorithm *algorithm  = vtkImageAlgorithm::SafeDownCast(m_imageRegister);
+    vtkImageData      *imageData  = vtkImageData::SafeDownCast(m_imageRegister);
+    vtkImageBlend     *imageBlend = vtkImageBlend::SafeDownCast(m_imageRegister);
+
+    SLM_ASSERT("Invalid vtk image register", algorithm||imageData||imageBlend );
+    if (imageBlend)
+    {
+        SLM_TRACE("Register is a vtkImageBlend");
+        if (m_imagePortId < 0)
+        {
+            m_imagePortId = imageBlend->GetNumberOfInputConnections(0);
+            imageBlend->AddInputConnection(m_map2colors->GetOutputPort());
+            OSLM_TRACE(this->getID() << ": Added image " << m_imagePortId << " on vtkImageBlend");
+        }
+    }
+    else if (algorithm)
+    {
+        SLM_TRACE("Register is a vtkImageAlgorithm");
+        algorithm->SetInputConnection(m_map2colors->GetOutputPort());
+    }
+    else if (imageData)
+    {
+        SLM_TRACE("Register is a vtkImageData");
+        m_map2colors->SetOutput(imageData);
+    }
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Image::destroyPipeline( )
+{
+    vtkImageAlgorithm *algorithm  = vtkImageAlgorithm::SafeDownCast(m_imageRegister);
+    vtkImageData      *imageData  = vtkImageData::SafeDownCast(m_imageRegister);
+    vtkImageBlend     *imageBlend = vtkImageBlend::SafeDownCast(m_imageRegister);
+
+    if (imageBlend)
+    {
+        if (m_imagePortId >= 0)
+        {
+            //Warning : only the removal of the last input connection in the image blend is safe.
+            imageBlend->RemoveInputConnection(0, m_map2colors->GetOutputPort());
+            m_imagePortId = -1;
+        }
+    }
+    else if (algorithm)
+    {
+        algorithm->RemoveInputConnection(0, m_map2colors->GetOutputPort());
+    }
+    else if (imageData)
+    {
+        m_map2colors->SetOutput(0);
+    }
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image3DCursor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image3DCursor.cpp
new file mode 100644
index 0000000..0ee088e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Image3DCursor.cpp
@@ -0,0 +1,214 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+
+
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Color.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/Base.hpp>
+
+#include <vtkActor.h>
+#include <vtkParametricBoy.h>
+#include <vtkParametricFunctionSource.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkSphereSource.h>
+#include <vtkTransform.h>
+
+#include "fwRenderVTK/vtk/Helpers.hpp"
+
+#include "visuVTKAdaptor/Image3DCursor.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Image3DCursor, ::fwData::Image ) ;
+
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Image3DCursor::Image3DCursor() throw() : m_priority(.6)
+{
+    ////handlingEventOff();
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+    //addNewHandledEvent( "NEW_SPHERE_CONFIG" );
+}
+
+//------------------------------------------------------------------------------
+
+Image3DCursor::~Image3DCursor() throw()
+{}
+
+//------------------------------------------------------------------------------
+void Image3DCursor::setVisibility( bool visibility )
+{
+    m_cursorActor->SetVisibility(visibility);
+    this->setVtkPipelineModified();
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::doStart() throw(fwTools::Failed)
+{
+    m_cursorPolyData = vtkSmartPointer<vtkPolyData>::New();
+    m_cursorMapper   = vtkSmartPointer<vtkPolyDataMapper>::New();
+    m_cursorActor    = vtkSmartPointer<vtkActor>::New();
+
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+
+    if ( img->getField("IMAGE3DCURSOR_RADIUS") && img->getField("IMAGE3DCURSOR_COLOR") )
+    {
+        ::fwData::Float::sptr radius = img->getField< ::fwData::Float >("IMAGE3DCURSOR_RADIUS");
+        ::fwData::Color::sptr color = img->getField< ::fwData::Color >("IMAGE3DCURSOR_COLOR");
+
+        this->buildPolyData(radius->value());
+        m_cursorActor->GetProperty()->SetColor( color->red(), color->green(), color->blue());
+    }
+    else
+    {
+        this->buildPolyData();
+        m_cursorActor->GetProperty()->SetColor(1,1,1);
+    }
+
+    m_cursorMapper->SetInput( m_cursorPolyData );
+    m_cursorActor->SetMapper(m_cursorMapper);
+
+    if(!this->getTransformId().empty())
+    {
+        m_cursorActor->SetUserTransform(this->getTransform());
+    }
+    this->addToRenderer(m_cursorActor);
+    doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    int index[3] = {
+        *m_sagittalIndex,
+        *m_frontalIndex,
+        *m_axialIndex
+    };
+    double center[3];
+    sliceIndexToWorld(index, center);
+    this->updateCursorPosition(center);
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::doStop() throw(fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+    m_cursorPolyData = 0;
+    m_cursorMapper   = 0;
+    m_cursorActor    = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+    {
+        ::fwComEd::ImageMsg::dynamicConstCast(msg)->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+        int index[3] = {
+            *m_sagittalIndex,
+            *m_frontalIndex,
+            *m_axialIndex
+        };
+        double center[3];
+        sliceIndexToWorld(index, center);
+        this->updateCursorPosition(center);
+    }
+
+    if ( msg->hasEvent( "NEW_SPHERE_CONFIG" ) )
+    {
+        ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+        ::fwData::Float::sptr radius = img->getField< ::fwData::Float >("IMAGE3DCURSOR_RADIUS");
+        ::fwData::Color::sptr color = img->getField< ::fwData::Color >("IMAGE3DCURSOR_COLOR");
+
+        m_cursorActor->GetProperty()->SetColor( color->red(), color->green(), color->blue());
+        buildPolyData(radius->value());
+
+        m_cursorMapper->SetInput( m_cursorPolyData );
+        this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::updateCursorPosition( double world[3] )
+{
+    m_cursorActor->SetPosition(world);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Image3DCursor::buildPolyData(float radius)
+{
+    // point are stored Left,right,up,down
+    vtkSmartPointer<vtkSphereSource> polySource = vtkSmartPointer<vtkSphereSource>::New();
+    polySource->SetCenter(0.0, 0.0, 0.0);
+    polySource->SetRadius(radius);
+    polySource->SetPhiResolution(8);
+    polySource->SetThetaResolution(8);
+
+    //vtkSmartPointer<vtkParametricBoy> boyFunc = vtkSmartPointer<vtkParametricBoy>::New();
+    //vtkSmartPointer<vtkParametricFunctionSource> polySource = vtkSmartPointer<vtkParametricFunctionSource>::New();
+    //polySource->SetParametricFunction(boyFunc);
+
+    polySource->SetOutput(m_cursorPolyData);
+    polySource->Update();
+    //this->setVtkPipelineModified();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageLandmarks.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageLandmarks.cpp
new file mode 100644
index 0000000..db03abf
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageLandmarks.cpp
@@ -0,0 +1,321 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/PointListMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkAssemblyNode.h>
+#include <vtkAssemblyPath.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkCellPicker.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include "visuVTKAdaptor/ImageLandmarks.hpp"
+#include "visuVTKAdaptor/PointList.hpp"
+#include "visuVTKAdaptor/PointLabel.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImageLandmarks, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+void notifyRemoveLandMark( ::fwData::Image::sptr image, ::fwServices::IService* _service, ::fwData::Point::sptr point )
+{
+    SLM_ASSERT("NULL Service", _service);
+
+    ::fwComEd::PointListMsg::sptr msgPointList = ::fwComEd::PointListMsg::New();
+    msgPointList->addEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED, point );
+    ::fwData::PointList::sptr pointList = image->getField< ::fwData::PointList >(  ::fwComEd::Dictionary::m_imageLandmarksId );
+    ::fwServices::IEditionService::notify( _service->getSptr(), pointList, msgPointList);
+
+    ::fwComEd::ImageMsg::sptr msgLandmark = ::fwComEd::ImageMsg::New();
+    msgLandmark->addEvent( ::fwComEd::ImageMsg::LANDMARK, point );
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = image->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+    fwServicesNotifyMsgMacro( image->getLightID(), sig, msgLandmark );
+}
+
+//------------------------------------------------------------------------------
+
+class vtkPointDeleteCallBack : public vtkCommand
+{
+
+public :
+    static vtkPointDeleteCallBack *New( ::fwRenderVTK::IVtkAdaptorService *service)
+    { return new vtkPointDeleteCallBack(service); }
+
+    vtkPointDeleteCallBack( ::fwRenderVTK::IVtkAdaptorService *service )
+    : m_service(service),
+      m_picker( vtkCellPicker::New() ),
+      m_propCollection( vtkPropCollection::New() )
+    {
+        m_lastPos[0] = -1;
+        m_lastPos[1] = -1;
+        m_picker->PickFromListOn();
+        m_picker->SetTolerance(0.001);
+
+        m_display[2]=0.0;
+    }
+
+    ~vtkPointDeleteCallBack( )
+    {
+        m_picker->Delete();
+        m_picker = NULL;
+
+        m_propCollection->Delete();
+        m_propCollection = NULL;
+    }
+
+
+    void fillPickList()
+    {
+        m_picker->InitializePickList();
+        m_propCollection->RemoveAllItems();
+        m_service->getAllSubProps(m_propCollection);
+        m_propCollection->InitTraversal();
+
+        vtkProp *prop;
+
+        while ( (prop = m_propCollection->GetNextProp()) )
+        {
+            m_picker->AddPickList(prop);
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        int pos[2];
+        m_service->getInteractor()->GetLastEventPosition(pos);
+        OSLM_TRACE( "EventId: " << eventId);
+
+        if ( eventId == vtkCommand::RightButtonPressEvent )
+        {
+            std::copy(pos, pos+1, m_lastPos);
+            m_display[0] = pos[0];
+            m_display[1] = pos[1];
+
+            this->fillPickList();
+            if (m_picker->Pick( m_display , m_service->getRenderer() ) )
+            {
+                if(getSelectedPoint())
+                {
+                    SetAbortFlag(1);
+                }
+                else
+                {
+                    m_pickedPoint.reset();
+                    m_pickedPointList.reset();
+                }
+            }
+        }
+        else if ( (eventId == vtkCommand::RightButtonReleaseEvent ) && !m_pickedPoint.expired() && !m_pickedPointList.expired() && std::equal(pos, pos+1, m_lastPos) )
+        {
+            ::fwData::Image::sptr image = m_service->getObject< ::fwData::Image >();
+            ::fwData::PointList::PointListContainer::iterator itr = std::find( m_pickedPointList.lock()->getRefPoints().begin(), m_pickedPointList.lock()->getRefPoints().end(), m_pickedPoint.lock() );
+            if(itr != m_pickedPointList.lock()->getRefPoints().end())
+            {
+                ::fwData::Point::sptr point = *itr;
+                m_pickedPointList.lock()->getRefPoints().erase(itr);
+                notifyRemoveLandMark(image, m_service, point);
+            }
+        }
+    }
+    bool getSelectedPoint()
+    {
+        bool isFind = false;
+        vtkPropCollection *propc = m_picker->GetActors();
+        vtkProp *prop;
+
+        propc->InitTraversal();
+        while ( (prop = propc->GetNextProp()) )
+        {
+            m_pickedPoint = ::fwData::Point::dynamicCast(m_service->getAssociatedObject(prop,2));
+            m_pickedPointList = ::fwData::PointList::dynamicCast(m_service->getAssociatedObject(prop,1));
+
+            if( !m_pickedPoint.expired() && !m_pickedPointList.expired() )
+            {
+                ::fwData::PointList::PointListContainer::iterator itr = std::find( m_pickedPointList.lock()->getRefPoints().begin(), m_pickedPointList.lock()->getRefPoints().end(), m_pickedPoint.lock());
+                if(itr != m_pickedPointList.lock()->getRefPoints().end() )
+                {
+                    isFind = true;
+                    break;
+                }
+            }
+        }
+        return isFind;
+    }
+
+protected :
+    ::fwRenderVTK::IVtkAdaptorService *m_service;
+    vtkPicker * m_picker;
+    vtkPropCollection * m_propCollection;
+    double m_display[3];
+    int m_lastPos[2];
+    ::fwData::Point::wptr m_pickedPoint;
+    ::fwData::PointList::wptr m_pickedPointList;
+
+};
+
+//------------------------------------------------------------------------------
+
+ImageLandmarks::ImageLandmarks() throw():
+    m_rightButtonCommand(0),
+    m_needSubservicesDeletion(false)
+{
+    //addNewHandledEvent( ::fwComEd::ImageMsg::LANDMARK );
+}
+
+//------------------------------------------------------------------------------
+
+ImageLandmarks::~ImageLandmarks() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_rightButtonCommand = vtkPointDeleteCallBack::New(this);
+    this->getInteractor()->AddObserver( "RightButtonPressEvent" , m_rightButtonCommand, 1 );
+    this->getInteractor()->AddObserver( "RightButtonReleaseEvent" , m_rightButtonCommand, 1 );
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING ImageLandmarks **TODO**");
+    this->doStop();
+    this->doStart();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::doUpdate() throw(fwTools::Failed)
+{
+    // get PointList in image Field then install distance service if required
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::PointList::sptr landmarks;
+    bool isShown;
+    landmarks = image->getField< ::fwData::PointList >(  ::fwComEd::Dictionary::m_imageLandmarksId );
+    isShown = image->getField("ShowLandmarks", ::fwData::Boolean::New(true))->value();
+
+    if (!isShown || !landmarks || m_needSubservicesDeletion)
+    {
+        this->unregisterServices();
+        m_needSubservicesDeletion = false;
+    }
+
+    if( isShown && landmarks )
+    {
+        if ( ! landmarks->getPoints().empty() )
+        {
+            ::fwRenderVTK::IVtkAdaptorService::sptr servicePointList;
+            servicePointList = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( landmarks , "::visuVTKAdaptor::PointList");
+            SLM_ASSERT("servicePointList not instanced", servicePointList);
+
+            servicePointList->setPickerId( this->getPickerId() );
+            servicePointList->setRenderService( this->getRenderService() );
+            servicePointList->setAutoRender( this->getAutoRender() );
+            servicePointList->start();
+
+            this->registerService( servicePointList );
+
+
+            BOOST_FOREACH( ::fwData::Point::sptr point, landmarks->getRefPoints() )
+            {
+                ::fwRenderVTK::IVtkAdaptorService::sptr serviceLabel;
+                serviceLabel = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(point , "::visuVTKAdaptor::PointLabel");
+                SLM_ASSERT("serviceLabel not instanced", serviceLabel);
+                serviceLabel->setRenderService( this->getRenderService() );
+                serviceLabel->setAutoRender( this->getAutoRender() );
+                serviceLabel->start();
+                this->registerService( serviceLabel );
+            }
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    // update only if new LandMarks
+     ::fwComEd::ImageMsg::csptr imgMsg =  ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::LANDMARK ) )
+    {
+        m_needSubservicesDeletion = true; // to manage point deletion
+        doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::doStop() throw(fwTools::Failed)
+{
+    if ( m_rightButtonCommand ) // can be not instanciated (use of ImageLandmarks::show() )
+    {
+        this->getInteractor()->RemoveObserver(m_rightButtonCommand);
+        m_rightButtonCommand->Delete();
+        m_rightButtonCommand = 0;
+    }
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageLandmarks::show(bool b)
+{
+    if (b)
+    {
+        this->doStart();
+    }
+    else
+    {
+        this->doStop();
+    }
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageMultiDistances.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageMultiDistances.cpp
new file mode 100644
index 0000000..d179974
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageMultiDistances.cpp
@@ -0,0 +1,504 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include <sstream>
+#include <boost/assign/std/vector.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Vector.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkAssemblyNode.h>
+#include <vtkAssemblyPath.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkCellPicker.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkInteractorStyle.h>
+#include <vtkRenderWindow.h>
+#include <vtkCamera.h>
+
+#include "visuVTKAdaptor/ImageMultiDistances.hpp"
+#include "visuVTKAdaptor/Distance.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImageMultiDistances, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+class vtkDistanceDeleteCallBack : public vtkCommand
+{
+
+public :
+
+    static vtkDistanceDeleteCallBack * New( ImageMultiDistances * service )
+    {
+        return new vtkDistanceDeleteCallBack(service);
+    }
+
+    vtkDistanceDeleteCallBack( ImageMultiDistances *service )
+    : m_service(service),
+      m_picker( vtkCellPicker::New() ),
+      m_propCollection( vtkPropCollection::New() )
+    {
+        m_lastPos[0] = -1;
+        m_lastPos[1] = -1;
+        m_picker->PickFromListOn();
+        m_picker->SetTolerance(0.001);
+
+        m_display[2]=0.0;
+    }
+
+    void fillPickList()
+    {
+        m_picker->InitializePickList();
+        m_propCollection->RemoveAllItems();
+        m_service->getAllSubProps(m_propCollection);
+        m_propCollection->InitTraversal();
+
+        vtkProp *prop;
+
+        while ( (prop = m_propCollection->GetNextProp()) )
+        {
+            m_picker->AddPickList(prop);
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        int pos[2];
+        m_service->getInteractor()->GetLastEventPosition(pos);
+
+
+        if ( eventId == vtkCommand::RightButtonPressEvent )
+        {
+            std::copy(pos, pos+1, m_lastPos);
+        }
+        else if (   ( eventId == vtkCommand::RightButtonReleaseEvent ) ||
+                    (( eventId == vtkCommand::StartInteractionEvent) && std::equal(pos, pos+1, m_lastPos) ))
+        {
+            m_display[0] = pos[0];
+            m_display[1] = pos[1];
+
+
+            this->fillPickList();
+            if (m_picker->Pick( m_display , m_service->getRenderer() ) )
+            {
+                vtkPropCollection *propc = m_picker->GetActors();
+                vtkProp *prop;
+
+                propc->InitTraversal();
+                while ( (prop = propc->GetNextProp()) )
+                {
+                    ::fwData::PointList::sptr plist =
+                        ::fwData::PointList::dynamicCast(m_service->getAssociatedObject(prop,1));
+
+                    if(plist)
+                    {
+                        ::fwData::Image::sptr image = m_service->getObject< ::fwData::Image >();
+                        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+                        msg->addEvent( ::fwComEd::ImageMsg::DELETE_DISTANCE, plist );
+
+                        ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+                        sig = image->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+                        fwServicesNotifyMsgMacro( image->getLightID(), sig, msg );
+
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+protected :
+
+    ImageMultiDistances * m_service;
+    vtkPicker * m_picker;
+    vtkPropCollection * m_propCollection;
+    double m_display[3];
+    int m_lastPos[2];
+
+};
+
+//------------------------------------------------------------------------------
+
+ImageMultiDistances::ImageMultiDistances() throw():
+    m_rightButtonCommand(0),
+    m_needSubservicesDeletion(false)
+{
+    //addNewHandledEvent( ::fwComEd::ImageMsg::DISTANCE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_DISTANCE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::DELETE_DISTANCE );
+}
+
+//------------------------------------------------------------------------------
+
+ImageMultiDistances::~ImageMultiDistances() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_rightButtonCommand = vtkDistanceDeleteCallBack::New(this);
+    this->getInteractor()->AddObserver( "RightButtonPressEvent" , m_rightButtonCommand, 1 );
+    this->getInteractor()->AddObserver( "RightButtonReleaseEvent" , m_rightButtonCommand, 1 ); // jamais reçu quand TrackBallCameraStyle activé (GrabFocus)
+    this->getInteractor()->AddObserver( "StartInteractionEvent" , m_rightButtonCommand, 0);    // par contre ce style lance un event d'interaction
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING ImageMultiDistances **TODO**");
+    this->doStop();
+    this->doStart();
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Color::sptr generateColor()
+{
+    //using namespace boost::assign; // bring 'operator+=()' for vector into scope
+    using namespace fwData;
+
+    static std::vector< Color::sptr > colors;
+    static std::vector< Color::sptr >::iterator current;
+    if ( colors.empty() )
+    {
+        Color::sptr magenta = Color::New();
+        magenta->setRGBA( 1, 0, 1);
+        colors.push_back( magenta );
+
+        Color::sptr cyan = Color::New();
+        cyan->setRGBA(0, 1, 1);
+        colors.push_back( cyan );
+
+        Color::sptr orange = Color::New();
+        orange->setRGBA(  1, 0.647, 0);
+        colors.push_back( orange );
+
+        Color::sptr violet = Color::New();
+        violet->setRGBA( .5, 0.26, 1);
+        colors.push_back( violet );
+
+        Color::sptr vertpomme = Color::New();
+        vertpomme->setRGBA( .65, 1 , 0);
+        colors.push_back( vertpomme );
+
+        Color::sptr jaune = Color::New();
+        jaune->setRGBA( 1, 1, 0);
+        colors.push_back( jaune );
+
+//        colors +=   Color::New( 1, 0, 1), // magenta
+//                    Color::New( 0, 1, 1), // cyan
+//                    Color::New( 1, 0.647, 0 ), // orange
+//                    Color::New( .5, 0.26, 1 ), // violet
+//                    Color::New( .65, 1 , 0), // vert pomme
+//                    Color::New( 1, 1, 0 ); // jaune
+        current= colors.begin();
+    }
+
+    if ( ++current == colors.end() )
+    {
+        current = colors.begin();
+    }
+
+    Color::sptr newColor;
+    newColor = ::fwData::Object::copy( *current );
+    return newColor;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::installSubServices( ::fwData::PointList::sptr pl )
+{
+    if ( pl->getPoints().size()>1 )
+    {
+        // SERVICE DISTANCE
+        ::fwRenderVTK::IVtkAdaptorService::sptr serviceDistance;
+        serviceDistance =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+        ( pl , "::visuVTKAdaptor::Distance");
+        SLM_ASSERT("serviceDistance not instanced", serviceDistance);
+
+        // install  Color Field if none
+        pl->setDefaultField( ::fwComEd::Dictionary::m_colorId, generateColor() );
+
+
+        // no mandatory to set picker id
+        serviceDistance->setPickerId( this->getPickerId() );
+        serviceDistance->setRenderId( this->getRenderId() );
+        serviceDistance->setRenderService( this->getRenderService() );
+        serviceDistance->setAutoRender( this->getAutoRender() );
+        serviceDistance->start();
+
+        // SERVICE POINT LIST
+        ::fwRenderVTK::IVtkAdaptorService::sptr servicePointList;
+        servicePointList =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+        ( pl , "::visuVTKAdaptor::PointList");
+        SLM_ASSERT("servicePointList not instanced", servicePointList);
+
+        servicePointList->setPickerId( this->getPickerId() );
+        servicePointList->setRenderId( this->getRenderId() );
+        servicePointList->setRenderService( this->getRenderService() );
+        servicePointList->setAutoRender(m_autoRender);
+        servicePointList->start();
+
+        this->registerService( serviceDistance );
+        this->registerService( servicePointList );
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Point::sptr ImageMultiDistances::screenToWorld(int X,int Y)
+{
+    double *world;
+    double display[3];
+    double worldTmp[4];
+    display[0]=X;
+    display[1]=Y;
+    display[2]=0;
+
+    if ( this->getPicker() && this->getPicker()->Pick( display , this->getRenderer() ) )
+    {
+        world = this->getPicker()->GetPickPosition();
+    }
+    else
+    {
+        // set temporaly the clipping around the focal point : see (1)
+        vtkCamera *camera = this->getRenderer()->GetActiveCamera();
+        double *clippingCamBackup = camera->GetClippingRange();
+        camera->SetClippingRange( camera->GetDistance() - 0.1 , camera->GetDistance() + 0.1 ); // set the clipping around the focal point
+
+        world=worldTmp;
+        // (1) this function use the near clipping range to estimate the world point (by defaut 0.1 from camera view). The clipping can be modified
+        // by insertion of new object. By setting previously the clipping to the focal point we ensure to not place new point a camera position
+        this->getInteractor()->GetInteractorStyle()->ComputeDisplayToWorld ( this->getRenderer(), X , Y , 0 , world); // RETURN HOMOGEN COORD !!!
+
+        // restore initial clipping
+        camera->SetClippingRange( clippingCamBackup );
+    }
+
+    ::fwData::Point::sptr pt = ::fwData::Point::New();
+    std::copy( world, world +3, pt->getRefCoord().begin() );
+    this->setVtkPipelineModified();
+    return pt;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::doUpdate() throw(fwTools::Failed)
+{
+    // get PointList in image Field then install distance service if required
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::Vector::sptr distanceField;
+    distanceField = image->getField< ::fwData::Vector >( ::fwComEd::Dictionary::m_imageDistancesId);
+
+    bool isShown;
+    isShown = image->getField("ShowDistances", ::fwData::Boolean::New(true))->value();
+
+    if ( !isShown || !distanceField  )
+    {
+        this->unregisterServices();
+    }
+
+    if( isShown && distanceField )
+    {
+
+        bool filtering = m_configuration->getAttributeValue("filter") == "true" ;
+        BOOST_FOREACH(::fwData::Object::sptr object, *distanceField)
+        {
+            ::fwData::PointList::sptr distance = ::fwData::PointList::dynamicCast(object);
+            ::fwData::String::sptr relatedService = distance->getField< ::fwData::String >(::fwComEd::Dictionary::m_relatedServiceId);
+
+            if ( filtering && relatedService )
+            {
+                std::string servId = relatedService->value();
+                if ( this->getRenderService()->getID() != servId )
+                {
+                    continue; // filtering ON + distance instanced from another RenderService
+                }
+            }
+            // test pass OK : install service
+            SLM_ASSERT( "Empty Point List for Distance !!!!", !distance->getCRefPoints().empty() );
+            this->installSubServices(distance);
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::removeDistance(::fwData::PointList::sptr plToRemove ) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->unregisterServices();
+
+    ::fwData::Vector::sptr distanceField;
+    distanceField = image->getField< ::fwData::Vector >( ::fwComEd::Dictionary::m_imageDistancesId);
+
+    ::fwData::Vector::IteratorType iter = std::find(distanceField->begin(), distanceField->end(), plToRemove);
+    if(iter != distanceField->end())
+    {
+        distanceField->getContainer().erase(iter);
+    }
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::createNewDistance( std::string sceneId ) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwData::PointList::sptr newPL = ::fwData::PointList::New();
+
+    newPL->setField( ::fwComEd::Dictionary::m_relatedServiceId, ::fwData::String::New( sceneId ) );
+
+    ::fwData::Vector::sptr distanceField;
+    distanceField = image->setDefaultField< ::fwData::Vector >(::fwComEd::Dictionary::m_imageDistancesId, ::fwData::Vector::New());
+    distanceField->getContainer().push_back(newPL);
+
+    OSLM_INFO("DistanceField size: " << distanceField->size() );
+
+    int sizeX = this->getRenderer()->GetRenderWindow()->GetSize()[0];
+    int sizeY = this->getRenderer()->GetRenderWindow()->GetSize()[1];
+
+    SLM_ASSERT("invalid RenderWindow size",  sizeX>0 && sizeY>0 );
+    ::fwData::Point::sptr pt1 = this->screenToWorld(sizeX/3.0, sizeY/2.0);
+    ::fwData::Point::sptr pt2 = this->screenToWorld(2*sizeX/3.0, sizeY/2.0);
+
+    newPL->getRefPoints().push_back( pt1 );
+    newPL->getRefPoints().push_back( pt2 );
+
+    this->installSubServices(newPL);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    // update only if new LandMarks
+    ::fwComEd::ImageMsg::csptr imgMsg =  ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    std::string  sceneId =  getRenderService()->getID();
+
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::NEW_DISTANCE ) )
+    {
+        ::fwData::String::csptr dataInfo;
+        dataInfo = ::fwData::String::dynamicConstCast(imgMsg->getDataInfo(::fwComEd::ImageMsg::NEW_DISTANCE));
+        OSLM_FATAL_IF(" ImageMultiDistances::doUpdate with RenderService "
+                     <<  sceneId << "missing sceneId dataInfo !!!", !dataInfo);
+        if ( dataInfo->value() == sceneId )
+        {
+            this->createNewDistance( sceneId );
+            ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+            msg->addEvent( ::fwComEd::ImageMsg::DISTANCE );
+            ::fwServices::IEditionService::notify( this->getSptr(), image, msg );
+        }
+    }
+
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::DISTANCE ) )
+    {
+        ::fwData::String::csptr dataInfo;
+        dataInfo = ::fwData::String::dynamicConstCast(imgMsg->getDataInfo(::fwComEd::ImageMsg::DISTANCE));
+        // update only if the distance is added in this scene
+        // or if the service is not filtered
+        if ( !dataInfo || dataInfo->value() ==  this->getRenderService()->getID()
+                || m_configuration->getAttributeValue("filter") == "false")
+        {
+            this->doUpdate();
+        }
+    }
+
+    if ( imgMsg && imgMsg->hasEvent( ::fwComEd::ImageMsg::DELETE_DISTANCE ) )
+    {
+        ::fwData::PointList::csptr plToRemove;
+        plToRemove = ::fwData::PointList::dynamicConstCast(imgMsg->getDataInfo(::fwComEd::ImageMsg::DELETE_DISTANCE));
+        SLM_ASSERT( "No dataInfo for the PointList ",plToRemove );
+        this->removeDistance( ::boost::const_pointer_cast< ::fwData::PointList>(plToRemove) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::setNeedSubservicesDeletion( bool _needSubservicesDeletion)
+{
+    m_needSubservicesDeletion = _needSubservicesDeletion; // to manage point deletion
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::doStop() throw(fwTools::Failed)
+{
+    if ( m_rightButtonCommand ) // can be not instantiated (use of ImageMultiDistances::show() )
+    {
+        this->getInteractor()->RemoveObserver(m_rightButtonCommand);
+        m_rightButtonCommand->Delete();
+        m_rightButtonCommand = 0;
+    }
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageMultiDistances::show(bool showDistances)
+{
+    if(showDistances)
+    {
+        this->doStart();
+    }
+    else
+    {
+        this->doStop();
+    }
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagePickerInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagePickerInteractor.cpp
new file mode 100644
index 0000000..6ef2c8a
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagePickerInteractor.cpp
@@ -0,0 +1,304 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#include <boost/foreach.hpp>
+
+#include <vtkAbstractPropPicker.h>
+#include <vtkActor.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwComEd/InteractionMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwRenderVTK/vtk/Helpers.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "visuVTKAdaptor/ImagePickerInteractor.hpp"
+
+
+#define START_INTERACTION_EVENT vtkCommand::LeftButtonPressEvent
+#define STOP_INTERACTION_EVENT  vtkCommand::LeftButtonReleaseEvent
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImagePickerInteractor, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+class ImagePickerInteractorCallback : public vtkCommand
+{
+public:
+    static ImagePickerInteractorCallback *New()
+    { return new ImagePickerInteractorCallback(); }
+
+    ImagePickerInteractorCallback() :  m_caller(NULL), m_priority(-1)
+    {
+        m_picker = NULL;
+        this->PassiveObserverOn();
+    }
+
+    ~ImagePickerInteractorCallback()
+    {
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        assert(m_priority>=0);
+        SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+        SLM_ASSERT("m_picker not instanced", m_picker);
+
+        this->process(vtkRenderWindowInteractor::SafeDownCast(caller), eventId);
+    }
+
+    bool pickSomething()
+    {
+        int x,y;
+        double display[3];
+
+        m_adaptor->getInteractor()->GetEventPosition(x, y);
+        display[0] = x;
+        display[1] = y;
+        display[2] = 0;
+
+        return  m_picker->Pick( display , m_adaptor->getRenderer() );
+    }
+
+
+    void process(vtkRenderWindowInteractor *caller, unsigned long eventId) // from
+    {
+        SLM_ASSERT("bad vtk caller", caller);
+        m_caller = caller;
+
+        switch (eventId)
+        {
+            case vtkCommand::LeftButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_LEFT_DOWN);
+                break;
+            case vtkCommand::LeftButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_LEFT_UP);
+                break;
+            case vtkCommand::MiddleButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MIDDLE_DOWN);
+                break;
+            case vtkCommand::MiddleButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MIDDLE_UP);
+                break;
+            case vtkCommand::RightButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_RIGHT_DOWN);
+                break;
+            case vtkCommand::RightButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_RIGHT_UP);
+                break;
+            //case vtkCommand::EnterEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::);
+                //break;
+            //case vtkCommand::LeaveEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::);
+                //break;
+            //case vtkCommand::KeyPressEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::KEY_DOWN);
+                //break;
+            //case vtkCommand::KeyReleaseEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::KEY_UP);
+                //break;
+            case vtkCommand::MouseMoveEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MOVE);
+                break;
+            case vtkCommand::MouseWheelForwardEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELFORWARD_DOWN);
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELFORWARD_UP);
+                break;
+            case vtkCommand::MouseWheelBackwardEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELBACKWARD_DOWN);
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELBACKWARD_UP);
+                break;
+            default:
+                OSLM_ASSERT("Unknown vtk event: " << vtkCommand::GetStringFromEventId(eventId) ,0);
+        };
+
+    }
+
+
+    void notifyMsg(std::string event)
+    {
+        if ( this->pickSomething() )
+        {
+            double world[3] = {-1,0,0};
+            ::fwRenderVTK::vtk::getNearestPickedPosition(m_picker, m_adaptor->getRenderer(), world);
+            OSLM_TRACE("PICK" << world[0] << " ," << world[1] << " ," << world[2] );
+
+            ::fwComEd::InteractionMsg::sptr msg = ::fwComEd::InteractionMsg::New();
+
+            int index[3];
+            m_adaptor->worldToImageSliceIndex(world, index);
+            msg->setEventPoint(index[0], index[1], index[2]);
+            msg->setEvent(event);
+
+            OSLM_TRACE( "Key Ctrl : " << m_caller->GetControlKey() );
+            OSLM_TRACE( "Key Shift : " << m_caller->GetShiftKey() );
+            msg->setModifiersStatus( ::fwComEd::InteractionMsg::CTRL,  m_caller->GetControlKey());
+            msg->setModifiersStatus( ::fwComEd::InteractionMsg::SHIFT, m_caller->GetShiftKey());
+
+            m_adaptor->notifyEvent( msg );
+        }
+    }
+
+    void setAdaptor( ImagePickerInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *adaptor)
+    {
+        m_picker = adaptor;
+    }
+
+    void setPriority( float priority )
+    {
+        m_priority = priority;
+    }
+
+protected :
+    vtkRenderWindowInteractor *m_caller;
+    ImagePickerInteractor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    float    m_priority;
+
+};
+
+//------------------------------------------------------------------------------
+
+ImagePickerInteractor::ImagePickerInteractor() throw()
+    : m_priority(0.999)
+{
+    ////handlingEventOff();
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+}
+
+//------------------------------------------------------------------------------
+
+ImagePickerInteractor::~ImagePickerInteractor() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::doStart() throw(fwTools::Failed)
+{
+    ImagePickerInteractorCallback *observer = ImagePickerInteractorCallback::New();
+    observer->setAdaptor( ImagePickerInteractor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+    observer->setPriority(  m_priority );
+
+    m_interactionCommand = observer;
+
+    vtkRenderWindowInteractor *interactor = this->getInteractor();
+    interactor->AddObserver(vtkCommand::LeftButtonPressEvent    , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::LeftButtonReleaseEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MiddleButtonPressEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MiddleButtonReleaseEvent, m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::RightButtonPressEvent   , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::RightButtonReleaseEvent , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::EnterEvent              , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::LeaveEvent              , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::KeyPressEvent           , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::KeyReleaseEvent         , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseMoveEvent          , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseWheelForwardEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseWheelBackwardEvent , m_interactionCommand, m_priority);
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::doUpdate() throw(fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImagePickerInteractor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+        this->updateImageInfos(image);
+    }
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+    {
+        ::fwComEd::ImageMsg::dynamicConstCast(msg)->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::doStop() throw(fwTools::Failed)
+{
+    vtkRenderWindowInteractor *interactor = this->getInteractor();
+    interactor->RemoveObservers(vtkCommand::LeftButtonPressEvent    , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::LeftButtonReleaseEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MiddleButtonPressEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MiddleButtonReleaseEvent, m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::RightButtonPressEvent   , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::RightButtonReleaseEvent , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::EnterEvent              , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::LeaveEvent              , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::KeyPressEvent           , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::KeyReleaseEvent         , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseMoveEvent          , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseWheelForwardEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseWheelBackwardEvent , m_interactionCommand);
+
+    m_interactionCommand->Delete();
+    m_interactionCommand = NULL;
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagePickerInteractor::notifyEvent(::fwComEd::InteractionMsg::sptr msg)
+{
+    ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSeries.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSeries.cpp
new file mode 100644
index 0000000..9955a0d
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSeries.cpp
@@ -0,0 +1,207 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+
+#include "visuVTKAdaptor/ImageSeries.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImageSeries, ::fwMedData::ImageSeries );
+
+namespace visuVTKAdaptor
+{
+
+
+ImageSeries::ImageSeries() throw() :
+        m_allowAlphaInTF(false),
+        m_interpolation(false),
+        m_3dModeEnabled ( ::boost::logic::indeterminate ),
+        m_sliceMode(NegatoMPR::THREE_SLICES)
+
+{}
+
+//------------------------------------------------------------------------------
+
+ImageSeries::~ImageSeries() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    if (m_configuration->hasAttribute("mode"))
+    {
+        std::string value(m_configuration->getAttributeValue("mode"));
+        std::transform(value.begin(), value.end(), value.begin(), tolower);
+        OSLM_ASSERT("Sorry, bad value "<<value<<" for attribute mode.",
+                    value == "3d" || value == "2d");
+        this->set3dMode(value == "3d");
+    }
+    if (m_configuration->hasAttribute("slices"))
+    {
+        std::string value(m_configuration->getAttributeValue("slices"));
+        std::transform(value.begin(), value.end(), value.begin(), tolower);
+
+        if(value == "0")
+        {
+            this->setSliceMode(NegatoMPR::NO_SLICE);
+        }
+        else if(value == "1")
+        {
+            this->setSliceMode(NegatoMPR::ONE_SLICE);
+        }
+        else if(value == "3")
+        {
+            this->setSliceMode(NegatoMPR::THREE_SLICES);
+        }
+    }
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+        std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+        if(orientation == "axial" )
+        {
+            m_orientation = Z_AXIS;
+        }
+        else if(orientation == "frontal" )
+        {
+            m_orientation = Y_AXIS;
+        }
+        else if(orientation == "sagittal" )
+        {
+            m_orientation = X_AXIS;
+        }
+    }
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+    if(m_configuration->hasAttribute("tfalpha") )
+    {
+        this->setAllowAlphaInTF(m_configuration->getAttributeValue("tfalpha") == "yes");
+    }
+    if (m_configuration->hasAttribute("interpolation"))
+    {
+        this->setInterpolation(!(m_configuration->getAttributeValue("interpolation") == "off"));
+    }
+    if (m_configuration->hasAttribute("vtkimagesource"))
+    {
+        this->setVtkImageSourceId( m_configuration->getAttributeValue("vtkimagesource") );
+    }
+    this->parseTFConfig( m_configuration );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::doUpdate() throw(fwTools::Failed)
+{
+    ::fwMedData::ImageSeries::sptr series = this->getObject< ::fwMedData::ImageSeries >();
+
+    doStop();
+
+    ::fwData::Image::sptr image = series->getImage();
+
+    ::fwRenderVTK::IVtkAdaptorService::sptr service =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( image, "::visuVTKAdaptor::NegatoMPR" );
+    SLM_ASSERT("service not instanced", service);
+
+    service->setTransformId( this->getTransformId() );
+    service->setRenderId( this->getRenderId() );
+    service->setPickerId( this->getPickerId() );
+    service->setRenderService(this->getRenderService());
+    service->setAutoRender( this->getAutoRender() );
+    ::visuVTKAdaptor::NegatoMPR::sptr negato = ::visuVTKAdaptor::NegatoMPR::dynamicCast(service);
+    negato->set3dMode(this->is3dModeEnabled());
+    negato->setSliceMode(this->getSliceMode());
+    negato->setOrientation(this->getOrientation());
+    negato->setAllowAlphaInTF(m_allowAlphaInTF);
+    negato->setInterpolation(m_interpolation);
+    negato->setVtkImageSourceId(m_imageSourceId);
+    negato->parseTFConfig(m_configuration);
+    service->start();
+
+    this->registerService(service);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void  ImageSeries::setSliceMode(NegatoMPR::SliceMode sliceMode)
+{
+    if(m_sliceMode != sliceMode)
+    {
+        m_sliceMode = sliceMode;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+NegatoMPR::SliceMode ImageSeries::getSliceMode()
+{
+    return m_sliceMode;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::logic::tribool ImageSeries::is3dModeEnabled()
+{
+    return m_3dModeEnabled;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::set3dMode( bool enabled )
+{
+    m_3dModeEnabled = enabled;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSlice.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSlice.cpp
new file mode 100644
index 0000000..9013bde
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageSlice.cpp
@@ -0,0 +1,433 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/String.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkActor.h>
+#include <vtkCellArray.h>
+#include <vtkImageActor.h>
+#include <vtkImageBlend.h>
+#include <vtkImageData.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+
+#include "visuVTKAdaptor/ImageSlice.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImageSlice, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+ImageSlice::ImageSlice() throw()
+{
+    SLM_TRACE_FUNC();
+    m_imageActor = vtkImageActor::New();
+
+    m_imageSource = NULL;
+
+    m_planeOutlinePolyData = vtkPolyData::New();
+    m_planeOutlineMapper   = vtkPolyDataMapper::New();
+    m_planeOutlineActor    = vtkActor::New();
+
+    m_interpolation = true;
+
+    m_useImageTF = false;
+
+    // Manage events
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER              );
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE           );
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX         );
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE   );
+}
+
+//------------------------------------------------------------------------------
+
+ImageSlice::~ImageSlice() throw()
+{
+    SLM_TRACE_FUNC();
+    m_imageActor->Delete();
+    m_imageActor = NULL;
+
+    m_planeOutlineActor->Delete();
+    m_planeOutlineActor = NULL;
+
+    m_planeOutlineMapper->Delete();
+    m_planeOutlineMapper = NULL;
+
+    m_planeOutlinePolyData->Delete();
+    m_planeOutlinePolyData = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->addToRenderer(m_imageActor);
+    this->addToRenderer(m_planeOutlineActor);
+    this->addToPicker(m_imageActor);
+
+    m_connection = this->getCtrlImage()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if (!m_connection.expired())
+    {
+        m_connection.disconnect();
+    }
+    this->removeFromPicker(m_imageActor);
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::doSwap() throw(fwTools::Failed)
+{
+    if (!m_connection.expired())
+    {
+        m_connection.disconnect();
+    }
+    m_connection = this->getCtrlImage()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Image::sptr ImageSlice::getCtrlImage()
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    if (m_ctrlImage.expired())
+    {
+        if (!m_ctrlImageId.empty())
+        {
+            m_ctrlImage.reset();
+            ::fwData::Composite::iterator it = (*composite).find(m_ctrlImageId);
+            if (it != (*composite).end())
+            {
+                m_ctrlImage = ::fwData::Image::dynamicCast((*it).second);
+            }
+        }
+    }
+    SLM_ASSERT("Null control image", !m_ctrlImage.expired());
+    return m_ctrlImage.lock();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::doUpdate() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getCtrlImage();
+
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+    if (imageIsValid)
+    {
+        this->buildPipeline();
+        this->updateImage(image);
+        this->updateSliceIndex(image);
+        this->updateOutline();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = m_ctrlImage.lock();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if ( msg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS )
+         || msg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS )
+         || msg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS )
+         )
+    {
+        if (m_ctrlImage.expired() || m_ctrlImage.lock() != this->getCtrlImage())
+        {
+            if (!m_connection.expired())
+            {
+                m_connection.disconnect();
+            }
+            m_connection = m_ctrlImage.lock()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+        }
+        this->doUpdate();
+    }
+
+    if (imageIsValid)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            doUpdate();
+        }
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+        {
+            ::fwComEd::ImageMsg::dynamicConstCast(msg)->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+            this->updateSliceIndex(image);
+            this->updateOutline();
+        }
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ) && imageIsValid)
+        {
+            ::fwData::Object::csptr cObjInfo = msg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+            ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+            ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+            int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+            int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+            if( toSliceType == static_cast<int>(m_orientation) )
+            {
+                setOrientation( static_cast< Orientation >( fromSliceType ));
+                this->doUpdate();
+            }
+            else if(fromSliceType == static_cast<int>(m_orientation))
+            {
+                setOrientation( static_cast< Orientation >( toSliceType ));
+                this->doUpdate();
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::configuring() throw(fwTools::Failed)
+{
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+         std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+         if(orientation == "axial" )
+         {
+             m_orientation = Z_AXIS;
+         }
+         else if(orientation == "frontal" )
+         {
+             m_orientation = Y_AXIS;
+         }
+         else if(orientation == "sagittal" )
+         {
+             m_orientation = X_AXIS;
+         }
+    }
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+    if(m_configuration->hasAttribute("ctrlimage") )
+    {
+        this->setCtrlImageId( m_configuration->getAttributeValue("ctrlimage") );
+    }
+    if(m_configuration->hasAttribute("vtkimagesource") )
+    {
+        this->setVtkImageSourceId( m_configuration->getAttributeValue("vtkimagesource") );
+    }
+    if (m_configuration->hasAttribute("interpolation"))
+    {
+        this->setInterpolation(!(m_configuration->getAttributeValue("interpolation") == "off"));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::updateImage( ::fwData::Image::sptr image  )
+{
+    SLM_ASSERT("Null control image", !m_ctrlImage.expired());
+    this->updateImageInfos(image);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::updateSliceIndex( ::fwData::Image::sptr image )
+{
+    unsigned int axialIndex    = m_axialIndex->value();
+    unsigned int frontalIndex  = m_frontalIndex->value();
+    unsigned int sagittalIndex = m_sagittalIndex->value();
+
+    const unsigned int pos[3] = { sagittalIndex, frontalIndex, axialIndex  };
+    //int pos[3];
+    //pos[2]= axialIndex;
+    //pos[1]= frontalIndex;
+    //pos[0]= sagittalIndex;
+
+    this->setSlice( pos[ m_orientation], image );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::setSlice( int slice, ::fwData::Image::sptr image  )
+{
+    SLM_TRACE_FUNC();
+    int extent[6];
+    std::fill(  extent, extent+6, 0);
+    extent[1] = image->getSize()[0]-1;
+    extent[3] = image->getSize()[1]-1;
+    extent[5] = image->getSize()[2]-1;
+    extent[2*m_orientation]=slice;
+    extent[2*m_orientation+1]=slice;
+
+    OSLM_TRACE("DisplayExtent : " << " X min: " << extent[0] << " X max: " << extent[1] <<
+                " Y min: " << extent[2] << " Y max: " << extent[3] <<
+                " Z min: " << extent[4] << " Z max: " << extent[5]
+                );
+
+    m_imageActor->SetDisplayExtent( extent );
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSlice::buildPipeline( )
+{
+    SLM_TRACE_FUNC();
+
+    if (!m_imageSourceId.empty())
+    {
+        m_imageSource = this->getVtkObject(m_imageSourceId);
+    }
+
+    vtkImageAlgorithm *algorithm  = vtkImageAlgorithm::SafeDownCast(m_imageSource);
+    vtkImageData      *imageData  = vtkImageData::SafeDownCast(m_imageSource);
+    //vtkImageBlend     *imageBlend = vtkImageBlend::SafeDownCast(m_imageSource);
+
+    SLM_ASSERT("Invalid vtk image source", algorithm||imageData );
+    if (algorithm)
+    {
+        SLM_TRACE("Input is a vtkImageAlgorithm");
+        m_imageActor->SetInput(algorithm->GetOutput());
+        //if (imageBlend)
+        //{
+            //imageBlend->SetBlendModeToCompound();
+            //imageBlend->SetCompoundThreshold(0);
+        //}
+    }
+    else if (imageData)
+    {
+        SLM_TRACE("Input is a vtkImageData");
+        m_imageActor->SetInput(imageData);
+    }
+
+    if(!this->getTransformId().empty())
+    {
+        m_imageActor->SetUserTransform(this->getTransform());
+    }
+
+    m_imageActor->SetInterpolate(m_interpolation);
+
+    this->buildOutline();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+void ImageSlice::buildOutline()
+{
+    SLM_TRACE_FUNC();
+    vtkPoints* points   = vtkPoints::New(VTK_DOUBLE);
+    points->SetNumberOfPoints(4);
+    int i;
+    for (i = 0; i < 4; i++)
+    {
+        points->SetPoint(i,0.0,0.0,0.0);
+    }
+
+    vtkCellArray *cells = vtkCellArray::New();
+    cells->Allocate(cells->EstimateSize(4,2));
+    vtkIdType pts[2];
+    pts[0] = 3; pts[1] = 2;       // top edge
+    cells->InsertNextCell(2,pts);
+    pts[0] = 0; pts[1] = 1;       // bottom edge
+    cells->InsertNextCell(2,pts);
+    pts[0] = 0; pts[1] = 3;       // left edge
+    cells->InsertNextCell(2,pts);
+    pts[0] = 1; pts[1] = 2;       // right edge
+    cells->InsertNextCell(2,pts);
+
+    m_planeOutlinePolyData->SetPoints(points);
+    points->Delete();
+    points = NULL;
+    m_planeOutlinePolyData->SetLines(cells);
+    cells->Delete();
+    cells = NULL;
+
+    m_planeOutlineMapper = vtkPolyDataMapper::New();
+    m_planeOutlineMapper->SetInput( m_planeOutlinePolyData );
+    m_planeOutlineMapper->SetResolveCoincidentTopologyToPolygonOffset();
+    m_planeOutlineActor->SetMapper(m_planeOutlineMapper);
+    m_planeOutlineActor->PickableOff();
+    if(!this->getTransformId().empty())
+    {
+        m_planeOutlineActor->SetUserTransform(this->getTransform());
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+
+void ImageSlice::updateOutline()
+{
+    SLM_TRACE_FUNC();
+    static const int indexZ[12] = { 0,2,4, 1,2,4,  1,3,4 ,0,3,4 };
+    static const int indexY[12] = { 0,2,4, 1,2,4,  1,2,5 ,0,2,5 };
+    static const int indexX[12] = { 0,2,4, 0,2,5,  0,3,5 ,0,3,4 };
+    static const int *indexSet[3] = { indexX, indexY, indexZ  };
+    static double colors[3][3] = { {0.,0.,1.} , {0.,1.,0.}, {1.,0.,0.} };
+
+    double *extent = m_imageActor->GetBounds();
+    vtkPoints* points = m_planeOutlinePolyData->GetPoints();
+
+
+    const int *index = indexSet[ m_orientation ];
+    for ( int i=0; i < 4; ++i)
+    {
+        double pt[3];
+        pt[0] = extent[ *(index++) ];
+        pt[1] = extent[ *(index++) ];
+        pt[2] = extent[ *(index++) ];
+        points->SetPoint(i,pt);
+    }
+
+    points->GetData()->Modified();
+    m_planeOutlinePolyData->Modified();
+
+    m_planeOutlineActor->GetProperty()->SetColor( colors[m_orientation]);
+    this->setVtkPipelineModified();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageText.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageText.cpp
new file mode 100644
index 0000000..f919203
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImageText.cpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/format.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <vtkRenderer.h>
+#include <vtkTextActor.h>
+
+#include "visuVTKAdaptor/ImageText.hpp"
+
+#include <sstream>
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImageText, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+//-----------------------------------------------------------------------------
+
+ImageText::ImageText() throw()
+{
+    //this->installTFSelectionEventHandler(this);
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+    //this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+    //this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS );
+}
+
+//-----------------------------------------------------------------------------
+
+ImageText::~ImageText() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageText::doStart() throw(::fwTools::Failed)
+{
+    this->Text::doStart();
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->updateTransferFunction(image, this->getSptr());
+    this->installTFObserver( this->getSptr() );
+    this->doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageText::doStop() throw(fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->Text::doStop();
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageText::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->Text::configuring();
+
+    this->parseTFConfig( m_configuration );
+}
+
+
+//-----------------------------------------------------------------------------
+
+void ImageText::doUpdate() throw(::fwTools::Failed)
+{
+    std::stringstream ss;
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    if (::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+    {
+        ::fwComEd::helper::Image imageHelper(image);
+        unsigned int axialIndex    = m_axialIndex->value();
+        unsigned int frontalIndex  = m_frontalIndex->value();
+        unsigned int sagittalIndex = m_sagittalIndex->value();
+
+        int min = this->getLevel() - this->getWindow()/2.0;
+        int max = this->getLevel() + this->getWindow()/2.0;
+
+        double window = max - min;
+        double level = min + window*0.5;
+
+        ss <<  ( ::boost::format("[% 3li,% 3li]") % min % max ) << std::endl;
+        ss <<  ( ::boost::format("W:% 3lg L:% 3lg") % window % level ) << std::endl;
+        ss <<  ( ::boost::format("(% 4li,% 4li,% 4li): %s") % sagittalIndex % frontalIndex % axialIndex %
+                imageHelper.getPixelAsString(sagittalIndex, frontalIndex, axialIndex ));
+    }
+
+    this->setText(ss.str());
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageText::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    // update only if new LandMarks
+    ::fwComEd::ImageMsg::csptr imgMsg =  ::fwComEd::ImageMsg::dynamicConstCast( msg );
+    ::fwComEd::TransferFunctionMsg::csptr tfMsg =  ::fwComEd::TransferFunctionMsg::dynamicConstCast( msg );
+
+    if ( imgMsg )
+    {
+        if( imgMsg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ))
+        {
+            imgMsg->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+        }
+        this->doUpdate();
+    }
+    else  if ( tfMsg || this->upadteTFObserver(msg, this->getSptr()))
+    {
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageText::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->removeTFObserver();
+    this->updateImageInfos(image);
+    this->updateTransferFunction(image, this->getSptr());
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesBlend.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesBlend.cpp
new file mode 100644
index 0000000..295a232
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesBlend.cpp
@@ -0,0 +1,315 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkImageBlend.h>
+#include <vtkImageData.h>
+#include <vtkImageMapToColors.h>
+#include <vtkLookupTable.h>
+
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwMath/Compare.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include "visuVTKAdaptor/Image.hpp"
+#include "visuVTKAdaptor/ImagesBlend.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImagesBlend, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+ImagesBlend::ImagesBlend() throw()
+{
+    SLM_TRACE_FUNC();
+
+    // Manage events
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER                     );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE                  );
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS           );
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS         );
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS         );
+}
+
+//------------------------------------------------------------------------------
+
+ImagesBlend::~ImagesBlend() throw()
+{
+    SLM_TRACE_FUNC();
+
+    m_imageBlend = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Image register is empty", !m_imageRegisterId.empty());
+    m_imageBlend = vtkImageBlend::SafeDownCast(this->getVtkObject(m_imageRegisterId));
+
+    this->addImageAdaptors();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->removeImageAdaptors();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::doUpdate() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->removeImageAdaptors();
+    this->addImageAdaptors();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(msg);
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast(msg);
+
+    if (compositeMsg)
+    {
+        if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::ADDED_KEYS)
+                || compositeMsg->hasEvent(::fwComEd::CompositeMsg::REMOVED_KEYS)
+                || compositeMsg->hasEvent(::fwComEd::CompositeMsg::CHANGED_KEYS))
+        {
+            this->doUpdate();
+        }
+    }
+    else if (imageMsg)
+    {
+        SLM_ASSERT("msg subject is expired", !imageMsg->getSubject().expired() );
+        ::fwData::Image::sptr image = ::fwData::Image::dynamicCast(imageMsg->getSubject().lock());
+
+        if ( imageMsg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            if (! ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image)
+                || m_registeredImages.find(image->getID()) == m_registeredImages.end())
+            {
+                this->doUpdate();
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::configuring() throw(fwTools::Failed)
+{
+    assert(m_configuration->getName() == "config");
+
+    if(m_configuration->hasAttribute("vtkimageregister") )
+    {
+        this->setVtkImageRegisterId( m_configuration->getAttributeValue("vtkimageregister") );
+    }
+
+    std::vector< ::fwRuntime::ConfigurationElement::sptr > configs = m_configuration->find("image");
+    SLM_ASSERT("Missing tag 'image' ", !configs.empty());
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr element, configs)
+    {
+        SPTR(ImageInfo) info = ::boost::shared_ptr< ImageInfo >(new ImageInfo());
+        SLM_ASSERT("Missing attribute 'objectId'", element->hasAttribute("objectId"));
+        std::string objectId = element->getAttributeValue("objectId");
+
+        if(element->hasAttribute("opacity") )
+        {
+            info->m_imageOpacity = ::boost::lexical_cast<double>(element->getAttributeValue("opacity"));
+        }
+        if(element->hasAttribute("tfalpha") )
+        {
+            info->m_useTFAlfa = element->getAttributeValue("tfalpha") == "yes";
+        }
+        if(element->hasAttribute("selectedTFKey") )
+        {
+            info->m_selectedTFKey = element->getAttributeValue("selectedTFKey");
+        }
+        if(element->hasAttribute("tfSelectionFwID") )
+        {
+            info->m_tfSelectionFwID = element->getAttributeValue("tfSelectionFwID");
+        }
+
+        typedef std::pair< std::string, std::string > ImagesIdPair;
+        m_imageIds.push_back(objectId);
+        m_imagesInfo[objectId] = info;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool ImagesBlend::checkImageInformations()
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    ::fwData::Image::SizeType size;
+    ::fwData::Image::SpacingType spacing;
+    ::fwData::Image::OriginType origin;
+
+    bool haveSameInfo = true;
+
+    BOOST_FOREACH(std::string id, m_imageIds)
+    {
+        if (composite->find(id) != composite->end())
+        {
+            ::fwData::Image::sptr img = ::fwData::Image::dynamicCast((*composite)[id]);
+
+            bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( img );
+            if (imageIsValid)
+            {
+                if (size.empty() && spacing.empty() && origin.empty())
+                {
+                    size = img->getSize();
+                    spacing = img->getSpacing();
+                    origin = img->getOrigin();
+                }
+                else
+                {
+                    if (  size != img->getSize() ||
+                          !::fwMath::isContainerEqual< const ::fwData::Image::SpacingType >(spacing, img->getSpacing()) ||
+                          !::fwMath::isContainerEqual< const ::fwData::Image::OriginType >(origin, img->getOrigin()) )
+                    {
+                        OSLM_ERROR("imgA size : " << size[0] << " / " << size[1] << " / "<< size[2] );
+                        OSLM_ERROR("imgA spacing : " << spacing[0] << " / " << spacing[1] << " / "<< spacing[2] );
+                        OSLM_ERROR("imgA origin : " << origin[0] << " / " << origin[1] << " / "<< origin[2] );
+
+                        OSLM_ERROR("imgB size : " << img->getSize()[0] << " / " << img->getSize()[1] << " / "<< img->getSize()[2] );
+                        OSLM_ERROR("imgB spacing : " << img->getSpacing()[0] << " / " << img->getSpacing()[1] << " / "<< img->getSpacing()[2] );
+                        OSLM_ERROR("imgB origin : " << img->getOrigin()[0] << " / " << img->getOrigin()[1] << " / "<< img->getOrigin()[2] );
+
+                        haveSameInfo = false;
+                        std::string errorMsg = "Warning : images in blend have not the same";
+                        errorMsg += (size != img->getSize())?" size":"";
+                        errorMsg += (spacing != img->getSpacing())?" spacing":"";
+                        errorMsg += (origin != img->getOrigin())?" origin":"";
+                        errorMsg += ".\n Background image size, spacing and origin are use.";
+                        ::fwGui::dialog::MessageDialog::showMessageDialog("Images blending",
+                                errorMsg,
+                                ::fwGui::dialog::MessageDialog::WARNING);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    return haveSameInfo;
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::addImageAdaptors()
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    this->checkImageInformations();
+
+    BOOST_FOREACH(std::string id, m_imageIds)
+    {
+        if (composite->find(id) != composite->end())
+        {
+            ::fwData::Image::sptr img = ::fwData::Image::dynamicCast((*composite)[id]);
+
+            SPTR(ImageInfo) info = m_imagesInfo[id];
+
+            SLM_ASSERT("Sorry, '" << id << "' is not an image", img);
+
+            if (info->m_connections)
+            {
+                info->m_connections->disconnect();
+                info->m_connections.reset();
+            }
+
+            info->m_connections = ::fwServices::helper::SigSlotConnection::New();
+            info->m_connections->connect(img, this->getSptr(), this->getObjSrvConnections());
+
+            bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( img );
+            if (imageIsValid)
+            {
+                ::fwRenderVTK::IVtkAdaptorService::sptr imageAdaptor;
+                imageAdaptor = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( img, "::visuVTKAdaptor::Image");
+                imageAdaptor->setRenderService(this->getRenderService());
+                imageAdaptor->setRenderId( this->getRenderId() );
+                imageAdaptor->setPickerId( this->getPickerId() );
+                imageAdaptor->setTransformId( this->getTransformId() );
+                imageAdaptor->setAutoRender( this->getAutoRender() );
+
+                ::visuVTKAdaptor::Image::sptr IA;
+                IA = ::visuVTKAdaptor::Image::dynamicCast(imageAdaptor);
+                IA->setVtkImageRegister(m_imageBlend);
+                IA->setImageOpacity(info->m_imageOpacity);
+                IA->setAllowAlphaInTF(info->m_useTFAlfa);
+                IA->setSelectedTFKey( info->m_selectedTFKey );
+                IA->setTFSelectionFwID( info->m_tfSelectionFwID );
+
+                m_registeredImages[img->getID()] = imageAdaptor;
+                this->registerService(imageAdaptor);
+
+                imageAdaptor->start();
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesBlend::removeImageAdaptors()
+{
+    BOOST_REVERSE_FOREACH(std::string id, m_imageIds)
+    {
+        SPTR(ImageInfo) info = m_imagesInfo[id];
+
+        if ( info->m_connections)
+        {
+            info->m_connections->disconnect();
+            info->m_connections.reset();
+        }
+    }
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesProbeCursor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesProbeCursor.cpp
new file mode 100644
index 0000000..2f01066
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ImagesProbeCursor.cpp
@@ -0,0 +1,476 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/Base.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkAbstractPropPicker.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkCommand.h>
+
+#include <vtkTextActor.h>
+#include <vtkTextMapper.h>
+#include <vtkTextProperty.h>
+#include <vtkProperty.h>
+
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyData.h>
+#include <vtkCellArray.h>
+#include <vtkCellData.h>
+#include <vtkTransform.h>
+
+
+#include <fwRenderVTK/vtk/Helpers.hpp>
+
+#include "visuVTKAdaptor/ImageText.hpp"
+#include "visuVTKAdaptor/ImagesProbeCursor.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ImagesProbeCursor, ::fwData::Composite ) ;
+
+
+#define START_PROBE_EVENT vtkCommand::LeftButtonPressEvent
+#define STOP_PROBE_EVENT  vtkCommand::LeftButtonReleaseEvent
+
+
+namespace visuVTKAdaptor
+{
+
+
+
+class ImagesProbingCallback : public vtkCommand
+{
+public:
+    static ImagesProbingCallback *New()
+    { return new ImagesProbingCallback(); }
+
+    ImagesProbingCallback()
+        : m_priority(-1),
+          m_mouseMoveObserved(false)
+    {
+        m_picker = NULL;
+        this->PassiveObserverOff();
+    }
+
+    ~ImagesProbingCallback()
+    {
+
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        assert(m_priority>=0);
+        SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+        SLM_ASSERT("m_picker not instanced", m_picker);
+        if ( m_mouseMoveObserved || !m_adaptor->getInteractor()->GetShiftKey() )
+        {
+            if ( eventId == vtkCommand::MouseMoveEvent )
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                process();
+            }
+            else if ( eventId == START_PROBE_EVENT)
+            {
+                assert(m_mouseMoveObserved == false );
+                if ( pickSomething() )
+                {
+                    m_mouseMoveObserved = true;
+                    SetAbortFlag(1);
+                    m_adaptor->setVisibility(true);
+                    m_adaptor->StartImagesProbeCursor();
+                    process();
+                    m_adaptor->getInteractor()->AddObserver(vtkCommand::MouseMoveEvent, this, m_priority);
+                }
+            }
+            else if ( eventId == STOP_PROBE_EVENT && m_mouseMoveObserved)
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                m_adaptor->setVisibility(false);
+                m_adaptor->getInteractor()->RemoveObservers(vtkCommand::MouseMoveEvent, this);
+                m_mouseMoveObserved = false;
+            }
+        }
+    }
+
+    bool pickSomething()
+    {
+        int x,y;
+        double display[3];
+
+        m_adaptor->getInteractor()->GetEventPosition(x, y);
+        display[0] = x;
+        display[1] = y;
+        display[2] = 0;
+
+        return  m_picker->Pick( display , m_adaptor->getRenderer() );
+    }
+
+
+    void process() // from
+    {
+        double world[3] = {-1,0,0};
+        if ( pickSomething() )
+        {
+            ::fwRenderVTK::vtk::getNearestPickedPosition(m_picker, m_adaptor->getRenderer(), world);
+            OSLM_TRACE("PICK" << world[0] << " ," << world[1] << " ," << world[2] );
+            m_adaptor->updateView( world);
+        }
+        m_adaptor->updateView(world);
+    }
+
+    void setAdaptor( ImagesProbeCursor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *adaptor)
+    {
+        m_picker = adaptor;
+    }
+
+    void setPriority( float priority )
+    {
+        m_priority = priority;
+    }
+
+protected :
+    ImagesProbeCursor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    float    m_priority;
+
+    bool m_mouseMoveObserved;
+
+};
+
+//------------------------------------------------------------------------------
+
+ImagesProbeCursor::ImagesProbeCursor() throw()
+: m_priority(.6)
+, m_textActor(vtkActor2D::New())
+, m_textMapper(vtkTextMapper::New())
+, m_cursorPolyData( vtkPolyData::New() )
+, m_cursorMapper  ( vtkPolyDataMapper::New() )
+, m_cursorActor(    vtkActor::New() )
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+ImagesProbeCursor::~ImagesProbeCursor() throw()
+{
+    m_textMapper->Delete();
+    m_textActor->Delete();
+
+    m_cursorActor->Delete();
+    m_cursorActor = NULL;
+    m_cursorMapper->Delete();
+    m_cursorMapper = NULL;
+    m_cursorPolyData->Delete();
+}
+
+//------------------------------------------------------------------------------
+void ImagesProbeCursor::setVisibility( bool visibility )
+{
+    m_textActor->SetVisibility(visibility);
+    m_cursorActor->SetVisibility(visibility);
+    this->setVtkPipelineModified();
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+
+    std::vector< ::fwRuntime::ConfigurationElement::sptr > configs = m_configuration->find("image");
+    SLM_ASSERT("Missing tag 'image' ", !configs.empty());
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr element, configs)
+    {
+        SLM_ASSERT("Missing attribute 'objectId'", element->hasAttribute("objectId"));
+        std::string objectId = element->getAttributeValue("objectId");
+        std::string name = objectId;
+        if (element->hasAttribute("name"))
+        {
+            name = element->getAttributeValue("name");
+        }
+
+        m_imagesId.push_back(std::make_pair(objectId,name));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::buildTextActor()
+{
+    vtkTextProperty* textprop = m_textMapper->GetTextProperty();
+    textprop->SetColor(1,1,1);
+    textprop->SetFontFamilyToArial();
+    textprop->SetFontSize(20);
+    textprop->BoldOn();
+    textprop->ItalicOff();
+    textprop->ShadowOn();
+    textprop->SetJustificationToLeft();
+    textprop->SetVerticalJustificationToTop();
+
+    m_textActor->SetMapper( m_textMapper );
+
+    vtkCoordinate* coord = m_textActor->GetPositionCoordinate();
+    coord->SetCoordinateSystemToNormalizedViewport();
+    coord->SetValue(.01, .98);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::doStart() throw(fwTools::Failed)
+{
+    buildTextActor();
+    this->addToRenderer(m_textActor );
+
+    buildPolyData();
+    m_cursorMapper->SetInput( m_cursorPolyData );
+    m_cursorActor->SetMapper(m_cursorMapper);
+    m_cursorActor->GetProperty()->SetColor(1,0,0);
+    if(!this->getTransformId().empty())
+    {
+        m_cursorActor->SetUserTransform(this->getTransform());
+    }
+    this->addToRenderer(m_cursorActor);
+
+    ImagesProbingCallback *observer = ImagesProbingCallback::New();
+    observer->setAdaptor( ImagesProbeCursor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+    observer->setPriority(  m_priority );
+
+
+    m_vtkObserver = observer;
+
+    this->getInteractor()->AddObserver(START_PROBE_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(STOP_PROBE_EVENT, m_vtkObserver, m_priority);
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::doStop() throw(fwTools::Failed)
+{
+    this->getInteractor()->RemoveObservers(START_PROBE_EVENT, m_vtkObserver);
+    this->getInteractor()->RemoveObservers(STOP_PROBE_EVENT, m_vtkObserver);
+    m_vtkObserver->Delete();
+    m_vtkObserver = NULL;
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::StartImagesProbeCursor( )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::updateView( double world[3] )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    std::stringstream txt;
+
+    if (composite->find(m_imagesId.begin()->first) != composite->end())
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::dynamicCast((*composite)[m_imagesId.begin()->first]);
+        OSLM_ASSERT("Object '" << m_imagesId.begin()->first << "' must be an image", image);
+
+        if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+        {
+            this->updateImageInfos(image);
+
+            int index[3];
+            this->worldToImageSliceIndex( world, index );
+            OSLM_TRACE("index=" << index[0] << "," << index[1] << "," << index[2] );
+
+            if (    world[0] < image->getOrigin()[0] ||
+                    world[1] < image->getOrigin()[1] ||
+                    world[2] < image->getOrigin()[2] ||
+                    index[0]< 0 || index[1]< 0 || index[2]< 0 ||
+                    index[0]>= image->getSize()[0] ||
+                    index[1]>= image->getSize()[1] ||
+                    index[2]>= image->getSize()[2]
+            )
+            {
+                txt << "(---,---,---)" << std::endl;
+            }
+            else
+            {
+                ::fwComEd::helper::Image imageHelper(image);
+                txt << (::boost::format("(% 4li,% 4li,% 4li)") % index[0] % index[1] % index[2] ).str() << std::endl;
+
+                // update polyData
+                double worldCross[4][3];
+                this->computeCrossExtremity( index, worldCross);
+
+                vtkPoints* points = m_cursorPolyData->GetPoints();
+                for ( int i=0; i < 4; ++i)
+                {
+                    OSLM_TRACE("p=" << worldCross[i][0] << "," << worldCross[i][2] << "," << worldCross[i][2] << "," );
+                    points->SetPoint(i,worldCross[i]);
+                }
+                m_cursorPolyData->Modified();
+            }
+        }
+    }
+
+    BOOST_FOREACH(ImagesIdPair element, m_imagesId)
+    {
+        if (composite->find(element.first) != composite->end())
+        {
+            ::fwData::Image::sptr image = ::fwData::Image::dynamicCast((*composite)[element.first]);
+            OSLM_ASSERT("Object '" << element.first << "' must be an image", image);
+
+            if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+            {
+                ::fwComEd::helper::Image imageHelper(image);
+                this->updateImageInfos(image);
+
+                int index[3];
+                this->worldToImageSliceIndex( world, index );
+                OSLM_TRACE("index=" << index[0] << "," << index[1] << "," << index[2] << "," );
+
+                if ( !( world[0] < image->getOrigin()[0] ||
+                        world[1] < image->getOrigin()[1] ||
+                        world[2] < image->getOrigin()[2]  ||
+                        index[0]< 0 || index[1]< 0 || index[2]< 0 ||
+                        index[0]>= image->getSize()[0] ||
+                        index[1]>= image->getSize()[1] ||
+                        index[2]>= image->getSize()[2])
+                )
+                {
+                    std::string greyLevel = imageHelper.getPixelAsString(index[0], index[1], index[2] );
+                    txt << element.second << " : " << greyLevel << std::endl;
+                }
+            }
+        }
+    }
+    m_textMapper->SetInput(txt.str().c_str());
+
+    this->setVtkPipelineModified();
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::computeCrossExtremity( const int probeSlice[3] , double worldCross[4][3] )
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    if (composite->find(m_imagesId.begin()->first) != composite->end())
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::dynamicCast((*composite)[m_imagesId.begin()->first]);
+        OSLM_ASSERT("Object '" << m_imagesId.begin()->first << "' must be an image", image);
+
+        unsigned int sliceIndex[3]; // the current sliceIndex
+
+        sliceIndex[2] = m_axialIndex->value();
+        sliceIndex[1] = m_frontalIndex->value();
+        sliceIndex[0] = m_sagittalIndex->value();
+
+        double probeWorld[3]; // probe index in world positioning system
+        for (int dim=0; dim<3; ++dim )
+        {
+            if ( probeSlice[dim]==sliceIndex[dim] ) // FIXME if (sliceIndex==probeWorld)
+            {
+                //setOrientation( (dim==2?2:(dim+1)%2) ); // KEEP Z but swap X,Y
+                this->setOrientation(dim);
+            }
+            probeWorld[dim] = probeSlice[dim]*image->getSpacing()[dim] + image->getOrigin().at(dim);;
+        }
+
+        for ( int p=0; p<2; ++p )
+        {
+            for (int dim=0; dim<3; ++dim )
+            {
+                worldCross[p][dim] = probeWorld[dim];
+                worldCross[p+2][dim] = probeWorld[dim];
+                if ( (dim + p + 1)%3 == m_orientation )
+                {
+                    worldCross[p][dim] = image->getOrigin().at(dim);
+                    ::fwData::Image::IndexType size = image->getSize().at(dim)-1;
+                    double spacing = image->getSpacing().at(dim);
+                    worldCross[p+2][dim] =  size * spacing + image->getOrigin().at(dim);
+                }
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImagesProbeCursor::buildPolyData()
+{
+    // point are stored Left,right,up,down
+    int nbPoints = 4;
+    vtkPoints* points   = vtkPoints::New(VTK_DOUBLE);
+    points->SetNumberOfPoints(nbPoints);
+    int i;
+    for (i = 0; i < nbPoints; i++)
+    {
+        points->SetPoint(i, 0.0, 0.0 , 0.0);
+    }
+
+    vtkCellArray *cells = vtkCellArray::New();
+    cells->Allocate(cells->EstimateSize(nbPoints,2));
+
+    vtkIdType pts[2];
+    pts[0]=0;pts[1]=2;
+    cells->InsertNextCell(2,pts);
+    pts[0]=1;pts[1]=3;
+    cells->InsertNextCell(2,pts);
+
+    m_cursorPolyData->SetPoints(points);
+    points->Delete();
+    m_cursorPolyData->SetLines(cells);
+    cells->Delete();
+    this->setVtkPipelineModified();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/InteractorStyle.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/InteractorStyle.cpp
new file mode 100644
index 0000000..8a7b9a4
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/InteractorStyle.cpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkInstantiator.h>
+#include <vtkInteractorStyleImage.h>
+
+#include "visuVTKAdaptor/InteractorStyle.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::InteractorStyle, ::fwData::Object ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+InteractorStyle::InteractorStyle() throw()
+{
+    m_interactorStyle = NULL;
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+InteractorStyle::~InteractorStyle() throw()
+{
+    SLM_ASSERT("InteractorStyle should be NULL", !m_interactorStyle);
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    assert(m_configuration->hasAttribute("style"));
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    m_configuredStyle = m_configuration->getAttributeValue("style");
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::doStart() throw(fwTools::Failed)
+{
+    vtkObject* objectStyle = vtkInstantiator::CreateInstance(m_configuredStyle.c_str());
+    vtkInteractorStyle *interactor = vtkInteractorStyle::SafeDownCast(objectStyle);
+    OSLM_ASSERT(
+            "InsteractorStyle adaptor is waiting "
+            "for a vtkInteractorStyle object, but '"
+            << m_configuredStyle <<
+            "' has been given.", interactor);
+    this->setInteractorStyle(interactor);
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::doStop() throw(fwTools::Failed)
+{
+    this->setInteractorStyle(NULL);
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle::setInteractorStyle(vtkInteractorStyle *interactor)
+{
+    if ( m_interactorStyle != NULL ){
+        m_interactorStyle->Delete();
+        m_interactorStyle = NULL;
+    }
+
+    m_interactorStyle = interactor;
+    this->getInteractor()->SetInteractorStyle(NULL);
+    this->getInteractor()->SetInteractorStyle(m_interactorStyle);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/LabeledPointList.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/LabeledPointList.cpp
new file mode 100644
index 0000000..036e0e5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/LabeledPointList.cpp
@@ -0,0 +1,299 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include <boost/foreach.hpp>
+
+#include <fwData/PointList.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/PointListMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkAssemblyNode.h>
+#include <vtkAssemblyPath.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkCellPicker.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include "visuVTKAdaptor/LabeledPointList.hpp"
+#include "visuVTKAdaptor/PointList.hpp"
+#include "visuVTKAdaptor/PointLabel.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::LabeledPointList, ::fwData::PointList ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+void notifyRemoveLandMark( ::fwData::Point::sptr point )
+{
+    ::fwComEd::PointListMsg::sptr msgPointList = ::fwComEd::PointListMsg::New();
+    msgPointList->addEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED, point );
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = point->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    fwServicesNotifyMsgMacro( point->getLightID(), sig, msgPointList );
+}
+
+//------------------------------------------------------------------------------
+
+class vtkLabeledPointDeleteCallBack : public vtkCommand
+{
+
+public :
+    static vtkLabeledPointDeleteCallBack *New( ::fwRenderVTK::IVtkAdaptorService *service)
+    { return new vtkLabeledPointDeleteCallBack(service); }
+
+    vtkLabeledPointDeleteCallBack( ::fwRenderVTK::IVtkAdaptorService *service )
+    : m_service(service),
+      m_picker( vtkCellPicker::New() ),
+      m_propCollection( vtkPropCollection::New() )
+    {
+        m_lastPos[0] = -1;
+        m_lastPos[1] = -1;
+        m_picker->PickFromListOn();
+        m_picker->SetTolerance(0.001);
+
+        m_display[2]=0.0;
+    }
+
+    ~vtkLabeledPointDeleteCallBack( )
+    {
+        m_picker->Delete();
+        m_picker = NULL;
+
+        m_propCollection->Delete();
+        m_propCollection = NULL;
+    }
+
+
+    void fillPickList()
+    {
+        m_picker->InitializePickList();
+        m_propCollection->RemoveAllItems();
+        m_service->getAllSubProps(m_propCollection);
+        m_propCollection->InitTraversal();
+
+        vtkProp *prop;
+
+        while ( (prop = m_propCollection->GetNextProp()) )
+        {
+            m_picker->AddPickList(prop);
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        int pos[2];
+        m_service->getInteractor()->GetLastEventPosition(pos);
+        OSLM_TRACE( "EventId: " << eventId);
+
+        if ( eventId == vtkCommand::RightButtonPressEvent )
+        {
+            std::copy(pos, pos+1, m_lastPos);
+            m_display[0] = pos[0];
+            m_display[1] = pos[1];
+
+            this->fillPickList();
+            if (m_picker->Pick( m_display , m_service->getRenderer() ) )
+            {
+                if(getSelectedPoint())
+                {
+                    SetAbortFlag(1);
+                }
+                else
+                {
+                    m_pickedPoint.reset();
+                    m_pickedPointList.reset();
+                }
+            }
+        }
+        else if ( (eventId == vtkCommand::RightButtonReleaseEvent ) && !m_pickedPoint.expired() && !m_pickedPointList.expired() && std::equal(pos, pos+1, m_lastPos) )
+        {
+            ::fwData::PointList::PointListContainer::iterator itr = std::find( m_pickedPointList.lock()->getRefPoints().begin(), m_pickedPointList.lock()->getRefPoints().end(), m_pickedPoint.lock() );
+            if(itr != m_pickedPointList.lock()->getRefPoints().end())
+            {
+                ::fwData::Point::sptr point = *itr;
+                m_pickedPointList.lock()->getRefPoints().erase(itr);
+                notifyRemoveLandMark( point );
+            }
+        }
+    }
+    bool getSelectedPoint()
+    {
+        bool isFind = false;
+        vtkPropCollection *propc = m_picker->GetActors();
+        vtkProp *prop;
+
+        propc->InitTraversal();
+        while ( (prop = propc->GetNextProp()) )
+        {
+            m_pickedPoint = ::fwData::Point::dynamicCast(m_service->getAssociatedObject(prop,2));
+            m_pickedPointList = ::fwData::PointList::dynamicCast(m_service->getAssociatedObject(prop,1));
+
+            if( !m_pickedPoint.expired() && !m_pickedPointList.expired() )
+            {
+                ::fwData::PointList::PointListContainer::iterator itr = std::find( m_pickedPointList.lock()->getRefPoints().begin(), m_pickedPointList.lock()->getRefPoints().end(), m_pickedPoint.lock());
+                if(itr != m_pickedPointList.lock()->getRefPoints().end() )
+                {
+                    isFind = true;
+                    break;
+                }
+            }
+        }
+        return isFind;
+    }
+
+protected :
+    ::fwRenderVTK::IVtkAdaptorService *m_service;
+    vtkPicker * m_picker;
+    vtkPropCollection * m_propCollection;
+    double m_display[3];
+    int m_lastPos[2];
+    ::fwData::Point::wptr m_pickedPoint;
+    ::fwData::PointList::wptr m_pickedPointList;
+
+};
+
+//------------------------------------------------------------------------------
+
+LabeledPointList::LabeledPointList() throw():
+    m_rightButtonCommand(0),
+    m_needSubservicesDeletion(false)
+{
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_ADDED );
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_MODIFIED );
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED );
+}
+
+//------------------------------------------------------------------------------
+
+LabeledPointList::~LabeledPointList() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    m_rightButtonCommand = vtkLabeledPointDeleteCallBack::New(this);
+    this->getInteractor()->AddObserver( "RightButtonPressEvent" , m_rightButtonCommand, 1 );
+    this->getInteractor()->AddObserver( "RightButtonReleaseEvent" , m_rightButtonCommand, 1 );
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING LabeledPointList **TODO**");
+    this->doStop();
+    this->doStart();
+}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::doUpdate() throw(fwTools::Failed)
+{
+    // get PointList in image Field then install distance service if required
+    ::fwData::PointList::sptr landmarks = this->getObject< ::fwData::PointList >();
+
+    if ( m_needSubservicesDeletion )
+    {
+        this->unregisterServices();
+        m_needSubservicesDeletion = false;
+    }
+
+    if ( ! landmarks->getPoints().empty() )
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr servicePointList;
+        servicePointList = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( landmarks , "::visuVTKAdaptor::PointList");
+        SLM_ASSERT("servicePointList not instanced", servicePointList);
+
+        servicePointList->setPickerId( this->getPickerId() );
+        servicePointList->setRenderService( this->getRenderService() );
+        servicePointList->setAutoRender( this->getAutoRender() );
+        servicePointList->start();
+
+        this->registerService( servicePointList );
+
+
+        BOOST_FOREACH( ::fwData::Point::sptr point, landmarks->getRefPoints() )
+        {
+            ::fwRenderVTK::IVtkAdaptorService::sptr serviceLabel;
+            serviceLabel = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(point , "::visuVTKAdaptor::PointLabel");
+            SLM_ASSERT("serviceLabel not instanced", serviceLabel);
+            serviceLabel->setRenderService( this->getRenderService() );
+            serviceLabel->setAutoRender( this->getAutoRender() );
+            serviceLabel->start();
+            this->registerService( serviceLabel );
+        }
+    }
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    // update only if new LandMarks
+    ::fwComEd::PointListMsg::csptr plMsg =  ::fwComEd::PointListMsg::dynamicConstCast( msg );
+    if ( plMsg &&
+                ( plMsg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_ADDED ) ||
+                  plMsg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED )||
+                  plMsg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_MODIFIED ) ) )
+    {
+        m_needSubservicesDeletion = true; // to manage point deletion
+        doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void LabeledPointList::doStop() throw(fwTools::Failed)
+{
+    if ( m_rightButtonCommand ) // can be not instanciated (use of LabeledPointList::show() )
+    {
+        this->getInteractor()->RemoveObserver(m_rightButtonCommand);
+        m_rightButtonCommand->Delete();
+        m_rightButtonCommand = 0;
+    }
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Material.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Material.cpp
new file mode 100644
index 0000000..6bbdd78
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Material.cpp
@@ -0,0 +1,199 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwTools/fwID.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwComEd/MaterialMsg.hpp>
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkProperty.h>
+
+#include "visuVTKAdaptor/Material.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Material, ::fwData::Material ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+Material::Material() throw()
+{
+    m_manageProperty = true;
+    m_property = vtkProperty::New();
+    //addNewHandledEvent( ::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+Material::~Material() throw()
+{
+    if (m_manageProperty){
+        m_property->Delete();
+    }
+    m_property = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void Material::setVtkProperty(vtkProperty *property)
+{
+    if (m_manageProperty){
+        m_property->Delete();
+        m_property = NULL;
+    }
+
+    if (property)
+    {
+        m_manageProperty = false;
+        m_property = property;
+    }
+    else
+    {
+        m_manageProperty = true;
+        m_property = vtkProperty::New();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+vtkProperty *Material::getVtkProperty()
+{
+    return m_property;
+}
+
+//------------------------------------------------------------------------------
+
+void Material::configuring() throw(fwTools::Failed)
+{
+
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+}
+
+//------------------------------------------------------------------------------
+
+void Material::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Material::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING Material");
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Material::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Material::sptr material = this->getObject < ::fwData::Material >();
+
+    updateMaterial( material );
+}
+
+//------------------------------------------------------------------------------
+
+void Material::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::MaterialMsg::csptr materialMsg = ::fwComEd::MaterialMsg::dynamicConstCast(msg);
+    if( materialMsg && materialMsg->hasEvent(::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED) )
+    {
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Material::doStop() throw(fwTools::Failed)
+{
+    //this->removeAllPropFromRenderer();
+    //this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Material::updateMaterial( ::fwData::Material::sptr material )
+{
+
+    ::fwData::Color::sptr color =  material->ambient();
+    m_property->SetColor( color->red(),
+            color->green(),
+            color->blue());
+
+    //3DVSP-like rendering
+    m_property->SetSpecularColor(1.,1.,1.);
+    m_property->SetSpecularPower(100.); //Shininess
+    m_property->SetAmbient(.05);
+    m_property->SetDiffuse(1.);
+    m_property->SetSpecular(1.);
+
+    m_property->SetOpacity( color->alpha() );
+
+    switch(material->getRepresentationMode())
+    {
+        case ::fwData::Material::MODE_SURFACE:
+            m_property->SetRepresentationToSurface();
+            m_property->EdgeVisibilityOff();
+            break;
+
+        case ::fwData::Material::MODE_EDGE:
+            m_property->SetRepresentationToSurface();
+            m_property->EdgeVisibilityOn();
+            break;
+
+        case ::fwData::Material::MODE_WIREFRAME:
+            m_property->SetRepresentationToWireframe();
+            break;
+
+        case ::fwData::Material::MODE_POINT:
+            m_property->SetRepresentationToPoints();
+            break;
+
+        default:
+            OSLM_ASSERT("Unknown material representation mode : " << material->getRepresentationMode(), false );
+    }
+
+    switch(material->getShadingMode())
+    {
+        /// Sets ShadingMode
+        case ::fwData::Material::MODE_PHONG:
+            m_property->SetInterpolationToPhong();
+            break;
+
+        case ::fwData::Material::MODE_GOURAUD:
+            m_property->SetInterpolationToGouraud();
+            break;
+
+        case ::fwData::Material::MODE_FLAT:
+            m_property->SetInterpolationToFlat();
+            break;
+
+        default:
+            OSLM_ASSERT("Unknown shading mode : " << material->getShadingMode(), false );
+    }
+
+    m_property->Modified();
+    this->setVtkPipelineModified();
+}
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Medical3DCamera.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Medical3DCamera.cpp
new file mode 100644
index 0000000..a9dbdb7
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Medical3DCamera.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkInteractorStyleImage.h>
+
+#include "visuVTKAdaptor/Medical3DCamera.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Medical3DCamera, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+std::map< std::string, ::fwComEd::helper::MedicalImageAdaptor::Orientation >
+Medical3DCamera::m_orientationConversion
+        = ::boost::assign::map_list_of(std::string("axial"),Z_AXIS)
+                                      (std::string("frontal"),Y_AXIS)
+                                      (std::string("sagittal"),X_AXIS);
+
+Medical3DCamera::Medical3DCamera() throw()
+{
+    //addNewHandledEvent( "CAMERA_ORIENTATION" );
+}
+
+//------------------------------------------------------------------------------
+
+Medical3DCamera::~Medical3DCamera() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+        std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+        SLM_ASSERT("Unknown orientation", m_orientationConversion.find(orientation) != m_orientationConversion.end());
+        m_orientation = m_orientationConversion[orientation];
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::doStart() throw(fwTools::Failed)
+{
+    m_camera = this->getRenderer()->GetActiveCamera();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->updateView();
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast( msg );
+
+    if ( imageMsg && imageMsg->hasEvent( "CAMERA_ORIENTATION") )
+    {
+        ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("CAMERA_ORIENTATION");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        ::fwData::String::csptr orientation = ::fwData::String::dynamicConstCast(dataInfo);
+        SLM_ASSERT("dataInfo is missing", orientation);
+        SLM_ASSERT("Unknown orientation", m_orientationConversion.find(orientation->value()) != m_orientationConversion.end());
+        m_orientation = m_orientationConversion[orientation->value()];
+        this->doUpdate();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::updateView()
+{
+    if(m_orientation == Z_AXIS )
+    {
+        this->resetAxialView();
+    }
+    else if(m_orientation == Y_AXIS )
+    {
+        this->resetFrontalView();
+    }
+    else if(m_orientation == X_AXIS )
+    {
+        this->resetSagittalView();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::resetSagittalView()
+{
+    m_camera->SetPosition(-1,0,0);
+    m_camera->SetFocalPoint(0,0,0);
+    m_camera->SetViewUp(0,0,1);
+    this->getRenderer()->ResetCamera();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::resetFrontalView()
+{
+    m_camera->SetPosition(0,-1,0);
+    m_camera->SetFocalPoint(0,0,0);
+    m_camera->SetViewUp(0,0,1);
+    this->getRenderer()->ResetCamera();
+    this->setVtkPipelineModified();
+
+}
+
+//------------------------------------------------------------------------------
+
+void Medical3DCamera::resetAxialView()
+{
+    m_camera->SetPosition(0,0,-1);
+    m_camera->SetFocalPoint(0,0,0);
+    m_camera->SetViewUp(0,-1,0);
+    this->getRenderer()->ResetCamera();
+    this->setVtkPipelineModified();
+
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Mesh.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Mesh.cpp
new file mode 100644
index 0000000..2cb43d9
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Mesh.cpp
@@ -0,0 +1,924 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/MaterialMsg.hpp>
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/Mesh.hpp>
+
+#include <vtkActor.h>
+#include <vtkCamera.h>
+#include <vtkCommand.h>
+#include <vtkDepthSortPolyData.h>
+#include <vtkMath.h>
+#include <vtkMatrix4x4.h>
+#include <vtkPicker.h>
+#include <vtkPlaneCollection.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+
+#include "visuVTKAdaptor/Material.hpp"
+#include "visuVTKAdaptor/MeshNormals.hpp"
+
+#include "visuVTKAdaptor/Transform.hpp"
+#include "visuVTKAdaptor/Mesh.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Mesh, ::fwData::Mesh ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+class MeshVtkCommand : public vtkCommand
+{
+public:
+    virtual void Stop() = 0;
+};
+
+
+//------------------------------------------------------------------------------
+
+class PlaneShifterCallback : public MeshVtkCommand
+{
+    public:
+
+    static PlaneShifterCallback *New( vtkPlane *src,  vtkPlane *dst, double factor = 1.)
+    { return new PlaneShifterCallback( src, dst, factor ); }
+
+    //--------------------------------------------------------------------------
+    PlaneShifterCallback( vtkPlane *src,  vtkPlane *dst, double factor )
+    : m_planeSrc(src),
+      m_planeDst(dst),
+      m_factor(factor)
+    {
+        m_planeSrc->Register(this);
+        m_planeDst->Register(this);
+        src->AddObserver(vtkCommand::ModifiedEvent, this);
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        m_planeSrc->RemoveObserver(this);
+        m_planeSrc->UnRegister(this);
+        m_planeDst->UnRegister(this);
+    }
+
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * )
+    {
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            double n[3];
+            double o[3];
+
+            m_planeSrc->GetNormal(n);
+            m_planeSrc->GetOrigin(o);
+
+            if (m_factor < 0)
+            {
+                for (int i = 0; i<3; i++)
+                {
+                    n[i] = -n[i];
+                }
+            }
+
+            m_planeDst->SetNormal( n );
+            m_planeDst->SetOrigin( o );
+            m_planeDst->Push( m_factor );
+            m_planeDst->Modified();
+        }
+
+    }
+
+    protected:
+        vtkPlane *m_planeSrc;
+        vtkPlane *m_planeDst;
+        double    m_factor;
+};
+
+
+
+class PlaneCollectionShifterCallback : public MeshVtkCommand
+{
+    public:
+
+    static PlaneCollectionShifterCallback *New(
+            vtkPlaneCollection *src,
+            vtkPlaneCollection *dst,
+            double factor = 1. )
+    { return new PlaneCollectionShifterCallback( src, dst, factor ); }
+
+    //--------------------------------------------------------------------------
+    PlaneCollectionShifterCallback(
+            vtkPlaneCollection *src,
+            vtkPlaneCollection *dst,
+            double factor)
+    : m_planeCollectionSrc(src),
+      m_planeCollectionDst(dst),
+      m_factor(factor)
+    {
+        m_planeCollectionSrc->Register(this);
+        m_planeCollectionDst->Register(this);
+        m_planeCollectionSrc->AddObserver(vtkCommand::ModifiedEvent, this);
+
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        this->Clear();
+        m_planeCollectionSrc->RemoveObserver(this);
+        m_planeCollectionSrc->UnRegister(this);
+        m_planeCollectionDst->UnRegister(this);
+    }
+
+    void Clear()
+    {
+        m_planeCollectionDst->RemoveAllItems();
+
+        BOOST_FOREACH( PlaneShifterCallback *psc, m_planeCallbacks )
+        {
+            psc->Stop();
+            psc->Delete();
+            psc=0;
+        }
+        m_planeCallbacks.clear();
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * )
+    {
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            this->Clear();
+
+            vtkPlane *plane = NULL;
+            for (  m_planeCollectionSrc->InitTraversal();
+                  (plane=m_planeCollectionSrc->GetNextItem());
+                )
+            {
+                vtkPlane *newPlane = vtkPlane::New();
+                m_planeCollectionDst->AddItem(newPlane);
+                m_planeCallbacks.push_back(PlaneShifterCallback::New(plane, newPlane, m_factor));
+                newPlane->Modified();
+                newPlane->Delete();
+            }
+        }
+    }
+
+    protected:
+        vtkPlaneCollection *m_planeCollectionSrc;
+        vtkPlaneCollection *m_planeCollectionDst;
+
+        std::vector< PlaneShifterCallback* > m_planeCallbacks;
+        double    m_factor;
+};
+
+
+
+class PlaneCollectionAdaptorStarter : public MeshVtkCommand
+{
+    public:
+
+    static PlaneCollectionAdaptorStarter *New(
+            ::visuVTKAdaptor::Mesh::sptr service,
+            vtkPlaneCollection *src,
+            double factor = 1. )
+    {
+        return new PlaneCollectionAdaptorStarter( service, src, factor );
+    }
+
+    //--------------------------------------------------------------------------
+    PlaneCollectionAdaptorStarter(
+            ::visuVTKAdaptor::Mesh::sptr service,
+            vtkPlaneCollection *src,
+            double factor)
+    : m_service(service),
+      m_planeCollectionSrc(src),
+      m_factor(factor)
+    {
+        m_planeCollectionSrc->Register(this);
+        m_planeCollectionSrc->AddObserver(vtkCommand::ModifiedEvent, this);
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        m_planeCollectionSrc->RemoveObserver(this);
+        m_planeCollectionSrc->UnRegister(this);
+        this->Clear();
+    }
+
+    void Clear()
+    {
+        BOOST_FOREACH( ::visuVTKAdaptor::Mesh::wptr adaptor, m_meshServices )
+        {
+            if (!adaptor.expired())
+            {
+                adaptor.lock()->stop();
+                ::fwServices::OSR::unregisterService(adaptor.lock());
+            }
+        }
+        m_meshServices.clear();
+
+        BOOST_FOREACH( PlaneShifterCallback *psc, m_planeCallbacks )
+        {
+            psc->Stop();
+            psc->Delete();
+            psc=0;
+        }
+        m_planeCallbacks.clear();
+
+        BOOST_FOREACH( vtkPlaneCollection *planeCol, m_planeCollections )
+        {
+            planeCol->Delete();
+        }
+        m_planeCollections.clear();
+
+        if (!m_service.expired())
+        {
+            m_service.lock()->setActorPropertyToUnclippedMaterial( false );
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * data)
+    {
+        ::visuVTKAdaptor::Mesh::sptr service;
+
+        if (m_service.expired())
+        {
+            this->Stop();
+            this->Delete();
+            return ;
+        }
+
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            service = m_service.lock();
+
+            this->Clear();
+
+            vtkPlane *plane = NULL;
+            for (  m_planeCollectionSrc->InitTraversal();
+                    (plane = m_planeCollectionSrc->GetNextItem());
+                )
+            {
+                vtkPlane *newPlane = vtkPlane::New();
+                m_planeCallbacks.push_back(PlaneShifterCallback::New(plane, newPlane, m_factor));
+
+                vtkPlaneCollection *newCollection = vtkPlaneCollection::New();
+                newCollection->AddItem(newPlane);
+
+
+                ::fwRenderVTK::IVtkAdaptorService::sptr meshService =
+                    ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+                            service->getObject(),
+                            "::visuVTKAdaptor::Mesh" );
+
+                ::visuVTKAdaptor::Mesh::sptr meshAdaptor = Mesh::dynamicCast(meshService);
+
+                meshAdaptor->setRenderService ( service->getRenderService()  );
+                meshAdaptor->setRenderId      ( service->getRenderId()       );
+                meshAdaptor->setPickerId      ( service->getPickerId()       );
+                meshAdaptor->setMaterial      ( service->getMaterial()       );
+                meshAdaptor->setVtkClippingPlanes( newCollection );
+                meshAdaptor->setAutoRender( service->getAutoRender() );
+
+                meshAdaptor->start();
+                meshAdaptor->updateVisibility ( service->getVisibility()     );
+
+                newPlane->Delete();
+
+                m_planeCollections.push_back(newCollection);
+                m_meshServices.push_back(meshAdaptor);
+            }
+
+            bool hasItems = !m_meshServices.empty();
+            service->setActorPropertyToUnclippedMaterial( hasItems );
+        }
+        else if ( eventId == vtkCommand::UserEvent )
+        {
+            BOOST_FOREACH( ::visuVTKAdaptor::Mesh::wptr adaptor, m_meshServices )
+            {
+                if (!adaptor.expired())
+                {
+                    adaptor.lock()->updateVisibility(*(bool*)data);
+                }
+            }
+        }
+    }
+
+    protected:
+
+        ::visuVTKAdaptor::Mesh::wptr m_service;
+
+        vtkPlaneCollection *m_planeCollectionSrc;
+        ::fwData::Mesh::sptr m_mesh;
+
+        std::vector< ::visuVTKAdaptor::Mesh::wptr > m_meshServices;
+
+        std::vector< PlaneShifterCallback* > m_planeCallbacks;
+        std::vector< vtkPlaneCollection* >   m_planeCollections;
+
+        double    m_factor;
+};
+
+
+//------------------------------------------------------------------------------
+
+Mesh::Mesh() throw()
+{
+    m_material               = ::fwData::Material::New();
+    m_unclippedPartMaterial  = ::fwData::Material::New();
+    m_unclippedPartMaterial->ambient()->setRGBA("#aaaaff44");
+
+    m_clippingPlanesId  = "";
+
+    m_showClippedPart   = false;
+    m_clippingPlanes    = 0;
+    m_actor             = 0;
+
+    m_polyData          = 0;
+    m_mapper            = vtkPolyDataMapper::New();
+
+    m_autoResetCamera   = true;
+
+    m_planeCollectionShifterCallback = 0;
+    m_servicesStarterCallback        = 0;
+
+    m_transform = vtkTransform::New();
+
+    //addNewHandledEvent (::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::NEW_MESH );
+    //addNewHandledEvent (::fwComEd::MeshMsg::VERTEX_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::POINT_COLORS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::CELL_COLORS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED );
+    //addNewHandledEvent ("SHOW_POINT_COLORS");
+    //addNewHandledEvent ("SHOW_CELL_COLORS");
+    //addNewHandledEvent ("HIDE_COLORS");
+}
+
+//------------------------------------------------------------------------------
+
+Mesh::~Mesh() throw()
+{
+    m_clippingPlanes = 0;
+
+    m_mapper->Delete();
+    m_mapper = 0;
+
+    m_transform->Delete();
+    m_transform = 0;
+
+    if(m_actor)
+    {
+        m_actor->Delete();
+        m_actor = 0;
+    }
+
+    if (m_polyData)
+    {
+        m_polyData->Delete();
+        m_polyData = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::configuring() throw(fwTools::Failed)
+{
+    assert(m_configuration->getName() == "config");
+
+    std::string color = m_configuration->getAttributeValue("color");
+    std::string unclippedColor = m_configuration->getAttributeValue("unclippedcolor");
+
+    m_material->ambient()->setRGBA(color.empty() ? "#ffffffff" : color );
+
+    m_unclippedPartMaterial->ambient()->setRGBA(unclippedColor.empty() ? "#aaaaff44" : unclippedColor );
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+
+    this->setPickerId    ( m_configuration->getAttributeValue ( "picker"    ) );
+    this->setRenderId    ( m_configuration->getAttributeValue ( "renderer"  ) );
+    this->setTransformId ( m_configuration->getAttributeValue ( "transform" ) );
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+    this->updateMesh( mesh );
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::MaterialMsg::csptr materialMsg = ::fwComEd::MaterialMsg::dynamicConstCast(msg);
+    ::fwComEd::MeshMsg::csptr meshMsg = ::fwComEd::MeshMsg::dynamicConstCast(msg);
+
+    if( materialMsg && materialMsg->hasEvent(::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED) )
+    {
+        this->updateOptionsMode();
+    }
+
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::NEW_MESH) )
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        this->updateMesh( mesh );
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::POINT_COLORS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        SLM_ASSERT("m_polyData not instanced", m_polyData);
+
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointColor(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::CELL_COLORS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        SLM_ASSERT("m_polyData not instanced", m_polyData);
+
+        ::fwVtkIO::helper::Mesh::updatePolyDataCellColor(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::VERTEX_MODIFIED) )
+    {
+       ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+       SLM_ASSERT("m_polyData not instanced", m_polyData);
+
+       ::fwVtkIO::helper::Mesh::updatePolyDataPoints(m_polyData, mesh);
+       this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointNormals(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        ::fwVtkIO::helper::Mesh::updatePolyDataCellNormals(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if (meshMsg && meshMsg->hasEvent("SHOW_POINT_COLORS"))
+    {
+        m_mapper->ScalarVisibilityOn();
+        m_mapper->SetScalarModeToUsePointData();
+        this->setVtkPipelineModified();
+    }
+    else if (meshMsg && meshMsg->hasEvent("SHOW_CELL_COLORS"))
+    {
+        m_mapper->ScalarVisibilityOn();
+        m_mapper->SetScalarModeToUseCellData();
+        this->setVtkPipelineModified();
+    }
+    else if (meshMsg && meshMsg->hasEvent("HIDE_COLORS"))
+    {
+        m_mapper->ScalarVisibilityOff();
+        this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::doStart() throw(fwTools::Failed)
+{
+    this->buildPipeline();
+    m_transformService.lock()->start();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::doStop() throw(fwTools::Failed)
+{
+    m_transformService.lock()->stop();
+    ::fwServices::OSR::unregisterService(m_transformService.lock());
+
+    this->removeAllPropFromRenderer();
+    if (this->getPicker())
+    {
+        this->removeFromPicker(m_actor);
+    }
+
+    removeNormalsService();
+    removePlaneCollectionShifterCommand();
+    removeServicesStarterCommand();
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    m_transformService.lock()->stop();
+    ::fwServices::OSR::unregisterService(m_transformService.lock());
+
+
+    ::fwRenderVTK::IVtkAdaptorService::sptr materialService = m_materialService.lock();
+    ::fwRenderVTK::IVtkAdaptorService::sptr unclippedPartMaterialService = m_unclippedPartMaterialService.lock();
+
+    this->setServiceOnMaterial(materialService, m_material);
+    this->setServiceOnMaterial(unclippedPartMaterialService , m_unclippedPartMaterial);
+
+    m_materialService              = materialService;
+    m_unclippedPartMaterialService = unclippedPartMaterialService;
+
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+    this->createTransformService();
+    m_transformService.lock()->start();
+    this->updateMesh( mesh );
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::createTransformService()
+{
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+    if(!this->getTransformId().empty())
+    {
+        m_transform->Concatenate(this->getTransform());
+    }
+
+    ::fwData::TransformationMatrix3D::sptr fieldTransform;
+    fieldTransform = mesh->setDefaultField("TransformMatrix", ::fwData::TransformationMatrix3D::New());
+
+    vtkTransform *vtkFieldTransform = vtkTransform::New();
+    vtkFieldTransform->Identity();
+    m_transformService = ::visuVTKAdaptor::Transform::dynamicCast(
+        ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+                fieldTransform,
+                "::visuVTKAdaptor::Transform"
+                )
+        );
+    assert(m_transformService.lock());
+    ::visuVTKAdaptor::Transform::sptr transformService = m_transformService.lock();
+
+    transformService->setRenderService ( this->getRenderService()  );
+    transformService->setRenderId      ( this->getRenderId()       );
+    transformService->setAutoRender    ( this->getAutoRender()     );
+
+    transformService->setTransform(vtkFieldTransform);
+    m_transform->Concatenate(vtkFieldTransform);
+    vtkFieldTransform->Delete();
+
+    m_actor->SetUserTransform(m_transform);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Material::sptr Mesh::getMaterial()
+{
+    return m_material;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Material::sptr Mesh::getUnclippedMaterial()
+{
+    return m_unclippedPartMaterial;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setActorPropertyToUnclippedMaterial(bool opt)
+{
+    ::visuVTKAdaptor::Material::sptr mat;
+
+    if (opt)
+    {
+        assert(!m_unclippedPartMaterialService.expired());
+        mat = ::visuVTKAdaptor::Material::dynamicCast(
+                m_unclippedPartMaterialService.lock()
+                );
+    }
+    else
+    {
+        assert(!m_materialService.expired());
+        mat = ::visuVTKAdaptor::Material::dynamicCast(
+                m_materialService.lock()
+                );
+    }
+
+    SLM_ASSERT("Invalid Material Adaptor", mat);
+
+    m_actor->SetProperty( mat->getVtkProperty() );
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setShowClippedPart(bool show)
+{
+    m_showClippedPart = show;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setClippingPlanesId(::fwRenderVTK::VtkRenderService::VtkObjectIdType id)
+{
+    m_clippingPlanesId = id;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setServiceOnMaterial(::fwRenderVTK::IVtkAdaptorService::sptr &srv, ::fwData::Material::sptr material)
+{
+    if (! srv)
+    {
+        srv = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+            material, "::visuVTKAdaptor::Material"
+            );
+        SLM_ASSERT("srv not instanced", srv);
+
+        srv->setRenderService(this->getRenderService());
+        srv->setAutoRender( this->getAutoRender() );
+        srv->start();
+        srv->update();
+        this->registerService(srv);
+    }
+    else if (srv->getObject< ::fwData::Material >() != material)
+    {
+        srv->swap(material);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setMaterial(::fwData::Material::sptr material)
+{
+    m_material = material;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setUnclippedPartMaterial(::fwData::Material::sptr material)
+{
+    m_unclippedPartMaterial = material;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::updateOptionsMode()
+{
+    if (m_material->getOptionsMode() == ::fwData::Material::MODE_NORMALS)
+    {
+        this->createNormalsService();
+    }
+    else
+    {
+        this->removeNormalsService();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::createNormalsService()
+{
+    if ( m_normalsService.expired() )
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+                ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(
+                        mesh,
+                        "::visuVTKAdaptor::MeshNormals"
+                );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setRenderService( this->getRenderService() );
+        service->setRenderId     ( this->getRenderId()      );
+        service->setPickerId     ( this->getPickerId()      );
+        service->setAutoRender   ( this->getAutoRender()    );
+        ::visuVTKAdaptor::MeshNormals::dynamicCast(service)->setPolyData( m_polyData );
+        service->start();
+
+        m_normalsService = service;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::removeNormalsService()
+{
+    if ( !m_normalsService.expired() )
+    {
+        m_normalsService.lock()->stop();
+        ::fwServices::OSR::unregisterService(m_normalsService.lock());
+        m_normalsService.reset();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::buildPipeline()
+{
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+    if (!m_clippingPlanesId.empty())
+    {
+        vtkObject          *o      = this->getVtkObject(m_clippingPlanesId);
+        vtkPlaneCollection *planes = vtkPlaneCollection::SafeDownCast(o);
+        this->setVtkClippingPlanes( planes );
+    }
+
+    ::fwRenderVTK::IVtkAdaptorService::sptr materialService;
+    ::fwRenderVTK::IVtkAdaptorService::sptr unclippedPartMaterialService;
+
+    this->setServiceOnMaterial(materialService, m_material);
+    this->setServiceOnMaterial(unclippedPartMaterialService , m_unclippedPartMaterial);
+
+    m_materialService              = materialService;
+    m_unclippedPartMaterialService = unclippedPartMaterialService;
+
+    if (!m_actor)
+    {
+        m_actor = this->newActor();
+        this->createTransformService();
+
+        this->addToRenderer(m_actor);
+        if (this->getPicker())
+        {
+            this->addToPicker(m_actor);
+        }
+    }
+
+    this->updateMesh( mesh );
+    this->updateOptionsMode();
+
+    setActorPropertyToUnclippedMaterial(false);
+
+    removeServicesStarterCommand();
+
+    if( m_clippingPlanes && m_showClippedPart )
+    {
+        createServicesStarterCommand();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::updateMesh( ::fwData::Mesh::sptr mesh )
+{
+    if (m_polyData)
+    {
+        m_polyData->Delete();
+        m_polyData = 0;
+    }
+    m_polyData = vtkPolyData::New();
+    ::fwVtkIO::helper::Mesh::toVTKMesh(mesh, m_polyData);
+    m_mapper->SetInput(m_polyData);
+
+    if (m_autoResetCamera)
+    {
+        this->getRenderer()->ResetCamera();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+vtkActor *Mesh::newActor()
+{
+    vtkActor *actor = vtkActor::New();
+    m_mapper->SetInput(m_polyData);
+
+    if (m_clippingPlanes)
+    {
+        vtkPlaneCollection *newClippingPlanes = vtkPlaneCollection::New();
+
+        removePlaneCollectionShifterCommand();
+
+        m_planeCollectionShifterCallback =
+            PlaneCollectionShifterCallback::New(m_clippingPlanes, newClippingPlanes, 2.);
+
+        m_mapper->SetClippingPlanes(newClippingPlanes);
+        newClippingPlanes->Delete();
+    }
+
+    actor->SetMapper(m_mapper);
+    this->setVtkPipelineModified();
+    return actor;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::updateVisibility( bool isVisible)
+{
+    if (m_actor)
+    {
+        m_actor->SetVisibility( isVisible );
+    }
+
+    if (m_servicesStarterCallback)
+    {
+        m_servicesStarterCallback->Execute(0, vtkCommand::UserEvent, &isVisible);
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+bool Mesh::getVisibility()
+{
+    bool visible = false;
+    if (m_actor)
+    {
+        visible = m_actor->GetVisibility() == 1;
+    }
+    return visible;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setVtkClippingPlanes(vtkPlaneCollection *planes)
+{
+    m_clippingPlanes = planes;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::removePlaneCollectionShifterCommand()
+{
+    if (m_planeCollectionShifterCallback)
+    {
+        m_planeCollectionShifterCallback->Stop();
+        m_planeCollectionShifterCallback->Delete();
+        m_planeCollectionShifterCallback = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::createServicesStarterCommand()
+{
+    if(!m_servicesStarterCallback)
+    {
+        ::visuVTKAdaptor::Mesh::sptr srv =
+            ::visuVTKAdaptor::Mesh::dynamicCast(
+                    this->getSptr()
+                    );
+        m_servicesStarterCallback = PlaneCollectionAdaptorStarter::New( srv, m_clippingPlanes, -1. );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::removeServicesStarterCommand()
+{
+    if(m_servicesStarterCallback)
+    {
+        m_servicesStarterCallback->Stop();
+        m_servicesStarterCallback->Delete();
+        m_servicesStarterCallback = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setAutoResetCamera(bool autoResetCamera)
+{
+    m_autoResetCamera = autoResetCamera;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshFactory.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshFactory.cpp
new file mode 100644
index 0000000..10457c7
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshFactory.cpp
@@ -0,0 +1,169 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkProperty.h>
+#include <vtkActor.h>
+#include <vtkDepthSortPolyData.h>
+#include <vtkPlaneCollection.h>
+
+#include <fwData/Material.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include "visuVTKAdaptor/MeshFactory.hpp"
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+MeshFactory::MeshFactory()
+{
+    m_clippingPlanes = 0;
+    m_actor = vtkActor::New();
+    m_normals = vtkPolyDataNormals::New();
+    m_normalsFeatureAngle = 180;
+}
+
+//------------------------------------------------------------------------------
+
+MeshFactory::~MeshFactory()
+{
+    m_clippingPlanes = 0;
+
+    m_normals->Delete();
+    m_normals = 0;
+
+    m_actor->Delete();
+    m_actor = 0;
+}
+
+//------------------------------------------------------------------------------
+
+vtkActor* MeshFactory::getActor()
+{
+    return m_actor;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshFactory::updateTriangulaMesh( ::fwData::TriangularMesh::sptr mesh)
+{
+    vtkPolyData * polyData       = ::fwVtkIO::toVTKMesh(mesh);
+    vtkPolyDataMapper  * mapper  = vtkPolyDataMapper::New();
+
+    m_normals->SetInput(polyData);
+    m_normals->ComputePointNormalsOn ();
+    m_normals->ComputeCellNormalsOff ();
+    m_normals->ConsistencyOn ();
+    m_normals->SplittingOn ();
+    m_normals->SetFeatureAngle(m_normalsFeatureAngle);
+
+
+    mapper->SetInputConnection(m_normals->GetOutputPort());
+
+    m_actor->SetMapper(mapper);
+
+    if (m_clippingPlanes)
+    {
+        mapper->RemoveAllClippingPlanes();
+        mapper->SetClippingPlanes(m_clippingPlanes);
+    }
+
+    mapper->Delete();
+    polyData->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshFactory::updateMaterial( ::fwData::Material::sptr material )
+{
+    if (m_actor)
+    {
+        ::fwData::Color::sptr color = material->ambient();
+
+        vtkProperty *property = m_actor->GetProperty();
+
+        property->SetColor( color->red(),
+                color->green(),
+                color->blue());
+
+        //3DVSP like rendering
+        property->SetSpecularColor(1.,1.,1.);
+        property->SetSpecularPower(100.); //Shininess
+        property->SetAmbient(.05);
+        property->SetDiffuse(1.);
+        property->SetSpecular(1.);
+//        property->SetInterpolationToPhong();
+
+
+        property->SetOpacity( color->alpha() );
+
+        /// Sets RepresentationMode
+        if(material->getRepresentationMode() == ::fwData::Material::MODE_SURFACE)
+        {
+            m_actor->GetProperty()->SetRepresentationToSurface();
+            m_actor->GetProperty()->EdgeVisibilityOff();
+        }
+        else if(material->getRepresentationMode() == ::fwData::Material::MODE_EDGE)
+        {
+            m_actor->GetProperty()->SetRepresentationToSurface();
+            m_actor->GetProperty()->EdgeVisibilityOn();
+        }
+        else if(material->getRepresentationMode() == ::fwData::Material::MODE_WIREFRAME)
+        {
+            m_actor->GetProperty()->SetRepresentationToWireframe();
+        }
+        else if(material->getRepresentationMode() == ::fwData::Material::MODE_POINT)
+        {
+            m_actor->GetProperty()->SetRepresentationToPoints();
+        }
+
+        /// Sets ShadingMode
+        if(material->getShadingMode() == ::fwData::Material::MODE_PHONG)
+        {
+            m_actor->GetProperty()->SetInterpolationToPhong();
+        }
+        else if(material->getShadingMode() == ::fwData::Material::MODE_GOURAUD)
+        {
+            m_actor->GetProperty()->SetInterpolationToGouraud();
+        }
+        else if(material->getShadingMode() == ::fwData::Material::MODE_FLAT)
+        {
+            m_actor->GetProperty()->SetInterpolationToFlat();
+        }
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshFactory::updateVisibility( bool isVisible)
+{
+    if (m_actor)
+    {
+        m_actor->SetVisibility( isVisible );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+void MeshFactory::setVtkClippingPlanes(vtkPlaneCollection *planes)
+{
+    m_clippingPlanes = planes;
+}
+
+
+
+
+} //namespace visuVTKAdaptor
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshNormals.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshNormals.cpp
new file mode 100644
index 0000000..de27383
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshNormals.cpp
@@ -0,0 +1,250 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+
+#include <vtkCellCenters.h>
+#include <vtkActor.h>
+#include <vtkArrowSource.h>
+#include <vtkGlyph3D.h>
+#include <vtkGlyphSource2D.h>
+#include <vtkMaskPoints.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+
+#include <fwData/Mesh.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwVtkIO/helper/Mesh.hpp>
+
+#include "visuVTKAdaptor/MeshNormals.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::MeshNormals, ::fwData::Mesh ) ;
+
+
+namespace visuVTKAdaptor
+{
+
+std::map< std::string, MeshNormals::NormalRepresentation >
+MeshNormals::m_normalRepresentationConversion
+        = ::boost::assign::map_list_of(std::string("POINT"), POINT_NORMAL)
+                                      (std::string("CELL"), CELL_NORMAL)
+                                      (std::string("NONE"), NONE);
+
+
+
+//------------------------------------------------------------------------------
+
+MeshNormals::MeshNormals() throw() : m_normalRepresentation(CELL_NORMAL)
+{
+    m_actor = vtkActor::New();
+
+    //addNewHandledEvent (::fwComEd::MeshMsg::NEW_MESH );
+    //addNewHandledEvent (::fwComEd::MeshMsg::VERTEX_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED );
+
+    //addNewHandledEvent ("SHOW_CELL_NORMALS");
+    //addNewHandledEvent ("SHOW_POINT_NORMALS");
+    //addNewHandledEvent ("HIDE_NORMALS");
+}
+
+//------------------------------------------------------------------------------
+
+MeshNormals::~MeshNormals() throw()
+{
+    m_actor->Delete();
+    m_actor = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    if(m_configuration->hasAttribute("normal") )
+    {
+        std::string normal = m_configuration->getExistingAttributeValue("normal");
+        SLM_ASSERT("Wrong normal representation '"<<normal << "' (required POINT, CELL or NONE)",
+                m_normalRepresentationConversion.find(normal) != m_normalRepresentationConversion.end());
+
+        m_normalRepresentation = m_normalRepresentationConversion[normal];
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::doStart() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doUpdate();
+    this->addToRenderer(this->getActor());
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::doSwap() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::doUpdate() throw( ::fwTools::Failed)
+{
+    this->updateMeshNormals();
+}
+
+//------------------------------------------------------------------------------
+
+vtkActor* MeshNormals::getActor()
+{
+    return m_actor;
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::setPolyData(vtkSmartPointer< vtkPolyData > polydata)
+{
+    if (polydata)
+    {
+        m_polyData = polydata;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::updateMeshNormals()
+{
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+    if(m_normalRepresentation == NONE)
+    {
+        m_actor->SetVisibility( false );
+    }
+    else
+    {
+        m_polyData = vtkSmartPointer< vtkPolyData >::New();
+        ::fwVtkIO::helper::Mesh::toVTKMesh(mesh, m_polyData);
+
+        vtkSmartPointer<vtkPolyDataAlgorithm> algo;
+        if(m_normalRepresentation == CELL_NORMAL)
+        {
+            algo = vtkSmartPointer<vtkCellCenters>::New();
+        }
+        else if(m_normalRepresentation == POINT_NORMAL)
+        {
+            vtkSmartPointer<vtkMaskPoints> ptMask = vtkSmartPointer<vtkMaskPoints>::New();
+            ptMask->SetOnRatio(1);
+            ptMask->RandomModeOn();
+            ptMask->SetMaximumNumberOfPoints(mesh->getNumberOfPoints());
+            algo = ptMask;
+        }
+
+        algo->SetInput(m_polyData);
+
+        //vtkSmartPointer<vtkArrowSource> arrow = vtkSmartPointer<vtkArrowSource>::New();
+        vtkSmartPointer<vtkGlyphSource2D> arrow = vtkSmartPointer<vtkGlyphSource2D>::New();
+
+        //arrow->SetGlyphTypeToVertex ();
+        //arrow->SetGlyphTypeToDash ();
+        //arrow->SetGlyphTypeToCross ();
+        //arrow->SetGlyphTypeToThickCross ();
+        //arrow->SetGlyphTypeToTriangle ();
+        //arrow->SetGlyphTypeToSquare ();
+        //arrow->SetGlyphTypeToCircle ();
+        //arrow->SetGlyphTypeToDiamond ();
+        arrow->SetGlyphTypeToArrow ();
+        //arrow->SetGlyphTypeToThickArrow ();
+        //arrow->SetGlyphTypeToHookedArrow ();
+        //arrow->SetGlyphTypeToEdgeArrow ();
+
+        arrow->FilledOff();
+
+        vtkSmartPointer<vtkGlyph3D> glyph = vtkSmartPointer<vtkGlyph3D>::New();
+        glyph->SetInputConnection(algo->GetOutputPort());
+        glyph->SetSource(arrow->GetOutput());
+        glyph->SetVectorModeToUseNormal();
+        glyph->SetScaleModeToScaleByVector();
+        glyph->SetScaleFactor(10.0);
+
+        vtkSmartPointer<vtkPolyDataMapper> glyphMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+        glyphMapper->SetInputConnection(glyph->GetOutputPort());
+
+        m_actor->SetVisibility( true );
+        this->getActor()->SetMapper(glyphMapper);
+        this->getActor()->GetProperty()->SetColor(1., 1., 1.);
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshNormals::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::MeshMsg::csptr meshMsg = ::fwComEd::MeshMsg::dynamicConstCast(msg);
+    ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::NEW_MESH))
+    {
+        this->updateMeshNormals();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::VERTEX_MODIFIED) )
+    {
+        ::fwVtkIO::helper::Mesh::updatePolyDataPoints(m_polyData, mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointNormals(m_polyData, mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointNormals(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::POINT_NORMALS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointNormals(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::MeshMsg::CELL_NORMALS_MODIFIED))
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject < ::fwData::Mesh >();
+        ::fwVtkIO::helper::Mesh::updatePolyDataCellNormals(m_polyData, mesh);
+        this->setVtkPipelineModified();
+    }
+
+    if( meshMsg && meshMsg->hasEvent("SHOW_CELL_NORMALS"))
+    {
+        m_normalRepresentation = CELL_NORMAL;
+        this->updateMeshNormals();
+    }
+
+    if( meshMsg && meshMsg->hasEvent("SHOW_POINT_NORMALS"))
+    {
+        m_normalRepresentation = POINT_NORMAL;
+        this->updateMeshNormals();
+    }
+
+    if( meshMsg && meshMsg->hasEvent("HIDE_NORMALS"))
+    {
+        m_normalRepresentation = NONE;
+        this->updateMeshNormals();
+    }
+}
+
+//------------------------------------------------------------------------------
+void MeshNormals::doStop() throw( ::fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshesBoxWidget.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshesBoxWidget.cpp
new file mode 100644
index 0000000..9067b7d
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/MeshesBoxWidget.cpp
@@ -0,0 +1,323 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#include <limits>
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/Mesh.hpp>
+
+#include <vtkPolyData.h>
+#include <vtkBoxRepresentation.h>
+#include <vtkBoxWidget2.h>
+#include <vtkTransform.h>
+#include <vtkCommand.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkActor.h>
+#include <vtkAssembly.h>
+#include <vtkProp3DCollection.h>
+
+#include "visuVTKAdaptor/MeshesBoxWidget.hpp"
+
+
+class MeshesBoxClallback : public ::vtkCommand
+{
+public:
+
+    static MeshesBoxClallback* New(::visuVTKAdaptor::MeshesBoxWidget* adaptor)
+    {
+        MeshesBoxClallback *cb = new MeshesBoxClallback;
+        cb->m_adaptor = adaptor;
+        return cb;
+    }
+
+    MeshesBoxClallback() : m_adaptor(NULL) {}
+    ~MeshesBoxClallback() {}
+
+    virtual void Execute( ::vtkObject* pCaller, unsigned long, void* )
+    {
+        m_adaptor->updateFromVtk();
+    }
+
+    ::visuVTKAdaptor::MeshesBoxWidget *m_adaptor;
+};
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::MeshesBoxWidget, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+//-----------------------------------------------------------------------------
+
+MeshesBoxWidget::MeshesBoxWidget() throw()
+{
+    //addNewHandledEvent(::fwComEd::CompositeMsg::ADDED_KEYS);
+    //addNewHandledEvent(::fwComEd::CompositeMsg::REMOVED_KEYS);
+    //addNewHandledEvent(::fwComEd::CompositeMsg::CHANGED_KEYS);
+    //addNewHandledEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED);
+
+    m_boxWidgetCommand = MeshesBoxClallback::New(this);
+}
+
+//-----------------------------------------------------------------------------
+
+MeshesBoxWidget::~MeshesBoxWidget() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::doStart() throw(fwTools::Failed)
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    m_assembly = vtkAssembly::New();
+
+    vtkBoxRepresentation *boxRep = vtkBoxRepresentation::New();
+    boxRep->SetPlaceFactor(1.0);
+
+    m_vtkBoxWidget = vtkBoxWidget2::New();
+    m_vtkBoxWidget->SetInteractor( this->getInteractor() );
+    m_vtkBoxWidget->SetRepresentation( boxRep );
+
+    m_vtkBoxWidget->AddObserver( ::vtkCommand::InteractionEvent, m_boxWidgetCommand );
+
+    this->updateMeshMapFromComposite(composite);
+    this->doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::doUpdate() throw(fwTools::Failed)
+{
+    m_assembly->GetParts()->RemoveAllItems();
+    if (!m_meshMap.empty())
+    {
+        BOOST_FOREACH(MeshMapType::value_type elt, m_meshMap)
+        {
+            m_assembly->AddPart( elt.second );
+        }
+        vtkBoxRepresentation *boxRep = vtkBoxRepresentation::SafeDownCast( m_vtkBoxWidget->GetRepresentation() );
+        boxRep->PlaceWidget(m_assembly->GetBounds());
+        m_vtkBoxWidget->On();
+    }
+    else
+    {
+        m_vtkBoxWidget->Off();
+    }
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::doStop() throw(fwTools::Failed)
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *composite)
+    {
+        ::fwData::Mesh::sptr mesh = ::fwData::Mesh::dynamicCast(elt.second);
+        ::fwData::TransformationMatrix3D::sptr fieldTransform;
+        fieldTransform = mesh->getField< ::fwData::TransformationMatrix3D > ("TransformMatrix");
+        m_connections[elt.first].disconnect();
+        m_connections.erase(elt.first);
+    }
+    m_meshMap.clear();
+
+    m_assembly->Delete();
+    m_assembly = 0;
+
+    m_vtkBoxWidget->Off();
+    m_vtkBoxWidget->RemoveObserver( m_boxWidgetCommand );
+    m_vtkBoxWidget->Delete();
+    m_vtkBoxWidget = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast( msg ) ;
+    if (compositeMsg)
+    {
+        if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::REMOVED_KEYS))
+        {
+            BOOST_FOREACH(::fwData::Composite::value_type elt, *compositeMsg->getRemovedKeys())
+            {
+                ::fwData::Mesh::sptr mesh = ::fwData::Mesh::dynamicCast(elt.second);
+                m_meshMap[elt.first]->Delete();
+                m_meshMap.erase(elt.first);
+
+                ::fwData::TransformationMatrix3D::sptr fieldTransform;
+                fieldTransform = mesh->getField< ::fwData::TransformationMatrix3D > ("TransformMatrix");
+                m_connections[elt.first].disconnect();
+                m_connections.erase(elt.first);
+            }
+        }
+        if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::ADDED_KEYS))
+        {
+            this->updateMeshMapFromComposite(compositeMsg->getAddedKeys());
+        }
+        if (compositeMsg->hasEvent(::fwComEd::CompositeMsg::CHANGED_KEYS))
+        {
+            this->updateMeshMapFromComposite(compositeMsg->getNewChangedKeys());
+        }
+        this->updateMeshTransform();
+        this->doUpdate();
+    }
+    else if (msg->hasEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED))
+    {
+        this->updateMeshTransform();
+        this->doUpdate();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::updateFromVtk()
+{
+    m_vtkBoxWidget->RemoveObserver( m_boxWidgetCommand );
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    vtkBoxRepresentation *boxRep = vtkBoxRepresentation::SafeDownCast( m_vtkBoxWidget->GetRepresentation() );
+    vtkTransform * boxTransform = vtkTransform::New();
+    boxRep->GetTransform(boxTransform);
+
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *composite)
+    {
+        ::fwData::Mesh::sptr triangularMesh = ::fwData::Mesh::dynamicCast(elt.second);
+        ::fwData::TransformationMatrix3D::sptr fieldTransform;
+        SLM_ASSERT("Triangular mesh must have a TransformMatrix field", triangularMesh->getField("TransformMatrix"));
+        fieldTransform = triangularMesh->getField< ::fwData::TransformationMatrix3D > ("TransformMatrix");
+
+        vtkTransform * transform = vtkTransform::New();
+        vtkLinearTransform * meshTransform = m_meshMap[elt.first]->GetUserTransform();
+        transform->Concatenate(boxTransform);
+        transform->Concatenate(meshTransform);
+
+        vtkMatrix4x4* mat = transform->GetMatrix();
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                fieldTransform->setCoefficient(lt,ct, mat->GetElement(lt,ct));
+            }
+        }
+
+        ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+        msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) ;
+        ::fwServices::IEditionService::notify(this->getSptr(), fieldTransform, msg);
+        transform->Delete();
+    }
+    m_vtkBoxWidget->AddObserver( ::vtkCommand::InteractionEvent, m_boxWidgetCommand );
+    boxTransform->Delete();
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::updateMeshMapFromComposite(::fwData::Composite::sptr composite)
+{
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *composite)
+    {
+        ::fwData::Mesh::sptr mesh = ::fwData::Mesh::dynamicCast(elt.second);
+        vtkSmartPointer<vtkPolyData> vtkMesh = vtkSmartPointer<vtkPolyData>::New();
+        ::fwVtkIO::helper::Mesh::toVTKMesh( mesh, vtkMesh);
+
+        ::fwData::TransformationMatrix3D::sptr fieldTransform;
+        fieldTransform = mesh->setDefaultField("TransformMatrix", ::fwData::TransformationMatrix3D::New());
+
+        vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
+        transform->Identity();
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                transform->GetMatrix()->SetElement(lt,ct, fieldTransform->getCoefficient(lt,ct));
+            }
+        }
+
+        vtkSmartPointer<vtkPolyDataMapper> meshMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+        meshMapper->SetInput(vtkMesh);
+
+        vtkActor *meshActor = vtkActor::New();
+        meshActor->SetMapper(meshMapper);
+        meshActor->SetUserTransform(transform);
+
+        if (m_meshMap.find(elt.first) == m_meshMap.end())
+        {
+            ::fwCom::Connection connection = fieldTransform->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->
+                                connect(this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+            m_connections[elt.first] = connection;
+        }
+
+        m_meshMap[elt.first] = meshActor;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshesBoxWidget::updateMeshTransform()
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    BOOST_FOREACH(::fwData::Composite::value_type elt, *composite)
+    {
+        ::fwData::Mesh::sptr mesh = ::fwData::Mesh::dynamicCast(elt.second);
+
+        ::fwData::TransformationMatrix3D::sptr fieldTransform;
+        SLM_ASSERT("Triangular mesh must have a TransformMatrix field", mesh->getField("TransformMatrix"));
+        fieldTransform = mesh->getField< ::fwData::TransformationMatrix3D > ("TransformMatrix");
+
+        vtkSmartPointer<vtkTransform> transform = vtkSmartPointer<vtkTransform>::New();
+        transform->Identity();
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                transform->GetMatrix()->SetElement(lt,ct, fieldTransform->getCoefficient(lt,ct));
+            }
+        }
+
+        vtkActor *meshActor = m_meshMap[elt.first];
+        meshActor->SetUserTransform(transform);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Model.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Model.cpp
new file mode 100644
index 0000000..0a2f3ca
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Model.cpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Model.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwComEd/ModelMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include "visuVTKAdaptor/Model.hpp"
+#include "visuVTKAdaptor/TriangularMesh.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Model, ::fwData::Model ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Model::Model() throw()
+{
+     //addNewHandledEvent( ::fwComEd::ModelMsg::NEW_MODEL );
+}
+
+//------------------------------------------------------------------------------
+
+Model::~Model() throw()
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void Model::configuring() throw(fwTools::Failed)
+{
+
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Model::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Model::doUpdate() throw(fwTools::Failed)
+{
+    doStop();
+
+    ::fwData::Model::sptr model = this->getObject< ::fwData::Model >();
+    ::fwData::Model::Container::iterator iter;
+    ::fwData::Model::Container mapModel = model->getCRefMap();
+
+    for (iter = mapModel.begin(); iter != mapModel.end(); ++iter)
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+                 ( iter->first, "::visuVTKAdaptor::TriangularMesh" );
+        SLM_ASSERT("AdaptorService", service);
+
+        ::visuVTKAdaptor::TriangularMesh::sptr trianAdaptor =
+                ::visuVTKAdaptor::TriangularMesh::dynamicCast(service);
+        SLM_ASSERT("dynamicCast TriangularMesh fails", trianAdaptor);
+
+        trianAdaptor->setMaterial(iter->second);
+        trianAdaptor->setTransformId( this->getTransformId() );
+        trianAdaptor->setRenderId( this->getRenderId() );
+        trianAdaptor->setPickerId( this->getPickerId() );
+        trianAdaptor->setRenderService(this->getRenderService());
+        trianAdaptor->setAutoRender( this->getAutoRender() );
+        trianAdaptor->start();
+
+        this->registerService(trianAdaptor);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Model::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Model::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Model::doReceive( ::fwServices::ObjectMsg::csptr _msg) throw(fwTools::Failed)
+{
+    ::fwComEd::ModelMsg::csptr msg = ::fwComEd::ModelMsg::dynamicConstCast(_msg);
+
+    if ( msg && msg->hasEvent( ::fwComEd::ModelMsg::NEW_MODEL ) )
+    {
+        doUpdate();
+    }
+}
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ModelSeries.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ModelSeries.cpp
new file mode 100644
index 0000000..93d8d1c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ModelSeries.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/op/Add.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwComEd/ModelSeriesMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+
+#include "visuVTKAdaptor/Reconstruction.hpp"
+#include "visuVTKAdaptor/ModelSeries.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ModelSeries, ::fwMedData::ModelSeries ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+ModelSeries::ModelSeries() throw()
+{
+    m_clippingPlanes = "";
+    m_autoResetCamera = true;
+}
+
+//------------------------------------------------------------------------------
+
+ModelSeries::~ModelSeries() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    this->setClippingPlanes( m_configuration->getAttributeValue("clippingplanes") );
+
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::doUpdate() throw(fwTools::Failed)
+{
+    ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >();
+
+    doStop();
+    bool showRec;
+    showRec = modelSeries->getField("ShowReconstructions", ::fwData::Boolean::New(true))->value();
+
+    BOOST_FOREACH( ::fwData::Reconstruction::sptr reconstruction, modelSeries->getReconstructionDB() )
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+                ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+        ( reconstruction, "::visuVTKAdaptor::Reconstruction" );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setTransformId( this->getTransformId() );
+        service->setRenderId( this->getRenderId() );
+        service->setPickerId( this->getPickerId() );
+        service->setRenderService(this->getRenderService());
+        service->setAutoRender( this->getAutoRender() );
+        ::visuVTKAdaptor::Reconstruction::sptr renconstructionAdaptor =
+                ::visuVTKAdaptor::Reconstruction::dynamicCast(service);
+        renconstructionAdaptor->setClippingPlanes( m_clippingPlanes );
+        renconstructionAdaptor->setAutoResetCamera(m_autoResetCamera);
+        service->start();
+        renconstructionAdaptor->setForceHide( !showRec );
+
+        this->registerService(service);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    if ( msg->hasEvent(::fwComEd::ModelSeriesMsg::SHOW_RECONSTRUCTIONS) )
+    {
+        ::fwMedData::ModelSeries::sptr modelSeries = this->getObject< ::fwMedData::ModelSeries >();
+        bool showRec;
+        showRec = modelSeries->getField("ShowReconstructions", ::fwData::Boolean::New(true))->value();
+
+        BOOST_FOREACH( ServiceVector::value_type service, m_subServices)
+        {
+            if(!service.expired())
+            {
+                ::visuVTKAdaptor::Reconstruction::sptr renconstructionAdaptor
+                 = ::visuVTKAdaptor::Reconstruction::dynamicCast(service.lock());
+                if (renconstructionAdaptor)
+                {
+                    renconstructionAdaptor->setForceHide( !showRec );
+                }
+            }
+        }
+
+        OSLM_INFO( "Receive event ShowReconstruction : " << showRec );
+        this->setVtkPipelineModified();
+    }
+    else if ( msg->hasEvent(::fwComEd::ModelSeriesMsg::ADD_RECONSTRUCTION) )
+    {
+        this->doUpdate();
+    }
+    else if ( msg->hasEvent(::fwComEd::ModelSeriesMsg::REMOVED_RECONSTRUCTIONS) )
+    {
+        this->doStop();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoMPR.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoMPR.cpp
new file mode 100644
index 0000000..bbf9324
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoMPR.cpp
@@ -0,0 +1,378 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include "visuVTKAdaptor/NegatoWindowingInteractor.hpp"
+#include "visuVTKAdaptor/NegatoOneSlice.hpp"
+#include "visuVTKAdaptor/NegatoMPR.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::NegatoMPR, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+NegatoMPR::NegatoMPR() throw() :
+        m_3dModeEnabled ( ::boost::logic::indeterminate ),
+        m_sliceMode(THREE_SLICES),
+        m_backupedSliceMode(THREE_SLICES)
+{
+    m_allowAlphaInTF = false;
+    m_interpolation  = true;
+
+    //addNewHandledEvent("SLICE_MODE");
+    //addNewHandledEvent("SCAN_SHOW");
+    //addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//------------------------------------------------------------------------------
+
+NegatoMPR::~NegatoMPR() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if ( imageIsValid)
+    {
+        if(m_subServices.empty())
+        {
+            doStart();
+        }
+        else
+        {
+            BOOST_FOREACH( ServiceVector::value_type service, m_subServices)
+            {
+                OSLM_ASSERT("sub services expired in service : " << this->getSptr()->getID(), !service.expired());
+                service.lock()->swap(image);
+                service.lock()->update();
+            }
+        }
+    }
+    else
+    {
+        doStop();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::doUpdate() throw(::fwTools::Failed)
+{
+    this->doStop();
+    if(!this->getSliceMode() == NO_SLICE)
+    {
+        if(this->getSliceMode() == ONE_SLICE)
+        {
+            this->addAdaptor("::visuVTKAdaptor::NegatoOneSlice", m_orientation);
+        }
+        else if(this->getSliceMode() == THREE_SLICES)
+        {
+            this->addAdaptor("::visuVTKAdaptor::NegatoOneSlice", X_AXIS);
+            this->addAdaptor("::visuVTKAdaptor::NegatoOneSlice", Y_AXIS);
+            this->addAdaptor("::visuVTKAdaptor::NegatoOneSlice", Z_AXIS);
+        }
+
+        this->addAdaptor("::visuVTKAdaptor::NegatoWindowingInteractor");
+        this->addAdaptor("::visuVTKAdaptor::NegatoSlicingInteractor", m_orientation);
+        this->addAdaptor("::visuVTKAdaptor::SlicesCursor", m_orientation);
+        this->addAdaptor("::visuVTKAdaptor::ProbeCursor", m_orientation);
+    }
+    if(this->is3dModeEnabled())
+    {
+        this->addAdaptor("::visuVTKAdaptor::Medical3DCamera", m_orientation);
+    }
+    else if(!this->is3dModeEnabled())
+    {
+        this->addAdaptor("::visuVTKAdaptor::SliceFollowerCamera", m_orientation);
+    }
+    else
+    {
+        SLM_TRACE("No 2D/3D mode specified.");
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast( msg );
+
+    if ( imageMsg && imageMsg->hasEvent( "SLICE_MODE"))
+    {
+        ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("SLICE_MODE");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        SLM_ASSERT("m_relatedServiceId is missing", dataInfo->getField( ::fwComEd::Dictionary::m_relatedServiceId ) );
+        std::string servId = dataInfo->getField< ::fwData::String >(::fwComEd::Dictionary::m_relatedServiceId)->value();
+        if( servId ==   this->getSptr()->getID() )
+        {
+            ::fwData::Integer::csptr integer = ::fwData::Integer::dynamicConstCast(dataInfo);
+            SLM_ASSERT("dataInfo is missing", integer);
+            if(integer->value()== 0)
+            {
+                this->setSliceMode(NO_SLICE);
+            }
+            else if(integer->value()== 1)
+            {
+                this->setSliceMode(ONE_SLICE);
+            }
+            else if(integer->value()==3)
+            {
+                this->setSliceMode(THREE_SLICES);
+            }
+            else if(integer->value()==-1)
+            {
+                SLM_FATAL("not yet implemented :(");
+            }
+            else
+            {
+                OSLM_FATAL("Unknown slice mode "<< integer->value());
+            }
+            m_backupedSliceMode = this->getSliceMode();
+            this->doUpdate();
+        }
+    }
+    else if( imageMsg && imageMsg->hasEvent( "SCAN_SHOW"))
+    {
+        ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("SCAN_SHOW");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        SLM_ASSERT("m_relatedServiceId is missing", dataInfo->getField( ::fwComEd::Dictionary::m_relatedServiceId ) );
+        std::string servId = dataInfo->getField< ::fwData::String >(::fwComEd::Dictionary::m_relatedServiceId)->value();
+        if( servId ==   this->getSptr()->getID() )
+        {
+            ::fwData::Boolean::csptr integer = ::fwData::Boolean::dynamicConstCast(dataInfo);
+            if(integer->value())
+            {
+                this->setSliceMode(m_backupedSliceMode);
+            }
+            else
+            {
+                m_backupedSliceMode = this->getSliceMode();
+                this->setSliceMode(NO_SLICE);
+            }
+            this->doUpdate();
+        }
+    }
+    else if (imageMsg && imageMsg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ))
+    {
+        ::fwData::Object::csptr cObjInfo = imageMsg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+        ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+        ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+        int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+        int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+        if( toSliceType == static_cast<int>(m_orientation) )
+        {
+            setOrientation( static_cast< Orientation >( fromSliceType ));
+        }
+        else if(fromSliceType == static_cast<int>(m_orientation))
+        {
+            setOrientation( static_cast< Orientation >( toSliceType ));
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::configuring() throw(fwTools::Failed)
+{
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+
+    if (m_configuration->hasAttribute("mode"))
+    {
+        std::string value(m_configuration->getAttributeValue("mode"));
+        std::transform(value.begin(), value.end(), value.begin(), tolower);
+        OSLM_ASSERT("Sorry, bad value "<<value<<" for attribute mode.",
+                value == "3d" || value == "2d");
+        this->set3dMode(value == "3d");
+    }
+    if (m_configuration->hasAttribute("slices"))
+    {
+        std::string value(m_configuration->getAttributeValue("slices"));
+        std::transform(value.begin(), value.end(), value.begin(), tolower);
+
+        if(value == "0")
+        {
+            this->setSliceMode(NO_SLICE);
+        }
+        else if(value == "1")
+        {
+            this->setSliceMode(ONE_SLICE);
+        }
+        else if(value == "3")
+        {
+            this->setSliceMode(THREE_SLICES);
+        }
+        m_backupedSliceMode = this->getSliceMode();
+    }
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+         std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+         if(orientation == "axial" )
+         {
+             m_orientation = Z_AXIS;
+         }
+         else if(orientation == "frontal" )
+         {
+             m_orientation = Y_AXIS;
+         }
+         else if(orientation == "sagittal" )
+         {
+             m_orientation = X_AXIS;
+         }
+    }
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+    if(m_configuration->hasAttribute("tfalpha") )
+    {
+        this->setAllowAlphaInTF(m_configuration->getAttributeValue("tfalpha") == "yes");
+    }
+    if (m_configuration->hasAttribute("interpolation"))
+    {
+        this->setInterpolation(!(m_configuration->getAttributeValue("interpolation") == "off"));
+    }
+    if (m_configuration->hasAttribute("vtkimagesource"))
+    {
+        this->setVtkImageSourceId( m_configuration->getAttributeValue("vtkimagesource") );
+    }
+    this->parseTFConfig( m_configuration );
+}
+
+//------------------------------------------------------------------------------
+
+void  NegatoMPR::setSliceMode(SliceMode sliceMode)
+{
+    if(m_sliceMode != sliceMode)
+    {
+        m_sliceMode = sliceMode;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+NegatoMPR::SliceMode NegatoMPR::getSliceMode()
+{
+    return m_sliceMode;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::logic::tribool NegatoMPR::is3dModeEnabled()
+{
+    return m_3dModeEnabled;
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::set3dMode( bool enabled )
+{
+    m_3dModeEnabled = enabled;
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoMPR::addAdaptor(std::string adaptor, int axis)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    ::fwRenderVTK::IVtkAdaptorService::sptr service;
+
+    if(axis >= 0)
+    {
+        service = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( image, adaptor );
+        SLM_ASSERT("service not instanced", service);
+        ::fwComEd::helper::MedicalImageAdaptor::sptr adaptorSrv =
+                ::fwComEd::helper::MedicalImageAdaptor::dynamicCast(service);
+        SLM_ASSERT("adaptorSrv not instanced", adaptorSrv);
+        adaptorSrv->setOrientation((Orientation) axis);
+    }
+    else
+    {
+        service = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( image, adaptor );
+        SLM_ASSERT("service not instanced", service);
+    }
+
+
+    ::visuVTKAdaptor::NegatoOneSlice::sptr negatoAdaptor;
+    negatoAdaptor = ::visuVTKAdaptor::NegatoOneSlice::dynamicCast(service);
+
+    ::visuVTKAdaptor::NegatoWindowingInteractor::sptr negatoWindowingAdaptor;
+    negatoWindowingAdaptor = ::visuVTKAdaptor::NegatoWindowingInteractor::dynamicCast(service);
+
+    if (negatoAdaptor)
+    {
+        negatoAdaptor->setAllowAlphaInTF(m_allowAlphaInTF);
+        negatoAdaptor->setInterpolation(m_interpolation);
+        if (!m_imageSourceId.empty())
+        {
+            negatoAdaptor->setVtkImageSourceId(m_imageSourceId);
+        }
+        negatoAdaptor->setSelectedTFKey( this->getSelectedTFKey() );
+        negatoAdaptor->setTFSelectionFwID( this->getTFSelectionFwID() );
+    }
+    else if (negatoWindowingAdaptor)
+    {
+        negatoWindowingAdaptor->setSelectedTFKey( this->getSelectedTFKey() );
+        negatoWindowingAdaptor->setTFSelectionFwID( this->getTFSelectionFwID() );
+    }
+
+    service->setRenderService(this->getRenderService());
+    service->setRenderId( this->getRenderId() );
+    service->setPickerId( this->getPickerId() );
+    service->setTransformId( this->getTransformId() );
+    service->setAutoRender( this->getAutoRender() );
+
+    service->start();
+    service->update();
+    this->registerService(service);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoOneSlice.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoOneSlice.cpp
new file mode 100644
index 0000000..ef79f73
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoOneSlice.cpp
@@ -0,0 +1,300 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/String.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkImageData.h>
+#include <vtkImageBlend.h>
+
+#include "visuVTKAdaptor/Image.hpp"
+#include "visuVTKAdaptor/ImageSlice.hpp"
+#include "visuVTKAdaptor/NegatoOneSlice.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::NegatoOneSlice, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+NegatoOneSlice::NegatoOneSlice() throw()
+{
+    SLM_TRACE_FUNC();
+    m_allowAlphaInTF = false;
+    m_interpolation  = true;
+    m_manageImageSource = false;
+
+    m_imageSource = NULL;
+
+    // Manage events
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER            );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE         );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::MODIFIED          );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//------------------------------------------------------------------------------
+
+NegatoOneSlice::~NegatoOneSlice() throw()
+{
+    SLM_TRACE_FUNC();
+    this->unregisterServices();
+    this->cleanImageSource();
+}
+
+//------------------------------------------------------------------------------
+vtkObject* NegatoOneSlice::getImageSource()
+{
+    if ( !m_imageSource )
+    {
+        OSLM_TRACE(this->getID() << ": Create ImageSource");
+        if (!m_imageSourceId.empty())
+        {
+            m_imageSource = this->getVtkObject(m_imageSourceId);
+        }
+        else
+        {
+            m_imageSource = vtkImageData::New();
+            m_manageImageSource = true;
+        }
+    }
+
+    return m_imageSource;
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::cleanImageSource()
+{
+    if (m_manageImageSource && m_imageSource)
+    {
+        m_imageSource->Delete();
+        m_imageSource = NULL;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwRenderVTK::IVtkAdaptorService::sptr NegatoOneSlice::getImageSliceAdaptor()
+{
+    ::fwRenderVTK::IVtkAdaptorService::sptr imageSliceAdaptor;
+
+    if (m_imageSliceAdaptor.expired())
+    {
+        OSLM_TRACE(this->getID() << ": Create ImageSlice Adaptor Service");
+        ::fwData::Image::sptr image;
+        ::fwData::Composite::sptr sceneComposite;
+
+        image          = this->getObject< ::fwData::Image >();
+        sceneComposite = this->getRenderService()->getObject< ::fwData::Composite >();
+
+        imageSliceAdaptor = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(
+                sceneComposite,
+                "::visuVTKAdaptor::ImageSlice"
+                );
+        imageSliceAdaptor->setRenderService(this->getRenderService());
+        imageSliceAdaptor->setRenderId( this->getRenderId() );
+        imageSliceAdaptor->setPickerId( this->getPickerId() );
+        imageSliceAdaptor->setTransformId( this->getTransformId() );
+        imageSliceAdaptor->setAutoRender( this->getAutoRender() );
+
+
+        ::visuVTKAdaptor::ImageSlice::sptr ISA;
+        ISA = ::visuVTKAdaptor::ImageSlice::dynamicCast(imageSliceAdaptor);
+        ISA->setVtkImageSource(this->getImageSource());
+        ISA->setCtrlImage(image);
+        ISA->setInterpolation(m_interpolation);
+
+       ::fwComEd::helper::MedicalImageAdaptor::dynamicCast(ISA)->setOrientation((Orientation) m_orientation);
+
+        m_imageSliceAdaptor = imageSliceAdaptor;
+        this->registerService(imageSliceAdaptor);
+    }
+    else
+    {
+        imageSliceAdaptor = m_imageSliceAdaptor.lock();
+    }
+    return imageSliceAdaptor;
+}
+
+//------------------------------------------------------------------------------
+::fwRenderVTK::IVtkAdaptorService::sptr NegatoOneSlice::getImageAdaptor()
+{
+    ::fwRenderVTK::IVtkAdaptorService::sptr imageAdaptor;
+
+    if (m_imageAdaptor.expired())
+    {
+        OSLM_TRACE(this->getID() << ": Create Image Adaptor Service");
+        ::fwData::Image::sptr image;
+        image = this->getObject< ::fwData::Image >();
+        imageAdaptor = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(
+                image,
+                "::visuVTKAdaptor::Image"
+                );
+        imageAdaptor->setRenderService(this->getRenderService());
+        imageAdaptor->setRenderId( this->getRenderId() );
+        imageAdaptor->setPickerId( this->getPickerId() );
+        imageAdaptor->setTransformId( this->getTransformId() );
+        imageAdaptor->setAutoRender( this->getAutoRender() );
+
+        ::visuVTKAdaptor::Image::sptr IA;
+        IA = ::visuVTKAdaptor::Image::dynamicCast(imageAdaptor);
+        IA->setVtkImageRegister(this->getImageSource());
+        IA->setSelectedTFKey( this->getSelectedTFKey() );
+        IA->setTFSelectionFwID( this->getTFSelectionFwID() );
+
+        IA->setImageOpacity(1.);
+        IA->setAllowAlphaInTF(m_allowAlphaInTF);
+
+        m_imageAdaptor = imageAdaptor;
+        this->registerService(imageAdaptor);
+    }
+    else
+    {
+        imageAdaptor = m_imageAdaptor.lock();
+    }
+    return imageAdaptor;
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if (! vtkImageBlend::SafeDownCast(this->getImageSource()))
+    {
+        this->getImageAdaptor()->start();
+    }
+    this->getImageSliceAdaptor()->start();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+//    this->getImageAdaptor()->stop();
+//    this->getImageSliceAdaptor()->stop();
+    this->unregisterServices();
+    this->cleanImageSource();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doStop();
+    this->doStart();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::doUpdate() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    if (! vtkImageBlend::SafeDownCast(this->getImageSource()))
+    {
+        this->getImageAdaptor()->update();
+    }
+    this->getImageSliceAdaptor()->update();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ))
+    {
+        ::fwData::Object::csptr cObjInfo = msg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+        ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+        ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+        int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+        int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+        if( toSliceType == static_cast<int>(m_orientation) )
+        {
+            setOrientation( static_cast< Orientation >( fromSliceType ));
+        }
+        else if(fromSliceType == static_cast<int>(m_orientation))
+        {
+            setOrientation( static_cast< Orientation >( toSliceType ));
+        }
+    }
+    else if (msg->hasEvent(::fwComEd::ImageMsg::BUFFER)
+              || msg->hasEvent(::fwComEd::ImageMsg::NEW_IMAGE)
+              ||msg->hasEvent(::fwComEd::ImageMsg::MODIFIED))
+    {
+        this->doStop();
+        this->doStart();
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoOneSlice::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+         std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+         if(orientation == "axial" )
+         {
+             m_orientation = Z_AXIS;
+         }
+         else if(orientation == "frontal" )
+         {
+             m_orientation = Y_AXIS;
+         }
+         else if(orientation == "sagittal" )
+         {
+             m_orientation = X_AXIS;
+         }
+    }
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+    if(m_configuration->hasAttribute("tfalpha") )
+    {
+        this->setAllowAlphaInTF(m_configuration->getAttributeValue("tfalpha") == "yes");
+    }
+    if (m_configuration->hasAttribute("interpolation"))
+    {
+        this->setInterpolation(!(m_configuration->getAttributeValue("interpolation") == "off"));
+    }
+    if (m_configuration->hasAttribute("vtkimagesource"))
+    {
+        this->setVtkImageSourceId( m_configuration->getAttributeValue("vtkimagesource") );
+    }
+
+    this->parseTFConfig( m_configuration );
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoSlicingInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoSlicingInteractor.cpp
new file mode 100644
index 0000000..9938f4e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoSlicingInteractor.cpp
@@ -0,0 +1,476 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkCellPicker.h>
+#include <vtkActor.h>
+#include <vtkActorCollection.h>
+#include <vtkProp3DCollection.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkAssemblyNode.h>
+#include <vtkCommand.h>
+
+#include <fwRenderVTK/vtk/Helpers.hpp>
+#include <fwRenderVTK/vtk/fwVtkCellPicker.hpp>
+
+#include "visuVTKAdaptor/NegatoSlicingInteractor.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::NegatoSlicingInteractor, ::fwData::Image ) ;
+
+
+namespace visuVTKAdaptor
+{
+
+#define START_SLICING_EVENT vtkCommand::MiddleButtonPressEvent
+#define STOP_SLICING_EVENT  vtkCommand::MiddleButtonReleaseEvent
+
+class NegatoSlicingCallback : public vtkCommand
+{
+public:
+    static NegatoSlicingCallback *New()
+    { return new NegatoSlicingCallback(); }
+
+    NegatoSlicingCallback() :  m_picker(NULL), m_localPicker(NULL), m_pickedProp(NULL), m_mouseMoveObserved(false)
+    {
+        this->PassiveObserverOff();
+    }
+
+    ~NegatoSlicingCallback()
+    {
+    }
+
+    bool Pick(double pickPoint[3], double position[3])
+    {
+        SLM_ASSERT("m_picker should be set before picking.", m_picker);
+
+        if ( m_picker->Pick( pickPoint , m_adaptor->getRenderer() ) )
+        {
+            m_picker->GetPickPosition(position);
+            return true;
+        }
+        return false;
+    }
+
+    bool localPick(double pickPoint[3], double position[3])
+    {
+        SLM_ASSERT("m_localPicker should be set before picking.", m_localPicker);
+
+        if ( m_localPicker->Pick( pickPoint , m_adaptor->getRenderer() ) )
+        {
+            m_localPicker->GetPickPosition(position);
+            return true;
+        }
+        return false;
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        if ( m_mouseMoveObserved || !m_adaptor->getInteractor()->GetShiftKey() )
+        {
+            if ( eventId == START_SLICING_EVENT)
+            {
+                SLM_TRACE("vtkEvent: MiddleButtonPressEvent");
+                SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+                SLM_ASSERT("m_picker not instanced", m_picker);
+
+                double pickPoint[3];
+                double pickedPoint[3];
+
+                int x,y;
+                m_adaptor->getInteractor()->GetEventPosition(x, y);
+                pickPoint[0] = x;
+                pickPoint[1] = y;
+                pickPoint[2] = 0;
+
+                OSLM_TRACE("vtkEvent: MiddleButtonPressEvent: picking " << pickPoint[0] << ", " << pickPoint[1] << ", " << pickPoint[2]);
+
+                if ( this->Pick(pickPoint, pickedPoint) )
+                {
+                    SLM_TRACE("vtkEvent: MiddleButtonPressEvent:picked point");
+                    assert(!m_mouseMoveObserved);
+                    m_adaptor->getInteractor()->AddObserver(vtkCommand::MouseMoveEvent, this, 1.);
+                    m_mouseMoveObserved = true;
+                    SetAbortFlag(1);
+
+                    //m_pickedProp = m_picker->GetProp3D();
+                    m_pickedProp = ::fwRenderVTK::vtk::getNearestPickedProp(m_picker, m_adaptor->getRenderer());
+                    m_localPicker = fwVtkCellPicker::New();
+                    m_localPicker->InitializePickList();
+                    m_localPicker->PickFromListOn();
+                    m_localPicker->AddPickList(m_pickedProp);
+
+                    double localPickedPoint[3];
+                    this->localPick(pickPoint, localPickedPoint);
+
+                    m_adaptor->startSlicing(localPickedPoint);
+                }
+            }
+
+            else if ( eventId == STOP_SLICING_EVENT)
+            {
+                SLM_TRACE("vtkEvent: MiddleButtonReleaseEvent");
+                SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+                SLM_ASSERT("m_picker not instanced", m_picker);
+
+                if(m_mouseMoveObserved)
+                {
+                    m_adaptor->getInteractor()->RemoveObservers(vtkCommand::MouseMoveEvent, this);
+                    m_mouseMoveObserved = false;
+                    m_adaptor->stopSlicing();
+                    m_localPicker->Delete();
+                    m_localPicker = NULL;
+                    m_pickedProp = NULL;
+                }
+
+            }
+            else if (eventId == vtkCommand::MouseMoveEvent)
+            {
+                SLM_TRACE("vtkEvent: MouseMoveEvent");
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+
+                int x,y;
+                double pickPoint[3];
+                double pickedPoint[3];
+
+                m_adaptor->getInteractor()->GetEventPosition(x,y);
+                pickPoint[0] = x;
+                pickPoint[1] = y;
+                pickPoint[2] = 0;
+
+                if ( this->localPick(pickPoint, pickedPoint))
+                {
+                    m_adaptor->updateSlicing(pickedPoint);
+                }
+            }
+            else if (eventId == vtkCommand::KeyPressEvent && !m_adaptor->getInteractor()->GetControlKey())
+            {
+                vtkRenderWindowInteractor *rwi = vtkRenderWindowInteractor::SafeDownCast(caller);
+                char *keySym = rwi->GetKeySym();
+
+
+                if ( std::string(keySym) == "A" || std::string(keySym) == "a" )
+                {
+                    m_adaptor->pushSlice(-1, m_adaptor->getOrientation());
+                }
+                else if (std::string(keySym) == "Z" || std::string(keySym) == "z" )
+                {
+                    m_adaptor->pushSlice(1, m_adaptor->getOrientation());
+                }
+                if ( std::string(keySym) == "T" || std::string(keySym) == "t" )
+                {
+                    m_adaptor->pushSlice(-1, ::fwComEd::helper::MedicalImageAdaptor::Z_AXIS);
+                }
+                else if (std::string(keySym) == "Y" || std::string(keySym) == "y" )
+                {
+                    m_adaptor->pushSlice(1, ::fwComEd::helper::MedicalImageAdaptor::Z_AXIS);
+                }
+                else if (std::string(keySym) == "G" || std::string(keySym) == "g" )
+                {
+                    m_adaptor->pushSlice(-1, ::fwComEd::helper::MedicalImageAdaptor::Y_AXIS);
+                }
+                else if (std::string(keySym) == "H" || std::string(keySym) == "h" )
+                {
+                    m_adaptor->pushSlice(1, ::fwComEd::helper::MedicalImageAdaptor::Y_AXIS);
+                }
+                else if (std::string(keySym) == "B" || std::string(keySym) == "b" )
+                {
+                    m_adaptor->pushSlice(-1, ::fwComEd::helper::MedicalImageAdaptor::X_AXIS);
+                }
+                else if (std::string(keySym) == "N" || std::string(keySym) == "n" )
+                {
+                    m_adaptor->pushSlice(1, ::fwComEd::helper::MedicalImageAdaptor::X_AXIS);
+                }
+            }
+        }
+        else if (m_adaptor->getInteractor()->GetShiftKey())
+        {
+            if (eventId == MouseWheelForwardEvent)
+            {
+                m_adaptor->pushSlice(1, m_adaptor->getOrientation());
+            }
+            else if (eventId == vtkCommand::MouseWheelBackwardEvent)
+            {
+                m_adaptor->pushSlice(-1, m_adaptor->getOrientation());
+            }
+        }
+    }
+
+    void setAdaptor( NegatoSlicingInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *picker)
+    {
+        m_picker = picker;
+    }
+
+protected :
+    NegatoSlicingInteractor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    vtkAbstractPropPicker *m_localPicker;
+
+    vtkProp *m_pickedProp;
+
+
+    bool m_mouseMoveObserved;
+
+};
+
+//-----------------------------------------------------------------------------
+
+NegatoSlicingInteractor::NegatoSlicingInteractor() throw()
+{
+    m_priority = .6;
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//-----------------------------------------------------------------------------
+
+NegatoSlicingInteractor::~NegatoSlicingInteractor() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Tag config is required", m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::doStart() throw(fwTools::Failed)
+{
+    NegatoSlicingCallback *observer = NegatoSlicingCallback::New();
+    observer->setAdaptor( NegatoSlicingInteractor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+
+    m_vtkObserver = observer;
+
+    this->getInteractor()->AddObserver(START_SLICING_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(STOP_SLICING_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(vtkCommand::KeyPressEvent  , m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(vtkCommand::MouseWheelForwardEvent, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(vtkCommand::MouseWheelBackwardEvent, m_vtkObserver, m_priority);
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::doStop() throw(fwTools::Failed)
+{
+    this->getInteractor()->RemoveObservers(START_SLICING_EVENT  , m_vtkObserver);
+    this->getInteractor()->RemoveObservers(STOP_SLICING_EVENT, m_vtkObserver);
+    this->getInteractor()->RemoveObservers(vtkCommand::KeyPressEvent  , m_vtkObserver);
+    this->getInteractor()->RemoveObservers(vtkCommand::MouseWheelForwardEvent, m_vtkObserver);
+    this->getInteractor()->RemoveObservers(vtkCommand::MouseWheelBackwardEvent, m_vtkObserver);
+    m_vtkObserver->Delete();
+    m_vtkObserver = NULL;
+    this->removeAllPropFromRenderer();
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+        this->updateImageInfos(image);
+    }
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+    {
+        ::fwComEd::ImageMsg::dynamicConstCast(msg)->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+    }
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ))
+    {
+        ::fwData::Object::csptr cObjInfo = msg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+        ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+        ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+        int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+        int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+        if( toSliceType == static_cast<int>(m_orientation) )
+        {
+            setOrientation( static_cast< Orientation >( fromSliceType ));
+        }
+        else if(fromSliceType == static_cast<int>(m_orientation))
+        {
+            setOrientation( static_cast< Orientation >( toSliceType ));
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::startSlicing( double pickedPoint[3] )
+{
+    ::fwData::Integer::sptr sliceIndex[3];
+    this->getSliceIndex(sliceIndex);
+
+    int index[3];
+    this->worldToImageSliceIndex(pickedPoint, index);
+
+    int i;
+    for (i=0; i<3; i++)
+    {
+        if (index[i] == sliceIndex[i]->value())
+        {
+            this->setOrientation((Orientation)i);
+            break;
+        }
+    }
+    SLM_INFO_IF( "unknown orientation", i == 3 );
+    if(i != 3)
+    {
+        this->updateSlicing(pickedPoint);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::stopSlicing( )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    // Fire the message to stop full cross display
+    ::fwData::Integer::sptr dataInfo = ::fwData::Integer::New();
+    ::fwData::String::sptr sliceMode = ::fwData::String::New();
+    sliceMode->value() = "STOP_SLICING";
+    dataInfo->setField("SLICE_MODE", sliceMode);
+    ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+    msg->setSliceIndex(m_axialIndex, m_frontalIndex, m_sagittalIndex, dataInfo);
+    ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::updateSlicing( double pickedPoint[3] )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwData::Integer::sptr sliceIndex[3];
+    this->getSliceIndex(sliceIndex);
+
+    int index[3];
+    int originalIndex = sliceIndex[m_orientation]->value();
+
+    this->worldToImageSliceIndex(pickedPoint, index);
+    index[m_orientation] = originalIndex;
+
+    OSLM_TRACE("sliceIndex[0] "<< sliceIndex[0]->value()<< " index[0] " << index[0] << " pickedPt "<<pickedPoint[0]);
+    OSLM_TRACE("sliceIndex[1] "<< sliceIndex[1]->value()<< " index[1] " << index[1] << " pickedPt "<<pickedPoint[1]);
+    OSLM_TRACE("sliceIndex[2] "<< sliceIndex[2]->value()<< " index[2] " << index[2] << " pickedPt "<<pickedPoint[2]);
+
+#ifdef DEBUG
+    for ( int i = 0; i < image->getNumberOfDimensions(); i++ )
+    {
+        OSLM_ASSERT("index["<< i <<"] = " << index[i]
+                << " and image->getSize()[" << i << "] = " << image->getSize()[i],
+                index[i] >=0 && index[i] < image->getSize()[i]);
+    }
+#endif
+
+    if(setSliceIndex(index))
+    {
+        ::fwData::Integer::sptr dataInfo = ::fwData::Integer::New();
+        ::fwData::String::sptr sliceMode = ::fwData::String::New();
+        sliceMode->value() = "UPDATE_SLICING";
+        dataInfo->setField("SLICE_MODE", sliceMode);
+
+        // Fire the message
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->setSliceIndex(m_axialIndex, m_frontalIndex, m_sagittalIndex, dataInfo);
+        ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void NegatoSlicingInteractor::pushSlice( int factor, Orientation axis)
+{
+    ::fwData::Integer::sptr sliceIndex[3];
+    this->getSliceIndex(sliceIndex);
+
+    int index[3];
+    index[0] = sliceIndex[0]->value();
+    index[1] = sliceIndex[1]->value();
+    index[2] = sliceIndex[2]->value();
+    index[axis] += factor;
+
+    int size[3];
+    this->getImageDataSize(size);
+
+    if (index[axis] < 0)
+    {
+        index[axis] = 0;
+    }
+    else if (index[axis] >= size[axis])
+    {
+        index[axis] = size[axis]-1;
+    }
+
+    if(setSliceIndex(index))
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+        ::fwData::Integer::sptr dataInfo = ::fwData::Integer::New();
+        ::fwData::String::sptr sliceMode = ::fwData::String::New();
+        sliceMode->value() = "STOP_SLICING";
+        dataInfo->setField("SLICE_MODE", sliceMode);
+
+        // Fire the message
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->setSliceIndex(m_axialIndex, m_frontalIndex, m_sagittalIndex, dataInfo);
+        ::fwServices::IEditionService::notify(this->getSptr(), image, msg);
+    }
+}
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoWindowingInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoWindowingInteractor.cpp
new file mode 100644
index 0000000..268a668
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/NegatoWindowingInteractor.cpp
@@ -0,0 +1,290 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkCommand.h>
+
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+#include <fwRenderVTK/vtk/fwVtkCellPicker.hpp>
+
+#include "visuVTKAdaptor/NegatoWindowingInteractor.hpp"
+#include <fwServices/IEditionService.hpp>
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::NegatoWindowingInteractor, ::fwData::Image ) ;
+
+
+#define START_WINDOWING_EVENT vtkCommand::RightButtonPressEvent
+#define STOP_WINDOWING_EVENT  vtkCommand::RightButtonReleaseEvent
+
+namespace visuVTKAdaptor
+{
+
+class NegatoWindowingCallback : public vtkCommand
+{
+public:
+    static NegatoWindowingCallback *New()
+    { return new NegatoWindowingCallback(); }
+
+    NegatoWindowingCallback() : m_picker(NULL), m_x(0), m_y(0), m_mouseMoveObserved(false)
+    {
+        m_windowStep = 1. ;
+        m_levelStep  = 1. ;
+        this->PassiveObserverOff();
+    }
+
+    ~NegatoWindowingCallback()
+    {
+
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        if ( m_mouseMoveObserved || !m_adaptor->getInteractor()->GetShiftKey() )
+        {
+            if ( eventId == START_WINDOWING_EVENT)
+            {
+                SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+                SLM_ASSERT("m_picker not instanced", m_picker);
+
+                double display[3];
+
+                m_adaptor->getInteractor()->GetEventPosition(m_x, m_y);
+                display[0] = m_x;
+                display[1] = m_y;
+                display[2] = 0;
+
+                if ( m_picker->Pick( display , m_adaptor->getRenderer() ) )
+                {
+                    assert(!m_mouseMoveObserved);
+                    m_adaptor->startWindowing();
+                    m_adaptor->getInteractor()->AddObserver(vtkCommand::MouseMoveEvent, this, 1.);
+                    m_mouseMoveObserved = true;
+                    SetAbortFlag(1);
+                    m_adaptor->update();
+                }
+
+            }
+
+            else if ( eventId == STOP_WINDOWING_EVENT)
+            {
+                SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+                SLM_ASSERT("m_picker not instanced", m_picker);
+
+                if(m_mouseMoveObserved)
+                {
+                    m_adaptor->getInteractor()->RemoveObservers(vtkCommand::MouseMoveEvent, this);
+                    m_mouseMoveObserved = false;
+                    m_adaptor->stopWindowing();
+                    m_adaptor->update();
+                }
+            }
+            else if (eventId == vtkCommand::MouseMoveEvent)
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                int x,y;
+                m_adaptor->getInteractor()->GetEventPosition(x,y);
+
+                double dx = m_windowStep * ( x - m_x ) ;
+                double dy = m_levelStep  * ( m_y - y ) ;
+
+                m_adaptor->updateWindowing(dx, dy);
+                m_adaptor->update();
+            }
+        }
+        else if (m_adaptor->getInteractor()->GetShiftKey())
+        {
+            vtkRenderWindowInteractor *rwi = vtkRenderWindowInteractor::SafeDownCast(caller);
+            char *keySym = rwi->GetKeySym();
+            if(keySym != NULL)
+            {
+                if (std::string(keySym) == "R")
+                {
+                    m_adaptor->resetWindowing();
+                }
+            }
+        }
+    }
+
+    void setAdaptor( NegatoWindowingInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *picker)
+    {
+        m_picker = picker;
+    }
+
+protected :
+    NegatoWindowingInteractor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+
+    int m_x;
+    int m_y;
+
+    double m_windowStep;
+    double m_levelStep;
+
+    bool m_mouseMoveObserved;
+
+};
+
+//------------------------------------------------------------------------------
+
+NegatoWindowingInteractor::NegatoWindowingInteractor() throw()
+{
+    m_priority = .6;
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+}
+
+//------------------------------------------------------------------------------
+
+NegatoWindowingInteractor::~NegatoWindowingInteractor() throw()
+{
+
+
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Tag config is required", m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+
+    this->parseTFConfig( m_configuration );
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::doStart() throw(fwTools::Failed)
+{
+    NegatoWindowingCallback *observer = NegatoWindowingCallback::New();
+    observer->setAdaptor( NegatoWindowingInteractor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+
+    m_vtkObserver = observer;
+
+    this->getInteractor()->AddObserver(START_WINDOWING_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(STOP_WINDOWING_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(vtkCommand::KeyPressEvent  , m_vtkObserver, m_priority);
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->updateTransferFunction(image, this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::doStop() throw(fwTools::Failed)
+{
+    this->getInteractor()->RemoveObservers(START_WINDOWING_EVENT  , m_vtkObserver);
+    this->getInteractor()->RemoveObservers(STOP_WINDOWING_EVENT, m_vtkObserver);
+    this->getInteractor()->RemoveObservers(vtkCommand::KeyPressEvent  , m_vtkObserver);
+    m_vtkObserver->Delete();
+    m_vtkObserver = NULL;
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            doUpdate();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::startWindowing( )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->doUpdate();
+
+    m_initialLevel = this->getLevel();
+    m_initialWindow = this->getWindow();
+}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::stopWindowing( )
+{}
+
+//------------------------------------------------------------------------------
+
+void NegatoWindowingInteractor::updateWindowing( double dw, double dl )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    double newWindow = m_initialWindow + dw;
+    double newLevel  = m_initialLevel - dl;
+
+    this->setWindow( newWindow );
+    this->setLevel( newLevel );
+    this->notifyTFWindowing( this->getSptr() );
+
+    this->setVtkPipelineModified();
+}
+
+void NegatoWindowingInteractor::resetWindowing()
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    double newWindow = image->getWindowWidth();
+    double newLevel  = image->getWindowCenter();
+
+    this->setWindow( newWindow );
+    this->setLevel( newLevel );
+    this->notifyTFWindowing( this->getSptr() );
+
+    this->setVtkPipelineModified();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Normals.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Normals.cpp
new file mode 100644
index 0000000..e16860a
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Normals.cpp
@@ -0,0 +1,204 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwComEd/ReconstructionMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkActor2D.h>
+#include <vtkArrowSource.h>
+#include <vtkCamera.h>
+#include <vtkGlyph3D.h>
+#include <vtkIdFilter.h>
+#include <vtkCellCenters.h>
+#include <vtkLabeledDataMapper.h>
+#include <vtkMaskPoints.h>
+#include <vtkMath.h>
+#include <vtkPicker.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkTextProperty.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include "visuVTKAdaptor/Normals.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Normals, ::fwData::TriangularMesh ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+Normals::Normals() throw()
+{
+    m_actor = vtkActor::New();
+#ifdef SHOW_ID_LABELS
+    m_ptsIdActor2D = vtkActor2D::New();
+    m_cellsIdActor2D = vtkActor2D::New();
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+Normals::~Normals() throw()
+{
+    m_actor->Delete();
+    m_actor = 0;
+#ifdef SHOW_ID_LABELS
+    m_ptsIdActor2D->Delete();
+    m_ptsIdActor2D = 0;
+    m_cellsIdActor2D->Delete();
+    m_cellsIdActor2D = 0;
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+void Normals::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Normals::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->doUpdate();
+
+    this->addToRenderer(this->getActor());
+
+#ifdef SHOW_ID_LABELS
+    this->addToRenderer(m_ptsIdActor2D);
+    this->addToRenderer(m_cellsIdActor2D);
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+void Normals::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING Normals");
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+void Normals::doUpdate() throw(fwTools::Failed)
+{
+    updateNormals();
+}
+
+//------------------------------------------------------------------------------
+
+vtkActor* Normals::getActor()
+{
+    return m_actor;
+}
+
+
+//------------------------------------------------------------------------------
+void Normals::setMapperInput(vtkAlgorithmOutput *input)
+{
+    if (input)
+    {
+        m_mapperInput = input;
+    }
+}
+//
+//------------------------------------------------------------------------------
+
+void Normals::updateNormals()
+{
+
+#ifdef SHOW_ID_LABELS
+    { //Points Ids
+        vtkIdFilter *ids = vtkIdFilter::New();
+        vtkLabeledDataMapper *idsMapper = vtkLabeledDataMapper::New();
+        idsMapper->GetLabelTextProperty()->ShadowOn();
+        idsMapper->GetLabelTextProperty()->SetFontSize(18);
+
+        ids->SetInput(m_mapperInput->GetOutput());
+        idsMapper->SetInputConnection(ids->GetOutputPort());
+        m_ptsIdActor2D->SetMapper(idsMapper);
+
+        idsMapper->Delete();
+        ids->Delete();
+    }
+    { //Points cell
+        vtkCellCenters *cc = vtkCellCenters::New();
+        vtkLabeledDataMapper *ccMapper = vtkLabeledDataMapper::New();
+        ccMapper->GetLabelTextProperty()->ShadowOn();
+        ccMapper->GetLabelTextProperty()->SetFontSize(18);
+        ccMapper->GetLabelTextProperty()->SetColor(0, 1, 0);
+
+
+        cc->SetInput(m_mapperInput->GetOutput());
+        ccMapper->SetInputConnection(cc->GetOutputPort());
+        m_cellsIdActor2D->SetMapper(ccMapper);
+
+        ccMapper->Delete();
+        cc->Delete();
+    }
+#endif
+
+    vtkMaskPoints* ptMask = vtkMaskPoints::New();
+    ptMask->SetInputConnection(m_mapperInput);
+    ptMask->SetOnRatio(1);
+    ptMask->RandomModeOn();
+
+    vtkArrowSource* arrow = vtkArrowSource::New();
+
+    vtkGlyph3D* glyph = vtkGlyph3D::New();
+    glyph->SetInputConnection(ptMask->GetOutputPort());
+    glyph->SetSource(arrow->GetOutput());
+    glyph->SetVectorModeToUseNormal();
+    glyph->SetScaleModeToScaleByVector();
+    glyph->SetScaleFactor(10.0);
+    vtkPolyDataMapper* glyphMapper = vtkPolyDataMapper::New();
+    glyphMapper->SetInputConnection(glyph->GetOutputPort());
+
+    this->getActor()->SetMapper(glyphMapper);
+    this->getActor()->GetProperty()->SetColor(1., 1., 1.);
+
+    glyphMapper->Delete();
+    glyph->Delete();
+    arrow->Delete();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Normals::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+void Normals::doStop() throw(fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PickerInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PickerInteractor.cpp
new file mode 100644
index 0000000..9321974
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PickerInteractor.cpp
@@ -0,0 +1,274 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#include <boost/foreach.hpp>
+
+#include <vtkAbstractPropPicker.h>
+#include <vtkActor.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwComEd/InteractionMsg.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwRenderVTK/vtk/Helpers.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/macros.hpp>
+
+#include "visuVTKAdaptor/PickerInteractor.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+#define START_INTERACTION_EVENT vtkCommand::LeftButtonPressEvent
+#define STOP_INTERACTION_EVENT  vtkCommand::LeftButtonReleaseEvent
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PickerInteractor, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+class PickerInteractorCallback : public vtkCommand
+{
+public:
+    static PickerInteractorCallback *New()
+    { return new PickerInteractorCallback(); }
+
+    PickerInteractorCallback() : m_caller(NULL), m_priority(-1)
+    {
+        m_picker = NULL;
+        this->PassiveObserverOn();
+    }
+
+    ~PickerInteractorCallback()
+    {
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        assert(m_priority>=0);
+        SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+        SLM_ASSERT("m_picker not instanced", m_picker);
+
+        this->process(vtkRenderWindowInteractor::SafeDownCast(caller), eventId);
+    }
+
+    bool pickSomething()
+    {
+        int x,y;
+        double display[3];
+
+        m_adaptor->getInteractor()->GetEventPosition(x, y);
+        display[0] = x;
+        display[1] = y;
+        display[2] = 0;
+
+        return  m_picker->Pick( display , m_adaptor->getRenderer() );
+    }
+
+
+    void process(vtkRenderWindowInteractor *caller, unsigned long eventId) // from
+    {
+        SLM_ASSERT("bad vtk caller", caller);
+        m_caller = caller;
+
+        switch (eventId)
+        {
+            case vtkCommand::LeftButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_LEFT_DOWN);
+                break;
+            case vtkCommand::LeftButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_LEFT_UP);
+                break;
+            case vtkCommand::MiddleButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MIDDLE_DOWN);
+                break;
+            case vtkCommand::MiddleButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MIDDLE_UP);
+                break;
+            case vtkCommand::RightButtonPressEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_RIGHT_DOWN);
+                break;
+            case vtkCommand::RightButtonReleaseEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_RIGHT_UP);
+                break;
+            //case vtkCommand::EnterEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::);
+                //break;
+            //case vtkCommand::LeaveEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::);
+                //break;
+            //case vtkCommand::KeyPressEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::KEY_DOWN);
+                //break;
+            //case vtkCommand::KeyReleaseEvent :
+                //this->notifyMsg(::fwComEd::InteractionMsg::KEY_UP);
+                //break;
+            case vtkCommand::MouseMoveEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_MOVE);
+                break;
+            case vtkCommand::MouseWheelForwardEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELFORWARD_DOWN);
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELFORWARD_UP);
+                break;
+            case vtkCommand::MouseWheelBackwardEvent :
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELBACKWARD_DOWN);
+                this->notifyMsg(::fwComEd::InteractionMsg::MOUSE_WHEELBACKWARD_UP);
+                break;
+            default:
+                OSLM_ASSERT("Unknown vtk event: " << vtkCommand::GetStringFromEventId(eventId) ,0);
+        };
+
+    }
+
+
+    void notifyMsg(std::string event)
+    {
+        double world[3] = {-1,0,0};
+        this->pickSomething();
+        ::fwRenderVTK::vtk::getNearestPickedPosition(m_picker, m_adaptor->getRenderer(), world);
+        OSLM_TRACE("PICK" << world[0] << " ," << world[1] << " ," << world[2] );
+
+        ::fwComEd::InteractionMsg::sptr msg = ::fwComEd::InteractionMsg::New();
+        msg->setEventPoint(world[0], world[1], world[2]);
+        msg->setEvent(event);
+
+        msg->setModifiersStatus( ::fwComEd::InteractionMsg::CTRL,  m_caller->GetControlKey());
+        msg->setModifiersStatus( ::fwComEd::InteractionMsg::SHIFT, m_caller->GetShiftKey());
+
+        m_adaptor->notifyEvent( msg );
+    }
+
+    void setAdaptor( PickerInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *adaptor)
+    {
+        m_picker = adaptor;
+    }
+
+    void setPriority( float priority )
+    {
+        m_priority = priority;
+    }
+
+protected :
+    vtkRenderWindowInteractor *m_caller;
+    PickerInteractor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    float    m_priority;
+
+};
+
+//------------------------------------------------------------------------------
+
+PickerInteractor::PickerInteractor() throw()
+    : m_priority(0.999)
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+PickerInteractor::~PickerInteractor() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::doStart() throw(fwTools::Failed)
+{
+    PickerInteractorCallback *observer = PickerInteractorCallback::New();
+    observer->setAdaptor( PickerInteractor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+    observer->setPriority(  m_priority );
+
+    m_interactionCommand = observer;
+
+    vtkRenderWindowInteractor *interactor = this->getInteractor();
+    interactor->AddObserver(vtkCommand::LeftButtonPressEvent    , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::LeftButtonReleaseEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MiddleButtonPressEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MiddleButtonReleaseEvent, m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::RightButtonPressEvent   , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::RightButtonReleaseEvent , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::EnterEvent              , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::LeaveEvent              , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::KeyPressEvent           , m_interactionCommand, m_priority);
+    //interactor->AddObserver(vtkCommand::KeyReleaseEvent         , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseMoveEvent          , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseWheelForwardEvent  , m_interactionCommand, m_priority);
+    interactor->AddObserver(vtkCommand::MouseWheelBackwardEvent , m_interactionCommand, m_priority);
+
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::doSwap() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::doStop() throw(fwTools::Failed)
+{
+    vtkRenderWindowInteractor *interactor = this->getInteractor();
+    interactor->RemoveObservers(vtkCommand::LeftButtonPressEvent    , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::LeftButtonReleaseEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MiddleButtonPressEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MiddleButtonReleaseEvent, m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::RightButtonPressEvent   , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::RightButtonReleaseEvent , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::EnterEvent              , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::LeaveEvent              , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::KeyPressEvent           , m_interactionCommand);
+    //interactor->RemoveObservers(vtkCommand::KeyReleaseEvent         , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseMoveEvent          , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseWheelForwardEvent  , m_interactionCommand);
+    interactor->RemoveObservers(vtkCommand::MouseWheelBackwardEvent , m_interactionCommand);
+
+    m_interactionCommand->Delete();
+    m_interactionCommand = NULL;
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void PickerInteractor::notifyEvent(::fwComEd::InteractionMsg::sptr msg)
+{
+    ::fwServices::IEditionService::notify(this->getSptr(), this->getObject(), msg);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plane.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plane.cpp
new file mode 100644
index 0000000..260ca74
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plane.cpp
@@ -0,0 +1,298 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+#include <fwMath/PlaneFunctions.hpp>
+
+#include <fwData/Plane.hpp>
+#include <fwData/Color.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/PointMsg.hpp>
+#include <fwComEd/PlaneMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkPlaneCollection.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPropCollection.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+
+
+#include "fwRenderVTK/vtk/Helpers.hpp"
+#include "fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp"
+#include "visuVTKAdaptor/Plane.hpp"
+#include "visuVTKAdaptor/Point.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Plane, ::fwData::Plane ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+
+Plane::Plane() throw()
+{
+    SLM_TRACE_FUNC();
+
+    m_vtkPlaneCollection = 0;
+    m_vtkImplicitPlane = 0;
+
+    //addNewHandledEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+    //addNewHandledEvent( ::fwComEd::PointMsg::START_POINT_INTERACTION );
+    //addNewHandledEvent( ::fwComEd::PlaneMsg::PLANE_MODIFIED );
+    //addNewHandledEvent( ::fwComEd::PlaneMsg::WAS_SELECTED );
+    //addNewHandledEvent( ::fwComEd::PlaneMsg::WAS_DESELECTED );
+
+    m_connections = ::fwServices::helper::SigSlotConnection::New();
+}
+
+//------------------------------------------------------------------------------
+
+Plane::~Plane() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+//  vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
+//  mapper->SetInput( m_vtkPlane->GetOutput() );
+//  m_actorPlan->SetMapper(mapper);
+//  m_actorPlan->GetProperty()->SetOpacity( 0.5 );
+//  m_actorPlan->GetProperty()->SetColor( 1., 1., 1. );
+//  this->addToRenderer(m_actorPlan);
+//
+//  mapper->Delete();
+//  mapper = 0;
+//
+//  vtkMaskPoints* ptMask = vtkMaskPoints::New();
+//  ptMask->SetInputConnection(m_vtkPlane->GetOutputPort());
+//  ptMask->SetOnRatio(1);
+//  //ptMask->RandomModeOn();
+//
+//  vtkArrowSource* arrow = vtkArrowSource::New();
+//
+//  vtkGlyph3D* glyph = vtkGlyph3D::New();
+//  glyph->SetInputConnection(ptMask->GetOutputPort());
+//  glyph->SetSource(arrow->GetOutput());
+//  glyph->SetVectorModeToUseNormal();
+//  glyph->SetScaleModeToScaleByVector();
+//  glyph->SetScaleFactor(50.0);
+//
+//  vtkPolyDataMapper* glyphMapper = vtkPolyDataMapper::New();
+//  glyphMapper->SetInputConnection(glyph->GetOutputPort());
+//
+//  vtkActor *arrowsActor = vtkActor::New();
+//    arrowsActor->SetMapper(glyphMapper);
+//  arrowsActor->GetProperty()->SetOpacity( 0.5 );
+//  this->addToRenderer(arrowsActor);
+//
+//  arrowsActor->Delete();
+//  ptMask->Delete();
+//  glyph->Delete();
+//  glyphMapper->Delete();
+//  arrow->Delete();
+
+    m_pPlane = this->getObject< ::fwData::Plane >();
+
+    BOOST_FOREACH( ::fwData::Point::sptr point, m_pPlane.lock()->getPoints() )
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr servicePoint =
+                ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+        ( point, "::visuVTKAdaptor::Point" );
+        SLM_ASSERT("servicePoint not instanced", servicePoint);
+
+        servicePoint->setRenderService(this->getRenderService());
+        servicePoint->setRenderId( this->getRenderId() );
+        servicePoint->setPickerId( this->getPickerId() );
+        servicePoint->setAutoRender( this->getAutoRender() );
+        servicePoint->start();
+
+        this->registerService(servicePoint);
+
+        m_connections->connect(point, ::fwData::Object::s_OBJECT_MODIFIED_SIG,
+                               this->getSptr(), ::fwServices::IService::s_RECEIVE_SLOT);
+    }
+
+    if (m_vtkPlaneCollection)
+    {
+        m_vtkImplicitPlane = vtkPlane::New();
+        m_vtkPlaneCollection->AddItem(m_vtkImplicitPlane);
+    }
+
+    setVtkPipelineModified();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE("SWAPPING Plane");
+    m_pPlane = this->getObject< ::fwData::Plane >();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::doUpdate() throw(fwTools::Failed)
+{
+    assert(!m_pPlane.expired());
+    ::fwData::Plane::sptr plane = m_pPlane.lock();
+
+    ::fwData::Point::sptr pt0 = plane->getPoints()[0];
+    ::fwData::Point::sptr pt1 = plane->getPoints()[1];
+    ::fwData::Point::sptr pt2 = plane->getPoints()[2];
+    plane->computePlaneFromPoints();
+
+    if(m_vtkImplicitPlane)
+    {
+        fwVec3d normal = ::fwMath::getNormal(plane->getPlane());
+
+        m_vtkImplicitPlane->SetOrigin(pt0->getCoord()[0], pt0->getCoord()[1], pt0->getCoord()[2]);
+        m_vtkImplicitPlane->SetNormal(normal[0], normal[1], normal[2]);
+        m_vtkImplicitPlane->Modified();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::PointMsg::csptr pointMsg = ::fwComEd::PointMsg::dynamicConstCast( _msg );
+    ::fwComEd::PlaneMsg::csptr planeMsg = ::fwComEd::PlaneMsg::dynamicConstCast( _msg );
+    if ( pointMsg)
+    {
+        if (pointMsg->hasEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED ) )
+        {
+            this->doUpdate();
+            ::fwComEd::PlaneMsg::sptr msg = ::fwComEd::PlaneMsg::New();
+            msg->addEvent( ::fwComEd::PlaneMsg::PLANE_MODIFIED );
+            ::fwServices::IEditionService::notify( this->getSptr(), m_pPlane.lock(), msg );
+        }
+
+        if ( pointMsg->hasEvent( ::fwComEd::PointMsg::START_POINT_INTERACTION ))
+        {
+            ::fwComEd::PlaneMsg::sptr msg = ::fwComEd::PlaneMsg::New();
+            msg->addEvent( ::fwComEd::PlaneMsg::START_PLANE_INTERACTION );
+            ::fwServices::IEditionService::notify( this->getSptr(), m_pPlane.lock(), msg );
+        }
+    }
+    else if (planeMsg)
+    {
+        if (planeMsg->hasEvent( ::fwComEd::PlaneMsg::PLANE_MODIFIED ) )
+        {
+            this->doUpdate();
+        }
+        else  if (planeMsg->hasEvent( ::fwComEd::PlaneMsg::WAS_SELECTED ) )
+        {
+            // highlight selected plan
+            this->selectPlane(true);
+            setVtkPipelineModified();
+        }
+        else  if (planeMsg->hasEvent( ::fwComEd::PlaneMsg::WAS_DESELECTED ) )
+        {
+            this->selectPlane(false);
+            setVtkPipelineModified();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::doStop() throw(fwTools::Failed)
+{
+    if (m_vtkPlaneCollection && m_vtkImplicitPlane)
+    {
+        m_vtkPlaneCollection->RemoveItem(m_vtkImplicitPlane);
+        m_vtkImplicitPlane->Delete();
+        m_vtkImplicitPlane = 0;
+    }
+
+    m_connections->disconnect();
+
+    this->unregisterServices();
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::setVtkPlaneCollection( vtkObject * col )
+{
+    if (m_vtkPlaneCollection != col)
+    {
+        if (m_vtkPlaneCollection)
+        {
+            if (m_vtkImplicitPlane)
+            {
+                m_vtkPlaneCollection->RemoveItem(m_vtkImplicitPlane);
+            }
+            m_vtkPlaneCollection=0;
+        }
+
+        if ( col )
+        {
+            m_vtkPlaneCollection = vtkPlaneCollection::SafeDownCast(col);
+            if (m_vtkImplicitPlane)
+            {
+                m_vtkPlaneCollection->AddItem(m_vtkImplicitPlane);
+            }
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::selectPlane(bool select)
+{
+    BOOST_FOREACH( ServiceVector::value_type service, m_subServices )
+    {
+        if(!service.expired())
+        {
+            ::visuVTKAdaptor::Point::sptr servicePoint = ::visuVTKAdaptor::Point::dynamicCast(service.lock());
+            if(select)
+            {
+                servicePoint->setColor(1.,0.,0.);
+            }
+            else
+            {
+                servicePoint->setColor(1.,1.,1.);
+            }
+        }
+    }
+
+
+
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneInteractor.cpp
new file mode 100644
index 0000000..1ee73b4
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneInteractor.cpp
@@ -0,0 +1,248 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+
+#include <fwData/Plane.hpp>
+
+#include <fwMath/PlaneFunctions.hpp>
+
+#include <fwComEd/PlaneMsg.hpp>
+#include <fwComEd/PointMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkCommand.h>
+
+#include "visuVTKAdaptor/PlaneInteractor.hpp"
+#include <fwServices/IEditionService.hpp>
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PlaneInteractor, ::fwData::Object ) ;
+
+namespace visuVTKAdaptor
+{
+
+class PlaneInteractorCallback : public vtkCommand
+{
+public:
+    static PlaneInteractorCallback *New()
+    { return new PlaneInteractorCallback(); }
+
+    PlaneInteractorCallback()
+    {}
+
+    ~PlaneInteractorCallback()
+    {}
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        if ( eventId == vtkCommand::KeyPressEvent)
+        {
+            vtkRenderWindowInteractor *rwi = vtkRenderWindowInteractor::SafeDownCast(caller);
+            SLM_ASSERT("invalid vtkRenderWindowInteractor", rwi);
+            SLM_ASSERT("invalid m_adaptor", m_adaptor);
+
+            char *keySym = rwi->GetKeySym();
+
+            if (std::string(keySym) == "space")
+            {
+                m_adaptor->switchPlaneNormal();
+            }
+            else if (std::string(keySym) == "Escape" || std::string(keySym) == "Tab")
+            {
+                m_adaptor->deselectPlane();
+            }
+        }
+        else if (eventId == vtkCommand::MouseWheelForwardEvent)
+        {
+            SetAbortFlag(1);
+            m_adaptor->pushPlane(1);
+        }
+        else if (eventId == vtkCommand::MouseWheelBackwardEvent)
+        {
+            SetAbortFlag(1);
+            m_adaptor->pushPlane(-1);
+        }
+    }
+
+    void setAdaptor( PlaneInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+protected :
+    PlaneInteractor::sptr m_adaptor;
+
+};
+
+//------------------------------------------------------------------------------
+
+PlaneInteractor::PlaneInteractor() throw()
+{
+    m_priority = 1;
+    m_vtkObserver = NULL;
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+PlaneInteractor::~PlaneInteractor() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Tag config is required", m_configuration->getName() == "config");
+    //this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    //this->setPickerId( m_configuration->getAttributeValue("picker") );
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::doStart() throw(fwTools::Failed)
+{
+
+    if (::fwData::Plane::dynamicCast(this->getObject()))
+    {
+        PlaneInteractorCallback *observer = PlaneInteractorCallback::New();
+        observer->setAdaptor( PlaneInteractor::dynamicCast(this->getSptr()) );
+
+        m_vtkObserver = observer;
+
+        this->getInteractor()->AddObserver(vtkCommand::KeyPressEvent  , m_vtkObserver, m_priority);
+        this->getInteractor()->AddObserver(vtkCommand::KeyReleaseEvent, m_vtkObserver, m_priority);
+        this->getInteractor()->AddObserver(vtkCommand::MouseWheelForwardEvent, m_vtkObserver, m_priority);
+        this->getInteractor()->AddObserver(vtkCommand::MouseWheelBackwardEvent, m_vtkObserver, m_priority);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doStop();
+    this->doStart();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::doStop() throw(fwTools::Failed)
+{
+    if(m_vtkObserver)
+    {
+        this->getInteractor()->RemoveObservers(vtkCommand::KeyPressEvent  , m_vtkObserver);
+        this->getInteractor()->RemoveObservers(vtkCommand::KeyReleaseEvent, m_vtkObserver);
+        this->getInteractor()->RemoveObservers(vtkCommand::MouseWheelForwardEvent, m_vtkObserver);
+        this->getInteractor()->RemoveObservers(vtkCommand::MouseWheelBackwardEvent, m_vtkObserver);
+        m_vtkObserver->Delete();
+        m_vtkObserver = NULL;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::switchPlaneNormal()
+{
+    ::fwData::Plane::sptr plane ( ::fwData::Plane::dynamicCast( this->getObject() ) );
+
+    if (plane)
+    {
+        ::fwData::Point::sptr pt0 = plane->getPoints()[0];
+        ::fwData::Point::sptr pt1 = plane->getPoints()[1];
+        ::fwData::Point::sptr pt2 = plane->getPoints()[2];
+        if ( pt0 && pt1 && pt2 )
+        {
+            plane->setValue(pt0,pt2,pt1);
+
+            ::fwComEd::PlaneMsg::sptr modifiedMsg = ::fwComEd::PlaneMsg::New();
+            modifiedMsg->addEvent( ::fwComEd::PlaneMsg::PLANE_MODIFIED );
+            ::fwServices::IEditionService::notify( this->getSptr(), plane, modifiedMsg);
+        }
+        this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::pushPlane(double factor)
+{
+    ::fwData::Plane::sptr plane ( ::fwData::Plane::dynamicCast( this->getObject() ) );
+    if (plane)
+    {
+        ::fwData::Point::sptr pt0 = plane->getPoints()[0];
+        ::fwData::Point::sptr pt1 = plane->getPoints()[1];
+        ::fwData::Point::sptr pt2 = plane->getPoints()[2];
+
+        fwVec3d normal = ::fwMath::getNormal(plane->getPlane());
+        if ( pt0 && pt1 && pt2 )
+        {
+            fwVec3d vec0 = pt0->getCoord();
+            fwVec3d vec1 = pt1->getCoord();
+            fwVec3d vec2 = pt2->getCoord();
+
+            fwVec3d vector = normal*factor;
+
+            vec0 = vec0 + normal*factor;
+            vec1 = vec1 + normal*factor;
+            vec2 = vec2 + normal*factor;
+
+            pt0->setCoord(vec0);
+            pt1->setCoord(vec1);
+            pt2->setCoord(vec2);
+
+            plane->setValue(pt0,pt1,pt2);
+
+            normal = ::fwMath::getNormal(plane->getPlane());
+
+            ::fwComEd::PointMsg::sptr modifiedMsg = ::fwComEd::PointMsg::New();
+            modifiedMsg->addEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+            ::fwServices::IEditionService::notify( this->getSptr(), pt0, modifiedMsg);
+            ::fwComEd::PointMsg::sptr modifiedMsg2 = ::fwComEd::PointMsg::New();
+            modifiedMsg2->addEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+            ::fwServices::IEditionService::notify( this->getSptr(), pt1, modifiedMsg2);
+            ::fwComEd::PointMsg::sptr modifiedMsg3 = ::fwComEd::PointMsg::New();
+            modifiedMsg3->addEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+            ::fwServices::IEditionService::notify( this->getSptr(), pt2, modifiedMsg3);
+            this->setVtkPipelineModified();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneInteractor::deselectPlane()
+{
+    ::fwData::Plane::sptr plane ( ::fwData::Plane::dynamicCast( this->getObject() ) );
+    if (plane)
+    {
+        ::fwComEd::PlaneMsg::sptr deselectMsg = ::fwComEd::PlaneMsg::New();
+        deselectMsg->addEvent( ::fwComEd::PlaneMsg::DESELECT_PLANE );
+        ::fwServices::IEditionService::notify( this->getSptr(), plane, deselectMsg);
+    }
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneList.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneList.cpp
new file mode 100644
index 0000000..5de736b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneList.cpp
@@ -0,0 +1,306 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/PlaneList.hpp>
+#include <fwData/Plane.hpp>
+#include <fwData/Boolean.hpp>
+
+
+#include <fwComEd/PlaneMsg.hpp>
+#include <fwComEd/PlaneListMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkCommand.h>
+#include <vtkCellPicker.h>
+#include <vtkActor.h>
+#include <vtkAssemblyNode.h>
+#include <vtkAssemblyPath.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include "visuVTKAdaptor/Plane.hpp"
+#include "visuVTKAdaptor/PlaneList.hpp"
+#include <fwServices/IEditionService.hpp>
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PlaneList, ::fwData::PlaneList ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+
+void notifyDeletePlane( ::fwData::PlaneList::sptr planeList, ::fwData::Plane::sptr plane )
+{
+    ::fwComEd::PlaneListMsg::sptr msg = ::fwComEd::PlaneListMsg::New();
+    msg->addEvent( ::fwComEd::PlaneListMsg::DESELECT_ALL_PLANES );
+    msg->addEvent( ::fwComEd::PlaneListMsg::REMOVE_PLANE, plane );
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = planeList->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+    fwServicesNotifyMsgMacro( planeList->getLightID(), sig, msg );
+}
+
+class vtkPlaneDeleteCallBack : public vtkCommand
+{
+
+public :
+    static vtkPlaneDeleteCallBack *New( ::fwRenderVTK::IVtkAdaptorService *service)
+    { return new vtkPlaneDeleteCallBack(service); }
+
+    vtkPlaneDeleteCallBack( ::fwRenderVTK::IVtkAdaptorService *service )
+    : m_service(service),
+      m_picker( vtkCellPicker::New() ),
+      m_propCollection( vtkPropCollection::New() )
+    {
+        m_lastPos[0] = -1;
+        m_lastPos[1] = -1;
+        m_picker->PickFromListOn();
+        m_picker->SetTolerance(0.001);
+
+        m_display[2]=0.0;
+    }
+
+    ~vtkPlaneDeleteCallBack( )
+    {
+        m_picker->Delete();
+        m_picker = NULL;
+
+        m_propCollection->Delete();
+        m_propCollection = NULL;
+    }
+
+
+    void fillPickList()
+    {
+        m_picker->InitializePickList();
+        m_propCollection->RemoveAllItems();
+        m_service->getAllSubProps(m_propCollection);
+        m_propCollection->InitTraversal();
+
+        vtkProp *prop;
+
+        while ( (prop = m_propCollection->GetNextProp()) )
+        {
+            m_picker->AddPickList(prop);
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        int pos[2];
+        m_service->getInteractor()->GetLastEventPosition(pos);
+
+        if ( eventId == vtkCommand::RightButtonPressEvent )
+        {
+            std::copy(pos, pos+1, m_lastPos);
+            m_display[0] = pos[0];
+            m_display[1] = pos[1];
+
+            this->fillPickList();
+            if (m_picker->Pick( m_display , m_service->getRenderer() ) )
+            {
+                if(getSelectedPlane())
+                {
+                    SetAbortFlag(1);
+                }
+                else
+                {
+                    m_pickedPlane.reset();
+                }
+            }
+        }
+        else if ( eventId == vtkCommand::RightButtonReleaseEvent && std::equal(pos, pos+1, m_lastPos) && !m_pickedPlane.expired() )
+        {
+            // backup of plane
+            ::fwData::Plane::sptr planeBackup(m_pickedPlane);
+
+            ::fwData::PlaneList::sptr planeList = m_service->getObject< ::fwData::PlaneList >();
+            planeList->getRefPlanes().erase
+            (
+                    std::find( planeList->getRefPlanes().begin(), planeList->getRefPlanes().end(), m_pickedPlane.lock())
+            );
+            notifyDeletePlane(planeList, planeBackup);
+        }
+    }
+    bool getSelectedPlane()
+    {
+        bool isFind = false;
+        vtkPropCollection *propc = m_picker->GetActors();
+        vtkProp *prop;
+
+        propc->InitTraversal();
+        while ( (prop = propc->GetNextProp()) )
+        {
+            m_pickedPlane = ::fwData::Plane::dynamicCast(m_service->getAssociatedObject(prop,1));
+            if( !m_pickedPlane.expired() )
+            {
+                ::fwData::PlaneList::sptr planeList = m_service->getObject< ::fwData::PlaneList >();
+                if(!planeList->getRefPlanes().empty())
+                {
+                    ::fwData::PlaneList::PlaneListContainer::iterator itr = std::find( planeList->getRefPlanes().begin(), planeList->getRefPlanes().end(), m_pickedPlane.lock());
+                    if(itr != planeList->getRefPlanes().end() )
+                    {
+                        isFind = true;
+                        break;
+                    }
+                }
+            }
+        }
+        return isFind;
+    }
+
+protected :
+    ::fwRenderVTK::IVtkAdaptorService *m_service;
+    vtkPicker * m_picker;
+    vtkPropCollection * m_propCollection;
+    double m_display[3];
+    int m_lastPos[2];
+    ::fwData::Plane::wptr m_pickedPlane;
+
+};
+
+//------------------------------------------------------------------------------
+
+PlaneList::PlaneList() throw()
+    : m_planeCollectionId("")
+{
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::ADD_PLANE );
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::REMOVE_PLANE );
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::PLANELIST_VISIBILITY );
+}
+
+//------------------------------------------------------------------------------
+
+PlaneList::~PlaneList() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::configuring() throw(fwTools::Failed)
+{
+
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPlaneCollectionId( m_configuration->getAttributeValue("planecollection") );
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::doStart() throw(fwTools::Failed)
+{
+    m_rightButtonCommand = vtkPlaneDeleteCallBack::New(this);
+    this->getInteractor()->AddObserver( "RightButtonPressEvent" , m_rightButtonCommand, 1 );
+    this->getInteractor()->AddObserver( "RightButtonReleaseEvent" , m_rightButtonCommand, 1 );
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::PlaneList::sptr planeList = this->getObject< ::fwData::PlaneList >();
+
+    bool showPlanes;
+    showPlanes = planeList->getField("ShowPlanes", ::fwData::Boolean::New(true))->value();
+    if(showPlanes)
+    {
+        BOOST_FOREACH( ::fwData::Plane::sptr plane, planeList->getPlanes() )
+        {
+            ::fwRenderVTK::IVtkAdaptorService::sptr servicePlane =
+                    ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+                    ( plane, "::visuVTKAdaptor::Plane" );
+            SLM_ASSERT("servicePlane not instanced", servicePlane);
+
+            servicePlane->setRenderService(this->getRenderService());
+            servicePlane->setRenderId( this->getRenderId() );
+            servicePlane->setPickerId( this->getPickerId() );
+            servicePlane->setAutoRender( this->getAutoRender() );
+
+            if (!m_planeCollectionId.empty())
+            {
+                Plane::dynamicCast(servicePlane)->setVtkPlaneCollection( this->getVtkObject(m_planeCollectionId) );
+            }
+            servicePlane->start();
+
+            this->registerService(servicePlane);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwComEd::PlaneListMsg::csptr planeListMsg = ::fwComEd::PlaneListMsg::dynamicConstCast( msg );
+    if ( planeListMsg )
+    {
+        if (planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::ADD_PLANE )
+                || planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::REMOVE_PLANE) )
+        {
+            this->doStop();
+            this->doStart();
+        }
+        else if ( planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::PLANELIST_VISIBILITY ) )
+        {
+            ::fwData::PlaneList::sptr planeList = this->getObject< ::fwData::PlaneList >();
+
+            this->doStop();
+            bool showPlanes;
+            showPlanes = planeList->getField("ShowPlanes", ::fwData::Boolean::New(true))->value();
+            OSLM_INFO( "Receive event ShowPlanes : " << showPlanes );
+            if(showPlanes)
+            {
+                this->doStart();
+            }
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::doSwap() throw(fwTools::Failed)
+{
+    this->doStop();
+
+    ::fwData::PlaneList::sptr planeList = this->getObject< ::fwData::PlaneList >();
+    bool showPlanes;
+    showPlanes = planeList->getField("ShowPlanes", ::fwData::Boolean::New(true))->value();
+    if(showPlanes)
+    {
+        this->doStart();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::doStop() throw(fwTools::Failed)
+{
+    if ( m_rightButtonCommand ) // can be not instanciated
+    {
+        this->getInteractor()->RemoveObserver(m_rightButtonCommand);
+        m_rightButtonCommand->Delete();
+        m_rightButtonCommand = 0;
+    }
+
+    this->unregisterServices();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelectionNotifier.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelectionNotifier.cpp
new file mode 100644
index 0000000..f6fdcde
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelectionNotifier.cpp
@@ -0,0 +1,245 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/PlaneListMsg.hpp>
+#include <fwComEd/PlaneMsg.hpp>
+
+#include <fwData/Plane.hpp>
+#include <fwData/PlaneList.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "visuVTKAdaptor/PlaneSelectionNotifier.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PlaneSelectionNotifier, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+PlaneSelectionNotifier::PlaneSelectionNotifier() throw()
+{
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::ADD_PLANE );
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::REMOVE_PLANE);
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::PLANELIST_VISIBILITY);
+    //addNewHandledEvent( ::fwComEd::PlaneListMsg::DESELECT_ALL_PLANES );
+    //addNewHandledEvent( ::fwComEd::PlaneMsg::START_PLANE_INTERACTION );
+    //addNewHandledEvent( ::fwComEd::PlaneMsg::DESELECT_PLANE );
+}
+
+//------------------------------------------------------------------------------
+
+PlaneSelectionNotifier::~PlaneSelectionNotifier() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    assert(m_configuration->getName() == "config");
+    assert(m_configuration->hasAttribute("planelist"));
+    assert(m_configuration->hasAttribute("planeselection"));
+
+    this->setPlaneListId( m_configuration->getAttributeValue("planelist") );
+    this->setPlaneSelectionId( m_configuration->getAttributeValue("planeselection") );
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    SLM_ASSERT("m_currentPlaneList should be expired", m_currentPlaneList.expired());
+
+    if (composite->find(m_planeListId) != composite->end())
+    {
+        m_currentPlaneList = ::fwData::PlaneList::dynamicCast(composite->getContainer()[m_planeListId]);
+    }
+
+    ::fwData::PlaneList::sptr planeList = m_currentPlaneList.lock();
+    if(planeList)
+    {
+        m_plConnection = planeList->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+        BOOST_FOREACH( ::fwData::Plane::sptr plane, planeList->getPlanes() )
+        {
+            m_planeConnections[plane->getID()] = plane->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                                            this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    ::fwData::PlaneList::sptr planeList = m_currentPlaneList.lock();
+    if(planeList)
+    {
+
+        BOOST_FOREACH( ::fwData::Plane::sptr plane, planeList->getPlanes() )
+        {
+            m_planeConnections[plane->getID()].disconnect();
+        }
+
+        m_plConnection.disconnect();
+
+        m_currentPlaneList.reset();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::PlaneListMsg::csptr planeListMsg = ::fwComEd::PlaneListMsg::dynamicConstCast( msg );
+    ::fwComEd::PlaneMsg::csptr planeMsg         = ::fwComEd::PlaneMsg::dynamicConstCast( msg );
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast( msg );
+
+    if ( compositeMsg )
+    {
+        ::fwData::Composite::ContainerType objects;
+        ::fwData::Composite::sptr modifiedKeys;
+
+        modifiedKeys = compositeMsg->getAddedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        modifiedKeys = compositeMsg->getNewChangedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        modifiedKeys = compositeMsg->getRemovedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        if ( objects.find(m_planeListId) != objects.end() )
+        {
+            this->doStop();
+            this->doStart();
+            this->deselectPlane();
+        }
+    }
+    else if ( planeListMsg )
+    {
+        ::fwData::PlaneList::sptr planeList = ::fwData::PlaneList::dynamicCast(planeListMsg->getSubject().lock());
+        SLM_ASSERT("Messsage's subject should be a PlaneList", planeList);
+        bool showPlanes;
+        showPlanes = planeList->getField("ShowPlanes", ::fwData::Boolean::New(true));
+
+        if(!planeList->getRefPlanes().empty())
+        {
+            if (planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::ADD_PLANE))
+            {
+                //New plane selected is the last one in planeList
+                ::fwData::Plane::sptr plane = *(planeList->getRefPlanes().rbegin());
+                this->selectPlane(plane);
+
+                m_planeConnections[plane->getID()] = plane->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                                                this->slot(::fwServices::IService::s_RECEIVE_SLOT));
+            }
+            else if(showPlanes && planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::PLANELIST_VISIBILITY ))
+            {
+                //New plane selected is the last one in planeList
+                ::fwData::Plane::sptr plane = *(planeList->getRefPlanes().rbegin());
+                this->selectPlane(plane);
+            }
+        }
+        if (planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::REMOVE_PLANE))
+        {
+            //Remove connections
+            ::fwTools::Object::csptr dataInfo = planeListMsg->getDataInfo(::fwComEd::PlaneListMsg::REMOVE_PLANE);
+
+            SLM_ASSERT("Sorry, Missing data info", dataInfo);
+            ::fwData::Plane::sptr plane = ::fwData::Plane::dynamicCast(::fwTools::Object::constCast(dataInfo));
+
+            m_planeConnections[plane->getID()].disconnect();
+        }
+        if ( (!showPlanes && planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::PLANELIST_VISIBILITY ))
+                || planeListMsg->hasEvent( ::fwComEd::PlaneListMsg::DESELECT_ALL_PLANES ) )
+        {
+            this->deselectPlane();
+        }
+    }
+    else if (planeMsg)
+    {
+        if (planeMsg->hasEvent( ::fwComEd::PlaneMsg::START_PLANE_INTERACTION ))
+        {
+            this->selectPlane(::fwData::Object::dynamicCast(planeMsg->getSubject().lock()));
+        }
+        if (planeMsg->hasEvent( ::fwComEd::PlaneMsg::DESELECT_PLANE ))
+        {
+            this->deselectPlane();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelectionNotifier::selectPlane( ::fwData::Object::sptr plane )
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+
+    ::fwData::Object::sptr oldPlane = composite->getContainer()[m_planeSelectionId];
+
+    if (plane && plane != oldPlane)
+    {
+        ::fwComEd::CompositeMsg::sptr compositeMsg = ::fwComEd::CompositeMsg::New();
+        compositeMsg->appendChangedKey(m_planeSelectionId,oldPlane, plane);
+        composite->getContainer()[m_planeSelectionId] = plane;
+        ::fwServices::IEditionService::notify(this->getSptr(), composite, compositeMsg);
+    }
+}
+
+void PlaneSelectionNotifier::deselectPlane()
+{
+     SLM_TRACE_FUNC();
+     ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+     if ( composite->find(m_planeSelectionId) != composite->end() )
+     {
+        ::fwComEd::CompositeMsg::sptr compositeMsg = ::fwComEd::CompositeMsg::New();
+        compositeMsg->appendRemovedKey(m_planeSelectionId,(*composite)[m_planeSelectionId]);
+
+        composite->getContainer().erase(m_planeSelectionId);
+
+        ::fwServices::IEditionService::notify(this->getSptr(), composite, compositeMsg);
+     }
+}
+
+
+} //namespace visuVTKAdaptor
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelector.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelector.cpp
new file mode 100644
index 0000000..0938c3c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PlaneSelector.cpp
@@ -0,0 +1,137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/PlaneListMsg.hpp>
+#include <fwComEd/PlaneMsg.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwData/Object.hpp>
+
+#include "visuVTKAdaptor/PlaneSelector.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PlaneSelector, ::fwData::Object ) ;
+
+namespace visuVTKAdaptor
+{
+
+PlaneSelector::PlaneSelector() throw()
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+PlaneSelector::~PlaneSelector() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    assert(m_configuration->getName() == "config");
+    //assert(m_configuration->hasAttribute("planelist"));
+    //assert(m_configuration->hasAttribute("planeselection"));
+
+    //this->setPlaneListId( m_configuration->getAttributeValue("planelist") );
+    //this->setPlaneSelectionId( m_configuration->getAttributeValue("planeselection") );
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Object::sptr object = ::fwData::Object::dynamicCast(this->getObject());
+
+    if (object)
+    {
+        m_currentObject = object;
+    }
+    this->selectObject(object);
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    SLM_ASSERT("NOT IMPLEMENTED",false);
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Object::sptr object = ::fwData::Object::dynamicCast(this->getObject());
+    this->selectObject(object);
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->selectObject( ::fwData::Object::sptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneSelector::selectObject( ::fwData::Object::sptr object )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Object::sptr oldObject = m_currentObject.lock();
+
+    if (oldObject != object)
+    {
+        if (oldObject)
+        {
+            ::fwComEd::PlaneMsg::sptr deselectMsg = ::fwComEd::PlaneMsg::New();
+            deselectMsg->addEvent( ::fwComEd::PlaneMsg::WAS_DESELECTED );
+            ::fwServices::IEditionService::notify( this->getSptr(), oldObject, deselectMsg); //TODO: remove option
+        }
+
+        m_currentObject.reset();
+
+        if (object)
+        {
+            if ( object )
+            {
+                ::fwComEd::PlaneMsg::sptr selectMsg = ::fwComEd::PlaneMsg::New();
+                selectMsg->addEvent( ::fwComEd::PlaneMsg::WAS_SELECTED );
+                ::fwServices::IEditionService::notify( this->getSptr(), object, selectMsg); //TODO: remove option
+            }
+            m_currentObject = object;
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
+
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plugin.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plugin.cpp
new file mode 100644
index 0000000..a9d9253
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Plugin.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include "visuVTKAdaptor/Plugin.hpp"
+
+
+namespace visuVTKAdaptor
+{
+using namespace ::fwRuntime::utils;
+static GenericExecutableFactoryRegistrar<Plugin> registrar("visuVTKAdaptor::Plugin");
+
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace operators
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Point.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Point.cpp
new file mode 100644
index 0000000..7d1eee6
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Point.cpp
@@ -0,0 +1,268 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkCommand.h>
+#include <vtkHandleWidget.h>
+#include <vtkSphereHandleRepresentation.h>
+
+#include <fwData/Point.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/PointMsg.hpp>
+
+#include <vtkSphereSource.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPicker.h>
+#include <vtkPropCollection.h>
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkWidgetEventTranslator.h>
+
+#include "fwRenderVTK/vtk/Helpers.hpp"
+#include "fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp"
+#include "visuVTKAdaptor/Point.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Point, ::fwData::Point ) ;
+
+namespace visuVTKAdaptor
+{
+
+class vtkPointUpdateCallBack : public vtkCommand
+{
+
+public :
+    static vtkPointUpdateCallBack *New( ::fwRenderVTK::IVtkAdaptorService *service)
+    { return new vtkPointUpdateCallBack(service); }
+
+    vtkPointUpdateCallBack( ::fwRenderVTK::IVtkAdaptorService *service )
+    : m_service(service),
+      m_pickLimiter (0)
+    {}
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        vtkHandleWidget *handler = vtkHandleWidget::SafeDownCast(caller);
+        if (!handler) {return;}
+
+        if ( eventId == vtkCommand::StartInteractionEvent)
+        {
+            handler->AddObserver("EndInteractionEvent" ,this );
+            handler->AddObserver("InteractionEvent" ,this );
+
+        }
+        else if ( eventId == vtkCommand::EndInteractionEvent )
+        {
+            handler->RemoveObservers("EndInteractionEvent" ,this );
+            handler->RemoveObservers("InteractionEvent" ,this );
+        }
+
+        ::fwData::Point::sptr point= m_service->getObject< ::fwData::Point >();
+
+        vtkHandleRepresentation *representation = vtkHandleRepresentation::SafeDownCast(handler->GetRepresentation());
+        SLM_ASSERT("handler not instanced", handler);
+        double *world = representation->GetWorldPosition();
+
+        ::fwComEd::PointMsg::sptr msg = ::fwComEd::PointMsg::New();// (  new fwServices::ObjectMsg(point) );
+
+        if ( (m_pickLimiter-- == 0 && eventId == vtkCommand::InteractionEvent)
+                || eventId == vtkCommand::EndInteractionEvent )
+        {
+            m_pickLimiter=2;
+
+            double display[3];
+            int x,y;
+            handler->GetInteractor()->GetLastEventPosition(x,y);
+            display[0]=x;
+            display[1]=y;
+            display[2]=0;
+
+            if ( m_service->getPicker() && m_service->getPicker()->Pick( display , m_service->getRenderer() ) )
+            {
+                ::fwRenderVTK::vtk::getNearestPickedPosition(m_service->getPicker(), m_service->getRenderer(), world);
+            }
+        }
+        else if (eventId == vtkCommand::StartInteractionEvent)
+        {
+            msg->addEvent( ::fwComEd::PointMsg::START_POINT_INTERACTION );
+        }
+
+        std::copy( world, world+3 , point->getRefCoord().begin() );
+
+        msg->addEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );//setAllModified();
+
+        ::fwServices::IEditionService::notify( m_service->getSptr(), point, msg );
+        m_service->update();
+    }
+
+protected :
+
+    ::fwRenderVTK::IVtkAdaptorService * m_service;
+
+    int m_pickLimiter;
+};
+
+//------------------------------------------------------------------------------
+
+Point::Point() throw() :
+    m_handle( vtkHandleWidget::New() ),
+//    m_representation( vtkSphereHandleRepresentation::New() ),
+    m_representation( ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation::New() ),
+    m_pointUpdateCommand(0)
+{
+    m_handle->SetRepresentation(m_representation);
+    m_handle->SetPriority(0.8);
+
+    vtkWidgetEventTranslator *translator = m_handle->GetEventTranslator();
+
+    translator->RemoveTranslation(vtkCommand::MiddleButtonPressEvent);
+    translator->RemoveTranslation(vtkCommand::MiddleButtonReleaseEvent);
+    translator->RemoveTranslation(vtkCommand::RightButtonPressEvent);
+    translator->RemoveTranslation(vtkCommand::RightButtonReleaseEvent);
+
+    ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation *rep =
+        ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation::SafeDownCast(m_representation);
+
+    rep->GetSelectedProperty()->SetOpacity(.3);
+    rep->GetMarkerProperty()->SetOpacity(.3);
+    rep->SetHandleSize(7);
+
+    //addNewHandledEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+Point::~Point() throw()
+{
+    SLM_TRACE_FUNC();
+
+    m_handle->SetRepresentation(0);
+    m_handle->Delete();
+    m_handle = 0;
+
+    m_representation->Delete();
+    m_representation = 0;
+
+}
+
+//------------------------------------------------------------------------------
+
+void Point::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Point::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    m_handle->SetInteractor(  this->getInteractor() );
+    m_handle->KeyPressActivationOff();
+
+    m_pointUpdateCommand = vtkPointUpdateCallBack::New(this);
+
+    m_handle->AddObserver( "StartInteractionEvent", m_pointUpdateCommand );
+
+    m_handle->On();
+
+    // We don't want to add m_representation to the renderer, m_handle
+    // is already managing that.
+    this->registerProp(m_representation);
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Point::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Point::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Point::sptr point = this->getObject < ::fwData::Point >();
+
+    SLM_ASSERT("point not instanced", point);
+
+    double ps[3];
+    assert ( point->getCRefCoord().size()==3 );
+    std::copy(point->getCRefCoord().begin(),point->getCRefCoord().end(), ps  );
+    m_representation->SetWorldPosition( ps );
+//  getRenderService()->update();
+    getRenderer()->ResetCameraClippingRange();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Point::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_ASSERT("ACH : receive a msg that no concern his object", _msg->getSubject().lock() == this->getObject() );
+    ::fwComEd::PointMsg::csptr pointMsg = ::fwComEd::PointMsg::dynamicConstCast( _msg );
+    if ( pointMsg && pointMsg->hasEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED ) )
+    {
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Point::doStop() throw(fwTools::Failed)
+{
+    m_handle->Off();
+    m_handle->RemoveObserver(m_pointUpdateCommand);
+
+    m_pointUpdateCommand->Delete();
+    m_pointUpdateCommand = 0;
+
+    m_handle->SetInteractor(0);
+
+    this->unregisterProps();
+}
+
+//------------------------------------------------------------------------------
+
+void Point::setColor(double red, double green, double blue, double alpha)
+{
+    ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation *rep =
+            ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation::SafeDownCast(m_representation);
+    SLM_ASSERT("MarkedSphereHandleRepresentation cast failed", rep);
+    rep->GetProperty()->SetColor(red, green, blue);
+    rep->GetProperty()->SetOpacity(alpha);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Point::setSelectedColor(double red, double green, double blue, double alpha)
+{
+    ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation *rep =
+                ::fwRenderVTK::vtk::MarkedSphereHandleRepresentation::SafeDownCast(m_representation);
+    SLM_ASSERT("MarkedSphereHandleRepresentation cast failed", rep);
+    rep->GetSelectedProperty()->SetColor(red, green, blue);
+    rep->GetSelectedProperty()->SetOpacity(alpha);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointLabel.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointLabel.cpp
new file mode 100644
index 0000000..4f1f605
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointLabel.cpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/format.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/String.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/PointMsg.hpp>
+
+#include <vtkRenderer.h>
+#include <vtkTextActor.h>
+
+#include "visuVTKAdaptor/PointLabel.hpp"
+
+#include <sstream>
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PointLabel, ::fwData::Point ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+PointLabel::PointLabel() : Text()
+{
+    m_actor->GetPositionCoordinate()->SetCoordinateSystemToWorld();
+    m_actor->GetPosition2Coordinate()->SetCoordinateSystemToWorld();
+    //addNewHandledEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+void PointLabel::starting() throw(::fwTools::Failed)
+{
+    Text::starting();
+    doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void PointLabel::stopping() throw(::fwTools::Failed)
+{
+    Text::stopping();
+}
+
+//------------------------------------------------------------------------------
+
+void PointLabel::doUpdate() throw(::fwTools::Failed)
+{
+    ::fwData::Point::sptr point = this->getObject< ::fwData::Point >();
+
+    std::string label = point->getField(::fwComEd::Dictionary::m_labelId, ::fwData::String::New())->value() ;
+
+    setText( label );
+
+    double px = point->getCRefCoord()[0];
+    double py = point->getCRefCoord()[1];
+    double pz = point->getCRefCoord()[2];
+
+    m_actor->GetPositionCoordinate()->SetValue(px,py,pz);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void PointLabel::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_ASSERT("ACH : recieve a msg that no concern his object", _msg->getSubject().lock() == this->getObject() );
+
+    ::fwComEd::PointMsg::csptr pointMsg = ::fwComEd::PointMsg::dynamicConstCast( _msg );
+    if ( pointMsg && pointMsg->hasEvent( ::fwComEd::PointMsg::POINT_IS_MODIFIED ) )
+    {
+        this->doUpdate();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PointLabel::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointList.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointList.cpp
new file mode 100644
index 0000000..9a19eb0
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointList.cpp
@@ -0,0 +1,188 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iterator>
+#include <algorithm>
+#include <functional>
+
+#include <boost/foreach.hpp>
+#include <boost/function.hpp>
+
+#include <fwData/PointList.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwComEd/PointListMsg.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkCubeSource.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+
+#include "visuVTKAdaptor/PointList.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PointList, ::fwData::PointList ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+PointList::PointList() throw()
+{
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_ADDED );
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_MODIFIED );
+    //addNewHandledEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED );
+}
+
+//------------------------------------------------------------------------------
+
+PointList::~PointList() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void PointList::configuring() throw(fwTools::Failed)
+{
+
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::doStart() throw(fwTools::Failed)
+{
+    m_oldWeakPointList.clear();
+
+    m_weakPointList = this->getWeakPointList();
+
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::doUpdate() throw(fwTools::Failed)
+{
+    WeakPointListType points = this->getNewPoints();
+    this->createServices( points );
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if ( msg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_REMOVED )
+         || ( msg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_MODIFIED )) )
+    {
+        this->doStop();
+        this->doUpdate();
+        setVtkPipelineModified();
+    }
+    else if ( msg->hasEvent( ::fwComEd::PointListMsg::ELEMENT_ADDED ))
+    {
+        m_oldWeakPointList = m_weakPointList;
+        m_weakPointList    = this->getWeakPointList();
+        this->doUpdate();
+        setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::doSwap() throw(fwTools::Failed)
+{
+    this->doStop();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::doStop() throw(fwTools::Failed)
+{
+    m_oldWeakPointList.clear();
+    m_weakPointList.clear();
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::createServices(WeakPointListType &wPtList)
+{
+
+    BOOST_FOREACH( ::fwData::Point::wptr wpt, wPtList )
+    {
+        SLM_ASSERT("Point Expired", !wpt.expired());
+
+        ::fwData::Point::sptr pt = wpt.lock();
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+                ( pt, "::visuVTKAdaptor::Point" );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setRenderService(this->getRenderService());
+        service->setRenderId( this->getRenderId() );
+        service->setPickerId( this->getPickerId() );
+        service->setAutoRender( this->getAutoRender() );
+        service->start();
+
+        this->registerService(service);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+PointList::WeakPointListType PointList::getWeakPointList()
+{
+    ::fwData::PointList::sptr ptList = this->getObject< ::fwData::PointList >();
+    WeakPointListType weakList;
+
+    std::copy(ptList->getRefPoints().begin(), ptList->getRefPoints().end(), std::back_inserter(weakList));
+
+    return weakList;
+}
+
+//------------------------------------------------------------------------------
+
+PointList::WeakPointListType PointList::getNewPoints()
+{
+    WeakPointListType newPoints;
+
+//    std::set_difference (
+//            m_weakPointList.begin(), m_weakPointList.end(),
+//            m_oldWeakPointList.begin(), m_oldWeakPointList.end(),
+//            std::back_inserter(newPoints)
+//            );
+    bool isFound;
+    BOOST_FOREACH(::fwData::Point::wptr point, m_weakPointList)
+    {
+        isFound = false;
+        BOOST_FOREACH(::fwData::Point::wptr oldPoint, m_oldWeakPointList)
+        {
+            isFound = (point.lock() == oldPoint.lock());
+            if(isFound)
+                break;
+        }
+        if(!isFound)
+        {
+            newPoints.push_back(point);
+        }
+    }
+    return newPoints;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointListInteractor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointListInteractor.cpp
new file mode 100644
index 0000000..ff886e9
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/PointListInteractor.cpp
@@ -0,0 +1,236 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#include <boost/foreach.hpp>
+
+#include <vtkAbstractPropPicker.h>
+#include <vtkActor.h>
+#include <vtkCommand.h>
+#include <vtkCubeSource.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwComEd/PointListMsg.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwRenderVTK/vtk/Helpers.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/macros.hpp>
+
+#include "visuVTKAdaptor/PointListInteractor.hpp"
+#include <fwServices/IEditionService.hpp>
+
+
+#define START_INTERACTION_EVENT vtkCommand::LeftButtonPressEvent
+#define STOP_INTERACTION_EVENT  vtkCommand::LeftButtonReleaseEvent
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::PointListInteractor, ::fwData::PointList ) ;
+
+namespace visuVTKAdaptor
+{
+
+class PointListInteractorCallback : public vtkCommand
+{
+public:
+    static PointListInteractorCallback *New()
+    { return new PointListInteractorCallback(); }
+
+    PointListInteractorCallback()
+        : m_priority(-1),
+          m_mouseMoveObserved(false)
+    {
+        m_picker = NULL;
+        this->PassiveObserverOff();
+    }
+
+    ~PointListInteractorCallback()
+    {
+
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        assert(m_priority>=0);
+        SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+        SLM_ASSERT("m_picker not instanced", m_picker);
+        if ( m_mouseMoveObserved || (m_adaptor->getInteractor()->GetControlKey() && m_adaptor->getInteractor()->GetShiftKey()) )
+        {
+            if ( eventId == vtkCommand::MouseMoveEvent )
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                if(pickSomething())
+                {
+                    process();
+                }
+            }
+            else if ( eventId == START_INTERACTION_EVENT)
+            {
+                assert(m_mouseMoveObserved == false );
+                if ( pickSomething() )
+                {
+                    m_mouseMoveObserved = true;
+                    SetAbortFlag(1);
+                    m_adaptor->resetPointList();
+                    process();
+                    m_adaptor->getInteractor()->AddObserver(vtkCommand::MouseMoveEvent, this, m_priority);
+                }
+            }
+            else if ( eventId == STOP_INTERACTION_EVENT && m_mouseMoveObserved)
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                m_adaptor->getInteractor()->RemoveObservers(vtkCommand::MouseMoveEvent, this);
+                m_mouseMoveObserved = false;
+            }
+        }
+    }
+
+    bool pickSomething()
+    {
+        int x,y;
+        double display[3];
+
+        m_adaptor->getInteractor()->GetEventPosition(x, y);
+        display[0] = x;
+        display[1] = y;
+        display[2] = 0;
+
+        return  m_picker->Pick( display , m_adaptor->getRenderer() );
+    }
+
+
+    void process() // from
+    {
+        double world[3] = {-1,0,0};
+        ::fwRenderVTK::vtk::getNearestPickedPosition(m_picker, m_adaptor->getRenderer(), world);
+        OSLM_TRACE("PICK" << world[0] << " ," << world[1] << " ," << world[2] );
+        m_adaptor->addPoint( world[0], world[1], world[2] );
+    }
+
+    void setAdaptor( PointListInteractor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *adaptor)
+    {
+        m_picker = adaptor;
+    }
+
+    void setPriority( float priority )
+    {
+        m_priority = priority;
+    }
+
+protected :
+    PointListInteractor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    float    m_priority;
+
+    bool m_mouseMoveObserved;
+
+};
+
+//------------------------------------------------------------------------------
+
+PointListInteractor::PointListInteractor() throw()
+    : m_priority(0.999)
+{
+    //handlingEventOff();
+}
+
+//------------------------------------------------------------------------------
+
+PointListInteractor::~PointListInteractor() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::doStart() throw(fwTools::Failed)
+{
+    PointListInteractorCallback *observer = PointListInteractorCallback::New();
+    observer->setAdaptor( PointListInteractor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+    observer->setPriority(  m_priority );
+
+    m_interactionCommand = observer;
+
+    this->getInteractor()->AddObserver(START_INTERACTION_EVENT, m_interactionCommand, m_priority);
+    this->getInteractor()->AddObserver(STOP_INTERACTION_EVENT, m_interactionCommand, m_priority);
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::doSwap() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::doStop() throw(fwTools::Failed)
+{
+    this->getInteractor()->RemoveObservers(START_INTERACTION_EVENT, m_interactionCommand);
+    this->getInteractor()->RemoveObservers(STOP_INTERACTION_EVENT, m_interactionCommand);
+    m_interactionCommand->Delete();
+    m_interactionCommand = NULL;
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::resetPointList()
+{
+    ::fwData::PointList::sptr list = this->getObject< ::fwData::PointList >();
+    list->getRefPoints().clear();
+
+    ::fwComEd::PointListMsg::sptr msg = ::fwComEd::PointListMsg::New();
+    msg->addEvent(::fwComEd::PointListMsg::ELEMENT_REMOVED);
+    ::fwServices::IEditionService::notify(this->getSptr(), list, msg);
+}
+
+//------------------------------------------------------------------------------
+
+void PointListInteractor::addPoint(const double &x, const double &y, const double &z)
+{
+    ::fwData::PointList::sptr list = this->getObject< ::fwData::PointList >();
+    ::fwData::Point::PointCoordArrayType coord = {{ x, y, z }};
+    ::fwData::Point::sptr p = ::fwData::Point::New();
+    p->getRefCoord() = coord;
+
+    list->getRefPoints().push_back(p);
+
+    ::fwComEd::PointListMsg::sptr msg = ::fwComEd::PointListMsg::New();
+    msg->addEvent(::fwComEd::PointListMsg::ELEMENT_ADDED);
+    ::fwServices::IEditionService::notify(this->getSptr(), list, msg);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ProbeCursor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ProbeCursor.cpp
new file mode 100644
index 0000000..b04b3b5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ProbeCursor.cpp
@@ -0,0 +1,435 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+
+
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkAbstractPropPicker.h>
+#include <vtkInteractorStyleImage.h>
+#include <vtkCommand.h>
+
+#include <vtkTextActor.h>
+#include <vtkTextMapper.h>
+#include <vtkTextProperty.h>
+#include <vtkProperty.h>
+
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyData.h>
+#include <vtkCellArray.h>
+#include <vtkCellData.h>
+#include <vtkTransform.h>
+
+#include "fwRenderVTK/vtk/Helpers.hpp"
+#include "visuVTKAdaptor/ImageText.hpp"
+
+#include "visuVTKAdaptor/ProbeCursor.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ProbeCursor, ::fwData::Image ) ;
+
+
+#define START_PROBE_EVENT vtkCommand::LeftButtonPressEvent
+#define STOP_PROBE_EVENT  vtkCommand::LeftButtonReleaseEvent
+
+
+namespace visuVTKAdaptor
+{
+
+
+
+class ProbingCallback : public vtkCommand
+{
+public:
+    static ProbingCallback *New()
+    { return new ProbingCallback(); }
+
+    ProbingCallback()
+        : m_priority(-1),
+          m_mouseMoveObserved(false)
+    {
+        m_picker = NULL;
+        this->PassiveObserverOff();
+    }
+
+    ~ProbingCallback()
+    {
+
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+        assert(m_priority>=0);
+        SLM_ASSERT("m_adaptor not instanced", m_adaptor);
+        SLM_ASSERT("m_picker not instanced", m_picker);
+        if ( m_mouseMoveObserved || !m_adaptor->getInteractor()->GetShiftKey() )
+        {
+            if ( eventId == vtkCommand::MouseMoveEvent )
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                process();
+            }
+            else if ( eventId == START_PROBE_EVENT)
+            {
+                assert(m_mouseMoveObserved == false );
+                if ( pickSomething() )
+                {
+                    m_mouseMoveObserved = true;
+                    SetAbortFlag(1);
+                    m_adaptor->setVisibility(true);
+                    m_adaptor->StartProbeCursor();
+                    process();
+                    m_adaptor->getInteractor()->AddObserver(vtkCommand::MouseMoveEvent, this, m_priority);
+                }
+            }
+            else if ( eventId == STOP_PROBE_EVENT && m_mouseMoveObserved)
+            {
+                SLM_ASSERT("m_mouseMoveObserved not instanced", m_mouseMoveObserved);
+                m_adaptor->setVisibility(false);
+                m_adaptor->getInteractor()->RemoveObservers(vtkCommand::MouseMoveEvent, this);
+                m_mouseMoveObserved = false;
+            }
+        }
+    }
+
+    bool pickSomething()
+    {
+        int x,y;
+        double display[3];
+
+        m_adaptor->getInteractor()->GetEventPosition(x, y);
+        display[0] = x;
+        display[1] = y;
+        display[2] = 0;
+
+        return  m_picker->Pick( display , m_adaptor->getRenderer() );
+    }
+
+
+    void process() // from
+    {
+        double world[3] = {-1,0,0};
+        if ( pickSomething() )
+        {
+            ::fwRenderVTK::vtk::getNearestPickedPosition(m_picker, m_adaptor->getRenderer(), world);
+            OSLM_TRACE("PICK" << world[0] << " ," << world[1] << " ," << world[2] );
+            m_adaptor->updateView( world);
+        }
+        m_adaptor->updateView(world);
+    }
+
+    void setAdaptor( ProbeCursor::sptr adaptor)
+    {
+        m_adaptor = adaptor;
+    }
+
+    void setPicker( vtkAbstractPropPicker *adaptor)
+    {
+        m_picker = adaptor;
+    }
+
+    void setPriority( float priority )
+    {
+        m_priority = priority;
+    }
+
+protected :
+    ProbeCursor::sptr m_adaptor;
+    vtkAbstractPropPicker *m_picker;
+    float    m_priority;
+
+    bool m_mouseMoveObserved;
+
+};
+
+//------------------------------------------------------------------------------
+
+ProbeCursor::ProbeCursor() throw()
+: m_priority(.6)
+, m_textActor(vtkActor2D::New())
+, m_textMapper(vtkTextMapper::New())
+, m_cursorPolyData( vtkPolyData::New() )
+, m_cursorMapper  ( vtkPolyDataMapper::New() )
+, m_cursorActor(    vtkActor::New() )
+{
+    ////handlingEventOff();
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+}
+
+//------------------------------------------------------------------------------
+
+ProbeCursor::~ProbeCursor() throw()
+{
+    m_textMapper->Delete();
+    m_textActor->Delete();
+
+    m_cursorActor->Delete();
+    m_cursorActor = NULL;
+    m_cursorMapper->Delete();
+    m_cursorMapper = NULL;
+    m_cursorPolyData->Delete();
+}
+
+//------------------------------------------------------------------------------
+void ProbeCursor::setVisibility( bool visibility )
+{
+    m_textActor->SetVisibility(visibility);
+    m_cursorActor->SetVisibility(visibility);
+    this->setVtkPipelineModified();
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::buildTextActor()
+{
+    vtkTextProperty* textprop = m_textMapper->GetTextProperty();
+    textprop->SetColor(1,1,1);
+    textprop->SetFontFamilyToArial();
+    textprop->SetFontSize(20);
+    textprop->BoldOn();
+    textprop->ItalicOff();
+    textprop->ShadowOn();
+    textprop->SetJustificationToLeft();
+    textprop->SetVerticalJustificationToTop();
+
+    m_textActor->SetMapper( m_textMapper );
+
+    vtkCoordinate* coord = m_textActor->GetPositionCoordinate();
+    coord->SetCoordinateSystemToNormalizedViewport();
+    coord->SetValue(.01, .98);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::doStart() throw(fwTools::Failed)
+{
+    this->buildTextActor();
+    this->addToRenderer(m_textActor );
+
+    this->buildPolyData();
+    m_cursorMapper->SetInput( m_cursorPolyData );
+    m_cursorActor->SetMapper(m_cursorMapper);
+    m_cursorActor->GetProperty()->SetColor(1,0,0);
+    if(!this->getTransformId().empty())
+    {
+        m_cursorActor->SetUserTransform(this->getTransform());
+    }
+    this->addToRenderer(m_cursorActor);
+
+    ProbingCallback *observer = ProbingCallback::New();
+    observer->setAdaptor( ProbeCursor::dynamicCast(this->getSptr()) );
+    observer->setPicker(this->getPicker());
+    observer->setPriority(  m_priority );
+
+    m_vtkObserver = observer;
+
+    this->getInteractor()->AddObserver(START_PROBE_EVENT, m_vtkObserver, m_priority);
+    this->getInteractor()->AddObserver(STOP_PROBE_EVENT, m_vtkObserver, m_priority);
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->setVisibility(false);
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::doUpdate() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::doStop() throw(fwTools::Failed)
+{
+    this->getInteractor()->RemoveObservers(START_PROBE_EVENT, m_vtkObserver);
+    this->getInteractor()->RemoveObservers(STOP_PROBE_EVENT, m_vtkObserver);
+    m_vtkObserver->Delete();
+    m_vtkObserver = NULL;
+    this->removeAllPropFromRenderer();
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+    {
+        ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+        this->updateImageInfos(image);
+        this->setVisibility(false);
+    }
+
+    if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+    {
+        ::fwComEd::ImageMsg::dynamicConstCast(msg)->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::StartProbeCursor( )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::updateView( double world[3] )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    int index[3];
+    this->worldToImageSliceIndex( world, index );
+    OSLM_TRACE("index=" << index[0] << "," << index[1] << "," << index[2] << "," );
+
+    std::string txt;
+
+    if ( world[0] < image->getOrigin()[0] || world[1] < image->getOrigin()[1] || world[2] < image->getOrigin()[2]  ||
+         index[0]< 0 || index[1]< 0 || index[2]< 0 ||
+         index[0]>= image->getSize()[0] ||
+         index[1]>= image->getSize()[1] ||
+         index[2]>= image->getSize()[2]
+        )
+    {
+        txt = "(---,---,---)";
+        m_textMapper->SetInput(txt.c_str());
+    }
+    else
+    {
+        ::fwComEd::helper::Image imageHelper(image);
+
+        std::string greyLevel = imageHelper.getPixelAsString(index[0], index[1], index[2] );
+        txt = (::boost::format("(% 4li,% 4li, % 4li) : %s ") % index[0] % index[1] % index[2] % greyLevel ).str();
+
+        m_textMapper->SetInput(txt.c_str());
+
+        // update polyData
+        double worldCross[4][3];
+        this->computeCrossExtremity( index, worldCross);
+
+        vtkPoints* points = m_cursorPolyData->GetPoints();
+        for ( int i=0; i < 4; ++i)
+        {
+            OSLM_TRACE("p=" << worldCross[i][0] << "," << worldCross[i][2] << "," << worldCross[i][2] << "," );
+            points->SetPoint(i,worldCross[i]);
+        }
+        m_cursorPolyData->Modified();
+    }
+    this->setVtkPipelineModified();
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::computeCrossExtremity( const int probeSlice[3] , double worldCross[4][3] )
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    unsigned int sliceIndex[3]; // the current sliceIndex
+
+    sliceIndex[2] = m_axialIndex->value();
+    sliceIndex[1] = m_frontalIndex->value();
+    sliceIndex[0] = m_sagittalIndex->value();
+
+    double probeWorld[3]; // probe index in world positioning system
+    for (int dim=0; dim<3; ++dim )
+    {
+        if ( probeSlice[dim]==sliceIndex[dim] ) // FIXME if (sliceIndex==probeWorld)
+        {
+            this->setOrientation(dim);
+        }
+        probeWorld[dim] = probeSlice[dim]*image->getSpacing()[dim] + image->getOrigin().at(dim);
+    }
+
+    for ( int p=0; p<2; ++p )
+    {
+        for (int dim=0; dim<3; ++dim )
+        {
+            worldCross[p][dim] = probeWorld[dim];
+            worldCross[p+2][dim] = probeWorld[dim];
+            if ( (dim + p + 1)%3 == m_orientation )
+            {
+                worldCross[p][dim] = image->getOrigin().at(dim);
+                ::fwData::Image::SizeType::value_type size = image->getSize().at(dim)-1;
+                ::fwData::Image::SpacingType::value_type spacing = image->getSpacing().at(dim);
+                worldCross[p+2][dim] =  size * spacing + image->getOrigin().at(dim);
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProbeCursor::buildPolyData()
+{
+    // point are stored Left,right,up,down
+    int nbPoints = 4;
+    vtkPoints* points   = vtkPoints::New(VTK_DOUBLE);
+    points->SetNumberOfPoints(nbPoints);
+    int i;
+    for (i = 0; i < nbPoints; i++)
+    {
+        points->SetPoint(i, 0.0, 0.0 , 0.0);
+    }
+
+    vtkCellArray *cells = vtkCellArray::New();
+    cells->Allocate(cells->EstimateSize(nbPoints,2));
+
+    vtkIdType pts[2];
+    pts[0]=0;pts[1]=2;
+    cells->InsertNextCell(2,pts);
+    pts[0]=1;pts[1]=3;
+    cells->InsertNextCell(2,pts);
+
+    m_cursorPolyData->SetPoints(points);
+    points->Delete();
+    m_cursorPolyData->SetLines(cells);
+    cells->Delete();
+    this->setVtkPipelineModified();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Reconstruction.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Reconstruction.cpp
new file mode 100644
index 0000000..2f05876
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Reconstruction.cpp
@@ -0,0 +1,237 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwComEd/ReconstructionMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkCamera.h>
+#include <vtkMath.h>
+#include <vtkPicker.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkTransform.h>
+#include <vtkMatrix4x4.h>
+#include <vtkProperty.h>
+#include <vtkPlaneCollection.h>
+#include <vtkPolyDataNormals.h>
+
+#include "visuVTKAdaptor/Mesh.hpp"
+#include "visuVTKAdaptor/Reconstruction.hpp"
+
+//VAG DEBUG
+//#include <fwMath/MeshFunctions.hpp>
+//#include <fwVtkIO/vtk.hpp>
+//#include <fwVtkIO/MeshWriter.hpp>
+//#include <boost/filesystem.hpp>
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Reconstruction, ::fwData::Reconstruction ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+Reconstruction::Reconstruction() throw()
+{
+    m_clippingPlanesId = "";
+    m_sharpEdgeAngle = 180;
+    m_autoResetCamera = true;
+    //addNewHandledEvent( ::fwComEd::ReconstructionMsg::MESH );
+    //addNewHandledEvent( ::fwComEd::ReconstructionMsg::VISIBILITY );
+}
+
+//------------------------------------------------------------------------------
+
+Reconstruction::~Reconstruction() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId   ( m_configuration->getAttributeValue( "picker"    ) ) ;
+    this->setRenderId   ( m_configuration->getAttributeValue( "renderer"  ) ) ;
+    this->setTransformId( m_configuration->getAttributeValue( "transform" ) ) ;
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    createMeshService();
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::createMeshService()
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Reconstruction::sptr reconstruction
+        = this->getObject < ::fwData::Reconstruction >();
+
+    ::fwData::Mesh::sptr mesh = reconstruction->getMesh();
+
+    SLM_TRACE_IF("Mesh is null", !mesh);
+    if (mesh)
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr meshService;
+        meshService = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+                mesh,
+                "::visuVTKAdaptor::Mesh" );
+        SLM_ASSERT("meshService not instanced", meshService);
+        ::visuVTKAdaptor::Mesh::sptr meshAdaptor
+            = Mesh::dynamicCast(meshService);
+
+        meshService->setRenderService( this->getRenderService() );
+        meshService->setRenderId     ( this->getRenderId()      );
+        meshService->setPickerId     ( this->getPickerId()      );
+        meshService->setTransformId  ( this->getTransformId() );
+        meshService->setAutoRender   ( this->getAutoRender() );
+
+        meshAdaptor->setClippingPlanesId( m_clippingPlanesId             );
+        //meshAdaptor->setSharpEdgeAngle  ( m_sharpEdgeAngle               );
+        meshAdaptor->setShowClippedPart ( true );
+        meshAdaptor->setMaterial        ( reconstruction->getMaterial()  );
+        meshAdaptor->setAutoResetCamera ( m_autoResetCamera );
+        meshService->start();
+        meshAdaptor->updateVisibility  ( reconstruction->getIsVisible() );
+        meshAdaptor->update();
+
+        m_meshService = meshService;
+        this->registerService(meshService);
+        OSLM_TRACE("Mesh is visible : "<< reconstruction->getIsVisible());
+        OSLM_TRACE("Mesh nb points : "<< mesh->getNumberOfPoints());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if (!m_meshService.expired())
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr meshService = m_meshService.lock();
+
+        ::fwData::Reconstruction::sptr reconstruction = this->getObject < ::fwData::Reconstruction >();
+        ::visuVTKAdaptor::Mesh::sptr meshAdaptor = Mesh::dynamicCast(meshService);
+        //meshAdaptor->setSharpEdgeAngle( m_sharpEdgeAngle );
+
+        meshAdaptor->setMaterial     ( reconstruction->getMaterial()       );
+        meshAdaptor->swap            ( reconstruction->getMesh() );
+        meshAdaptor->updateVisibility( reconstruction->getIsVisible()      );
+
+    }
+    else
+    {
+        this->createMeshService();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::doReceive( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if (!m_meshService.expired())
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr meshService = m_meshService.lock();
+
+        ::fwComEd::ReconstructionMsg::csptr msg = ::fwComEd::ReconstructionMsg::dynamicConstCast(_msg);
+
+        assert(msg->getSubject().lock() == this->getObject());
+
+        ::fwData::Reconstruction::sptr reconstruction = this->getObject < ::fwData::Reconstruction >();
+        SLM_ASSERT("reconstruction not instanced", reconstruction);
+
+        if (msg && msg->hasEvent(::fwComEd::ReconstructionMsg::MESH))
+        {
+            //updateTriangulaMesh( reconstruction->getMesh() );
+            this->doUpdate();
+        }
+        else if (msg && msg->hasEvent(::fwComEd::ReconstructionMsg::VISIBILITY))
+        {
+
+            this->setForceHide(!reconstruction->getIsVisible());
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->removeAllPropFromRenderer();
+
+    //if (this->getPicker())
+    //{
+        //this->removeFromPicker(this->getActor());
+    //}
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::setForceHide(bool hide)
+{
+    SLM_TRACE_FUNC();
+    if (!m_meshService.expired())
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr meshService = m_meshService.lock();
+        ::visuVTKAdaptor::Mesh::sptr meshAdaptor
+            = Mesh::dynamicCast(meshService);
+
+        if (meshAdaptor)
+        {
+            ::fwData::Reconstruction::sptr reconstruction = this->getObject < ::fwData::Reconstruction >();
+            meshAdaptor->updateVisibility( hide ? false : reconstruction->getIsVisible() );
+        }
+        this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::setAutoResetCamera(bool autoResetCamera)
+{
+    m_autoResetCamera = autoResetCamera;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Render.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Render.cpp
new file mode 100644
index 0000000..ecb8f85
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Render.cpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+
+#include <vtkRenderWindowInteractor.h>
+
+#include "visuVTKAdaptor/Render.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Render, ::fwData::Object ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Render::Render() throw()
+{
+    m_vtkPipelineModified = false;
+    m_comChannelPriority = 0.1;
+    //addNewHandledEvent("SCENE_RENDER_REQUEST");
+}
+
+//------------------------------------------------------------------------------
+
+Render::~Render() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Render::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    SLM_ASSERT("Sorry, config tag is missing", m_configuration->getName() == "config");
+    SLM_ASSERT("Sorry, renderer attribute is missing", m_configuration->hasAttribute("renderer"));
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    // TODO allow to add other object
+}
+
+//------------------------------------------------------------------------------
+
+void Render::doStart() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    //addNewHandledEvent( "SCENE_RENDER_REQUEST" );
+    this->getRenderService()->setPendingRenderRequest(false);
+}
+
+//------------------------------------------------------------------------------
+
+void Render::doStop() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Render::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Render::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Render::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    if ( msg->hasEvent("SCENE_RENDER_REQUEST") )
+    {
+        ::fwData::Object::csptr dataInfo = msg->getDataInfo("SCENE_RENDER_REQUEST");
+        SLM_ASSERT("dataInfo is missing", dataInfo);
+        SLM_ASSERT("dataInfo must contain a string", ::fwData::String::dynamicConstCast( dataInfo ));
+        std::string requestSceneID = ::fwData::String::dynamicConstCast( dataInfo )->value();
+        if( requestSceneID ==  this->getRenderService()->getID() )
+        {
+            this->getInteractor()->Render() ;
+            this->getRenderService()->setPendingRenderRequest(false);
+        }
+    }
+}
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Resection.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Resection.cpp
new file mode 100644
index 0000000..f43d7f6
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Resection.cpp
@@ -0,0 +1,164 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Resection.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/ResectionMsg.hpp>
+
+#include "visuVTKAdaptor/Reconstruction.hpp"
+#include "visuVTKAdaptor/Resection.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Resection, ::fwData::Resection ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+Resection::Resection() throw()
+{
+    m_clippingPlanes = "";
+    m_sharpEdgeAngle = 50;
+    m_autoResetCamera = true;
+    //addNewHandledEvent( ::fwComEd::ResectionMsg::VISIBILITY );
+    //addNewHandledEvent( ::fwComEd::ResectionMsg::MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+Resection::~Resection() throw()
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    this->setClippingPlanes( m_configuration->getAttributeValue("clippingplanes") );
+
+    std::string sSharpEdgeAngle(m_configuration->getAttributeValue("sharpangle"));
+    if ( !sSharpEdgeAngle.empty() )
+    {
+        double sharpEdgeAngle = ::boost::lexical_cast< double > (sSharpEdgeAngle);
+        this->setSharpEdgeAngle( sharpEdgeAngle );
+    }
+
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    doStop();
+
+    ::fwData::Resection::sptr resec = this->getObject< ::fwData::Resection >();
+
+    if (resec->getIsVisible())
+    {
+        std::vector< ::fwData::Reconstruction::sptr >::iterator iterRes;
+        std::vector< ::fwData::Reconstruction::sptr > vReconst;
+        bool resectionIsValid = resec->getIsValid();
+        if(resec->getIsSafePart() || resectionIsValid)
+        {
+            vReconst = resec->getRefOutputs();
+        }
+        else
+        {
+            vReconst = resec->getRefInputs();
+        }
+        for (iterRes = vReconst.begin(); iterRes != vReconst.end(); ++iterRes)
+        {
+            ::fwRenderVTK::IVtkAdaptorService::sptr service =
+                    ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >
+            ( *iterRes, "::visuVTKAdaptor::Reconstruction" );
+            SLM_ASSERT("service not instanced", service);
+
+            service->setTransformId( this->getTransformId() );
+            service->setRenderId( this->getRenderId() );
+            service->setPickerId( this->getPickerId() );
+            service->setRenderService(this->getRenderService());
+            service->setAutoRender( this->getAutoRender() );
+            ::visuVTKAdaptor::Reconstruction::sptr reconstAdaptor = ::visuVTKAdaptor::Reconstruction::dynamicCast(service);
+            if(!resectionIsValid)
+            {
+                reconstAdaptor->setClippingPlanes( m_clippingPlanes );
+            }
+            reconstAdaptor->setSharpEdgeAngle( m_sharpEdgeAngle );
+            reconstAdaptor->setAutoResetCamera(m_autoResetCamera);
+            service->start();
+
+            this->registerService(service);
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::ResectionMsg::csptr pResectionMsg = ::fwComEd::ResectionMsg::dynamicConstCast( msg ) ;
+    if ( pResectionMsg)
+    {
+        if ( pResectionMsg->hasEvent(::fwComEd::ResectionMsg::VISIBILITY) )
+        {
+            this->doUpdate();
+        }
+        if ( pResectionMsg->hasEvent(::fwComEd::ResectionMsg::MODIFIED) )
+        {
+            this->doUpdate();
+        }
+    }
+}
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResectionDB.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResectionDB.cpp
new file mode 100644
index 0000000..6169e21
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResectionDB.cpp
@@ -0,0 +1,160 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/ResectionDB.hpp>
+#include <fwData/Resection.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/ResectionDBMsg.hpp>
+
+#include "visuVTKAdaptor/Resection.hpp"
+#include "visuVTKAdaptor/ResectionDB.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ResectionDB, ::fwData::ResectionDB ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+ResectionDB::ResectionDB() throw()
+{
+    m_clippingPlanes = "";
+    m_sharpEdgeAngle = 50;
+    //addNewHandledEvent( ::fwComEd::ResectionDBMsg::ADD_SAFE_PART );
+    //addNewHandledEvent( ::fwComEd::ResectionDBMsg::ADD_RESECTION );
+    //addNewHandledEvent( ::fwComEd::ResectionDBMsg::MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+ResectionDB::~ResectionDB() throw()
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setPickerId( m_configuration->getAttributeValue("picker") );
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    this->setClippingPlanes( m_configuration->getAttributeValue("clippingplanes") );
+
+    std::string sSharpEdgeAngle(m_configuration->getAttributeValue("sharpangle"));
+    if ( !sSharpEdgeAngle.empty() )
+    {
+        double sharpEdgeAngle = ::boost::lexical_cast< double > (sSharpEdgeAngle);
+        this->setSharpEdgeAngle( sharpEdgeAngle );
+    }
+
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    doStop();
+
+    ::fwData::ResectionDB::sptr resecDB = this->getObject< ::fwData::ResectionDB >();
+
+    BOOST_FOREACH( ::fwData::Resection::sptr resection, resecDB->getResections() )
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+                ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > ( resection, "::visuVTKAdaptor::Resection" );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setTransformId( this->getTransformId() );
+        service->setRenderId( this->getRenderId() );
+        service->setPickerId( this->getPickerId() );
+        service->setRenderService(this->getRenderService());
+        service->setAutoRender( this->getAutoRender() );
+        ::visuVTKAdaptor::Resection::dynamicCast(service)->setClippingPlanes( m_clippingPlanes );
+        ::visuVTKAdaptor::Resection::dynamicCast(service)->setSharpEdgeAngle( m_sharpEdgeAngle );
+        service->start();
+
+        this->registerService(service);
+    }
+
+    // Safe part
+    ::fwData::Resection::sptr resec = resecDB->getSafeResection();
+    if(resec)
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+                ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > ( resec, "::visuVTKAdaptor::Resection" );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setTransformId( this->getTransformId() );
+        service->setRenderId( this->getRenderId() );
+        service->setPickerId( this->getPickerId() );
+        service->setRenderService(this->getRenderService());
+        service->setAutoRender( this->getAutoRender() );
+        service->start();
+
+        this->registerService(service);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::ResectionDBMsg::csptr pResectionDBMsg = ::fwComEd::ResectionDBMsg::dynamicConstCast( msg ) ;
+    if ( pResectionDBMsg )
+    {
+        if ( pResectionDBMsg->hasEvent(::fwComEd::ResectionDBMsg::ADD_SAFE_PART) ||
+                pResectionDBMsg->hasEvent(::fwComEd::ResectionDBMsg::ADD_RESECTION) )
+        {
+            this->doUpdate();
+        }
+        if ( pResectionDBMsg->hasEvent(::fwComEd::ResectionDBMsg::MODIFIED) )
+        {
+            this->doUpdate();
+        }
+    }
+}
+
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResetCamera.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResetCamera.cpp
new file mode 100644
index 0000000..f28af95
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/ResetCamera.cpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+#include <vtkActorCollection.h>
+
+#include "visuVTKAdaptor/ResetCamera.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::ResetCamera, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+ResetCamera::ResetCamera() throw()
+{
+    bCameraReseted = false;
+    m_comChannelPriority = 0.1;
+    //addNewHandledEvent(::fwComEd::CompositeMsg::ADDED_KEYS);
+}
+
+//------------------------------------------------------------------------------
+
+ResetCamera::~ResetCamera() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::doUpdate() throw(fwTools::Failed)
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::doStop() throw(fwTools::Failed)
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void ResetCamera::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast( msg );
+
+    if ( compositeMsg && compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS))
+    {
+        ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+        if(!bCameraReseted)
+        {
+            vtkRenderer* renderer = this->getRenderer();
+            renderer->ResetCamera();
+            bCameraReseted = true;
+            this->setVtkPipelineModified();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SliceFollowerCamera.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SliceFollowerCamera.cpp
new file mode 100644
index 0000000..6d3bc15
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SliceFollowerCamera.cpp
@@ -0,0 +1,232 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Camera.hpp>
+#include <fwData/Video.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkCamera.h>
+#include <vtkMath.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkInteractorStyleImage.h>
+
+#include "visuVTKAdaptor/SliceFollowerCamera.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::SliceFollowerCamera, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+SliceFollowerCamera::SliceFollowerCamera() throw()
+{
+    m_comChannelPriority = 0.49;
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+}
+
+//------------------------------------------------------------------------------
+
+SliceFollowerCamera::~SliceFollowerCamera() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    if(m_configuration->hasAttribute("sliceIndex"))
+    {
+         std::string  orientation = m_configuration->getAttributeValue("sliceIndex");
+         if(orientation == "axial" )
+         {
+             m_orientation = Z_AXIS;
+         }
+         else if(orientation == "frontal" )
+         {
+             m_orientation = Y_AXIS;
+         }
+         else if(orientation == "sagittal" )
+         {
+             m_orientation = X_AXIS;
+         }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::doStart() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+
+    m_camera = this->getRenderer()->GetActiveCamera();
+    this->initializeCamera();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    initializeCamera();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            this->updateImageInfos(image);
+            initializeCamera();
+        }
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+        {
+            updateCamera();
+        }
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ))
+        {
+            ::fwData::Object::csptr cObjInfo = msg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+            ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+            ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+            int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+            int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+            if( toSliceType == static_cast<int>(m_orientation) )
+            {
+                setOrientation( static_cast< Orientation >( fromSliceType ));
+                initializeCamera();
+            }
+            else if(fromSliceType == static_cast<int>(m_orientation))
+            {
+                setOrientation( static_cast< Orientation >( toSliceType ));
+                initializeCamera();
+            }
+        }
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::initializeCamera()
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        const int orientationToAxe[3] = { 2, 2, 1 };
+        double imageSize[3];
+        this->getImageSize(imageSize);
+        int orientation = orientationToAxe [m_orientation];
+        double size = imageSize[ orientation ];
+
+        double distance = (1.1 * size)
+                    / ( std::tan( m_camera->GetViewAngle() * (vtkMath::DoublePi() / 180.0) ) );
+
+        m_camera->ParallelProjectionOn();
+        setVtkPipelineModified();
+
+        this->updateCamera(distance, size);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SliceFollowerCamera::updateCamera(double distance, double size)
+{
+
+    SLM_ASSERT("No Camera", m_camera );
+
+    if (distance > 0)
+    {
+        // Update position according to orientation
+        double center[ 3 ];
+        double focalPoint[ 3 ];
+        double position[ 3 ];
+        getCurrentSliceCenter( center );
+        std::copy(center, center+3, focalPoint);
+
+        double origin[ 3 ];
+        getImageOrigin( origin );
+        focalPoint[m_orientation] = origin[m_orientation];
+
+        distance = m_camera->GetDistance();
+
+        std::copy(focalPoint, focalPoint+3, position);
+
+        position[ m_orientation ] -= distance;
+
+        m_camera->SetParallelScale(.51*size);
+        m_camera->SetFocalPoint( focalPoint );
+        m_camera->SetPosition( position );
+    }
+
+    // m_orientation = 0 : 0, 0,1
+    // m_orientation = 1 : 0, 0,1
+    // m_orientation = 2 : 0,-1,0
+    m_camera->SetViewUp(
+            0,
+            (m_orientation == 2 ? -1 : 0) ,
+            (m_orientation <= 1 ?  1 : 0)
+    );
+    m_camera->OrthogonalizeViewUp();
+
+    this->getRenderer()->ResetCameraClippingRange();
+    this->setVtkPipelineModified();
+}
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SlicesCursor.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SlicesCursor.cpp
new file mode 100644
index 0000000..610f309
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/SlicesCursor.cpp
@@ -0,0 +1,431 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+
+
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <vtkPolyData.h>
+#include <vtkRenderer.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkCellArray.h>
+#include <vtkCellData.h>
+#include <vtkLine.h> // CELL
+#include <vtkTransform.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/String.hpp>
+
+#include "visuVTKAdaptor/SlicesCursor.hpp"
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::SlicesCursor, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+SlicesCursor::SlicesCursor()  throw()
+: m_cursorPolyData( vtkPolyData::New() )
+, m_cursorMapper  ( vtkPolyDataMapper::New() )
+, m_cursorActor(    vtkActor::New() )
+, m_scale(0.5)
+, m_isSelected(false)
+{
+
+    //addNewHandledEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) ;
+    //addNewHandledEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+    //addNewHandledEvent( "CROSS_TYPE" );
+}
+
+//-----------------------------------------------------------------------------
+
+SlicesCursor::~SlicesCursor()  throw()
+{
+    m_cursorActor->Delete();
+    m_cursorActor = NULL;
+    m_cursorMapper->Delete();
+    m_cursorMapper = NULL;
+    m_cursorPolyData->Delete();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::setCrossScale(double scale)
+{
+    m_scale = scale;
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    std::string scaleStr = m_configuration->getAttributeValue("scale");
+    if ( !scaleStr.empty() )
+    {
+        SLM_ASSERT("scale attribute must be in a config", m_configuration->getName() == "config");
+        m_scale = ::boost::lexical_cast<double>(scaleStr);
+    }
+    if(m_configuration->hasAttribute("transform") )
+    {
+        this->setTransformId( m_configuration->getAttributeValue("transform") );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::reconfiguring() throw(fwTools::Failed)
+{
+    configuring();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::doStart() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->buildPolyData();
+    this->buildColorAttribute();
+    this->updateImageInfos(image);
+    this->updateColors();
+    m_cursorMapper->SetInput( m_cursorPolyData );
+    m_cursorActor->SetMapper(m_cursorMapper);
+    if(!this->getTransformId().empty())
+    {
+        m_cursorActor->SetUserTransform(this->getTransform());
+    }
+    this->addToRenderer(m_cursorActor);
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::doStop() throw(fwTools::Failed)
+{
+    m_isSelected = false;
+    this->removeAllPropFromRenderer();
+}
+
+//////////////////////////////
+// SHAPE
+//    B---------BC----------C
+//    |         |           |
+//    |         |           |
+//    |        BCM          |
+//    |                     |
+//    |                     |
+//   AB----ABM      CDM-----CD
+//    |                     |
+//    |        ADM          |
+//    |         |           |
+//    |         |           |
+//    A---------AD----------D
+//
+// no for id point A,B,C,D
+// id point AB, BC, CD, AD  = 0,1,...,3
+// id point ABM, BCM, CDM, ADM = 4,..,7
+
+
+void SlicesCursor::buildPolyData()
+{
+    int nbPoints = 8;
+    vtkPoints* points = vtkPoints::New(VTK_DOUBLE);
+    points->SetNumberOfPoints(nbPoints);
+    int i;
+    for (i = 0; i < nbPoints; i++)
+    {
+        //points->SetPoint(i, 300*i +0.0, 50*i*i + 0.0 , 0.0);
+        points->SetPoint(i, 0.0, 0.0 , 0.0);
+    }
+
+    vtkCellArray *cells = vtkCellArray::New();
+    cells->Allocate(cells->EstimateSize(nbPoints,2));
+
+    vtkIdType pts[2];
+    for ( int line=0; line<4; ++line)
+    {
+        pts[0] = line; pts[1] = line+4;
+        //cells->InsertNextCell(2,pts);
+        vtkLine *lineCell= vtkLine::New();
+        lineCell->GetPointIds()->SetId(0, line );
+        lineCell->GetPointIds()->SetId(1, line+ 4 );
+        cells->InsertNextCell(lineCell);
+        lineCell->Delete();
+    }
+
+    m_cursorPolyData->SetPoints(points);
+    points->Delete();
+    m_cursorPolyData->SetLines(cells);
+    cells->Delete();
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::barycenter( double ptA[3], double ptB[3], float scale, double result[3] )
+{
+    for (int i=0 ; i<3; ++i )
+    {
+        result[i] = scale*ptA[i] + (1-scale)*ptB[i];
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::computeCrossPoints( double _ptA[3], double _ptB[3], double _ptP[3], double _scale, double _ptAprime[3], double _ptBprime[3] )
+{
+    double ptPBprime[3];
+    double norm2PBprime = 0.0;
+    double norm2BP = 0;
+    double norm2AP = 0;
+
+    // Compute AB x scale / 2 = |A'P| x AB = |PB'| x AB
+    for (int i=0 ; i<3; ++i )
+    {
+        ptPBprime[i] = ( _ptB[i] - _ptA[i] ) * (1-_scale)/2.0;
+        norm2PBprime += ptPBprime[i]*ptPBprime[i];
+        norm2AP      += (_ptP[i] - _ptA[i])*(_ptP[i] - _ptA[i]);
+        norm2BP      += (_ptP[i] - _ptB[i])*(_ptP[i] - _ptB[i]);
+    }
+
+    // Compute  APrime = P + PA' = P - |A'P| x AB
+    //          BPrime = P + pB' = P + |PB'| x AB
+    if ( norm2PBprime > norm2BP )
+    {
+        for (int i=0 ; i<3; ++i )
+        {
+            _ptAprime[i] = _ptP[i] - ptPBprime[i];
+            _ptBprime[i] = _ptB[i];
+        }
+    }
+    else if ( norm2PBprime > norm2AP )
+    {
+        for (int i=0 ; i<3; ++i )
+        {
+            _ptAprime[i] = _ptA[i];
+            _ptBprime[i] = _ptP[i] + ptPBprime[i];
+        }
+    }
+    else
+    {
+        for (int i=0 ; i<3; ++i )
+        {
+            _ptAprime[i] = _ptP[i] - ptPBprime[i];
+            _ptBprime[i] = _ptP[i] + ptPBprime[i];
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::buildColorAttribute()
+{
+    unsigned char red[3] = {255, 0, 0};
+    unsigned char green[3] = {0, 255, 0};
+    unsigned char blue[3] = {0, 0, 255};
+
+    typedef  unsigned char* RGBColor;
+    typedef std::map< std::string , std::pair< RGBColor , RGBColor> >  DicoType;
+    DicoType                                                         dict;
+    dict["colorXAxis"] = std::make_pair(green,red);
+    dict["colorYAxis"] = std::make_pair(red, blue);
+    dict["colorZAxis"] = std::make_pair(blue, green );
+
+
+    for ( DicoType::iterator i= dict.begin() ; i!= dict.end(); ++ i )
+    {
+        vtkUnsignedCharArray* colors = vtkUnsignedCharArray::New();
+        colors->SetNumberOfComponents(3);
+        colors->SetName(  i->first.c_str() );
+        colors->InsertNextTupleValue(  i->second.first  );
+        colors->InsertNextTupleValue(  i->second.second );
+        colors->InsertNextTupleValue(  i->second.first  );
+        colors->InsertNextTupleValue(  i->second.second );
+        m_cursorPolyData->GetCellData()->AddArray(colors);
+    }
+    m_cursorMapper->SetScalarModeToUseCellFieldData();
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::updateColors()
+{
+    switch (m_orientation )
+    {
+        case 0 : m_cursorMapper->SelectColorArray("colorXAxis"); break;
+        case 1 : m_cursorMapper->SelectColorArray("colorYAxis"); break;
+        case 2 : m_cursorMapper->SelectColorArray("colorZAxis"); break;
+
+    }
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::doSwap() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    this->updateImageInfos(image);
+    this->updating();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if ( imageIsValid)
+    {
+        this->updateSliceIndex(image);
+        this->updateColors();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::updateSliceIndex( ::fwData::Image::sptr image )
+{
+    float scale = m_isSelected ? 1.0 : m_scale;
+    if (scale <= 0)
+    {
+        m_cursorActor->VisibilityOff();
+    }
+    else
+    {
+        m_cursorActor->VisibilityOn();
+
+        unsigned int pos[3];
+
+        pos[2] = m_axialIndex->value();
+        pos[1] = m_frontalIndex->value();
+        pos[0] = m_sagittalIndex->value();
+
+        double sliceWorld[3];
+        for (int dim=0; dim<3; ++dim )
+        {
+            sliceWorld[dim] = pos[dim]*image->getSpacing()[dim] + image->getOrigin().at(dim);
+        }
+
+        double cursorPoints[8][3]; // point AB,BC,CD,AD,ABM,BCM,CDM,ADM
+
+        for ( int p=0; p<2; ++p )
+        {
+            for (int dim=0; dim<3; ++dim )
+            {
+                //cursorPoints[p][dim] =   ((m_orientation==dim   ||   ( (dim != m_orientation) && p )  )?sliceWorld[dim] : 0 );
+                //cursorPoints[p+2][dim] = ((m_orientation==dim   ||   ( (dim != m_orientation) && p )  )?sliceWorld[dim] : (image->getSize()[dim]-1)*image->getSpacing()[dim] );
+                cursorPoints[p][dim] = sliceWorld[dim];
+                cursorPoints[p+2][dim] = sliceWorld[dim];
+                if ( (dim + p + 1)%3 == m_orientation )
+                {
+                    cursorPoints[p][dim] = image->getOrigin().at(dim);
+                    cursorPoints[p+2][dim] =  (image->getSize()[dim]-1)*image->getSpacing()[dim] + image->getOrigin().at(dim);
+                }
+            }
+        }
+
+
+
+        // Compute ABM & CDM
+        computeCrossPoints( cursorPoints[0], cursorPoints[2], sliceWorld, scale, cursorPoints[4], cursorPoints[6] );
+        // Compute BCM & ADM
+        computeCrossPoints( cursorPoints[1], cursorPoints[3], sliceWorld, scale, cursorPoints[5], cursorPoints[7] );
+
+        vtkPoints* points = m_cursorPolyData->GetPoints();
+
+        for ( int i=0; i < 8; ++i)
+        {
+            points->SetPoint(i,cursorPoints[i]);
+        }
+
+    }
+    m_cursorPolyData->Modified();
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+void SlicesCursor::doReceive(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    m_isSelected = false;
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+    ::fwComEd::ImageMsg::csptr imageMsg = ::fwComEd::ImageMsg::dynamicConstCast(msg);
+    if(imageIsValid && imageMsg)
+    {
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            this->updateImageInfos(image);
+            this->updating();
+        }
+        if ( imageMsg->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ) )
+        {
+            ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo(::fwComEd::ImageMsg::SLICE_INDEX);
+            imageMsg->getSliceIndex( m_axialIndex, m_frontalIndex, m_sagittalIndex);
+
+            if(dataInfo && dataInfo->getField("SLICE_MODE"))
+            {
+                ::fwData::String::sptr sliceMode = dataInfo->getField< ::fwData::String >("SLICE_MODE");
+                SLM_ASSERT("sceneID empty!", sliceMode);
+                m_isSelected = ( sliceMode->value() == "UPDATE_SLICING" );
+            }
+            this->updateSliceIndex(image);
+            this->updating();
+        }
+        if ( imageMsg->hasEvent( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE ) )
+        {
+
+            ::fwData::Object::csptr cObjInfo = imageMsg->getDataInfo( ::fwComEd::ImageMsg::CHANGE_SLICE_TYPE );
+            ::fwData::Object::sptr objInfo = ::boost::const_pointer_cast< ::fwData::Object > ( cObjInfo );
+            ::fwData::Composite::sptr info = ::fwData::Composite::dynamicCast ( objInfo );
+
+            int fromSliceType = ::fwData::Integer::dynamicCast( info->getContainer()["fromSliceType"] )->value();
+            int toSliceType =   ::fwData::Integer::dynamicCast( info->getContainer()["toSliceType"] )->value();
+
+            if( toSliceType == static_cast<int>(m_orientation) )
+            {
+                setOrientation( static_cast< Orientation >( fromSliceType ));
+            }
+            else if( fromSliceType == static_cast<int>(m_orientation) )
+            {
+                setOrientation( static_cast< Orientation >( toSliceType ));
+            }
+            this->updating();
+        }
+        if ( imageMsg->hasEvent( "CROSS_TYPE") )
+        {
+            ::fwData::Object::csptr dataInfo = imageMsg->getDataInfo("CROSS_TYPE");
+            SLM_ASSERT("dataInfo is missing", dataInfo);
+            ::fwData::Float::csptr scale = ::fwData::Float::dynamicConstCast(dataInfo);
+            SLM_ASSERT("dataInfo is missing", scale);
+            this->setCrossScale( scale->value() );
+            this->updating();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Snapshot.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Snapshot.cpp
new file mode 100644
index 0000000..5eb5f90
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Snapshot.cpp
@@ -0,0 +1,166 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <vtkWindowToImageFilter.h>
+#include <vtkImageWriter.h>
+#include <vtkJPEGWriter.h>
+#include <vtkBMPWriter.h>
+#include <vtkTIFFWriter.h>
+#include <vtkPNGWriter.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+
+#include <vtkActor.h>
+#include <vtkRenderer.h>
+
+
+#include "visuVTKAdaptor/Snapshot.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Snapshot, ::fwData::Composite ) ;
+
+namespace visuVTKAdaptor
+{
+
+Snapshot::Snapshot() throw()
+{
+    //addNewHandledEvent("SNAP");
+}
+
+//------------------------------------------------------------------------------
+
+Snapshot::~Snapshot() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::doUpdate() throw(fwTools::Failed)
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::doStop() throw(fwTools::Failed)
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast( msg );
+
+    if ( compositeMsg && compositeMsg->hasEvent( "SNAP"))
+    {
+        ::fwData::Object::csptr dataInfo = compositeMsg->getDataInfo("SNAP");
+
+        SLM_ASSERT("sceneID missing", dataInfo->getField("sceneID"));
+        ::fwData::String::sptr sceneID = dataInfo->getField< ::fwData::String >("sceneID");
+        SLM_ASSERT("sceneID empty!", sceneID);
+
+        SLM_ASSERT("filename missing", dataInfo->getField("filename"));
+        ::fwData::String::sptr filename = dataInfo->getField< ::fwData::String >("filename");
+        SLM_ASSERT("filename empty!", !filename->value().empty());
+
+        if( this->getRenderService()->getID() == sceneID->value())
+        {
+            this->snap(filename->value());
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Snapshot::snap(std::string filePath)
+{
+    SLM_ASSERT("filePath is empty", !filePath.empty());
+    namespace fs = ::boost::filesystem;
+    fs::path pathImageSnap(filePath);
+
+    std::string ext = ".jpg";
+#if BOOST_FILESYSTEM_VERSION > 2
+    ext = pathImageSnap.extension().string();
+#else
+    ext = pathImageSnap.extension();
+#endif
+    vtkImageWriter* writer = 0;
+
+    if( ext==".jpg" || ext==".jpeg" )
+    {
+        writer = vtkJPEGWriter::New();
+    }
+    else if ( ext==".bmp" )
+    {
+        writer = vtkBMPWriter::New();
+    }
+    else if ( ext==".tiff" )
+    {
+        writer = vtkTIFFWriter::New();
+    }
+    else if ( ext==".png" )
+    {
+        writer = vtkPNGWriter::New();
+    }
+    else
+    {
+        SLM_FATAL("Error: Format is not supported.");
+    }
+
+    vtkWindowToImageFilter* snapper = vtkWindowToImageFilter::New();
+    snapper->SetMagnification( 1 );
+    snapper->SetInput( this->getRenderer()->GetRenderWindow() );
+
+
+    writer->SetInput( snapper->GetOutput() );
+    writer->SetFileName( pathImageSnap.string().c_str() );
+    writer->Write();
+
+    snapper->Delete();
+    writer->Delete();
+}
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Text.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Text.cpp
new file mode 100644
index 0000000..7c9ff61
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Text.cpp
@@ -0,0 +1,176 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "visuVTKAdaptor/Text.hpp"
+
+#include <fwDataCamp/getObject.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/GenericFieldBase.hpp>
+#include <fwData/Color.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+#include <vtkActor2D.h>
+#include <vtkTextMapper.h>
+#include <vtkTextProperty.h>
+
+fwServicesRegisterMacro(::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Text, ::fwData::Object);
+
+namespace visuVTKAdaptor
+{
+
+Text::Text() : m_fontSize(20), m_vAlign("bottom"), m_hAlign("left")
+{
+    m_mapper = vtkTextMapper::New();
+    m_mapper->GetTextProperty()->SetFontFamilyToCourier(); // Fixed-width font
+    m_mapper->GetTextProperty()->ShadowOn(); // better contrast
+    m_mapper->GetTextProperty()->BoldOn();
+
+    m_actor = vtkActor2D::New();
+    m_actor->SetMapper(m_mapper);
+    m_actor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedViewport();
+    m_actor->GetPosition2Coordinate()->SetCoordinateSystemToNormalizedViewport();
+}
+
+//-----------------------------------------------------------------------------
+
+Text::~Text() throw()
+{
+    m_actor->Delete();
+    m_actor = 0;
+
+    m_mapper->Delete();
+    m_mapper = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void Text::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+
+    std::string text = m_configuration->getAttributeValue("text");
+    if(!text.empty() && text[0] == '@')
+    {
+        ::fwData::Object::sptr obj = this->getObject();
+        ::fwData::GenericFieldBase::sptr field = ::fwDataCamp::getObject< ::fwData::GenericFieldBase >(obj, text);
+        SLM_ASSERT("Seshat path can't be cast to generic field", field);
+        if(field)
+        {
+            text = field->toString();
+        }
+    }
+
+    if(m_configuration->hasAttribute("fontSize"))
+    {
+        m_fontSize = ::boost::lexical_cast< unsigned int >(m_configuration->getAttributeValue("fontSize"));
+    }
+
+    m_mapper->GetTextProperty()->SetFontSize(m_fontSize);
+
+    if(m_configuration->hasAttribute("hAlign"))
+    {
+        m_hAlign = m_configuration->getAttributeValue("hAlign");
+        SLM_ASSERT("'hAlign' value must be 'left' or 'right'", m_hAlign == "left" || m_hAlign == "right");
+    }
+
+    if(m_configuration->hasAttribute("vAlign"))
+    {
+        m_vAlign = m_configuration->getAttributeValue("vAlign");
+        SLM_ASSERT("'vAlign' value must be 'top' or 'bottom'", m_vAlign == "top" || m_vAlign == "bottom");
+    }
+
+    if( m_configuration->hasAttribute("color") )
+    {
+        std::string colorText = m_configuration->getAttributeValue("color");
+        if( colorText[0] == '#')
+        {
+            ::fwData::Color::sptr color = ::fwData::Color::New();
+            color->setRGBA(colorText);
+            m_mapper->GetTextProperty()->SetColor(color->getRefRGBA()[0], color->getRefRGBA()[1], color->getRefRGBA()[2]);
+        }
+        else
+        {
+            // compatibility with "old" color
+            double color = ::boost::lexical_cast<double> (colorText);
+            m_mapper->GetTextProperty()->SetColor(color, color, color);
+        }
+    }
+
+    this->setText(text);
+}
+
+//-----------------------------------------------------------------------------
+
+void Text::doStart() throw(fwTools::Failed)
+{
+    this->addToRenderer(m_actor);
+}
+
+//-----------------------------------------------------------------------------
+
+void Text::doStop() throw(fwTools::Failed)
+{
+    this->removeAllPropFromRenderer();
+}
+
+//-----------------------------------------------------------------------------
+
+void Text::setAlignment()
+{
+    vtkTextProperty* textprop = m_mapper->GetTextProperty();
+
+    if(m_hAlign == "left")
+    {
+        textprop->SetJustificationToLeft();
+
+        if(m_vAlign == "top")
+        {
+            textprop->SetVerticalJustificationToTop();
+            m_actor->SetPosition(0.001, 0.98);
+        }
+        else
+        {
+            textprop->SetVerticalJustificationToBottom();
+            m_actor->SetPosition(0.001,0.02);
+        }
+    }
+    else
+    {
+        textprop->SetJustificationToRight();
+
+        if(m_vAlign == "top")
+        {
+            textprop->SetVerticalJustificationToTop();
+            m_actor->SetPosition(0.99, 0.98);
+        }
+        else
+        {
+            textprop->SetVerticalJustificationToBottom();
+            m_actor->SetPosition(0.99,0.02);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Text::setText(std::string str)
+{
+    m_text = str;
+    m_mapper->SetInput(m_text.c_str());
+    this->setAlignment();
+    this->setVtkPipelineModified();
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Transform.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Transform.cpp
new file mode 100644
index 0000000..1cf3639
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Transform.cpp
@@ -0,0 +1,207 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <vtkCommand.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/TransformationMatrix3DMsg.hpp>
+
+#include "visuVTKAdaptor/Transform.hpp"
+
+class TransformClallback : public ::vtkCommand
+{
+public:
+
+    static TransformClallback* New(::visuVTKAdaptor::Transform* adaptor) {
+        TransformClallback *cb = new TransformClallback;
+        cb->m_adaptor = adaptor;
+        return cb;
+    }
+
+     TransformClallback() : m_adaptor(NULL) {}
+    ~TransformClallback() {}
+
+    virtual void Execute( ::vtkObject* pCaller, unsigned long, void* )
+    {
+        m_adaptor->updateFromVtk();
+    }
+
+    ::visuVTKAdaptor::Transform *m_adaptor;
+};
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Transform, ::fwData::TransformationMatrix3D ) ;
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Transform::Transform() throw()
+{
+    m_transform = 0;
+    m_transformCommand = TransformClallback::New(this);
+    //addNewHandledEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+Transform::~Transform() throw()
+{
+    if( m_transformCommand ) m_transformCommand->Delete();
+    m_transformCommand = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Transform::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setTransformId( m_configuration->getAttributeValue("transform") );
+
+    if ( m_configuration->hasAttribute( "autoRender" ) )
+    {
+        const std::string autoRender   = m_configuration->getAttributeValue("autoRender");
+        const bool autoRenderValue = (autoRender == "true");
+        this->setAutoRender(autoRenderValue);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Transform::doStart() throw(fwTools::Failed)
+{
+
+    this->doUpdate();
+    getTransform()->AddObserver( ::vtkCommand::ModifiedEvent, m_transformCommand );
+
+}
+
+
+
+void Transform::updateFromVtk()
+{
+    getTransform()->RemoveObserver( m_transformCommand );
+    ::fwData::TransformationMatrix3D::sptr trf = this->getObject< ::fwData::TransformationMatrix3D >();
+    vtkMatrix4x4* mat = getTransform()->GetMatrix();
+
+    {
+        ::fwData::mt::ObjectWriteLock lock(trf);
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                trf->setCoefficient(lt,ct, mat->GetElement(lt,ct));
+            }
+        }
+    }
+    ::fwComEd::TransformationMatrix3DMsg::sptr msg = ::fwComEd::TransformationMatrix3DMsg::New();
+    msg->addEvent( ::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED ) ;
+    ::fwServices::IEditionService::notify(this->getSptr(), trf, msg);
+
+    getTransform()->AddObserver( ::vtkCommand::ModifiedEvent, m_transformCommand );
+}
+
+
+//------------------------------------------------------------------------------
+
+void Transform::doUpdate() throw(fwTools::Failed)
+{
+    getTransform()->RemoveObserver( m_transformCommand );
+    ::fwData::TransformationMatrix3D::sptr trf = this->getObject< ::fwData::TransformationMatrix3D >();
+    vtkMatrix4x4* mat = vtkMatrix4x4::New();
+
+    {
+        ::fwData::mt::ObjectReadLock lock(trf);
+        for(int lt=0; lt<4; lt++)
+        {
+            for(int ct=0; ct<4; ct++)
+            {
+                mat->SetElement(lt,ct, trf->getCoefficient(lt,ct));
+            }
+        }
+    }
+    vtkTransform* vtkTrf = this->getTransform();
+    vtkTrf->SetMatrix(mat);
+    vtkTrf->Modified();
+    getTransform()->AddObserver( ::vtkCommand::ModifiedEvent, m_transformCommand );
+    mat->Delete();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Transform::setTransform(vtkTransform *t){
+    if ( m_transform != t )
+    {
+        if (m_transform)
+        {
+            m_transform->Delete();
+        }
+        if(t)
+        {
+            t->Register(NULL);
+        }
+    }
+
+    m_transform = t;
+};
+
+//------------------------------------------------------------------------------
+
+vtkTransform * Transform::getTransform(){
+    vtkTransform *t = m_transform;
+    if (t == 0)
+    {
+        t = this->IVtkAdaptorService::getTransform();
+    }
+    return t;
+}
+
+//------------------------------------------------------------------------------
+void Transform::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Transform::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Transform::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwComEd::TransformationMatrix3DMsg::csptr transfoMsg = ::fwComEd::TransformationMatrix3DMsg::dynamicConstCast(msg);
+    if (transfoMsg && transfoMsg->hasEvent(::fwComEd::TransformationMatrix3DMsg::MATRIX_IS_MODIFIED))
+    {
+
+        doUpdate();
+    }
+}
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/TriangularMesh.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/TriangularMesh.cpp
new file mode 100644
index 0000000..c8abda2
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/TriangularMesh.cpp
@@ -0,0 +1,994 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwComEd/MaterialMsg.hpp>
+#include <fwComEd/TriangularMeshMsg.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkActor.h>
+#include <vtkCamera.h>
+#include <vtkCommand.h>
+#include <vtkDepthSortPolyData.h>
+#include <vtkMath.h>
+#include <vtkMatrix4x4.h>
+#include <vtkPicker.h>
+#include <vtkPlaneCollection.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+
+#include "visuVTKAdaptor/Material.hpp"
+#include "visuVTKAdaptor/Normals.hpp"
+
+#include "visuVTKAdaptor/Transform.hpp"
+#include "visuVTKAdaptor/TriangularMesh.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::TriangularMesh, ::fwData::TriangularMesh ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+class TriangularMeshVtkCommand : public vtkCommand
+{
+public:
+    virtual void Stop() = 0;
+};
+
+
+//------------------------------------------------------------------------------
+
+namespace TMCommand
+{
+
+class PlaneShifterCallback : public TriangularMeshVtkCommand
+{
+    public:
+
+    static PlaneShifterCallback *New( vtkPlane *src,  vtkPlane *dst, double factor = 1.)
+    { return new PlaneShifterCallback( src, dst, factor ); }
+
+    //--------------------------------------------------------------------------
+    PlaneShifterCallback( vtkPlane *src,  vtkPlane *dst, double factor )
+    : m_planeSrc(src),
+      m_planeDst(dst),
+      m_factor(factor)
+    {
+        m_planeSrc->Register(this);
+        m_planeDst->Register(this);
+        src->AddObserver(vtkCommand::ModifiedEvent, this);
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        m_planeSrc->RemoveObserver(this);
+        m_planeSrc->UnRegister(this);
+        m_planeDst->UnRegister(this);
+    }
+
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * )
+    {
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            double n[3];
+            double o[3];
+
+            m_planeSrc->GetNormal(n);
+            m_planeSrc->GetOrigin(o);
+
+            if (m_factor < 0)
+            {
+                for (int i = 0; i<3; i++)
+                {
+                    n[i] = -n[i];
+                }
+            }
+
+            m_planeDst->SetNormal( n );
+            m_planeDst->SetOrigin( o );
+            m_planeDst->Push( m_factor );
+            m_planeDst->Modified();
+        }
+
+    }
+
+    protected:
+        vtkPlane *m_planeSrc;
+        vtkPlane *m_planeDst;
+        double    m_factor;
+};
+
+
+
+class PlaneCollectionShifterCallback : public TriangularMeshVtkCommand
+{
+    public:
+
+    static PlaneCollectionShifterCallback *New(
+            vtkPlaneCollection *src,
+            vtkPlaneCollection *dst,
+            double factor = 1. )
+    { return new PlaneCollectionShifterCallback( src, dst, factor ); }
+
+    //--------------------------------------------------------------------------
+    PlaneCollectionShifterCallback(
+            vtkPlaneCollection *src,
+            vtkPlaneCollection *dst,
+            double factor)
+    : m_planeCollectionSrc(src),
+      m_planeCollectionDst(dst),
+      m_factor(factor)
+    {
+        m_planeCollectionSrc->Register(this);
+        m_planeCollectionDst->Register(this);
+        m_planeCollectionSrc->AddObserver(vtkCommand::ModifiedEvent, this);
+
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        this->Clear();
+        m_planeCollectionSrc->RemoveObserver(this);
+        m_planeCollectionSrc->UnRegister(this);
+        m_planeCollectionDst->UnRegister(this);
+    }
+
+    void Clear()
+    {
+        m_planeCollectionDst->RemoveAllItems();
+
+        BOOST_FOREACH( PlaneShifterCallback *psc, m_planeCallbacks )
+        {
+            psc->Stop();
+            psc->Delete();
+            psc=0;
+        }
+        m_planeCallbacks.clear();
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * )
+    {
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            this->Clear();
+
+            vtkPlane *plane = NULL;
+            for (  m_planeCollectionSrc->InitTraversal();
+                  (plane=m_planeCollectionSrc->GetNextItem());
+                )
+            {
+                vtkPlane *newPlane = vtkPlane::New();
+                m_planeCollectionDst->AddItem(newPlane);
+                m_planeCallbacks.push_back(PlaneShifterCallback::New(plane, newPlane, m_factor));
+                newPlane->Modified();
+                newPlane->Delete();
+            }
+        }
+    }
+
+    protected:
+        vtkPlaneCollection *m_planeCollectionSrc;
+        vtkPlaneCollection *m_planeCollectionDst;
+
+        std::vector< PlaneShifterCallback* > m_planeCallbacks;
+        double    m_factor;
+};
+
+
+
+class PlaneCollectionAdaptorStarter : public TriangularMeshVtkCommand
+{
+    public:
+
+    static PlaneCollectionAdaptorStarter *New(
+            ::visuVTKAdaptor::TriangularMesh::sptr service,
+            vtkPlaneCollection *src,
+            double factor = 1. )
+    {
+        return new PlaneCollectionAdaptorStarter( service, src, factor );
+    }
+
+    //--------------------------------------------------------------------------
+    PlaneCollectionAdaptorStarter(
+            ::visuVTKAdaptor::TriangularMesh::sptr service,
+            vtkPlaneCollection *src,
+            double factor)
+    : m_service(service),
+      m_planeCollectionSrc(src),
+      m_factor(factor)
+    {
+        m_planeCollectionSrc->Register(this);
+        m_planeCollectionSrc->AddObserver(vtkCommand::ModifiedEvent, this);
+        this->Execute( 0, vtkCommand::ModifiedEvent, 0);
+    }
+
+    void Stop()
+    {
+        m_planeCollectionSrc->RemoveObserver(this);
+        m_planeCollectionSrc->UnRegister(this);
+        this->Clear();
+    }
+
+    void Clear()
+    {
+        BOOST_FOREACH( ::visuVTKAdaptor::TriangularMesh::wptr adaptor, m_meshServices )
+        {
+            if (!adaptor.expired())
+            {
+                adaptor.lock()->stop();
+                ::fwServices::OSR::unregisterService(adaptor.lock());
+            }
+        }
+        m_meshServices.clear();
+
+        BOOST_FOREACH( PlaneShifterCallback *psc, m_planeCallbacks )
+        {
+            psc->Stop();
+            psc->Delete();
+            psc=0;
+        }
+        m_planeCallbacks.clear();
+
+        BOOST_FOREACH( vtkPlaneCollection *planeCol, m_planeCollections )
+        {
+            planeCol->Delete();
+        }
+        m_planeCollections.clear();
+
+        if (!m_service.expired())
+        {
+            m_service.lock()->setActorPropertyToUnclippedMaterial( false );
+        }
+    }
+
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void * data)
+    {
+        ::visuVTKAdaptor::TriangularMesh::sptr service;
+
+        if (m_service.expired())
+        {
+            this->Stop();
+            this->Delete();
+            return ;
+        }
+
+        if (eventId == vtkCommand::ModifiedEvent)
+        {
+            service = m_service.lock();
+
+            this->Clear();
+
+            vtkPlane *plane = NULL;
+            for (  m_planeCollectionSrc->InitTraversal();
+                    (plane = m_planeCollectionSrc->GetNextItem());
+                )
+            {
+                vtkPlane *newPlane = vtkPlane::New();
+                m_planeCallbacks.push_back(PlaneShifterCallback::New(plane, newPlane, m_factor));
+
+                vtkPlaneCollection *newCollection = vtkPlaneCollection::New();
+                newCollection->AddItem(newPlane);
+
+
+                ::fwRenderVTK::IVtkAdaptorService::sptr meshService =
+                    ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+                            service->getObject(),
+                            "::visuVTKAdaptor::TriangularMesh" );
+
+                ::visuVTKAdaptor::TriangularMesh::sptr meshAdaptor = TriangularMesh::dynamicCast(meshService);
+
+                meshAdaptor->setRenderService ( service->getRenderService()  );
+                meshAdaptor->setRenderId      ( service->getRenderId()       );
+                meshAdaptor->setPickerId      ( service->getPickerId()       );
+                meshAdaptor->setMapperInput   ( service->getMapperInput()    );
+                meshAdaptor->setSharpEdgeAngle( service->getSharpEdgeAngle() );
+                meshAdaptor->setMaterial      ( service->getMaterial()       );
+                meshAdaptor->setAutoRender( service->getAutoRender() );
+
+                meshAdaptor->setVtkClippingPlanes( newCollection );
+
+                meshAdaptor->start();
+                meshAdaptor->updateVisibility ( service->getVisibility()     );
+
+                newPlane->Delete();
+
+                m_planeCollections.push_back(newCollection);
+                m_meshServices.push_back(meshAdaptor);
+            }
+
+            bool hasItems = !m_meshServices.empty();
+            service->setActorPropertyToUnclippedMaterial( hasItems );
+        }
+        else if ( eventId == vtkCommand::UserEvent )
+        {
+            BOOST_FOREACH( ::visuVTKAdaptor::TriangularMesh::wptr adaptor, m_meshServices )
+            {
+                if (!adaptor.expired())
+                {
+                    adaptor.lock()->updateVisibility(*(bool*)data);
+                }
+            }
+        }
+    }
+
+    protected:
+
+        ::visuVTKAdaptor::TriangularMesh::wptr m_service;
+
+        vtkPlaneCollection *m_planeCollectionSrc;
+        ::fwData::TriangularMesh::sptr m_mesh;
+
+        std::vector< ::visuVTKAdaptor::TriangularMesh::wptr > m_meshServices;
+
+        std::vector< PlaneShifterCallback* > m_planeCallbacks;
+        std::vector< vtkPlaneCollection* >   m_planeCollections;
+
+        double    m_factor;
+};
+
+}
+
+//------------------------------------------------------------------------------
+
+TriangularMesh::TriangularMesh() throw()
+{
+    m_material               = ::fwData::Material::New();
+    m_unclippedPartMaterial  = ::fwData::Material::New();
+    m_unclippedPartMaterial->ambient()->setRGBA("#aaaaff44");
+
+    m_clippingPlanesId  = "";
+    m_sharpEdgeAngle    = 180;
+
+    m_showClippedPart   = false;
+    m_clippingPlanes    = 0;
+    m_actor             = 0;
+    m_normals           = vtkPolyDataNormals::New();
+
+    m_manageMapperInput = true;
+    m_mapperInput       = 0;
+    m_polyData          = 0;
+    m_mapper            = vtkPolyDataMapper::New();
+    m_pipelineInput     = m_mapper;
+
+    m_computeNormals     = true;
+    m_computeNormalsAtUpdate = true;
+
+    m_autoResetCamera   = true;
+
+    m_planeCollectionShifterCallback = 0;
+    m_servicesStarterCallback        = 0;
+
+    m_transform = vtkTransform::New();
+
+    //addNewHandledEvent (::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED );
+    //addNewHandledEvent (::fwComEd::TriangularMeshMsg::NEW_MESH );
+    //addNewHandledEvent (::fwComEd::TriangularMeshMsg::VERTEX_MODIFIED );
+}
+
+//------------------------------------------------------------------------------
+
+TriangularMesh::~TriangularMesh() throw()
+{
+    m_clippingPlanes = 0;
+
+    m_mapper->Delete();
+    m_mapper = 0;
+
+    m_normals->Delete();
+    m_normals = 0;
+
+    m_transform->Delete();
+    m_transform = 0;
+
+    if(m_actor)
+    {
+        m_actor->Delete();
+        m_actor = 0;
+    }
+
+    if (m_polyData)
+    {
+        m_polyData->Delete();
+        m_polyData = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::configuring() throw(fwTools::Failed)
+{
+    assert(m_configuration->getName() == "config");
+
+    std::string color = m_configuration->getAttributeValue("color");
+    std::string unclippedColor = m_configuration->getAttributeValue("unclippedcolor");
+
+    m_material->ambient()->setRGBA(color.empty() ? "#ffffffff" : color );
+
+    m_unclippedPartMaterial->ambient()->setRGBA(unclippedColor.empty() ? "#aaaaff44" : unclippedColor );
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+
+    this->setPickerId    ( m_configuration->getAttributeValue ( "picker"    ) );
+    this->setRenderId    ( m_configuration->getAttributeValue ( "renderer"  ) );
+    this->setTransformId ( m_configuration->getAttributeValue ( "transform" ) );
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::doUpdate() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::TriangularMesh::sptr triangularMesh = this->getObject < ::fwData::TriangularMesh >();
+    this->updateTriangularMesh( triangularMesh );
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::doReceive( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    ::fwComEd::MaterialMsg::csptr materialMsg = ::fwComEd::MaterialMsg::dynamicConstCast(msg);
+    ::fwComEd::TriangularMeshMsg::csptr meshMsg = ::fwComEd::TriangularMeshMsg::dynamicConstCast(msg);
+
+    if( materialMsg && materialMsg->hasEvent(::fwComEd::MaterialMsg::MATERIAL_IS_MODIFIED) )
+    {
+        this->updateOptionsMode();
+    }
+
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::TriangularMeshMsg::NEW_MESH) )
+    {
+        ::fwData::TriangularMesh::sptr triangularMesh = this->getObject < ::fwData::TriangularMesh >();
+        this->updateTriangularMesh( triangularMesh );
+    }
+
+    if( meshMsg && meshMsg->hasEvent(::fwComEd::TriangularMeshMsg::VERTEX_MODIFIED) )
+    {
+       ::fwData::TriangularMesh::sptr mesh = this->getObject < ::fwData::TriangularMesh >();
+       SLM_ASSERT("m_polyData not instanced", m_polyData);
+
+       ::fwVtkIO::updatePolyDataPoints(m_polyData, mesh);
+
+       this->setVtkPipelineModified();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::doStart() throw(fwTools::Failed)
+{
+    this->buildPipeline();
+    m_transformService.lock()->start();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::doStop() throw(fwTools::Failed)
+{
+    m_transformService.lock()->stop();
+    ::fwServices::OSR::unregisterService(m_transformService.lock());
+
+    this->removeAllPropFromRenderer();
+    if (this->getPicker())
+    {
+        this->removeFromPicker(m_actor);
+    }
+
+    removeNormalsService();
+    removePlaneCollectionShifterCommand();
+    removeServicesStarterCommand();
+
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::doSwap() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    m_transformService.lock()->stop();
+    ::fwServices::OSR::unregisterService(m_transformService.lock());
+
+
+    ::fwRenderVTK::IVtkAdaptorService::sptr materialService = m_materialService.lock();
+    ::fwRenderVTK::IVtkAdaptorService::sptr unclippedPartMaterialService = m_unclippedPartMaterialService.lock();
+
+    this->setServiceOnMaterial(materialService, m_material);
+    this->setServiceOnMaterial(unclippedPartMaterialService , m_unclippedPartMaterial);
+
+    m_materialService              = materialService;
+    m_unclippedPartMaterialService = unclippedPartMaterialService;
+
+    ::fwData::TriangularMesh::sptr triangularMesh = this->getObject < ::fwData::TriangularMesh >();
+
+    this->createTransformService();
+    m_transformService.lock()->start();
+    this->updateTriangularMesh( triangularMesh );
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::createTransformService()
+{
+
+    ::fwData::TriangularMesh::sptr triangularMesh = this->getObject < ::fwData::TriangularMesh >();
+
+    if(!this->getTransformId().empty())
+    {
+        m_transform->Concatenate(this->getTransform());
+    }
+
+    ::fwData::TransformationMatrix3D::sptr fieldTransform;
+    fieldTransform = triangularMesh->setDefaultField("TransformMatrix", ::fwData::TransformationMatrix3D::New());
+
+    vtkTransform *vtkFieldTransform = vtkTransform::New();
+    vtkFieldTransform->Identity();
+    m_transformService = ::visuVTKAdaptor::Transform::dynamicCast(
+        ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+                fieldTransform,
+                "::visuVTKAdaptor::Transform" ));
+    assert(m_transformService.lock());
+    ::visuVTKAdaptor::Transform::sptr transformService = m_transformService.lock();
+
+
+    transformService->setRenderService ( this->getRenderService()  );
+    transformService->setRenderId      ( this->getRenderId()       );
+    transformService->setAutoRender    ( this->getAutoRender()     );
+
+    transformService->setTransform(vtkFieldTransform);
+    m_transform->Concatenate(vtkFieldTransform);
+    vtkFieldTransform->Delete();
+
+
+    m_actor->SetUserTransform(m_transform);
+
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Material::sptr TriangularMesh::getMaterial()
+{
+    return m_material;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Material::sptr TriangularMesh::getUnclippedMaterial()
+{
+    return m_unclippedPartMaterial;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setActorPropertyToUnclippedMaterial(bool opt)
+{
+    ::visuVTKAdaptor::Material::sptr mat;
+
+    if (opt)
+    {
+        assert(!m_unclippedPartMaterialService.expired());
+        mat = ::visuVTKAdaptor::Material::dynamicCast(
+                m_unclippedPartMaterialService.lock()
+                );
+    }
+    else
+    {
+        assert(!m_materialService.expired());
+        mat = ::visuVTKAdaptor::Material::dynamicCast(
+                m_materialService.lock()
+                );
+    }
+
+    SLM_ASSERT("Invalid Material Adaptor", mat);
+
+    m_actor->SetProperty( mat->getVtkProperty() );
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setShowClippedPart(bool show)
+{
+    m_showClippedPart = show;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setClippingPlanesId(::fwRenderVTK::VtkRenderService::VtkObjectIdType id)
+{
+    m_clippingPlanesId = id;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setSharpEdgeAngle(double angle)
+{
+    m_sharpEdgeAngle = angle;
+}
+
+//------------------------------------------------------------------------------
+
+double TriangularMesh::getSharpEdgeAngle()
+{
+    return m_sharpEdgeAngle;
+}
+
+//------------------------------------------------------------------------------
+
+vtkAlgorithmOutput *TriangularMesh::getMapperInput()
+{
+    return m_mapperInput;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setServiceOnMaterial(::fwRenderVTK::IVtkAdaptorService::sptr &srv, ::fwData::Material::sptr material)
+{
+
+    if (! srv)
+    {
+        srv = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService > (
+            material, "::visuVTKAdaptor::Material"
+            );
+        SLM_ASSERT("srv not instanced", srv);
+
+        srv->setRenderService(this->getRenderService());
+        srv->setAutoRender( this->getAutoRender() );
+        srv->start();
+        srv->update();
+        this->registerService(srv);
+    }
+    else if (srv->getObject< ::fwData::Material >() != material)
+    {
+        srv->swap(material);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setMaterial(::fwData::Material::sptr material)
+{
+    m_material = material;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setUnclippedPartMaterial(::fwData::Material::sptr material)
+{
+    m_unclippedPartMaterial = material;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setMapperInput(vtkAlgorithmOutput *input)
+{
+    if (input)
+    {
+        m_mapperInput = input;
+        m_manageMapperInput = false;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::updateOptionsMode()
+{
+    if (m_material->getOptionsMode() == ::fwData::Material::MODE_NORMALS)
+    {
+        createNormalsService();
+    }
+    else
+    {
+        removeNormalsService();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::createNormalsService()
+{
+    ::fwData::TriangularMesh::sptr TriangularMesh = this->getObject < ::fwData::TriangularMesh >();
+
+
+    if(m_mapperInput)
+    {
+        ::fwRenderVTK::IVtkAdaptorService::sptr service =
+            ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >(
+                    TriangularMesh,
+                    "::visuVTKAdaptor::Normals"
+                    );
+        SLM_ASSERT("service not instanced", service);
+
+        service->setRenderService( this->getRenderService() );
+        service->setRenderId     ( this->getRenderId()      );
+        service->setPickerId     ( this->getPickerId()      );
+        service->setAutoRender   ( this->getAutoRender()    );
+        ::visuVTKAdaptor::Normals::dynamicCast(service)->setMapperInput( m_mapperInput );
+        service->start();
+
+
+        m_normalsService = service;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::removeNormalsService()
+{
+    if ( !m_normalsService.expired() )
+    {
+        m_normalsService.lock()->stop();
+        ::fwServices::OSR::unregisterService(m_normalsService.lock());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::buildPipeline()
+{
+    m_pipelineInput = m_mapper;
+
+    if ( m_manageMapperInput )
+    {
+        m_normals->ComputePointNormalsOn();
+        m_normals->ComputeCellNormalsOff();
+        m_normals->ConsistencyOn();
+        m_normals->SplittingOff();
+        m_normals->SetFeatureAngle( m_sharpEdgeAngle );
+
+        if (m_computeNormals)
+        {
+           m_mapperInput   = m_normals->GetOutputPort();
+           m_pipelineInput = m_normals;
+        }
+    }
+
+    ::fwData::TriangularMesh::sptr triangularMesh = this->getObject < ::fwData::TriangularMesh >();
+
+    if (!m_clippingPlanesId.empty())
+    {
+        vtkObject          *o      = this->getVtkObject(m_clippingPlanesId);
+        vtkPlaneCollection *planes = vtkPlaneCollection::SafeDownCast(o);
+        this->setVtkClippingPlanes( planes );
+    }
+
+    ::fwRenderVTK::IVtkAdaptorService::sptr materialService;
+    ::fwRenderVTK::IVtkAdaptorService::sptr unclippedPartMaterialService;
+
+    this->setServiceOnMaterial(materialService, m_material);
+    this->setServiceOnMaterial(unclippedPartMaterialService , m_unclippedPartMaterial);
+
+    m_materialService              = materialService;
+    m_unclippedPartMaterialService = unclippedPartMaterialService;
+
+    if (!m_actor)
+    {
+        m_actor = this->newActor();
+        this->createTransformService();
+
+        this->addToRenderer(m_actor);
+        if (this->getPicker())
+        {
+            this->addToPicker(m_actor);
+        }
+    }
+
+    if ( m_manageMapperInput )
+    {
+        this->updateMaterial( m_material );
+        this->updateTriangularMesh( triangularMesh );
+        this->updateMapper();
+
+        this->updateOptionsMode();
+    }
+
+    setActorPropertyToUnclippedMaterial(false);
+
+    removeServicesStarterCommand();
+
+    if( m_clippingPlanes && m_showClippedPart )
+    {
+        createServicesStarterCommand();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::updateTriangularMesh( ::fwData::TriangularMesh::sptr mesh )
+{
+    if(m_manageMapperInput)
+    {
+        if (m_polyData)
+        {
+            m_polyData->Delete();
+            m_polyData = 0;
+        }
+
+        m_polyData = ::fwVtkIO::toVTKMesh(mesh);
+
+        if (m_computeNormalsAtUpdate)
+        {
+            m_normals->SetInput( m_polyData );
+            m_normals->Update();
+            m_polyData->DeepCopy(m_normals->GetOutput());
+        }
+
+        this->updateMapper();
+
+        if (m_autoResetCamera)
+        {
+            this->getRenderer()->ResetCamera();
+        }
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::updateMapper()
+{
+    vtkPolyDataMapper  *mapper = 0;
+    vtkPolyDataAlgorithm *algo = 0;
+
+    SLM_ASSERT("Bad vtkPolyData", m_polyData);
+
+    if( (algo = vtkPolyDataAlgorithm::SafeDownCast(m_pipelineInput)) )
+    {
+        algo->SetInput( m_polyData );
+        SLM_ASSERT ("missing mapper input", m_mapperInput);
+        m_mapper->SetInputConnection(m_mapperInput);
+    }
+    else if ( (mapper = vtkPolyDataMapper::SafeDownCast(m_pipelineInput)) )
+    {
+        SLM_ASSERT ("mapper input should be 0", m_mapperInput == 0 );
+        mapper->SetInput( m_polyData );
+    }
+
+    SLM_ASSERT( "Bad pipeline input", algo || mapper);
+}
+
+//------------------------------------------------------------------------------
+
+vtkActor *TriangularMesh::newActor()
+{
+    vtkActor *actor = vtkActor::New();
+
+    m_mapper->SetInputConnection(m_mapperInput);
+
+    if (m_clippingPlanes)
+    {
+        vtkPlaneCollection *newClippingPlanes = vtkPlaneCollection::New();
+
+        removePlaneCollectionShifterCommand();
+
+        m_planeCollectionShifterCallback =
+                TMCommand::PlaneCollectionShifterCallback::New(m_clippingPlanes, newClippingPlanes, 2.);
+
+        m_mapper->SetClippingPlanes(newClippingPlanes);
+        newClippingPlanes->Delete();
+    }
+
+    actor->SetMapper(m_mapper);
+
+    this->setVtkPipelineModified();
+    return actor;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::updateMaterial( ::fwData::Material::sptr material )
+{
+    return ;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::updateVisibility( bool isVisible)
+{
+    if (m_actor)
+    {
+        m_actor->SetVisibility( isVisible );
+    }
+
+    if (m_servicesStarterCallback)
+    {
+        m_servicesStarterCallback->Execute(0, vtkCommand::UserEvent, &isVisible);
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+bool TriangularMesh::getVisibility()
+{
+    bool visible = false;
+    if (m_actor)
+    {
+        visible = m_actor->GetVisibility() == 1;
+    }
+    return visible;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setVtkClippingPlanes(vtkPlaneCollection *planes)
+{
+    m_clippingPlanes = planes;
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::removePlaneCollectionShifterCommand()
+{
+    if (m_planeCollectionShifterCallback)
+    {
+        m_planeCollectionShifterCallback->Stop();
+        m_planeCollectionShifterCallback->Delete();
+        m_planeCollectionShifterCallback = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::createServicesStarterCommand()
+{
+    if(!m_servicesStarterCallback)
+    {
+        ::visuVTKAdaptor::TriangularMesh::sptr srv =
+            ::visuVTKAdaptor::TriangularMesh::dynamicCast(
+                    this->getSptr()
+                    );
+        m_servicesStarterCallback = TMCommand::PlaneCollectionAdaptorStarter::New( srv, m_clippingPlanes, -1. );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::removeServicesStarterCommand()
+{
+    if(m_servicesStarterCallback)
+    {
+        m_servicesStarterCallback->Stop();
+        m_servicesStarterCallback->Delete();
+        m_servicesStarterCallback = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMesh::setAutoResetCamera(bool autoResetCamera)
+{
+    m_autoResetCamera = autoResetCamera;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKAdaptor
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/VectorField.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/VectorField.cpp
new file mode 100644
index 0000000..20e5116
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/VectorField.cpp
@@ -0,0 +1,226 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/String.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/TransferFunction.hpp>
+
+#include <vtkActor.h>
+#include <vtkArrowSource.h>
+#include <vtkAssignAttribute.h>
+#include <vtkGlyph3D.h>
+#include <vtkGlyph3DMapper.h>
+#include <vtkGlyphSource2D.h>
+#include <vtkImageData.h>
+#include <vtkMaskPoints.h>
+#include <vtkPointData.h>
+#include <vtkPolyDataMapper.h>
+
+#include <fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp>
+
+#include "visuVTKAdaptor/VectorField.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::VectorField, ::fwData::Image ) ;
+
+namespace visuVTKAdaptor
+{
+
+
+//------------------------------------------------------------------------------
+
+VectorField::VectorField() throw()
+{
+    m_imageData  = vtkImageData::New();
+
+
+    // Manage events
+    //addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER                     );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::MODIFIED                   );
+    //addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE                  );
+}
+
+//------------------------------------------------------------------------------
+
+VectorField::~VectorField() throw()
+{
+    m_imageData->Delete();
+    m_imageData = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::doStart() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::doStop() throw(fwTools::Failed)
+{
+    this->destroyPipeline();
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::doUpdate() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid && image->getNumberOfComponents() == 3)
+    {
+        this->buildPipeline();
+    }
+    else
+    {
+        this->destroyPipeline();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid && image->getNumberOfComponents() == 3)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            this->doUpdate();
+        }
+
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::MODIFIED ) )
+        {
+            m_imageData->Modified();
+
+            this->setVtkPipelineModified();
+        }
+    }
+    else
+    {
+        this->destroyPipeline();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::configuring() throw(fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::buildPipeline( )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+
+    ::fwVtkIO::toVTKImage(image, m_imageData);
+
+    // m_imageData->GetPointData()->SetActiveVectors("ImageScalars");
+
+    vtkSmartPointer<vtkArrowSource> arrowSource = vtkSmartPointer<vtkArrowSource>::New();
+
+    // vtkSmartPointer<vtkGlyphSource2D> arrowSource = vtkSmartPointer<vtkGlyphSource2D>::New();
+    // arrowSource->SetGlyphTypeToArrow();
+    // arrowSource->FilledOff();
+
+    m_arrowSource = arrowSource;
+
+    vtkSmartPointer<vtkMaskPoints> ptMask = vtkSmartPointer<vtkMaskPoints>::New();
+
+    ptMask->SetInput(m_imageData);
+    ptMask->SetOnRatio(1);
+    ptMask->RandomModeOn();
+
+
+    // vtkSmartPointer<vtkAssignAttribute> assignAttr = vtkSmartPointer<vtkAssignAttribute>::New();
+    // assignAttr->SetInputConnection(ptMask->GetOutputPort());
+    // assignAttr->Assign( vtkDataSetAttributes::SCALARS, vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA );
+
+
+// #define USE_GPU_GLYPH
+#ifndef USE_GPU_GLYPH
+    ptMask->SetMaximumNumberOfPoints(5000);
+
+    vtkSmartPointer<vtkGlyph3D> glyphFilter = vtkSmartPointer<vtkGlyph3D>::New();
+    glyphFilter->SetSourceConnection(m_arrowSource->GetOutputPort());
+
+    // glyphFilter->SetScaleModeToScaleByVector();
+    glyphFilter->ScalingOn();
+
+    glyphFilter->SetVectorModeToUseVector();
+
+    glyphFilter->OrientOn();
+
+    glyphFilter->SetInputConnection(ptMask->GetOutputPort());
+    // glyphFilter->SetInputConnection(assignAttr->GetOutputPort());
+    // glyphFilter->SetInput(m_imageData);
+
+    glyphFilter->SetInputArrayToProcess( 1, m_imageData->GetInformation());
+
+    vtkSmartPointer<vtkPolyDataMapper> vectorMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
+    vectorMapper->SetInputConnection(glyphFilter->GetOutputPort());
+#else
+    ptMask->SetMaximumNumberOfPoints(15000);
+
+    vtkSmartPointer<vtkGlyph3DMapper> vectorMapper = vtkSmartPointer<vtkGlyph3DMapper>::New();
+    vectorMapper->SetOrientationArray(vtkDataSetAttributes::SCALARS);
+    vectorMapper->SetSourceConnection(m_arrowSource->GetOutputPort());
+    vectorMapper->OrientOn();
+    vectorMapper->SetInputConnection(ptMask->GetOutputPort());
+
+    OSLM_WARN("USE_GPU");
+#endif
+
+
+    vtkSmartPointer<vtkActor> vectorActor = vtkSmartPointer<vtkActor>::New();
+    vectorActor->SetMapper(vectorMapper);
+
+    this->addToRenderer(vectorActor);
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void VectorField::destroyPipeline( )
+{
+    this->removeAllPropFromRenderer();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Video.cpp b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Video.cpp
new file mode 100644
index 0000000..e8a58e7
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKAdaptor/src/visuVTKAdaptor/Video.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Video.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Boolean.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/VideoMsg.hpp>
+
+
+#include <vtkPlaneSource.h>
+#include <vtkActor.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkRenderer.h>
+#include <vtkImageData.h>
+#include <vtkUnsignedCharArray.h>
+#include <vtkPointData.h>
+#include <vtkMatrix4x4.h>
+#include <vtkTransform.h>
+#include <vtkCamera.h>
+#include <vtkProperty.h>
+#include <vtkgl.h>
+
+#include "visuVTKAdaptor/Video.hpp"
+
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKAdaptor::Video, ::fwData::Video ) ;
+
+
+namespace visuVTKAdaptor
+{
+
+//------------------------------------------------------------------------------
+
+Video::Video() throw()
+{
+    m_imageData   = vtkImageData::New();
+    m_array = vtkUnsignedCharArray::New();
+    m_texture = vtkTexture::New();
+    bText_init  = false;
+
+    //addNewHandledEvent( ::fwComEd::VideoMsg::VIDEO_IS_REFRESHED );
+}
+
+//------------------------------------------------------------------------------
+
+Video::~Video() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Video::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+}
+
+//------------------------------------------------------------------------------
+
+void Video::doStart() throw(fwTools::Failed)
+{
+    vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
+    vtkPlaneSource* plan = vtkPlaneSource ::New();
+    mapper->SetInput(plan->GetOutput());
+    vtkActor* actor = this->getActor();
+    actor->SetMapper(mapper);
+    this->setVtkPipelineModified();
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Video::doUpdate() throw(fwTools::Failed)
+{
+    ::fwData::Video::sptr video = this->getObject< ::fwData::Video >();
+    if (!video->dataAvailable())
+        return;
+
+    const ::boost::uint8_t * _pImageBuffer = video->getImageBuffer();
+
+    int size[3];
+    size[0] = video->getXSize() ;
+    size[1] = video->getYSize();
+    size[2] = 1;
+
+    m_array->SetNumberOfComponents(video->m_ui8BPP );
+    m_array->SetVoidArray( (unsigned char*)_pImageBuffer, video->getXSize() * video->getYSize() ,1);
+    m_imageData->GetPointData()->SetScalars(m_array) ;
+    m_imageData->SetDimensions(size) ;
+    m_imageData->SetScalarType(VTK_UNSIGNED_CHAR) ;
+    m_imageData->SetSpacing(1.0, 1.0, 1.0 );
+    m_imageData->SetOrigin(0.0, 0.0, 0.0 );
+
+    if(!bText_init)
+    {
+        m_texture->SetInput(m_imageData ) ;
+        this->getActor()->SetScale(size[0], size[1], 1.0);
+        this->getRenderer()->InteractiveOff();
+        this->getRenderer()->GetActiveCamera()->ParallelProjectionOn();
+        this->getRenderer()->ResetCamera();
+
+         //fit the image to the render window
+        this->getRenderer()->GetActiveCamera()->SetParallelScale(size[1] / 2.0);
+
+        this->addToRenderer(this->getActor());
+
+        bText_init  = true;
+
+        vtkProperty *property = this->getActor()->GetProperty();
+        ::boost::filesystem::path pathShader ( std::string(LIBSFW4SPL) + "Bundles/visuVTKAdaptor_" + std::string(VISUVTKADAPTOR_VER) + "/video.xml" );
+        property->LoadMaterial(pathShader.string().c_str());
+        property->SetTexture("texture", m_texture);
+        property->ShadingOn();
+    }
+    m_imageData->Modified();
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Video::doSwap() throw(fwTools::Failed)
+{
+    this->doUpdate();
+}
+
+//------------------------------------------------------------------------------
+
+void Video::doStop() throw(fwTools::Failed)
+{
+    this->unregisterServices();
+}
+
+//------------------------------------------------------------------------------
+
+void Video::doReceive( ::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    ::fwData::Video::sptr video = this->getObject< ::fwData::Video >();
+
+    ::fwComEd::VideoMsg::csptr videoMsg = ::fwComEd::VideoMsg::dynamicConstCast( msg );
+    if ( videoMsg &&
+            ( videoMsg->hasEvent( ::fwComEd::VideoMsg::VIDEO_IS_REFRESHED ) /* ||  videoMsg->hasEvent( ::fwComEd::VideoMsg::VIDEO_IS_INITIALIZED ) */ ) )
+    {
+        doUpdate();
+    }
+}
+
+
+
+} //namespace visuVTKAdaptor
diff --git a/Bundles/LeafVisu/visuVTKQt/CMakeLists.txt b/Bundles/LeafVisu/visuVTKQt/CMakeLists.txt
new file mode 100644
index 0000000..b53b405
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/CMakeLists.txt
@@ -0,0 +1,33 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwGui
+    fwRenderVTK
+    fwRuntime
+)
+
+fwReq(
+    visu
+    visuVTK
+)
+
+add_definitions("-DQT_NO_KEYWORDS")
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui QtSql QtNetWork QtOpenGL REQUIRED)
+include(${QT_USE_FILE})
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS} 
+    ${QT_INCLUDE_DIR}
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    ${QT_LIBRARIES}
+    QVTK
+    )
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
diff --git a/Bundles/LeafVisu/visuVTKQt/COPYING b/Bundles/LeafVisu/visuVTKQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/visuVTKQt/COPYING.LESSER b/Bundles/LeafVisu/visuVTKQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/visuVTKQt/Properties.cmake b/Bundles/LeafVisu/visuVTKQt/Properties.cmake
new file mode 100644
index 0000000..04891ad
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME visuVTKQt )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwData fwGui fwGuiQt fwRenderVTK fwRuntime fwServices fwTools )
+set( REQUIREMENTS visu visuVTK )
+
diff --git a/Bundles/LeafVisu/visuVTKQt/bin/build.options b/Bundles/LeafVisu/visuVTKQt/bin/build.options
new file mode 100755
index 0000000..5998716
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/bin/build.options
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+USE = [
+    'boost',
+    'QVtk'
+    ]
+LIB = [
+    'fwRuntime_0-3',
+    'fwTools_0-1',
+    'fwCore_0-1',
+    'fwGuiQt_0-1',
+    'fwRenderVTK_0-1',
+    ]
+
+REQUIREMENTS = [
+                'visuVTK_0-1',
+                ]
+TYPE = 'bundle'
+VERSION = '0-1'
+
diff --git a/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Namespace.hpp b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Namespace.hpp
new file mode 100644
index 0000000..67073ce
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef UIVISUVTKQTNAMESPACE_HPP_
+#define UIVISUVTKQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace visuVTKQt contains a vtk Renderer window interactor manager using Qt.
+ * @namespace   visuVTKQt
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace visuVTKQt
+{
+}
+#endif /* UIVISUVTKQTNAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Plugin.hpp b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Plugin.hpp
new file mode 100644
index 0000000..09682e2
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/Plugin.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKQT_PLUGIN_HPP_
+#define _VISUVTKQT_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "visuVTKQt/config.hpp"
+
+namespace visuVTKQt
+{
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009.
+ */
+struct VISUVTKQT_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+
+    // Overrides
+    VISUVTKQT_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    VISUVTKQT_API void stop() throw();
+
+};
+
+} // namespace visuVTKQt
+
+#endif //_VISUVTKQT_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/VtkRenderWindowInteractorManager.hpp b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/VtkRenderWindowInteractorManager.hpp
new file mode 100644
index 0000000..c7066f5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/VtkRenderWindowInteractorManager.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKQT_VTKRENDERWINDOWINTERACTORMANAGER_HPP_
+#define _VISUVTKQT_VTKRENDERWINDOWINTERACTORMANAGER_HPP_
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include <fwRenderVTK/IVtkRenderWindowInteractorManager.hpp>
+
+#include <fwGui/container/fwContainer.hpp>
+
+#include "visuVTKQt/config.hpp"
+
+class vtkRenderWindowInteractor;
+
+QT_BEGIN_NAMESPACE
+class QVTKWidget;
+QT_END_NAMESPACE
+
+namespace fwGuiQt
+{
+namespace container
+{
+class QtContainer;
+}
+}
+
+namespace visuVTKQt
+{
+
+/**
+ * @brief   Defines a class to manage vtkRenderWindowInteractor in a window.
+ * @class   VtkRenderWindowInteractorManager
+ *
+ * @date    2009-2010.
+ *
+ */
+class VISUVTKQT_CLASS_API VtkRenderWindowInteractorManager : public ::fwRenderVTK::IVtkRenderWindowInteractorManager
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (VtkRenderWindowInteractorManager)
+                                                (::fwRenderVTK::IVtkRenderWindowInteractorManager) )
+
+    VISUVTKQT_API VtkRenderWindowInteractorManager(::fwRenderVTK::IVtkRenderWindowInteractorManager::Key key);
+
+    VISUVTKQT_API virtual ~VtkRenderWindowInteractorManager();
+
+    /// Creates an interactor and installs it in window.
+    VISUVTKQT_API virtual void installInteractor( ::fwGui::container::fwContainer::sptr _parent );
+
+    /// Deletes interactor and manage correctly the window (removing layout).
+    VISUVTKQT_API virtual void uninstallInteractor();
+
+    /// Return a pointer on interactor
+    VISUVTKQT_API virtual ::vtkRenderWindowInteractor * getInteractor();
+
+private:
+
+    QPointer<QVTKWidget> m_qVTKWidget;
+
+    vtkRenderWindowInteractor *m_interactor;
+
+    SPTR(::fwGuiQt::container::QtContainer) m_parentContainer;
+
+};
+
+} // namespace visuVTKQt
+
+#endif // _VISUVTKQT_VTKRENDERWINDOWINTERACTORMANAGER_HPP_
+
+
diff --git a/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/config.hpp b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/config.hpp
new file mode 100644
index 0000000..7b50a1b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/include/visuVTKQt/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VISUVTKQT_CONFIG_HPP_
+#define VISUVTKQT_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VISUVTKQT_EXPORTS
+    #define VISUVTKQT_API __declspec(dllexport)
+    #else
+    #define VISUVTKQT_API __declspec(dllimport)
+    #endif
+
+    #define VISUVTKQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VISUVTKQT_EXPORTS
+    #define VISUVTKQT_API __attribute__ ((visibility("default")))
+    #define VISUVTKQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VISUVTKQT_API __attribute__ ((visibility("hidden")))
+    #define VISUVTKQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VISUVTKQT_API
+    #define VISUVTKQT_CLASS_API
+
+#endif
+
+#endif //VISUVTKQT_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/visuVTKQt/rc/plugin.xml b/Bundles/LeafVisu/visuVTKQt/rc/plugin.xml
new file mode 100644
index 0000000..c43ad4e
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/rc/plugin.xml
@@ -0,0 +1,13 @@
+<plugin id="visuVTKQt" class="visuVTKQt::Plugin" >
+    
+    <library name="visuVTKQt" />
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="visu" />
+    <requirement id="visuVTK" />
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/Plugin.cpp b/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/Plugin.cpp
new file mode 100644
index 0000000..fa11f51
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/Plugin.cpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwCore/spyLog.hpp>
+
+#include "visuVTKQt/Plugin.hpp"
+
+namespace visuVTKQt
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("visuVTKQt::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace visuVTKQt
diff --git a/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/VtkRenderWindowInteractorManager.cpp b/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/VtkRenderWindowInteractorManager.cpp
new file mode 100644
index 0000000..babe745
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKQt/src/visuVTKQt/VtkRenderWindowInteractorManager.cpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QVBoxLayout>
+#include <QEvent>
+#include <QDropEvent>
+
+#include <QVTKWidget.h>
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwData/String.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include <fwRenderVTK/registry/macros.hpp>
+#include <fwGuiQt/container/QtContainer.hpp>
+
+#include "visuVTKQt/VtkRenderWindowInteractorManager.hpp"
+
+class DropFilter : public QObject
+ {
+ public:
+     DropFilter(::fwServices::IService::sptr service): m_service(service){};
+ protected:
+     bool eventFilter(QObject *obj, QEvent *event);
+
+ private:
+     ::fwServices::IService::wptr m_service;
+ };
+
+ bool DropFilter::eventFilter(QObject *obj, QEvent *event)
+ {
+     if( event->type() == QEvent::DragEnter)
+     {
+         QDragEnterEvent *dragEvent=dynamic_cast< QDragEnterEvent* >(event);
+         if (dragEvent->mimeData()->hasFormat("text/plain"))
+         {
+             QString data = dragEvent->mimeData()->text();
+             dragEvent->acceptProposedAction();
+         }
+     }
+     else if (event->type() == QEvent::Drop )
+     {
+         QDropEvent* dropEvent = dynamic_cast< QDropEvent* >(event);
+         QString data = dropEvent->mimeData()->text();
+         ::fwServices::ObjectMsg::sptr message = ::fwServices::ObjectMsg::New();
+         message->addEvent("DROPPED_UUID", ::fwData::String::New(data.toStdString()));
+         ::fwServices::IService::sptr service = m_service.lock();
+         ::fwServices::IEditionService::notify( service, service->getObject< ::fwData::Object >(), message );
+     } else {
+         // standard event processing
+         return QObject::eventFilter(obj, event);
+     }
+     return true;
+ }
+
+//-----------------------------------------------------------------------------
+
+ fwRenderVTKRegisterMacro( ::visuVTKQt::VtkRenderWindowInteractorManager,
+                           ::fwRenderVTK::IVtkRenderWindowInteractorManager::REGISTRY_KEY );
+
+//-----------------------------------------------------------------------------
+
+namespace visuVTKQt
+{
+
+//-----------------------------------------------------------------------------
+
+VtkRenderWindowInteractorManager::VtkRenderWindowInteractorManager(
+        ::fwRenderVTK::IVtkRenderWindowInteractorManager::Key key )
+{}
+
+//-----------------------------------------------------------------------------
+
+VtkRenderWindowInteractorManager::~VtkRenderWindowInteractorManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderWindowInteractorManager::installInteractor( ::fwGui::container::fwContainer::sptr _parent )
+{
+    SLM_ASSERT("Invalid parent.", _parent ) ;
+    m_parentContainer =  ::fwGuiQt::container::QtContainer::dynamicCast( _parent );
+    QWidget* container = m_parentContainer->getQtContainer();
+    SLM_ASSERT("The container is not a qtContainer.", container ) ;
+
+    m_qVTKWidget = new QVTKWidget(container);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+    //m_qVTKWidget->resize(container->width(), container->height());
+    //m_qVTKWidget->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding);
+    if(m_renderService.lock())
+    {
+        m_qVTKWidget->setAcceptDrops(true);
+        m_qVTKWidget->installEventFilter(new DropFilter(m_renderService.lock()));
+    }
+
+    layout->addWidget(m_qVTKWidget);
+    container->setLayout(layout);
+
+    m_interactor = m_qVTKWidget->GetRenderWindow()->GetInteractor();
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderWindowInteractorManager::uninstallInteractor()
+{
+    m_interactor = 0;
+
+    m_qVTKWidget->hide();
+
+    m_parentContainer->clean();
+
+    SLM_ASSERT("QVTKWidget has not been deleted", !m_qVTKWidget);
+}
+
+//-----------------------------------------------------------------------------
+
+::vtkRenderWindowInteractor * VtkRenderWindowInteractorManager::getInteractor()
+{
+    return m_interactor;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace visuVTKQt
+
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/CMakeLists.txt b/Bundles/LeafVisu/visuVTKVRAdaptor/CMakeLists.txt
new file mode 100644
index 0000000..02a33a5
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/CMakeLists.txt
@@ -0,0 +1,21 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwData
+    fwRenderVTK
+    fwRuntime
+)
+
+
+find_package(Boost REQUIRED)
+find_package(VTK COMPONENTS  REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES}
+    vtkHybrid
+    vtkVolumeRendering
+    )
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/Properties.cmake b/Bundles/LeafVisu/visuVTKVRAdaptor/Properties.cmake
new file mode 100644
index 0000000..b67103b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME visuVTKVRAdaptor )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwData fwRenderVTK fwRuntime fwServices fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/bin/build.options b/Bundles/LeafVisu/visuVTKVRAdaptor/bin/build.options
new file mode 100644
index 0000000..d0ce79c
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/bin/build.options
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+
+TYPE = 'bundle'
+VERSION = '0-1'
+USE = ['vtkHybrid','vtkVolumeRendering', 'boost']
+LIB = [
+    'fwComEd_0-1',
+    'fwCore_0-1',
+    'fwData_0-1',
+    'fwMath_0-1',
+    'fwRenderVTK_0-1',
+    'fwRender_0-1',
+    'fwRuntime_0-3',
+    'fwServices_0-1',
+    'fwTools_0-1',
+    'fwVtkIO_0-1',
+    ]
+
+BUNDLES = ['visuVTKAdaptor']
+
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Plugin.hpp b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Plugin.hpp
new file mode 100644
index 0000000..507532a
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Plugin.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKVRADAPTOR_PLUGIN_HPP_
+#define _VISUVTKVRADAPTOR_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "visuVTKVRAdaptor/config.hpp"
+
+namespace visuVTKVRAdaptor
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ * 
+ * @date    2009.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ~Plugin() throw();
+    
+    // Overrides
+    void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides    
+    void stop() throw();
+    
+};
+
+} // namespace visuVTK
+
+#endif // _VISUVTKVRADAPTOR_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Volume.hpp b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Volume.hpp
new file mode 100644
index 0000000..54d3b71
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/Volume.hpp
@@ -0,0 +1,121 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _VISUVTKVRADAPTOR_VOLUME_HPP_
+#define _VISUVTKVRADAPTOR_VOLUME_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwRenderVTK/VtkRenderService.hpp>
+#include <fwRenderVTK/IVtkAdaptorService.hpp>
+
+#include <fwComEd/helper/MedicalImageAdaptor.hpp>
+
+#include "visuVTKVRAdaptor/config.hpp"
+
+class vtkLookupTable;
+class vtkImageMapToColors;
+class vtkImageData;
+class vtkAbstractVolumeMapper;
+class vtkVolumeProperty;
+class vtkVolume;
+class vtkCommand;
+
+class vtkBoxWidget2;
+
+namespace visuVTKVRAdaptor
+{
+
+class VISUVTKVRADAPTOR_CLASS_API Volume : public ::fwComEd::helper::MedicalImageAdaptor, public ::fwRenderVTK::IVtkAdaptorService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (Volume)(::fwRenderVTK::IVtkAdaptorService) ) ;
+
+    VISUVTKVRADAPTOR_API Volume() throw();
+
+    VISUVTKVRADAPTOR_API virtual ~Volume() throw();
+
+    VISUVTKVRADAPTOR_API void setClippingPlanesId( ::fwRenderVTK::VtkRenderService::VtkObjectIdType id );
+
+    VISUVTKVRADAPTOR_API void setVtkClippingPlanes( vtkPlaneCollection *planes );
+
+protected :
+
+    VISUVTKVRADAPTOR_API void doStart() throw(fwTools::Failed);
+
+    VISUVTKVRADAPTOR_API void doStop() throw(fwTools::Failed);
+
+    VISUVTKVRADAPTOR_API void doUpdate() throw(fwTools::Failed);
+
+    VISUVTKVRADAPTOR_API void doReceive( ::fwServices::ObjectMsg::csptr msg ) throw (fwTools::Failed);
+
+    /**
+     * @brief Configures the service
+     *
+     * Configuration example :
+     @verbatim
+     <adaptor id="VolumeScene3D" class="::visuVTKVRAdaptor::Volume" objectId="imageKey">
+         <config renderer="default" clippingplanes="clippingPlanesId" autoresetcamera="yes|no" croppingBox="yes|no"/>
+     </adaptor>
+     @endverbatim
+     * 
+     * \b renderer : ID of renderer the adaptor must use
+     * \b clippingplanes : id of VTK object for clipping planes
+     * \b autoresetcamera : (not mandatory, default is yes) set if the renderer must reset camera when updating image
+     * \b croppingBox : (not mandatory, default is no) set if the cropping box must be shown
+     *
+     * @throw fwTools::Failed
+     */
+    VISUVTKVRADAPTOR_API void configuring() throw(fwTools::Failed);
+
+    VISUVTKVRADAPTOR_API void doSwap() throw(fwTools::Failed);
+
+
+    void resetBoxWidget();
+
+    void activateBoxClipping( bool activate );
+
+    void buildPipeline();
+
+    void updateImage( ::fwData::Image::sptr image  );
+
+    void updateVolumeTransferFunction( ::fwData::Image::sptr image );
+
+    vtkPlaneCollection *m_clippingPlanes;
+
+    ::fwRenderVTK::VtkRenderService::VtkObjectIdType m_clippingPlanesId;
+
+    vtkAbstractVolumeMapper  * m_volumeMapper;
+    vtkVolumeProperty        * m_volumeProperty;
+    vtkVolume                * m_volume;
+
+    vtkPiecewiseFunction     * m_opacityTransferFunction;
+    vtkColorTransferFunction * m_colorTransferFunction;
+
+    vtkCommand               * m_abortCommand;
+
+    vtkBoxWidget2 * m_boxWidget;
+    vtkCommand    * m_croppingCommand;
+    bool m_bClippingBoxIsActivate;
+
+    /// Croping box default state
+    bool m_croppingBoxDefaultState;
+
+private:
+
+    bool   m_autoResetCamera;
+};
+
+
+
+
+} //namespace visuVTKVRAdaptor
+
+#endif // _VISUVTKVRADAPTOR_NEGATOONESLICE_HPP_
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/config.hpp b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/config.hpp
new file mode 100644
index 0000000..f584e9d
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/include/visuVTKVRAdaptor/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISUVTKVRADAPTOR_CONFIG_HPP_
+#define _VISUVTKVRADAPTOR_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VISUVTKVRADAPTOR_EXPORTS
+    #define VISUVTKVRADAPTOR_API __declspec(dllexport)
+    #else
+    #define VISUVTKVRADAPTOR_API __declspec(dllimport)
+    #endif
+
+    #define VISUVTKVRADAPTOR_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VISUVTKVRADAPTOR_EXPORTS
+    #define VISUVTKVRADAPTOR_API __attribute__ ((visibility("default")))
+    #define VISUVTKVRADAPTOR_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VISUVTKVRADAPTOR_API __attribute__ ((visibility("hidden")))
+    #define VISUVTKVRADAPTOR_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VISUVTKVRADAPTOR_API
+    #define VISUVTKVRADAPTOR_CLASS_API
+
+#endif
+
+#endif // _VISUVTKVRADAPTOR_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/rc/plugin.xml b/Bundles/LeafVisu/visuVTKVRAdaptor/rc/plugin.xml
new file mode 100644
index 0000000..7216e80
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/rc/plugin.xml
@@ -0,0 +1,19 @@
+<plugin id="visuVTKVRAdaptor" class="visuVTKAdaptor::Plugin">
+
+    <library name="visuVTKVRAdaptor" />
+
+    <requirement id="dataReg" />
+    <requirement id="servicesReg" />
+    <requirement id="visu" />
+    <requirement id="visuVTK" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRenderVTK::IVtkAdaptorService</type>
+        <service>::visuVTKVRAdaptor::Volume</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Plugin.cpp b/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Plugin.cpp
new file mode 100644
index 0000000..6600a8f
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Plugin.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "visuVTKVRAdaptor/Plugin.hpp"
+
+
+namespace visuVTKVRAdaptor
+{
+using namespace ::fwRuntime::utils;
+static GenericExecutableFactoryRegistrar<Plugin> registrar("visuVTKVRAdaptor::Plugin");
+
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace operators
diff --git a/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Volume.cpp b/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Volume.cpp
new file mode 100644
index 0000000..c28600b
--- /dev/null
+++ b/Bundles/LeafVisu/visuVTKVRAdaptor/src/visuVTKVRAdaptor/Volume.cpp
@@ -0,0 +1,473 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/TransferFunctionMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Color.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include <vtkCommand.h>
+#include <vtkPlaneCollection.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderer.h>
+#include <vtkImageImport.h>
+#include <vtkVolumeProperty.h>
+#include <vtkVolume.h>
+#include <vtkSmartVolumeMapper.h>
+#include <vtkBoxWidget2.h>
+#include <vtkBoxRepresentation.h>
+#include <vtkObjectFactory.h>
+#include <vtkPiecewiseFunction.h>
+#include <vtkColorTransferFunction.h>
+
+
+#include "visuVTKVRAdaptor/Volume.hpp"
+
+
+fwServicesRegisterMacro( ::fwRenderVTK::IVtkAdaptorService, ::visuVTKVRAdaptor::Volume, ::fwData::Image ) ;
+
+namespace visuVTKVRAdaptor
+{
+
+class vtkBoxRepresentationHack: public vtkBoxRepresentation
+{
+    // Hack to disable box rotation, since SetRotationEnable is ineffective...
+public:
+
+    static vtkBoxRepresentationHack *New();
+
+    vtkTypeRevisionMacro(vtkBoxRepresentationHack,vtkWidgetRepresentation);
+
+    int ComputeInteractionState(int X, int Y, int modify)
+    {
+        return vtkBoxRepresentation::ComputeInteractionState(X,Y,1);
+    }
+
+};
+
+vtkCxxRevisionMacro(vtkBoxRepresentationHack, "$Revision: 1.8 $");
+vtkStandardNewMacro(vtkBoxRepresentationHack);
+
+
+
+class AbortCallback : public vtkCommand
+{
+
+public :
+    //--------------------------------------------------------------------------
+    static AbortCallback *New()
+    { return new AbortCallback(); }
+
+    //--------------------------------------------------------------------------
+    AbortCallback( )
+    { }
+
+    //--------------------------------------------------------------------------
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+
+        vtkRenderWindow *win = vtkRenderWindow::SafeDownCast(caller);
+        if ( win )
+        {
+            if( win->GetEventPending() )
+            {
+                win->SetAbortRender(1);
+            }
+        }
+    }
+};
+
+//------------------------------------------------------------------------------
+
+class CroppingCallback : public vtkCommand
+{
+
+public :
+    //--------------------------------------------------------------------------
+    static CroppingCallback *New(vtkAbstractMapper *mapper)
+    {
+
+        CroppingCallback *callback = new CroppingCallback();
+        callback->mapper = vtkVolumeMapper::SafeDownCast(mapper);
+        return callback;
+    }
+
+    //--------------------------------------------------------------------------
+    CroppingCallback( ) : mapper(NULL)
+    { }
+
+    //--------------------------------------------------------------------------
+    virtual void Execute( vtkObject *caller, unsigned long eventId, void *)
+    {
+
+        vtkBoxWidget2 *widget = vtkBoxWidget2::SafeDownCast( caller );
+        mapper->SetCroppingRegionPlanes( widget->GetRepresentation()->GetBounds() );
+    }
+
+private:
+    vtkVolumeMapper *mapper;
+};
+
+
+//------------------------------------------------------------------------------
+
+Volume::Volume() throw() :
+    ::fwComEd::helper::MedicalImageAdaptor(),
+    ::fwRenderVTK::IVtkAdaptorService(),
+     m_bClippingBoxIsActivate(false),
+     m_autoResetCamera(true),
+     m_croppingBoxDefaultState(true)
+
+{
+    m_clippingPlanesId = "";
+    m_clippingPlanes   = 0;
+
+    m_volume = vtkVolume::New();
+    m_volumeProperty = vtkVolumeProperty::New();
+    m_volumeMapper = vtkSmartVolumeMapper::New();
+
+    m_abortCommand    = AbortCallback::New();
+
+    m_opacityTransferFunction = vtkPiecewiseFunction::New();
+    m_colorTransferFunction = vtkColorTransferFunction::New();
+
+    m_boxWidget = vtkBoxWidget2::New();
+    m_boxWidget->KeyPressActivationOff();
+    m_boxWidget->SetRotationEnabled(0);
+    vtkBoxRepresentationHack *repr = vtkBoxRepresentationHack::New();
+    m_boxWidget->SetRepresentation(repr);
+    repr->Delete();
+
+    m_croppingCommand = CroppingCallback::New(m_volumeMapper);
+    m_boxWidget->AddObserver(vtkCommand::InteractionEvent, m_croppingCommand);
+
+    // Manage events
+    this->installTFSelectionEventHandler(this);
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::BUFFER );
+    //this->addNewHandledEvent( ::fwComEd::ImageMsg::NEW_IMAGE );
+    //this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS );
+    //this->addNewHandledEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+    //this->addNewHandledEvent( "SHOWHIDE_BOX_WIDGET" );
+    //this->addNewHandledEvent( "RESET_BOX_WIDGET" );
+}
+
+//------------------------------------------------------------------------------
+
+Volume::~Volume() throw()
+{
+    m_volumeMapper->Delete();
+    m_volumeMapper = NULL;
+
+    m_volume->Delete();
+    m_volume = NULL;
+
+    m_abortCommand->Delete();
+    m_abortCommand = NULL;
+
+    if (m_clippingPlanes)
+    {
+        m_clippingPlanes->Delete();
+        m_clippingPlanes = NULL;
+    }
+
+    m_boxWidget->RemoveObserver(m_croppingCommand);
+    m_boxWidget->Delete();
+    m_boxWidget = NULL;
+    m_croppingCommand->Delete();
+    m_croppingCommand = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::setClippingPlanesId(::fwRenderVTK::VtkRenderService::VtkObjectIdType id)
+{
+    m_clippingPlanesId = id;
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::setVtkClippingPlanes(vtkPlaneCollection *planes)
+{
+    m_clippingPlanes = planes;
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::doStart() throw(fwTools::Failed)
+{
+    this->addToRenderer(m_volume);
+
+    this->getInteractor()->GetRenderWindow()->AddObserver("AbortCheckEvent", m_abortCommand);
+    this->doUpdate(); //TODO: remove me ?
+    this->installTFObserver( this->getSptr() );
+
+    if(!m_croppingBoxDefaultState)
+    {
+        m_bClippingBoxIsActivate = m_croppingBoxDefaultState;
+        this->activateBoxClipping( m_bClippingBoxIsActivate );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::doStop() throw(fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->removeAllPropFromRenderer();
+    this->getInteractor()->GetRenderWindow()->RemoveObserver(m_abortCommand);
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::doSwap() throw(fwTools::Failed)
+{
+    this->removeTFObserver();
+    this->doUpdate();
+    this->installTFObserver( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::doUpdate() throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        this->buildPipeline();
+        this->updateImage(image);
+        this->updateVolumeTransferFunction(image);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::doReceive(::fwServices::ObjectMsg::csptr msg) throw(::fwTools::Failed)
+{
+    ::fwData::Image::sptr image = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( image );
+
+    if (imageIsValid)
+    {
+        if ( msg->hasEvent( ::fwComEd::ImageMsg::BUFFER ) || ( msg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE )) )
+        {
+            this->doUpdate();
+        }
+
+        if (this->upadteTFObserver(msg, this->getSptr()) || msg->hasEvent( ::fwComEd::TransferFunctionMsg::MODIFIED_POINTS ) )
+        {
+            this->updateVolumeTransferFunction(image);
+        }
+
+        if ( msg->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING ) )
+        {
+            this->updateVolumeTransferFunction(image);
+        }
+
+        if ( msg->hasEvent( "SHOWHIDE_BOX_WIDGET" ) )
+        {
+            m_bClippingBoxIsActivate = ! m_bClippingBoxIsActivate;
+            this->activateBoxClipping( m_bClippingBoxIsActivate );
+        }
+
+        if ( msg->hasEvent( "RESET_BOX_WIDGET" ) )
+        {
+            this->resetBoxWidget();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    assert(m_configuration->getName() == "config");
+    this->setRenderId( m_configuration->getAttributeValue("renderer") );
+    this->setClippingPlanesId( m_configuration->getAttributeValue("clippingplanes") );
+
+    if (m_configuration->hasAttribute("autoresetcamera") )
+    {
+        std::string autoresetcamera = m_configuration->getAttributeValue("autoresetcamera");
+        m_autoResetCamera = (autoresetcamera == "yes");
+    }
+    this->parseTFConfig( m_configuration );
+
+    if(m_configuration->hasAttribute("croppingBox") &&
+       m_configuration->getAttributeValue("croppingBox") == "no")
+    {
+        m_croppingBoxDefaultState = false;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::updateImage( ::fwData::Image::sptr image  )
+{
+    this->updateImageInfos(image);
+
+    vtkImageImport *imageImport = vtkImageImport::New();
+    ::fwVtkIO::configureVTKImageImport( imageImport, image );
+
+    m_volumeMapper->RemoveAllClippingPlanes();
+    if (m_clippingPlanes)
+    {
+        m_volumeMapper->SetClippingPlanes(m_clippingPlanes);
+    }
+
+    //m_volumeMapper->SetInputConnection(shiftScale->GetOutputPort());
+    m_volumeMapper->SetInputConnection(imageImport->GetOutputPort());
+
+    m_boxWidget->GetRepresentation()->SetPlaceFactor(1.0);
+    m_boxWidget->GetRepresentation()->PlaceWidget(m_volumeMapper->GetBounds());
+    m_boxWidget->SetInteractor(this->getInteractor());
+    m_boxWidget->On();
+    vtkVolumeMapper::SafeDownCast(m_volumeMapper)->CroppingOn();
+    vtkVolumeMapper::SafeDownCast(m_volumeMapper)->SetCroppingRegionPlanes( m_volumeMapper->GetBounds() );
+    m_bClippingBoxIsActivate = m_croppingBoxDefaultState;
+
+    //shiftScale->Delete();
+    imageImport->Delete();
+
+    if (m_autoResetCamera)
+    {
+        this->getRenderer()->ResetCamera();
+    }
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::updateVolumeTransferFunction( ::fwData::Image::sptr image )
+{
+    this->updateTransferFunction(image, this->getSptr());
+    ::fwData::TransferFunction::sptr pTF = this->getTransferFunction();
+    SLM_ASSERT("TransferFunction null pointer", pTF);
+
+    m_colorTransferFunction->RemoveAllPoints();
+    m_opacityTransferFunction->RemoveAllPoints();
+
+    ::fwData::TransferFunction::TFValueVectorType values = pTF->getScaledValues();
+    ::fwData::TransferFunction::TFValueVectorType::iterator valueIter = values.begin();
+    if(pTF->getInterpolationMode() == ::fwData::TransferFunction::NEAREST)
+    {
+        m_colorTransferFunction->AllowDuplicateScalarsOn();
+        m_opacityTransferFunction->AllowDuplicateScalarsOn();
+
+        BOOST_FOREACH(const ::fwData::TransferFunction::TFDataType::value_type &tfPoint, pTF->getTFData())
+        {
+            const ::fwData::TransferFunction::TFValueType &value = *valueIter;
+            ::fwData::TransferFunction::TFValueType valuePrevious = *valueIter;
+            ::fwData::TransferFunction::TFValueType valueNext = *valueIter;
+            if(valueIter != values.begin())
+            {
+                valuePrevious = *(valueIter - 1);
+            }
+            if(valueIter != (values.end()-1))
+            {
+                valueNext = *(valueIter + 1);
+            }
+
+            const ::fwData::TransferFunction::TFColor &color = tfPoint.second;
+
+            m_colorTransferFunction->AddRGBPoint(valuePrevious + (value - valuePrevious) / 2. , color.r, color.g, color.b );
+            m_colorTransferFunction->AddRGBPoint(value + (valueNext - value) / 2., color.r, color.g, color.b );
+
+            m_opacityTransferFunction->AddPoint(valuePrevious + (value -valuePrevious) / 2. , color.a );
+            m_opacityTransferFunction->AddPoint(value + (valueNext - value) / 2., color.a );
+
+            ++valueIter;
+         }
+    }
+    else
+    {
+        BOOST_FOREACH(const ::fwData::TransferFunction::TFDataType::value_type &tfPoint, pTF->getTFData())
+        {
+            const ::fwData::TransferFunction::TFValueType &value = *(valueIter++);
+            const ::fwData::TransferFunction::TFColor &color = tfPoint.second;
+
+            m_colorTransferFunction->AddRGBPoint( value , color.r, color.g, color.b );
+            m_opacityTransferFunction->AddPoint(  value , color.a );
+        }
+    }
+
+    ::fwData::TransferFunction::TFValuePairType minMax = pTF->getMinMaxTFValues();
+
+    m_colorTransferFunction->SetClamping(!pTF->getIsClamped());
+    m_opacityTransferFunction->SetClamping(!pTF->getIsClamped());
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::buildPipeline( )
+{
+    if (!m_clippingPlanesId.empty())
+    {
+        vtkObject          *o      = this->getVtkObject(m_clippingPlanesId);
+        vtkPlaneCollection *planes = vtkPlaneCollection::SafeDownCast(o);
+        this->setVtkClippingPlanes( planes );
+    }
+
+    m_volumeProperty->SetScalarOpacity(m_opacityTransferFunction);
+    m_volumeProperty->SetColor(m_colorTransferFunction);
+
+    m_volumeProperty->ShadeOn();
+    m_volumeProperty->SetInterpolationTypeToLinear();
+
+    m_volumeProperty->SetAmbient( 0.2 );
+    m_volumeProperty->SetDiffuse( 1.0 );
+    m_volumeProperty->SetSpecular( 1.0 );
+    m_volumeProperty->SetSpecularPower( 10.0 );
+
+    m_volume->SetMapper(m_volumeMapper);
+    m_volume->SetProperty(m_volumeProperty);
+
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::resetBoxWidget()
+{
+    m_boxWidget->GetRepresentation()->SetPlaceFactor(1.0);
+    m_boxWidget->GetRepresentation()->PlaceWidget( m_volumeMapper->GetBounds() );
+    vtkVolumeMapper::SafeDownCast( m_volumeMapper )->SetCroppingRegionPlanes( m_volumeMapper->GetBounds() );
+    if (m_autoResetCamera)
+    {
+        this->getRenderer()->ResetCamera();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void Volume::activateBoxClipping( bool activate )
+{
+    if ( activate )
+    {
+        m_boxWidget->On();
+    }
+    else
+    {
+        m_boxWidget->Off();
+    }
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace visuVTKVRAdaptor
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/CMakeLists.txt b/Bundles/LeafVisu/vtkCompositeMesh/CMakeLists.txt
new file mode 100644
index 0000000..ac8a3ef
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/CMakeLists.txt
@@ -0,0 +1,20 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwData
+    fwRender
+    fwRenderVTK
+    fwRuntime
+    fwServices
+)
+
+find_package(Boost REQUIRED)
+find_package(VTK COMPONENTS  REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES}
+    vtkWidgets
+    )
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/COPYING b/Bundles/LeafVisu/vtkCompositeMesh/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/COPYING.LESSER b/Bundles/LeafVisu/vtkCompositeMesh/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/Properties.cmake b/Bundles/LeafVisu/vtkCompositeMesh/Properties.cmake
new file mode 100644
index 0000000..e4be3e3
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME vtkCompositeMesh )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwComEd fwData fwRender fwRenderVTK fwRuntime fwServices fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/bin/build.options b/Bundles/LeafVisu/vtkCompositeMesh/bin/build.options
new file mode 100644
index 0000000..1125706
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/bin/build.options
@@ -0,0 +1,16 @@
+TYPE     = 'bundle'
+USE      = ['vtkWidgets','boost']
+LIB      = [
+           'fwCore_0-1',
+           'fwRuntime_0-3',
+           'fwData_0-1',
+           'fwServices_0-1',
+           'fwComEd_0-1',
+           'fwVtkIO_0-1',
+           'fwTools_0-1',
+           'fwDataIO_0-2',
+           'fwRender_0-1',
+           'fwRenderVTK_0-1',
+           ]
+BUNDLES  = ['gui_0-1']
+VERSION  = '0-1'
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Namespace.hpp b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Namespace.hpp
new file mode 100644
index 0000000..9ed3ab8
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKCOMPOSITEMESHNAMESPACE_HPP_
+#define VTKCOMPOSITEMESHNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace vtkCompositeMesh contains a service which renders several meshes and store it on Composite.
+ * @namespace   vtkCompositeMesh
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace vtkCompositeMesh
+{
+}
+#endif /* VTKCOMPOSITEMESHNAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Plugin.hpp b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Plugin.hpp
new file mode 100644
index 0000000..b4edd97
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/Plugin.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKCOMPOSITEMESH_PLUGIN_HPP_
+#define _VTKCOMPOSITEMESH_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+/**
+ * @brief   Namespace vtkCompositeMesh.
+ * @namespace   vtkCompositeMesh
+ * 
+ * @date    2009.
+ *
+ *  The namespace vtkCompositeMesh contains a COMPOSITE mesh renderer using vtk.
+ */
+namespace vtkCompositeMesh
+{
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+    
+    /**
+    * @brief Start method.
+    *
+    * @exception ::fwRuntime::RuntimeException.
+    * This method is used by runtime to initialize the bundle.
+    */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief Stop method.
+    *
+    * This method is used by runtime to stop the bundle.
+    */
+    void stop() throw();
+    
+};
+
+} // namespace vtkCompositeMesh
+
+#endif //_VTKCOMPOSITEMESH_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/RendererService.hpp b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/RendererService.hpp
new file mode 100644
index 0000000..4259309
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/RendererService.hpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKCOMPOSITEMESH_RENDERER_SERVICE_HPP_
+#define VTKCOMPOSITEMESH_RENDERER_SERVICE_HPP_
+
+#include <boost/shared_array.hpp>
+
+#include <fwRenderVTK/IVtkRenderWindowInteractorManager.hpp>
+
+#include <vtkCommand.h>
+
+#include <fwRender/IRender.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Image.hpp>
+
+#include "vtkCompositeMesh/config.hpp"
+
+
+// VTK
+class vtkRenderer;
+class vtkPolyDataNormals;
+
+namespace vtkCompositeMesh
+{
+
+/**
+ * @brief   Renderer service.
+ * @class   RendererService
+ * 
+ * @date    2009.
+ *
+ * Service rendering ::fwData::Mesh contained in a ::fwData::Composite using VTK.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::fwRender::IRender , ::vtkCompositeMesh::RendererService , ::fwData::Composite)
+ */
+class VTKCOMPOSITEMESH_CLASS_API RendererService : public ::fwRender::IRender
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (RendererService)(::fwRender::IRender) ) ;
+
+    typedef ::boost::shared_array< double > SharedArray;
+
+    VTKCOMPOSITEMESH_API static const ::fwCom::Slots::SlotKeyType s_UPDATE_CAM_POSITION_SLOT;
+    typedef ::fwCom::Slot<void(SharedArray, SharedArray, SharedArray)> UpdateCamPositionSlotType;
+
+    VTKCOMPOSITEMESH_API static const ::fwCom::Signals::SignalKeyType s_CAM_UPDATED_SIG;
+    typedef ::fwCom::Signal< void (SharedArray, SharedArray, SharedArray) > CamUpdatedSignalType;
+
+
+    /**
+    * @brief    Constructor
+    */
+    VTKCOMPOSITEMESH_API RendererService() throw() ;
+
+    /**
+    * @brief    Destructor
+    */
+    VTKCOMPOSITEMESH_API virtual ~RendererService() throw() ;
+
+    /// This method is used to notify that the VTK camera position is updated.
+    void notifyCamPositionUpdated();
+
+    /// Slot to receive new camera information (position, focal, viewUp). Update camera with new information.
+    VTKCOMPOSITEMESH_API virtual void updateCamPosition(SharedArray positionValue,
+                                                        SharedArray focalValue,
+                                                        SharedArray viewUpValue);
+
+protected :
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    * Initialize VTK renderer and create qt containers
+    */
+    VTKCOMPOSITEMESH_API virtual void starting() throw(fwTools::Failed);
+
+
+    /**
+    * @brief Configuring method.
+    *
+    * XML configuration sample:
+    * @verbatim
+    <service impl="::vtkCompositeMesh::RendererService" type="::fwRender::IRender" autoConnect="yes" />
+    @endverbatim
+    * This method is used to configure the service. Initialize qt container.
+    */
+    VTKCOMPOSITEMESH_API virtual void configuring() throw(::fwTools::Failed);
+
+
+    /**
+    * @brief Stopping method.
+    *
+    * Destroy VTK renderer and containers
+    */
+    VTKCOMPOSITEMESH_API virtual void stopping() throw(fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * Make a render if necessary
+    */
+    VTKCOMPOSITEMESH_API virtual void updating() throw(fwTools::Failed);
+
+    /**
+    * @brief Receiving method (react on data modifications).
+    * @param[in] _msg ::fwServices::ObjectMsg::csptr.
+    *
+    * This method is used to update the vtk pipeline when the mesh is modified.
+    */
+    VTKCOMPOSITEMESH_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /// @brief vtk renderer
+    vtkRenderer * m_render ;
+
+private :
+
+    /// @brief VTK Interactor window manager
+    ::fwRenderVTK::IVtkRenderWindowInteractorManager::sptr m_interactorManager;
+
+    /// This method is used to create an actor and put it through the VTK pipeline.
+    void createAndAddActorToRender();
+
+    /// This method is used to initialize the VTK pipeline.
+    void initVTKPipeline();
+
+    /// This method is used to update the VTK pipeline.
+    void updateVTKPipeline();
+
+
+
+    /// Contains the mesh, and allows to compute normals.
+    vtkPolyDataNormals* m_normals;
+
+    /**
+    * @brief the m_bPipelineIsInit value is \b true
+    * if the pipeline is initialized.
+    */
+    bool m_bPipelineIsInit;
+
+    vtkCommand* m_loc;
+
+    /// Slot to call updateCamPosition method.
+    UpdateCamPositionSlotType::sptr m_slotUpdateCamPosition;
+
+    /// Signal emitted when camera position is updated.
+    CamUpdatedSignalType::sptr m_sigCamUpdated;
+
+
+};
+
+}
+
+#endif /* VTKCOMPOSITEMESH_RENDERER_SERVICE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/config.hpp b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/config.hpp
new file mode 100644
index 0000000..8a5eb02
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/include/vtkCompositeMesh/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKCOMPOSITEMESH_CONFIG_HPP_
+#define VTKCOMPOSITEMESH_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VTKCOMPOSITEMESH_EXPORTS
+    #define VTKCOMPOSITEMESH_API __declspec(dllexport)
+    #else
+    #define VTKCOMPOSITEMESH_API __declspec(dllimport)
+    #endif
+
+    #define VTKCOMPOSITEMESH_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VTKCOMPOSITEMESH_EXPORTS
+    #define VTKCOMPOSITEMESH_API __attribute__ ((visibility("default")))
+    #define VTKCOMPOSITEMESH_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VTKCOMPOSITEMESH_API __attribute__ ((visibility("hidden")))
+    #define VTKCOMPOSITEMESH_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VTKCOMPOSITEMESH_API
+    #define VTKCOMPOSITEMESH_CLASS_API
+
+#endif
+
+#endif //VTKCOMPOSITEMESH_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/rc/plugin.xml b/Bundles/LeafVisu/vtkCompositeMesh/rc/plugin.xml
new file mode 100644
index 0000000..11312af
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/rc/plugin.xml
@@ -0,0 +1,12 @@
+<plugin id="vtkCompositeMesh" class="::vtkCompositeMesh::Plugin" >
+
+
+    <library name="vtkCompositeMesh" />
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRender::IRender</type>
+        <service>::vtkCompositeMesh::RendererService</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/Plugin.cpp b/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/Plugin.cpp
new file mode 100644
index 0000000..9b6fa11
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "vtkCompositeMesh/Plugin.hpp"
+
+namespace vtkCompositeMesh
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::vtkCompositeMesh::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace vtkCompositeMesh
diff --git a/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/RendererService.cpp b/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/RendererService.cpp
new file mode 100644
index 0000000..70ca1a6
--- /dev/null
+++ b/Bundles/LeafVisu/vtkCompositeMesh/src/vtkCompositeMesh/RendererService.cpp
@@ -0,0 +1,312 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkCommand.h>
+#include <vtkCamera.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkCamera.h>
+#include <vtkMatrix4x4.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkTransform.h>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+#include <fwCom/Signals.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/CameraMsg.hpp>
+#include <fwComEd/MeshMsg.hpp>
+
+
+#include <fwVtkIO/helper/Mesh.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include "vtkCompositeMesh/RendererService.hpp"
+
+
+fwServicesRegisterMacro( ::fwRender::IRender , ::vtkCompositeMesh::RendererService , ::fwData::Composite );
+
+
+
+namespace vtkCompositeMesh
+{
+
+const ::fwCom::Slots::SlotKeyType RendererService::s_UPDATE_CAM_POSITION_SLOT = "updateCamPosition";
+const ::fwCom::Signals::SignalKeyType RendererService::s_CAM_UPDATED_SIG = "camUpdated";
+
+class vtkLocalCommand : public vtkCommand
+{
+public:
+
+    vtkLocalCommand(::vtkCompositeMesh::RendererService* _service)
+    {
+        m_service = _service;
+        this->m_isMousePressed = false;
+    }
+    void Execute(vtkObject* _caller, unsigned long _event, void* _obj)
+    {
+        if (_event == vtkCommand::StartInteractionEvent )
+        {
+            this->m_isMousePressed = true;
+        }
+        else if (_event == vtkCommand::EndInteractionEvent )
+        {
+            this->m_isMousePressed = false;
+        }
+        else if ( (_event == vtkCommand::ModifiedEvent && this->m_isMousePressed)
+                || _event == vtkCommand::MouseWheelBackwardEvent || _event == vtkCommand::MouseWheelForwardEvent)
+        {
+            m_service->notifyCamPositionUpdated();
+            ::fwThread::Worker::sptr worker = m_service->getWorker();
+            worker->processTasks();
+        }
+    }
+private:
+    ::vtkCompositeMesh::RendererService* m_service;
+    bool m_isMousePressed;
+};
+
+RendererService::RendererService() throw()
+                                    : m_render( 0 ), m_bPipelineIsInit(false)
+{
+//    this->IService::addNewHandledEvent( ::fwComEd::MeshMsg::NEW_MESH );
+//    this->IService::addNewHandledEvent( ::fwComEd::CameraMsg::CAMERA_MOVING );
+
+    m_slotUpdateCamPosition = ::fwCom::newSlot( &RendererService::updateCamPosition, this ) ;
+    ::fwCom::HasSlots::m_slots( s_UPDATE_CAM_POSITION_SLOT, m_slotUpdateCamPosition );
+
+    m_sigCamUpdated = CamUpdatedSignalType::New();
+#ifdef COM_LOG
+    m_sigCamUpdated->setID( s_CAM_UPDATED_SIG );
+#endif
+    // Register
+    ::fwCom::HasSignals::m_signals( s_CAM_UPDATED_SIG,  m_sigCamUpdated);
+
+    this->setWorker( ::fwServices::registry::ActiveWorkers::getDefault()->
+                                 getWorker( ::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER ) );
+
+}
+
+//-----------------------------------------------------------------------------
+
+RendererService::~RendererService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::starting() throw(fwTools::Failed)
+{
+    this->IGuiContainerSrv::create();
+
+    m_bPipelineIsInit = false;
+
+    m_interactorManager = ::fwRenderVTK::IVtkRenderWindowInteractorManager::createManager();
+    m_interactorManager->installInteractor( this->getContainer() );
+
+    // Renderer
+    m_render = vtkRenderer::New();
+    m_interactorManager->getInteractor()->GetRenderWindow()->AddRenderer(m_render);
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::configuring() throw(::fwTools::Failed)
+{
+    this->IGuiContainerSrv::initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::stopping() throw(fwTools::Failed)
+{
+    if( m_render == 0 ) return;
+
+    assert( m_interactorManager->getInteractor() );
+    m_interactorManager->getInteractor()->RemoveObserver(m_loc);
+
+    m_interactorManager->uninstallInteractor();
+    m_interactorManager.reset();
+
+    SLM_ASSERT("m_render not instanced", m_render);
+    m_render->Delete();
+    m_render = 0;
+
+    this->IGuiContainerSrv::destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updating() throw(fwTools::Failed)
+{
+    m_interactorManager->getInteractor()->Render();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(fwTools::Failed)
+{
+    ::fwComEd::MeshMsg::csptr meshMsg = ::fwComEd::MeshMsg::dynamicConstCast(_msg);
+    if ( meshMsg && meshMsg->hasEvent( ::fwComEd::MeshMsg::NEW_MESH ) )
+    {
+        if(!m_bPipelineIsInit)
+        {
+            initVTKPipeline();
+            m_bPipelineIsInit = true;
+        }
+        else
+        {
+            updateVTKPipeline();
+        }
+        m_interactorManager->getInteractor()->Render();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updateCamPosition(SharedArray positionValue,
+                                        SharedArray focalValue,
+                                        SharedArray viewUpValue)
+{
+    vtkCamera* camera = m_render->GetActiveCamera();
+
+    camera->SetPosition(positionValue.get());
+    camera->SetFocalPoint(focalValue.get());
+    camera->SetViewUp(viewUpValue.get());
+    camera->SetClippingRange(0.1, 1000000);
+
+    m_interactorManager->getInteractor()->Render();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::initVTKPipeline()
+{
+    //Create the view:
+    createAndAddActorToRender();
+}
+
+//-----------------------------------------------------------------------------
+void RendererService::createAndAddActorToRender()
+{
+    //Check there is indeed a Composite object in this:
+    assert(this->getObject< ::fwData::Composite >());
+
+    //Create a pointer on this object:
+    ::fwData::Composite::sptr myComposite = this->getObject< ::fwData::Composite >();
+
+    OSLM_INFO( "VTK Pipeline ready TO UPDATE" << '\n' << "Object received:" << myComposite->getLeafClassname());
+
+    // elementnumber increases for each mesh found:
+    unsigned int elementNumber=0;
+
+    //Loop through the composite objects, if it's a mesh, then render it:
+    for(::fwData::Composite::ContainerType::const_iterator it = myComposite->begin(); it != myComposite->end(); ++it)
+    {
+        OSLM_INFO("ObjectName: " << it->first);
+        OSLM_INFO("ObjectPointer: " << it->second);
+        OSLM_INFO("ObjectType: " << it->second->getClassname () << '\n');
+
+        ::fwData::Mesh::sptr myMesh =::fwData::Mesh::dynamicCast (it->second);
+
+        // If it's a mesh, then put it in the pipeline:
+        if( myMesh )
+        {
+            vtkSmartPointer<vtkPolyData> vtk_polyData = vtkSmartPointer<vtkPolyData>::New();
+            ::fwVtkIO::helper::Mesh::toVTKMesh( myMesh, vtk_polyData);
+            OSLM_INFO("Loaded: " << it->first);
+            vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
+
+            m_normals = vtkPolyDataNormals::New();
+            m_normals->SetInput(vtk_polyData);
+            mapper->SetInputConnection(m_normals->GetOutputPort());
+
+            vtkActor* actor =  vtkActor::New();
+            actor->SetMapper( mapper);
+
+            // Add the actors
+            m_render->AddActor( actor);
+
+
+            OSLM_INFO("Mesh found: " << it->first);
+            if (!myMesh->getField( "MaterialMesh" ))
+            {
+                // No Material data then default
+                if(elementNumber == 0)
+                {
+                    actor->GetProperty()->EdgeVisibilityOn();
+                    actor->GetProperty()->SetInterpolationToFlat();
+                    actor->GetProperty()->SetColor (1.0, 0.0, 0.0);
+                    actor->GetProperty()->SetEdgeColor (1.0, 0.0, 0.0);
+                }
+                else
+                {
+                    actor->GetProperty()->SetRepresentationToWireframe ();
+                    actor->GetProperty()->SetColor (1.0, 1.0, 1.0);
+                }
+            }
+            else
+            {
+                // Material exists
+                ::fwData::Material::sptr matObjPtr = myMesh->getField< ::fwData::Material >( "MaterialMesh" );
+                actor->GetProperty()->SetColor (matObjPtr->ambient()->red(), matObjPtr->ambient()->green(), matObjPtr->ambient()->blue());
+            }
+            mapper->Delete();
+            elementNumber++;
+            OSLM_INFO("displayed: " << it->first);
+        }
+    }
+    m_interactorManager->getInteractor()->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New());
+    m_loc = new vtkLocalCommand(this);
+    m_interactorManager->getInteractor()->AddObserver(vtkCommand::AnyEvent, m_loc);
+
+    // Repaint and resize window
+    m_render->ResetCamera();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updateVTKPipeline()
+{
+    //Clear the view:
+    m_render->RemoveAllViewProps();
+    //Recreate the view:
+    createAndAddActorToRender();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::notifyCamPositionUpdated()
+{
+    vtkCamera* camera = m_render->GetActiveCamera();
+
+    SharedArray position = SharedArray(new double[3]);
+    SharedArray focal = SharedArray(new double[3]);
+    SharedArray viewUp = SharedArray(new double[3]);
+
+    std::copy(camera->GetPosition(), camera->GetPosition()+3, position.get());
+    std::copy(camera->GetFocalPoint(), camera->GetFocalPoint()+3, focal.get());
+    std::copy(camera->GetViewUp(), camera->GetViewUp()+3, viewUp.get());
+
+    fwServicesBlockAndNotifyMacro( this->getLightID(), m_sigCamUpdated,
+                                   (position, focal, viewUp),
+                                   m_slotUpdateCamPosition );
+}
+
+}
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/CMakeLists.txt b/Bundles/LeafVisu/vtkSimpleMesh/CMakeLists.txt
new file mode 100644
index 0000000..ce362c1
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/CMakeLists.txt
@@ -0,0 +1,20 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRender
+    fwRenderVTK
+    fwRuntime
+    fwServices
+    fwThread
+)
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS} 
+    )
+fwLink(
+    vtkWidgets
+    )
+
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/COPYING b/Bundles/LeafVisu/vtkSimpleMesh/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/COPYING.LESSER b/Bundles/LeafVisu/vtkSimpleMesh/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/Properties.cmake b/Bundles/LeafVisu/vtkSimpleMesh/Properties.cmake
new file mode 100644
index 0000000..e2c1712
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME vtkSimpleMesh )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwComEd fwCore fwData fwDataTools fwRender fwRenderVTK fwRuntime fwServices fwThread fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/bin/build.options b/Bundles/LeafVisu/vtkSimpleMesh/bin/build.options
new file mode 100644
index 0000000..150f96d
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/bin/build.options
@@ -0,0 +1,16 @@
+TYPE    = 'bundle'
+USE     = ['vtkWidgets','boost']
+LIB     = [
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwVtkIO_0-1',
+          'fwTools_0-1',
+          'fwDataIO_0-2',
+          'fwDataTools_0-1',
+          'fwRender_0-1',
+          'fwRenderVTK_0-1',
+          ]
+VERSION = '0-1'
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Namespace.hpp b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Namespace.hpp
new file mode 100644
index 0000000..08c7ef0
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLEMESHNAMESPACE_HPP_
+#define VTKSIMPLEMESHNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace vtkSimpleMesh contains a service which renders one mesh (::fwData::TriangularMesh).
+ * @namespace   vtkSimpleMesh
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace vtkSimpleMesh
+{
+}
+#endif /* VTKSIMPLEMESHNAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Plugin.hpp b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Plugin.hpp
new file mode 100644
index 0000000..9db765e
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/Plugin.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKSIMPLEMESH_PLUGIN_HPP_
+#define _VTKSIMPLEMESH_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+/**
+ * @brief   Namespace vtkSimpleMesh.
+ * @namespace   vtkSimpleMesh
+ * 
+ * @date    2009.
+ *
+ *  The namespace vtkSimpleMesh contains a simple mesh renderer using vtk.
+ */
+namespace vtkSimpleMesh
+{
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+    
+    /**
+    * @brief Start method.
+    *
+    * @exception ::fwRuntime::RuntimeException.
+    * This method is used by runtime to initialize the bundle.
+    */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief Stop method.
+    *
+    * This method is used by runtime to stop the bundle.
+    */
+    void stop() throw();
+    
+};
+
+} // namespace vtkSimpleMesh
+
+#endif //_VTKSIMPLEMESH_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/RendererService.hpp b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/RendererService.hpp
new file mode 100644
index 0000000..33b2c92
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/RendererService.hpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLEMESH_RENDERER_SERVICE_HPP_
+#define VTKSIMPLEMESH_RENDERER_SERVICE_HPP_
+
+#include <boost/shared_array.hpp>
+
+#include <fwRenderVTK/IVtkRenderWindowInteractorManager.hpp>
+
+#include <vtkCommand.h>
+
+#include <fwRender/IRender.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "vtkSimpleMesh/config.hpp"
+
+// VTK
+class vtkRenderer;
+class vtkPolyDataNormals;
+
+namespace vtkSimpleMesh
+{
+
+/**
+ * @brief   Renderer service.
+ * @class   RendererService
+ * 
+ * @date    2009.
+ *
+ * Service rendering a ::fwData::Mesh using VTK.
+ *
+ * Service registered details : \n
+ * fwServicesRegisterMacro( ::fwRender::IRender , ::vtkSimpleMesh::RendererService , ::fwData::Mesh)
+ */
+class VTKSIMPLEMESH_CLASS_API RendererService : public fwRender::IRender
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (RendererService)(::fwRender::IRender) ) ;
+
+    typedef ::boost::shared_array< double > SharedArray;
+
+    VTKSIMPLEMESH_API static const ::fwCom::Slots::SlotKeyType s_UPDATE_CAM_POSITION_SLOT;
+    typedef ::fwCom::Slot<void(SharedArray, SharedArray, SharedArray)> UpdateCamPositionSlotType;
+
+    VTKSIMPLEMESH_API static const ::fwCom::Signals::SignalKeyType s_CAM_UPDATED_SIG;
+    typedef ::fwCom::Signal< void (SharedArray, SharedArray, SharedArray) > CamUpdatedSignalType;
+
+    /**
+    * @brief    Constructor
+    */
+    VTKSIMPLEMESH_API RendererService() throw() ;
+
+    /**
+    * @brief    Destructor
+    */
+    VTKSIMPLEMESH_API virtual ~RendererService() throw() ;
+
+
+    /// Slot to receive new camera information (position, focal, viewUp). Update camera with new information.
+    void updateCamPosition(SharedArray positionValue,
+                           SharedArray focalValue,
+                           SharedArray viewUpValue);
+
+    /// This method is used to notify that the VTK camera position is updated.
+    void notifyCamPositionUpdated();
+
+
+protected :
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    * Initialize VTK renderer and qt containers
+    */
+    VTKSIMPLEMESH_API virtual void starting() throw(fwTools::Failed);
+
+
+    /**
+    * @brief Configuring method.
+    *
+    * XML configuration sample:
+    * @verbatim
+    <service impl="::vtkSimpleMesh::RendererService" type="::fwRender::IRender" autoConnect="yes" />
+    @endverbatim
+    * This method is used to configure the service. Initialize qt container.
+    */
+    VTKSIMPLEMESH_API virtual void configuring() throw(::fwTools::Failed);
+
+
+    /**
+    * @brief Stopping method.
+    *
+    * Destroy VTK renderer and qt containers
+    */
+    VTKSIMPLEMESH_API virtual void stopping() throw(fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * Make a render if necessary
+    */
+    VTKSIMPLEMESH_API virtual void updating() throw(fwTools::Failed);
+
+    /**
+    * @brief Updating method (react on data modifications).
+    * @param[in] _msg ::fwServices::ObjectMsg::csptr.
+    *
+    * This method is used to update the vtk pipeline when the mesh is modified.
+    */
+    VTKSIMPLEMESH_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /// @brief vtk renderer
+    vtkRenderer * m_render ;
+
+private :
+
+    /// @brief VTK Interactor window manager
+    ::fwRenderVTK::IVtkRenderWindowInteractorManager::sptr m_interactorManager;
+
+    /// This method is used to initialize the VTK pipeline.
+    void initVTKPipeline();
+
+    /**
+    * @brief This method is used to update the VTK pipeline.
+    * @param resetCamera if true : reset the camera position
+    */
+    void updateVTKPipeline(bool resetCamera = true);
+
+    /**
+    * @brief the m_bPipelineIsInit value is \b true
+    * if the pipeline is initialized.
+    */
+    bool m_bPipelineIsInit;
+
+    vtkCommand* m_loc;
+
+    /// Slot to call updateCamPosition method
+    UpdateCamPositionSlotType::sptr m_slotUpdateCamPosition;
+
+    /// Signal emitted when camera position is updated.
+    CamUpdatedSignalType::sptr m_sigCamUpdated;
+
+    /// To store the polyData
+    vtkSmartPointer<vtkPolyData> m_vtkPolyData;
+
+    /// Vtk mapper
+    vtkSmartPointer<vtkPolyDataMapper> m_mapper;
+
+    /// Hight resolution timer to log information about computing function time
+    ::fwCore::HiResTimer m_hiResTimer;
+};
+
+}
+
+#endif /* VTKSIMPLEMESH_RENDERER_SERVICE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/SSimpleMeshDeformation.hpp b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/SSimpleMeshDeformation.hpp
new file mode 100644
index 0000000..2972f24
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/SSimpleMeshDeformation.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKSIMPLEMESH_SSIMPLEMESHDEFORMATION_HPP__
+#define __VTKSIMPLEMESH_SSIMPLEMESHDEFORMATION_HPP__
+
+#include <fwThread/Timer.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IController.hpp>
+
+#include "vtkSimpleMesh/config.hpp"
+
+
+namespace vtkSimpleMesh
+{
+
+/**
+ * @brief   Service used to deform mesh
+ * @class   SSimpleMeshDeformation
+ * 
+ * @date    2012.
+ */
+class VTKSIMPLEMESH_CLASS_API SSimpleMeshDeformation : public ::fwServices::IController
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SSimpleMeshDeformation)(::fwServices::IController) ) ;
+
+    VTKSIMPLEMESH_API static const ::fwCom::Slots::SlotKeyType s_START_DEFORMATION_SLOT;
+    typedef ::fwCom::Slot<void()> StartDeformationSlotType;
+
+    VTKSIMPLEMESH_API static const ::fwCom::Slots::SlotKeyType s_STOP_DEFORMATION_SLOT;
+    typedef ::fwCom::Slot<void()> StopDeformationSlotType;
+
+    /// Constructor
+    VTKSIMPLEMESH_API SSimpleMeshDeformation() throw() ;
+
+    /// Destructor
+    VTKSIMPLEMESH_API virtual ~SSimpleMeshDeformation() throw() ;
+
+protected :
+
+    /// Starting method. Initialize timer.
+    VTKSIMPLEMESH_API virtual void starting() throw(fwTools::Failed);
+
+
+    /// Configuring method.
+    VTKSIMPLEMESH_API virtual void configuring() throw(::fwTools::Failed);
+
+
+    /// Stopping method.
+    VTKSIMPLEMESH_API virtual void stopping() throw(fwTools::Failed);
+
+    /// Updating method. Deforms the mesh
+    VTKSIMPLEMESH_API virtual void updating() throw(fwTools::Failed);
+
+    /// Receiving.
+    VTKSIMPLEMESH_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /// Starts mesh deformation
+    VTKSIMPLEMESH_API void startDeformation();
+
+    /// Stops mesh deformation
+    VTKSIMPLEMESH_API void stopDeformation();
+
+private:
+
+    /// Slot to call startDeformation method
+    StartDeformationSlotType::sptr m_slotStartDeformation;
+
+    /// Slot to call stopDeformation method
+    StopDeformationSlotType::sptr m_slotStopDeformation;
+
+    /// Helper to copy quicly meshes ( only points, normals and point colors )
+    void copyMesh( const ::fwData::Mesh::sptr & src, const ::fwData::Mesh::sptr & dest ) const;
+
+    /// Copy associated mesh to m_mesh and initialize m_transformMesh
+    void initMeshBackup();
+
+    /// Helper to compute mesh deformation
+    void computeDeformation( const ::fwData::Mesh::sptr & refMesh, const ::fwData::Mesh::sptr & transformMesh );
+
+    /// Helper to compute mesh deformation
+    void computeDeformation(
+            const ::fwData::Mesh::sptr & refMesh,
+            const ::fwData::Mesh::sptr & transformMesh,
+            float deformationPercent );
+
+    ::fwThread::Timer::sptr m_timer;
+
+    /// Hight resolution timer to log information about computing function time
+    ::fwCore::HiResTimer m_hiRestimer;
+
+    /// Transformed version of original mesh
+    ::fwData::Mesh::sptr m_transformMesh;
+
+    /// Store original mesh
+    ::fwData::Mesh::sptr m_mesh;
+
+    /// Current increment for deformation
+    float m_currentIncrement;
+
+    /// Current deformation in percent
+    float m_currentDeformation;
+};
+
+}
+
+#endif /* __VTKSIMPLEMESH_SSIMPLEMESHDEFORMATION_HPP__ */
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/config.hpp b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/config.hpp
new file mode 100644
index 0000000..5f1a03c
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/include/vtkSimpleMesh/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLEMESH_CONFIG_HPP_
+#define VTKSIMPLEMESH_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VTKSIMPLEMESH_EXPORTS
+    #define VTKSIMPLEMESH_API __declspec(dllexport)
+    #else
+    #define VTKSIMPLEMESH_API __declspec(dllimport)
+    #endif
+
+    #define VTKSIMPLEMESH_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VTKSIMPLEMESH_EXPORTS
+    #define VTKSIMPLEMESH_API __attribute__ ((visibility("default")))
+    #define VTKSIMPLEMESH_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VTKSIMPLEMESH_API __attribute__ ((visibility("hidden")))
+    #define VTKSIMPLEMESH_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VTKSIMPLEMESH_API
+    #define VTKSIMPLEMESH_CLASS_API
+
+#endif
+
+#endif //VTKSIMPLEMESH_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/rc/plugin.xml b/Bundles/LeafVisu/vtkSimpleMesh/rc/plugin.xml
new file mode 100644
index 0000000..b31abef
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/rc/plugin.xml
@@ -0,0 +1,21 @@
+<plugin id="vtkSimpleMesh" class="::vtkSimpleMesh::Plugin">
+    <library name="vtkSimpleMesh" />
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRender::IRender</type>
+        <service>::vtkSimpleMesh::RendererService</service>
+        <object>::fwData::Mesh</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::vtkSimpleMesh::SSimpleMeshDeformation</service>
+        <object>::fwData::Mesh</object>
+    </extension>
+
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/Plugin.cpp b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/Plugin.cpp
new file mode 100644
index 0000000..05b3f54
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "vtkSimpleMesh/Plugin.hpp"
+
+namespace vtkSimpleMesh
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::vtkSimpleMesh::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace vtkSimpleMesh
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/RendererService.cpp b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/RendererService.cpp
new file mode 100644
index 0000000..0088bfb
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/RendererService.cpp
@@ -0,0 +1,298 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkCommand.h>
+#include <vtkCamera.h>
+#include <vtkPolyData.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkCamera.h>
+#include <vtkMatrix4x4.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkTransform.h>
+
+#include <fwCore/HiResTimer.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+
+#include <fwComEd/CameraMsg.hpp>
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+#include <fwCom/Signals.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwVtkIO/helper/Mesh.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include "vtkSimpleMesh/RendererService.hpp"
+
+fwServicesRegisterMacro( ::fwRender::IRender , ::vtkSimpleMesh::RendererService , ::fwData::Mesh );
+
+
+namespace vtkSimpleMesh
+{
+
+const ::fwCom::Slots::SlotKeyType RendererService::s_UPDATE_CAM_POSITION_SLOT = "updateCamPosition";
+const ::fwCom::Signals::SignalKeyType RendererService::s_CAM_UPDATED_SIG = "camUpdated";
+
+class vtkLocalCommand : public vtkCommand
+{
+public:
+
+    vtkLocalCommand(::vtkSimpleMesh::RendererService* _service)
+    {
+        m_service = _service;
+        this->m_isMousePressed = false;
+    }
+    void Execute(vtkObject* _caller, unsigned long _event, void* _obj)
+    {
+        if (_event == vtkCommand::StartInteractionEvent )
+        {
+            this->m_isMousePressed = true;
+        }
+        else if (_event == vtkCommand::EndInteractionEvent )
+        {
+            this->m_isMousePressed = false;
+        }
+        else if ( (_event == vtkCommand::ModifiedEvent && this->m_isMousePressed)
+                || _event == vtkCommand::MouseWheelBackwardEvent || _event == vtkCommand::MouseWheelForwardEvent)
+        {
+            m_service->notifyCamPositionUpdated();
+            ::fwThread::Worker::sptr worker = m_service->getWorker();
+            worker->processTasks();
+        }
+    }
+private:
+    ::vtkSimpleMesh::RendererService* m_service;
+    bool m_isMousePressed;
+};
+
+RendererService::RendererService() throw()
+: m_render( 0 ), m_bPipelineIsInit(false)
+{
+    //this->addNewHandledEvent( ::fwComEd::MeshMsg::NEW_MESH );
+    //this->addNewHandledEvent( ::fwComEd::CameraMsg::CAMERA_MOVING );
+
+
+    m_slotUpdateCamPosition   = ::fwCom::newSlot( &RendererService::updateCamPosition, this ) ;
+    ::fwCom::HasSlots::m_slots( s_UPDATE_CAM_POSITION_SLOT, m_slotUpdateCamPosition );
+
+    m_sigCamUpdated = CamUpdatedSignalType::New();
+#ifdef COM_LOG
+    m_sigCamUpdated->setID( s_CAM_UPDATED_SIG );
+#endif
+    // Register
+    ::fwCom::HasSignals::m_signals( s_CAM_UPDATED_SIG,  m_sigCamUpdated);
+
+    this->setWorker( ::fwServices::registry::ActiveWorkers::getDefault()->
+                                 getWorker( ::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER ) );
+}
+
+//-----------------------------------------------------------------------------
+
+RendererService::~RendererService() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::starting() throw(fwTools::Failed)
+{
+    this->create();
+
+    m_interactorManager = ::fwRenderVTK::IVtkRenderWindowInteractorManager::createManager();
+    m_interactorManager->installInteractor( this->getContainer() );
+
+    m_bPipelineIsInit = false;
+
+    // Renderer
+    m_render = vtkRenderer::New();
+    m_interactorManager->getInteractor()->GetRenderWindow()->AddRenderer(m_render);
+
+    bool meshIsLoaded;
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+        ::fwData::mt::ObjectReadLock lock(mesh);
+        meshIsLoaded = mesh->getNumberOfPoints() > 0;
+    }
+
+    if ( meshIsLoaded )
+    {
+        this->initVTKPipeline();
+        m_bPipelineIsInit = true;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::configuring() throw(::fwTools::Failed)
+{
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::stopping() throw(fwTools::Failed)
+{
+    if( m_render == 0 ) return;
+
+    m_interactorManager->getInteractor()->RemoveObserver(m_loc);
+
+    m_interactorManager->uninstallInteractor();
+    m_interactorManager.reset();
+
+    SLM_ASSERT("m_render not instanced", m_render);
+    m_render->Delete();
+    m_render = 0;
+
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updating() throw(fwTools::Failed)
+{
+    m_interactorManager->getInteractor()->Render();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(fwTools::Failed)
+{
+    ::fwComEd::MeshMsg::csptr meshMsg = ::fwComEd::MeshMsg::dynamicConstCast(_msg);
+    if ( meshMsg && meshMsg->hasEvent( ::fwComEd::MeshMsg::NEW_MESH ) )
+    {
+        if(!m_bPipelineIsInit)
+        {
+            this->initVTKPipeline();
+            m_bPipelineIsInit = true;
+        }
+        else
+        {
+            m_vtkPolyData = vtkSmartPointer<vtkPolyData>::New();
+            ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+            {
+                ::fwData::mt::ObjectReadLock lock(mesh);
+                ::fwVtkIO::helper::Mesh::toVTKMesh( mesh, m_vtkPolyData );
+            }
+            m_mapper->SetInput(m_vtkPolyData);
+        }
+        m_interactorManager->getInteractor()->Render();
+    }
+    else if ( meshMsg && meshMsg->hasEvent( ::fwComEd::MeshMsg::VERTEX_MODIFIED ) )
+    {
+        m_hiResTimer.reset();
+        m_hiResTimer.start();
+        this->updateVTKPipeline(false);
+        m_hiResTimer.stop();
+        OSLM_INFO("Vertex updating time (milli sec) = " << m_hiResTimer.getElapsedTimeInMilliSec());
+
+        m_hiResTimer.reset();
+        m_hiResTimer.start();
+        m_interactorManager->getInteractor()->Render();
+        m_hiResTimer.stop();
+        OSLM_INFO("Render time (milli sec) = " << m_hiResTimer.getElapsedTimeInMilliSec());
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::initVTKPipeline()
+{
+    ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+    m_vtkPolyData = vtkSmartPointer<vtkPolyData>::New();
+
+    {
+        ::fwData::mt::ObjectReadLock lock(mesh);
+        ::fwVtkIO::helper::Mesh::toVTKMesh( mesh, m_vtkPolyData );
+    }
+
+    m_mapper = vtkPolyDataMapper::New();
+    m_mapper->SetInput(m_vtkPolyData);
+
+    vtkActor* actor =  vtkActor::New();
+    actor->SetMapper(m_mapper);
+
+    // Add the actors
+    m_render->AddActor( actor);
+
+    m_interactorManager->getInteractor()->SetInteractorStyle(vtkInteractorStyleTrackballCamera::New());
+    m_loc = new vtkLocalCommand(this);
+
+    m_interactorManager->getInteractor()->AddObserver(vtkCommand::AnyEvent, m_loc);
+
+
+    // Repaint and resize window
+    m_render->ResetCamera();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updateVTKPipeline(bool resetCamera)
+{
+    ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+
+    {
+        ::fwData::mt::ObjectReadLock lock(mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataPoints(m_vtkPolyData, mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointNormals(m_vtkPolyData, mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataPointColor(m_vtkPolyData, mesh);
+        ::fwVtkIO::helper::Mesh::updatePolyDataCellNormals(m_vtkPolyData, mesh);
+    }
+
+    if (resetCamera)
+    {
+        m_render->ResetCamera();
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::notifyCamPositionUpdated()
+{
+    vtkCamera* camera = m_render->GetActiveCamera();
+
+    SharedArray position = SharedArray(new double[3]);
+    SharedArray focal = SharedArray(new double[3]);
+    SharedArray viewUp = SharedArray(new double[3]);
+
+    std::copy(camera->GetPosition(), camera->GetPosition()+3, position.get());
+    std::copy(camera->GetFocalPoint(), camera->GetFocalPoint()+3, focal.get());
+    std::copy(camera->GetViewUp(), camera->GetViewUp()+3, viewUp.get());
+
+    fwServicesBlockAndNotifyMacro( this->getLightID(), m_sigCamUpdated,
+                                   (position, focal, viewUp),
+                                   m_slotUpdateCamPosition );
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updateCamPosition(SharedArray positionValue,
+                                        SharedArray focalValue,
+                                        SharedArray viewUpValue)
+{
+    vtkCamera* camera = m_render->GetActiveCamera();
+
+    camera->SetPosition(positionValue.get());
+    camera->SetFocalPoint(focalValue.get());
+    camera->SetViewUp(viewUpValue.get());
+    camera->SetClippingRange(0.1, 1000000);
+
+    m_interactorManager->getInteractor()->Render();
+}
+
+}
diff --git a/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/SSimpleMeshDeformation.cpp b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/SSimpleMeshDeformation.cpp
new file mode 100644
index 0000000..2359ead
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleMesh/src/vtkSimpleMesh/SSimpleMeshDeformation.cpp
@@ -0,0 +1,272 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include <fwData/Object.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/mt/ObjectReadToWriteLock.hpp>
+#include <fwData/mt/ObjectReadLock.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/MeshMsg.hpp>
+
+#include <fwDataTools/Mesh.hpp>
+
+#include "vtkSimpleMesh/SSimpleMeshDeformation.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IController , ::vtkSimpleMesh::SSimpleMeshDeformation , ::fwData::Mesh );
+
+namespace vtkSimpleMesh
+{
+
+const ::fwCom::Slots::SlotKeyType SSimpleMeshDeformation::s_START_DEFORMATION_SLOT = "startDeformation";
+const ::fwCom::Slots::SlotKeyType SSimpleMeshDeformation::s_STOP_DEFORMATION_SLOT = "stopDeformation";
+
+SSimpleMeshDeformation::SSimpleMeshDeformation() throw()
+{
+    m_slotStartDeformation = ::fwCom::newSlot( &SSimpleMeshDeformation::startDeformation, this ) ;
+    m_slotStopDeformation = ::fwCom::newSlot( &SSimpleMeshDeformation::stopDeformation, this ) ;
+    ::fwCom::HasSlots::m_slots( s_START_DEFORMATION_SLOT   , m_slotStartDeformation )
+    ( s_STOP_DEFORMATION_SLOT   , m_slotStopDeformation );
+
+#ifdef COM_LOG
+    m_slotStartDeformation->setID( s_START_DEFORMATION_SLOT );
+    m_slotStopDeformation->setID( s_STOP_DEFORMATION_SLOT );
+#endif
+
+    this->setWorker( ::fwServices::registry::ActiveWorkers::getDefault()->
+            getWorker( ::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER ) );
+}
+
+//-----------------------------------------------------------------------------
+
+SSimpleMeshDeformation::~SSimpleMeshDeformation() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::starting() throw(fwTools::Failed)
+{
+    SLM_ASSERT("No valid worker for mesh deformation", m_associatedWorker);
+    m_timer = m_associatedWorker->createTimer();
+
+    ::fwThread::Timer::TimeDurationType duration = ::boost::chrono::milliseconds(200) ;
+
+    m_timer->setFunction(  ::boost::bind( &SSimpleMeshDeformation::updating, this)  );
+    m_timer->setDuration(duration);
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::configuring() throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::stopping() throw(fwTools::Failed)
+{
+    this->stopDeformation();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::copyMesh( const ::fwData::Mesh::sptr & src, const ::fwData::Mesh::sptr & dest ) const
+{
+    dest->setPointsArray(::fwData::Object::copy( src->getPointsArray() ));
+    dest->setPointNormalsArray(::fwData::Object::copy( src->getPointNormalsArray() ));
+    dest->setPointColorsArray(::fwData::Object::copy( src->getPointColorsArray() ));
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::computeDeformation (
+        const ::fwData::Mesh::sptr & refMesh,
+        const ::fwData::Mesh::sptr & transformMesh,
+        float deformationPercent )
+{
+    SLM_ASSERT("Deformation range must be equal to [0,1]", 0 <= deformationPercent && deformationPercent <= 1 );
+
+    const float maxDeformation = 15/100.0f;
+    const float center = 2/3.0f;
+
+    ::fwComEd::helper::Mesh meshHelper(refMesh);
+    ::fwComEd::helper::Mesh transformMeshHelper(transformMesh);
+
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+    ::fwData::Mesh::PointsMultiArrayType pointsTransform = transformMeshHelper.getPoints();
+    ::fwData::Mesh::PointColorsMultiArrayType colorTransform = transformMeshHelper.getPointColors();
+
+    size_t nbPts = refMesh->getNumberOfPoints();
+
+    // Compute limits
+    float ymin = points[0][1];
+    float ymax = points[0][1];
+    float val;
+    for(size_t i=0; i!=nbPts; ++i)
+    {
+        val = points[i][1];
+        if ( val < ymin )
+        {
+            ymin = val;
+        }
+        else if ( val > ymax )
+        {
+            ymax = val;
+        }
+    }
+
+    // Compute deformation
+    float sizeRef = ymax-ymin;
+    float yref = sizeRef * center + ymin;
+    float strafe = maxDeformation * sizeRef;
+    float currentStrafe = deformationPercent * strafe;
+
+    for(size_t i=0 ; i<nbPts ; ++i )
+    {
+        float y = points[i][1];
+        if( y < yref )
+        {
+            float val =  ( yref - y ) / ( yref - ymin ) * currentStrafe;
+            pointsTransform[i][1] = y - val;
+            colorTransform[i][0] = 255;
+            colorTransform[i][1] = 255 - 255 * ( val / strafe );
+            colorTransform[i][2] = 255 - 255 * ( val / strafe );
+        }
+        else
+        {
+            colorTransform[i][0] = 255;
+            colorTransform[i][1] = 255;
+            colorTransform[i][2] = 255;
+        }
+    }
+
+    ::fwDataTools::Mesh::generatePointNormals(transformMesh);
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::computeDeformation(
+        const ::fwData::Mesh::sptr & refMesh,
+        const ::fwData::Mesh::sptr & transformMesh )
+{
+    const  int step = 5;
+
+    m_currentDeformation += m_currentIncrement;
+    if ( m_currentDeformation == 100 )
+    {
+        m_currentIncrement = -step;
+    }
+    else if ( m_currentDeformation == 0 )
+    {
+        m_currentIncrement = step;
+    }
+    this->computeDeformation( refMesh, transformMesh, m_currentDeformation/100.0f );
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::initMeshBackup()
+{
+    m_currentIncrement = 0;
+    m_currentDeformation = 0;
+
+    ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+    ::fwData::mt::ObjectReadToWriteLock lock(mesh);
+
+    SLM_ASSERT("Data already init", ! m_transformMesh && ! m_mesh);
+
+    lock.upgrade();
+    ::fwDataTools::Mesh::generatePointNormals(mesh);
+    mesh->allocatePointColors( ::fwData::Mesh::RGB );
+    lock.downgrade();
+
+    m_mesh = ::fwData::Object::copy( mesh );
+
+    m_transformMesh = ::fwData::Object::copy( mesh );
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::updating() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+
+    ::fwData::mt::ObjectReadToWriteLock lock(mesh);
+    if ( mesh->getNumberOfPoints() > 0 )
+    {
+        m_hiRestimer.reset();
+        m_hiRestimer.start();
+        this->computeDeformation(m_mesh,m_transformMesh);
+        m_hiRestimer.stop();
+        OSLM_INFO("Deformation time (milli sec) = " << m_hiRestimer.getElapsedTimeInMilliSec());
+
+        lock.upgrade();
+        m_hiRestimer.reset();
+        m_hiRestimer.start();
+        copyMesh(m_transformMesh,mesh);
+        m_hiRestimer.stop();
+        OSLM_INFO("Copy time (milli sec) = " << m_hiRestimer.getElapsedTimeInMilliSec());
+        lock.downgrade();
+
+        ::fwComEd::MeshMsg::sptr msg = ::fwComEd::MeshMsg::New();;
+        msg->addEvent( ::fwComEd::MeshMsg::VERTEX_MODIFIED ) ;
+
+        ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+        sig = mesh->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+        fwServicesBlockAndNotifyMsgMacro( this->getLightID(), sig, msg, m_slotReceive );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::startDeformation()
+{
+    bool meshIsLoaded;
+    {
+        ::fwData::Mesh::sptr mesh = this->getObject< ::fwData::Mesh >();
+        ::fwData::mt::ObjectReadLock lock(mesh);
+        meshIsLoaded = mesh->getNumberOfPoints() > 0;
+    }
+
+    if ( meshIsLoaded )
+    {
+        this->initMeshBackup();
+
+        if (!m_timer->isRunning())
+        {
+            m_timer->start();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SSimpleMeshDeformation::stopDeformation()
+{
+    if (m_timer->isRunning())
+    {
+        m_timer->stop();
+        m_transformMesh.reset();
+        m_mesh.reset();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/CMakeLists.txt b/Bundles/LeafVisu/vtkSimpleNegato/CMakeLists.txt
new file mode 100644
index 0000000..df54680
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/CMakeLists.txt
@@ -0,0 +1,18 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRender
+    fwRenderVTK
+    fwRuntime
+)
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${VTK_INCLUDE_DIRS} 
+    )
+fwLink(
+    vtkWidgets
+    )
+
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/COPYING b/Bundles/LeafVisu/vtkSimpleNegato/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/COPYING.LESSER b/Bundles/LeafVisu/vtkSimpleNegato/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/Properties.cmake b/Bundles/LeafVisu/vtkSimpleNegato/Properties.cmake
new file mode 100644
index 0000000..5c4d501
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME vtkSimpleNegato )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwData fwRender fwRenderVTK fwRuntime fwServices fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/bin/build.options b/Bundles/LeafVisu/vtkSimpleNegato/bin/build.options
new file mode 100644
index 0000000..a5b0415
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/bin/build.options
@@ -0,0 +1,16 @@
+TYPE    = 'bundle'
+USE     = ['vtkWidgets','boost']
+LIB     = [
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwData_0-1',
+          'fwServices_0-1',
+          'fwComEd_0-1',
+          'fwVtkIO_0-1',
+          'fwTools_0-1',
+          'fwGui_0-1',
+          'fwDataIO_0-2',
+          'fwRender_0-1',
+          'fwRenderVTK_0-1'
+          ]
+VERSION = '0-1'
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Namespace.hpp b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Namespace.hpp
new file mode 100644
index 0000000..1e8aa7d
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLENEGATONAMESPACE_HPP_
+#define VTKSIMPLENEGATONAMESPACE_HPP_
+
+/**
+ * @brief       The namespace vtkSimpleNegato has a visualization service of medical image (::fwData::Image).
+ * @namespace   vtkSimpleNegato
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace vtkSimpleNegato
+{
+}
+#endif /* VTKSIMPLENEGATONAMESPACE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Plugin.hpp b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Plugin.hpp
new file mode 100644
index 0000000..588ecc6
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/Plugin.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKSIMPLENEGATO_PLUGIN_HPP_
+#define _VTKSIMPLENEGATO_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+
+/**
+ * @brief   Namespace vtkSimpleNegato.
+ * @namespace   vtkSimpleNegato
+ * 
+ * @date    2009.
+ *
+ *  The namespace vtkSimpleNegato contains a simple negato renderer using vtk.
+ */
+namespace vtkSimpleNegato
+{
+
+class Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+    
+    /**
+    * @brief Start method.
+    *
+    * @exception ::fwRuntime::RuntimeException.
+    * This method is used by runtime to initialize the bundle.
+    */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief Stop method.
+    *
+    * This method is used by runtime to stop the bundle.
+    */
+    void stop() throw();
+    
+};
+
+} // namespace vtkSimpleNegato
+
+#endif //_VTKSIMPLENEGATO_PLUGIN_HPP_
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/RendererService.hpp b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/RendererService.hpp
new file mode 100644
index 0000000..a763fe6
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/RendererService.hpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLENEGATO_RENDERER_SERVICE_HPP_
+#define VTKSIMPLENEGATO_RENDERER_SERVICE_HPP_
+
+
+#include  <vtkRenderer.h>
+#include  <vtkImagePlaneWidget.h>
+#include  <vtkOutlineFilter.h>
+
+#include <fwRender/IRender.hpp>
+
+#include <fwRenderVTK/IVtkRenderWindowInteractorManager.hpp>
+
+#include "vtkSimpleNegato/config.hpp"
+
+namespace vtkSimpleNegato
+{
+
+/**
+* @brief    Renderer service.
+* @class    RendererService
+* 
+* @date 2009.
+*
+* Service rendering a ::fwData::Image using VTK.
+*
+* Service registered details : \n
+* fwServicesRegisterMacro( ::fwRender::IRender , ::vtkSimpleNegato::RendererService , ::fwData::Image)
+*/
+class VTKSIMPLENEGATO_CLASS_API RendererService : public fwRender::IRender
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (RendererService)(::fwRender::IRender) );
+
+    /**
+    * @brief    Constructor
+    */
+    VTKSIMPLENEGATO_API RendererService() throw() ;
+
+    /**
+    * @brief    Destructor
+    */
+    VTKSIMPLENEGATO_API virtual ~RendererService() throw() ;
+
+
+protected :
+
+    /**
+    * @brief Starting method.
+    *
+    * This method is used to initialize the service.
+    * Initialize VTK renderer and wxWidget containers
+    */
+    VTKSIMPLENEGATO_API virtual void starting() throw(fwTools::Failed);
+
+    /**
+    * @brief Stopping method.
+    *
+    * Destroy VTK renderer and wxWidget containers
+    */
+    VTKSIMPLENEGATO_API virtual void stopping() throw(fwTools::Failed);
+
+    /**
+    * @brief Updating method.
+    *
+    * This method is used to update the service.
+    * Make a render if necessary
+    */
+    VTKSIMPLENEGATO_API virtual void updating() throw(fwTools::Failed);
+
+    /**
+    * @brief Configuring method.
+    *
+    * This method is used to configure the service.
+    */
+    VTKSIMPLENEGATO_API virtual void configuring() throw(::fwTools::Failed);
+
+    /**
+    * @brief Receiving method (react on data modifications).
+    * @param[in] _msg ::fwServices::ObjectMsg::csptr
+    *
+    * This method is used to update the service.
+    */
+    VTKSIMPLENEGATO_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /// @brief vtk renderer
+    vtkRenderer * m_render ;
+
+private :
+
+    /// @brief VTK Interactor window manager
+    ::fwRenderVTK::IVtkRenderWindowInteractorManager::sptr m_interactorManager;
+
+    /**
+    * @brief VTK pipeline initialization method.
+    *
+    * This method is used to initialize the VTK pipeline.
+    */
+    void initVTKPipeline();
+
+    void refresh();
+    /**
+    * @brief VTK pipeline updating method.
+    *
+    * This method is used to update the VTK pipeline.
+    */
+    void updateVTKPipeline();
+
+    /// @brief image wireframe outline.
+    vtkOutlineFilter* m_outline;
+
+    /// @brief vtk widget used in the negatoscope axial plane.
+    vtkImagePlaneWidget* m_negatoAxial;
+
+    /// @brief vtk widget used in the negatoscope sagittal plane.
+    vtkImagePlaneWidget* m_negatoSagittal;
+
+    /// @brief vtk widget used in the negatoscope frontal plane.
+    vtkImagePlaneWidget* m_negatoFrontal;
+
+    /**
+    * @brief the m_bPipelineIsInit value is \b true
+    * if the pipeline is initialized.
+    */
+    bool m_bPipelineIsInit;
+};
+
+}
+
+
+#endif /* VTKSIMPLENEGATO_RENDERER_SERVICE_HPP_ */
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/config.hpp b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/config.hpp
new file mode 100644
index 0000000..0e7514a
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/include/vtkSimpleNegato/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VTKSIMPLENEGATO_CONFIG_HPP_
+#define VTKSIMPLENEGATO_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VTKSIMPLENEGATO_EXPORTS
+    #define VTKSIMPLENEGATO_API __declspec(dllexport)
+    #else
+    #define VTKSIMPLENEGATO_API __declspec(dllimport)
+    #endif
+
+    #define VTKSIMPLENEGATO_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VTKSIMPLENEGATO_EXPORTS
+    #define VTKSIMPLENEGATO_API __attribute__ ((visibility("default")))
+    #define VTKSIMPLENEGATO_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VTKSIMPLENEGATO_API __attribute__ ((visibility("hidden")))
+    #define VTKSIMPLENEGATO_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VTKSIMPLENEGATO_API
+    #define VTKSIMPLENEGATO_CLASS_API
+
+#endif
+
+#endif //VTKSIMPLENEGATO_CONFIG_HPP_
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/rc/plugin.xml b/Bundles/LeafVisu/vtkSimpleNegato/rc/plugin.xml
new file mode 100644
index 0000000..c05367e
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/rc/plugin.xml
@@ -0,0 +1,15 @@
+<plugin id="vtkSimpleNegato" class="::vtkSimpleNegato::Plugin" >
+    <library name="vtkSimpleNegato" />
+
+
+<extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwRender::IRender</type>
+        <service>::vtkSimpleNegato::RendererService</service>
+        <object>::fwData::Image</object>
+    </extension>
+
+
+</plugin>
+
+
+
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/Plugin.cpp b/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/Plugin.cpp
new file mode 100644
index 0000000..288f65c
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "vtkSimpleNegato/Plugin.hpp"
+
+namespace vtkSimpleNegato
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::vtkSimpleNegato::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace vtkSimpleNegato
diff --git a/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/RendererService.cpp b/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/RendererService.cpp
new file mode 100644
index 0000000..64f2811
--- /dev/null
+++ b/Bundles/LeafVisu/vtkSimpleNegato/src/vtkSimpleNegato/RendererService.cpp
@@ -0,0 +1,244 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkCellPicker.h>
+#include <vtkCommand.h>
+#include <vtkImageData.h>
+#include <vtkLookupTable.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindow.h>
+#include <vtkSmartPointer.h>
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include "vtkSimpleNegato/RendererService.hpp"
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwRender::IRender , ::vtkSimpleNegato::RendererService , ::fwData::Image) ;
+
+//-----------------------------------------------------------------------------
+
+namespace vtkSimpleNegato
+{
+
+//-----------------------------------------------------------------------------
+
+RendererService::RendererService() throw()
+    : m_render( 0 ), m_bPipelineIsInit(false)
+{
+    SLM_TRACE_FUNC();
+    //this->addNewHandledEvent(::fwComEd::ImageMsg::NEW_IMAGE );
+    //this->addNewHandledEvent(::fwComEd::ImageMsg::BUFFER );
+}
+
+//-----------------------------------------------------------------------------
+
+RendererService::~RendererService() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::configuring() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::starting() throw(fwTools::Failed)
+{
+    this->create();
+
+    m_interactorManager = ::fwRenderVTK::IVtkRenderWindowInteractorManager::createManager();
+    m_interactorManager->installInteractor( this->getContainer() );
+
+    m_bPipelineIsInit = false;
+
+    // Renderer
+    m_render = vtkRenderer::New();
+    m_interactorManager->getInteractor()->GetRenderWindow()->AddRenderer(m_render);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::stopping() throw(fwTools::Failed)
+{
+    if( m_render == 0 ) return;
+
+    if(m_bPipelineIsInit)
+    {
+        m_negatoSagittal->Delete();
+        m_negatoFrontal->Delete();
+        m_negatoAxial->Delete();
+        m_outline->Delete();
+    }
+
+    SLM_ASSERT("m_render not instanced", m_render);
+    m_render->Delete();
+    m_render = 0;
+
+    m_interactorManager->uninstallInteractor();
+    m_interactorManager.reset();
+
+//    this->getContainer()->clean();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updating() throw(fwTools::Failed)
+{
+
+//    m_interactorManager->getInteractor()->Render();
+    refresh();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(fwTools::Failed)
+{
+    // If message is a ImageMsg
+    ::fwComEd::ImageMsg::csptr pImageMsg = ::fwComEd::ImageMsg::dynamicConstCast( _msg ) ;
+    if (pImageMsg)
+    {
+        if( pImageMsg->hasEvent( ::fwComEd::ImageMsg::NEW_IMAGE ) || pImageMsg->hasEvent( ::fwComEd::ImageMsg::BUFFER ))
+        {
+            refresh();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::refresh()
+{
+    ::fwData::Image::sptr img = this->getObject< ::fwData::Image >();
+    bool imageIsValid = ::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity( img );
+    if(imageIsValid )
+    {
+        if(!m_bPipelineIsInit)
+        {
+            initVTKPipeline();
+            m_bPipelineIsInit = true;
+        }
+        else
+        {
+            updateVTKPipeline();
+        }
+
+
+        //
+        unsigned int axialIndex = img->getSize()[2]/2;
+        unsigned int frontalIndex = img->getSize()[1]/2;
+        unsigned int sagittalIndex = img->getSize()[0]/2;
+
+        m_negatoAxial->SetSliceIndex( axialIndex );
+        m_negatoFrontal->SetSliceIndex( frontalIndex );
+        m_negatoSagittal->SetSliceIndex( sagittalIndex );
+        m_interactorManager->getInteractor()->Render();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::initVTKPipeline()
+{
+    vtkSmartPointer< vtkImageData > vtk_img = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( this->getObject< ::fwData::Image >(), vtk_img);
+
+    m_outline = vtkOutlineFilter::New();
+    m_outline->SetInput(vtk_img);
+
+    vtkPolyDataMapper* outlineMapper = vtkPolyDataMapper::New();
+    outlineMapper->SetInputConnection(m_outline->GetOutputPort());
+
+    vtkActor* outlineActor =  vtkActor::New();
+    outlineActor->SetMapper( outlineMapper);
+
+    vtkCellPicker* picker = vtkCellPicker::New();
+    picker->SetTolerance(0.005);
+
+    //assign default props to the ipw's texture plane actor
+
+    m_negatoSagittal = vtkImagePlaneWidget::New();
+    m_negatoSagittal->SetInteractor( m_interactorManager->getInteractor() );
+    m_negatoSagittal->SetKeyPressActivationValue('x');
+    m_negatoSagittal->SetPicker(picker);
+    m_negatoSagittal->GetPlaneProperty()->SetColor(1,0,0);
+    m_negatoSagittal->TextureInterpolateOn();
+    m_negatoSagittal->SetInput(vtk_img);
+    m_negatoSagittal->SetPlaneOrientationToXAxes();
+    m_negatoSagittal->DisplayTextOn();
+    m_negatoSagittal->On();
+    m_negatoSagittal->InteractionOn();
+
+    m_negatoFrontal = vtkImagePlaneWidget::New();
+    m_negatoFrontal->SetInteractor( m_interactorManager->getInteractor() );
+    m_negatoFrontal->SetKeyPressActivationValue('y');
+    m_negatoFrontal->SetPicker(picker);
+    m_negatoFrontal->GetPlaneProperty()->SetColor(0,1,0);
+    m_negatoFrontal->TextureInterpolateOn();
+    m_negatoFrontal->SetInput(vtk_img);
+    m_negatoFrontal->SetPlaneOrientationToYAxes();
+    m_negatoFrontal->SetLookupTable( m_negatoSagittal->GetLookupTable());
+    m_negatoFrontal->DisplayTextOn();
+    m_negatoFrontal->UpdatePlacement();
+    m_negatoFrontal->On();
+
+    m_negatoAxial = vtkImagePlaneWidget::New();
+    m_negatoAxial->SetInteractor( m_interactorManager->getInteractor() );
+    m_negatoAxial->SetKeyPressActivationValue('z');
+    m_negatoAxial->SetPicker(picker);
+    m_negatoAxial->GetPlaneProperty()->SetColor(0,0,1);
+    m_negatoAxial->TextureInterpolateOn();
+    m_negatoAxial->SetInput(vtk_img);
+    m_negatoAxial->SetPlaneOrientationToZAxes();
+    m_negatoAxial->SetLookupTable( m_negatoSagittal->GetLookupTable());
+    m_negatoAxial->DisplayTextOn();
+    m_negatoAxial->On();
+
+    // Add the actors
+    m_render->AddActor( outlineActor);
+
+    // Repaint and resize window
+    m_render->ResetCamera();
+
+    picker->Delete();
+    outlineActor->Delete();
+    outlineMapper->Delete();
+}
+
+//-----------------------------------------------------------------------------
+
+void RendererService::updateVTKPipeline()
+{
+    assert(this->getObject< ::fwData::Image >());
+    vtkSmartPointer< vtkImageData > vtk_img = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( this->getObject< ::fwData::Image >(), vtk_img);
+
+    m_outline->SetInput(vtk_img);
+    m_negatoSagittal->SetInput(vtk_img);
+    m_negatoFrontal->SetInput(vtk_img);
+    m_negatoAxial->SetInput(vtk_img);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/Bundles/core/activities/CMakeLists.txt b/Bundles/core/activities/CMakeLists.txt
new file mode 100644
index 0000000..70a6e7c
--- /dev/null
+++ b/Bundles/core/activities/CMakeLists.txt
@@ -0,0 +1,19 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwActivities
+    fwGui
+    fwRuntime
+    fwTools
+)
+
+Find_package (Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(${Boost_INCLUDE_DIRS} ${QT_INCLUDE_DIR})
+fwLink(${QT_LIBRARIES})
+
+#set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
+
+
diff --git a/Bundles/core/activities/Properties.cmake b/Bundles/core/activities/Properties.cmake
new file mode 100644
index 0000000..33eb81c
--- /dev/null
+++ b/Bundles/core/activities/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME activities )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwActivities fwCom fwComEd fwData fwDataCamp fwGui fwMedData fwRuntime fwServices fwTools gui )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/activities/bin/build.options b/Bundles/core/activities/bin/build.options
new file mode 100644
index 0000000..1d1addc
--- /dev/null
+++ b/Bundles/core/activities/bin/build.options
@@ -0,0 +1,11 @@
+TYPE    = 'bundle'
+USE     = ['boost']
+LIB     = [
+          'fwRuntime_0-3',
+          'fwGui_0-1',
+          'fwGuiQt_0-1',
+          'fwActivities_0-1',
+          'fwDataCamp_0-1',
+          ]
+BUNDLES = ['gui_0-1']
+VERSION = '0-1'
diff --git a/Bundles/core/activities/include/activities/Plugin.hpp b/Bundles/core/activities/include/activities/Plugin.hpp
new file mode 100644
index 0000000..3480b02
--- /dev/null
+++ b/Bundles/core/activities/include/activities/Plugin.hpp
@@ -0,0 +1,30 @@
+#ifndef _ACTIVITIES_PLUGIN_HPP_
+#define _ACTIVITIES_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+#include "activities/config.hpp"
+
+namespace activities
+{
+/**
+ * 
+ * @date    2012.
+ */
+struct ACTIVITIES_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   destructor
+     */
+    ACTIVITIES_API ~Plugin() throw();
+
+    // Overrides
+    ACTIVITIES_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    ACTIVITIES_API void stop() throw();
+
+};
+
+} // namespace activities
+
+#endif //_ACTIVITIES_PLUGIN_HPP_
diff --git a/Bundles/core/activities/include/activities/action/SActivityLauncher.hpp b/Bundles/core/activities/include/activities/action/SActivityLauncher.hpp
new file mode 100644
index 0000000..bbb42b1
--- /dev/null
+++ b/Bundles/core/activities/include/activities/action/SActivityLauncher.hpp
@@ -0,0 +1,194 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ACTIVITIES_ACTION_SACTIVITYLAUNCHER_HPP_
+#define _ACTIVITIES_ACTION_SACTIVITYLAUNCHER_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include "activities/config.hpp"
+
+namespace activities
+{
+namespace action
+{
+
+class ACTIVITIES_CLASS_API SActivityLauncher : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SActivityLauncher)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    ACTIVITIES_API SActivityLauncher() throw() ;
+
+    /// Destructor. Do nothing.
+    ACTIVITIES_API virtual ~SActivityLauncher() throw() ;
+
+    ACTIVITIES_API static const ::fwCom::Slots::SlotKeyType s_LAUNCH_SERIES_SLOT;
+    typedef ::fwCom::Slot< void (SPTR( ::fwMedData::Series )) > LaunchSeriesSlotType;
+
+    typedef ::fwCom::Signal< void ( CSPTR(::fwServices::ObjectMsg) ) > ActivityLaunchedSignalType;
+
+    /// Key in m_signals map of signal m_sigActivityLaunched
+    ACTIVITIES_API static const ::fwCom::Signals::SignalKeyType s_ACTIVITY_LAUNCHED_SIG;
+
+protected:
+
+    ///This method launches the IAction::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IAction::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. ( overrides ).
+     * Enable the action according to the available activities.
+     */
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Show activity selector.
+     */
+    virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief Initialize the action.
+     * @see fwGui::IActionSrv::initialize()
+     *
+     * @verbatim
+     <service uid="action_newActivity" type="::fwGui::IActionSrv" impl="::activities::action::SActivityLauncher" autoConnect="yes" >
+         <config>
+             <!-- SActivityLauncher mode : immediate or message(default)
+             Immediate mode starts and stop immediatly the activity's config -->
+             <mode>immediate</mode>
+             <parameters>
+                 <parameter replace="SERIESDB" by="medicalData" />
+                 <parameter replace="IMAGE" by="@values.ImageSeries.image" />
+             </parameters>
+
+             <!-- Filter mode 'include' allows all given activity id-s.
+                  Filter mode 'exclude' allows all activity id-s excepted given ones. -->
+             <filter>
+                <mode>include</mode>
+                <id>2DVisualizationActivity</id>
+                <id>3DVisualizationActivity</id>
+                <id>VolumeRenderingActivity</id>
+            </filter>
+
+            <!-- Definition of quick association between series type and an activity id.
+                 This mapping is used by launchSeries slot (see the function to have few details ) -->
+            <quickLaunch>
+                <association type="::fwMedData::ImageSeries" id="2DVisualizationActivity" />
+                <association type="::fwMedData::ModelSeries" id="3DVisualizationActivity" />
+            </quickLaunch>
+
+         </config>
+     </service>
+     @endverbatim
+      */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+    typedef ::fwActivities::registry::ActivityAppConfig::ActivityAppConfigParamsType ParametersType;
+
+    typedef std::vector< std::string > KeysType;
+
+    typedef std::map< std::string, std::string > QuickLaunchType;
+
+    /**
+     * @brief Updates action state (enable if activities are available for current selection).
+     */
+    virtual void updateState();
+
+    /**
+     * @brief Interpret configuration parameters.
+     */
+    ParametersType translateParameters( const ParametersType& parameters);
+
+private:
+
+    /**
+     * @brief Launches activity series if only ActivitySeries are selected.
+     * @return Returns true if only ActivitySeries are selected.
+     */
+    bool launchAS(::fwData::Vector::sptr &selection);
+
+    /**
+     * @brief Slots to launch the given series.
+     * @param series the activity is launched on this series.
+     *
+     * If series is an ActivitySeries, it is launched, otherwise it launches the first available activity for
+     * this series or used m_quickLaunch information if a default association is defined for this series type.
+     */
+    void launchSeries(::fwMedData::Series::sptr series);
+
+    /**
+     * @brief Send message to launch new tab view
+     * If given activity info contains an ::fwActivities::IValidator, first checks if activity is valid according to
+     * validator, then build activity with activity builder.
+     *
+     * @param info activity information
+     */
+    void sendConfig( const ::fwActivities::registry::ActivityInfo & info );
+
+    /**
+     * @brief Builds and launch activity with the input data given in selection.
+     *
+     * @param info activity information
+     * @param selection input data to launch the activity
+     */
+    void buildActivity(const ::fwActivities::registry::ActivityInfo & info, const ::fwData::Vector::sptr& selection);
+
+    typedef ::fwActivities::registry::Activities::ActivitiesType ActivityInfoContainer;
+
+    /// Show custom dialog box
+    ::fwActivities::registry::ActivityInfo show( const ActivityInfoContainer & infos );
+
+    /// Returns enabled activity infos according to activity filter.
+    ActivityInfoContainer getEnabledActivities(const ActivityInfoContainer& infos);
+
+    ParametersType m_parameters;
+
+    /**
+     * @brief Filter mode : include or exclude activity configurations.
+     * @note Allowed values : 'include' or 'exclude'
+     */
+    std::string m_filterMode;
+
+    /// Id-s of activity configurations to be enabled or disabled, according to filter mode.
+    KeysType m_keys;
+
+    /// Slot to call launchSeries method
+    LaunchSeriesSlotType::sptr m_slotLaunchSeries;
+
+    /// Signal emitted when activity is launched. Send a message containing the activity information.
+    ActivityLaunchedSignalType::sptr m_sigActivityLaunched;
+
+    /// SActivityLauncher's mode (message or immediate)
+    std::string m_mode;
+
+    /// Defines quick association between series type (a classname) and an activity id used by launchSeries method
+    QuickLaunchType m_quickLaunch;
+};
+
+} //action
+} // gui
+
+
+#endif // _ACTIVITIES_ACTION_SACTIVITYLAUNCHER_HPP_
+
+
diff --git a/Bundles/core/activities/include/activities/config.hpp b/Bundles/core/activities/include/activities/config.hpp
new file mode 100644
index 0000000..3d8f0bc
--- /dev/null
+++ b/Bundles/core/activities/include/activities/config.hpp
@@ -0,0 +1,33 @@
+#ifndef ACTIVITIES_EXPORT_HPP_
+#define ACTIVITIES_EXPORT_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+    #ifdef ACTIVITIES_EXPORTS
+    #define ACTIVITIES_API  __declspec(dllexport)
+    #else
+    #define ACTIVITIES_API __declspec(dllimport)
+    #endif
+
+    #define ACTIVITIES_CLASS_API
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef ACTIVITIES_EXPORTS
+    #define ACTIVITIES_API __attribute__ ((visibility("default")))
+    #define ACTIVITIES_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define ACTIVITIES_API __attribute__ ((visibility("hidden")))
+    #define ACTIVITIES_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define ACTIVITIES_API
+    #define ACTIVITIES_CLASS_API
+
+#endif
+
+#endif //ACTIVITIES_EXPORT_HPP_
diff --git a/Bundles/core/activities/include/activities/helper/Activity.hpp b/Bundles/core/activities/include/activities/helper/Activity.hpp
new file mode 100644
index 0000000..94d6b6c
--- /dev/null
+++ b/Bundles/core/activities/include/activities/helper/Activity.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __ACTIVITIES_HELPER_ACTIVITY_HPP__
+#define __ACTIVITIES_HELPER_ACTIVITY_HPP__
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include "activities/config.hpp"
+
+namespace fwServices
+{
+class ObjectMsg;
+}
+
+namespace activities
+{
+
+class ActivitySerie;
+
+namespace helper
+{
+
+typedef ::fwActivities::registry::ActivityAppConfig::ActivityAppConfigParamsType ParametersType;
+
+    ACTIVITIES_API SPTR(::fwServices::ObjectMsg) buildActivityMsg(
+            SPTR(::fwMedData::ActivitySeries) series,
+            const ::fwActivities::registry::ActivityInfo& info,
+            const ParametersType& parameters = ParametersType());
+
+} // namespace helper
+} // namespace activities
+
+#endif // __ACTIVITIES_HELPER_ACTIVITY_HPP__
diff --git a/Bundles/core/activities/rc/activities.xsd b/Bundles/core/activities/rc/activities.xsd
new file mode 100644
index 0000000..40abd56
--- /dev/null
+++ b/Bundles/core/activities/rc/activities.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xs:element name="extension">
+    <xs:complexType>
+      <xs:sequence>
+        <xs:element type="xs:string" name="id"/>
+        <xs:element type="xs:string" name="title"/>
+        <xs:element type="xs:string" name="tabinfo" maxOccurs="1" minOccurs="0"/>
+        <xs:element type="xs:string" name="desc"/>
+        <xs:element type="xs:string" name="icon"/>
+        <xs:element name="requirements">
+          <xs:complexType>
+            <xs:sequence>
+              <xs:element name="requirement" maxOccurs="unbounded" minOccurs="0">
+                <xs:complexType>
+                  <xs:sequence>
+                    <xs:element name="key" maxOccurs="unbounded" minOccurs="0">
+                      <xs:complexType>
+                        <xs:simpleContent>
+                          <xs:extension base="xs:string">
+                            <xs:attribute type="xs:string" name="path"/>
+                          </xs:extension>
+                        </xs:simpleContent>
+                      </xs:complexType>
+                    </xs:element>
+                  </xs:sequence>
+
+                  <xs:attribute type="xs:string" name="name" use="required"/>
+                  <xs:attribute type="xs:string" name="type" use="required"/>
+                  <xs:attribute name="maxOccurs" use="optional">
+                    <xs:simpleType>
+                      <xs:union memberTypes="xs:unsignedInt unboundedtype" />
+                    </xs:simpleType>
+                  </xs:attribute>
+                  <xs:attribute name="minOccurs" use="optional">
+                    <xs:simpleType>
+                      <xs:union memberTypes="xs:unsignedInt unboundedtype" />
+                    </xs:simpleType>
+                  </xs:attribute>
+                </xs:complexType>
+              </xs:element>
+            </xs:sequence>
+          </xs:complexType>
+        </xs:element>
+        <xs:element name="builder" type="xs:string"/>
+        <xs:element name="validator" type="xs:string" minOccurs="0" maxOccurs="1" />
+
+        <xs:element name="appConfig">
+          <!-- TODO -->
+        </xs:element>
+
+      </xs:sequence>
+      <xs:attribute type="xs:string" name="implements"/>
+    </xs:complexType>
+
+  </xs:element>
+
+  <xs:simpleType name="unboundedtype">
+    <xs:restriction base="xs:string">
+      <xs:enumeration value="*"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+</xs:schema>
+
+
diff --git a/Bundles/core/activities/rc/plugin.xml b/Bundles/core/activities/rc/plugin.xml
new file mode 100644
index 0000000..9d04878
--- /dev/null
+++ b/Bundles/core/activities/rc/plugin.xml
@@ -0,0 +1,21 @@
+<plugin id="activities" class="activities::Plugin" >
+
+    <library name="activities" />
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+    <requirement id="gui"/>
+    <requirement id="guiQt"/>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::activities::action::SActivityLauncher</service>
+        <object>::fwData::Vector</object>
+    </extension>
+
+    <!-- EXTENSION POINT FOR AN APP CONFIGURATION -->
+    <extension-point id="::fwActivities::registry::Activities" schema="activities.xsd"/>
+
+
+
+</plugin>
diff --git a/Bundles/core/activities/src/activities/Plugin.cpp b/Bundles/core/activities/src/activities/Plugin.cpp
new file mode 100644
index 0000000..05a2dac
--- /dev/null
+++ b/Bundles/core/activities/src/activities/Plugin.cpp
@@ -0,0 +1,31 @@
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwActivities/registry/Activities.hpp>
+
+#include "activities/Plugin.hpp"
+
+namespace activities
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("activities::Plugin");
+
+Plugin::~Plugin() throw()
+{
+    //Hack: force link with fwActivities
+    ::fwMedData::ActivitySeries::sptr aSeries = ::fwMedData::ActivitySeries::New();
+    aSeries->getClassname();
+}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    ::fwActivities::registry::Activities::getDefault()->parseBundleInformation();
+}
+
+void Plugin::stop() throw()
+{
+    // Clear all operator configurations
+    ::fwActivities::registry::Activities::getDefault()->clearRegistry();
+}
+
+} // namespace activities
diff --git a/Bundles/core/activities/src/activities/action/SActivityLauncher.cpp b/Bundles/core/activities/src/activities/action/SActivityLauncher.cpp
new file mode 100644
index 0000000..69db71d
--- /dev/null
+++ b/Bundles/core/activities/src/activities/action/SActivityLauncher.cpp
@@ -0,0 +1,540 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QDialog>
+#include <QPushButton>
+#include <QListWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QStandardItemModel>
+
+#include <fwRuntime/Convert.hpp>
+
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include <fwTools/UUID.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Vector.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include <fwComEd/VectorMsg.hpp>
+
+#include <fwGui/dialog/SelectorDialog.hpp>
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include <fwActivities/IBuilder.hpp>
+#include <fwActivities/IValidator.hpp>
+
+#include "activities/helper/Activity.hpp"
+#include "activities/action/SActivityLauncher.hpp"
+
+Q_DECLARE_METATYPE(::fwActivities::registry::ActivityInfo)
+
+namespace activities
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::activities::action::SActivityLauncher, ::fwData::Vector );
+
+//------------------------------------------------------------------------------
+
+const ::fwCom::Slots::SlotKeyType SActivityLauncher::s_LAUNCH_SERIES_SLOT = "launchSeries";
+const ::fwCom::Signals::SignalKeyType SActivityLauncher::s_ACTIVITY_LAUNCHED_SIG = "activityLaunched";
+
+//------------------------------------------------------------------------------
+
+SActivityLauncher::SActivityLauncher() throw():
+    m_mode("message")
+{
+    m_sigActivityLaunched = ActivityLaunchedSignalType::New();
+    m_signals( s_ACTIVITY_LAUNCHED_SIG,  m_sigActivityLaunched);
+
+    m_slotLaunchSeries = ::fwCom::newSlot( &SActivityLauncher::launchSeries, this ) ;
+
+    ::fwCom::HasSlots::m_slots( s_LAUNCH_SERIES_SLOT, m_slotLaunchSeries );
+
+#ifdef COM_LOG
+    ::fwCom::HasSlots::m_slots.setID();
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+    this->setWorker( m_associatedWorker );
+}
+
+//------------------------------------------------------------------------------
+
+SActivityLauncher::~SActivityLauncher() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::starting() throw(::fwTools::Failed)
+{
+    this->actionServiceStarting();
+    this->updateState();
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::configuring() throw(fwTools::Failed)
+{
+    this->::fwGui::IActionSrv::initialize();
+    typedef ::fwServices::IService::ConfigType ConfigType;
+
+    m_parameters.clear();
+    if(this->getConfigTree().get_child("service").count("config") > 0)
+    {
+        SLM_ASSERT("Sorry you must have one (and only one) <config/> element.",
+                this->getConfigTree().get_child("service").count("config") == 1 );
+
+        const ::fwServices::IService::ConfigType srvconfig = this->getConfigTree().get_child("service");
+        const ::fwServices::IService::ConfigType &config = srvconfig.get_child("config");
+
+        m_mode = config.get_optional<std::string>("mode").get_value_or("message");
+        SLM_ASSERT("SActivityLauncher mode must be 'immediate' or 'message'",
+                   "message" == m_mode || "immediate" == m_mode);
+
+        if(config.count("parameters") == 1 )
+        {
+            const ::fwServices::IService::ConfigType &configParameters = config.get_child("parameters");
+            BOOST_FOREACH( const ConfigType::value_type &v, configParameters.equal_range("parameter") )
+            {
+                ParametersType::value_type parameter( v.second );
+                m_parameters.push_back( parameter );
+            }
+        }
+        OSLM_ASSERT("At most 1 <parameters> tag is allowed", config.count("parameters") < 2);
+
+        if(config.count("filter") == 1 )
+        {
+            const ::fwServices::IService::ConfigType &configFilter = config.get_child("filter");
+            OSLM_ASSERT("At most 1 <mode> tag is allowed", configFilter.count("mode") < 2);
+
+            const std::string mode = configFilter.get< std::string >("mode");
+            OSLM_ASSERT("'" << mode << "' value for <mode> tag isn't valid. Allowed values are : 'include', 'exclude'.", mode == "include" || mode == "exclude");
+            m_filterMode = mode;
+
+            BOOST_FOREACH( const ConfigType::value_type &v, configFilter.equal_range("id") )
+            {
+                m_keys.push_back(v.second.get<std::string>(""));
+            }
+        }
+        OSLM_ASSERT("At most 1 <filter> tag is allowed", config.count("filter") < 2);
+
+        if(config.count("quickLaunch") == 1 )
+        {
+            m_quickLaunch.clear();
+            const ::fwServices::IService::ConfigType &configQuickLaunch = config.get_child("quickLaunch");
+            BOOST_FOREACH( const ConfigType::value_type &v, configQuickLaunch.equal_range("association") )
+            {
+                const ::fwServices::IService::ConfigType &association = v.second;
+                const ::fwServices::IService::ConfigType xmlattr = association.get_child("<xmlattr>");
+
+                SLM_FATAL_IF( "Sorry, attribute \"type\" is missing", xmlattr.count("type") != 1 );
+                SLM_FATAL_IF( "Sorry, attribute \"id\" is missing", xmlattr.count("id") != 1 );
+
+                std::string type = xmlattr.get<std::string>("type");
+                std::string id = xmlattr.get<std::string>("id");
+
+                m_quickLaunch[type] = id;
+            }
+        }
+        SLM_ASSERT("At most 1 <quickLaunch> tag is allowed", config.count("quickLaunch") < 2);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwActivities::registry::ActivityInfo SActivityLauncher::show( const ActivityInfoContainer & infos )
+{
+    QWidget *parent = qApp->activeWindow();
+
+    QDialog* dialog = new QDialog(parent);
+    dialog->setWindowTitle(QString::fromStdString("Choose an activity"));
+
+
+    QStandardItemModel *model = new QStandardItemModel(dialog);
+    BOOST_FOREACH( ::fwActivities::registry::ActivityInfo info, infos)
+    {
+        std::string text;
+        if(info.title.empty())
+        {
+            text = info.id;
+        }
+        else
+        {
+            text = info.title + (info.description.empty() ? "" : "\n" + info.description);
+        }
+
+        QStandardItem* item = new QStandardItem(QIcon(info.icon.c_str()), QString::fromStdString(text));
+        item->setData(QVariant::fromValue(info));
+        item->setEditable(false);
+        model->appendRow(item);
+    }
+
+
+    QListView * selectionList = new QListView();
+    selectionList->setIconSize(QSize(100,100));
+    selectionList->setUniformItemSizes(true);
+    selectionList->setModel(model);
+
+    QModelIndex index = model->index( 0, 0 );
+    if ( index.isValid() )
+    {
+        selectionList->selectionModel()->select( index, QItemSelectionModel::Select );
+    }
+
+    QPushButton* okButton = new QPushButton("Ok");
+    QPushButton* cancelButton = new QPushButton("Cancel");
+
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addWidget(okButton);
+    hLayout->addWidget(cancelButton);
+
+    QVBoxLayout *vLayout = new QVBoxLayout();
+    vLayout->addWidget(selectionList);
+    vLayout->addLayout(hLayout);
+
+    dialog->setLayout(vLayout);
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    QObject::connect(cancelButton, SIGNAL(clicked()), dialog, SLOT(reject()));
+    QObject::connect(selectionList, SIGNAL(doubleClicked( const QModelIndex &  )), dialog, SLOT(accept()));
+
+    ::fwActivities::registry::ActivityInfo info;
+    if(dialog->exec())
+    {
+        QModelIndex currentIndex = selectionList->selectionModel()->currentIndex();
+        QStandardItem *item = model->itemFromIndex( currentIndex );
+        QVariant var = item->data();
+        info = var.value< ::fwActivities::registry::ActivityInfo >();
+    }
+
+    return info;
+}
+
+//------------------------------------------------------------------------------
+
+SActivityLauncher::ActivityInfoContainer SActivityLauncher::getEnabledActivities(const ActivityInfoContainer& infos)
+{
+    ActivityInfoContainer configs;
+
+    if(m_filterMode == "include" || m_filterMode == "exclude")
+    {
+        const bool isIncludeMode = m_filterMode == "include";
+
+        for(ActivityInfoContainer::const_iterator iter = infos.begin(); iter != infos.end(); ++iter)
+        {
+            KeysType::iterator keyIt = std::find(m_keys.begin(), m_keys.end(), iter->id);
+
+            if(keyIt != m_keys.end() && isIncludeMode)
+            {
+                configs.push_back(*iter);
+            }
+            else if(keyIt == m_keys.end() && !isIncludeMode)
+            {
+                configs.push_back(*iter);
+            }
+        }
+    }
+    else
+    {
+        configs = infos;
+    }
+
+    return configs;
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Vector::sptr selection = this->getObject< ::fwData::Vector >();
+
+    bool launchAS = this->launchAS(selection);
+    if (!launchAS)
+    {
+        ActivityInfoContainer infos = ::fwActivities::registry::Activities::getDefault()->getInfos(selection);
+        infos = this->getEnabledActivities(infos);
+
+        if ( ! infos.empty())
+        {
+            ::fwActivities::registry::ActivityInfo info;
+            if((m_keys.size() == 1 && m_filterMode == "include") || (infos.size() == 1))
+            {
+                info = infos[0];
+            }
+            else
+            {
+                info = this->show( infos );
+            }
+
+            if( !info.id.empty() )
+            {
+                this->sendConfig( info );
+            }
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Activity launcher",
+                                                              "Not available activity for the current selection.",
+                                                              ::fwGui::dialog::MessageDialog::WARNING);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    this->updateState();
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::updateState()
+{
+    ::fwData::Vector::sptr selection = this->getObject< ::fwData::Vector >();
+
+    bool isExecutable = false;
+
+    if(selection->size() == 1 && ::fwMedData::ActivitySeries::dynamicCast((*selection)[0]))
+    {
+        ::fwMedData::ActivitySeries::sptr as = ::fwMedData::ActivitySeries::dynamicCast((*selection)[0]);
+        isExecutable = ::fwActivities::registry::Activities::getDefault()->hasInfo(as->getActivityConfigId());
+    }
+    else
+    {
+        ::fwActivities::registry::ActivityInfo::DataCountType dataCount;
+        dataCount = ::fwActivities::registry::Activities::getDefault()->getDataCount(selection);
+        if(m_filterMode.empty() && dataCount.size() == 1)
+        {
+            ::fwData::Object::sptr obj = selection->front();
+            if (::fwMedData::ActivitySeries::dynamicCast(obj))
+            {
+                isExecutable = true;
+            }
+        }
+
+        ActivityInfoContainer infos = ::fwActivities::registry::Activities::getDefault()->getInfos(selection);
+        infos = this->getEnabledActivities(infos);
+
+        isExecutable |= !infos.empty();
+    }
+
+    this->setIsExecutable(isExecutable);
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::info( std::ostream &_sstream )
+{}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::buildActivity(const ::fwActivities::registry::ActivityInfo & info, const ::fwData::Vector::sptr& selection)
+{
+    ::fwData::Composite::sptr replaceMap = ::fwData::Composite::New();
+    ::fwActivities::IBuilder::sptr builder;
+    builder = ::fwActivities::builder::factory::New(info.builderImpl);
+    OSLM_ASSERT(info.builderImpl << " instantiation failed", builder);
+
+    ::fwMedData::ActivitySeries::sptr actSeries;
+    actSeries = builder->buildData(info, selection);
+
+    if( ! actSeries )
+    {
+        OSLM_INFO("Activity <" << info.builderImpl << ">launch aborted");
+        return;
+    }
+
+    ParametersType parameters = this->translateParameters(m_parameters);
+    ::fwServices::ObjectMsg::sptr msg = helper::buildActivityMsg(actSeries, info, parameters);
+
+    if( m_mode == "message" )
+    {
+        fwServicesNotifyMsgMacro(this->getLightID(), m_sigActivityLaunched, msg);
+    }
+    else
+    {
+        ::fwGui::LockAction lock(this->getSptr());
+        ::fwData::String::csptr msgData = ::fwData::String::dynamicConstCast(msg->getDataInfo("NEW_CONFIGURATION_HELPER"));
+        const std::string viewConfigFieldID = "VIEWCONFIGID";
+        const std::string fieldID           = "APPCONFIG";
+
+        std::string viewConfigID = msgData->getField(viewConfigFieldID, ::fwData::String::New(""))->value();
+        ::fwData::Composite::sptr replaceMap = msgData->getField(fieldID, ::fwData::Composite::New());
+
+        ::fwRuntime::ConfigurationElement::csptr config =
+            ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( viewConfigID, replaceMap);
+
+        ::fwServices::AppConfigManager::sptr helper = ::fwServices::AppConfigManager::New();
+        helper->setConfig( config );
+        helper->launch();
+        helper->stopAndDestroy();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::sendConfig( const ::fwActivities::registry::ActivityInfo & info )
+{
+    ::fwData::Vector::sptr selection = this->getObject< ::fwData::Vector >();
+
+    if(!info.validatorImpl.empty())
+    {
+        ::fwActivities::IValidator::sptr validator = ::fwActivities::validator::factory::New(info.validatorImpl);
+        OSLM_ASSERT(info.validatorImpl << " instantiation failed", validator);
+
+        ::fwActivities::IValidator::ValidationType valid = validator->validate(info, selection);
+        if(!valid.first)
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Activity could not be launched",
+                    "The activity " + info.title + " can't be launched.\nReason : " + valid.second,
+                    ::fwGui::dialog::MessageDialog::WARNING);
+        }
+        else
+        {
+            this->buildActivity(info, selection);
+        }
+    }
+    else
+    {
+        this->buildActivity(info, selection);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool SActivityLauncher::launchAS(::fwData::Vector::sptr &selection)
+{
+    bool launchAS = false;
+    ::fwActivities::registry::ActivityInfo::DataCountType dataCount;
+    dataCount = ::fwActivities::registry::Activities::getDefault()->getDataCount(selection);
+    if(dataCount.size() == 1)
+    {
+        BOOST_FOREACH(::fwData::Object::sptr obj, *selection)
+        {
+            ::fwMedData::ActivitySeries::sptr as = ::fwMedData::ActivitySeries::dynamicCast(obj);
+            if (!as)
+            {
+                launchAS = false;
+                break;
+            }
+            else
+            {
+                ::fwActivities::registry::ActivityInfo info;
+                info = ::fwActivities::registry::Activities::getDefault()->getInfo(as->getActivityConfigId());
+                ParametersType parameters = this->translateParameters(m_parameters);
+                ::fwServices::ObjectMsg::sptr msg = helper::buildActivityMsg(as, info, parameters);
+
+                fwServicesNotifyMsgMacro(this->getLightID(), m_sigActivityLaunched, msg);
+                launchAS = true;
+            }
+        }
+    }
+    return launchAS;
+}
+
+//------------------------------------------------------------------------------
+
+void SActivityLauncher::launchSeries(::fwMedData::Series::sptr series)
+{
+    ::fwMedData::ActivitySeries::sptr as = ::fwMedData::ActivitySeries::dynamicCast(series);
+    if (as)
+    {
+        ::fwActivities::registry::ActivityInfo info;
+        info = ::fwActivities::registry::Activities::getDefault()->getInfo(as->getActivityConfigId());
+        ParametersType parameters = this->translateParameters(m_parameters);
+        ::fwServices::ObjectMsg::sptr msg = helper::buildActivityMsg(as, info, parameters);
+
+        fwServicesNotifyMsgMacro(this->getLightID(), m_sigActivityLaunched, msg);
+    }
+    else
+    {
+        ::fwData::Vector::sptr selection = ::fwData::Vector::New();
+        selection->getContainer().push_back(series);
+        ActivityInfoContainer infos = ::fwActivities::registry::Activities::getDefault()->getInfos(selection);
+
+        if( m_quickLaunch.find( series->getClassname() ) != m_quickLaunch.end() )
+        {
+            std::string activityId = m_quickLaunch[ series->getClassname() ];
+            SLM_ASSERT("Activity information not found for" + activityId,
+                    ::fwActivities::registry::Activities::getDefault()->hasInfo(activityId) );
+            this->sendConfig( ::fwActivities::registry::Activities::getDefault()->getInfo(activityId) );
+        }
+        else if ( ! infos.empty() )
+        {
+            this->sendConfig( infos.front() );
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog("Activity launcher",
+                                                              "Not available activity for the current selection.",
+                                                              ::fwGui::dialog::MessageDialog::WARNING);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+SActivityLauncher::ParametersType SActivityLauncher::translateParameters( const ParametersType& parameters )
+{
+    ParametersType transParams = parameters;
+    ::fwData::Object::sptr workingObj = this->getObject();
+    BOOST_FOREACH(ParametersType::value_type& param, transParams)
+    {
+        if(param.isSeshat())
+        {
+            std::string parameterToReplace = param.by;
+            if (parameterToReplace.substr(0,1) == "!")
+            {
+                parameterToReplace.replace(0, 1, "@");
+            }
+
+            ::fwData::Object::sptr obj = ::fwDataCamp::getObject(workingObj, parameterToReplace);
+            OSLM_ASSERT("Invalid seshat path : '"<<param.by<<"'", obj);
+
+            ::fwData::String::sptr stringParameter = ::fwData::String::dynamicCast(obj);
+
+            std::string parameterValue = obj->getID();
+
+            if(stringParameter && param.by.substr(0,1) == "!")
+            {
+                parameterValue = stringParameter->getValue();
+            }
+            param.by = parameterValue;
+        }
+    }
+    return transParams;
+}
+
+}
+}
+
diff --git a/Bundles/core/activities/src/activities/helper/Activity.cpp b/Bundles/core/activities/src/activities/helper/Activity.cpp
new file mode 100644
index 0000000..1ccd7a2
--- /dev/null
+++ b/Bundles/core/activities/src/activities/helper/Activity.cpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/regex.hpp>
+#include <boost/algorithm/string/replace.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwActivities/registry/Activities.hpp>
+
+#include "activities/helper/Activity.hpp"
+
+
+namespace activities
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+::fwServices::ObjectMsg::sptr buildActivityMsg( ::fwMedData::ActivitySeries::sptr series,
+        const ::fwActivities::registry::ActivityInfo & info,
+        const ParametersType& parameters)
+{
+    namespace ActiReg = fwActivities::registry;
+
+    ::fwServices::ObjectMsg::sptr activityMsg = ::fwServices::ObjectMsg::New();
+    ::fwData::Composite::sptr replaceMap = ::fwData::Composite::New();
+    SLM_ASSERT("ActivitySeries instantiation failed", series);
+
+    const std::string eventID              = "NEW_CONFIGURATION_HELPER";
+    const std::string fieldID              = "APPCONFIG";
+    const std::string viewConfigFieldID    = "VIEWCONFIGID";
+    const std::string closableFieldID      = "CLOSABLE";
+    const std::string iconFieldID          = "ICON";
+    const std::string tooltipFieldID       = "TOOLTIP";
+    const std::string tabIDFieldID         = "TABID";
+    const std::string tabInfoID            = "TABINFO";
+    const std::string asFieldID            = "ACTIVITYSERIES";
+    const std::string asUID                = "AS_UID";
+    const std::string genericUID           = "GENERIC_UID";
+    const std::string tabID                = "TABID_" + ::fwTools::UUID::generateUUID();
+
+    ::fwData::String::sptr title = ::fwData::String::New();
+
+    title->value() = info.title;
+    activityMsg->addEvent( eventID, title );
+    title->setField( viewConfigFieldID, ::fwData::String::New(info.appConfig.id) );
+    title->setField( closableFieldID, ::fwData::Boolean::New(true));
+    title->setField( tabIDFieldID, ::fwData::String::New(tabID));
+
+    if(info.tabInfo.empty())
+    {
+
+        title->setField( tabInfoID, ::fwData::String::New(info.title));
+    }
+    else
+    {
+
+        std::string newTabInfo = info.tabInfo;
+        ::boost::regex e("(!(([[:word:]]+\\.?)+[[:word:]]))");
+        ::boost::smatch what;
+        if(boost::regex_search(newTabInfo, what, e))
+        {
+            std::string submatch(what[1].first, what[1].second);
+
+            submatch.replace(0, 1, "@");
+
+            ::fwData::Object::sptr obj = ::fwDataCamp::getObject(series->getData(), submatch);
+            OSLM_ASSERT("Invalid seshat path : '" << submatch <<"'", obj);
+
+            ::fwData::String::sptr stringParameter = ::fwData::String::dynamicCast(obj);
+
+            std::string tabInfoSeshat;
+
+            if(stringParameter)
+            {
+                tabInfoSeshat = stringParameter->getValue();
+            }
+            else
+            {
+                OSLM_WARN("Seshat path '" << submatch << "' doesn't reference an fwData::String");
+            }
+
+            submatch.replace(0, 1, "!");
+            ::boost::algorithm::replace_all(newTabInfo, submatch, tabInfoSeshat);
+
+        }
+        title->setField( tabInfoID, ::fwData::String::New(newTabInfo));
+    }
+    title->setField( iconFieldID, ::fwData::String::New(info.icon) );
+    title->setField( tooltipFieldID, ::fwData::String::New(info.title) );
+    title->setField( asFieldID, series );
+    title->setField( fieldID, replaceMap );
+
+
+    std::string genericUidAdaptor = ::fwServices::registry::AppConfig::getUniqueIdentifier(info.id);
+    (*replaceMap)[genericUID] = ::fwData::String::New(genericUidAdaptor);
+
+    ActiReg::ActivityAppConfig::ActivityAppConfigParamsType params = info.appConfig.parameters;
+    params.reserve(params.size() + parameters.size() + 1);
+    params.insert(params.end(), parameters.begin(), parameters.end());
+    ActiReg::ActivityAppConfigParam asConfigParam;
+    asConfigParam.replace = asUID;
+    asConfigParam.by = series->getID();
+    params.push_back(asConfigParam);
+    BOOST_FOREACH(const ActiReg::ActivityAppConfigParam& param, params)
+    {
+        if(!param.isSeshat())
+        {
+            (*replaceMap)[param.replace] = ::fwData::String::New(param.by);
+        }
+        else
+        {
+            std::string parameterToReplace = param.by;
+            if (parameterToReplace.substr(0,1) == "!")
+            {
+                parameterToReplace.replace(0, 1, "@");
+            }
+
+            ::fwData::Object::sptr obj = ::fwDataCamp::getObject(series->getData(), parameterToReplace);
+            OSLM_ASSERT("Invalid seshat path : '"<<param.by<<"'", obj);
+
+            ::fwData::String::sptr stringParameter = ::fwData::String::dynamicCast(obj);
+
+            std::string parameterValue = obj->getID();
+
+            if(stringParameter && param.by.substr(0,1) == "!")
+            {
+                parameterValue = stringParameter->getValue();
+            }
+            (*replaceMap)[param.replace] = ::fwData::String::New(parameterValue);
+        }
+    }
+    return activityMsg;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace activities
diff --git a/Bundles/core/appXml/CMakeLists.txt b/Bundles/core/appXml/CMakeLists.txt
new file mode 100644
index 0000000..0729bf3
--- /dev/null
+++ b/Bundles/core/appXml/CMakeLists.txt
@@ -0,0 +1,9 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+    fwServices
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/Bundles/core/appXml/COPYING b/Bundles/core/appXml/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/appXml/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/appXml/COPYING.LESSER b/Bundles/core/appXml/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/appXml/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/appXml/Properties.cmake b/Bundles/core/appXml/Properties.cmake
new file mode 100644
index 0000000..989972c
--- /dev/null
+++ b/Bundles/core/appXml/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME appXml )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/appXml/bin/build.options b/Bundles/core/appXml/bin/build.options
new file mode 100644
index 0000000..ddedae1
--- /dev/null
+++ b/Bundles/core/appXml/bin/build.options
@@ -0,0 +1,5 @@
+TYPE    = 'bundle'
+USE     = ['boost']
+LIB     = ['fwRuntime_0-3','fwData_0-1','fwServices_0-1']
+VERSION = '0-1'
+
diff --git a/Bundles/core/appXml/include/appXml/Namespace.hpp b/Bundles/core/appXml/include/appXml/Namespace.hpp
new file mode 100644
index 0000000..89557a5
--- /dev/null
+++ b/Bundles/core/appXml/include/appXml/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef APPXMLNAMESPACE_HPP_
+#define APPXMLNAMESPACE_HPP_
+
+/**
+ * @brief      The namespace appXml.
+ * @namespace  appXml
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace appXml
+{
+
+}
+#endif /* APPXMLNAMESPACE_HPP_ */
diff --git a/Bundles/core/appXml/include/appXml/Plugin.hpp b/Bundles/core/appXml/include/appXml/Plugin.hpp
new file mode 100644
index 0000000..bd253ab
--- /dev/null
+++ b/Bundles/core/appXml/include/appXml/Plugin.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _APPXML_PLUGIN_HPP_
+#define _APPXML_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include "appXml/config.hpp"
+
+namespace appXml
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+class APPXML_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /// Constructor.
+    APPXML_API Plugin() throw();
+
+    /// Destructor. Do nothing.
+    APPXML_API ~Plugin() throw();
+
+    /// Overrides start method. .
+    APPXML_API void start() throw(::fwRuntime::RuntimeException);
+
+    /// Overrides stop method. Do nothing
+    APPXML_API void stop() throw();
+
+    APPXML_API void initialize() throw( ::fwRuntime::RuntimeException );
+
+    APPXML_API void uninitialize() throw();
+
+private:
+    std::string m_configurationName;
+    std::string m_parametersName;
+    ::fwServices::AppConfigManager::sptr m_appConfigMng;
+};
+
+} // namespace appXml
+
+#endif // _APPXML_PLUGIN_HPP_
diff --git a/Bundles/core/appXml/include/appXml/config.hpp b/Bundles/core/appXml/include/appXml/config.hpp
new file mode 100644
index 0000000..7cb5cb8
--- /dev/null
+++ b/Bundles/core/appXml/include/appXml/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _APPXML_CONFIG_HPP_
+#define _APPXML_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef APPXML_EXPORTS
+    #define APPXML_API __declspec(dllexport)
+    #else
+    #define APPXML_API __declspec(dllimport)
+    #endif
+
+    #define APPXML_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef APPXML_EXPORTS
+    #define APPXML_API __attribute__ ((visibility("default")))
+    #define APPXML_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define APPXML_API __attribute__ ((visibility("hidden")))
+    #define APPXML_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define APPXML_API
+    #define APPXML_CLASS_API
+
+#endif
+
+#endif // _APPXML_CONFIG_HPP_
diff --git a/Bundles/core/appXml/rc/plugin.xml b/Bundles/core/appXml/rc/plugin.xml
new file mode 100644
index 0000000..ccaee4f
--- /dev/null
+++ b/Bundles/core/appXml/rc/plugin.xml
@@ -0,0 +1,7 @@
+<plugin id="appXml" class="::appXml::Plugin" >
+
+    <library name="appXml" />
+    <requirement id="servicesReg" />
+    <requirement id="dataReg" />
+
+</plugin>
diff --git a/Bundles/core/appXml/src/appXml/Plugin.cpp b/Bundles/core/appXml/src/appXml/Plugin.cpp
new file mode 100644
index 0000000..a682bbc
--- /dev/null
+++ b/Bundles/core/appXml/src/appXml/Plugin.cpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/registry/AppConfigParameters.hpp>
+
+#include "appXml/Plugin.hpp"
+
+namespace appXml
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::appXml::Plugin");
+
+//------------------------------------------------------------------------------
+
+Plugin::Plugin() throw() : m_configurationName(""),m_parametersName("")
+{}
+
+//------------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{
+    SLM_FATAL_IF("Bundle appXml, missing param config in profile", !this->getBundle()->hasParameter("config"));
+    m_configurationName =  this->getBundle()->getParameterValue("config") ;
+    if( this->getBundle()->hasParameter("parameters") )
+    {
+        m_parametersName =  this->getBundle()->getParameterValue("parameters") ;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::initialize() throw( ::fwRuntime::RuntimeException )
+{
+    SLM_ASSERT("Sorry, the OSR is already initialized.", ! m_appConfigMng );
+    SLM_ASSERT("Sorry, configuration name parameter is not initialized.", !m_configurationName.empty());
+
+    m_appConfigMng = ::fwServices::AppConfigManager::New();
+
+    if( m_parametersName.empty() )
+    {
+        const ::fwServices::registry::AppConfig::FieldAdaptorType fields;
+        ::fwRuntime::ConfigurationElement::csptr config = ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( m_configurationName, fields );
+        m_appConfigMng->setConfig( ::fwRuntime::ConfigurationElement::constCast( config ) );
+    }
+    else
+    {
+        const ::fwServices::registry::AppConfig::FieldAdaptorType & fields = ::fwServices::registry::AppConfigParameters::getDefault()->getParameters( m_parametersName );
+        ::fwRuntime::ConfigurationElement::csptr config = ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( m_configurationName, fields );
+        m_appConfigMng->setConfig( ::fwRuntime::ConfigurationElement::constCast( config ) );
+    }
+    m_appConfigMng->launch();
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::uninitialize() throw()
+{
+    SLM_ASSERT("Sorry, the OSR is not initialized.", m_appConfigMng );
+    m_appConfigMng->stopAndDestroy();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace appXml
diff --git a/Bundles/core/binding/CMakeLists.txt b/Bundles/core/binding/CMakeLists.txt
new file mode 100644
index 0000000..91baede
--- /dev/null
+++ b/Bundles/core/binding/CMakeLists.txt
@@ -0,0 +1,4 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
diff --git a/Bundles/core/binding/COPYING b/Bundles/core/binding/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/binding/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/binding/COPYING.LESSER b/Bundles/core/binding/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/binding/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/binding/Properties.cmake b/Bundles/core/binding/Properties.cmake
new file mode 100644
index 0000000..0aaa713
--- /dev/null
+++ b/Bundles/core/binding/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME binding )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwPython fwRuntime )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/binding/bin/build.options b/Bundles/core/binding/bin/build.options
new file mode 100644
index 0000000..3330998
--- /dev/null
+++ b/Bundles/core/binding/bin/build.options
@@ -0,0 +1,6 @@
+TYPE = 'bundle'
+VERSION = '0.1'
+
+#USE = []
+LIB = ['fwPython_0.1']
+#BUNDLES = []
diff --git a/Bundles/core/binding/include/binding/Plugin.hpp b/Bundles/core/binding/include/binding/Plugin.hpp
new file mode 100644
index 0000000..50affbe
--- /dev/null
+++ b/Bundles/core/binding/include/binding/Plugin.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _BINDING_PLUGIN_HPP_
+#define _BINDING_PLUGIN_HPP_
+
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "binding/config.hpp"
+
+namespace binding
+{
+/**
+* @brief   This class is started when the bundles is loaded.
+* @class   Plugin
+*/
+
+class BINDING_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+public:
+    /**
+     * @brief   destructor
+     */
+    BINDING_API ~Plugin() throw();
+
+    // Overrides
+    BINDING_API void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    BINDING_API void stop() throw();
+
+};
+
+
+} // namespace binding
+
+
+#endif //_BINDING_PLUGIN_HPP_
diff --git a/Bundles/core/binding/include/binding/config.hpp b/Bundles/core/binding/include/binding/config.hpp
new file mode 100644
index 0000000..bcb8b3c
--- /dev/null
+++ b/Bundles/core/binding/include/binding/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _BINDING_CONFIG_HPP_
+#define _BINDING_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef BINDING_EXPORTS
+            #define BINDING_API __declspec(dllexport)
+        #else
+            #define BINDING_API __declspec(dllimport)
+        #endif
+
+        #define BINDING_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef BINDING_EXPORTS
+            #define BINDING_API __attribute__ ((visibility("default")))
+            #define BINDING_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define BINDING_API __attribute__ ((visibility("hidden")))
+            #define BINDING_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define BINDING_API
+        #define BINDING_CLASS_API
+
+    #endif
+
+#endif //BINDING_API
+
diff --git a/Bundles/core/binding/include/binding/namespace.hpp b/Bundles/core/binding/include/binding/namespace.hpp
new file mode 100644
index 0000000..1d3677f
--- /dev/null
+++ b/Bundles/core/binding/include/binding/namespace.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @brief       The binding namespace contains the basics to configure python
+ * interpreter
+ * @namespace   binding
+ * 
+ */
+
+namespace binding
+{
+
+} // namespace binding
diff --git a/Bundles/core/binding/rc/plugin.xml b/Bundles/core/binding/rc/plugin.xml
new file mode 100644
index 0000000..6390d9a
--- /dev/null
+++ b/Bundles/core/binding/rc/plugin.xml
@@ -0,0 +1,5 @@
+<plugin id="binding" class="::binding::Plugin">
+    
+    <library name="binding" />
+
+</plugin>
diff --git a/Bundles/core/binding/src/binding/Plugin.cpp b/Bundles/core/binding/src/binding/Plugin.cpp
new file mode 100644
index 0000000..d6f1eab
--- /dev/null
+++ b/Bundles/core/binding/src/binding/Plugin.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwPython/python.hpp>
+#include <fwPython/bindings/base.hpp>
+
+#include "binding/Plugin.hpp"
+
+namespace binding
+{
+
+//-----------------------------------------------------------------------------
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::binding::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{
+    SLM_TRACE_FUNC();
+
+    if ( this->getBundle()->hasParameter("pythonhome") )
+    {
+        ::fwPython::setHome(this->getBundle()->getParameterValue("pythonhome"));
+    }
+
+    SLM_WARN_IF( "pythonhome is not set, you may encounter some problems",
+            !this->getBundle()->hasParameter("pythonhome"));
+
+    ::fwPython::initialize();
+
+    if ( this->getBundle()->hasParameter("pythonpath") )
+    {
+        ::fwPython::addPath(this->getBundle()->getParameterValue("pythonpath"));
+    }
+
+    ::fwPython::bindings::initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+    ::fwPython::finalize();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace binding
diff --git a/Bundles/core/dataReg/CMakeLists.txt b/Bundles/core/dataReg/CMakeLists.txt
new file mode 100644
index 0000000..c8b05f8
--- /dev/null
+++ b/Bundles/core/dataReg/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
+
+
diff --git a/Bundles/core/dataReg/COPYING b/Bundles/core/dataReg/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/dataReg/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/dataReg/COPYING.LESSER b/Bundles/core/dataReg/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/dataReg/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/dataReg/Properties.cmake b/Bundles/core/dataReg/Properties.cmake
new file mode 100644
index 0000000..ce505b1
--- /dev/null
+++ b/Bundles/core/dataReg/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME dataReg )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwData fwMedData fwRuntime )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/dataReg/bin/build.options b/Bundles/core/dataReg/bin/build.options
new file mode 100644
index 0000000..f8dd9b4
--- /dev/null
+++ b/Bundles/core/dataReg/bin/build.options
@@ -0,0 +1,4 @@
+TYPE    = 'bundle'
+USE     = ['boost']
+LIB     = ['fwRuntime_0-3','fwData_0-1','fwMedData_0-1','fwTools_0-1','fwCore_0-1']
+VERSION = '0-1'
diff --git a/Bundles/core/dataReg/include/dataReg/Namespace.hpp b/Bundles/core/dataReg/include/dataReg/Namespace.hpp
new file mode 100644
index 0000000..ecc0dbe
--- /dev/null
+++ b/Bundles/core/dataReg/include/dataReg/Namespace.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef DATAREGNAMESPACE_HPP_
+#define DATAREGNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace dataReg (data registration) contains classes which describes all types of data existing in FW4SPL.
+ * @namespace   dataReg
+ */
+namespace dataReg
+{
+
+}
+#endif /* DATAREGNAMESPACE_HPP_ */
diff --git a/Bundles/core/dataReg/include/dataReg/Plugin.hpp b/Bundles/core/dataReg/include/dataReg/Plugin.hpp
new file mode 100644
index 0000000..71f525c
--- /dev/null
+++ b/Bundles/core/dataReg/include/dataReg/Plugin.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _DATAREG_PLUGIN_HPP_
+#define _DATAREG_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "dataReg/config.hpp"
+
+namespace dataReg
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+struct DATAREG_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /// Destructor. Do nothing.
+    DATAREG_API ~Plugin() throw();
+
+    /**
+     * @brief Overrides start method. Object declarations.
+     * @todo All data are not register in this method, what data must be registered ?
+     */
+    DATAREG_API void start() throw( ::fwRuntime::RuntimeException );
+
+    /// Overrides stop method. Do nothing
+    DATAREG_API void stop() throw();
+
+};
+
+} // namespace dataReg
+
+#endif //_DATAREG_PLUGIN_HPP_
diff --git a/Bundles/core/dataReg/include/dataReg/config.hpp b/Bundles/core/dataReg/include/dataReg/config.hpp
new file mode 100644
index 0000000..5aedb25
--- /dev/null
+++ b/Bundles/core/dataReg/include/dataReg/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _DATAREG_CONFIG_HPP_
+#define _DATAREG_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef DATAREG_EXPORTS
+    #define DATAREG_API __declspec(dllexport)
+    #else
+    #define DATAREG_API __declspec(dllimport)
+    #endif
+
+    #define DATAREG_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef DATAREG_EXPORTS
+    #define DATAREG_API __attribute__ ((visibility("default")))
+    #define DATAREG_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define DATAREG_API __attribute__ ((visibility("hidden")))
+    #define DATAREG_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define DATAREG_API
+    #define DATAREG_CLASS_API
+
+#endif
+
+#endif //DATAREG_API
diff --git a/Bundles/core/dataReg/rc/plugin.xml b/Bundles/core/dataReg/rc/plugin.xml
new file mode 100644
index 0000000..29bdb7c
--- /dev/null
+++ b/Bundles/core/dataReg/rc/plugin.xml
@@ -0,0 +1,5 @@
+<plugin id="dataReg" class="::dataReg::Plugin" >
+    
+    <library name="dataReg" />
+    
+</plugin>
diff --git a/Bundles/core/dataReg/src/dataReg/Plugin.cpp b/Bundles/core/dataReg/src/dataReg/Plugin.cpp
new file mode 100644
index 0000000..5cd2cf3
--- /dev/null
+++ b/Bundles/core/dataReg/src/dataReg/Plugin.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwData/Float.hpp>
+#include <fwMedData/Patient.hpp>
+
+#include "dataReg/Plugin.hpp"
+
+namespace dataReg
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::dataReg::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    //Hack: force link with fwData
+    ::fwData::Float::sptr obj = ::fwData::Float::New();
+    obj->getClassname();
+
+    //Hack: force link with fwMedData
+    ::fwMedData::Patient::sptr pat = ::fwMedData::Patient::New();
+    pat->getClassname();
+}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace dataReg
diff --git a/Bundles/core/gui/CMakeLists.txt b/Bundles/core/gui/CMakeLists.txt
new file mode 100644
index 0000000..001e05c
--- /dev/null
+++ b/Bundles/core/gui/CMakeLists.txt
@@ -0,0 +1,15 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCom
+    fwCore
+    fwGui
+    fwRuntime
+    fwServices
+    fwTools
+)
+
+Find_package (Boost COMPONENTS filesystem REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
diff --git a/Bundles/core/gui/COPYING b/Bundles/core/gui/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/gui/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/gui/COPYING.LESSER b/Bundles/core/gui/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/gui/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/gui/Properties.cmake b/Bundles/core/gui/Properties.cmake
new file mode 100644
index 0000000..ff537e2
--- /dev/null
+++ b/Bundles/core/gui/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME gui )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCom fwComEd fwCore fwData fwGui fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/gui/bin/build.options b/Bundles/core/gui/bin/build.options
new file mode 100644
index 0000000..b6dada6
--- /dev/null
+++ b/Bundles/core/gui/bin/build.options
@@ -0,0 +1,15 @@
+TYPE     = 'bundle'
+VERSION  = '0-1'
+USE      = ['boost', 'boostFilesystem']
+LIB      = [
+            'fwRuntime_0-3',
+            'fwServices_0-1',
+            'fwTools_0-1',
+            'fwCore_0-1',
+            'fwData_0-1',
+            'fwComEd_0-1',
+            'fwGui_0-1',
+            'fwActivities_0-1',
+            ]
+
+
diff --git a/Bundles/core/gui/include/gui/Namespace.hpp b/Bundles/core/gui/include/gui/Namespace.hpp
new file mode 100644
index 0000000..863ec25
--- /dev/null
+++ b/Bundles/core/gui/include/gui/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUINAMESPACE_HPP_
+#define GUINAMESPACE_HPP_
+
+/**
+ * @brief       The namespace gui contains the basic services to build the application IHM.
+ * @namespace   gui
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace gui
+{
+
+}
+#endif /* GUINAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/include/gui/Plugin.hpp b/Bundles/core/gui/include/gui/Plugin.hpp
new file mode 100644
index 0000000..4575538
--- /dev/null
+++ b/Bundles/core/gui/include/gui/Plugin.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_PLUGIN_HPP_
+#define _GUI_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+
+/**
+ * @brief   This class is called when the gui bundle is loaded.
+ * @class   Plugin
+ */
+
+class GUI_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+
+public:
+
+     ///@brief  Destructor. Do nothing.
+    GUI_API virtual ~Plugin() throw();
+
+    /**
+     * @brief This method is used by runtime to initialize the bundle.
+     *
+     * @exception ::fwRuntime::RuntimeException
+     *
+     * Register first basic services of type IAction, IEditor and IView.
+     * Secondly, verifies if the command line and profile.xml are well formed and starts the wxWidgets IHM.
+     */
+    GUI_API void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+    * @brief This method is used by runtime to close the bundle. Do nothing.
+    */
+    GUI_API void stop() throw();
+
+};
+
+} // namespace gui
+
+#endif //_GUI_PLUGIN_HPP_
diff --git a/Bundles/core/gui/include/gui/action/ActionNotifyService.hpp b/Bundles/core/gui/include/gui/action/ActionNotifyService.hpp
new file mode 100644
index 0000000..f180b10
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/ActionNotifyService.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_ACTIONNOTIFYSERVICE_HPP_
+#define _GUI_ACTION_ACTIONNOTIFYSERVICE_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+
+namespace gui
+{
+
+namespace action
+{
+
+class GUI_CLASS_API ActionNotifyService : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ActionNotifyService)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API ActionNotifyService() throw();
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~ActionNotifyService() throw();
+
+protected:
+
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    GUI_API void starting() throw(::fwTools::Failed);
+
+    GUI_API void stopping() throw(::fwTools::Failed);
+
+    GUI_API void updating()throw (fwTools::Failed);
+
+    GUI_API void receiving(::fwServices::ObjectMsg::csptr _msg )throw (::fwTools::Failed);
+
+    /**
+     * @brief Configure the message to send.
+     *
+     * Example of configuration :
+     * @verbatim
+        <service ... >
+            <notify type="::fwServices::ObjectMsg" event="APPLY" />
+        </service>
+       @endverbatim
+     * - \<notify\> :
+     *   - \b type : the type of the message (i.e. ::fwServices::ObjectMsg)
+     *   - \b event : the event of the message (i.e. "APPLY")
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    /// Message container [(MessageType, Event)]
+    typedef ::boost::tuple< std::string, std::string > MsgEventType;
+
+    /// Notify message vector
+    typedef std::vector < MsgEventType > MsgVectType;
+
+    MsgVectType  m_vectMsg;
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif // _GUI_ACTION_ACTIONNOTIFYSERVICE_HPP_
diff --git a/Bundles/core/gui/include/gui/action/ConfigActionSrv.hpp b/Bundles/core/gui/include/gui/action/ConfigActionSrv.hpp
new file mode 100644
index 0000000..3172467
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/ConfigActionSrv.hpp
@@ -0,0 +1,176 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_CONFIGACTIONSRV_HPP_
+#define _GUI_ACTION_CONFIGACTIONSRV_HPP_
+
+#include <fwCom/Signal.hpp>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @class   ConfigActionSrv
+ * @brief   To manage configuration file defines in xml extension.
+ * 
+ * @date    2010.
+ *
+ * This action starts/stops a template configuration given by its identifier in this action configuration.
+ *  - You can specified pattern to replace in the template configuration by the tag 'replace'.
+ *  - The pattern GENERIC_UID is replaced by a generated unique identifier when the configuration is launch.
+ *  This assure that the created object and services in the configuration have a unique uid even if this
+ *  configuration is launch several times.
+ *
+ * Example of this service configuration
+ * @verbatim
+   <service impl="::gui::action::ConfigActionSrv" type="::fwGui::IActionSrv">
+       <config id="IdOfTemplateConfig" />
+       <replace val="VALUE" pattern ="PATTERN_TO_REPLACE_BY_VALUE" />
+   </service>
+   @endverbatim
+ *
+ *
+ * Example of template configuration
+ * @verbatim
+   <extension implements="::fwServices::registry::AppConfig">
+       <id>Activity1Config</id>
+       <type>template</type>
+       <config>
+           <object uid="GENERIC_UID_myComposite" type="::fwData::Composite">
+               <service uid="GENERIC_UID_myService" type="..." impl="..." autoConnect="no" />
+               <item key="myImage">
+                   <object uid="PATTERN_TO_REPLACE_BY_VALUE" src="ref" type="::fwData::Image" />
+               </item>
+               <!-- ... -->
+           </object>
+       </config>
+   </extension>
+  @endverbatim
+ */
+class GUI_CLASS_API ConfigActionSrv : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ConfigActionSrv)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API ConfigActionSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~ConfigActionSrv() throw() ;
+
+    /// Set the action service is activated/inactivated.
+    GUI_API virtual void setIsActive(bool isActive);
+
+    // Launched signal key
+    GUI_API static const ::fwCom::Signals::SignalKeyType s_LAUNCHED_SIG;
+
+protected:
+
+    /**
+     * @name Defines signal triggered when config is started
+     * @{ */
+    typedef ::fwCom::Signal< void () > LaunchedSignalType;
+    LaunchedSignalType::sptr m_sigLaunched;
+    /**  @} */
+
+    ///This method launches the IAction::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IAction::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Management of observations ( overrides ).
+     *
+     * Stop configuration when it receives "WINDOW_CLOSED" event (ie. close the param view).
+     */
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Starts the view and initialize the operator.
+     */
+    virtual void updating() throw(::fwTools::Failed);
+
+
+    /**
+     * @brief Declare the configuration to associate with an operator type and a view config
+     *
+     * Call the IAction::configuring()
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::gui::action::ConfigActionSrv" type="::fwGui::IActionSrv">
+           <config id="IdOfTemplateConfig" />
+           <replace val="VALUE" pattern ="PATTERN_TO_REPLACE_BY_VALUE" />
+       </service>
+        @endverbatim
+      */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+    /**
+     * @brief Read the configuration and show the parameters view.
+     */
+    virtual void startConfig();
+
+    /**
+     * @brief Close the parameters view.
+     */
+    virtual void stopConfig();
+
+    /**
+     * @brief Add GENERIC_UID to field to adapt.
+     */
+    void AddGenericUidToFieldApadtor();
+
+
+    /// Id of plugin extension where the configuration is defined.
+    std::string m_viewConfigId;
+
+    /// to know if config is running
+    bool m_configIsRunning;
+
+    // config manager
+    ::fwServices::AppConfigManager::sptr m_configTemplateManager;
+    /**
+     * @brief keep the association between the PATTERN and the associated key  as fieldAdaptors[PATTERN] = AssociatedKey.
+     */
+    std::map< std::string, std::string > m_fieldAdaptors;
+
+    /// helper to connect tp config root
+    void connectToConfigRoot();
+
+    /// helper to disconnect tp config root
+    void disconnectToConfigRoot();
+
+    /// To manage connection to the config root
+    ::fwServices::helper::SigSlotConnection::sptr m_connections;
+};
+
+} //action
+} // GUI
+
+
+#endif // _GUI_ACTION_CONFIGACTIONSRV_HPP_
+
+
diff --git a/Bundles/core/gui/include/gui/action/ConfigActionSrvWithKey.hpp b/Bundles/core/gui/include/gui/action/ConfigActionSrvWithKey.hpp
new file mode 100644
index 0000000..a1f0bd3
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/ConfigActionSrvWithKey.hpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_CONFIGACTIONSRVWITHKEY_HPP_
+#define _GUI_ACTION_CONFIGACTIONSRVWITHKEY_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <gui/action/ConfigActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @class   ConfigActionSrvWithKey
+ * @brief   To manage configuration file defines in xml extension.
+ * 
+ * @date    2010.
+ *
+ * This action works on a ::fwData::Composite. It action starts/stops a template configuration given by its identifier in this action configuration.
+ *  - You can specified pattern to replace in the template configuration by the tag 'replace'.
+ *  - You can specified pattern to replace by the uid of the object contained by the composite with the given key
+ *  - The pattern GENERIC_UID is replaced by a generated unique identifier when the configuration is launch.
+ *  This assure that the created object and services in the configuration have a unique uid even if this
+ *  configuration is launch several times.
+ *
+ * Example of this service configuration
+ * @verbatim
+   <service impl="::gui::action::ConfigActionSrvWithKey" type="::fwGui::IActionSrv">
+       <config id="IdOfTemplateConfig" />
+       <replace val="VALUE" pattern="PATTERN_TO_REPLACE_BY_VALUE" />
+       <key id="KEY" pattern="PATTERN_TO_REPLACE_BY_UID_OF_KEY" />
+   </service>
+   @endverbatim
+ * @see ::gui::action::ConfigActionSrv
+ */
+class GUI_CLASS_API ConfigActionSrvWithKey : public ::gui::action::ConfigActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ConfigActionSrvWithKey)(::gui::action::ConfigActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API ConfigActionSrvWithKey() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~ConfigActionSrvWithKey() throw() ;
+
+protected:
+
+    ///This method launches the IAction::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IAction::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Management of observations ( overrides ).
+     *
+     * Stop configuration when it receives "WINDOW_CLOSED" event (ie. close the param view).
+     */
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Starts the view and initialize the operator.
+     */
+    virtual void updating() throw(::fwTools::Failed);
+
+
+    /**
+     * @brief Declare the configuration to associate with an operator type and a view config
+     *
+     * Call the IAction::configuring()
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::gui::action::ConfigActionSrvWithKey" type="::fwGui::IActionSrv">
+           <config id="IdOfTemplateConfig" />
+           <replace val="VALUE" pattern="PATTERN_TO_REPLACE_BY_VALUE" />
+           <key id="KEY" pattern="PATTERN_TO_REPLACE_BY_UID_OF_KEY" />
+       </service>
+        @endverbatim
+     * It MUST have at least one key node and at least one replace node.
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+
+    /**
+     * @brief Read the configuration and show the parameters view.
+     */
+    void startConfig();
+
+    /**
+     * @brief Close the parameters view.
+     */
+    void stopConfig();
+
+    typedef std::map< std::string, std::string > KeyAdaptorType;
+
+    /**
+     * @brief keep the association between the PATTERN and the associated key as m_keyAdaptors[PATTERN] = AssociatedKey.
+     */
+    KeyAdaptorType m_keyAdaptors;
+
+};
+
+} //action
+} // GUI
+
+
+#endif // _GUI_ACTION_CONFIGACTIONSRVWITHKEY_HPP_
+
+
diff --git a/Bundles/core/gui/include/gui/action/ModifyLayoutActionSrv.hpp b/Bundles/core/gui/include/gui/action/ModifyLayoutActionSrv.hpp
new file mode 100644
index 0000000..0e4dd55
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/ModifyLayoutActionSrv.hpp
@@ -0,0 +1,121 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_MOVELAYOUTACTIONSERVICE_HPP_
+#define _GUI_ACTION_MOVELAYOUTACTIONSERVICE_HPP_
+
+#include <boost/logic/tribool.hpp>
+
+#include <vector>
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief This action is used to modify the layout configuration.
+ * @class   ModifyLayoutActionSrv
+ */
+class GUI_CLASS_API ModifyLayoutActionSrv : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ModifyLayoutActionSrv)(::fwGui::IActionSrv) ) ;
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API ModifyLayoutActionSrv() throw();
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~ModifyLayoutActionSrv() throw();
+
+protected:
+
+    enum ActionType {
+        MOVE,
+        SHOW,
+        HIDE,
+        SHOW_OR_HIDE,
+        ENABLE,
+        DISABLE,
+        DO_NOTHING
+    };
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    /**
+     * @brief This method starts-updates or stops the specified services
+     */
+    GUI_API void updating()throw (fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which views to show/hide/mode.
+     *
+     * @verbatim
+     <config>
+         <move uid="srv_uid" wid="new_view_wid" />
+         <show wid="view_to_show" />
+         <hide wid="view_to_hide />
+         <show_or_hide wid="view_to_show_or_hide />
+         <enable uid="action_to_enabled" />
+         <disable uid="action_to_disabled" />
+     </config>
+       @endverbatim
+     * - \b move configures the services to move in the new view given by wid
+     * - \b show configures the view to show
+     * - \b hide configures the view to hide
+     * - \b show or hide configures the view to show or hide. If the action is activated, the view is shown else it is
+     * hidden. The action in the menu/toolbar must be checkable (style="check").
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+private:
+
+    /// < fwID, WIDContainer>
+    typedef std::vector< std::pair< std::string, std::string > > MoveSrvVectType;
+    /// map representing fwID's services and new associated wid parent container
+    MoveSrvVectType m_moveSrv;
+
+    /// < wid, showState>
+    typedef std::vector< std::pair< std::string, ::boost::logic::tribool > > ShowSrvVectType;
+    /// map representing wid container and show state
+    ShowSrvVectType m_showSrv;
+
+    /// < fwID, enableState>
+    typedef std::vector< std::pair< std::string, bool > > EnableSrvVectType;
+    /// map representing fwID's services and enable state
+    EnableSrvVectType m_enableSrv;
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif /*_GUI_ACTION_MOVELAYOUTACTIONSERVICE_HPP_*/
diff --git a/Bundles/core/gui/include/gui/action/Namespace.hpp b/Bundles/core/gui/include/gui/action/Namespace.hpp
new file mode 100644
index 0000000..9d35dfd
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIACTIONNAMESPACE_HPP_
+#define GUIACTIONNAMESPACE_HPP_
+
+#include "gui/GuiNamespaceDoc.hpp"
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::action contains basic services managing action.
+ * @namespace   gui::action
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace action
+{
+
+}
+}
+#endif /* GUIACTIONNAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/include/gui/action/NothingActionSrv.hpp b/Bundles/core/gui/include/gui/action/NothingActionSrv.hpp
new file mode 100644
index 0000000..fab0c4e
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/NothingActionSrv.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_NOTHINGACTION_HPP_
+#define _GUI_ACTION_NOTHINGACTION_HPP_
+
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief   This action does nothing.
+ * @class   NothingActionSrv
+ */
+class GUI_CLASS_API NothingActionSrv : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (NothingActionSrv)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API NothingActionSrv() throw() ;
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~NothingActionSrv() throw() ;
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief This method is used to configure the action.
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed ) ;
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Process the action. Do nothing.
+     */
+    GUI_API virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method gives information about the class.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    ///@}
+
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif /*_GUI_ACTION_NOTHINGACTION_HPP_*/
diff --git a/Bundles/core/gui/include/gui/action/PushObjectSrv.hpp b/Bundles/core/gui/include/gui/action/PushObjectSrv.hpp
new file mode 100644
index 0000000..fa97289
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/PushObjectSrv.hpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_PUSHOBJECTSRV_HPP_
+#define _GUI_ACTION_PUSHOBJECTSRV_HPP_
+
+#include <set>
+#include <map>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @class   PushObjectSrv
+ * @brief   To add or remove object in composite with specific key.
+ * 
+ * @date    2011.
+ */
+class GUI_CLASS_API PushObjectSrv : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (PushObjectSrv)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API PushObjectSrv() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~PushObjectSrv() throw() ;
+
+protected:
+
+
+    virtual void starting() throw(::fwTools::Failed);
+
+    virtual void stopping() throw(::fwTools::Failed);
+
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    virtual void updating() throw(::fwTools::Failed);
+
+
+    /**
+     * Call the IAction::configuring()
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::gui::action::PushObjectSrv" type="::fwGui::IActionSrv">
+           <push src="COMPOSITE_UID[KEY]" key="KEY_IN_COMPOSITE" />
+       </service>
+        @endverbatim
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+
+    // [src_map]->[(src_key1, src_key2, ...)]
+    typedef std::map< std::string, std::set< std::string > > SrcKeyMapType;
+    // [dest_key]->[<src_map, src_key>]
+    typedef std::map< std::string, std::pair< std::string, std::string > > DestKeyMapType;
+    /**
+     * @brief keep the association between associated key and source object
+     */
+    DestKeyMapType m_key2src;
+    SrcKeyMapType  m_srcMap;
+};
+
+} //action
+} // GUI
+
+
+#endif // _GUI_ACTION_PUSHOBJECTSRV_HPP_
+
+
diff --git a/Bundles/core/gui/include/gui/action/QuitAction.hpp b/Bundles/core/gui/include/gui/action/QuitAction.hpp
new file mode 100644
index 0000000..fa8acac
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/QuitAction.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_QUITACTION_HPP_
+#define _GUI_ACTION_QUITACTION_HPP_
+
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief   This action tries to close the window and reset root object.
+ * @class   QuitAction
+ */
+class GUI_CLASS_API QuitAction : public ::fwGui::IActionSrv
+{
+
+public :
+
+     fwCoreServiceClassDefinitionsMacro ( (QuitAction)(::fwGui::IActionSrv) ) ;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API QuitAction() throw() ;
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~QuitAction() throw() ;
+
+protected:
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which services must be started or stopped
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method tries to close the window and reset root object.
+     */
+    GUI_API virtual void updating() throw(::fwTools::Failed);
+
+    /*
+     * @brief This method gives information about the class.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif /*_GUI_ACTION_QUITACTION_HPP_*/
diff --git a/Bundles/core/gui/include/gui/action/SConfigLauncher.hpp b/Bundles/core/gui/include/gui/action/SConfigLauncher.hpp
new file mode 100644
index 0000000..e5f6793
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/SConfigLauncher.hpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_SCONFIGLAUNCHER_HPP_
+#define _GUI_ACTION_SCONFIGLAUNCHER_HPP_
+
+#include <fwCom/Signal.hpp>
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include <fwServices/helper/ConfigLauncher.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+
+/**
+ * @class   SConfigLauncher
+ * @brief   To manage configuration file defines in xml extension.
+ * @date    2013.
+ *
+ * This action works on a ::fwData::Composite. It action starts/stops an AppConfig given by its identifier in this action configuration.
+ *  - You can specified pattern to replace in the template configuration by the tag 'replace'.
+ *  - You can specified pattern to replace by the uid of the object contained by the composite with the given key
+ *  - The pattern GENERIC_UID is replaced by a generated unique identifier when the configuration is launch.
+ *  This assure that the created object and services in the configuration have a unique uid even if this
+ *  configuration is launch several times.
+ *
+ * Example of this service configuration
+ * @verbatim
+   <service impl="::gui::action::SConfigLauncher" type="::fwGui::IActionSrv">
+        <config>
+            <appConfig id="Visu2DID" >
+                <parameters>
+                    <parameter replace="SERIESDB" by="medicalData"  />
+                    <parameter replace="IMAGE" by="@values.image"  />
+                </parameters>
+            </appConfig>
+        </config>
+   </service>
+   @endverbatim
+ */
+class GUI_CLASS_API SConfigLauncher : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SConfigLauncher)(::fwGui::IActionSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API SConfigLauncher() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~SConfigLauncher() throw() ;
+
+    /// Set the action service is activated/disable.
+    GUI_API virtual void setIsActive(bool isActive);
+
+    // Launched signal key
+    GUI_API static const ::fwCom::Signals::SignalKeyType s_LAUNCHED_SIG;
+
+protected:
+
+    /**
+     * @name Defines signal triggered when config is started
+     * @{ */
+    typedef ::fwCom::Signal< void () > LaunchedSignalType;
+    LaunchedSignalType::sptr m_sigLaunched;
+    /**  @} */
+
+    ///This method launches the IAction::starting method.
+    virtual void starting() throw(::fwTools::Failed);
+
+    ///This method launches the IAction::stopping method.
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief Management of observations ( overrides ).
+     *
+     * Stop configuration when it receives "WINDOW_CLOSED" event (ie. close the param view).
+     */
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Starts the view and initialize the operator.
+     */
+    virtual void updating() throw(::fwTools::Failed);
+
+
+    /**
+     * @brief Declare the configuration to associate with an operator type and a view config
+     *
+     * Call the IAction::configuring()
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::gui::action::SConfigLauncher" type="::fwGui::IActionSrv">
+           <config>
+                <appConfig id="Visu2DID" >
+                    <parameters>
+                        <parameter replace="SERIESDB" by="medicalData"  />
+                        <parameter replace="IMAGE" by="@values.image"  />
+                    </parameters>
+                </appConfig>
+            </config>
+       </service>
+        @endverbatim
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+    ::fwServices::helper::ConfigLauncher::sptr m_configLauncher;
+};
+
+} // action
+} // gui
+
+
+#endif // _GUI_ACTION_SCONFIGLAUNCHER_HPP_
+
+
diff --git a/Bundles/core/gui/include/gui/action/SSignal.hpp b/Bundles/core/gui/include/gui/action/SSignal.hpp
new file mode 100644
index 0000000..e396f12
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/SSignal.hpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __GUI_ACTION_SSIGNAL_HPP__
+#define __GUI_ACTION_SSIGNAL_HPP__
+
+#include <vector>
+
+#include <fwCom/Slots.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include <fwCom/HasSignals.hpp>
+#include <fwCom/Signal.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief   Simple Signal service
+ * @class   SSignal
+ *
+ * Triggers a signal when the action is triggered.
+ * If the action uses a confirmation, different signals are emitted depending on the confirmation result.
+ */
+
+class GUI_CLASS_API SSignal : public ::fwGui::IActionSrv
+{
+
+public :
+
+    typedef std::vector< ::fwData::Object::sptr > ObjectVectorType;
+
+    fwCoreServiceClassDefinitionsMacro ( (SSignal)(::fwGui::IActionSrv) ) ;
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /// Type of triggered signal
+    typedef ::fwCom::Signal< void (ObjectVectorType) > TrigerredSignalType;
+
+    /// Type of setObject slot
+    typedef ::fwCom::Slot< void( ObjectVectorType ) >  SetObjectsSlotType;
+
+    /**
+     * @brief Constructor. Do nothing.
+     */
+    GUI_API SSignal() throw();
+
+    /**
+     * @brief Destructor. Do nothing.
+     */
+    GUI_API virtual ~SSignal() throw();
+
+protected:
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    /**
+     * @brief This method emit a signal.
+     */
+    GUI_API void updating()throw (fwTools::Failed);
+
+    /**
+     * @brief Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief Configures the service
+     *
+     @verbatim
+     <service uid="..." type="::fwGui::IActionSrv" impl="::gui::action::SSignal" autoConnect="no" />
+     @endverbatim
+     *
+     * See also ::fwGui::IActionSrv::configuring for more configuration parameters.
+     * @see IActionSrv::configuring
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief setObjects slot's method
+     */
+    virtual void setObjects( ObjectVectorType objects ) { m_objects = objects; }
+
+    ///Signal trigerred when action has been trigerred
+    SPTR(TrigerredSignalType) m_sigTriggered;
+    ///Signal trigerred when action has been cancelled
+    SPTR(TrigerredSignalType) m_sigCancelled;
+
+    /// setObject slot : save a vector of objects
+    SPTR(SetObjectsSlotType) m_slotSetObjects;
+
+    /// vector of objects passed to triggered signals
+    ObjectVectorType m_objects;
+
+};
+
+} // namespace action
+} // namespace gui
+
+
+#endif /* __GUI_ACTION_SSIGNAL_HPP__ */
+
diff --git a/Bundles/core/gui/include/gui/action/SSlotCaller.hpp b/Bundles/core/gui/include/gui/action/SSlotCaller.hpp
new file mode 100644
index 0000000..f36f23a
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/SSlotCaller.hpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_SSLOTCALLER_HPP_
+#define _GUI_ACTION_SSLOTCALLER_HPP_
+
+#include <vector>
+
+#include <fwCom/Slots.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief   Run a slot given by HasSlot id and slot key.
+ * @class   SSlotCaller
+ *
+ * This action works on a ::fwData::Object. It does the action specify by the specify config.
+ */
+
+class GUI_CLASS_API SSlotCaller : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SSlotCaller)(::fwGui::IActionSrv) ) ;
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    typedef std::string HasSlotIDType;
+    typedef std::pair< HasSlotIDType, ::fwCom::Slots::SlotKeyType> SlotInfoType;
+    typedef std::vector< SlotInfoType > SlotInfoContainerType;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API SSlotCaller() throw();
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~SSlotCaller() throw();
+
+protected:
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    /**
+     * @brief This method run the specified slots.
+     */
+    GUI_API void updating()throw (fwTools::Failed);
+
+    /**
+     * @brief Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which slots must be called.
+     * @verbatim
+       <service uid="..." type="::fwGui::IActionSrv" impl="::gui::action::SSlotCaller" autoConnect="no">
+          <slots>
+              <slot>hasSlotsId/slotKey</slot>
+          </slots>
+       </service>
+       @endverbatim
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+private:
+    // vector representing slots
+    SlotInfoContainerType m_slotInfos;
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif /*_GUI_ACTION_SSLOTCALLER_HPP_*/
diff --git a/Bundles/core/gui/include/gui/action/StarterActionService.hpp b/Bundles/core/gui/include/gui/action/StarterActionService.hpp
new file mode 100644
index 0000000..6aeade2
--- /dev/null
+++ b/Bundles/core/gui/include/gui/action/StarterActionService.hpp
@@ -0,0 +1,144 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_ACTION_STARTERACTIONSERVICE_HPP_
+#define _GUI_ACTION_STARTERACTIONSERVICE_HPP_
+
+#include <vector>
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IActionSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+/**
+ * @brief   Apply an action (start, stop, ...) on a service specify by uid.
+ * @class   StarterActionService
+ *
+ * This action works on a ::fwData::Object. It does the action specify by the specify config.
+ * This action can be :
+ *   - Start a service :
+ * @verbatim
+           <service uid="actionUid" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+              <start uid="Uid_of_the_service" />
+           </service>
+   @endverbatim
+ * If the service is stopped, the service specified by "Uid_of_the_service" is started and updated. Otherwise it is just updated.
+ *
+ *   - Start a service if exists :
+ * @verbatim
+           <service uid="actionUid" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+              <start_if_exists uid="Uid_of_the_service" />
+           </service>
+   @endverbatim
+ * Test if the service specified by "Uid_of_the_service" exists before starting it.
+ *
+ *   - Stop a service :
+ * @verbatim
+           <service uid="actionUid" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+              <stop uid="Uid_of_the_service" />
+           </service>
+   @endverbatim
+ *  If the service specified by "Uid_of_the_service" has been started, it is stopped. Otherwise, nothing appends.
+ *
+ *   - Stop a service if exists :  Test if the service exist before stopping it
+ * @verbatim
+           <service uid="actionUid" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+              <stop_if_exists uid="Uid_of_the_service" />
+           </service>
+   @endverbatim
+ *  Test if the service specified by "Uid_of_the_service" exists before stopping it.
+ *
+ *   - Start or stop the service:
+ * @verbatim
+           <service uid="actionUid" type="::fwGui::IActionSrv" impl="::gui::action::StarterActionService" autoConnect="no">
+              <start_or_stop uid="Uid_of_the_service" />
+           </service>
+   @endverbatim
+ * If the service is stopped, this works as start the service. If the service is started, this works as stop the service.
+ *
+ * To notice : when the starterActionService is stopped, it stops all the associated services which have been started by itself.
+ */
+
+class GUI_CLASS_API StarterActionService : public ::fwGui::IActionSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (StarterActionService)(::fwGui::IActionSrv) ) ;
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+    * @brief Constructor. Do nothing.
+    */
+    GUI_API StarterActionService() throw();
+
+    /**
+    * @brief Destructor. Do nothing.
+    */
+    GUI_API virtual ~StarterActionService() throw();
+
+protected:
+
+    enum ActionType {
+        START,
+        STOP,
+        START_OR_STOP,
+        START_IF_EXISTS,
+        STOP_IF_EXISTS,
+        DO_NOTHING
+    };
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    /**
+     * @brief This method starts-updates or stops the specified services
+     */
+    GUI_API void updating()throw (fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to configure the service parameters: specifies which services must be started or stopped
+     */
+    GUI_API void configuring() throw( ::fwTools::Failed );
+
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief Uninitialized the service activity.
+     * All services started by this action are stopped.
+     */
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+private:
+    typedef ::fwTools::fwID::IDType IDSrvType;
+    typedef std::pair< IDSrvType, ActionType > PairIDActionType;
+    typedef std::vector<PairIDActionType> VectPairIDActionType;
+    typedef std::set<IDSrvType> SetIDSrvType;
+
+    // vector representing uuid's services that must be started (true) or stopped (false)
+    VectPairIDActionType m_uuidServices;
+    SetIDSrvType m_idStartedSrvSet;
+};
+
+
+} // namespace action
+} // namespace gui
+
+
+#endif /*_GUI_ACTION_STARTERACTIONSERVICE_HPP_*/
diff --git a/Bundles/core/gui/include/gui/aspect/DefaultMenuBarSrv.hpp b/Bundles/core/gui/include/gui/aspect/DefaultMenuBarSrv.hpp
new file mode 100644
index 0000000..35576e9
--- /dev/null
+++ b/Bundles/core/gui/include/gui/aspect/DefaultMenuBarSrv.hpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUI_ASPECT_DEFAULTMENUBARSRV_HPP_
+#define GUI_ASPECT_DEFAULTMENUBARSRV_HPP_
+
+#include <fwGui/IMenuBarSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace aspect
+{
+
+/**
+ * @brief   Defines the default menubar for standard application
+ * @class   DefaultMenuBarSrv
+ */
+class GUI_CLASS_API DefaultMenuBarSrv : public ::fwGui::IMenuBarSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DefaultMenuBarSrv)(::fwGui::IMenuBarSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API DefaultMenuBarSrv() throw();
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~DefaultMenuBarSrv() throw();
+
+protected :
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Configuring method allows to configure an application with menu bar.
+     * Example of configuration
+     * @verbatim
+      <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+          <gui>
+              <layout>
+                  <menu name="My Menu"/>
+                  <menu name="My Menu 2"/>
+              </layout>
+          </gui>
+          <registry>
+              <menu sid="myMenu" start="yes" />
+              <menu sid="myMenu2" start="yes" />
+          </registry>
+      </service>
+       @endverbatim
+     *  - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
+     *  - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *   - sid of the menu services
+     *   - start or not the menu service automatically
+     *
+     * @warning
+     * - The number of item in the gui section must be equal or greater than in the registry section.
+     * - The order of the menu in each section (gui and registry) must be the same.\n
+     *   For example: the menu named "My Menu" will be connected with the service which have the sid = "myMenu".
+     * - A menu bar can't have the same service connected on two different menu.
+     *
+     *  @see ::fwGui::IMenuBarSrv::initialize(), ::fwGui::layoutManager::IMenuBarLayoutManager::initialize()
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief Create the menus and start the managed services.
+     * @see ::fwGui::IMenuBarSrv::create()
+     */
+    GUI_API virtual void starting() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief Stop all menu of this menuBar and destroy MenuBar
+     * @see ::fwGui::IMenuBarSrv::destroy()
+     */
+    GUI_API virtual void stopping() throw( ::fwTools::Failed ) ;
+
+    /// Updating service, do nothing.
+    GUI_API virtual void updating() throw(::fwTools::Failed);
+
+    /// Updating service on notification, do nothing.
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    ///@}
+};
+
+}
+
+}
+
+#endif // GUI_ASPECT_DEFAULTMENUBARSRV_HPP_
diff --git a/Bundles/core/gui/include/gui/aspect/DefaultMenuSrv.hpp b/Bundles/core/gui/include/gui/aspect/DefaultMenuSrv.hpp
new file mode 100644
index 0000000..084332c
--- /dev/null
+++ b/Bundles/core/gui/include/gui/aspect/DefaultMenuSrv.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUI_ASPECT_DEFAULTMENUSRV_HPP_
+#define GUI_ASPECT_DEFAULTMENUSRV_HPP_
+
+#include <fwGui/IMenuSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace aspect
+{
+
+/**
+ * @brief   Defines the default menu for standard application
+ * @class   DefaultMenuSrv
+ */
+class GUI_CLASS_API DefaultMenuSrv : public ::fwGui::IMenuSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DefaultMenuSrv)(::fwGui::IMenuSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API DefaultMenuSrv() throw();
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~DefaultMenuSrv() throw();
+
+protected :
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief Configuring method allows to configure a menu with several actions.
+
+     * Example of configuration
+     * @verbatim
+      <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+          <gui>
+              <layout>
+                  <menu name="My Menu"/>
+                  <menu name="My Menu 2"/>
+              </layout>
+          </gui>
+          <registry>
+              <menu sid="myMenu" start="yes" />
+              <menu sid="myMenu2" start="yes" />
+          </registry>
+      </service>
+       @endverbatim
+     *  - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
+     *    - <separator /> : allows to put a separator in the menu
+     *  - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *
+     * @warning
+     * - The number of item in the gui section must be equal or greater than in the registry section.
+     * - The order of the menu in each section (gui and registry) must be the same.\n
+     *   For example: the menu named "My Menu" will be connected with the service which have the sid = "myMenu".
+     * - A menu bar can't have the same service connected on two different menu.
+     *
+     *  @see ::fwGui::IMenuBarSrv::initialize(), ::fwGui::layoutManager::IMenuLayoutManager::initialize()
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief Create the menu items and start the managed services.
+     * @see ::fwGui::IMenuSrv::create()
+     */
+    GUI_API virtual void starting() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief Stop all actions and separator of this menu and remove menu to menuBar
+     * @see ::fwGui::IMenuSrv::destroy()
+     */
+    GUI_API virtual void stopping() throw( ::fwTools::Failed ) ;
+
+    /// Updating service, do nothing.
+    GUI_API virtual void updating() throw(::fwTools::Failed);
+
+    /// Updating service on notification, do nothing.
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+    ///@}
+
+};
+
+}
+
+}
+
+#endif // GUI_ASPECT_DEFAULTMENUSRV_HPP_
diff --git a/Bundles/core/gui/include/gui/aspect/DefaultToolBarSrv.hpp b/Bundles/core/gui/include/gui/aspect/DefaultToolBarSrv.hpp
new file mode 100644
index 0000000..e67d54c
--- /dev/null
+++ b/Bundles/core/gui/include/gui/aspect/DefaultToolBarSrv.hpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUI_DEFAULTTOOLBARSRV_HPP_
+#define GUI_DEFAULTTOOLBARSRV_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/IToolBarSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace aspect
+{
+
+/**
+ * @brief   Defines the default toolbar for standard application
+ * @class   DefaultToolBarSrv
+ */
+class GUI_CLASS_API DefaultToolBarSrv : public ::fwGui::IToolBarSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DefaultToolBarSrv)(::fwGui::IToolBarSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API DefaultToolBarSrv() throw();
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~DefaultToolBarSrv() throw();
+
+protected:
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief This method create a new ToolBar in frame.
+     */
+
+    /**
+     * @brief Create the toolBar
+     * @see ::fwGui::IToolBarSrv::create()
+     */
+    GUI_API virtual void starting() throw( ::fwTools::Failed ) ;
+
+    /**
+     * @brief This method remove the tools situated in the ToolBar.
+     * @see ::fwGui::IToolBarSrv::destroy()
+     */
+    GUI_API virtual void stopping() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services. Do nothing.
+     */
+    GUI_API virtual void updating() throw(::fwTools::Failed);
+
+    /**
+     * @brief Configuring method allows to create a toolBar with several actions.
+     *
+     * Example of configuration
+     * @verbatim
+       <service uid="toolbar2" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+           <gui>
+               <layout>
+                   <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <separator />
+                   <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <separator />
+                   <menu name="My menu" />
+                   <separator />
+                   <editor />
+               </layout>
+           </gui>
+           <registry>
+               <menuItem sid="item2" />
+               <menuItem sid="item3" />
+               <menuItem sid="item4" />
+               <menuItem sid="item5" />
+               <menu sid="menu" />
+               <editor sid="editor" />
+           </registry>
+       </service>
+       @endverbatim
+     *   - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
+     *   - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *     - \<menuItem\> represents IActionSrv
+     *     - \<menu\> represents IMenuSrv
+     *     - \<editor\> represents container service (IEditor, IView, ...)
+     *
+     *   @warning
+     *   - The number of item in the gui section must be EQUAL to the registry section.
+     *   - The order of the item in each section (gui and registry) must be the same.\n
+     *  For example: the item named "My item 2" will be connected with the service which have the sid = "item2".
+     *   - A toolbar can't have the same service connected on two different buttons.
+     *
+     *  @see ::fwGui::IToolBarSrv::initialize(), ::fwGui::layoutManager::IToolBarLayoutManager::initialize()
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /**
+     * @brief This method is used to give information about the service. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream );
+    ///@}
+
+};
+
+}
+
+}
+
+#endif // GUI_DEFAULTTOOLBARSRV_HPP_
diff --git a/Bundles/core/gui/include/gui/aspect/Namespace.hpp b/Bundles/core/gui/include/gui/aspect/Namespace.hpp
new file mode 100644
index 0000000..9543ee2
--- /dev/null
+++ b/Bundles/core/gui/include/gui/aspect/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIASPECTNAMESPACE_HPP_
+#define GUIASPECTNAMESPACE_HPP_
+
+#include "gui/GuiNamespaceDoc.hpp"
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::aspect contains basic services for basic widgets like menuBar, menu, toolBar....
+ * @namespace   gui::aspect
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace aspect
+{
+
+}
+}
+#endif /* GUIASPECTNAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/include/gui/editor/IDialogEditor.hpp b/Bundles/core/gui/include/gui/editor/IDialogEditor.hpp
new file mode 100644
index 0000000..c8c6b47
--- /dev/null
+++ b/Bundles/core/gui/include/gui/editor/IDialogEditor.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_EDITOR_IDIALOGEDITOR_HPP_
+#define _GUI_EDITOR_IDIALOGEDITOR_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IGuiContainerSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+/**
+ * @brief   Defines the service interface managing the editor service which create their own container.
+ * @class   IDialogEditor
+ */
+
+class GUI_CLASS_API IDialogEditor : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IDialogEditor)(::fwServices::IService) ) ;
+
+protected :
+
+    GUI_API IDialogEditor() throw() ;
+
+    GUI_API virtual ~IDialogEditor() throw() ;
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     *  @{
+     */
+
+    /**
+     * @brief This method is used to give information about the service. Do nothing.
+     * @todo Must be not implemented and class child declaration should be imposed.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    /// @}
+};
+
+}
+}
+
+#endif /*_GUI_EDITOR_IDIALOGEDITOR_HPP_*/
+
+
diff --git a/Bundles/core/gui/include/gui/editor/IEditor.hpp b/Bundles/core/gui/include/gui/editor/IEditor.hpp
new file mode 100644
index 0000000..bf4a8c8
--- /dev/null
+++ b/Bundles/core/gui/include/gui/editor/IEditor.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_EDITOR_IEDITOR_HPP_
+#define _GUI_EDITOR_IEDITOR_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IGuiContainerSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+/**
+ * @brief   Defines the service interface managing the editor service for object.
+ * @class   IEditor
+ */
+
+class GUI_CLASS_API IEditor : public ::fwGui::IGuiContainerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IEditor)(::fwGui::IGuiContainerSrv) ) ;
+
+protected :
+
+    /**
+     * @brief   Constructor. Do nothing (Just initialize parameters).
+     */
+    GUI_API IEditor() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~IEditor() throw() ;
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief This method is used to give information about the service. Do nothing.
+     * @todo Must be not implemented and class child declaration should be imposed.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+
+    ///@}
+
+};
+
+}
+}
+
+#endif /*_GUI_EDITOR_IEDITOR_HPP_*/
+
+
diff --git a/Bundles/core/gui/include/gui/editor/Namespace.hpp b/Bundles/core/gui/include/gui/editor/Namespace.hpp
new file mode 100644
index 0000000..226b3b0
--- /dev/null
+++ b/Bundles/core/gui/include/gui/editor/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIEDITORNAMESPACE_HPP_
+#define GUIEDITORNAMESPACE_HPP_
+
+#include "gui/GuiNamespaceDoc.hpp"
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::editor contains basic services managing editor.
+ * @namespace   gui::editor
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace editor
+{
+
+}
+}
+#endif /* GUIEDITORNAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/include/gui/export.hpp b/Bundles/core/gui/include/gui/export.hpp
new file mode 100644
index 0000000..ac91205
--- /dev/null
+++ b/Bundles/core/gui/include/gui/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_CONFIG_HPP_
+#define _GUI_CONFIG_HPP_
+
+
+#ifdef _WIN32
+    #pragma warning( disable : 4251 )
+
+
+    #ifdef GUI_EXPORTS
+    #define GUI_API __declspec(dllexport)
+    #else
+    #define GUI_API __declspec(dllimport)
+    #endif
+
+    #define GUI_CLASS_API
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef GUI_EXPORTS
+    #define GUI_API __attribute__ ((visibility("default")))
+    #define GUI_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define GUI_API __attribute__ ((visibility("hidden")))
+    #define GUI_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define GUI_API
+    #define GUI_CLASS_API
+
+#endif
+
+#endif // #ifndef _GUI_CONFIG_HPP_
diff --git a/Bundles/core/gui/include/gui/frame/DefaultFrame.hpp b/Bundles/core/gui/include/gui/frame/DefaultFrame.hpp
new file mode 100644
index 0000000..3a91b35
--- /dev/null
+++ b/Bundles/core/gui/include/gui/frame/DefaultFrame.hpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_FRAME_DEFAULT_FRAME_HPP_
+#define _GUI_FRAME_DEFAULT_FRAME_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwGui/IFrameSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace frame
+{
+
+/**
+ * @brief   Defines the default frame for standard application.
+ * @class   DefaultFrame
+ */
+class GUI_CLASS_API DefaultFrame : public ::fwGui::IFrameSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DefaultFrame)(::fwGui::IFrameSrv) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API DefaultFrame() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~DefaultFrame() throw() ;
+
+protected :
+
+    /** @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief This method is used to configure the class parameters.
+     * @see ::fwGui::IFrameSrv::initialize()
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /**
+     * @brief Register a view with defined id.
+     * @see ::fwGui::IFrameSrv::create()
+     */
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method remove the view in the frame.
+     * @see ::fwGui::IFrameSrv::destroy()
+     */
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method is used to update services. Do nothing.
+     */
+    GUI_API virtual void updating() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+    ///@}
+
+};
+
+
+} // namespace frame
+} // namespace gui
+
+
+#endif /*_GUI_FRAME_DEFAULT_FRAME_HPP_*/
diff --git a/Bundles/core/gui/include/gui/frame/Namespace.hpp b/Bundles/core/gui/include/gui/frame/Namespace.hpp
new file mode 100644
index 0000000..61eaa4e
--- /dev/null
+++ b/Bundles/core/gui/include/gui/frame/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIFRAMENAMESPACE_HPP_
+#define GUIFRAMENAMESPACE_HPP_
+
+#include "gui/GuiNamespaceDoc.hpp"
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::frame contains basic services managing frame.
+ * @namespace   gui::frame
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace frame
+{
+
+}
+}
+#endif /* GUIFRAMENAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/include/gui/view/DefaultView.hpp b/Bundles/core/gui/include/gui/view/DefaultView.hpp
new file mode 100644
index 0000000..e39d261
--- /dev/null
+++ b/Bundles/core/gui/include/gui/view/DefaultView.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_VIEW_DEFAULT_VIEW_HPP_
+#define _GUI_VIEW_DEFAULT_VIEW_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include "gui/view/IView.hpp"
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace view
+{
+
+/**
+ * @brief   Defines the generic layout for application.
+ * @class   DefaultView
+ * 
+
+ * @date    2009-2010.
+ */
+class GUI_CLASS_API DefaultView : public ::gui::view::IView
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (DefaultView)(::gui::view::IView) ) ;
+
+    /// Constructor. Do nothing.
+    GUI_API DefaultView() throw() ;
+
+    /// Destructor. Do nothing.
+    GUI_API virtual ~DefaultView() throw() ;
+
+protected :
+
+    /**
+     * @name Service methods ( override from ::fwServices::IService )
+     * @{
+     */
+
+    /**
+     * @brief This method is used to configure the class parameters.
+     * @see ::fwGui::IGuiContainerSrv::initialize()
+     */
+    GUI_API virtual void configuring() throw( ::fwTools::Failed );
+
+    /**
+     * @brief Register a view with defined id.
+     * @see ::fwGui::IGuiContainerSrv::create()
+     */
+    GUI_API virtual void starting() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method remove the view in the frame.
+     * @see ::fwGui::IGuiContainerSrv::destroy()
+     */
+    GUI_API virtual void stopping() throw(::fwTools::Failed);
+
+    /**
+     * @brief This method is used to update services on notification. Do nothing.
+     */
+    GUI_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method is used to update services. Do nothing.
+     */
+    GUI_API virtual void updating() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief This method gives information about the class. Do nothing.
+     */
+    GUI_API virtual void info(std::ostream &_sstream ) ;
+    ///@}
+
+};
+
+
+} // namespace view
+} // namespace gui
+
+
+#endif /*_GUI_VIEW_DEFAULT_VIEW_HPP_*/
diff --git a/Bundles/core/gui/include/gui/view/IView.hpp b/Bundles/core/gui/include/gui/view/IView.hpp
new file mode 100644
index 0000000..763da17
--- /dev/null
+++ b/Bundles/core/gui/include/gui/view/IView.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _GUI_VIEW_IVIEW_HPP_
+#define _GUI_VIEW_IVIEW_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IGuiContainerSrv.hpp>
+
+#include "gui/export.hpp"
+
+namespace gui
+{
+namespace view
+{
+
+/**
+ * @brief   Defines the service interface managing a view placed in main frame.
+ * @class   IView
+ *
+ */
+class GUI_CLASS_API IView : public ::fwGui::IGuiContainerSrv
+{
+
+public :
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (IView)(::fwGui::IGuiContainerSrv) ) ;
+
+protected:
+
+    /**
+    * @brief Constructor. Do nothing (Just initialize parameters).
+    */
+    GUI_API IView() throw() ;
+
+    /**
+     * @brief Destructor. Do nothing.
+     */
+    GUI_API virtual ~IView() throw() ;
+
+};
+
+
+
+} // namespace view
+} // namespace gui
+
+
+#endif /*_GUI_VIEW_IVIEW_HPP_*/
diff --git a/Bundles/core/gui/include/gui/view/Namespace.hpp b/Bundles/core/gui/include/gui/view/Namespace.hpp
new file mode 100644
index 0000000..60a8284
--- /dev/null
+++ b/Bundles/core/gui/include/gui/view/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef GUIVIEWNAMESPACE_HPP_
+#define GUIVIEWNAMESPACE_HPP_
+
+#include "gui/GuiNamespaceDoc.hpp"
+
+namespace gui
+{
+/**
+ * @brief       The namespace gui::view contains basic services managing view.
+ * @namespace   gui::view
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace view
+{
+
+}
+}
+#endif /* GUIVIEWNAMESPACE_HPP_ */
diff --git a/Bundles/core/gui/rc/plugin.xml b/Bundles/core/gui/rc/plugin.xml
new file mode 100644
index 0000000..65dce1c
--- /dev/null
+++ b/Bundles/core/gui/rc/plugin.xml
@@ -0,0 +1,104 @@
+<plugin class="::gui::Plugin" id="gui">
+
+    <library name="gui"/>
+
+    <requirement id="dataReg"/>
+    <requirement id="servicesReg"/>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IFrameSrv</type>
+        <service>::gui::frame::DefaultFrame</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IMenuSrv</type>
+        <service>::gui::aspect::DefaultMenuSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IMenuBarSrv</type>
+        <service>::gui::aspect::DefaultMenuBarSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::gui::view::IView</type>
+        <service>::gui::view::DefaultView</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::NothingActionSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::QuitAction</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::StarterActionService</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::SSlotCaller</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IToolBarSrv</type>
+        <service>::gui::aspect::DefaultToolBarSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::ConfigActionSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::ConfigActionSrvWithKey</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::SConfigLauncher</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::ModifyLayoutActionSrv</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::ActionNotifyService</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::PushObjectSrv</service>
+        <object>::fwData::Composite</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwGui::IActionSrv</type>
+        <service>::gui::action::SSignal</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/core/gui/rc/xml.xsd b/Bundles/core/gui/rc/xml.xsd
new file mode 100644
index 0000000..ac2c920
--- /dev/null
+++ b/Bundles/core/gui/rc/xml.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd">
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+
+    This schema document describes the XML namespace, in a form
+    suitable for import by other schema documents.  
+
+    Note that local names in this namespace are intended to be defined
+    only by the World Wide Web Consortium or its subgroups.  The
+    following names are currently defined in this namespace and should
+    not be used with conflicting semantics by any Working Group,
+    specification, or document instance:
+
+    base (as an attribute name): denotes an attribute whose value
+         provides a URI to be used as the base for interpreting any
+         relative URIs in the scope of the element on which it
+         appears; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML Base specification.
+
+    lang (as an attribute name): denotes an attribute whose value
+         is a language code for the natural language of the content of
+         any element; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML specification.
+  
+    space (as an attribute name): denotes an attribute whose
+         value is a keyword indicating what whitespace processing
+         discipline is intended for the content of the element; its
+         value is inherited.  This name is reserved by virtue of its
+         definition in the XML specification.
+
+    Father (in any context at all): denotes Jon Bosak, the chair of 
+         the original XML Working Group.  This name is reserved by 
+         the following decision of the W3C XML Plenary and 
+         XML Coordination groups:
+
+             In appreciation for his vision, leadership and dedication
+             the W3C XML Plenary on this 10th day of February, 2000
+             reserves for Jon Bosak in perpetuity the XML name
+             xml:Father
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang or xml:space attributes
+        on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        <schema . . .>
+         . . .
+         <import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        <type . . .>
+         . . .
+         <attributeGroup ref="xml:specialAttrs"/>
+ 
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2001/03/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself.  In other words, if the XML Schema namespace changes, the version
+   of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2001/03/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang" type="xs:language">
+  <xs:annotation>
+   <xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values . . .</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="space" default="preserve">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
\ No newline at end of file
diff --git a/Bundles/core/gui/src/gui/Plugin.cpp b/Bundles/core/gui/src/gui/Plugin.cpp
new file mode 100644
index 0000000..69e3d83
--- /dev/null
+++ b/Bundles/core/gui/src/gui/Plugin.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "gui/Plugin.hpp"
+
+namespace gui
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::gui::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+} // namespace gui
diff --git a/Bundles/core/gui/src/gui/action/ActionNotifyService.cpp b/Bundles/core/gui/src/gui/action/ActionNotifyService.cpp
new file mode 100644
index 0000000..7c1c2b9
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/ActionNotifyService.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "gui/action/ActionNotifyService.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+//-----------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::gui::action::ActionNotifyService , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+ActionNotifyService::ActionNotifyService() throw()
+{
+    //handlingEventOff();
+}
+
+//-----------------------------------------------------------------------------
+
+ActionNotifyService::~ActionNotifyService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::info(std::ostream &_sstream )
+{
+    _sstream << "NotifyService Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::updating() throw( ::fwTools::Failed )
+{
+    if (this->confirmAction())
+    {
+        BOOST_FOREACH(MsgEventType msg, m_vectMsg)
+        {
+            const std::string msgType = msg.get<0>();
+            const std::string event   = msg.get<1>();
+            ::fwServices::ObjectMsg::sptr objectMsg = ::fwServices::factory::message::New(msgType);
+            OSLM_ASSERT(msgType << " creation failed", objectMsg);
+
+            ::fwData::Object::sptr srvObj = this->getObject();
+            objectMsg->addEvent( event );
+            ::fwServices::IEditionService::notify(this->getSptr(), srvObj, objectMsg);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionNotifyService::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+
+    m_vectMsg.clear();
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > notify = m_configuration->find("notify");
+    SLM_ASSERT("Problem with configuration for ActionNotifyService, missing element \"notify\"", !notify.empty() );
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr msgConfig, notify)
+    {
+        SLM_ASSERT("Missing attribute type", msgConfig->hasAttribute("type"));
+        std::string type = msgConfig->getAttributeValue("type");
+        SLM_ASSERT("Missing attribute event", msgConfig->hasAttribute("event"));
+        std::string event = msgConfig->getAttributeValue("event");
+        MsgEventType msg (type, event);
+        m_vectMsg.push_back( msg );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
diff --git a/Bundles/core/gui/src/gui/action/ConfigActionSrv.cpp b/Bundles/core/gui/src/gui/action/ConfigActionSrv.cpp
new file mode 100644
index 0000000..77e5d65
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/ConfigActionSrv.cpp
@@ -0,0 +1,203 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/regex.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include "gui/action/ConfigActionSrv.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::gui::action::ConfigActionSrv, ::fwData::Object );
+const ::fwCom::Signals::SignalKeyType  ConfigActionSrv::s_LAUNCHED_SIG = "launched";
+
+//------------------------------------------------------------------------------
+
+ConfigActionSrv::ConfigActionSrv() throw() :
+    m_viewConfigId(""),
+    m_configIsRunning(false),
+    m_sigLaunched(LaunchedSignalType::New())
+{
+    //addNewHandledEvent("WINDOW_CLOSED");
+    ::fwCom::HasSignals::m_signals( s_LAUNCHED_SIG, m_sigLaunched );
+
+#ifdef COM_LOG
+    m_sigLaunched->setID( s_LAUNCHED_SIG );
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+ConfigActionSrv::~ConfigActionSrv() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    m_connections = ::fwServices::helper::SigSlotConnection::New();
+    this->::fwGui::IActionSrv::actionServiceStarting();
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    bool configIsRunning = this->::fwGui::IActionSrv::getIsActive();
+
+    if ( configIsRunning )
+    {
+        this->stopConfig();
+    }
+
+    m_connections.reset();
+    this->::fwGui::IActionSrv::actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->::fwGui::IActionSrv::initialize();
+
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+
+    SLM_ASSERT("Sorry you must have one (and only one) <config id=... /> element.", vectConfig.size() == 1 );
+    ::fwRuntime::ConfigurationElement::sptr configElement = vectConfig.at(0);
+
+    SLM_ASSERT( "Sorry, missing attribute id in <config> xml element.", configElement->hasAttribute("id") );
+    m_viewConfigId = configElement->getExistingAttributeValue("id");
+
+    SLM_ASSERT( "Sorry, the attribute id in <config> xml element is empty.", ! m_viewConfigId.empty() );
+
+    std::vector < ConfigurationType > replaceTagsConfig = m_configuration->find("replace");
+    std::string adaptor("");
+    std::string pattern("");
+    BOOST_FOREACH( ConfigurationType replaceItem, replaceTagsConfig)
+    {
+        SLM_ASSERT("<replace> tag must have one attribut val.", replaceItem->hasAttribute("val"));
+        adaptor = replaceItem->getAttributeValue("val");
+        SLM_ASSERT("<replace> tag must have one attribut pattern.", replaceItem->hasAttribute("pattern"));
+        pattern = replaceItem->getAttributeValue("pattern");
+        m_fieldAdaptors[pattern] = adaptor;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ConfigActionSrv::setIsActive(bool isActive)
+{
+    this->::fwGui::IActionSrv::setIsActive(isActive);
+    if ( isActive )
+    {
+        this->startConfig();
+    }
+    else
+    {
+        this->stopConfig();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::updating() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    if ( _msg->hasEvent("WINDOW_CLOSED") )
+    {
+        this->::fwGui::IActionSrv::setIsActive( false );
+        this->stopConfig();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::info( std::ostream &_sstream )
+{}
+
+//------------------------------------------------------------------------------
+void ConfigActionSrv::AddGenericUidToFieldApadtor( )
+{
+    // Generate generic UID
+    std::string genericUidAdaptor = ::fwServices::registry::AppConfig::getUniqueIdentifier( this->getID() );
+
+    // Init manager
+    m_fieldAdaptors["GENERIC_UID"] = genericUidAdaptor;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::startConfig()
+{
+    AddGenericUidToFieldApadtor();
+
+    ::fwRuntime::ConfigurationElement::csptr config = ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( m_viewConfigId, m_fieldAdaptors );
+    m_configTemplateManager = ::fwServices::AppConfigManager::New();
+    m_configTemplateManager->setConfig( config );
+
+
+    // Launch config
+    m_configTemplateManager->launch();
+
+    // Add connection
+    this->connectToConfigRoot();
+
+    m_configIsRunning = true;
+    fwServicesNotifyMacro(this->getLightID(), m_sigLaunched, ());
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::stopConfig()
+{
+    if( m_configIsRunning )
+    {
+        // Remove connection
+        this->disconnectToConfigRoot();
+
+        // Delete manager
+        m_configTemplateManager->stopAndDestroy();
+        m_configTemplateManager.reset();
+    }
+    m_configIsRunning = false;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::connectToConfigRoot()
+{
+    ::fwData::Object::sptr root = m_configTemplateManager->getConfigRoot();
+    m_connections->connect( root, this->getSptr(), this->getObjSrvConnections() );
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrv::disconnectToConfigRoot()
+{
+    m_connections->disconnect();
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/action/ConfigActionSrvWithKey.cpp b/Bundles/core/gui/src/gui/action/ConfigActionSrvWithKey.cpp
new file mode 100644
index 0000000..45fa3cb
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/ConfigActionSrvWithKey.cpp
@@ -0,0 +1,238 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwData/Composite.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+
+#include "gui/action/ConfigActionSrvWithKey.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::gui::action::ConfigActionSrvWithKey, ::fwData::Object );
+
+//------------------------------------------------------------------------------
+
+ConfigActionSrvWithKey::ConfigActionSrvWithKey() throw()
+{
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS );
+    //addNewHandledEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS );
+}
+
+//------------------------------------------------------------------------------
+
+ConfigActionSrvWithKey::~ConfigActionSrvWithKey() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->::gui::action::ConfigActionSrv::starting();
+
+    bool executable = true;
+
+    ::fwData::Object::sptr obj = this->getObject();
+    ::fwData::Composite::sptr composite = ::fwData::Composite::dynamicCast( obj );
+    if( composite )
+    {
+        BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+        {
+            if ( elem.second != "self" )
+            {
+                executable &= (composite->find(elem.second)!= composite->end());
+            }
+        }
+    }
+    else
+    {
+        BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+        {
+            if ( elem.second != "self" )
+            {
+                executable &= (obj->getFields().find(elem.second)!= obj->getFields().end());
+            }
+        }
+    }
+
+    this->::fwGui::IActionSrv::setIsExecutable( executable );
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::gui::action::ConfigActionSrv::stopping();
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->::gui::action::ConfigActionSrv::configuring();
+
+    std::vector < ConfigurationType > keyTagsConfig = m_configuration->find("key");
+    SLM_ASSERT("::gui::action::ConfigActionSrv must have at least  one tag <key>", !keyTagsConfig.empty());
+    if(!keyTagsConfig.empty())
+    {
+        std::string adaptor("");
+        std::string pattern("");
+        BOOST_FOREACH( ConfigurationType keyItem, keyTagsConfig)
+        {
+            SLM_ASSERT("<key> tag must have one attribut val.", keyItem->hasAttribute("id"));
+            adaptor = keyItem->getAttributeValue("id");
+            SLM_ASSERT("<key> tag must have one attribut pattern.", keyItem->hasAttribute("pattern"));
+            pattern = keyItem->getAttributeValue("pattern");
+            m_keyAdaptors[pattern] = adaptor;
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::updating() throw(::fwTools::Failed)
+{
+    this->::gui::action::ConfigActionSrv::updating();
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    this->::gui::action::ConfigActionSrv::receiving(_msg);
+
+    bool executable = true;
+
+    ::fwData::Object::sptr obj = this->getObject();
+    ::fwData::Composite::sptr composite = ::fwData::Composite::dynamicCast( obj );
+    if( composite )
+    {
+        if ( _msg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) ||
+             _msg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS )  )
+        {
+            BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+            {
+                if ( elem.second != "self" )
+                {
+                    executable &= (composite->find(elem.second)!= composite->end());
+                }
+            }
+            this->::fwGui::IActionSrv::setIsExecutable( executable );
+        }
+    }
+    else
+    {
+        if ( _msg->hasEvent( ::fwServices::ObjectMsg::ADDED_FIELDS ) ||
+             _msg->hasEvent( ::fwServices::ObjectMsg::REMOVED_FIELDS ) )
+        {
+            BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+            {
+                if ( elem.second != "self" )
+                {
+                    executable &= (composite->find(elem.second)!= composite->end());
+                }
+            }
+            this->::fwGui::IActionSrv::setIsExecutable( executable );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::startConfig()
+{
+    AddGenericUidToFieldApadtor();
+    std::map< std::string, std::string > finalMap;
+    finalMap = m_fieldAdaptors;
+
+    ::fwData::Object::sptr obj = this->getObject();
+    ::fwData::Composite::sptr composite = ::fwData::Composite::dynamicCast( obj );
+    if( composite )
+    {
+        BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+        {
+            std::string key = elem.second;
+            if ( key == "self" )
+            {
+                finalMap[elem.first] = composite->getID();
+            }
+            else
+            {
+                finalMap[elem.first] = (*composite)[key]->getID();
+            }
+        }
+    }
+    else
+    {
+        BOOST_FOREACH( const KeyAdaptorType::value_type& elem, m_keyAdaptors )
+        {
+            std::string key = elem.second;
+            if ( key == "self" )
+            {
+                finalMap[elem.first] = obj->getID();
+            }
+            else
+            {
+                finalMap[elem.first] = obj->getField(key)->getID();
+            }
+        }
+    }
+
+    // Init manager
+    ::fwRuntime::ConfigurationElement::csptr config =
+            ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( m_viewConfigId, finalMap );
+    m_configTemplateManager = ::fwServices::AppConfigManager::New();
+    m_configTemplateManager->setConfig( config );
+
+    // Launch config
+    m_configTemplateManager->launch();
+
+    // Add connection
+    this->connectToConfigRoot();
+
+    m_configIsRunning = true;
+
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigActionSrvWithKey::stopConfig()
+{
+    if( m_configIsRunning )
+    {
+        // Remove com channel
+        this->disconnectToConfigRoot();
+
+        // Delete manager
+        m_configTemplateManager->stopAndDestroy();
+        m_configTemplateManager.reset();
+    }
+    m_configIsRunning = false;
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/action/ModifyLayoutActionSrv.cpp b/Bundles/core/gui/src/gui/action/ModifyLayoutActionSrv.cpp
new file mode 100644
index 0000000..9a8bf41
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/ModifyLayoutActionSrv.cpp
@@ -0,0 +1,199 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+#include <fwGui/GuiRegistry.hpp>
+#include <fwGui/IGuiContainerSrv.hpp>
+
+#include "gui/action/ModifyLayoutActionSrv.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::ModifyLayoutActionSrv , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+ModifyLayoutActionSrv::ModifyLayoutActionSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+ModifyLayoutActionSrv::~ModifyLayoutActionSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::info(std::ostream &_sstream )
+{
+    _sstream << "Starter Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+
+    BOOST_FOREACH(MoveSrvVectType::value_type elt, m_moveSrv )
+    {
+        std::string uid = elt.first;
+        std::string wid = elt.second;
+        OSLM_ASSERT( uid << " doesn't exist", ::fwTools::fwID::exist(uid) );
+        ::fwServices::IService::sptr service = ::fwServices::get( uid ) ;
+        SLM_ASSERT("service not found", service);
+        ::fwGui::IGuiContainerSrv::sptr container = ::fwGui::IGuiContainerSrv::dynamicCast(service);
+        SLM_ASSERT("::fwGui::IGuiContainerSrv dynamicCast failed", container);
+
+        container->setParent(wid);
+        service->update();
+    }
+
+    BOOST_FOREACH(EnableSrvVectType::value_type elt, m_enableSrv )
+    {
+        std::string uid = elt.first;
+        bool isEnable = elt.second;
+        OSLM_ASSERT( uid << " doesn't exist", ::fwTools::fwID::exist(uid) );
+        ::fwServices::IService::sptr service = ::fwServices::get( uid ) ;
+        SLM_ASSERT("service not found", service);
+        if(service->isStarted())
+        {
+//            //todo : add methods to enable/disable IGuiContainerSrv, IMenuSrv, IMenuBarSrv and IToolBarSrv
+//            ::fwGui::IGuiContainerSrv::sptr containerSrv = ::fwGui::IGuiContainerSrv::dynamicCast(service);
+//            if(containerSrv)
+//            {
+//                container->getContainer()->setEnable(isEnable);
+//            }
+            ::fwGui::IActionSrv::sptr actionSrv = ::fwGui::IActionSrv::dynamicCast(service);
+            if(actionSrv)
+            {
+                actionSrv->setIsExecutable(isEnable);
+            }
+        }
+    }
+
+    BOOST_FOREACH(ShowSrvVectType::value_type elt, m_showSrv)
+    {
+        std::string wid = elt.first;
+        ::boost::logic::tribool isVisible = elt.second;
+        ::fwGui::container::fwContainer::sptr container = ::fwGui::GuiRegistry::getWIDContainer(wid);
+        OSLM_ASSERT("::fwGui::IGuiContainerSrv " << wid << " is unknown", container);
+
+        if(isVisible)
+        {
+            container->setVisible(true);
+        }
+        else if(!isVisible)
+        {
+            container->setVisible(false);
+        }
+        else
+        {
+            container->setVisible(this->getIsActive());
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void ModifyLayoutActionSrv::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+    std::vector < ConfigurationType > vectConfig = m_configuration->find("config");
+    if( ! vectConfig.empty() )
+    {
+        ConfigurationType config = vectConfig.at(0);
+        BOOST_FOREACH(ConfigurationType actionCfg, config->getElements() )
+        {
+            if(actionCfg->getName() == "move")
+            {
+                SLM_ASSERT("Attribute uid missing", actionCfg->hasAttribute("uid")) ;
+                std::string uuid = actionCfg->getExistingAttributeValue("uid") ;
+                SLM_ASSERT("Attribute wid missing", actionCfg->hasAttribute("wid")) ;
+                std::string wid = actionCfg->getExistingAttributeValue("wid") ;
+
+                m_moveSrv.push_back( std::make_pair(uuid, wid) );
+            }
+            else if(actionCfg->getName() == "show"
+                    || actionCfg->getName() == "hide"
+                    || actionCfg->getName() == "show_or_hide")
+            {
+                SLM_ASSERT("Attribute wid missing", actionCfg->hasAttribute("wid")) ;
+                std::string wid = actionCfg->getExistingAttributeValue("wid") ;
+                ::boost::logic::tribool isVisible;
+                if (actionCfg->getName() == "show")
+                {
+                    isVisible = true;
+                }
+                else if (actionCfg->getName() == "hide")
+                {
+                    isVisible = false;
+                }
+                else
+                {
+                    isVisible = ::boost::logic::indeterminate;
+                }
+                m_showSrv.push_back( std::make_pair(wid, isVisible) );
+            }
+            else if(actionCfg->getName() == "enable" || actionCfg->getName() == "disable")
+            {
+                SLM_ASSERT("Attribute uid missing", actionCfg->hasAttribute("uid")) ;
+                std::string uuid = actionCfg->getExistingAttributeValue("uid") ;
+                bool isEnable = (actionCfg->getName() == "enable");
+
+                m_enableSrv.push_back( std::make_pair(uuid, isEnable) );
+            }
+            else
+            {
+                OSLM_FATAL( "Invalid tag name "<<actionCfg->getName());
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace action
+} // namespace gui
+
diff --git a/Bundles/core/gui/src/gui/action/NothingActionSrv.cpp b/Bundles/core/gui/src/gui/action/NothingActionSrv.cpp
new file mode 100644
index 0000000..ac376fe
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/NothingActionSrv.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+
+#include "gui/action/NothingActionSrv.hpp"
+
+namespace gui
+{
+namespace action
+{
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::NothingActionSrv , ::fwData::Object ) ;
+
+
+NothingActionSrv::NothingActionSrv() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+NothingActionSrv::~NothingActionSrv() throw()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void NothingActionSrv::info(std::ostream &_sstream )
+{
+    _sstream << "Nothing Action" << std::endl;
+}
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/action/PushObjectSrv.cpp b/Bundles/core/gui/src/gui/action/PushObjectSrv.cpp
new file mode 100644
index 0000000..0c4e1fa
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/PushObjectSrv.cpp
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/regex.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwData/Composite.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/helper/Composite.hpp>
+
+#include "gui/action/PushObjectSrv.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::gui::action::PushObjectSrv, ::fwData::Composite );
+
+//------------------------------------------------------------------------------
+
+PushObjectSrv::PushObjectSrv() throw()
+{
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::ADDED_KEYS );
+//    addNewHandledEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS );
+}
+
+//------------------------------------------------------------------------------
+
+PushObjectSrv::~PushObjectSrv() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+    bool executable = true;
+    std::string src_uid;
+    BOOST_FOREACH(const SrcKeyMapType::value_type& valElt, m_srcMap )
+    {
+        src_uid = valElt.first;
+        SLM_TRACE("start check : " + src_uid );
+        OSLM_ASSERT( src_uid << " doesn't exist", ::fwTools::fwID::exist(src_uid) );
+        ::fwData::Composite::sptr composite_src = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject( src_uid ) );
+        OSLM_ASSERT("fwData::Composite dynamicCast failed for "<<src_uid, composite_src);
+        BOOST_FOREACH(SrcKeyMapType::key_type keyElt, valElt.second )
+        {
+            executable &= (composite_src->find(keyElt)!= composite_src->end());
+            OSLM_TRACE("start check : " << src_uid << "[" << keyElt << "] : " <<(composite_src->find(keyElt)!= composite_src->end()) );
+        }
+    }
+    this->::fwGui::IActionSrv::setIsExecutable( executable );
+}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::configuring() throw( ::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+
+    std::vector < ConfigurationType > pushConfig = m_configuration->find("push","","",3);
+    std::string src, src_uid, src_key, key;
+    ::boost::regex re("(.*)\\[(.*)\\]");
+    ::boost::smatch match;
+    BOOST_FOREACH( ConfigurationType pushItem, pushConfig)
+    {
+        SLM_ASSERT("<push> tag must have one attribute key.", pushItem->hasAttribute("key"));
+        key = pushItem->getAttributeValue("key");
+        SLM_ASSERT("<push> tag must have one attribute src.", pushItem->hasAttribute("src"));
+        src = pushItem->getAttributeValue("src");
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            src_uid.assign(match[1].first, match[1].second);
+            src_key.assign(match[2].first, match[2].second);
+            m_key2src[key] = std::make_pair(src_uid, src_key);
+            m_srcMap[src_uid].insert(src_key);
+            SLM_TRACE("Add " + src_uid + "[" + src_key + "]");
+        }
+        else
+        {
+            OSLM_FATAL("The regexp \"" << re << "\" does not match \"" << src << "\"");
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::updating() throw(::fwTools::Failed)
+{
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >();
+    ::boost::shared_ptr< ::fwComEd::helper::Composite > compositeHelper ( new ::fwComEd::helper::Composite( composite ) );
+
+    std::string src_uid("");
+    std::string src_key("");
+    std::string key("");
+    BOOST_FOREACH(DestKeyMapType::value_type elt, m_key2src )
+    {
+        key = elt.first;
+        src_uid = elt.second.first;
+        src_key = elt.second.second;
+        OSLM_ASSERT( src_uid << " doesn't exist", ::fwTools::fwID::exist(src_uid) );
+        ::fwData::Composite::sptr composite_src = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject( src_uid ) );
+        OSLM_ASSERT("fwData::Composite dynamicCast failed for "<<src_uid, composite_src);
+
+
+        ::fwData::Composite::const_iterator iter = composite_src->find(src_key);
+
+        OSLM_WARN_IF("'" << src_key << "' not found in composite '" << src_uid << "'" ,iter == composite_src->end());
+        if (iter != composite_src->end())
+        {
+            ::fwData::Object::sptr obj = composite_src->getContainer()[src_key];
+
+            if ( composite->find(key) != composite->end() )
+            {
+                compositeHelper->remove(key);
+            }
+            else
+            {
+                compositeHelper->add(key, obj);
+            }
+        }
+    }
+    // Notification of message
+    compositeHelper->notify( this->getSptr() );
+}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    bool executable = !m_srcMap.empty();
+    ::fwData::Object::sptr subject = msg->getSubject().lock();
+
+    std::string src_uid;
+    BOOST_FOREACH(const SrcKeyMapType::value_type& valElt, m_srcMap )
+    {
+        src_uid = valElt.first;
+        SLM_TRACE("check : " + src_uid);
+        if( src_uid == subject->getID() &&
+                ( msg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) ||
+                  msg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS))  )
+        {
+            ::fwData::Composite::sptr composite_src = ::fwData::Composite::dynamicCast( subject );
+            OSLM_ASSERT("fwData::Composite dynamicCast failed for "<<src_uid, composite_src);
+            BOOST_FOREACH(SrcKeyMapType::key_type keyElt, valElt.second )
+            {
+                executable &= (composite_src->find(keyElt)!= composite_src->end());
+                OSLM_TRACE("check : " << src_uid << "[" << keyElt << "] : " << (composite_src->find(keyElt)!= composite_src->end()) );
+            }
+        }
+    }
+    this->setIsExecutable( executable );
+
+    //TODO managed active mode (objects already present in target composite)
+}
+
+//------------------------------------------------------------------------------
+
+void PushObjectSrv::info( std::ostream &_sstream )
+{}
+
+//------------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/action/QuitAction.cpp b/Bundles/core/gui/src/gui/action/QuitAction.cpp
new file mode 100644
index 0000000..08ea0f7
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/QuitAction.cpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include <fwGui/Application.hpp>
+#include <fwGui/Cursor.hpp>
+
+#include "gui/action/QuitAction.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::QuitAction , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+QuitAction::QuitAction() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+QuitAction::~QuitAction() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::info(std::ostream &_sstream )
+{
+    _sstream << "Quit Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void QuitAction::updating() throw( ::fwTools::Failed )
+{
+    ::fwGui::Cursor cursor;
+    cursor.setCursor(::fwGui::ICursor::BUSY);
+    ::fwGui::Application::New()->exit(0);
+    cursor.setDefaultCursor();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
diff --git a/Bundles/core/gui/src/gui/action/SConfigLauncher.cpp b/Bundles/core/gui/src/gui/action/SConfigLauncher.cpp
new file mode 100644
index 0000000..99f7af7
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/SConfigLauncher.cpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include "gui/action/SConfigLauncher.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv, ::gui::action::SConfigLauncher, ::fwData::Object );
+
+const ::fwCom::Signals::SignalKeyType SConfigLauncher::s_LAUNCHED_SIG = "launched";
+
+//------------------------------------------------------------------------------
+
+SConfigLauncher::SConfigLauncher() throw() :
+    m_sigLaunched(LaunchedSignalType::New())
+{
+    m_configLauncher = ::fwServices::helper::ConfigLauncher::New();
+
+    ::fwCom::HasSignals::m_signals( s_LAUNCHED_SIG, m_sigLaunched );
+
+#ifdef COM_LOG
+    m_sigLaunched->setID( s_LAUNCHED_SIG );
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+SConfigLauncher::~SConfigLauncher() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::starting() throw(::fwTools::Failed)
+{
+    this->actionServiceStarting();
+    ::fwData::Object::sptr currentObj = this->getObject();
+    bool executable = m_configLauncher->isExecutable(currentObj);
+    this->setIsExecutable( executable );
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::stopping() throw(::fwTools::Failed)
+{
+    bool configIsRunning = this->getIsActive();
+    if ( configIsRunning )
+    {
+        m_configLauncher->stopConfig();
+    }
+    this->actionServiceStopping();
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::configuring() throw(fwTools::Failed)
+{
+    this->initialize();
+    m_configLauncher->parseConfig(this->getConfigTree());
+}
+
+//-----------------------------------------------------------------------------
+
+void SConfigLauncher::setIsActive(bool isActive)
+{
+    this->::fwGui::IActionSrv::setIsActive(isActive);
+    if ( isActive )
+    {
+        m_configLauncher->startConfig(this->getSptr());
+        fwServicesNotifyMacro(this->getLightID(), m_sigLaunched, ());
+    }
+    else
+    {
+        m_configLauncher->stopConfig();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::updating() throw(::fwTools::Failed)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::receiving( ::fwServices::ObjectMsg::csptr msg ) throw(::fwTools::Failed)
+{
+    if ( msg->hasEvent("WINDOW_CLOSED") )
+    {
+        this->setIsActive( false );
+        m_configLauncher->stopConfig();
+    }
+
+    ::fwData::Object::sptr currentObj = this->getObject();
+    bool executable = m_configLauncher->isExecutable(currentObj);
+    this->setIsExecutable( executable );
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigLauncher::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/action/SSignal.cpp b/Bundles/core/gui/src/gui/action/SSignal.cpp
new file mode 100644
index 0000000..178b4aa
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/SSignal.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwCom/Signal.hxx>
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "gui/action/SSignal.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::SSignal , ::fwData::Object ) ;
+
+
+static const ::fwCom::Signals::SignalKeyType TRIGERRED_SIG = "triggered";
+static const ::fwCom::Signals::SignalKeyType CANCELLED_SIG = "cancelled";
+static const ::fwCom::Signals::SignalKeyType SET_OBJECT_SLOT = "setObjects";
+
+//-----------------------------------------------------------------------------
+
+SSignal::SSignal() throw() :
+    m_sigTriggered(TrigerredSignalType::New()),
+    m_sigCancelled(TrigerredSignalType::New()),
+    m_slotSetObjects(SSignal::SetObjectsSlotType::New(&SSignal::setObjects, this))
+{
+    ::fwCom::HasSignals::m_signals
+        ( TRIGERRED_SIG, m_sigTriggered )
+        ( CANCELLED_SIG, m_sigCancelled );
+
+    ::fwCom::HasSlots::m_slots
+        ( SET_OBJECT_SLOT, m_slotSetObjects );
+
+#ifdef COM_LOG
+    m_sigTriggered->setID( TRIGERRED_SIG );
+    m_sigCancelled->setID( CANCELLED_SIG );
+    m_slotSetObjects->setID( SET_OBJECT_SLOT );
+#endif
+
+    this->setWorker( m_associatedWorker );
+}
+
+//-----------------------------------------------------------------------------
+
+SSignal::~SSignal() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    m_objects.clear();
+
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::info(std::ostream &_sstream )
+{
+    _sstream << "Starter Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    if (this->confirmAction())
+    {
+        fwServicesNotifyMacro(this->getLightID(), m_sigTriggered, (m_objects));
+    }
+    else
+    {
+        fwServicesNotifyMacro(this->getLightID(), m_sigCancelled, (m_objects));
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSignal::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+}
+
+} // namespace action
+} // namespace gui
+
diff --git a/Bundles/core/gui/src/gui/action/SSlotCaller.cpp b/Bundles/core/gui/src/gui/action/SSlotCaller.cpp
new file mode 100644
index 0000000..4881e59
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/SSlotCaller.cpp
@@ -0,0 +1,132 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "gui/action/SSlotCaller.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::SSlotCaller , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+SSlotCaller::SSlotCaller() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+SSlotCaller::~SSlotCaller() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::info(std::ostream &_sstream )
+{
+    _sstream << "Starter Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+
+    BOOST_FOREACH(SlotInfoType info, m_slotInfos)
+    {
+        HasSlotIDType HasSlotId = info.first;
+        ::fwCom::Slots::SlotKeyType slotKey = info.second;
+
+        if (::fwTools::fwID::exist(HasSlotId))
+        {
+            ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(HasSlotId);
+            ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+            SLM_ASSERT("Object with id " << HasSlotId << " is not a HasSlots", hasSlots);
+
+            ::fwCom::SlotBase::sptr slot = hasSlots->slot(slotKey);
+
+            slot->asyncRun();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void SSlotCaller::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+
+    ConfigurationType cfg = m_configuration->findConfigurationElement("slots");
+
+    ::fwRuntime::ConfigurationElementContainer slotCfgs = cfg->findAllConfigurationElement("slot");
+
+    ::boost::regex re("(.*)/(.*)");
+    ::boost::smatch match;
+    std::string src, uid, key;
+
+    BOOST_FOREACH(ConfigurationType elem,  slotCfgs.getElements())
+    {
+        src = elem->getValue();
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            uid.assign(match[1].first, match[1].second);
+            key.assign(match[2].first, match[2].second);
+
+            SLM_ASSERT("Missing hasSlotsId attribute", !uid.empty());
+            SLM_ASSERT("Missing slotKey attribute", !key.empty());
+
+            m_slotInfos.push_back( std::make_pair(uid, key) );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace action
+} // namespace gui
+
diff --git a/Bundles/core/gui/src/gui/action/StarterActionService.cpp b/Bundles/core/gui/src/gui/action/StarterActionService.cpp
new file mode 100644
index 0000000..b775805
--- /dev/null
+++ b/Bundles/core/gui/src/gui/action/StarterActionService.cpp
@@ -0,0 +1,221 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Extension.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "gui/action/StarterActionService.hpp"
+
+namespace gui
+{
+namespace action
+{
+
+fwServicesRegisterMacro( ::fwGui::IActionSrv , ::gui::action::StarterActionService , ::fwData::Object ) ;
+
+//-----------------------------------------------------------------------------
+
+StarterActionService::StarterActionService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+StarterActionService::~StarterActionService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->actionServiceStarting();
+}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    BOOST_FOREACH( VectPairIDActionType::value_type serviceUid, m_uuidServices)
+    {
+        bool srv_exists = ::fwTools::fwID::exist(serviceUid.first );
+        if (srv_exists &&  (m_idStartedSrvSet.find(serviceUid.first) != m_idStartedSrvSet.end()) )
+        {
+            ::fwServices::IService::sptr service = ::fwServices::get( serviceUid.first ) ;
+            if (service->isStarted())
+            {
+                service->stop();
+            }
+        }
+    }
+
+    this->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::info(std::ostream &_sstream )
+{
+    _sstream << "Starter Action" << std::endl;
+}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::updating() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+
+    for(size_t i = 0; i < m_uuidServices.size(); i++)
+    {
+        ActionType action =  m_uuidServices.at(i).second;
+        IDSrvType uid =  m_uuidServices.at(i).first;
+        bool srv_exists = ::fwTools::fwID::exist(uid  );
+
+        // Manage special action
+        if ( action == START_IF_EXISTS )
+        {
+            if ( srv_exists )
+            {
+                action = START;
+            }
+            else
+            {
+                action = DO_NOTHING;
+            }
+        }
+        else if( action == STOP_IF_EXISTS )
+        {
+            if ( srv_exists )
+            {
+                action = STOP;
+            }
+            else
+            {
+                action = DO_NOTHING;
+            }
+        }
+
+        if( action != DO_NOTHING)
+        {
+            ::fwGui::LockAction lock(this->getSptr());
+
+            ::fwServices::IService::sptr service = ::fwServices::get( uid ) ;
+            SLM_ASSERT("service not found", service);
+            switch ( action )
+            {
+            case START_OR_STOP:
+            {
+                if(service->isStopped())
+                {
+                    service->start();
+                    service->update();
+                    m_idStartedSrvSet.insert(uid);
+                }
+                else
+                {
+                    service->stop();
+                    m_idStartedSrvSet.erase(uid);
+                }
+                break;
+            }
+            case START :
+            {
+                if(service->isStopped())
+                {
+                    service->start();
+                    m_idStartedSrvSet.insert(uid);
+                }
+                else
+                {
+                    OSLM_WARN("Service " << service->getID() << " is not stopped");
+                }
+                service->update();
+                break;
+            }
+            case STOP :
+            {
+                if(service->isStarted())
+                {
+                    service->stop();
+                }
+                else
+                {
+                    OSLM_WARN("Service " << service->getID() << " is not started");
+                }
+                break;
+            }
+            default :
+            {
+                SLM_FATAL("Sorry, this action type is not managed");
+                break;
+            }
+            }
+        }
+        else
+        {
+            ::fwGui::dialog::MessageDialog::showMessageDialog(
+                    "Service unavailable",
+                    "Sorry, the service is unavailable.",
+                    ::fwGui::dialog::IMessageDialog::WARNING);
+
+            OSLM_INFO("Do nothing for Service " << m_uuidServices.at(i).first);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void StarterActionService::configuring() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC() ;
+    this->initialize();
+
+    BOOST_FOREACH(ConfigurationType actionCfg, m_configuration->getElements() )
+    {
+        OSLM_INFO( "StarterActionService "  << actionCfg->getName());
+
+        std::string actionType =  actionCfg->getName();
+        ActionType action;
+        if ( actionType == "start" )                { action = START; }
+        else if ( actionType == "stop" )            { action = STOP; }
+        else if ( actionType == "start_or_stop" )   { action = START_OR_STOP; }
+        else if ( actionType == "start_if_exists" ) { action = START_IF_EXISTS; }
+        else if ( actionType == "stop_if_exists" )  { action = STOP_IF_EXISTS; }
+        else
+        {
+            OSLM_WARN("Sorry this type of \"actionType\":" << actionType <<" is not managed by StarterActionService");
+            continue;
+        }
+        SLM_ASSERT("Attribute uid missing", actionCfg->hasAttribute("uid")) ;
+        IDSrvType uuid = actionCfg->getExistingAttributeValue("uid") ;
+
+        m_uuidServices.push_back( std::make_pair(uuid, action) );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace action
+} // namespace gui
+
diff --git a/Bundles/core/gui/src/gui/aspect/DefaultMenuBarSrv.cpp b/Bundles/core/gui/src/gui/aspect/DefaultMenuBarSrv.cpp
new file mode 100644
index 0000000..6f71c82
--- /dev/null
+++ b/Bundles/core/gui/src/gui/aspect/DefaultMenuBarSrv.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "gui/aspect/DefaultMenuBarSrv.hpp"
+
+
+fwServicesRegisterMacro( ::fwGui::IMenuBarSrv , ::gui::aspect::DefaultMenuBarSrv , ::fwData::Object );
+
+namespace gui
+{
+
+namespace aspect
+{
+
+
+//-----------------------------------------------------------------------------
+
+DefaultMenuBarSrv::DefaultMenuBarSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DefaultMenuBarSrv::~DefaultMenuBarSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuBarSrv::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuBarSrv::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->create();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuBarSrv::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuBarSrv::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuBarSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+
+}
diff --git a/Bundles/core/gui/src/gui/aspect/DefaultMenuSrv.cpp b/Bundles/core/gui/src/gui/aspect/DefaultMenuSrv.cpp
new file mode 100644
index 0000000..bd28279
--- /dev/null
+++ b/Bundles/core/gui/src/gui/aspect/DefaultMenuSrv.cpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "gui/aspect/DefaultMenuSrv.hpp"
+
+
+fwServicesRegisterMacro( ::fwGui::IMenuSrv , ::gui::aspect::DefaultMenuSrv , ::fwData::Object );
+
+namespace gui
+{
+
+namespace aspect
+{
+
+//-----------------------------------------------------------------------------
+
+DefaultMenuSrv::DefaultMenuSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DefaultMenuSrv::~DefaultMenuSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuSrv::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuSrv::starting() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->create();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuSrv::stopping() throw( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuSrv::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultMenuSrv::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+
+}
diff --git a/Bundles/core/gui/src/gui/aspect/DefaultToolBarSrv.cpp b/Bundles/core/gui/src/gui/aspect/DefaultToolBarSrv.cpp
new file mode 100644
index 0000000..c37e8fc
--- /dev/null
+++ b/Bundles/core/gui/src/gui/aspect/DefaultToolBarSrv.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+#include <fwServices/Base.hpp>
+
+#include "gui/aspect/DefaultToolBarSrv.hpp"
+
+fwServicesRegisterMacro( ::fwGui::IToolBarSrv , ::gui::aspect::DefaultToolBarSrv , ::fwData::Object ) ;
+
+namespace gui
+{
+
+namespace aspect
+{
+
+DefaultToolBarSrv::DefaultToolBarSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DefaultToolBarSrv::~DefaultToolBarSrv() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::starting()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->create();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::stopping()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::configuring()  throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::updating() throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::receiving(::fwServices::ObjectMsg::csptr _msg) throw ( ::fwTools::Failed )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultToolBarSrv::info( std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+}
+
+}
diff --git a/Bundles/core/gui/src/gui/editor/IDialogEditor.cpp b/Bundles/core/gui/src/gui/editor/IDialogEditor.cpp
new file mode 100644
index 0000000..076bca9
--- /dev/null
+++ b/Bundles/core/gui/src/gui/editor/IDialogEditor.cpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "gui/editor/IDialogEditor.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+
+IDialogEditor::IDialogEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IDialogEditor::~IDialogEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IDialogEditor::info(std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/editor/IEditor.cpp b/Bundles/core/gui/src/gui/editor/IEditor.cpp
new file mode 100644
index 0000000..94dd34e
--- /dev/null
+++ b/Bundles/core/gui/src/gui/editor/IEditor.cpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "gui/editor/IEditor.hpp"
+
+namespace gui
+{
+namespace editor
+{
+
+
+IEditor::IEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IEditor::~IEditor() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IEditor::info(std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/frame/DefaultFrame.cpp b/Bundles/core/gui/src/gui/frame/DefaultFrame.cpp
new file mode 100644
index 0000000..fad47c3
--- /dev/null
+++ b/Bundles/core/gui/src/gui/frame/DefaultFrame.cpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+
+#include "gui/frame/DefaultFrame.hpp"
+
+namespace gui
+{
+namespace frame
+{
+
+fwServicesRegisterMacro( ::fwGui::IFrameSrv , ::gui::frame::DefaultFrame , ::fwData::Object ) ;
+
+
+DefaultFrame::DefaultFrame() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DefaultFrame::~DefaultFrame() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::configuring() throw( ::fwTools::Failed )
+{
+    SLM_ASSERT( "<service> tag is required.", m_configuration->getName() == "service" );
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::info(std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultFrame::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/view/DefaultView.cpp b/Bundles/core/gui/src/gui/view/DefaultView.cpp
new file mode 100644
index 0000000..beb1ac1
--- /dev/null
+++ b/Bundles/core/gui/src/gui/view/DefaultView.cpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwData/Object.hpp>
+
+#include "gui/view/DefaultView.hpp"
+
+namespace gui
+{
+namespace view
+{
+
+fwServicesRegisterMacro( ::gui::view::IView , ::gui::view::DefaultView , ::fwData::Object ) ;
+
+
+DefaultView::DefaultView() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+DefaultView::~DefaultView() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::configuring() throw( ::fwTools::Failed )
+{
+    this->initialize();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::starting() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->create();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::stopping() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    this->destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::info(std::ostream &_sstream )
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void DefaultView::updating() throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/gui/src/gui/view/IView.cpp b/Bundles/core/gui/src/gui/view/IView.cpp
new file mode 100644
index 0000000..3505a98
--- /dev/null
+++ b/Bundles/core/gui/src/gui/view/IView.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "gui/view/IView.hpp"
+
+namespace gui
+{
+namespace view
+{
+
+IView::IView() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IView::~IView() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
+}
+
diff --git a/Bundles/core/io/CMakeLists.txt b/Bundles/core/io/CMakeLists.txt
new file mode 100644
index 0000000..58de12b
--- /dev/null
+++ b/Bundles/core/io/CMakeLists.txt
@@ -0,0 +1,11 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+    fwServices
+)
+
+find_package (Boost REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
diff --git a/Bundles/core/io/COPYING b/Bundles/core/io/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/io/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/io/COPYING.LESSER b/Bundles/core/io/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/io/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/io/Properties.cmake b/Bundles/core/io/Properties.cmake
new file mode 100644
index 0000000..344f151
--- /dev/null
+++ b/Bundles/core/io/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME io )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/io/bin/build.options b/Bundles/core/io/bin/build.options
new file mode 100644
index 0000000..95af755
--- /dev/null
+++ b/Bundles/core/io/bin/build.options
@@ -0,0 +1,5 @@
+TYPE    = 'bundle'
+LIB     = ['fwServices_0-1','fwCore_0-1','fwRuntime_0-3','fwTools_0-1']
+USE     = ['boost']
+VERSION = '0-1'
+
diff --git a/Bundles/core/io/include/io/IReader.hpp b/Bundles/core/io/include/io/IReader.hpp
new file mode 100644
index 0000000..0871832
--- /dev/null
+++ b/Bundles/core/io/include/io/IReader.hpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IO_IREADER_HPP_
+#define _IO_IREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "io/config.hpp"
+#include "io/ioTypes.hpp"
+
+namespace io
+{
+
+/**
+ * @brief Reader service API. It manages extension points definition and extension configuration
+ * @class   IReader
+ *
+ * This class represents the base interface for reader services.
+ * Use the base service methods :
+ * @li The service is configured with methods setConfiguration(cfg) and configure()
+ * @li The method start() initialize the service
+ * @li To read the object use update() method
+ * @li Finally we must call stop() before deleting the service
+ * @todo ACH : remove some methods : getSupportedExtensions ? getSelectorDialogTitle ?
+ */
+class IO_CLASS_API IReader : public fwServices::IService
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (IReader)(::fwServices::IService) ) ;
+
+    /**
+     * @name    Specific service methods for reading
+     */
+    //@{
+
+    /**
+     * @brief Configure the image path (by default does nothing).
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IO_API virtual void configureWithIHM() = 0;
+
+    /**
+     * @brief   returns  (filename) extension
+     */
+    IO_API virtual std::vector< std::string > getSupportedExtensions() ;
+
+    /**
+     * @brief   returns  the title of selector dialog box
+     */
+    IO_API virtual std::string getSelectorDialogTitle();
+
+    /**
+     * @brief This method must be implemented by concrete service readers
+     * that use path file system to read data.
+     *
+     * This method returns supported path format (file, files or folder).
+     * A reader can support file and folder, or files and folder, but not
+     * file and files ( because files include file concept ).
+     */
+    IO_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Returns the file path setted by user or setted during service configuration
+     * @pre exception if a file path is not defined  ( m_locations.empty() )
+     * @pre exception if service not supported FILE management
+     */
+    IO_API const ::boost::filesystem::path &getFile() const;
+
+    /**
+     * @brief Sets file path
+     * @pre exception if service not supported FILE management
+     */
+    IO_API void setFile(const ::boost::filesystem::path &file);
+
+    /**
+     * @brief Returns file paths setted by user or setted during service configuration
+     * @pre exception if a file path is not defined ( m_locations.empty() )
+     * @pre exception if service not supported FILES management
+     */
+    IO_API const ::io::LocationsType &getFiles() const;
+
+    /**
+     * @brief Sets file paths
+     * @pre exception if service not supported FILES management
+     */
+    IO_API void setFiles(const ::io::LocationsType &files);
+
+    /**
+     * @brief Returns folder path setted by user or setted during service configuration
+     * @pre exception if a folder path is not defined ( m_locations.empty() )
+     * @pre exception if service not supported FOLDER management
+     */
+    IO_API const ::boost::filesystem::path &getFolder() const;
+
+    /**
+     * @brief Clear any location set by the setFile/setFiles/setFolder setter
+     */
+    IO_API void clearLocations();
+
+    /**
+     * @brief Returns file/files/folder paths setted by user or setted during service configuration
+     * @pre exception if a file path is not defined ( m_locations.empty() )
+     */
+    IO_API const ::io::LocationsType & getLocations() const;
+
+    /**
+     * @brief Sets folder path
+     * @pre exception if service not supported FOLDER management
+     */
+    IO_API void setFolder(const ::boost::filesystem::path &folder);
+
+    /// Returns if a location has been defined ( by the configuration process or directly by user )
+    IO_API bool hasLocationDefined() const;
+
+    //@}
+
+protected:
+
+    IO_API IReader() throw() ;
+
+    IO_API virtual ~IReader() throw() ;
+
+    /**
+     * @brief This method proposes to parse xml configuration to retrieve
+     * file/files/folder paths.
+     *
+     * You can implement your configuring method if you wan check another
+     * information or information not correspond to a path on filesystem,
+     * else you must use this generic approach.
+     *
+     * Sample configuration for a file:
+     * @verbatim
+     <service ... >
+        <file>/home/user/myFile.jpg</file>
+     </service>
+     @endverbatim
+     * Sample configuration for many files:
+     * @verbatim
+     <service ... >
+        <file>/home/user/myFile01.jpg</file>
+        <file>/home/user/myFile02.jpg</file>
+        <file>/home/user/myFile03.jpg</file>
+     </service>
+     @endverbatim
+     * Sample configuration for a folder:
+     * @verbatim
+     <service ... >
+        <folder>/home/user/myFolder</folder>
+     </service>
+     @endverbatim
+     */
+    IO_API virtual void configuring() throw (fwTools::Failed);
+
+
+private:
+
+    /// Value to stock file or folder paths
+    ::io::LocationsType m_locations;
+};
+
+}
+
+
+#endif /*_IO_IREADER_HPP_*/
diff --git a/Bundles/core/io/include/io/IWriter.hpp b/Bundles/core/io/include/io/IWriter.hpp
new file mode 100644
index 0000000..44e2e7c
--- /dev/null
+++ b/Bundles/core/io/include/io/IWriter.hpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IO_IWRITER_HPP_
+#define _IO_IWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "io/config.hpp"
+#include "io/ioTypes.hpp"
+
+namespace io
+{
+
+/**
+ * @brief Writer service API. It manages extension points definition and extension configuration
+ * @class   IWriter
+ *
+ * This class represents the base interface for writer services.
+ * Use the base service methods :
+ * @li The service is configured with methods setConfiguration(cfg) and configure()
+ * @li The method start() initialize the service
+ * @li To write the object use update() method
+ * @li Finally we must call stop() before deleting the service
+ */
+class IO_CLASS_API IWriter : public fwServices::IService
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (IWriter)(::fwServices::IService) ) ;
+
+    /**
+     * @brief Configure the image path (by default does nothing).
+     *
+     * This method is used to find
+     * the file path  using a file selector.
+     */
+    IO_API virtual void configureWithIHM() = 0 ;
+
+    /**
+     * @brief This method must be implemented by concrete service writers
+     * that use path file system to write data.
+     *
+     * This method returns supported path format (file, files or folder).
+     * A reader can support file and folder, or files and folder, but not
+     * file and files ( because files include file concept ).
+     */
+    IO_API virtual ::io::IOPathType getIOPathType() const;
+
+    /**
+     * @brief Returns the file path setted by user or setted during service configuration
+     * @pre exception if a file path is not defined  ( m_locations.empty() )
+     * @pre exception if service not supported FILE management
+     */
+    IO_API const ::boost::filesystem::path &getFile() const;
+
+    /**
+     * @brief Sets file path
+     * @pre exception if service not supported FILE management
+     */
+    IO_API void setFile(const ::boost::filesystem::path &file);
+
+    /**
+     * @brief Returns file paths setted by user or setted during service configuration
+     * @pre exception if a file path is not defined ( m_locations.empty() )
+     * @pre exception if service not supported FILES management
+     */
+    IO_API const ::io::LocationsType &getFiles() const;
+
+    /**
+     * @brief Sets file paths
+     * @pre exception if service not supported FILES management
+     */
+    IO_API void setFiles(const ::io::LocationsType &files);
+
+    /**
+     * @brief Returns folder path setted by user or setted during service configuration
+     * @pre exception if a folder path is not defined ( m_locations.empty() )
+     * @pre exception if service not supported FOLDER management
+     */
+    IO_API const ::boost::filesystem::path &getFolder() const;
+
+    /**
+     * @brief Clear any location set by the setFile/setFiles/setFolder setter
+     */
+    IO_API void clearLocations();
+
+    /**
+     * @brief Returns file/files/folder paths setted by user or setted during service configuration
+     * @pre exception if a file path is not defined ( m_locations.empty() )
+     */
+    IO_API const ::io::LocationsType & getLocations() const;
+
+    /**
+     * @brief Sets folder path
+     * @pre exception if service not supported FOLDER management
+     */
+    IO_API void setFolder(const ::boost::filesystem::path &folder);
+
+    /// Returns if a location has been defined ( by the configuration process or directly by user )
+    IO_API bool hasLocationDefined() const;
+
+protected:
+
+    IO_API IWriter() throw() ;
+
+    IO_API virtual ~IWriter() throw() ;
+
+    /**
+     * @brief This method proposes to parse xml configuration to retrieve
+     * file/files/folder paths.
+     *
+     * You can implement your configuring method if you wan check another
+     * information or information not correspond to a path on filesystem,
+     * else you must use this generic approach.
+     *
+     * Sample configuration for a file:
+     * @verbatim
+     <service ... >
+        <file>/home/user/myFile.jpg<file/>
+     </service>
+     @endverbatim
+     * Sample configuration for many files:
+     * @verbatim
+     <service ... >
+        <file>/home/user/myFile01.jpg<file/>
+        <file>/home/user/myFile02.jpg<file/>
+        <file>/home/user/myFile03.jpg<file/>
+     </service>
+     @endverbatim
+     * Sample configuration for a folder:
+     * @verbatim
+     <service ... >
+        <folder>/home/user/myFolder<folder/>
+     </service>
+     @endverbatim
+     */
+    IO_API virtual void configuring() throw (fwTools::Failed);
+
+private:
+
+    /// Value to stock file or folder paths
+    ::io::LocationsType m_locations;
+};
+
+}
+
+
+#endif // _IO_IWRITER_HPP_
diff --git a/Bundles/core/io/include/io/Namespace.hpp b/Bundles/core/io/include/io/Namespace.hpp
new file mode 100644
index 0000000..923526a
--- /dev/null
+++ b/Bundles/core/io/include/io/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IONAMESPACE_HPP_
+#define IONAMESPACE_HPP_
+
+/**
+ * @brief     The namespace io contains the base interface for reader and writer services.
+ * @namespace io
+ * 
+ * @date      2009-2010.
+ *
+ */
+namespace io
+{
+
+}
+#endif /* IONAMESPACE_HPP_ */
diff --git a/Bundles/core/io/include/io/Plugin.hpp b/Bundles/core/io/include/io/Plugin.hpp
new file mode 100644
index 0000000..f1e6397
--- /dev/null
+++ b/Bundles/core/io/include/io/Plugin.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IO_PLUGIN_HPP_
+#define _IO_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace io
+{
+/**
+ * @brief   Implements a plugin for the io bundle.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+
+    /**
+     * @brief Start method. (does nothing)
+     *
+     * This method is used by runtime in order to initialize the bundle.
+     *
+     * @exception ::fwRuntime::RuntimeException
+     */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief Stop method. (does nothing)
+     *
+     * This method is used by runtime in order to close the bundle.
+     */
+    void stop() throw();
+
+};
+
+} // namespace io
+
+#endif //_IO_PLUGIN_HPP_
diff --git a/Bundles/core/io/include/io/config.hpp b/Bundles/core/io/include/io/config.hpp
new file mode 100644
index 0000000..7f52bd3
--- /dev/null
+++ b/Bundles/core/io/include/io/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IO_CONFIG_HPP_
+#define _IO_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef IO_EXPORTS
+    #define IO_API __declspec(dllexport)
+    #else
+    #define IO_API __declspec(dllimport)
+    #endif
+
+    #define IO_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef IO_EXPORTS
+    #define IO_API __attribute__ ((visibility("default")))
+    #define IO_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define IO_API __attribute__ ((visibility("hidden")))
+    #define IO_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define IO_API
+    #define IO_CLASS_API
+
+#endif
+
+#endif //_IO_CONFIG_HPP_
diff --git a/Bundles/core/io/include/io/ioTypes.hpp b/Bundles/core/io/include/io/ioTypes.hpp
new file mode 100644
index 0000000..53beb47
--- /dev/null
+++ b/Bundles/core/io/include/io/ioTypes.hpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _IO_IOTYPES_HPP_
+#define _IO_IOTYPES_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+namespace io
+{
+    //! IOPathType defines different type of paths used by service readers/writers
+    typedef enum
+    {
+        FILE   = 1 << 0, /*!< io service can manage file and cannot manage a list of file*/
+        FILES  = 1 << 1, /*!< io service can manage a list of file ()*/
+        FOLDER = 1 << 2, /*!< io service can manage folder*/
+        TYPE_NOT_DEFINED = 1 << 3, /*!< io service not used path parameter to works */
+    } IOPathType;
+
+    /// List of paths managed by io services
+    typedef std::vector< ::boost::filesystem::path > LocationsType;
+}
+
+
+#endif /* _IO_IOTYPES_HPP_ */
diff --git a/Bundles/core/io/rc/Image.xsd b/Bundles/core/io/rc/Image.xsd
new file mode 100644
index 0000000..dcfa891
--- /dev/null
+++ b/Bundles/core/io/rc/Image.xsd
@@ -0,0 +1,34 @@
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+
+<xsd:include schemaLocation="baseTypes.xsd"/>	
+	
+<xsd:complexType name="ImageType">
+	<xsd:sequence>
+		<xsd:element name="Dimension" type="xsd:positiveInteger"/>
+		<xsd:element name="PixelType" type="DynamicTypeXSDType"/>
+		<xsd:element name="ManagesBuff" >
+			<xsd:simpleType>
+				<xsd:restriction base="xsd:positiveInteger">
+					<xsd:maxExclusive value="2"/>
+				</xsd:restriction>
+        		</xsd:simpleType>
+		</xsd:element >
+		<xsd:element name="Spacing"	type="FloatContainerXSDType"/>
+		<xsd:element name="Origin"  	type="IntegerContainerXSDType"/>
+		<xsd:element name="Size"    	type="IntegerContainerXSDType"/>
+		<xsd:element name="Filename" 	type="xsd:string"/>
+		<xsd:element name="WindowCenter" type="xsd:integer"/>
+		<xsd:element name= "WindowWidth" type="xsd:integer"/>
+		<xsd:element name="RescaleIntercept" type="xsd:integer"/>
+		<xsd:element name="Buffer"/>
+		<xsd:element name="Field" type="FieldXSDType" minOccurs="0"/>
+	</xsd:sequence>
+	<xsd:attribute name="id" type="xsd:string" />
+</xsd:complexType>
+
+<xsd:element name="Image" type="ImageType"/>
+
+	
+
+</xsd:schema>
\ No newline at end of file
diff --git a/Bundles/core/io/rc/baseTypes.xsd b/Bundles/core/io/rc/baseTypes.xsd
new file mode 100644
index 0000000..7883aa6
--- /dev/null
+++ b/Bundles/core/io/rc/baseTypes.xsd
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema
+        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+        elementFormDefault="qualified"
+        attributeFormDefault="unqualified">
+
+	
+	
+ <xsd:complexType name="StringFieldXSDType">
+        <xsd:sequence>
+		<xsd:element name="value" type="xsd:string" minOccurs="1" maxOccurs="1"/>
+        </xsd:sequence>
+	<xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+
+<xsd:element name="StringField" type="StringFieldXSDType"/>
+  
+  
+	
+ <xsd:complexType name="FloatFieldXSDType">
+        <xsd:sequence>
+		<xsd:element name="value" type="xsd:float" minOccurs="1" maxOccurs="1"/>
+        </xsd:sequence>
+	<xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+
+ <xsd:element  name="FloatField"  type="FloatFieldXSDType"/>
+  
+
+<!-- predeclaration needed to manage  processContents="strict" ceacuse a Field can contain a Field -->
+<xsd:element name="Field" type="FieldXSDType"/>
+
+ <xsd:complexType name="FieldXSDType">
+        <xsd:sequence>
+	<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="strict"/>
+        </xsd:sequence>
+	<xsd:attribute name="label" type="xsd:string" />
+	<xsd:attribute name="id" type="xsd:string" />
+  </xsd:complexType>
+  
+  
+  
+  
+  
+ <xsd:simpleType name="DynamicTypeValueXSDType">
+        <xsd:restriction base="xsd:string">
+		<xsd:enumeration value="unsigned char"/>
+		<xsd:enumeration value="unsigned short"/>
+		<xsd:enumeration value="unsigned int"/>
+		<xsd:enumeration value="unsigned long"/>
+		<xsd:enumeration value="signed char"/>
+		<xsd:enumeration value="signed short"/>
+		<xsd:enumeration value="signed int"/>
+		<xsd:enumeration value="signed long"/>
+		<xsd:enumeration value="float"/>
+		<xsd:enumeration value="double"/>
+		<xsd:enumeration value="UNSPECIFIED TYPE"/>
+	</xsd:restriction>
+</xsd:simpleType>
+
+
+<xsd:complexType name="DynamicTypeXSDType">
+		<xsd:sequence>
+		  <xsd:element name="DynamicType" type="DynamicTypeValueXSDType"/>	 
+		</xsd:sequence>
+</xsd:complexType>  
+
+<xsd:complexType name="GenericContainerXSDType">
+	<xsd:sequence>
+		<xsd:element name="count" type="xsd:nonNegativeInteger" minOccurs="1" maxOccurs="1"/>
+		<xsd:element name="item" type="xsd:anyType" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+</xsd:complexType>
+
+
+<xsd:complexType name="FloatContainerXSDType">
+	<xsd:sequence>
+		<xsd:element name="count" type="xsd:nonNegativeInteger" minOccurs="1" maxOccurs="1"/>
+		<xsd:element name="item" type="xsd:float" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+</xsd:complexType>
+
+<xsd:complexType name="IntegerContainerXSDType">
+	<xsd:sequence>
+		<xsd:element name="count" type="xsd:nonNegativeInteger" minOccurs="1" maxOccurs="1"/>
+		<xsd:element name="item" type="xsd:integer" minOccurs="0" maxOccurs="unbounded"/>
+        </xsd:sequence>
+</xsd:complexType>
+
+
+</xsd:schema>
+
diff --git a/Bundles/core/io/rc/defaultCompositeObjectReaderCfg.xsd b/Bundles/core/io/rc/defaultCompositeObjectReaderCfg.xsd
new file mode 100644
index 0000000..9ce13b7
--- /dev/null
+++ b/Bundles/core/io/rc/defaultCompositeObjectReaderCfg.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?> 
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:element name="extension" type="ExtensionType"/>
+
+<xs:complexType name="ExtensionType">
+  <xs:sequence>
+    <xs:element name="service" type="ServiceType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:anyAttribute processContents="skip" />
+</xs:complexType>
+
+<xs:complexType name="ServiceType">
+  <xs:sequence>
+    <xs:element name="input" type="ProcessObjectIOType" minOccurs="0" maxOccurs="unbounded" />
+    <xs:element name="output" type="ProcessObjectIOType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:attribute name="id" type="xs:string" use="required" />
+</xs:complexType>
+
+<xs:complexType name="ProcessObjectIOType">
+  <xs:attribute name="id" type="xs:string" use="required" />
+  <xs:attribute name="filename" type="xs:string" use="required"/>
+  <xs:attribute name="type" type="xs:string" />
+</xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/Bundles/core/io/rc/locale/en/LC_MESSAGES/io.po b/Bundles/core/io/rc/locale/en/LC_MESSAGES/io.po
new file mode 100644
index 0000000..66ac9fe
--- /dev/null
+++ b/Bundles/core/io/rc/locale/en/LC_MESSAGES/io.po
@@ -0,0 +1,102 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 13:59+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: C:/Dev/Bundles/ui/src/ui/Frame.cpp:38
+msgid "/Frame"
+msgstr ""
+
+#. /< the path in the user configuration for frtame settings
+#: C:/Dev/Bundles/ui/src/ui/Frame.cpp:39
+msgid "Location"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ActionManager.cpp:34
+msgid "/Shortcuts"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ActionManager.cpp:135
+msgid " "
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ActionManager.cpp:135
+#: C:/Dev/Bundles/ui/src/ui/action/ActionManager.cpp:136
+msgid "_"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ActionManager.cpp:136
+msgid "/"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:251
+msgid "Hit keys on your keyboard to change the shortcut."
+msgstr ""
+
+#. Creates the controls.
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:408
+msgid "Shortcuts"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:410
+msgid "&Edit..."
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:411
+msgid "&Clear"
+msgstr ""
+
+#. Initializes the shortcut list.
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:414
+msgid "Name"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/action/ShortcutEditor.cpp:415
+msgid "Value"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:28
+msgid "unknown"
+msgstr ""
+
+#. /< the unknown state literal
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:29
+msgid "iconized"
+msgstr ""
+
+#. /< the iconized state literal
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:30
+msgid "maximized"
+msgstr ""
+
+#. /< the maximized state literal
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:31
+msgid "full screen"
+msgstr ""
+
+#. Matches the given window location.
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:99
+msgid "([0-9]+)x([0-9]+)([+\\-][0-9]+)([+\\-][0-9]+)"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/utility/WindowLocation.cpp:209
+#, possible-c-format
+msgid "%ix%i%+i%+i"
+msgstr ""
+
+#: C:/Dev/Bundles/ui/src/ui/view/SampleView.cpp:43
+msgid "ui::view::SampleView"
+msgstr ""
diff --git a/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io-Final.po b/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io-Final.po
new file mode 100644
index 0000000..dbce8cb
--- /dev/null
+++ b/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io-Final.po
@@ -0,0 +1,126 @@
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:41
+msgid "Name"
+msgstr "Nom"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:42
+msgid "Modality"
+msgstr "Modalité"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:43
+msgid "Zone"
+msgstr "Zone"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:44
+msgid "ID"
+msgstr "ID"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:45
+msgid "Birthdate"
+msgstr "Date de naissance"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:46
+msgid "Hospital"
+msgstr "Hopital"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:47
+msgid "Acq. date"
+msgstr "Date d'acquisition"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:48
+msgid "Nb images"
+msgstr "Nb images"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:49
+msgid "Voxel size"
+msgstr "Taille voxel"
+
+msgid "PatientDBGuiSelectorService"
+msgstr ""
+
+msgid "Input to import"
+msgstr ""
+
+msgid "Output to export"
+msgstr ""
+
+msgid "Reader to use"
+msgstr ""
+
+msgid "IO Service "
+msgstr ""
+
+msgid "IGuiSelectorService"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:69
+msgid "Choose image to read"
+msgstr ""
+
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 14:27+0200\n"
+"PO-Revision-Date: 2008-06-16 08:54+0100\n"
+"Last-Translator: Johan Moreau <Johan.Moreau at laposte.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:91
+msgid "Enter filename"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:94
+msgid ".inr.gz"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:95
+msgid "*.inr.gz"
+msgstr ""
+
+msgid "OK"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
+msgid " composite object reader"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/TriangularMeshGuiEditorService.cpp:45
+msgid "Choose trian to read"
+msgstr ""
+
+msgid "IGuiEditorService"
+msgstr ""
+
+msgid "Title of selector dialog box"
+msgstr ""
+
+msgid "Bouchonnage: loading simulated"
+msgstr ""
+
+msgid "Load model"
+msgstr ""
+
+msgid "Bouchonnage: no save"
+msgstr ""
+
+msgid "Save model"
+msgstr ""
+
+msgid "PatientDBGuiEditorService"
+msgstr ""
+
+msgid "File format unknown. Retry with another file reader."
+msgstr ""
+
+msgid "Image Reader"
+msgstr ""
diff --git a/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io.po b/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io.po
new file mode 100644
index 0000000..760e3f5
--- /dev/null
+++ b/Bundles/core/io/rc/locale/fr/LC_MESSAGES/io.po
@@ -0,0 +1,73 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 14:27+0200\n"
+"PO-Revision-Date: 2008-06-16 08:54+0100\n"
+"Last-Translator: Johan Moreau <Johan.Moreau at laposte.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:41
+msgid "Name"
+msgstr "Nom"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:42
+msgid "Modality"
+msgstr "Modalité"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:43
+msgid "Zone"
+msgstr "Zone"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:44
+msgid "ID"
+msgstr "ID"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:45
+msgid "Birthdate"
+msgstr "Date de naissance"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:46
+msgid "Hospital"
+msgstr "Hopital"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:47
+msgid "Acq. date"
+msgstr "Date d'acquisition"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:48
+msgid "Nb images"
+msgstr "Nb images"
+
+# C:/Dev/Bundles/io/src/io/AcquisitionSelectorPanel.cpp:49
+msgid "Voxel size"
+msgstr "Taille voxel"
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:69
+msgid "Choose image to read"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:91
+msgid "Enter filename"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:94
+msgid ".inr.gz"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/ImageGuiEditorService.cpp:95
+msgid "*.inr.gz"
+msgstr ""
+
+# C:/Dev/Bundles/io/src/io/TriangularMeshGuiEditorService.cpp:45
+msgid "Choose trian to read"
+msgstr ""
+
diff --git a/Bundles/core/io/rc/plugin.xml b/Bundles/core/io/rc/plugin.xml
new file mode 100644
index 0000000..4dd8287
--- /dev/null
+++ b/Bundles/core/io/rc/plugin.xml
@@ -0,0 +1,5 @@
+<plugin id="io" class="io::Plugin">
+
+    <library name="io"/>
+    
+</plugin>
diff --git a/Bundles/core/io/src/io/IReader.cpp b/Bundles/core/io/src/io/IReader.cpp
new file mode 100644
index 0000000..015d1ec
--- /dev/null
+++ b/Bundles/core/io/src/io/IReader.cpp
@@ -0,0 +1,182 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "io/IReader.hpp"
+
+#include <fwCore/base.hpp>
+
+#include <fwRuntime/ConfigurationElementContainer.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/macros.hpp>
+
+using fwRuntime::ConfigurationElementContainer;
+
+namespace io
+{
+
+IReader::IReader() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IReader::~IReader() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+std::string IReader::getSelectorDialogTitle()
+{
+    return "Choose a file";
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > IReader::getSupportedExtensions()
+{
+    return std::vector< std::string >();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path &IReader::getFile() const
+{
+    FW_RAISE_IF("This reader doesn't manage file", !(this->getIOPathType() & ::io::FILE));
+    FW_RAISE_IF("Sorry, one file must be define in location", m_locations.size() != 1);
+    return m_locations.front();
+}
+
+//-----------------------------------------------------------------------------
+
+void IReader::setFile( const ::boost::filesystem::path &file)
+{
+    FW_RAISE_IF("This reader doesn't manage file", !(this->getIOPathType() & ::io::FILE));
+    m_locations.clear();
+    m_locations.push_back(file);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::io::LocationsType &IReader::getFiles() const
+{
+    FW_RAISE_IF("This reader doesn't manage files", !(this->getIOPathType() & ::io::FILES));
+    FW_RAISE_IF("Sorry, at least one file must be define in location", m_locations.empty() );
+    return m_locations;
+}
+
+//-----------------------------------------------------------------------------
+
+void IReader::setFiles(const ::io::LocationsType &files)
+{
+    FW_RAISE_IF("This reader doesn't manage files", !(this->getIOPathType() & ::io::FILES));
+    m_locations = files;
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path &IReader::getFolder() const
+{
+    FW_RAISE_IF("This reader doesn't manage folder", !(this->getIOPathType() & ::io::FOLDER));
+    FW_RAISE_IF("Sorry, one folder must be define in location", m_locations.size() !=1 );
+    return m_locations.front();
+}
+
+//-----------------------------------------------------------------------------
+
+void IReader::setFolder(const ::boost::filesystem::path &folder)
+{
+    FW_RAISE_IF("This reader doesn't manage folder", !(this->getIOPathType() & ::io::FOLDER));
+    m_locations.clear();
+    m_locations.push_back(folder);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::io::LocationsType &IReader::getLocations() const
+{
+    FW_RAISE_IF("Sorry, at least one pâth must be define in location", m_locations.empty() );
+    return m_locations;
+}
+
+//-----------------------------------------------------------------------------
+
+void IReader::clearLocations()
+{
+    m_locations.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void IReader::configuring() throw (fwTools::Failed)
+{
+    SLM_ASSERT("Generic configuring method is just available for io service that uses pathes.", ! ( this->getIOPathType() & ::io::TYPE_NOT_DEFINED ) );
+
+    SLM_ASSERT("Sorry, you not manage folder and a folder path is given in the configuration",
+            ( this->getIOPathType() & ::io::FOLDER ) ||
+               ((! (this->getIOPathType() & ::io::FOLDER)) && (m_configuration->find("folder").size() == 0)) );
+
+    SLM_ASSERT("Sorry, you not manage file and a file path is given in the configuration",
+            ( this->getIOPathType() & ::io::FILE || this->getIOPathType() & ::io::FILES ) ||
+               ((!( this->getIOPathType() & ::io::FILE || this->getIOPathType() & ::io::FILES )) && (m_configuration->find("file").size() == 0)) );
+
+    if ( this->getIOPathType() & ::io::FILE )
+    {
+        FW_RAISE_IF("This reader cannot manages FILE and FILES.", this->getIOPathType() & ::io::FILES );
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("file");
+        FW_RAISE_IF("Sorry, only one file must be defined in configuration", config.size() > 1 );
+        if (config.size() == 1)
+        {
+            std::string file = config.at(0)->getValue();
+            this->setFile(::boost::filesystem::path(file));
+        }
+    }
+
+
+    if ( this->getIOPathType() & ::io::FILES )
+    {
+        FW_RAISE_IF("This reader cannot manages FILE and FILES.", this->getIOPathType() & ::io::FILE );
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("file");
+        ::io::LocationsType locations;
+        BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, config)
+        {
+            std::string location = elt->getValue();
+            locations.push_back(::boost::filesystem::path(location));
+        }
+        this->setFiles(locations);
+    }
+
+
+    if ( this->getIOPathType() & ::io::FOLDER )
+    {
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("folder");
+        FW_RAISE_IF("Sorry, only one folder must be defined in configuration", config.size() > 1 );
+        if (config.size() == 1)
+        {
+            std::string folder = config.at(0)->getValue();
+            this->setFolder(::boost::filesystem::path(folder));
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType IReader::getIOPathType() const
+{
+    return ::io::TYPE_NOT_DEFINED;
+}
+
+//-----------------------------------------------------------------------------
+
+bool IReader::hasLocationDefined() const
+{
+    return m_locations.size() > 0;
+}
+
+//-----------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/core/io/src/io/IWriter.cpp b/Bundles/core/io/src/io/IWriter.cpp
new file mode 100644
index 0000000..78aafdd
--- /dev/null
+++ b/Bundles/core/io/src/io/IWriter.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#include "io/IWriter.hpp"
+
+#include <fwCore/base.hpp>
+#include <fwServices/Base.hpp>
+
+namespace io
+{
+
+//-----------------------------------------------------------------------------
+
+IWriter::IWriter() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IWriter::~IWriter() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path &IWriter::getFile() const
+{
+    FW_RAISE_IF("This reader doesn't manage file", !(this->getIOPathType() & ::io::FILE));
+    FW_RAISE_IF("Sorry, one file must be define in location", m_locations.size() != 1);
+    return m_locations.front();
+}
+
+//-----------------------------------------------------------------------------
+
+void IWriter::setFile( const ::boost::filesystem::path &file)
+{
+    FW_RAISE_IF("This reader doesn't manage file", !(this->getIOPathType() & ::io::FILE));
+    m_locations.clear();
+    m_locations.push_back(file);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::io::LocationsType &IWriter::getFiles() const
+{
+    FW_RAISE_IF("This reader doesn't manage files", !(this->getIOPathType() & ::io::FILES));
+    FW_RAISE_IF("Sorry, at least one file must be define in location", m_locations.empty() );
+    return m_locations;
+}
+
+//-----------------------------------------------------------------------------
+
+void IWriter::setFiles(const ::io::LocationsType &files)
+{
+    FW_RAISE_IF("This reader doesn't manage files", !(this->getIOPathType() & ::io::FILES));
+    m_locations = files;
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path &IWriter::getFolder() const
+{
+    FW_RAISE_IF("This reader doesn't manage folder", !(this->getIOPathType() & ::io::FOLDER));
+    FW_RAISE_IF("Sorry, one folder must be define in location", m_locations.size() !=1 );
+    return m_locations.front();
+}
+
+//-----------------------------------------------------------------------------
+
+void IWriter::setFolder(const ::boost::filesystem::path &folder)
+{
+    FW_RAISE_IF("This reader doesn't manage folder", !(this->getIOPathType() & ::io::FOLDER));
+    m_locations.clear();
+    m_locations.push_back(folder);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::io::LocationsType &IWriter::getLocations() const
+{
+    FW_RAISE_IF("Sorry, at least one pâth must be define in location", m_locations.empty() );
+    return m_locations;
+}
+
+//-----------------------------------------------------------------------------
+
+void IWriter::clearLocations()
+{
+    m_locations.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void IWriter::configuring() throw (fwTools::Failed)
+{
+    SLM_ASSERT("Generic configuring method is just available for io service that uses pathes.", ! ( this->getIOPathType() & ::io::TYPE_NOT_DEFINED ) );
+
+    SLM_ASSERT("Sorry, you not manage folder and a folder path is given in the configuration",
+            ( this->getIOPathType() & ::io::FOLDER ) ||
+               ((! (this->getIOPathType() & ::io::FOLDER)) && (m_configuration->find("folder").size() == 0)) );
+
+    SLM_ASSERT("Sorry, you not manage file and a file path is given in the configuration",
+            ( this->getIOPathType() & ::io::FILE || this->getIOPathType() & ::io::FILES ) ||
+               ((!( this->getIOPathType() & ::io::FILE || this->getIOPathType() & ::io::FILES )) && (m_configuration->find("file").size() == 0)) );
+
+    if ( this->getIOPathType() & ::io::FILE )
+    {
+        FW_RAISE_IF("This reader cannot manages FILE and FILES.", this->getIOPathType() & ::io::FILES );
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("file");
+        FW_RAISE_IF("Sorry, only one file must be defined in configuration", config.size() > 1 );
+        if (config.size() == 1)
+        {
+            std::string file = config.at(0)->getValue();
+            this->setFile(::boost::filesystem::path(file));
+        }
+    }
+
+
+    if ( this->getIOPathType() & ::io::FILES )
+    {
+        FW_RAISE_IF("This reader cannot manages FILE and FILES.", this->getIOPathType() & ::io::FILE );
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("file");
+        ::io::LocationsType locations;
+        BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, config)
+        {
+            std::string location = elt->getValue();
+            locations.push_back(::boost::filesystem::path(location));
+        }
+        this->setFiles(locations);
+    }
+
+
+    if ( this->getIOPathType() & ::io::FOLDER )
+    {
+        std::vector< ::fwRuntime::ConfigurationElement::sptr > config = m_configuration->find("folder");
+        FW_RAISE_IF("Sorry, only one folder must be defined in configuration", config.size() > 1 );
+        if (config.size() == 1)
+        {
+            std::string folder = config.at(0)->getValue();
+            this->setFolder(::boost::filesystem::path(folder));
+        }
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+::io::IOPathType IWriter::getIOPathType() const
+{
+    return ::io::TYPE_NOT_DEFINED;
+}
+
+//-----------------------------------------------------------------------------
+
+bool IWriter::hasLocationDefined() const
+{
+    return m_locations.size() > 0;
+}
+
+//-----------------------------------------------------------------------------
+
+}
+
diff --git a/Bundles/core/io/src/io/Plugin.cpp b/Bundles/core/io/src/io/Plugin.cpp
new file mode 100644
index 0000000..b9e1db4
--- /dev/null
+++ b/Bundles/core/io/src/io/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "io/Plugin.hpp"
+
+namespace io
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("io::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace io
diff --git a/Bundles/core/memory/CMakeLists.txt b/Bundles/core/memory/CMakeLists.txt
new file mode 100644
index 0000000..370ca17
--- /dev/null
+++ b/Bundles/core/memory/CMakeLists.txt
@@ -0,0 +1,12 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwMemory
+    fwRuntime
+    fwServices
+    fwTools
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
diff --git a/Bundles/core/memory/COPYING b/Bundles/core/memory/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/memory/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/memory/COPYING.LESSER b/Bundles/core/memory/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/memory/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/memory/Properties.cmake b/Bundles/core/memory/Properties.cmake
new file mode 100644
index 0000000..15a27a1
--- /dev/null
+++ b/Bundles/core/memory/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME memory )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwCore fwData fwMemory fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/memory/bin/build.options b/Bundles/core/memory/bin/build.options
new file mode 100644
index 0000000..57aabd5
--- /dev/null
+++ b/Bundles/core/memory/bin/build.options
@@ -0,0 +1,11 @@
+TYPE    = 'bundle'
+LIB     = [
+          'fwServices_0-1',
+          'fwCore_0-1',
+          'fwRuntime_0-3',
+          'fwTools_0-1',
+          'fwMemory_0-1',
+          ]
+USE     = ['boost']
+VERSION = '0-1'
+
diff --git a/Bundles/core/memory/include/memory/Namespace.hpp b/Bundles/core/memory/include/memory/Namespace.hpp
new file mode 100644
index 0000000..d5d8629
--- /dev/null
+++ b/Bundles/core/memory/include/memory/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MEMORY_NAMESPACE_HPP_
+#define _MEMORY_NAMESPACE_HPP_
+
+/**
+ * @brief     The namespace memory contains tools to manage memory. Used for dump.
+ * @namespace memory
+ * 
+ * @date      2009-2011.
+ *
+ */
+namespace memory
+{
+
+}
+#endif /* _MEMORY_NAMESPACE_HPP_ */
diff --git a/Bundles/core/memory/include/memory/Plugin.hpp b/Bundles/core/memory/include/memory/Plugin.hpp
new file mode 100644
index 0000000..b2992c9
--- /dev/null
+++ b/Bundles/core/memory/include/memory/Plugin.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MEMORY_PLUGIN_HPP_
+#define _MEMORY_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+namespace memory
+{
+/**
+ * @brief   Implements a plugin for the memory bundle.
+ */
+struct Plugin : public ::fwRuntime::Plugin
+{
+    /**
+     * @brief   Destructor
+     */
+    ~Plugin() throw();
+
+    /**
+     * @brief Start method. (does nothing)
+     *
+     * This method is used by runtime in order to initialise the bundle.
+     *
+     * @exception ::fwRuntime::RuntimeException.
+     */
+    void start() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief Stop method. (does nothing)
+     *
+     * This method is used by runtime in order to close the bundle.
+     */
+    void stop() throw();
+
+};
+
+} // namespace memory
+
+#endif //_MEMORY_PLUGIN_HPP_
diff --git a/Bundles/core/memory/include/memory/SDumpPolicy.hpp b/Bundles/core/memory/include/memory/SDumpPolicy.hpp
new file mode 100644
index 0000000..5c55843
--- /dev/null
+++ b/Bundles/core/memory/include/memory/SDumpPolicy.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __MEMORY_SDUMPPOLICY_HPP__
+#define __MEMORY_SDUMPPOLICY_HPP__
+
+#include <fwTools/Failed.hpp>
+
+#include <fwServices/IController.hpp>
+
+#include <fwMemory/IPolicy.hpp>
+
+#include "memory/config.hpp"
+
+namespace memory
+{
+
+class MEMORY_CLASS_API SDumpPolicy : public ::fwServices::IController
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SDumpPolicy)(::fwServices::IController) ) ;
+
+    MEMORY_API SDumpPolicy();
+
+    MEMORY_API virtual ~SDumpPolicy();
+
+    /**
+     * Configuration example :
+     @verbatim
+     <service ...>
+       <config>
+         <policy>ValveDump</policy>
+         <params>
+          <min_free_mem>524288000</min_free_mem>
+          <hysteresis_offet>104857600</hysteresis_offet>
+         </params>
+       </config>
+     </service>
+      @endverbatim
+     * */
+    MEMORY_API virtual void configuring() throw ( ::fwTools::Failed );
+
+    /// Overrides
+    MEMORY_API virtual void starting() throw ( ::fwTools::Failed );
+
+    /// Overrides
+    MEMORY_API virtual void stopping() throw ( ::fwTools::Failed );
+
+    /// Overrides
+    MEMORY_API virtual void updating() throw ( ::fwTools::Failed );
+
+    /// Overrides
+    MEMORY_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /// Overrides
+    MEMORY_API virtual void swapping() throw ( ::fwTools::Failed );
+
+protected :
+
+    typedef std::vector< std::pair< ::fwMemory::IPolicy::ParamNamesType::value_type, std::string > > ParametersType;
+
+
+    std::string m_policy;
+    ParametersType m_policyParams;
+};
+
+
+
+} // namespace memory
+
+#endif /*__MEMORY_SDUMPPOLICY_HPP__*/
+
diff --git a/Bundles/core/memory/include/memory/config.hpp b/Bundles/core/memory/include/memory/config.hpp
new file mode 100644
index 0000000..7a17e04
--- /dev/null
+++ b/Bundles/core/memory/include/memory/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _MEMORY_CONFIG_HPP_
+#define _MEMORY_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef MEMORY_EXPORTS
+    #define MEMORY_API __declspec(dllexport)
+    #else
+    #define MEMORY_API __declspec(dllimport)
+    #endif
+
+    #define MEMORY_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef MEMORY_EXPORTS
+    #define MEMORY_API __attribute__ ((visibility("default")))
+    #define MEMORY_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define MEMORY_API __attribute__ ((visibility("hidden")))
+    #define MEMORY_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define MEMORY_API
+    #define MEMORY_CLASS_API
+
+#endif
+
+#endif //_MEMORY_CONFIG_HPP_
diff --git a/Bundles/core/memory/rc/plugin.xml b/Bundles/core/memory/rc/plugin.xml
new file mode 100644
index 0000000..928a54d
--- /dev/null
+++ b/Bundles/core/memory/rc/plugin.xml
@@ -0,0 +1,12 @@
+<plugin id="memory" class="memory::Plugin">
+
+    <library name="memory"/>
+
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::memory::SDumpPolicy</service>
+        <object>::fwData::Object</object>
+    </extension>
+
+</plugin>
diff --git a/Bundles/core/memory/src/memory/Plugin.cpp b/Bundles/core/memory/src/memory/Plugin.cpp
new file mode 100644
index 0000000..9305345
--- /dev/null
+++ b/Bundles/core/memory/src/memory/Plugin.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+#include <fwRuntime/operations.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/System.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/policy/AlwaysDump.hpp>
+#include <fwMemory/policy/BarrierDump.hpp>
+#include <fwMemory/policy/NeverDump.hpp>
+#include <fwMemory/policy/ValveDump.hpp>
+
+#include "memory/Plugin.hpp"
+
+namespace memory
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("memory::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+
+    const std::string modeKey = "loading_mode";
+
+    if ( this->getBundle()->hasParameter(modeKey) )
+    {
+        ::fwCore::mt::WriteLock lock( manager->getMutex() );
+        std::string mode = this->getBundle()->getParameterValue(modeKey);
+        if (mode == "lazy")
+        {
+            manager->setLoadingMode(::fwMemory::BufferManager::LAZY);
+            SLM_INFO("Enabled lazy loading mode");
+        }
+        else if (mode == "direct")
+        {
+            manager->setLoadingMode(::fwMemory::BufferManager::DIRECT);
+            SLM_INFO("Enabled direct loading mode");
+        }
+        else
+        {
+            SLM_ERROR("Unknown loading mode : '" + mode + "'");
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace memory
diff --git a/Bundles/core/memory/src/memory/SDumpPolicy.cpp b/Bundles/core/memory/src/memory/SDumpPolicy.cpp
new file mode 100644
index 0000000..7596f0d
--- /dev/null
+++ b/Bundles/core/memory/src/memory/SDumpPolicy.cpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+
+#include <fwCore/base.hpp>
+
+// Service associated data
+#include <fwData/Object.hpp>
+
+// Services tools
+#include <fwServices/Base.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/IPolicy.hpp>
+
+#include "memory/SDumpPolicy.hpp"
+
+
+namespace memory
+{
+
+fwServicesRegisterMacro( ::fwServices::IController, ::memory::SDumpPolicy, ::fwData::Object );
+
+SDumpPolicy::SDumpPolicy()
+{}
+
+SDumpPolicy::~SDumpPolicy()
+{}
+
+//------------------------------------------------------------------------------
+
+void SDumpPolicy::configuring() throw ( ::fwTools::Failed )
+{
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    std::vector < ConfigurationType > config = m_configuration->find("config");
+
+    if (!config.empty())
+    {
+        std::vector < ConfigurationType > policy = config.at(0)->find("policy");
+        std::vector < ConfigurationType > paramsElement = config.at(0)->find("params");
+
+        m_policyParams.clear();
+        m_policy = "";
+
+        if (!policy.empty())
+        {
+            m_policy = policy.at(0)->getValue();
+        }
+
+        if(!paramsElement.empty())
+        {
+            const ConfigurationType &params = paramsElement.at(0);
+
+            ::fwRuntime::ConfigurationElement::Container::const_iterator iter;
+
+            for (iter = params->begin(); iter != params->end(); ++iter)
+            {
+                m_policyParams.push_back( ParametersType::value_type((*iter)->getName(), (*iter)->getValue()));
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SDumpPolicy::starting() throw ( ::fwTools::Failed )
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    if (manager)
+    {
+        ::fwMemory::IPolicy::sptr policy = ::fwMemory::policy::registry::get()->create(m_policy);
+
+        if (policy)
+        {
+            bool success;
+            BOOST_FOREACH(const ParametersType::value_type &param, m_policyParams)
+            {
+                success = policy->setParam(param.first, param.second);
+                OSLM_ERROR_IF( "[" << m_policy << "] Unable to set '"
+                               << param.first << "' parameter to " << param.second,
+                               !success);
+                OSLM_INFO_IF("Set '" << param.first << "' policy parameter to " << param.second , success);
+            }
+            ::fwCore::mt::WriteLock lock( manager->getMutex() );
+            manager->setDumpPolicy(policy);
+            OSLM_INFO("Set dump policy to : " << m_policy);
+        }
+        OSLM_ERROR_IF("Unable to instantiate '" << m_policy << "' dump policy", !policy);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SDumpPolicy::stopping() throw ( ::fwTools::Failed )
+{}
+
+void SDumpPolicy::updating() throw ( ::fwTools::Failed )
+{}
+
+void SDumpPolicy::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{}
+
+//------------------------------------------------------------------------------
+
+void SDumpPolicy::swapping() throw ( ::fwTools::Failed )
+{
+    this->stopping();
+    this->starting();
+}
+
+} // namespace memory
+
+
diff --git a/Bundles/core/servicesReg/CMakeLists.txt b/Bundles/core/servicesReg/CMakeLists.txt
new file mode 100644
index 0000000..6c43e97
--- /dev/null
+++ b/Bundles/core/servicesReg/CMakeLists.txt
@@ -0,0 +1,6 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
+
diff --git a/Bundles/core/servicesReg/COPYING b/Bundles/core/servicesReg/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/servicesReg/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/servicesReg/COPYING.LESSER b/Bundles/core/servicesReg/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/servicesReg/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/servicesReg/Properties.cmake b/Bundles/core/servicesReg/Properties.cmake
new file mode 100644
index 0000000..b6e694d
--- /dev/null
+++ b/Bundles/core/servicesReg/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME servicesReg )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwComEd fwRuntime fwServices )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/servicesReg/bin/build.options b/Bundles/core/servicesReg/bin/build.options
new file mode 100644
index 0000000..abcac4b
--- /dev/null
+++ b/Bundles/core/servicesReg/bin/build.options
@@ -0,0 +1,8 @@
+TYPE    = 'bundle'
+USE     = ['boost']
+LIB     = ['fwRuntime_0-3','fwData_0-1','fwTools_0-1','fwCore_0-1','fwServices_0-1','fwComEd_0-1']
+REQUIREMENTS = [
+                'dataReg_0-1',
+                ]
+VERSION = '0-1'
+
diff --git a/Bundles/core/servicesReg/include/servicesReg/Namespace.hpp b/Bundles/core/servicesReg/include/servicesReg/Namespace.hpp
new file mode 100644
index 0000000..f2c566a
--- /dev/null
+++ b/Bundles/core/servicesReg/include/servicesReg/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef SERVICESREGNAMESPACE_HPP_
+#define SERVICESREGNAMESPACE_HPP_
+
+/**
+ * @brief      The namespace servicesReg (registration service) contains all types of low-level services essential to FW4SPL.
+ * @namespace  servicesReg
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace servicesReg
+{
+
+}
+#endif /* SERVICESREGNAMESPACE_HPP_ */
diff --git a/Bundles/core/servicesReg/include/servicesReg/Plugin.hpp b/Bundles/core/servicesReg/include/servicesReg/Plugin.hpp
new file mode 100644
index 0000000..d34a87c
--- /dev/null
+++ b/Bundles/core/servicesReg/include/servicesReg/Plugin.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SERVICESREG_PLUGIN_HPP_
+#define _SERVICESREG_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "servicesReg/config.hpp"
+
+namespace servicesReg
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+struct SERVICESREG_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /// Destructor. Do nothing.
+    SERVICESREG_API ~Plugin() throw();
+
+    /// Overrides start method. Service declarations (services declared in fwServices / fwComEd libraries ).
+    SERVICESREG_API void start() throw(::fwRuntime::RuntimeException);
+
+    /// Overrides initialize method
+    SERVICESREG_API void initialize() throw( ::fwRuntime::RuntimeException );
+
+    /// Overrides uninitialize method
+    SERVICESREG_API void uninitialize() throw( ::fwRuntime::RuntimeException );
+
+    /// Overrides stop method. Do nothing
+    SERVICESREG_API void stop() throw();
+
+};
+
+} // namespace servicesReg
+
+#endif // _SERVICESREG_PLUGIN_HPP_
diff --git a/Bundles/core/servicesReg/include/servicesReg/config.hpp b/Bundles/core/servicesReg/include/servicesReg/config.hpp
new file mode 100644
index 0000000..739d038
--- /dev/null
+++ b/Bundles/core/servicesReg/include/servicesReg/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _SERVICESREG_CONFIG_HPP_
+#define _SERVICESREG_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef SERVICESREG_EXPORTS
+    #define SERVICESREG_API __declspec(dllexport)
+    #else
+    #define SERVICESREG_API __declspec(dllimport)
+    #endif
+
+    #define SERVICESREG_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef SERVICESREG_EXPORTS
+    #define SERVICESREG_API __attribute__ ((visibility("default")))
+    #define SERVICESREG_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define SERVICESREG_API __attribute__ ((visibility("hidden")))
+    #define SERVICESREG_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define SERVICESREG_API
+    #define SERVICESREG_CLASS_API
+
+#endif
+
+#endif // _SERVICESREG_CONFIG_HPP_
diff --git a/Bundles/core/servicesReg/rc/appConfig.xsd b/Bundles/core/servicesReg/rc/appConfig.xsd
new file mode 100644
index 0000000..67d45d2
--- /dev/null
+++ b/Bundles/core/servicesReg/rc/appConfig.xsd
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="extension" type="ExtensionType" />
+
+    <xs:complexType name="ExtensionType">
+        <xs:sequence>
+            <xs:element name="id" type="xs:string" />
+            <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="parameters" type="ParametersType" minOccurs="0" maxOccurs="1"/>
+            <xs:element name="group" type="xs:string" minOccurs="0" maxOccurs="1"/>
+            <xs:element name="desc" type="xs:string" minOccurs="0" maxOccurs="1"/>
+            <xs:element name="config" type="ConfigType" />
+        </xs:sequence>
+        <xs:anyAttribute processContents="skip" />
+    </xs:complexType>
+
+    <xs:complexType name="ParametersType">
+        <xs:sequence>
+            <xs:element name="param" type="ParamType" maxOccurs="unbounded" minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+    
+    <xs:complexType name="ParamType">
+        <xs:attribute name='name' type='xs:string' use="required" />
+        <xs:attribute name='default' type='xs:string' />
+    </xs:complexType>
+    
+    <xs:complexType name="ConfigType">
+        <xs:sequence>
+            <xs:element name="object" type="ObjectType" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:simpleType name="TypeType">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="standard" />
+            <xs:enumeration value="template" />
+        </xs:restriction>
+    </xs:simpleType>
+
+    <!-- Object Type -->
+    <xs:complexType name="ObjectType">
+        <xs:sequence>
+            <xs:element name="serviceList" type="ServiceListType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="service" type="ServiceType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="matrix"  type="xs:string"  minOccurs="0" maxOccurs="1" />
+            <xs:element name="value"  type="xs:string"  minOccurs="0" maxOccurs="1" />
+            <xs:element name="item"  type="ItemType"  minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="node"  type="NodeType"  minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="edge"  type="EdgeType"  minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="connect"  type="ConnectionType"  minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="proxy"  type="ProxyType"  minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="start" type="StartType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="update" type="UpdateType" minOccurs="0" maxOccurs="unbounded" />
+            <!-- <xs:element name="stop" minOccurs="0" maxOccurs="0" /> -->
+            <!-- <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/> -->
+        </xs:sequence>
+        <xs:attribute name='uid' type='xs:string' />
+        <xs:attribute name='type' type='xs:string'/>
+        <xs:attribute name='src' type='xs:string' />
+    </xs:complexType>
+    
+    <!-- Item Type -->
+    <xs:complexType name="ItemType">
+        <xs:sequence>
+             <xs:element name="object" type="ObjectType" minOccurs="1" maxOccurs="1" />
+        </xs:sequence>
+        <xs:attribute name='key' type='xs:string' />
+    </xs:complexType>
+    
+    <!-- Service Type -->
+    <xs:complexType name="ServiceType">
+        <xs:sequence>
+            <xs:any processContents="skip" maxOccurs="unbounded" minOccurs="0"/>
+        </xs:sequence>
+        <xs:attribute name='uid' type='xs:string' />
+        <xs:attribute name='type' type='xs:string' use="optional" />
+        <xs:attribute name='impl' type='xs:string' use="required" />
+        <xs:attribute name='autoConnect' type='AutoConnectType' />
+        <xs:attribute name='worker' type='xs:string' />
+    </xs:complexType>
+
+    <!-- Connection Type -->
+    <xs:complexType name="ConnectionType">
+        <xs:sequence>
+            <xs:element name="signal"  type="xs:string"  minOccurs="1" maxOccurs="1" />
+            <xs:element name="slot"  type="xs:string"  minOccurs="1" maxOccurs="unbounded" />
+        </xs:sequence>
+    </xs:complexType>
+
+    <!-- Proxy Type -->
+    <xs:complexType name="ProxyType">
+        <xs:sequence>
+            <xs:element name="signal" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="slot" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
+        </xs:sequence>
+        <xs:attribute name='channel' type='xs:string' />
+    </xs:complexType>
+
+    <!-- Start/Update/stop Type -->
+    <xs:complexType name="StartType">
+        <xs:attribute name='uid' type='xs:string' />
+        <xs:attribute name='type' type='xs:string' />
+    </xs:complexType>
+    
+    <xs:complexType name="UpdateType">
+        <xs:attribute name='uid' type='xs:string' />
+        <xs:attribute name='type' type='xs:string' />
+    </xs:complexType>
+        
+    <xs:simpleType name="AutoConnectType">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="yes" />
+            <xs:enumeration value="no" />
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <!-- ServiceList Type -->
+    <xs:complexType name="ServiceListType">
+        <xs:sequence>
+            <xs:element name="service" type="ServiceType" minOccurs="1" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <!-- NodeType Type -->
+    <xs:complexType name="NodeType"> <!-- Almost the same as ObjectType -->
+        <xs:sequence>
+            <xs:element name="object" type="ObjectType" minOccurs="0" maxOccurs="1" />
+            <xs:element name="serviceList" type="ServiceListType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="service" type="ServiceType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="start" type="StartType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="update" type="UpdateType" minOccurs="0" maxOccurs="unbounded" />
+        </xs:sequence>
+        <xs:attribute name="uid" type="xs:string" use="required" />
+        <xs:attribute name="src" type="xs:string" />
+    </xs:complexType>
+
+    <!-- EdgeType Type -->
+    <xs:complexType name="EdgeType"> <!-- Same as NodeType, but with optionnal "weight" attribute -->
+        <xs:sequence>
+            <xs:element name="object" type="ObjectType" minOccurs="0" maxOccurs="1" />
+            <xs:element name="serviceList" type="ServiceListType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="service" type="ServiceType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="start" type="StartType" minOccurs="0" maxOccurs="unbounded" />
+            <xs:element name="update" type="UpdateType" minOccurs="0" maxOccurs="unbounded" />
+        </xs:sequence>
+        <xs:attribute name="origin" type="xs:string" use="required" />
+        <xs:attribute name="target" type="xs:string" use="required" />
+        <xs:attribute name="weight" type="xs:string" />
+        <xs:attribute name="uid" type="xs:string" />
+        <xs:attribute name="src" type="xs:string" />
+    </xs:complexType>
+
+</xs:schema>        
diff --git a/Bundles/core/servicesReg/rc/appConfigParameters.xsd b/Bundles/core/servicesReg/rc/appConfigParameters.xsd
new file mode 100644
index 0000000..2533345
--- /dev/null
+++ b/Bundles/core/servicesReg/rc/appConfigParameters.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="extension" type="ExtensionType" />
+
+    <xs:complexType name="ExtensionType">
+        <xs:sequence>
+            <xs:element name="id" type="xs:string" />
+            <xs:element name="parameters" type="ParametersType" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:anyAttribute processContents="skip" />
+    </xs:complexType>
+
+    <xs:complexType name="ParametersType">
+        <xs:sequence>
+            <xs:element name="param" type="ParamType" maxOccurs="unbounded" minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+    
+    <xs:complexType name="ParamType">
+        <xs:attribute name='name' type='xs:string' use="required" />
+        <xs:attribute name='value' type='xs:string' />
+    </xs:complexType>
+
+</xs:schema>        
diff --git a/Bundles/core/servicesReg/rc/plugin.xml b/Bundles/core/servicesReg/rc/plugin.xml
new file mode 100644
index 0000000..66ec6c5
--- /dev/null
+++ b/Bundles/core/servicesReg/rc/plugin.xml
@@ -0,0 +1,74 @@
+<plugin id="servicesReg" class="::servicesReg::Plugin" >
+
+    <library name="servicesReg" />
+
+    <requirement id="dataReg" />
+    
+    <!-- EXTENSION POINT FOR AN APP CONFIGURATION -->
+    <extension-point id="::fwServices::registry::AppConfig" schema="appConfig.xsd"/>
+    
+    <!-- EXTENSION POINT FOR APP CONFIGURATION PARAMETERS-->
+    <extension-point id="::fwServices::registry::AppConfigParameters" schema="appConfigParameters.xsd"/>
+    
+    <!-- EXTENSION POINT FOR A SERVICE FACTORY -->
+    <extension-point id="::fwServices::registry::ServiceFactory" schema="serviceFactory.xsd"/>
+
+    <!-- EXTENSION POINT FOR A SERVICE CONFIGURATION -->
+    <extension-point id="::fwServices::registry::ServiceConfig"  schema="serviceConfig.xsd"/>
+
+    <!-- SPECIFIC SERVICES -->
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::Composite</service>
+        <object>::fwData::Composite</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::TransformationMatrix3D</service>
+        <object>::fwData::TransformationMatrix3D</object>
+    </extension>
+
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::Object</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+     <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::List</service>
+        <object>::fwData::List</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::BooleanParser</service>
+        <object>::fwData::Boolean</object>
+    </extension>
+    
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::FloatParser</service>
+        <object>::fwData::Float</object>
+    </extension>
+    
+     <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::IntegerParser</service>
+        <object>::fwData::Integer</object>
+    </extension>
+    
+     <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IXMLParser</type>
+        <service>::fwComEd::parser::StringParser</service>
+        <object>::fwData::String</object>
+    </extension>
+     
+    <extension implements="::fwServices::registry::ServiceFactory">
+        <type>::fwServices::IController</type>
+        <service>::fwServices::SConfigController</service>
+        <object>::fwData::Object</object>
+    </extension>
+    
+</plugin>
diff --git a/Bundles/core/servicesReg/rc/serviceConfig.xsd b/Bundles/core/servicesReg/rc/serviceConfig.xsd
new file mode 100644
index 0000000..3527338
--- /dev/null
+++ b/Bundles/core/servicesReg/rc/serviceConfig.xsd
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    
+    <xs:element name="extension" type="ExtensionType" />
+
+    <xs:complexType name="ExtensionType">
+        <xs:sequence>
+            <xs:element name="id" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="service" type="xs:string" minOccurs="0" maxOccurs="1"/>
+            <xs:element name="desc" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="config" type="ConfigType" minOccurs="1" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:attribute name="implements" type="xs:string" use="required" />
+    </xs:complexType>
+
+    <xs:complexType name="ConfigType">
+        <xs:sequence>
+            <xs:any minOccurs="1" maxOccurs="unbounded" processContents="skip" />
+        </xs:sequence>
+    </xs:complexType>
+
+</xs:schema>
+   
\ No newline at end of file
diff --git a/Bundles/core/servicesReg/rc/serviceFactory.xsd b/Bundles/core/servicesReg/rc/serviceFactory.xsd
new file mode 100644
index 0000000..e555872
--- /dev/null
+++ b/Bundles/core/servicesReg/rc/serviceFactory.xsd
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    
+    <xs:element name="extension" type="ExtensionType" />
+
+    <xs:complexType name="ExtensionType">
+        <xs:sequence>
+            <xs:element name="type" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="service" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="object" type="xs:string" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="desc" type="xs:string" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:attribute name="implements" type="xs:string" use="required" />
+    </xs:complexType>
+
+</xs:schema>
+  
\ No newline at end of file
diff --git a/Bundles/core/servicesReg/src/servicesReg/Plugin.cpp b/Bundles/core/servicesReg/src/servicesReg/Plugin.cpp
new file mode 100644
index 0000000..3254016
--- /dev/null
+++ b/Bundles/core/servicesReg/src/servicesReg/Plugin.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwComEd/parser/Composite.hpp>
+
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/registry/AppConfigParameters.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include "servicesReg/Plugin.hpp"
+
+namespace servicesReg
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar<Plugin> registrar("::servicesReg::Plugin");
+
+//-----------------------------------------------------------------------------
+
+Plugin::~Plugin() throw()
+{
+    ::fwComEd::parser::Composite::sptr objectCreatedToForceLink;
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::start() throw( ::fwRuntime::RuntimeException )
+{
+    ::fwServices::registry::ServiceFactory::getDefault()->parseBundleInformation();
+    ::fwServices::registry::ServiceConfig::getDefault()->parseBundleInformation();
+    ::fwServices::registry::AppConfig::getDefault()->parseBundleInformation();
+    ::fwServices::registry::AppConfigParameters::getDefault()->parseBundleInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::initialize() throw( ::fwRuntime::RuntimeException )
+{}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::uninitialize() throw( ::fwRuntime::RuntimeException )
+{
+    // Clear all service configs
+    ::fwServices::registry::ServiceConfig::getDefault()->clearRegistry();
+
+    // Clear all app configuration
+    ::fwServices::registry::AppConfig::getDefault()->clearRegistry();
+
+    // Clear all app configuration parameters
+    ::fwServices::registry::AppConfigParameters::getDefault()->clearRegistry();
+
+    // Clear all service factories
+    ::fwServices::registry::ServiceFactory::getDefault()->clearFactory();
+
+    // Clear all active Workers
+    ::fwServices::registry::ActiveWorkers::getDefault()->clearRegistry();
+}
+
+//-----------------------------------------------------------------------------
+
+void Plugin::stop() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace servicesReg
diff --git a/Bundles/core/visu/CMakeLists.txt b/Bundles/core/visu/CMakeLists.txt
new file mode 100644
index 0000000..2449a4b
--- /dev/null
+++ b/Bundles/core/visu/CMakeLists.txt
@@ -0,0 +1,9 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwRuntime
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
diff --git a/Bundles/core/visu/COPYING b/Bundles/core/visu/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/Bundles/core/visu/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/Bundles/core/visu/COPYING.LESSER b/Bundles/core/visu/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/Bundles/core/visu/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/Bundles/core/visu/Properties.cmake b/Bundles/core/visu/Properties.cmake
new file mode 100644
index 0000000..eda91e1
--- /dev/null
+++ b/Bundles/core/visu/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME visu )
+set( VERSION 0.1 )
+set( TYPE BUNDLE )
+set( DEPENDENCIES fwRuntime )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/core/visu/bin/build.options b/Bundles/core/visu/bin/build.options
new file mode 100644
index 0000000..8cf6ede
--- /dev/null
+++ b/Bundles/core/visu/bin/build.options
@@ -0,0 +1,7 @@
+TYPE     = 'bundle'
+USE      = ['boost']
+LIB      = ['fwRuntime_0-3','fwData_0-1','fwServices_0-1','fwComEd_0-1','fwTools_0-1','fwCore_0-1','fwRender_0-1']
+REQUIREMENTS = [
+                'servicesReg_0-1',
+                ]
+VERSION  = '0-1'
diff --git a/Bundles/core/visu/include/visu/Namespace.hpp b/Bundles/core/visu/include/visu/Namespace.hpp
new file mode 100644
index 0000000..21ff575
--- /dev/null
+++ b/Bundles/core/visu/include/visu/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef VISUNAMESPACE_HPP_
+#define VISUNAMESPACE_HPP_
+
+/**
+ * @brief      The namespace visu contains low-level visu services essential to FW4SPL.
+ * @namespace  visu
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace visu
+{
+
+}
+#endif /* VISUNAMESPACE_HPP_ */
diff --git a/Bundles/core/visu/include/visu/Plugin.hpp b/Bundles/core/visu/include/visu/Plugin.hpp
new file mode 100644
index 0000000..4ec6892
--- /dev/null
+++ b/Bundles/core/visu/include/visu/Plugin.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISU_PLUGIN_HPP_
+#define _VISU_PLUGIN_HPP_
+
+#include <fwRuntime/Plugin.hpp>
+
+#include "visu/config.hpp"
+
+namespace visu
+{
+
+/**
+ * @brief   This class is started when the bundles is loaded.
+ * @class   Plugin
+ */
+struct VISU_CLASS_API Plugin : public ::fwRuntime::Plugin
+{
+    /// Destructor. Do nothing.
+    VISU_API ~Plugin() throw();
+
+    /// Overrides start method. Do nothing
+    VISU_API void start() throw(::fwRuntime::RuntimeException);
+
+    /// Overrides stop method. Do nothing
+    VISU_API void stop() throw();
+
+};
+
+} // namespace visu
+
+#endif //_VISU_PLUGIN_HPP_
diff --git a/Bundles/core/visu/include/visu/config.hpp b/Bundles/core/visu/include/visu/config.hpp
new file mode 100644
index 0000000..3eb6287
--- /dev/null
+++ b/Bundles/core/visu/include/visu/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VISU_CONFIG_HPP_
+#define _VISU_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef VISU_EXPORTS
+    #define VISU_API __declspec(dllexport)
+    #else
+    #define VISU_API __declspec(dllimport)
+    #endif
+
+    #define VISU_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef VISU_EXPORTS
+    #define VISU_API __attribute__ ((visibility("default")))
+    #define VISU_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define VISU_API __attribute__ ((visibility("hidden")))
+    #define VISU_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define VISU_API
+    #define VISU_CLASS_API
+
+#endif
+
+#endif //_VISU_CONFIG_HPP_
diff --git a/Bundles/core/visu/rc/chest.xml b/Bundles/core/visu/rc/chest.xml
new file mode 100755
index 0000000..a9831c6
--- /dev/null
+++ b/Bundles/core/visu/rc/chest.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<TransferFunctionData>
+    <!--Here are the points colour(rgb), level-->
+    <Point>
+        <Level>0.000000</Level>
+        <Opacity>0.000000</Opacity>
+        <Blue>0.000000</Blue>
+        <Green>0.000000</Green>
+        <Red>0.000000</Red>
+    </Point>
+    <Point>
+        <Level>0.179946</Level>
+        <Opacity>0.000000</Opacity>
+        <Blue>0.000000</Blue>
+        <Green>0.000000</Green>
+        <Red>0.000000</Red>
+    </Point>
+    <Point>
+        <Level>0.205688</Level>
+        <Opacity>0.075000</Opacity>
+        <Blue>0.262745</Blue>
+        <Green>0.352941</Green>
+        <Red>0.996078</Red>
+    </Point>
+    <Point>
+        <Level>0.247119</Level>
+        <Opacity>0.645000</Opacity>
+        <Blue>0.403922</Blue>
+        <Green>0.909804</Green>
+        <Red>0.921569</Red>
+    </Point>
+    <Point>
+        <Level>0.314783</Level>
+        <Opacity>0.000000</Opacity>
+        <Blue>0.992157</Blue>
+        <Green>0.992157</Green>
+        <Red>0.992157</Red>
+    </Point>
+    <Point>
+        <Level>1.000000</Level>
+        <Opacity>0.000000</Opacity>
+        <Blue>1.000000</Blue>
+        <Green>1.000000</Green>
+        <Red>1.000000</Red>
+    </Point>
+</TransferFunctionData>
diff --git a/Bundles/core/visu/rc/locale/en/LC_MESSAGES/visualization.po b/Bundles/core/visu/rc/locale/en/LC_MESSAGES/visualization.po
new file mode 100644
index 0000000..9257e44
--- /dev/null
+++ b/Bundles/core/visu/rc/locale/en/LC_MESSAGES/visualization.po
@@ -0,0 +1,59 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 13:59+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:158
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:159
+#, possible-c-format
+msgid "%d"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:234
+msgid "-0000"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:235
+msgid "+0000"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:236
+msgid "    "
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:244
+msgid "0\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:245
+msgid "20\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:246
+msgid "40\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:247
+msgid "60\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:248
+msgid "80\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:249
+msgid "100\\%"
+msgstr ""
diff --git a/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization-Final.po b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization-Final.po
new file mode 100644
index 0000000..e10d157
--- /dev/null
+++ b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization-Final.po
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 14:27+0200\n"
+"PO-Revision-Date: 2008-06-13 22:45+0100\n"
+"Last-Translator: Johan Moreau <Johan.Moreau at laposte.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "TFZoomPanel::SendEvent"
+msgstr ""
+
+msgid "Windowing"
+msgstr ""
+
+msgid "Slices Position"
+msgstr ""
+
+msgid "Min"
+msgstr ""
+
+msgid "Max"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Width"
+msgstr ""
+
+msgid "Axial"
+msgstr ""
+
+msgid "Frontal"
+msgstr ""
+
+msgid "Sagittal"
+msgstr ""
diff --git a/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.po b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.po
new file mode 100644
index 0000000..d4ef0f3
--- /dev/null
+++ b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.po
@@ -0,0 +1,59 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 14:27+0200\n"
+"PO-Revision-Date: 2008-06-13 22:45+0100\n"
+"Last-Translator: Johan Moreau <Johan.Moreau at laposte.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:158
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:159
+#, possible-c-format
+msgid "%d"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:234
+msgid "-0000"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:235
+msgid "+0000"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:236
+msgid "    "
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:244
+msgid "0\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:245
+msgid "20\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:246
+msgid "40\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:247
+msgid "60\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:248
+msgid "80\\%"
+msgstr ""
+
+#: C:/Dev/Bundles/visualization/src/visu/widgets/TFGraphWidget.cpp:249
+msgid "100\\%"
+msgstr ""
+
diff --git a/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.pot b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.pot
new file mode 100644
index 0000000..5ebdc62
--- /dev/null
+++ b/Bundles/core/visu/rc/locale/fr/LC_MESSAGES/visualization.pot
@@ -0,0 +1,29 @@
+msgid "TFZoomPanel::SendEvent"
+msgstr ""
+
+msgid "Windowing"
+msgstr ""
+
+msgid "Slices Position"
+msgstr ""
+
+msgid "Min"
+msgstr ""
+
+msgid "Max"
+msgstr ""
+
+msgid "Center"
+msgstr ""
+
+msgid "Width"
+msgstr ""
+
+msgid "Axial"
+msgstr ""
+
+msgid "Frontal"
+msgstr ""
+
+msgid "Sagittal"
+msgstr ""
diff --git a/Bundles/core/visu/rc/plugin.xml b/Bundles/core/visu/rc/plugin.xml
new file mode 100644
index 0000000..639f112
--- /dev/null
+++ b/Bundles/core/visu/rc/plugin.xml
@@ -0,0 +1,10 @@
+<plugin id="visu" class="::visu::Plugin" >
+
+    <library name="visu" />
+
+    <requirement id="servicesReg" />
+
+</plugin>
+
+
+
diff --git a/Bundles/core/visu/rc/visuCfg.xsd b/Bundles/core/visu/rc/visuCfg.xsd
new file mode 100644
index 0000000..3151f68
--- /dev/null
+++ b/Bundles/core/visu/rc/visuCfg.xsd
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?> 
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:element name="extension" type="ExtensionType"/>
+
+<xs:complexType name="ExtensionType">
+  <xs:sequence>
+    <xs:element name="service" type="VisualizationServiceType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:anyAttribute processContents="skip" />
+</xs:complexType>
+
+<xs:complexType name="VisualizationServiceType">
+  <xs:sequence>
+    <xs:element name="service" type="DelegateType" minOccurs="0" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:attribute name="clockRateMSeconds" type="xs:integer" />  
+</xs:complexType>
+
+<xs:complexType name="DelegateType">
+  <xs:attribute name="config" type="xs:string" use="required" />
+  <xs:attribute name="type" type="xs:string" use="required" />
+</xs:complexType>
+
+</xs:schema>
\ No newline at end of file
diff --git a/Bundles/core/visu/src/visu/Plugin.cpp b/Bundles/core/visu/src/visu/Plugin.cpp
new file mode 100644
index 0000000..49300b5
--- /dev/null
+++ b/Bundles/core/visu/src/visu/Plugin.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include "visu/Plugin.hpp"
+
+namespace visu
+{
+
+static ::fwRuntime::utils::GenericExecutableFactoryRegistrar< Plugin > registrar ("::visu::Plugin");
+
+Plugin::~Plugin() throw()
+{}
+
+void Plugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+void Plugin::stop() throw()
+{}
+
+} // namespace visu
diff --git a/Bundles/media/CMakeLists.txt b/Bundles/media/CMakeLists.txt
new file mode 100644
index 0000000..1c29206
--- /dev/null
+++ b/Bundles/media/CMakeLists.txt
@@ -0,0 +1,2 @@
+fwLoadProperties()
+
diff --git a/Bundles/media/Properties.cmake b/Bundles/media/Properties.cmake
new file mode 100644
index 0000000..91ca06c
--- /dev/null
+++ b/Bundles/media/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME media )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES  )
+set( REQUIREMENTS  )
+
diff --git a/Bundles/media/bin/build.options b/Bundles/media/bin/build.options
new file mode 100644
index 0000000..5c1132c
--- /dev/null
+++ b/Bundles/media/bin/build.options
@@ -0,0 +1,3 @@
+TYPE    = 'bundle'
+VERSION = '0-1'
+BUNDLES = []
diff --git a/Bundles/media/rc/camera-photo.png b/Bundles/media/rc/camera-photo.png
new file mode 100644
index 0000000..1e8e886
Binary files /dev/null and b/Bundles/media/rc/camera-photo.png differ
diff --git a/Bundles/media/rc/delete.png b/Bundles/media/rc/delete.png
new file mode 100644
index 0000000..c8e2ccc
Binary files /dev/null and b/Bundles/media/rc/delete.png differ
diff --git a/Bundles/media/rc/distance.png b/Bundles/media/rc/distance.png
new file mode 100644
index 0000000..7c00070
Binary files /dev/null and b/Bundles/media/rc/distance.png differ
diff --git a/Bundles/media/rc/export.png b/Bundles/media/rc/export.png
new file mode 100644
index 0000000..a94e0ea
Binary files /dev/null and b/Bundles/media/rc/export.png differ
diff --git a/Bundles/media/rc/icon-dump.svg b/Bundles/media/rc/icon-dump.svg
new file mode 100644
index 0000000..59e1e9c
--- /dev/null
+++ b/Bundles/media/rc/icon-dump.svg
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.2"
+   width="131.70744"
+   height="131.70744"
+   id="svg3005"
+   style="enable-background:new">
+  <defs
+     id="defs3007">
+    <linearGradient
+       id="linearGradient3797">
+      <stop
+         id="stop3799"
+         style="stop-color:#000000;stop-opacity:1"
+         offset="0" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title></dc:title>
+          </cc:Agent>
+        </dc:creator>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-237.3183,-121.94415)"
+     id="layer1"
+     style="display:inline">
+    <text
+       x="246.47722"
+       y="272.52441"
+       id="text3013"
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"><tspan
+         x="246.47722"
+         y="272.52441"
+         id="tspan3015" /></text>
+    <rect
+       width="121.70744"
+       height="121.70744"
+       ry="9.9183826"
+       x="242.3183"
+       y="126.94415"
+       id="rect3023"
+       style="fill:#ffffff;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <flowRoot
+       transform="translate(241.5368,126.16265)"
+       id="flowRoot3761"
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"><flowRegion
+         id="flowRegion3763"><rect
+           width="213.39473"
+           height="148.9975"
+           x="-35.860416"
+           y="3.5673711"
+           id="rect3765" /></flowRegion><flowPara
+         id="flowPara3767" /></flowRoot>    <text
+       x="246.12517"
+       y="235.61986"
+       id="text3941"
+       xml:space="preserve"
+       style="font-size:72.88785553px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#d4aa00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Sans"><tspan
+         x="246.12517"
+         y="235.61986"
+         id="tspan3943"
+         style="font-size:131.19813538px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#d4aa00;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold">D</tspan></text>
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/Add-landmark.png b/Bundles/media/rc/icons/Add-landmark.png
new file mode 100644
index 0000000..33a4b2f
Binary files /dev/null and b/Bundles/media/rc/icons/Add-landmark.png differ
diff --git a/Bundles/media/rc/icons/Export.svg b/Bundles/media/rc/icons/Export.svg
new file mode 100644
index 0000000..ec0b95c
--- /dev/null
+++ b/Bundles/media/rc/icons/Export.svg
@@ -0,0 +1,256 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.70744"
+   height="131.70744"
+   id="svg3005"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="Export.svg">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6067633"
+     inkscape:cx="65.074916"
+     inkscape:cy="42.178218"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs3007">
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleOutM"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutM">
+      <path
+         transform="scale(0.4) translate(-4.5,0)"
+         style="fill-rule:evenodd;fill:#FFFFFF;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path4313" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="TriangleOutL"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="TriangleOutL">
+      <path
+         transform="scale(0.8)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path4292" />
+    </marker>
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient5522">
+      <stop
+         id="stop5524"
+         offset="0"
+         style="stop-color:#00da00;stop-opacity:1;" />
+    </linearGradient>
+    <marker
+       style="overflow:visible"
+       id="SquareL"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="SquareL">
+      <path
+         transform="scale(0.8)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         id="path4220" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         id="path4176" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow1Lend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         transform="scale(0.8) rotate(180) translate(12.5,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         id="path4152" />
+    </marker>
+    <linearGradient
+       id="linearGradient3811"
+       inkscape:collect="always">
+      <stop
+         id="stop3813"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3815"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient3797">
+      <stop
+         id="stop3799"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="187.79788"
+       x2="310.13318"
+       y1="187.79788"
+       x1="296.21085"
+       id="linearGradient3817"
+       xlink:href="#linearGradient3811"
+       inkscape:collect="always" />
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mend5"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend5">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#000091;stroke-width:0.62500000;fill:#000091"
+         id="path9748" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mendi"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mendi">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#000091;stroke-width:0.62500000;fill:#000091"
+         id="path10835" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleOutMP"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutMP">
+      <path
+         transform="scale(0.4) translate(-4.5,0)"
+         style="stroke-width:1.0pt;marker-start:none;stroke:#000091;fill:#000091;fill-rule:evenodd"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path11676" />
+    </marker>
+  </defs>
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-237.3183,-121.94415)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Calque 1">
+    <text
+       sodipodi:linespacing="125%"
+       id="text3013"
+       y="272.52441"
+       x="246.47722"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       xml:space="preserve"><tspan
+         y="272.52441"
+         x="246.47722"
+         id="tspan3015"
+         sodipodi:role="line" /></text>
+    <rect
+       ry="9.9183826"
+       y="126.94415"
+       x="242.3183"
+       height="121.70744"
+       width="121.70744"
+       id="rect3023"
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <flowRoot
+       transform="translate(241.5368,126.16265)"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       id="flowRoot3761"
+       xml:space="preserve"><flowRegion
+         id="flowRegion3763"><rect
+           y="3.5673711"
+           x="-35.860416"
+           height="148.9975"
+           width="213.39473"
+           id="rect3765" /></flowRegion><flowPara
+         id="flowPara3767" /></flowRoot>    <path
+       inkscape:connector-curvature="0"
+       id="path7303"
+       d="m 270.37729,187.79787 54.42979,0 0,0"
+       style="fill:#258600;fill-opacity:1;stroke:#000091;stroke-width:16.85420418;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-mid:none;marker-end:none" />
+    <path
+       sodipodi:type="star"
+       style="fill:#000091;fill-opacity:1;stroke:#000091;stroke-width:7.69999981;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path12133"
+       sodipodi:sides="3"
+       sodipodi:cx="34.957779"
+       sodipodi:cy="28.26095"
+       sodipodi:r1="17.229597"
+       sodipodi:r2="8.6147985"
+       sodipodi:arg1="2.0943951"
+       sodipodi:arg2="3.1415927"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 26.34298,43.182219 0,-29.842538 25.844396,14.921269 z"
+       transform="matrix(1.1741657,0,0,1.3863786,284.57114,148.61749)"
+       inkscape:transform-center-x="-2.7571873" />
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/Find-landmark.png b/Bundles/media/rc/icons/Find-landmark.png
new file mode 100644
index 0000000..4071446
Binary files /dev/null and b/Bundles/media/rc/icons/Find-landmark.png differ
diff --git a/Bundles/media/rc/icons/FullCross.png b/Bundles/media/rc/icons/FullCross.png
new file mode 100644
index 0000000..10a1f1f
Binary files /dev/null and b/Bundles/media/rc/icons/FullCross.png differ
diff --git a/Bundles/media/rc/icons/HideCross.png b/Bundles/media/rc/icons/HideCross.png
new file mode 100644
index 0000000..f7715cf
Binary files /dev/null and b/Bundles/media/rc/icons/HideCross.png differ
diff --git a/Bundles/media/rc/icons/HideDistance.png b/Bundles/media/rc/icons/HideDistance.png
new file mode 100644
index 0000000..463c034
Binary files /dev/null and b/Bundles/media/rc/icons/HideDistance.png differ
diff --git a/Bundles/media/rc/icons/ImageSeries.svg b/Bundles/media/rc/icons/ImageSeries.svg
new file mode 100644
index 0000000..0efa650
--- /dev/null
+++ b/Bundles/media/rc/icons/ImageSeries.svg
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.70744"
+   height="131.70744"
+   id="svg3005"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="ImageSeries.svg">
+  <defs
+     id="defs3007">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3811">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3813" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3815" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3797"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3799" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811"
+       id="linearGradient3817"
+       x1="296.21085"
+       y1="187.79788"
+       x2="310.13318"
+       y2="187.79788"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.959798"
+     inkscape:cx="109.91142"
+     inkscape:cy="34.461352"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-237.3183,-121.94415)">
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="246.47722"
+       y="272.52441"
+       id="text3013"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3015"
+         x="246.47722"
+         y="272.52441" /></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect3023"
+       width="121.70744"
+       height="121.70744"
+       x="242.3183"
+       y="126.94415"
+       ry="9.9183826" />
+    <text
+       xml:space="preserve"
+       style="font-size:124.11940765px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#800000;fill-opacity:1;stroke:#000000;stroke-width:0.35172948;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+       x="280.11176"
+       y="233.03966"
+       id="text3025"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3027"
+         x="280.11176"
+         y="233.03966"
+         style="font-weight:bold;stroke:#000000;stroke-width:0.35172948;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;-inkscape-font-specification:DejaVu Sans Bold">I</tspan></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3761"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       transform="translate(241.5368,126.16265)"><flowRegion
+         id="flowRegion3763"><rect
+           id="rect3765"
+           width="213.39473"
+           height="148.9975"
+           x="-35.860416"
+           y="3.5673711" /></flowRegion><flowPara
+         id="flowPara3767"></flowPara></flowRoot>  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/Import.svg b/Bundles/media/rc/icons/Import.svg
new file mode 100644
index 0000000..3d181b9
--- /dev/null
+++ b/Bundles/media/rc/icons/Import.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.70744"
+   height="131.70744"
+   id="svg3005"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="Import.svg">
+  <defs
+     id="defs3007">
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3811">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3813" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop3815" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3797"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3799" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3811"
+       id="linearGradient3817"
+       x1="296.21085"
+       y1="187.79788"
+       x2="310.13318"
+       y2="187.79788"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6067633"
+     inkscape:cx="21.370828"
+     inkscape:cy="30.259817"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="1002"
+     inkscape:window-x="1912"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-237.3183,-121.94415)">
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="246.47722"
+       y="272.52441"
+       id="text3013"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3015"
+         x="246.47722"
+         y="272.52441" /></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="rect3023"
+       width="121.70744"
+       height="121.70744"
+       x="242.3183"
+       y="126.94415"
+       ry="9.9183826" />
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3761"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       transform="translate(241.5368,126.16265)"><flowRegion
+         id="flowRegion3763"><rect
+           id="rect3765"
+           width="213.39473"
+           height="148.9975"
+           x="-35.860416"
+           y="3.5673711" /></flowRegion><flowPara
+         id="flowPara3767" /></flowRoot>    <path
+       style="fill:#00b300;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.71428572999999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 295.67202,213.06573 0,-17.94643 -17.85714,0 -17.85715,0 0,-7.5 0,-7.5 17.85715,0 17.85714,0 0,-17.76785 0,-17.76786 7.5,0 7.5,0 0,17.76786 0,17.76785 17.85714,0 17.85714,0 0,7.5 0,7.5 -17.85714,0 -17.85714,0 0,17.94643 0,17.94643 -7.5,0 -7.5,0 0,-17.94643 z"
+       id="path3001"
+       inkscape:connector-curvature="0" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3764"
+       d="m 295.67202,213.06573 0,-17.94643 -17.85714,0 -17.85715,0 0,-7.5 0,-7.5 17.85715,0 17.85714,0 0,-17.76785 0,-17.76786 7.5,0 7.5,0 0,17.76786 0,17.76785 17.85714,0 17.85714,0 0,7.5 0,7.5 -17.85714,0 -17.85714,0 0,17.94643 0,17.94643 -7.5,0 -7.5,0 0,-17.94643 z"
+       style="fill:#00b300;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.71428572999999995;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/Launch_activity.svg b/Bundles/media/rc/icons/Launch_activity.svg
new file mode 100644
index 0000000..1a05086
--- /dev/null
+++ b/Bundles/media/rc/icons/Launch_activity.svg
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.70744"
+   height="131.70744"
+   id="svg3005"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="Launch_activity.svg">
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.6067633"
+     inkscape:cx="65.074916"
+     inkscape:cy="49.131734"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs3007">
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleOutM"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutM">
+      <path
+         transform="scale(0.4) translate(-4.5,0)"
+         style="fill-rule:evenodd;fill:#FFFFFF;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path4313" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="TriangleOutL"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="TriangleOutL">
+      <path
+         transform="scale(0.8)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path4292" />
+    </marker>
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient5522">
+      <stop
+         id="stop5524"
+         offset="0"
+         style="stop-color:#00da00;stop-opacity:1;" />
+    </linearGradient>
+    <marker
+       style="overflow:visible"
+       id="SquareL"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="SquareL">
+      <path
+         transform="scale(0.8)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         d="M -5.0,-5.0 L -5.0,5.0 L 5.0,5.0 L 5.0,-5.0 L -5.0,-5.0 z "
+         id="path4220" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         id="path4176" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow1Lend"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow1Lend">
+      <path
+         transform="scale(0.8) rotate(180) translate(12.5,0)"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         id="path4152" />
+    </marker>
+    <linearGradient
+       id="linearGradient3811"
+       inkscape:collect="always">
+      <stop
+         id="stop3813"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop3815"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       osb:paint="solid"
+       id="linearGradient3797">
+      <stop
+         id="stop3799"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       y2="187.79788"
+       x2="310.13318"
+       y1="187.79788"
+       x1="296.21085"
+       id="linearGradient3817"
+       xlink:href="#linearGradient3811"
+       inkscape:collect="always" />
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mend5"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mend5">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#000091;stroke-width:0.62500000;fill:#000091"
+         id="path9748" />
+    </marker>
+    <marker
+       style="overflow:visible;"
+       id="Arrow2Mendi"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="Arrow2Mendi">
+      <path
+         transform="scale(0.6) rotate(180) translate(0,0)"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#000091;stroke-width:0.62500000;fill:#000091"
+         id="path10835" />
+    </marker>
+    <marker
+       style="overflow:visible"
+       id="EmptyTriangleOutMP"
+       refX="0.0"
+       refY="0.0"
+       orient="auto"
+       inkscape:stockid="EmptyTriangleOutMP">
+      <path
+         transform="scale(0.4) translate(-4.5,0)"
+         style="stroke-width:1.0pt;marker-start:none;stroke:#000091;fill:#000091;fill-rule:evenodd"
+         d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+         id="path11676" />
+    </marker>
+  </defs>
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(-237.3183,-121.94415)"
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="Calque 1">
+    <text
+       sodipodi:linespacing="125%"
+       id="text3013"
+       y="272.52441"
+       x="246.47722"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       xml:space="preserve"><tspan
+         y="272.52441"
+         x="246.47722"
+         id="tspan3015"
+         sodipodi:role="line" /></text>
+    <rect
+       ry="9.9183826"
+       y="126.94415"
+       x="242.3183"
+       height="121.70744"
+       width="121.70744"
+       id="rect3023"
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    <flowRoot
+       transform="translate(241.5368,126.16265)"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       id="flowRoot3761"
+       xml:space="preserve"><flowRegion
+         id="flowRegion3763"><rect
+           y="3.5673711"
+           x="-35.860416"
+           height="148.9975"
+           width="213.39473"
+           id="rect3765" /></flowRegion><flowPara
+         id="flowPara3767" /></flowRoot>    <path
+       sodipodi:type="star"
+       style="fill:#00b300;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-opacity:1"
+       id="path12151"
+       sodipodi:sides="3"
+       sodipodi:cx="39.238323"
+       sodipodi:cy="83.729675"
+       sodipodi:r1="24.972391"
+       sodipodi:r2="12.486195"
+       sodipodi:arg1="0"
+       sodipodi:arg2="1.0471976"
+       inkscape:flatsided="true"
+       inkscape:rounded="0"
+       inkscape:randomized="0"
+       d="m 64.210714,83.729675 -37.458586,21.626725 0,-43.25345 z"
+       transform="matrix(1.9710858,0,0,1.7626382,213.52424,40.21275)"
+       inkscape:transform-center-x="-12.305683" />
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/Load-landmark.png b/Bundles/media/rc/icons/Load-landmark.png
new file mode 100644
index 0000000..01da05b
Binary files /dev/null and b/Bundles/media/rc/icons/Load-landmark.png differ
diff --git a/Bundles/media/rc/icons/ManageOrgan.png b/Bundles/media/rc/icons/ManageOrgan.png
new file mode 100644
index 0000000..8cc739a
Binary files /dev/null and b/Bundles/media/rc/icons/ManageOrgan.png differ
diff --git a/Bundles/media/rc/icons/ModelSeries.svg b/Bundles/media/rc/icons/ModelSeries.svg
new file mode 100644
index 0000000..67b572b
--- /dev/null
+++ b/Bundles/media/rc/icons/ModelSeries.svg
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="131.71875"
+   height="131.71875"
+   id="svg3005"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="ModelSeries.svg">
+  <defs
+     id="defs3007">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3822"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+    <linearGradient
+       id="linearGradient3797"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop3799" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.8"
+     inkscape:cx="28.460101"
+     inkscape:cy="37.367914"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1018"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata3010">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-250.1875,-121.9375)">
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
+       x="246.47722"
+       y="272.52441"
+       id="text3013"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3015"
+         x="246.47722"
+         y="272.52441"></tspan></text>
+    <rect
+       style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;opacity:1;"
+       id="rect3023"
+       width="121.70744"
+       height="121.70744"
+       x="255.19417"
+       y="126.94415"
+       ry="9.9183826" />
+    <text
+       xml:space="preserve"
+       style="font-size:108.76456451px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#005544;fill-opacity:1;stroke:#000000;stroke-width:0.30863425;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans Bold"
+       x="291.01212"
+       y="211.66046"
+       id="text3025"
+       sodipodi:linespacing="125%"
+       transform="scale(0.91596119,1.0917493)"><tspan
+         sodipodi:role="line"
+         id="tspan3027"
+         x="291.01212"
+         y="211.66046"
+         style="font-weight:bold;fill:#005544;stroke:#000000;stroke-width:0.30863425;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;-inkscape-font-specification:DejaVu Sans Bold">M</tspan></text>
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/NormalCross.png b/Bundles/media/rc/icons/NormalCross.png
new file mode 100644
index 0000000..fd4e12b
Binary files /dev/null and b/Bundles/media/rc/icons/NormalCross.png differ
diff --git a/Bundles/media/rc/icons/Remove-landmark.png b/Bundles/media/rc/icons/Remove-landmark.png
new file mode 100644
index 0000000..a174e5a
Binary files /dev/null and b/Bundles/media/rc/icons/Remove-landmark.png differ
diff --git a/Bundles/media/rc/icons/RemoveDistance.png b/Bundles/media/rc/icons/RemoveDistance.png
new file mode 100644
index 0000000..34a612a
Binary files /dev/null and b/Bundles/media/rc/icons/RemoveDistance.png differ
diff --git a/Bundles/media/rc/icons/Save-landmark.png b/Bundles/media/rc/icons/Save-landmark.png
new file mode 100644
index 0000000..b2b5889
Binary files /dev/null and b/Bundles/media/rc/icons/Save-landmark.png differ
diff --git a/Bundles/media/rc/icons/View-landmark.png b/Bundles/media/rc/icons/View-landmark.png
new file mode 100644
index 0000000..1951d6f
Binary files /dev/null and b/Bundles/media/rc/icons/View-landmark.png differ
diff --git a/Bundles/media/rc/icons/camera-photo.png b/Bundles/media/rc/icons/camera-photo.png
new file mode 100644
index 0000000..1e8e886
Binary files /dev/null and b/Bundles/media/rc/icons/camera-photo.png differ
diff --git a/Bundles/media/rc/icons/distance.png b/Bundles/media/rc/icons/distance.png
new file mode 100644
index 0000000..bbb215e
Binary files /dev/null and b/Bundles/media/rc/icons/distance.png differ
diff --git a/Bundles/media/rc/icons/icon-2D.png b/Bundles/media/rc/icons/icon-2D.png
new file mode 100644
index 0000000..c802c3f
Binary files /dev/null and b/Bundles/media/rc/icons/icon-2D.png differ
diff --git a/Bundles/media/rc/icons/icon-3D.png b/Bundles/media/rc/icons/icon-3D.png
new file mode 100644
index 0000000..950234a
Binary files /dev/null and b/Bundles/media/rc/icons/icon-3D.png differ
diff --git a/Bundles/media/rc/icons/icon-VR.png b/Bundles/media/rc/icons/icon-VR.png
new file mode 100644
index 0000000..787163e
Binary files /dev/null and b/Bundles/media/rc/icons/icon-VR.png differ
diff --git a/Bundles/media/rc/icons/icon-axial.png b/Bundles/media/rc/icons/icon-axial.png
new file mode 100644
index 0000000..ba1b7de
Binary files /dev/null and b/Bundles/media/rc/icons/icon-axial.png differ
diff --git a/Bundles/media/rc/icons/icon-blend.png b/Bundles/media/rc/icons/icon-blend.png
new file mode 100644
index 0000000..aba2494
Binary files /dev/null and b/Bundles/media/rc/icons/icon-blend.png differ
diff --git a/Bundles/media/rc/icons/icon-box-reset.png b/Bundles/media/rc/icons/icon-box-reset.png
new file mode 100644
index 0000000..ad45d9c
Binary files /dev/null and b/Bundles/media/rc/icons/icon-box-reset.png differ
diff --git a/Bundles/media/rc/icons/icon-box.png b/Bundles/media/rc/icons/icon-box.png
new file mode 100644
index 0000000..2379197
Binary files /dev/null and b/Bundles/media/rc/icons/icon-box.png differ
diff --git a/Bundles/media/rc/icons/icon-exportVRParam.png b/Bundles/media/rc/icons/icon-exportVRParam.png
new file mode 100644
index 0000000..7f97f7b
Binary files /dev/null and b/Bundles/media/rc/icons/icon-exportVRParam.png differ
diff --git a/Bundles/media/rc/icons/icon-frontal.png b/Bundles/media/rc/icons/icon-frontal.png
new file mode 100644
index 0000000..3622453
Binary files /dev/null and b/Bundles/media/rc/icons/icon-frontal.png differ
diff --git a/Bundles/media/rc/icons/icon-landmark.png b/Bundles/media/rc/icons/icon-landmark.png
new file mode 100644
index 0000000..777e621
Binary files /dev/null and b/Bundles/media/rc/icons/icon-landmark.png differ
diff --git a/Bundles/media/rc/icons/icon-sagittal.png b/Bundles/media/rc/icons/icon-sagittal.png
new file mode 100644
index 0000000..36e9989
Binary files /dev/null and b/Bundles/media/rc/icons/icon-sagittal.png differ
diff --git a/Bundles/media/rc/icons/icon-tf1.svg b/Bundles/media/rc/icons/icon-tf1.svg
new file mode 100644
index 0000000..7193c30
--- /dev/null
+++ b/Bundles/media/rc/icons/icon-tf1.svg
@@ -0,0 +1,476 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="700"
+   height="660"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="icon-tf1.svg"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient4351">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#800015;stop-opacity:1" />
+      <stop
+         id="stop4369"
+         offset="0.26923078"
+         style="stop-color:#ff8080;stop-opacity:1" />
+      <stop
+         style="stop-color:#ff8000;stop-opacity:1"
+         offset="0.46153846"
+         id="stop4371" />
+      <stop
+         id="stop4375"
+         offset="0.57692307"
+         style="stop-color:#ffbf00;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffff08;stop-opacity:1"
+         offset="0.84615386"
+         id="stop4377" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.92307693"
+         id="stop4355" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4351"
+       id="linearGradient4357"
+       x1="40"
+       y1="1132.3622"
+       x2="560"
+       y2="1132.3622"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       id="filter4739"
+       inkscape:label="Drop shadow"
+       width="1.5"
+       height="1.5"
+       x="-0.25"
+       y="-0.25"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4741"
+         in="SourceAlpha"
+         stdDeviation="2"
+         result="blur" />
+      <feColorMatrix
+         id="feColorMatrix4743"
+         result="bluralpha"
+         type="matrix"
+         values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 " />
+      <feOffset
+         id="feOffset4745"
+         in="bluralpha"
+         dx="5"
+         dy="5"
+         result="offsetBlur" />
+      <feMerge
+         id="feMerge4747">
+        <feMergeNode
+           id="feMergeNode4749"
+           in="offsetBlur" />
+        <feMergeNode
+           id="feMergeNode4751"
+           in="SourceGraphic" />
+      </feMerge>
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       y="-0.25"
+       x="-0.25"
+       height="1.5"
+       width="1.5"
+       inkscape:label="Drop shadow"
+       id="filter4739-9">
+      <feGaussianBlur
+         result="blur"
+         stdDeviation="2"
+         in="SourceAlpha"
+         id="feGaussianBlur4741-4" />
+      <feColorMatrix
+         values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 "
+         type="matrix"
+         result="bluralpha"
+         id="feColorMatrix4743-8" />
+      <feOffset
+         result="offsetBlur"
+         dy="5"
+         dx="5"
+         in="bluralpha"
+         id="feOffset4745-8" />
+      <feMerge
+         id="feMerge4747-2">
+        <feMergeNode
+           in="offsetBlur"
+           id="feMergeNode4749-4" />
+        <feMergeNode
+           in="SourceGraphic"
+           id="feMergeNode4751-5" />
+      </feMerge>
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4351"
+       id="linearGradient3946"
+       gradientUnits="userSpaceOnUse"
+       x1="40"
+       y1="1132.3622"
+       x2="560"
+       y2="1132.3622" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="-185.47394"
+     inkscape:cy="136.19199"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1012"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3573"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Calque#1"
+     style="display:inline"
+     transform="translate(20,18.313354)">
+    <rect
+       style="fill:#2c2c2c;fill-opacity:1;stroke:none"
+       id="rect3134"
+       width="700"
+       height="660"
+       x="-20"
+       y="-18.313354" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Calque"
+     style="display:inline"
+     transform="translate(60.5,-495.3125)">
+    <path
+       style="fill:url(#linearGradient3946);fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0"
+       d="m -40,1132.3622 80,0 120,-140.00002 80,-100 140,-160 100,-120 80,0 0,520.00002 z"
+       id="path3579"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffff08;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none"
+       id="path4379"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-140.5,165.21429)"
+       sodipodi:type="arc"
+       style="fill:#ffbf00;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-7"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-200.50001,233.78572)"
+       sodipodi:type="arc"
+       style="fill:#ff8000;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-1"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-301.92857,355.21429)"
+       sodipodi:type="arc"
+       style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-15"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-439.78571,519.5)"
+       sodipodi:type="arc"
+       style="fill:#800015;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-6"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -40,1072.3622 c 5,0 5,0 5,0"
+       id="path4446"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,1012.3622 c 5,0 5,0 5,0"
+       id="path4446-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,952.36218 c 5,0 5,0 5,0"
+       id="path4446-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,892.36218 c 5,0 5,0 5,0"
+       id="path4446-26"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,832.36218 c 5,0 5,0 5,0"
+       id="path4446-30"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,712.36218 c 5,0 5,0 5,0"
+       id="path4446-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,652.36218 c 5,0 5,0 5,0"
+       id="path4446-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,592.36218 c 5,0 5,0 5,0"
+       id="path4446-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,532.36218 c 5,0 5,0 5,0"
+       id="path4446-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,772.36218 c 5,0 5,0 5,0"
+       id="path4446-8-0"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:none"
+       id="rect4535"
+       width="30.660061"
+       height="520.04968"
+       x="559.16492"
+       y="612.3125" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -40,532.36218 0,600.00002 660,0"
+       id="path3577"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
+       x="-35"
+       y="1131.3622"
+       id="text3600"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602"
+         x="-35"
+         y="1131.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="1072.3622"
+       id="text3600-3"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7"
+         x="-35"
+         y="1072.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="1012.3622"
+       id="text3600-3-0"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-6"
+         x="-35"
+         y="1012.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="952.36218"
+       id="text3600-3-5"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-9"
+         x="-35"
+         y="952.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="892.36218"
+       id="text3600-3-3"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-63"
+         x="-35"
+         y="892.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="832.36218"
+       id="text3600-3-1"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-0"
+         x="-35"
+         y="832.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.5</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="772.36218"
+       id="text3600-3-00"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-5"
+         x="-35"
+         y="772.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.6</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="712.36218"
+       id="text3600-3-55"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-1"
+         x="-35"
+         y="712.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.7</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="652.36218"
+       id="text3600-3-54"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-7"
+         x="-35"
+         y="652.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.8</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="592.36218"
+       id="text3600-3-04"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-3"
+         x="-35"
+         y="592.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.9</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="532.36218"
+       id="text3600-3-6"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-79"
+         x="-35"
+         y="532.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-15"
+       y="522.36218"
+       id="text3600-3-8"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-50"
+         x="-15"
+         y="522.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">%</tspan></text>
+    <g
+       transform="translate(-129.92413,205.36859)"
+       style="font-size:80px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:3.4000001;stroke-miterlimit:4;stroke-opacity:1;filter:url(#filter4739-9);font-family:Sans"
+       id="text4539-5">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 699.98663,908.91266 -39.51562,0 0,-148.92188 c -14.43756,13.50014 -31.45317,23.4845 -51.04688,29.95313 l 0,-35.85938 c 10.31247,-3.37484 21.51558,-9.77327 33.60938,-19.19531 12.09368,-9.42169 20.39055,-20.41387 24.89062,-32.97656 l 32.0625,0 z"
+         style="font-size:288px;font-weight:bold;fill:#ff0000;stroke:#000000;-inkscape-font-specification:Sans Bold"
+         id="path3158" />
+    </g>
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.98260736;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.94782211, 0.98260737;stroke-dashoffset:0"
+       d="m 561.5,612.3125 c 28,0 28,0 28,0"
+       id="path3948"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/Bundles/media/rc/icons/icon-tf2.svg b/Bundles/media/rc/icons/icon-tf2.svg
new file mode 100644
index 0000000..bc0d939
--- /dev/null
+++ b/Bundles/media/rc/icons/icon-tf2.svg
@@ -0,0 +1,510 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="700"
+   height="660"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.0 r9654"
+   sodipodi:docname="icon-tf1.svg"
+   style="display:inline">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient4351">
+      <stop
+         id="stop4359"
+         offset="0"
+         style="stop-color:#800015;stop-opacity:1" />
+      <stop
+         id="stop4369"
+         offset="0.26923078"
+         style="stop-color:#ff8080;stop-opacity:1" />
+      <stop
+         style="stop-color:#ff8000;stop-opacity:1"
+         offset="0.46153846"
+         id="stop4371" />
+      <stop
+         id="stop4375"
+         offset="0.57692307"
+         style="stop-color:#ffbf00;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffff08;stop-opacity:1"
+         offset="0.84615386"
+         id="stop4377" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.92307693"
+         id="stop4355" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4351"
+       id="linearGradient4357"
+       x1="40"
+       y1="1132.3622"
+       x2="560"
+       y2="1132.3622"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       id="filter4739"
+       inkscape:label="Drop shadow"
+       width="1.5"
+       height="1.5"
+       x="-0.25"
+       y="-0.25"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur4741"
+         in="SourceAlpha"
+         stdDeviation="2"
+         result="blur" />
+      <feColorMatrix
+         id="feColorMatrix4743"
+         result="bluralpha"
+         type="matrix"
+         values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 " />
+      <feOffset
+         id="feOffset4745"
+         in="bluralpha"
+         dx="5"
+         dy="5"
+         result="offsetBlur" />
+      <feMerge
+         id="feMerge4747">
+        <feMergeNode
+           id="feMergeNode4749"
+           in="offsetBlur" />
+        <feMergeNode
+           id="feMergeNode4751"
+           in="SourceGraphic" />
+      </feMerge>
+    </filter>
+    <filter
+       color-interpolation-filters="sRGB"
+       y="-0.25"
+       x="-0.25"
+       height="1.5"
+       width="1.5"
+       inkscape:label="Drop shadow"
+       id="filter4739-9">
+      <feGaussianBlur
+         result="blur"
+         stdDeviation="2"
+         in="SourceAlpha"
+         id="feGaussianBlur4741-4" />
+      <feColorMatrix
+         values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 "
+         type="matrix"
+         result="bluralpha"
+         id="feColorMatrix4743-8" />
+      <feOffset
+         result="offsetBlur"
+         dy="5"
+         dx="5"
+         in="bluralpha"
+         id="feOffset4745-8" />
+      <feMerge
+         id="feMerge4747-2">
+        <feMergeNode
+           in="offsetBlur"
+           id="feMergeNode4749-4" />
+        <feMergeNode
+           in="SourceGraphic"
+           id="feMergeNode4751-5" />
+      </feMerge>
+    </filter>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient4351"
+       id="linearGradient3946"
+       gradientUnits="userSpaceOnUse"
+       x1="40"
+       y1="1132.3622"
+       x2="560"
+       y2="1132.3622" />
+    <filter
+       color-interpolation-filters="sRGB"
+       id="filter4739-4"
+       inkscape:label="Drop shadow"
+       width="1.5"
+       height="1.5"
+       x="-0.25"
+       y="-0.25">
+      <feGaussianBlur
+         id="feGaussianBlur4741-3"
+         in="SourceAlpha"
+         stdDeviation="2"
+         result="blur" />
+      <feColorMatrix
+         id="feColorMatrix4743-1"
+         result="bluralpha"
+         type="matrix"
+         values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0.5 0 " />
+      <feOffset
+         id="feOffset4745-1"
+         in="bluralpha"
+         dx="5"
+         dy="5"
+         result="offsetBlur" />
+      <feMerge
+         id="feMerge4747-8">
+        <feMergeNode
+           id="feMergeNode4749-7"
+           in="offsetBlur" />
+        <feMergeNode
+           id="feMergeNode4751-9"
+           in="SourceGraphic" />
+      </feMerge>
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="341.82569"
+     inkscape:cy="196.80114"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1012"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="true"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3573"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer1"
+     inkscape:label="Calque#1"
+     style="display:inline"
+     transform="translate(20,18.313354)">
+    <rect
+       style="fill:#2c2c2c;fill-opacity:1;stroke:none"
+       id="rect3134"
+       width="700"
+       height="660"
+       x="-20"
+       y="-18.313354" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Calque"
+     style="display:inline"
+     transform="translate(60.5,-495.3125)">
+    <path
+       style="fill:url(#linearGradient3946);fill-opacity:1;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 1;stroke-dashoffset:0"
+       d="m -40,1132.3622 80,0 120,-140.00002 80,-100 140,-160 100,-120 80,0 0,520.00002 z"
+       id="path3579"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffff08;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none"
+       id="path4379"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-140.5,165.21429)"
+       sodipodi:type="arc"
+       style="fill:#ffbf00;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-7"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-200.50001,233.78572)"
+       sodipodi:type="arc"
+       style="fill:#ff8000;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-1"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-301.92857,355.21429)"
+       sodipodi:type="arc"
+       style="fill:#ff8080;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-15"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       transform="translate(-439.78571,519.5)"
+       sodipodi:type="arc"
+       style="fill:#800015;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-miterlimit:5.80000019;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path4379-6"
+       sodipodi:cx="480.5"
+       sodipodi:cy="612.86218"
+       sodipodi:rx="2.5"
+       sodipodi:ry="2.5"
+       d="m 483,612.86218 c 0,1.38071 -1.11929,2.5 -2.5,2.5 -1.38071,0 -2.5,-1.11929 -2.5,-2.5 0,-1.38071 1.11929,-2.5 2.5,-2.5 1.38071,0 2.5,1.11929 2.5,2.5 z" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m -40,1072.3622 c 5,0 5,0 5,0"
+       id="path4446"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,1012.3622 c 5,0 5,0 5,0"
+       id="path4446-2"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,952.36218 c 5,0 5,0 5,0"
+       id="path4446-3"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,892.36218 c 5,0 5,0 5,0"
+       id="path4446-26"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,832.36218 c 5,0 5,0 5,0"
+       id="path4446-30"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,712.36218 c 5,0 5,0 5,0"
+       id="path4446-8"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,652.36218 c 5,0 5,0 5,0"
+       id="path4446-7"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,592.36218 c 5,0 5,0 5,0"
+       id="path4446-0"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,532.36218 c 5,0 5,0 5,0"
+       id="path4446-4"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.70710677px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
+       d="m -40,772.36218 c 5,0 5,0 5,0"
+       id="path4446-8-0"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;stroke:none"
+       id="rect4535"
+       width="30.660061"
+       height="520.04968"
+       x="559.16492"
+       y="612.3125" />
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m -40,532.36218 0,600.00002 660,0"
+       id="path3577"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
+       x="-35"
+       y="1131.3622"
+       id="text3600"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602"
+         x="-35"
+         y="1131.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="1072.3622"
+       id="text3600-3"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7"
+         x="-35"
+         y="1072.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="1012.3622"
+       id="text3600-3-0"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-6"
+         x="-35"
+         y="1012.3622"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.2</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="952.36218"
+       id="text3600-3-5"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-9"
+         x="-35"
+         y="952.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.3</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="892.36218"
+       id="text3600-3-3"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-63"
+         x="-35"
+         y="892.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.4</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="832.36218"
+       id="text3600-3-1"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-0"
+         x="-35"
+         y="832.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.5</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="772.36218"
+       id="text3600-3-00"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-5"
+         x="-35"
+         y="772.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.6</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="712.36218"
+       id="text3600-3-55"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-1"
+         x="-35"
+         y="712.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.7</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="652.36218"
+       id="text3600-3-54"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-7"
+         x="-35"
+         y="652.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.8</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="592.36218"
+       id="text3600-3-04"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-3"
+         x="-35"
+         y="592.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">0.9</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-35"
+       y="532.36218"
+       id="text3600-3-6"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-79"
+         x="-35"
+         y="532.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">1</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-weight:normal;line-height:119.00000572%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Sans"
+       x="-15"
+       y="522.36218"
+       id="text3600-3-8"
+       sodipodi:linespacing="119.00001%"><tspan
+         sodipodi:role="line"
+         id="tspan3602-7-50"
+         x="-15"
+         y="522.36218"
+         style="font-size:12px;line-height:119.00000572%;fill:#ffffff;fill-opacity:1">%</tspan></text>
+    <path
+       style="fill:none;stroke:#ffffff;stroke-width:0.98260736;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.94782211, 0.98260737;stroke-dashoffset:0"
+       d="m 561.5,612.3125 c 28,0 28,0 28,0"
+       id="path3948"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="translate(-21.875,2.6249995)"
+       style="font-size:80px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:3.4000001;stroke-miterlimit:4;stroke-opacity:1;display:inline;filter:url(#filter4739-4);font-family:Sans"
+       id="text4539">
+      <path
+         inkscape:connector-curvature="0"
+         d="m 605.1875,1078.6094 0,36.7031 -138.51563,0 c 1.5,-13.875 5.99999,-27.0234 13.5,-39.4453 7.49998,-12.4218 22.31246,-28.8984 44.4375,-49.4297 17.81242,-16.5936 28.73429,-27.84363 32.76563,-33.75 5.4374,-8.15612 8.15614,-16.21861 8.15625,-24.1875 -1.1e-4,-8.81234 -2.36729,-15.58578 -7.10156,-20.32031 -4.73447,-4.73421 -11.27353,-7.10139 -19.61719,-7.10157 -8.25007,1.8e-4 -14.81256,2.48455 -19.6875,7.45313 -4.87505,4.96891 -7.68755,13.2189 -8.4375,24.75 l -39.375,-3.9375 c 2.343 [...]
+         style="font-size:288px;font-weight:bold;fill:#ff0000;stroke:#000000;-inkscape-font-specification:Sans Bold"
+         id="path4311" />
+    </g>
+  </g>
+</svg>
diff --git a/Bundles/media/rc/import.png b/Bundles/media/rc/import.png
new file mode 100644
index 0000000..254a6b8
Binary files /dev/null and b/Bundles/media/rc/import.png differ
diff --git a/Bundles/media/rc/new.png b/Bundles/media/rc/new.png
new file mode 100644
index 0000000..e3808a1
Binary files /dev/null and b/Bundles/media/rc/new.png differ
diff --git a/Bundles/media/rc/nowindowing.svg b/Bundles/media/rc/nowindowing.svg
new file mode 100644
index 0000000..ff5d292
--- /dev/null
+++ b/Bundles/media/rc/nowindowing.svg
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="680.00018"
+   height="634.40582"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="windowing.svg"
+   inkscape:export-filename="D:\DEV\src\fw4spl\Bundles\LeafUI\uiImageQt\rc\windowing.png"
+   inkscape:export-xdpi="9.0793619"
+   inkscape:export-ydpi="9.0793619">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="352.14288"
+     inkscape:cy="-114.16591"
+     inkscape:document-units="px"
+     inkscape:current-layer="g2985"
+     showgrid="false"
+     inkscape:window-width="916"
+     inkscape:window-height="735"
+     inkscape:window-x="452"
+     inkscape:window-y="160"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-22.857118,-12.361963)">
+    <g
+       id="g2985">
+      <path
+         transform="matrix(2.7499985,0,0,2.612255,-699.9996,-641.79902)"
+         sodipodi:open="true"
+         sodipodi:end="4.6933769"
+         sodipodi:start="1.5835996"
+         d="m 264.26742,363.7891 c -0.78892,-0.14142 -1.42027,-9.20963 -1.41017,-20.25442 0.01,-10.79712 0.63015,-19.53504 1.4013,-19.74032"
+         sodipodi:ry="20"
+         sodipodi:rx="1.4285715"
+         sodipodi:cy="343.79074"
+         sodipodi:cx="264.28571"
+         id="path3005"
+         style="fill:#ffffff"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(2.7499985,0,0,2.612255,-711.42817,-661.79902)"
+         sodipodi:end="7.8656587"
+         sodipodi:start="1.5835996"
+         d="m 392.74935,500.92366 c -66.26873,-0.85861 -119.30231,-55.91561 -118.45381,-122.97327 0.8485,-67.05765 55.25778,-120.72258 121.52652,-119.86398 66.26873,0.85861 119.30231,55.91561 118.45381,122.97327 -0.84783,67.00425 -55.1745,120.64811 -121.39138,119.86565 l 1.40122,-121.42029 z"
+         sodipodi:ry="121.42857"
+         sodipodi:rx="120"
+         sodipodi:cy="379.50504"
+         sodipodi:cx="394.28571"
+         id="path3021"
+         style="fill:#000000"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(3.3999846,0,0,3.3831113,-341.56943,-703.02292)"
+         sodipodi:open="true"
+         sodipodi:end="4.6929323"
+         sodipodi:start="1.5835996"
+         d="m 204.61689,392.35515 c -47.33482,-0.60607 -85.21595,-39.46984 -84.60987,-86.80466 0.59229,-46.25862 37.78599,-83.70061 84.03965,-84.60067"
+         sodipodi:ry="85.714287"
+         sodipodi:rx="85.714287"
+         sodipodi:cy="306.64789"
+         sodipodi:cx="205.71428"
+         id="path3023"
+         style="fill:#ffffff"
+         sodipodi:type="arc" />
+      <rect
+         style="fill:#ff0000;stroke-width:200;stroke-miterlimit:4;stroke-dasharray:none"
+         id="rect2986"
+         width="124.48076"
+         height="798.55103"
+         x="427.11346"
+         y="-398.09259"
+         transform="matrix(0.74325516,0.66900804,-0.72502592,0.68872158,0,0)" />
+    </g>
+  </g>
+</svg>
diff --git a/Bundles/media/rc/plugin.xml b/Bundles/media/rc/plugin.xml
new file mode 100644
index 0000000..c41a0d7
--- /dev/null
+++ b/Bundles/media/rc/plugin.xml
@@ -0,0 +1,2 @@
+<plugin id="media">
+</plugin>
diff --git a/Bundles/media/rc/ramp.png b/Bundles/media/rc/ramp.png
new file mode 100644
index 0000000..47d8504
Binary files /dev/null and b/Bundles/media/rc/ramp.png differ
diff --git a/Bundles/media/rc/reinitialize.png b/Bundles/media/rc/reinitialize.png
new file mode 100644
index 0000000..7e90b1c
Binary files /dev/null and b/Bundles/media/rc/reinitialize.png differ
diff --git a/Bundles/media/rc/rename.png b/Bundles/media/rc/rename.png
new file mode 100644
index 0000000..7166e3d
Binary files /dev/null and b/Bundles/media/rc/rename.png differ
diff --git a/Bundles/media/rc/sliceHide.png b/Bundles/media/rc/sliceHide.png
new file mode 100644
index 0000000..14a1f34
Binary files /dev/null and b/Bundles/media/rc/sliceHide.png differ
diff --git a/Bundles/media/rc/sliceShow.png b/Bundles/media/rc/sliceShow.png
new file mode 100644
index 0000000..84c4fe9
Binary files /dev/null and b/Bundles/media/rc/sliceShow.png differ
diff --git a/Bundles/media/rc/square.png b/Bundles/media/rc/square.png
new file mode 100644
index 0000000..17f5b3a
Binary files /dev/null and b/Bundles/media/rc/square.png differ
diff --git a/Bundles/media/rc/windowing.svg b/Bundles/media/rc/windowing.svg
new file mode 100644
index 0000000..9081e04
--- /dev/null
+++ b/Bundles/media/rc/windowing.svg
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="680.00018"
+   height="634.40582"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="windowing.svg"
+   inkscape:export-filename="D:\DEV\src\fw4spl\Bundles\LeafUI\uiImageQt\rc\windowing.png"
+   inkscape:export-xdpi="9.0793619"
+   inkscape:export-ydpi="9.0793619">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="352.14288"
+     inkscape:cy="-114.16591"
+     inkscape:document-units="px"
+     inkscape:current-layer="g2985"
+     showgrid="false"
+     inkscape:window-width="916"
+     inkscape:window-height="735"
+     inkscape:window-x="512"
+     inkscape:window-y="206"
+     inkscape:window-maximized="0"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-22.857118,-12.361963)">
+    <g
+       id="g2985">
+      <path
+         transform="matrix(2.7499985,0,0,2.612255,-699.9996,-641.79902)"
+         sodipodi:open="true"
+         sodipodi:end="4.6933769"
+         sodipodi:start="1.5835996"
+         d="m 264.26742,363.7891 c -0.78892,-0.14142 -1.42027,-9.20963 -1.41017,-20.25442 0.01,-10.79712 0.63015,-19.53504 1.4013,-19.74032"
+         sodipodi:ry="20"
+         sodipodi:rx="1.4285715"
+         sodipodi:cy="343.79074"
+         sodipodi:cx="264.28571"
+         id="path3005"
+         style="fill:#ffffff"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(2.7499985,0,0,2.612255,-711.42817,-661.79902)"
+         sodipodi:end="7.8656587"
+         sodipodi:start="1.5835996"
+         d="m 392.74935,500.92366 c -66.26873,-0.85861 -119.30231,-55.91561 -118.45381,-122.97327 0.8485,-67.05765 55.25778,-120.72258 121.52652,-119.86398 66.26873,0.85861 119.30231,55.91561 118.45381,122.97327 -0.84783,67.00425 -55.1745,120.64811 -121.39138,119.86565 l 1.40122,-121.42029 z"
+         sodipodi:ry="121.42857"
+         sodipodi:rx="120"
+         sodipodi:cy="379.50504"
+         sodipodi:cx="394.28571"
+         id="path3021"
+         style="fill:#000000"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(3.3999846,0,0,3.3831113,-341.56943,-703.02292)"
+         sodipodi:open="true"
+         sodipodi:end="4.6929323"
+         sodipodi:start="1.5835996"
+         d="m 204.61689,392.35515 c -47.33482,-0.60607 -85.21595,-39.46984 -84.60987,-86.80466 0.59229,-46.25862 37.78599,-83.70061 84.03965,-84.60067"
+         sodipodi:ry="85.714287"
+         sodipodi:rx="85.714287"
+         sodipodi:cy="306.64789"
+         sodipodi:cx="205.71428"
+         id="path3023"
+         style="fill:#ffffff"
+         sodipodi:type="arc" />
+    </g>
+  </g>
+</svg>
diff --git a/Bundles/media/src/media/media.cpp b/Bundles/media/src/media/media.cpp
new file mode 100644
index 0000000..e6a00e9
--- /dev/null
+++ b/Bundles/media/src/media/media.cpp
@@ -0,0 +1 @@
+namespace media{}
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
new file mode 100644
index 0000000..6f66d04
--- /dev/null
+++ b/CHANGELOG.txt
@@ -0,0 +1,693 @@
+=== fw4spl_0.9.2.2 ( diff from fw4spl_0.9.2.1 ) 20/06/2013 ===
+ 
+ * Transplanted from fw4spl_0.9.1.4.:
+  * Added a getAttribute() template method on fwAtoms/Object.
+  * fixed on fwAtoms/Object attributes and metaInfos
+  * Added version number on atom (see fwAtoms/Base.hpp) 
+  * Updated fwCore::SpyLogger to remove logger global severity.   
+  * Updated CompareObjects visitor for BufferObject   
+  * Created a new library fwAtomsPatch which contains the base interface to transform atoms from a version to an other into a context.  
+  * Added a version generator utility to generate .versions files (files used by the patch system).
+  * Added MedicalData pacth system to VRRender
+  * Updated ioAtoms reader(SReader)/writer(SWriter) to use the patch system.
+  * Added verison on Atom writers/readers(Hdf5 reader/writer and BoostIO writer/reader). 
+  * Added test for getAttribute() template method. 
+
+ * General : 
+  * Cleaned fwZip: removed old and deprecated class/API, group minizip classes.
+  * 'MediacalData' object version change to V2
+  * Updated fwData::Reconstruction to version 2 (some attributes have been removed).
+  * Fixed duplicated extension filename in objWriter.
+  * Added atoms_version and writer_version in TF files (json files)
+  
+ * Patch system : 
+  * Create patch to transform atoms object into 'MediacalData' context from version V1 to version V2.
+   * V1 uses the fwData PatientDB, Acquisition, etc.
+   * V2 uses the new Data fwMedData ( ModelSeries, ImageSeries, ...)
+  * Added fwStructuralPatch library which contains structural patches.
+  * Added fwMDContexttualPatch library which contains semantic patches.
+  * Added patchMedicalData bundle.
+  * Updated VRRender config to use MedicalData patch system.
+  * Added unit test for fwStructuralPatch
+
+ * Memory dump system
+  * BufferManager, BufferObject and depending classes has been moved to fwMemory library. BufferObject is not self-sufficient anymore : (Re)Allocation/destruction has been delegated to BufferManager.
+  * Updated BufferManager and BufferObject API to allow “lazy loading” and to improve dumped data access :
+   * A BufferObject may be initialised with a ‘stream factory’, allowing to load data in ‘dumped’ or ‘lazy loaded’ state, i.e. the data will be really loaded when needed (for example when the BufferObject is locked)
+   * When a buffer has been lazy-loaded or dumped by the buffer manager, an internal structure stores information about the dumped state : the filesystem path of the data (if applicable), and the format of this file (if applicable). This can be useful to reuse filesystem data if needed. For example, fwAtomsBoostIO’s writer creates hardlinks to these files when possible.
+   * If a BufferObject user need an access to the data, it is possible to get a stream to it, regardless of and without changing the buffer state. For example, fwAtomsBoostIO’s Writer use this mechanism to copy data from buffers when a BufferObject is not dumped or the dumped file do not have a compatible format for hardlinking.
+ * fwMemory has been made thread-safe :
+  * Buffer management runs in a dedicated thread
+  * BufferManager has an asynchronous API, based on boost::shared_future
+  * Naive factories has been updated to fwCore's one
+
+ * IO
+  * Added DICOM LazyReader in vtkGdcmIO.
+  * Added VTK/VTI Lazy Image Reader in fwVtkIO.
+  * Added lazy ability to json(z)/xml(z) data Reader in fwAtomsBoostIO.
+  * fwAtomsBoostIO : fixed archive buffer filename and archive's buffers dir name
+   * A new name for each buffer is generated in order to avoid to have several buffer using the same file name.
+   * The postfix -json or -xml has been appended to buffers dir name, to avoid data overwrite when saving to archive in the same place with the same name but with a different base format.
+
+ * UI
+  * Added an example of asynchronous UI in DumpEditor using QFutureWatcher
+   
+=== fw4spl_0.9.2.1 ( diff from fw4spl_0.9.2.0 ) 23/05/2013 ===
+
+ * Merging
+  * Merge from tag fw4spl_0.9.1.2
+
+ * Data :
+  * Removed PatientDB/Patient/Study/Acquisition/Dictionary/DictionaryOrgan data. Removed Acquisition/Patient/PatientDB msgs.
+  * Cleaned fwData::Reconstriction attributes
+  * NewSptr() is depracted, use now only New()
+  * Fixed deep copy bugs (multiple references to the same data, recursive data) and updated all data
+  * Fixed fwMedDataCamp camp introspection for ImageSeries and Series
+  * Moved ActivitySeries camp binding (from fwActivitiesCamp to fwMedDataCamp)
+  * few changes in fwAtoms API : add factory, renamed Map and Sequence const iterators and added typedef, fixed all clone methods
+
+ * IO :
+  * Removed fwXML and ioXML
+  * Added ImageSeries and ModelSeries writers/readers in vtkIO or itkIO :
+   * read : .vtk, .vti, .mhd, .inr
+   * write : .vtk, .vti, .mhd, .obj, .inr, .jpg
+  * Updated ioGdcm to support fwMedData ( and fix few old problems )  
+  * Updated fwAtomConversion to support several UUID management policies : when you convert an atom to a data, if the uuid object already exists in application, you can abord the process, you can re use the object or you can generate another uuid
+  * Replace specific atoms reader/writer. Added ioAtoms SReader and SWriter services ( these services work on ::fwData::Object and support 'inject' mode). Removed SMedDataReader and SMedDataWriter services.
+  * Fixed fwAtomsBoostIO issue when hiting a cache value stored in a Atoms::Map, added unit tests
+
+ * General :
+  * Updated fwAtomConversion: getSubObject() throw exceptions or null object if path is not valid ( data introspection )
+  * Added macro FW_FORWARD_EXCEPTION_IF(excep, cond)
+  * Added ConfigLauncher helper to centralize management of AppConfig
+  * Added new service SConfigLauncher, updated SConfigController
+  * Updated SActivityLauncher to be able to launch directly a standalone activity.
+
+ * Software :
+  * Update all Tutorial, all Examples and all PoC to support last modifications
+  * Update VRRender : 
+   * support last modifications
+   * enable some new readers/writers
+   * add dump functionalities and menus to monitor the app
+   * Updated TransferFunctionEditor to save/load TF with ioAtoms.
+
+ * TU :
+  * Update io unit tests to check new readers/writers
+  * Added fwData/fwMedData objects generators in fwTest
+  * Updated fwDataTools : removed data generators and comparator replace by fwTest generators and fwDatacam::visitor::CompareObject
+  * Updated fwTest::generator::SeriesDB to be DICOM compliant.
+
+=== fw4spl_0.9.1.4 ( diff from fw4spl_0.9.1.3 ) 18/06/2013 ===
+
+ * General : 
+  * Added a getAttribute() template method on fwAtoms/Object.
+  * fixed on fwAtoms/Object attributes and metaInfos
+  * Added version number on atom (see fwAtoms/Base.hpp) 
+  * Updated fwCore::SpyLogger to remove logger global severity.   
+  * Updated CompareObjects visitor for BufferObject
+   
+ * Patch system : 
+  * Created a new library fwAtomsPatch which contains the base interface to transform atoms from a version to an other into a context.  
+  * Added a version generator utility to generate .versions files (files used by the patch system).
+  * Added MedicalData pacth system to VRRender
+
+ * IO :
+  * Updated ioAtoms reader(SReader)/writer(SWriter) to use the patch system.
+  * Added verison on Atom writers/readers(Hdf5 reader/writer and BoostIO writer/reader).
+  
+ * TU : 
+  * Added test for getAttribute() template method.
+  
+  
+=== fw4spl_0.9.1.3 ( diff from fw4spl_0.9.1.2 ) 02/05/2013 ===
+
+ * Data :
+  * Fixed deep copy bugs (multiple references to the same data, recursive data) and updated all data
+
+ * IO :
+  * Updated fwAtomConversion to support several UUID management policies : when you convert an atom to a data, if the uuid object already exists in application, you can abord the process, you can re use the object or you can generate another uuid
+  * Replace specific atoms reader/writer. Added ioAtoms SReader and SWriter services ( these services work on ::fwData::Object and support 'inject' mode). Removed SMedDataReader and SMedDataWriter services.
+  * Fixed fwAtomsBoostIO issue when hiting a cache value stored in a Atoms::Map, added unit tests
+
+=== fw4spl_0.9.1.2 ( diff from fw4spl_0.9.1.1 ) 10/04/2013 ===
+
+ * General :
+  * Fixed bugs in ConfigActionSrv
+  * Added macro FW_FORWARD_EXCEPTION_IF to forward an exception on certain conditions
+  * Added new bundles (monitor, monitorQt) to monitor system
+  * Added new bundle (ctrlMemory) to provide services to dump lock data
+  * Added new service (uiPatientDB::action::AddMedicalWorkspace) to load and merge medical workspaces
+  * Updated VRRender 0.9.5 : add dump functionality, menus to monitor the app, import/export medical workspace
+  
+ * Data introspection : 
+  * Moved ::fwAtomConversion::RetrieveObjectVisitor to ::fwDataCamp::visitor::GetObject
+  * Updated fwDataCamp::Object to bind 'isA' method
+  * Added new visitor (RecursiveLock) to lock (mutex) data recursively
+  * Added new visitor (CompareObjects) to compare two data objects
+  * Added exception management and unit tests
+  
+ * Atoms :
+  * Refactoring of fwAtoms :
+   * cleaning, bug fixing, API updating (added const accessors), unit tests
+   * added factory to build atoms
+   * fixed all clone methods
+   * updated atom visitor to not use camp to visit atom
+  * Refactoring of fwAtomConversion :
+   * removed useless visitors
+   * proposed new conversion methods between fwData::Object and fwAtoms::Object
+   * fixed graph conversion
+   * added exception management and unit tests
+   * managed null pointer in atoms
+   * improved numeric conversion
+  
+ * fwData :
+  * Removed deprecated fwData::None
+  * Added tetra cell type for fwData::Mesh
+  * Managed acquisition 'NetID' in deepCopy/shallowCopy
+  
+ * IO :
+  * Added new library fwAtomsBoostIO to read/write atoms using Boost Property Tree.
+  * Added new bundle ioAtoms to provide services for reading/writing medical data using fwAtomsBoostIO.
+  * Managed zip and folder archive in fwZip
+  * Added BufferObject comparison unit test in fwAtomsBoostIO
+  * Managed dumped buffers during saving
+  * Changed dump policy during medical data loading (set to 'barrier' if policy is 'never').
+  * Added unit tests for fwAtomsBoostIO and ioAtoms
+
+ * Log :
+  * Improved logs for 'receive' method in ::fwServices::IService
+
+ * Communication :
+  * Removed deprecated MODIFIED_KEYS event in fwComEd::CompositeMsg
+
+=== fw4spl_0.9.2.0 from begin of the branch 12/02/2013 ===
+
+ * Data:
+  * Few fwData class are deprecated : PatientDB, Patient, Study, Acquisition
+  * Created a new library fwMedData to store structures for medical data.
+   * Added structures to store Patient, Study, Series and Equipment information.
+   * Added a type of data called Series ::fwMedData::Series. It aggregates information (Patient, Study, Series, Equipment, etc) related to a data set.
+   * Added ImageSeries data (inherit from Series) which stores an image.
+   * Added ModelSeries data (inherit from Series) which stores a set of reconstructions.
+   * Added structure to store a set of ::fwMedData::SeriesDB series. It provides basic STL container API.
+  * All new fwMedData data structures are wrapped with camp.
+  * Added Tetra cell type management for fwData::Mesh ( update vtk adaptor to show it )
+  * Removed deprecated fwData::None
+
+ * Core:
+  * Added the concept of activity (fwActivities library).
+  * Added new factory for fwActivities.
+  * Added a default builder for the data ActivitySeries.
+
+ * Bundle:
+  * Created a bundle 'activity'. It contains
+   * a service ::activities::SLauncherActivity to launch an activity. 
+  * Created a new bundle 'uiMedDataQt'. It contains
+   * a service ::uiMedDataQt::SSelctor to show information about medical data.
+   * a service ::uiMedDataQt::SExportSeries to export series to an ::fwMedData::ActivitySeries defined in the service configuration.
+   * a service ::uiMedDataQt::SSeriesViewer to view series stored in a vector ::fwData::Vector.
+  * Created a new bundle 'LeafActivity'. It contains
+   * a configuration which allows to visualize medical image in 2D.
+   * a configuration which allows to visualize a mesh and optionally a medical image in 3D.
+   * a configuration which allows to blend two medical images (its also contains a transfert function editor).
+   * a configuration which allows to visualize a volume rendering of image and optionally a mesh.
+  * Added new service ::scene2D::processing::SComputeHistogram to compute histogram for an image.
+
+ * Communication:
+  * Removed deprecated MODIFIED_KEYS from fwComEd::CompositeMsg event (and support few libraries which still used it)
+  * Added messages SeriesDBMsg, VectorMsg, ModelSeriesMsg on fwComEd library.
+  * Added helpers for SeriesDBMsg, VectorMsg on fwComEd.
+
+ * IO:
+  * Added a reader ::vtkGdcmIO::SeriesDBReader, based on VTK and GDCM, for loading a SeriesDB from DICOM files.
+  * Added a reader ::vtkIO::SeriesDBReader, based on VTK, for loading a SeriesDB from VTK polydata or image'.vtk' files.
+  * Added a service ::uiIO::action::SSeriesDBMerger to read SeriesDB and merges it with the current SeriesDB.
+
+ * Software:
+  * VRRender 0.9.6.
+
+ * Tests:
+  * Added unit tests for fwActivities and fwMedData libraries.
+  * Added unit tests for ::scene2D::processing::SComputeHistogram service. 
+    
+=== fw4spl_0.9.1.1 ( diff from fw4spl_0.9.1.0 ) 07/02/2013 ===
+
+ * Merge :
+  * Merge from tag fw4spl_0.9.0.3 to branch fw4spl_0.9.1
+
+ * General :
+  * Modify Appconfig xml syntax. "parameters" appConfig type is now required ( "standard" and "template" type are no longer supported )
+  * Modify Appconfig xml syntax. Replace xml attribut : implementation to impl, autoComChannel to autoConnect. priority tag is no longer supported ( priority is now relative to connection creation order )
+  * Update Appconfig xml syntax. Add two new xml elements ( to support signal/slot connection ) : <connect> and <proxy> (see Tuto15Multithread AppConfig to see an example)
+  * Update SwapperSrv to support new connection system. Updated SwapperSrv xml syntax to manage <connect> and <proxy> tag.
+  * Fix VRRender application to support new communication system / new xml appConfig syntax
+  * Fix bundles and libraries to support new communication system
+  * Fix applications to support xml appConfig syntax
+  * Fix JpgImageWriter to save jpg instead of png file
+  * Fix some issues, ex : updated BufferManager counter to be thread-safe, permissions issue when deleting temporary folder, some cppcheck warnings ...
+
+ * Visu :
+  * Updated vtk adaptors : rename doUpdate(msg) by doReceive(msg) and new communication system.
+
+ * Multithread and communication :
+  * Cleaning communication system : removed ComChannelService, MessageHandler service...
+  * Added Proxy in fwServices. Proxy is an application singleton that provides communication channels. A channel can be connected to a signal. Slots can be connected to a channel. Connection/disconnection can be dynamic during application life. A channel has a forwarder role.
+  * Update Tuto15Multithread with another sub configurations (other examples)
+  * Updated AppconfigManager to manage connect and proxy xml tags in config and to wait for start/stop/update.
+  * Fix IService methods : start, stop, update and swap return a correct shared future in mono thread
+  * Added abstraction level to fwThread's Worker and Timer, implements a Qt and WxWidget version. Updated Tuto15 with new Timer API
+  * Fix ActiveWorkers registry : clear and reset all ActiveWorkers when app stop
+
+ * TU :
+  * Added tests for fwGuiQt WorkerQt and TimerQt
+  * Fix some unit tests to support new communication system / new xml appConfig syntax
+  * Change gdcm trace output stream for unit tests
+
+=== fw4spl_0.9.1.0 ( diff from fw4spl_0.9.0.2 ) 29/11/2012 ===
+
+ * Thread:
+  * Created new fwThread library that provides few tools to execute asynchronous tasks on different threads.
+  * Created fwThread::Worker. This class creates and manages a thread. Thanks to the post method it is possible to execute handlers on.
+  * Created fwThread::TaskHandler. This class encapsulates packaged task and it is used to post easily a task on a worker
+  * Created fwThread::Timer. The Timer class provides single-shot or repetitive timers. A Timer triggers a function once after a delay, or periodically, inside the worker loop. The delay or the period is defined by the duration attribute.
+
+ * Communication:
+  * Added new fwCom library. This library provides a set of tools dedicated to communication. These communications are based on Signal and slots concept (http://en.wikipedia.org/wiki/Signals_and_slots). fwCom provides the following features :
+   * function and method wrapping
+   * direct slot calling
+   * asynchronous slot calling
+   * ability to work with multiple threads
+   * auto-deconnection of slot and signals
+   * arguments loss between slots and signals
+  * fwCom::Slot is wrappers for a function or a class method that can be attached to a fwThread::Worker. The purpose of this class is to provide synchronous and asynchronous mecanisms for method and function calling.
+  * fwCom::Slots is a structure that contains a mapping between a key and a Slot
+  * fwCom::HasSlots manages a fwCom::Slots
+  * fwCom::Signal allows to perform grouped calls on slots.  In this purpose, Signal provides a mechanism to connect slots to itself.
+  * fwCom::Signals is a structure that contains a mapping between a key and a Signal
+  * fwCom::HasSignals manages a fwCom::Signals
+  * The connection of a Slot to a Signal returns a Connection handler. Connection provides a mechanism which allows to temporarily disable a Slot in a Signal. The slot stays connected to the Signal, but it will not be triggered while the Connection is blocked :
+  * Add new xxx.vrdc file that are parsed by a variadic_parser (fwCom/scripts/variadic_parser.py) to generate some hpp/hxx files (manipulation of template).
+
+ * fwData:
+  * Updated Object to inherit of HasSignal
+  * all objects have a signal objectModifiedSig to emit object modification
+
+ * fwServices:
+  * IService:
+   * Updated IService to have an associated worker and thus an associated thread
+   * Updated IService to inherit of HasSignal and HasSlots
+   * Updated IService to remove old communication system
+   * Updated IService to rename update(msg) to receive(msg)
+   * Added slots start, stop, receive, update, swap on IService. If these methods (receive excepted) are not call in thread associated to the service, the slot version is called.
+   * Add IService::getObjSrvConnections method to propose signal/slot connections between a service and his associated object
+  * Add new structure ActiveWorkers to register worker in f4s
+  * Added macros for notification: fwServicesNotifyMsgMacro and fwServicesBlockAndNotifyMsgMacro
+  * Modify IEditionService::notify to use this macros.
+
+ * Log:
+  * Add fwID::getLightId method used for log
+  * Initialized spylog in fwTest, to enable logs within unit tests
+  * Add communication info message, messages are enable if you define COM_LOG when you compiling f4s
+
+ * Tutorials:
+  * Create new tutorial Tuto15MultithreadCtrl that contains a few multithread examples.
+
+=== fw4spl_0.9.0.3 ( diff from fw4spl_0.9.0.2 ) 11/12/2012 ===
+
+ * General :
+  * Change default transfert function for Muscles and Skin
+  * Add a new action AnonymisePatient to anonymise selected patient in PDB
+  * Add new organ to dictionary Lymph Node
+  * Fix OrganDictionary (re add World key). Add also few liver segment keys
+  * Fix JpgImageWriter to save jpg instead of png file
+  * Fix crash when using manage organ editor
+
+=== fw4spl_0.9.0.2 ( diff from fw4spl_0.9.0.1 ) 02/11/2012 ===
+
+ * General:
+  * renamed fwMetaData library to fwAtoms
+  * few fixes, refactoring
+
+ * Editor:
+  * PatientDBGuiSelectorService: now it is possible to erase an acquisition OR a patient (with key del)
+  * PatientDBGuiSelectorService: image comment edition is now possible from mouse double-clicking on item
+
+ * Log:
+  * Update application log: check if default log dir is unreachable before create log file
+
+=== fw4spl_0.9.0.1 ( diff from fw4spl_0.9.0.0 ) 28/09/2012 ===
+
+ * Merge:
+  * Merge from tag fw4spl_0.8.3.6
+
+ * General:
+  * /!\ Removed WxWidgets support in f4s apps (preserved in TutoGui)
+  * /!\ Removed old factory in fwTools
+  * Code cleaning: fix compilation, removed unused code, added missing include, removed verbose logging, added missing export
+  * Add new service ::fwServices::SConfigController to manage AppConfig without using an action
+  * Add new introspection tool in fwMetaConversion to find a subOject from an object and a path.
+  * ConfigActionSrvWithKeySendingConfigTemplate uses now data reflection to find tabPrefix and tabInfo
+  * Fixed fwData::factory::New (register attributes on fwData::Object)
+  * Fixed conflicts with python tolower define
+  * Fixed AnonymiseImage (doesn't duplicate images)
+  * Fixed PatientDBGuiSelectorService : doesn't re-set image label if it exists
+  * Fixed opSofa compilation
+  * Updated opsofa : Replaced EulerImplicitSolver by EulerSolver.
+
+ * Log :
+  * Updated launcher to parse options with boost program options ( added log options, added Bundle dir and runtime directory options )
+
+ * IO :
+  * Catched exception in mesh reader service to prevent bad file format error.
+  * Added reader inject mode in IOSelectorService to add an object in a composite
+  * Updated SPatientDBInserter : allows user to enter a comment on image
+
+ * Data introspection
+  * Added fwCamp Library, this library is used to introspect fwData
+  * Added Mapper for camp unsupported basic types
+  * Added fwData binding in new library fwDataCamp
+  * Added fwTools Buffer Object inplace binding
+  * Added new meta data in new library fwMetaData
+  * Added new library fwMetaConversion to convert fwData <-> fwMetaData Library.
+
+ * Visu :
+  * Added SDrop service and drag and drop support in GenericScene
+  * Updated NegatoMPR : fixed red cross bug
+
+ * New multi thread safe factories :
+  * Added new factory for IObjectReader and IObjectWriter and update readers/writers to use it
+  * Updated fwCommand : doesn't need to use factory
+  * Added new factory for fwXML
+  * Added new factory for VtkRenderWindowInteractorManager and updated visuVTKQt to use it
+  * Added new factory for fwMetaConversion
+  * Added new factory for fwCamp
+  * Added new factory for Gui objects and updated fwGuiQt/fwGuiWx to use new factory
+
+
+=== fw4spl_0.8.3.6 ( diff from fw4spl_0.8.3.5 ) 26/09/2012 ===
+
+ * General
+  * Fixed invalid free in fwRenderVTK/vtklogging.cpp
+  * Code cleanning : Removed several warnings, unused file, missing export
+  * Fixed small bug in AppConfigManager when starting and stopping ComChannels
+  * Fixed small bug in fwServices/ObjectMsg.cpp when subject has expired
+  * Added dynamicConfigStartStop attribute configuration in guiQt/editor/DynamicView.cpp
+
+ * 2D Scene
+  * 2D scene adaptor can now manage sub adaptors
+
+ * Vector fields
+  * Updated fwData::Image to allow multi-components images
+  * Added VectorField Adaptor example and TutoVectorField
+
+
+=== fw4spl_0.9.0.0 ( diff from fw4spl_0.8.3.5 ) 26/07/2012 ===
+
+ * General :
+  * Fixed few compilation warning
+  * Updated uuid generation using boost::uuid
+  * Added Thread helper to be used for unit test
+  * Removed old fwTools::Singleton
+  * Removed unused XMLSubstitute
+  * Removed unused RootManager
+  * Desable _( maccro to avoid conflict with boost and replace _( by wxGetTranslation(
+  * Now, it is not possible to create an ::fwData::Object
+
+ * Log :
+  * Added OSLM _LOG macro
+  * Changed log backend: log4cxx to boost.log
+  * Updated Spylog default configuration
+  * Fixed build errors with new spylog macros (mostly missing ';').
+  * Moved SpyLog in fwCore::log namespace
+
+ * Mutex :
+  * Removed old mutex in fwData::Video
+  * replace interprocess mutex by fwCore::mt::Mutex
+  * Added mutex typedef in fwCore
+  * Added helpers to lock fwData::Object for multi-threading
+
+ * Factories :
+  * Added FactoryRegistry and LazyInstantiator & UT
+  * Updated fwData to use fwCore/util factory registry
+  * Refactoring all data you must have specific constructor
+  * Updated ServiceFatory to use fwCore/util Instanciator and to be thread safe
+  * Refactoring all services constructors/destructor must become public
+  * Added new message factory
+  * Updated ActionNotifyService : used new message factory
+  * Updated ctrlSelection to use new data and message factories
+
+ * Thread-safe :
+  * Updated fwServices ServiceConfig to become thread safe
+  * Updated AppConfigParameters to become thread safe.
+  * Updated fwServices AppConfig to become thread safe.
+  * Updated fwID to become thread safe.
+  * Updated UUID to become thread-safe.
+  * Updated IBufferManager to become thread-safe
+
+
+=== fw4spl_0.8.3.5 ( diff from fw4spl_0.8.3.4 ) 26/07/2012 ===
+
+ * General :
+  * improved msvc2010 compatibility
+
+ * Application configuration :
+  * Add new type of app config : parameter, this type of config permits to declare template parameter and his default value.
+  * System manages now new extension point AppConfigParameters
+  * AppXml can use now a paremeter set to launch a config thanks to new extension point AppConfigParameters
+
+ * Service configuration :
+  * Updated fwRuntime and fwServices to accept boost property tree as configuration objects. The current implementation actually converts ptrees to ConfigurationElement and vice versa, but is fully functional.
+  * Added examples to show how to use a ptree to configure a service from c++.
+  * Added examples to show how to parse a service configuration with a ptree.
+
+ * Scene 2D :
+  * Fixed bug in scene 2d to manage better composite key removing
+  * Fixed scene 2D adaptor stopping : srv configuration was lost and zvalue was not correct after call swap (stop/start)
+  * Scene 2D adaptor can now manages sub adaptors
+  * Add new adaptor to interact with the viewport in 2D scene (zoom, translation)
+  * Fixed negato adaptor, it was not his job to manage zoom and translation in the view
+
+ * ARLcore :
+  * ARLcore now use fw4spl pointer
+  * Added unit tests
+
+
+=== fw4spl_0.8.3.4 ( diff from fw4spl_0.8.3.3 ) ===
+
+ * General :
+  * Remove some warnings : type conversion, useless exports, ...
+  * Fixed NumericRoundCast (wrong type) and add unit test
+  * Added fwTools::os::getEnv method
+  * Fixed zip file path creation
+  * Updated AppConfig : 'type' attribute is not required anymore in xml files for 'service' tag, but must be consitent with 'implementation' attribute
+
+ * Data :
+  * Modified the fwData::Camera class adding the skew and distortion coefficients.
+
+ * UI :
+  * Fixed OrganListEditor when reconstructions are removed
+  * Fixed a crash when a message dialog is shown without icon
+  * WindowLevel now uses floating precision to compute range width
+  * ImageTransparency : fixed focus on visibility checkbox (use QAction to set shortcut)
+
+ * IO :
+  * Fixed InrPatientDBReader problem, now it is possible to select a folder which contains inr images
+
+ * Visualization :
+  * Updated NegatoWindowingInteractor to parse TF config
+  * Updated transfer function helper : use image window width/center to create TF
+  * Add config option in Window Level editor to use image grey level tf instead of create new tf
+
+ * Python :
+  * python management of Image.size .spacing .origin as pyhton list
+  * Added handler for python outputs
+  * Binding Image::deepCopy
+
+
+=== fw4spl_0.8.3.3 ===
+
+ * General :
+  * Refactoring of fwService, now an IService work on a fwData::Object (instead of fwTools::Object)
+  * Disabled Qt keyword (avoid conflicts with boost signals and foreach)
+  * Continue adding array lock ( or image/mesh lock helper ) in different libs/bundles
+  * Fixed AppConfig (adaptField if cfg element value is not empty)
+  * Updated temporary folder management
+  * Refactoring of AppConfigManager to be more easily extended
+  * Added ByteSize object and unit tests : this class manages conversion between string and size_t
+  * Updated MenuLayoutManager to allow setting icon for actions in menu
+  * Added new service to substract two images SImagesSubstract
+
+ * Apps :
+  * Added Ex04ImagesRegistration which subtract two images with itk
+  * Updated Ex02ImageMix with TF selection
+
+ * Visualization :
+  * Fixed clipping plane visualization on meshes
+  * Fixed ImagesProbeCursor, manage now image origin
+  * Fixed ProbeCursor (problem with view reset)
+  * Fixed shakeNormals when array is null
+  * Updated Volume adaptor to support TF nearest mode
+  * Fixed RemoveDistance action
+  * Fixed ImageMultiDistances adaptor
+  * Fixed PlaneXMLTranslator (compute plane from points)
+
+ * Data :
+  * Updated Reconstruction, Mesh, Image, and Array API to be compatible with new dump system to maniplate a buffer, you must used Mesh/Image/Array helper (in fwComEd/helper)
+  * Updated Image and Mesh helpers
+  * Removed fwData::Image::setDataArray (keep existing data::Array in Image)
+  * Fixed Array deepCopy (copy array informations if buffer is empty)
+  * Added swap on fwData::Array
+  * Some evolution in ObjectLock : keep object reference, added copy constructor and operator implementation
+  * Updated Array : array is buffer owner on creation
+  * Updated Image, Mesh : not New on array when deepCopy or clear
+
+ * BufferObject / IBufferManager :
+  * Added documentation
+  * Added swap on fwTools::BufferObject
+  * Added fwTools::Exception on BufferAllocatePolicy allocate/reallocate
+
+ * Dump managment :
+  * Added documentation
+  * Introduced hysteresis offset in fwMemory::policy::ValveDump
+  * Updated fwMemory Policy API : added policy factory, added setParam API on dump policies
+  * Added service : SDumpService will help to configure the dump policy
+  * Fwxml writer does not restore dumped image during serialization, just copy dumped file
+  * Try to hard link raw file instead of copy to serialize patient folder
+  * Fixed barrier limit to max(freeMemory/2, aliveMemory, 512Mo) during serialization
+
+ * IO :
+  * Updated fwXML FileFormatService system ( is not used in a separated process )
+  * FileFormatService is now called directly in ArrayXMLTranslator
+  * Updated ImageXMLTranslator and MeshXMLTranslator to use Array::swap method
+  * Fixed ResectionXMLTranslator (read "isValid" element)
+
+ * Test :
+  * Changed some namespace in different unittest libraries
+
+
+=== fw4spl_0.8.3.2 ===
+
+ * General :
+  * Fixed clang/icc compilation
+  * Fixed import fxz (fields in few structures were not managed).
+  * Fixed ImagesBlend Adaptor when there is twice the same image
+  * Fixed selected acquisition index in PatientDBGuiSelectorService
+  * New service SPatientDBInserter (io::IWriter type) that permits to push a structure (patientDB, patient, study, acquisition or image) in a patientDB. If destination pdb is not configured, a dialog box proposes to select a pdb from an active pdb list ( pdb registered in OSR )
+  * Added helper to compare float/double value with 'epsilon' error margin (fwMath/Comapre.hpp) and Upadte ImageBlend Adaptor to use it
+  * Unactivated minimized mode (in preference) for frames
+  * Update compression level for raw buffer ( low compression, hight speed )
+
+ * Apps :
+  * Added new example Ex01VolumeRendering to show different services that use or manipulate a TF
+  * Added new example Ex03Registration to show a registration between points by using ARLCore.
+
+ * Transfert function :
+  * Fixed issue with TransferFunctionEditor
+  * Fixed issue with last table color in fwVtkWindowLevelLookupTable
+  * Complete refactoring of TransferFunction adaptor (scene2D) to support now new TF structure ( manage NEAREST interpolation, manage clamping, manage negative window
+  * Support new TF structure for PoC06Scene2DTF
+  * Added TransferFunction helper to create a drawing TF
+
+ * BufferObject / IBufferManager
+  * Added fwTools::BufferObject : Base class for FW4SPL buffers. Keep a pointer to a buffer and it's allocation policy (new or malloc) without any cleverness about allocating/destroying the buffer. Users of this class needs to take care about allocation and destruction by themselves. BufferObject class has a BufferManager and Locks mechanism, Allowing to trigger special treatments on various events on BufferObjects (allocation, reallocation, destruction, swapping, locking, unlocking) (se [...]
+  * Added fwTools::IBufferManager : Provides interface for a buffer manager. A BufferManager is able to hook BufferObjects actions an to change it's behaviors. (see doxygen for more information)
+  * Updated fwData::Array to use fwTools::BufferObject
+  * Added new helper fwdata::ObjectLock : a simple helper to lock specific object, manages : Image, Mesh, Array, Reconstruction and Acquisition.
+  * Removed few critical methods of basic structures (fwData::Array, fwData::Mesh and fwData::Image) according to buffer lock mecanism. These methods are now proposed by helpers (fwComEd::helper::Array, fwComEd::helper::Mesh, fwComEd::helper::Image) and manage buffer lock process.
+  * Support buffer lock process in many helpers/services ( MeshGenerator, vtk conversion, itk conversion, serialization, etc )
+
+ * Dump managment
+  * Added an implementation of fwTools::IBufferManager with fwMemory::BufferManager : This implementation purpose is to manage memory load, freeing memory and restoring freed buffers as needed. A dump policy is used to trigger memory freeing process. The restore process is always triggers when a lock is requested on a dumped buffer. Available policies :
+   * NeverDump : This policy will never take the initiative to free memory. This is the policy used when no automatic memory management is wanted. Memory will be dumped on demand.
+   * AlwaysDump : This policy will dump buffers as often as possible. As soon as a buffer is released (ie the lock count become zero), it will be dumped.
+   * BarrierDump : This policy defines a memory usage barrier and will try to keep the managed buffers memory usage under this barrier.
+   * ValveDump : This policy is monitoring system memory usage and will trigger memory dump when the amount of system free memory is lower than the minFreeMem parameter. An hysteresis parameter exists to free more memory when the process is triggered. If the free system memory amount is lower than the minFreeMem, this policy will try to reach minFreeMem + hysteresisOffset bytes of free memory.
+  * Updated darwin memory tool : take in account inactive memory as free memory
+  * Activate BarrierDump during fwXML serialization if fwMemory::BufferManager with NeverDump policy is used.
+
+
+=== fw4spl_0.8.3.0 ===
+
+ * New field API structure for data :
+  * Remove old field API on fwTools::Object ( impact on all fwData::Object / IService / ObjectMsg / etc )
+  * Add new field API on fwData::Object 
+
+ * New transfert function structure :
+  * Remove old transfert function structure
+  * Add new transfert function structure :
+   * a transfert function has its own window level
+   * window can be negative or null
+   * transfert function associate a value in double to a RGBA color
+  * Added reimplementation of vtkWindowLevelLooupTable, fwVtkWindowLevelLookupTable ( in fwRenderVTK ) managing negative window and out-of-range value clamp
+  * Method to convert a ::fwData::TransferFunction to vtk lookup table are added in vtkIO::helper::TransfertFunction
+  * It's possible now for negato or volume rendering or window level interactor to work only on a specific transfert function
+  * All image messages concerning window/level or transfer function has been removed, no messages are send directly on the tf
+  * Evolution of ::fwComEd::helper::MedicalImageAdaptor to provide some helpers to manipulate transfer function in your service
+
+ * Other :
+  * Add new macros API to generate getter/setter for fwData
+   * fwDataGetSetCRefMacro( Param, Type ) generate :
+    * const Type & getParam() const;
+    * void setParam( const Type & attrParam );
+    * User must declare Type m_attrParam;
+   * fwDataGetSetSptrMacro( Param, Type ) generate :
+    * Type getParam() const;
+    * void setParam( Type attrParam );
+    * User must declare Type m_attrParam;
+  * fwData introduces new maccro to register data in factory fwDataRegisterMacro ( ex : fwDataRegisterMacro( ::fwData::Image ) ) instead of REGISTER_BINDING_BYCLASSNAME
+  * fwData provides a new factory helper (::fwData::Factory) to build ::fwData::Object, use it instead ::fwTools::Factory to build class of type ::fwData::Object
+  * Support change in fwXML, and thus increment .yaf version (3->4) to support new structures (old yaf version are not compatible)
+  * Move ObjectGenerator/ObjectComparator from fwXML unit test to fwDataTools to merge helper to create and compare data
+  * Moved data visitors from fwData to fwXML
+  * New API and events on ObjectMsg (ADDED/CHANGED/REMOVED FIELDS)
+  * Updated CompositeMsg API ( xxx_FIELDS -> xxx_KEYS )
+  * New Field helper : as for composite helper, build a message with fields modifications
+  * New Field Manager : Works the same way as the composite helper, but for fields
+
+
+=== fw4spl_0.8.2.3 ===
+
+ * General :
+  * Added new helper fwTools::Type to manage different system type
+  * Image structure refactoring
+   * Replaced IBufferDelegate by ::fwData::Array
+   * fwTools::Type to defin the image type
+  * Support new image structure in the system
+  * Improve origin image management : reader/writer, visualization 2D/3D/VR, pipeline, registration, resection
+  * Fixed libxml memory managment (source of different problems in VRMed)
+  * Updated ImagesBlend adaptor to check if images have the same size, spacing and origin. Show a message dialog if image have not same size, spacing or origin. Added tolerance for spacing and origin comparison
+  * Modified Pulse dialog to work when guiQt is disable
+  * Add new function in class Array to setBuffer with all parameters instead of allocating it
+  * Updated API to convert itk image to or from a fwData image (fwItkIO), updates unit tests
+  * Added CDATA section parsing in xml app configuration ( used by python tuto )
+  * Clean code: removed depreciated USE_BOOST_REGEX define in dateAndTime helpers
+  * Fixed libxml call to xmlCleanupParser (see http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser)
+
+ * IO :
+  * Evolution of patient folder version, now is v3 and replace fwXML archive default extension .fxz by .yaf to avoid user problem
+  * IWriter/IReader refactoring, these classes propose now new API to regroup common source code
+  * Added some unit tests and fixed few io problems
+  * Added ioBasic to read/write .bio file
+  * Reintroduced bad managment of rescale data with gdcm
+
+ * Testing :
+  * Added some unit test on bunldes (io)
+  * Added some unit test on lib (io)
+  * Added fwDataTools::Image to generate and test image and added unit test
+  * Added new project fwTest that propose few helpers used in different UT ( for exemple management of data path ) 
+  * Added helper in fwTest to check patient struct after a dicom file parsing to regroup test concerning dicom format
+e sptr )
+  * Updated object comparator/generator in fwDataTools for test
+
+ * Apps :
+  * Updated Tutorials build.options : disable wx on osx64
+  * Updated TutoDevForum : use new image API and use generic gui
+  * Added a basic python code usage sample with TutoPython
+  * Added new tuto dedicated to fw4spl beginner training
+
+
+=== fw4spl_0.8.1.2 ===
+
+
+=== fw4spl_0.8.0.0 ===
+
diff --git a/CMake/FindCAMP.cmake b/CMake/FindCAMP.cmake
new file mode 100644
index 0000000..df132ba
--- /dev/null
+++ b/CMake/FindCAMP.cmake
@@ -0,0 +1,48 @@
+# Locate CAMP library
+# This module defines
+#  CAMP_FOUND, if false, do not try to link to CAMP
+#  CAMP_LIBRARIES
+#  CAMP_INCLUDE_DIR, where to find camp/version.hpp
+
+FIND_PATH(CAMP_INCLUDE_DIR camp/version.hpp
+  HINTS
+  $ENV{CAMP_DIR}
+  PATH_SUFFIXES include
+  PATHS
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Tegesoft\\CAMP]
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/local
+  /usr
+  /sw # Fink
+  /opt/local # DarwinPorts
+  /opt/csw # Blastwave
+  /opt
+)
+
+FIND_LIBRARY(CAMP_LIBRARY 
+  NAMES camp campd
+  HINTS
+  $ENV{CAMP_DIR}
+  PATH_SUFFIXES lib64 lib
+  PATHS
+  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Tegesoft\\CAMP]
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/local
+  /usr
+  /sw
+  /opt/local
+  /opt/csw
+  /opt
+)
+
+SET(CAMP_LIBRARIES "${CAMP_LIBRARY}" CACHE STRING "CAMP Libraries")
+
+INCLUDE(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set CAMP_FOUND to TRUE if 
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(CAMP DEFAULT_MSG CAMP_LIBRARIES CAMP_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(CAMP_INCLUDE_DIR CAMP_LIBRARIES CAMP_LIBRARY)
+
diff --git a/CMake/FindCppUnit.cmake b/CMake/FindCppUnit.cmake
new file mode 100644
index 0000000..936fed0
--- /dev/null
+++ b/CMake/FindCppUnit.cmake
@@ -0,0 +1,46 @@
+#
+# Find the CppUnit includes and library
+#
+# This module defines
+# CPPUNIT_INCLUDE_DIR, where to find tiff.h, etc.
+# CPPUNIT_LIBRARIES, the libraries to link against to use CppUnit.
+# CPPUNIT_FOUND, If false, do not try to use CppUnit.
+
+# also defined, but not for general use are
+# CPPUNIT_LIBRARY, where to find the CppUnit library.
+# CPPUNIT_DEBUG_LIBRARY, where to find the CppUnit library in debug mode.
+
+FIND_PATH(CPPUNIT_INCLUDE_DIR cppunit/TestCase.h
+  /usr/local/include
+  /usr/include
+)
+
+# With Win32, important to have both
+IF(WIN32)
+  FIND_LIBRARY(CPPUNIT_LIBRARY cppunit
+               ${CPPUNIT_INCLUDE_DIR}/../lib
+               /usr/local/lib
+               /usr/lib)
+  FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunitd
+               ${CPPUNIT_INCLUDE_DIR}/../lib
+               /usr/local/lib
+               /usr/lib)
+ELSE(WIN32)
+  # On unix system, debug and release have the same name
+  FIND_LIBRARY(CPPUNIT_LIBRARY cppunit
+               ${CPPUNIT_INCLUDE_DIR}/../lib
+               /usr/local/lib
+               /usr/lib)
+  FIND_LIBRARY(CPPUNIT_DEBUG_LIBRARY cppunit
+               ${CPPUNIT_INCLUDE_DIR}/../lib
+               /usr/local/lib
+               /usr/lib)
+ENDIF(WIN32)
+
+IF(CPPUNIT_INCLUDE_DIR)
+  IF(CPPUNIT_LIBRARY)
+    SET(CPPUNIT_FOUND "YES")
+    SET(CPPUNIT_LIBRARIES ${CPPUNIT_LIBRARY} ${CMAKE_DL_LIBS})
+    SET(CPPUNIT_DEBUG_LIBRARIES ${CPPUNIT_DEBUG_LIBRARY} ${CMAKE_DL_LIBS})
+  ENDIF(CPPUNIT_LIBRARY)
+ENDIF(CPPUNIT_INCLUDE_DIR)
diff --git a/CMake/FindHDF5.cmake b/CMake/FindHDF5.cmake
new file mode 100644
index 0000000..eb80a35
--- /dev/null
+++ b/CMake/FindHDF5.cmake
@@ -0,0 +1,62 @@
+
+
+FIND_PATH(HDF5_INCLUDE_DIR H5Cpp.h
+  HINTS
+  $ENV{HDF5_DIR}
+  PATH_SUFFIXES include
+  PATHS
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/include/hdf5/serial
+  /usr
+  /sw # Fink
+  /opt/local # DarwinPorts
+  /opt/csw # Blastwave
+  /opt
+)
+
+message("#### : ${HDF5_INCLUDE_DIR}")
+
+FIND_LIBRARY(HDF5_LIBRARY 
+  NAMES hdf5ddll hdf5dll hdf5 hdf5d hdf5_debug libhdf5
+  HINTS
+  $ENV{HDF5_DIR}
+  PATH_SUFFIXES lib 
+  PATHS
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/lib/x86_64-linux-gnu/hdf5/serial
+  /usr/lib
+  /usr
+  /sw
+  /opt/local
+  /opt/csw
+  /opt
+)
+
+FIND_LIBRARY(HDF5_CPP_LIBRARY 
+  NAMES hdf5_cppddll hdf5_cppdll hdf5_cpp hdf5_cppd hdf5_cpp_debug
+  HINTS
+  $ENV{HDF5_DIR}
+  PATH_SUFFIXES lib64 lib
+  PATHS
+  ~/Library/Frameworks
+  /Library/Frameworks
+  /usr/local
+  /usr
+  /sw
+  /opt/local
+  /opt/csw
+  /opt
+)
+
+SET(HDF5_LIBRARIES "${HDF5_LIBRARY};${HDF5_CPP_LIBRARY}" CACHE STRING "HDF5 Libraries")
+
+INCLUDE(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set HDF5_FOUND to TRUE if 
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(HDF5 DEFAULT_MSG HDF5_LIBRARIES HDF5_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(HDF5_INCLUDE_DIR HDF5_LIBRARIES HDF5_LIBRARY)
+
+
diff --git a/CMake/FindIconv.cmake b/CMake/FindIconv.cmake
new file mode 100644
index 0000000..93cd668
--- /dev/null
+++ b/CMake/FindIconv.cmake
@@ -0,0 +1,10 @@
+# ICONV_FOUND - system has Iconv 
+# ICONV_INCLUDE_DIR - the Iconv include directory 
+# ICONV_LIBRARIES - Link these to use Iconv 
+
+FIND_PATH(ICONV_INCLUDE_DIR iconv.h) 
+FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
+ 
+IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 
+	 SET(ICONV_FOUND TRUE) 
+ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) 
diff --git a/CMake/OSXTools/osx_install_name_tool.py b/CMake/OSXTools/osx_install_name_tool.py
new file mode 100644
index 0000000..1e42e28
--- /dev/null
+++ b/CMake/OSXTools/osx_install_name_tool.py
@@ -0,0 +1,328 @@
+# -*- coding: UTF8 -*-
+
+
+import fnmatch
+import os
+import re
+import sys
+
+from collections import defaultdict
+from functools   import partial
+from subprocess  import Popen, PIPE
+
+def p(x): print "==",x.name,"=="
+
+usually_ignored = [
+    'AGL',
+    'AppKit',
+    'ApplicationServices',
+    'AudioToolbox',
+    'AudioUnit',
+    'Carbon',
+    'Cocoa',
+    'CoreAudio',
+    'CoreFoundation',
+    'CoreServices',
+    'CoreVideo',
+    'CoreWLAN',
+    'Foundation',
+    'IOKit',
+    'OpenGL',
+    'OpenCL',
+    'QTKit',
+    'QuartzCore',
+    'QuickTime',
+    'Security',
+    'SystemConfiguration',
+    'WebKit',
+    'libSystem.B.dylib',
+    'libgcc_s.1.dylib',
+    'libiodbc',
+    'libobjc.A.dylib',
+    'libresolv',
+    'libstdc++.6.dylib',
+    ]
+
+
+def cached_property(func):
+    from functools import wraps
+    name = func.__name__
+    @wraps(func)
+    def _get(self):
+        try :
+          return self.__dict__[name]
+        except KeyError :
+          value = func(self)
+          self.__dict__[name]= value
+          return value
+    def _del(self):
+        self.__dict__.pop(name, None)
+    return property(_get, None, _del)
+
+def try_remove_item(list_object):
+    def remove(item):
+        try:
+            list_object.remove(item)
+        except:
+            pass
+    return remove
+
+class DepFilter(object):
+
+    @staticmethod
+    def dep_filter(dep):
+        return all([
+            dep,
+            not '.o):' in dep,
+            ])
+
+    @staticmethod
+    def no_executable_path_filter(dep):
+            return (
+                DepFilter.dep_filter(dep)
+                and not dep.startswith('@executable_path')
+             )
+
+
+class BinaryFile(object):
+
+    db = dict()
+    ignored = defaultdict(set)
+    fw_re = re.compile('.*?(?P<fw>[^/]+\.framework.+)')
+
+    def __init__(self, path, dep_filter):
+        self.path = path
+        m = BinaryFile.fw_re.match(path)
+        if m:
+            self.name = m.groupdict()['fw']
+        else:
+            self.name = os.path.basename(path)
+        self.dep_filter = dep_filter
+
+    @cached_property
+    def deps(self):
+        otool = Popen(['otool', '-L', self.path], stdout=PIPE)
+        output = otool.communicate()[0]
+        binfiles = []
+        if not otool.returncode:
+            binfiles = [l.strip().split()[0] for l in output.splitlines()[1:]]
+            binfiles = [BinaryFile(binfile, self.dep_filter)
+                    for binfile in filter(self.dep_filter, binfiles) ]
+            return dict((l.name, l) for l in binfiles)
+        else:
+            return {}
+
+    def __repr__(self):
+        return ''.join(['BinaryFile(path=', repr(self.path), ')'])
+
+    def __str__(self):
+        return ': '.join((self.name, self.path))
+
+    def __eq__(self,other):
+        return self.name == other.name
+
+    def __hash__(self):
+        return hash(self.name)
+
+    @staticmethod
+    def find(path, pattern, dep_filter):
+        reg = fnmatch.translate(pattern)
+        reg = re.compile(reg + '|[^.]+\Z')
+        match = reg.match
+        binfiles = []
+        if os.path.isfile(path):
+            binfiles += [BinaryFile(path, dep_filter)]
+        else:
+            for (root, dirs, files) in os.walk(path):
+                map(try_remove_item(dirs), ['Headers','Resources'])
+                files = [BinaryFile(os.path.join(root,f), dep_filter) for f in files]
+                binfiles += [f for f in files if match(f.name)]
+        return dict((l.name, l) for l in binfiles)
+
+
+    def install_name_id(self, path_func):
+        return [['-id', path_func(self.path)]]
+
+    def install_name_changes(self, lib_set, path_func, ignored = None):
+        deps = self.deps
+        deps_set = set(deps.values())
+        inter = lib_set.intersection(deps_set)
+        if ignored is not None:
+            ignored_libs = [lib.name for lib in deps_set.difference(lib_set)]
+            ignored.update(ignored_libs)
+            for ig in ignored_libs:
+                BinaryFile.ignored[ig].add(self)
+        res = [
+                [ '-change', deps[lib.name].path,
+                    path_func(self.db[lib.name].path) ] for lib in inter
+              ]
+        return res
+
+
+
+
+def get_options(args):
+    from optparse import OptionParser
+
+    usage = "usage: %prog [options] binary_or_dir ..."
+    epilog = """Updates the install names of executable or shared libraries
+    found in argument list (binary_or_dir).
+    """
+    parser = OptionParser(usage=usage, epilog="")
+
+    parser.add_option("-a", "--absolute-path",
+                    action="store_true", dest="abs_path", default=False,
+                    help=("Uses absolute path for install names that will be "
+                          "relocated"),
+                    )
+
+    parser.add_option("-e", "--executable-path", dest="exec_path",
+                    help=("specifies the executable path to which the install "
+                          "names will be relocated. disabled if '-a' is used."),
+                    metavar="DIR")
+
+    #parser.add_option("-L", "--library-path",
+    #                action="append", dest="libpath",
+    #                help="libraries path", metavar="DIR")
+
+    parser.add_option("-f", "--force",
+                    action="store_true", dest="force", default=False,
+                    help=("Updates dependency even if it already has an "
+                          "@executable_path "),
+                    )
+
+
+    parser.add_option("-p", "--progress",
+                  action="store_true", dest="progress", default=False,
+                  help="show progress")
+
+    parser.add_option("-i", "--show-ignored",
+                  action="store_true", dest="show_ignored", default=False,
+                  help="show libraries that have not been relocated")
+
+
+    parser.add_option("-u", "--show-suspiciously-ignored",
+                  action="count", dest="show_suspiciously_ignored",
+                  default=False,
+                  help="show libraries that have not been relocated "
+                  "and should have. Set it twice to have more details on "
+                  "wich libralibvtkVisuManagement.dylibries was requirering one of these.")
+
+
+    parser.add_option("-v", "--verbose",
+                  action="store_true", dest="verbose", default=False,
+                  help="verbose output")
+
+    parser.add_option("-P", "--search-pattern", dest="search_pattern",
+            default="*.dylib", help= ("specifies the executable path to "
+                        "which the install names will be relocated. "
+                        "disabled if '-a' is used."), metavar="PATTERN")
+
+    parser.add_option("-s", "--search",
+                    action="append", dest="search_dirs", default=[],
+                    help="this directory will be searched with pattern "
+                    "provided by -P", metavar="DIR")
+
+
+
+    (options, args) = parser.parse_args(args)
+    return (options, args)
+
+
+def main(options, args):
+    def print_msg(*a):
+        print ' '.join(map(str,a))
+    def print_msg_n(*a):
+        print ' '.join(map(str,a)),
+
+    def mute(*a):
+        pass
+
+    verbose          = mute
+    verbose_n        = mute
+    progress_print   = mute
+    progress_print_n = mute
+
+    if options.verbose:
+        verbose   = print_msg
+        verbose_n = print_msg_n
+
+    if options.progress:
+        progress_print   = print_msg
+        progress_print_n = print_msg_n
+
+
+    if options.force:
+        dep_filter = DepFilter.dep_filter
+    else:
+        dep_filter = DepFilter.no_executable_path_filter
+
+    find_binary_files = partial(BinaryFile.find, dep_filter = dep_filter)
+    update_db = lambda pattern : lambda path : BinaryFile.db.update(
+                find_binary_files(path, pattern)
+                )
+
+    map(update_db('*.dylib'), args)
+    map(update_db('*.framework/Versions/*'), args)
+    map(update_db(options.search_pattern), options.search_dirs)
+
+    relpath = os.path.relpath
+    librelpath = lambda path : os.path.join( '@executable_path', relpath( path, options.exec_path ) )
+
+    abspath = os.path.abspath
+    libabspath = lambda path : abspath( path )
+
+    if options.abs_path:
+        install_name_func = libabspath
+    else:
+        install_name_func = librelpath
+
+
+    ignored = set()
+    L = len(BinaryFile.db)
+    files = set(BinaryFile.db.values())
+
+    for n,lib in enumerate(files):
+        lib_file = lib.path
+        progress_print_n(' ', '{0}/{1}'.format(n+1,L),'\r')
+        sys.stdout.flush()
+        if not os.path.islink(lib_file):
+            changes = lib.install_name_id(install_name_func)
+            changes += lib.install_name_changes(files, install_name_func, ignored)
+            verbose(lib_file)
+            for change in changes:
+                os.chmod(lib_file, 0775)
+                cmd = ['install_name_tool',] + change + [lib_file,]
+                res = Popen(cmd, stdout=PIPE).communicate()[0]
+                if res:
+                    verbose(res)
+    progress_print('')
+
+    if any([
+            options.show_ignored,
+            options.show_suspiciously_ignored,
+            ]):
+        ignored = sorted( map(str,ignored))
+
+    if options.show_ignored:
+        print 'ignored libraries:', (os.linesep+'  ').join(ignored)
+
+    if options.show_suspiciously_ignored:
+        #suspicious = list(set(ignored) - set(usually_ignored))
+        match = lambda x : not any( ig in x for ig in usually_ignored )
+        suspicious = [ig for ig in ignored if match(ig)]
+        libsep = (os.linesep+'  ')
+        depsep = (os.linesep+'    - ')
+        if options.show_suspiciously_ignored == 1:
+            print 'suspiciously ignored :', libsep + libsep.join(suspicious)
+        else:
+            si = [["<%s>"%s + ', required by :']
+                 + [l.name for l in BinaryFile.ignored[s]] for s in suspicious]
+            print 'suspiciously ignored :', (libsep
+                    + libsep.join(depsep.join(d) for d in si))
+
+
+if __name__ == '__main__':
+    (options, args) = get_options(sys.argv[1:])
+    main(options, args)
+
diff --git a/CMake/Wix/WIX.template.in b/CMake/Wix/WIX.template.in
new file mode 100644
index 0000000..6be1449
--- /dev/null
+++ b/CMake/Wix/WIX.template.in
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?include "cpack_variables.wxi"?>
+
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
+    RequiredVersion="3.6.3303.0">
+
+    <Product Id="$(var.CPACK_WIX_PRODUCT_GUID)"
+        Name="$(var.CPACK_PACKAGE_NAME)"
+        Language="1033"
+        Version="$(var.CPACK_PACKAGE_VERSION)"
+        Manufacturer="$(var.CPACK_PACKAGE_VENDOR)"
+        UpgradeCode="$(var.CPACK_WIX_UPGRADE_GUID)">
+
+        <Package InstallerVersion="301" Compressed="yes"/>
+
+        <Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/>
+
+        <MajorUpgrade
+            Schedule="afterInstallInitialize"
+            AllowSameVersionUpgrades="yes"
+            DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit."/>
+
+        <WixVariable Id="WixUILicenseRtf" Value="$(var.CPACK_WIX_LICENSE_RTF)"/>
+        <Property Id="WIXUI_INSTALLDIR" Value="INSTALL_ROOT"/>
+
+        <?ifdef CPACK_WIX_PRODUCT_ICON?>
+        <Property Id="ARPPRODUCTICON">ProductIcon.ico</Property>
+        <Icon Id="ProductIcon.ico" SourceFile="$(var.CPACK_WIX_PRODUCT_ICON)"/>
+        <?endif?>
+
+        <?ifdef CPACK_WIX_UI_BANNER?>
+        <WixVariable Id="WixUIBannerBmp" Value="$(var.CPACK_WIX_UI_BANNER)"/>
+        <?endif?>
+
+        <?ifdef CPACK_WIX_UI_DIALOG?>
+        <WixVariable Id="WixUIDialogBmp" Value="$(var.CPACK_WIX_UI_DIALOG)"/>
+        <?endif?>
+        
+        
+       <DirectoryRef Id="TARGETDIR">
+            <Directory Id="ProgramMenuFolder">
+                <Directory Id="ApplicationProgramsFolder" Name="IRCAD"/>
+            </Directory>
+        </DirectoryRef>
+        
+        <DirectoryRef Id="ApplicationProgramsFolder">
+            <Component Id="ApplicationShortcut" Guid="$(var.CPACK_WIX_PRODUCT_GUID)">
+                <Shortcut
+                    Id="$(var.CPACK_PACKAGE_NAME)"
+                    Name="$(var.CPACK_PACKAGE_NAME)"
+                    Icon='ProductIcon.ico'
+                    IconIndex="0"
+                    Target="[INSTALL_ROOT]@LAUNCHER_PATH@"
+                    Arguments=".\@PROFILE_PATH@" 
+                    WorkingDirectory="INSTALL_ROOT"
+                />
+                <Shortcut
+                    Id="UninstallProduct"
+                    Name="Uninstall $(var.CPACK_PACKAGE_NAME)"
+                    Target="[System64Folder]msiexec.exe"
+                    Arguments="/x [ProductCode]"
+                    Description="Uninstalls $(var.CPACK_PACKAGE_NAME)"
+                    />
+            
+            
+                <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
+                <RegistryValue Root="HKCU" Key="Software\IRCAD\$(var.CPACK_PACKAGE_NAME)" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
+            </Component>
+        </DirectoryRef>
+
+        <Feature Id="MainApplication" Title="Main Application" Level="1">
+            <ComponentRef Id="ApplicationShortcut" />   
+        </Feature>
+
+        <FeatureRef Id="ProductFeature"/>
+
+        <UIRef Id="WixUI_InstallDir" />
+    </Product>
+</Wix>
diff --git a/CMake/build/configure_file.cmake b/CMake/build/configure_file.cmake
new file mode 100644
index 0000000..b25a6ea
--- /dev/null
+++ b/CMake/build/configure_file.cmake
@@ -0,0 +1,2 @@
+configure_file("${IN_FILE}" "${OUT_FILE}" @ONLY)
+
diff --git a/CMake/cppunit/cppunit_main.cpp b/CMake/cppunit/cppunit_main.cpp
new file mode 100644
index 0000000..94a1f45
--- /dev/null
+++ b/CMake/cppunit/cppunit_main.cpp
@@ -0,0 +1,300 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Copyright (C) IRCAD, 2004-2010.
+ * Distributed under the terms of the BSD Licence as
+ * published by the Open Source Initiative.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <stdexcept>
+
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+#include <cppunit/TestRunner.h>
+#include <cppunit/TextTestProgressListener.h>
+#include <cppunit/XmlOutputter.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+
+#ifdef BUNDLE_TEST_PROFILE
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <fwRuntime/operations.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+#include <fwRuntime/io/ProfileReader.hpp>
+
+
+class MiniLauncher
+{
+public:
+    MiniLauncher( ::boost::filesystem::path profilePath )
+    {
+	#ifdef SPECIALINSTALL
+    		::boost::filesystem::path cwd = LIBSFW4SPL;
+	#else
+		::boost::filesystem::path cwd = ::boost::filesystem::current_path();
+	#endif
+
+        ::boost::filesystem::path bundlePath = cwd / "Bundles";
+
+        ::fwRuntime::addBundles(bundlePath);
+
+        if (!::boost::filesystem::exists( profilePath ))
+        {
+            profilePath = cwd / profilePath;
+        }
+
+        if (!::boost::filesystem::exists( profilePath ))
+        {
+            throw (std::invalid_argument("<" + profilePath.string() + "> not found." ));
+        }
+
+
+        m_profile = ::fwRuntime::io::ProfileReader::createProfile(profilePath);
+        ::fwRuntime::profile::setCurrentProfile(m_profile);
+
+        m_profile->setParams(0, NULL);
+        m_profile->start();
+        m_profile->setup();
+    }
+
+    ~MiniLauncher()
+    {
+        m_profile->cleanup();
+        m_profile->stop();
+        m_profile.reset();
+        ::fwRuntime::profile::setCurrentProfile(m_profile);
+    }
+
+private:
+    ::fwRuntime::profile::Profile::sptr m_profile;
+
+};
+
+#endif
+
+
+struct Options
+{
+    bool verbose;
+    bool xmlReport;
+    bool listTests;
+    std::string xmlReportFile;
+    std::vector< std::string > testsToRun;
+
+#ifdef BUNDLE_TEST_PROFILE
+    std::string profile;
+#endif
+
+    Options(): verbose(false), xmlReport(false), listTests(false)
+#ifdef BUNDLE_TEST_PROFILE
+               , profile( BUNDLE_TEST_PROFILE )
+#endif
+    { }
+
+    bool parse(int argc, char* argv[])
+    {
+        bool error = false;
+
+        if (argc < 1)
+        {
+            return true;
+        }
+
+        std::string programName( *argv != 0 ? *argv : "test_runner" );
+
+        int argn = 0;
+        char** args = argv + 1;
+        char** argsEnd = argv + argc;
+        while (args < argsEnd)
+        {
+            std::string arg(*args);
+
+            if(arg == "--help" || arg == "-h")
+            {
+                std::cout
+                    << "usage : " << programName << " "
+                    << "[--help|-h] [--verbose|-v] [--xml|-x] [-o FILE] [--list|-l] [test1 ... testN]"
+                    << std::endl
+                    << "    -h,--help         Shows this help" << std::endl
+                    << "    -s,--verbose      Shows each run test name and it status" << std::endl
+                    << "    -x,--xml          Output results to a xml file" << std::endl
+                    << "    -o FILE           Specify xml file name" << std::endl
+                    << "    -l,--list         Lists test names" << std::endl
+#ifdef BUNDLE_TEST_PROFILE
+                    << "    -p,--profile      Profile to launch for bundle tests" << std::endl
+#endif
+                    << "    test1 ... testN   Test names to run" << std::endl
+                    << std::endl;
+                return false;
+            }
+            else if( arg == "--verbose" || arg == "-v")
+            {
+                this->verbose = true;
+            }
+            else if( arg == "--xml" || arg == "-x")
+            {
+                this->xmlReport = true;
+            }
+            else if( arg == "-o")
+            {
+                args++;
+                if(args >= argsEnd)
+                {
+                    std::cerr << "value for -o is missing" << std::endl;
+                    return false;
+                }
+                this->xmlReportFile = std::string(*args);
+            }
+            else if( arg == "--list" || arg == "-l")
+            {
+                this->listTests = true;
+            }
+#ifdef BUNDLE_TEST_PROFILE
+            else if( arg == "--profile" || arg == "-p")
+            {
+                args++;
+                if(args >= argsEnd)
+                {
+                    std::cerr << "value for -p/--profile is missing" << std::endl;
+                    return false;
+                }
+                this->profile = std::string(*args);
+            }
+#endif
+            else
+            {
+                this->testsToRun.push_back(arg);
+            }
+
+            args++;
+        }
+        return true;
+    }
+
+} ;
+
+
+CPPUNIT_NS_BEGIN
+class SynchronizationObject;
+
+
+class TestLister : public TestResult
+{
+public:
+    TestLister( SynchronizationObject *syncObject = 0 ){};
+
+    virtual void startTest( Test *test )
+    {
+        std::cout << test->getName() << std::endl;
+    };
+
+    virtual void runTest( Test *test )
+    {
+        test->run( this );
+    };
+
+    virtual bool protect( const Functor &functor,
+                          Test *test,
+                          const std::string &shortDescription = std::string("") ){
+        return false;
+    };
+
+};
+CPPUNIT_NS_END
+
+
+int main( int argc, char* argv[] )
+{
+
+    Options options;
+
+    std::string testExecutable = (argc >= 1) ? std::string(argv[0]) : "unknown";
+    options.xmlReportFile = testExecutable + "-cppunit-report.xml";
+
+    if (!options.parse(argc, argv))
+    {
+        return 1;
+    }
+
+#ifdef BUNDLE_TEST_PROFILE
+    MiniLauncher miniLaucher( options.profile );
+#endif
+
+
+    CPPUNIT_NS::Test *testSuite = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
+
+    // Add the top suite to the test runner
+    CPPUNIT_NS::TestRunner runner;
+    runner.addTest( testSuite );
+
+    if( options.listTests )
+    {
+        CPPUNIT_NS::TestLister lister;
+        runner.run( lister );
+        return 0;
+    }
+
+    // Create the event manager and test controller
+    CPPUNIT_NS::TestResult controller;
+
+    // Add a listener that colllects test result
+    CPPUNIT_NS::TestResultCollector result;
+    controller.addListener( &result );
+
+    // Listener that prints the name of each test before running it.
+    CPPUNIT_NS::BriefTestProgressListener BriefProgress;
+
+    // Listener that print dots as test run.
+    CPPUNIT_NS::TextTestProgressListener textProgress;
+
+    if(options.verbose)
+    {
+        controller.addListener( &BriefProgress );
+    }
+    else
+    {
+        controller.addListener( &textProgress );
+    }
+
+    if(options.testsToRun.empty())
+    {
+        options.testsToRun.push_back("");
+    }
+
+    std::vector< std::string >::const_iterator iter = options.testsToRun.begin();
+
+    for(; iter != options.testsToRun.end(); ++iter)
+    {
+        try
+        {
+            runner.run( controller, *iter );
+        }
+        catch ( std::exception &e )
+        {
+            std::cerr << "[" << ((iter->empty()) ? "All tests" : *iter) << "]" << "Error: " << e.what() << std::endl;
+            return 1;
+        }
+        catch ( ... )
+        {
+            std::cerr << "[" << ((iter->empty()) ? "All tests" : *iter) << "]" << "Unexpected error. " << std::endl;
+            return 1;
+        }
+    }
+
+    // Print test in a compiler compatible format.
+    CPPUNIT_NS::CompilerOutputter outputter( &result, std::cerr );
+    outputter.write();
+
+    if(options.xmlReport)
+    {
+        std::ofstream file( options.xmlReportFile.c_str() );
+        CPPUNIT_NS::XmlOutputter xml( &result, file );
+        xml.write();
+        file.close();
+    }
+
+    return 0;
+}
diff --git a/CMake/doxygen/Doxyfile.in b/CMake/doxygen/Doxyfile.in
new file mode 100644
index 0000000..14c1e8f
--- /dev/null
+++ b/CMake/doxygen/Doxyfile.in
@@ -0,0 +1,1521 @@
+# Doxyfile 1.5.8
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = fw4spl
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = @CMAKE_CURRENT_BINARY_DIR@/Documentation/Doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, 
+# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), 
+# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, 
+# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, 
+# Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses. 
+# With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this tag. 
+# The format is ext=language, where ext is a file extension, and language is one of 
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, 
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat 
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), 
+# use: inc=Fortran f=C
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = YES
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen to replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = YES
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penality. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will rougly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page. 
+# This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by 
+# doxygen. The layout file controls the global structure of the generated output files 
+# in an output format independent way. The create the layout file that represents 
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a 
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name 
+# of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/mrproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = 
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = YES
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */.svn/*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output. 
+# If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis. 
+# Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match. 
+# The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code. 
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER 
+# are set, an additional index file will be generated that can be used as input for 
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated 
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = 
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. 
+# For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to FRAME, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature. Other possible values 
+# for this tag are: HIERARCHIES, which will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list; 
+# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which 
+# disables this behavior completely. For backwards compatibility with previous 
+# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE 
+# respectively.
+
+GENERATE_TREEVIEW      = HIERARCHIES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader. 
+# This is useful 
+# if you want to understand what is going on. 
+# On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = @INCLUDE_DIRS@
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#  
+# TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#  
+# TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES #======
+#CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = NO
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# By default doxygen will write a font called FreeSans.ttf to the output 
+# directory and reference it in all dot files that doxygen generates. This 
+# font does not include all possible unicode characters however, so when you need 
+# these (or just want a differently looking font) you can specify the font name 
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES #======
+#CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES #======
+#COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES #======
+#GROUP_GRAPHS           = NO
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = YES #======
+#TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES #======
+#INCLUDE_GRAPH          = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES #======
+#INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = YES #======
+#CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = YES #======
+#CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES #======
+#GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES #======
+#DIRECTORY_GRAPH        = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = #################################################
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Options related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/CMake/doxygen/MainPage.dox b/CMake/doxygen/MainPage.dox
new file mode 100644
index 0000000..7061bd8
--- /dev/null
+++ b/CMake/doxygen/MainPage.dox
@@ -0,0 +1,7 @@
+/**
+ *
+ * \mainpage  fw4spl: Framework For Software Production Line
+ * 
+ *
+ */
+
diff --git a/CMake/fw-ITK.cmake b/CMake/fw-ITK.cmake
new file mode 100644
index 0000000..d95fb60
--- /dev/null
+++ b/CMake/fw-ITK.cmake
@@ -0,0 +1,33 @@
+set(ITK_DIR /usr/lib/InsightToolkit/)
+
+SET(ITK_LIBS ITKAlgorithms
+    ITKBasicFilters
+    ITKCommon
+    ITKDICOMParser
+    ITKEXPAT
+    ITKFEM
+    ITKIO
+    ITKIOReview
+    ITKMetaIO
+    ITKNrrdIO
+    ITKNumerics
+    ITKQuadEdgeMesh
+    ITKSpatialObject
+    ITKStatistics
+    ITKniftiio
+    ITKznz
+    itkNetlibSlatec
+    itkjpeg12
+    itkjpeg16
+    itkjpeg8
+    itkopenjpeg
+    itksys
+    itkvnl_inst
+    )
+
+foreach(LIB ${ITK_LIBS})
+    find_library(${LIB}_LIB ${LIB} ${ITK_DIR} )
+    add_library(${LIB} UNKNOWN IMPORTED)
+    set_target_properties(${LIB} PROPERTIES IMPORTED_LOCATION "${${LIB}_LIB}")
+    set(ITK_LIBRARIES ${ITK_LIBRARIES} ${${LIB}_LIB})
+endforeach()
diff --git a/CMake/fw-Qt4.cmake b/CMake/fw-Qt4.cmake
new file mode 100644
index 0000000..70aa850
--- /dev/null
+++ b/CMake/fw-Qt4.cmake
@@ -0,0 +1,5 @@
+set(QT_DIR /usr/lib/x86_64-linux-gnu/qt4)
+
+add_definitions("-DQT_NO_KEYWORDS")
+#Fix error with BOOST_JOIN and qt moc
+set(CMAKE_AUTOMOC_MOC_OPTIONS "-DBOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION")
diff --git a/CMake/fw-VTK.cmake b/CMake/fw-VTK.cmake
new file mode 100644
index 0000000..1997d31
--- /dev/null
+++ b/CMake/fw-VTK.cmake
@@ -0,0 +1,2 @@
+set(VTK_DIR /usr/lib/vtk-5.10/)
+
diff --git a/CMake/fw-VXL.cmake b/CMake/fw-VXL.cmake
new file mode 100644
index 0000000..08be41a
--- /dev/null
+++ b/CMake/fw-VXL.cmake
@@ -0,0 +1 @@
+set(VXL_DIR ${CMAKE_CURRENT_LIST_DIR}/lib/vxl/)
diff --git a/CMake/fw-boost.cmake b/CMake/fw-boost.cmake
new file mode 100644
index 0000000..6a2daf7
--- /dev/null
+++ b/CMake/fw-boost.cmake
@@ -0,0 +1,33 @@
+set(Boost_DEBUG false)
+file(GLOB BOOST_ROOT ${CMAKE_CURRENT_LIST_DIR})
+#set(Boost_NO_SYSTEM_PATHS ON)
+set(Boost_USE_DEBUG_PYTHON ON)
+set(Boost_USE_MULTITHREADED ON)
+
+
+add_definitions(
+        -DBOOST_ALL_DYN_LINK
+        -DBOOST_LINKING_PYTHON
+        -DBOOST_DEBUG_PYTHON
+        -DBOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V3_0_0
+        -DBOOST_THREAD_PROVIDES_FUTURE
+        -DBOOST_THREAD_VERSION=2
+        )
+
+IF(WIN32)
+    set(BOOST_LIBRARYDIR ${BOOST_ROOT}/lib)
+
+    set(Boost_COMPILER -vc100)
+    add_definitions(
+            -DBOOST_LIB_DIAGNOSTIC
+            -DNOMINMAX
+            -DWIN32_LEAN_AND_MEAN
+            )
+ENDIF()
+
+IF(APPLE)
+    set(Boost_COMPILER -clang-darwin42)
+ENDIF()
+
+
+
diff --git a/CMake/fw-python.cmake b/CMake/fw-python.cmake
new file mode 100644
index 0000000..9aae871
--- /dev/null
+++ b/CMake/fw-python.cmake
@@ -0,0 +1,4 @@
+set(PYTHON_INCLUDE_DIR /usr/include/python2.7)
+#set(PYTHON_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/include/python2.7)
+#set(PYTHON_LIBRARY ${CMAKE_CURRENT_LIST_DIR}/lib)
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..3af41cb
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,750 @@
+
+cmake_minimum_required (VERSION 2.8.11)
+
+project (fw4spl)
+
+enable_testing()
+
+include(CheckVariableExists)
+include(CMakeParseArguments)
+
+option(CLASSIC_INSTALL ON)
+set(CLASSIC_INSTALL OFF)
+
+if(CLASSIC_INSTALL)
+    add_definitions( -DLIBSFW4SPL=\"\" )
+    add_definitions( -DBUNDLEPATH=\"\" )
+    add_definitions( -DSHAREPATH=\"\" )
+    set( LIBRARY_OUTPUT_DIR "lib" )
+    set( RUNTIME_OUTPUT_DIR "bin" )
+else()
+    set(CMAKE_INSTALL_PREFIX /usr/)
+    add_definitions( -DSPECIALINSTALL )
+    set(CMAKE_BUILD_TYPE Release)
+    set(EXTERNAL_LIBRARIES ${CMAKE_CURRENT_SOURCE_DIR}/CMake/)
+    set(PROJECTS_TO_BUILD VRRender)
+    set(PROJECTS_TO_INSTALL VRRender)
+    add_definitions( -DLIBSFW4SPL=\"/usr/lib/fw4spl/\" )
+    add_definitions( -DBUNDLEPATH=\"/usr/lib/fw4spl/Bundles/\" )
+    add_definitions( -DSHAREPATH=\"/usr/share/fw4spl/\" )
+    set( LIBRARY_OUTPUT_DIR "/usr/lib/fw4spl/" )
+    set( RUNTIME_OUTPUT_DIR "/usr/bin/" )
+    set( BUNDLE_PATH "/usr/lib/fw4spl/Bundles/" )
+    set( SHARE_PATH "/usr/share/fw4spl/" )
+endif()
+
+
+set(BUILD_SHARED_LIBS ON)
+
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG")  #racy backward compatibility
+
+set(CREATE_SUBPROJECTS OFF CACHE BOOL "Create a project for each subproject")
+
+set(BUILD_TESTS ON CACHE BOOL "Configures projects associated tests (<project>Test projects)")
+
+set(FWCMAKE_RESOURCE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake/)
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+    #http://stackoverflow.com/questions/6802903/c-ifdef-mac-os-x-question
+    add_definitions(-D__MACOSX__) #racy backward compatibility
+    set(LIBRARY_OUTPUT_DIR Libraries)
+endif()
+
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${RUNTIME_OUTPUT_DIR})
+if(CLASSIC_INSTALL)
+    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${LIBRARY_OUTPUT_DIR})
+    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${LIBRARY_OUTPUT_DIR})
+else()
+    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_DIR})
+    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_DIR})
+endif()
+
+set(SPYLOG_LEVEL "error" CACHE STRING "Log level")
+set(SPYLOG_LEVEL_VALUES "fatal;error;warning;info;debug;trace" CACHE INTERNAL
+    "List of possible values for log level")
+set(SPYLOG_LEVEL_MAP_fatal 1)
+set(SPYLOG_LEVEL_MAP_error 2)
+set(SPYLOG_LEVEL_MAP_warning 3)
+set(SPYLOG_LEVEL_MAP_info 4)
+set(SPYLOG_LEVEL_MAP_debug 5)
+set(SPYLOG_LEVEL_MAP_trace 6)
+set_property(CACHE SPYLOG_LEVEL PROPERTY STRINGS ${SPYLOG_LEVEL_VALUES} )
+
+# Until c++11 beeing globaly enabled ...
+macro(fwEnableCpp11)
+    if(NOT WIN32)
+        add_definitions("--std=c++11")
+        if(APPLE)
+            add_definitions("--stdlib=libc++")
+        endif(APPLE)
+    endif()
+endmacro()
+
+macro(initProject PRJNAME )
+    if(CREATE_SUBPROJECTS)
+        project( ${PRJNAME} )
+    endif()
+    set(FWPROJECT_NAME ${PRJNAME})
+    set(PRJ_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
+
+    set(${FWPROJECT_NAME}_HEADERS)
+    set(${FWPROJECT_NAME}_SOURCES)
+
+    set(SUBDIRS ${ARGN})
+    list(LENGTH SUBDIRS NB_SUBDIRS)
+    if(NB_SUBDIRS EQUAL 0)
+        list(APPEND SUBDIRS ${PRJ_SOURCE_DIR})
+    endif()
+
+    set(${FWPROJECT_NAME}_INCLUDE_DIR)
+
+    foreach(SUBDIR ${SUBDIRS})
+        list(APPEND ${FWPROJECT_NAME}_INCLUDE_DIR ${SUBDIR}/include)
+
+        file(GLOB_RECURSE HEADERS ${SUBDIR}/include/*)
+        file(GLOB_RECURSE SOURCES ${SUBDIR}/src/*)
+
+        list(APPEND ${FWPROJECT_NAME}_HEADERS ${HEADERS})
+        list(APPEND ${FWPROJECT_NAME}_SOURCES ${SOURCES})
+    endforeach(SUBDIR)
+
+    set (${FWPROJECT_NAME}_INCLUDE_DIR ${${FWPROJECT_NAME}_INCLUDE_DIR} PARENT_SCOPE) 
+
+    set (${FWPROJECT_NAME}_HEADERS ${${FWPROJECT_NAME}_HEADERS} PARENT_SCOPE) 
+    set (${FWPROJECT_NAME}_SOURCES ${${FWPROJECT_NAME}_SOURCES} PARENT_SCOPE) 
+endmacro(initProject)
+
+
+macro(setVersion FWPROJECT_NAME PROJECT_VERSION)
+    set(${FWPROJECT_NAME}_VERSION ${PROJECT_VERSION} )
+    set(${FWPROJECT_NAME}_VERSION ${PROJECT_VERSION} PARENT_SCOPE)
+    string(REPLACE "." "-" DASH_VERSION "${PROJECT_VERSION}")
+    set(${FWPROJECT_NAME}_DASH_VERSION ${DASH_VERSION} )
+    set(${FWPROJECT_NAME}_DASH_VERSION ${DASH_VERSION} PARENT_SCOPE)
+endmacro()
+
+macro(configureProject FWPROJECT_NAME PROJECT_VERSION)
+    string(TOUPPER ${FWPROJECT_NAME} PROJECT_NAME_UPCASE)
+
+    setVersion(${FWPROJECT_NAME} ${PROJECT_VERSION})
+    string(REGEX MATCH "^[^.]+" API_VERSION ${PROJECT_VERSION})
+    set_target_properties(${FWPROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${API_VERSION})
+    set_target_properties(${FWPROJECT_NAME} PROPERTIES DEFINE_SYMBOL ${PROJECT_NAME_UPCASE}_EXPORTS)
+
+    add_definitions(-D${PROJECT_NAME_UPCASE}_VER="${DASH_VERSION}")
+
+    get_target_property(TARGET_TYPE ${FWPROJECT_NAME} TYPE)
+
+    if (NOT ${TARGET_TYPE} MATCHES "EXECUTABLE")
+        get_target_property(${FWPROJECT_NAME}_LIBRARY ${FWPROJECT_NAME} LOCATION)
+        set(${FWPROJECT_NAME}_LIBRARY ${${FWPROJECT_NAME}_LIBRARY} PARENT_SCOPE)
+    endif()
+
+    target_include_directories(${FWPROJECT_NAME} PUBLIC ${${FWPROJECT_NAME}_INCLUDE_DIR})
+
+    set(SPYLOG_LEVEL_${FWPROJECT_NAME} "${SPYLOG_LEVEL}" CACHE STRING "${FWPROJECT_NAME}'s Log level" )
+    set_property(CACHE SPYLOG_LEVEL_${FWPROJECT_NAME} PROPERTY STRINGS ${SPYLOG_LEVEL_VALUES} )
+    mark_as_advanced(SPYLOG_LEVEL_${FWPROJECT_NAME})
+
+    if( SPYLOG_LEVEL_MAP_${SPYLOG_LEVEL_${FWPROJECT_NAME}} )
+        add_definitions(-DSPYLOG_LEVEL=${SPYLOG_LEVEL_MAP_${SPYLOG_LEVEL_${FWPROJECT_NAME}}})
+    else()
+        message(SEND_ERROR "${SPYLOG_LEVEL_${FWPROJECT_NAME}} is not a valid value for SPYLOG_LEVEL_${FWPROJECT_NAME}" )
+    endif()
+    unset(SPYLOG_VALID_VALUE)
+
+endmacro(configureProject)
+
+
+macro(createResourcesTarget TARGET RES_DIR TARGET_DIR)
+    file(GLOB_RECURSE RESOURCES_FILES "${RES_DIR}/*")
+    set(CREATED_RESOURCES_LIST)
+    foreach(RESOURCE_FILE ${RESOURCES_FILES})
+        file(RELATIVE_PATH REL_PATH "${RES_DIR}" "${RESOURCE_FILE}")
+        if ("${TARGET_DIR}/${REL_PATH}" MATCHES "^.*\\.(txt|xml)$")
+            set(COPY_COMMAND cmake
+            -DIN_FILE="${RES_DIR}/${REL_PATH}" 
+            -DOUT_FILE="${TARGET_DIR}/${REL_PATH}" 
+            -DFWPROJECT_NAME="${FWPROJECT_NAME}"
+            -DDASH_VERSION="${${FWPROJECT_NAME}_DASH_VERSION}"
+            -DPROJECT_VERSION="${${FWPROJECT_NAME}_VERSION}"
+            -DTARGET_TYPE="${TARGET_TYPE}"
+            -P ${FWCMAKE_RESOURCE_PATH}/build/configure_file.cmake
+            )
+            set(COPY_DEPENDS "${FWCMAKE_RESOURCE_PATH}/build/configure_file.cmake" )
+        elseif("${TARGET_DIR}/${REL_PATH}" MATCHES "(.*)about(.*)" OR "${TARGET_DIR}/${REL_PATH}" MATCHES "(.*)documentations(.*)")
+            set(COPY_COMMAND cmake -E copy "${RES_DIR}/${REL_PATH}" "${SHARE_PATH}VRRender_0-9/${REL_PATH}")
+            set(COPY_DEPENDS )
+        else()
+            set(COPY_COMMAND cmake -E copy "${RES_DIR}/${REL_PATH}" "${TARGET_DIR}/${REL_PATH}")
+            set(COPY_DEPENDS )
+        endif()
+
+        add_custom_command(OUTPUT "${TARGET_DIR}/${REL_PATH}"
+            # COMMAND cmake -E copy "${RES_DIR}/${REL_PATH}" "${TARGET_DIR}/${REL_PATH}"
+            COMMAND ${COPY_COMMAND}
+            DEPENDS "${RES_DIR}/${REL_PATH}" ${COPY_DEPENDS}
+            ) 
+        LIST (APPEND CREATED_RESOURCES_LIST "${TARGET_DIR}/${REL_PATH}")
+    endforeach()
+
+    add_custom_target("${TARGET}" ALL DEPENDS ${CREATED_RESOURCES_LIST} )
+
+    unset(CREATED_RESOURCES_LIST)
+endmacro()
+
+macro(createResourcesInstallTarget RES_DIR CONFIGURED_FILES_DIR DESTINATION)
+    file(GLOB_RECURSE RESOURCES_FILES "${RES_DIR}/*")
+    foreach(RESOURCE_FILE ${RESOURCES_FILES})
+        file(RELATIVE_PATH REL_PATH "${RES_DIR}" "${RESOURCE_FILE}")
+        get_filename_component(RC_REL_DIR "${REL_PATH}" DIRECTORY)
+        if(RESOURCE_FILE MATCHES "(.*)Apps/VRRender/rc/about(.*)" OR RESOURCE_FILE MATCHES "(.*)Apps/VRRender/rc/documentations(.*)")
+            install(FILES "${SHARE_PATH}VRRender_0-9/${REL_PATH}" DESTINATION "${SHARE_PATH}VRRender_0-9/${RC_REL_DIR}" )
+        else()
+            install(FILES "${CONFIGURED_FILES_DIR}/${REL_PATH}" DESTINATION "${DESTINATION}/${RC_REL_DIR}" )
+        endif()
+        unset(RC_REL_DIR)
+    endforeach()
+endmacro()
+
+
+macro(fwExec FWPROJECT_NAME PROJECT_VERSION)
+    set(options CONSOLE)
+    set(oneValueArgs)
+    set(multiValueArgs)
+    cmake_parse_arguments(FWEXEC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+
+    initProject( ${FWPROJECT_NAME} )
+
+    set(${FWPROJECT_NAME}_TYPE "EXECUTABLE")
+    set(${FWPROJECT_NAME}_TYPE ${${FWPROJECT_NAME}_TYPE} PARENT_SCOPE)
+    setVersion(${FWPROJECT_NAME} ${PROJECT_VERSION})
+
+    if(WIN32 AND NOT ${FWEXEC_CONSOLE})
+        set(GUI_TYPE WIN32)
+    else()
+        add_definitions(-D_CONSOLE)
+    endif()
+
+    add_executable(${FWPROJECT_NAME} ${GUI_TYPE} ${${FWPROJECT_NAME}_HEADERS} ${${FWPROJECT_NAME}_SOURCES} )
+
+    configureProject( ${FWPROJECT_NAME} ${PROJECT_VERSION} )
+
+    if(EXISTS "${PRJ_SOURCE_DIR}/rc")
+        if(CLASSIC_INSTALL)
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${CMAKE_BINARY_DIR}/share/${FWPROJECT_NAME}_${DASH_VERSION}")
+        else()
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${SHARE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}")
+        endif()
+
+        createResourcesTarget( ${FWPROJECT_NAME}_rc "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" )
+        add_dependencies( ${FWPROJECT_NAME} ${FWPROJECT_NAME}_rc )
+
+        if(${FWPROJECT_NAME}_INSTALL)
+            if(CLASSIC_INSTALL)
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" "share/${FWPROJECT_NAME}_${DASH_VERSION}" )
+            else()
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" "${SHARE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}" )
+            endif()
+        endif()
+    endif()
+
+    if(${FWPROJECT_NAME}_INSTALL)
+        install(
+            TARGETS ${FWPROJECT_NAME}
+            RUNTIME DESTINATION ${RUNTIME_OUTPUT_DIR}
+            OPTIONAL
+            )
+    endif()
+
+
+endmacro(fwExec)
+
+macro(fwCppunitTest FWPROJECT_NAME)
+    set(options)
+    set(oneValueArgs BUNDLE WORKING_DIRECTORY)
+    set(multiValueArgs)
+    cmake_parse_arguments(fwCppunitTest "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+
+    initProject( ${FWPROJECT_NAME} tu )
+
+    set(${FWPROJECT_NAME}_TYPE "TEST")
+    set(${FWPROJECT_NAME}_TYPE ${${FWPROJECT_NAME}_TYPE} PARENT_SCOPE)
+    setVersion(${FWPROJECT_NAME} 0.0)
+
+    add_executable(${FWPROJECT_NAME}
+        ${fwCppunitTest_UNPARSED_ARGUMENTS}
+        ${${FWPROJECT_NAME}_HEADERS}
+        ${${FWPROJECT_NAME}_SOURCES}
+        ${FWCMAKE_RESOURCE_PATH}/cppunit/cppunit_main.cpp
+        )
+
+    if(fwCppunitTest_BUNDLE)
+        if(CLASSIC_INSTALL)
+            add_definitions(-DBUNDLE_TEST_PROFILE=\"share/tu_exec_${fwCppunitTest_BUNDLE}_0-0/profile.xml\")
+        else()
+            add_definitions(-DBUNDLE_TEST_PROFILE=\"${SHARE_PATH}tu_exec_${fwCppunitTest_BUNDLE}_0-0/profile.xml\")
+        endif()
+    endif()
+
+    configureProject( ${FWPROJECT_NAME} 0.0 )
+
+    if(EXISTS "${PRJ_SOURCE_DIR}/tu/rc")
+        string(REGEX REPLACE "Test$" "" DIRNAME "${FWPROJECT_NAME}")
+        if(CLASSIC_INSTALL)
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${CMAKE_BINARY_DIR}/share/tu_exec_${DIRNAME}_${DASH_VERSION}")
+        else()
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${SHARE_PATH}tu_exec_${DIRNAME}_${DASH_VERSION}")
+        endif()
+        createResourcesTarget( ${FWPROJECT_NAME}_rc "${PRJ_SOURCE_DIR}/tu/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" )
+        add_dependencies( ${FWPROJECT_NAME} ${FWPROJECT_NAME}_rc )
+
+        if(${FWPROJECT_NAME}_INSTALL)
+            createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/tu/rc"
+                "${${FWPROJECT_NAME}_RC_BUILD_DIR}" 
+                "share/tu_exec_${DIRNAME}_${DASH_VERSION}" )
+        endif()
+    endif()
+
+    if(fwCppunitTest_WORKING_DIRECTORY)
+        set(fwCppunitTest_WORKING_DIRECTORY WORKING_DIRECTORY ${fwCppunitTest_WORKING_DIRECTORY})
+    endif()
+
+    get_target_property(${FWPROJECT_NAME}_EXECUTABLE ${FWPROJECT_NAME} LOCATION)
+    add_test( NAME ${FWPROJECT_NAME} ${fwCppunitTest_WORKING_DIRECTORY} COMMAND ${${FWPROJECT_NAME}_EXECUTABLE}  )
+
+endmacro(fwCppunitTest)
+
+macro(fwLib FWPROJECT_NAME PROJECT_VERSION)
+    initProject( ${FWPROJECT_NAME} )
+
+    set(${FWPROJECT_NAME}_TYPE "LIBRARY")
+    set(${FWPROJECT_NAME}_TYPE ${${FWPROJECT_NAME}_TYPE} PARENT_SCOPE)
+    setVersion(${FWPROJECT_NAME} ${PROJECT_VERSION})
+
+    add_library(${FWPROJECT_NAME} ${ARGN} ${${FWPROJECT_NAME}_HEADERS} ${${FWPROJECT_NAME}_SOURCES} )
+
+    configureProject( ${FWPROJECT_NAME} ${PROJECT_VERSION} )
+
+    if(EXISTS "${PRJ_SOURCE_DIR}/rc")
+        if(CLASSIC_INSTALL)
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${CMAKE_BINARY_DIR}/share/${FWPROJECT_NAME}_${DASH_VERSION}")
+        else()
+            set(${FWPROJECT_NAME}_RC_BUILD_DIR "${SHARE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}")
+        endif()
+        createResourcesTarget( ${FWPROJECT_NAME}_rc "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" )
+        add_dependencies( ${FWPROJECT_NAME} ${FWPROJECT_NAME}_rc )
+
+        if(${FWPROJECT_NAME}_INSTALL)
+            if(CLASSIC_INSTALL)
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" "share/${FWPROJECT_NAME}_${DASH_VERSION}" )    
+            else()
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${${FWPROJECT_NAME}_RC_BUILD_DIR}" "${SHARE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}" )
+            endif()
+        endif()
+
+    endif()
+
+    if(${FWPROJECT_NAME}_INSTALL)
+        install(
+            TARGETS ${FWPROJECT_NAME}
+            RUNTIME DESTINATION ${RUNTIME_OUTPUT_DIR}
+            LIBRARY DESTINATION ${LIBRARY_OUTPUT_DIR}
+            OPTIONAL
+            )
+    endif()
+
+endmacro(fwLib)
+
+
+macro(fwBundle FWPROJECT_NAME PROJECT_VERSION)
+    initProject( ${FWPROJECT_NAME} )
+
+    set(${FWPROJECT_NAME}_TYPE "BUNDLE")
+    set(${FWPROJECT_NAME}_TYPE ${${FWPROJECT_NAME}_TYPE} PARENT_SCOPE)
+    setVersion(${FWPROJECT_NAME} ${PROJECT_VERSION})
+
+    if(CLASSIC_INSTALL)
+        set(BUNDLE_DIR "${CMAKE_BINARY_DIR}/Bundles/${FWPROJECT_NAME}_${DASH_VERSION}")
+    else()
+        set(BUNDLE_DIR "${BUNDLE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}")
+    endif()
+
+    if(EXISTS "${PRJ_SOURCE_DIR}/src")
+        add_library( ${FWPROJECT_NAME} SHARED ${ARGN} ${${FWPROJECT_NAME}_HEADERS} ${${FWPROJECT_NAME}_SOURCES})
+
+        configureProject( ${FWPROJECT_NAME} ${PROJECT_VERSION} )
+
+        set_target_properties(${FWPROJECT_NAME} PROPERTIES OUTPUT_NAME ${FWPROJECT_NAME}_${DASH_VERSION})
+        set_target_properties(${FWPROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BUNDLE_DIR})
+        set_target_properties(${FWPROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${BUNDLE_DIR})
+
+        #install(DIRECTORY "${BUNDLE_DIR}" DESTINATION VRRender.app/Bundles COMPONENT Runtime)
+
+        if(${FWPROJECT_NAME}_INSTALL)
+		if(CLASSIC_INSTALL)
+			install(TARGETS ${FWPROJECT_NAME}
+				RUNTIME DESTINATION Bundles/${FWPROJECT_NAME}_${DASH_VERSION}
+				LIBRARY DESTINATION Bundles/${FWPROJECT_NAME}_${DASH_VERSION}
+				OPTIONAL
+			)
+                else()
+			install(TARGETS ${FWPROJECT_NAME}
+				RUNTIME DESTINATION ${BUNDLE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}
+                    		LIBRARY DESTINATION ${BUNDLE_PATH}${FWPROJECT_NAME}_${DASH_VERSION}
+        			OPTIONAL
+			)
+		endif()
+        endif()
+
+    else()
+        add_custom_target(${FWPROJECT_NAME})
+    endif()
+
+    if(EXISTS "${PRJ_SOURCE_DIR}/rc")
+        createResourcesTarget( ${FWPROJECT_NAME}_rc "${PRJ_SOURCE_DIR}/rc" "${BUNDLE_DIR}" )
+        add_dependencies( ${FWPROJECT_NAME} ${FWPROJECT_NAME}_rc )
+
+        if(${FWPROJECT_NAME}_INSTALL)
+            if(CLASSIC_INSTALL)
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${BUNDLE_DIR}" Bundles/${FWPROJECT_NAME}_${DASH_VERSION} )
+            else()
+                createResourcesInstallTarget( "${PRJ_SOURCE_DIR}/rc" "${BUNDLE_DIR}" ${BUNDLE_PATH}${FWPROJECT_NAME}_${DASH_VERSION} )
+            endif()
+        endif()
+    endif()
+
+
+endmacro(fwBundle)
+
+
+macro(fwUseForwardInclude)
+    foreach(PROJECT ${ARGV})
+        get_target_property(PROJECT_INCLUDE_DIRECTORIES ${PROJECT} INTERFACE_INCLUDE_DIRECTORIES)
+        list(REMOVE_DUPLICATES PROJECT_INCLUDE_DIRECTORIES)
+        target_include_directories(${FWPROJECT_NAME} PUBLIC ${PROJECT_INCLUDE_DIRECTORIES})
+    endforeach(PROJECT)
+endmacro(fwUseForwardInclude)
+
+macro(fwUseForwardLink)
+    target_link_libraries(${FWPROJECT_NAME} LINK_PUBLIC ${ARGV})
+endmacro(fwUseForwardLink)
+
+macro(fwUseForward)
+    fwUseForwardInclude(${ARGV})
+    fwUseForwardLink(${ARGV})
+endmacro(fwUseForward)
+
+
+macro(fwForwardInclude)
+    target_include_directories(${FWPROJECT_NAME} PUBLIC ${ARGV})
+endmacro(fwForwardInclude)
+
+macro(fwForwardLink)
+    #target_link_libraries(${FWPROJECT_NAME} LINK_PUBLIC ${ARGV})
+    target_link_libraries(${FWPROJECT_NAME} ${ARGV})
+endmacro(fwForwardLink)
+
+macro(fwInclude)
+    target_include_directories(${FWPROJECT_NAME} PRIVATE ${ARGV})
+endmacro(fwInclude)
+
+macro(fwLink)
+    #target_link_libraries(${FWPROJECT_NAME} LINK_PRIVATE ${ARGV})
+    target_link_libraries(${FWPROJECT_NAME} ${ARGV})
+endmacro(fwLink)
+
+
+# Defines project's linked dependencies on others projects
+# example :
+#     fwUse( fwCore fwData )
+# WARNING : some part of this cmake file relies on this macro signature
+
+macro(fwUse)
+    #target_link_libraries(${FWPROJECT_NAME} LINK_PRIVATE ${ARGV})
+    target_link_libraries(${FWPROJECT_NAME} ${ARGV})
+
+    set(${FWPROJECT_NAME}_DEPENDENCIES)
+    set(${FWPROJECT_NAME}_EXECUTABLE_DEPENDENCIES)
+    set(${FWPROJECT_NAME}_LIBRARY_DEPENDENCIES)
+    set(${FWPROJECT_NAME}_BUNDLE_DEPENDENCIES)
+
+    foreach(PROJECT ${ARGV})
+        list(APPEND ${FWPROJECT_NAME}_DEPENDENCIES ${PROJECT})
+        list(APPEND ${FWPROJECT_NAME}_${${PROJECT}_TYPE}_DEPENDENCIES ${PROJECT})
+    endforeach(PROJECT)
+
+    set(${FWPROJECT_NAME}_DEPENDENCIES ${${FWPROJECT_NAME}_DEPENDENCIES} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_EXECUTABLE_DEPENDENCIES ${${FWPROJECT_NAME}_EXECUTABLE_DEPENDENCIES} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_BUNDLE_DEPENDENCIES ${${FWPROJECT_NAME}_BUNDLE_DEPENDENCIES} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_LIBRARY_DEPENDENCIES ${${FWPROJECT_NAME}_LIBRARY_DEPENDENCIES} PARENT_SCOPE)
+
+endmacro(fwUse)
+
+
+
+# Defines project's requirements on others projects
+# example :
+#     fwReq( ioVTK ioITK )
+# WARNING : some part of this cmake file relies on this macro signature
+macro(fwReq)
+    add_dependencies(${FWPROJECT_NAME} ${ARGV})
+
+    set(${FWPROJECT_NAME}_REQUIREMENTS)
+    set(${FWPROJECT_NAME}_EXECUTABLE_REQUIREMENTS)
+    set(${FWPROJECT_NAME}_LIBRARY_REQUIREMENTS)
+    set(${FWPROJECT_NAME}_BUNDLE_REQUIREMENTS)
+
+    foreach(PROJECT ${ARGV})
+        list(APPEND ${FWPROJECT_NAME}_REQUIREMENTS ${PROJECT})
+        list(APPEND ${FWPROJECT_NAME}_${${PROJECT}_TYPE}_REQUIREMENTS ${PROJECT})
+    endforeach(PROJECT)
+
+    set(${FWPROJECT_NAME}_REQUIREMENTS ${${FWPROJECT_NAME}_REQUIREMENTS} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_EXECUTABLE_REQUIREMENTS ${${FWPROJECT_NAME}_EXECUTABLE_REQUIREMENTS} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_BUNDLE_REQUIREMENTS ${${FWPROJECT_NAME}_BUNDLE_REQUIREMENTS} PARENT_SCOPE)
+    set(${FWPROJECT_NAME}_LIBRARY_REQUIREMENTS ${${FWPROJECT_NAME}_LIBRARY_REQUIREMENTS} PARENT_SCOPE)
+
+endmacro(fwReq)
+
+
+function(checkMissingDependencies DIR KEYWORD RESULT)
+    set(${RESULT} "" PARENT_SCOPE)
+    file(READ ${DIR}/CMakeLists.txt CMAKELISTS_CONTENT)
+    string(REGEX MATCH "${KEYWORD} *[^)]+" DEPENDENCIES "${CMAKELISTS_CONTENT}")
+    string(REGEX REPLACE "^.*\\(" " " DEPENDENCIES "${DEPENDENCIES}")
+    string(STRIP DEPENDENCIES "${DEPENDENCIES}")
+    string(REGEX REPLACE "( |\n|#)+" ";" DEPENDENCIES "${DEPENDENCIES}")
+    string(REGEX REPLACE "^;" "" DEPENDENCIES "${DEPENDENCIES}")
+    string(REGEX REPLACE ";+" ";" DEPENDENCIES "${DEPENDENCIES}")
+
+
+    set(DEPENDENCY_LIST)
+    foreach(DEPENDENCY ${DEPENDENCIES})
+        if(NOT ${DEPENDENCY}_TYPE)
+            list(APPEND DEPENDENCY_LIST ${DEPENDENCY})
+        endif(NOT ${DEPENDENCY}_TYPE)
+    endforeach(DEPENDENCY)
+    set(${RESULT} ${DEPENDENCY_LIST} PARENT_SCOPE)
+endfunction(checkMissingDependencies)
+
+
+function(findAllDependencies FWPROJECT_NAMES RESULT_VAR)
+    set(DEPENDENCY_LIST)
+    set(RESULT "")
+    list(APPEND DEPENDENCY_LIST ${FWPROJECT_NAMES})
+    while(DEPENDENCY_LIST)
+
+        list(GET DEPENDENCY_LIST 0 DEPENDENCY)
+        list(REMOVE_AT DEPENDENCY_LIST 0 )
+
+        if(NOT PROCESSED_${DEPENDENCY})
+            list(APPEND DEPENDENCY_LIST ${${DEPENDENCY}_DEPENDENCIES})
+            list(APPEND DEPENDENCY_LIST ${${DEPENDENCY}_REQUIREMENTS})
+            set(PROCESSED_${DEPENDENCY} 1)
+        endif()
+
+        list(APPEND RESULT ${DEPENDENCY})
+    endwhile()
+
+    list(REMOVE_DUPLICATES RESULT)
+    set(${RESULT_VAR} ${RESULT} PARENT_SCOPE)
+
+endfunction()
+
+function(findTests FWPROJECTS RESULT_VAR)
+    set(RESULT "")
+
+    foreach(PROJECT ${FWPROJECTS})
+        if(${PROJECT}Test_DIR)
+            list(APPEND RESULT ${PROJECT}Test)
+        endif()
+    endforeach()
+
+    set(${RESULT_VAR} ${RESULT} PARENT_SCOPE)
+endfunction()
+
+macro(loadProperties PROPERTIES_FILE)
+    set(NAME)
+    set(OPTIONS)
+    set(VERSION)
+    set(TYPE)
+    set(DEPENDENCIES)
+    set(REQUIREMENTS)
+    set(CPPUNITTEST_OPTIONS)
+
+    include("${PROPERTIES_FILE}")
+endmacro()
+
+
+macro(fwLoadProperties)
+    loadProperties("Properties.cmake")
+
+    string( TOUPPER "${TYPE}" TYPE )
+    
+    if( TYPE STREQUAL "EXECUTABLE" )
+        fwExec(${NAME} ${VERSION} ${OPTIONS})
+    elseif( TYPE STREQUAL "LIBRARY" )
+        fwLib(${NAME} ${VERSION} ${OPTIONS})
+    elseif( TYPE STREQUAL "BUNDLE" )
+        fwBundle(${NAME} ${VERSION} ${OPTIONS})
+    elseif( TYPE STREQUAL "TEST" )
+        fwCppunitTest(${NAME} "${CPPUNITTEST_OPTIONS}" "${OPTIONS}")
+    endif()
+
+    if(DEPENDENCIES)
+        fwUse( ${DEPENDENCIES} )
+    endif()
+    if(REQUIREMENTS)
+        fwReq( ${REQUIREMENTS} )
+    endif()
+
+endmacro()
+
+
+macro(addProject PROJECT)
+    set(PROJECT_CACHE ${ARGN})
+    list(FIND PROJECT_CACHE "${PROJECT}" DEP_LOOP)
+    if(DEP_LOOP GREATER -1)
+        message(FATAL_ERROR "Looks like there is a dependency loop in projects: ${PROJECT_CACHE};${PROJECT}")
+    endif()
+
+    if( NOT ${PROJECT}_CONFIGURED )
+        list(APPEND PROJECT_CACHE ${PROJECT})
+
+        foreach(DEPENDENCY ${${PROJECT}_DEPENDENCIES})
+            addProject( ${DEPENDENCY} "${PROJECT_CACHE}")
+        endforeach()
+
+        foreach(REQUIREMENT ${${PROJECT}_REQUIREMENTS})
+            addProject( ${REQUIREMENT} "${PROJECT_CACHE}")
+        endforeach()
+
+        set(${PROJECT}_CONFIGURED 1)
+
+        message(STATUS "Configuring ${PROJECT}: ${${PROJECT}_DIR}")
+        if(${PROJECT}_DIR)
+            add_subdirectory(${${PROJECT}_DIR} ${PROJECT})
+        else()
+            message(SEND_ERROR "<${PROJECT}> dir '' not found.")
+        endif()
+
+    endif()
+    unset(PROJECT_CACHE)
+endmacro()
+
+
+
+set(EXTERNAL_LIBRARIES CACHE PATH "External libraries location")
+if(EXTERNAL_LIBRARIES)
+    list(APPEND CMAKE_PREFIX_PATH ${EXTERNAL_LIBRARIES})
+    list(APPEND CMAKE_MODULE_PATH ${EXTERNAL_LIBRARIES})
+
+    file(GLOB LIB_CONFIGS ${EXTERNAL_LIBRARIES}/fw-*.cmake )
+    foreach(LIB_CONFIG ${LIB_CONFIGS})
+        message(STATUS "include : ${LIB_CONFIG}")
+        include("${LIB_CONFIG}")
+    endforeach(LIB_CONFIG)
+endif(EXTERNAL_LIBRARIES)
+
+
+set(PROJECTS_TO_BUILD CACHE STRING 
+        "List of projects that will be configured for build.
+        Leave empty to configure all projects"
+    )
+
+set(PROJECTS_TO_INSTALL CACHE STRING 
+        "List of projects for which the installation rules will be created."
+    )
+
+
+file(GLOB_RECURSE PROJECTS_PROPERTIES */Properties.cmake)
+
+# Fix problem where CMake find a bundle twice (once in ./pc == patch)
+foreach(PROPERTIES_FILE ${PROJECTS_PROPERTIES})
+	if(PROPERTIES_FILE MATCHES "(.*)/.pc/(.*)")
+		remove(PROJECTS_PROPERTIES ${PROPERTIES_FILE})
+	endif()
+endforeach()
+
+foreach(PROPERTIES_FILE ${PROJECTS_PROPERTIES})
+    get_filename_component(PROJECT_DIR ${PROPERTIES_FILE} PATH)
+
+    loadProperties("${PROPERTIES_FILE}")
+
+    if(NOT NAME)
+        message(FATAL_ERROR "${PROPERTIES_FILE}: Project NAME can not be empty.")
+    endif()
+
+    list(FIND DEPENDENCIES ${NAME} DEP_LOOP)
+    if(DEP_LOOP GREATER -1)
+        message(FATAL_ERROR "${PROPERTIES_FILE}: A project can not be it's own dependency.")
+    endif()
+
+    list(FIND REQUIREMENTS ${NAME} REQ_LOOP)
+    if(REQ_LOOP GREATER -1)
+        message(FATAL_ERROR "${PROPERTIES_FILE}: A project can not be it's own requirement.")
+    endif()
+
+    if(${NAME}_DIR)
+        message(FATAL_ERROR "${PROPERTIES_FILE}: A project NAME must be unique in the workspace. ${NAME} already defined there : ${${NAME}_DIR}")
+    endif()
+
+    set(${NAME}_DEPENDENCIES "${DEPENDENCIES}")
+    set(${NAME}_REQUIREMENTS "${REQUIREMENTS}")
+    set(${NAME}_VERSION "${VERSION}")
+    set(${NAME}_DIR "${PROJECT_DIR}")
+
+    LIST(APPEND PROJECT_LIST ${NAME})
+
+endforeach()
+
+# Doxygen documentation
+include(${CMAKE_ROOT}/Modules/Documentation.cmake)
+option(BUILD_DOCUMENTATION "Build the doxygen documentation" OFF)
+if(BUILD_DOCUMENTATION)
+    find_package(Doxygen)
+    if(DOXYGEN_FOUND)
+        set(INCLUDE_DIRS)
+        foreach(PROJECT ${PROJECT_LIST})
+            set(INCLUDE_DIRS "${INCLUDE_DIRS} ${${PROJECT}_DIR}/include")
+        endforeach(PROJECT)
+        configure_file(${FWCMAKE_RESOURCE_PATH}/doxygen/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Documentation/Doxygen/Doxyfile @ONLY)
+        add_custom_target(doc ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/documentation/doxygen/doxyfile
+            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT
+            "Generating API documentation with Doxygen" VERBATIM)
+    endif(DOXYGEN_FOUND)
+endif(BUILD_DOCUMENTATION)
+
+if(PROJECTS_TO_BUILD)
+    set(PROJECT_LIST ${PROJECTS_TO_BUILD})
+    findAllDependencies("${PROJECT_LIST}" PROJECT_LIST)
+    message(STATUS "Project configuration is restricted to : ${PROJECTS_TO_BUILD}")
+endif()
+
+if(BUILD_TESTS)
+    findTests("${PROJECT_LIST}" PROJECT_TESTS)
+    set(PROJECT_LIST ${PROJECT_LIST};${PROJECT_TESTS})
+endif()
+
+findAllDependencies("${PROJECTS_TO_INSTALL}" PROJECTS_TO_INSTALL)
+
+if(PROJECTS_TO_INSTALL)
+    message(STATUS "Installation rules will be created for : ${PROJECTS_TO_INSTALL}")
+endif()
+
+foreach(PROJECT ${PROJECTS_TO_INSTALL})
+    list(FIND PROJECT_LIST "${PROJECT}" PROJECT_FOUND)
+    if(PROJECT_FOUND GREATER -1)
+        set(${PROJECT}_INSTALL 1)
+    else()
+        message(WARNING "Project ${PROJECT} not found, will not be installed.")
+        unset(${PROJECT}_INSTALL)
+    endif()
+endforeach()
+unset(PROJECT_FOUND)
+
+foreach(PROJECT ${PROJECT_LIST})
+    addProject(${PROJECT})
+endforeach()
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f05573d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,5 @@
+fw4spl
+======
+
+The main goal of the repository is to allow the build of fw4spl on a Debian system (Jessie), using only the system libraries.
+In a second time, we want to create a Debian package, for the Debian-Med project.
diff --git a/SrcLib/ARLcore/CMakeLists.txt b/SrcLib/ARLcore/CMakeLists.txt
new file mode 100644
index 0000000..abc3054
--- /dev/null
+++ b/SrcLib/ARLcore/CMakeLists.txt
@@ -0,0 +1,48 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwTools
+)
+
+
+find_package( Boost REQUIRED )
+
+if(CLASSIC_INSTALL)
+    find_library( ANN_LIBRARY ANN )
+else()
+    find_library( ANN_LIBRARY ann )
+endif()
+find_path( ANN_INCLUDES  ANN/ANN.h)
+
+find_library(VGL_ALGO_LIBRARY   vgl_algo )
+find_library(VNL_ALGO_LIBRARY   vnl_algo )
+find_library(VNL_LIBRARY        vnl )
+find_library(VGL_LIBRARY        vgl )
+find_library(VCL_LIBRARY        vcl )
+find_library(V3P_NETLIB_LIBRARY v3p_netlib )
+find_library(NETLIB_LIBRARY     netlib )
+
+find_path( VNL_INCLUDE_PATH  vxl/core/vnl/vnl_alloc.h)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIR}
+    ${ANN_INCLUDES}
+    ${VNL_INCLUDE_PATH}
+    ${VNL_INCLUDE_PATH}/vxl
+    ${VNL_INCLUDE_PATH}/vxl/core
+    ${VNL_INCLUDE_PATH}/vxl/vcl
+    )
+
+#add linked libraries
+fwLink(
+    ${ANN_LIBRARY}
+    ${VGL_ALGO_LIBRARY}
+    ${VNL_ALGO_LIBRARY}
+    ${VNL_LIBRARY}
+    ${VGL_LIBRARY}
+    ${VCL_LIBRARY}
+    ${V3P_NETLIB_LIBRARY}
+    ${NETLIB_LIBRARY}
+    )
+
+
diff --git a/SrcLib/ARLcore/CMakeLists.txt.old b/SrcLib/ARLcore/CMakeLists.txt.old
new file mode 100644
index 0000000..fb0c8b2
--- /dev/null
+++ b/SrcLib/ARLcore/CMakeLists.txt.old
@@ -0,0 +1,60 @@
+#cmake version
+cmake_minimum_required(VERSION 2.8)
+
+project(ARLcore)
+
+set(TARGET_NAME ARLcore)
+
+file( GLOB_RECURSE SOURCES src/* )
+file( GLOB_RECURSE INCLUDES include/* )
+
+set(CMAKE_CXX_FLAGS_DEBUG "-D_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}" )
+
+find_package( Boost 1.40 REQUIRED )
+
+find_library( ANN_LIBRARY ANN )
+
+find_path( ANN_INCLUDES  ANN/ANN.h)
+
+find_library(VGL_ALGO_LIBRARY   vgl_algo )
+find_library(VNL_ALGO_LIBRARY   vnl_algo )
+find_library(VNL_LIBRARY        vnl )
+find_library(VGL_LIBRARY        vgl )
+find_library(VCL_LIBRARY        vcl )
+find_library(V3P_NETLIB_LIBRARY v3p_netlib )
+find_library(NETLIB_LIBRARY     netlib )
+
+find_path( VNL_INCLUDE_PATH  vxl/core/vnl/vnl_alloc.h)
+
+include_directories(
+    "include"
+    ${Boost_INCLUDE_DIR}
+
+    ${ANN_INCLUDES}
+
+    ${VNL_INCLUDE_PATH}
+    ${VNL_INCLUDE_PATH}/vxl
+    ${VNL_INCLUDE_PATH}/vxl/core
+    ${VNL_INCLUDE_PATH}/vxl/vcl
+    )
+
+#declaration of target
+add_library( ${TARGET_NAME} SHARED ${SOURCES} ${INCLUDES})
+
+#add linked libraries
+target_link_libraries(${TARGET_NAME}
+    ${ANN_LIBRARY}
+    ${VGL_ALGO_LIBRARY}
+    ${VNL_ALGO_LIBRARY}
+    ${VNL_LIBRARY}
+    ${VGL_LIBRARY}
+    ${VCL_LIBRARY}
+    ${V3P_NETLIB_LIBRARY}
+    ${NETLIB_LIBRARY}
+    )
+set_target_properties(
+    ${TARGET_NAME} PROPERTIES DEFINE_SYMBOL  "ARLCORE_EXPORTS" 
+    )
+set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ARLcore)
+set_target_properties(${TARGET_NAME} PROPERTIES VERSION 0.2)
+
diff --git a/SrcLib/ARLcore/Properties.cmake b/SrcLib/ARLcore/Properties.cmake
new file mode 100644
index 0000000..6d71597
--- /dev/null
+++ b/SrcLib/ARLcore/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ARLcore )
+set( VERSION 0.2 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/ARLcore/bin/build.options b/SrcLib/ARLcore/bin/build.options
new file mode 100755
index 0000000..effdfce
--- /dev/null
+++ b/SrcLib/ARLcore/bin/build.options
@@ -0,0 +1,4 @@
+TYPE = 'shared'
+LIB     = ['fwTools_0-1' ,'fwCore_0-1' ]
+USE  = ['vxlVcl','vxlVnlAlgo','vxlVglAlgo','ann','boost']
+VERSION = '0-1'
diff --git a/SrcLib/ARLcore/include/arlcore/Calibration.h b/SrcLib/ARLcore/include/arlcore/Calibration.h
new file mode 100644
index 0000000..6d3485e
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Calibration.h
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_CALIBRATION_H
+#define _ARLCORE_CALIBRATION_H
+#include <arlcore/Common.h>
+
+#include <arlcore/Camera.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Point.h>
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    /**
+    * @brief Intrinsic camera parameter initialisation
+    * @param[in] models3D List of 3D models, one for each pose (the object has to be a plane)
+    * If the 3D model does not change in all the pose you can provide only one PointList that corresponds
+    * to the calibration object 3D points
+    * If your calibration object changes in each pose (for example because some points are occluded), you have to
+    * give for each pose the PointList corresponding to the calibration object that is used
+    * @param[in] points2D : PointList vector of 2D points extracted for each pose
+    * @param[in,out] camera : result of the calibration is written in arlcore::camera
+    * @param[out] extrinsic : this vector vnl_rigid_matrix contains for each object pose (after calibration)
+    * the rigid transformation between the camera frame and the object frame
+    * @param[in] optimiserParameters : optional parameter list not used here
+    * @param[out] log[0] gives the number of pose used in the calibration
+    * @param[out] log[i+1] provides the average reprojection error for the ith pose (sum_j euclidean_dist(reproj_j - extracted_j))
+    * @warning : this initialization fonction works for 3D objects which Z coordinates are 0 only.
+    */
+    ARLCORE_API bool initIntrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector < PointList::csptr >& points2D, Camera &, std::vector< vnl_rigid_matrix> &extrinsic,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log );
+
+    /**
+    * @brief Refinement of the camera intrinsic parameters
+    * @param[in] models3D List of 3D models, one for each pose
+    * If the 3D model does not change in all the N poses you can provide only one PointList that corresponds
+    * to the calibration object 3D points
+    * If your calibration object changes in each pose (for example because some points are occluded), you have to
+    * give for each pose the PointList corresponding to the calibration object that is used
+    * @param[in] points2D : PointList vector of 2D points extracted for each pose
+    * @param[in,out] camera : contains the initialization parameters and is modified after the calibration
+    * @param[in] nbParameters : corresponds to the model of camera that is used for the optimization
+    * if nbParameters = 8, the camera has the following parameters : fc1, fc2, cc1, cc2, k1, k2, k3, k4 are optimized
+    * if nbParameters = 6, the camera has the following parameters : fc1, fc2, cc1, cc2, k1, k2  are optimized (TODO not implemented)
+    * if nbParameters = 5, the camera has the following parameters : fc1, fc2, cc1, cc2, k1  are optimized (TODO not implemented)
+    * if nbParameters = 4, the camera has the following parameters : fc1, fc2, cc1, cc2  are optimized (TODO not implemented)
+    * @param[out] extrinsic : : this vector vnl_rigid_matrix contains for each object pose (after calibration)
+    * the rigid transformation between the camera frame and the object frame
+    * @param[in] optimiserParameters optional parameter for the optimiser
+    *               [0]=Optimization method (0=LEVENBERG-MARQUARDT ; 1=POWELL) Default=0
+    *               [1]=Verbose (0=false else true) Default=0
+    *               [2]=f tolerance Default=1e-6
+    *               [3]=x tolerance Default=1e-8
+    *               [4]=g tolerance Default=1e-5
+    * @param[out] log List
+    *               [0]=Average reprojection error RMS at the end of the optimization (sqrt(mean(sum_i reprojection_error)))
+    *               [1]=Average reprojection error RMS at the beginning of the optimization
+    *               [2]=Number of iteration to converge
+    *               [3]=Number of pose
+    *               [3+1]=Number of point for the first pose
+    *               [3+i]=Number of point for the ith pose
+    *               [3+N]=Number of point for the last pose
+    *               [3+N+1]=Number total of point
+    *               [3+N+2 -> 3+N+??]= Reprojection error for each of the points
+    *
+    */
+    ARLCORE_API bool refineIntrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector < PointList::csptr >& points2D, unsigned int nbParameters,
+        Camera &, std::vector< vnl_rigid_matrix> &, const std::vector<double> &optimiserParameters,
+        std::vector<double> &log );
+
+    /**
+    * @brief Compute the intrinsic parameters of a camera : Initialisation + Refinement
+    * @param[in] models3D List of 3D models, one for each pose
+    * If the 3D model does not change in all the pose you can provide only one PointList that corresponds
+    * to the calibration object 3D points
+    * If your calibration object changes in each pose (for example because some points are occluded), you have to
+    * give for each pose the PointList corresponding to the calibration object that is used
+    * @param[in] points2D : PointList vector of 2D points extracted for each pose
+    * @param[in,out] camera : contains the initialization parameters and is modified after the calibration
+    * @param[in] nbParameters : corresponds to the model of camera that is used for the optimization
+    * if nbParameters = 8, the camera has the following parameters : fc1, fc2, cc1, cc2, k1, k2, k3, k4 are optimized
+    * if nbParameters = 6, the camera has the following parameters : fc1, fc2, cc1, cc2, k1, k2  are optimized (TODO not implemented)
+    * if nbParameters = 5, the camera has the following parameters : fc1, fc2, cc1, cc2, k1  are optimized (TODO not implemented)
+    * if nbParameters = 4, the camera has the following parameters : fc1, fc2, cc1, cc2  are optimized (TODO not implemented)
+    * @param[out] extrinsic : : this vector vnl_rigid_matrix contains for each object pose (after calibration)
+    * the rigid transformation between the camera frame and the object frame
+    * @param[in] optimiserParameters optional parameter list that is used for the refinement method (see refineIntrinsicCalibration
+    * to understand how to fill it)
+    * log will contains the log of arlcore::initIntrinsicCalibration and arlcore::refineIntrinsicCalibration
+    * @param[out] log[0] gives the number of pose N used in the calibration
+    * @param[out] log[1 -> N] provides the average reprojection error for the ith pose during the initialization process
+    * @param[out] log[N+1] = Average reprojection error RMS at the end of the optimization
+    * @param[out] log[N+2] = Average reprojection error RMS at the beginning of the optimization
+    * @param[out] log[N+3] = Iteration number to converge
+    * @param[out] log[N+4] gives the number of pose N used in the calibration
+    * @param[out] log[N+4+i] gives the number of point of the ith pose
+    * @param[out] log[N+4+N] gives the number of point of the Nth pose
+    * @param[out] log[N+4+N+1 -> N+4+N+1 +?? ] Reprojection error for each of the points
+    */
+    ARLCORE_API bool intrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector < PointList::csptr >& points2D, unsigned int nbParameters,
+        Camera &, std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double>& optimiserParameters,
+        std::vector<double>& log );
+
+    /**
+    * @brief Initialisation of the extrinsic calibration between several cameras
+    * The parameter cameras is not changed !
+    * The rigid transformation from the calibration grid (for the ith pose) to the camera 0
+    * is given in extrinsics[i-1]
+    * The rigid transformation from the camera 0 frame to the jth camera frame is given in
+    * extrinsic[nbPose+j-1]
+    * @param[in] models3D List of 3D models points for each pose
+    * @param[in] listsPoints2D List of 2D points (reprojection of th 3D model points) detected for each pose for each camera
+    * @param[in] cameras List of cameras that we want to calibrate
+    * @param[out] extrinsics contains the transformation matrix from the camera 0 frame to the 3D model for each pose
+    * and is followed by the the transformation matrix from the camera 0 frame to camera j frame (computed using the pose 0 only)
+    * cf. Calibration.cpp to understand the criteria
+    * @param[in] optimiserParameters optional list of parameters for the planarHomography function used in the function
+    * @param[out] log[0] gives the number of pose used in the calibration
+    * @param[out] log List of results to check the estimation quality (TODO still not used now)
+    */
+    ARLCORE_API bool initExtrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D,
+        const std::vector<const Camera*>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics,
+        const std::vector<double> &optimiserParameters,
+        std::vector<double> &log );
+
+    ARLCORE_API bool initExtrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D, const std::vector<Camera>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double> &optimiserParameters, std::vector<double> &log );
+
+    /**
+    * @brief Refinement of the extrinsic calibration of several cameras
+    * @param[in] models3D List of 3D models, one for each pose
+    * @param[in] listsPoints2D List of 2D points (reprojection of th 3D model points) detected for each pose for each camera
+    * @param[in] cameras List of cameras that we want to calibrate (extrinsic parameters have to be identity)
+    * @param[out] extrinsics contains the transformation matrix from the camera 0 frame to the 3D model for each pose
+    * and is followed by the transformation matrix T_j from the camera 0 frame to camera j frame ( M_i^j = T_j * M_i^0)
+    * cf. Calibration.cpp to understand the criteria
+    * @param[in] optimiserParameters optional parameter for the optimiser
+    *               [0]=Optimization method (0=LEVENBERG-MARQUARDT ; 1=POWELL) Default=0
+    *               [1]=Verbose (0=false else true) Default=0
+    *               [2]=f tolerance Default=1e-6
+    *               [3]=x tolerance Default=1e-8
+    *               [4]=g tolerance Default=1e-5
+    * @param[out] log List
+    *               [0]=End error
+    *               [1]=Start error
+    *               [2,n+1]=Reprojection error for each of the n points
+    */
+    ARLCORE_API bool refineExtrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D, const std::vector<const Camera*>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double> &optimiserParameters, std::vector<double> &log );
+
+    ARLCORE_API bool refineExtrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D, const std::vector<Camera>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double> &optimiserParameters, std::vector<double> &log );
+
+    /**
+    * @brief Extrinsic calibration of several cameras
+    * @param[in] models3D List of 3D models, one for each pose
+    * @param[in] listsPoints2D List of 2D points (reprojection of th 3D model points) detected for each pose for each camera
+    * @param[in] cameras List of cameras that we want to calibrate (extrinsic parameters have to be identity)
+    * @param[out] extrinsics contains the transformation matrix from the camera 0 frame to the 3D model for each pose
+    * and is followed by the transformation matrix from the camera 0 frame to camera j frame (computed using the pose 0 only)
+    * cf. Calibration.cpp to understand the criteria
+    * @param[in] optimiserParameters optional parameter list that is used for the refinement method (see refineExtrinsicCalibration
+    * to understand how to fill it)
+    * @param[out] log[0] gives the number of pose used in the calibration
+    * @param[out] log List (identical to the arlcore::refineExtrinsicCalibration log)
+    *               [1]=End error
+    *               [2]=Start error
+    *               [3,n+1]=Reprojection error for each of the n points
+    */
+    ARLCORE_API bool extrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D, const std::vector<const Camera*>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double> &optimiserParameters, std::vector<double> &log );
+
+    ARLCORE_API bool extrinsicCalibration(const std::vector< PointList::csptr >& models3D,
+        const std::vector<std::vector<std::vector<Point::csptr > > >& listsPoints2D, const std::vector<Camera>& cameras,
+        std::vector< vnl_rigid_matrix>& extrinsics, const std::vector<double> &optimiserParameters, std::vector<double> &log );
+
+} // namespace arlCore
+#endif // _ARLCORE_CALIBRATION_H
diff --git a/SrcLib/ARLcore/include/arlcore/Camera.h b/SrcLib/ARLcore/include/arlcore/Camera.h
new file mode 100644
index 0000000..0730f59
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Camera.h
@@ -0,0 +1,281 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_CAMERA_H
+#define _ARLCORE_CAMERA_H
+#include <arlcore/Common.h>
+
+#include <string>
+
+#include <vnl/vnl_matrix_fixed.h>
+#include <vnl/vnl_vector_fixed.h>
+#include <vgl/vgl_point_2d.h>
+#include <vgl/vgl_point_3d.h>
+#include <vgl/vgl_line_2d.h>
+#include <vgl/vgl_plane_3d.h>
+
+#include <arlcore/Object.h>
+#include <arlcore/Point.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/Particle.h>
+#include <arlcore/MatrixR.h>
+
+namespace arlCore
+{
+    class PlaneSystem;
+    class Point;
+    /**
+     * @class   Camera
+     * @date    2007
+     * @brief   Parametres physiques d'une camera (intrinsèques et extrinsèques)
+     */
+    class Camera :  public Particle
+    {
+    public:
+        //! @brief Constructor
+        ARLCORE_API Camera( PlaneSystem &universe );
+
+        //! @brief Constructor
+        ARLCORE_API Camera( PlaneSystem &universe, const uint32HL &GUID );
+
+        //! @brief Constructor by copy
+        ARLCORE_API Camera( const Camera &c );
+
+        //! @brief Destructor
+        ARLCORE_API ~Camera( void );
+
+        //! @brief Affectation
+        ARLCORE_API Camera& operator=(const Camera&);
+
+        //! @brief Copy
+        ARLCORE_API void copy(const Camera&);
+
+        //! @brief Initialization with default parameters
+        ARLCORE_API void init( void );
+
+        //! @return Description of the current camera
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @brief Save the current camera into a file
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Load the current camera from a file
+        ARLCORE_API bool load( const std::string &fileName );
+
+        /**
+        * @brief Création d'une caméra synthétique
+        * @param[in] center Point vers lequel est oriente la camera
+        * @param[in] viewPoint Position du centre optique de la camera
+        * @param[in] intrinsicParams Parametres intrinseques = {fx;fy;cx;cy;k1;k2;p1;p2;k3;alphaC}
+        * (Selon le modele choisi - ici par defaut modele de zhang)
+        * @return False si le point de vue de la camera est identique au point qu'elle regarde, True sinon
+        */
+        ARLCORE_API bool syntheticCamera( Point::csptr  center , Point::csptr  viewPoint, const std::vector< double > &intrinsicParams);
+
+        /**
+        * @return Unique ID of calibration.
+        * If several cameras have the same ID, that means they share the same reference plane
+        * If equal to zero <=> Unique calibration reference
+        */
+        ARLCORE_API long int getCalibrationID( void ) const;
+
+        /**
+        * @brief Load appropriate parameters, functions of date and image size
+        * filename point to a file with references of all avalaible calibrations
+        */
+        ARLCORE_API bool loadParameters( const std::string &fileName, const long int date, unsigned int width, unsigned int height );
+
+        /**
+        * @brief Load appropriate parameters, functions of date and image size
+        * filename point to a file with references of all avalaible calibrations
+        * Old file format : Deprecated
+        */
+        ARLCORE_API bool loadOldParameters( const std::string &fileName, long int date, unsigned int width, unsigned int height );
+
+        //! @brief Set the extrinsic matrix with T
+        ARLCORE_API bool setExtrinsic( const vnl_rigid_matrix &T );
+
+        //! @return Extrinsic matrix
+        ARLCORE_API const vnl_rigid_matrix& getExtrinsic( void ) const;
+
+        //! @return Inverse of extrinsic matrix
+        ARLCORE_API const vnl_rigid_matrix& getInvExtrinsic( void ) const;
+
+        //! @return true, if intrinsic matrix is intialize
+        ARLCORE_API bool isIntrinsicCalibrated( void ) const;
+
+        //! @return Intrinsic matrix
+        ARLCORE_API const vnl_matrix_fixed<double,3,3>& getIntrinsicMatrix( void ) const;
+
+        //! @return Inverse of intrinsic matrix
+        ARLCORE_API const vnl_matrix_fixed<double,3,3>& getInvIntrinsicMatrix( void ) const;
+
+        //! @return Intrinsic vector = [fx,fy,cx,cy,kc0,kc1,kc2,kc3,kc4,alphaC)
+        ARLCORE_API const vnl_vector<double> getIntrinsicVector( void ) const;
+
+        //! @return Distortion vector = [k1,k2,p1,p2,k3]
+        ARLCORE_API const vnl_vector_fixed<double,5>& getDistortion( void ) const;
+
+        //! @return cx or u0 = x-coordinate of optical center
+        ARLCORE_API double getcx( void ) const;
+        ARLCORE_API void setcx( double );
+
+        //! @return cy or v0 = y-coordinate of optical center
+        ARLCORE_API double getcy( void ) const;
+        ARLCORE_API void setcy( double );
+
+        //! @return fx = x-coordinate of optical center
+        ARLCORE_API double getfx( void ) const;
+        ARLCORE_API void setfx( double );
+
+        //! @return fy = y-coordinate of optical center
+        ARLCORE_API double getfy( void ) const;
+        ARLCORE_API void setfy( double );
+
+        //! @return AlphaC or skew
+        ARLCORE_API double getAlphaC( void ) const;
+        ARLCORE_API void setAlphaC( double );
+
+        //! @return Distortion coefficients [0;4]
+        ARLCORE_API double getkc( unsigned int ) const;
+        ARLCORE_API bool setkc( unsigned int, double );
+
+        /**
+        * @brief Set completly or partially Intrinsic parameters with v in this order :
+        * fx,fy,cx,cy,k1,k2,p1,p2,k3,alphaC
+        * @return Number of set parameters
+        */
+        ARLCORE_API unsigned int setIntrinsic( const vnl_vector<double> &v );
+
+        //! @brief Getter for intermediate values
+        ARLCORE_API const vnl_matrix_fixed<double,2,3>& getQint( void ) const;
+        ARLCORE_API const vnl_matrix_fixed<double,2,3>& getQext( void ) const;
+        ARLCORE_API const vnl_vector_fixed<double,3>& getCint( void ) const;
+        ARLCORE_API const vnl_vector_fixed<double,3>& getCext( void ) const;
+        ARLCORE_API const vnl_vector_fixed<double,2>& getBint( void ) const;
+        ARLCORE_API const vnl_vector_fixed<double,2>& getBext( void ) const;
+
+        /**
+        * @brief 3D equation of the projective line in focal plane
+        * @param[in] focalPt2DH Homogen 2D point in focal plane
+        * @param[out] line3D 3D equation of the projective line
+        * @return True if the computation is possible
+        */
+        ARLCORE_API bool projectiveLine( const vnl_vector_fixed<double,3> &focalPt2DH, vgl_line_3d_2_points <double> &line3D ) const;
+
+        /**
+        * @brief Reprojection du point3D dans le repère de la caméra
+        * point2D est calculé dans le plan de la focale si focalPlane==true, dans le plan pixel sinon
+        * @param[in] point3DH Point 3D à reprojeter
+        * @param[out] point2D reprojeté
+        * @param[in] focalPlane True si le calcul est effectué dans le plan de la focal ou false dans le plan pixel
+        * @return True si le calcul est possible, false sinon (si le point2D est dans le plan de la focale par exemple)
+        */
+        ARLCORE_API bool project3DPoint( const vnl_vector_fixed<double,4>& point3DH, vnl_vector_fixed<double,2>& point2D, bool focalPlane=false) const;
+
+        /**
+        * @brief Reprojection du point3D dans le repère de la caméra
+        * point2D est calculé dans le plan de la focale si focalPlane==true, dans le plan pixel sinon
+        * @param[in] pt3D Point 3D à reprojeter
+        * @param[out] pt2D reprojeté
+        * @param[in] focalPlane True si le calcul est effectué dans le plan de la focal ou false dans le plan pixel
+        * @return True si le calcul est possible, false sinon (si le point2D est dans le plan de la focale par exemple)
+        */
+        ARLCORE_API bool project3DPoint( Point::csptr  pt3D, Point::sptr pt2D, bool focalPlane=false) const;
+
+        /**
+        * @brief Reprojection d'une liste de points 3D dans le repère de la caméra
+        * Les points 2D sont calculés dans le plan de la focale si focalPlane==true, dans le plan pixel sinon
+        * @param[in] list3D Liste de point 3D à reprojeter
+        * @param[out] list2D Liste de points 2D reprojetés
+        * @param[in] focalPlane True si le calcul est effectué dans le plan de la focal ou false dans le plan pixel
+        * @return Nombre de points 2D correctement reprojetés
+        */
+        ARLCORE_API unsigned int project3DPoint( PointList::csptr list3D, PointList::sptr list2D, bool FocalFrame=false) const;
+
+        //! @brief Undistort 2D pixel point
+        ARLCORE_API bool undistort2DPoint(Point::csptr  p2D, Point::sptr  p2D_undistorted) const;
+
+        //! @brief Set a 2D point from unitFocalPlane to pixelPlane
+        ARLCORE_API bool unitFocalPlaneToPixelPlane( const vgl_point_2d<double>&, vgl_point_2d<double>& ) const;
+
+        //! @brief Set a 2D point from  pixelPlane to unitFocalPlane with or without perfect distorsion evaluation
+        ARLCORE_API bool pixelPlaneToUnitFocalPlane( Point::csptr , Point::sptr , bool perfectDisto ) const;
+        ARLCORE_API bool pixelPlaneToUnitFocalPlane( Point::csptr , vnl_vector_fixed<double,3>&, bool perfectDisto ) const;
+        ARLCORE_API bool pixelPlaneToUnitFocalPlane( Point::csptr , vgl_point_2d<double>&, bool perfectDisto ) const;
+        ARLCORE_API bool pixelPlaneToUnitFocalPlane( Point::csptr , vgl_point_3d<double>&, bool perfectDisto ) const;
+        ARLCORE_API bool pixelPlaneToUnitFocalPlane( const vgl_point_2d<double>&, vgl_point_3d<double>&, bool perfectDisto ) const;
+
+        //! @brief Set a 3D point from focalframe to extrinsicFrame
+        ARLCORE_API bool focalFrameToExtrinsicFrame( const vnl_vector_fixed< double, 3 >&, vnl_vector_fixed< double, 3 >& ) const;
+        ARLCORE_API bool focalFrameToExtrinsicFrame( const vgl_point_3d< double >&, vgl_point_3d< double >& ) const;
+
+        /**
+        * @brief Calcul 2 points définis dans le plan pixel à partir d'une droite dans le plan focal
+        * @param[in] (a,b,c) l'equation d'une droite dans le plan focal, ax+by+c=0
+        * @param[in] (ROI1,ROI2) dans le plan pixel, coin supérieur gauche et inférieur droit
+        * @param[out] (ROI1,ROI2) dans le plan pixel, recoit les coordonnes des intersections avec la ROI
+        */
+        ARLCORE_API bool focalToPixelLine( double a, double b, double c, SPTR( Point ) ROI1, SPTR( Point ) ROI2 ) const;
+
+        /**
+        * @brief Calcul 2 points définis dans le plan pixel à partir d'une droite dans le plan focal
+        * @param[in] (a,b,c) l'equation d'une droite dans le plan focal, ax+by+c=0
+        * @param[in] org Origine dans le plan pixel
+        * @param[in] dst Destination dans le plan pixel
+        * @param[in] nbSegments [1,n] Nombre de segments constituant la droite. Si 0, évalue le nb max de segments pour la résolution
+        * @param[out] pl Recoit la liste des points en coordonnées pixel constituant chaque segment
+        */
+        ARLCORE_API bool focalToPixelLine( double a, double b, double c, CSPTR( Point ) org, CSPTR( Point ) dst, SPTR( PointList ) pl, unsigned int nbSegments=0 ) const;
+
+        /**
+        * @brief 3D equation in focal plane of a pixel line
+        * @param[in] line2D 2D line equation in pixel plane
+        * @param[out] line3D 3D line equation in focal plane
+        * @return True if the computation is possible
+        */
+        ARLCORE_API bool pixelToFocalLine( const vgl_line_2d<double> &line2D, vgl_line_3d_2_points <double> &line3D ) const;
+
+    private:
+        //! @brief Refresh precalculated data
+        void extCompute( void );
+
+        //! Universal ID for the physic's camera
+        uint32HL m_cameraGUID;
+        long int m_noCalibration;
+
+        vnl_rigid_matrix m_extrinsic; //!< Extrinsic matrix
+        vnl_matrix_fixed<double,3,3> m_intrinsicMatrix; //!< [fx 0 cx; 0 fy cy; 0 0 1]
+        vnl_vector_fixed<double,5> m_distortionCoeffs; //!< [k1, k2, p1, p2, k3]
+        double m_alphaC; //!< skew
+
+
+        //! Precalculated data. Redondant informations
+        vnl_matrix_fixed<double,2,3> m_Qint; //!< [ fx  0 cx ; 0 fy 0 ]
+        vnl_matrix_fixed<double,2,3> m_Qext; //!< extracted from the full projective 3x4 matrix (intrinsic x extrinsic)
+        vnl_vector_fixed<double,2> m_Bint;
+        vnl_vector_fixed<double,3> m_Cint;
+        vnl_vector_fixed<double,2> m_Bext;
+        vnl_vector_fixed<double,3> m_Cext;
+        vnl_rigid_matrix m_invExtrinsic; //!< Invert extrinsic matrix
+        vnl_matrix_fixed<double,3,3> m_invIntrinsicMatrix; //!< Invert intrinsic matrix
+        vnl_vector_fixed< double,3 > m_opticalCenterInExtrinsicFrame; //!< Position 3D du centre optique dans le rep�re extrins�que
+    };
+
+    /**
+    * @brief Compute epipolar line in focal plane
+    * @param[in] p Point in the focal plane of the 1st camera
+    * @param[in] PM Passage matrix from 1st camera to 2nd camera
+    * PM=camera2->getExtrinsic()).as_matrix()*vnl_matrix_inverse<double>(camera1->getExtrinsic());
+    * @return Equation of epipolar line in the focal plane of the 2nd camera, ax+by+c=0
+    */
+    ARLCORE_API bool getEpipolar(CSPTR( Point ) p, const vnl_matrix_fixed<double,4,4> &PM, double &a, double &b, double &c);
+    ARLCORE_API bool getEpipolar(CSPTR( Point ) p, const vnl_matrix_fixed<double,4,4> &PM, vgl_line_2d< double > &d);
+    ARLCORE_API bool getEpipolar(const vnl_vector_fixed<double,3> &p, const vnl_matrix_fixed<double,4,4> &PM, double &a, double &b, double &c);
+    ARLCORE_API bool getEpipolar(const vnl_vector_fixed<double,3> &p, const vnl_matrix_fixed<double,4,4> &PM, vgl_line_2d< double > &d);
+
+} // namespace arlCore
+#endif // _ARLCORE_CAMERA_H
diff --git a/SrcLib/ARLcore/include/arlcore/CameraList.h b/SrcLib/ARLcore/include/arlcore/CameraList.h
new file mode 100644
index 0000000..c521720
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/CameraList.h
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_CAMERALIST_H
+#define _ARLCORE_CAMERALIST_H
+#include <arlcore/Common.h>
+
+#include <vector>
+
+#include <arlcore/Camera.h>
+#include <arlcore/Particle.h>
+
+namespace arlCore
+{
+    class PlaneSystem;
+    /**
+     * @class   CameraList
+     * @date    06/2009
+     * @brief   List of physical cameras
+     */
+    class CameraList : public arlCore::Particle
+    {
+    public:
+        //! @brief Constructor
+        ARLCORE_API CameraList( PlaneSystem &universe );
+
+        //! @brief Destructor
+        ARLCORE_API ~CameraList( void );
+
+        //! @brief Add a new camera with its unique ID and its resolution
+        ARLCORE_API void addCamera( const uint32HL &GUID, unsigned int width, unsigned int heigth );
+        ARLCORE_API void push_back( const uint32HL &GUID, unsigned int width, unsigned int heigth );
+
+        //! @return Number of cameras
+        ARLCORE_API unsigned int size( void ) const;
+
+        //! @return Reference on the ith camera
+        ARLCORE_API const arlCore::Camera& operator[]( unsigned int i ) const;
+        ARLCORE_API arlCore::Camera& operator[]( unsigned int i );
+
+        //! @return Reference on the last camera
+        ARLCORE_API const arlCore::Camera& back( void ) const;
+        ARLCORE_API arlCore::Camera& back( void );
+
+        //! @return Reference on the list of cameras
+        ARLCORE_API const std::vector<Camera>& getList( void ) const;
+
+        /**
+        * @brief Calibrate cameras at the date
+        * @param[in] caliFile File with references on camera's parameters
+        * @param[in] date Current date, time
+        * @param[in] commonPlane for stereoscopic calibration
+        * @return Number of calibrated cameras
+        */
+        ARLCORE_API unsigned int calibrate( const std::string &calibFile, long int date );
+
+    private:
+        std::vector<Camera> m_cameras;
+        std::vector<unsigned int> m_widths;
+        std::vector<unsigned int> m_heigths;
+    };
+
+} // namespace arlCore
+#endif // _ARLCORE_CAMERALIST_H
diff --git a/SrcLib/ARLcore/include/arlcore/Colour.h b/SrcLib/ARLcore/include/arlcore/Colour.h
new file mode 100644
index 0000000..52669af
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Colour.h
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_COLOUR_H
+#define _ARLCORE_COLOUR_H
+#include <arlcore/Common.h>
+
+#include <string>
+
+#include <arlcore/Object.h>
+
+namespace arlCore
+{
+    /**
+     * @class   Colour
+     * @date    2007
+     * @brief   RGB colour
+     */
+    class Colour
+    {
+    public:
+        //! Constant colours
+        ARLCORE_API static const Colour Black;
+        ARLCORE_API static const Colour Red;
+        ARLCORE_API static const Colour Green;
+        ARLCORE_API static const Colour Blue;
+        ARLCORE_API static const Colour ElectricBlue;
+        ARLCORE_API static const Colour Yellow;
+        ARLCORE_API static const Colour Violet;
+        ARLCORE_API static const Colour White;
+
+        //! @brief Constructor (Default Black)
+        ARLCORE_API Colour( unsigned int R=0, unsigned int G=0, unsigned int B=0 );
+
+        //! @brief Copy constructor
+        ARLCORE_API Colour( const Colour & );
+
+        //! @brief Destructor
+        ARLCORE_API ~Colour( void );
+
+        //! @brief Affectation
+        ARLCORE_API Colour& operator=(const Colour&);
+
+        //! @brief Set a new colour
+        ARLCORE_API void setColour( const Colour& );
+
+        //! @brief Set a new colour
+        ARLCORE_API void setColour( unsigned int R, unsigned int G, unsigned int B );
+
+        //! @brief Set a new colour in function of the n value
+        ARLCORE_API void setMapColour( long int n );
+
+        //! @brief Get the current colour
+        ARLCORE_API void getColour( unsigned int &R, unsigned int &G, unsigned int &B ) const;
+
+        //! @return Description of the current colour
+        ARLCORE_API std::string getString() const;
+
+    private:
+        unsigned int m_R, m_G, m_B;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_COLOUR_H
diff --git a/SrcLib/ARLcore/include/arlcore/Command.h b/SrcLib/ARLcore/include/arlcore/Command.h
new file mode 100644
index 0000000..ed1c40c
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Command.h
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_COMMAND_H
+#define _ARLCORE_COMMAND_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+#include <map>
+
+namespace arlCore
+{
+    class Command
+    {
+    /**
+     * @class   Command
+     * @date    04/2008
+     * @brief   User interactor
+     */
+    public:
+        ARLCORE_API Command( const std::string &fileName="" );
+
+        ARLCORE_API ~Command( void );
+
+        //! @return The value associated to a command
+        ARLCORE_API bool get( const std::string& commandName );
+
+        //! @brief Refresh with key values
+        ARLCORE_API bool refresh( void );
+
+    protected:
+        /**
+         * @brief Set to true the command
+         * @return false if the commandName doesn't exist
+         */
+        //ARLCORE_API bool set( const std::string& commandName );
+
+    private:
+        //! @brief Values
+        std::vector<bool> m_values;
+
+        //! @brief Index in m_values by command name
+        std::map< std::string, unsigned int > m_byName ;
+
+        //! @brief Index in m_values by key
+        std::map< char, unsigned int > m_byKey ;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_COMMAND_H
diff --git a/SrcLib/ARLcore/include/arlcore/Common.h b/SrcLib/ARLcore/include/arlcore/Common.h
new file mode 100644
index 0000000..ae91568
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Common.h
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_COMMMON_H
+#define _ARLCORE_COMMMON_H
+
+//#include <float.h>
+#include <boost/cstdint.hpp>
+#include <fwTools/Object.hpp>
+#include <fwCore/macros.hpp>
+
+//#include <arlcore/Type.h>
+
+    /**
+     * @date    2007
+     * @brief   Directives de compilation
+     * Definition de constantes
+     */
+    #ifndef _WIN32
+        #ifndef CLK_TCK
+            #define CLK_TCK 1000.0
+        #endif
+    #endif //_WIN32
+
+    // COMPILATION OPTIONS
+    #define ANN // Lib=ANN.lib
+    //#undef ANN
+
+//  #define ARL_VERBOSE ARL_LOG_LEVEL_NONE
+    #define TMP_FILE "tmp.plt" // "c:/tmp/tmp.txt" // "/tmp/tmp.txt"
+    #define TMP_DIR "./" //"c:/tmp/" // "/tmp/"
+    #ifdef _WIN32
+    //  #define GNUPLOT_EXE "d:/gnuplot/bin/pgnuplot <tmp.txt"
+        //#define GNUPLOT_EXE "d:/gnuplot/bin/pgnuplot <tmp.txt"
+        #define GNUPLOT_EXE "d:/gnuplot/bin/wgnuplot tmp.plt"
+        //#define GNUPLOT_EXE "d:/gnuplot/bin/wgnuplot c:/tmp/tmp.txt"
+    #else // _WIN32
+        #define GNUPLOT_EXE "/usr/bin/gnuplot /tmp/tmp.plt"
+    #endif // _WIN32
+    #define GRAPHVIZ_EXE "\"c:/Program Files/ATT/Graphviz/bin/dotty.exe\""
+    #define GRAPHVIZ_TMP "tmpGraph.dot"
+
+#ifndef _ARLCORE_CONFIG_HPP_
+#ifdef _WIN32
+        #ifdef ARLCORE_EXPORTS
+        #define ARLCORE_API __declspec(dllexport)
+        #else // ARLCORE_EXPORTS
+        #define ARLCORE_API __declspec(dllimport)
+        #endif // ARLCORE_EXPORTS
+        #define ARLCORE_CLASS_API
+        #pragma warning(disable: 4290)
+    #pragma warning(disable: 4786)
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+        #ifdef ARLCORE_EXPORTS
+        #define ARLCORE_API __attribute__ ((visibility("default")))
+        #define ARLCORE_CLASS_API __attribute__ ((visibility("default")))
+        #else
+        #define ARLCORE_API __attribute__ ((visibility("hidden")))
+        #define ARLCORE_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+#else // _WIN32
+        #define ARLCORE_API
+        #define ARLCORE_CLASS_API
+#endif // _WIN32
+#endif // _ARLCORE_CONFIG_HPP_
+
+
+typedef struct
+{
+    ::boost::uint32_t Low; //UINT32
+    ::boost::uint32_t High; //UINT32
+}uint32HL;
+
+
+
+#endif // _ARLCORE_COMMMON_H
diff --git a/SrcLib/ARLcore/include/arlcore/FieldCorrection.h b/SrcLib/ARLcore/include/arlcore/FieldCorrection.h
new file mode 100644
index 0000000..fd96b98
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/FieldCorrection.h
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_FIELDCORRECTION_H
+#define _ARLCORE_FIELDCORRECTION_H
+#include <arlcore/Common.h>
+
+#include <string>
+
+#include <vnl/vnl_vector.h>
+
+#include <arlcore/MatrixR.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/Point.h>
+
+namespace arlCore
+{
+    /**
+     * @date    08/2008
+     * @brief   Correction d'un champs de vecteurs
+     */
+    class FieldCorrector
+    {
+    public:
+        //! @brief Default constructor
+        ARLCORE_API FieldCorrector( void );
+
+        //! @brief Constructor for particular degree
+        ARLCORE_API FieldCorrector( unsigned int degree );
+
+        //! @brief Copy constructor
+        ARLCORE_API FieldCorrector( const FieldCorrector& );
+
+        //! @brief Destructor
+        ARLCORE_API ~FieldCorrector( void );
+
+        //! @return Description of the field corrector
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @brief Set degree of the polynomial and initialize polynomial
+        ARLCORE_API bool setDegree( unsigned int degree );
+
+        //! @brief Get degree of the polynomial
+        ARLCORE_API unsigned int getDegree( void );
+
+        //! @brief Get number of parameters
+        ARLCORE_API unsigned int getNbParameters( void );
+
+        //! @brief Set parameters
+        ARLCORE_API bool setParameters( const vnl_vector<double> &parameters );
+
+        //! @brief Load parameters from a file
+        ARLCORE_API bool load( const std::string &fileName );
+
+        //! @brief Activ or deactiv correction
+        ARLCORE_API bool activCorrection( bool );
+
+        //! @brief Copy
+        ARLCORE_API bool copy( const FieldCorrector& );
+
+        //! @brief T2 receive T1 corrected. T1=distorded transformation T2=undistorded
+        ARLCORE_API bool correct( const vnl_rigid_matrix &T1, vnl_rigid_matrix &T2 ) const;
+
+        //! @brief P2 receive P1 corrected. P1=distorded point P2=undistorded
+        ARLCORE_API bool correct( CSPTR( Point ) P1, SPTR( Point ) P2 ) const;
+
+        //! @brief Correct the transformation T
+        ARLCORE_API bool correct( vnl_rigid_matrix &T ) const;
+
+    private:
+        vnl_vector<double> m_parameters;
+        unsigned int m_degree;
+        bool m_correction;
+    };
+
+    /**
+    * @brief Calibration of field of deformations
+    * @param[in] real Point list at the correct position
+    * @param[in] distorded Point list at the distorded position
+    * @param[in] degree Interpolation degree
+    * @param[out] parameters parameters of the polynomial
+    * @param[out] RMS Error of the optimization
+    */
+    ARLCORE_API bool fieldCalibration( CSPTR( PointList ) real, CSPTR( PointList ) distorded, unsigned int degree, vnl_vector<double> &parameters, double &RMS );
+
+} // namespace arlCore
+#endif // _ARLCORE_FIELDCORRECTION_H
diff --git a/SrcLib/ARLcore/include/arlcore/File.h b/SrcLib/ARLcore/include/arlcore/File.h
new file mode 100644
index 0000000..dd33a31
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/File.h
@@ -0,0 +1,148 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_FILE_H
+#define _ARLCORE_FILE_H
+#include <arlcore/Common.h>
+
+#include <string>
+#include <vector>
+#include <fstream>
+
+#include <vnl/vnl_vector.h>
+
+namespace arlCore
+{
+    class File
+    {
+    /**
+     * @class   File
+     * @date    04/2008, 12/2008
+     * @brief   Normalized file
+     */
+    public:
+        //! @brief Constructor : Open the file
+        ARLCORE_API File( const std::string &fileName, const std::string &fileType );
+
+        //! @brief Destructor : Close the file
+        ARLCORE_API ~File( void );
+
+        //! @brief Close the file
+        ARLCORE_API void close( void );
+
+        //! @return Filetype or "" if error
+        ARLCORE_API static std::string getFiletype( const std::string &fileName );
+
+        /**
+         * @brief Load header : Verify the filetype & return the version
+         * @return Version. Error, if 0.0. (cf getError)
+         */
+        ARLCORE_API double readHeader( void );
+
+        //! @return Is the file correctly opened ?
+        ARLCORE_API bool isOK( void );
+
+        //! @return End of File ?
+        ARLCORE_API bool getEOF( void );
+
+        //! @brief Rewind at the beginning of the file
+        ARLCORE_API bool rewind( void );
+
+        //! @brief Record current position
+        ARLCORE_API bool recordCurrentPosition( void );
+
+        //! @brief Rewind at the recorded position
+        ARLCORE_API bool rewindRecordedPosition( void );
+
+        //! @return Version number
+        ARLCORE_API double getVersion( void );
+
+        //! @return Message of error
+        ARLCORE_API std::string getError( void );
+
+        //! @return Full filename (with path)
+        ARLCORE_API std::string getFullFilename( void );
+
+        //! @return Just filename (without path)
+        ARLCORE_API std::string getFilename( void );
+
+        //! @return Folder
+        ARLCORE_API std::string getFolder( void );
+
+        //! @return Extension of file (after dot)
+        ARLCORE_API std::string getExtension( void );
+
+        //! @brief Get next token, if it exists
+        ARLCORE_API bool getToken( std::string& token );
+
+        //! @brief Get T value
+        template <typename T>
+        inline bool get( T&v ){m_file>>v;return !getEOF();}
+
+        //! @brief Get std::vector<T>
+        template <typename T>
+        inline bool get( std::vector<T> &v )
+        {
+            unsigned int n;
+            if(!get(n)) return false;
+            else return get(v, n);
+        }
+
+        template <typename T>
+        inline bool get( std::vector<T> &v, unsigned int n )
+        {
+            unsigned int i;
+            v.resize(n);
+            for( i=0 ; i<n ; ++i ) 
+                m_file>>v[i];
+            return !getEOF();
+        }
+
+        //! @brief Get vnl_vector<T>
+        template <typename T>
+        inline bool get( vnl_vector<T> &v )
+        {
+            unsigned int n;
+            if(!get(n)) return false;
+            else return get(v, n);
+        }
+
+        template <typename T>
+        inline bool get( vnl_vector<T> &v, unsigned int n )
+        {
+            unsigned int i;
+            v.set_size(n);
+            for( i=0 ; i<n ; ++i ) 
+                m_file>>v[i];
+            return !getEOF();
+        }
+
+        //! @brief Get string value
+        ARLCORE_API std::string getString( void );
+
+        //! @brief Get string value
+        ARLCORE_API bool getString( std::string& );
+
+        //! @brief Get path relativly to current path
+        ARLCORE_API std::string getPath( void );
+
+        //! @return fstream
+        ARLCORE_API std::fstream& getStream( void );
+
+    protected:
+        //! @brief Save & print message of error
+        ARLCORE_API void setError( const std::string& );
+
+    private:
+        bool m_ok;
+        std::fstream m_file;
+        double m_version;
+        std::string m_fileType, m_error;
+        std::string m_fullFilename, m_folder, m_filename, m_extension;
+        long int m_position;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_FILE_H
diff --git a/SrcLib/ARLcore/include/arlcore/ICP.h b/SrcLib/ARLcore/include/arlcore/ICP.h
new file mode 100644
index 0000000..526fcdd
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/ICP.h
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_ICP_H
+#define _ARLCORE_ICP_H
+#include <arlcore/Common.h>
+
+#include <vnl/vnl_vector.h>
+
+#include <arlcore/MatrixR.h>
+#include <arlcore/Mesh.h>
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    class Point;
+    /**
+     * @date    04/2009
+     * @brief   Iterativ Closest Point registration between two point's clouds
+     */
+    class ICP
+    {
+    public:
+        /**
+        * @brief Constructor
+        * @param[in] model
+        * @param[in] cloud
+        * @param[in] justVisible If true, use only visible points
+        */
+        ARLCORE_API ICP( CSPTR( PointList ) model, CSPTR( PointList ) cloud, bool justVisible=true );
+
+        /**
+        * @brief Constructor
+        * @param[in] model
+        * @param[in] cloud
+        * @param[in] justVisible If true, use only visible cloud's points
+        */
+        ARLCORE_API ICP( CSPTR( Mesh ) model, CSPTR( PointList ) cloud, bool justVisible=true );
+
+        //! @brief Destructor
+        ARLCORE_API ~ICP( void );
+
+        //! @brief Optimise solution with Powell method
+        ARLCORE_API double optimisePowell( void );
+
+        //! @brief Optimise solution with Least Squares method
+        ARLCORE_API double optimiseLS( void );
+
+        //! @brief Initialize solution
+        ARLCORE_API void initSolution( const arlCore::vnl_rigid_matrix &M );
+
+        //! @return Reference on solution
+        ARLCORE_API const arlCore::vnl_rigid_matrix& getSolution( void ) const;
+
+        //! @brief Set option : Number max of iterations
+        ARLCORE_API bool setMaxIterations( unsigned int=500 );
+
+        //! @return Number of points of model
+        ARLCORE_API unsigned int getModelSize( void ) const;
+
+        //! @return Number of points of cloud
+        ARLCORE_API unsigned int getCloudSize( void ) const;
+
+        //! @return Number of iteration of the last calculation
+        ARLCORE_API unsigned int getNbIterations( void ) const;
+
+        //! @return Start error
+        ARLCORE_API double getStartError( void ) const;
+
+        //! @return End error
+        ARLCORE_API double getEndError( void ) const;
+
+        //! @brief Solve the registration
+        ARLCORE_API bool solve( void );
+
+        //! @return RMS
+        ARLCORE_API double computeError( void );
+
+        //! @brief Compute distance for each point of the cloud (visible or not depending on the option)
+        ARLCORE_API unsigned int computeDistances( std::vector<double> &distances );
+
+        //! @brief Set points with points of cloud and distance to the model in point's error
+        ARLCORE_API unsigned int computeDistances( SPTR( PointList ) points );
+
+        //! @brief Compute RMS with M as solution (used by optimizer)
+        ARLCORE_API double computeCriterion( const arlCore::vnl_rigid_matrix &M );
+
+        //! @brief Compute RMS with M as solution (used by optimizer)
+        ARLCORE_API double computeCriterion( const arlCore::vnl_rigid_matrix &M, vnl_vector< double > &fx );
+
+    protected:
+
+    private:
+        bool initialization( void );
+
+        // 2 modes : Point to SPTR( Point )  Point to Mesh
+        bool m_point2PointMode;
+        CSPTR( arlCore::Mesh ) m_modelMesh;
+        arlCore::PointList::csptr m_cloud;
+        bool m_initialization;
+        bool m_justVisible;
+        unsigned int m_dimension;
+        vnl_vector<double> m_modelGravity, m_cloudGravity;
+        unsigned int m_modelSize, m_cloudSize;
+#ifdef ANN
+        ANNpointArray m_modelPoints, m_cloudPoints;
+        ANNpointArray m_Pk, m_Yk, m_Pi;
+        ANNkd_tree* m_ANNtree;
+        int m_nbNN; // number of nearest neighbors
+        ANNidxArray m_nn_idx; // near neighbor indices
+        ANNdistArray m_squaredDists; // near neighbor distances
+#endif // ANN
+        vnl_matrix_fixed<double,3,3> m_rotInit;
+        vnl_vector_fixed<double,3> m_traInit;
+        arlCore::vnl_rigid_matrix m_solution;
+
+        unsigned int m_maxIterations;
+        unsigned int m_nbIterations;
+
+        double m_startError, m_endError;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_ICP_H
diff --git a/SrcLib/ARLcore/include/arlcore/MatrixR.h b/SrcLib/ARLcore/include/arlcore/MatrixR.h
new file mode 100644
index 0000000..72c4aaf
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/MatrixR.h
@@ -0,0 +1,390 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_MATRIXR_H
+#define _ARLCORE_MATRIXR_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+
+#include <fwCore/macros.hpp>
+
+#include <vgl/vgl_line_3d_2_points.h>
+#include <vgl/vgl_line_segment_3d.h>
+
+#include <vnl/vnl_quaternion.h>
+#include <vnl/vnl_vector_fixed.h>
+#include <vnl/vnl_matrix_fixed.h>
+
+#include <arlcore/Object.h>
+#include <arlcore/vnl_rotation3d_matrix.h>
+
+namespace arlCore
+{
+    enum ARLCORE_REGISTER3D3D { ARLCORE_REGISTER3D3D_UNKNOWN, ARLCORE_REGISTER3D3D_LM, ARLCORE_REGISTER3D3D_POW, ARLCORE_REGISTER3D3D_GC, ARLCORE_REGISTER3D3D_NBTYPES };
+    static std::string ARLCORE_REGISTER3D3D_NAMES[ARLCORE_REGISTER3D3D_NBTYPES]={ "ARLCORE_REGISTER3D3D_UNKNOWN", "ARLCORE_REGISTER3D3D_LM",
+    "ARLCORE_REGISTER3D3D_POW", "ARLCORE_REGISTER3D3D_GC"};
+
+    enum ARLCORE_VRM_DISTANCE_METHOD { ARLCORE_VRM_DISTANCE_UNKNOWN, ARLCORE_VRM_DISTANCE_3AXIS, ARLCORE_VRM_DISTANCE_TRANSLATION,
+        ARLCORE_VRM_DISTANCE_OX, ARLCORE_VRM_DISTANCE_OY, ARLCORE_VRM_DISTANCE_OZ, ARLCORE_VRM_DISTANCE_NBTYPES};
+    static std::string ARLCORE_VRM_DISTANCE_METHOD_NAMES[ARLCORE_VRM_DISTANCE_NBTYPES]={ "ARLCORE_VRM_DISTANCE_UNKNOWN",
+        "ARLCORE_VRM_DISTANCE_3AXIS", "ARLCORE_VRM_DISTANCE_TRANSLATION",
+        "ARLCORE_VRM_DISTANCE_OX", "ARLCORE_VRM_DISTANCE_OY", "ARLCORE_VRM_DISTANCE_OZ" };
+
+    class Point;
+    class PointList;
+    class vnl_rigid_vector;
+    /**
+     * @date    2007
+     * @brief   Matrice de transformation rigide
+     */
+    class vnl_rigid_matrix: public vnl_matrix_fixed<double,4,4>, public Object
+    {
+    public:
+        //! @brief Default constructor : Identity
+        ARLCORE_API vnl_rigid_matrix( void );
+
+        //! @brief Copy constructor
+        ARLCORE_API vnl_rigid_matrix( const vnl_rigid_matrix& );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rigid_matrix( const vnl_rigid_vector& );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rigid_matrix( const vnl_matrix_fixed<double,4,4>& );
+
+        //! @brief Constructor by composition with a rotation matrix and a translation
+        ARLCORE_API vnl_rigid_matrix( const vnl_rotation3d_matrix &rotation, const vnl_vector_fixed<double,3> &translation);
+
+        //! @brief Constructor by loading
+        ARLCORE_API vnl_rigid_matrix( const std::string &fileName );
+
+        //! @brief Destructor
+        ARLCORE_API ~vnl_rigid_matrix( void );
+
+        //! @return Is it a valid rigid matrix : Homogen, real rotation matrix
+        ARLCORE_API bool isValid( void ) const;
+
+        //! @return Description of the current matrix
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @return Description of the current matrix for planesystem
+        ARLCORE_API std::string getText( void ) const;
+
+        //! @brief Save the current matrix in a file
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Save the current matrix in a file stream
+        ARLCORE_API bool save( std::fstream &f ) const;
+
+        //! @brief Load in the current matrix from a file
+        ARLCORE_API bool load( const std::string &fileName );
+
+        //! @brief Load in the current matrix from a file stream
+        ARLCORE_API bool load( std::fstream &f );
+
+        ARLCORE_API std::string serialize( void ) const;
+        ARLCORE_API bool virtual unserialize( std::stringstream &s ); // PROTECTED ?
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_matrix& operator=( const vnl_rigid_matrix& );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_matrix& operator=( const vnl_rigid_vector& );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_matrix& operator=( const vnl_matrix_fixed<double,4,4>& );
+
+        /**
+         * @brief Gaussian noise on translation
+         * param[in] Xnoise Gaussian noise on X (mm)
+         * param[in] Ynoise Gaussian noise on Y (mm)
+         * param[in] Znoise Gaussian noise on Z (mm)
+         * @return Delta distance
+         */
+        ARLCORE_API double GaussianNoiseTranslation( double Xnoise, double Ynoise, double Znoise );
+
+        /**
+         * @brief Gaussian noise on translation
+         * param[in] Xnoise Gaussian noise on X axis (degrees)
+         * param[in] Ynoise Gaussian noise on Y axis (degrees)
+         * param[in] Znoise Gaussian noise on Z axis (degrees)
+         * @return Delta angle
+         */
+        ARLCORE_API double GaussianNoiseRotation( double Xnoise, double Ynoise, double Znoise );
+
+        /**
+         * @brief Compute several distance types between current transformation and T
+         * param[in] T Compared transformation
+         * param[in] method
+         * 3axis : RMS of distance between all unit vectors
+         * Translation : Distance between origins
+         * Ox : RMS of distances between origins and unit vector on Ox
+         * Oy : RMS of distances between origins and unit vector on Oy
+         * Oz : RMS of distances between origins and unit vector on Oz
+         * param[out] errors2 Each computed square distance
+         * @return Square of RMS of distances between unit vectors or <0 if error
+         */
+        ARLCORE_API double distance2( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method, std::vector<double> &errors ) const;
+        ARLCORE_API double distance2( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method ) const;
+
+        /**
+         * @brief Compute several distance types between current transformation and T like distance2
+         * @return RMS of distances between unit vectors or <0 if error
+         */
+        ARLCORE_API double distance( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method=ARLCORE_VRM_DISTANCE_3AXIS ) const;
+
+        /**
+         * @brief Compare current transformation Trf with T
+         * This means that we compute Trf * T^(-1) and extract the 2-norm of the translation
+         * and the angle of the rotation matrix
+         * @param[out] errorTranslation Distance, norm (mm)
+         * @param[out] errorRotation Angle (deg)
+         */
+        ARLCORE_API void compare( const vnl_rigid_matrix &T, double &errorTranslation, double &errorRotation ) const;
+
+        //! @brief The same as 'compare' with the inverse of the current matrix
+        ARLCORE_API void compareInverse( const vnl_rigid_matrix &T, double &errorTranslation, double &errorRotation ) const;
+
+        //! @brief Copy
+        ARLCORE_API bool copy( const vnl_rigid_matrix& );
+
+        //! @brief Copy
+        ARLCORE_API bool copy( const vnl_rigid_vector& );
+
+        //! @brief Copy
+        ARLCORE_API bool copy( const vnl_matrix_fixed<double,4,4>& );
+
+        //! @brief Set the current matrix to identity
+        ARLCORE_API bool setIdentity();
+
+        /**
+         * @brief Set a random rotation and translation
+         * The new origin is included in a cube of 'size' of side
+         */
+        ARLCORE_API void uniform_random( double size );
+
+        //! @return Translation part of the current matrix
+        ARLCORE_API vnl_vector_fixed<double,3> getTranslation( void ) const;
+
+        //! @return Homogen translation of the current matrix
+        ARLCORE_API vnl_vector_fixed<double,4> getHTranslation( void ) const;
+
+        //! @return Rotation vector of the current matrix
+        ARLCORE_API vnl_rotation3d_matrix getRotation( void ) const;
+
+        //! @return Rotation in quaternion
+        ARLCORE_API vnl_quaternion<double> getQuaternion( void ) const;
+
+        //! @brief Change the current translation
+        ARLCORE_API bool setTranslation( const vnl_vector_fixed<double,3> & );
+
+        //! @brief Change the current translation
+        ARLCORE_API bool setTranslation( double x, double y, double z );
+
+        //! @brief Change the x value of the current translation
+        ARLCORE_API bool setX( double x );
+
+        //! @brief Change the y value of the current translation
+        ARLCORE_API bool setY( double y );
+
+        //! @brief Change the z value of the current translation
+        ARLCORE_API bool setZ( double z );
+
+        //! @return x value of the current translation
+        ARLCORE_API double getX( void ) const;
+
+        //! @return y value of the current translation
+        ARLCORE_API double getY( void ) const;
+
+        //! @return z value of the current translation
+        ARLCORE_API double getZ( void ) const;
+
+        //! @brief Change the current rotation
+        ARLCORE_API bool setRotation( const vnl_rotation3d_matrix & );
+
+        //! @brief Change the current rotation
+        ARLCORE_API bool setQuaternion( const vnl_quaternion<double> & );
+
+        //! @return Current matrix = T1 * T2
+        ARLCORE_API bool mult( const vnl_rigid_matrix &T1 , const vnl_rigid_matrix &T2 );
+
+        /**
+         * @return Current matrix = invert(T)
+         * @remark Inverse operation is optimized for rigid transformation
+         */
+        ARLCORE_API bool invert( const vnl_rigid_matrix&T );
+
+        /**
+         * @brief Inverse the current matrix
+         * @remark Inverse operation is optimized for rigid transformation
+         */
+        ARLCORE_API bool invert( void );
+
+        //! @return The inverse of the current matrix
+        ARLCORE_API arlCore::vnl_rigid_matrix computeInverse( void ) const;
+
+        /**
+         * @brief The current matrix becomes the mean of listMatrix
+         * Use filter with the ARLCORE_TRF_FILTER_CONSTANT option
+         */
+        ARLCORE_API bool mean( const std::vector<arlCore::vnl_rigid_matrix> &listMatrix );
+
+        //! @brief Compute the angle (in degrees) between the planes OXY of the 2 planes
+        ARLCORE_API double getAngleOXY( void );
+
+        //! @brief Compute the angle (in degrees) between the planes OXZ of the 2 planes
+        ARLCORE_API double getAngleOXZ( void );
+
+        //! @brief Compute the angle (in degrees) between the planes OYZ of the 2 planes
+        ARLCORE_API double getAngleOYZ( void );
+
+
+        /**
+         * @brief Registration of 2 matching 3D points sets - Direct method
+         * Current matrix (this) = A->B
+         * Registration gives Bi = (this)*Ai with only pairs of visible points
+         * @param[in] computeRMS If true, compute RMS of registration (mm)
+         * Warning Only if size(A)==size(B) and with pairs of visible points
+         * @return False if size(A)!=size(B) or there are lesser than 3 pairs of visible points
+         */
+        ARLCORE_API bool register3D3D( CSPTR(PointList) A, CSPTR(PointList) B, bool computeRMS );
+
+        //! @brief Same method as the previous one
+        //ARLCORE_API bool register3D3D( const std::vector< CSPTR(Point)  > &A, const std::vector< CSPTR(Point) > &B, bool computeRMS );
+
+        /**
+         * @brief Iterative optimization of sum trp(TxA_i - B_i). sigma_3D_Bi^(-1) . (TxA_i - B_i)
+         * where sigma_3D_Bi is the covariance matrix of the B_i
+         * When using LM optimization, the number of residual must be superior than the number of unknown
+         * if not it returns the initialisation
+         * @param[in] a point list of the first model
+         * @param[in] b point list of the second model
+         * @param[in] ARLCORE_REGISTER3D3D method that can be used for the optimization (LM, powell or conjugate gradient)
+         * @param[in] optimiserParameters parameter for the optimization (TODO not used here)
+         * @param[out] log[0] = end_error of the optimization (TODO still has to be divided by the number of point and sqrt)
+         * @param[out] log[1] = start_error of the optimization (TODO still has to be divided by the number of point and sqrt)
+         */
+        ARLCORE_API bool register3D3DUncertainty( CSPTR(PointList) a, CSPTR(PointList) b, ARLCORE_REGISTER3D3D, std::vector<double> optimiserParameters, std::vector<double> &log/*, unsigned int numberOfPoints=0*/ );
+
+        /**
+         * @brief Evaluation of the register RMS and the standard deviation
+         * src & dst are 2 lists of matching points
+         * if n>0, the calculus is made with only the first n points
+         * if n==0, all points are used for the RMS evaluation
+         * @param[out] this->m_registerRMS contains after computation the registration RMS sqrt(mean(sum || Bi-T*Ai||^2))
+         * @param[out] this->m_registerStdDev contains after computation the standard deviation on the
+         * distance di between Bi and T*Ai : sqrt (sum (||di - average(di) ||^2)/ n) )
+         * @param[out] errors is a double vector that contains the distance between Bi and T*A_i for each point
+         */
+        ARLCORE_API bool RMS3D3D( CSPTR(PointList) src, CSPTR(PointList) dst, std::vector<double> &errors );
+
+        /**
+         * @brief Registration of two 3D points sets. The correspondences between the points
+         * are not known and are estimated in the function. The matching results is not available
+         * TODO add a variable to return the matching result
+         * @param[in] computeRMS If true compute registration RMS
+         * @param[in] gaussianError Std error estimated on measured 3D points (mm)
+         * @param[in] decimage ]0,1] 1:Use whole information 0.6:Use only 60% of information (faster)
+         * @param[out] B = this * A
+         */
+        ARLCORE_API bool register3D3DwithoutMatching( CSPTR(PointList) A, CSPTR(PointList) B, bool computeRMS=false, double gaussianError=0.0, double decimage=1.0 );
+
+        /**
+         * @brief Registration of 2 clouds of 3D points
+         * @param[in] Model Cloud of points of scanner for example
+         * @param[in] Acquisition Cloud of points of the surface issue of structured light for example
+         * param[out] firstRMS RMS a l'initialisation
+         * param[out] lastRMS RMS a la fin du recalage
+         * param[out] iterations Number of iterations
+         * param[in] justVisible If true, register with just visible points else with all points
+         * param[in] RMSMax Stop registration when the RMS is under 'RMSMax'
+         * param[in] iterationsMax Stop registration before 'iterationMax' iterations
+         * @return true if succeed
+         * @remark The current value of the matrix is used as an initialization
+         * If you don't know it, don't forget to set the matrix to identity
+         * Warning : Respect the order : Model / Point cloud
+         * Model devra etre surechantillonne
+         */
+        ARLCORE_API bool registerICP( CSPTR(PointList) Model, CSPTR(PointList) cloud,
+                        double &firstRMS, double &lastRMS, unsigned int &iterations, bool justVisible=false, double RMSMax=0.01, unsigned int iterationsMax=500 );
+
+        //! @brief Deprecated
+        ARLCORE_API bool oldRegisterICP( CSPTR(PointList) a, CSPTR(PointList) b,
+                        double &RMS, unsigned int &iterations, double RMSMax=0.01, unsigned int iterationsMax=500 );
+
+        //! @brief Compute matrix of changement of plane with cordinates of new Origin, unit X & Z
+        ARLCORE_API bool chgPlaneOXZ( CSPTR( Point ) O, CSPTR( Point ) X, CSPTR( Point ) Z );
+
+        //! @return pt2 <- this * pt1
+        ARLCORE_API bool trf( CSPTR( Point ) pt1, SPTR( Point ) pt2 ) const;
+
+        //! @return pt <- this * pt
+        ARLCORE_API bool trf( SPTR( Point ) pt ) const;
+
+        //! @return For each i, Bi <- this * Ai
+        ARLCORE_API unsigned int trf( CSPTR(PointList) A, SPTR(PointList) B ) const;
+
+        //! @return For each i, Ai <- this * Ai
+        ARLCORE_API unsigned int trf( SPTR(PointList) A ) const;
+
+        //! @return For each i, Bi <- this * Ai
+        ARLCORE_API unsigned int trf( const std::vector< CSPTR(Point) > &A, std::vector< CSPTR(Point) >&B ) const;
+
+        //! @return Change the plane of the line equation : line2 <- this * line1
+        ARLCORE_API bool trf( const vgl_line_3d_2_points<double> &line1, vgl_line_3d_2_points<double> &line2 ) const;
+
+        //! @return Change the plane of the line equation : line <- this * line
+        ARLCORE_API bool trf( vgl_line_3d_2_points<double> &line ) const;
+
+        //! @return Change the plane of the segment equation : line2 <- this * line1
+        ARLCORE_API bool trf( const vgl_line_segment_3d<double> &line1, vgl_line_segment_3d<double> &line2 ) const;
+
+        //! @return Change the plane of the segment equation : line <- this * line
+        ARLCORE_API bool trf( vgl_line_segment_3d<double> &line ) const;
+
+        /**
+         * @brief RMS (Root Mean Square) : Mean error from the computation of the matrix
+         * When the matrix is the result of a calibration or registration,...
+         */
+        ARLCORE_API double getRMS( void ) const;
+
+        //! @return Standard deviation associated to RMS
+        ARLCORE_API double getStdDev( void ) const;
+
+        //! @brief Set RMS
+        ARLCORE_API void setRMS( double RMS );
+
+        //! @brief Set standard deviation associated to RMS
+        ARLCORE_API void setStdDev( double stdDev );
+
+    private:
+        double m_registerRMS;
+        double m_registerStdDev;
+    };
+
+    //! @brief Rotation of thetaX around x-axis
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotX(double thetaX); // degree
+    //! @brief Rotation of thetaY around y-axis
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotY(double thetaY); // degree
+    //! @brief Rotation of thetaZ around z-axis
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotZ(double thetaZ); // degree
+    //! @brief Rotation of thetaX around x-axis, thetaY around y-axis and thetaZ around z-axis
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotXYZ(double thetaX, double thetaY, double thetaZ); // degree
+    //! @brief Rotation of alpha degrees around the vector U(x,y,z)
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotVecFromOrigin(double Ux, double Uy, double Uz, double alpha); // degree
+    //! @brief Rotation of alpha degrees around the vector U(x,y,z) from Point P(x,y,z)
+    ARLCORE_API vnl_matrix_fixed<double,4,4> rotVecFromPoint(double Px, double Py, double Pz, double Ux, double Uy, double Uz, double alpha); // degree
+
+    enum ARLCORE_TRF_FILTER_TYPE { ARLCORE_TRF_FILTER_CONSTANT, ARLCORE_TRF_FILTER_LINEAR, ARLCORE_TRF_FILTER_LOG, ARLCORE_TRF_FILTER_SQUARE, ARLCORE_TRF_FILTER_CUBIC  };
+
+    //! @brief Construit une transformation rigide en appliquant un filtre a une liste temporelle de transformations
+    // ARLCORE_TRF_FILTER_CONSTANT : No time filter, the result is the mean of transformations
+    ARLCORE_API unsigned int filter( const std::vector<const arlCore::vnl_rigid_matrix*> &list , ARLCORE_TRF_FILTER_TYPE, vnl_rigid_matrix &average );
+
+} // namespace arlCore
+#endif // _ARLCORE_MATRIXR_H
diff --git a/SrcLib/ARLcore/include/arlcore/Mesh.h b/SrcLib/ARLcore/include/arlcore/Mesh.h
new file mode 100644
index 0000000..e3cbe16
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Mesh.h
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_MESH_H
+#define _ARLCORE_MESH_H
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+#include <arlcore/Common.h>
+
+#include <vector>
+
+#include <vnl/vnl_vector_fixed.h>
+
+#ifdef ANN
+#include <ANN/ANN.h>
+#endif // ANN
+
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    class Mesh : public fwTools::Object //VAG initially Mesh have no base class
+    {
+    /**
+     * @class   Mesh
+     * @date    04/2009
+     * @brief   List of triangular shapes
+     */
+    public:
+
+        fwCoreClassDefinitionsWithNFactoriesMacro( (Mesh)(::fwTools::Object),
+                                                   ((::boost::make_shared< Mesh > ,() ))
+                                                   );
+
+        //! @brief Constructor (Value of scalar for each point)
+        ARLCORE_API Mesh( double pointScalar=0.0 );
+
+        //! @brief Copy constructor
+        ARLCORE_API Mesh( const Mesh& );
+
+        //! @brief Constructor from file of triangles (see load)
+        ARLCORE_API Mesh( const std::string& fileName );
+
+        //! @brief Destructor
+        ARLCORE_API ~Mesh( void );
+
+        //! @brief Copy
+        ARLCORE_API void copy( const Mesh& );
+
+        //! @brief Clear
+        ARLCORE_API void clear( void );
+
+        //! @brief Add new triangle with 3 points
+        ARLCORE_API bool addTriangle( CSPTR( Point ) P1, CSPTR( Point ) P2, CSPTR( Point ) P3 );
+
+        //! @return Surface of the ith [0, n[ triangle else -1
+        ARLCORE_API double triangleSurface( unsigned int i ) const;
+
+        //! @return RMS distance between each point of all triangles
+        ARLCORE_API double getRMSDistance( void ) const;
+
+        //! @return Distance between a point and the mesh. NoTriangle for the closest [0, n[
+        ARLCORE_API double computeDistance( arlCore::Point::csptr, unsigned int &noTriangle ) const;
+        ARLCORE_API double computeDistance( arlCore::Point::csptr ) const;
+
+        //! @return Squared distance between a point and the mesh. NoTriangle for the closest [0, n[
+        ARLCORE_API double computeDistance2( arlCore::Point::csptr, unsigned int &noTriangle ) const;
+        ARLCORE_API double computeDistance2( arlCore::Point::csptr ) const;
+
+        //! @brief Generate a surface where altitude is on X-axis
+        ARLCORE_API bool generateX( double ySize, double zSize, double yStep, double zStep, double degree, double gaussianNoise, PointList::sptr summits );
+
+        //! @brief Generate a surface where altitude is on Y-axis
+        ARLCORE_API bool generateY( double xSize, double zSize, double xStep, double zStep, double degree, double gaussianNoise, PointList::sptr summits );
+
+        //! @brief Generate a surface where altitude is on Z-axis
+        ARLCORE_API bool generateZ( double xSize, double ySize, double xStep, double yStep, double degree, double gaussianNoise, PointList::sptr summits );
+
+        //! @brief Load a mesh from a file (.trian, .raw or Filetype=Surface, =Planes)
+        ARLCORE_API bool load( const std::string& fileName, double gaussianNoise=0.0 );
+
+        //! @brief Save a mesh in following formats : .trian, .raw
+        ARLCORE_API bool save( const std::string& fileName, bool overwrite=true ) const;
+
+        //! @brief Sample mesh with triangle sizes lesser than step (mm)
+        ARLCORE_API bool resampling( double step );
+
+        //! @return reference on the point list of triangles
+        ARLCORE_API arlCore::PointList::csptr getPointList( void ) const;
+
+        //! @return reference on the triangle list
+        ARLCORE_API const std::vector< vnl_vector_fixed<unsigned int, 3> >& getTriangles( void ) const;
+
+    private:
+        //! @brief Add new SPTR( Point )  return index of the point
+        unsigned int addPoint( arlCore::Point::csptr p, double gaussianNoise=0.0 );
+
+        //! @brief Add new triangle with points which references in m_pointList are (a,b,c)
+        bool addTriangle( unsigned int a, unsigned int b, unsigned int c );
+
+        //! @brief Get length of each side
+        vnl_vector_fixed<double,3> getLengths( unsigned int noTriangle ) const;
+
+        //! @brief Delete duplicate points
+        bool simplify( void );
+
+        //! @brief Generate a surface where altitude is on specific axis (X=0, Y=1, Z=2)
+        bool generate( unsigned int axis, double width, double length, double stepW, double stepL, double degree, double gaussianNoise, PointList::sptr summits );
+
+        bool releaseTriangle( unsigned int noTriangle );
+
+        unsigned int releasePoint( unsigned int noPoint );
+
+        unsigned int replacePointIndex( std::vector<unsigned int> oldIndex, unsigned int newIndex );
+
+        double m_pointScalar;
+        arlCore::PointList::sptr m_pointList;
+        std::vector< vnl_vector_fixed<unsigned int, 3> > m_triangles;
+        std::vector< unsigned int > m_nbReferences;
+        std::vector< unsigned int > m_freePoints;
+        std::vector< unsigned int > m_freeTriangles;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_MESH_H
diff --git a/SrcLib/ARLcore/include/arlcore/Misc.h b/SrcLib/ARLcore/include/arlcore/Misc.h
new file mode 100644
index 0000000..e4b24a8
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Misc.h
@@ -0,0 +1,389 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_MISC_H
+#define _ARLCORE_MISC_H
+#include <arlcore/Common.h>
+
+
+#include <string>
+#include <vector>
+
+#include <vnl/vnl_math.h>
+#include <vnl/vnl_vector_fixed.h>
+
+#include <vgl/vgl_line_3d_2_points.h>
+
+#include <arlcore/Point.h>
+#include <arlcore/Camera.h>
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    //const double Pi = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
+    const double DegToRad = vnl_math::pi/180.0;
+    const double RadToDeg = 180.0/vnl_math::pi;
+    //! @return if n is even
+    template <typename T> inline bool even( const T &n ){long int a=n/2; return (T)(a*2)==n;}
+
+    //! @brief swap 2 variables
+    template <typename T> inline void swap( T &a, T &b ){T c=a;a=b;b=c;}
+
+    class PointList;
+    /**
+     * @brief Fill pointlist with a 3D square grid. The first point to be built has (0,0,0)
+     * coordinates and the grid is filled firstly along X axis, then Y axis. For example, if
+     * nbPointsX = 3, squareSizeX = 2, nbPointsY = 2 and squareSizeX = 4, your pointList will be:
+     * 0 0 0
+     * 2 0 0
+     * 4 0 0
+     * 0 4 0
+     * 2 4 0
+     * 4 4 0
+     * @param[out]  pl PointList with the grid
+     * @param[in]   nbPointsX Number of points in x-axis
+     * @param[in]   squareSizeX Distance between 2 points in x-axis
+     * @param[in]   nbPointsY Number of points in y-axis
+     * @param[in]   squareSizeY Distance between 2 points in y-axis
+     * @param[in]   nbPointsZ Number of points in z-axis
+     * @param[in]   squareSizeZ Distance between 2 points in z-axis
+     * @return  Number of points of the grid
+     **/
+    ARLCORE_API unsigned int fillGrid( SPTR( PointList ) pl, unsigned int nbPointsX, double squareSizeX, unsigned int nbPointsY, double squareSizeY, unsigned int nbPointsZ=1, double squareSizeZ=0 );
+
+    //! @brief Plot a serie of pointlists
+    ARLCORE_API bool plot( const std::vector< const arlCore::PointList* >&, const std::string &options );
+
+    class vnl_rigid_matrix;
+    ARLCORE_API bool load( std::vector< vnl_rigid_matrix >&, const std::string &fileName, bool invert=false );
+    ARLCORE_API bool save( const std::vector< arlCore::vnl_rigid_matrix >&, const std::string &fileName, bool overwrite=true );
+
+    //! @brief Calibrate tip and orientation of a needle
+    ARLCORE_API bool needleCalibration( const std::vector< arlCore::vnl_rigid_matrix > &tip, arlCore::vnl_rigid_matrix &calibration, const std::vector< arlCore::vnl_rigid_matrix > &orientation, double &RMS );
+
+    ARLCORE_API unsigned int save( const std::vector<double>&, const std::string &filename, bool overwrite=true );
+
+    //! @brief Save list of vnl_vector with their names
+    ARLCORE_API unsigned int save( const std::vector< vnl_vector<double> >& q, vnl_vector<double> ratio, const std::vector< std::string > &names, const std::string &fileName, bool overwrite=true );
+    ARLCORE_API unsigned int save( const std::vector< vnl_vector<double> >& q, const std::string &filename, bool overwrite=true );
+
+    //! @brief Load list of vectors : FileType=Vectors, Tokens={Vector, Ratio}
+    ARLCORE_API unsigned int load( std::vector< vnl_vector<double> >&, const std::string &filename );
+    ARLCORE_API unsigned int load( std::vector< vnl_vector<double> >&, std::vector<std::string>&names, const std::string &filename );
+
+    //! @brief Load list of filenames : FileType=Filenames, Tokens={Name, Filename}
+    ARLCORE_API unsigned int load( std::vector< std::string >&, const std::string &filename );
+
+    //! @brief Save/Load vnl_matrix : FileType=Matrix, Tokens={Matrix}
+    ARLCORE_API bool save( const vnl_matrix<double>&, const std::string &filename, bool overwrite=true );
+    ARLCORE_API bool load( vnl_matrix<double>&, const std::string &filename );
+
+    /**
+     * @brief Compute RMS, mean & standard deviation from a list of double values
+     * @param[in] values List of values
+     * @param[in] square Set true if values are squared values
+     * @param[out] min
+     * @param[out] max
+     * @param[out] rms Root Mean Square
+     * @param[out] mean
+     * @param[out] stddev Standard Deviation
+     * @return Number of values
+     **/
+    ARLCORE_API unsigned int statistic( const std::vector<double>&values, double &min, double &max, double &rms, double &mean, double &stddev, bool square=false );
+
+    /**
+     * @brief Integrate a new error in a vector of 5 values
+     * @param[in/out] stat At beginning, should be fill with zeros
+     * @param[in] value Value to be added
+     * @param[in] square True if the value is a squared value
+     * @return Value
+     * @remark Use computeStat to extract statistic values
+     **/
+    ARLCORE_API double addValue( vnl_vector_fixed<double,5>& stat, double value, bool square=false );
+
+    /**
+     * @brief Compute statistic values from integrate stat vector
+     * @param[in] stat Contains integrate values of a statistic list
+     * @param[out] mean Mean value of the list
+     * @param[out] stdDev Standard deviation of the list
+     * @param[out] RMS Root mean square of the list
+     * @return Number of values used
+     **/
+    ARLCORE_API unsigned int computeStat( const vnl_vector_fixed<double,5>& stat, double &min, double &max, double &mean, double &stdDev, double &RMS );
+
+    //! @return Number of parameters of a polynomial (ie: 3 equations, degree 4 => 105 parameters)
+    ARLCORE_API unsigned int nbPolynomialParameters( unsigned int degree, unsigned int nbEquations );
+
+    //! @brief Compute result = Polynomial(data) with parameters of polynomial
+    ARLCORE_API bool computePolynomial( unsigned int degree, const vnl_vector<double> &parameters, const vnl_vector<double> &data, vnl_vector<double> &result );
+
+    //! @return Distance entre un point et une droite dans l'espace
+    ARLCORE_API double vgl_distance_point( const vgl_line_3d_2_points<double> &l, const vgl_point_3d<double> &p );
+
+    //! @return vgl_line_2d from slope (angle with horizontal) and rho (distance to origin)
+    ARLCORE_API vgl_line_2d<double> vglLine2d( double slope, double rho );
+
+    /**
+     * @brief Fit a 3D line from a list of 3D points
+     * @param[out] RMS of the distance of points to the line
+     **/
+    ARLCORE_API bool vgl_fit_line_3d( const std::vector< vgl_point_3d<double> > &points, vgl_line_3d_2_points<double> &line, double &RMS );
+
+    //! @brief One-parameter family of unit vectors that are orthogonal to vec, s=[0,1[
+    ARLCORE_API vgl_vector_3d<double> orthogonal_vectors( const vgl_vector_3d<double> &vec, double s);
+
+    //! @return if two bounding box are intersected
+    ARLCORE_API bool intersection( const vnl_vector_fixed<double, 6> &bound1, const vnl_vector_fixed<double, 6> &bound2 );
+
+    /**
+     * @brief From tip, top & width of a needle (pix.), return the list of points like a shape
+     * @param[in] shape 0=Quadrilateral (Tip R&L, Top L&R), 1=Triangular (Tip R&L, Top )
+     **/
+    ARLCORE_API unsigned int computeNeedleROI( CSPTR( Point ) tip, CSPTR( Point ) top, unsigned int width, std::vector<arlCore::Point::sptr > &corners, unsigned int shape=1 );
+
+    //! @brief Compute Video1Robot transformation. Return mean distance
+//  ARLCORE_API double computeVideo1Robot( const std::vector< arlCore::vnl_rigid_matrix > &M06, CSPTR( PointList ) tip, vnl_rigid_matrix &T, double &distance, double &stdDev );
+
+
+    //! @brief Compute Video2Robot transformation. Return X & RMS in pixels
+    ARLCORE_API double computeVideo2RobotX(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &Z,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &X);
+
+    //! @brief Compute Video2Robot transformation. Return Z & RMS in pixels
+    ARLCORE_API double computeVideo2RobotZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &X,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &Z);
+
+    //!
+    /**
+     * @brief Compute Chessboard2EndEffector & Video2Robot transformations
+     * @return X, Z & RMS in pixels
+     **/
+    ARLCORE_API double computeVideo2RobotXZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &X,
+        arlCore::vnl_rigid_matrix &Z);
+
+
+    /**
+     * @brief Evaluate the error of reprojection with the pair of transformation X,Z from solve_AXXB
+     * Set X & Y matrix with the RMS and the Standard deviation of reprojection error
+     * @param[in,out] X Transformation from Robot plane to Tag plane
+     * @param[in,out] Z Transformation from Video plane to Robot plane
+     * @param[in] B Transformation list from Robot base to End effector
+     * @param[in] videoCams References on cameras used for computing Video-Tag transformations
+     * @param[in] models3DList 3D models (ie chessboard) for each pose
+     * @param[in] points2DList 2D detected points for each camera & each pose
+     * @param[out] errors List of reprojection errors (Use statistic to compute mean stddev,...)
+     * @return RMS of reprojection errors
+     **/
+    ARLCORE_API double evaluationAXXB(
+        const arlCore::vnl_rigid_matrix &X,
+        const arlCore::vnl_rigid_matrix &Z,
+        const std::vector< vnl_rigid_matrix > &B,
+        const std::vector< const arlCore::Camera* > &videoCams,
+        const std::vector< std::vector<arlCore::PointList::csptr > > &models3DList, //[Nbcams][NbPoses]
+        const std::vector< std::vector<arlCore::PointList::csptr > > &points2DList, //[Nbcams][NbPoses]
+        std::vector< double > &errors);
+
+} // namespace arlCore
+
+namespace arlRandom
+{
+    class Random
+    {
+    /**
+     * @class   Random
+     * @date    2007, 11/2008
+     * @brief   Randomize values
+     * @remark  While no initRandom has launched, random values are generate from random seeds
+     */
+    public:
+        //! @brief Initialize random generation from a file (only max values or all). Return 0 or seed if fail
+        ARLCORE_API static long int initRandom( const std::string &filename, long int max=-1 );
+
+        //! @brief Initialize random generation from a seed. If seed==0 return random seed else return seed
+        ARLCORE_API static long int initRandom( long int seed=0 );
+
+        //! @return Random double number between [min,max]
+        ARLCORE_API static double uniformDoubleRnd( double min=0.0, double max=1.0 );
+
+        //! @return Random integer number between [min,max]
+        ARLCORE_API static int uniformIntRnd( int min, int max ) ;
+
+        //! @return Random number : Gaussian law centered with a standard deviation 'std'
+        ARLCORE_API static double gaussianRnd( double std );
+
+        //! @brief Generate a file of n random numbers from a seed
+        ARLCORE_API static unsigned int generate( long int seed, const std::string &filename, long int n );
+
+    private:
+        static std::vector< double> m_randomTable;
+        static long int m_index;
+
+        //! @return Random value
+        static double privateRand( void );
+
+        //! @brief Initialization of random functions with a seed (if 0 random seed and return the seed)
+        static long int privateRndInit( long int seed=0 );
+
+        //! @return Random double number between [min,max]
+        static double privateUniformDoubleRnd( double min=0.0, double max=1.0 );
+
+        //! @return Random integer number between [min,max]
+        static int privateUniformIntRnd( int min, int max );
+
+        //! @return Random number : Gaussian law centered with a standard deviation 'std'
+        static double privateGaussianRnd( double std );
+    };
+
+    /**
+     * @brief Create a vector of random index included in [0 ; n-1]
+     * @param[in]   n Number of index
+     * @param[in]   m Shake only m index among n or if zero shake all
+     * @param[out]  v Vector of index included in [0 ; n-1]
+     *
+     * @return  Number of randomized index
+     * @remark Only m index are randomized among the n index
+     **/
+    ARLCORE_API unsigned int randomIndex( unsigned int n, std::vector<unsigned int> &v, unsigned int m=0 );
+} // namespace arlRandom
+
+namespace arlTime
+{
+    /**
+     * @date    2008
+     * @brief   Time functions
+     */
+
+    //! @return Value of now date
+    ARLCORE_API long int getNowDate( void );
+
+    //! @return Value of now time
+    ARLCORE_API long int getNowTime( void );
+
+    //! @brief Sleep during time in milliseconds
+    ARLCORE_API bool sleep( double time );
+
+} // namespace arlTime
+
+namespace arlString
+{
+    /**
+     * @date    2007
+     * @brief   Fonctions de traitements de chaines
+     */
+
+    //! @brief Replace character org by dst in string s & return number of replaced characters
+    ARLCORE_API unsigned int replace( std::string &s, char org, char dst );
+
+    /**
+     * @brief Convert a string in an another type
+     * @param[in] s String to convert
+     * @param[out] obj Object of type int or double
+     * @return  true if the conversion has been a success.
+     **/
+    ARLCORE_API bool valueOf(const std::string &s, int &obj);
+    ARLCORE_API bool valueOf(const std::string &s, unsigned int &obj);
+    ARLCORE_API bool valueOf(const std::string &s, double &obj);
+
+    ARLCORE_API unsigned int extractDoubles( const std::string &s, std::vector<double> &v, char separator=';' );
+    ARLCORE_API unsigned int extractInts( const std::string &s, std::vector<int> &v, char separator=';' );
+    ARLCORE_API unsigned int extractUInts( const std::string &s, std::vector<unsigned int> &v, char separator=';' );
+    ARLCORE_API unsigned int extractBools( const std::string &s, std::vector<bool> &v, char separator=';' );
+    ARLCORE_API bool extractIP( const std::string &s, unsigned int &IP1, unsigned int &IP2, unsigned int &IP3, unsigned int &IP4 );
+    ARLCORE_API bool extractIP( const std::string &s, std::string &IP, unsigned int &port );
+    ARLCORE_API bool extractExt( const std::string &s, std::string &ext );
+
+    /**
+     * @brief   Split a full path in a folder name, a filename and an extension name
+     * @param[in]   path The full path+file name
+     * @param[out]  folder Only folder name
+     * @param[out]  file Only filename
+     * @param[out]  ext Extension of the filename
+     *
+     * @return  true if the process has been a success.
+     **/
+    ARLCORE_API bool splitFilename( const std::string &path, std::string &folder, std::string &file, std::string &ext );
+
+    /**
+     * @brief   Set the string with the date as i.e. 2008-10-27-15-32-22 for October 27 2008 at 15h 32mn 22s
+     * @param[out]  s Will be set with full date string
+     * @param[in]   date
+     * @param[in]   separator Character between each number (ie : ' ' or '-')
+     **/
+    ARLCORE_API void getFullDateString( long int date, std::string &s, char separator );
+
+    /**
+     * @brief   Set the string with the date as i.e. 2008-10-27 for October 27 2008
+     * @param[out]  s Will be set with full date string
+     * @param[in]   date
+     * @param[in]   separator Character between each number (ie : ' ' or '-')
+     **/
+    ARLCORE_API void getDateString( long int date, std::string &s, char separator );
+
+        /**
+     * @brief   Set the string with the time as i.e. 15-32-22 for 15h 32mn 22s
+     * @param[out]  s Will be set with time string
+     * @param[in]   date
+     * @param[in]   separator Character between each number (ie : ' ' or '-')
+     **/
+    ARLCORE_API void getTimeString( long int time, std::string &s, char separator );
+
+} // namespace arlString
+
+namespace arlFile
+{
+    /**
+     * @date    2007
+     * @brief   Fonctions sur les fichiers
+     */
+
+    //! @return Does the file f exist ?
+    ARLCORE_API bool fileExist( const std::string &f );
+
+    //! @brief Create a directory on the filesystem
+    ARLCORE_API bool mkdir( const std::string & );
+
+    //! @brief Copy OriginFilename to DestinationFilename
+    ARLCORE_API bool fileCopy( const std::string &OriginFilename, const std::string &DestinationFilename );
+
+    //! @brief Convert .trian file to .vtk file
+    ARLCORE_API bool convertTrianToVtk( const std::string &trianFilename, const std::string &vtkFilename );
+
+} // namespace arlFile
+
+namespace arlSound
+{
+    /**
+     * @date    11/2008
+     * @brief   Sound functions
+     */
+    const double NOTE_A = 880.00; // LA
+    const double NOTE_B = 987.77; // SI
+    const double NOTE_C = 523.25; // DO
+    const double NOTE_D = 587.33; // RE
+    const double NOTE_E = 659.26; // MI
+    const double NOTE_F = 698.46; // FA
+    const double NOTE_G = 783.99; // SOL
+
+    //! @brief Play frequency during a time in ms
+    ARLCORE_API bool play( double frequency=NOTE_A, double time=100 );
+
+} // namespace arlSound
+#endif // _ARLCORE_MISC_H
diff --git a/SrcLib/ARLcore/include/arlcore/Object.h b/SrcLib/ARLcore/include/arlcore/Object.h
new file mode 100644
index 0000000..7373def
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Object.h
@@ -0,0 +1,223 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_OBJECT_H
+#define _ARLCORE_OBJECT_H
+#include <fwTools/Object.hpp>
+
+#include <arlcore/Common.h>
+
+#include <sstream>
+#include <string>
+#include <iostream>
+#include <vector>
+
+namespace arlCore
+{
+    //! @brief All types of classes
+    enum ARLCORE_CLASS { ARLCORE_CLASS_OBJECT, ARLCORE_CLASS_PLANESYSTEM, ARLCORE_CLASS_CAMERA, ARLCORE_CLASS_TRACKER,
+                ARLCORE_CLASS_POINT, ARLCORE_CLASS_POINTLIST, ARLCORE_CLASS_TAG, ARLCORE_CLASS_TAGS,
+                ARLCORE_CLASS_MATRIXR, ARLCORE_CLASS_SCENE,
+                ARL_CLASS_SEQUENCE, ARL_CLASS_XML, ARL_CLASS_TOOL, ARL_CLASS_ROBOT, ARL_CLASS_IMAGE,
+                ARL_CLASS_VIDEO, ARL_CLASS_SERVER, ARL_CLASS_AURORA, ARL_CLASS_PILINE,
+                ARL3D_VTKACTOR,
+                ARLCORE_CLASS_NBTYPES };
+
+    static std::string ARLCORE_CLASS_NAMES[ARLCORE_CLASS_NBTYPES]={ "OBJECT", "PLANESYSTEM", "CAMERA", "TRACKER",
+                "POINT", "POINTLIST", "TAG", "TAGS", "MATRIXR", "SCENE",
+                "SEQUENCE", "XML", "TOOL", "ROBOT", "IMAGE", "VIDEO", "SERVER", "AURORA" };
+
+    //! @brief Avalaible levels of verbosity
+    enum ARLCORE_LOG_VERBOSE { ARLCORE_LOG_MUTE, ARLCORE_LOG_DISCREET, ARL_LOG_REGULAR, ARLCORE_LOG_GARRULOUS, ARLCORE_LOG_UNQUENCHABLE, ARLCORE_LOG_VERBOSE_NBTYPES };
+
+    const unsigned int FIRSTUPDATEINDEX = 1;
+    /**
+     * @class   Object
+     * @date    2007
+     * @brief   Classe de base
+     * Contient des informations temporelles, de validit� de l'objet, de Mutex
+     */
+    class Object : public ::fwTools::Object
+    {
+    public:
+        //! @brief Constructor
+        ARLCORE_API Object( ARLCORE_CLASS objectClass=ARLCORE_CLASS_OBJECT, const std::string &objectName="" );
+
+        //! @brief Constructor by copy
+        ARLCORE_API Object( const Object& );
+
+        //! @brief Affectation
+        ARLCORE_API Object& operator=( const Object& );
+
+        //! @brief Destructor
+        ARLCORE_API virtual ~Object( void );
+
+        //! @return The type of the current object
+        ARLCORE_API ARLCORE_CLASS getType( void ) const;
+
+        //! @return Description of the current object
+        ARLCORE_API virtual std::string getString( void ) const;
+
+        //! @brief Display the description of the current object
+        ARLCORE_API bool print( void ) const;
+
+        //! @brief Save the current object
+        ARLCORE_API virtual bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Load the current object
+        ARLCORE_API virtual bool load( const std::string &fileName );
+
+        //! @brief Save the current object with a default name
+        ARLCORE_API bool save( void ) const;
+
+        //! @brief Serialize the current object
+        ARLCORE_API std::string virtual serialize( void ) const;
+
+        //! @brief Unserialize the current object
+        ARLCORE_API bool unserialize( const std::string & );
+
+        //! @return Is the object OK ?
+        ARLCORE_API bool isOK( void ) const;
+
+        //! @return Number of object of the current class
+        ARLCORE_API unsigned int getCounter( void ) const;
+
+        //! @return Numero of the object in order of creation [1,..[
+        ARLCORE_API unsigned int getNo( void ) const;
+
+        //! @return Date and Timestamp of the last modification of the current object
+        //! @todo Replace long int date and time by a appropriate structure of time
+        ARLCORE_API bool getTime( long int &date, long int &time ) const;
+        ARLCORE_API long int getDate( void ) const;
+        ARLCORE_API long int getTime( void ) const;
+        //ARLCORE_API pt::datetime getTime( void ) const;
+
+        //! @brief Initialize chronometer
+        ARLCORE_API bool startLap( void );
+
+        //! @return lap in seconds et initialize chronometer
+        ARLCORE_API double getLap( void );
+
+        //! @return number of iterations per second on the base of time of the last iteration
+        ARLCORE_API double getItPerSec( void );
+
+        //! @return If the date is not the same as the object one
+        ARLCORE_API bool isChanged( const long int &date, const long int &time ) const;
+
+        //! @return The update index which increment every update of the object
+        ARLCORE_API long int getUpdateIndex( void ) const;
+
+        //! @return The date is the same as the object one or the object date is invariable : (0,0)
+        ARLCORE_API bool isEquivalent( const long int &date, const long int &time ) const;
+
+        //ARLCORE_API bool isEquivalent( const long int &time ) const;
+        // Protected ??
+        ARLCORE_API bool setTime( void ); // Now
+        ARLCORE_API bool setTime( const long int &date, const long int &time );
+        ARLCORE_API bool setTime( const long int &time );
+
+        /**
+         * @brief Set object's time with the greater value
+         * @return true if the object time has changed
+         */
+        ARLCORE_API bool setMaxTime( long int date, long int time );
+
+        /**
+         * @brief Set object's time with the lesser value
+         * @return true if the object time has changed
+         */
+        ARLCORE_API bool setMinTime( long int date, long int time );
+
+        //! @return A default and unique filename for the current object
+        ARLCORE_API std::string getFileName( void )const;
+
+        //! @brief Setup 'updateIndex' if an extern modification occurs
+        ARLCORE_API void update( void );
+
+        //! @brief Set the level of verbosity for the current object
+        ARLCORE_API void setVerboseLevel( ARLCORE_LOG_VERBOSE );
+
+        //! @brief Get the level of verbosity of the current object
+        ARLCORE_LOG_VERBOSE getVerboseLevel( void );
+
+        /**
+         * @brief Set the level of verbosity for all objects of the class
+         * If it's set, it takes precedence over object's level
+         */
+        ARLCORE_API static void setStaticVerboseLevel( ARLCORE_LOG_VERBOSE );
+
+        //! @brief Get the global level of verbosity of the class
+        ARLCORE_API static ARLCORE_LOG_VERBOSE getStaticVerboseLevel( void );
+
+        /**
+         * @brief Reset the global level of verbosity for the class
+         * The local verbosity will take again the precedence
+         */
+        ARLCORE_API static void resetStaticVerboseLevel( void );
+
+
+        ARLCORE_API bool isWriteLocked( void ) const;
+        ARLCORE_API bool isReadLocked( void ) const;
+
+        ARLCORE_API unsigned int lockReadMutex( void );
+        ARLCORE_API unsigned int unlockReadMutex( void );
+
+    protected:
+        ARLCORE_API virtual bool unserialize( std::stringstream &s );
+
+        //! @brief Avalaible levels of seriousness for log messages
+        ARLCORE_API enum ARLCORE_LOG_SERIOUSNESS { ARLCORE_LOG_ERROR, ARLCORE_LOG_WARNING, ARLCORE_LOG_INFO_LEVEL2, ARLCORE_LOG_INFO_LEVEL1, ARLCORE_LOG_SERIOUSNESS_NBTYPES };
+        std::stringstream m_log;
+
+        //! @brief Display log information about the current object
+        ARLCORE_API void log( ARLCORE_LOG_SERIOUSNESS, const std::stringstream& ) const;
+        ARLCORE_API void log( ARLCORE_LOG_SERIOUSNESS, const std::string& ) const;
+        ARLCORE_API void log( ARLCORE_LOG_SERIOUSNESS, const char* ) const;
+        ARLCORE_API void log( ARLCORE_LOG_SERIOUSNESS );
+
+        ARLCORE_API bool setOK( bool b=true );
+
+        // Date et time of the last modification of the object
+        //pt:datetime m_time;
+        long int m_date, m_time;
+
+        ARLCORE_API bool lockWriteMutex( void );
+        ARLCORE_API bool unlockWriteMutex( void );
+
+        //ARLCORE_API void setUpdateIndex( long int );
+
+        //! @bchild classes can use it
+        void copy( const Object& o );
+
+    private:
+
+
+        //! @brief Class type of the object
+        ARLCORE_CLASS m_class;
+
+        //! @brief Name of the object
+        std::string m_name;
+
+        //! @brief Validity of the object
+        bool m_ok;
+
+        //! @brief Number of object for each class
+        static unsigned int m_counter[ARLCORE_CLASS_NBTYPES];
+
+        unsigned int m_no;
+        //datetime m_lapTime;
+        long int m_lapTime;
+        long int m_lapDate;
+
+        ARLCORE_LOG_VERBOSE m_verboseLevel;
+        static ARLCORE_LOG_VERBOSE m_staticVerboseLevel;
+
+        bool m_writeMutex;
+        int m_readMutex;
+        long int m_updateIndex;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_OBJECT_H
diff --git a/SrcLib/ARLcore/include/arlcore/Optimization.h b/SrcLib/ARLcore/include/arlcore/Optimization.h
new file mode 100644
index 0000000..eee1e5d
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Optimization.h
@@ -0,0 +1,1088 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_OPTIMIZATION_H
+#define _ARLCORE_OPTIMIZATION_H
+
+#include <fwCore/macros.hpp>
+
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <vnl/vnl_cost_function.h>
+#include <vnl/vnl_least_squares_cost_function.h>
+#include <vnl/vnl_vector_fixed.h>
+#include <vnl/vnl_matrix_fixed.h>
+#include <vgl/vgl_point_3d.h>
+#include <vgl/vgl_line_3d_2_points.h>
+
+#include <arlcore/Point.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Camera.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/PlaneSystem.h>
+#include <arlcore/ICP.h>
+
+namespace arlCore
+{
+    /**
+     * @date    2007
+     * @brief   Mother Class for observation
+     * @warning the observer provides informations on the optimisation only if it has
+     * been activated using setObserver()
+     */
+    class CostFunction
+    {
+    public:
+        //! @brief Constructor
+        ARLCORE_API CostFunction( void );
+
+        //! @brief Compute and return the criterion
+        ARLCORE_API virtual double getCriterion( const vnl_vector<double> &x );
+
+        //! @brief Activation of the observer on the optimiser
+        ARLCORE_API void setObserver( bool b );
+
+        //! @return Iteration Number
+        ARLCORE_API unsigned int getNbIterations( void ) const;
+
+        /**
+         * @brief This function will stack in a PointList ALL the criterion value computed
+         * in f . The points are 2 dimensional, x coordinates corresponds to the time
+         * in ms and y coordinates correponds to the criterion value
+         */
+        ARLCORE_API const PointList& getObservation( void ) const;
+
+        //! @brief Tool to visualize the criterion evolution
+        ARLCORE_API void plot( void ) const;
+
+        //! @return Last error
+        ARLCORE_API double getError( void ) const;
+
+        //! @brief Verify if returned solution & end error are correct
+        ARLCORE_API bool verify( const vnl_vector<double>& x, double endError );
+
+        // TODO Be private
+        double m_errorMin;
+        vnl_vector<double> m_solution;
+        bool m_firstIteration;
+
+    protected:
+        //! @brief This method has to be written at the end of f(x) of child classes (return observe(); ) to make work the observer
+        ARLCORE_API double observe( const vnl_vector<double> &x );
+
+        //! @brief Use this method as observe( void ), if criterion can't be evaluated
+        ARLCORE_API double error( const vnl_vector<double> &x );
+
+        bool m_observer;
+
+        //! @brief Point list that contains the criterion value along time (if observer is set to true)
+        PointList m_errorList;
+
+        //! @brief Iteration number
+        long int m_iterations;
+
+        long int m_time;
+
+        //! @brief Criterion value
+        double m_error;
+
+        static double m_errorMax;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Computation of the best plane P that fits a 3D point cloud M_i
+     * The class seeks P so that sum || dist(M_i , P) ||^2 is minimal
+     */
+    class OptimisePlane : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimisePlane();
+        ARLCORE_API ~OptimisePlane();
+        ARLCORE_API double f(vnl_vector< double > const &x);
+
+        ARLCORE_API void addPoint( const vgl_point_3d< double >&point );
+        ARLCORE_API void delPoint( unsigned int );
+        ARLCORE_API unsigned int size( void );
+
+        ARLCORE_API const std::vector< vgl_point_3d< double >* > &getPoints( void );
+
+    private:
+        std::vector< vgl_point_3d< double >* > m_points;
+    };
+
+    /**
+     * @date    04/2009
+     * @brief   Optimization of ICP criterion
+     */
+    class OptimiseICP : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseICP( arlCore::ICP& );
+        ARLCORE_API ~OptimiseICP();
+        double f(vnl_vector< double > const &x);
+
+    private:
+        arlCore::ICP& m_ICP;
+    };
+
+    /**
+     * @date    04/2009
+     * @brief   Optimization of ICP criterion with Least Squares method
+     */
+    class OptimiseICP_LS : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseICP_LS( arlCore::ICP&, UseGradient g );
+        ARLCORE_API ~OptimiseICP_LS();
+        void f(vnl_vector< double > const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector< double > const &x, vnl_matrix< double > &g);
+
+    private:
+        arlCore::ICP& m_ICP;
+    };
+
+    /**
+     * @date    2008
+     * @brief   Computation of the best line L that fits a 3D point cloud
+     * The class seeks L so that sum || dist(M_i , L) ||^2 is minimal
+     */
+    class Optimise3DLine : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API Optimise3DLine( const std::vector< vgl_point_3d<double> >& );
+        ARLCORE_API ~Optimise3DLine();
+        ARLCORE_API double f(vnl_vector< double > const &x);
+
+        ARLCORE_API unsigned int size( void );
+
+    private:
+        const std::vector< vgl_point_3d<double> > &m_points;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Being a point list P that lies on a sphere (circle), this class computes an estimation
+     * of the sphere (circle) center C. The function that is minimized is:
+     *
+     * sum || dist( estimated_radius , CP_i ) ||^2
+     *
+     * where radius is the average of the CP_i
+     */
+    class OptimisePivot : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimisePivot( PointList::csptr );
+        ARLCORE_API ~OptimisePivot();
+        ARLCORE_API double f(vnl_vector< double > const &x);
+        ARLCORE_API double getRadius( void );
+
+    private:
+        CSPTR( PointList ) m_points;
+        double m_radius;
+    };
+
+    /**
+     * @date    08/2008
+     * @brief   Détermine T en minimisant la variation de d
+     * Soit une pointe tenue par l'organe terminal et observée par des caméras stéréo
+     * Soit M06i, une liste de transformations entre la base du robot et l'organe terminal
+     * Soit TIPi(x,y), une liste de coordonnées d'une pointe dans le repère Video
+     * Soit l'inconnue T, transformation entre le repère video et la base du robot
+     * Critère d, la distance entre l'origine de l'organe terminal et la pointe
+     * Minimisation de Delta d avec di = || M06i.T.TIPi ||
+     */
+    class OptimiseVideoRobot1 : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobot1( const std::vector< arlCore::vnl_rigid_matrix > &M06, CSPTR( PointList ) Tip );
+        ARLCORE_API ~OptimiseVideoRobot1();
+        ARLCORE_API double f(vnl_vector< double > const &x);
+        ARLCORE_API double getDistance( void ); // d
+        ARLCORE_API double getStdDev( void ); // Standard deviation
+
+    private:
+        CSPTR( PointList ) m_tip;
+        const std::vector< arlCore::vnl_rigid_matrix > &m_M06;
+        double m_distance;
+        double m_stdDev;
+    };
+
+    /**
+     * @date    03/2009
+     * @brief   Base class for End effector->Chessboard (X) & Robot base->Video (Z) calibration
+     * Soit une liste de cameras calibrees (cam)
+     * Soit un modele 3D de mire
+     * Soit une liste de tranformations M06 entre la base du robot et l'organe terminal
+     * Soit des listes de points detectes sur chaque camera
+     * Critère Somme des distances au carre entre les points 3D reprojetes et detectes
+     * Points 3D dans le repere des cameras apres transformation Modele->cameras = inv(X)*inv(A)*inv(Z)
+     */
+    class OptimiseVideoRobot : public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobot( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList );
+        ARLCORE_API ~OptimiseVideoRobot();
+
+        ARLCORE_API double criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z );
+
+    protected:
+        bool criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &invZ, vnl_vector<double> &fx );
+
+    private:
+        const std::vector< arlCore::vnl_rigid_matrix > &m_M06;
+        const std::vector< std::vector< arlCore::PointList::csptr > > &m_chessboards; // [cam][pose][point]
+        const std::vector<const arlCore::Camera*> &m_cameras;
+        const std::vector< std::vector<arlCore::PointList::csptr > > &m_points2DList; // [cam][pose][point]
+    };
+
+    /**
+     * @date    02/2009
+     * @brief   Détermine X en minimisant l'erreur de reprojection
+     * Soit une liste de cameras calibrees (cam)
+     * Soit un modele 3D de mire
+     * Soit une liste de tranformations M06 entre la base du robot et l'organe terminal
+     * Soit des listes de points detectes sur chaque camera
+     * Soit l'inconnue X, transformation entre l'organe terminal et la mire
+     * Soit l'inconnue Z, transformation entre le repère video et la base du robot
+     * Critère Somme des distances au carre entre les points 3D reprojetes et detectes
+     * Points 3D dans le repere des cameras apres transformation Modele->cameras = inv(X)*inv(A)*inv(Z)
+     */
+    class OptimiseVideoRobotX : public vnl_cost_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotX( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const arlCore::vnl_rigid_matrix &Z,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList );
+        ARLCORE_API ~OptimiseVideoRobotX();
+        double f(vnl_vector< double > const &x);
+
+    private:
+        const arlCore::vnl_rigid_matrix &m_Z;
+    };
+
+    /**
+     * @date    08/2009
+     * @brief   OptimiseVideoRobotX with Least Squares method
+     */
+    class OptimiseVideoRobotX_LS : public vnl_least_squares_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotX_LS( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const arlCore::vnl_rigid_matrix &Z,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+                             unsigned int number_of_residuals=1, UseGradient g=use_gradient);
+        ARLCORE_API ~OptimiseVideoRobotX_LS();
+
+        void f(vnl_vector< double > const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector< double > const &x, vnl_matrix< double > &g);
+
+    private:
+        const arlCore::vnl_rigid_matrix &m_Z;
+    };
+
+    /**
+     * @date    02/2009
+     * @brief   Détermine Z en minimisant l'erreur de reprojection
+     * Soit une liste de cameras calibrees (cam)
+     * Soit un modele 3D de mire
+     * Soit une liste de tranformations M06 entre la base du robot et l'organe terminal
+     * Soit des listes de points detectes sur chaque camera
+     * Soit l'inconnue X, transformation entre l'organe terminal et la mire
+     * Soit l'inconnue Z, transformation entre le repère video et la base du robot
+     * Critère Somme des distances au carre entre les points 3D reprojetes et detectes
+     * Points 3D dans le repere des cameras apres transformation Modele->cameras = inv(X)*inv(A)*inv(Z)
+     */
+    class OptimiseVideoRobotZ : public vnl_cost_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotZ( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const arlCore::vnl_rigid_matrix &X,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList );
+        ARLCORE_API ~OptimiseVideoRobotZ();
+        double f(vnl_vector< double > const &x);
+
+    private:
+        const arlCore::vnl_rigid_matrix &m_X;
+    };
+
+    /**
+     * @date    08/2009
+     * @brief   OptimiseVideoRobotZ with Least Squares method
+     */
+    class OptimiseVideoRobotZ_LS : public vnl_least_squares_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotZ_LS( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const arlCore::vnl_rigid_matrix &X,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+                             unsigned int number_of_residuals=1, UseGradient g=use_gradient);
+        ARLCORE_API ~OptimiseVideoRobotZ_LS();
+
+        void f(vnl_vector< double > const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector< double > const &x, vnl_matrix< double > &g);
+
+    private:
+        const arlCore::vnl_rigid_matrix &m_X;
+    };
+
+    /**
+     * @date    03/2009
+     * @brief   Détermine X et Z en minimisant l'erreur de reprojection
+     * Soit une liste de cameras calibrees (cam)
+     * Soit un modele 3D de mire
+     * Soit une liste de tranformations M06 entre la base du robot et l'organe terminal
+     * Soit des listes de points detectes sur chaque camera
+     * Soit l'inconnue X, transformation entre l'organe terminal et la mire
+     * Soit l'inconnue Z, transformation entre le repère video et la base du robot
+     * Critère Somme des distances au carre entre les points 3D reprojetes et detectes
+     * Points 3D dans le repere des cameras apres transformation Modele->cameras = inv(X)*inv(A)*inv(Z)
+     */
+    class OptimiseVideoRobotXZ : public vnl_cost_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotXZ( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList );
+        ARLCORE_API ~OptimiseVideoRobotXZ();
+        double f(vnl_vector< double > const &x);
+    };
+
+    /**
+     * @date    03/2009
+     * @brief   OptimiseVideoRobotXZ with Least Squares method
+     */
+    class OptimiseVideoRobotXZ_LS : public vnl_least_squares_function, public OptimiseVideoRobot
+    {
+    public:
+        ARLCORE_API OptimiseVideoRobotXZ_LS( const std::vector< arlCore::vnl_rigid_matrix > &M06,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &models3D,
+                             const std::vector<const arlCore::Camera*> &cams,
+                             const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+                             unsigned int number_of_residuals=1, UseGradient g=use_gradient);
+        ARLCORE_API ~OptimiseVideoRobotXZ_LS();
+
+        void f(vnl_vector< double > const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector< double > const &x, vnl_matrix< double > &g);
+    };
+
+    /**
+     * @date    2007
+     * @brief   This class is used to perform a triangulation from N 2D visible points
+     * in N video images. Of course, the cameras need to be calibrated in the same frame.
+     * The criterion that is optimized is:
+     * sum || P_i(M) - m_i ||^2
+     * where P_i is the projective function of the i th camera, m_i the 2d coordinates
+     * of the point extracted in the i th image.
+     */
+    class OptimiseReprojection : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseReprojection(const std::vector<const Camera*> &cameras, const std::vector<Point::csptr> &points2D);
+        ARLCORE_API ~OptimiseReprojection();
+
+        double f(vnl_vector< double > const &point3D);
+
+    private:
+        const std::vector<const Camera*> &m_cameras;
+        const std::vector<Point::csptr>  &m_points2D;
+    };
+
+    /**
+     * @date    12/2008
+     * @brief   Solve Ax=xB equation by minimization of the reprojection
+     */
+/*  class AxxBReproj_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        AxxBReproj_cost_function(
+            const std::vector< vnl_rigid_matrix > &A,
+            const std::vector< vnl_rigid_matrix > &B,
+            const std::vector<const arlCore::Camera*> &videoCams,
+            const std::vector< PointList > &models3DList, //[pose]
+            const std::vector< std::vector<PointList> > &points2DList); //[cam][pose]
+
+        ~AxxBReproj_cost_function();
+
+        double f(vnl_vector< double > const &x);
+
+    private:
+        const std::vector< arlCore::vnl_rigid_matrix > &m_A_matrix;
+        const std::vector< arlCore::vnl_rigid_matrix > &m_B_matrix;
+        const std::vector<const arlCore::Camera*> &m_videoCams;
+        const std::vector< arlCore::PointList > &m_models3DList;
+        const std::vector< std::vector<arlCore::PointList> > &m_points2DList;
+    };*/
+
+    /**
+     * @date    09/2008
+     * @brief   AX=XB resolution by optimization of Dornaika method
+     */
+    class Dornaika_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API Dornaika_cost_function(const std::vector< vnl_rigid_matrix >&A, const std::vector< vnl_rigid_matrix >&B);
+        ARLCORE_API ~Dornaika_cost_function();
+
+        double f(vnl_vector< double > const &x);
+
+    private:
+        const std::vector< vnl_rigid_matrix > &m_A_matrix;
+        const std::vector< vnl_rigid_matrix > &m_B_matrix;
+    };
+
+    /**
+     * @date    09/2008
+     * @brief   AX=XB resolution by optimization of Dornaika method
+     */
+    class Dornaika_LS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API Dornaika_LS_cost_function(const std::vector< vnl_rigid_matrix >&A, const std::vector< vnl_rigid_matrix >&B,
+        unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g=use_gradient);
+        ARLCORE_API ~Dornaika_LS_cost_function();
+
+        void f(vnl_vector< double > const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector< double > const &x, vnl_matrix< double > &g);
+
+    private:
+        const std::vector< vnl_rigid_matrix > &m_A_matrix;
+        const std::vector< vnl_rigid_matrix > &m_B_matrix;
+    };
+
+    /**
+     * @date    09/2008
+     * @brief   Evaluation by polynomial method of a field of deformation
+     */
+    class Polynomial_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API Polynomial_cost_function( CSPTR( PointList ) real, CSPTR( PointList ) distorded, unsigned int degree );
+        ARLCORE_API ~Polynomial_cost_function();
+        double f(vnl_vector<double> const &x);
+
+        ARLCORE_API unsigned int getNbParameters();
+
+    private:
+        CSPTR( PointList ) m_real;
+        CSPTR( PointList ) m_distorded;
+        unsigned int m_nbEquations;
+        unsigned int m_degree;
+    };
+
+    /**
+     * @date    2007
+     * @brief   This class is used to perform a triangulation from N 2D visible points
+     * in N video images. Of course, the cameras need to be calibrated in the same frame.
+     * The criterion that is optimized is different from the one in the class
+     * arlcore::OptimiseReprojection, since in this case it takes into account the uncertainty
+     * of each 2D point. The uncertainty is given in the covariance matrix associated to
+     * each 2D point. If the covariance matrix are not filled, they are supposed to be identity.
+     * The criterion that is optimized is
+     * sum transpose( P_i(M) - m_i ) * cov_matrix_m_i^(-1) * ( P_i(M) - m_i )
+     * where P_i is the projective function of the i th camera, m_i the 2d coordinates
+     * of the point extracted in the i th image and cov_matrix_m_i the covariance matrix
+     * of the point m_i extracted in the i th video image.
+     * (Note: the covariance matrix is often anisotropic when the point extracted in the video
+     * image is the gravity center of an ellipsoid)
+     */
+    class OptimiseReprojectionUncertainty : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseReprojectionUncertainty(const std::vector<const Camera*> &cameras, const std::vector<Point::csptr> &points2D);
+        ARLCORE_API ~OptimiseReprojectionUncertainty();
+
+        double f (vnl_vector< double > const &point3D);
+
+    private:
+        const std::vector<const Camera*> &m_cameras;
+        const std::vector<Point::csptr>  &m_points2D;
+        std::vector< vnl_matrix_fixed<double,2,2> > m_inv_cov_matrix;
+
+    };
+
+    /**
+     * @date    2007
+     * @brief   Given a set of lines that should intersect in a unique point, but
+     * which are in reality very close, this class finds the closest point to
+     * each line. We optimize here the following criterion:
+     * sum dist(L_i, M)^2
+     *
+     * where M is the unknown 3D point, L_i are the lines which should intersect in a
+     * unique point and dist(L_i, M) compute the euclidean distance between the line L_i and M.
+     * This function is used for example in the triangulation method called
+     * ARLCORE_R3D_MULTI_LINES_APPROX and ARLCORE_R3D_MULTI_LINES_PERFECT
+     */
+    class OptimiseLineIntersection : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OptimiseLineIntersection(const std::vector< vgl_line_3d_2_points <double> >&lines);
+        ARLCORE_API ~OptimiseLineIntersection();
+
+        double f (vnl_vector< double > const &x);
+
+    private:
+        const std::vector< vgl_line_3d_2_points <double> >&m_lineList;
+    };
+
+    /**
+     * @date    2007
+     * @brief   This class perform a 3D/2D projective point registration called
+     * EPPC (see. S. Nicolau, X. Pennec, L. Soler, N. Ayache, An accuracy
+     * certified augmented reality system for therapy guidance. In ECCV04,
+     * LNCS 3023, 2004 P 79-91)
+     *
+     * Context of use:
+     * You have a rigid 3D point set \tilde{M_i} that are seen by N camera. The 3D
+     * point set coordinates are know in its own frame. This 3D point set is visible
+     * in N video images that are jointly calibrated. In each video
+     * image you extract the projection of \tilde{M_i} and obtain \tilde{m_j_i} where j indicates
+     * the camera number. Your purpose is to compute the rigid transformation
+     * between the camera frame and the 3D point own frame.
+     *
+     * Typically, this function is useful in augmented rality application (but not only).
+     * You are looking with several cameras at a patient on which several radio-opaque
+     * markers were stuck. The patient has been CT-scanned and markers are visible both
+     * in the CT image and in the video images. To superimpose the 3D model segmented
+     * in the CT scan, you need to estimate the rigid transformation between the CT
+     * frame and the camera frame.
+     *
+     * For this criterion to be interesting, the 3D point set must come
+     * from a measurement that is accurate but not too much. You need also to
+     * have an idea on your measure uncertainty (3D and 2D) and
+     * that they are different between the 3D points and the 2D points.
+     *
+     * We assume you know for each point \tilde{M_i} and \tilde{m_j_i} its covariance matrix.
+     * The criterion to be optimized is:
+     * sum transpose( M_i - \tilde{M_i)} ) * cov_matrix_M_i ^(-1) * ( M_i - \tilde{M_i)} )
+     * + sum_j sum_i transpose( P_j(T*M_i) - \tilde{m_i}) *cov_matrix_m_j_i ^(-1)*( P_j(T*M_i) - \tilde{m_i})
+     *
+     * where M_i are the PERFECT position of the 3D points M_i (which is not known
+     * but is estimated when optimizing the criterion). In this criterion, T and the M_i
+     * are the unknown. The optimization on the unknown is done iteratively.
+     *
+     * Since we are not (at first sight) interested by the 3D points estimation, the
+     * class provides only the transformation T at the end of the optimization.
+     * The function get3Derror provides the first term value during the optimization
+     * The function get2Derror provides the second term value during the optimization
+     * You can also ask for them at the end of the optimization.
+     * If you need the estimation of the 3D points, just add a function that
+     * gives back m_model3D.
+     */
+    class EPPC_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API EPPC_cost_function(const std::vector < const Camera *> &c,
+            const std::vector<Point::csptr > &model3D,
+            const std::vector< std::vector<Point::csptr> >&points2DList,
+            vnl_matrix_fixed<double,4,4> &trsf);
+        ARLCORE_API ~EPPC_cost_function(){}
+        double f (vnl_vector< double > const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+        ARLCORE_API double get3Derror() const {return m_3Derror(0,0);};
+        ARLCORE_API double get2Derror() const {return m_2Derror(0,0);};
+
+    private:
+        std::vector< vnl_matrix_fixed<double,3,3> > m_invCovMat3D;
+        std::vector< std::vector<vnl_matrix_fixed<double,2,2> > > m_invCovMat2D;
+        const std::vector<const Camera*> &m_cameras;
+        const std::vector< Point::csptr  > &m_model3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2DList;
+        const vnl_matrix_fixed<double,4,4>  &m_trsf;
+        vnl_matrix_fixed<double,1,1> m_2Derror;
+        vnl_matrix_fixed<double,1,1> m_3Derror;
+    };
+
+    /**
+     * @date    2007
+     * @brief   EPPC cost function with Least Square method
+     */
+    class EPPC_LS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API EPPC_LS_cost_function(const std::vector < const Camera *> &c,
+            const std::vector<Point::csptr > &model3D,
+            const std::vector< std::vector<Point::csptr> >&points2DList,
+            vnl_matrix_fixed<double,4,4> &trsf,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g=use_gradient);
+
+        ARLCORE_API ~EPPC_LS_cost_function(){}
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& g);
+        ARLCORE_API double get3Derror() const {return m_3Derror(0,0);};
+        ARLCORE_API double get2Derror() const {return m_2Derror(0,0);};
+
+    private:
+        std::vector< vnl_matrix_fixed<double,3,3> > m_invCovMat3D;
+        std::vector< std::vector<vnl_matrix_fixed<double,2,2> > > m_invCovMat2D;
+        const std::vector<const Camera*> &m_cameras;
+        const std::vector< Point::csptr  > &m_model3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2DList;
+        const vnl_matrix_fixed<double,4,4>  &m_trsf;
+        vnl_matrix_fixed<double,1,1> m_2Derror;
+        vnl_matrix_fixed<double,1,1> m_3Derror;
+    };
+
+    /**
+     * @date    2007
+     * @brief   ISPPC cost function
+     * The context of use of this class is the same than for EPPC, but in that case
+     * the noise on your 3D point is negligible with respect to the noise on your
+     * 2D points.
+     * If you have isotropic noise on the 2D points extraction, or if you want to
+     * neglect it, m_noise_feature must be set to false. Then you optimise the
+     * following criterion:
+     * sum_j sum_i ||P_j(T*M_i) - m_i||^2
+     *
+     * where M_i are the position of the 3D points, m_j_i is the projection of
+     * M_i in the j th camera, P_j is the projective function of the j th camera and
+     * T is the unknown (rigid transformation). This criterion typically corresponds
+     * to a 2D reprojection error (in pixel).
+     *
+     * If you have anisotropic noise, you optimize the following criterion:
+     * sum_j sum_i transpose( P_j(T*M_i) - m_i) *cov_matrix_m_j_i ^(-1)*( P_j(T*M_i) - m_i)
+     *
+     * where  cov_matrix_m_j_i is the covariance matrix of the i th point in the
+     * j th camera.
+     *
+     * TODO : verbose mode so that we can easily print out the criterion evolution
+     * during the minimization
+     */
+    class ISPPC_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API ISPPC_cost_function(const std::vector<const Camera *>&a,
+            const std::vector< vnl_vector_fixed<double,4> > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D, bool noise_feature=false);
+
+        ARLCORE_API ~ISPPC_cost_function(){}
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+        ARLCORE_API double getNoiseFeature() const {return m_noise_feature;};
+        ARLCORE_API void   setNoiseFeature(bool feat) {m_noise_feature = feat;};
+
+    private:
+        const std::vector< vnl_vector_fixed<double,4> > &m_points3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2D;
+        const std::vector<const Camera*> &m_cameras;
+        std::vector< std::vector<vnl_matrix_fixed<double,2,2> > > m_invCovMat2D;
+        bool m_noise_feature;//if the noise is isotropic, this bool is true and m_invCovMat2D is empty
+    };
+
+    /**
+     * @date    2007
+     * @brief   ISPPC cost function with Least Square method
+     */
+    class ISPPC_LS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API ISPPC_LS_cost_function(const std::vector<const Camera *>&a,
+            const std::vector< vnl_vector_fixed<double,4> > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g=use_gradient, bool noise_feature = false);
+
+        ~ISPPC_LS_cost_function(){}
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& g);
+        ARLCORE_API double getNoiseFeature() const {return m_noise_feature;};
+        ARLCORE_API void setNoiseFeature(bool feat) {m_noise_feature = feat;};
+
+    private:
+        const std::vector< vnl_vector_fixed<double,4> > &m_points3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2D;
+        const std::vector<const Camera*> &m_cameras;
+        std::vector< std::vector<vnl_matrix_fixed<double,2,2> > > m_invCovMat2D;
+        bool m_noise_feature;//if the noise is isotropic, this bool is true and m_invCovMat2D is empty
+    };
+
+    /**
+     * @date    2007
+     * @brief   OSPPC cost function
+     * The context of use of this class is the same than for EPPC, but in that case
+     * the noise on your 3D point is negligible with respect to the noise on your
+     * 2D points. This criterion was introduced by Lu, C. Fast and Globally Convergent
+     * Pose Estimation from Video Images in Trans on PAMI 2000 vol 22(6) pp 610--622,
+     * and minimize the sum of the squared 3D distance between the 3D points and the
+     * half lines beginning from the optical center C and passing through
+     * the 2D points extracted from the video images.
+     *
+     * You optimise the following criterion:
+     * sum_j sum_i  || 1/{C_j m_j_i} ||^2 * || C_j(T * M_i) vect {C_j m_j_i} || ^2
+     *
+     * where M_i are the position of the 3D points, C_j is the optical center of
+     * the j th camera, m_j_i is the projection of M_i in the j th camera, C_j(T * M_i)
+     * is a vector between C_j and T*M_i, C_j m_j_i is a vector between C_j and M_j_i ,
+     * vect is the cross product between two vectors and T is the unknown (rigid
+     * transformation). This criterion typically corresponds to a 3D projection error
+     * in mm.
+     *
+     * TODO : verbose mode so that we can easily print out the criterion evolution
+     * during the minimization
+     */
+    class OSPPC_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OSPPC_cost_function(const std::vector<const Camera *>&a,
+            const std::vector< Point::csptr  > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D);
+        ARLCORE_API ~OSPPC_cost_function(){};
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+    private:
+        const std::vector<Point::csptr > &m_points3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2D;
+        const std::vector<const Camera*> &m_cameras;
+        std::vector< std::vector< vnl_vector_fixed<double,3> > > m_extPoints2D;
+    };
+
+    /**
+     * @date    2007
+     * @brief   OSPPC cost function with Least Square method
+     */
+    class OSPPC_LS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API OSPPC_LS_cost_function(const std::vector<const Camera*>&,
+            const std::vector<Point::csptr > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g=use_gradient);
+        ARLCORE_API ~OSPPC_LS_cost_function(){};
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& g);
+
+    private:
+        const std::vector<Point::csptr > &m_points3D;
+        const std::vector< std::vector<Point::csptr> > &m_points2D;
+        const std::vector<const Camera*> &m_cameras;
+        std::vector< std::vector< vnl_vector_fixed<double,3> > > m_extPoints2D;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization intrinsic parameters of a camera according to the
+     * method of Z. Zhang. Flexible Camera Calibration by Viewing a Plane from
+     * Unknown Orientations in ICCV 99.
+     * The criterion that is optimised is Sum( Sum( ||Project(Tj * Mi) - mij||^2 ) )
+     * and the unknown are the intrinsic parameter (hidden in the function Project) :
+     * fx;fy;cx;cy;k1;k2;p1;p2;[k3;alphaC] : k3 and alphaC are not used
+     * For each pose, the pattern can be different (number of points, 3D position of points)
+     * It is assumed that all the points of each 3D model is visible in the video image
+     * Therefore, if a point of the 3D model is not seen in the video image, it has to be
+     * removed from the 3D model given to the function
+     */
+    class Intrinsic_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        Intrinsic_cost_function(unsigned int nbParameters=0);
+        ~Intrinsic_cost_function();
+        ARLCORE_API unsigned int getNbParameters( void ) const;
+        ARLCORE_API bool save( const std::string &fileName ) const;
+        ARLCORE_API unsigned int addPattern( const std::vector<Point::sptr >& points2D, const std::vector<Point::sptr >& model3D );
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+        ARLCORE_API void setVerbose( bool verbose = true );
+        ARLCORE_API std::vector<double> getReprojectionError( vnl_vector< double > const &x );
+
+    private:
+        unsigned int m_nbParameters;
+        PlaneSystem m_universe;
+        Camera *m_camera;
+        std::vector< PointList* > m_2DpatternsList;
+        std::vector< PointList* > m_3DpatternsList;
+        bool m_verbose;
+        bool m_available_reprojection_error;
+        std::vector<double> m_point_reprojection_error;
+
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization intrinsic parameters with Levenberg optimization
+     * see Intrinsic_cost_function for more explanation
+     */
+    class IntrinsicLS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API IntrinsicLS_cost_function(unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g=use_gradient);
+        ARLCORE_API ~IntrinsicLS_cost_function();
+        ARLCORE_API unsigned int getNbParameters( void ) const;
+        ARLCORE_API bool save( const std::string &fileName ) const;
+        ARLCORE_API unsigned int addPattern( const std::vector<Point::sptr >& points2D, const std::vector<Point::sptr >& model3D );
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& j);
+        ARLCORE_API void setVerbose( bool verbose = true );
+        ARLCORE_API void getReprojectionError( vnl_vector< double > const &x, vnl_vector< double > &fx );
+
+
+    private:
+        unsigned int m_nbParameters;
+        PlaneSystem m_universe;
+        Camera *m_camera;
+        std::vector< PointList* > m_2DpatternsList;
+        std::vector< PointList* > m_3DpatternsList;
+        bool m_verbose;
+//      double m_reproj_error;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization of extrinsic parameters of several cameras
+     * This class optimize a criterion that allows to calibrate in a same
+     * frame several cameras that are looking at the same 3D model object in
+     * several positions.
+     * For more explanation on the criterion, cf. arlCore::refineExtrinsicCalibration
+     */
+    class Extrinsic_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        Extrinsic_cost_function(const std::vector<const Camera *>&a, unsigned int nou);
+        ~Extrinsic_cost_function();
+        double f(vnl_vector<double> const &x);
+        ARLCORE_API unsigned int addPattern( const std::vector<std::vector<Point::csptr > >& points2D, const std::vector<Point::csptr >& model3D );
+        //void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+        ARLCORE_API void setVerbose( bool verbose = true );
+        ARLCORE_API std::vector<double> getReprojectionError( vnl_vector< double > const &x );
+
+    private:
+        unsigned int m_nb3Dpoints;
+        std::vector< std::vector< std::vector< Point::csptr  > > > m_2DpatternsList;
+        std::vector< std::vector< Point::csptr  > >  m_3DpatternsList;
+        const std::vector<const Camera*> &m_cameras;
+        bool m_verbose;
+        bool m_available_reprojection_error;
+        std::vector<double> m_point_reprojection_error;
+
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization extrinsic parameters with Levenberg Marquart optimization
+     * Note that the step variable in fgradf plays an important role in the convergence
+     * speed. 1e-8 seems to be an optimal value. The reason is still unknown. Setting
+     * this variable to 1e-12 or 1e-6 multiply the convergence time by a factor of 3
+     * or of 4 !
+     */
+    class ExtrinsicLS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API ExtrinsicLS_cost_function(const std::vector<const Camera *>&a,unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g=use_gradient);
+        ARLCORE_API ~ExtrinsicLS_cost_function();
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& j);
+        ARLCORE_API unsigned int addPattern( const std::vector<std::vector<Point::csptr > >& points2D, const std::vector<Point::csptr >& model3D );
+        ARLCORE_API void setVerbose( bool verbose = true );
+        ARLCORE_API void getReprojectionError( vnl_vector< double > const &x, vnl_vector< double > &fx );
+    private:
+        unsigned int m_nb3Dpoints;
+
+        std::vector< std::vector< std::vector< Point::csptr  > > > m_2DpatternsList;
+        std::vector< std::vector< Point::csptr  > >  m_3DpatternsList;
+        const std::vector<const Camera*> &m_cameras;
+        bool m_verbose;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization of the Sylvester equation AX=XB. To understand what is solved
+     * please refer to arlcore::vnl_rigid_matrix::solve_AXXB
+     * 2 criterions :
+     * 1st criterion that is minimized is sum_i || A_iX-XB_i ||^2 where the norm is the
+     * frobenius norm
+     * 2nd criterion : Strobl-Hirzinger
+     */
+    class AX_XB_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API AX_XB_cost_function(
+            const std::vector< vnl_rigid_matrix >&A,
+            const std::vector< vnl_rigid_matrix >&B,
+            double alpha = 1.0):
+        vnl_cost_function(6),
+        m_A_matrix(A),
+        m_B_matrix(B),
+        m_alpha(alpha){}
+
+        ARLCORE_API ~AX_XB_cost_function(){}
+
+        ARLCORE_API double criterion( const arlCore::vnl_rigid_matrix &X );
+        ARLCORE_API double getAlpha( const arlCore::vnl_rigid_matrix &X );
+        ARLCORE_API void setAlpha( double );
+
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+    private:
+        const std::vector< vnl_rigid_matrix > m_A_matrix;
+        const std::vector< vnl_rigid_matrix > m_B_matrix;
+        double m_alpha;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Optimization of the Sylvester equation AX=XB. To understand what is solved
+     * please refer to arlcore::vnl_rigid_matrix::solve_AXXB
+     * Criterion of Strobl-Hirzinger with BXA = Z
+     */
+/*  class AXB_Z_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API AXB_Z_cost_function(
+            const std::vector< vnl_rigid_matrix >&A,
+            const std::vector< vnl_rigid_matrix >&B,
+            double alpha = 1.0):
+        vnl_cost_function(12),
+        m_A_matrix(A),
+        m_B_matrix(B),
+        m_alpha(alpha){}
+
+        ARLCORE_API ~AXB_Z_cost_function(){}
+
+        ARLCORE_API double criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z );
+        ARLCORE_API double getAlpha( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z );
+        ARLCORE_API void setAlpha( double );
+
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+    private:
+        const std::vector< vnl_rigid_matrix > m_A_matrix;
+        const std::vector< vnl_rigid_matrix > m_B_matrix;
+        double m_alpha;
+    };*/
+
+    /**
+     * @date    2007
+     * @brief   Optimization of the AXBZ = 0 equation
+     * 4 Criterions
+     * 1) Minimization of sum_i || vnl_rigid_vector(A_iXB_iZ) ||^2 where the norm is the
+     * two norm. AXBZ should be identity so the rigid vector should be [0 0 0 0 0 0]
+     * 4) Criterion of Strobl-Hirzinger
+     */
+    class AXB_Z_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API AXB_Z_cost_function(
+            const std::vector< vnl_rigid_matrix >&A,
+            const std::vector< vnl_rigid_matrix >&B,
+            double alpha=1.0):
+        vnl_cost_function(12),
+        m_A_matrix(A),
+        m_B_matrix(B),
+        m_alpha(alpha){}
+
+        ARLCORE_API ~AXB_Z_cost_function(){}
+
+        ARLCORE_API double criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z );
+        ARLCORE_API double getAlpha( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z );
+        ARLCORE_API void setAlpha( double );
+
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+    private:
+        const std::vector< vnl_rigid_matrix > m_A_matrix;
+        const std::vector< vnl_rigid_matrix > m_B_matrix;
+        double m_alpha;
+    };
+
+    /**
+     * @date    2007
+     * @brief   The purpose of this class is to register 2 lists of matched
+     * 3D points. It minimizes the following 3D/3D registration criterion:
+     *
+     * sum_i  transpose(T* M_i - N_i) * Cov_M_i ^(-1) * (T* M_i - N_i)
+     *
+     * where M_i are the points to register on the N_i points, T the rigid transformation
+     * that is seeked, and Cov_M_i the covariance matrix that contains the uncertainty
+     * on M_i. This means that we consider that the N_i points are perfect and that the M_i
+     * observation are corrupted with a noise of covariance matrix Cov_M_i .
+     */
+    class register3D3DUncertainty_cost_function : public vnl_cost_function, public CostFunction
+    {
+    public:
+        ARLCORE_API register3D3DUncertainty_cost_function(CSPTR( PointList ) points3D_source,
+            CSPTR( PointList ) points3D_cible);
+
+        ARLCORE_API ~register3D3DUncertainty_cost_function(){}
+        double f(vnl_vector<double> const &x);
+        void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+    private:
+        CSPTR( PointList ) m_points3D_source, m_points3D_cible;
+        std::vector< vnl_matrix_fixed<double,3,3> > m_inv_cov_matrix;
+    };
+
+    /**
+     * @date    2007
+     * @brief   The purpose of this class is to register 2 lists of matched
+     * 3D points. See register3D3DUncertainty_cost_function for all informations.
+     * In this class we optimize with the Levenberg Marquardt method.
+     */
+    class register3D3DUncertainty_LS_cost_function : public vnl_least_squares_function, public CostFunction
+    {
+    public:
+        ARLCORE_API register3D3DUncertainty_LS_cost_function(CSPTR( PointList ) points3D_source,
+            CSPTR( PointList ) points3D_cible,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g=use_gradient);
+
+        ARLCORE_API ~register3D3DUncertainty_LS_cost_function(){}
+        void f(vnl_vector<double> const &x, vnl_vector< double > &fx);
+        void gradf(vnl_vector<double> const &x, vnl_matrix<double>& g);
+
+    private:
+        CSPTR( PointList ) m_points3D_source, m_points3D_cible;
+        std::vector< vnl_matrix_fixed<double,3,3> > m_inv_cov_matrix;
+    };
+
+    /**
+     * @date    2007
+     * @brief   Compute the average of a rotation list using a geodesic norm on SO(3)
+     * It minimizes sum_i ||R_i - R_average ||^2  where R_average is the unknown
+     * and ||.|| is a riemannian distance
+     *
+     * TODO still not include in arlcore::vnl_rigid_matrix
+     */
+    class averageRotation_cost_function : public vnl_cost_function, public CostFunction
+    {
+     public:
+      ARLCORE_API averageRotation_cost_function(const std::vector< arlCore::vnl_rotation3d_matrix* > list):vnl_cost_function(6),
+      m_rotation_list(list){}
+      ARLCORE_API ~averageRotation_cost_function(){}
+      ARLCORE_API inline std::vector< arlCore::vnl_rotation3d_matrix* > get_matrix_list() const {return this->m_rotation_list;};
+      ARLCORE_API inline int get_nou() const {return this->number_of_unknowns;};
+      ARLCORE_API inline void set_nou(int a) {this->number_of_unknowns = a;};
+      ARLCORE_API inline void set_matrix_list(std::vector< arlCore::vnl_rotation3d_matrix* > a) {this->m_rotation_list = a;};
+
+      double f (vnl_vector< double > const &x);
+      void gradf(vnl_vector<double> const &x, vnl_vector<double>& g);
+
+      friend double sq_rieman_dist(arlCore::vnl_rotation3d_matrix, arlCore::vnl_rotation3d_matrix);
+
+    private:
+      std::vector< arlCore::vnl_rotation3d_matrix* > m_rotation_list;
+      int number_of_unknowns;
+    };
+
+} // namespace arlCore
+#endif // _ARLCORE_OPTIMIZATION_H
diff --git a/SrcLib/ARLcore/include/arlcore/Parameters.h b/SrcLib/ARLcore/include/arlcore/Parameters.h
new file mode 100644
index 0000000..ecaec75
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Parameters.h
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_PARAMETERS_H
+#define _ARLCORE_PARAMETERS_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+#include <map>
+#include <boost/any.hpp>
+
+namespace arlCore
+{
+    class Parameters
+    {
+    /**
+     * @class   Parameters
+     * @date    07/2007
+     * @brief   This class should be used with real time application only.
+     * The purpose of this class is to access/modify parameters (double or boolean)that are loaded 
+     * when an application is launched. It allows to read parameters that
+     * can modify the software behaviour. For example, in the case you use a tracking
+     * software with N cameras, you could indicate in a file how many cameras
+     * you want to use for your tracking. The functions in this class are devoted
+     * to help you doing such things. 
+     *  
+     */
+    public:
+        //! @brief Constructor
+        ARLCORE_API Parameters( const std::string &name="", const std::string &fileName="" );
+
+        //! @brief Desstructor
+        ARLCORE_API ~Parameters( void );
+
+        //! @brief Display the list of parameters
+        ARLCORE_API bool printParameters( void ) const;
+
+        //! @brief Reload value of parameters from current file
+        ARLCORE_API bool reloadParameters( void );
+
+        //! @brief Reload value of parameters from a new file
+        ARLCORE_API bool reloadParameters( const std::string &fileName );
+
+        //! @brief Save the list of parameters (Not yet implemented)
+        ARLCORE_API bool saveParameters( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @return True if the type of the no parameter is 'type'
+        ARLCORE_API bool getType( unsigned int no, const std::type_info &type ) const;
+
+        //! @return True if the type of the named parameter is 'type'
+        ARLCORE_API bool getType( const std::string &name, const std::type_info &type ) const;
+
+        //! @return Number of all parameters
+        ARLCORE_API unsigned int getNbParameters( void ) const;
+
+        //! @return Number of all bool parameters
+        ARLCORE_API unsigned int getNbBoolParameters( void ) const;
+
+        //! @return Number of all double parameters
+        ARLCORE_API unsigned int getNbDoubleParameters( void ) const;
+
+        /**
+         * @brief Set all parameters with their default values
+         * @return Number of parameters set
+         */
+        ARLCORE_API unsigned int setAllDefault( void );
+
+        /**
+         * @brief Set all bool parameters to b
+         * @return Number of parameters set
+         */
+        ARLCORE_API unsigned int setAllBoolParameters( bool b=true );
+
+        /**
+         * @brief Set all bool parameters to false
+         * @return Number of parameters set
+         */
+        ARLCORE_API unsigned int resetAllBoolParameters( void );
+
+        /**
+         * @brief Set all bool parameters with d
+         * @return Number of parameters set
+         */
+        ARLCORE_API unsigned int setAllDoubleParameters( double d );
+
+        /**
+         * @return Value of the parameter no if it's boolean
+         * @warning If the parameter no is not boolean, return false
+         */
+        ARLCORE_API bool getBool( unsigned int no ) const;
+        ARLCORE_API bool getBool( const std::string &name ) const;
+
+        /**
+         * @return Value of the parameter no if it's a double
+         * @warning If the parameter no is not a double, return 0.0
+         */
+        ARLCORE_API double getDouble( unsigned int no ) const;
+        ARLCORE_API double getDouble( const std::string &name ) const;
+
+        /**
+         * @brief Set the parameter no to b, if it exists and if it's boolean
+         * @return If the parameter was set
+         */
+        ARLCORE_API bool setBool( unsigned int no, bool b );
+        ARLCORE_API bool setBool( const std::string &name, bool b );
+
+        /**
+         * @brief Set the parameter no to d, if it exists and if it's a double
+         * @return If the parameter was set
+         */
+        ARLCORE_API bool setDouble( unsigned int no, double d );
+        ARLCORE_API bool setDouble( const std::string &name, double d ); 
+
+        //! @return Description of all parameters
+        ARLCORE_API std::string getString( void ) const;
+
+    protected:
+        //! @brief Used by child classes to initialize their own parameters
+        ARLCORE_API unsigned int init( const std::string[], const boost::any[], unsigned int nb );
+
+        //! @brief Used by child classes to initialize their own parameters from a file which name is m_paramFile
+        ARLCORE_API unsigned int load( void );
+
+    private:
+        //! @brief Clear all tables (i.e. before loading parameters)
+        void clear( void );
+
+        //! @brief Index from a name if it's exists
+        bool getIndex( const std::string &name, unsigned int &index ) const;
+
+        //! @brief Name of the file of parameters
+        std::string m_paramFile;
+
+        //! @brief Name of the list of parameters
+        std::string m_name;
+
+        //! @brief Description of each parameter
+        std::vector<std::string> m_paramNames;
+
+        //! @brief Values of each parameter
+        std::vector<boost::any> m_paramValues;
+
+        //! @brief Default values of each parameter
+        std::vector<boost::any> m_paramDefaults;
+
+        //! @brief Default values of each parameter
+        std::map< std::string, unsigned int > m_index ;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_PARAMETERS_H
diff --git a/SrcLib/ARLcore/include/arlcore/Particle.h b/SrcLib/ARLcore/include/arlcore/Particle.h
new file mode 100644
index 0000000..488234a
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Particle.h
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_PARTICLE_H
+#define _ARLCORE_PARTICLE_H
+#include <arlcore/Common.h>
+
+#include <string>
+#include <arlcore/PlaneSystem.h>
+
+namespace arlCore
+{
+    class ARLCORE_CLASS_API Particle : public Object
+    {
+    /**
+     * @class   Particle
+     * @date    2007
+     * @brief   Basic class that represents an object in space
+     */
+    public:
+        /**
+        * @brief Création of a particle that have its own frame in the universe
+        * The identity ID of the frame can be got using getPlane()
+        * The frame name is initialized with planeName
+        */
+        ARLCORE_API Particle( PlaneSystem &universe, const std::string &planeName="" );
+
+        //! @brief Constructor by copy
+        ARLCORE_API Particle( const Particle& );
+
+        //! @brief Affectation
+        ARLCORE_API Particle& operator=( const Particle& );
+
+        //! @brief Destruction de la particule avec libération du repère dans l'univers
+        ARLCORE_API virtual ~Particle( void );
+
+        //! @return Name of the particle
+        ARLCORE_API std::string getName( void ) const;
+
+        //! @return Description textuelle de la particule
+        ARLCORE_API virtual std::string getString( void ) const;
+
+        //! @return Référence sur l'univers qui contient la particule
+        ARLCORE_API PlaneSystem& getPlaneSystem( void ) const;
+
+        //! @return ID du repère de la particule dans l'univers
+        ARLCORE_API unsigned int getPlane( void ) const;
+
+    private:
+        // Univers dans lequel la particule est plongée
+        PlaneSystem &m_universe;
+
+        // ID du repère de la particule dans l'univers
+        unsigned int m_plane;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_PARTICLE_H
diff --git a/SrcLib/ARLcore/include/arlcore/PlaneSystem.h b/SrcLib/ARLcore/include/arlcore/PlaneSystem.h
new file mode 100644
index 0000000..1d2c0f9
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/PlaneSystem.h
@@ -0,0 +1,316 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_PLANE_SYSTEM_H
+#define _ARLCORE_PLANE_SYSTEM_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+
+#include <arlcore/Object.h>
+#include <arlcore/MatrixR.h>
+
+namespace arlCore
+{
+    class PlaneSystem : public Object
+    {
+    /**
+     * @class   PlaneSystem
+     * @date    2007
+     * @brief   Ensemble de reperes cartesiens lies par des transformations rigides
+     */
+    public:
+        //! Constant Used to reference unknown plane
+        ARLCORE_API static const unsigned int NoPlane;
+
+        //! @brief Create an empty PlaneSystem
+        ARLCORE_API PlaneSystem( const std::string &name="" );
+
+        //! @brief Destructor
+        ARLCORE_API ~PlaneSystem( void );
+
+        //! @return Description of the current plane system
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @brief Save the planeSystem : Not yet implemented
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Load a planeSystem : Not yet implemented
+        ARLCORE_API bool load( const std::string &fileName );
+
+        //! @brief Save graph of planeSystem for a graphviz visualization
+        ARLCORE_API unsigned int saveGraph( const std::string& ) const;
+
+        //! @brief Run a graphviz visualization
+        ARLCORE_API unsigned int printGraph( void ) const;
+
+        //! @brief Add the 3D plane in the PlaneSystem and return its ID [1,..[
+        ARLCORE_API unsigned int add3DPlane( const Object &o );
+        ARLCORE_API unsigned int add3DPlane( const std::string &s="" );
+        ARLCORE_API bool setPlaneName( unsigned int plane, const std::string &s );
+
+        //! @brief Release an anused plane in the graph
+        ARLCORE_API bool releasePlane( unsigned int plane );
+
+        //! @return The number of 3D planes in the PlaneSystem
+        ARLCORE_API unsigned int getNbPlanes( void ) const;
+
+        //! @return status of a plane number
+        ARLCORE_API bool getPlaneStatus( unsigned int plane ) const;
+
+        //! @return The ID of the 3D plane with the name [1,..[
+        ARLCORE_API bool getPlaneID( std::string name, unsigned int &ID ) const;
+
+        //! @return The name of the 3D plane  with the ID [1,..[
+        ARLCORE_API bool getPlaneName( unsigned int ID, std::string &name ) const;
+
+        //! @return Weight of the transformation at index
+        ARLCORE_API double getWeight( unsigned int index ) const;
+
+        //! @return Weight of the transformation (or inverse)
+        ARLCORE_API double getWeight( unsigned int plane1, unsigned int plane2 ) const;
+
+        /**
+        * @brief If it exists, set T with the transformation from Plane1 to Plane2
+        * @remark The age of the transformation is these of the older transformation in the path
+        */
+        ARLCORE_API bool getTrf( unsigned int Plane1, unsigned int Plane2, vnl_rigid_matrix &T, bool verbose=false );
+
+        /**
+        * @brief If it exists, set T with the transformation from Plane1 to Plane2
+        * If ageT is the age of the transformation and ageU, the age of the universe
+        * ageU-ageT should be lesser or equal than ageTolerance else return false
+        * @param[in] ageTolerance in milliseconds (ms). If <0.0, equivalent to infinity
+        * @remark If ageTolerance = 0, getTrf returns true only if the age of the transformation is exactly these of the planesystem
+        */
+        ARLCORE_API bool getTrf( unsigned int Plane1, unsigned int Plane2, vnl_rigid_matrix &T, double ageTolerance, bool verbose=false );
+
+        /**
+        * @brief If it exists, set T with the transformation from Plane1 to Plane2
+        * If ageT is the age of the transformation and ageR, the age composed with date and time
+        * ageR-ageT should be lesser or equal than ageTolerance
+        * @param[in] ageTolerance in milliseconds (ms)
+        * @remark If ageTolerance = 0, getTrf returns true only if the age of the transformation is exactly (date,time)
+        */
+        ARLCORE_API bool getTrf( unsigned int Plane1, unsigned int Plane2, vnl_rigid_matrix &T, long int date, long int time, double ageTolerance=0, bool verbose=false );
+
+        //! @brief Set the transformation from Plane1 and Plane2
+        ARLCORE_API bool setTrf( unsigned int plane1, unsigned int plane2, const vnl_rigid_matrix& T );
+
+        //! @brief Set and date the transformation from Plane1 and Plane2
+        ARLCORE_API bool setTrf( unsigned int Plane1, unsigned int Plane2, const vnl_rigid_matrix& T, long int date, long int time );
+
+        //! @brief Set to identity  and date the transformation from Plane1 and Plane2
+        ARLCORE_API bool setIdentity( unsigned int Plane1, unsigned int Plane2, const long int date=0, const long int time=0 );
+
+        //! @brief Reset the transformation from Plane1 and Plane2 and its inverse
+        ARLCORE_API bool resetTrf( unsigned int Plane1, unsigned int Plane2 );
+
+        //! @brief Reset all transformation around Plane
+        ARLCORE_API bool resetTrf( unsigned int Plane );
+
+        //! @return Distance between origins of Plane1 and Plane2, if the transformation exists
+        ARLCORE_API bool distance( unsigned int Plane1, unsigned int Plane2, double &dist/*, long int &date, long int &time*/ );
+
+        //! @brief Set pt2 with the coordinates in Plane2 of pt1 set in Plane1
+        ARLCORE_API bool chgPlane( unsigned int Plane1, CSPTR( Point ) pt1, unsigned int Plane2, SPTR( Point ) pt2);
+
+        //! @brief Set pt with the origin of Plane1 in the Plane2
+        ARLCORE_API bool getOrigin( unsigned int Plane1, unsigned int Plane2, SPTR( Point ) pt);
+
+    private:
+        class Path
+        {
+        /**
+        * @class    Path
+        * @date     04/2008
+        * @brief    Chemin dans un planesystem
+        */
+        public:
+            //! @brief Constructor
+            ARLCORE_API Path( const PlaneSystem& );
+
+            //! @brief Default constructor
+            ARLCORE_API Path( const Path& );
+
+            //! @brief Destructor
+            ARLCORE_API ~Path( void );
+
+            //! @return ith plane of the path else 0
+            ARLCORE_API unsigned int operator[]( unsigned int i ) const;
+
+            //! @brief Print the path
+            ARLCORE_API void print( void ) const;
+
+            //! @brief Number of planes in the path
+            ARLCORE_API unsigned int size( void ) const;
+
+            //! @brief Weight of the path (Sum of the Transformation's weight)
+            ARLCORE_API double weight( void ) const;
+
+            //! @brief Add a new plane and return the length
+            ARLCORE_API unsigned int push_back( unsigned int plane );
+
+            //! @brief Remove last plane and return if it was possible
+            ARLCORE_API bool pop_back( void );
+
+        private:
+            const PlaneSystem& m_universe;
+            std::vector< unsigned int > m_planes;
+            std::vector< double > m_weights;
+            double m_weight;
+        };
+
+        /**
+        * @brief States for each transformation
+        * STATE_UNDEFINED   : Transformation is undefined
+        * STATE_IDENTITY    : Identity
+        * STATE_CALIBRATION : Transformation is set by a user throw setTrf() at time(0,0)
+        * STATE_SET         : Transformation is set by a user throw setTrf() at a real time
+        * STATE_COMPUTED    : Transformation is deducted by the planesystem
+        */
+        enum ARL_PLANE_STATE { STATE_UNDEFINED, STATE_IDENTITY, STATE_CALIBRATION, STATE_SET, STATE_COMPUTED, NBSTATES };
+
+        /**
+        * @brief Mark the transformation in the direction Plane1 to Plane2
+        * @remark Tags used to mark the transformations which are in a path
+        * to solve a problem of cyclic path
+        */
+        void tag( unsigned int Plane1, unsigned int Plane2 );
+
+        //! @brief Untag the transformations Plane1 to Plane2
+        void untag( unsigned int Plane1, unsigned int Plane2 );
+
+        //! @return True if the transformation at index is tagged
+        bool isTagged( unsigned int index ) const;
+
+        //! @return True if the transformation Plane1 to Plane2 is tagged
+        bool isTagged( unsigned int Plane1, unsigned int Plane2 ) const;
+
+        //! @brief Untag all transformations of the universe
+        void untagAll( void );
+
+        //! @return untagged status at the index
+        ARL_PLANE_STATE getStatus( unsigned int index ) const;
+
+        //! @return untagged status at the index
+        ARL_PLANE_STATE getStatus( unsigned int Plane1, unsigned int Plane2 ) const;
+
+        //! @return True if Plane1 & 2 exist in the universe
+        bool outOfRange( unsigned int Plane1, unsigned int Plane2 ) const;
+
+        //! @return True if Plane exists in the universe
+        bool outOfRange( unsigned int Plane ) const;
+
+        //! @return The index in the table for the transformations from Plane1 to Plane2
+        unsigned int getIndex( unsigned int Plane1, unsigned int Plane2 ) const;
+
+        //! @return The index for the inverse transformation in the table
+        unsigned int getInvIndex( unsigned int index ) const;
+
+        /**
+        * @brief Find the path between Plane1 & Plane2 : Path get the list of all intermediate planes
+        * @return True if the path is found else false
+        * @remark Only transformations with correct date are considered except if date-time==0
+        * In this case, all valid transformations are considered
+        */
+        //bool findPath( unsigned int Plane1, unsigned int Plane2, std::vector< unsigned int > &path, long int date, long int time);
+        bool findPath( unsigned int Plane1, unsigned int Plane2, Path &path, long int date, long int time);
+
+        //! @brief NoPlaneDestination with its weight (for whoIsConnected)
+        typedef std::pair<unsigned int, double> PlaneWeight;
+
+        /**
+        * @brief Find all close neighbour planes of Plane which have a valid date-time
+        * @return The number of neigbour
+        */
+        unsigned int whoIsConnected( unsigned int connectedAt, unsigned int finalDestination, std::vector<PlaneWeight> &Planes, long int date, long int time, bool SetInv=false, bool Tag=false);
+
+        /**
+        * @brief Are two planes connected to each other at a specific time ?
+        *
+        * @param[in] plane1 Origin plane
+        * @param[in] plane2 Destination plane
+        * @param[in] SetInv Compute the inverse if set
+        * @param[in] Tag Tag the path if set
+        *
+        * @return true if the process has been a success.
+        *
+        * @remark Is there a transformation between the 2 planes Plane1->Plane2 ?
+        * Return true if there is a transformation in the direction Plane2->Plane1
+        * If SetInv is true, Plane1->Plane2 is computed as the inverse of Plane2->Plane1
+        * with the same state as Plane2->Plane1
+        * If Tag is true, the path is tagged
+        */
+        bool isConnected( unsigned int Plane1, unsigned int Plane2, long int date, long int time, bool SetInv=false, bool Tag=false);
+
+        //! @brief Set the transformation at index
+        bool setTrf( unsigned int index, const vnl_rigid_matrix& T, long int date, long int time );
+
+        //! @brief Compute the transformation between the first and the last of path
+        //bool setTrf( const std::vector< unsigned int > &path );
+        bool setTrf( const Path &path );
+
+        //! @brief Reset all deduced transformations related to the transformation at the index
+        void eraseComputedTrf( unsigned int index );
+
+        //! @brief List of matrix of all transformations between all planes. The diag is not used.
+        std::vector< vnl_rigid_matrix > m_trfTable;
+
+        //! @brief List of states of the transformations. The diag is not used.
+        std::vector<ARL_PLANE_STATE> m_trfState;
+
+        //! @brief List of states of the transformations. The diag is not used.
+        std::vector<double> m_trfWeight;
+
+        //! @brief List of names of each plane
+        std::vector<std::string> m_lstName;
+
+        //! @brief Status for each plane. True, if valid, false if it's released
+        std::vector<bool> m_status;
+        std::vector<unsigned int> m_releasedPlanes;
+    };
+
+    class TransformationFilter
+    {
+    public:
+        /**
+         * @brief Constructor
+         * @param[in] duration Duration of filter in milliseconds
+         * @param[in] type Filter type
+         */
+        ARLCORE_API TransformationFilter( const PlaneSystem&, long int duration, ARLCORE_TRF_FILTER_TYPE );
+
+        //! @brief Copy constructor
+        ARLCORE_API TransformationFilter( const TransformationFilter& );
+
+        //! @brief Destructor
+        ARLCORE_API ~TransformationFilter( void );
+
+        //! @brief Add a new transformation
+        ARLCORE_API void push_back( const vnl_rigid_matrix& );
+
+        //! @return Filtered transformation
+        ARLCORE_API unsigned int get( arlCore::vnl_rigid_matrix& );
+
+    private:
+        /**
+         * @brief Delete too old transformations
+         * @param[in] all if true, test all transformations else just the last
+         */
+        void timeCleaning( bool all=false );
+
+        void clear( void );
+
+        const PlaneSystem& m_universe;
+        long int m_duration;
+        long int m_lastTime;
+        ARLCORE_TRF_FILTER_TYPE m_filterType;
+        std::vector<const vnl_rigid_matrix*> m_trfList;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_PLANE_SYSTEM_H
diff --git a/SrcLib/ARLcore/include/arlcore/Player.h b/SrcLib/ARLcore/include/arlcore/Player.h
new file mode 100644
index 0000000..9b59646
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Player.h
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARL_PLAYER_H
+#define _ARL_PLAYER_H
+#include <arlcore/Common.h>
+
+#include <string>
+#include <fstream>
+
+namespace arlCore
+{
+    class Player
+    {
+    /**
+     * @class   Player
+     * @date    04/2008
+     * @brief   Abstract class for Player devices
+     */
+    public:
+        //! @brief Constructor
+        ARLCORE_API Player( void );
+
+        //! @brief Destructor
+        ARLCORE_API ~Player( void );
+
+        //! @return true if the player is ready
+        ARLCORE_API bool readyPlayer( void );
+
+        //! @return Number of recording that are read 
+        ARLCORE_API unsigned int initPlayer( const std::string &fileName );
+
+        //! @brief Return the complete path and the name of the header file 
+        ARLCORE_API bool getPlayerFilename( std::string &fileName );
+
+        //! @brief If true, do it again from the file beginning, once the end has been reached
+        ARLCORE_API bool setLoop( bool=true );
+
+        //! @return Return true if the file end has been reached
+        ARLCORE_API bool getEOF( void ) const;
+
+    protected:
+        virtual bool readHeader( const std::string &fileName )=0;
+        virtual unsigned int playNext( void )=0;
+
+        /**
+         * @brief A appeler En fin de fichier ou en cas d'anomalie
+         * @return Nombre d'enregistrements lus
+         */
+        ARLCORE_API unsigned int playEnd( void );
+        ARLCORE_API unsigned int setEOF( unsigned int n );
+        ARLCORE_API bool goAfterHeader( void );
+
+        std::string m_playerDirectory;
+        std::string m_playerFullName;
+        std::fstream m_playerHandle;
+
+    private:
+        long int m_afterHeader;
+        bool m_isReady;
+        bool m_eof;
+        bool m_loop;
+    };
+} // namespace ARLCORE
+#endif // _ARL_PLAYER_H
diff --git a/SrcLib/ARLcore/include/arlcore/Point.h b/SrcLib/ARLcore/include/arlcore/Point.h
new file mode 100644
index 0000000..40e9611
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Point.h
@@ -0,0 +1,364 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_POINT_H
+#define _ARLCORE_POINT_H
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <vnl/vnl_vector.h>
+#include <vnl/vnl_vector_fixed.h>
+#include <vnl/vnl_matrix.h>
+
+#include <fwTools/Object.hpp>
+
+#include <arlcore/Common.h>
+#include <arlcore/Object.h>
+#include <arlcore/Colour.h>
+#include <arlcore/vnl_covariance_matrix.h>
+
+namespace arlCore
+{
+    enum ARLCORE_POINT_SAVE_TYPE { ARLCORE_POINT_SAVE_FULL, ARLCORE_POINT_SAVE_LIGHT, ARLCORE_POINT_SAVE_GNUPLOT, ARLCORE_POINT_SAVE_VTK };
+
+    enum ARLCORE_SHAPE { ARLCORE_SHAPE_UNKNOWN, ARLCORE_SHAPE_CUBE, ARLCORE_SHAPE_SPHERE, ARLCORE_SHAPE_SPHERESURFACE, ARLCORE_SHAPE_SPHERE_CAP, ARLCORE_SHAPE_DISC,
+         ARLCORE_SHAPE_PLAINSQUARE, ARLCORE_SHAPE_CIRCLE, ARLCORE_SHAPE_EDGESQUARE, ARLCORE_SHAPE_SOLIDANGLE, ARLCORE_SHAPE_SOLIDANGLE_SURFACE, ARLCORE_SHAPE_CHESSBOARD, ARLCORE_SHAPE_NBSHAPES };
+    static std::string ARLCORE_SHAPE_NAMES[ARLCORE_SHAPE_NBSHAPES]={ "ARLCORE_SHAPE_UNKNOWN", "ARLCORE_SHAPE_CUBE", "ARLCORE_SHAPE_SPHERE", "ARLCORE_SHAPE_SPHERESURFACE", "ARLCORE_SHAPE_SPHERE_CAP", "ARLCORE_SHAPE_DISC", "ARLCORE_SHAPE_PLAINSQUARE", "ARLCORE_SHAPE_CIRCLE",
+         "ARLCORE_SHAPE_EDGESQUARE", "ARLCORE_SHAPE_SOLIDANGLE", "ARLCORE_SHAPE_SOLIDANGLE_SURFACE",", ARLCORE_SHAPE_CHESSBOARD"};
+
+    class Point : public  Object
+    {
+    /**
+     * @class   Point
+     * @date    2007
+     * @brief   Point with a dimension that can be specified by the user. This class allows
+     * to attribute several important properties to a point. Generally, these properties
+     * are used in image processing algorithms:
+     * - coordinates : corresponds to the N coordinates of the point
+     * - type : corresponds to what the point physically represents in the world. This can be
+     * a radio-opaque markers, a point detected from a structured light pattern, a point
+     * from an ARToolkit pattern...
+     * - confidence : in the case you are detecting points in an image and you want to associate
+     * a confidence value about its detection
+     * - status : gives an information on how the point life when the software is running
+     * - covariance matrix : you can associate a covariance matrix with to the point. This is
+     * very useful for registration alogrithm that takes into account the uncertainty on the point
+     * detection/reconstruction
+     * - visibility : when you are tracking a chessboard for example, this boolean can help you
+     * to indicate which point of the chessboard are visible or not. Then, you can select
+     * very easily the visible points only in your algorithms
+     */
+    public:
+
+
+        fwCoreClassDefinitionsWithNFactoriesMacro( (Point)(::fwTools::Object),
+                                                   ((::boost::make_shared< Point > ,() ))
+                                                   ((PointFactory ,((Point::csptr)) ))
+                                                   ((PointFactory ,((int)) ))
+                                                   ((PointFactory ,((double)) ((double)) ))
+                                                   ((PointFactory ,((double)) ((double)) ((double)) ))
+                                                   );
+
+        ARLCORE_API static Point::sptr PointFactory( Point::csptr p );
+        ARLCORE_API static Point::sptr PointFactory( int );
+        ARLCORE_API static Point::sptr PointFactory( double x, double y );
+        ARLCORE_API static Point::sptr PointFactory( double x, double y, double z );
+
+
+        /******* VAG transpose from Object ****/
+        //! @return Is the object OK ? VAG transpose from inheritance of Object
+        ARLCORE_API bool isOK( void ) const;
+        ARLCORE_API bool setOK( bool b=true );
+
+        //! @brief Setup 'updateIndex' if an extern modification occurs
+        ARLCORE_API void update( void );
+
+        //! @brief Type of point (Origin)
+        enum ARLCORE_POINT_TYPE { ARLCORE_POINT_TYPE_UNKNOWN, ARLCORE_POINT_TYPE_ARTK, ARLCORE_POINT_TYPE_MRO, ARLCORE_POINT_TYPE_CHESS, ARLCORE_POINT_TYPE_ROI, ARLCORE_POINT_TYPE_CLOUD, ARLCORE_POINT_TYPE_TIP, ARLCORE_POINT_TYPE_TOP, ARLCORE_POINT_TYPE_LINE, ARLCORE_POINT_TYPE_SIFT, ARLCORE_POINT_NBTYPES };
+
+        //! @brief Status of the point (Evolution)
+        enum ARLCORE_POINT_STATUS { ARLCORE_POINT_STATUS_UNKNOWN, ARLCORE_POINT_STATUS_DETECTED, ARLCORE_POINT_STATUS_SUBPIXEL, ARLCORE_POINT_STATUS_ESTIMATE, ARLCORE_POINT_STATUS_CLOUD, ARLCORE_POINT_REPROJECTION, ARLCORE_POINT_NBSTATUS };
+
+        //! @brief Constructor
+        ARLCORE_API Point( unsigned int dimension=3, ARLCORE_POINT_TYPE type=ARLCORE_POINT_TYPE_UNKNOWN, long int date=0, long int time=0 );
+
+        //! @brief 2D point constructor
+        ARLCORE_API Point( double x, double y, ARLCORE_POINT_TYPE type=ARLCORE_POINT_TYPE_UNKNOWN, long int date=0, long int time=0 );
+
+        //! @brief 3D point constructor
+        ARLCORE_API Point( double x, double y, double z, ARLCORE_POINT_TYPE type=ARLCORE_POINT_TYPE_UNKNOWN, long int date=0, long int time=0 );
+
+        //! @brief Copy constructor
+        ARLCORE_API Point( CSPTR( Point )  );
+
+        /**
+        * @brief Initialization : Set default value
+        * To change the dimension, you have to reinitialize the point with the new dimension
+        */
+        ARLCORE_API void init( unsigned int dim );
+
+        //! @brief Affectation
+        ARLCORE_API Point& operator=(CSPTR( Point ) );
+
+        //! @brief Copy p in the current point
+        ARLCORE_API void copy( CSPTR( Point )  p );
+
+        //! @brief Destructor
+        ARLCORE_API virtual ~Point( void );
+
+        //! @return Description of the current point
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @brief Save the current point
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Add the current point into an PointList open file stream
+        ARLCORE_API bool save( std::fstream &f, unsigned no=0, ARLCORE_POINT_SAVE_TYPE=ARLCORE_POINT_SAVE_FULL ) const;
+
+        //! @brief Add the current point into a SmartPointList open file stream
+        ARLCORE_API bool save( std::fstream &f, unsigned int cam,  SPTR(void) videoTag , int fringe ) const;
+
+        //! @brief Load a point
+        ARLCORE_API bool load( const std::string &fileName );
+
+        //! @brief Load a point from an open file stream
+        ARLCORE_API bool load( std::ifstream &f, int &no, unsigned int dim=0 );
+
+        //! @brief Load a point from an open SmartPointList file stream
+        ARLCORE_API bool load( std::ifstream &f, unsigned int &cam,  SPTR(void) tag, int &fringe );
+
+        //! @return Is the point visible?
+        ARLCORE_API bool isVisible() const;
+
+        //! @return Is the point visible?
+        ARLCORE_API bool getVisible() const;
+
+        //! @brief Set the visibility of the point
+        ARLCORE_API bool setVisible( bool );
+
+        //! @return Status of the point for internal or special usage
+        ARLCORE_API ARLCORE_POINT_STATUS getStatus() const;
+
+        //! @brief Set the status of the point
+        ARLCORE_API bool setStatus(ARLCORE_POINT_STATUS);
+
+        //! @brief Set the colour of the point
+        ARLCORE_API bool setColour(unsigned int r, unsigned int g, unsigned int b);
+
+        //! @brief Set the colour of the point
+        ARLCORE_API bool setColour(const Colour &c);
+
+        //! @return The colour of the point
+        ARLCORE_API bool getColour(unsigned int &r, unsigned int &g, unsigned int &b) const;
+
+        //! @return The colour of the point
+        ARLCORE_API bool getColour(const Colour &c) const;
+
+        //! @return The colour of the point
+        ARLCORE_API const Colour& getColour( void ) const;
+
+        //! @return Is the point colored ?
+        ARLCORE_API bool isColored() const;
+
+        // Accesses coordinates of the point
+        //! @return Value of the ième coordinate
+        ARLCORE_API double get( unsigned int i ) const;
+
+        //! @brief Set the ième coordinate with v
+        ARLCORE_API bool set( unsigned int i, double v );
+
+        //! @brief Set the current point with p if it has the same dimension
+        ARLCORE_API bool set( CSPTR( Point )  p );
+
+        //! @brief Fill all coordinates with v
+        ARLCORE_API void fill( double v );
+
+        /**
+        * @brief TODO Modifie la valeur du point en l'équipondérant avec p et les précédentes pondérations
+        * Pondérer n points à partir d'un point nul revient à calculer le point moyen
+        * @remark Utiliser set pour réinitialiser une nouvelle valeur non pondérée
+        */
+        ARLCORE_API bool pond( CSPTR( Point )  p );
+
+        /**
+        * @return Reference on statistic vector for each coordinates when using pond function
+        * @remark Use computeStat on each returned vector to extract statistic informations
+        */
+        ARLCORE_API const std::vector< vnl_vector_fixed<double,5> > &getStatistic( void );
+
+        //! @brief Ajoute les coordonnées du point p au point courant
+
+        ARLCORE_API bool add( CSPTR( Point )  p );
+
+        //! @return Value of the i th coordinate [0,size-1]
+        ARLCORE_API double operator[]( unsigned int i ) const;
+
+        //! @return 1st coordinate
+        ARLCORE_API double x( void ) const;
+
+        //! @return 2nd coordinate (0 if point dimension is below 2)
+        ARLCORE_API double y( void ) const;
+
+        //! @return 3rd coordinate (0 if point dimension is below 3)
+        ARLCORE_API double z( void ) const;
+
+        //! @brief Modify the 1st coordinate
+        ARLCORE_API bool x( double );
+
+        //! @brief Modify the 2nd coordinate
+        ARLCORE_API bool y( double );
+
+        //! @brief Modify the 3rd coordinate
+        ARLCORE_API bool z( double );
+
+        //! @return Return coordinates under vnl format
+        ARLCORE_API vnl_vector<double> getCoordinates() const;
+
+        //! @return Return homogeneous coordinates under vnl format
+        ARLCORE_API vnl_vector<double> getHCoordinates() const;
+
+        ARLCORE_API vnl_covariance_matrix& getCovMatrix();
+        ARLCORE_API const vnl_covariance_matrix& getCovMatrix() const;
+
+        //! @return Dimension of the point
+        ARLCORE_API unsigned int size( void ) const;
+
+        //! @return Return point type
+        ARLCORE_API ARLCORE_POINT_TYPE getType( void ) const;
+
+        //! @return Affecte le type du point
+        ARLCORE_API bool setType( ARLCORE_POINT_TYPE );
+
+        //! @return Return scalar associated to the point
+        ARLCORE_API double getScalar( void ) const;
+
+        //! @brief Modify scalar associated to the point
+        ARLCORE_API void setScalar( double );
+
+        //! @brief Normalize the point as a vector
+        ARLCORE_API void normalize( void );
+
+        //! @return Distance between *this and p if the dimension are the same
+        ARLCORE_API double distance( CSPTR( Point )  ) const;
+
+        //! @return Squared distance between *this and p if the dimension are the same
+        ARLCORE_API double distance2( CSPTR( Point )  ) const;
+
+        //! @brief Multiply each point coordinate with a scalar
+        ARLCORE_API bool mult( double scalaire );
+
+        //! @brief Compute the cross product of two 3D vectors and put the result in *this : *this = vec1 x vec2
+        ARLCORE_API bool cross_3D( CSPTR( Point )  vec1, CSPTR( Point )  vec2 );
+
+        //! @brief Dot product of 2 vectors : *this = vec1^T x vec2. *this is of dimension 1 ! (covariance matrix is computed as well)
+        ARLCORE_API bool dotProduct( CSPTR( Point )  vec1, CSPTR( Point )  vec2 );
+
+        //! @brief Point 1D = var1/var2 with computation of the covariance matrix
+        ARLCORE_API bool divide( CSPTR( Point )  var1, CSPTR( Point )  var2 );
+
+        //! @brief *this =  multiplication of a scalar (1D) with a vector vec (covariance matrix is computed as well)
+        ARLCORE_API bool multiply( CSPTR( Point )  scalar, CSPTR( Point )  vec );
+
+        // Stochastic and noised point
+        //! @brief Add a gaussian random noise with a std deviation (std) on the corrdinate 'index' of Point
+        ARLCORE_API bool addGaussianNoise( const unsigned int index, const double std );
+
+        //! @brief Add a gaussian random noise with a std deviation (std) on all coordinates
+        ARLCORE_API bool addGaussianNoise( const double std );
+
+        /**
+        * @brief Add a uniform random noise with a std deviation (std) on the corrdinate 'index' of Point
+        * The random variable is taken in the interval [-radius ; +radius]
+        */
+        ARLCORE_API void addUniformNoise( const unsigned int index, const double radius );
+
+        /**
+        * @brief Random creation of a point in a specified shape which is centred on *this
+        * For squared shape, the faces of the cube or the sides of the square are parallel to the axis
+        * Most of the function work whatever dimension the point has
+        * Planar shape have last cordinates to 0 (if dimension is above 3, then the point belongs to an hyperplan)
+        * @param size = Diameter of the sphere/circle or  Side of the cube/square or max value of the solid angle
+        * Below are indicated the possible shape:
+        * ARLCORE_SHAPE_CUBE
+        * ARLCORE_SHAPE_SPHERE
+        * ARLCORE_SHAPE_DISC
+        * ARLCORE_SHAPE_PLAINSQUARE
+        * ARLCORE_SHAPE_CIRCLE
+        * ARLCORE_SHAPE_EDGESQUARE
+        * ARLCORE_SHAPE_SOLIDANGLE : a random point in a solid angle oriented along the positiv Z axis
+        * According to the spherical coordinate system it chooses a point with r<size, 0< theta<2Pi,  0<phi<phi_max where
+        * phi_max = acos(1-omega/2/Pi). Here omega is the solid angle given in parameter of the function.
+        * ARLCORE_SHAPE_SOLIDANGLE_SURFACE : same as before but the point is randomly chosen on the surface cone
+        * corresponding to the solid angle
+        * ARLCORE_SHAPE_SPHERESURFACE : a random point on the surface of a sphere of radius size
+        * ARLCORE_SHAPE_SPHERE_CAP : a solid angle is defined along the positiv Z axis (the parameter
+        * of the solid angle is "angle"). A random point is chosen on the sphere cap of the solid angle
+        */
+        ARLCORE_API bool shapeRandom( ARLCORE_SHAPE, const double size, const double angle=0 );
+
+        ARLCORE_API void setError( double error );
+        ARLCORE_API double getError( void ) const;
+
+    private:
+        //! @brief Add the current point into an open file stream (PointList or SmartPointList)
+        ARLCORE_API bool save( std::fstream &f, bool ctf, unsigned int cam, SPTR(void) tag, int fringe, unsigned no, ARLCORE_POINT_SAVE_TYPE type ) const;
+
+        //! @brief Load a point from an open file stream (PointList or SmartPointList)
+        ARLCORE_API bool load( std::ifstream &f, unsigned int &cam, SPTR(void) tag, int &fringe, int &no, unsigned int dim=0 );
+
+        //! @brief Initialization to zero of the uncertainty matrix
+        bool initUncertainty( void );
+
+        ARLCORE_POINT_TYPE m_type;
+        double m_confidence;
+        bool m_visibility;
+        ARLCORE_POINT_STATUS m_status;
+        double m_scalar;
+
+        bool m_isColored;
+        Colour m_colour;
+
+        vnl_vector<double> m_coordinates;
+
+        double m_ponderation;
+        std::vector< vnl_vector_fixed<double,5> > m_stat;
+
+        // Erreur à la création du point
+        // 2D : Différence subpixel / 1ere estimation
+        // 3D : reconstruction
+        double m_error;
+
+        // Symmetric square matrix : anisotropic uncertainties
+        vnl_covariance_matrix m_covMatrix;
+
+        bool m_ok;//VAG
+    };
+
+    //! @return Distance between pt1 and pt2
+    ARLCORE_API double distance( CSPTR( Point ) pt1, CSPTR( Point ) pt2 );
+
+    /**
+    * @brief Si l est trié par y croissant, retourne l'indice du point de l dont l'ordonnée est la plus proche de y
+    * @param[in] indexInit Indice d'initialisation ou -1 s'il est inconnu
+    */
+    ARLCORE_API unsigned int closestY ( const std::vector< arlCore::Point::csptr >& l, double y, unsigned int index1=0, unsigned int index2=0, int indexInit=-1 );
+
+    /**
+    * @return Surface formée par les points.
+    * Très mal approximée par la somme des distances de tous les points
+    */
+    ARLCORE_API double surface( const std::vector< arlCore::Point::csptr >& );
+
+    // TODO Suppress PointsCont and replace them with PointsList
+//  typedef std::vector<Point> PointsCont;
+//  ARLCORE_API unsigned int load( PointsCont &list, const char *fileName, Point::ARLCORE_POINT_TYPE type = Point::ARLCORE_POINT_TYPE_UNKNOWN, long int date=0 );
+
+} // namespace arlCore
+#endif // _ARLCORE_POINT_H
diff --git a/SrcLib/ARLcore/include/arlcore/PointsList.h b/SrcLib/ARLcore/include/arlcore/PointsList.h
new file mode 100644
index 0000000..7535b0d
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/PointsList.h
@@ -0,0 +1,343 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_POINTLIST_H
+#define _ARLCORE_POINTLIST_H
+
+#include <boost/make_shared.hpp>
+
+#include <arlcore/Common.h>
+
+#include <vector>
+
+#include <vgl/vgl_plane_3d.h>
+#include <vgl/vgl_homg_plane_3d.h>
+
+#ifdef ANN
+#include <ANN/ANN.h>
+#endif // ANN
+
+//#include <arlcore/Mutex.h>
+#include <arlcore/Point.h>
+#include <arlcore/MatrixR.h>
+
+#include <fwCore/macros.hpp>
+#include <fwTools/Object.hpp>
+
+
+namespace arlCore
+{
+    enum ARLCORE_SCE { ARLCORE_SCE_UNKNOWN, ARLCORE_SCE_ANALYTIC, ARLCORE_SCE_GEOMETRIC, ARLCORE_SCE_OPTIMIZATION, ARLCORE_SCE_4POINTS, ARLCORE_SCE_NBMETHOD };
+    static std::string ARLCORE_SCE_NAMES[ARLCORE_SCE_NBMETHOD]={ "ARLCORE_SCE_UNKNOWN", "ARLCORE_SCE_ANALYTIC", "ARLCORE_SCE_GEOMETRIC", "ARLCORE_SCE_OPTIMIZATION", "ARLCORE_SCE_4POINTS"};
+
+    //! Point container
+    /*!
+     * Points that are added to the contained must have the same dimension (by default 3)
+     *
+     */
+    class PointList : public  Object
+    {
+    /**
+     * @class   PointList
+     * @date    2007
+     * @brief   Point list with same dimensions. Added point are copied in the container.
+     * Point destruction are managed by PointList. This class has been created to manipulate
+     * easily a point list. Point list are used in most of registration algorithm (ISPPC, EPPC
+     * ICP, ARTAG).  You can find also some useful functions that provide you for example:
+     * - the best plane that fits your data
+     * - the best line that fits your data
+     * - decimation of the point cloud
+     * - a point cloud randomly chosen in a specific shape
+     * - if the points have been acquired on a surface that is a sphere, a function estimate
+     * the center of this sphere
+     * - other nice function...
+     */
+    public:
+
+
+        fwCoreClassDefinitionsWithNFactoriesMacro( (PointList)(::fwTools::Object),
+                                                   ((::boost::make_shared< PointList > ,() ))
+                                                   ((PointListFactory ,((int)) ))
+                                                   ((PointListFactory ,(( const std::vector< Point::csptr >&)) ))
+                                                 );
+        fwCoreAllowSharedFromThis();
+
+        ARLCORE_API static PointList::sptr PointListFactory( int );
+        ARLCORE_API static PointList::sptr PointListFactory( const std::vector< Point::csptr >& );
+
+        //! @brief Constructor : An empty list of points with dimension dim
+        ARLCORE_API PointList( unsigned int dim=3, const std::string &name="" );
+
+        //! @brief Copy constructor
+        ARLCORE_API PointList( const PointList& );
+
+        //! @brief Constructor with the list of points
+        ARLCORE_API PointList( const std::vector< Point::csptr >& list );
+
+        //! @brief Constructor : Fill the list of elements of 'l' which scalar is include in [scalarMin , scalarMax]
+        ARLCORE_API PointList( const std::vector< Point::csptr >& l, double scalarMin, double scalarMax );
+
+        //! @brief Affectation
+        ARLCORE_API PointList& operator=( const PointList& );
+
+        //! @brief Copy
+        ARLCORE_API void copy( const PointList& );
+
+        //! @brief Destructor
+        ARLCORE_API ~PointList( void );
+
+        ARLCORE_API std::string getString( void ) const;
+
+        /**
+         * @brief Save a file of points (arlPointList, gnuplot, .vtk)
+         * @remark See arlCore::ARLCORE_POINT_SAVE_TYPE
+         * @param[in] type Format of file
+         * @param[in] justVisible If true save just visible points else all of them
+         * @param[in] overwrite If true, overwrite file
+         */
+        ARLCORE_API bool save( const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type=ARLCORE_POINT_SAVE_FULL, bool justVisible=false, bool overwrite=true ) const;
+
+        /**
+         * @brief Load a file of points (arlPointList, .trian, .raw)
+         * @param[in] filename
+         * @param[in] step If .trian or .raw, reechantillonne les triangles avec un pas en mm
+         * @remark If step<=0, load only points of the triangle
+         */
+        ARLCORE_API bool load( const std::string &fileName, double step=0 );
+
+        //! @brief Fill the pointlist with origin of each transformation
+        ARLCORE_API unsigned int fill( const std::vector< arlCore::vnl_rigid_matrix >& );
+
+        //! @return Reference on the intern list of points
+        ARLCORE_API const std::vector< Point::sptr >& getList( void ) const;
+
+        //! @return A COPY PERF ?? VAG the intern list of points
+        ARLCORE_API const std::vector< Point::csptr > getListCopy( void ) const;
+
+        //! @return Reference on the ith point of the list
+        ARLCORE_API Point::sptr operator[]( unsigned int i );
+
+        //! @return Constant reference on the ith point of the list
+        ARLCORE_API Point::csptr operator[]( unsigned int i ) const;
+
+        //! @return Reference on the ith point of the list
+        ARLCORE_API Point::sptr get( unsigned int i );
+
+        //! @return Constant reference on the ith point of the list
+        ARLCORE_API Point::csptr get( unsigned int i ) const;
+
+        //! @return Reference on the last point of the list
+        ARLCORE_API Point::sptr back( void );
+
+        //! @return Constant reference on the last point of the list
+        ARLCORE_API Point::csptr back( void ) const;
+
+        //! @brief Push all points of l at the end of the current list
+        ARLCORE_API unsigned int push_back( CSPTR( PointList ) l );
+
+        //! @brief Push a point at the end of the list
+        ARLCORE_API bool push_back( CSPTR( Point) );
+
+        //! @brief Push the (x,y) 2D point at the end of the list
+        ARLCORE_API bool push_back( double x, double y );
+
+        //! @brief Push the (x,y,z) 3D point at the end of the list
+        ARLCORE_API bool push_back( double x, double y, double z );
+
+        //! @brief Delete the last point of the list
+        ARLCORE_API void pop_back( void );
+
+        //! @brief Clear the list and delete included points
+        ARLCORE_API void clear( void );
+
+        //! @brief Add a gaussian noise on all points of the list
+        ARLCORE_API unsigned int addGaussianNoise( double standardDeviation );
+
+        //! @return Dimension of the points of the list
+        ARLCORE_API unsigned int getDimension( void ) const;
+
+        /**
+         * @brief Set a new dimension of points if the list is empty
+         * @return False if the list is not empty
+         */
+        ARLCORE_API bool setDimension( unsigned int );
+
+        //! @return Number of points in the list
+        ARLCORE_API unsigned int size( void ) const;
+
+        //! @return Number of visible points in the list
+        ARLCORE_API unsigned int visibleSize( void ) const;
+
+#ifdef ANN
+        //! @brief Generate an ANNpointArray from the point list without the points 0
+        ARLCORE_API unsigned int generateANN( ANNpointArray& ) const;
+
+        // TODO : Use ANN kd_tree with ANNpointArray generated or updated
+#endif // ANN
+
+        /**
+         * @brief : Compute the bounding box of the point cloud, the gravity center and the min & max scalar
+         * boundingBox1 : Left inferior corner : Each minimum coordinates
+         * boundingBox2 : Right superior corner : Each maximum coordinates
+         * std : standard deviation of the point cloud
+         */
+        ARLCORE_API bool properties( SPTR(Point) gravity, SPTR(Point) boundingBox1, SPTR(Point) boundingBox2, double &minscalar, double &maxscalar, double  &std ) const;
+
+        /**
+         * @brief Find in the list the nearest point of pt
+         * pos : Position in the list of the found point
+         * distance : Distance between pt and the found point
+         * @return False if the list is empty
+         */
+        ARLCORE_API unsigned int findNearPoint( CSPTR(Point) pt, std::vector< unsigned int > &pos, double &distance, double scalar=-1.0 ) const;
+
+        /**
+         * @brief Return a point list randomly chosen in a specified shape
+         * param[in] nb : number of points you want
+         * param[in] type : shape in which the points will be chosen (see ARLCORE_SHAPE definition in Point.h)
+         * param[in] centre : Center of the shape
+         * param[in] size : Size of the shape
+         * param[in] angle : Angle of the shape or 0
+         * @return Number of generated points
+         * @remark See Point::shapeRandom for more details
+         */
+        ARLCORE_API unsigned int shapeRandom( unsigned int nb, ARLCORE_SHAPE type, CSPTR(Point) centre, const double size, const double angle=0 );
+
+        /**
+         * @brief The function randomly choose N points within the point list A and put them in *this
+         * param[in] A List you want to decimate
+         * param[in] n Number of point you want to keep
+         * @return Number of point in *this
+         */
+        ARLCORE_API unsigned int randomList( CSPTR( PointList ) A, unsigned int n );
+
+        /**
+         * @brief Compute the plane that best fits the points which m_scalar == scalar, if scalar = O,
+         * all the points are used. The method is based on an optimization. This should be improved
+         * using an SVD method (TODO ).
+         * Warning : Run only with 3D points
+         * @param[in] outliers = n = [0,1] Elimine n pourcent des points les plus loin, sauf au moins 3
+         * @param[out] rms Average distance between points and the computed plane
+         * @param[out] min Minimum distance between points and the computed plane
+         * @param[out] max Maximum distance between points and the computed plane
+         * @return Number of points used
+         */
+        ARLCORE_API unsigned int plane( vgl_plane_3d< double >& plane, double &rms, double &min, double &max, double scalar=0, double outliers=0.0 ) const;
+        ARLCORE_API unsigned int plane( vgl_homg_plane_3d< double >& plane, double &rms, double &min, double &max, double scalar=0, double outliers=0.0 ) const;
+
+        /**
+         * @brief From a cloud of 3D points that should be on a sphere cap
+         * this function estimate the sphere center
+         * @param[out] centerEstimation Result of the sphere center estimation
+         * @param[in] type 3 different methods : one is analytic, one is geometric and the last by optimization
+         * more explanations on the methods are provided in PointList.cpp
+         * @todo Compute the covariance on the estimation
+         */
+        ARLCORE_API bool sphereCenterEstimation( SPTR(Point) centerEstimation, double &radius, ARLCORE_SCE type, std::vector<double> &optimiser_parameter, std::vector<double> &log ) const;
+
+        /**
+         * @brief This method is used to estimate the center of a spheetre from several points on
+         * its surface. The method computes the circumcircle of a triangle and return
+         * 1) the center of this circle
+         * 2) the plane that contains this center
+         * The center of the sphere lies on the line that passes through the center of the circle
+         * and that is orthogonal to the plane
+         */
+        ARLCORE_API bool triangleCircumcircleOrthoLine( SPTR(Point)  centerEstimation, vgl_plane_3d< double > &trian_plane) const;
+
+        /**
+         * @brief This method computes from 2 lines (represented by the first (P1 P2) and second point pair (P3 P4) )
+         * the intersection. If the 2 lines does not intersect, it provides the closest point
+         * of the two lines. The method is taken from Paul Bourke on internet.
+         * This function computes the shortest line segment (Pa and Pb) between the two lines.
+         * This line segment being perpendicular to the two lines, this allows us to write
+         * two equations for the dot product as:
+         *  (Pa - Pb) dot (P2 - P1) = 0     and        (Pa - Pb) dot (P4 - P3) = 0
+         *
+         *  Since Pa lies on P1P2 it can be written Pa = P1 + mua (P2 - P1)
+         *  and Pb lies on P3P4 it can also be written : Pb = P3 + mub (P4 - P3)
+         *  where mua and mua are unknown coefficient that we want to solve
+         *
+         *  Expanding then the equation of the lines
+         *  ( P1 - P3 + mua (P2 - P1) - mub (P4 - P3) ) dot (P2 - P1) = 0
+         *  ( P1 - P3 + mua (P2 - P1) - mub (P4 - P3) ) dot (P4 - P3) = 0
+         *
+         *  Expanding these in terms of the coordinates (x,y,z) gives the following result:
+         *  d_1321 + mua d_2121 - mub d_4321 = 0
+         *  d_1343 + mua d_4321 - mub d_4343 = 0
+         *  where d_mnop = (xm - xn)(xo - xp) + (ym - yn)(yo - yp) + (zm - zn)(zo - zp)
+         *  Finally, solving for mua gives
+         *  mua = ( d_1343 d_4321 - d_1321 d_4343 ) / ( d_2121 d_4343 - d_4321 d_4321 )
+         *  and backsubstituting gives mub
+         *  mub = ( d_1343 + mua d_4321 ) / d_4343
+         *
+         *  log contains the length of the segment PaPb
+         *
+         */
+        ARLCORE_API bool twoLinesClosestPoint( SPTR(Point)  closestPoint, double &log) const;
+
+        //! @brief Compute the main direction of a point cloud with a least square fitting
+        ARLCORE_API bool directionEstimation( SPTR(Point) vector, double &RMS  );
+
+        /**
+         * @brief : Compute the gravity center of the point cloud and the covariance
+         * matrix of the points
+         * @param[out] pt : pt is modified and contains the information of gravity center and covariance
+         * @return Number of point that are used.
+         */
+        ARLCORE_API unsigned int statistic( Point::sptr  pt ) const;
+
+        /**
+         * @brief Visualize the pointlist with gnuplot
+         */
+        ARLCORE_API bool plot( const std::string &options="" ) const;
+        ARLCORE_API bool SLplot( void ) const;
+
+        /**
+         * @brief Apply to the point cloud a specific temporal behavior :
+         * points are collapsing toward the gravity center with gravity g
+         */
+        ARLCORE_API bool collapse( double g=1.0 );
+
+        /**
+         * @brief Calibration of a tag from several poses
+         * @param[in] tag
+         * @param[in] delta Variation on the criterion (Pourcentage)
+         * @param[out] xLength Length of the x-axis side
+         * @param[out] yLength Length of the y-axis side
+         * @param[in] nbMaxIterations
+         * @return Number of iterations
+         */
+        ARLCORE_API unsigned int tagCalibration( const std::vector<arlCore::PointList::sptr > &tag, double delta, unsigned int nbMaxIterations, double &xLength, double &yLength );
+
+    private:
+        unsigned int m_dimension;
+        std::vector< Point::sptr > m_pointList;
+#ifdef ANN
+        // TODO : If m_enableANNArray update m_ANNPointArray with each coordinate data_block()
+        std::vector< double* > m_ANNPointArray;
+        bool m_enableANNArray;
+#endif // ANN
+    };
+
+    ARLCORE_API bool save( const std::vector< Point::csptr > &pl, const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type=ARLCORE_POINT_SAVE_FULL, bool justVisible=false, bool overwrite=true );
+    ARLCORE_API bool save( const std::vector< Point::sptr > &pl, const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type=ARLCORE_POINT_SAVE_FULL, bool justVisible=false, bool overwrite=true );
+
+//  ARLCORE_API bool save( const std::vector<PointList>& lists, const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type=ARLCORE_POINT_SAVE_FULL, bool overwrite=true );
+
+    /**
+     * @brief : Compute the distance betwween the points p1 and p2
+     * p1 & p2 must have same dimension
+     * If p1 & p2 do not have same dimension, the smallest list size will be used
+     */
+    ARLCORE_API bool distance( CSPTR( PointList ) p1, CSPTR( PointList ) p2, std::vector<double> &distances );
+    ARLCORE_API unsigned int findNearPoint( const std::vector< Point::csptr >&, CSPTR(Point) pt, std::vector< unsigned int > &pos, double &distance, double scalar=-1.0);
+    //ARLCORE_API unsigned int findNearPoint( const std::vector< Point::sptr>&, CSPTR(Point) pt, std::vector< unsigned int > &pos, double &distance, double scalar=-1.0);
+    ARLCORE_API unsigned int statistic( const std::vector< Point::csptr>&, unsigned int dimension, Point::sptr  pt );
+    ARLCORE_API unsigned int statistic( const std::vector< Point::sptr>&, unsigned int dimension, Point::sptr  pt );
+    ARLCORE_API unsigned int matching3D3D( CSPTR( PointList ) a, CSPTR( PointList ) b, double gaussianError, double decimage, SPTR( PointList ) Va, SPTR( PointList ) Vb );
+} // namespace arlCore
+#endif // _ARLCORE_POINTLIST_H
diff --git a/SrcLib/ARLcore/include/arlcore/Reconst3D.h b/SrcLib/ARLcore/include/arlcore/Reconst3D.h
new file mode 100644
index 0000000..789007f
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Reconst3D.h
@@ -0,0 +1,256 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_RECONST3D_H
+#define _ARLCORE_RECONST3D_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+
+#include "vnl/vnl_matrix_fixed.h"
+#include "vnl/vnl_vector_fixed.h"
+
+#include <arlcore/MatrixR.h>
+#include <arlcore/Camera.h>
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    /**
+    * @brief 3D triangulation methods that are available
+    */
+    enum ARLCORE_RECONSTRUCTION3D { ARLCORE_R3D_UNKNOWN,
+        ARLCORE_R3D_HORAUD_APPROX, ARLCORE_R3D_HORAUD_PERFECT,
+        ARLCORE_R3D_TWO_LINES_APPROX, ARLCORE_R3D_TWO_LINES_PERFECT,
+        ARLCORE_R3D_MULTI_LINES_APPROX, ARLCORE_R3D_MULTI_LINES_PERFECT,
+        ARLCORE_R3D_REPROJECTION_OPTIMIZATION, ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY,
+        ARLCORE_R3D_NBTYPE };
+
+    static std::string ARLCORE_RECONSTRUCTION3D_NAMES[ARLCORE_R3D_NBTYPE]={ "ARLCORE_R3D_UNKNOWN",
+        "ARLCORE_R3D_HORAUD_APPROX", "ARLCORE_R3D_HORAUD_PERFECT",
+        "ARLCORE_R3D_TWO_LINES_APPROX", "ARLCORE_R3D_TWO_LINES_PERFECT",
+        "ARLCORE_R3D_MULTI_LINES_APPROX", "ARLCORE_R3D_MULTI_LINES_PERFECT",
+        "ARLCORE_R3D_REPROJECTION_OPTIMIZATION", "ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY"};
+
+    /**
+    * @brief Compute the 3D position in the camera frame of a point M detected by N cameras
+    * The fonction uses 2 cameras or more. It depends on the method you choose.
+    * Put pixelFrame to true if the 2D points are given in the pixel frame (pixel coordinate)
+    * Put pixelFrame to false if the 2D points are given in the focal plane (3D real coordinate
+    * that are generally computed by multiplying the pixel coordinates with the inverse
+    * of the camera intrinsic matrix).
+    *
+    * @param[in] points2D : arlCore::Point list that corresponds to the image coordinates
+    * detected in each camera of the point we want to triangulate
+    * @param[in] point3D : triangulation result
+    * @param[in] camsList : camera list that is used for the reconstruction. The camera SHOULD
+    * be jointly calibrated. If not you will get absurd result. If a camera have not been
+    * intrinsically calibrated, you will get also absurd result. Consequently you should
+    * test your camera before using them (using method Camera::isIntrinsicCalibrated() )
+    *
+    * m_1,....,m_i,....,m_N are the points detected in the ith camera image (pixel coordinates)
+    * Using the distortion parameters of the camera we can compute the coordinates in pixel of
+    * the point M reprojections if there is no distortion. In that case, calling
+    * mc_1,....,mc_i,....,mc_N  the distortion-free point coordinates (in pixel), it is
+    * possible to accurately estimate the M position by computing the intersection of the back projected
+    * lines C_im_i (where C_i is the optical center of the ith camera).
+    *
+    * Almost all our algorithms ends by APPROX or PERFECT. APPROX means that the distortion
+    * correction has been performed using a simple and quick iterative algorithm (that
+    * genrally works when distortion is not too important). PERFECT corresponds to a more
+    * specialized algorithm (coming from VNL) that finds the roots of a polynome. The latter
+    * method is much slower (50 times and more...)
+    *
+    * ARLCORE_R3D_HORAUD : compute a triangulation from an analytic analysis that
+    * takes into account 2 cameras only (see R. Horaud.
+    * Vision par ordinateur: outils fondamentaux. Ed. Hermes. 1995)
+    * ARLCORE_R3D_TWO_LINES : compute a triangulation from the back projection of
+    * the lines C_1m_1 and C_2m_2 (the triangulated point is the point at an equal
+    * distance from C_1m_1 and C_2m_2).
+    * ARLCORE_R3D_MULTI_LINES : compute a triangulation from the back projection of
+    * all the lines C_im_i. The triangulated point P is the point that optimize
+    * the distance to all lines
+    * ARLCORE_R3D_REPROJECTION_OPTIMIZATION : compute a triangulation from the reprojection
+    * error in each image. The triangulated point P is the point that optimize
+    * the following criterion sum_i || P_i(P) - m_i||^2 where P_i is the projective
+    * function of the ith camera.
+    * ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY : same as before but the
+    * criterion takes into account the uncertainty on the m_i. We optimize:
+    * sum_i transpose(P_i(P) - m_i) * cov_m_i^(-1) * (P_i(P) - m_i) where
+    * cov_m_i is the covariance matrix of m_i
+    *
+    * @param[out] log Provide different values that depends on the chosen method :
+    *
+    * ARLCORE_R3D_TWO_LINES_APPROX and ARLCORE_R3D_TWO_LINES_PERFECT:
+    * log[0] : distance between the two reprojection lines (in mm)
+    *
+    * ARLCORE_R3D_MULTI_LINES_APPROX et ARLCORE_R3D_MULTI_LINES_PERFECT
+    * log[0] = average distance moyenne between the reconstructed point and all reprojected lines (in mm)
+    * log[1] = average distance moyenne between the initial point (before optimization) and all reprojected lines (in mm)
+    *
+    * ARLCORE_R3D_REPROJECTION_OPTIMIZATION and ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY :
+    * log[0] = average distance between the reconstructed point that is reprojected in the image and its detection in all images (pix)
+    * log[1] = average distance between the initial point that is reprojected in the image and its detection in all images (pix)
+    */
+    ARLCORE_API bool reconst3D( const std::vector<Point::csptr> &points2D, const std::vector< const Camera*> &camsList, SPTR( Point ) point3D,
+        ARLCORE_RECONSTRUCTION3D, unsigned int &plane, std::vector<double> &log, double errorMax=-1,  bool propagateCov=false, const bool pixelFrame=true);
+
+    ARLCORE_API bool reconst3D( const std::vector<Point::csptr> &list2D, const std::vector<Camera> &camsList, SPTR( Point ) point3D,
+        ARLCORE_RECONSTRUCTION3D, unsigned int &plane, std::vector<double> &log, double errorMax=-1,  bool propagateCov=false, const bool pixelFrame=true);
+    /**
+    * @brief This function computes the rigid transformation from the 3D model frame
+    * to the camera frame. In fact, the function firstly compute an homography that
+    * fits the N points of the 3D model to the N corresponding points detected in the
+    * video image. Since we compute an homography, this means that the 3D model has to
+    * be (almost) a plane and has to contain at least 4 points.
+    * Of course, 3D and 2D points must be perfectly matched:
+    * no NULL pointer and vector of same size
+    * @param[in] Camera : camera that looks to the planar object
+    * @param[in] points2D : list of 2D coordinates of the 3D model points detected in the video image
+    * @param[in] T : rigid transformation that corresponds to the passage matrix from the 3D model frame
+    * to the camera frame - (T * P_i = M_i where P_i are coordinates in the 3D model frame
+    * and M_i in the camera frame)
+    * @param[in] optimiser_parameters :  optimiser_parameters[0] and optimiser_parameters[1] must
+    * be defined before using the function. If optimiser_parameters[0] = 1, then, log[0] contains
+    * the average reprojection error and log[1] the norm of the first column of H (which should be equal to 1 !!).
+    * To apply the prenormalisation (which ensure a good calculation of the svd)
+    * optimiserParameters[1] must be set to 1.
+    *
+    */
+    ARLCORE_API bool planarHomographyRegistration_3D_2D( const Camera &, const std::vector< Point::csptr > &points2D, const std::vector< Point::csptr > &model3D,
+         vnl_rigid_matrix &T, const std::vector<double> &optimiser_parameters, std::vector<double> &log, bool verbose=false);
+
+//  ARLCORE_API bool planarHomographyRegistration_3D_2D( const Camera &, const std::vector< Point::sptr > &points2D, CSPTR( PointList ) model3D,
+//       vnl_rigid_matrix &T, const std::vector<double> &optimiser_parameters, std::vector<double> &log, bool verbose=false);
+
+    /**
+    * @brief From a general point of view, this function provides "the best" homography between
+    * two point sets in 2D. More specifically, it is used for camera calibration
+    * in order to find an estimation of the intrinsic parameters using several poses
+    * of a planar chessboard.
+    * The function finds H so that :
+    *       [u_i]       [X_i]
+    * m_i = [v_i] = H x [Y_i]
+    *       [ 1 ]       [ 1 ]
+    *
+    * where:
+    * @param[in] points2D : list of 2D coordinates of the point list 1
+    * @param[in] model3D  : list of 2D coordinates of the point list 1 (it can be also the list
+    * of 3D coordinates of the 3D model points from the chessboard with z=0)
+    * @param[in] H : homography 3x3 matrix
+    * @param[in] optimiser_parameters :  optimiser_parameters[0] and optimiser_parameters[1] must
+    * be defined before using the function. If optimiser_parameters[0] = 1, then, log[0] contains
+    * the average reprojection error
+    * To apply the prenormalisation (which ensure a good calculation of the svd)
+    * optimiserParameters[1] must be set to 1.
+    * Of course, the 2 point list must be perfectly matched:
+    * no NULL pointer and vector of same size
+    *
+    */
+    ARLCORE_API bool planarHomographyUnknownIntrinsic( const std::vector<Point::sptr> &points2D, const std::vector< Point::sptr > &model3D, vnl_matrix_fixed<double,3,3> &H, const std::vector<double> &optimiserParameters, std::vector<double> &log, bool verbose);
+
+    ARLCORE_API bool planarHomographyUnknownIntrinsic( CSPTR( PointList ) points2D, CSPTR( PointList ) model3D, vnl_matrix_fixed<double,3,3> &H, const std::vector<double> &optimiserParameters, std::vector<double> &log, bool verbose);
+
+    /**
+     * @brief 3D/2D registration method
+     * more informations about the theory can be found in
+     */
+    enum ARLCORE_PROJECTIVE_REGISTRATION { ARLCORE_PR_UNKNOWN,
+        ARLCORE_PR_ISPPC, ARLCORE_PR_ISPPC_LM, ARLCORE_PR_ISPPC_CG,
+        ARLCORE_PR_ISPPC_ANISOTROP, ARLCORE_PR_ISPPC_ANISOTROP_LM,
+        ARLCORE_PR_OSPPC, ARLCORE_PR_OSPPC_LM, ARLCORE_PR_OSPPC_CG,
+        ARLCORE_PR_EPPC, ARLCORE_PR_EPPC_LM,  ARLCORE_PR_EPPC_CG,
+        ARLCORE_PR_NBTYPES };
+    static std::string ARLCORE_PROJECTIVE_REGISTRATION_NAMES[ARLCORE_PR_NBTYPES]={ "ARLCORE_PR_UNKNOWN",
+        "ARLCORE_PR_ISPPC", "ARLCORE_PR_ISPPC_LM", "ARLCORE_PR_ISPPC_CG",
+        "ARLCORE_PR_ISPPC_ANISOTROP", "ARLCORE_PR_ISPPC_ANISOTROP_LM",
+        "ARLCORE_PR_OSPPC", "ARLCORE_PR_OSPPC_LM", "ARLCORE_PR_OSPPC_CG",
+        "ARLCORE_PR_EPPC", "ARLCORE_PR_EPPC_LM", "ARLCORE_PR_EPPC_CG" };
+
+    /**
+     * @brief
+     * Rigid registration of a 3D point set so that its reprojection on one image fits a 2D point set
+     *
+     * @param[in] Camera : camera that looks to the planar object.
+     *
+     * @param[in] model3D  : list of 3D coordinates of the 3D model
+     * @param[in] points2D : list of 2D reprojection of the 3D points on the video image
+     * @param[out] T : rigid transformation that contains the solution after computation
+     *
+     * TODO This function works if the 3D model is planar (because of the initialization) !
+     * TODO We have to retrieve this constraint
+     * TODO This function needs optimiserParameters and log
+     */
+    ARLCORE_API bool monoViewPointRegistration3D2D( const arlCore::Camera & ,
+        const std::vector<Point::csptr> &points2D, const std::vector<Point::sptr> &model3D,
+        arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION method,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose );
+
+    ARLCORE_API bool monoViewPointRegistration3D2D( const arlCore::Camera & ,
+        const std::vector<Point::csptr> &points2D, CSPTR( PointList ) model3D,
+        arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION method,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose );
+
+/**
+ * @brief
+ * Rigid registration of a 3D point set so that its reprojection on several images fits 2D point sets
+ *
+ * This function compute the rigid transformation that registers a 3D rigid object (defined
+ * in its own frame)  in the world frame of several jointly calibrated camera (we call here
+ * world frame the frame in which the camera were calibrated). Practically, this frame
+ * corresponds to the position of a chessboard that has been used during the simultaneous
+ * calibration of cameras.
+ *
+ * param[in] : cameras = camera vector used for the registration (it works also with one camera only). The camera SHOULD
+ * be jointly calibrated. If not you will get absurd result. If a camera have not been
+ * intrinsically calibrated, you will get also absurd result. Consequently you should
+ * test your camera before using them (using method Camera::isIntrinsicCalibrated() )
+ * param[in] : points2D = vector of vector of 2D points [j] detected in the camera [i]
+ * param[in] : T = initialisation of the iterative registration
+ * param[in] : methode = choice of the optimization criterion and method (more informations on each
+ * criterion can be found in Optimization.h and in the following paper : S.Nicolau et.al. An Accuracy
+ * Certified Augmented Reality System for Therapy Guidance. In Proc. of the 8th European Conference
+ * on Computer Vision (ECCV 04), Part III, volume LNCS 3023, Prague, pages 79-91, May 2004)
+ * param[in] : optimiserParameters = parameters for optimization function used (TODO still not used)
+ *
+ * param[out] : log
+ *      EPPC:
+ *           log[0] = criterion value at the end of optimization divided by the point number
+ *           log[1] = criterion value at the beginning of optimization divided by the point number
+ *           log[2] = part of the criterion value that corresponds to the 2D contribution (TODO not divided by the point number)
+ *           log[3] = part of the criterion value that corresponds to the 3D contribution (TODO not divided by the point number)
+ *           log[4] = stop criterion of the EPPC, corresponds to the distance between the 2 last transformations
+ *      ISPPC & OSPPC:
+ *           log[0] = criterion value at the end of optimization divided by the point number
+ *           log[1] = criterion value at the beginning of optimization divided by the point number
+ *
+ * More information are given in Reconst3D.cpp
+ *
+ */
+
+    ARLCORE_API bool multiViewPointRegistration3D2D ( const std::vector< const Camera* >& ,
+        const std::vector< std::vector<Point::csptr> >& points2D, const std::vector<Point::csptr> &model3D,
+        arlCore::vnl_rigid_matrix &T, ARLCORE_PROJECTIVE_REGISTRATION,
+        const std::vector<double> &optimiserParameters, std::vector<double> &log, bool verbose);
+
+    ARLCORE_API bool multiViewPointRegistration3D2D ( const std::vector< Camera >& ,
+        const std::vector< std::vector<Point::csptr> >& points2D, const std::vector<Point::csptr> &model3D,
+        arlCore::vnl_rigid_matrix &T, ARLCORE_PROJECTIVE_REGISTRATION,
+        const std::vector<double> &optimiserParameters, std::vector<double> &log, bool verbose);
+
+    ARLCORE_API bool multiViewPointRegistration3D2D ( const std::vector< const Camera* >& ,
+        const std::vector< std::vector<Point::csptr> >& points2D, CSPTR( PointList ) model3D,
+        arlCore::vnl_rigid_matrix &T, ARLCORE_PROJECTIVE_REGISTRATION,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose);
+
+    ARLCORE_API bool multiViewPointRegistration3D2D ( const std::vector< Camera >& ,
+        const std::vector< std::vector<Point::csptr> >& points2D, CSPTR( PointList ) model3D,
+        arlCore::vnl_rigid_matrix &T, ARLCORE_PROJECTIVE_REGISTRATION,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose);
+
+} // namespace arlCore
+#endif // _ARLCORE_RECONST3D_H
diff --git a/SrcLib/ARLcore/include/arlcore/Recorder.h b/SrcLib/ARLcore/include/arlcore/Recorder.h
new file mode 100644
index 0000000..2560693
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Recorder.h
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARL_RECORDER_H
+#define _ARL_RECORDER_H
+#include <arlcore/Common.h>
+
+#include <string>
+#include <fstream>
+
+namespace arlCore
+{
+    class Recorder
+    {
+    /**
+     * @class   Recorder
+     * @date    04/2008
+     * @brief   Abstract class for recorder devices
+     */
+    public:
+        //! @brief Constructor
+        ARLCORE_API Recorder( void );
+
+        //! @brief Destructor
+        ARLCORE_API ~Recorder( void );
+
+        //! @brief Get the full pathname and header's filename
+        ARLCORE_API bool getRecorderFilename( std::string &fileName );
+
+        //! @brief Get the full pathname and header's filename
+        ARLCORE_API bool getRecorderDirectory( std::string &directory );
+
+        /**
+        * @brief Demarre l'enregistrement des images avant ou apres le traitement
+        * Si nbSnapshots n�gatif, l'enregistrement dure ind�finiment
+        * Si nbSnapshots positif, il est r�alis� n prises de vue, puis stopRecorder est activ�
+        * Si nbSnapshots nul, l'enregistrement s'arr�te
+        * Par d�faut, les donnees brutes sont enregistr�es pour une dur�e ind�termin�e
+        */
+        ARLCORE_API bool startRecorder( long int nbSnapshots=-1, bool afterRender=false );
+
+        /**
+        * @brief Arrete l'enregistrement, mais peut-�tre poursuivi avec un nouveau startRecorder
+        * Il sera poursuivi dans le meme repertoire, si un initRecorder n'est pas lanc� entre temps
+        */
+        ARLCORE_API bool stopRecorder( void );
+
+        //! @return True if it's recording
+        ARLCORE_API bool isRecording( void );
+
+        //! @brief Close recorder. You should call initRecorder to start again
+        ARLCORE_API void closeRecorder( void );
+
+    protected:
+        std::fstream m_recorderHandle;
+
+        std::string m_recorderDirectory;
+        std::string m_fullRecorderDirectory;
+        std::string m_recorderFullName;
+
+        bool m_recorderFlag;
+        bool m_recorderAfterRender;
+        long int m_nbSnapshots;
+    };
+} // namespace ARLCORE
+#endif // _ARL_RECORDER_H
diff --git a/SrcLib/ARLcore/include/arlcore/Scene.h b/SrcLib/ARLcore/include/arlcore/Scene.h
new file mode 100644
index 0000000..8a7f45d
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Scene.h
@@ -0,0 +1,137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_SCENE_H
+#define _ARLCORE_SCENE_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <map>
+
+#include <arlcore/PlaneSystem.h>
+#include <arlcore/Camera.h>
+#include <arlcore/CameraList.h>
+#include <arlcore/Point.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/Tags.h>
+
+namespace arlCore
+{
+    class SmartPointList;
+    class Scene
+    {
+    /**
+     * @class   Scene
+     * @date    2007
+     * @brief   Virtual scene generator
+     * A scene is a plane system with cameras and tags wich contain lists of point
+     * After setting cameras and tags in the scene, we can simulate the detection of the tag points
+     * on the image produced by the cameras.
+     * We can also apply a dynamic behavior to the points, as for example collapsing
+     *
+     * This class contains basic methods to create a virtual world. Practically, you have
+     * to define a new class (see in Scenes.h) that derives from Scene, and to write
+     * the specific methods you need for the virtual world you create for your experiment.
+     */
+    public:
+
+
+
+        //! @brief Constructor of an empty scene in the planesystem
+        ARLCORE_API Scene( PlaneSystem& );
+
+        //! @brief Destructor
+        ARLCORE_API ~Scene( void );
+
+        /**
+         * @brief This function add in the scene a Tag (3D object composed of a 3D point list) that is
+         * randomly generated from the parameter ARLCORE_SHAPE, centre and size (see the function
+         * PointList::shapeRandom() in PointList.h)
+         */
+        ARLCORE_API SPTR(Tag) addTag(unsigned int nbPoints, ARLCORE_SHAPE shapeType, CSPTR( Point ) centre, double size);
+
+        /**
+         * @brief
+         * Once a scene is created, this function creates "nbCams" camera in the world. The camera
+         * optical centers are randomly created in a sphere of radius "sphereRadius" and of center "centre".
+         * All the cameras are looking toward the Point "centre". Their orientation is chosen randomly as well.
+         * In order to avoid camera creation too close to "centre". Each camera is moved away from "centre"
+         * along the axis ("centre" camera_optical_center) with a magnitude of distMin. The intrinsic parameters
+         * of each camera are randomly chosen using "intrinsicParam" and "intrinsicRange":
+         * fx = intrinsicParam[0] + UniformNoise(intrinsic_range[0])
+         * fy = intrinsicParam[1] + UniformNoise(intrinsic_range[1])
+         * cx = intrinsicParam[2] + UniformNoise(intrinsic_range[2])
+         * cy = intrinsicParam[3] + UniformNoise(intrinsic_range[3])
+         * k1 = intrinsicParam[4] + UniformNoise(intrinsic_range[4])
+         * k2 = intrinsicParam[5] + UniformNoise(intrinsic_range[5])
+         * k3 = intrinsicParam[6] + UniformNoise(intrinsic_range[6])
+         * k4 = intrinsicParam[7] + UniformNoise(intrinsic_range[7])
+         */
+        ARLCORE_API virtual bool addCameras(unsigned int nbCams, CSPTR( Point ) centre, double sphereRadius, double distMin,
+            const std::vector<double> &intrinsicParam, const std::vector<double> &intrinsicRange);
+
+        /**
+         * @brief
+         * Once a scene is created, this function creates "nbCams" camera in the world. The camera
+         * optical centers are randomly created in a solid angle of angle "angleMin" and
+         * of radius "sphereRadius" and of center "centre".
+         * All the cameras are looking toward the Point "centre". Their orientation is chosen randomly as well.
+         * In order to avoid camera creation too close to "centre". Each camera is moved away from "centre"
+         * along the axis ("centre" camera_optical_center) with a magnitude of distMin. The intrinsic parameters
+         * of each camera are randomly chosen using "intrinsicParam" and "intrinsicRange":
+         * fx = intrinsicParam[0] + UniformNoise(intrinsic_range[0])
+         * fy = intrinsicParam[1] + UniformNoise(intrinsic_range[1])
+         * cx = intrinsicParam[2] + UniformNoise(intrinsic_range[2])
+         * cy = intrinsicParam[3] + UniformNoise(intrinsic_range[3])
+         * k1 = intrinsicParam[4] + UniformNoise(intrinsic_range[4])
+         * k2 = intrinsicParam[5] + UniformNoise(intrinsic_range[5])
+         * k3 = intrinsicParam[6] + UniformNoise(intrinsic_range[6])
+         * k4 = intrinsicParam[7] + UniformNoise(intrinsic_range[7])
+         */
+        ARLCORE_API virtual bool addCameras(unsigned int nbCams, CSPTR( Point ) centre, double sphereRadius, double distMin,
+            const std::vector<double> &intrinsicParam, const std::vector<double> &intrinsicRange, double angleMin);
+
+        //! @brief Visualise la scene avec gnuplot
+        ARLCORE_API bool plot( void ) const;
+
+        //! @brief Get the plane system id
+        ARLCORE_API PlaneSystem& getPlaneSystem( void );
+
+        //! @brief Get the number of camera in the scene
+        ARLCORE_API unsigned int getNbCameras( void ) const;
+
+        //! @brief Get a vector that contains pointer on each camera in the scene
+        ARLCORE_API const arlCore::CameraList& getCameras( void ) const;
+
+        //! @brief Get Tags in the scene
+        ARLCORE_API Tags& getTags( void );
+
+        /**
+         * @brief
+         * This function is fondamental, it provides in a SmartPointList "spl" the point 2D coordinates
+         * that corresponds to the projection of the points belonging to the Tag "tagNo" in the
+         * video image of the camera "cam".
+         *
+         * In case you want to add some noise to the coordinates you get (for evaluation purpose...),
+         * you can add it using the variable "gaussianNoise". It will add zero mean gaussian noise
+         * with std dev "gaussianNoise" on each point coordinate.
+         *
+         */
+        ARLCORE_API unsigned int detection( unsigned int cam, unsigned int tagNo, SPTR( SmartPointList ) spl, double gaussianNoise=0 );
+
+    protected:
+        ARLCORE_API Scene( PlaneSystem&, Tags::sptr );
+        ARLCORE_API virtual bool dynamicBehavior( unsigned int step );
+        ARLCORE_API virtual unsigned int detectionBehavior( unsigned int cam, SPTR( SmartPointList ) , std::vector< CSPTR(Tag) > &tags, std::map< CSPTR(Tag), unsigned int >& allTags );
+
+        Tags::sptr m_tags;
+
+    private:
+        arlCore::CameraList m_cameras;
+        PlaneSystem &m_universe;
+    };
+} // namespace ArlCore
+#endif // _ARLCORE_SCENE_H
diff --git a/SrcLib/ARLcore/include/arlcore/Scenes.h b/SrcLib/ARLcore/include/arlcore/Scenes.h
new file mode 100644
index 0000000..a9e5c64
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Scenes.h
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_SCENES_H
+#define _ARLCORE_SCENES_H
+#include <arlcore/Common.h>
+
+#include <arlcore/Scene.h>
+
+namespace arlCore
+{
+    /**
+     * @date    2007
+     * @brief   Scenes virtuelles specifiques
+     */
+
+    /**
+     * @brief : Scene for several unit test
+     * This scene is used for :
+     * arlCore::testRegistration3D3D
+     * arlCore::testProjectiveRegistration
+     * arlCore::testHomographyRegistration
+     * arlCore::testReconstructionPolyscopic
+     * arlCore::testEpipolarMatching
+     * arlCore::testReconstructionPolyscopicUncertainty
+     *
+     * It creates a scene with nbCamerasMax camera focusing at a point m_Centre randomly chosen in a cube of 300 mm edge
+     * (size_rand_mire = 300). The intrinsic camera parameter are randomly chosen as well and are defined in the Function.
+     * The number of camera cannot be below 2. The camera position are randomly chosen in a cube of 500 mm edge and
+     * the minimal distance between the camera and the focused point is 1000 (distance_mire_cam_min).
+     * The number of points "nbPoints2D" is randomly chosen so that it is comprised between 4 and nbPoints2DMax+4. This
+     * is necessary for most of the unit test. For some test (arlCore::testReconstructionPolyscopicUncertainty),
+     * we choose to create only 1 point to avoid correlation within the statistical tests. This can be done by
+     * setting nbPoints2DMax to 1.
+     *
+     * Two tags are generated: the first one contains "nbPoints2D" points randomly generated in a sphere
+     * centered in m_Centre and of radius "worldPointsSize". The second tag (used essentially for homography
+     * evaluation) is a flat cloud of "nbPoints2D" points generated in a square centered in (0,0,0). The edge
+     * of the square has a dimension equal to "worldPointsSize".
+     */
+    class SceneUnitTest : public Scene
+    {
+    public:
+        ARLCORE_API SceneUnitTest( PlaneSystem&, double worldPointsSize=200, unsigned int nbPoints2DMax=40 );
+        ARLCORE_API ~SceneUnitTest( void );
+        ARLCORE_API Point::csptr getCentre( void ) const;
+
+    private:
+
+        SceneUnitTest(); // purposely not implemented
+        Point::sptr m_Centre;
+    };
+
+    /**
+     * @brief : Scene for several unit test
+     * This scene is used for :
+     * arlCore::testInitIntrinsicCalibration
+     * arlCore::testIntrinsicCalibration
+     * arlCore::testInitExtrinsicCalibration
+     * arlCore::testExtrinsicCalibration
+     *
+     * @param[in] = PlaneSystem
+     * @param[in] = k_range (std dev on the distortion values that are randomly chosen)
+     * @param[in] = nbCameras_MAX
+     * @param[in] = nbPoses_MAX
+     *
+     * This scene generates one or several cameras which look(s) at a calibration object in several
+     * positions. It is used to validate the calibration algorithm implemented from Z. Zhang paper's
+     * (Flexible Camera Calibration by Viewing a Plane from Unknown Orientations in ICCV 99) for one
+     * camera and the calibration algorithm described in the PhD thesis of S. Nicolau (see Optimization.h
+     * to find the calibration criterion).
+     *
+     * The camera is randomly positioned in a sphere of radius "SphereRadius", looking at the point
+     * "Origin", with a minimal distance to "Origin" of "DistanceMin". The point "Origin" is randomly chosen
+     * in a cube centered in (0,0,0) withan edge of 100. The intrinsic parameters are chosen as follows:
+     * fx = 1000 + GaussianNoise(mean = 0, std dev = 200)
+     * fy = 1000 + GaussianNoise(mean = 0, std dev = 200)
+     * cx = 400 + GaussianNoise(mean = 0, std dev = 100)
+     * cy = 200 + GaussianNoise(mean = 0, std dev = 50)
+     * k1 = 0 + GaussianNoise(mean = 0, std dev = k_range[0])
+     * k2 = 0 + GaussianNoise(mean = 0, std dev = k_range[1])
+     * k3 = 0 + GaussianNoise(mean = 0, std dev = k_range[2])
+     * k4 = 0 + GaussianNoise(mean = 0, std dev = k_range[3])
+     *
+     * The number of pose is randomly chosen between 4 and nbPoses_MAX + 4
+     * The number of camera is randomly chosen between 1 and nbCameras_MAX +1 (if nbCameras_MAX = 1, then
+     * only one camera is created). Consequently, you have to avoid negative value for nbCameras_MAX (it
+     * is not tested).
+     *
+     * For each pose i the calibration object is different and the number of point is equal to
+     * ChessNbPoints[i]). The calibration object is flat (Z=0), and its points are randomly chosen in
+     * a square centered in (0,0,0) with an edge of "ChessSize"=120. Each pose corresponds to a Tag
+     * that is created in the scene.
+     */
+    class SceneUnitTestInitIntrinsicCalib : public Scene
+    {
+    public:
+        ARLCORE_API SceneUnitTestInitIntrinsicCalib( PlaneSystem& , std::vector<double> k_range, const unsigned int nbCameras_MAX, const unsigned int nbPoses_MAX);
+        ARLCORE_API ~SceneUnitTestInitIntrinsicCalib( void );
+        ARLCORE_API Point::csptr getCentre( void ) const;
+        ARLCORE_API const unsigned int getNbPoses( void ) const;
+        ARLCORE_API const unsigned int getChessNbPoints( unsigned int ) const;
+
+    private:
+        Point::sptr m_Centre;
+        unsigned int m_nbPoses;
+        std::vector<unsigned int> m_ChessNbPoints;
+    };
+
+
+    /**
+     * @brief : Scene for several unit test
+     * This scene is used to compare the performance of the following registration criterion :
+     * EPPC
+     * Isotropic and anisotropic ISPPC
+     * OSPPC
+     * Isotropic and anisotropic 3D/3D registration
+     *
+     * @param[in] = PlaneSystem
+     * @param[in] = parameters (allows to specify parameters of the generated scene)
+     * @param[in] = staticStatus (allows to specify which parameters of the scene is chosen once for all)
+     * @param[in] = noiseValues
+     * @param[out] = RSB_3D
+     * @param[out] = RSB_2D
+     *
+     * A set of cameras is created and they look at m_Centre (which is randomly chosen in an cube of
+     * size_rand_point_de_mire_camera and centered in (0,0,0) ). Their intrinsic parameters can
+     * be configured statically in the .cpp file using int_param and int_range.
+     * A 3D object is created in the world and a set of control point as well (2 Tags are
+     * then generated, the parameters of which are defined in the param[in] parameters).
+     *
+     * -The object to register contains parameters[0] points, but if staticStatus[0] == 0 the number
+     * of points is randomly chosen between 4 and parameters[0].
+     * -The scene contains parameters[1] camera, but if staticStatus[1] == 0 the number
+     * of points is randomly chosen between 2 and parameters[1].
+     * -The solid angle in which the camera are positioned is parameters[2] steradian (value should
+     * be comprised between 0 and 720), but if staticStatus[2] == 0, it is equal to 720.
+     * -The size of the shape in which the object points are randomly chosen is equal to
+     * parameters[3], but if staticStatus[3] == 0 it is randomly chosen between 20 and parameters[3].
+     * -The shape of the object is given by parameters[4] (see Point.h to learn the available shape and
+     * their associated number), but if staticStatus[4] == 0 the shape is randomly chosen between
+     * those available in [1...parameters[4] ]
+     * -The number of control points is given in parameters[5] points, but if staticStatus[0] == 0 the number
+     * of points is randomly chosen between 1 and parameters[5].
+     * -The size of the shape in which the control points are randomly chosen is equal to
+     * parameters[6], but if staticStatus[6] == 0 it is randomly chosen between 1 and parameters[6].
+     * -The distance between the registration and the control point is equal to
+     * parameters[7], but if staticStatus[7] == 0 it is randomly chosen between 50 and parameters[7].
+     * -The shape of the control points is given by parameters[8], but if staticStatus[8] == 0
+     * the shape is randomly chosen between those available in [1...parameters[8] ]
+     *
+     * noiseValues correspond to the std dev of the gaussian error that will be added:
+     * -to the x,y,z coordinates of the object
+     * -to the x,y coordinates of their reprojection in the video images
+     * RSB_3D and RSB_2D are the signal/noise ratio of the 3D object generated and of the
+     * 2D points projected in the video images. These values can only be computed after the
+     * scene generation and knowing the std dev that has corrupted the 3D and 2D data.
+     */
+    class SceneCriterionComparison : public Scene
+    {
+    public:
+        ARLCORE_API SceneCriterionComparison( PlaneSystem& , std::vector<double> parameters, std::vector<double> staticStatus,
+         std::vector<double> noiseValues, double RSB_3D, double RSB_2D  );
+        ARLCORE_API ~SceneCriterionComparison( void );
+        ARLCORE_API Point::csptr getCentre( void ) const;
+
+    private:
+        Point::sptr m_Centre;
+        Point::sptr m_ControlCentre;
+    };
+
+    /**
+     * @brief : Scene for Solve AXXB UnitTests
+     * 2 cameras with angle =
+     * Square of ...mm with 150 points at the distance of 1000 mm from cameras
+     */
+    class SceneAXXB : public Scene
+    {
+    public:
+        ARLCORE_API SceneAXXB( PlaneSystem&, unsigned int NbCameras=2 );
+        ARLCORE_API ~SceneAXXB( void );
+        ARLCORE_API Point::csptr getCentre( void ) const;
+
+    private:
+        Point::sptr m_Centre;
+    };
+} // namespace ArlCore
+#endif // _ARLCORE_SCENES_H
diff --git a/SrcLib/ARLcore/include/arlcore/SmartPointsList.h b/SrcLib/ARLcore/include/arlcore/SmartPointsList.h
new file mode 100644
index 0000000..d1f3e3d
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/SmartPointsList.h
@@ -0,0 +1,221 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_SMARTPOINTLIST_H
+#define _ARLCORE_SMARTPOINTLIST_H
+
+#include <boost/make_shared.hpp>
+
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <map>
+
+#include <arlcore/Point.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/Camera.h>
+
+namespace arlCore
+{
+    /**
+     * @date    2007
+     * @brief
+     *
+     * In a video image you may extract information of different nature.
+     * The purpose of this class is to contain the 2D coordinates of points detected/extracted
+     * from all video images and to associate each point to their origin: a point can belong
+     * to a point set representing an optical marker, a structured light fringe...
+     * In this class, a point set representing an object is called videoTag.
+     *
+     * When you are tracking several videoTag in a scene, you may want to get all the points
+     * of a particular videoTag in the camera number i. This class allows you to get efficiently
+     * this information. You can also ask for the reprojection in all cameras of a
+     * specific 3D point, or the reprojection of all videoTag in one (or all) camera...
+     *
+     * Briefly, this class provides efficient methods to get 2D points with respect to
+     * a videoTag, a camera, a 3D point, a fringe.
+     *
+     * Note that when you use structured light, a videoTag will contain the fringe number
+     * information as well. This means that you can ask the point list of a specific fringe
+     * only.
+     *
+     * French comments:
+     * Liste de points 2D ordonnés par camera, videoTag et numéro de franges
+     * Cette classe permet de stocker des points 2D associés à une camera et un videoTag
+     * Dans le cas de VideoTag de lumière structurée, le point est également associé à un no de frange
+     * SmartPointList permet d'extraire efficacement des listes de points selon différents filtres
+     * et ordonnancements.
+     * Elle est notamment utilisée pour stocker les points détectés dans les images video
+     */
+    class SmartPointList : public fwTools::Object
+    {
+    public:
+
+        fwCoreClassDefinitionsWithFactoryMacro( (SmartPointList)(::fwTools::Object),
+                                                (()),
+                                                ::boost::make_shared< SmartPointList >) ;
+        //! @brief Default constructor of an empty list
+        ARLCORE_API SmartPointList( void );
+
+        //! @brief Copy constructor
+        ARLCORE_API SmartPointList( CSPTR( SmartPointList ) );
+
+        //! @brief Affectation
+        ARLCORE_API SmartPointList& operator=( CSPTR( SmartPointList ) );
+
+        //! @brief Copy of smartpointlist in the current list
+        ARLCORE_API void copy( CSPTR( SmartPointList ) spl );
+
+        //! @brief Destructor of the list and all points
+        ARLCORE_API virtual ~SmartPointList( void );
+
+        //! @return Provide the coordinates of each point for each camera
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @brief Used by the developer only. Check that the object is not corrupted by point of bad dimension
+        ARLCORE_API bool integrity( void ) const;
+
+        //! @brief Save the smartpointlist in a file
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        //! @brief Load a smartpointlist from a file
+        ARLCORE_API bool load( const std::string &fileName );
+
+        /**
+         * @brief Add a point in the list, tagged with a cam number, videoTag pointer and number of fringe
+         * VideoTag pointer and fringe number are optional
+         * @return Point's pointer in the SmartPointList
+         */
+        ARLCORE_API Point::csptr push_back( Point::csptr  pt, unsigned int cam,  SPTR(void) videoTag=  SPTR(void)(), int fringe=0 );
+
+        /**
+         * @brief Add a pointlist, tagged with a cam number, videoTag pointer and number of fringe
+         * VideoTag pointer and fringe number are optional
+         */
+        ARLCORE_API unsigned int push_back( const std::vector< arlCore::Point::csptr >&, unsigned int cam, SPTR(void) videoTag=  SPTR(void)(), int fringe=0 );
+
+        /**
+         * @brief Add a point in the list, tagged with a cam number, videoTag pointer and number of fringe
+         * VideoTag pointer and fringe number are optional
+         */
+        ARLCORE_API bool addPoint( Point::csptr , unsigned int cam, SPTR(void) videoTag , unsigned int tagNo );
+
+        /**
+         * @return Reference to a list of points tagged with a cam number, videoTag pointer and number of fringe
+         * VideoTag pointer and fringe number are optional
+         */
+        ARLCORE_API const std::vector< Point::csptr >& getList( unsigned int cam, SPTR(void) videoTag=  SPTR(void)() , int fringe=0 ) const;
+
+        /**
+         * @brief : If radius<0, find in the SmartPointList for the camera 'cam', the nearest point of (x,y)
+         * If radius>=0, find all points inside a circle centred in (x,y)
+         * @param found = References to points in the defined area
+         * @param distance = Distance to the nearest point
+         * @return Number of found points
+         * This function does not optimize the research method. Its complexity follows the number of point.
+         */
+        ARLCORE_API unsigned int findNearPoint(double x, double y, unsigned int cam, std::vector< Point::csptr > &found, double &distance, double radius=-1.0) const;
+
+        /**
+         * @brief 2D visible point for each camera corresponding to the 3D point number No of the videotag in several cameras
+         * @param[in] cams Cameras list
+         * @param[out] whichCams = Receive true for each camera when the point exists in
+         * @param[out] pl = List with only found points
+         * @return Number of found points
+         */
+        ARLCORE_API unsigned int getPointByCam( std::vector<Point::csptr>& pl, const std::vector<const arlCore::Camera*> &cams, SPTR(void) videoTag, unsigned int no, std::vector< bool >&whichCams) const;
+        ARLCORE_API unsigned int getPointByCam( std::vector<Point::csptr>& pl, const std::vector<arlCore::Camera> &cams, SPTR(void) videoTag, unsigned int no, std::vector< bool >&whichCams) const;
+        /**
+         * @brief List of 2D visible points for a cam and optionally the videoTag pointer
+         * When videoTag is not given, provide the point coordinates for all videoTag
+         * @return Number of points returned
+         */
+        ARLCORE_API unsigned int getPoints( std::vector<Point::csptr>& pl, unsigned int cam, SPTR(void) videoTag=  SPTR(void)() ) const;
+
+        /**
+         * @brief List of 2D points for a cam and optionally the videoTag pointer
+         * @return Number of points returned
+         */
+        ARLCORE_API unsigned int getPoints( PointList::sptr, unsigned int cam, SPTR(void) videoTag=  SPTR(void)() ) const;
+        ARLCORE_API unsigned int getInvisiblePoints( std::vector<Point::csptr>&, unsigned int cam, SPTR(void) t= SPTR(void)() ) const;
+
+        //! @brief Visible 2D point in the camera 'cam' which is the TagId point in VideoTag t
+        ARLCORE_API bool getPoint( Point::csptr&, unsigned int cam, SPTR(void) t, unsigned int TagId ) const;
+
+        //! @brief Clear the list and all points
+        ARLCORE_API bool clear( void );
+
+        //! @brief Number of points in the list tagged with the triplet (cam,videotag,fringe)
+        ARLCORE_API unsigned int size( unsigned int cam, SPTR(void) videoTag=  SPTR(void)(), int fringe=0 ) const;
+
+    protected:
+        //! @return A list among m_listOfLists or m_listsByCam in function of the triplet
+        std::vector< Point::csptr >& privateGetList( unsigned int cam, SPTR(void) videoTag= SPTR(void)(), int fringe=0 );
+
+        //! @return Hash code for the triplet : hashcode = hash(cam, videoTag, fringe)
+        double hash( unsigned int cam, SPTR(void) videoTag, int fringe=0 ) const;
+
+        //! @return the triplet for a hashcode :  (cam, videoTag, fringe) = unhash(hashcode)
+        bool unhash( double key, unsigned int &cam, SPTR(void) videoTag , int &fringe ) const;
+
+
+    private:
+        struct mapOrder
+        {
+            bool operator()(double d1, double d2) const
+            {return d1<d2;}
+        };
+        /**
+         * @brief Map of pairs ( hashcode , index in m_listOfLists )
+         * if a list with the triplet (cam, videotag, fringe) exists
+         * m_mapOfLists contains its index in m_listOfLists
+         */
+        std::map< double, unsigned int, mapOrder > m_mapOfLists;
+
+        /**
+         * @brief Contain a list of lists of points according to triplet association in m_mapOfLists
+         * The first element is always an empty list
+         */
+        std::vector< std::vector< Point::csptr > > m_listOfLists;
+
+        //! @brief Each element of the vector contained the complete list of points for a camera
+        std::vector< std::vector< Point::csptr > > m_listsByCam;
+    };
+
+    /**
+    * @brief Calcule les appariements epipolaires pour n cameras
+    * @param[in] cameras Liste des cameras
+    * @param[in] points2D Listes des points2D pour chaque camera
+    * @param[out] matching Liste des appariements. Contient une liste de pointeurs sur les points 2D de chaque camera. En cas de non appariement le pointeur est nul.
+    * @param[in] gaussianNoise Bruit moyen en pixels sur les points 2D détectés ou cliqués
+    * @return Nombre d'appariements
+    */
+    ARLCORE_API unsigned int epipolarMatching( const std::vector<Camera>& cameras, CSPTR( SmartPointList ) points2D, std::vector< std::vector<Point::csptr> >&matching, double gaussianNoise );
+
+/*  class SynchronizedList
+    {
+    public:
+
+        // Create an empty point
+        ARLCORE_API SynchronizedList( void );
+        ARLCORE_API ~SynchronizedList( void );
+
+        ARLCORE_API unsigned int size( void ) const;
+        ARLCORE_API unsigned int addList( const PointsCont &list );
+        ARLCORE_API long int operator []( unsigned int i ) const;
+        ARLCORE_API bool getLists( MultiPointsCont* &lists );
+
+        ARLCORE_API bool print( void ) const;
+
+    private:
+        void destroy( void );
+        unsigned int erase( long int time);
+
+        std::vector<long int> m_timeStamps;
+        MultiPointsCont m_lists;
+    };*/
+} // namespace arlCore
+#endif // _ARLCORE_SmartPointList_H
diff --git a/SrcLib/ARLcore/include/arlcore/Tag.h b/SrcLib/ARLcore/include/arlcore/Tag.h
new file mode 100644
index 0000000..42828e1
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Tag.h
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_TAG_H
+#define _ARLCORE_TAG_H
+
+#include <fwCore/macros.hpp>
+#include <arlcore/Common.h>
+
+#include <arlcore/Object.h>
+#include <arlcore/Particle.h>
+#include <arlcore/Parameters.h>
+#include <arlcore/PointsList.h>
+
+namespace arlCore
+{
+    enum ARLCORE_TAG_PARAMETERS { ARLCORE_TAGFLAG_REGISTRATION_ERROR_EVALUATION, ARLCORE_TAG_REGISTRATION_MAXERROR, ARLCORE_TAG_NBPARAMETERS };
+    static std::string ARLCORE_TAGPARAMETERS_NAMES[ARLCORE_TAG_NBPARAMETERS]={ "Registration error evaluation","Registration max error" };
+    static boost::any ARLCORE_TAGPARAMETERS_DEFAULTS[ARLCORE_TAG_NBPARAMETERS]={ true, 0.0 };
+
+    class PlaneSystem;
+
+    /**
+     * @date    2007
+     * @brief   Detection tag
+     */
+    class ARLCORE_CLASS_API Tag :  public Particle, public arlCore::Parameters
+    {
+    public:
+
+        fwCoreClassDefinitionsWithNFactoriesMacro( (Tag)(::fwTools::Object),
+                                                   ((TagFactory ,((arlCore::PlaneSystem &)) ((const std::string &)) ))
+                                                   ((TagFactory ,(( arlCore::PlaneSystem &)) ((PointList::csptr)) ))
+                                                 );
+
+        ARLCORE_API static Tag::sptr TagFactory( arlCore::PlaneSystem &universe, const std::string &name);
+        ARLCORE_API static Tag::sptr TagFactory( arlCore::PlaneSystem &universe, PointList::csptr );
+
+        /**
+        * @brief Type of registration
+        * ARL_TAG_REGISTRATION_3D3D : Registration with matching 3D point
+        * ARL_TAG_REGISTRATION_3DWO : Registration without matching 3D point
+        * ARL_TAG_REGISTRATION_ICP : ICP registration between 2 clouds of 3D points
+        */
+        enum ARLCORE_TAG_REGISTRATION_TYPE { ARLCORE_TAG_REGISTRATION_UNKNOWN, ARLCORE_TAG_REGISTRATION_NONE,
+                    ARLCORE_TAG_REGISTRATION_3D3D, ARLCORE_TAG_REGISTRATION_3DWO,
+                    ARLCORE_TAG_REGISTRATION_ICP, ARLCORE_TAG_REGISTRATION_NBTYPES };
+
+        //! @brief Constructor with a filename
+        ARLCORE_API Tag( arlCore::PlaneSystem &universe, const std::string &name );
+
+        //! @brief Constructor with a pointlist for tag's geometry
+        ARLCORE_API Tag( arlCore::PlaneSystem &universe, PointList::csptr );
+
+        //! @brief Destructor
+        ARLCORE_API ~Tag( void );
+
+        ARLCORE_API bool init( void );
+        ARLCORE_API std::string getString( void ) const;
+
+        //! @return Measure plane
+        ARLCORE_API unsigned int getMeasuresPlane() const;
+
+        //! @return Number of geometry points
+        ARLCORE_API unsigned int getNbPoints() const;
+
+        //! @return Reference on geometry's pointlist
+        ARLCORE_API arlCore::PointList::csptr getGeometry() const;
+
+        //! @return Reference on geometry's pointlist
+        ARLCORE_API arlCore::PointList::sptr getGeometry();
+
+        //! @return Reference on measures's pointlist
+        ARLCORE_API arlCore::PointList::csptr getMeasures() const;
+
+        //! @return Reference on measures's pointlist
+        ARLCORE_API arlCore::PointList::sptr getMeasures();
+
+        //! @return Registration type
+        ARLCORE_API ARLCORE_TAG_REGISTRATION_TYPE getRegistrationType( void );
+
+        //! @return Maximum error for registration
+        ARLCORE_API double getRegistrationMaxError( void );
+
+        //! @brief Set maximum error for registration
+        ARLCORE_API void setRegistrationMaxError( double error );
+
+        //! @brief Reset points visibilities, origin plane before new detection
+        ARLCORE_API void reset( void );
+
+        /**
+        * @brief Set a transformation between Tag's plane -> plane (ie : Video's plane)
+        * @param[in] plane Plane of the
+        * @param[in] T Transformation
+        * @param[in] reset If true, measures are all computed from T
+        * @param[in] date & time of the measure
+        * @return false if RMS>getRegistrationMaxError()
+        */
+        ARLCORE_API bool setRegistration( unsigned int plane, arlCore::vnl_rigid_matrix &T, long int date, long int time, bool reset );
+
+        ARLCORE_API double getPersistence( void ) const{return m_persistence;}
+        ARLCORE_API void setPersistence( double p ){m_persistence=p;}
+
+    protected:
+        PointList::sptr m_geometry; //3D
+        PointList::sptr m_measures; //3D
+        unsigned int m_measuresPlane;
+        ARLCORE_TAG_REGISTRATION_TYPE m_registrationType;
+        double m_registrationMaxError;
+        double m_persistence;
+
+    };
+} // namespace arlCore
+#endif // _ARLCORE_TAG_H
diff --git a/SrcLib/ARLcore/include/arlcore/Tags.h b/SrcLib/ARLcore/include/arlcore/Tags.h
new file mode 100644
index 0000000..0bd4bf4
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Tags.h
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_TAGS_H
+#define _ARLCORE_TAGS_H
+#include <arlcore/Common.h>
+
+#include <arlcore/PlaneSystem.h>
+#include <fwCore/macros.hpp>
+#include <arlcore/Tag.h>
+
+namespace arlCore
+{
+    class Object;
+    class Tags : public fwTools::Object
+    {
+    /**
+     * @class   Tags
+     * @date    2007
+     * @brief   Ensemble de tags de detection
+     */
+    public:
+
+        fwCoreClassDefinitionsWithNFactoriesMacro( (Tags)(::fwTools::Object),
+                                                   ((TagsFactory ,((arlCore::PlaneSystem &)) ((const std::string &)) ))
+                                                 );
+
+        ARLCORE_API static Tags::sptr TagsFactory( arlCore::PlaneSystem &universe, const std::string &name);
+
+        //! @brief Constructor
+        ARLCORE_API Tags( PlaneSystem &universe, const std::string &name="" );
+
+//        //! @brief Constructor by copy
+//        ARLCORE_API Tags( const Tags& );
+
+        //! @brief Affectation
+        //VAG ARLCORE_API Tags& operator=( const Tags& );
+
+        //! @brief Destructor
+        ARLCORE_API ~Tags( void);
+
+        ARLCORE_API std::string getString( void ) const;
+
+        ARLCORE_API bool save( const std::string &fileName, bool overwrite=true ) const;
+
+        ARLCORE_API bool load( const std::string &fileName );
+
+        virtual ARLCORE_API SPTR(Tag) addTag( CSPTR( PointList ) pl );
+
+        virtual ARLCORE_API bool delTag( CSPTR(Tag) );
+
+        ARLCORE_API Tag::csptr getTag( unsigned int index ) const;
+
+        ARLCORE_API SPTR(Tag) getTag( unsigned int index );
+
+        ARLCORE_API unsigned int size( void ) const;
+
+    protected:
+        ARLCORE_API bool reset( void );
+        ARLCORE_API bool copy(  CSPTR(Tags)  );
+        CSPTR(Tag) addTag( SPTR(Tag) );
+
+        PlaneSystem &m_universe;
+        std::vector< SPTR(Tag) > m_tags;
+    };
+} // namespace arlCore
+#endif // _ARLCORE_TAGS_H
diff --git a/SrcLib/ARLcore/include/arlcore/Tracker.h b/SrcLib/ARLcore/include/arlcore/Tracker.h
new file mode 100644
index 0000000..b599d01
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Tracker.h
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_TRACKER_H
+#define _ARLCORE_TRACKER_H
+#include <arlcore/Common.h>
+
+#include <arlcore/Object.h>
+
+namespace arlCore
+{
+    class Tracker : public arlCore::Object
+    {
+    /**
+     * @class   Tracker
+     * @date    2007
+     * @brief   TODO commentaire ?? Tracker
+     */
+    public:
+        //! @brief Constructor
+        ARLCORE_API Tracker( const std::string &name="" );
+
+        //! @brief Destructor
+        ARLCORE_API ~Tracker( void );
+
+        //! @return Description of the current tracker
+        ARLCORE_API std::string getString( void ) const;
+
+    private:
+    };
+} // namespace arlCore
+#endif // _ARLCORE_TRACKER_H
diff --git a/SrcLib/ARLcore/include/arlcore/Type.h b/SrcLib/ARLcore/include/arlcore/Type.h
new file mode 100644
index 0000000..8987d4c
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/Type.h
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_TYPE_H
+#define _ARLCORE_TYPE_H
+
+//const double PI = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
+
+#if defined( _MSC_VER )
+
+// The Visual C++ debugger doesn't know string
+// larger than 255 char. STL often creates large
+// symbol. The following line cancels warning
+// created by Visual.
+#pragma warning (disable : 4786)
+
+// need a dll interface 
+// (Un classe de base ou une structure doit �tre d�clar�e avec 
+// le mot cl� __declspec(dllexport) pour qu'une fonction d'une 
+//classe d�riv�e soit export�e)
+#pragma warning (disable:4251)
+
+// The following line prevents from this file to
+// be included several times by the compiler with
+// Visual C++. This makes compiling quicker, but
+// must not be used when your file content may
+// change depending on some macro definitions. In
+// the general case, leave these lines as they
+// are.
+#pragma once
+
+#else
+
+#include <typeinfo>
+
+#endif
+
+#include <cassert>
+
+#ifdef __MACOSX__
+#include <sys/types.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _SINT64
+typedef int64_t sint64;
+#define _SINT64
+#endif
+#ifndef _UINT64
+typedef uint64_t uint64;
+#define _UINT64
+#endif
+#ifndef _SINT32
+typedef int32_t sint32;
+#define _SINT32
+#endif
+#ifndef _SINT16
+typedef int16_t sint16;
+#define _SINT16
+#endif
+#ifndef _SINT8
+typedef int8_t sint8;
+#define _SINT8
+#endif
+#ifndef _UINT32
+typedef uint32_t uint32;
+#define _UINT32
+#endif
+#ifndef _UINT16
+typedef uint16_t uint16;
+#define _UINT16
+#endif
+#ifndef _UINT8
+typedef uint8_t uint8;
+#define _UINT8
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#else
+#ifdef __STDC__
+typedef signed char int8;       // NB: non-ANSI compilers may not grok
+#else
+typedef char int8;
+#endif
+typedef unsigned char                           uint8;
+typedef unsigned short                          uint16;
+typedef short int16;
+#if defined(__alpha) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64)
+typedef int int32;
+typedef unsigned int uint32;    // sizeof (uint32) must == 4
+#else
+typedef long int32;
+typedef unsigned long uint32;   // sizeof (uint32) must == 4
+#endif
+typedef unsigned long long                      uint64;
+#endif
+
+typedef struct
+{
+    uint32 Low; //UINT32
+    uint32 High; //UINT32
+}uint32HL;
+
+// Use only when you decide to delegate size to compiler
+//typedef int       int;
+typedef unsigned int    uint; 
+typedef unsigned long   ulong;
+typedef unsigned short  ushort;
+typedef signed char     schar;
+#ifndef uchar
+    #ifndef _CV_H_
+        typedef unsigned char   uchar;
+    #endif
+#endif
+
+// For 64 bits
+// For MSVC : __int64
+//typedef long long int64;
+
+#endif // _ARLCORE_TYPE_H
diff --git a/SrcLib/ARLcore/include/arlcore/UncertaintyPropag.h b/SrcLib/ARLcore/include/arlcore/UncertaintyPropag.h
new file mode 100644
index 0000000..dbcd226
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/UncertaintyPropag.h
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_UNCERTAINTYPROPAG_H
+#define _ARLCORE_UNCERTAINTYPROPAG_H
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <string>
+
+#include <arlcore/Camera.h>
+#include <arlcore/Reconst3D.h>
+
+//#define DEFAULT_MODEL "synthe.CKeys1"
+//#define DEFAULT_SCENE "synthe.CKeys2"
+
+namespace arlCore
+{
+    /**
+     * @brief Compute the covariance of a 3D point which is reconstructed from several (at least 2) video
+     * image. Obviously, we consider that cameras are jointly calibrated. After computation, the covariance
+     * matrix of the 3D Point is updated. Do not forget that you MUST fill the covariance matrix of each
+     * 2D Point in list2D.
+     *
+     * Up to now, covariance computation is available for ARLCORE_R3D_REPROJECTION_OPTIMIZATION,
+     * ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY and ARLCORE_R3D_TWO_LINES_APPROX only.
+     *
+     * @param[in] list2D[i] : 2D detection of the 3D point in the i-th camera
+     * @param[in] camsList[i] : camera parameters of the i-th camera
+     * @param[in] point3D : 3D coordinates of the reconstructed point
+     * @param[in] methode : method used to recontruct the point in 3D (see Reconst3D.h)
+     * @param[out] log : still not used
+     * @param[in] pixelFrame : still not used
+     *
+     */
+    ARLCORE_API bool propagateCovarianceToReconst3D( const std::vector<arlCore::Point::csptr>&list2D, const std::vector<const arlCore::Camera*> &camsList,
+         SPTR( Point ) point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, std::vector<double> &log, const bool pixelFrame);
+
+    ARLCORE_API void WriteTableau ( char *nom, std::vector<double> tab, unsigned int n );
+    /**
+     * @brief Khi Square Validation for 3 dimensional data
+     *
+     */
+    ARLCORE_API double* KSValidation3D(char *index_file);
+    ARLCORE_API double CumulativeChi2_3(double mu2);
+
+    /**
+     * @brief Probabilistic tests and densities
+     *
+     */
+    ARLCORE_API double ProbKSTest(double alam); /* Kolmogorov-Smirnov probability */
+    ARLCORE_API double LnGamma(double xx); /* ln(Gamma(a,x)) */
+    ARLCORE_API double IncompleteGammaP(double a, double x);
+    ARLCORE_API double CumulativeChi2(double mu2, int n);
+
+    ARLCORE_API double IncompleteBetaI(register double a, register double b,register  double x);
+    ARLCORE_API double CumulativeFisher(double a, double b, double x);
+    ARLCORE_API double CumulativeHotelling(double p, double n, double x);
+
+    ARLCORE_API double SimpleKSTest( double *data, int n, double (*pdf)(double),
+                    double *d);/* Simple Kolmogorov-Smirnov test */
+    ARLCORE_API double DoubleKSTest( double *data1, int n1, double *data2, int n2,
+                double *d);/* DoubleKolmogorov-Smirnov test */
+} // namespace arlCore
+#endif //_ARLCORE_UNCERTAINTYPROPAG_H
diff --git a/SrcLib/ARLcore/include/arlcore/UnitTestArlCore.h b/SrcLib/ARLcore/include/arlcore/UnitTestArlCore.h
new file mode 100644
index 0000000..6fca564
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/UnitTestArlCore.h
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ARLCORE_UNITTEST_H
+#define _ARLCORE_UNITTEST_H
+
+//#ifdef _WIN32
+#include <arlcore/Common.h>
+
+#include <vector>
+#include <vnl/vnl_vector.h>
+
+namespace arlCore
+{
+/**
+ * @Brief Tests sur les reconstructions 3D, recalages 3D/2D, 3D/3D
+ */
+    // 3D Reconstruction
+    ARLCORE_API bool testReconstructionPolyscopic( long int nbIterations, double tolerance );//TODO rajouter le tirage des transformations aléatoires 
+    ARLCORE_API bool testReconstructionPolyscopicUncertainty( long int nbIterations, double tolerance);
+
+    // Calibration
+    ARLCORE_API bool testIntrinsicCalibration( long int nbIterations, double tolerance );
+    ARLCORE_API bool testInitIntrinsicCalibration( long int nbIterations, double tolerance );
+    ARLCORE_API bool testExtrinsicCalibration( long int nbIterations, double tolerance );
+    ARLCORE_API bool testInitExtrinsicCalibration( long int nbIterations, double tolerance );
+
+    // Matching
+    ARLCORE_API bool test3D3DMatching( long int nbIterations, double tolerance );
+    ARLCORE_API bool testEpipolarMatching( long int nbIterations, double tolerance );
+
+    /*
+     *@brief  Validate the 3D3D Point Registration algorithm available in MatrixR::register3D3D.
+     * Each iteration generates 2 point clouds of identical shape. The algorithm registers them
+     * minimizing the registration error sum || TxM_i - N_i ||^2 where T is the rigid transformation,
+     * M_i (N_i) the set of the 1st (2nd) point cloud. The accuracy of the found 
+     * rigid transformation is evaluated by comparing T and the ground truth
+     */ 
+    ARLCORE_API bool testRegistration3D3D( long int nbIterations, double tolerance );
+    /**
+     * @brief TODO
+     * 
+     */
+    ARLCORE_API bool testICPRegistration( long int nbIterations, double tolerance );
+    /**
+     * @brief Validate the 3D3D Point Registration algorithm available in MatrixR::register3D3DUncertainty
+     * Each iteration generates 2 point clouds of identical shape. The algorithm registers them
+     * minimizing the registration error sum ( TxM_i - N_i )^t * cov^(-1) * ( TxM_i - N_i )
+     *  where T is the rigid transformation M_i (N_i) the set of the 1st (2nd) point cloud. 
+     * The accuracy of the found rigid transformation is evaluated by comparing T and the ground truth
+     */
+    ARLCORE_API bool testRegistration3D3DUncertainty( long int nbIterations, double tolerance );
+    /**
+     * @brief TODO
+     * 
+     */
+    ARLCORE_API bool testRegistration3D3DwithoutMatching( long int nbIterations, double tolerance );
+
+    /**
+     * @brief Validate the 3D/2D point registration algorithms. A scene with several cameras is
+     * generated. The cameras are looking at an object positioned in camera space (3D point list M_i).
+     * The 2D reprojection of these 3D points in each camera are available. 
+     * A 3D model of this object in its own frame is available (3D point list_N_i).
+     * The Unit test compute the 3D 2D point registration between the model and the camera frame. For
+     * example, when the ISPPC criterion is used, we seek T so that sum || P_i(TxN_j) - m_i_j ||^2
+     * is minimal (where P_i is the projective function of the i-th camera, m_i_j the reprojection of
+     * the j-th point in the i-th camera.
+     * The accuracy of the found rigid transformation is evaluated by comparing T and the ground truth 
+     * 
+     */
+    ARLCORE_API bool testProjectiveRegistration( long int nbIterations, double tolerance );
+    ARLCORE_API bool testHomographyRegistration( long int nbIterations, double tolerance );
+
+    /**
+     * @brief TODO
+     * 
+     */
+    ARLCORE_API bool testRegistrationCriteriaComparison( long int nbIterations, std::vector<double> parameters, std::vector<double> staticStatus,std::vector< vnl_vector<double>* > , std::vector< vnl_vector<double>* > , std::vector< vnl_vector<double>* >   );
+
+    // Sphere Center Estimation from a 3D point cloud
+    ARLCORE_API bool testSphereCenterEstimation( long int nbIterations, double tolerance );
+    
+    // Others
+    ARLCORE_API bool testRigidTransfo( unsigned int nbIterations, double tolerance );
+    ARLCORE_API bool testPolynomialFieldDistortion( long int nbIterations, double tolerance );
+} // namespace arlCore
+
+//#endif // _WIN32
+
+#endif // _ARLCORE_UNITTEST_H
diff --git a/SrcLib/ARLcore/include/arlcore/vnl_covariance_matrix.h b/SrcLib/ARLcore/include/arlcore/vnl_covariance_matrix.h
new file mode 100644
index 0000000..8998332
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/vnl_covariance_matrix.h
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VNL_COVARIANCE_VECTOR_H
+#define _VNL_COVARIANCE_VECTOR_H
+#include <arlcore/Common.h>
+
+#include <vnl/vnl_matrix.h>
+
+namespace arlCore
+{
+    class vnl_covariance_matrix : public vnl_matrix<double>
+    {
+    /**
+     * @class   vnl_covariance_vector
+     * @date    2007
+     * @brief   Covariance matrix
+     */
+    public:
+        //! @brief Constructor of a n x n covariance matrix filled with 0.0
+        ARLCORE_API vnl_covariance_matrix( unsigned int n );
+
+        //! @brief Default constructor of a 0 x 0 covariance matrix
+        ARLCORE_API vnl_covariance_matrix( void );
+
+        //! @brief Copy constructor
+        ARLCORE_API vnl_covariance_matrix( const vnl_covariance_matrix& );
+
+        //! @brief Destructor
+        ARLCORE_API ~vnl_covariance_matrix( void );
+
+        //! @brief Affectation (Get the new size)
+        ARLCORE_API vnl_covariance_matrix& operator=( const vnl_covariance_matrix& );
+
+        /**
+         * @brief Confidence ellipse for 2 x 2 matrix
+         * @result False if the matrix isn't a 2 x 2 matrix
+         */
+        ARLCORE_API bool errorEllipse( double &a2, double &b2, double &theta ) const;
+
+    private:
+        //! @brief Private copy
+        void copy_in( const vnl_covariance_matrix& );
+    };
+} // namespace arlCore
+#endif // _VNL_COVARIANCE_VECTOR_H
diff --git a/SrcLib/ARLcore/include/arlcore/vnl_rigid_vector.h b/SrcLib/ARLcore/include/arlcore/vnl_rigid_vector.h
new file mode 100644
index 0000000..71cdad0
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/vnl_rigid_vector.h
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VNL_RIGID_VECTOR_H
+#define _VNL_RIGID_VECTOR_H
+#include <arlcore/Common.h>
+
+#include <vnl/vnl_vector_fixed.h>
+#include <vnl/vnl_vector.h>
+
+namespace arlCore
+{
+    class vnl_rigid_matrix;
+    class vnl_rotation3d_vector;
+    class vnl_rigid_vector : public vnl_vector_fixed<double,6>
+    {
+    /**
+     * @class   vnl_rigid_vector
+     * @date    2007
+     * @brief   Rigid transformation vector
+     * Vector representation, useful for optimization
+     * [0,3] : Rotation vector
+     * [4,6] : Translation vector
+     */
+    public:
+        //! @brief Default constructor
+        ARLCORE_API vnl_rigid_vector( void );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rigid_vector( const vnl_vector<double>& );
+
+        //! @brief Constructor by copy
+        ARLCORE_API vnl_rigid_vector( const vnl_rigid_vector& );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rigid_vector( const vnl_rigid_matrix& );
+
+        //! @brief Destructor
+        ARLCORE_API ~vnl_rigid_vector( void );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_vector& operator=( const vnl_vector<double>& );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_vector& operator=( const vnl_rigid_vector& );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rigid_vector& operator=( const vnl_rigid_matrix& );
+
+        //! @brief add a gaussian noise on each composant of vector
+        void addGaussianNoise( double std );
+
+        //! @return Rotation vector
+        ARLCORE_API vnl_rotation3d_vector getRotation3dVector( void ) const;
+
+        //! @return Translation vector
+        ARLCORE_API vnl_vector_fixed<double,3> getTranslation( void ) const;
+
+    private:
+        //! @brief Private copy
+        void copy_in( const vnl_vector<double>& );
+
+        //! @brief Private copy
+        void copy_in( const vnl_rigid_vector& );
+
+        //! @brief Private copy
+        void copy_in( const vnl_rigid_matrix& );
+    };
+} // namespace arlCore
+#endif // _VNL_RIGID_VECTOR_H
diff --git a/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_matrix.h b/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_matrix.h
new file mode 100644
index 0000000..aa4b08a
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_matrix.h
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VNL_ROTATION3D_MATRIX_H
+#define _VNL_ROTATION3D_MATRIX_H
+#include <arlcore/Common.h>
+
+#include <vnl/vnl_matrix_fixed.h>
+#include <vector>
+
+namespace arlCore
+{
+    class vnl_rotation3d_vector;
+    class vnl_rotation3d_matrix : public vnl_matrix_fixed<double,3,3>
+    {
+    /**
+     * @class   vnl_rotation3d_matrix
+     * @date    2007
+     * @brief   Matrice de rotation 3x3
+     * vnl_rotation3d_matrix sp�cialise une matrice quelconque 3x3
+     * Des m�thodes permettent de tester ses propri�t�s ou de trouver la matrice de rotation exacte la plus proche
+     */
+    public:
+        //! @brief Default constructor
+        ARLCORE_API vnl_rotation3d_matrix( void );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rotation3d_matrix( const vnl_rotation3d_vector& );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rotation3d_matrix( const vnl_matrix_fixed<double,3,3>& );
+
+        /**
+         * @Brief Constructor : Initialization by Euler angles
+         * Notations : cf http://mathworld.wolfram.com/EulerAngles.html
+         * @param phi = rotation about the z-axis
+         * @param theta = rotation about the x-axis [0,Pi]
+         * @param psy = rotation about z-axis(again)
+         */
+        ARLCORE_API vnl_rotation3d_matrix( double phi, double theta, double psy );
+
+        //! @brief Destructor
+        ARLCORE_API ~vnl_rotation3d_matrix( void );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rotation3d_matrix& operator=( const vnl_rotation3d_vector& );
+
+        //! @brief Affectation
+        ARLCORE_API vnl_rotation3d_matrix& operator=( const vnl_matrix_fixed<double,3,3>& );
+
+        //! @brief Conversion
+        ARLCORE_API vnl_matrix<double> as_matrix( void );
+
+        //! @brief Is it a correct rotation matrix ?
+        ARLCORE_API bool is_rotation( void ) const;
+
+        //! @brief If it's possible, current rotation matrix takes the closest real rotation in sense of Frobenius norm
+        ARLCORE_API bool closest_rotation( void );
+        
+        //! @brief compute the distance in riemannian sense between the current matrix and B
+        ARLCORE_API double sq_rieman_dist( const vnl_rotation3d_matrix &B );
+
+        //! @brief compute the gravity center of the rotation matrix list (in riemannian sense)
+        //  @out distance between the gravity center and the matrix list (TODO not implemented) 
+        ARLCORE_API double average_rotation3d ( const std::vector< vnl_rotation3d_matrix * > &);
+
+    private:
+        //! @brief Private copy
+        void copy_in( const vnl_rotation3d_vector& );
+
+        //! @brief Private copy
+        void copy_in( const vnl_matrix_fixed<double,3,3>& );
+    };
+} // namespace arlCore
+#endif // _VNL_ROTATION3D_MATRIX_H
diff --git a/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_vector.h b/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_vector.h
new file mode 100644
index 0000000..6d14be7
--- /dev/null
+++ b/SrcLib/ARLcore/include/arlcore/vnl_rotation3d_vector.h
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VNL_ROTATION3D_VECTOR_H
+#define _VNL_ROTATION3D_VECTOR_H
+#include <arlcore/Common.h>
+
+#include <vnl/vnl_vector_fixed.h>
+
+namespace arlCore
+{
+    class vnl_rotation3d_matrix;
+    class vnl_rotation3d_vector : public vnl_vector_fixed<double,3>
+    {
+    /**
+     * @class   vnl_rotation3d_matrix
+     * @date    2007
+     * @brief   Vecteur rotation
+     * L'axe de rotation est d�termin� par la direction du vecteur
+     * L'angle est d�termin� par la norme du vecteur modulo 2Pi dans le sens direct
+     */
+    public:
+        //! @brief Default constructor
+        ARLCORE_API vnl_rotation3d_vector( void );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rotation3d_vector( double, double, double );
+
+        //! @brief Constructor
+        ARLCORE_API vnl_rotation3d_vector( const vnl_rotation3d_matrix& );
+
+        //! @brief Destructor
+        ARLCORE_API ~vnl_rotation3d_vector( void );
+
+        //! @brief Copy
+        ARLCORE_API vnl_rotation3d_vector& operator=( const vnl_rotation3d_matrix& );
+
+        /**
+        * @brief modulo
+        * Normalise la norme du vecteur dans l'intervalle [-Pi,Pi[
+        */
+        ARLCORE_API void modulo();
+
+        /**
+        * @brief Applique un bruit gaussien sur la direction et l'angle
+        * Gaussienne centr�e sur le vecteur rotation et d'�cart type std
+        */
+        ARLCORE_API void add_gaussian_noise( double std );
+
+        /**
+        * @brief Retourne un vecteur rotation al�atoire
+        * Direction et angle al�atoires et ind�pendants
+        */
+        ARLCORE_API void uniform_random( void );
+
+        /**
+        * @brief Retourne Theta en coordonn�es sph�riques
+        * In curvilinear coordinates, Theta is the azimuthal angle in the xy-plane from the x-axis in [0,2Pi[
+        * Ref : http://mathworld.wolfram.com/SphericalCoordinates.html
+        */
+        ARLCORE_API double getTheta( void );
+
+        /**
+        * @brief Retourne Theta en coordonn�es sph�riques
+        * In curvilinear coordinates, Phi is the polar angle in the z-axis in [0,Pi]
+        * Ref : http://mathworld.wolfram.com/SphericalCoordinates.html
+        */
+        ARLCORE_API double getPhi( void );
+
+    private:
+        //! @brief Private copy
+        bool copy_in ( const vnl_rotation3d_matrix& );
+    };
+} // namespace arlCore
+#endif // _VNL_ROTATION3D_VECTOR_H
diff --git a/SrcLib/ARLcore/src/arlcore/Calibration.cpp b/SrcLib/ARLcore/src/arlcore/Calibration.cpp
new file mode 100644
index 0000000..b304300
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Calibration.cpp
@@ -0,0 +1,625 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Calibration.h>
+
+#include <vnl/algo/vnl_levenberg_marquardt.h>
+#include <vnl/algo/vnl_powell.h>
+#include <vnl/vnl_cross.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+
+#include <arlcore/Reconst3D.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Optimization.h>
+#include <arlcore/vnl_rigid_vector.h>
+
+/**
+ * @brief This method of intrinsic parameter initilisation is taken from the paper of Z. Zhang:
+ * A Flexible New Technique for Camera Calibration in IEEE Transactions on Pattern Analysis
+ * and Machine Intelligence Volume 22 ,  Issue 11  (November 2000) pages: 1330 - 1334
+ *
+ * The notations of the paper have been keeped
+ */
+bool arlCore::initIntrinsicCalibration(const std::vector<arlCore::PointList::csptr> &model3DList, const std::vector <arlCore::PointList::csptr> &points2DList, arlCore::Camera &camera , std::vector< vnl_rigid_matrix> &liste_extrinsic, const std::vector<double> &optimiserParameters, std::vector<double> &log)
+{
+    assert(model3DList.size()>0 && points2DList.size()>0);
+    assert(model3DList.size()==1 || model3DList.size()==points2DList.size());
+    const bool Verbose = false;
+    std::vector< vnl_matrix_fixed<double,3,3> > liste_H(points2DList.size());
+    const unsigned int NbPoses=(unsigned int)points2DList.size();
+    unsigned int i, j;
+    std::vector< double> optimiserParameters_tmp;// to get the reprojection error of the homography
+    optimiserParameters_tmp.push_back(1.0);
+    log.push_back(model3DList.size());//log[0] contains the number of pose
+    for( i=0 ; i<NbPoses ; ++i )
+    {
+        if(model3DList.size()==1) j=0; else j=i;
+        std::vector<double> log_tmp;
+        planarHomographyUnknownIntrinsic( points2DList[i], model3DList[j], liste_H[i], optimiserParameters_tmp, log_tmp, true);
+        if(Verbose)
+        {
+            std::cerr<<"H["<<i<<"]=" << liste_H[i]/liste_H[i](2,2)<<std::endl;
+            std::cerr<<"Homography reprojection error="<< log_tmp[0] <<std::endl;
+        }
+        log.push_back(log_tmp[0]/model3DList[i]->size()); //log reprojection error after homography computation
+    }
+    ///////////////////////// v_12 , v_11 et v_22 are created /////////////////////////
+    std::vector< vnl_vector_fixed<double, 6> > v_12(NbPoses), v_11(NbPoses), v_22(NbPoses);
+    for( i=0 ; i<NbPoses ; ++i )
+    {// Vector are filled like in the Zhang's paper
+        v_11[i](0) = liste_H[i](0,0)*liste_H[i](0,0);
+        v_11[i](1) = liste_H[i](0,0)*liste_H[i](1,0) + liste_H[i](1,0)*liste_H[i](0,0);
+        v_11[i](2) = liste_H[i](1,0)*liste_H[i](1,0);
+        v_11[i](3) = liste_H[i](2,0)*liste_H[i](0,0) + liste_H[i](0,0)*liste_H[i](2,0);
+        v_11[i](4) = liste_H[i](2,0)*liste_H[i](1,0) + liste_H[i](1,0)*liste_H[i](2,0);
+        v_11[i](5) = liste_H[i](2,0)*liste_H[i](2,0);
+
+        v_12[i](0) = liste_H[i](0,0)*liste_H[i](0,1);
+        v_12[i](1) = liste_H[i](0,0)*liste_H[i](1,1) + liste_H[i](1,0)*liste_H[i](0,1);
+        v_12[i](2) = liste_H[i](1,0)*liste_H[i](1,1);
+        v_12[i](3) = liste_H[i](2,0)*liste_H[i](0,1) + liste_H[i](0,0)*liste_H[i](2,1);
+        v_12[i](4) = liste_H[i](2,0)*liste_H[i](1,1) + liste_H[i](1,0)*liste_H[i](2,1);
+        v_12[i](5) = liste_H[i](2,0)*liste_H[i](2,1);
+
+        v_22[i](0) = liste_H[i](0,1)*liste_H[i](0,1);
+        v_22[i](1) = liste_H[i](0,1)*liste_H[i](1,1) + liste_H[i](1,1)*liste_H[i](0,1);
+        v_22[i](2) = liste_H[i](1,1)*liste_H[i](1,1);
+        v_22[i](3) = liste_H[i](2,1)*liste_H[i](0,1) + liste_H[i](0,1)*liste_H[i](2,1);
+        v_22[i](4) = liste_H[i](2,1)*liste_H[i](1,1) + liste_H[i](1,1)*liste_H[i](2,1);
+        v_22[i](5) = liste_H[i](2,1)*liste_H[i](2,1);
+    }
+    vnl_matrix<double> V(2*NbPoses, 6);
+    for( i=0 ; i<NbPoses ; ++i )
+    {
+        V.set_row(2*i,v_12[i].as_vector() );
+        V.set_row(2*i+1, (v_11[i] - v_22[i]).as_vector() );
+    }
+    vnl_svd<double> svd(V);
+    vnl_vector_fixed<double, 6> b = svd.nullvector();
+    //Extraction des parametres intrinseques tjs selon le papier zhang b=[B11 B12 B22 B13 B23 B33]
+    //                                                                    b(0)b(1)b(2)b(3)b(4)b(5)
+    const double NearZero = 0.0; //FIXME
+    assert(fabs(b(0)*b(2)-b(1)*b(1))>NearZero);
+    if(fabs(b(0)*b(2)-b(1)*b(1))<=NearZero) return false;
+    const double cy = (b(1)*b(3) - b(0)*b(4))/ ( b(0)*b(2)-b(1)*b(1) );
+    assert(fabs(b(0))>NearZero);
+    if((fabs(b(0))<=NearZero)) return false;
+    const double landa = b(5)-(b(3)*b(3)+cy*( b(1)*b(3)-b(0)*b(4)) )/b(0);
+    // VAGTMP assert(landa/b(0)>=0.0);
+    if(landa/b(0)<0.0) return false;
+    const double fx = sqrt(landa/b(0));
+    // VAGTMP assert(landa*b(0)/( b(0)*b(2)-b(1)*b(1))>=0.0);
+    if(landa*b(0)/( b(0)*b(2)-b(1)*b(1))<0.0) return false;
+    const double fy = sqrt(landa*b(0)/( b(0)*b(2)-b(1)*b(1)));
+    // VAGTMP assert(fabs(landa)>NearZero);
+    if(fabs(landa)<=NearZero) return false;
+    const double skew = -b(1)*fx*fx*fy/landa;
+    // VAGTMP assert(fabs(fx)>NearZero);
+    if(fabs(fx)<=NearZero) return false;
+    const double cx = skew*cy/fx - b(3)*fx*fx/landa;
+    if(Verbose)
+    {
+        std::cerr << "solution intrinseque !"<<std::endl;
+        std::cerr << fx << "  " << skew << "  "<< cx <<std::endl;
+        std::cerr << " 0 " << fy << "  " << cy <<std::endl;
+        std::cerr << " 0   0  1 " <<std::endl;
+    }
+    camera.setfx(fx);
+    camera.setfy(fy);
+    camera.setcx(cx);
+    camera.setcy(cy);
+    if(liste_extrinsic.size()<NbPoses) liste_extrinsic.resize(NbPoses);
+    for( i=0; i<NbPoses; ++i )
+    {// Extraction des matrices extrinseques
+        vnl_matrix<double> camInv = vnl_matrix_inverse<double>(camera.getIntrinsicMatrix());
+        double new_landa = 1 /(camInv*liste_H[i].get_column(0)).two_norm() ;
+        vnl_vector<double> r1 = new_landa * ( camInv*liste_H[i].get_column(0) );
+        vnl_vector<double> r2 = new_landa * ( camInv*liste_H[i].get_column(1) );
+        vnl_vector<double> r3 = vnl_cross_3d(r1, r2);
+        vnl_vector<double> t  = new_landa * ( camInv*liste_H[i].get_column(2) );
+        vnl_matrix_fixed<double,3,3> rot;
+        rot.set_column(0, r1); rot.set_column(1, r2); rot.set_column(2, r3);
+        if(Verbose) std::cerr<<" vnl_matrix_fixed rot ="<< std::endl <<rot<<std::endl;
+        vnl_rotation3d_matrix true_rot(rot);
+        true_rot.closest_rotation();
+        if(Verbose) std::cerr<<" vnl_rotation3d_matrix rot ="<< std::endl <<true_rot<<std::endl;
+        liste_extrinsic[i].setRotation(true_rot);
+        liste_extrinsic[i].setTranslation(t(0), t(1), t(2) );
+    }
+    return true;
+}
+
+bool arlCore::refineIntrinsicCalibration(const std::vector<arlCore::PointList::csptr> &model3DList, const std::vector <arlCore::PointList::csptr> &points2DList, unsigned int nbParameters, arlCore::Camera &camera, std::vector< vnl_rigid_matrix> &liste_extrinsic, const std::vector<double> &optimiserParameters, std::vector<double> &log)
+{
+    assert(liste_extrinsic.size()==(unsigned int)points2DList.size());
+    if(liste_extrinsic.size()!=(unsigned int)points2DList.size()) return false;
+    bool Verbose_1 = false, Verbose_2 = false; // default
+    if(optimiserParameters.size()>1)
+    {
+        if(optimiserParameters[1] == 1)
+            Verbose_1 = true;
+        else if(optimiserParameters[1] == 2)
+        {
+            Verbose_1 = true;
+            Verbose_2 = true;
+        }
+    }
+    if(Verbose_1) std::cerr<<"debut refineIntrinsicCalibration "<<std::endl;
+    double Method = 0; // Default
+    if(optimiserParameters.size()>0) Method = optimiserParameters[0];
+
+    assert(nbParameters>0 && nbParameters<=8);
+    const unsigned int NbPoses=(unsigned int)points2DList.size();
+    assert(NbPoses>0);
+    assert(model3DList.size()==1 || model3DList.size()==points2DList.size());
+    unsigned int nbPointsTotal=0, i, j;
+    vnl_vector<double> init (nbParameters+6*(NbPoses));
+    init[0] = camera.getfx();
+    init[1] = camera.getfy();
+    init[2] = camera.getcx();
+    init[3] = camera.getcy();
+    init[4] = 0.0;
+    init[5] = 0.0;
+    init[6] = 0.0;
+    init[7] = 0.0;
+    for( i=0 ; i<NbPoses ; ++i )
+    {// On considere que le modèle peut avoir un nb de points différents sur chaque pose
+        if(model3DList.size()==1) j=0; else j=i;
+        assert(points2DList[i]->size()==model3DList[j]->size());
+        nbPointsTotal += model3DList[j]->size();
+        vnl_rigid_vector tmp(liste_extrinsic[i]);
+        for( j=0 ; j<6 ; ++j )
+            init[nbParameters + i*6 + j]=tmp[j];
+    }
+    if(Method == 0) // OPTIMIZATION WITH LEVENBERG-MARQUARDT
+    {
+        const unsigned int Unknowns = NbPoses*6+nbParameters;
+        const unsigned int Residuals = nbPointsTotal;
+        if(Residuals<Unknowns) return false;
+        arlCore::IntrinsicLS_cost_function LS_reprojection_f(Unknowns, Residuals, vnl_least_squares_function::use_gradient);
+        LS_reprojection_f.setVerbose(Verbose_2);
+        for( i=0 ; i<NbPoses ; ++i )
+        {
+            if(model3DList.size()==1) j=0; else j=i;
+            LS_reprojection_f.addPattern( points2DList[i]->getList(), model3DList[j]->getList() );
+        }
+        vnl_levenberg_marquardt refineIntrinsic(LS_reprojection_f);
+        //LS_reprojection_f.setObserver(true);
+        refineIntrinsic.set_trace(true);
+        //refineIntrinsic.set_check_derivatives(1);
+        if(optimiserParameters.size()>2) refineIntrinsic.set_f_tolerance(optimiserParameters[2]);
+        else refineIntrinsic.set_f_tolerance(1e-6); // Erreur de reprojection stable (sqrt(m_error)) � 1e-3 pr�s
+        if(optimiserParameters.size()>3)
+        {
+            if(optimiserParameters[3] == 0){}//1e-8 default
+            else {refineIntrinsic.set_x_tolerance(optimiserParameters[3]);}
+        }
+        if(optimiserParameters.size()>4)
+        {
+            if(optimiserParameters[4] == 0){}//1e-5 default
+            else {refineIntrinsic.set_g_tolerance(optimiserParameters[4]);}
+        }
+        if(Verbose_1)
+        {
+            std::cerr<<"f tolerance ="<<refineIntrinsic.get_f_tolerance()<<std::endl;
+            std::cerr<<"x tolerance ="<<refineIntrinsic.get_x_tolerance()<<std::endl;
+            std::cerr<<"g tolerance ="<<refineIntrinsic.get_g_tolerance()<<std::endl;
+            std::cerr<<"check derivative="<<refineIntrinsic.get_check_derivatives()<<std::endl;
+        }
+        refineIntrinsic.minimize_using_gradient(init);
+        if(Verbose_1)
+        {
+            //LS_reprojection_f.plot();
+            std::cerr <<"Average reprojection error RMS before optimization = ="<<refineIntrinsic.get_start_error()<<std::endl;
+            std::cerr <<"Average reprojection error RMS after optimization = ="<<refineIntrinsic.get_end_error()<<std::endl;
+            std::cerr <<"get_num_evaluations ="<<refineIntrinsic.get_num_evaluations()<<std::endl;
+            std::cerr <<"get_num_iterations ="<<refineIntrinsic.get_num_iterations()<<std::endl;
+        }
+        log.push_back(refineIntrinsic.get_end_error());//log
+        log.push_back(refineIntrinsic.get_start_error());//log
+        log.push_back(refineIntrinsic.get_num_iterations());//log
+        log.push_back(NbPoses);//log
+        for( i=0 ; i<NbPoses ; ++i )
+        {
+            log.push_back(model3DList[i]->size()); //log number of points for each pose
+            vnl_vector<double> vec(6);
+            for( j=0 ; j<6 ; ++j )
+                vec[j] = init[nbParameters + i*6 + j];
+            vnl_rigid_vector rigid_vec(vec);
+            liste_extrinsic[i] = vnl_rigid_matrix(rigid_vec);
+        }
+        vnl_vector< double> reprojection_error(nbPointsTotal);
+        LS_reprojection_f.getReprojectionError(init, reprojection_error);
+        //double sum=0;
+        log.push_back(nbPointsTotal);//log
+        for( i=0 ; i<nbPointsTotal ; ++i )
+            {
+                if(Verbose_1){std::cerr<<"reproj ("<<i<<")= "<<reprojection_error[i]<<std::endl;}
+                //sum+=reprojection_error[i]*reprojection_error[i];
+                log.push_back(reprojection_error[i]);//log
+            }
+        //std::cerr<<"rms ="<< sqrt(sum/ nbPointsTotal)<<std::endl;
+        camera.setfx(init[0]);
+        camera.setfy(init[1]);
+        camera.setcx(init[2]);
+        camera.setcy(init[3]);
+        camera.setAlphaC( 0.0 );
+        for( i=0 ; i<4 ; ++i )
+            camera.setkc( i, init[4+i] );
+    }
+    if(Method == 1) // OPTIMIZATION WITH POWELL
+    {
+        arlCore::Intrinsic_cost_function reprojection_f(NbPoses*6+nbParameters);
+        reprojection_f.setVerbose(Verbose_2);
+        for( i=0 ; i<NbPoses ; ++i )
+        {
+            if(model3DList.size()==1) j=0; else j=i;
+            reprojection_f.addPattern( points2DList[i]->getList(), model3DList[i]->getList() );
+        }
+        vnl_powell refineIntrinsic(&reprojection_f);
+        if(optimiserParameters.size()>2) refineIntrinsic.set_f_tolerance(optimiserParameters[2]);
+        else refineIntrinsic.set_f_tolerance(1e-10);
+        if(optimiserParameters.size()>3)
+        {
+            if(optimiserParameters[3] == 0){}//1e-8 default
+            else {refineIntrinsic.set_x_tolerance(optimiserParameters[3]);}
+        }
+        if(optimiserParameters.size()>4)
+        {
+            if(optimiserParameters[4] == 0){}//1e-5 default
+            else {refineIntrinsic.set_g_tolerance(optimiserParameters[4]);}
+        }
+        if(Verbose_1)
+        {
+            std::cerr<<"f tolerance ="<<refineIntrinsic.get_f_tolerance()<<std::endl;
+            std::cerr<<"x tolerance ="<<refineIntrinsic.get_x_tolerance()<<std::endl;
+            std::cerr<<"g tolerance ="<<refineIntrinsic.get_g_tolerance()<<std::endl;
+            std::cerr<<"check derivative="<<refineIntrinsic.get_check_derivatives()<<std::endl;
+        }
+        refineIntrinsic.minimize(init);
+        if(Verbose_1)
+        {
+            std::cerr <<"Average reprojection error RMS before optimization ="<<sqrt(refineIntrinsic.get_start_error())<<std::endl;
+            std::cerr <<"Average reprojection error RMS after optimization ="<<sqrt(refineIntrinsic.get_end_error())<<std::endl;
+            //reprojection_f.plot();
+            std::cerr <<"get_num_evaluations ="<<refineIntrinsic.get_num_evaluations()<<std::endl;
+            std::cerr <<"get_num_iterations ="<<refineIntrinsic.get_num_iterations()<<std::endl;
+        }
+        log.push_back(sqrt(refineIntrinsic.get_end_error()));//log
+        log.push_back(sqrt(refineIntrinsic.get_start_error()));//log
+        log.push_back(refineIntrinsic.get_num_iterations());//log
+        log.push_back(NbPoses);//log
+        for( i=0 ; i<NbPoses ; ++i )
+        {
+            log.push_back(model3DList[i]->size()); //log number of points for each pose
+            vnl_vector<double> vec(6);
+            for( j=0 ; j<6 ; ++j )
+                vec[j] = init[nbParameters + i*6 + j];
+            vnl_rigid_vector rigid_vec(vec);
+            liste_extrinsic[i] = vnl_rigid_matrix(rigid_vec);
+        }
+        std::vector< double> reprojection_error = reprojection_f.getReprojectionError(init);
+        //double sum=0;
+        log.push_back(nbPointsTotal);//log
+        for( i=0 ; i<nbPointsTotal ; ++i )
+            {
+                if(Verbose_1){std::cerr<<"reproj ("<<i<<")= "<<reprojection_error[i]<<std::endl;}
+                //sum+=reprojection_error[i]*reprojection_error[i];
+                log.push_back(reprojection_error[i]);
+            }
+        //std::cerr<<"rms ="<< sqrt(sum/ nbPointsTotal)<<std::endl;
+        camera.setfx(init[0]);
+        camera.setfy(init[1]);
+        camera.setcx(init[2]);
+        camera.setcy(init[3]);
+        camera.setAlphaC( 0.0 );
+        for( i=0 ; i<4 ; ++i )
+            camera.setkc( i, init[4+i] );
+    }
+    return true;
+}
+
+bool arlCore::intrinsicCalibration(const std::vector<arlCore::PointList::csptr> &model3DList, const std::vector <arlCore::PointList::csptr> &points2DList, unsigned int nbParameters, arlCore::Camera &camera, std::vector< vnl_rigid_matrix> &liste_extrinsic, const std::vector<double> &optimiserParameters, std::vector<double> &log)
+{
+    assert(model3DList.size()==points2DList.size());
+    //! @todo Assert( Au moins 4 points par pose )
+    std::vector<double> optimiserParametersInit, optimiserParametersRefine;// TODO the optimiserParameters should be filled independently
+    unsigned int i;
+    for( i=0 ; i<(unsigned int)optimiserParameters.size(); ++i )
+        optimiserParametersRefine.push_back(optimiserParameters[i]);
+
+    // FIXME : Initialisation possible uniquement si model3D plan et z==0
+    //! @todo Utiliser une autre initialisation si model3D non plan
+    //! @todo Si model3D plan et z!=0, calculer T le ramenant dans le plan oxy
+    if(initIntrinsicCalibration(model3DList, points2DList, camera, liste_extrinsic, optimiserParametersInit, log))
+    {
+        if(refineIntrinsicCalibration(model3DList, points2DList, nbParameters, camera, liste_extrinsic, optimiserParametersRefine, log))
+            return true;
+    }else
+    {
+        //! @todo Traiter le cas où l'initialisation ne fonctionne pas
+    }
+    return false;
+}
+
+/**
+ * @brief  Initialization of the extrinsic parameter of a group of camera
+ * A 3D model (chessboard...) is looked by ALL cameras and several poses of
+ * the 3D model are recorded
+ * We estimate here :
+ * 1) the extrinsic transformations Te_k with respect to the first camera frame so that
+ * sum ||P1(Te_k*Mk_i) - mk_i ||^2 is minimal. P1 is the projective function
+ * of the first camera with extrinsic parameters AT IDENTITY !!
+ * Mk_i are the 3D points of the model in his own frame for the k_th pose
+ * mk_i are the 2D point reprojection which can be visible or not (then they are NULL) for the k_th pose
+ * In the function, points which are not visible in the image are sorted and not considered when given to arlcore::planarHomography
+ *
+ * 2) transformations Ts_j between each camera frame with respect to the 1st camera frame, so that
+ * sum ||Pj(Ts_j*Te_0*M0_i) - m0_j_i ||^2 is minimal. Pj corresponds to the projective function
+ * of the j th camera with extrinsic parameters set to IDENTITY.
+ * M0_i are the 3D points of the model in his own frame for the 0 th pose
+ * m0_j_i are the 2D point reprojection of the 3D points for the 0 th pose of the camera j
+ *
+ * The estimation is realized from the pose nb 0. We could do better by averaging
+ * the estimations on all poses but this seems not necessary.
+ * c
+ * In the algorithm the computed homography is then refined with ISPPC
+ * TODO the optimisation criterion of refineExtrinsicCalibration allows to calibrate a polyscopic
+ * system which field of view are not common. Nevertheless, the initilization supposes that 3D models 3D
+ * are always visible in the 1st camera. This is a constraint we could remove
+ */
+bool arlCore::initExtrinsicCalibration(const std::vector<PointList::csptr>& models3D, const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D, const std::vector<arlCore::Camera> &cameras, std::vector< arlCore::vnl_rigid_matrix> &init_rigid_trsf, const std::vector<double> &optimiserParameters, std::vector<double> &log )
+{
+    unsigned int i;
+    std::vector<const arlCore::Camera*> cams;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return initExtrinsicCalibration( models3D, liste_points2D, cams, init_rigid_trsf, optimiserParameters, log );
+}
+
+bool arlCore::initExtrinsicCalibration( const std::vector<PointList::csptr>& models3D,
+                                        const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D,
+                                        const std::vector<const arlCore::Camera*> &cameras,
+                                        std::vector< arlCore::vnl_rigid_matrix> &init_rigid_trsf,
+                                        const std::vector<double> &optimiserParameters,
+                                        std::vector<double> &log )
+{
+    const bool Verbose = false;
+    const unsigned int NbPoses = (unsigned int)models3D.size(), NbCameras = (unsigned int)liste_points2D[0].size();
+    log.push_back(NbPoses);
+    std::vector<double> log_homography, log_ISPPC;
+    // estimation of Te_i
+    std::vector<std::vector<arlCore::Point::csptr> > point_2D_visible_cam0(NbPoses), point_2D_visible_pose0(NbCameras-1);
+    std::vector<std::vector<arlCore::Point::csptr > > point_3D_visible_cam0(NbPoses), point_3D_visible_pose0(NbCameras-1);
+    std::vector<double> optimiserParametersISPPC;//not used here and have to be parameterized in the function (which is not good)
+    unsigned int i,j;
+    for( i=0 ; i<NbPoses ; ++i )//creation of the 2D point list and 3D point list without the invisible points
+        for( j=0 ; j<models3D[i]->size(); j++ )
+            if(liste_points2D[i][0][j]!= 0)
+            {
+                point_3D_visible_cam0[i].push_back( (*(models3D[i]))[j] );
+                point_2D_visible_cam0[i].push_back(liste_points2D[i][0][j]);
+            }
+    for( i=1 ; i<NbCameras ; ++i )
+        for( j=0 ; j<models3D[0]->size() ; j++ )
+            if(liste_points2D[0][i][j]!= 0)
+            {
+                //std::cerr<<"numero camera "<< i << "   numero point "<<j<<std::endl;
+                //std::cerr<<"models3D[0][j] " << models3D[0][j]->getCoordinates() <<std::endl;
+                //std::cerr<<"liste_points2D[0][i][j] " << liste_points2D[0][i][j]->getCoordinates() <<std::endl;
+                // point_3D_visible_pose0 contains a list of 3D model for the camera 2 -> N
+                // points that are not visible in the i th camera are not taken into account because of the if test
+                point_3D_visible_pose0[i-1].push_back( (*(models3D[0]))[j]);
+                // point_2D_visible_pose0 contains a list of 2D point reprojection of the model for the camera 2 -> N
+                point_2D_visible_pose0[i-1].push_back(liste_points2D[0][i][j]);
+            }
+    init_rigid_trsf.resize(NbCameras-1+NbPoses);
+    for( i=0 ; i<NbPoses ; ++i )// computation of the Te_k (contained in init_rigid_trsf)
+    {
+        arlCore::planarHomographyRegistration_3D_2D( *(cameras[0]), point_2D_visible_cam0[i], point_3D_visible_cam0[i], init_rigid_trsf[i], optimiserParameters, log_homography, false);
+        std::vector<const arlCore::Camera*> tmp_cam;
+        tmp_cam.push_back(cameras[0]);
+        std::vector<std::vector<arlCore::Point::csptr> > tmp_pts_2D;
+        tmp_pts_2D.push_back(point_2D_visible_cam0[i]);
+        arlCore::multiViewPointRegistration3D2D( tmp_cam, tmp_pts_2D, point_3D_visible_cam0[i], init_rigid_trsf[i], arlCore::ARLCORE_PR_ISPPC, optimiserParameters, log_ISPPC, false);
+    }
+    for( i=1 ; i<NbCameras ; ++i )
+    {
+        arlCore::planarHomographyRegistration_3D_2D( *(cameras[i]), point_2D_visible_pose0[i-1], point_3D_visible_pose0[i-1], init_rigid_trsf[NbPoses +i-1], optimiserParameters, log_homography, false);
+        //The transformation  T_calc_j (here init_rigid_trsf[NbPoses +i-1]) computed in the last step for cam i minimize the following criterion
+        //sum ||Pj(T_calc_j*M0_i) - m0_j_i ||^2 . On doit rendre Ts_j et Ts_j*Te_0 =T_calc_j
+        //std::cerr<< "HOMOGRAPHY init_rigid_trsf[NbPoses +j-1]="<<init_rigid_trsf[NbPoses +j-1]<< std::endl;
+        std::vector<const arlCore::Camera*> tmp_cam;
+        tmp_cam.push_back(cameras[i]);
+        std::vector<std::vector<arlCore::Point::csptr> > tmp_pts_2D;
+        tmp_pts_2D.push_back(point_2D_visible_pose0[i-1]);
+        arlCore::multiViewPointRegistration3D2D( tmp_cam, tmp_pts_2D, point_3D_visible_pose0[i-1], init_rigid_trsf[NbPoses +i-1], arlCore::ARLCORE_PR_ISPPC, optimiserParameters, log_ISPPC, false);
+        // now the transformation init_rigid_trsf[NbPoses +i-1] is refined
+        //std::cerr<< "ISPPC 3D2D init_rigid_trsf[NbPoses +i-1]="<<init_rigid_trsf[NbPoses +i-1]<< std::endl;
+        arlCore::vnl_rigid_matrix var;
+        var.invert( init_rigid_trsf[0] );
+        // Ts_j is computed as T_calc_j * Te_0 ^(-1)
+        init_rigid_trsf[NbPoses +i-1] = init_rigid_trsf[NbPoses +i-1] * var;
+    }
+    // TODO fill the log with log_homography and log_ISPPC
+    if(Verbose) std::cerr<<"Exit initExtrinsicCalibration "<<std::endl;
+    return true;
+}
+/**
+ * @brief Refinement of the extrinsic calibration of several cameras
+ * In:
+ * liste_points2D : for each pose, for each camera, there is a 2D point list
+ * models3D : 3D models point list (for each pose the 3D model can be different, but all points have to be seen by all camera, this has to be changed in the future)
+ * cameras : intrinsic parameter list of all cameras (extrinsic parameter have to be identity)
+ * init_rigid_trsf : estimated rigid transformation between each camera frame to the 3D model frame
+ *
+ * optimiserParameter : this works for powell and LM minimization
+ * [0] = number of the optimization method (0 for LM, 1 for powell)
+ * [1] = verbose mode on the reprojection error : if 1 then the reprojection error is displayed during optimization
+ * [2] = f_tolerance : if 0 or nothing is given, default value is 1e-6
+ * [3] = x_tolerance : if 0 or nothing is given, default value is 1e-8
+ * [4] = g_tolerance : if 0 or nothing is given, default value is 1e-5
+ *
+ * Optimised criterion definition:
+ * sum(pose k) sum(camera 1) sum(points i) ||P_1 (T_ek*Mi) - m_k_1_i ||^2
+ * + sum(pose k) sum(camera j>1) sum(points i) ||P_j (T_j*T_ek*Mi) - m_k_j_i ||^2
+ * where T_ek is the extrinsic transformation from 1 st camera to the 3D model in the k th pose
+ * and T_j represents the transformation between the camera j optical center frame to the 1 st frame
+ * WARNING : it is assumed that for each pose, the same number of point is seen by all camera
+ * This constraint should be relaxed in the future
+ *
+ * Log[0] : final RMS reprojection error sqrt(mean squared residual)
+ * Log[1] : begin RMS reprojection error sqrt(mean squared residual)
+ * Log[2] ... Log[total number of residual+2] : list or reprojection error of ALL points
+ * They are organized in the following way:
+ * pose 0 camera 0 pt 1
+ * pose 0 camera 0 pt 2
+ * ..
+ * pose 0 camera 0 pt nbmax of pattern 0
+ * pose 0 camera 1 pt 1
+ * pose 0 camera 1 pt 2
+ * ..
+ * pose 0 camera 1 pt nbmax of pattern 0
+ * ..
+ * pose 0 camera nb_total pt nbmax of pattern 0
+ * pose 1 camera 0 pt 1 ...
+ * pose 1 camera 0 pt nbmax of pattern 1
+ * pose 1 camera 1 pt 1 ...
+ * pose 1 camera 1 pt nbmax of pattern 1 ...
+ * ..
+ * pose 1 camera nb_total pt nbmax of pattern 1 ... etc
+ */
+
+bool arlCore::refineExtrinsicCalibration( const std::vector<PointList::csptr>& models3D, const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D, const std::vector<arlCore::Camera> &cameras, std::vector< arlCore::vnl_rigid_matrix> &refine_rigid_trsf, const std::vector<double> &optimiserParameters, std::vector<double> &log )
+{
+    unsigned int i;
+    std::vector<const arlCore::Camera*> cams;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return refineExtrinsicCalibration( models3D, liste_points2D, cams, refine_rigid_trsf, optimiserParameters, log );
+}
+
+bool arlCore::refineExtrinsicCalibration( const std::vector<PointList::csptr>& models3D, const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D, const std::vector<const arlCore::Camera*> &cameras, std::vector< arlCore::vnl_rigid_matrix> &refine_rigid_trsf, const std::vector<double> &optimiserParameters, std::vector<double> &log )
+{
+    unsigned int method = 0; // Default
+    bool Verbose = false, Verbose_optim = false; // default
+    if(optimiserParameters.size()>1) Verbose_optim = (optimiserParameters[1]!=0.0);
+    if(Verbose) std::cerr<<"debut refineExtrinsicCalibration "<<std::endl;
+    if(optimiserParameters.size()>0) method = (unsigned int)optimiserParameters[0];
+    const unsigned int NbCameras = (unsigned int)cameras.size();
+    const unsigned int NbPoses = (unsigned int)models3D.size();
+    unsigned int i, j;
+    vnl_vector<double> init((NbCameras-1)*6+6*NbPoses);
+    std::vector<arlCore::vnl_rigid_matrix> solution((NbCameras-1)+NbPoses);
+    std::vector<arlCore::vnl_rigid_matrix> estimation((NbCameras-1)+NbPoses);
+    long unsigned int nbTotal2Dpoints = 0;
+    for( i=0 ; i<NbPoses ; ++i )
+        nbTotal2Dpoints+=models3D[i]->size()*NbCameras;
+    refine_rigid_trsf.resize(NbCameras-1+NbPoses);
+    for( i=0 ; i<NbCameras-1+NbPoses ; ++i )
+    {
+        arlCore::vnl_rigid_vector vec(refine_rigid_trsf[i]);
+        for( j=0 ; j<6 ; ++j )
+            init[6*i+j] = vec[j];
+    }
+    if(method == 0) // OPTIMIZATION WITH LEVENBERG-MARQUARDT
+    {
+        arlCore::ExtrinsicLS_cost_function Extrinsic_cost_func(cameras, (NbCameras-1)*6+6*NbPoses, nbTotal2Dpoints, vnl_least_squares_function::use_gradient);
+        Extrinsic_cost_func.setVerbose(Verbose_optim);
+        for( i=0 ; i<NbPoses ; ++i)
+            Extrinsic_cost_func.addPattern( liste_points2D[i], models3D[i]->getListCopy() ); //VAG FIXME PERF !!!
+        vnl_levenberg_marquardt refineExtrinsic(Extrinsic_cost_func);
+        refineExtrinsic.set_trace(true);
+        //refineExtrinsic.set_check_derivatives(1);
+        if(optimiserParameters.size()>2) refineExtrinsic.set_f_tolerance(optimiserParameters[2]);
+        else refineExtrinsic.set_f_tolerance(1e-6); // Erreur de reprojection stable (sqrt(m_error)) � 1e-3 pr�s
+        if(optimiserParameters.size()>3)
+        {
+            if(optimiserParameters[3] == 0){}//1e-8 default
+            else {refineExtrinsic.set_x_tolerance(optimiserParameters[3]);}
+        }
+        if(optimiserParameters.size()>4)
+        {
+            if(optimiserParameters[4] == 0){}//1e-5 default
+            else {refineExtrinsic.set_g_tolerance(optimiserParameters[4]);}
+        }
+        Extrinsic_cost_func.setObserver(true);
+        if(Verbose) std::cerr<<"debut minimize "<<std::endl;
+        refineExtrinsic.minimize_using_gradient(init);
+        if(Verbose) std::cerr<<"fin minimize "<<std::endl;
+        vnl_vector<double> reprojection_error(nbTotal2Dpoints);
+        Extrinsic_cost_func.getReprojectionError(init,reprojection_error);
+        log.push_back(refineExtrinsic.get_end_error());
+        log.push_back(refineExtrinsic.get_start_error());
+        for( i=0 ; i<nbTotal2Dpoints ; ++i )
+            log.push_back(reprojection_error[i]);
+    }
+    if(method == 1) // OPTIMIZATION WITH POWELL
+    {
+        arlCore::Extrinsic_cost_function Extrinsic_cost_func(cameras, (NbCameras-1)*6+6*NbPoses);
+        Extrinsic_cost_func.setVerbose(Verbose_optim);
+        for( i=0 ; i<NbPoses ; ++i)
+            Extrinsic_cost_func.addPattern( liste_points2D[i], models3D[i]->getListCopy() ); //VAG FIXME PERF !!!
+        vnl_powell refineExtrinsic(&Extrinsic_cost_func);
+        if(optimiserParameters.size()>2) refineExtrinsic.set_f_tolerance(optimiserParameters[2]);
+        else refineExtrinsic.set_f_tolerance(1e-6); // Erreur de reprojection stable (sqrt(m_error)) � 1e-3 pr�s
+        if(optimiserParameters.size()>3)
+        {
+            if(optimiserParameters[3] == 0){}//1e-8 default
+            else {refineExtrinsic.set_x_tolerance(optimiserParameters[3]);}
+        }
+        if(optimiserParameters.size()>4)
+        {
+            if(optimiserParameters[4] == 0){}//1e-5 default
+            else {refineExtrinsic.set_g_tolerance(optimiserParameters[4]);}
+        }
+        Extrinsic_cost_func.setObserver(true);
+        if(Verbose) std::cerr<<"debut minimize "<<std::endl;
+        refineExtrinsic.minimize(init);
+        if(Verbose) std::cerr<<"fin minimize "<<std::endl;
+        std::vector< double> reprojection_error = Extrinsic_cost_func.getReprojectionError(init);
+        log.push_back(refineExtrinsic.get_end_error());
+        log.push_back(refineExtrinsic.get_start_error());
+        for( i=0 ; i<nbTotal2Dpoints ; ++i )
+            log.push_back(reprojection_error[i]);
+    }
+//  Extrinsic_cost_func.plot();
+    for( i=0 ; i<NbCameras + NbPoses-1 ; ++i )
+    {
+        arlCore::vnl_rigid_vector vec;
+        for( j=0 ; j<6 ; ++j )
+            vec[j] = init[6*i+j];
+        arlCore::vnl_rigid_matrix var(vec);
+        refine_rigid_trsf[i] = var;
+    }
+    return true;
+}
+
+bool arlCore::extrinsicCalibration( const std::vector<PointList::csptr>& models3D, const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D, const std::vector<arlCore::Camera> &cameras, std::vector< arlCore::vnl_rigid_matrix> &refine_rigid_trsf, const std::vector<double> &optimiserParameters, std::vector<double> &log )
+{
+    unsigned int i;
+    std::vector<const arlCore::Camera*> cams;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return extrinsicCalibration( models3D, liste_points2D, cams, refine_rigid_trsf, optimiserParameters, log );
+}
+
+bool arlCore::extrinsicCalibration( const std::vector<PointList::csptr>& models3D, const std::vector<std::vector<std::vector<arlCore::Point::csptr > > >& liste_points2D, const std::vector<const arlCore::Camera*> &cameras, std::vector< arlCore::vnl_rigid_matrix> &refine_rigid_trsf, const std::vector<double> &optimiserParameters, std::vector<double> &log )
+{
+    std::vector<double> optimiserParametersInit, optimiserParametersRefine;// TODO the optimiserParameters should be filled independently
+    unsigned int i;
+    for( i=0 ; i<(unsigned int)optimiserParameters.size(); ++i )
+        optimiserParametersRefine.push_back(optimiserParameters[i]);
+    if(initExtrinsicCalibration(models3D, liste_points2D, cameras, refine_rigid_trsf, optimiserParametersInit, log ))
+    {
+        if(refineExtrinsicCalibration(models3D, liste_points2D, cameras, refine_rigid_trsf, optimiserParametersRefine, log))
+            return true;
+    }else
+    {
+        // TODO : Traiter le cas où l'initialisation ne fonctionne pas
+    }
+    return false;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Camera.cpp b/SrcLib/ARLcore/src/arlcore/Camera.cpp
new file mode 100644
index 0000000..db84eb0
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Camera.cpp
@@ -0,0 +1,1137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Camera.h>
+
+#include <sstream>
+#include <fstream>
+#include <vector>
+#include <time.h>
+
+#include <vxl/core/vxl_version.h>
+
+#include <vgl/vgl_point_2d.h>
+#include <vgl/vgl_homg_line_2d.h>
+#include <vgl/vgl_homg_point_2d.h>
+#include <vgl/vgl_homg_point_3d.h>
+#include <vgl/vgl_line_3d_2_points.h>
+//#ifdef __MACOSX__ // because vxl 1.11.0
+#if ( VXL_VERSION_MAJOR >= 1 ) && ( VXL_VERSION_MINOR >= 11 )
+#include <vgl/vgl_intersection.h>
+#endif
+#include <vgl/algo/vgl_homg_operators_2d.h>
+
+#include <vnl/vnl_vector.h>
+#include <vnl/vnl_real_npolynomial.h>
+#include <vnl/algo/vnl_rnpoly_solve.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+
+#include <arlcore/MatrixR.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/PlaneSystem.h>
+#include <arlcore/Reconst3D.h>
+#include <arlcore/Optimization.h>
+#include <arlcore/Misc.h>
+#include <arlcore/File.h>
+
+arlCore::Camera::Camera( PlaneSystem &universe ):
+//VAG Object(ARLCORE_CLASS_CAMERA),
+Particle( universe )
+{
+    m_cameraGUID.Low=0;
+    m_cameraGUID.High=0;
+    init();
+    universe.setPlaneName(getPlane(), universe.Object::getName());
+}
+
+arlCore::Camera::Camera( PlaneSystem &universe, const uint32HL &GUID ):
+//VAG Object(ARLCORE_CLASS_CAMERA),
+Particle( universe )
+{
+    m_cameraGUID.Low = GUID.Low;
+    m_cameraGUID.High = GUID.High;
+    init();
+    universe.setPlaneName(getPlane(),  universe.Object::getName());
+}
+
+arlCore::Camera::Camera( const arlCore::Camera& c ):
+//VAG Object( ARLCORE_CLASS_CAMERA, c.Object::getName() ),
+Particle( c.getPlaneSystem(), c.Particle::getName() )
+{
+    copy(c);
+    setName( c.Object::getName() );
+}
+
+arlCore::Camera& arlCore::Camera::operator=(const arlCore::Camera& c)
+{
+    copy(c);
+    return *this;
+}
+
+void arlCore::Camera::copy(const Camera& c)
+{
+    if(this==&c) return;
+    this->Object::copy(c);
+    m_cameraGUID = c.m_cameraGUID;
+    m_noCalibration = c.m_noCalibration;
+    m_extrinsic = c.m_extrinsic;
+    m_intrinsicMatrix = c.m_intrinsicMatrix;
+    m_distortionCoeffs = c.m_distortionCoeffs;
+    m_alphaC = c.m_alphaC;
+    m_Qint = c.m_Qint;
+    m_Qext = c.m_Qext;
+    m_Cint = c.m_Cint;
+    m_Cext = c.m_Cext;
+    m_Bint = c.m_Bint;
+    m_Bext = c.m_Bext;
+    m_invExtrinsic = c.m_invExtrinsic;
+    m_invIntrinsicMatrix = c.m_invIntrinsicMatrix;
+    m_opticalCenterInExtrinsicFrame = c.m_opticalCenterInExtrinsicFrame;
+    getPlaneSystem().setPlaneName(getPlane(), Object::getName());
+    Object::update();
+    return;
+}
+
+void arlCore::Camera::init( void )
+{
+    m_extrinsic.setIdentity();
+    m_invExtrinsic.setIdentity();
+    m_noCalibration=0;
+    m_Bint.fill(0.0); // FIXME Never changed, Never used
+    m_Bext.fill(0.0);
+    m_Cint.fill(0.0); // FIXME Never changed, Never used
+    m_Cint.put(2,1.0);
+    m_Cext.fill(0.0);
+    m_Qint.fill(0.0);
+    m_Qext.fill(0.0);
+    m_intrinsicMatrix.set_identity();
+    m_invIntrinsicMatrix.set_identity();
+    m_opticalCenterInExtrinsicFrame.fill(0.0);
+    m_alphaC=0;
+    m_distortionCoeffs.fill(0.0);
+    m_log << "CamRef " << m_cameraGUID.High << "-" << m_cameraGUID.Low;
+    setName(m_log.str());
+    m_log<<" created ("<<getNo()<<")";
+    log(ARLCORE_LOG_INFO_LEVEL2);
+}
+
+arlCore::Camera::~Camera( )
+{}
+
+std::string arlCore::Camera::getString( void ) const
+{
+    std::stringstream s;
+    s<<this->Object::getString();
+    s<<this->Particle::getString();
+    s<<"GUID : "<<m_cameraGUID.High<<"-"<<m_cameraGUID.Low;
+    s<<"\nCalibration #"<<m_noCalibration;
+    s<<"\nExtrinsic matrix :\n"<<m_extrinsic;
+    s<<"\nIntrinsic matrix :\n"<<m_intrinsicMatrix;
+    s<<"\nk1 : "<<m_distortionCoeffs[0];
+    s<<"\tk2 : "<<m_distortionCoeffs[1];
+    s<<"\tk3 : "<<m_distortionCoeffs[4];
+    s<<"\np1 : "<<m_distortionCoeffs[2];
+    s<<"\tp2 : "<<m_distortionCoeffs[3];
+    s<<"\tAlphaC : "<<m_alphaC<<"\n";
+    return s.str();
+}
+
+long int arlCore::Camera::getCalibrationID( void ) const
+{
+    return m_noCalibration;
+}
+
+bool arlCore::Camera::loadParameters( const std::string &fileName, long int date, unsigned int width, unsigned int height )
+{
+    std::string folder, file, ext;
+    arlString::splitFilename( fileName, folder, file, ext );
+    arlCore::File config(fileName, "Cameras");
+    const double Version = config.readHeader();
+    if(Version>0.0)
+    {
+        std::string token, filename, lastName;
+        unsigned int numero=0, xSize, ySize, year, month, day, hour, minute, second;
+        uint32HL GUID;
+        double rms;
+        bool sharedPlane = false;
+        time_t lastTime = 0;
+        while(config.getToken(token))
+        {
+            if(token=="GUID")
+            {
+                config.get(GUID.High);
+                config.get(GUID.Low);
+            }
+            if(token=="Resolution")
+            {
+                config.get(xSize);
+                config.get(ySize);
+            }
+            if(token=="Date")
+            {
+                config.get(year);
+                config.get(month);
+                config.get(day);
+            }
+            if(token=="SharedPlaneWithPreviousCamera")
+                sharedPlane = true;
+            if(token=="Time")
+            {
+                config.get(hour);
+                config.get(minute);
+                config.get(second);
+            }
+            if(token=="RMS") config.get(rms);
+            if(token=="Filename") config.getString(filename);
+            if(token=="End")
+            {
+                if(!sharedPlane) ++numero;
+                long int tps;
+                struct tm t;
+                t.tm_year = year - 1900; // years since 1900
+                t.tm_mon  = month - 1; // months since January - [0,11]
+                t.tm_mday = day; // day of the month - [1,31]
+                t.tm_hour = hour; // hours since midnight - [0,23]
+                t.tm_min  = minute; // minutes after the hour - [0,59]
+                t.tm_sec  = second; // seconds after the minute - [0,59]
+                // FIXME Arbitrairement mis a zero pour que le resultat soit repetable
+                // Est-ce pour autant correct ?
+                t.tm_wday = 0; // days since Sunday - [0,6]
+                t.tm_yday = 0; // days since January 1 - [0,365]
+                //The Daylight Saving Time flag (tm_isdst) is greater than zero if Daylight Saving Time is in effect,
+                //zero if Daylight Saving Time is not in effect, and less than zero if the information is not available
+                t.tm_isdst= 0; // daylight savings time flag
+                tps = (long int)mktime(&t);
+                //std::cout<<No<<":"<<tps<<" "<<Y<<" "<<M<<" "<<D<<" "<<H<<" "<<Mn<<" "<<S<<"\n";
+                // difftime(date2, date1) => If date1 avant date2 return +sec else -sec
+                if(m_cameraGUID.Low==GUID.Low && m_cameraGUID.High==GUID.High
+                    && tps<date && tps>=lastTime && xSize==width && ySize==height)
+                {
+                    lastTime = tps;
+                    if(folder=="") lastName = filename;
+                    else lastName = folder+"/"+filename;
+                    m_noCalibration = numero;
+                }
+                sharedPlane = false;
+            }
+        }
+        config.close();
+        if(lastTime!=0) return load(lastName);
+        std::cerr<<"Camera parameters of "<<m_cameraGUID.High<<"-"<<m_cameraGUID.Low<<" ("<<width<<","<<height<<") not found\n";
+        return false;
+    }else
+    {
+        config.close();
+        return loadOldParameters(fileName, date, width, height);
+    }
+}
+
+bool arlCore::Camera::loadOldParameters( const std::string &fileName, long int date, unsigned int width, unsigned int height )
+{
+    const unsigned int NBPARAMS = 13;
+    if(strcmp(fileName.c_str(),"")==0)
+    {
+        log(ARLCORE_LOG_ERROR,"loadParameters : Empty filename");
+        return false;
+    }
+    FILE* file = fopen( fileName.c_str(), "r" );
+    if( !file )
+    {
+        m_log<<"loadParameters:File \""<<fileName<<"\" doesn't exist";
+        log(ARLCORE_LOG_ERROR);
+        return false;
+    }
+    std::string path;
+    unsigned int pos = (unsigned int)fileName.find_last_of ("/");
+    if(pos!=std::string::npos) path = fileName.substr (0,pos+1);
+    else path="";
+    int n=NBPARAMS, Y, M, D, H, S, Mn, WH, HT;
+    float RMS;
+    long unsigned int No;
+    uint32HL GUID;
+    char name[500];
+    std::string lastName;
+    long int tps, lastTime=0;
+    struct tm t;
+    //Header : Numero is the same if 2 calibrations is calculated in the same 3D plane
+    fscanf(file, " Numero | High ID Low   |  Dim  |    Acquisition    |   RMS  |      Filename\n");
+    while(!feof(file) &&  n==NBPARAMS)
+    {
+        n=fscanf(file, "%ld %d %d %d %d %d %d %d %d %d %d %f %s\n",
+                 &No, &GUID.High, &GUID.Low, &WH, &HT, &Y, &M, &D, &H, &Mn, &S, &RMS, name );
+        if(n==NBPARAMS)
+        {
+            t.tm_year = Y - 1900; // years since 1900
+            t.tm_mon  = M - 1; // months since January - [0,11]
+            t.tm_mday = D; // day of the month - [1,31]
+            t.tm_hour = H; // hours since midnight - [0,23]
+            t.tm_min  = Mn; // minutes after the hour - [0,59]
+            t.tm_sec  = S; // seconds after the minute - [0,59]
+            // FIXME Arbitrairement mis a zero pour que le resultat soit repetable
+            // Est-ce pour autant correct ?
+            t.tm_wday = 0; // days since Sunday - [0,6]
+            t.tm_yday = 0; // days since January 1 - [0,365]
+            t.tm_isdst= 0; // daylight savings time flag
+            tps = (long int)mktime(&t);
+            //std::cout<<No<<":"<<tps<<" "<<Y<<" "<<M<<" "<<D<<" "<<H<<" "<<Mn<<" "<<S<<"\n";
+            if(m_cameraGUID.Low==GUID.Low && m_cameraGUID.High==GUID.High && tps<date && tps>=lastTime && WH==width && HT==height)
+            {
+                lastTime = tps;
+                lastName = path+name;
+                m_noCalibration = No;
+            }
+        }
+    }
+    fclose(file);
+    // TODO Si fichier non trouve, chercher le suivant ?
+    if(lastTime!=0) return load(lastName);
+    std::cerr<<"Camera parameters of "<<m_cameraGUID.Low<<"-"<<m_cameraGUID.High<<" ("<<width<<","<<height<<") not found\n";
+    return false;
+}
+
+bool arlCore::Camera::load( const std::string &fileName )
+{
+    std::ifstream f;
+    f.open (fileName.c_str(), std::fstream::in);
+    if(!f.is_open()) return false;
+    double M[5];
+    unsigned int i, j;
+    setOK(false);
+    for( i=0 ; i<4 ; ++i )
+        for( j=0; j<4; ++j )
+        {
+            f>>M[j];
+            m_extrinsic[i][j]=M[j];
+        }
+    // alpha values : Focale en X ; Focale en Y
+    for( i=0; i<5; ++i )
+        f>>M[i];
+    setfx(M[0]); // AlphaU
+    setfy(M[1]); // AlphaV
+    // Principal point : Position du centre optique u0 ; v0
+    setcx(M[2]); // u0
+    setcy(M[3]); // v0
+    setAlphaC(M[4]); // skew (Orthogonalité de la plaque CCD)
+    // Radial 1er ordre ; 2ème ordre ; Tangentiel 1er ordre ; 2ème ordre ; Radial 3ème ordre
+    for( i=0 ; i<5 ; ++i )
+    {
+        f>>M[i];
+        setkc(i,M[i]);
+    }
+    extCompute();
+    setOK(true);
+    m_log<<fileName<<" loaded";
+    log(ARLCORE_LOG_INFO_LEVEL2);
+    int fringe=0;
+    std::string token;
+    while(!f.eof())
+    {
+        f>>token;
+        if(token=="Fringe")
+        {
+            f>>fringe;
+            for( i=0 ; i<5 ; ++i )
+                f>>M[i];
+            vgl_plane_3d< double >p(M[0], M[1], M[2], M[3]);
+        }
+    }
+    f.close();
+    return true;
+}
+
+bool arlCore::Camera::save( const std::string &fileName, bool overwrite ) const
+{
+    if(strcmp(fileName.c_str(),"")==0) return false;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    FILE *file = fopen( fileName.c_str(), "w" );
+    unsigned int i, j;
+    for( i=0 ; i<4 ; ++i )
+    {
+        for( j=0; j<4; ++j )
+            fprintf(file, " %lf", m_extrinsic[i][j]);
+        fprintf(file, "\n");
+    }
+    // alpha values : Focale en X ; Focale en Y
+    fprintf( file, "%lf %lf\n", getfx(), getfy() );
+    // Principal point : Position du centre optique u0 ; v0
+    fprintf( file, "%lf %lf\n", getcx(), getcy() );
+    // alphaC=skew (Orthogonalité de la plaque CCD)
+    fprintf( file, "%lf\n",getAlphaC() );
+    // Radial 1er ordre ; 2ème ordre ; Tangentiel 1er ordre ; 2ème ordre ; Radial 3ème ordre
+    for( i=0 ; i<5 ; ++i )
+        fprintf( file, "%lf ", m_distortionCoeffs[i] );
+    fprintf( file, "0.0\n" );
+
+    fclose( file );
+    return true;
+}
+
+bool arlCore::Camera::isIntrinsicCalibrated( void ) const
+{
+    return !getIntrinsicMatrix().is_identity();
+}
+
+const vnl_matrix_fixed<double,3,3>& arlCore::Camera::getIntrinsicMatrix( void ) const
+{
+    return m_intrinsicMatrix;
+}
+
+const vnl_matrix_fixed<double,3,3>& arlCore::Camera::getInvIntrinsicMatrix( void ) const
+{
+    return m_invIntrinsicMatrix;
+}
+
+const vnl_vector<double> arlCore::Camera::getIntrinsicVector( void ) const
+{
+    vnl_vector<double> intrinsic(10);
+    intrinsic[0] = getfx();
+    intrinsic[1] = getfy();
+    intrinsic[2] = getcx();
+    intrinsic[3] = getcy();
+    intrinsic[4] = getkc(0);
+    intrinsic[5] = getkc(1);
+    intrinsic[6] = getkc(2);
+    intrinsic[7] = getkc(3);
+    intrinsic[8] = getkc(4);
+    intrinsic[9] = getAlphaC();
+    return intrinsic;
+}
+
+unsigned int arlCore::Camera::setIntrinsic( const vnl_vector<double> &p )
+{
+    unsigned int size = p.size();
+    if(size>0) setfx(p[0]);
+    if(size>1) setfy(p(1));
+    if(size>2) setcx(p(2));
+    if(size>3) setcy(p(3));
+    if(size>4) setkc(0,p(4));
+    if(size>5) setkc(1,p(5));
+    if(size>6) setkc(2,p(6));
+    if(size>7) setkc(3,p(7));
+    if(size>8) setkc(4,p(8));
+    if(size>9) setAlphaC(p(9));
+    if(size>9) return 10;
+    else return size;
+}
+
+const vnl_vector_fixed<double,5>& arlCore::Camera::getDistortion ( void )const
+{
+    return m_distortionCoeffs;
+}
+
+const arlCore::vnl_rigid_matrix& arlCore::Camera::getExtrinsic (void ) const
+{
+    return m_extrinsic;
+}
+
+const arlCore::vnl_rigid_matrix& arlCore::Camera::getInvExtrinsic (void ) const
+{
+    return m_invExtrinsic;
+}
+
+double arlCore::Camera::getcx() const
+{
+    return m_intrinsicMatrix(0,2);
+}
+
+void arlCore::Camera::setcx( double a)
+{
+    m_intrinsicMatrix(0,2)=a;
+    m_Qint.put(0,2,getcx());
+    m_invIntrinsicMatrix = vnl_matrix_inverse<double>(m_intrinsicMatrix.as_matrix());
+}
+
+double arlCore::Camera::getcy() const
+{
+    return m_intrinsicMatrix(1,2);
+}
+
+void arlCore::Camera::setcy( double a)
+{
+    m_intrinsicMatrix(1,2)=a;
+    m_Qint.put(1,2,getcy());
+    m_invIntrinsicMatrix = vnl_matrix_inverse<double>(m_intrinsicMatrix.as_matrix());
+}
+
+double arlCore::Camera::getfx() const
+{
+    return m_intrinsicMatrix(0,0);
+}
+
+void arlCore::Camera::setfx( double a)
+{
+    m_intrinsicMatrix(0,0)=a;
+    m_Qint.put(0,0,getfx());
+    m_invIntrinsicMatrix = vnl_matrix_inverse<double>(m_intrinsicMatrix.as_matrix());
+}
+
+double arlCore::Camera::getfy() const
+{
+    return m_intrinsicMatrix(1,1);
+}
+
+void arlCore::Camera::setfy( double a)
+{
+    m_intrinsicMatrix(1,1)=a;
+    m_Qint.put(1,1,getfy());
+    m_invIntrinsicMatrix = vnl_matrix_inverse<double>(m_intrinsicMatrix.as_matrix());
+}
+
+double arlCore::Camera::getAlphaC() const
+{
+    return m_alphaC;
+}
+
+void arlCore::Camera::setAlphaC( double a)
+{
+    m_alphaC=a;
+}
+
+double arlCore::Camera::getkc(unsigned int i) const
+{
+    if(i<5)
+        return m_distortionCoeffs.get(i);
+    else return 0.0;
+}
+
+bool arlCore::Camera::setkc(unsigned int i, double a)
+{
+    if(i>=5) return false;
+    m_distortionCoeffs.put(i,a);
+    return true;
+}
+
+void arlCore::Camera::extCompute(void)
+{
+    unsigned int i,j;
+    m_invExtrinsic.invert(getExtrinsic());
+    vnl_vector_fixed< double, 3 >opticalCenter(0.0,0.0,0.0);
+    focalFrameToExtrinsicFrame(opticalCenter,m_opticalCenterInExtrinsicFrame);
+
+    vnl_matrix_fixed<double,3,4> T;
+    T.fill(0.0);
+    T.put(0,0,getcx());
+    T.put(1,1,getcy());
+    T.put(0,2,getfx());
+    T.put(1,2,getfy());
+    T.put(2,2,1.0);
+//  for( i=0 ; i<2 ; ++i )  // FIXME INUTILE
+//      T.put(0,3,0.0);     // FIXME INUTILE
+    vnl_matrix_fixed<double,3,4> P = T * getExtrinsic();
+
+    m_Bext.put(0,P.get(0,3));
+    m_Bext.put(1,P.get(1,3));
+
+    m_Cext.put(0,P.get(2,0));
+    m_Cext.put(1,P.get(2,1));
+    m_Cext.put(2,P.get(2,2));
+
+    for( i=0 ; i<2 ; ++i ) // FIXME See definition : Qext<2,3>
+        for( j=0 ; j<2 ; ++j )
+            m_Qext.put(i,j,P.get(i,j));
+}
+
+const vnl_matrix_fixed<double,2,3>& arlCore::Camera::getQint( void ) const
+{
+    return m_Qint;
+}
+
+const vnl_matrix_fixed<double,2,3>& arlCore::Camera::getQext( void ) const
+{
+    return m_Qext;
+}
+
+const vnl_vector_fixed<double,3>& arlCore::Camera::getCint( void ) const
+{
+    return m_Cint;
+}
+
+const vnl_vector_fixed<double,3>& arlCore::Camera::getCext( void ) const
+{
+    return m_Cext;
+}
+
+const vnl_vector_fixed<double,2>& arlCore::Camera::getBint( void ) const
+{
+    return m_Bint;
+}
+
+const vnl_vector_fixed<double,2>& arlCore::Camera::getBext( void ) const
+{
+    return m_Bext;
+}
+
+bool arlCore::Camera::setExtrinsic( const vnl_rigid_matrix& T )
+{
+    m_extrinsic = T;
+    extCompute();
+    return true;
+}
+
+///////////////////////////FONCTIONS PROJECTIONS//////////////////////////
+unsigned int arlCore::Camera::project3DPoint(PointList::csptr list3D, PointList::sptr list2D, bool focalPlane) const
+{
+    list2D->clear();
+    list2D->setDimension(2);
+    Point::sptr point2D = Point::New(2);
+    unsigned int i, n=0;
+    for( i=0 ; i<list3D->size() ; ++i )
+        if(project3DPoint( (*list3D)[i] , point2D, focalPlane ) )
+        {
+            list2D->push_back(point2D);
+            ++n;
+        }
+        else
+        {
+            //std::cout<<"ERROR dans project3DPoint(PointList::csptr list3D, PointList& list2D, bool focalPlane)"<<std::endl;
+            //std::cerr<<"project3DPoint ERROR on "<<i<<"th point\n";
+        }
+    return n;
+}
+
+bool arlCore::Camera::project3DPoint(Point::csptr  pt3D, Point::sptr pt2D, bool focalPlane) const
+{
+    assert(pt3D->size()==3 && pt2D->size()==2);
+    if(pt3D->size()<3 || pt2D->size()<2) return false;
+    unsigned int i;
+    vnl_vector_fixed<double,4> point3D;
+    for( i=0 ; i<3 ; ++i )
+        point3D(i)=(*pt3D)[i];
+    point3D(3)=1.0;
+    vnl_vector_fixed<double,2> point2D;
+    if(project3DPoint (point3D, point2D, focalPlane))
+    {
+        for( i=0 ; i<2 ; ++i )
+            pt2D->set(i,point2D(i));
+        return true;
+    }else return false;
+}
+
+// Projection d'un point 3D sur le plan image (focalPlane=true) ou le plan pixel (focalPlane=false)
+// en fonction de la matrice de projection et des parametres de distortion de la camera
+// Les notations sont celles de la matlab camera calibration toolbox
+bool arlCore::Camera::project3DPoint(const vnl_vector_fixed<double,4> &point3D, vnl_vector_fixed<double,2> &pt2D, bool focalPlane) const
+{
+    double xn_x, xn_y, xd_x, xd_y, r2, r4, r6;
+    double radial_disto, tang_disto_x, tang_disto_y;
+    if(!focalPlane)
+    {
+        assert(point3D(3)==1.0);
+        // on applique la matrice extrinseque au point3D pour le placer dans le
+        // repere de la camera : Matrix4x4 * HVec4
+        vnl_vector_fixed<double,4> point3DRepCam = getExtrinsic() * point3D;
+        // on calcule les coordonnees normalisées de la projection de point3DRepCam
+        // dans le plan focal image de la caméra
+        if(point3DRepCam.get(2)==0)
+        {
+            //std::cout<<"ERROR dans project3DPoint(const vnl_vector_fixed<double,4> &point3D, vnl_vector_fixed<double,2> &pt2D, bool focalPlane)"<<std::endl;
+            return false;
+        }
+        assert(point3DRepCam.get(2)!=0); // Le point est dans le plan parallèle à la focale passant par le centre optique
+        xn_x = point3DRepCam.get(0)/point3DRepCam.get(2);
+        xn_y = point3DRepCam.get(1)/point3DRepCam.get(2);
+    }else
+    {
+        assert(point3D(2)==1.0); // Le point n'est pas dans le plan de la focale
+        xn_x = point3D(0);
+        xn_y = point3D(1);
+    }
+    // on calcule en avance r² = x²+y²
+    r2 = xn_x * xn_x + xn_y * xn_y;
+    r4 = r2*r2;
+    r6 = r4*r2;
+    // radial_disto = 1 + kc[0]* r2 + kc[1]* r4 + kc[4]* r6;
+    radial_disto = 1 + getkc(0)* r2 + getkc(1)* r4 + getkc(4)* r6;
+    tang_disto_x = 2 * getkc(2) * xn_x * xn_y + getkc(3) * (r2 + 2 * xn_x * xn_x);
+    tang_disto_y = getkc(2) * (r2 + 2 * xn_y * xn_y) + 2 * getkc(3) * xn_x * xn_y;
+    // en fait [ xd_x ] = (1+kc(1)*r² + kc(2)*r²*r² + kc(5)*r²*r²*r²)* [ xn_x ] + [ tang_disto_x ]
+    //         [ xd_y ]   (                                         )  [ xn_y ]   [ tang_disto_y ]
+    xd_x = radial_disto * xn_x + tang_disto_x;
+    xd_y = radial_disto * xn_y + tang_disto_y;
+    // application de la matrice intrinsèque
+    pt2D.put(0,getfx() * (xd_x + getAlphaC() * xd_y) + getcx());
+    pt2D.put(1,getfy() * xd_y + getcy());
+    return true;
+}
+
+bool arlCore::Camera::undistort2DPoint(Point::csptr  p2D, Point::sptr p2D_undistorted) const
+{
+    const double pixSquareMax = 1e-50;
+    const unsigned int IterationsMax = 50;
+    if(!p2D->isVisible() || p2D->size()<2) return false;
+    double pinit[3]={p2D->x(),p2D->y(),1.0};
+    vnl_vector<double> points2DH(3,3,pinit),points2DH_undistorted(3);
+    unsigned int i, nbIterations=0;
+    double xn_x, xn_y, xd_x, xd_y;
+    double radial_disto, tang_disto_x, tang_disto_y;
+    double r2, r4, r6, kc[5];
+    for( i=0 ; i<5 ; ++i )
+        kc[i] = getkc(i);
+    vnl_vector_fixed<double,3> result = getInvIntrinsicMatrix() * points2DH;
+    xn_x = result(0);
+    xn_y = result(1);
+    // prise en compte de la distorsion de manière non linéaire et non précise
+    // on calcule le point non-distordu en approximant la distorsion
+    if(true)
+    {   // on calcule en avance r² = x²+y²
+        double tmp_x = xn_x, tmp_y = xn_y;
+        r2 = xn_x * xn_x + xn_y * xn_y;
+        r4 = r2*r2;
+        r6 = r4*r2;
+        xd_x = xn_x;
+        xd_y = xn_y;
+        i=0;
+        do
+        {
+            ++nbIterations;
+            tmp_x = xn_x;
+            tmp_y = xn_y;
+            // calcul de la distortion à appliquer
+            radial_disto = 1 + kc[0]* r2 + kc[1]* r4 + kc[4]* r6;
+            tang_disto_x = 2 * kc[2] * xn_x * xn_y + kc[3] * (r2 + 2 * xn_x * xn_x);
+            tang_disto_y = kc[2] * (r2 + 2 * xn_y * xn_y) + 2 * kc[3] * xn_x * xn_y;
+            // en fait [ xd_x ] = (1+kc(1)*r² + kc(2)*r²*r² + kc(5)*r²*r²*r²)* [ xn_x ] + [ tang_disto_x ]
+            //         [ xd_y ]   (                                         )  [ xn_y ]   [ tang_disto_y ]
+            xn_x = (xd_x - tang_disto_x)/radial_disto;
+            xn_y = (xd_y - tang_disto_y)/radial_disto;
+            r2 = xn_x * xn_x + xn_y * xn_y;
+            r4 = r2*r2;
+            r6 = r4*r2;
+        }while( (tmp_x-xn_x)*(tmp_x-xn_x)*getfx()*getfx() + (tmp_y-xn_y)*(tmp_y-xn_y)*getfy()*getfy() > pixSquareMax && nbIterations<IterationsMax );
+        points2DH_undistorted.put(0, xn_x);
+        points2DH_undistorted.put(1, xn_y);
+        points2DH_undistorted.put(2, 1.0);
+        p2D_undistorted->set(0, (getIntrinsicMatrix() * points2DH_undistorted)(0));
+        p2D_undistorted->set(1, (getIntrinsicMatrix() * points2DH_undistorted)(1));
+        //cerr << "sans correction parfaite : " << result[i] << endl;
+    }
+    return true;
+}
+
+bool arlCore::Camera::projectiveLine( const vnl_vector_fixed<double,3> &focalPt2D, vgl_line_3d_2_points <double> &line ) const
+{
+    unsigned int i;
+    vnl_vector_fixed<double,4> m, m_cam, c_cam, C(0.0, 0.0, 0.0, 1.0);
+    for( i=0 ; i<3 ; ++i )
+        m[i] = focalPt2D[i];
+    m[3] = 1.0;
+    m_cam = getInvExtrinsic() * m;
+    c_cam = getInvExtrinsic() * C;
+    vgl_point_3d <double> m_cam_vgl(m_cam[0],m_cam[1],m_cam[2]);
+    vgl_point_3d <double> c_cam_vgl(c_cam[0],c_cam[1],c_cam[2]);
+    if(m_cam_vgl==c_cam_vgl) return false;
+    vgl_line_3d_2_points <double> line1(m_cam_vgl, c_cam_vgl);
+    line = line1;
+    return true;
+}
+
+bool arlCore::Camera::unitFocalPlaneToPixelPlane( const vgl_point_2d<double>&p1, vgl_point_2d<double>& p2 ) const
+{
+    double xn_x, xn_y, xd_x, xd_y, r2, r4, r6;
+    double radial_disto, tang_disto_x, tang_disto_y;
+    xn_x = p1.x();
+    xn_y = p1.y();
+    // on calcule en avance r² = x²+y²
+    r2 = xn_x*xn_x + xn_y*xn_y;
+    r4 = r2*r2;
+    r6 = r4*r2;
+    radial_disto = 1 + getkc(0) * r2 + getkc(1) * r4 + getkc(4) * r6;
+    tang_disto_x = 2 * getkc(2) * xn_x * xn_y + getkc(3) * (r2 + 2 * xn_x * xn_x);
+    tang_disto_y = 2 * getkc(3) * xn_x * xn_y + getkc(2) * (r2 + 2 * xn_y * xn_y);
+    // en fait [ xd_x ] = (1+kc(1)*r² + kc(2)*r²*r² + kc(5)*r²*r²*r²)* [ xn_x ] + [ tang_disto_x ]
+    //         [ xd_y ]   (                                         )  [ xn_y ]   [ tang_disto_y ]
+    xd_x = radial_disto * xn_x + tang_disto_x;
+    xd_y = radial_disto * xn_y + tang_disto_y;
+    // application de la matrice intrinsèque
+    p2.x()=getfx() * (xd_x + getAlphaC() * xd_y) + getcx();
+    p2.y()=getfy() * xd_y + getcy();
+    return true;
+}
+
+bool arlCore::Camera::pixelPlaneToUnitFocalPlane( Point::csptr p2D, Point::sptr p3D, bool perfectDisto ) const
+{
+    assert(p2D->size()==2);
+    assert(p3D->size()==3);
+    const double pixSquareMax = 1e-50;
+    const unsigned int IterationsMax = 50;
+    if(!p2D->isVisible() || p2D->size()<2) return false;
+    const double tol=1e-12;
+    p3D->fill(0.0);
+    if(p3D->size()>2) p3D->set(2, 1.0);
+    double pinit[3]={p2D->x(),p2D->y(),1.0};
+    vnl_vector<double> points2DH(3,3,pinit);
+    unsigned int i;
+    vnl_matrix_fixed<double,3,3> Intrinseq, var;
+    double xn_x, xn_y, xd_x, xd_y;
+    double radial_disto, tang_disto_x, tang_disto_y;
+    double r2, r4, r6, kc[5];
+    // DECLARATION DES VARIABLES NECESSAIRES A LA RESOLUTION POLYNOMIALE
+    vnl_real_npolynomial P1, P2;
+    vnl_vector< double > coef1(10), coef2(10);
+    vnl_matrix< unsigned int > power1(10,2), power2(10,2);
+    vcl_vector< vnl_vector< double > * > roots;
+    vcl_vector<vnl_real_npolynomial*> PolyToSolve;
+    for( i=0 ; i<5 ; ++i )
+        kc[i] = getkc(i);
+    vnl_vector_fixed<double,3> result = getInvIntrinsicMatrix() * points2DH;
+    xn_x = result(0);
+    xn_y = result(1);
+    // prise en compte de la distorsion de mani�re non lin�aire et non pr�cise
+    // on calcule le point non-distordu en approximant la distorsion
+    if(!perfectDisto)
+    {   // on calcule en avance r� = x�+y�
+        double tmp_x = xn_x, tmp_y = xn_y;
+        r2 = xn_x * xn_x + xn_y * xn_y;
+        r4 = r2*r2;
+        r6 = r4*r2;
+        xd_x = xn_x;
+        xd_y = xn_y;
+        i=0;
+        do
+        {
+            i++;
+            tmp_x = xn_x;
+            tmp_y = xn_y;
+            // calcul de la distortion � appliquer
+            radial_disto = 1 + kc[0]* r2 + kc[1]* r4 + kc[4]* r6;
+            tang_disto_x = 2 * kc[2] * xn_x * xn_y + kc[3] * (r2 + 2 * xn_x * xn_x);
+            tang_disto_y = kc[2] * (r2 + 2 * xn_y * xn_y) + 2 * kc[3] * xn_x * xn_y;
+            // en fait [ xd_x ] = (1+kc(1)*r� + kc(2)*r�*r� + kc(5)*r�*r�*r�)* [ xn_x ] + [ tang_disto_x ]
+            //         [ xd_y ]   (                                         )  [ xn_y ]   [ tang_disto_y ]
+            xn_x = (xd_x - tang_disto_x)/radial_disto;
+            xn_y = (xd_y - tang_disto_y)/radial_disto;
+            r2 = xn_x * xn_x + xn_y * xn_y;
+            r4 = r2*r2;
+            r6 = r4*r2;
+        }while( (tmp_x-xn_x)*(tmp_x-xn_x)*getfx()*getfx() + (tmp_y-xn_y)*(tmp_y-xn_y)*getfy()*getfy() > pixSquareMax && i<IterationsMax );
+        //cerr<< "NOMBRE D'ITERATIONS : " << i << endl;
+        p3D->set(0, xn_x);
+        p3D->set(1, xn_y);
+        //cerr << "sans correction parfaite : " << result[i] << endl;
+    }
+    // recherche des valeurs exactes non distordues avec une r�solution polynomiale
+    // xd = x + k[0]. x^3+ k[0].y^2.x +k[1]x^5 +2k[1]x^3y^2 +k[1]y^4.x +2.k[2]x.y +3k[3]x^2 +k[3]y^2
+    // yd = y + k[0]. y^3+ k[0].x^2.y +k[1]y^5 +2k[1]y^3x^2 +k[1]x^4.y +2.k[3]x.y +3k[2]y^2 +k[2]x^2
+    if(perfectDisto)
+    {
+        coef1.put(0 , 1.0);
+        coef1.put(1 , kc[0]);
+        coef1.put(2 , kc[0]);
+        coef1.put(3 , kc[1]);
+        coef1.put(4 , 2*kc[1]);
+        coef1.put(5 , kc[1]);
+        coef1.put(6 , 2*kc[2]);
+        coef1.put(7 , 3*kc[3]);
+        coef1.put(8 , kc[3]);
+        coef1.put(9 , -1.0 * xn_x);
+        coef2.put(0 , 1.0);
+        coef2.put(1 , kc[0]);
+        coef2.put(2 , kc[0]);
+        coef2.put(3 , kc[1]);
+        coef2.put(4 , 2*kc[1]);
+        coef2.put(5 , kc[1]);
+        coef2.put(6 , 2*kc[3]);
+        coef2.put(7 , 3*kc[2]);
+        coef2.put(8 , kc[2]);
+        coef2.put(9 , -1.0 * xn_y);
+        power1.put(0,0,1);power1.put(0,1,0);
+        power1.put(1,0,3);power1.put(1,1,0);
+        power1.put(2,0,1);power1.put(2,1,2);
+        power1.put(3,0,5);power1.put(3,1,0);
+        power1.put(4,0,3);power1.put(4,1,2);
+        power1.put(5,0,1);power1.put(5,1,4);
+        power1.put(6,0,1);power1.put(6,1,1);
+        power1.put(7,0,2);power1.put(7,1,0);
+        power1.put(8,0,0);power1.put(8,1,2);
+        power1.put(9,0,0);power1.put(9,1,0);
+        for( i=0 ; i<10 ; ++i )
+        {
+            power2.put(i, 0, power1(i,1));
+            power2.put(i, 1, power1(i,0));
+        }
+        P1.set(coef1,power1);
+        P2.set(coef2,power2);
+        PolyToSolve.push_back(&P1);
+        PolyToSolve.push_back(&P2);
+        vnl_rnpoly_solve Solve( PolyToSolve );
+        roots = Solve.realroots(tol);
+        if(roots.size()>0)
+        {   // Pas de racines : FIXME
+            p3D->set(0, roots[0]->get(0));
+            p3D->set(1, roots[0]->get(1));
+        }else std::cerr<<"Camera::pixelPlaneToUnitFocalPlane : No root\n";
+        PolyToSolve.clear();
+        roots.clear();
+    }
+    return true;
+}
+
+bool arlCore::Camera::pixelPlaneToUnitFocalPlane( Point::csptr p, vnl_vector_fixed<double,3>& r, bool perfectDisto ) const
+{
+    unsigned int i;
+    Point::sptr p2 = Point::New(3);
+    bool b=pixelPlaneToUnitFocalPlane(p, p2, perfectDisto);
+    for( i=0 ; i<3 ; ++i )
+        r.put(i, (*p2)[i]);
+    return b;
+}
+
+bool arlCore::Camera::pixelPlaneToUnitFocalPlane( Point::csptr p, vgl_point_3d<double>& r, bool perfectDisto ) const
+{
+    Point::sptr p2 = Point::New(3);
+    bool b=pixelPlaneToUnitFocalPlane(p, p2, perfectDisto);
+    r.set(p2->x(), p2->y(), p2->z());
+    return b;
+}
+
+bool arlCore::Camera::pixelPlaneToUnitFocalPlane( Point::csptr p, vgl_point_2d<double>& r, bool perfectDisto ) const
+{
+    Point::sptr p2 = Point::New(3);
+    bool b=pixelPlaneToUnitFocalPlane(p, p2, perfectDisto);
+    r.set(p2->x(), p2->y());
+    return b;
+}
+
+bool arlCore::Camera::pixelPlaneToUnitFocalPlane( const vgl_point_2d<double>& p, vgl_point_3d<double>& r, bool perfectDisto ) const
+{
+    return pixelPlaneToUnitFocalPlane(Point::New( p.x(), p.y() ), r, perfectDisto);
+}
+
+bool arlCore::Camera::focalFrameToExtrinsicFrame( const vnl_vector_fixed< double, 3 >& uff, vnl_vector_fixed< double, 3 >& ef ) const
+{
+    vnl_vector<double> point3DRepCam(4), point3D_H(4);
+    point3D_H.put(0,uff(0));
+    point3D_H.put(1,uff(1));
+    point3D_H.put(2,uff(2));
+    point3D_H.put(3,1.0);
+    point3DRepCam = getInvExtrinsic() * point3D_H;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        ef.put(i, point3DRepCam(i));
+    return true;
+}
+
+bool arlCore::Camera::focalFrameToExtrinsicFrame( const vgl_point_3d< double >& uff, vgl_point_3d< double >& ef ) const
+{
+    vnl_vector<double> point3DRepCam(4), point3D_H(4);
+    point3D_H.put(0,uff.x());
+    point3D_H.put(1,uff.y());
+    point3D_H.put(2,uff.z());
+    point3D_H.put(3,1.0);
+    point3DRepCam = getInvExtrinsic() * point3D_H;
+    ef.set(point3DRepCam(0), point3DRepCam(1), point3DRepCam(2));
+    return true;
+}
+
+
+bool arlCore::Camera::focalToPixelLine( double a, double b, double c, arlCore::Point::sptr pt1, arlCore::Point::sptr pt2 ) const
+{
+    // FIXME : Cas gal actuel : Droite relativement horizontale : Intersection avec les bords gauche et droit de la ROI
+    // Traiter les autres cas : Intersection avec les bords haut et bas, pour les 2 points
+    // Soient G, bord gauche, D, droit, H Haut, B, Bas
+    // 7 cas : G-D G-H G-B H-B B-H H-D B-D, cas déjà traité : G-D
+    // Traiter d'urgence H-B B-H
+
+    // Si l'equation de la droite dans le plan focal est ax+by+c=0
+    // x = (u -u0)/alpha_u    et  y = (v -v0)/alpha_v
+    // calcul de l'ordonnée pour u=pt1->x
+    pt1->y( getfy()/b *(-1*a*pt1->x()/getfx() + a*getcx()/getfx() +b*getcy()/getfy() - c) );
+    // calcul de l'ordonnée pour u=pt2->x
+    pt2->y( getfy()/b *(-1*a*pt2->x()/getfx() + a*getcx()/getfx() +b*getcy()/getfy() - c) );
+    return true;
+}
+
+bool arlCore::Camera::focalToPixelLine( double a, double b, double c, arlCore::Point::csptr pixOrg, arlCore::Point::csptr pixDst, PointList::sptr pl, unsigned int nbSegments ) const
+{
+    const bool PerfectDisto = true;
+    unsigned int i, n=nbSegments;
+    pl->clear();
+    vgl_point_2d<double> focOrg, focDst, pixCur;
+    if(!pixelPlaneToUnitFocalPlane( pixOrg, focOrg, PerfectDisto )) return false;
+    if(!pixelPlaneToUnitFocalPlane( pixDst, focDst, PerfectDisto )) return false;
+    vnl_vector_fixed<double,2> AB( focDst.y()-focOrg.x(), focDst.y()-focOrg.y() );
+    if(n<1)
+    {
+        const double DeltaX = fabs(pixDst->x()-pixOrg->x());
+        const double DeltaY = fabs(pixDst->y()-pixOrg->y());
+        if(DeltaX>DeltaY) n = (unsigned int)DeltaX;
+        else n = (unsigned int)DeltaY;
+        if( n<1 ) return false;
+    }
+    const double Step = ((double)AB.two_norm()) / (double)n;
+    double next = Step;
+    const vnl_vector_fixed<double,2> N = AB.normalize();
+    pl->push_back(pixOrg);
+    for( i=0 ; i<n-1 ; ++i, next+=Step )
+    {
+        vgl_point_2d<double> focCur( focOrg.x()+next*N[0], focOrg.y()+next*N[1] );
+        if(!unitFocalPlaneToPixelPlane( focCur, pixCur )) return false;
+        pl->push_back( Point::New(pixCur.x(), pixCur.y()) );
+    }
+    pl->push_back(pixDst);
+    return true;
+}
+
+bool arlCore::Camera::pixelToFocalLine( const vgl_line_2d<double> &line2D, vgl_line_3d_2_points<double> &line3D ) const
+{
+    const bool PerfectDisto = true;
+    const vgl_vector_2d<double> Dir = line2D.direction();
+    const vgl_homg_line_2d<double> HLine(line2D);
+    const vgl_homg_point_2d<double> Center( getcx(), getcy() );
+    const vgl_homg_point_2d<double> Central2DHPoint = vgl_homg_operators_2d<double>::closest_point( HLine, Center );
+    const vgl_point_2d<double> Central2DPoint( Central2DHPoint );
+    vgl_point_3d<double> central3DPoint;
+    if(!pixelPlaneToUnitFocalPlane( Central2DPoint, central3DPoint, PerfectDisto )) return false;
+    assert(central3DPoint.z()==1.0);
+    vgl_point_3d<double> second3DPoint(central3DPoint);
+    second3DPoint.set(second3DPoint.x()+Dir.x(), second3DPoint.y()+Dir.y(), 1.0);
+    line3D = vgl_line_3d_2_points<double>( central3DPoint, second3DPoint );
+    return false;
+}
+
+bool arlCore::getEpipolar( arlCore::Point::csptr p, const vnl_matrix_fixed<double,4,4> &PM, double &a, double &b, double &c)
+{
+    if(p->size()<2) return false;
+    vnl_vector_fixed<double,3> v(p->x(),p->y(),1.0);
+    return getEpipolar( v, PM, a, b, c );
+}
+
+bool arlCore::getEpipolar(const vnl_vector_fixed<double,3> &point, const vnl_matrix_fixed<double,4,4> &PM, double &a, double &b, double &c)
+{   // PM=cams[1]->getExtrinsic()).as_matrix()*vnl_matrix_inverse<double>(cams[0]->getExtrinsic());
+    // Calcul la droite épipolaire dans la camera 1 du point de la caméra 0
+    // cf livre horaud p192 - La droite se situe dans le plan focal (x,y,1.0)
+    const double x = point(0);
+    const double y = point(1);
+    const double a1 = (PM(1,3)*PM(2,0) - PM(2,3)*PM(1,0));
+    const double a2 = (PM(1,3)*PM(2,1) - PM(2,3)*PM(1,1));
+    const double a3 = (PM(1,3)*PM(2,2) - PM(2,3)*PM(1,2));
+    a = a1*x + a2*y + a3;
+    const double b1 = (PM(2,3)*PM(0,0) - PM(0,3)*PM(2,0));
+    const double b2 = (PM(2,3)*PM(0,1) - PM(0,3)*PM(2,1));
+    const double b3 = (PM(2,3)*PM(0,2) - PM(0,3)*PM(2,2));
+    b = b1*x + b2*y + b3;
+    const double c1 = (PM(0,3)*PM(1,0) - PM(1,3)*PM(0,0));
+    const double c2 = (PM(0,3)*PM(1,1) - PM(1,3)*PM(0,1));
+    const double c3 = (PM(0,3)*PM(1,2) - PM(1,3)*PM(0,2));
+    c = c1*x + c2*y + c3;
+    return true;
+}
+
+bool arlCore::getEpipolar( arlCore::Point::csptr p, const vnl_matrix_fixed<double,4,4> &PM, vgl_line_2d< double > &d)
+{
+    if(p->size()<2) return false;
+    vnl_vector_fixed<double,3> v(p->x(),p->y(),1.0);
+    return getEpipolar( v, PM, d );
+}
+
+bool arlCore::getEpipolar(const vnl_vector_fixed<double,3> &point, const vnl_matrix_fixed<double,4,4> &PM, vgl_line_2d< double > &d)
+{
+    double a, b, c;
+    arlCore::getEpipolar(point, PM, a, b, c);
+    vgl_point_2d< double > vglPts2D[2];
+    if( b<-0.5 || b>0.5 )
+    {
+        vglPts2D[0].set(-100, (a*100.0-c)/b);
+        vglPts2D[1].set(+100, (-a*100-c)/b);
+    }
+    else
+    {
+        vglPts2D[0].set((b*100-c)/a, -100);
+        vglPts2D[1].set((-b*100-c)/a, +100);
+    }
+    vgl_line_2d< double > d1(vglPts2D[0],vglPts2D[1]);
+    d=d1;
+    return true;
+}
+
+// Methode : le vecteur [viewPoint;center] définit l'axe Z du repere lie au centre optique
+// de la camera. Pour choisir les axes X et Y (y en a pas de bon par defaut), il faut choisir
+// un vecteur dans le plan normal a [viewPoint;center] passant par viewPoint
+// l'equation de ce plan normal est ax+by+cz+d = 0
+// ou a = coord selon x du vecteur [viewPoint;center]
+// et b = coord selon y du vecteur [viewPoint;center]
+// et c = coord selon z du vecteur [viewPoint;center]
+// et d = -( a*viewPoint(x) + b*viewPoint(y) + c*viewPoint(z) )
+//
+// Ensuite on choisit arbitrairement un vecteur dans ce plan pour definir l'axe X
+// du repere centre optique : pour cela on choisit x=1 (si a!=0), y=1 (si b!=0)
+// z= (-d - ax - by)/c . Ca nous fournit un vecteur qu'on normalise.
+// On a donc definit un repere lie au centre optique. Reste a calculer la transformation
+// rigide entre ce repere et le repere monde. Pour cela, on effectue un recalage 3D3D
+// entre deux reperes. Simpliste !
+bool arlCore::Camera::syntheticCamera( Point::csptr center, Point::csptr viewPoint, const std::vector< double > & intrinsicParams)
+{
+    setOK(false);
+    assert(intrinsicParams.size()==10);
+    arlCore::Point::sptr  XaxisPoint = arlCore::Point::New(3);
+    arlCore::Point::sptr  ZaxisPoint = arlCore::Point::New(3);
+    arlCore::Point::sptr O_monde = arlCore::Point::New(0,0,0);
+    arlCore::Point::sptr Ox_monde = arlCore::Point::New(1,0,0);
+    arlCore::Point::sptr Oz_monde = arlCore::Point::New(0,0,1);
+
+    arlCore::PointList::sptr points_source  = arlCore::PointList::New();
+    arlCore::PointList::sptr points_cible   = arlCore::PointList::New();
+    vnl_vector_fixed<double,3> vecteur_normal, vecteur_Ox_camera;
+    double d=0, test_egalite;
+    unsigned int i;
+    test_egalite = (center->x()-viewPoint->x())*(center->x()-viewPoint->x())
+                 + (center->y()-viewPoint->y())*(center->y()-viewPoint->y())
+                 + (center->z()-viewPoint->z())*(center->z()-viewPoint->z());
+    if( test_egalite < 1e-4 ) //TODO si c des mm alors on devrait mettre 1 mm
+        return false;
+    // a<=>vecteur_normal[0], b<=>vecteur_normal[1] et c<=>vecteur_normal[2]
+    for( i=0 ; i<3 ; ++i )
+    {
+        vecteur_normal.put(i,(*center)[i] - (*viewPoint)[i]);
+        d += -vecteur_normal[i]*(*viewPoint)[i];
+    }
+    //std::cerr << "vecteur_normal = " <<  vecteur_normal << std::endl;
+    //std::cerr << "d = " <<  d << std::endl;
+    XaxisPoint->fill(1.0);
+    if( vecteur_normal[0] != 0 )
+        XaxisPoint->set(0, (-d-vecteur_normal[1]-vecteur_normal[2])/ vecteur_normal[0]);
+    else // Le vecteur normal est parallele au plan yOz du repere monde
+        if( vecteur_normal[1] != 0 )
+            XaxisPoint->set(1,(-d-vecteur_normal[2])/vecteur_normal[1]);
+        else // Le vecteur normal est parallele a l'axe Oz du repere monde
+            XaxisPoint->set(2,-d/vecteur_normal[2]);
+    // Creation du vecteur Ox dans repere optique
+    for( i=0 ; i<3 ; ++i )
+        vecteur_Ox_camera.put(i, (*XaxisPoint)[i]-(*viewPoint)[i]);
+    vecteur_Ox_camera.normalize();
+    vecteur_normal.normalize();
+    //std::cerr << "vecteur_Ox_camera normalise = " <<  vecteur_Ox_camera << std::endl;
+    for( i=0 ; i<3 ; ++i )
+    {
+        XaxisPoint->set(i, (*viewPoint)[i]+vecteur_Ox_camera[i]);
+        // Calcul du point sur l'axe z du repere optique eloigne de 1 unite du centre optique
+        ZaxisPoint->set(i, (*viewPoint)[i]+vecteur_normal[i]);
+    }
+    //std::cerr << "XaxisPoint = " <<  XaxisPoint->getString() << std::endl;
+    //std::cerr << "vecteur_normal normalise = " <<  vecteur_normal << std::endl;
+    //std::cerr << "ZaxisPoint = " <<  ZaxisPoint.getString() << std::endl;
+    // On a maintenant 3 points du repere optique (center, XaxisPoint, ZaxisPoint)
+    // a mettre en correspondance avec 3 points du repere monde
+    // Le recalage de ces 3 points nous fournit la transformation extrinseque recherchee
+    points_source->push_back( O_monde );
+    points_source->push_back( Ox_monde );
+    points_source->push_back( Oz_monde );
+    points_cible->push_back( viewPoint );
+    points_cible->push_back( XaxisPoint );
+    points_cible->push_back( ZaxisPoint );
+    vnl_rigid_matrix extrinsic_trsf;
+    extrinsic_trsf.register3D3D( points_cible, points_source, false );
+    //initialisation des parametres de la camera
+    setExtrinsic(extrinsic_trsf);
+    setfx(intrinsicParams[0]);
+    setfy(intrinsicParams[1]);
+    setcx(intrinsicParams[2]);
+    setcy(intrinsicParams[3]);
+    for( i=0 ; i<5 ; ++i )
+        setkc(i,intrinsicParams[4+i]);
+    setAlphaC(intrinsicParams[9]);
+    return setOK(true);
+}
diff --git a/SrcLib/ARLcore/src/arlcore/CameraList.cpp b/SrcLib/ARLcore/src/arlcore/CameraList.cpp
new file mode 100644
index 0000000..30287fa
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/CameraList.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/CameraList.h>
+
+arlCore::CameraList::CameraList( PlaneSystem &universe ):
+Particle( universe, "Camera list" )
+{}
+
+arlCore::CameraList::~CameraList( void )
+{}
+
+void arlCore::CameraList::push_back( const uint32HL &GUID, unsigned int width, unsigned int heigth )
+{
+    m_widths.push_back(width);
+    m_heigths.push_back(heigth);
+    m_cameras.push_back( arlCore::Camera( getPlaneSystem(), GUID) );
+}
+
+void arlCore::CameraList::addCamera( const uint32HL &GUID, unsigned int width, unsigned int heigth )
+{
+    push_back( GUID, width, heigth );
+}
+
+unsigned int arlCore::CameraList::size( void ) const
+{
+    return (unsigned int)m_cameras.size();
+}
+
+const arlCore::Camera& arlCore::CameraList::operator[]( unsigned int i ) const
+{
+    return m_cameras[i];
+}
+
+const arlCore::Camera& arlCore::CameraList::back( void ) const
+{
+    return m_cameras.back();
+}
+
+arlCore::Camera& arlCore::CameraList::operator[]( unsigned int i )
+{
+    return m_cameras[i];
+}
+
+arlCore::Camera& arlCore::CameraList::back( void )
+{
+    return m_cameras.back();
+}
+
+const std::vector<arlCore::Camera>& arlCore::CameraList::getList( void ) const
+{
+    return m_cameras;
+}
+
+unsigned int arlCore::CameraList::calibrate( const std::string &calibFile, long int date )
+{
+    if(calibFile=="") return 0;
+    const unsigned int NbCameras = this->size();
+    unsigned int i, n=0;
+    std::vector<long int>calibrationNo( NbCameras );
+    for( i=0 ; i<NbCameras ; ++i )
+    {
+        if((*this)[i].loadParameters( calibFile, date, m_widths[i], m_heigths[i] )) ++n;
+        calibrationNo[i] = (*this)[i].getCalibrationID();
+        if( i==0 || ( calibrationNo[0]>0 && calibrationNo[i]>0 && calibrationNo[i]==calibrationNo[0] ))
+        {   // CommonPlane on first camera
+            // TODO Create a common plane by calibration ID ?
+            getPlaneSystem().setTrf( getPlane(), (*this)[i].getPlane(), (*this)[i].getExtrinsic() );
+        }
+    }
+    return n;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Colour.cpp b/SrcLib/ARLcore/src/arlcore/Colour.cpp
new file mode 100644
index 0000000..9c4b762
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Colour.cpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Colour.h>
+#include <arlcore/Misc.h>
+
+const arlCore::Colour arlCore::Colour::Black( 0, 0, 0 );
+const arlCore::Colour arlCore::Colour::Red( 255, 0, 0 );
+const arlCore::Colour arlCore::Colour::Green( 0, 255, 0 );
+const arlCore::Colour arlCore::Colour::Blue( 0, 0, 255 );
+const arlCore::Colour arlCore::Colour::ElectricBlue( 0, 255, 255 );
+const arlCore::Colour arlCore::Colour::Yellow( 255, 255, 0 );
+const arlCore::Colour arlCore::Colour::Violet( 255, 0, 255 );
+const arlCore::Colour arlCore::Colour::White( 255, 255, 255 );
+
+arlCore::Colour::Colour( const Colour &c ):
+m_R(c.m_R),
+m_G(c.m_G),
+m_B(c.m_B)
+{}
+
+arlCore::Colour::Colour( unsigned int R, unsigned int G, unsigned int B ):
+m_R(R),
+m_G(G),
+m_B(B)
+{}
+
+arlCore::Colour::~Colour( void )
+{}
+
+arlCore::Colour& arlCore::Colour::operator=(const Colour& c)
+{
+    if(this==&c) return *this;
+    m_R = c.m_R;
+    m_G = c.m_G;
+    m_B = c.m_B;
+    return *this;
+}
+
+std::string arlCore::Colour::getString( void ) const    
+{
+    std::stringstream s;
+    s<<m_R<<","<<m_G<<","<<m_B;
+    return s.str();
+}
+
+void arlCore::Colour::setColour( const Colour &c )
+{
+    c.getColour(m_R,m_G,m_B);
+}
+
+void arlCore::Colour::setColour( unsigned int R, unsigned int G, unsigned int B )
+{
+    m_R=R;
+    m_G=G;
+    m_B=B;
+}
+
+void arlCore::Colour::setMapColour( long int n )
+{
+    static std::vector<arlCore::Colour> colours;
+    if(colours.size()==0)
+    {
+        colours.push_back(arlCore::Colour::Red);
+        colours.push_back(arlCore::Colour::Green);
+        colours.push_back(arlCore::Colour::Blue);
+        colours.push_back(arlCore::Colour::ElectricBlue);
+        colours.push_back(arlCore::Colour::Yellow);
+        colours.push_back(arlCore::Colour::Violet);
+        colours.push_back(arlCore::Colour::White);
+    }
+    long int i;
+    if(n<0) i = (-n)%colours.size();
+    else i = n%colours.size();
+    *this = colours[i];
+/*  int step = 30;
+    m_R=0,m_G=0,m_B=0;
+    if(n<0) m_B=255+step*n;
+    else m_R=255-step*n;
+    if(arlCore::even(n)) m_G=m_R, m_R=m_B, m_B=m_G;*/
+}
+
+void arlCore::Colour::getColour( unsigned int &R, unsigned int &G, unsigned int &B ) const
+{
+    R=m_R;
+    G=m_G;
+    B=m_B;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Command.cpp b/SrcLib/ARLcore/src/arlcore/Command.cpp
new file mode 100644
index 0000000..dc69bb2
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Command.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Command.h>
+
+/*#include <sstream>
+#include <fstream>
+#include <iostream>
+*/
+#ifdef _WIN32
+#include <conio.h>
+#endif // _WIN32
+
+arlCore::Command::Command( const std::string &fileName )
+{}
+
+arlCore::Command::~Command( void )
+{}
+
+bool arlCore::Command::get( const std::string& commandName )
+{
+    std::map< std::string, unsigned int >::const_iterator it;
+    it = m_byName.find(commandName);
+    if( it==m_byName.end() ) return false;
+    const bool Persistent = false;
+    bool value = m_values[it->second];
+    if(!Persistent) m_values[it->second] = false;
+    return value;
+}
+
+bool arlCore::Command::refresh( void )
+{
+    char key;
+#ifdef _WIN32
+    if(kbhit()==0) return false;
+    key = getch();
+#else // _WIN32
+    // TODO Test keys for Linux
+    return false;
+#endif // _WIN32
+    std::map< char, unsigned int >::const_iterator it;
+    it = m_byKey.find(key);
+    if( it==m_byKey.end() ) return false;
+    const bool Switch = true;
+    bool value = m_values[it->second];
+    if(Switch) value = !value; else value = true;
+    m_values[it->second] = value;
+    return true;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/FieldCorrection.cpp b/SrcLib/ARLcore/src/arlcore/FieldCorrection.cpp
new file mode 100644
index 0000000..03aa7f9
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/FieldCorrection.cpp
@@ -0,0 +1,172 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/FieldCorrection.h>
+#include <fstream>
+#include <vnl/algo/vnl_powell.h>
+
+#include <arlcore/Misc.h>
+#include <arlcore/Optimization.h>
+
+arlCore::FieldCorrector::FieldCorrector( void ):
+m_degree( 0 ),
+m_correction( false )
+{}
+
+arlCore::FieldCorrector::FieldCorrector( unsigned int degree ):
+m_degree( degree ),
+m_correction( false )
+{
+    const unsigned int NbEquations = 3;
+    m_parameters.set_size(nbPolynomialParameters(degree, NbEquations));
+    m_parameters.fill(0.0);
+}
+
+arlCore::FieldCorrector::FieldCorrector( const FieldCorrector& O )
+{
+    copy(O);
+}
+
+bool arlCore::FieldCorrector::activCorrection( bool b )
+{
+    m_correction = b;
+    return m_correction;
+}
+
+arlCore::FieldCorrector::~FieldCorrector( void )
+{}
+
+bool arlCore::FieldCorrector::copy( const FieldCorrector& O )
+{
+    m_parameters = O.m_parameters;
+    m_degree = O.m_degree;
+    m_correction = O.m_correction;
+    return true;
+}
+
+std::string arlCore::FieldCorrector::getString( void ) const
+{
+    std::stringstream s;
+    s<<"Polynomial of degree "<<m_degree<<" Nb parameters="<<m_parameters.size()<<"\n";
+    s<<m_parameters<<"\n";
+    // TODO Display equations
+//  for( i=0 ; i<NbEquations ; ++i )
+//      s<<C[i]<<" + "<<C[i+3]<<"*Z + "<<C[i+6]<<"*Z*Z + "<<C[i+9]<<"*Y + "<<C[i+12]<<"*Y*Z + "<<C[i+15]<<"*Y*Y + "<<C[i+18]<<"*X + "<<C[i+21]<<"*X*Z + "<<C[i+24]<<"*X*Y + "<<C[i+27]<<"*X*X\n";
+    return s.str();
+}
+
+bool arlCore::FieldCorrector::setDegree( unsigned int degree )
+{
+    if(degree<1) return false;
+    const unsigned int NbEquations = 3;
+    m_degree = degree;
+    m_parameters.set_size(nbPolynomialParameters(m_degree, NbEquations));
+    m_parameters.fill(0.0);
+    return true;
+}
+
+unsigned int arlCore::FieldCorrector::getDegree( void )
+{
+    return m_degree;
+}
+
+unsigned int arlCore::FieldCorrector::getNbParameters( void )
+{
+    return m_parameters.size();
+}
+
+bool arlCore::FieldCorrector::setParameters( const vnl_vector<double> &parameters )
+{
+    if(parameters.size()!=getNbParameters())
+    {
+        const unsigned int NbEquations = 3;
+        unsigned int degree = 1;
+        while(nbPolynomialParameters(degree, NbEquations)!=parameters.size() && degree<10)
+        {
+            ++degree;
+        }
+        if(nbPolynomialParameters(degree, NbEquations)!=parameters.size()) return false;
+        setDegree(degree);
+    }
+    m_parameters = parameters;
+    return true;
+}
+
+bool arlCore::FieldCorrector::load( const std::string &fileName )
+{
+    unsigned int i;
+    std::fstream f;
+    f.open (fileName.c_str(), std::fstream::in);
+    if(!f.is_open()) return false;
+    unsigned int nbParameters;
+    f>>nbParameters;
+    vnl_vector<double> parameters(nbParameters);
+    for( i=0 ; i<nbParameters ; ++i )
+        f>>parameters[i];
+    f.close();
+    return setParameters(parameters);
+}
+
+bool arlCore::FieldCorrector::correct( Point::csptr P1, Point::sptr P2 ) const
+{   // P1=distorted P2=undistorded
+    assert(P1->size()==3 && P2->size()==3);
+    const unsigned int NbEquations = 3;
+    const bool Verbose = false;
+    P2->copy(P1);
+    if(!m_correction || P1->size()!=3 || P2->size()!=3) return false;
+    vnl_vector<double> coordinates(NbEquations), distorsion;
+    coordinates[0] = P1->x();
+    coordinates[1] = P1->y();
+    coordinates[2] = P1->z();
+    bool b = computePolynomial( m_degree, m_parameters, coordinates, distorsion );
+    if(b)
+    {
+        P2->x(coordinates[0]-distorsion[0]);
+        P2->y(coordinates[1]-distorsion[1]);
+        P2->z(coordinates[2]-distorsion[2]);
+        if(Verbose) std::cout<<"Distorsion correction : "<<distorsion<<"\n";
+    }
+    return b;
+}
+
+bool arlCore::FieldCorrector::correct( const vnl_rigid_matrix &T1, vnl_rigid_matrix &T2 ) const
+{   // T1=distorded T2=undistorded
+    const unsigned int NbEquations = 3;
+    const bool Verbose = true;
+    T2.copy(T1);
+    if(!m_correction) return false;
+    vnl_vector<double> coordinates(NbEquations), distorsion;
+    coordinates[0] = T1.getX();
+    coordinates[1] = T1.getY();
+    coordinates[2] = T1.getZ();
+    bool b = computePolynomial( m_degree, m_parameters, coordinates, distorsion );
+    if(b)
+    {
+        T2.setTranslation(coordinates[0]-distorsion[0], coordinates[1]-distorsion[1], coordinates[2]-distorsion[2]);
+        if(Verbose) std::cout<<"Distorsion correction : "<<distorsion<<"\n";
+    }
+    return b;
+}
+
+bool arlCore::FieldCorrector::correct( vnl_rigid_matrix &T ) const
+{
+    vnl_rigid_matrix T0;
+    if(!correct(T, T0)) return false;
+    T.copy(T0);
+    return true;
+}
+
+bool arlCore::fieldCalibration( PointList::csptr real, PointList::csptr distorded, unsigned int degree, vnl_vector<double> &parameters, double &RMS )
+{
+    if(degree<1) return false;
+    Polynomial_cost_function pcf( real, distorded, degree );
+    vnl_powell op(&pcf);
+    parameters.set_size(pcf.getNbParameters());
+    parameters.fill(0.0);
+    op.minimize(parameters);
+    RMS = op.get_end_error();
+    return true;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/File.cpp b/SrcLib/ARLcore/src/arlcore/File.cpp
new file mode 100644
index 0000000..140d3d4
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/File.cpp
@@ -0,0 +1,195 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/File.h>
+
+#include <iostream>
+
+#include <arlcore/Misc.h>
+
+arlCore::File::File( const std::string &fullFileName, const std::string &fileType ):
+m_ok(false),
+m_version(0.0),
+m_fileType(fileType),
+m_error(""),
+m_fullFilename(fullFileName),
+m_position(0)
+{
+    if(m_fullFilename=="") return;
+    arlString::splitFilename( m_fullFilename, m_folder, m_filename, m_extension );
+    m_file.open(m_fullFilename.c_str(), std::fstream::in);
+    if(!m_file.is_open())
+    {
+        m_file.open(m_filename.c_str(), std::fstream::in);
+        if(!m_file.is_open())
+        {
+            std::stringstream s;
+            s<<m_fullFilename<<" doesn't exist\n";
+            setError(s.str());
+            return;
+        }
+    }
+    m_ok = true;
+}
+
+arlCore::File::~File( void )
+{
+    close();
+}
+
+void arlCore::File::close( void )
+{
+    m_file.close();
+}
+
+bool arlCore::File::isOK( void )
+{
+    return m_ok;
+}
+
+bool arlCore::File::getEOF( void )
+{
+    return m_file.eof();
+}
+
+
+bool arlCore::File::rewind( void )
+{
+    if(!m_file.is_open()) return false;
+    m_file.clear();
+    m_file.seekg(0, std::ios::beg);
+    return true;
+}
+
+bool arlCore::File::recordCurrentPosition( void )
+{
+    if(!m_file.is_open()) return false;
+    m_position = m_file.tellg();
+    return true;
+}
+
+
+bool arlCore::File::rewindRecordedPosition( void )
+{
+    if(!m_file.is_open() || m_position==0) return false;
+    m_file.seekg(m_position);
+    return true;
+}
+
+std::string arlCore::File::getError( void )
+{
+    return m_error;
+}
+
+double arlCore::File::getVersion( void )
+{
+    return m_version;
+}
+
+void arlCore::File::setError( const std::string &error )
+{
+    const bool Verbose = true;
+    m_error = error;
+    if(Verbose) std::cerr<<m_error<<"\n";
+}
+
+std::string arlCore::File::getFullFilename( void )
+{
+    return m_fullFilename;
+}
+
+std::string arlCore::File::getFilename( void )
+{
+    return m_filename;
+}
+
+std::string arlCore::File::getFolder( void )
+{
+    return m_folder;
+}
+
+std::string arlCore::File::getExtension( void )
+{
+    return m_extension;
+}
+
+double arlCore::File::readHeader( void )
+{
+    if(!isOK()) return 0.0;
+    std::stringstream s;
+    std::string token, text;
+    unsigned int n=0;
+    do
+    {
+        m_file>>token;
+        if(token=="FileType")
+        {
+            m_file>>text;
+            if(text!=m_fileType)
+            {
+                s<<"Filetype '"<<text<<"' unexpected ("<<m_fileType<<" requested)";
+                setError(s.str());
+                return m_version;
+            }
+            n=(n|1);
+        }
+        if(token=="Version") {m_file>>m_version; n=(n|2);}
+        if(m_file.eof())
+        {
+            s<<"End of file unexpected : "<<m_filename;
+            setError(s.str());
+            return m_version;
+        }
+    } while(n!=3);
+    return m_version;
+}
+
+bool arlCore::File::getToken( std::string& token )
+{
+    m_file>>token;
+    return !m_file.eof();
+}
+
+std::string arlCore::File::getString( void )
+{
+    std::string value;
+    m_file>>value;
+    return value;
+}
+
+bool arlCore::File::getString( std::string &value )
+{
+    m_file>>value;
+    return true;
+}
+
+std::string arlCore::File::getPath( void )
+{
+    std::stringstream s;
+    std::string value;
+    m_file>>value;
+    s<<getFolder()<<"/"<<value;
+    return s.str();
+}
+
+std::fstream& arlCore::File::getStream( void )
+{
+    return m_file;
+}
+
+std::string arlCore::File::getFiletype( const std::string &fileName )
+{
+    std::string token, fileType = "";
+    std::fstream file;
+    file.open(fileName.c_str(), std::fstream::in);
+    if(file.is_open())
+    {
+        file>>token;
+        if(token=="FileType")
+            file>>fileType;
+    }
+    return fileType;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/ICP.cpp b/SrcLib/ARLcore/src/arlcore/ICP.cpp
new file mode 100644
index 0000000..a751483
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/ICP.cpp
@@ -0,0 +1,533 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/ICP.h>
+
+#include <vnl/vnl_trace.h>
+#include <vnl/vnl_inverse.h>
+#include <vnl/vnl_transpose.h>
+
+#include <vnl/algo/vnl_symmetric_eigensystem.h>
+#include <vnl/algo/vnl_levenberg_marquardt.h>
+#include <vnl/algo/vnl_powell.h>
+
+#ifdef ANN
+#include <ANN/ANN.h>
+#endif // ANN
+
+#include <arlcore/Optimization.h>
+#include <arlcore/vnl_rigid_vector.h>
+
+arlCore::ICP::ICP( arlCore::PointList::csptr model, arlCore::PointList::csptr cloud, bool justVisible ):
+m_point2PointMode(true),
+m_modelMesh(),
+m_cloud(),
+m_initialization(false),
+m_justVisible(justVisible),
+m_modelSize(0),
+m_cloudSize(0),
+m_modelPoints(0),
+m_cloudPoints(0),
+m_Pk(0),
+m_Yk(0),
+m_Pi(0),
+m_ANNtree(0),
+m_nn_idx(0),
+m_squaredDists(0),
+m_maxIterations(50),
+m_nbIterations(0),
+m_startError(-1),
+m_endError(-1)
+{
+    m_solution.setIdentity();
+#ifdef ANN
+    const unsigned int m_dimension = model->getDimension();
+    assert(m_dimension==cloud->getDimension());
+    m_modelGravity.set_size(m_dimension);
+    m_cloudGravity.set_size(m_dimension);
+    unsigned int i, j, n;
+    if(justVisible) m_modelSize = model->visibleSize();
+    else m_modelSize = model->size();
+    if(m_modelSize<1) return;
+    m_modelPoints = annAllocPts( m_modelSize, m_dimension );
+    for( i=0, n=0 ; i<m_modelSize ; ++i )
+        if((*model)[i])
+            if(!justVisible || (justVisible && (*model)[i]->isVisible()))
+            {
+                for( j=0 ; j<m_dimension ; ++j )
+                    m_modelPoints[n][j]=(*model)[i]->get(j);
+                ++n;
+            }
+    m_modelSize = n;
+    if(justVisible) m_cloudSize = cloud->visibleSize();
+    else m_cloudSize = cloud->size();
+    if(m_modelSize<1 || m_cloudSize<1)
+    {
+        annDeallocPts( m_modelPoints );
+        m_modelPoints = 0;
+        return;
+    }
+    m_cloudPoints = annAllocPts( m_cloudSize, m_dimension );
+    for( i=0, n=0 ; i<m_cloudSize ; ++i )
+        if((*cloud)[i])
+            if(!justVisible || (justVisible && (*cloud)[i]->isVisible()))
+            {
+                for( j=0 ; j<m_dimension ; ++j )
+                    m_cloudPoints[n][j]=(*cloud)[i]->get(j);
+                ++n;
+            }
+    m_cloudSize = n;
+    if(m_cloudSize<1)
+    {
+        annDeallocPts( m_modelPoints );
+        annDeallocPts( m_cloudPoints );
+        m_modelPoints = 0;
+        m_cloudPoints = 0;
+        return;
+    }
+    m_Pk = annAllocPts( m_cloudSize, m_dimension );
+    m_Yk = annAllocPts( m_cloudSize, m_dimension );
+    m_Pi = annAllocPts( m_cloudSize, m_dimension );
+    const int BucketSize = 1;
+    m_ANNtree = new ANNkd_tree( m_modelPoints, m_modelSize, m_dimension, BucketSize, ANN_KD_SL_MIDPT );
+    m_nbNN = 1;
+    m_nn_idx = new ANNidx[m_nbNN];
+    m_squaredDists = new ANNdist[m_nbNN];
+#endif // ANN
+}
+
+arlCore::ICP::ICP( arlCore::Mesh::csptr model, arlCore::PointList::csptr cloud, bool justVisible ):
+m_point2PointMode(true),
+m_modelMesh(),
+m_cloud(),
+m_initialization(false),
+m_justVisible(justVisible),
+m_modelSize(0),
+m_cloudSize(0),
+m_modelPoints(0),
+m_cloudPoints(0),
+m_Pk(0),
+m_Yk(0),
+m_Pi(0),
+m_ANNtree(0),
+m_nn_idx(0),
+m_squaredDists(0),
+m_maxIterations(50),
+m_nbIterations(0),
+m_startError(-1),
+m_endError(-1)
+{
+    m_solution.setIdentity();
+    if(justVisible) m_modelSize = model->getPointList()->visibleSize();
+    else m_modelSize = model->getPointList()->size();
+    if(justVisible) m_cloudSize = cloud->visibleSize();
+    else m_cloudSize = cloud->size();
+}
+
+
+
+void arlCore::ICP::initSolution( const arlCore::vnl_rigid_matrix &M )
+{
+    m_solution = M;
+    initialization();
+}
+
+const arlCore::vnl_rigid_matrix& arlCore::ICP::getSolution( void ) const
+{
+    return m_solution;
+}
+
+arlCore::ICP::~ICP( void )
+{
+#ifdef ANN
+    if(m_ANNtree) delete m_ANNtree;
+    if(m_modelPoints) annDeallocPts( m_modelPoints );
+    if(m_cloudPoints) annDeallocPts( m_cloudPoints );
+    if(m_Pk) annDeallocPts( m_Pk );
+    if(m_Yk) annDeallocPts( m_Yk );
+    if(m_Pi) annDeallocPts( m_Pi );
+    if(m_nn_idx) delete[] m_nn_idx;
+    if(m_squaredDists) delete[] m_squaredDists;
+    annClose();
+#endif // ANN
+}
+
+bool arlCore::ICP::setMaxIterations( unsigned int n )
+{
+    if(n<1) return false;
+    m_maxIterations = n;
+    return true;
+}
+
+unsigned int arlCore::ICP::getModelSize( void ) const
+{
+    return m_modelSize;
+}
+
+unsigned int arlCore::ICP::getCloudSize( void ) const
+{
+    return m_cloudSize;
+}
+
+unsigned int arlCore::ICP::getNbIterations( void ) const
+{
+    return m_nbIterations;
+}
+
+double arlCore::ICP::getStartError( void ) const
+{
+    return m_startError;
+}
+
+double arlCore::ICP::getEndError( void ) const
+{
+    return m_endError;
+}
+
+double arlCore::ICP::optimisePowell( void )
+{
+    unsigned int i;
+    arlCore::OptimiseICP optimizer( *this );
+    //optimizer.setObserver(true);
+    vnl_powell powell(&optimizer);
+    const arlCore::vnl_rigid_vector V( m_solution );
+    vnl_vector<double> init(6);
+    for( i=0 ; i<6 ; ++i )
+        init(i) = V[i];
+    powell.minimize(init);
+    m_solution.copy(arlCore::vnl_rigid_vector(init));
+    m_startError = powell.get_start_error();
+    m_endError = powell.get_end_error();
+    m_nbIterations = powell.get_num_iterations();
+    //m_nbIterations = optimizer.getNbIterations();
+    m_solution.copy(arlCore::vnl_rigid_vector(init));
+    m_solution.setRMS(m_endError);
+    return m_endError;
+}
+
+double arlCore::ICP::optimiseLS( void )
+{
+    unsigned int i;
+    m_startError = m_endError;
+    arlCore::OptimiseICP_LS optimizer( *this, vnl_least_squares_function::use_gradient );
+    //optimizer.setObserver(true);
+    vnl_levenberg_marquardt lm(optimizer);
+    const arlCore::vnl_rigid_vector V( m_solution );
+    vnl_vector<double> init(6);
+    for( i=0 ; i<6 ; ++i )
+        init(i) = V[i];
+    lm.minimize_using_gradient(init);
+    //m_startError = lm.get_start_error();
+    //m_endError = lm.get_end_error();
+    m_nbIterations = lm.get_num_iterations();
+    //m_nbIterations = optimizer.getNbIterations();
+    m_solution.copy(arlCore::vnl_rigid_vector(init));
+    m_endError = computeCriterion( m_solution );
+    m_solution.setRMS(m_endError);
+    return m_endError;
+}
+
+double arlCore::ICP::computeCriterion( const arlCore::vnl_rigid_matrix &M )
+{
+    vnl_vector< double > fx;
+    return computeCriterion( M, fx );
+}
+
+double arlCore::ICP::computeCriterion( const arlCore::vnl_rigid_matrix &M, vnl_vector< double > &fx )
+{
+    vnl_vector<double> RMS(1, 0.0), nbPoints(1, 0.0);
+    const arlCore::vnl_rigid_matrix InvM = M.computeInverse();
+    unsigned int i, j, noTriangle;
+    double n = 0.0, result = 0.0;
+    if(m_point2PointMode)
+    {   // Points to points
+#ifdef ANN
+        const unsigned int Dimension = 3;
+        vnl_vector_fixed<double,3> traInit = InvM.getTranslation();
+        vnl_matrix_fixed<double,3,3> rotInit = InvM.getRotation();
+        const double Epsilon = 0.0;// Error bound
+        ANNpoint Pt = annAllocPt(Dimension); // Query point
+        for( i=0 ; i<m_cloudSize ; ++i )
+        {   // Search the matching point for every point of cloud
+            for( j=0 ; j<3; ++j )
+                Pt[j] = rotInit[j][0]*m_cloudPoints[i][0]+rotInit[j][1]*m_cloudPoints[i][1]+rotInit[j][2]*m_cloudPoints[i][2]+traInit[j];
+            m_ANNtree->annkSearch( Pt, m_nbNN, m_nn_idx, m_squaredDists, Epsilon );
+            if(fx.size()>i) fx[i] = m_squaredDists[0];
+            RMS[0] += m_squaredDists[0];
+        }
+        annDeallocPt(Pt);
+        n = (double)m_cloudSize;
+#endif // ANN
+    }else
+    {   // Point to mesh
+        assert(m_cloud!=0 && m_modelMesh!=0);
+        RMS.set_size((unsigned int)m_modelMesh->getTriangles().size());
+        RMS.fill(0.0);
+        nbPoints.set_size(RMS.size());
+        nbPoints.fill(0.0);
+        unsigned int i;
+        arlCore::Point::sptr point = arlCore::Point::New(3);
+        for( i=0 ; i<m_cloud->size() ; ++i )
+            if(m_cloud->get(i))
+                if(!m_justVisible || m_cloud->get(i)->isVisible())
+                {
+                    InvM.trf(m_cloud->get(i), point);
+                    const double SquaredDist = m_modelMesh->computeDistance2(point, noTriangle);
+                    if(SquaredDist>0.0)
+                    {
+                        RMS[noTriangle] += SquaredDist;
+                        if(fx.size()>i) fx[i] = SquaredDist;
+                        nbPoints[noTriangle] += 1;
+                    }
+                }
+    }
+    assert(nbPoints.size()==RMS.size());
+    if(RMS.size()==1)
+    {
+        if(nbPoints[0]>0) return sqrt(RMS[i]/nbPoints[i]);
+        else return -1.0;
+    }
+    for( i=0 ; i<RMS.size() ; ++i )
+        if(nbPoints[i]>0)
+        {
+            result += sqrt(RMS[i]/nbPoints[i]);
+            n += 1.0;
+        }
+    if(n>0) return result/n;
+    else return -1;
+}
+
+bool arlCore::ICP::initialization( void )
+{
+#ifdef ANN
+    if(m_cloudSize<1 || !m_point2PointMode) return false;
+    unsigned int i, j;
+    arlCore::vnl_rigid_matrix invS = m_solution.computeInverse();
+    m_traInit = invS.getTranslation();
+    m_rotInit = invS.getRotation();
+    m_cloudGravity.fill(0.0);
+    for( i=0 ; i<m_cloudSize ; ++i )
+        for( j=0 ; j<3; ++j )
+        {
+            m_Pi[i][j] = m_Pk[i][j] = m_rotInit[j][0]*m_cloudPoints[i][0]+m_rotInit[j][1]*m_cloudPoints[i][1]+m_rotInit[j][2]*m_cloudPoints[i][2]+m_traInit[j];
+            m_cloudGravity[j] += m_Pi[i][j];
+        }
+    m_cloudGravity /= (double)m_cloudSize;
+    m_initialization=true;
+    return true;
+#endif // ANN
+    return false;
+}
+
+bool arlCore::ICP::solve( void )
+{
+    const double Tau = 10e-8;
+    const bool Verbose = false;
+    m_startError = -1.0;
+    m_nbIterations = 0;
+#ifdef ANN
+    if(!m_point2PointMode) return false;
+    m_endError = FLT_MAX/2.0;
+    double previousRMS = FLT_MAX;
+    if(!m_initialization)
+        if(!initialization())
+            return false;
+//  http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/trans/tp/&toc=comp/trans/tp/1992/02/i2toc.xml&DOI=10.1109/34.121791
+//  http://ieeexplore.ieee.org/iel1/34/3469/00121791.pdf?tp=&arnumber=121791&isnumber=3469
+    unsigned int i, j, k;
+    vnl_quaternion<double> qr(0,0,0,1);
+    vnl_matrix_fixed<double,3,3> Id3, Ricp, Spy;
+    Id3.set_identity();
+    vnl_matrix_fixed<double,4,4> QSpy;
+    vnl_vector_fixed<double,3> Delta;
+    while( fabs(m_endError-previousRMS)>Tau && m_nbIterations<m_maxIterations ) //&& RMS>RMSMax )
+    {
+        ++m_nbIterations;
+        std::cout<<m_nbIterations<<" ";
+        previousRMS = m_endError;
+        computeError(); // step 1
+        if(m_startError<0) m_startError = m_endError;
+        // step 2
+        // Calculate the cross-variance matrix between m_Pk and Yo
+        // Cov( P0, m_Yk ) = 1/n*somme(P0*m_Yk') - ComP0*Comm_Yk'
+        Spy.set_identity();
+        for( i=0 ; i<m_cloudSize ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            for( k=0 ; k<3 ; ++k )
+            Spy[j][k]+= m_Pi[i][j]*m_Yk[i][k];
+        for( i=0 ; i<3 ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            Spy[i][j] = Spy[i][j]/(double)m_cloudSize - m_cloudGravity[i]*m_modelGravity[j];
+        // Delta = [A23 A31 A12] with Amn = Spy[m][n]-Spy[n][m]
+        Delta[0] = Spy[1][2]-Spy[2][1];
+        Delta[1] = Spy[2][0]-Spy[0][2];
+        Delta[2] = Spy[0][1]-Spy[1][0];
+        // calculate the symmetric 4x4 matrix needed to determine
+        // the max eigenvalue
+        QSpy[0][0] = vnl_trace( Spy );
+        for( i=1 ; i<4 ; ++i )
+        {
+            QSpy[i][0] = Delta[i-1];
+            for( j = 1; j < 4; ++j )
+            {
+                QSpy[0][j] = Delta[j-1];
+                QSpy[i][j] = Spy[i-1][j-1]+Spy[j-1][i-1] - QSpy[0][0]*Id3[i-1][j-1];
+            }
+        }
+        vnl_symmetric_eigensystem<double> eigQSpy(QSpy);
+        // Optimal rotation matrix calculate from the quaternion
+        // vector qr=[q0 q1 q2 q3] obtained by obtained the max eigen value
+        // http://paine.wiau.man.ac.uk/pub/doc_vxl/core/vnl/html/vnl__symmetric__eigensystem_8h.html
+        qr.update(eigQSpy.get_eigenvector(3));
+        qr = vnl_quaternion<double>(qr[1], qr[2], qr[3], qr[0]);
+        Ricp = vnl_transpose(qr.rotation_matrix_transpose()).asMatrix();
+        // Optimal translation vector Ticp T = ComY - Ricp.ComP
+        vnl_vector<double> TraTemp = m_modelGravity - Ricp*m_cloudGravity;
+        // step 3 : Application of the transformation
+        for( i=0 ; i<m_cloudSize ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            m_Pk[i][j] = Ricp[j][0]*m_Pi[i][0] + Ricp[j][1]*m_Pi[i][1] + Ricp[j][2]*m_Pi[i][2] + TraTemp[j];
+    }
+    // Give the transformation from model ==> cloud
+    // First we add the first transformation to Rend
+    vnl_matrix_fixed<double,3,3> Rend = Ricp.transpose();
+    vnl_vector_fixed<double,3> Tend;
+    for( i=0 ; i<3 ; ++i )
+        Tend[i] = m_cloudGravity[i]-(Rend[i][0]*m_modelGravity[0]+Rend[i][1]*m_modelGravity[1]+Rend[i][2]*m_modelGravity[2]);
+    // Initial matrix [m_rotInit ; m_traInit ; 0 0 0 1]
+    // Found matrix [Rend ; Tend ; 0 0 0 1]
+    m_solution.vnl_matrix_fixed<double,4,4>::update(vnl_inverse(m_rotInit)*Rend);
+    m_solution.set_column(3,vnl_inverse(m_rotInit)*(Tend-m_traInit));
+    m_solution[3][3] = 1.0;
+    m_solution.setRMS( m_endError );
+    if(Verbose)
+    {
+        std::cout<<"ICP registration\n";
+        std::cout<<"First RMS="<<m_startError<<"\nLast RMS="<<m_endError<<"\nIterations="<<m_nbIterations<<"\nPtsModel="<<m_modelSize<<"\nPtsCloud="<<m_cloudSize<<"\n";
+        std::cout<<"Tau ="<<fabs(m_endError-previousRMS)<<"\n";
+        std::cout<<"Matrix ="<<m_solution<<"\n";
+    }
+    return true;
+#else // ANN
+    m_endError = -1.0;
+    return false;
+#endif // ANN
+}
+
+double arlCore::ICP::computeError( void )
+{
+#ifndef ANN
+    m_endError = -1.0;
+#else // ANN
+    if(m_point2PointMode)
+    {   // Points to points
+        unsigned int i, j;
+        m_endError = 0.0;
+        m_modelGravity.fill(0.0);
+        const double Epsilon = 0.0;// Error bound
+        for( i=0 ; i<m_cloudSize ; ++i )
+        {   // search the matching point for every point of cloud
+            m_ANNtree->annkSearch(
+                m_Pk[i],  // Query point
+                m_nbNN,   // Number of near neighbors
+                m_nn_idx, // Nearest neighbors (returned)
+                m_squaredDists,  // Distance for each neighbors (returned)
+                Epsilon );
+            for( j=0 ; j<3 ; ++j )
+                m_modelGravity[j] += m_Yk[i][j] = m_modelPoints[m_nn_idx[0]][j];
+            m_endError += m_squaredDists[0];
+        }
+        m_endError = sqrt(m_endError/(double)m_cloudSize);
+        m_modelGravity /= (double)m_cloudSize;
+    }
+#endif // ANN
+    if(!m_point2PointMode)
+    {   // Point to mesh
+        assert(m_cloud!=0 && m_modelMesh!=0);
+        unsigned int i;
+        double n = 0.0;
+        m_endError = 0.0;
+        const arlCore::vnl_rigid_matrix InvM = m_solution.computeInverse();
+        arlCore::Point::sptr point = arlCore::Point::New(3);;
+        assert(m_cloud!=0 && m_modelMesh!=0);
+        for( i=0 ; i<m_cloud->size() ; ++i )
+            if(m_cloud->get(i))
+                if(!m_justVisible || m_cloud->get(i)->isVisible())
+                {
+                    InvM.trf(m_cloud->get(i), point);
+                    m_endError += m_modelMesh->computeDistance2(point);
+                    ++n;
+                }
+        if(n!=0) m_endError = sqrt(m_endError/n);
+        else m_endError = -1.0;
+    }
+    return m_endError;
+}
+
+unsigned int arlCore::ICP::computeDistances( std::vector<double> &distances )
+{
+    distances.clear();
+    unsigned int i;
+    if(m_point2PointMode)
+    {   // Point to point
+#ifdef ANN
+        const double Epsilon = 0.0;
+        for( i=0 ; i<m_cloudSize ; ++i )
+        {
+            m_ANNtree->annkSearch( m_Pk[i], m_nbNN, m_nn_idx, m_squaredDists, Epsilon );
+            const double SquaredDistance = m_squaredDists[0];
+            const double Distance = sqrt(SquaredDistance);
+            distances.push_back(Distance);
+        }
+#endif // ANN
+    }else
+    {   // Point to mesh
+        assert(m_cloud!=0 && m_modelMesh!=0);
+        const arlCore::vnl_rigid_matrix InvM = m_solution.computeInverse();
+        arlCore::Point::sptr point = arlCore::Point::New(3);;
+        for( i=0 ; i<m_cloud->size() ; ++i )
+            if(m_cloud->get(i))
+                if(!m_justVisible || m_cloud->get(i)->isVisible())
+                {
+                    InvM.trf(m_cloud->get(i), point);
+                    distances.push_back(m_modelMesh->computeDistance(point));
+                }
+    }
+    return (unsigned int)distances.size();
+}
+
+unsigned int arlCore::ICP::computeDistances( arlCore::PointList::sptr points )
+{
+    unsigned int i;
+    std::vector<double> distances;
+    points->clear();
+    arlCore::Point::sptr point = arlCore::Point::New(3);;
+    if(m_point2PointMode)
+    {
+        computeDistances( distances );
+#ifdef ANN
+        for( i=0 ; i<distances.size() ; ++i )
+        {
+            point->x(m_Pk[i][0]), point->y(m_Pk[i][1]), point->z(m_Pk[i][2]);
+            point->setError(distances[i]);
+            points->push_back(point);
+        }
+#endif // ANN
+    }else
+    {   // Point to mesh
+        const arlCore::vnl_rigid_matrix InvM = m_solution.computeInverse();
+        assert(m_cloud && m_modelMesh);
+        for( i=0 ; i<m_cloud->size() ; ++i )
+            if(m_cloud->get(i))
+                if(!m_justVisible || m_cloud->get(i)->isVisible())
+                {
+                    InvM.trf(m_cloud->get(i), point);
+                    point->setError(m_modelMesh->computeDistance(point));
+                    points->push_back(point);
+                }
+    }
+    return (unsigned int)points->size();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/MatrixR.cpp b/SrcLib/ARLcore/src/arlcore/MatrixR.cpp
new file mode 100644
index 0000000..26ee32c
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/MatrixR.cpp
@@ -0,0 +1,1889 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/MatrixR.h>
+
+#include <fstream>
+#include <sstream>
+#include <iomanip>
+#include <math.h>
+#include <utility>
+
+#include <vnl/vnl_matrix_fixed.h>
+#include <vnl/vnl_transpose.h>
+#include <vnl/vnl_inverse.h>
+#include <vnl/vnl_trace.h>
+
+#include <vgl/vgl_plane_3d.h>
+#include <vgl/algo/vgl_homg_operators_3d.h>
+
+#include <vnl/algo/vnl_matrix_inverse.h>
+#include <vnl/algo/vnl_levenberg_marquardt.h>
+#include <vnl/algo/vnl_powell.h>
+#include <vnl/algo/vnl_conjugate_gradient.h>
+#include <vnl/algo/vnl_symmetric_eigensystem.h>
+
+#ifdef ANN
+#include <ANN/ANN.h>
+#endif // ANN
+
+#include <arlcore/PointsList.h>
+#include <arlcore/Misc.h>
+#include <arlcore/Optimization.h>
+#include <arlcore/vnl_rigid_vector.h>
+#include <arlcore/vnl_rotation3d_vector.h>
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( void ):
+vnl_matrix_fixed<double,4,4>(),
+Object(ARLCORE_CLASS_MATRIXR,"Unknown Matrix")
+{
+    setIdentity();
+    setTime(0, 0);
+    setOK(true); // FIXME
+}
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( const vnl_rigid_matrix& T ):
+vnl_matrix_fixed<double,4,4>(),
+Object(T)
+{
+    copy(T);
+}
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( const vnl_rigid_vector& T ):
+vnl_matrix_fixed<double,4,4>(),
+Object(ARLCORE_CLASS_MATRIXR,"Unknown Matrix")
+{
+    copy(T);
+}
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( const vnl_matrix_fixed<double,4,4>& T ):
+vnl_matrix_fixed<double,4,4>(),
+Object(ARLCORE_CLASS_MATRIXR,"Unknown Matrix")
+{
+    copy(T);
+}
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( const vnl_rotation3d_matrix &r, const vnl_vector_fixed<double,3> &t):
+vnl_matrix_fixed<double,4,4>(),
+Object(ARLCORE_CLASS_MATRIXR,"Unknown Matrix"),
+m_registerRMS(-1.0),
+m_registerStdDev(0.0)
+{
+    setTranslation( t );
+    setRotation( r );
+}
+
+arlCore::vnl_rigid_matrix::vnl_rigid_matrix( const std::string &fileName ):
+vnl_matrix_fixed<double,4,4>(),
+Object(ARLCORE_CLASS_MATRIXR,"Unknown Matrix")
+{
+    setIdentity();
+    setTime(0, 0);
+    load(fileName);
+}
+
+arlCore::vnl_rigid_matrix::~vnl_rigid_matrix( void )
+{}
+
+bool arlCore::vnl_rigid_matrix::isValid( void ) const
+{   //TODO : Complete the test
+    if(get(0,3)!=0.0 || get(1,3)!=0.0 || get(2,3)!=0 || get(3,3)!=1.0) return false;
+    return getRotation().is_rotation();
+}
+
+double arlCore::vnl_rigid_matrix::GaussianNoiseTranslation( double Xnoise, double Ynoise, double Znoise )
+{
+    if( Xnoise==0 && Ynoise==0 && Znoise==0 ) return 0.0;
+    unsigned int i;
+    std::vector< double > delta(3);
+    delta[0] = arlRandom::Random::gaussianRnd( Xnoise );
+    delta[1] = arlRandom::Random::gaussianRnd( Ynoise );
+    delta[2] = arlRandom::Random::gaussianRnd( Znoise );
+    for( i=0 ; i<3 ; ++i )
+        (*this)[i][3] += delta[i];
+    return sqrt(delta[0]*delta[0]+delta[1]*delta[1]+delta[2]*delta[2]);
+}
+
+double arlCore::vnl_rigid_matrix::GaussianNoiseRotation( double Xnoise, double Ynoise, double Znoise )
+{
+    if( Xnoise==0 && Ynoise==0 && Znoise==0 ) return 0.0;
+    const vnl_quaternion<double> q0 = getQuaternion();
+    vnl_vector_fixed<double,3> euler = q0.rotation_euler_angles();
+    euler[0] += arlRandom::Random::gaussianRnd( Xnoise )*arlCore::DegToRad;
+    euler[1] += arlRandom::Random::gaussianRnd( Ynoise )*arlCore::DegToRad;
+    euler[2] += arlRandom::Random::gaussianRnd( Znoise )*arlCore::DegToRad;
+    const vnl_quaternion<double> q1( euler[0], euler[1], euler[2] );
+    setQuaternion( q1 );
+    return fabs( (q1.angle()- q0.angle())*arlCore::RadToDeg );
+}
+
+double arlCore::vnl_rigid_matrix::distance( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method ) const
+{
+    const double Dist2 = distance2(T, method);
+    if(Dist2<0.0) return -1;
+    else return sqrt(Dist2);
+}
+
+double arlCore::vnl_rigid_matrix::distance2( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method ) const
+{
+    std::vector<double> errors2;
+    return distance2(T, method, errors2);
+}
+
+double arlCore::vnl_rigid_matrix::distance2( const vnl_rigid_matrix &T, ARLCORE_VRM_DISTANCE_METHOD method, std::vector<double> &errors2 ) const
+{
+    errors2.clear();
+    const double Unit = 1.0;
+    double distance2 = 0.0;
+    unsigned int i;
+    arlCore::Point::sptr o1 = arlCore::Point::New(0.0, 0.0, 0.0);
+    arlCore::Point::sptr o2 = arlCore::Point::New(0.0, 0.0, 0.0);
+    arlCore::Point::sptr u1 = arlCore::Point::New(Unit, 0.0, 0.0);
+    arlCore::Point::sptr u2 = arlCore::Point::New(Unit, 0.0, 0.0);
+    arlCore::Point::sptr v1 = arlCore::Point::New(0.0, Unit, 0.0);
+    arlCore::Point::sptr v2 = arlCore::Point::New(0.0, Unit, 0.0);
+    arlCore::Point::sptr w1 = arlCore::Point::New(0.0, 0.0, Unit);
+    arlCore::Point::sptr w2 = arlCore::Point::New(0.0, 0.0, Unit);
+    T.trf(o1);T.trf(u1);T.trf(v1);T.trf(w1);
+    trf(o2);trf(u2);trf(v2);trf(w2);
+    switch(method)
+    {
+    case ARLCORE_VRM_DISTANCE_3AXIS:
+        {
+            errors2.push_back(u1->distance2(u2));
+            errors2.push_back(v1->distance2(v2));
+            errors2.push_back(w1->distance2(w2));
+            break;
+        }
+    case ARLCORE_VRM_DISTANCE_TRANSLATION:
+        {
+            errors2.push_back(o1->distance2(o2));
+            break;
+        }
+    case ARLCORE_VRM_DISTANCE_OX:
+        {
+            errors2.push_back(o1->distance2(o2));
+            errors2.push_back(u1->distance2(u2));
+            break;
+        }
+    case ARLCORE_VRM_DISTANCE_OY:
+        {
+            errors2.push_back(o1->distance2(o2));
+            errors2.push_back(v1->distance2(v2));
+            break;
+        }
+    case ARLCORE_VRM_DISTANCE_OZ:
+        {
+            errors2.push_back(o1->distance2(o2));
+            errors2.push_back(w1->distance2(w2));
+            break;
+        }
+    default: break;
+    }
+    for( i=0 ; i<errors2.size() ; ++i )
+        distance2+=errors2[i];
+    if(errors2.size()>0) return distance2/(double)errors2.size();
+    else return -1;
+}
+
+void arlCore::vnl_rigid_matrix::compare( const vnl_rigid_matrix &T, double &errorTranslation, double &errorRotation ) const
+{
+    vnl_rigid_matrix TPrim;
+    TPrim.invert(T);
+    compareInverse(TPrim, errorTranslation, errorRotation);
+}
+
+void arlCore::vnl_rigid_matrix::compareInverse( const vnl_rigid_matrix &T, double &errorTranslation, double &errorRotation ) const
+{
+    vnl_rigid_matrix delta1, delta2;
+    delta1.mult(T, *this);
+    delta2.mult(*this, T);
+    errorTranslation = (delta1.getTranslation().two_norm() + delta2.getTranslation().two_norm())/2.0;
+
+    const unsigned int RotMethod = 2;
+    if( RotMethod==1 )
+    {   // Angle of quaternion
+        vnl_quaternion<double> q( delta1.extract(3,3) );
+        errorRotation = q.angle()*arlCore::RadToDeg;
+    }
+    if( RotMethod==2 )
+    {   // arcos( (trace(A*inv(B))-1)/2 )
+        const double Cosinus = ( vnl_trace( delta1.getRotation() )-1.0 )/2.0;
+        if( fabs(Cosinus) <= 1.0 )
+            errorRotation = acos(Cosinus)*arlCore::RadToDeg;
+        else errorRotation = 0.0;
+    }
+}
+
+void arlCore::vnl_rigid_matrix::uniform_random( double size )
+{
+    vnl_rotation3d_vector rot;
+    rot.uniform_random();
+    setRotation(vnl_rotation3d_matrix(rot));
+    put(0,3,arlRandom::Random::uniformDoubleRnd( -size/2, size/2 ));
+    put(1,3,arlRandom::Random::uniformDoubleRnd( -size/2, size/2 ));
+    put(2,3,arlRandom::Random::uniformDoubleRnd( -size/2, size/2 ));
+    Object::update();
+}
+
+bool arlCore::vnl_rigid_matrix::setTranslation( const vnl_vector_fixed<double,3> &v )
+{
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        put(i,3,v(i) );
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setTranslation( double x, double y, double z )
+{
+    put(0,3,x);
+    put(1,3,y);
+    put(2,3,z);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setX( double x )
+{
+    put(0,3,x);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setY( double y )
+{
+    put(1,3,y);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setZ( double z )
+{
+    put(2,3,z);
+    Object::update();
+    return true;
+}
+
+double arlCore::vnl_rigid_matrix::getX( void ) const
+{
+    return get(0,3);
+}
+
+double arlCore::vnl_rigid_matrix::getY( void ) const
+{
+    return get(1,3);
+}
+
+double arlCore::vnl_rigid_matrix::getZ( void ) const
+{
+    return get(2,3);
+}
+
+vnl_vector_fixed<double,3> arlCore::vnl_rigid_matrix::getTranslation( void ) const
+{
+    vnl_vector_fixed<double,3> V;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        V.put(i,get(i,3));
+    return V;
+}
+
+vnl_vector_fixed<double,4> arlCore::vnl_rigid_matrix::getHTranslation( void ) const
+{
+    vnl_vector_fixed<double,4> V;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        V.put(i,get(i,3));
+    V.put(3,1.0);
+    return V;
+}
+bool arlCore::vnl_rigid_matrix::setRotation( const vnl_rotation3d_matrix &v )
+{
+    vnl_matrix_fixed<double,4,4>::update(v);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setQuaternion( const vnl_quaternion<double> &q )
+{   // See http://public.kitware.com/vxl/doc/release/core/vnl/html/classvnl__quaternion.html#vnl__quaterniona4
+    vnl_matrix_fixed<double,4,4>::update(q.rotation_matrix_transpose().transpose());
+    Object::update();
+    return true;
+}
+
+vnl_quaternion<double> arlCore::vnl_rigid_matrix::getQuaternion( void ) const
+{   // See http://public.kitware.com/vxl/doc/release/core/vnl/html/classvnl__quaternion.html#vnl__quaterniona4
+    return vnl_quaternion<double>(extract(3,3).transpose());
+}
+
+arlCore::vnl_rotation3d_matrix arlCore::vnl_rigid_matrix::getRotation( void ) const
+{
+    vnl_matrix_fixed<double,3,3>M = extract(3,3);
+    return M;
+}
+
+double arlCore::vnl_rigid_matrix::getRMS( void ) const
+{
+    return m_registerRMS;
+}
+
+double arlCore::vnl_rigid_matrix::getStdDev( void ) const
+{
+    return m_registerStdDev;
+}
+
+void arlCore::vnl_rigid_matrix::setRMS( double RMS )
+{
+    m_registerRMS = RMS;
+}
+
+void arlCore::vnl_rigid_matrix::setStdDev( double stdDev )
+{
+    m_registerStdDev = stdDev;
+}
+
+std::string arlCore::vnl_rigid_matrix::getString( void ) const
+{
+    std::stringstream s;
+    unsigned int i, j;
+    if(getDate()!=0 && getTime()!=0)
+        s<<"Date:"<<getDate()<<" Time:"<<getTime()<<"\n";
+    s<<"RMS:"<<m_registerRMS<<" stddev:"<<m_registerStdDev<<"\n";
+    for( i=0 ; i<4 ; ++i )
+    {
+        for( j=0 ; j<4 ; ++j )
+            s<<get(i,j)<<" ";
+        s<<"\n";
+    }
+    return s.str();
+}
+
+std::string arlCore::vnl_rigid_matrix::getText( void ) const
+{
+    std::stringstream s;
+    unsigned int i, j;
+    s<<"("<<getDate()<<"-"<<getTime()<<")RMS:"<<m_registerRMS<<"-EC:"<<m_registerStdDev<<"\\n";
+    for( i=0 ; i<4 ; ++i )
+    {
+        for( j=0 ; j<4 ; ++j )
+            s<<get(i,j)<<" ";
+        s<<"\\n";
+    }
+    return s.str();
+}
+
+bool arlCore::vnl_rigid_matrix::save( const std::string &fileName, bool overwrite ) const
+{
+    if(!isOK()) return false;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    f.open (fileName.c_str(), std::fstream::out);
+    if(!f.is_open()) return false;
+    f<<"FileType RigidMatrix\n";
+    f<<"Version 1.0\n";
+    bool b=save(f);
+    f.close();
+    f.flush();
+    return b;
+}
+
+bool arlCore::vnl_rigid_matrix::save( std::fstream &f ) const
+{
+    if(!f.is_open()) return false;
+    unsigned int i,j;
+    f<<"Date "<<getDate()<<"\nTime "<<getTime()<<"\nRMS "<<m_registerRMS<<"\nEC "<<m_registerStdDev<<"\n";
+    f<<"Matrix\n";
+    for( i=0 ; i<4 ; ++i )
+    {
+        for( j=0 ; j<4 ; ++j )
+            f<<std::setprecision(10)<<(double)get(i,j)<<"\t";
+        f<<"\n";
+    }
+    f<<"End\n";
+    f.flush();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::load( const std::string &fileName )
+{
+    if(fileName=="") return false;
+    std::fstream f;
+    std::string token, type;
+    unsigned int n=0;
+    double version;
+    f.open (fileName.c_str(), std::fstream::in);
+    bool matrixList = false;
+    if(!f.is_open()) return false;
+    do
+    {   // Reading header
+        f>>token;
+        if(token=="FileType")
+        {
+            f>>type;
+            matrixList = (type=="MatrixList");
+            if(type!="Matrix" && type!="RigidMatrix" && !matrixList) // Matrix deprecated
+            {
+                std::cerr<<type<<" : Filetype not expected (RigidMatrix or MatrixList)\n";
+                f.close();
+                return false;
+            }
+            n=(n|1);
+        }
+        if(token=="Version") {f>>version; n=(n|2);}
+        if(f.eof())
+        {
+            std::cerr<<"Matrix Loading Header error : "<<fileName<<"\n";
+            f.close();
+            return false;
+        }
+    }while(n!=3);
+    bool b = false;
+    if(matrixList)
+    {
+        std::vector<arlCore::vnl_rigid_matrix> listMatrix;
+        while(load(f)) listMatrix.push_back(*this);
+        bool b = mean(listMatrix);
+        setOK(b);
+        return b;
+    }else b=load(f);
+    f.close();
+    return b;
+}
+
+bool arlCore::vnl_rigid_matrix::load( std::fstream &f )
+{
+    unsigned int i,j;
+    double val;
+    bool b=false;
+    std::string token;
+    if(!f.is_open()) return false;
+    do
+    {
+        f>>token;
+        if(token=="Date") f>>m_date;
+        if(token=="Time") f>>m_time;
+        if(token=="RMS") f>>m_registerRMS;
+        if(token=="EC") f>>m_registerStdDev;
+        if(token=="Matrix")
+        {
+            for( i=0 ; i<4 ; ++i )
+                for( j=0 ; j<4 ; ++j )
+                {
+                    f>>val;
+                    put(i,j,val);
+                }
+            b=true;
+        }
+    }while(!f.eof() && token!="End");
+    Object::update();
+    return setOK(b);
+}
+
+std::string arlCore::vnl_rigid_matrix::serialize( void ) const
+{
+    std::stringstream s;
+    s<<Object::serialize();
+    unsigned int i,j;
+    for( i=0 ; i<4 ; ++i )
+        for( j=0 ; j<4 ; ++j )
+            s<<get(i,j)<<" ";
+    s<<m_registerRMS<<" "<<m_registerStdDev<<" ";
+    return s.str();
+}
+
+bool arlCore::vnl_rigid_matrix::unserialize( std::stringstream &s )
+{
+    Object::unserialize(s);
+    unsigned int i,j;
+    double v;
+    for( i=0 ; i<4 ; ++i )
+        for( j=0 ; j<4 ; ++j )
+        {
+            s>>v;
+            put(i,j,v);
+        }
+    s>>m_registerRMS>>m_registerStdDev;
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::copy( const vnl_rigid_matrix& T )
+{
+    unsigned int i, j;
+    for( i=0 ; i<4 ; ++i )
+        for( j=0 ; j<4 ; ++j )
+            put(i,j,T(i,j));
+    m_registerRMS=T.m_registerRMS;
+    m_registerStdDev=T.m_registerStdDev;
+    m_date=T.m_date;
+    m_time=T.m_time;
+    Object::update();
+    //setUpdateIndex(T.getUpdateIndex());
+    return setOK(T.isOK());
+}
+
+bool arlCore::vnl_rigid_matrix::copy( const vnl_rigid_vector& T )
+{
+    setTranslation(T.getTranslation());
+    setRotation(T.getRotation3dVector());
+    set_row(3,0.0);
+    put(3,3,1.0);
+    Object::update();
+    return setOK(true);
+}
+
+bool arlCore::vnl_rigid_matrix::copy( const vnl_matrix_fixed<double,4,4>& T )
+{
+    unsigned int i, j;
+    for( i=0 ; i<4 ; ++i )
+        for( j=0 ; j<4 ; ++j )
+            put(i,j,T(i,j));
+/*  m_registerRMS=0.0;
+    m_registerStdDev=0.0;
+    m_date=0;
+    m_time=0;*/
+    Object::update();
+    return setOK(true);
+}
+
+arlCore::vnl_rigid_matrix& arlCore::vnl_rigid_matrix::operator=( const vnl_rigid_matrix& T )
+{
+    if(this==&T) return *this;
+    arlCore::Object *a=this;
+    const arlCore::Object *b=&T;
+    *a = *b;
+    copy(T);
+    return *this;
+}
+
+arlCore::vnl_rigid_matrix& arlCore::vnl_rigid_matrix::operator=( const vnl_rigid_vector& T )
+{
+    copy(T);
+    return *this;
+}
+
+arlCore::vnl_rigid_matrix& arlCore::vnl_rigid_matrix::operator=( const vnl_matrix_fixed<double,4,4>& T )
+{
+    if(this==&T) return *this;
+    copy(T);
+    return *this;
+}
+
+bool arlCore::vnl_rigid_matrix::mult( const vnl_rigid_matrix& T1, const vnl_rigid_matrix& T2 )
+{
+    //vnl_matrix_fixed<double,4,4> M = T1 * T2;
+    copy(T1 * T2);
+    // timestamp with the older age
+    setMinTime(T1.getDate(), T1.getTime());
+    setMinTime(T2.getDate(), T2.getTime());
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::setIdentity()
+{
+    set_identity();
+    m_registerRMS=0.0;
+    m_registerStdDev=0.0;
+//  m_date=0;
+//  m_time=0;
+    Object::update();
+    return true;
+}
+
+arlCore::vnl_rigid_matrix arlCore::vnl_rigid_matrix::computeInverse( void ) const
+{
+    arlCore::vnl_rigid_matrix T;
+    T.invert(*this);
+    return T;
+}
+
+bool arlCore::vnl_rigid_matrix::invert( const vnl_rigid_matrix& T )
+{   // Transpose(Rotation)*Translation
+    unsigned int i,j;
+    vnl_matrix_fixed<double,3,3> tmp;
+    vnl_matrix_fixed<double,3,1> col, col2;
+    setTime(T.m_date, T.m_time);
+    m_registerRMS=T.m_registerRMS;
+    m_registerStdDev=T.m_registerStdDev;
+    for( i=0 ; i<3 ; ++i )
+        for( j=0 ; j<3 ; ++j )
+            tmp(i,j) = T(i,j);
+    for( i=0 ; i<3 ; ++i )
+        col(i,0) = T(i,3);
+    tmp.inplace_transpose();
+    col2 =  tmp.as_matrix() * col.as_matrix();
+    for( i=0 ; i<3 ; ++i )
+        for( j=0 ; j<3 ; ++j )
+            put(i,j,tmp(i,j));
+    for(i=0;i<3;i++)
+    {
+        put(i,3,-1* col2(i,0));
+        put(3,i,0.0);
+    }
+    put(3,3,1.0);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::invert( void )
+{   // Transpose(Rotation)*Translation
+    unsigned int i, j;
+    vnl_matrix_fixed<double,3,3> tmp;
+    vnl_matrix_fixed<double,3,1> col, col2;
+    for( i=0 ; i<3 ; i++ )
+        for( j=0 ; j<3 ; j++ )
+            tmp(i,j) = (*this)(i,j);
+    for( i=0 ; i<3 ; i++ )
+        col(i,0) = (*this)(i,3);
+    tmp.inplace_transpose();
+    col2 =  tmp.as_matrix() * col.as_matrix();
+    for( i=0 ; i<3 ; i++ )
+        for( j=0 ; j<3 ; j++ )
+            put(i,j,tmp(i,j));
+    for( i=0 ; i<3 ; i++ )
+    {
+        put(i,3,-1* col2(i,0));
+        put(3,i,0.0);
+    }
+    put(3,3,1.0);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::mean( const std::vector<arlCore::vnl_rigid_matrix> &list )
+{
+    unsigned int i, n;
+    std::vector<const arlCore::vnl_rigid_matrix*> listp;
+    for( i=0 ; i<list.size() ; ++i )
+        listp.push_back(&list[i]);
+    n = filter( listp , ARLCORE_TRF_FILTER_CONSTANT, *this );
+    return n>0;
+/*
+    * @brief The current matrix becomes the mean of listMatrix 1/N sum mat
+    * since the resulting 3x3 rotation part is no more a rotation, we apply the
+    * closest_rotation function to the rotation part to ensure it is a rotation
+    * TODO average with rotation vector
+    * TODO average with the function in averageRotation class in Optimisation.cpp
+
+    if(list.size()==0) return false;
+    fill(0.0);
+    unsigned int i, j, k;
+    double a;
+    for( i=0 ; i<list.size() ; ++i )
+    {
+        a=0;
+        for( j=0 ; j<4 ; ++j )
+            for( k=0 ; k<4 ; ++k )
+                put( j, k, get(j,k)+list[i].get(j,k) );
+    }
+    for( j=0 ; j<4 ; ++j )
+        for( k=0 ; k<4 ; ++k )
+            put( j, k, get(j,k)/i );
+
+    vnl_rotation3d_matrix rot = this->getRotation();
+    rot.closest_rotation();
+    this->setRotation(rot);
+    return true;*/
+}
+
+double arlCore::vnl_rigid_matrix::getAngleOXY( void )
+{
+    const vgl_point_3d<double> o( 0.0, 0.0, 0.0 );
+    const vgl_point_3d<double> u( 1.0, 0.0, 0.0 );
+    const vgl_point_3d<double> v( 0.0, 1.0, 0.0 );
+    const vgl_plane_3d<double> Plane1( o, u, v );
+    arlCore::Point::sptr o1 = arlCore::Point::New( 0.0, 0.0, 0.0 );
+    arlCore::Point::sptr u1 = arlCore::Point::New( 1.0, 0.0, 0.0 );
+    arlCore::Point::sptr v1 = arlCore::Point::New( 0.0, 1.0, 0.0 );
+    trf(o1);trf(u1);trf(v1);
+    const vgl_point_3d<double> o2(  o1->x(), o1->y(), o1->z() );
+    const vgl_point_3d<double> u2(  u1->x(), u1->y(), u1->z() );
+    const vgl_point_3d<double> v2(  v1->x(), v1->y(), v1->z() );
+    const vgl_plane_3d<double> Plane2( o2, u2, v2 );
+    const double Angle = fmod(vgl_homg_operators_3d<double>::plane_plane_angle(Plane1, Plane2), vnl_math::pi/2.0)*arlCore::RadToDeg;
+    return Angle;
+}
+
+double arlCore::vnl_rigid_matrix::getAngleOXZ( void )
+{
+    const vgl_point_3d<double> o( 0.0, 0.0, 0.0 );
+    const vgl_point_3d<double> u( 1.0, 0.0, 0.0 );
+    const vgl_point_3d<double> w( 0.0, 0.0, 1.0 );
+    const vgl_plane_3d<double> Plane1( o, u, w );
+    arlCore::Point::sptr o1 = arlCore::Point::New( 0.0, 0.0, 0.0 );
+    arlCore::Point::sptr u1 = arlCore::Point::New( 1.0, 0.0, 0.0 );
+    arlCore::Point::sptr w1 = arlCore::Point::New( 0.0, 0.0, 1.0 );
+    trf(o1);trf(u1);trf(w1);
+    const vgl_point_3d<double> o2(  o1->x(), o1->y(), o1->z() );
+    const vgl_point_3d<double> u2(  u1->x(), u1->y(), u1->z() );
+    const vgl_point_3d<double> w2(  w1->x(), w1->y(), w1->z() );
+    const vgl_plane_3d<double> Plane2( o2, u2, w2 );
+    const double Angle = fmod(vgl_homg_operators_3d<double>::plane_plane_angle(Plane1, Plane2), vnl_math::pi/2.0)*arlCore::RadToDeg;
+    return Angle;
+}
+
+double arlCore::vnl_rigid_matrix::getAngleOYZ( void )
+{
+    const vgl_point_3d<double> o( 0.0, 0.0, 0.0 );
+    const vgl_point_3d<double> v( 0.0, 1.0, 0.0 );
+    const vgl_point_3d<double> w( 0.0, 0.0, 1.0 );
+    const vgl_plane_3d<double> Plane1( o, v, w );
+    arlCore::Point::sptr o1 = arlCore::Point::New( 0.0, 0.0, 0.0 );
+    arlCore::Point::sptr v1 = arlCore::Point::New( 0.0, 1.0, 0.0 );
+    arlCore::Point::sptr w1 = arlCore::Point::New( 0.0, 0.0, 1.0 );
+    trf(o1);trf(v1);trf(w1);
+    const vgl_point_3d<double> o2(  o1->x(), o1->y(), o1->z() );
+    const vgl_point_3d<double> v2(  v1->x(), v1->y(), v1->z() );
+    const vgl_point_3d<double> w2(  w1->x(), w1->y(), w1->z() );
+    const vgl_plane_3d<double> Plane2( o2, v2, w2 );
+    const double Angle = fmod(vgl_homg_operators_3d<double>::plane_plane_angle(Plane1, Plane2), vnl_math::pi/2.0)*arlCore::RadToDeg;
+    return Angle;
+}
+
+bool arlCore::vnl_rigid_matrix::chgPlaneOXZ(  arlCore::Point::csptr O,  arlCore::Point::csptr X,  arlCore::Point::csptr Z )
+{
+    const arlCore::Point::csptr Oo = arlCore::Point::New(0.0, 0.0, 0.0);
+    const arlCore::Point::csptr Xo = arlCore::Point::New(1.0, 0.0, 0.0);
+    const arlCore::Point::csptr Zo = arlCore::Point::New(0.0, 0.0, 1.0);
+    PointList::sptr A = PointList::New();
+    PointList::sptr B = PointList::New();
+    A->push_back(Oo);
+    A->push_back(Xo);
+    A->push_back(Zo);
+    B->push_back(O);
+    B->push_back(X);
+    B->push_back(Z);
+    return register3D3D( A, B, false);
+}
+
+bool arlCore::vnl_rigid_matrix::trf( Point::csptr pt1, Point::sptr pt2 ) const
+{
+    assert(pt1->size()==3 && pt2->size()==3);
+    vnl_vector_fixed<double,4> p1,p2;
+    unsigned int i,j;
+    for( i=0 ; i<3 ; ++i )
+        p1.put(i,(*pt1)[i]);
+    p1.put(3,1.0);
+    p2=(*this)*p1;
+    for( i=0 ; i<3 ; ++i )
+        pt2->set(i,p2.get(i));
+    //compute uncertainty of pt2 wrt to pt1 uncertainty and this
+    vnl_matrix_fixed<double,3,3> C = this->getRotation() *  pt1->getCovMatrix() * vnl_transpose( this->getRotation() );
+    arlCore::vnl_covariance_matrix &cov_mat = pt2->getCovMatrix();
+    for( i=0 ; i<3 ; ++i )
+        for( j=0 ; j<3 ; ++j )
+            cov_mat.put(i,j,C[i][j]);
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::trf( Point::sptr pt ) const
+{
+    assert(pt->size()==3);
+    vnl_vector_fixed<double,4> p1,p2;
+    unsigned int i,j;
+    for( i=0 ; i<3 ; ++i )
+        p1.put(i,(*pt)[i]);
+    p1.put(3,1.0);
+    p2=(*this)*p1;
+    for( i=0 ; i<3 ; ++i )
+        pt->set(i,p2.get(i));
+
+    //compute uncertainty of pt2 wrt to pt1 uncertainty and this
+    vnl_matrix_fixed<double,3,3> res;
+    res = this->getRotation() *  pt->getCovMatrix() * vnl_transpose( this->getRotation() );
+
+    arlCore::vnl_covariance_matrix &cov_mat = pt->getCovMatrix();
+    for(i=0;i<3;++i)
+        for(j=0;j<3;++j)
+            cov_mat.put(i,j,res[i][j]);
+
+    return true;
+}
+
+unsigned int arlCore::vnl_rigid_matrix::trf(PointList::csptr l1, PointList::sptr l2 ) const
+{
+    l2->clear();
+    l2->setDimension(l2->getDimension());
+
+    unsigned int i;
+    for( i=0 ; i<l1->size() ; ++i )
+    {
+        Point::sptr P = Point::New(l1->getDimension());
+        if(trf( (*l1)[i] ,P))
+        {
+            l2->push_back(P);
+        }
+    }
+    return l2->size();
+}
+
+unsigned int arlCore::vnl_rigid_matrix::trf( PointList::sptr l1 ) const
+{
+    unsigned int i;
+    for( i=0 ; i<l1->size() ; ++i )
+        if( (*l1)[i] ) trf( (*l1)[i] );
+    return l1->size();
+}
+
+unsigned int arlCore::vnl_rigid_matrix::trf( const std::vector< Point::csptr > &l1, std::vector< Point::csptr > &l2 ) const
+{
+    unsigned int i;
+    for( i=0 ; i<l1.size() ; ++i )
+    {
+        Point::sptr p= Point::New();
+        if(trf( l1[i] ,p))
+            l2.push_back( Point::constCast(p) );
+    }
+    return (unsigned int)l2.size();
+}
+
+bool arlCore::vnl_rigid_matrix::trf( const vgl_line_3d_2_points<double> &line1, vgl_line_3d_2_points<double> &line2 ) const
+{
+    const vgl_point_3d<double> P1Line = line1.point1();
+    const vgl_point_3d<double> P2Line = line1.point2();
+    Point::sptr p1 = Point::New(3);
+    Point::sptr p2 = Point::New(3);
+    if(!trf(Point::New(P1Line.x(), P1Line.y(), P1Line.z()), p1)) return false;
+    if(!trf(Point::New(P2Line.x(), P2Line.y(), P2Line.z()), p2)) return false;
+    line2.set(vgl_point_3d<double>(p1->x(), p1->y(), p1->z()), vgl_point_3d<double>(p2->x(), p2->y(), p2->z()));
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::trf( vgl_line_3d_2_points<double> &line ) const
+{
+    const vgl_point_3d<double> P1Line = line.point1();
+    const vgl_point_3d<double> P2Line = line.point2();
+    Point::sptr p1 = Point::New(3);
+    Point::sptr p2 = Point::New(3);
+    if(!trf(Point::New(P1Line.x(), P1Line.y(), P1Line.z()), p1)) return false;
+    if(!trf(Point::New(P2Line.x(), P2Line.y(), P2Line.z()), p2)) return false;
+    line.set(vgl_point_3d<double>(p1->x(), p1->y(), p1->z()), vgl_point_3d<double>(p2->x(), p2->y(), p2->z()));
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::trf( const vgl_line_segment_3d<double> &line1, vgl_line_segment_3d<double> &line2 ) const
+{
+    const vgl_point_3d<double> P1Line = line1.point1();
+    const vgl_point_3d<double> P2Line = line1.point2();
+    Point::sptr p1 = Point::New(3);
+    Point::sptr p2 = Point::New(3);
+    if(!trf(Point::New(P1Line.x(), P1Line.y(), P1Line.z()), p1)) return false;
+    if(!trf(Point::New(P2Line.x(), P2Line.y(), P2Line.z()), p2)) return false;
+    line2.set(vgl_point_3d<double>(p1->x(), p1->y(), p1->z()), vgl_point_3d<double>(p2->x(), p2->y(), p2->z()));
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::trf( vgl_line_segment_3d<double> &line ) const
+{
+    const vgl_point_3d<double> P1Line = line.point1();
+    const vgl_point_3d<double> P2Line = line.point2();
+    Point::sptr p1 = Point::New(3);
+    Point::sptr p2 = Point::New(3);
+    if(!trf(Point::New(P1Line.x(), P1Line.y(), P1Line.z()), p1)) return false;
+    if(!trf(Point::New(P2Line.x(), P2Line.y(), P2Line.z()), p2)) return false;
+    line.set(vgl_point_3d<double>(p1->x(), p1->y(), p1->z()), vgl_point_3d<double>(p2->x(), p2->y(), p2->z()));
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::registerICP(PointList::csptr pointsListA,PointList::csptr pointsListB, double &firstRMS, double &lastRMS, unsigned int &iterations, bool justVisible, double RMSMax, unsigned int iterationsMax )
+{   //Model (scanner) = pointsListA ; Points cloud (Acquisition) = pointsListB
+    const bool Verbose = false;
+    firstRMS = -1.0;
+    lastRMS = -1.0;
+    m_registerRMS = -1.0;
+    m_registerStdDev = 0.0;
+    iterations = 0;
+#ifdef ANN
+//  http://csdl2.computer.org/persagen/DLAbsToc.jsp?resourcePath=/dl/trans/tp/&toc=comp/trans/tp/1992/02/i2toc.xml&DOI=10.1109/34.121791
+//  http://ieeexplore.ieee.org/iel1/34/3469/00121791.pdf?tp=&arnumber=121791&isnumber=3469
+    //  To be continued : Automatic initialization or using the current matrix for initialization
+    const unsigned int Dimension = pointsListA->getDimension();
+    assert(Dimension==pointsListB->getDimension());
+    const int    bs = 1; // Bucket size
+    const double tau = 10e-8;
+    ANNpointArray modelPoints, dataPoints;
+    ANNpointArray Pk,Yk,Pi;
+    ANNidxArray     nn_idx; // near neighbor indices
+    ANNdistArray    squaredDists; // near neighbor distances
+    double eps = 0.0;// Error bound
+    unsigned int i,j,k,n;
+    unsigned int modelSize;
+    if(justVisible) modelSize = pointsListA->visibleSize();
+    else modelSize = pointsListA->size();
+    if(modelSize<1) return false;
+    modelPoints = annAllocPts( modelSize, Dimension );
+    for( i=0, n=0 ; i<modelSize ; ++i )
+    {
+        if(!justVisible || (justVisible && (*pointsListA)[i]->isVisible()))
+        {
+            for( j=0 ; j<Dimension ; ++j )
+                modelPoints[n][j]=(*pointsListA)[i]->get(j);
+            ++n;
+        }
+    }
+    unsigned int acquisitionSize;
+    if(justVisible) acquisitionSize = pointsListB->visibleSize();
+    else acquisitionSize = pointsListB->size();
+    if(acquisitionSize<1)
+    {
+        annDeallocPts( modelPoints );
+        return false;
+    }
+    dataPoints = annAllocPts( acquisitionSize, Dimension );
+    for( i=0, n=0 ; i<acquisitionSize ; ++i )
+    {
+        if(!justVisible || (justVisible && (*pointsListB)[i]->isVisible()))
+        {
+            for( j=0 ; j<Dimension ; ++j )
+                dataPoints[n][j]=(*pointsListB)[i]->get(j);
+            ++n;
+        }
+    }
+    const int NbNN = 1;          // number of nearest neighbors
+    nn_idx = new ANNidx[NbNN];   // allocate near neigh indices
+    squaredDists = new ANNdist[NbNN];    // allocate near neighbor squaredDists
+   // ************* build the kdtree ************************
+   ANNkd_tree *the_tree = new ANNkd_tree( modelPoints,// data points
+                                          modelSize,// number of points
+                                          Dimension, // points dimension
+                                          bs, // Bucket size
+                                          ANN_KD_SL_MIDPT );
+    // ************* vectors allocation ************************
+    Pk = annAllocPts( acquisitionSize, Dimension );
+    Pi = annAllocPts( acquisitionSize, Dimension );
+    Yk = annAllocPts( acquisitionSize, Dimension );
+    // **************************************************************
+    // first transformation =>P0, icp release the matching between
+    // P0 and model point
+    // **************************************************************
+    vnl_vector<double> gravityP(Dimension,0.0);
+    vnl_matrix<double> Rot(3,3);
+    vnl_vector<double> Tra(3,0.0), TraTemp(3);
+    // Initialization
+    invert();
+    Tra = getTranslation();
+    Rot = getRotation();
+    vnl_quaternion<double> qr(0,0,0,1);
+    //Rot = vnl_transpose(qr.rotation_matrix_transpose()).asMatrix();
+    for( i=0 ; i<acquisitionSize ; ++i )
+        for( j=0 ; j<3; ++j )
+        {
+            Pi[i][j] = Pk[i][j] = Rot[j][0]*dataPoints[i][0]+Rot[j][1]*dataPoints[i][1]+Rot[j][2]*dataPoints[i][2]+Tra[j];
+            gravityP[j]+= Pi[i][j];
+        }
+    gravityP/= (double)acquisitionSize;
+    // ********************** ICP Initialisation ************************
+    // ** P={pi} points de données (Np) et X={xi} points de modèle (Nx) *
+    vnl_vector<double> gravityY(Dimension);
+    double oldRMS = FLT_MAX;
+    firstRMS = -1;
+    vnl_matrix<double> Id3(3,3);    Id3.set_identity();
+    vnl_matrix<double> Rend(3,3);   Rend.set_identity();
+    vnl_matrix<double> Spy(3,3);
+    vnl_vector<double> Delta (3);
+    vnl_matrix<double> QSpy(4,4);
+    vnl_matrix<double> Ricp (3,3);
+    vnl_symmetric_eigensystem<double> eigQSpy(QSpy);
+    lastRMS = FLT_MAX/2; // /2;
+    // ****************************** ICP algorithm ***************************
+    while( fabs(lastRMS-oldRMS)>tau && iterations<iterationsMax ) //&& RMS>RMSMax )
+    //while( iterations<iterationsMax ) //&& RMS>RMSMax )
+    {
+        ++iterations;
+        oldRMS = lastRMS;
+        lastRMS = 0.0;
+        Spy.set_identity();
+        gravityY.fill(0);
+        // step 1 :
+        // search the matching point for every data shape point
+        for( i=0 ; i<acquisitionSize ; ++i )
+          {
+            // ****************************************************
+            // step 1 :
+            // search the matching point for every data shape point
+            // ****************************************************
+             the_tree->annkSearch( Pk[i],  // query point
+                                   NbNN,      // number of near neighbors
+                                   nn_idx, // nearest neighbors (returned)
+                                   squaredDists,  // distance (returned)
+                                   eps );  // error bound
+            // ***************************************************
+            // calculate the center of mass for Y and query_point
+            // ***************************************************
+            for( j = 0; j < 3; j++ )
+              gravityY[j]+= Yk[i][j] = modelPoints[nn_idx[0]][j];
+            // Update the value of error
+            lastRMS += squaredDists[0];
+          } //end search matching for
+        // Calculate the new mean square point matching error
+        // LG lastRMS/=(double)AcquisitionSize;
+        lastRMS = sqrt(lastRMS/(double)acquisitionSize);
+        if(firstRMS<0) firstRMS = lastRMS;
+        // calculate the center of mass for Y and query_point
+        // by divise the sum by the number of point
+        gravityY/= (double)acquisitionSize;
+        // step 2
+        // Calculate the cross-variance matrix between Pk and Yo
+        // Cov( P0, Yk ) = 1/n*somme(P0*Yk') - ComP0*ComYk'
+        for( i=0 ; i<acquisitionSize ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            for( k=0 ; k<3 ; ++k )
+            Spy[j][k]+= Pi[i][j]*Yk[i][k];
+        for( i=0 ; i<3 ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            Spy[i][j] = Spy[i][j]/(double)acquisitionSize - gravityP[i]*gravityY[j];
+        // Delta = [A23 A31 A12] with Amn = Spy[m][n]-Spy[n][m]
+        Delta[0] = Spy[1][2]-Spy[2][1];
+        Delta[1] = Spy[2][0]-Spy[0][2];
+        Delta[2] = Spy[0][1]-Spy[1][0];
+        // calculate the symmetric 4x4 matrix needed to determine
+        // the max eigenvalue
+        QSpy[0][0] = vnl_trace( Spy ); // calculate the matrix trace
+        for( i=1 ; i<4 ; ++i )
+        {
+            QSpy[i][0] = Delta[i-1];
+            for( j = 1; j < 4; ++j )
+            {
+                QSpy[0][j] = Delta[j-1];
+                QSpy[i][j] = Spy[i-1][j-1]+Spy[j-1][i-1] - QSpy[0][0]*Id3[i-1][j-1];
+            }
+        }
+        // calculate the eigen value of QSpy
+        eigQSpy = vnl_symmetric_eigensystem<double>( QSpy );
+        // optimal Rotation matrix calculate from the quaternion
+        // vector qr=[q0 q1 q2 q3] obtained by obtained the max eigen value
+        // http://paine.wiau.man.ac.uk/pub/doc_vxl/core/vnl/html/vnl__symmetric__eigensystem_8h.html
+        qr.update(eigQSpy.get_eigenvector(3));
+        qr = vnl_quaternion<double>(qr[1], qr[2], qr[3], qr[0]);
+        Ricp = vnl_transpose(qr.rotation_matrix_transpose()).asMatrix();
+        // optimal translation vector Ticp T = ComY - Ricp.ComP
+        TraTemp = gravityY - Ricp*gravityP;
+        // step 3 : Application of the transformation
+        for( i=0 ; i<acquisitionSize ; ++i )
+          for( j=0 ; j<3 ; ++j )
+            Pk[i][j] = Ricp[j][0]*Pi[i][0] + Ricp[j][1]*Pi[i][1] + Ricp[j][2]*Pi[i][2] + TraTemp[j];
+    }// while
+    m_registerRMS = lastRMS;
+    // give the transformation from model data ==> acquisition data
+    // first we add the first transformation to Rend
+    // ******************************************************
+    // ***************** Changement *************************
+    // ******************************************************
+    Rend = Ricp.transpose();
+    vnl_vector<double> Tend(3);
+    for( i=0 ; i<3 ; ++i )
+        Tend[i] = gravityP[i]-(Rend[i][0]*gravityY[0]+Rend[i][1]*gravityY[1]+Rend[i][2]*gravityY[2]);
+    // matrice initiale [Rot Tra;0 0 0 1]
+    // matrice trouvee [Rend Tend;0 0 0 1]
+
+    /*this->vnl_matrix_fixed<double,4,4>::update(Rend*Rot);
+    this->set_column(3,Rend*Tra + Tend); //,0);
+    (*this)[3][3] = 1.0;*/
+    this->vnl_matrix_fixed<double,4,4>::update(vnl_inverse(Rot)*Rend);
+    this->set_column(3,vnl_inverse(Rot)*(Tend-Tra));
+    (*this)[3][3] = 1.0;
+    // ******************* free memory ******************
+    delete[] nn_idx;
+    delete[] squaredDists;
+    delete the_tree;
+    annDeallocPts( modelPoints );
+    annDeallocPts( dataPoints );
+    annDeallocPts( Pk );
+    annDeallocPts( Yk );
+    annDeallocPts( Pi );
+    annClose();
+    if(Verbose)
+    {
+        std::cout<<"ICP registration\n";
+        std::cout<<"firstRMS="<<firstRMS<<" lastRMS="<<lastRMS<<" Iterations="<<iterations<<" PtsModel="<<modelSize<<" PtsAcquisition="<<acquisitionSize<<"\n";
+        std::cout<<"Matrix ="<<*this<<"\n";
+    }
+    Object::update();
+    std::cout<<"Tau="<<fabs(lastRMS-oldRMS)*1e8<<"\n";
+    return true;
+#else // ANN
+    return false;
+#endif // ANN
+}
+
+/****************************************************************
+*
+*  Routine Name: rotate_dim4
+*  Purpose: Fonction utilisée uniquement par ma fonction spec
+
+*  Remarque : IL FAUT SUPPRIMER CETTE FONCTION ET LA REMPLACER PAR UNE FONCTION
+*  DE LA LIBRAIRIE VNL
+*****************************************************************/
+void rotate_dim4( double a[][4] , double tau , double s , int i , int j ,int k , int l )
+{
+   double g = a[i][j];
+   double h = a[k][l];
+   a[i][j] = g-s*(h+g*tau);
+   a[k][l] = h + s*(g-h*tau);
+   return;
+}
+
+/************************************************************************************
+*
+*  Routine Name: spec
+*  Purpose: This function returns the vectors and eigenvalues of a matrix
+*  Input: m            - matrix (double)
+*  Output: d,v         - eigenvalues and vector
+*
+*  Remarque : IL FAUT SUPPRIMER CETTE FONCTION ET LA REMPLACER PAR UNE FONCTION
+*  DE LA LIBRAIRIE VNL
+**************************************************************************************/
+void spec( const double m[4][4], double *d, double (*v)[4] )
+{
+    const unsigned int IT_MAX = 50;
+    register int i , j , ip , iq ;
+    double tresh,theta,tau,t,sm,s,h,g,c;
+    double a[4][4], b[4], z[4];
+    int p = 4;
+    for(i=0;i<4; i++)
+        for(j=0;j<4; j++)
+            if(i==j) v[i][j]=1.0; else v[i][j]=0.0;
+   for( ip=0 ; ip<p ; ip++ )
+      for( iq = 0 ; iq < p ; iq++ )
+         a[ip][iq] = m[ip][iq];
+   for( ip = 0 ; ip < p ; ip++ )
+   {
+      b[ip] = a[ip][ip];
+      d[ip] = a[ip][ip];
+      z[ip] = 0.0;
+   }
+   for( i = 0 ; i < IT_MAX/2 ; i++ )
+   {
+      sm = 0.0;
+      for( ip = 0 ; ip < p-1 ; ip++ )
+         for( iq = ip+1 ; iq < p ; iq++ )
+            sm += fabs(a[ip][iq]);
+      if( sm == 0.0 ) return;
+      if( i < 3 )  tresh = 0.2 * sm / (p*p);
+      else  tresh = 0.0;
+      for( ip = 0 ; ip < p-1 ; ip++ )
+      {
+         for( iq = ip+1 ; iq < p ; iq++ )
+         {
+            g = 100.0 * fabs(a[ip][iq]);
+            if(( i > 4 ) && ( fabs(d[ip]) + g == fabs(d[ip]) )
+                && ( fabs(d[iq]) + g == fabs(d[iq]) ))
+               a[ip][iq] = 0.0;
+            else if( fabs(a[ip][iq]) > tresh )
+            {
+               h = d[iq] - d[ip];
+               if( fabs(h) + g == fabs(h) )  t = a[ip][iq]/h;
+               else
+               {
+                  theta = 0.5 * h / a[ip][iq];
+                  t     = 1.0 / ( fabs(theta) + sqrt(1.0+theta*theta) );
+                  if( theta < 0 )
+                     t = -t;
+               }
+               c      = 1.0 / sqrt(1.0+t*t);
+               s      = t * c;
+               tau    = s / (1.0+c);
+               h      = t * a[ip][iq];
+               z[ip] += - h;
+               z[iq] +=   h;
+               d[ip] += - h;
+               d[iq] +=   h;
+               a[ip][iq] = 0.0;
+               for( j = 0 ; j <= ip-1 ; j++ )
+                  rotate_dim4( a , tau , s , j , ip , j , iq );
+               for( j = ip+1 ; j <= iq-1 ; j++ )
+                  rotate_dim4( a , tau , s , ip , j , j , iq );
+               for( j = iq+1; j < p ; j++ )
+                  rotate_dim4( a , tau , s , ip , j , iq , j );
+               for( j = 0 ; j < p ; j++ )
+                  rotate_dim4( v , tau , s , j , ip , j , iq );
+            }
+         }
+      }
+      for( ip = 0 ; ip < p ; ip++ )
+      {
+         b[ip] += z[ip];
+         d[ip]  = b[ip];
+         z[ip]  = 0.0;
+      }
+   }
+   return;
+}
+
+bool arlCore::vnl_rigid_matrix::oldRegisterICP(PointList::csptr pointsListA,PointList::csptr pointsListB, double &RMS, unsigned int &iterations, double RMSMax, unsigned int iterationsMax )
+{
+    return false;
+#ifdef ANN
+//  To be continued : Automatic initialization or using the current matrix for initialization
+    vgl_plane_3d< double >planeA, planeB;
+    double rms, min, max;
+    pointsListA->plane(planeA, rms, min, max);
+    pointsListB->plane(planeB, rms, min, max);
+    // Recaler planeA vers planeB et s'en servir comme initialisation
+/*  unsigned int ii;
+    vgl_point_3d< double > (*pt)[3];
+    OptimisePlane SLCalibration;
+    for( ii=0 ; ii<pointsListB.size() ; ++ii )
+    {
+        vgl_point_3d< double > vglPt((*pointsListA)[ii]->x(),(*pointsListA)[ii]->y(),(*pointsListA)[ii]->z());
+        SLCalibration.addData( vglPt);
+    }
+    if(SLCalibration.size()<3) return false;
+    SLCalibration.getPoint(0,pt[0]);
+    SLCalibration.getPoint(unsigned int(SLCalibration.size()/2),pt[1]);
+    SLCalibration.getPoint(SLCalibration.size()-1,pt[2]);
+    vnl_vector<double> planSolution(3);
+    vgl_plane_3d< double >plane(pt[0],pt[1],pt[2]);
+    if(plane.d()==0) // Problem, could we use the four parameters ?
+        return false;
+    planSolution(0)=plane.a()/plane.d();
+    planSolution(1)=plane.b()/plane.d();
+    planSolution(2)=plane.c()/plane.d();
+    if(SLCalibration.size()>3)
+    {
+        vnl_powell computeSLCalibration(&SLCalibration);
+        computeSLCalibration.minimize(planSolution);
+    }
+    double a=planSolution(0);
+    double b=planSolution(1);
+    double c=planSolution(2);
+    double d=1.0;//planSolution(3);
+
+    return false;*/
+#define  SQR( x ) ((x)*(x))
+    const unsigned int dim = 3;
+    //Model (scanner) = pointsListA ; Points cloud (Acquisition) = pointsListB
+    PointList::csptr plA = pointsListA;
+    PointList::csptr plB = pointsListB;
+/*  // Test with a simple translation
+    std::vector< Point::csptr > plB;
+    setIdentity();
+    (*this)[0][3]=0.5;
+    trf(plA,plB);
+*/
+    ANNpointArray modelPoints, dataPoints;
+    ANNpointArray Pk,Yk,Pi;
+    unsigned int i,j,k;
+    unsigned int modelSize, acquisitionSize;
+    ANNpoint gravityA = annAllocPt( dim, 0.0 );
+    modelSize=plA->size();
+    modelPoints = annAllocPts( modelSize, dim );
+    for( i=0 ; i<modelSize ; ++i )
+        //if((*plA)[i]->size()==dim)
+            for( j=0 ; j<dim ; ++j )
+                modelPoints[i][j]=(*plA)[i]->get(j);
+    acquisitionSize=plB->size();
+    dataPoints = annAllocPts( acquisitionSize, dim );
+    for( i=0 ; i<acquisitionSize ; ++i )
+    {
+        if((*plB)[i]->size()==dim)
+            for( j=0 ; j<dim ; ++j )
+            {
+                dataPoints[i][j]=(*plB)[i]->get(j);
+                gravityA[j]+= dataPoints[i][j];
+            }
+    }
+    for( i=0 ; i<dim ; ++i )
+        gravityA[i] /= (double)acquisitionSize;
+//  // ******************* Time chrono ******************
+//  // Calcul du temps d'éxécution du recalage en millisecondes
+//  DWORD dwStart = GetTickCount();
+    // ************* vectors allocation ************************
+    Pk = annAllocPts( acquisitionSize, dim );
+    Pi = annAllocPts( acquisitionSize, dim );
+    Yk = annAllocPts( acquisitionSize, dim );
+    // **************************************************************
+    // first transformation =>P0, icp release the matching between
+    // P0 and model point
+    // **************************************************************
+    ANNpoint gravityP = annAllocPt(dim, 0.0);
+    // FIXME : Voir probl�me d'initialisation !!!
+    vnl_matrix<double> Rot(3,3);
+    vnl_vector<double> Tra(3);
+    Tra.fill (0.0);
+    vnl_vector<double> qr(7);
+    qr[0] = 1.0;
+    for( i=1 ; i<4 ; ++i )
+        qr[i] = 0.0;
+    Rot[0][0] = pow(qr[0],2)+pow(qr[1],2)-pow(qr[2],2)-pow(qr[3],2);
+    Rot[0][1] = 2*(qr[1]*qr[2]-qr[0]*qr[3]);
+    Rot[0][2] = 2*(qr[1]*qr[3]+qr[0]*qr[2]);
+    Rot[1][0] = 2*(qr[1]*qr[2]+qr[0]*qr[3]);
+    Rot[1][1] = pow(qr[0],2)+pow(qr[2],2)-pow(qr[1],2)-pow(qr[3],2);
+    Rot[1][2] = 2*(qr[2]*qr[3]-qr[0]*qr[1]);
+    Rot[2][0] = 2*(qr[1]*qr[3]-qr[0]*qr[2]);
+    Rot[2][1] = 2*(qr[2]*qr[3]+qr[0]*qr[1]);
+    Rot[2][2] = pow(qr[0],2)+pow(qr[3],2)-pow(qr[1],2)-pow(qr[2],2);
+    for( i=0 ; i<acquisitionSize ; ++i )
+    {  //julie : on applique l'identit� � l'ensemble des points de l'acquisition
+        for( j=0 ; j<3; ++j )
+        {
+            Pi[i][j] = Pk[i][j] = Rot[j][0]*dataPoints[i][0]+Rot[j][1]*dataPoints[i][1]+Rot[j][2]*dataPoints[i][2]+Tra[j];
+            gravityP[j]+= Pi[i][j];
+        }
+    }
+    for( i=0 ; i<3; ++i )
+        gravityP[i]/= (double)acquisitionSize;
+    // ********************** ICP Initialisation ************************
+    // ** P={pi} points de donnees (Np) et X={xi} points de modele (Nx) *
+    ANNpoint gravityY = annAllocPt(dim, .0);
+    int index = 0;
+    RMS = FLT_MAX/2; //FLT_MAX defini dans Visual
+    double oldRMS = FLT_MAX, traSpy;
+    vnl_matrix<double> Id3(3,3);
+    Id3.set_identity();
+    vnl_matrix<double> Rend(3,3);
+    Rend.set_identity();
+    vnl_matrix<double> Spy(3,3);
+    vnl_vector<double> Delta (3);
+    double QSpy[4][4];
+    vnl_matrix<double> Ricp (3,3);
+    vnl_matrix<double> buffer_mul (3,3);
+    iterations = 0;
+    // ****************************** ICP algorithm ***************************
+    //while( fabs(RMS-oldRMS)>tau && iterations<iterationsMax && RMS>RMSMax )
+    while( iterations<iterationsMax && RMS>RMSMax )
+    {
+        ++iterations;
+        double testnorm2, norm2;
+        testnorm2 = FLT_MAX;
+        oldRMS = RMS;
+        RMS = 0.0;
+        max = -FLT_MAX;
+        Spy.set_identity();
+        for( i=0 ; i<3 ; ++i )
+            gravityY[i] = 0.0;
+        // step 1 :
+        // search the matching point for every data shape point
+        for( i=0; i<acquisitionSize; ++i )
+        {
+            for( j=0 ; j<modelSize ; ++j )
+            {
+                norm2=SQR(Pk[i][0]-modelPoints[j][0])+SQR(Pk[i][1]-modelPoints[j][1])+SQR(Pk[i][2]-modelPoints[j][2]);
+                if( norm2 < testnorm2 )
+                {
+                    testnorm2=norm2;
+                    for( k=0 ; k<3 ; ++k )
+                        Yk[i][k] = modelPoints[j][k];
+/*                  Yk[i][0] = modelPoints[j][0];
+                    Yk[i][1] = modelPoints[j][1];
+                    Yk[i][2] = modelPoints[j][2];*/
+                }
+            }
+            testnorm2=FLT_MAX;
+            for( j=0 ; j<3 ; ++j )
+                gravityY[j]+= Yk[i][j];
+            RMS+=sqrt(SQR(Pk[i][0]-Yk[i][0])+SQR(Pk[i][1]-Yk[i][1])+SQR(Pk[i][2]-Yk[i][2]));
+        } //end search matching for
+        // calculate the new mean square point matching error
+        RMS/=(double)acquisitionSize;
+        // calculate the center of mass for Y and query_point
+        // by divise the sum by the number of point
+        for( i=0 ; i<3 ; ++i )
+            gravityY[i] /= (double)acquisitionSize;
+        // step 2
+        // Calculate the cross-variance matrix between Pk and Yo
+        // Cov( P0, Yk ) = 1/n*somme(P0*Yk') - ComP0*ComYk'
+        for( i=0 ; i<acquisitionSize ; ++i )
+            for( j=0 ; j<3 ; ++j )
+                for( k=0 ; k<3 ; ++k )
+                    Spy[j][k]+= Pi[i][j]*Yk[i][k];
+/*          Spy[0][0]+= Pi[i][0]*Yk[i][0];
+            Spy[0][1]+= Pi[i][0]*Yk[i][1];
+            Spy[0][2]+= Pi[i][0]*Yk[i][2];
+            Spy[1][0]+= Pi[i][1]*Yk[i][0];
+            Spy[1][1]+= Pi[i][1]*Yk[i][1];
+            Spy[1][2]+= Pi[i][1]*Yk[i][2];
+            Spy[2][0]+= Pi[i][2]*Yk[i][0];
+            Spy[2][1]+= Pi[i][2]*Yk[i][1];
+            Spy[2][2]+= Pi[i][2]*Yk[i][2];*/
+        for( i=0 ; i<3 ; ++i )
+            for( j=0 ; j<3 ; ++j )
+                Spy[i][j] = Spy[i][j]/(double)acquisitionSize - gravityP[i]*gravityY[j];
+        // Delta = [A23 A31 A12] with Amn = Spy[m][n]-Spy[n][m]
+        Delta[0] = Spy[1][2]-Spy[2][1];
+        Delta[1] = Spy[2][0]-Spy[0][2];
+        Delta[2] = Spy[0][1]-Spy[1][0];
+        // calculate the matrix trace
+        traSpy = Spy[0][0]+Spy[1][1]+Spy[2][2];
+        // calculate the symmetric 4x4 matrix needed to determine
+        // the max eigenvalue
+        QSpy[0][0]=traSpy;
+        for( i=1 ; i<4 ; ++i )
+        {
+            QSpy[i][0] = Delta[i-1];
+            for( j=1 ; j<4; ++j )
+            {
+                QSpy[0][j] = Delta[j-1];
+                QSpy[i][j] = Spy[i-1][j-1]+Spy[j-1][i-1]-traSpy*Id3[i-1][j-1];
+            }
+        }
+        // calculate the eigen value of QSpy
+        double valeur_propre [4];
+        double vecteur_propre [4][4];
+        spec( QSpy, valeur_propre, vecteur_propre);
+        vnl_vector<double> Valp(4);
+        vnl_matrix<double> Vectp(4,4);
+        for(i=0;i<4; i++)
+            for(j=0;j<4; j++)
+            {
+                Valp[i]=valeur_propre[i];
+                Vectp[i][j]=vecteur_propre[i][j];
+            }
+        // optimal Rotation matrix calculate from the quaternion
+        // vector qr=[q0 q1 q2 q3] obtained by obtained the
+        // max eigen value
+        for( i = 0; i < 4; i++ )
+            if( Valp[i] > max )
+            {
+                max   = Valp[i];
+                index = i;
+            }
+        for( i=0 ; i<4 ; i++ )
+            qr[i] = Vectp[i][index];
+        // matrix determinate from the quaternion vector
+        Ricp[0][0] = pow(qr[0],2)+pow(qr[1],2)-pow(qr[2],2)-pow(qr[3],2);
+        Ricp[0][1] = 2*(qr[1]*qr[2]-qr[0]*qr[3]);
+        Ricp[0][2] = 2*(qr[1]*qr[3]+qr[0]*qr[2]);
+        Ricp[1][0] = 2*(qr[1]*qr[2]+qr[0]*qr[3]);
+        Ricp[1][1] = pow(qr[0],2)+pow(qr[2],2)-pow(qr[1],2)-pow(qr[3],2);
+        Ricp[1][2] = 2*(qr[2]*qr[3]-qr[0]*qr[1]);
+        Ricp[2][0] = 2*(qr[1]*qr[3]-qr[0]*qr[2]);
+        Ricp[2][1] = 2*(qr[2]*qr[3]+qr[0]*qr[1]);
+        Ricp[2][2] = pow(qr[0],2)+pow(qr[3],2)-pow(qr[1],2)-pow(qr[2],2);
+        // optimal translation vector Ticp T = ComY - Ricp.ComP
+        for( i=0 ; i<3 ; ++i )
+            qr[4+i] = gravityY[i]-(Ricp[i][0]*gravityP[0]+Ricp[i][1]*gravityP[1]+Ricp[i][2]*gravityP[2]);
+        // step 3 : Application the transformation
+        for( i=0 ; i<acquisitionSize ; ++i )
+            for( j=0 ; j<3 ; ++j )
+                Pk[i][j] = Ricp[j][0]*Pi[i][0]+Ricp[j][1]*Pi[i][1]+Ricp[j][2]*Pi[i][2]+qr[j+4];
+/*          Pk[i][0] = Ricp[0][0]*Pi[i][0]+Ricp[0][1]*Pi[i][1]+Ricp[0][2]*Pi[i][2]+qr[4];
+            Pk[i][1] = Ricp[1][0]*Pi[i][0]+Ricp[1][1]*Pi[i][1]+Ricp[1][2]*Pi[i][2]+qr[5];
+            Pk[i][2] = Ricp[2][0]*Pi[i][0]+Ricp[2][1]*Pi[i][1]+Ricp[2][2]*Pi[i][2]+qr[6];*/
+    } //end while
+    // give the transformation from model data ==> acquisition data
+    // first we add the first transformation to Rend
+    Rend = Ricp*Rot; // FIXME Voir Origine de Rot !!!
+    buffer_mul = Rend.transpose(); // ATTENTION : transpose au lieu de inverse!!!!!!!!!
+    for( i=0 ; i<3 ; ++i )
+    {
+        (*this)[3][i] = 0.0;
+        for( j=0 ; j<3 ; ++j )
+        {
+            (*this)[i][j] = buffer_mul[i][j];
+            Rend[i][j] = buffer_mul[i][j];
+        }
+    }
+    // translation vector = gravityA-Rend*gravityY
+    for( i=0 ; i<3 ; ++i )
+        (*this)[0][3] = gravityA[i]-(Rend[i][0]*gravityY[0]+Rend[i][1]*gravityY[1]+Rend[i][2]*gravityY[2]);
+//  (*this)[0][3] = gravityA[0]-(Rend[0][0]*gravityY[0]+Rend[0][1]*gravityY[1]+Rend[0][2]*gravityY[2]);
+//  (*this)[1][3] = gravityA[1]-(Rend[1][0]*gravityY[0]+Rend[1][1]*gravityY[1]+Rend[1][2]*gravityY[2]);
+//  (*this)[2][3] = gravityA[2]-(Rend[2][0]*gravityY[0]+Rend[2][1]*gravityY[1]+Rend[2][2]*gravityY[2]);
+    (*this)[3][3] = 1.0;
+    // ******************* Time chrono ******************
+//  DWORD dwEnd = GetTickCount();
+//  long dif = dwEnd-dwStart;
+    // destroy() ne marche pas sur toutes les matrices vnl_matrix
+    annDeallocPts( modelPoints );
+    annDeallocPts( dataPoints );
+    annDeallocPts( Pk );
+    annDeallocPts( Yk );
+    annDeallocPts( Pi );
+    //annDeallocPts( resu );
+    annDeallocPt( gravityA );
+    //annDeallocPt( gravityP );
+    //annDeallocPt( gravityY );
+    annClose();
+    m_registerRMS = RMS;
+    std::cout<<"ICP registration\n";
+    std::cout<<"RMS="<<RMS<<" Iterations="<<iterations<<" PtsModel="<<modelSize<<" PtsAcquisition="<<acquisitionSize<<"\n";
+    std::cout<<"Matrix ="<<*this<<"\n";
+    Object::update();
+    return true;
+#else // ANN
+    return false;
+#endif // ANN
+}
+
+void tensorProduct( const arlCore::Point& a, const arlCore::Point& b, vnl_matrix_fixed<double,3,3> &mat )
+{
+    unsigned int i, j;
+    for( i=0 ; i<3 ; ++i )
+        for( j=0 ; j<3 ; ++j )
+            mat.put(i,j, a[i]*b[j] );
+}
+
+template <typename T>
+bool internRegister3D3D( const T &src, const T &dst,  arlCore::vnl_rigid_matrix &mat, bool computeRMS )
+{   // Registration only with the visible points ** NEW METHOD **
+    //assert(src->size()==dst.size() && src->size()>=3);
+    if( src->size()!=dst->size() || src->size()<3 ) return false;
+    unsigned int i, j;
+    // Arun et al. direct solution technique
+    // Compute matrice H and mean vector
+    arlCore::Point meanA(0.0, 0.0, 0.0), meanB(0.0, 0.0, 0.0);
+    vnl_matrix_fixed<double,3,3> HMat, tempMat;
+    HMat.fill(0.0); tempMat.fill(0.0);
+    double n=0.0;
+    for( i=0 ; i<src->size() ; ++i )
+        if((*dst)[i]!=0 && (*src)[i]!=0)
+            if( (*dst)[i]->isVisible() && (*src)[i]->isVisible())
+            {
+                meanA.add( (*dst)[i]);
+                meanB.add( (*src)[i]);
+                tensorProduct( (*dst)[i], (*src)[i], tempMat);
+                HMat+=tempMat;
+                ++n;
+            }
+    if(n<3) return false;
+    meanA.mult(1/n);
+    meanB.mult(1/n);
+    // now compute K = sum(Tensors products) / N - tensorProduct( meanA, meanB )
+    // Divide H / N
+    HMat *= 1.0 / n;
+    tensorProduct( meanA, meanB, tempMat );
+    // Compute K = sum(Tensors products) / N - tensorProduct( meanA, meanB )
+    HMat -= tempMat;
+    arlCore::vnl_rotation3d_matrix RMat(HMat);
+    // calcul de la rotation la plus proche au sens de la norme de frobenius
+    RMat.closest_rotation();
+    // Compute translation = meanA - R * meanB
+    vnl_vector_fixed<double,3> vector_meanA, vector_meanB, translation;
+    for( i=0 ; i<3 ; ++i)
+    {
+        vector_meanA.put(i,meanA[i]);
+        vector_meanB.put(i,meanB[i]);
+    }
+    translation = vector_meanA - RMat*vector_meanB;
+    for( i=0 ; i<3 ; ++i)
+    {
+        mat[i][3] = translation[i];
+        mat[3][i] = 0.0f;
+        for( j=0 ; j<3 ; ++j)
+            mat.put( i,j, RMat(i,j) );
+    }
+    mat[3][3] = 1.0f;
+    if(computeRMS)
+    {
+        std::vector<double> errors;
+        mat.RMS3D3D( src, dst, errors );
+    }
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::register3D3D( PointList::csptr a, PointList::csptr b, bool computeRMS )
+{
+    m_registerRMS = -1;
+    m_registerStdDev = -1;
+    Object::update();
+    return internRegister3D3D( a, b, *this, computeRMS);
+}
+
+//bool arlCore::vnl_rigid_matrix::register3D3D( const std::vector< Point::csptr >& a, const std::vector< Point::csptr >& b, bool computeRMS )
+//{
+//    m_registerRMS = -1;
+//    m_registerStdDev = -1;
+//    Object::update();
+//    return internRegister3D3D(a, b, *this, computeRMS);
+//}
+
+bool arlCore::vnl_rigid_matrix::register3D3DUncertainty(PointList::csptr  a,PointList::csptr  b, arlCore::ARLCORE_REGISTER3D3D methode, std::vector<double> optimiserParameters, std::vector<double> &log/*, unsigned int numberOfPoints*/ )
+{
+    bool computeRMS = false;
+//  Object::update();
+//  return internRegister3D3D(a, b, numberOfPoints,*this);
+    vnl_vector<double> init(6);
+    arlCore::vnl_rigid_matrix T;
+//  for(unsigned int i = 0;i< b.size();i++)
+//  {
+//      const arlCore::vnl_covariance_matrix &cov_mat = b[i]->getCovMatrix();
+//      std::cerr<<"mat cov = " << cov_mat <<std::endl;
+//  }
+
+    //initialization computation
+    T.register3D3D(a,b,computeRMS/*,numberOfPoints*/);
+    arlCore::vnl_rigid_vector vec(T);
+    init = vec;
+
+    if(methode == arlCore::ARLCORE_REGISTER3D3D_LM)
+    {
+        arlCore::register3D3DUncertainty_LS_cost_function reg3D3D_LM(a, b, 6, /*numberOfPoints*/0, vnl_least_squares_function::use_gradient);
+        vnl_levenberg_marquardt computeReg3D3D_LM(reg3D3D_LM);
+        computeReg3D3D_LM.minimize_using_gradient(init);
+        log.push_back(computeReg3D3D_LM.get_end_error());
+        log.push_back(computeReg3D3D_LM.get_start_error());
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        (*this) = T;
+        return true;
+    }
+    if(methode == arlCore::ARLCORE_REGISTER3D3D_POW)
+    {
+        arlCore::register3D3DUncertainty_cost_function reg3D3D(a, b);
+        vnl_powell computeReg3D3D(&reg3D3D);
+        computeReg3D3D.minimize(init);
+        log.push_back(computeReg3D3D.get_end_error());
+        log.push_back(computeReg3D3D.get_start_error());
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        (*this) = T;
+        return true;
+    }
+    if(methode == arlCore::ARLCORE_REGISTER3D3D_GC)
+    {
+        arlCore::register3D3DUncertainty_cost_function reg3D3D(a, b);
+        vnl_conjugate_gradient computeReg3D3D(reg3D3D);
+        computeReg3D3D.minimize(init);
+        log.push_back(computeReg3D3D.get_end_error());
+        log.push_back(computeReg3D3D.get_start_error());
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        (*this) = T;
+        return true;
+    }
+    return false;
+}
+
+bool arlCore::vnl_rigid_matrix::RMS3D3D( PointList::csptr src, PointList::csptr dst, std::vector<double>& errors )
+{
+    m_registerRMS = 0.0, m_registerStdDev = 0.0;
+    assert(src->size()==dst->size());
+    if(src->size()!=dst->size()) return false;
+    errors.clear();
+    double err;
+    unsigned int i;
+    arlCore::Point::sptr A = arlCore::Point::New();
+    arlCore::Point::sptr B = arlCore::Point::New();
+    double distance_average = 0;
+    for( i=0 ; i<src->size() ; ++i )
+    {
+        if( (*src)[i]->isVisible() && (*dst)[i]->isVisible())
+        {
+            trf( (*src)[i] ,B );
+            err = B->distance( (*dst)[i] );
+            distance_average += err;
+            errors.push_back(err);
+            m_registerRMS += err*err;
+        }
+    }
+    const double n = (double)errors.size();
+    distance_average /= n;
+    m_registerRMS = sqrt(m_registerRMS/n);
+    for( i=0 ; i<n ; ++i )
+    {
+        err = (errors[i] - distance_average);
+        m_registerStdDev += err*err;
+    }
+    m_registerStdDev = sqrt(m_registerStdDev/n);
+    Object::update();
+    return true;
+}
+
+bool arlCore::vnl_rigid_matrix::register3D3DwithoutMatching( PointList::csptr a, PointList::csptr b, bool computeRMS, double gaussianError, double decimage )
+{   // b = T*a ; a=echantillon mesure ; b=modele reel
+    const bool Verbose = false;
+    if(a->size()<3 || b->size()<3) return false;
+    PointList::sptr Va = PointList::New();
+    PointList::sptr Vb = PointList::New();
+    const unsigned int NbMatching=arlCore::matching3D3D( a, b, gaussianError, decimage, Va, Vb );
+    if(NbMatching>2)
+        return register3D3D( Va, Vb, computeRMS );
+    else
+        if(Verbose) std::cout<<"3D/3D Matching Error\n";
+    return false;
+}
+
+// ****************** ROTATIONS ******************
+// TODO Integrate in vnl_rigid_matrix et vnl_rotation3d_matrix
+vnl_matrix_fixed<double,4,4> arlCore::rotX(double thetaX)
+{
+    const double Angle = thetaX * arlCore::DegToRad;
+    vnl_matrix_fixed<double,4,4> Rx;
+    Rx.set_identity();
+    //Rx = [1      0       0 0
+    //      0 cos(a) -sin(a) 0
+    //      0 sin(a)  cos(a) 0
+    //      0      0       0 1]
+    Rx[1][1] = Rx[2][2] = cos( Angle );
+    Rx[1][2] = -sin( Angle );
+    Rx[2][1] = -Rx[1][2];
+    return Rx;
+}
+
+vnl_matrix_fixed<double,4,4> arlCore::rotY(double thetaY)
+{
+    const double Angle = thetaY * arlCore::DegToRad;
+    vnl_matrix_fixed<double,4,4> Ry;
+    Ry.set_identity();
+    // Ry = [ cos(a) 0 sin(a) 0
+    //             0 1 0      0
+    //       -sin(a) 0 cos(a) 0
+    //             0 0 0      1]
+    Ry[0][0] = Ry[2][2]  = cos( Angle );
+    Ry[0][2] = sin( Angle );
+    Ry[2][0] = -Ry[0][2];
+    return Ry;
+}
+
+vnl_matrix_fixed<double,4,4> arlCore::rotZ(double thetaZ)
+{
+    const double Angle = thetaZ * arlCore::DegToRad;
+    vnl_matrix_fixed<double,4,4> Rz;
+    Rz.set_identity();
+    // Rz = [cos(a) -sin(a) 0 0
+    //       sin(a)  cos(a) 0 0
+    //            0       0 1 0
+    //            0       0 0 1]
+    Rz[0][0] = Rz[1][1] = cos( Angle );
+    Rz[0][1] = -sin( Angle );
+    Rz[1][0] = -Rz[0][1];
+    return Rz;
+}
+
+vnl_matrix_fixed<double,4,4> arlCore::rotXYZ(double thetaX, double thetaY, double thetaZ)
+{
+    const double AngleX = thetaX * arlCore::DegToRad;
+    const double AngleY = thetaY * arlCore::DegToRad;
+    const double AngleZ = thetaZ * arlCore::DegToRad;
+    vnl_matrix_fixed<double,4,4> R;
+    R.set_identity();
+    //R = [cos(z)cos(y)     sin(z)cos(x)-cos(z)sin(y)sin(x)     sin(z)sin(x)+cos(z)sin(y)cos(x) 0
+    //     -sin(z)cos(y)    cos(z)cos(x)+sin(z)sin(y)sin(x)     cos(z)sin(x)-sin(z)sin(y)cos(x) 0
+    //     -sin(y)          -cos(y)sin(x)                       cos(y)cos(x)                    0
+    //      0               0                                   0                               1]
+    R[0][0] = cos(AngleZ)*cos(AngleY);
+    R[0][1] = sin(AngleZ)*cos(AngleX)-cos(AngleZ)*sin(AngleY)*sin(AngleX);
+    R[0][2] = sin(AngleZ)*sin(AngleX)+cos(AngleZ)*sin(AngleY)*cos(AngleX);
+    R[1][0] = -sin(AngleZ)*cos(AngleY);
+    R[1][1] = cos(AngleZ)*cos(AngleX)+sin(AngleZ)*sin(AngleY)*sin(AngleX);
+    R[1][2] = cos(AngleZ)*sin(AngleX)-sin(AngleZ)*sin(AngleY)*cos(AngleX);
+    R[2][0] = -sin(AngleY);
+    R[2][1] = -cos(AngleY)*sin(AngleX);
+    R[2][2] = cos(AngleY)*cos(AngleX);
+    return R;
+}
+
+vnl_matrix_fixed<double,4,4> arlCore::rotVecFromOrigin(double Ux, double Uy, double Uz, double a)
+{
+    const double Alpha = a * arlCore::DegToRad;
+    const double Norm = sqrt(Ux*Ux+Uy*Uy+Uz*Uz);
+    vnl_matrix_fixed<double,4,4> R;
+    R.set_identity();
+    if(Norm==0.0) return R;
+    if(Norm!=1.0) Ux /= Norm, Uy /= Norm, Uz /= Norm;
+    const double Ux2 = Ux*Ux, Uy2 = Uy*Uy, Uz2 = Uz*Uz;
+    //R = [Ux²+cos(a)*(1-Ux²)           Ux*Uy*(1-cos(a))-Uz*sin(a)  Ux*Uz*(1-cos(a))+Uy*sin(a)  0
+    //     Ux*Uy*(1-cos(a))+Uz*sin(a)   Uy²+cos(a)*(1-Uy²)          Uy*Uz*(1-cos(a))-Ux*sin(a)  0
+    //     Ux*Uz*(1-cos(a))-Uy*sin(a)   Uy*Uz*(1-cos(a))+Ux*sin(a)  Uz²+cos(a)*(1-Uz²)          0
+    //      0                           0                           0                           1]
+    R[0][0] = Ux2+cos(Alpha)*(1-Ux2);
+    R[0][1] = Ux*Uy*(1-cos(Alpha))-Uz*sin(Alpha);
+    R[0][2] = Ux*Uz*(1-cos(Alpha))+Uy*sin(Alpha);
+    R[1][0] = Ux*Uy*(1-cos(Alpha))+Uz*sin(Alpha);
+    R[1][1] = Uy2+cos(Alpha)*(1-Uy2);
+    R[1][2] = Uy*Uz*(1-cos(Alpha))-Ux*sin(Alpha);
+    R[2][0] = Ux*Uz*(1-cos(Alpha))-Uy*sin(Alpha);
+    R[2][1] = Uy*Uz*(1-cos(Alpha))+Ux*sin(Alpha);
+    R[2][2] = Uz2+cos(Alpha)*(1-Uz2);
+    return R;
+}
+
+vnl_matrix_fixed<double,4,4> arlCore::rotVecFromPoint(double a, double b, double c, double u, double v, double w, double angle)
+{   // http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html
+    const double Alpha = angle * arlCore::DegToRad;
+    const double L2 = u*u+v*v+w*w;
+    const double L = sqrt(L2);
+    unsigned int i, j;
+    vnl_matrix_fixed<double,4,4> R;
+    R.set_identity();
+    if(L==0.0) return R;
+    if(L!=1.0) u /= L, v /= L, w /= L;
+    const double u2 = u*u, v2 = v*v, w2 = w*w;
+    R[0][0] = u2+(v2+w2)*cos(Alpha);
+    R[0][1] = u*v*(1-cos(Alpha))-w*L*sin(Alpha);
+    R[0][2] = u*w*(1-cos(Alpha))+v*L*sin(Alpha);
+    R[0][3] = a*(v2+w2)-u*(b*v+c*w)+(u*(b*v+c*w)-a*(v2+w2))*cos(Alpha)+(b*w-c*v)*L*sin(Alpha);
+    R[1][0] = u*v*(1-cos(Alpha))+w*L*sin(Alpha);
+    R[1][1] = v2+(u2+w2)*cos(Alpha);
+    R[1][2] = v*w*(1-cos(Alpha))-u*L*sin(Alpha);
+    R[1][3] = b*(u2+w2)-v*(a*u+c*w)+(v*(a*u+c*w)-b*(u2+w2))*cos(Alpha)+(c*u-a*w)*L*sin(Alpha);
+    R[2][0] = u*w*(1-cos(Alpha))-v*L*sin(Alpha);;
+    R[2][1] = v*w*(1-cos(Alpha))+u*L*sin(Alpha);
+    R[2][2] = w2+(u2+v2)*cos(Alpha);;
+    R[2][3] = c*(u2+v2)-w*(a*u+b*v)+(w*(a*u+b*v)-c*(u2+v2))*cos(Alpha)+(a*v-b*u)*L*sin(Alpha);
+    for( i=0 ; i<3 ; ++i )
+        for( j=0 ; j<4 ; ++j )
+            R[i][j] /= L2;
+    return R;
+}
+
+// ****************** TRANSFORMATION FILTER ******************
+// time=[0,1]
+double getCoeff( double time, arlCore::ARLCORE_TRF_FILTER_TYPE filterType )
+{   // Default : ARLCORE_TRF_FILTER_CONSTANT
+    assert( time>=0.0 && time<=1.0 );
+    const double LogRange = 2.71828182845904523536 - 1.0;
+    switch(filterType)
+    {
+    case arlCore::ARLCORE_TRF_FILTER_LINEAR: return time;
+    case arlCore::ARLCORE_TRF_FILTER_LOG: return log(1.0+time*LogRange);
+    case arlCore::ARLCORE_TRF_FILTER_SQUARE: return time*time;
+    case arlCore::ARLCORE_TRF_FILTER_CUBIC: return time*time*time;
+    default: break;
+    }
+    return 1.0;
+}
+
+unsigned int arlCore::filter( const std::vector<const arlCore::vnl_rigid_matrix*> &list , ARLCORE_TRF_FILTER_TYPE type, vnl_rigid_matrix &average )
+{
+    const unsigned int Size = (unsigned int)list.size();
+    if(Size==0) return 0;
+    assert(list.back());
+    average.setTime(list.back()->getDate(), list.back()->getTime());
+    const double CurrentTime = (double)average.getTime(); // FIXME Planesystem time
+    assert(list[0]);
+    const double LastTime = (double)list[0]->getTime(); // FIXME Planesystem time - duration
+    const double RangeTime = CurrentTime - LastTime;
+    assert( RangeTime>=0.0 );
+    if(Size==1)
+    {
+        average.copy(*list[0]);
+        return Size;
+    }
+    vnl_quaternion<double>   Q;
+    vnl_vector_fixed<double,3>  T,euler, eulermean(0,0,0),Tmean(0,0,0);
+    vnl_rotation3d_matrix rot,rotinit;
+    double coeffTotal = 0.0, coeff;
+    unsigned int i;
+    for( i=0 ; i<Size ; ++i )
+    {
+        if(type==ARLCORE_TRF_FILTER_CONSTANT || RangeTime==0.0 ) coeff = 1.0;
+        else
+        {
+            const double time = list[i]->getTime();
+            assert( time>=LastTime && time<=CurrentTime );
+            coeff = getCoeff( (time-LastTime)/RangeTime, type);
+        }
+        assert(list[i]);
+        Q = list[i]->getQuaternion();
+        T = list[i]->getTranslation();
+        euler = Q.rotation_euler_angles();
+        eulermean+=euler*coeff;
+        Tmean+=T*coeff;
+        coeffTotal += coeff;
+    }
+    eulermean/=coeffTotal;
+    Tmean/=coeffTotal;
+    vnl_quaternion<double> q2(eulermean[0],eulermean[1],eulermean[2]);
+    rot = q2.rotation_matrix_transpose();
+    rot = rot.transpose();
+    average.setTranslation(Tmean);
+    average.setRotation(rot);
+    return Size;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Mesh.cpp b/SrcLib/ARLcore/src/arlcore/Mesh.cpp
new file mode 100644
index 0000000..79c98f9
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Mesh.cpp
@@ -0,0 +1,754 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Mesh.h>
+
+#include <fstream>
+#include <math.h>
+
+#include <vnl/vnl_math.h>
+
+#include <vgl/vgl_point_3d.h>
+#include <vgl/vgl_distance.h>
+#include <vgl/vgl_triangle_3d.h>
+#include <vgl/algo/vgl_homg_operators_3d.h>
+
+#include <arlcore/Misc.h>
+#include <arlcore/File.h>
+
+arlCore::Mesh::Mesh( double pointScalar ):
+m_pointScalar(pointScalar),
+m_pointList( arlCore::PointList::New() )
+{
+    m_pointList->setDimension(3);
+}
+
+arlCore::Mesh::Mesh( const Mesh& p )
+{
+    copy(p);
+}
+
+arlCore::Mesh::~Mesh( void )
+{}
+
+void arlCore::Mesh::copy( const Mesh& m )
+{
+    m_pointList = m.m_pointList;
+    m_triangles = m.m_triangles;
+    m_nbReferences = m.m_nbReferences;
+    // TODO Don't copy free points & triangles
+    m_freePoints = m.m_freePoints;
+    m_freeTriangles = m.m_freeTriangles;
+}
+
+void arlCore::Mesh::clear( void )
+{
+    m_pointList->clear();
+    m_triangles.clear();
+    m_nbReferences.clear();
+    m_freePoints.clear();
+    m_freeTriangles.clear();
+}
+
+arlCore::Mesh::Mesh( const std::string& fileName )
+{
+    load(fileName);
+}
+
+double arlCore::Mesh::getRMSDistance( void ) const
+{
+    double distance = 0.0;
+    unsigned int i, j;
+    const unsigned int Size = (unsigned int)m_triangles.size();
+    for( i=0 ; i<Size ; ++i )
+    {
+        vnl_vector_fixed<double,3> lengths = getLengths(i);
+        for( j=0 ; j<3 ; ++j )
+            distance += lengths[j]*lengths[j];
+    }
+    return sqrt(distance/(double)(Size*3));
+}
+
+double arlCore::Mesh::computeDistance2( Point::csptr p ) const
+{
+    unsigned int noTriangle;
+    const double D = computeDistance(p, noTriangle);
+    return D*D;
+}
+
+double arlCore::Mesh::computeDistance2( Point::csptr p, unsigned int &noTriangle ) const
+{
+    const double D = computeDistance(p, noTriangle);
+    return D*D;
+}
+
+double arlCore::Mesh::computeDistance( Point::csptr p ) const
+{
+    unsigned int noTriangle;
+    return computeDistance( p, noTriangle );
+}
+
+double arlCore::Mesh::computeDistance( Point::csptr p, unsigned int &noTriangle ) const
+{
+    const vgl_point_3d<double> VglPoint(p->x(), p->y(), p->z());
+    unsigned int i;
+    double distance = -1.0;
+    for( i=0 ; i<m_triangles.size() ; ++i )
+    {
+        Point::csptr P0 = (*m_pointList)[m_triangles[i][0]];
+        const vgl_point_3d<double> VglP0(P0->x(), P0->y(), P0->z());
+        Point::csptr P1 = (*m_pointList)[m_triangles[i][1]];
+        const vgl_point_3d<double> VglP1(P1->x(), P1->y(), P1->z());
+        Point::csptr P2 = (*m_pointList)[m_triangles[i][2]];
+        const vgl_point_3d<double> VglP2(P2->x(), P2->y(), P2->z());
+        const double D = vgl_triangle_3d_distance( VglPoint, VglP0, VglP1, VglP2 );
+        if(i==0) {distance = D, noTriangle = i;}
+        else if(D<distance) {distance = D, noTriangle = i;}
+    }
+    return distance;
+}
+
+arlCore::PointList::csptr arlCore::Mesh::getPointList( void ) const
+{
+    return m_pointList;
+}
+
+const std::vector< vnl_vector_fixed<unsigned int, 3> >& arlCore::Mesh::getTriangles( void ) const
+{
+    return m_triangles;
+}
+
+double arlCore::Mesh::triangleSurface( unsigned int i ) const
+{
+    if(i>=m_triangles.size()) return -1;
+    Point::csptr P0 = (*m_pointList)[m_triangles[i][0]];
+    const vgl_point_3d<double> VglP0(P0->x(), P0->y(), P0->z());
+    Point::csptr P1 = (*m_pointList)[m_triangles[i][1]];
+    const vgl_point_3d<double> VglP1(P1->x(), P1->y(), P1->z());
+    Point::csptr P2 = (*m_pointList)[m_triangles[i][2]];
+    const vgl_point_3d<double> VglP2(P2->x(), P2->y(), P2->z());
+    return vgl_triangle_3d_area( VglP0, VglP1, VglP2 );
+}
+
+bool arlCore::Mesh::generateX( double ySize, double zSize, double yStep, double zStep, double degree, double gaussianNoise, PointList::sptr summits )
+{
+    return generate( 0, ySize, zSize, yStep, zStep, degree, gaussianNoise, summits );
+}
+
+bool arlCore::Mesh::generateY( double xSize, double zSize, double xStep, double zStep, double degree, double gaussianNoise, PointList::sptr summits )
+{
+    return generate( 1, xSize, zSize, xStep, zStep, degree, gaussianNoise, summits );
+}
+
+bool arlCore::Mesh::generateZ( double xSize, double ySize, double xStep, double yStep, double degree, double gaussianNoise, PointList::sptr summits )
+{
+    return generate( 2, xSize, ySize, xStep, yStep, degree, gaussianNoise, summits );
+}
+
+bool arlCore::Mesh::generate( unsigned int axis, double width, double length, double stepW, double stepL, double degree, double gaussianNoise, PointList::sptr summits )
+{
+    clear();
+    const unsigned int Width = (unsigned int)(width/stepW);
+    const unsigned int Length = (unsigned int)(length/stepL);
+    if(Width<1 || Length<1) return false;
+    std::vector< std::vector<double> > grid(Width);
+    unsigned int i, j, k;
+    for( i=0 ; i<Width ; ++i )
+    {
+        const double Wi = (double)i*stepW;
+        grid[i].resize(Length);
+        for( j=0 ; j<Length ; ++j )
+        {
+            const double Li = (double)j*stepL;
+            bool end = false;
+            double altitude = 0.0;
+            vnl_vector<double> invDists(summits->size());
+            for( k=0 ; k<summits->size() && !end ; ++k )
+            {
+                double distance2;
+                switch(axis)
+                {
+                case 0:
+                    distance2 = (Wi-(*summits)[k]->y())*(Wi-(*summits)[k]->y())+(Li-(*summits)[k]->z())*(Li-(*summits)[k]->z());
+                    break;
+                case 1:
+                    distance2 = (Wi-(*summits)[k]->x())*(Wi-(*summits)[k]->x())+(Li-(*summits)[k]->z())*(Li-(*summits)[k]->z());
+                    break;
+                case 2:
+                    distance2 = (Wi-(*summits)[k]->x())*(Wi-(*summits)[k]->x())+(Li-(*summits)[k]->y())*(Li-(*summits)[k]->y());
+                    break;
+                default: return false;
+                }
+                const double Distance = sqrt(distance2);
+                const double DistancePow = pow(Distance, degree);
+                if(Distance<1e-8)
+                {
+                    altitude = (*summits)[k]->z();
+                    end = true;
+                }else invDists[k] = 1.0/DistancePow;
+            }
+            if(!end)
+            {
+                const double Sum = invDists.sum();
+                for( k=0 ; k<summits->size() ; ++k )
+                {
+                    const double Coeff = invDists[k]/Sum;
+                    altitude += (*summits)[k]->z()*Coeff;
+                }
+            }
+            grid[i][j]=altitude;
+        }
+    }
+    for( i=0 ; i<Width-1 ; ++i )
+    {
+        const double Width0 = (double)i*stepW;
+        const double Width1 = (double)(i+1)*stepW;
+        for( j=0 ; j<Length-1 ; ++j )
+        {
+
+            const double Length0 = (double)j*stepL;
+            const double Length1 = (double)(j+1)*stepL;
+            const double Alt0 = grid[i+0][j+0];
+            const double Alt1 = grid[i+1][j+0];
+            const double Alt2 = grid[i+1][j+1];
+            const double Alt3 = grid[i+0][j+1];
+            std::vector<unsigned int> index(4);
+            switch(axis)
+            {
+            case 0:
+                index[0] = addPoint(arlCore::Point::New(Alt0, Width0, Length0), gaussianNoise);
+                index[1] = addPoint(arlCore::Point::New(Alt1, Width1, Length0), gaussianNoise);
+                index[2] = addPoint(arlCore::Point::New(Alt2, Width1, Length1), gaussianNoise);
+                index[3] = addPoint(arlCore::Point::New(Alt3, Width0, Length1), gaussianNoise);
+                break;
+            case 1:
+                index[0] = addPoint(arlCore::Point::New(Width0, Alt0, Length0), gaussianNoise);
+                index[1] = addPoint(arlCore::Point::New(Width1, Alt1, Length0), gaussianNoise);
+                index[2] = addPoint(arlCore::Point::New(Width1, Alt2, Length1), gaussianNoise);
+                index[3] = addPoint(arlCore::Point::New(Width0, Alt3, Length1), gaussianNoise);
+                break;
+            case 2:
+                index[0] = addPoint(arlCore::Point::New(Width0, Length0, Alt0), gaussianNoise);
+                index[1] = addPoint(arlCore::Point::New(Width1, Length0, Alt1), gaussianNoise);
+                index[2] = addPoint(arlCore::Point::New(Width1, Length1, Alt2), gaussianNoise);
+                index[3] = addPoint(arlCore::Point::New(Width0, Length1, Alt3), gaussianNoise);
+                break;
+            default: return false;
+            }
+            addTriangle(index[0], index[1], index[2]);
+            addTriangle(index[0], index[2], index[3]);
+        }
+    }
+    return true;
+}
+
+bool arlCore::Mesh::load( const std::string& fileName, double gaussianNoise )
+{
+    clear();
+    if(fileName=="") return false;
+    std::string extractFolder, extractFile, ext;
+    arlString::splitFilename( fileName, extractFolder, extractFile, ext );
+    std::string filetype = File::getFiletype( fileName );
+    if(filetype=="Planes")
+    {
+        arlCore::File config(fileName, "Planes");
+        const double Version = config.readHeader();
+        if(Version>0.0)
+        {
+            std::vector< vgl_homg_plane_3d<double> > planes;
+            std::vector< double > planeRMS, planeMin, planeMax;
+            std::vector< unsigned int > planeN;
+            std::vector< vgl_homg_point_3d<double> > points;
+            unsigned int i, index;
+            std::string token, name;
+            while(config.getToken(token))
+            {
+                unsigned int p1, p2, p3;
+                double x, y, z, outliers=0.0, scalar=0.0;
+                if(token=="Planes")
+                {
+                    config.get(name);
+                    config.get(outliers);
+                    std::vector< vnl_vector<double> > vnlPoints;
+                    std::vector< std::string > names;
+                    std::stringstream ss;
+                    ss<<extractFolder<<"/"<<name;
+                    if(arlCore::load( vnlPoints, names, ss.str() ))
+                    {
+                        std::vector< arlCore::PointList > PL;
+                        for( i=0 ; i<vnlPoints.size() ; ++i )
+                        {
+                            if(arlString::valueOf(names[i], index))
+                            {
+                                if(PL.size()<=index) PL.resize(index+1);
+                                arlCore::Point::sptr pt = arlCore::Point::New(vnlPoints[i][0], vnlPoints[i][1], vnlPoints[i][2]);
+                                PL[index].push_back(pt);
+                            }
+                        }
+                        const unsigned int Size = (unsigned int)PL.size();
+                        planes.resize(Size);
+                        planeRMS.resize(Size);
+                        planeMin.resize(Size);
+                        planeMax.resize(Size);
+                        planeN.resize(Size);
+                        for( i=0 ; i<PL.size() ; ++i )
+                            planeN[i] = PL[i].plane( planes[i], planeRMS[i], planeMin[i], planeMax[i], scalar, outliers );
+                    }
+                }
+                if(token=="Point")
+                {
+                    config.get(index);
+                    if(points.size()<=index) points.resize(index+1);
+                    config.getToken(token);
+                    if(token=="Intersection")
+                    {
+                        config.get(p1);
+                        config.get(p2);
+                        config.get(p3);
+                        if(planes.size()>p1 && planes.size()>p2 && planes.size()>p3)
+                            points[index]=vgl_homg_point_3d<double>(planes[p1], planes[p2], planes[p3]);
+                    }
+                    if(token=="Coordinates")
+                    {
+                        config.get(x);
+                        config.get(y);
+                        config.get(z);
+                        points[index]=vgl_homg_point_3d<double>(x, y, z);
+                    }
+                }
+                if(token=="Triangle")
+                {
+                    config.get(p1);
+                    config.get(p2);
+                    config.get(p3);
+                    if(points.size()>p1 && points.size()>p2 && points.size()>p3)
+                    {
+                        points[p1].get_nonhomogeneous( x, y, z );
+                        const arlCore::Point::sptr Pt1 = arlCore::Point::New( x, y, z );
+                        points[p2].get_nonhomogeneous( x, y, z );
+                        const arlCore::Point::sptr Pt2= arlCore::Point::New( x, y, z );
+                        points[p3].get_nonhomogeneous( x, y, z );
+                        const arlCore::Point::sptr Pt3= arlCore::Point::New( x, y, z );
+                        addTriangle( Pt1, Pt2, Pt3 );
+                    }
+                }
+                double compareValue = 0.0;
+                const bool Compare = (token=="Compare");
+                if(Compare)
+                    config.get(compareValue);
+                if(token=="Display" || Compare)
+                {   // FIXME Find another way to display this informations
+                    config.getToken(token);
+                    if(token=="Point")
+                    {
+                        config.get(p1);
+                        if(points.size()>p1)
+                        {
+                            points[p1].get_nonhomogeneous( x, y, z );
+                            std::cout<<"Point "<<p1<<" = "<<x<<" "<<y<<" "<<z<<"\n";
+                        }
+                    }
+                    if(token=="Plane")
+                    {
+                        config.get(p1);
+                        if(planes.size()>p1)
+                        {
+                            std::cout<<"Plane "<<p1<<" RMS="<<planeRMS[p1]<<" Min="<<planeMin[p1];
+                            std::cout<<" Max="<<planeMax[p1]<<" n="<<planeN[p1];
+                            //std::cout<<" : "<<planes[p1];
+                            std::cout<<"\n";
+                        }
+                    }
+                    if(token=="PlaneAngle")
+                    {
+                        config.get(p1);
+                        config.get(p2);
+                        if(planes.size()>p1 && planes.size()>p2)
+                        {
+                            double angle = fmod(vgl_homg_operators_3d<double>::plane_plane_angle(planes[p1], planes[p2]), vnl_math::pi/2.0);
+                            if(angle>=vnl_math::pi/4.0) angle = vnl_math::pi/2.0 - angle;
+                            std::cout<<"Plane Angle "<<p1<<"-"<<p2<<" = "<<angle*arlCore::RadToDeg<<" deg";
+                            if(Compare) std::cout<<" (Delta="<<angle*arlCore::RadToDeg-compareValue<<")";
+                            std::cout<<"\n";
+                        }
+                    }
+                    if(token=="PointDistance")
+                    {
+                        config.get(p1);
+                        config.get(p2);
+                        if(points.size()>p1 && points.size()>p2)
+                        {
+                            const double Distance = vgl_distance(points[p1], points[p2]);
+                            std::cout<<"Point Distance "<<p1<<"-"<<p2<<" = "<<Distance<<" mm";
+                            if(Compare) std::cout<<" (Delta="<<Distance-compareValue<<")";
+                            std::cout<<"\n";
+                        }
+                    }
+                    if(token=="PointAngle")
+                    {
+                        config.get(p1);
+                        config.get(p2);
+                        config.get(p3);
+                        if(points.size()>p1 && points.size()>p2 && points.size()>p3)
+                        {
+                            double x1, x2, x3, y1, y2, y3, z1, z2, z3;
+                            points[p1].get_nonhomogeneous( x1, y1, z1 );
+                            points[p2].get_nonhomogeneous( x2, y2, z2 );
+                            points[p3].get_nonhomogeneous( x3, y3, z3 );
+                            vnl_vector_fixed<double, 3> dir1( x1-x2, y1-y2, z1-z2 );
+                            vnl_vector_fixed<double, 3> dir2( x3-x2, y3-y2, z3-z2 );
+                            dir1.normalize();
+                            dir2.normalize();
+                            double angle = vcl_acos( dot_product( dir1, dir2 ) );
+                            std::cout<<"Point Angle "<<p1<<"-"<<p2<<"-"<<p3<<" = "<<angle*arlCore::RadToDeg<<" deg";
+                            if(Compare) std::cout<<" (Delta="<<angle*arlCore::RadToDeg-compareValue<<")";
+                            std::cout<<"\n";                        }
+                    }
+                }
+            }
+        }
+        config.close();
+        return m_triangles.size()>0;
+    }
+    if(filetype=="Surface")
+    {
+        arlCore::File config(fileName, "Surface");
+        const double Version = config.readHeader();
+        if(Version>0.0)
+        {
+            arlCore::PointList::sptr summits = arlCore::PointList::New(); //VAG FIXME NB New(3)
+            unsigned int xSize=0, ySize=0;
+            double xStep = 1.0, yStep = 1.0, degree = 2.0, noise = 0.0;
+            vnl_vector<double> point(3);
+            std::string token, name;
+            while(config.getToken(token))
+            {
+                if(token=="Name") config.get(name);
+                // TODO Generate altitude on X or Y-axis
+                if(token=="XSize" || token=="Width") config.get(xSize);
+                if(token=="YSize" || token=="Length") config.get(ySize);
+                if(token=="XStep") config.get(xStep);
+                if(token=="YStep") config.get(yStep);
+                if(token=="Step")
+                {
+                    config.get(xStep);
+                    yStep = xStep;
+                }
+                if(token=="Degree") config.get(degree);
+                if(token=="GaussianNoise") config.get(noise);
+                if(token=="Summit")
+                    if(config.get(point, 3))
+                        summits->push_back( Point::New(point[0],point[1],point[2]) );
+            }
+            if(gaussianNoise>0.0) noise = gaussianNoise;
+            generateZ( xSize, ySize, xStep, yStep, degree, noise, summits );
+        }
+        config.close();
+        return m_triangles.size()>0;
+    }
+    std::ifstream file;
+    file.open (fileName.c_str(), std::fstream::in);
+    if(!file.is_open())
+    {
+        std::cerr<<"Mesh Loading error : "<<fileName<<"\n";
+        return false;
+    }
+    const bool Trian = (ext=="trian");
+    const bool Raw = (ext=="raw");
+    unsigned int i=0, a, b, c;
+    double x, y, z;
+    Point::sptr p = Point::New(3);
+    if(Trian)
+    {
+        unsigned int nbPts, nbTrian;
+        file>>nbPts;
+        for( ; i<nbPts ; ++i )
+        {
+            file>>x>>y>>z;
+            p->x(x);
+            p->y(y);
+            p->z(z);
+            addPoint(p, gaussianNoise);
+        }
+        file>>nbTrian;
+        for( i=0 ; i<nbTrian ; ++i )
+        {
+            file>>a>>b>>c>>x>>y>>z;
+            addTriangle(a, b, c);
+        }
+        file.close();
+        return m_triangles.size()>0;
+    }
+    if(Raw)
+    {
+        while(!file.eof())
+        {
+            file>>x>>y>>z;
+            p->x(x);
+            p->y(y);
+            p->z(z);
+            unsigned int index = addPoint(p, gaussianNoise);
+            if((i+1)%3==0) addTriangle(index-2, index-1, index);
+            ++i;
+        }
+        file.close();
+        return m_triangles.size()>0;
+    }
+    return false;
+}
+
+bool arlCore::Mesh::save( const std::string& fileName, bool overwrite ) const
+{
+    std::fstream file;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    file.open(fileName.c_str(), std::fstream::out);
+    if(!file.is_open()) return false;
+    std::string extractFolder, extractFile, ext;
+    arlString::splitFilename( fileName, extractFolder, extractFile, ext );
+    const bool Trian = (ext=="trian");
+    const bool Raw = (ext=="raw");
+    const bool Vtk = (ext=="vtk");
+    unsigned int i, j, k;
+    if(Trian)
+    {
+        file<<(unsigned int)m_pointList->size()<<"\n";
+        for( i=0 ; i<(unsigned int)m_pointList->size() ; ++i )
+        {
+            for( j=0 ; j<3 ; ++j )
+                file<<(*m_pointList)[i]->get(j)<<" ";
+            file<<"\n";
+        }
+        file<<(unsigned int)m_triangles.size()<<"\n";
+        for( i=0 ; i<(unsigned int)m_triangles.size() ; ++i )
+        {
+            for( j=0 ; j<3 ; ++j )
+                file<<m_triangles[i][j]<<" ";
+            file<<"-1 -1 -1\n";
+        }
+        file.close();
+        return true;
+    }
+    if(Raw)
+    {
+        for( i=0 ; i<(unsigned int)m_triangles.size() ; ++i )
+        {
+            for( j=0 ; j<3 ; ++j )
+                for( k=0 ; k<3 ; ++k )
+                    file<<(*m_pointList)[m_triangles[i][j]]->get(k)<<" ";
+            file<<"\n";
+        }
+        file.close();
+        return true;
+    }
+    if(Vtk)
+    {
+        file<<"# vtk DataFile Version 1.0\nFileName\nASCII\n\n";
+        //file<<DATASET UNSTRUCTURED_GRID";
+        file<<"DATASET POLYDATA";
+        file<<"\nPOINTS "<<(unsigned int)m_pointList->size()<<" double\n";
+        for( i=0 ; i<(unsigned int)m_pointList->size() ; ++i )
+        {
+            for( j=0 ; j<3 ; ++j )
+                file<<(*m_pointList)[i]->get(j)<<" ";
+            file<<"\n";
+        }
+
+        //file<<"\nCELLS ";
+        file<<"\nPOLYGONS ";
+        file<<(unsigned int)m_triangles.size()<<" "<<(unsigned int)m_triangles.size()*4<<"\n";
+        for( i=0 ; i<(unsigned int)m_triangles.size() ; ++i )
+        {
+            file<<"3 ";
+            for( j=0 ; j<3 ; ++j )
+                file<<m_triangles[i][j]<<" ";
+            file<<"\n";
+        }
+    /*  file<<"\nCELLS_TYPES "<<(unsigned int)m_triangles.size()<<"\n";
+        for( i=0 ; i<(unsigned int)m_triangles.size() ; ++i )
+            file<<"5\n";*/
+        file.close();
+        return true;
+    return true;
+    }
+    return false;
+}
+
+bool arlCore::Mesh::resampling( double step )
+{
+    if(step<=0) return false;
+    unsigned int i, j;
+    const double Tol = 2.0*step;
+    std::vector<arlCore::Point::sptr > points(3);
+    for( i=0 ; i<(unsigned int)m_triangles.size() ; )
+    {
+        vnl_vector_fixed<double,3> lengths = getLengths(i);
+        if((lengths[0]+lengths[1])>=Tol)
+        {
+            std::vector<unsigned int> index(6);
+            for( j=0 ; j<3 ; ++j )
+                index[j] = m_triangles[i][j];
+            const arlCore::Point::sptr A = (*m_pointList)[index[0]];
+            const arlCore::Point::sptr B = (*m_pointList)[index[1]];
+            const arlCore::Point::sptr C = (*m_pointList)[index[2]];
+            m_freeTriangles.push_back(i);
+            --m_nbReferences[m_triangles[i][0]];
+            --m_nbReferences[m_triangles[i][1]];
+            --m_nbReferences[m_triangles[i][2]];
+            for( j=0 ; j<3 ; ++j )
+            {
+                points[0]->set(j, ( (*A)[j]+(*B)[j])/2.0);
+                points[1]->set(j, ( (*B)[j]+(*C)[j])/2.0);
+                points[2]->set(j, ( (*C)[j]+(*A)[j])/2.0);
+            }
+            for( j=0 ; j<3 ; ++j )
+                index[3+j] = addPoint(points[j]);
+            addTriangle( index[0], index[3], index[5] );
+            addTriangle( index[3], index[1], index[4] );
+            addTriangle( index[4], index[2], index[5] );
+            addTriangle( index[5], index[3], index[4] );
+        }else ++i;
+    }
+    assert(m_freePoints.size()==0);
+    assert(m_freeTriangles.size()==0);
+    return true;
+}
+
+// Private methods
+
+unsigned int arlCore::Mesh::addPoint( Point::csptr p, double gaussianNoise )
+{
+    unsigned int index;
+    if(m_freePoints.size()>0)
+    {
+        index = m_freePoints.back();
+        m_freePoints.pop_back();
+        (*m_pointList)[index]->copy(p);
+    }else
+    {
+        index = m_pointList->size();
+        m_pointList->push_back(p);
+        m_pointList->back()->setScalar(m_pointScalar);
+        m_nbReferences.push_back(0);
+    }
+    if(gaussianNoise>0.0) (*m_pointList)[index]->addGaussianNoise(gaussianNoise);
+    return index;
+}
+
+unsigned int arlCore::Mesh::releasePoint( unsigned int noPoint )
+{
+    if(m_nbReferences[noPoint]<1) return 0;
+    --m_nbReferences[noPoint];
+    if(m_nbReferences[noPoint]<1)
+    {
+        m_freePoints.push_back(noPoint);
+        (*m_pointList)[noPoint]->setVisible(false);
+    }
+    return m_nbReferences[noPoint];
+}
+
+bool arlCore::Mesh::addTriangle( Point::csptr P1, Point::csptr P2, Point::csptr P3 )
+{
+    std::vector<unsigned int> index;
+    index.push_back(addPoint(P1));
+    index.push_back(addPoint(P2));
+    index.push_back(addPoint(P3));
+    return addTriangle(index[0], index[1], index[2]);
+}
+
+bool arlCore::Mesh::addTriangle( unsigned int a, unsigned int b, unsigned int c )
+{
+    if(m_freeTriangles.size()==0) m_triangles.push_back(vnl_vector_fixed<unsigned int, 3>(a,b,c));
+    else
+    {
+        unsigned int index = m_freeTriangles.back();
+        m_freeTriangles.pop_back();
+        m_triangles[index] = vnl_vector_fixed<unsigned int, 3>(a,b,c);
+    }
+    ++m_nbReferences[a];
+    ++m_nbReferences[b];
+    ++m_nbReferences[c];
+    return true;
+}
+
+bool arlCore::Mesh::releaseTriangle( unsigned int noTriangle )
+{
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        releasePoint(m_triangles[noTriangle][i]);
+    m_freeTriangles.push_back(noTriangle);
+    return true;
+}
+
+vnl_vector_fixed<double,3> arlCore::Mesh::getLengths( unsigned int noTriangle ) const
+{
+    vnl_vector_fixed<double,3> lengths;
+    assert(noTriangle<m_triangles.size());
+    const arlCore::Point::sptr A = (*m_pointList)[m_triangles[noTriangle][0]];
+    const arlCore::Point::sptr B = (*m_pointList)[m_triangles[noTriangle][1]];
+    const arlCore::Point::sptr C = (*m_pointList)[m_triangles[noTriangle][2]];
+    lengths[0] = A->distance(B);
+    lengths[1] = B->distance(C);
+    lengths[2] = C->distance(A);
+    return lengths;
+}
+
+bool arlCore::Mesh::simplify( void )
+{
+#ifndef ANN
+    return false;
+#else // ANN
+    unsigned int i, j;
+    const unsigned int Size = m_pointList->visibleSize();
+    const unsigned int Dimension = m_pointList->getDimension();
+    ANNpointArray ANNPoints = annAllocPts( Size, Dimension );
+    for( i=0 ; i<m_pointList->size() ; ++i )
+        for( j=0 ; j<Dimension ; ++j )
+            ANNPoints[i][j]=(*m_pointList)[i]->get(j);
+    const int BucketSize = 1;
+    ANNkd_tree* ANNtree = new ANNkd_tree( ANNPoints, Size, Dimension, BucketSize, ANN_KD_SL_MIDPT );
+    const double Epsilon = 1e-8;// Error bound
+    const double SquaredEpsilon = Epsilon*Epsilon;
+    ANNpoint ANNPt = annAllocPt(Dimension); // Query point
+    const unsigned int NbNeighbors = 20;
+    ANNidxArray Nn_idx = new ANNidx[NbNeighbors]; // near neighbor indices
+    ANNdistArray SquaredDists = new ANNdist[NbNeighbors]; // near neighbor distances
+    for( i=0 ; i<m_pointList->size() ; ++i )
+        if((*m_pointList)[i]->isVisible())
+        {
+            std::vector<unsigned int> oldIndex;
+            for( j=0 ; j<Dimension; ++j )
+                ANNPt[j] = (*m_pointList)[i]->get(j);
+            ANNtree->annkSearch( ANNPt, NbNeighbors, Nn_idx, SquaredDists, Epsilon );
+            // Cherche points les plus proches
+            for( j=0 ; j<NbNeighbors ; ++j )
+                if(SquaredDists[j]<=SquaredEpsilon)
+                {
+                     releasePoint(Nn_idx[j]);
+                     oldIndex.push_back(Nn_idx[j]);
+                }
+            replacePointIndex(oldIndex, i);
+        }
+    delete ANNtree;
+    annDeallocPt( ANNPt );
+    annDeallocPts( ANNPoints );
+    delete[] Nn_idx;
+    delete[] SquaredDists;
+    annClose();
+    return true;
+#endif // ANN
+}
+
+unsigned int arlCore::Mesh::replacePointIndex( std::vector<unsigned int> oldIndex, unsigned int newIndex )
+{   // Replace in m_triangles values of oldIndex by newIndex
+    unsigned int i, j, k, n=0;
+    const unsigned int OldIndexSize = (unsigned int)oldIndex.size();
+    for( i=0 ; i<m_triangles.size() ; ++i )
+        for( j=0 ; j<OldIndexSize ; ++j )
+            for( k=0 ; k<3 ; ++k )
+                if(m_triangles[i][k]==oldIndex[j])
+                    m_triangles[i][k] = newIndex;
+    return n;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Misc.cpp b/SrcLib/ARLcore/src/arlcore/Misc.cpp
new file mode 100644
index 0000000..0684b29
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Misc.cpp
@@ -0,0 +1,1383 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Misc.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif //_WIN32
+
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+#include <fstream>
+
+#include <vcl/vcl_limits.h>
+
+#include <vnl/vnl_math.h>
+#include <vnl/vnl_cross.h>
+#include <vnl/algo/vnl_levenberg_marquardt.h>
+#include <vnl/algo/vnl_powell.h>
+
+#include <vgl/vgl_vector_3d.h>
+#include <vgl/vgl_line_2d.h>
+#include <vgl/vgl_box_3d.h>
+#include <vgl/vgl_intersection.h>
+
+#include <arlcore/vnl_rigid_vector.h>
+#include <arlcore/Optimization.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/File.h>
+
+unsigned int arlCore::fillGrid( arlCore::PointList::sptr pl, unsigned int nbPointsX, double squareSizeX, unsigned int nbPointsY, double squareSizeY, unsigned int nbPointsZ, double squareSizeZ )
+{
+/*  case  72 : chess[0]= 9;chess[1]=10;chess[2]= 4;chess[3]= 4;break;
+    case 132 : chess[0]=12;chess[1]=13;chess[2]=10;chess[3]=10;break;
+    case 140 : chess[0]=11;chess[1]=15;chess[2]=10;chess[3]=10;break;
+    case 192 : chess[0]=13;chess[1]=17;chess[2]=20;chess[3]=20;break;
+    case 462 : chess[0]=23;chess[1]=22;chess[2]=10;chess[3]=10;break;
+    case 418 : chess[0]=23;chess[1]=20;chess[2]=10;chess[3]=10;break;
+    case 825 : chess[0]=26;chess[1]=34;chess[2]=10;chess[3]=10;break;
+    // Mires robotique
+    case 667 : chess[0]=30;chess[1]=24;chess[2]=5;chess[3]=5;break;
+    case 154 : chess[0]=12;chess[1]=15;chess[2]=10;chess[3]=10;break;*/
+    pl->clear();
+    pl->setDimension(3);
+    unsigned int x, y, z;
+    for( z=0 ; z<nbPointsZ ; ++z )
+        for( y=0 ; y<nbPointsY ; ++y )
+            for( x=0 ; x<nbPointsX ; ++x )
+                pl->push_back(x*squareSizeX, y*squareSizeY, z*squareSizeZ);
+    return pl->size();
+}
+
+bool arlCore::plot( const std::vector< const arlCore::PointList* > &pl, const std::string &options )
+{
+    if(pl.size()<1) return false;
+    const bool JustVisible = false;
+    const bool Overwrite = true;
+    const std::string Title = "PointList";
+    unsigned int i;
+    std::fstream file;
+    file.open (TMP_FILE, std::fstream::out);
+    if(!file.is_open()) return false;
+    file<<"set title '"<<Title<<"'\n";
+    file<<options<<"\n";
+    if(pl[0]->getDimension()==3) file<<"s";
+    file<<"plot";
+    for( i=0 ; i<pl.size() ; ++i )
+    {
+        std::stringstream ss;
+        ss<<"Gnuplot-"<<i<<".dat";
+        if(pl[i]) pl[i]->save(ss.str(), ARLCORE_POINT_SAVE_GNUPLOT, JustVisible, Overwrite);
+        if(i==0) file<<" "; else file<<",";
+        file<<"\""<<ss.str()<<"\"";
+    }
+    file<<"\npause -1 \"Hit return to continue\"\n";
+    file.close();
+    system(GNUPLOT_EXE);
+    //exec(GNUPLOT_EXE, TMP_FILE );
+    return true;
+}
+
+unsigned int arlCore::nbPolynomialParameters( unsigned int degree, unsigned int nbEquations )
+{
+    return (degree+1)*(degree+2)*(degree+3)*nbEquations/6;
+}
+
+bool arlCore::computePolynomial( unsigned int degree, const vnl_vector<double> &parameters, const vnl_vector<double> &data, vnl_vector<double> &result )
+{
+    if(degree<1) return false;
+    const unsigned int NbEquations = 3;
+    const unsigned int NbParameters = nbPolynomialParameters(degree, NbEquations);
+    if(NbParameters!=parameters.size()) return false;
+    if(data.size()!=NbEquations) return false;
+    result.set_size(NbEquations);
+    result.fill(0.0);
+    unsigned int i, j, k, l, m=0;
+    for( i=0 ; i<=degree ; ++i )
+        for( j=0 ; j<=degree ; ++j )
+            for( k=0 ; k<=degree ; ++k )
+                if( i+j+k<=degree )
+                {
+                    for( l=0 ; l<NbEquations ; ++l )
+                    {
+                        assert(m+l<NbParameters);
+                        result[l] += parameters[m+l]*pow(data[0],(int)i)*pow(data[1],(int)j)*pow(data[2],(int)k);
+                    }
+                    m += NbEquations;
+                }
+    return true;
+}
+
+double arlCore::vgl_distance_point( const vgl_line_3d_2_points<double> &line, const vgl_point_3d<double> &p0 )
+{   //http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
+    vgl_point_3d<double> p1 = line.point1();
+    vgl_point_3d<double> p2 = line.point2();
+    vnl_vector_fixed<double,3> x0, x1, x2;
+    x0[0]=p0.x(), x0[1]=p0.y(), x0[2]=p0.z();
+    x1[0]=p1.x(), x1[1]=p1.y(), x1[2]=p1.z();
+    x2[0]=p2.x(), x2[1]=p2.y(), x2[2]=p2.z();
+    vnl_vector_fixed<double,3> a = vnl_cross_3d(x2-x1, x1-x0);
+    vnl_vector_fixed<double,3> b = x2-x1;
+    return a.two_norm()/b.two_norm();
+}
+
+vgl_line_2d<double> arlCore::vglLine2d( double slope, double rho )
+{
+    // FIXME Slope = slope-Pi/2
+    const double a = cos(slope), b = sin(slope);
+    const double x0 = a*rho, y0 = b*rho;
+    vgl_point_2d<double> p1(x0 + 100.0*(-b), y0 + 100.0*(a));
+    vgl_point_2d<double> p2(x0 - 100.0*(-b), y0 - 100.0*(a));
+    return vgl_line_2d<double>(p1, p2);
+}
+
+unsigned int arlCore::computeNeedleROI( Point::csptr Tip, Point::csptr Top, unsigned int width, std::vector<arlCore::Point::sptr > &corners, unsigned int shape )
+{   // shape 0=Rectangular shape 1=Triangular
+    Point::sptr corner = Point::New();
+    corners.clear();
+    arlCore::Point::sptr center =  arlCore::Point::New((Tip->x()+Top->x())/2.0, (Tip->y()+Top->y())/2.0);
+    vgl_vector_2d<double> tip2top(Top->x()-Tip->x(), Top->y()-Tip->y());
+    vgl_vector_2d<double> rot = rotated(tip2top, vnl_math::pi/2.0);
+    const vgl_vector_2d<double> Tip2corner = width * normalize(rot);
+    // First corner, orthogonal with the axis of the needle (Tip Right)
+    corner->x(Tip->x() + Tip2corner.x_);
+    corner->y(Tip->y() + Tip2corner.y_);
+    corners.push_back(corner);
+    // Second corner, central symmetry of first corner with Tip (Tip Left)
+    corner->x(2.0*Tip->x() - corners[0]->x());
+    corner->y(2.0*Tip->y() - corners[0]->y());
+    corners.push_back(corner);
+    switch(shape)
+    {
+        case 0: // Rectangular shape
+            // Third corner, central symmetry of first corner with Center of line Tip-Top (Top Left)
+            corner->x(2.0*center->x() - corners[0]->x());
+            corner->y(2.0*center->y() - corners[0]->y());
+            corners.push_back(corner);
+            // Fourth corner, central symmetry of 2st corner with Center of line Tip-Top (Top Right)
+            corner->x(2.0*center->x() - corners[1]->x());
+            corner->y(2.0*center->y() - corners[1]->y());
+            corners.push_back(corner);
+            break;
+        case 1: // Triangular shape
+            // Third corner, Top (Top Center)
+            corner->x(Top->x());
+            corner->y(Top->y());
+            corners.push_back(corner);
+            break;
+    }
+    return (unsigned int)corners.size();
+}
+/*
+double arlCore::computeVideo1Robot( const std::vector< arlCore::vnl_rigid_matrix > &M06, PointList::csptr tip, vnl_rigid_matrix &T, double &distance, double &stdDev )
+{
+    OptimiseVideoRobot1 OVR( M06, tip );
+    vnl_powell computeT( &OVR );
+    vnl_rigid_vector V( T );
+    vnl_vector<double> solution(6);
+    unsigned int i;
+    for( i=0 ; i<6 ; ++i )
+        solution[i] = V[i];
+    computeT.minimize( solution );
+    distance = OVR.getDistance();
+    stdDev = OVR.getStdDev();
+    for( i=0 ; i<6 ; ++i )
+        V[i] = solution[i];
+    T = V;
+    return distance;
+}*/
+
+
+double arlCore::computeVideo2RobotX(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &Z,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &X )
+{
+    const bool Verbose = false;
+    unsigned int i, j;
+    // POWELL VERSION
+//  arlCore::OptimiseVideoRobotX OVR( M06, Z, model3D, cams, points2DList );
+//  vnl_powell Optimizer( &OVR );
+    // LEVENBERG MARQUARDT VERSION
+    unsigned int number_of_residuals = 0;
+    for( i=0 ; i<model3D.size() ; ++i )
+        for( j=0 ; j<model3D[i].size() ; ++j )
+            number_of_residuals += model3D[i][j]->size();
+    arlCore::OptimiseVideoRobotX_LS OVR( M06, Z, model3D, cams, points2DList, number_of_residuals, vnl_least_squares_function::use_gradient );
+    vnl_levenberg_marquardt Optimizer( OVR );
+    Optimizer.set_trace(true);
+//  Optimizer.set_check_derivatives(1);
+    Optimizer.set_f_tolerance(1e-6);
+    Optimizer.set_x_tolerance(1e-8);
+    Optimizer.set_g_tolerance(1e-6);
+    if(Verbose)
+    {
+        std::cerr<<"f tolerance ="<<Optimizer.get_f_tolerance()<<std::endl;
+        std::cerr<<"x tolerance ="<<Optimizer.get_x_tolerance()<<std::endl;
+        std::cerr<<"g tolerance ="<<Optimizer.get_g_tolerance()<<std::endl;
+        std::cerr<<"check derivative="<<Optimizer.get_check_derivatives()<<std::endl;
+    }
+    //********
+    vnl_rigid_vector V( X );
+    vnl_vector<double> solution(6);
+    for( i=0 ; i<6 ; ++i )
+        solution[i] = V[i];
+    //Optimizer.minimize( solution ); // POWELL VERSION
+    Optimizer.minimize_using_gradient( solution ); // LM VERSION
+    const double StartError = Optimizer.get_start_error();
+    const double EndError = Optimizer.get_end_error();
+    const double NbEvaluations = Optimizer.get_num_evaluations();
+    const double GetError = OVR.getError();
+    OVR.criterion(X,Z);
+    const double Criterion = OVR.getError();
+    if(Verbose)
+    {
+        std::cout<<"Start error = "<<StartError<<"\n";
+        std::cout<<"End error = "<<EndError<<"\n";
+        std::cout<<"Get error = "<<GetError<<"\n";
+        std::cout<<"Criterion = "<<Criterion<<"\n";
+        std::cout<<"Nb evaluations = "<<NbEvaluations<<"\n";
+    }
+    for( i=0 ; i<6 ; ++i )
+        V[i] = solution[i];
+    X = V;
+    return Criterion;
+}
+
+double arlCore::computeVideo2RobotZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &X,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &Z )
+{
+    const bool Verbose = false;
+    unsigned int i, j;
+    // POWELL VERSION
+//  arlCore::OptimiseVideoRobotZ OVR( M06, X, model3D, cams, points2DList );
+//  vnl_powell Optimizer( &OVR );
+    // LEVENBERG MARQUARDT VERSION
+    unsigned int number_of_residuals = 0;
+    for( i=0 ; i<model3D.size() ; ++i )
+        for( j=0 ; j<model3D[i].size() ; ++j )
+            number_of_residuals += model3D[i][j]->size();
+    arlCore::OptimiseVideoRobotZ_LS OVR( M06, X, model3D, cams, points2DList, number_of_residuals, vnl_least_squares_function::use_gradient );
+    vnl_levenberg_marquardt Optimizer( OVR );
+    Optimizer.set_trace(true);
+//  Optimizer.set_check_derivatives(1);
+    Optimizer.set_f_tolerance(1e-6);
+    Optimizer.set_x_tolerance(1e-8);
+    Optimizer.set_g_tolerance(1e-6);
+    if(Verbose)
+    {
+        std::cerr<<"f tolerance ="<<Optimizer.get_f_tolerance()<<std::endl;
+        std::cerr<<"x tolerance ="<<Optimizer.get_x_tolerance()<<std::endl;
+        std::cerr<<"g tolerance ="<<Optimizer.get_g_tolerance()<<std::endl;
+        std::cerr<<"check derivative="<<Optimizer.get_check_derivatives()<<std::endl;
+    }
+    //********
+    vnl_rigid_vector V( Z );
+    vnl_vector<double> solution(6);
+    for( i=0 ; i<6 ; ++i )
+        solution[i] = V[i];
+    //Optimizer.minimize( solution ); // POWELL VERSION
+    Optimizer.minimize_using_gradient( solution ); // LM VERSION
+    const double StartError = Optimizer.get_start_error();
+    const double EndError = Optimizer.get_end_error();
+    const double NbEvaluations = Optimizer.get_num_evaluations();
+    const double GetError = OVR.getError();
+    OVR.criterion(X,Z);
+    const double Criterion = OVR.getError();
+    if(Verbose)
+    {
+        std::cout<<"Start error = "<<StartError<<"\n";
+        std::cout<<"End error = "<<EndError<<"\n";
+        std::cout<<"Get error = "<<GetError<<"\n";
+        std::cout<<"Criterion = "<<Criterion<<"\n";
+        std::cout<<"Nb evaluations = "<<NbEvaluations<<"\n";
+    }
+    for( i=0 ; i<6 ; ++i )
+        V[i] = solution[i];
+    Z = V;
+    return Criterion;
+}
+
+double arlCore::computeVideo2RobotXZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        arlCore::vnl_rigid_matrix &X,
+        arlCore::vnl_rigid_matrix &Z )
+{
+    const bool Verbose = false;
+    unsigned int i, j;
+    // POWELL VERSION
+//  arlCore::OptimiseVideoRobotXZ OVR( M06, model3D, cams, points2DList );
+//  vnl_powell Optimizer( &OVR );
+
+    // LEVENBERG MARQUARDT VERSION
+    unsigned int number_of_residuals = 0;
+    for( i=0 ; i<model3D.size() ; ++i )
+        for( j=0 ; j<model3D[i].size() ; ++j )
+            number_of_residuals += model3D[i][j]->size();
+    arlCore::OptimiseVideoRobotXZ_LS OVR( M06, model3D, cams, points2DList, number_of_residuals, vnl_least_squares_function::use_gradient );
+    vnl_levenberg_marquardt Optimizer( OVR );
+    Optimizer.set_trace(true);
+//  Optimizer.set_check_derivatives(1);
+    Optimizer.set_f_tolerance(1e-6);
+    Optimizer.set_x_tolerance(1e-8);
+    Optimizer.set_g_tolerance(1e-6);
+    if(Verbose)
+    {
+        std::cerr<<"f tolerance ="<<Optimizer.get_f_tolerance()<<std::endl;
+        std::cerr<<"x tolerance ="<<Optimizer.get_x_tolerance()<<std::endl;
+        std::cerr<<"g tolerance ="<<Optimizer.get_g_tolerance()<<std::endl;
+        std::cerr<<"check derivative="<<Optimizer.get_check_derivatives()<<std::endl;
+    }
+    //********
+    vnl_rigid_vector VX( X );
+    vnl_rigid_vector VZ( Z );
+    vnl_vector<double> solution(12);
+    for( i=0 ; i<6 ; ++i )
+    {
+        solution[i] = VX[i];
+        solution[i+6] = VZ[i];
+    }
+    //Optimizer.minimize( solution ); // POWELL VERSION
+    Optimizer.minimize_using_gradient( solution ); // LM VERSION
+    for( i=0 ; i<6 ; ++i )
+    {
+        VX[i] = solution[i];
+        VZ[i] = solution[i+6];
+    }
+    X = VX;
+    Z = VZ;
+    const double StartError = Optimizer.get_start_error();
+    const double EndError = Optimizer.get_end_error();
+    const double NbEvaluations = Optimizer.get_num_evaluations();
+    const double GetError = OVR.getError();
+    OVR.criterion(X,Z);
+    const double Criterion = OVR.getError();
+    if(Verbose)
+    {
+        std::cout<<"Start error = "<<StartError<<"\n";
+        std::cout<<"End error = "<<EndError<<"\n";
+        std::cout<<"Get error = "<<GetError<<"\n";
+        std::cout<<"Criterion = "<<Criterion<<"\n";
+        std::cout<<"Nb evaluations = "<<NbEvaluations<<"\n";
+    }
+    return Criterion;
+}
+
+
+// arlRandom
+std::vector< double> arlRandom::Random::m_randomTable;
+long int arlRandom::Random::m_index = 0;
+
+long int arlRandom::Random::initRandom( const std::string &filename, long int max )
+{
+    m_randomTable.clear();
+    m_index = 0;
+    std::fstream file;
+    file.open( filename.c_str(), std::fstream::in);
+    if(file.is_open())
+    {
+        double value = 0;
+        while(!file.eof() && (max<=0 || m_randomTable.size()<max))
+        {
+            file>>value;
+            m_randomTable.push_back(value);
+//          std::cout<<m_randomTable.size()<<" "<<value<<"\n";
+        }
+        file.close();
+    }
+    if(m_randomTable.size()>0) return 0;
+    else return privateRndInit();
+}
+
+long int arlRandom::Random::initRandom( long int seed )
+{
+    m_randomTable.clear();
+    return privateRndInit( seed );
+}
+
+double arlRandom::Random::uniformDoubleRnd( double min, double max )
+{
+    return privateUniformDoubleRnd( min, max );
+}
+
+int arlRandom::Random::uniformIntRnd( int min, int max )
+{
+    return privateUniformIntRnd( min, max );
+}
+
+double arlRandom::Random::gaussianRnd( double std )
+{
+    return privateGaussianRnd( std );
+}
+
+unsigned int arlRandom::Random::generate( long int seed, const std::string &filename, long int n )
+{
+    if(n<1) return 0;
+    std::ofstream file;
+    file.open(filename.c_str(), std::fstream::out);
+    if(!file.is_open()) return 0;
+    srand(seed);
+    long int i;
+    for( i=0 ; i<n-1 ; ++i )
+        file<<rand()<<"\n";
+    file<<rand();
+    file.close();
+    return n;
+}
+
+double arlRandom::Random::privateRand( void )
+{
+    if(m_randomTable.size()>0)
+    {
+        const double Value = m_randomTable[m_index];
+        ++m_index;
+        if(m_index>=(long int)m_randomTable.size()) m_index = 0;
+        return Value;
+    }else return rand();
+}
+
+long int arlRandom::Random::privateRndInit(long int seed)
+{   // TODO : Remplacer par vnl_random
+    long int f;
+    if(seed==0) f=(long int)time(NULL);
+    else f=seed;
+    srand(f);
+    return f;
+}
+
+double arlRandom::Random::privateUniformDoubleRnd( double min, double max )
+{
+    assert(min<=max);
+    const double r = privateRand();
+    const double d = RAND_MAX ;//+ 1.0;
+    const double rnd = min+(max-min)*r/d;
+    assert(rnd>=min && rnd<=max);
+    return rnd;
+}
+
+int arlRandom::Random::privateUniformIntRnd( int min, int max )
+{
+    assert(min<=max);
+    const double r = uniformDoubleRnd( (double)min, (double)max );
+    int rnd;
+    if(r<0) rnd = (int)ceil(r-0.5);
+    else rnd = (int)floor(r+0.5);
+    assert(rnd>=min && rnd<=max);
+    return rnd;
+}
+
+double arlRandom::Random::privateGaussianRnd( double std )
+{
+// cde essaye avec la librairie libpdf
+// vnl_vector<double> noise_sample( 1 );
+// pdf1d_gaussian noise_model(mean, variance);
+// pdf1d_gaussian_sampler noise_generator;
+// noise_generator.set_model(noise_model);
+// noise_generator.get_samples(noise_sample);
+// return noise_sample(0);
+    return(std*sqrt(-2.0*log(uniformDoubleRnd(1e-15,1.0)))*cos(2*vnl_math::pi*uniformDoubleRnd(1e-15,1.0)));
+}
+
+unsigned int arlRandom::randomIndex( unsigned int n, std::vector<unsigned int> &v, unsigned int m )
+{
+    unsigned int i, tmp, r;
+    if(m<n && m>0) r=m+1;   else r=n;
+    const unsigned int Max = n-1;
+    v.clear();
+    for( i=0 ; i<n ; ++i )
+        v.push_back(i);
+    for( i=0 ; i<r-1 ; ++i )
+    {
+        unsigned int index = arlRandom::Random::uniformIntRnd( i, Max );
+        if(index>i)
+        {
+            tmp = v[i];
+            v[i] = v[index];
+            v[index] = tmp;
+        }
+    }
+    return n;
+}
+
+// arlTime
+long int arlTime::getNowDate( void )
+{   // TODO : use pt::now();
+    return (long int)time(NULL);
+}
+
+long int arlTime::getNowTime( void )
+{   // TODO : use pt::now();
+    return (long int)((double)clock() / (double)CLK_TCK * 10000);
+}
+
+bool arlTime::sleep( double time )
+{
+#ifdef _WIN32
+    Sleep(time);
+#else
+    sleep(time);
+#endif
+    return true;
+}
+
+// arlString
+unsigned int arlString::replace( std::string &s, char org, char dst )
+{
+    unsigned int n=0;
+    if(org==dst) return n;
+    size_t found;
+    std::stringstream orgS, dstS;
+    orgS<<org;
+    dstS<<dst;
+    found=s.find_last_of(orgS.str());
+    while(found!=std::string::npos)
+    {
+        s.replace(found,1,dstS.str());
+        found=s.find_last_of(orgS.str());
+    }
+    return n;
+}
+
+bool arlString::splitFilename( const std::string &path, std::string &folder, std::string &fullFileName, std::string &ext )
+{
+    size_t found;
+    found=path.find_last_of("/\\");
+    if(found==std::string::npos)
+    {
+        folder = "";
+        fullFileName = path;
+    }
+    else
+    {
+        folder = path.substr(0,found);
+        fullFileName = path.substr(found+1);
+    }
+    found=fullFileName.find_last_of(".");
+    if(found==std::string::npos) ext = "";
+    else ext = fullFileName.substr(found+1);
+    return true;
+}
+
+bool arlString::extractExt( const std::string &path, std::string &ext )
+{
+    size_t found;
+    found=path.find_last_of(".");
+    if(found==std::string::npos) ext = "";
+    else ext = path.substr(found+1);
+    return true;
+}
+
+void arlString::getFullDateString( long int date, std::string &s, char separator )
+{
+    char name[19+1];
+    time_t tt = (time_t)date;
+    struct tm *t = localtime(&tt);
+    // TODO Use setfill ('0')<<setw(2) with std::stringstream
+    sprintf(name,"%04d%c%02d%c%02d%c%02d%c%02d%c%02d", t->tm_year+1900, separator, t->tm_mon+1, separator, t->tm_mday, separator, t->tm_hour, separator, t->tm_min, separator, t->tm_sec);
+    s = name;
+}
+
+void arlString::getDateString( long int date, std::string &s, char separator )
+{
+    char name[10+1];
+    time_t tt = (time_t)date;
+    struct tm *t = localtime(&tt);
+    // TODO Use setfill ('0')<<setw(2) with std::stringstream
+    sprintf(name,"%04d%c%02d%c%02d", t->tm_year+1900, separator, t->tm_mon+1, separator, t->tm_mday);
+    s = name;
+}
+
+void arlString::getTimeString( long int date, std::string &s, char separator )
+{
+    char name[8+1];
+    time_t tt = (time_t)date;
+    struct tm *t = localtime(&tt);
+    // TODO Use setfill ('0')<<setw(2) with std::stringstream
+    sprintf(name,"%02d%c%02d%c%02d", t->tm_hour, separator, t->tm_min, separator, t->tm_sec);
+    s = name;
+}
+
+template<typename T>
+bool convert(const std::string &s, T &obj)
+{
+    std::istringstream is(s);
+    return is >> obj;
+}
+
+bool arlString::valueOf(const std::string &s, unsigned int &obj)
+{
+    return convert(s,obj);
+}
+
+bool arlString::valueOf(const std::string &s, int &obj)
+{
+    return convert(s,obj);
+}
+
+bool arlString::valueOf(const std::string &s, double &obj)
+{
+    return convert(s,obj);
+}
+
+unsigned int arlString::extractDoubles( const std::string &s, std::vector<double> &v, char separator )
+{
+    v.clear();
+    if(s=="") return 0;
+    unsigned int pos = (unsigned int)s.find_last_of(separator);
+    if( pos==std::string::npos ) pos=0; else pos++;
+    if( pos>0 ) extractDoubles(s.substr(0,pos-1),v,separator);
+    // TODO Use convert
+    double d;
+    if( pos<s.length() && convert(s.substr(pos),d) ) v.push_back(d);
+    //if(pos<s.length()) v.push_back(atof(s.substr(pos).c_str()));
+    return (unsigned int)v.size();
+}
+
+unsigned int arlString::extractInts( const std::string &s, std::vector<int> &v, char separator )
+{
+    v.clear();
+    std::vector<double> vd;
+    unsigned int i, n=extractDoubles(s,vd,separator);
+    for( i=0 ; i<n ; i++ )
+        v.push_back((int)vd[i]);
+    return n;
+}
+
+unsigned int arlString::extractUInts( const std::string &s, std::vector<unsigned int> &v, char separator )
+{
+    v.clear();
+    std::vector<double> vd;
+    unsigned int i, n=extractDoubles(s,vd,separator);
+    for( i=0 ; i<n ; i++ )
+        v.push_back((unsigned int)vd[i]);
+    return n;
+}
+
+unsigned int arlString::extractBools( const std::string &s, std::vector<bool> &v, char separator )
+{
+    v.clear();
+    std::vector<double> vd;
+    unsigned int i, n=extractDoubles(s,vd,separator);
+    for( i=0 ; i<n ; i++ )
+        v.push_back(vd[i]>0);
+    return n;
+}
+
+bool arlString::extractIP( const std::string &s, unsigned int &IP1, unsigned int &IP2, unsigned int &IP3, unsigned int &IP4 )
+{
+    std::vector<unsigned int> v;
+    unsigned int n=extractUInts(s,v,'.');
+    if(n!=4) return false;
+    IP1 = v[0];
+    IP2 = v[1];
+    IP3 = v[2];
+    IP4 = v[3];
+    return true;
+}
+
+bool arlString::extractIP( const std::string &s, std::string &IP, unsigned int &port )
+{   // "192.168.3.69/8089"
+    if(s=="") return false;
+    unsigned int IP1, IP2, IP3, IP4, p=port, pos = (unsigned int)s.find_last_of('/');
+    if( pos==std::string::npos ) IP = s;
+    else
+    {
+        IP = s.substr(0,pos);
+        if(valueOf(s.substr(pos+1), p)) port=p;
+    }
+    return(extractIP(IP, IP1, IP2, IP3, IP4));
+}
+
+// arlFile
+bool arlFile::fileExist( const std::string &s )
+{
+    std::ifstream file;
+    file.open(s.c_str(), std::ifstream::in);
+    bool b=file.is_open();
+    file.close();
+    return b;
+}
+
+bool arlFile::mkdir( const std::string &s )
+{
+    std::string dir = s;
+    std::stringstream ss;
+    //FIXME for LINUX version
+    arlString::replace( dir, '/', '\\' );
+    ss<<"mkdir "<<dir;
+    system(ss.str().c_str());
+    return true;
+}
+
+bool arlFile::fileCopy( const std::string &OriginFilename, const std::string &DestinationFilename )
+{
+    std::string f1 = OriginFilename, f2 = DestinationFilename;
+    std::stringstream ss;
+    //FIXME for LINUX version
+    arlString::replace( f1, '/', '\\' );
+    arlString::replace( f2, '/', '\\' );
+    ss<<"copy "<<f1<<" "<<f2<<" /Y >system.txt";
+    system(ss.str().c_str());
+    return true;
+/*
+    std::ifstream inFile;
+    inFile.open(OriginFilename.c_str(), std::ifstream::in);
+    if(!inFile.is_open()) return false;
+    std::ofstream outFile;
+    outFile.open(DestinationFilename.c_str(), std::ifstream::out);
+    if(!outFile.is_open())
+    {
+        inFile.close();
+        return false;
+    }
+    inFile.seekg(0, std::ifstream::end);
+    const long BufferSize = inFile.tellg();
+    inFile.seekg(0);
+    char* buffer = new char[BufferSize];
+    inFile.read(buffer, BufferSize);
+    outFile.write(buffer, BufferSize);
+    outFile.close();
+    inFile.close();
+    delete[] buffer;
+    return true;*/
+}
+
+bool arlFile::convertTrianToVtk( const std::string &trianFilename, const std::string &vtkFilename )
+{
+    unsigned int i, nbPts, nbCells;
+    int a, b, c, d, e, f;
+    double x,y,z;
+    std::fstream fin, fout;
+    fin.open(trianFilename.c_str(), std::fstream::in);
+    if(!fin.is_open())
+    {
+        std::cerr<<"Trian file Loading error : "<<trianFilename<<"\n";
+        return false;
+    }
+    fout.open(vtkFilename.c_str(), std::fstream::out);
+    if(!fout.is_open())
+    {
+        std::cerr<<"VTK file Loading error : "<<vtkFilename<<"\n";
+        return false;
+    }
+    fin>>nbPts;
+    fout<<"# vtk DataFile Version 1.0\nFileName\nASCII\n\n";
+    //fout<<DATASET UNSTRUCTURED_GRID";
+    fout<<"DATASET POLYDATA";
+    fout<<"\nPOINTS "<<nbPts<<" double\n";
+    for( i=0 ; i<nbPts ; ++i )
+    {
+        fin>>x>>y>>z;
+        fout<<x<<" "<<y<<" "<<z<<"\n";
+    }
+    fin>>nbCells;
+    //fout<<"\nCELLS ";
+    fout<<"\nPOLYGONS ";
+    fout<<nbCells<<" "<<nbCells*4<<"\n";
+    for( i=0 ; i<nbCells ; ++i )
+    {
+        fin>>a>>b>>c>>d>>e>>f;
+        fout<<"3 "<<a<<" "<<b<<" "<<c<<"\n";
+    }
+/*  fout<<"\nCELLS_TYPES "<<nbCells<<"\n";
+    for( i=0 ; i<nbCells ; ++i )
+        fout<<"5\n";*/
+    return true;
+}
+
+bool arlSound::play( double frequency, double time )
+{
+#ifdef _WIN32
+    Beep( frequency, time );
+#else //_WIN32
+    std::cout<<"\a";
+#endif //_WIN32
+    return true;
+}
+
+unsigned int arlCore::save( const std::vector<double> &doubles, const std::string &fileName, bool overwrite )
+{
+    if(doubles.size()<1) return 0;
+    unsigned int i=0;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return 0;
+    f.open (fileName.c_str(), std::fstream::out);
+    if(f.is_open())
+        for( ; i<doubles.size() ; ++i )
+            f<<doubles[i]<<"\n";
+    f.close();
+    f.flush();
+    return i;
+}
+
+unsigned int arlCore::save( const std::vector< vnl_vector<double> > &q, vnl_vector<double> ratio, const std::vector< std::string > &names, const std::string &fileName, bool overwrite )
+{
+    if(q.size()<1) return 0;
+    unsigned int i=0;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return 0;
+    f.open (fileName.c_str(), std::fstream::out);
+    if(f.is_open())
+    {
+        f<<"FileType Vectors\nVersion 1.0\n\n";
+        f<<"Ratio "<<ratio.size()<<"\n"<<ratio<<"\n";
+        for( ; i<q.size() ; ++i )
+        {
+            if(names.size()>i) f<<"\nName "<<names[i]<<"\n";
+            f<<"Vector "<<q[i].size()<<"\n"<<q[i]<<"\n";
+        }
+    }
+    f.close();
+    f.flush();
+    return i;
+}
+
+unsigned int arlCore::save( const std::vector< vnl_vector<double> > &q, const std::string &fileName, bool overwrite )
+{
+    if(q.size()<1) return 0;
+    unsigned int i=0;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return 0;
+    f.open (fileName.c_str(), std::fstream::out);
+    if(f.is_open())
+    {
+        f<<"FileType Vectors\nVersion 1.0\n\n";
+        for( ; i<q.size() ; ++i )
+            f<<"Vector "<<q[i].size()<<"\n"<<q[i]<<"\n";
+    }
+    f.close();
+    f.flush();
+    return i;
+}
+
+unsigned int arlCore::load( std::vector< vnl_vector<double> >&v, std::vector<std::string>&names, const std::string &filename )
+{
+    if(filename=="") return 0;
+    unsigned int i;
+    arlCore::File config(filename, "Vectors");
+    std::string name="";
+    vnl_vector<double> q, ratio, offset;
+    v.clear();
+    const double Version = config.readHeader();
+    if(Version>0.0)
+    {
+        std::string token;
+        while(config.getToken(token))
+        {
+            if(token=="Name") config.get(name);
+            if(token=="Offset")
+                config.get(offset);
+            if(token=="Ratio")
+                if(!config.get(ratio))
+                {
+                    ratio.set_size(1);
+                    ratio.fill(1.0);
+                }
+            if(token=="Vector")
+                if(config.get(q))
+                {
+                    for( i=0 ; i<offset.size() && i<q.size() ; ++i )
+                        q[i] += offset[i];
+                    if(ratio.size()==1)
+                        q *= ratio[0];
+                    if(ratio.size()>1)
+                        for( i=0 ; i<ratio.size() && i<q.size() ; ++i )
+                            q[i] *= ratio[i];
+                    v.push_back(q);
+                    names.push_back(name);
+                    name="";
+                }
+        }
+    }
+    config.close();
+    return (unsigned int)v.size();
+}
+
+unsigned int arlCore::load( std::vector< vnl_vector<double> >&v, const std::string &filename )
+{
+    std::vector<std::string> names;
+    return arlCore::load(v, names, filename);
+}
+
+unsigned int arlCore::load( std::vector< std::string >&v, const std::string &filename )
+{
+    if(filename=="") return 0;
+    std::string path, folder, file, ext;
+    arlString::splitFilename( filename, folder, file, ext );
+    arlCore::File config(filename, "Filenames");
+    const double Version = config.readHeader();
+    std::string name, string;
+    v.clear();
+    if(Version>0.0)
+    {
+        std::string token;
+        while(config.getToken(token))
+        {
+            if(token=="Name") config.get(name);
+            if(token=="Filename")
+                if(config.get(string))
+                {
+                    std::stringstream ss;
+                    if(folder!="") ss<<folder<<"/"<<string;
+                    else ss<<string;
+                    v.push_back(ss.str());
+                }
+        }
+    }
+    config.close();
+    return (unsigned int)v.size();
+}
+
+bool arlCore::save( const vnl_matrix<double>& matrix, const std::string &fileName, bool overwrite )
+{
+    if(matrix.size()<1) return false;
+    unsigned int i, j;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    f.open (fileName.c_str(), std::fstream::out);
+    if(f.is_open())
+    {
+        f<<"FileType Matrix\nVersion 1.0\n\n";
+        f<<"Matrix "<<matrix.rows()<<" "<<matrix.cols()<<"\n";
+        for( i=0 ; i<matrix.rows() ; ++i )
+        {
+            for( j=0 ; j<matrix.cols() ; ++j )
+                f<<matrix.get(i, j)<<" ";
+            f<<"\n";
+        }
+    }
+    f<<"End\n";
+    f.close();
+    f.flush();
+    return true;
+}
+
+bool arlCore::load( vnl_matrix<double>& matrix, const std::string &fileName )
+{
+    if(fileName=="") return false;
+    unsigned int i, j;
+    arlCore::File config(fileName, "Matrix");
+    const double Version = config.readHeader();
+    bool b = false;
+    if(Version>0.0)
+    {
+        std::string token;
+        while(config.getToken(token))
+        {
+            if(token=="Matrix")
+            {
+                unsigned int rows, cols;
+                config.get(rows);
+                config.get(cols);
+                if(rows!=matrix.rows() || cols!=matrix.columns())
+                    return false;
+                for( i=0 ; i<rows ; ++i )
+                    for( j=0 ; j<cols ; ++j )
+                    {
+                        double value;
+                        if(!config.get(value)) return false;
+                        matrix.put(i, j, value);
+                    }
+                b = true;
+            }
+        }
+    }
+    config.close();
+    return b;
+}
+
+double arlCore::evaluationAXXB( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z,
+            const std::vector< vnl_rigid_matrix > &M06,
+            const std::vector< const Camera* > &videoCams,
+            const std::vector< std::vector<arlCore::PointList::csptr > > &models3DList,
+            const std::vector< std::vector<arlCore::PointList::csptr > > &points2DList,
+            std::vector< double > &errors)
+{
+//  for(int i=0 ; i<videoCams.size() ; ++i )
+//      videoCams[i]->print();
+    errors.clear();
+    const unsigned int NbPoses = (unsigned int)M06.size();
+    const unsigned int NbCams = (unsigned int)videoCams.size();
+    unsigned int i, j, k;
+    double n=0.0, RMS=0.0;
+    assert(models3DList.size()==NbCams);
+    const arlCore::vnl_rigid_matrix InvZ = Z.computeInverse();
+    arlCore::Point::sptr pt2D= arlCore::Point::New(2);
+    arlCore::Point::sptr pt3D = arlCore::Point::New(3);
+    for( i=0 ; i<NbPoses ; ++i )
+    {   // Compute T = inv( X . M06i . inv(Z) )
+        arlCore::vnl_rigid_matrix T = X * M06[i] * InvZ;
+        T.invert();
+        for( j=0 ; j<NbCams ; ++j )
+            if(videoCams[j]!=0)
+            {
+                if(i==0)
+                {
+                    assert(points2DList[j].size()==models3DList[j].size());
+                    if(points2DList[j].size()!=models3DList[j].size()) std::cerr<<"AxxBReproj_cost_function : assert(points2DList[j].size()==models3DList[j].size());\n";
+                }
+                assert( (points2DList[j][i])->size()== (models3DList[j][i])->size() );
+                if(  (points2DList[j][i])->size()!= (models3DList[j][i])->size() ) std::cerr<<"AxxBReproj_cost_function : assert(points2DList[j][i].size()==models3DList[j][i].size());\n";
+                for( k=0 ; k<(models3DList[j][i])->size() ; ++k )
+                {
+                    T.trf( (*(points2DList[j][i]))[k] , pt3D);
+                    if(!videoCams[j]->project3DPoint( pt3D, pt2D )) std::cerr<<"AxxBReproj_cost_function : Reprojection Error\n";
+                    else
+                    {
+                        const double Dist2 = (*(points2DList[j][i]))[k]->distance2(pt2D);
+                        errors.push_back(sqrt(Dist2));
+                        RMS += Dist2;
+                        ++n;
+                    }
+                }
+            }
+    }
+    if(n>0.0) RMS = sqrt(RMS/n);
+    return RMS;
+}
+
+unsigned int arlCore::statistic( const std::vector<double> &v, double &min, double &max, double &rms, double &mean, double &stddev, bool square )
+{
+    unsigned int i;
+    rms=0.0, mean=0.0, stddev=0.0;
+    const unsigned int Size = (unsigned int)v.size();
+    if(Size<1) return Size;
+    const double N = (double)Size;
+    double value, value2;
+    for( i=0 ; i<Size ; ++i )
+    {
+        if(square) value2 = v[i], value = sqrt(v[i]);
+        else value = v[i], value2 = v[i]*v[i];
+        if(i==0) min = value, max = value;
+        else
+        {
+            if(value<min) min=value;
+            if(value>max) max=value;
+        }
+        mean += value;
+        rms += value2;
+    }
+    rms = sqrt(rms/N);
+    mean /= N;
+    for( i=0 ; i<Size ; ++i )
+        if(square) stddev += (sqrt(v[i])-mean)*(sqrt(v[i])-mean);
+        else stddev += (v[i]-mean)*(v[i]-mean);
+    stddev = sqrt(stddev/N);
+    return Size;
+}
+
+double arlCore::addValue( vnl_vector_fixed<double,5>& stat, double error, bool square )
+{   // stat = { n ; min ; max ; sum(error) ; sum(error²) }
+    double err=error, err2=error;
+    if(square) err=sqrt(error);
+    else err2 = error*error;
+    stat[0]++; // n
+    if(stat[0]==1)
+    {
+        stat[1]=err;
+        stat[2]=err;
+    }else
+    {
+        if(err<stat[1]) stat[1]=err;
+        if(err>stat[2]) stat[2]=err;
+    }
+    stat[3] += err;
+    stat[4] += err2;
+    return error;
+}
+
+unsigned int arlCore::computeStat( const vnl_vector_fixed<double,5>& stat, double &min, double &max, double &mean, double &stdDev, double &RMS )
+{   // stat = { n ; min ; max ; sum(error) ; sum(error²) }
+    const double N = stat[0];
+    min = stat[1];
+    max = stat[2];
+    if(N>0)
+    {
+        mean = stat[3]/N;
+        stdDev = sqrt(stat[4]/N-stat[3]*stat[3]/(N*N));
+        RMS = sqrt(stat[4]/N);
+    }
+    else
+    {
+        mean = 0.0;
+        stdDev = 0.0;
+        RMS = 0.0;
+    }
+    return (unsigned int)N;
+}
+
+bool arlCore::save( const std::vector< arlCore::vnl_rigid_matrix > &v, const std::string &fileName, bool overwrite )
+{
+    std::fstream file;
+    unsigned int i;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    file.open(fileName.c_str(), std::fstream::out);
+    if(!file.is_open()) return false;
+    file<<"FileType MatrixList\n";
+    file<<"Version 1.0\n";
+    for( i=0 ; i<v.size() ; ++i )
+        v[i].save(file);
+    file.close();
+    return true;
+}
+
+bool arlCore::load( std::vector< arlCore::vnl_rigid_matrix > &v, const std::string &fileName, bool invert )
+{
+    if(fileName=="") return false;
+    std::fstream file;
+    file.open(fileName.c_str(), std::fstream::in);
+    if(!file.is_open())
+    {
+        std::cerr<<"MatrixList Loading error : "<<fileName<<"\n";
+        return false;
+    }
+    unsigned int n=0;
+    std::string token,text;
+    double version;
+    do
+    {   // Reading header
+        file>>token;
+        if(token=="FileType")
+        {
+            file>>text;
+            if(text!="MatrixList") return false;
+            n=(n|1);
+        }
+        if(token=="Version") {file>>version; n=(n|2);}
+        if(file.eof())
+        {
+            std::cerr<<"MatrixList Loading Header error : "<<fileName<<"\n";
+            return false;
+        }
+    } while(n!=3);
+    v.clear();
+    vnl_rigid_matrix m;
+    bool b;
+    do
+    {
+        b=m.load(file);
+        if(b)
+        {
+            if(invert) m.invert();
+            v.push_back(m);
+        }
+    }while(b);
+    file.close();
+    return true;
+}
+
+bool arlCore::needleCalibration( const std::vector< arlCore::vnl_rigid_matrix >& tip, arlCore::vnl_rigid_matrix &calibration, const std::vector< arlCore::vnl_rigid_matrix > &orientation, double &RMS )
+{
+    // NEEDLE TIP CALIBRATION
+    // TODO Choose method
+    //ARLCORE_SCE_GEOMETRIC ARLCORE_SCE_ANALYTIC ARLCORE_SCE_OPTIMIZATION
+    const arlCore::ARLCORE_SCE methode = arlCore::ARLCORE_SCE_GEOMETRIC;
+    const bool Verbose = false;
+    RMS = -1;
+    unsigned int i;
+    Point::sptr center=Point::New(calibration.getX(), calibration.getY(), calibration.getZ());
+    double radius,a,b,c;
+    if(tip.size()>3)
+    {
+        PointList pl;
+        pl.fill(tip);
+        std::vector<double> optimiser_parameter, log;
+        if(!pl.sphereCenterEstimation(center, radius, methode, optimiser_parameter, log)) return false;
+        if(log.size()>0) RMS = log[0];
+        std::cout<<"Log sphereCenterEstimation : ";
+        for(i=0 ; i<log.size() ; ++i)
+            std::cout<<log[i]<<" ";
+        std::cout<<"\n";
+        if(Verbose) std::cout<<"Radius = "<<radius<<" Error = "<<RMS<<" center = "<<center->x()<<" "<<center->y()<<" "<<center->z()<<"\n";
+    }
+    // NEEDLE ORIENTATION CALIBRATION
+    double x = center->x(), y = center->y(), z = center->z();
+    radius = sqrt(x*x + y*y + z*z);
+    if(radius==0) return false;
+    Point::sptr  ptA1=Point::New(0,0,0);
+    Point::sptr  ptA2=Point::New(1,0,0);
+    Point::sptr  ptA3=Point::New(0,0,1);
+    Point::sptr  ptB1=Point::New(x,y,z);
+    Point::sptr  ptB2=Point::New(x-1,y-1,0);
+    Point::sptr  ptB3=Point::New(x,y,z);
+    // Equation du plan perpendiculaire � l'axe z de l'outil
+    // ax + by + cz + d = 0
+    if(orientation.size()<2)
+        a=x, b=y, c=z;
+    else
+    {
+        std::vector< vgl_point_3d<double> > points;
+        for( i=0 ; i<orientation.size() ; ++i )
+        {
+            vnl_rigid_matrix M;
+            Point::sptr p0 = Point::New(x,y,z);
+            M.invert(orientation[i]);
+            M.trf(p0);
+            points.push_back(vgl_point_3d<double>(p0->x(),p0->y(),p0->z()));
+        }
+        double lineRMS;
+        vgl_line_3d_2_points<double> line;
+        if(vgl_fit_line_3d( points, line, lineRMS ))
+        {
+            if(Verbose) std::cout<<"RMS line fit = "<<lineRMS<<"\n";
+            vgl_point_3d<double> vglp0=line.point1();
+            vgl_point_3d<double> vglp1=line.point2();
+            Point::sptr p0 = Point::New(vglp0.x(),vglp0.y(),vglp0.z());
+            Point::sptr p1 = Point::New(vglp1.x(),vglp1.y(),vglp1.z());
+            orientation[0].trf(p0);
+            orientation[0].trf(p1);
+            p0->mult(-1);
+            p1->add(p0);
+            p1->normalize();
+            a=p1->x();
+            b=p1->y();
+            c=p1->z();
+            ptB3->add(p1);
+        }else
+        {
+            lineRMS = 0.0;
+            vnl_rigid_matrix M;
+            Point::sptr p0 = Point::New(x,y,z);
+            Point::sptr p1 = Point::New(x,y,z);
+            M.invert(orientation[1]);
+            M.trf(p1);
+            orientation[0].trf(p1);
+            p0->mult(-1);
+            p1->add(p0);
+            p1->normalize();
+            a=p1->x();
+            b=p1->y();
+            c=p1->z();
+            ptB3->add(p1);
+        }
+        std::cout<<"Line RMS : "<<lineRMS<<"\n";
+    }
+    // d pour le plan passant par l'origine de l'outil (x,y,z)
+    double d = -(a*x + b*y + c*z);
+    if(orientation.size()<2)
+    {
+        ptB3->normalize();
+        ptB3->mult(radius-1.0);
+    }
+    // FIXME cas où c==0
+    ptB2->z((-a*ptB2->x()-b*ptB2->y()-d)/c);
+    ptA2->x(ptB2->distance(ptB1));
+
+    //std::vector< Point::csptr > A, B;
+    PointList::sptr A = PointList::New();
+    PointList::sptr B = PointList::New();
+//  vgl_point_3d<double> p0(points[0].x(), points[0].y(), points[0].z());
+//  vgl_point_3d<double> p0(points[1].x(), points[1].y(), points[1].z());
+//  std::cout<<ptA1.print()<<" "<<ptA2->print()<<" "<<ptA3.print();
+//  std::cout<<ptB1.print()<<" "<<ptB2->print()<<" "<<ptB3.print();
+
+    A->push_back(ptA1); B->push_back(ptB1);
+    A->push_back(ptA2); B->push_back(ptB2);
+    A->push_back(ptA3); B->push_back(ptB3);
+/*  if(!calibration.register3D3D( A, B, true )) return false;
+    if(Verbose)
+    {
+        std::vector<double> errors;
+        calibration.RMS3D3D( A, B, errors );
+    }
+    calibration.setRMS(RMS);
+    return true;*/
+    return calibration.register3D3D( A, B, true );
+}
+
+bool arlCore::vgl_fit_line_3d( const std::vector< vgl_point_3d<double> > &points, vgl_line_3d_2_points<double> &line, double &RMS )
+{
+    RMS = -1;
+    if(points.size()<2) return false;
+    if(points.size()==2)
+    {
+        line.set( points[0], points[1] );
+        RMS = 0.0;
+        return true;
+    }
+    vnl_vector<double> solution(6);
+    solution(0)=points[0].x();
+    solution(1)=points[0].y();
+    solution(2)=points[0].z();
+    solution(3)=points[1].x();
+    solution(4)=points[1].y();
+    solution(5)=points[1].z();
+    Optimise3DLine meanLine(points);
+    vnl_powell computeMeanLine(&meanLine);
+    computeMeanLine.minimize(solution);
+    const vgl_point_3d<double> Point1(solution[0], solution[1], solution[2]);
+    const vgl_point_3d<double> Point2(solution[3], solution[4], solution[5]);
+    line.set(Point1, Point2);
+    RMS = sqrt(computeMeanLine.get_end_error()/meanLine.size());
+    return true;
+}
+
+vgl_vector_3d<double> arlCore::orthogonal_vectors( const vgl_vector_3d<double> &vec, double s)
+{
+    //enforce parameter range
+    if(s<0.0) s=0.0;
+    if(s>1.0) s = 1.0;
+    //double tol = vgl_tolerance<double>::position;
+    double tol = vcl_numeric_limits<double>::epsilon();
+    double nx = vec.x_, ny = vec.y_, nz =  vec.z_;
+    double mnz = vcl_fabs(nz);
+    double two_pi = 2*vnl_math::pi;
+    double co = vcl_cos(two_pi*s), si = vcl_sin(two_pi*s);
+    //General case
+    if(mnz>tol)
+    {
+        double co = vcl_cos(two_pi*s), si = vcl_sin(two_pi*s);
+        double rx = nx/nz, ry = ny/nz;
+        double q = co*rx +si*ry;
+        double a = 1.0/vcl_sqrt(1+q*q);
+        double vx = a*co, vy = a*si;
+        double vz = -(rx*vx + ry*vy);
+        return vgl_vector_3d<double>(vx, vy, vz);
+    }
+    //Degenerate case, nz ~ 0
+    double r = nx/ny;
+    double a = 1/vcl_sqrt(1+co*co*r*r);
+    double vx = a*co, vz = a*si;
+    double vy = -a*co*r;
+    return vgl_vector_3d<double>(vx, vy, vz);
+}
+
+bool arlCore::intersection( const vnl_vector_fixed<double, 6> &bound1, const vnl_vector_fixed<double, 6> &bound2 )
+{
+    vgl_box_3d< double > box1, box2, intersection;
+    box1.set_min_x(bound1[0]);
+    box1.set_max_x(bound1[1]);
+    box1.set_min_y(bound1[2]);
+    box1.set_max_y(bound1[3]);
+    box1.set_min_z(bound1[4]);
+    box1.set_max_z(bound1[5]);
+
+    box2.set_min_x(bound2[0]);
+    box2.set_max_x(bound2[1]);
+    box2.set_min_y(bound2[2]);
+    box2.set_max_y(bound2[3]);
+    box2.set_min_z(bound2[4]);
+    box2.set_max_z(bound2[5]);
+
+    intersection = vgl_intersection ( box1, box2 );
+    return !intersection.is_empty();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Object.cpp b/SrcLib/ARLcore/src/arlcore/Object.cpp
new file mode 100644
index 0000000..2fe1748
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Object.cpp
@@ -0,0 +1,383 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Object.h>
+
+#include <time.h>
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include <arlcore/Misc.h>
+
+unsigned int arlCore::Object::m_counter[arlCore::ARLCORE_CLASS_NBTYPES];
+arlCore::ARLCORE_LOG_VERBOSE arlCore::Object::m_staticVerboseLevel=arlCore::ARLCORE_LOG_VERBOSE_NBTYPES;
+
+arlCore::Object::Object( ARLCORE_CLASS c, const std::string &name ):
+m_date( 0 ),
+m_time( 0 ),
+m_class( c ),
+m_name(name),
+m_ok( false ),
+m_verboseLevel( ARLCORE_LOG_MUTE ),
+m_writeMutex( false ),
+m_readMutex( 0 ),
+m_updateIndex( FIRSTUPDATEINDEX )
+{
+    m_no=++m_counter[m_class];
+}
+
+arlCore::Object::Object( const Object& o ):
+m_verboseLevel( ARLCORE_LOG_MUTE ),
+m_writeMutex( false ),
+m_readMutex( 0 )
+{
+    copy(o);
+    m_no=++m_counter[m_class];
+}
+
+arlCore::Object& arlCore::Object::operator=( const Object& o )
+{
+    copy(o);
+    return *this;
+}
+
+void arlCore::Object::copy( const Object& o )
+{
+    if(this!=&o)
+    {
+        m_verboseLevel=o.m_verboseLevel;
+        m_date=o.m_date;
+        m_time=o.m_time;
+        m_class=o.m_class;
+        m_name=o.m_name;
+        m_ok=o.m_ok;
+        m_updateIndex+=o.m_updateIndex;
+    }
+}
+
+arlCore::Object::~Object( void )
+{
+    assert(m_class<ARLCORE_CLASS_NBTYPES);
+    --m_counter[m_class];
+}
+
+arlCore::ARLCORE_CLASS arlCore::Object::getType( void ) const
+{
+    return m_class;
+}
+
+bool arlCore::Object::print( void ) const
+{
+    std::string s = getString();
+    std::cout<<s;
+    return true;
+}
+
+std::string arlCore::Object::getString( void ) const
+{
+    std::string c="UNKNOWN";
+    if(m_class<ARLCORE_CLASS_NBTYPES)
+        c=ARLCORE_CLASS_NAMES[m_class];
+    std::stringstream s;
+    s<<"_______________________________________________________________________________\n";
+    s<<"\""<<m_name<<"\" "<<c<<" class (#"<<m_no<<" / "<<m_counter[m_class]<<" object";
+    if(m_counter[m_class]>1) s<<"s";
+    s<<")";
+    if(m_ok) s<<"\nOK"; else s<<"\nKO";
+    s<<" - Timestamp : "<<m_date<<"-"<<m_time<<" ("<<this<<")";
+//  s<<" - Timestamp : "<<m_time<<" ("<<this<<")";
+    s<<"\nVerbose level : "<<m_verboseLevel;
+    s<<" - Update index : "<<m_updateIndex;
+    s<<"\nMutex : Read("<<m_readMutex<<") Write("<<m_writeMutex<<")\n";
+    s<<"_______________________________________________________________________________\n";
+    return s.str();
+}
+
+bool arlCore::Object::load( const std::string &fileName )
+{
+    return false;
+}
+
+bool arlCore::Object::save( const std::string &fileName, bool overwrite ) const
+{
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    return false;
+}
+
+bool arlCore::Object::save( void ) const
+{
+    return save( getFileName() );
+}
+
+std::string arlCore::Object::serialize( void ) const
+{
+    const unsigned int Precision = 15;
+    std::stringstream ss;
+    ss<<std::setprecision(Precision)<<m_ok<<" "<<m_date<<" "<<m_time<<" ";
+    return ss.str();
+}
+
+bool arlCore::Object::unserialize( std::stringstream& s )
+{
+    s>>m_ok>>m_date>>m_time;
+    update();
+    return true;
+}
+bool arlCore::Object::unserialize( const std::string &s )
+{
+    const unsigned int Precision = 15;
+    std::stringstream ss;
+    ss<<std::setprecision(Precision)<<s;
+    return unserialize( ss );
+}
+
+bool arlCore::Object::setOK( bool b )
+{
+    if(b!=m_ok)
+    {
+        m_ok = b;
+        update();
+    }
+    return m_ok;
+}
+
+bool arlCore::Object::isOK( void ) const
+{
+    return m_ok;
+}
+
+unsigned int arlCore::Object::getCounter( void ) const
+{
+    return m_counter[m_class];
+}
+
+unsigned int arlCore::Object::getNo( void ) const
+{
+    return m_no;
+}
+
+
+
+std::string arlCore::Object::getFileName( void )const
+{
+    std::stringstream s;
+    s<<"c:/"<<m_class<<"-"<<getNo();
+    s<<"-"<<m_date<<"-"<<m_time;
+    s<<".txt";
+    return s.str();
+}
+
+long int arlCore::Object::getUpdateIndex( void ) const
+{
+    return m_updateIndex;
+}
+
+void arlCore::Object::update( void )
+{
+    ++m_updateIndex;
+}
+
+bool arlCore::Object::getTime( long int &date, long int &time ) const
+{
+    date = m_date;
+    time = m_time;
+    return (date+time)!=0;
+}
+
+long int arlCore::Object::getDate( void ) const
+{
+    return m_date;
+}
+
+long int arlCore::Object::getTime( void ) const
+{
+    return m_time;
+}
+
+bool arlCore::Object::setTime( const long int &date, const long int &time )
+{
+    m_date = date;
+    m_time = time;
+    update();
+    return (m_date+m_time)!=0;
+}
+
+bool arlCore::Object::setTime( const long int &time )
+{
+    m_time = time;
+    update();
+    return (m_date+m_time)!=0;
+}
+
+bool arlCore::Object::setMaxTime( long int date, long int time )
+{
+    if (date>m_date || (date==m_date && time>m_time))
+    {
+        m_date = date;
+        m_time = time;
+        update();
+        return true;
+    }
+    return false;
+}
+
+bool arlCore::Object::setMinTime( long int date, long int time )
+{
+    if ((m_date==0 && m_time==0) || (date<m_date || (((date==m_date && time<m_time)) && (date!=0 || time!=0))))
+    {   // Never change if(date, time) is null
+        // Change always if object time is null or
+        // change if(date, time) lesser than object time
+        m_date = date;
+        m_time = time;
+        update();
+        return true;
+    }
+    return false;
+}
+
+bool arlCore::Object::setTime( void )
+{
+    m_date = arlTime::getNowDate();
+    m_time = arlTime::getNowTime();
+    update();
+    return (m_date+m_time)!=0;
+}
+
+bool arlCore::Object::startLap( void )
+{
+    m_lapDate = arlTime::getNowDate();
+    m_lapTime = arlTime::getNowTime();
+    update(); //?
+    return true;
+}
+
+double arlCore::Object::getLap( void )
+{   // Return lap in seconds
+    double b = (double)m_lapTime;
+    startLap();
+    double sec=0; //m_lapDate-a;
+    if(b>m_lapTime)
+        sec+=1.0-(b+(double)m_lapTime)/1000000.0; // FIXME
+    else
+        sec+=((double)m_lapTime-b)/((double)CLK_TCK*10); // FIXME
+    update(); //?
+    return sec;
+}
+
+double arlCore::Object::getItPerSec( void )
+{
+    return 1.0/getLap();
+}
+
+bool arlCore::Object::isChanged( const long int &date, const long int &time ) const
+{
+    return( date!=m_date || time!=m_time );
+}
+
+bool arlCore::Object::isEquivalent( const long int &date, const long int &time ) const
+{
+    return( date<=0  || time<0 || (m_date==0 && m_time==0) || (date==m_date && time==m_time) );
+}
+
+bool arlCore::Object::lockWriteMutex( void )
+{
+    if(isWriteLocked()) return false;
+    m_writeMutex=true;
+    return true;
+}
+
+bool arlCore::Object::unlockWriteMutex( void )
+{
+    setTime();
+    m_writeMutex = false;
+    return true;
+}
+
+unsigned int arlCore::Object::lockReadMutex( void )
+{
+    if(m_writeMutex) return false;
+    ++m_readMutex;
+    return m_readMutex;
+}
+
+unsigned int arlCore::Object::unlockReadMutex( void )
+{
+    if(m_readMutex>0) m_readMutex--;
+    return m_readMutex;
+}
+
+bool arlCore::Object::isWriteLocked( void ) const
+{
+    return(m_writeMutex || m_readMutex>0);
+}
+
+bool arlCore::Object::isReadLocked( void ) const
+{
+    return(m_readMutex>0);
+}
+
+void arlCore::Object::setVerboseLevel( ARLCORE_LOG_VERBOSE level )
+{
+    m_verboseLevel = level;
+}
+
+arlCore::ARLCORE_LOG_VERBOSE arlCore::Object::getVerboseLevel( void )
+{
+    return m_verboseLevel;
+}
+
+void arlCore::Object::setStaticVerboseLevel( ARLCORE_LOG_VERBOSE level )
+{
+    m_staticVerboseLevel = level;
+}
+
+arlCore::ARLCORE_LOG_VERBOSE arlCore::Object::getStaticVerboseLevel( void )
+{
+    return m_staticVerboseLevel;
+}
+
+void arlCore::Object::resetStaticVerboseLevel( void )
+{
+    m_staticVerboseLevel = ARLCORE_LOG_VERBOSE_NBTYPES;
+}
+
+void arlCore::Object::log( ARLCORE_LOG_SERIOUSNESS level, const std::stringstream& text ) const
+{
+    log(level, text.str().c_str());
+}
+
+void arlCore::Object::log( ARLCORE_LOG_SERIOUSNESS level, const std::string& text ) const
+{
+    log(level, text.c_str());
+}
+
+void arlCore::Object::log( ARLCORE_LOG_SERIOUSNESS level )
+{
+    log(level, m_log);
+    m_log.str("");
+}
+
+void arlCore::Object::log( ARLCORE_LOG_SERIOUSNESS level, const char* text ) const
+{
+    ARLCORE_LOG_VERBOSE verboseLevel;
+    if(m_staticVerboseLevel<ARLCORE_LOG_VERBOSE_NBTYPES)
+        verboseLevel=m_staticVerboseLevel;
+    else verboseLevel=m_verboseLevel;
+
+    if(verboseLevel<=(ARLCORE_LOG_VERBOSE)level) return;
+    if(level==ARLCORE_LOG_ERROR)
+        std::cout<<"<ERROR>";
+    if(level==ARLCORE_LOG_WARNING)
+        std::cout<<"<WARNING>";
+    if(level==ARLCORE_LOG_INFO_LEVEL2)
+        std::cout<<"<INFO2>";
+    if(level==ARLCORE_LOG_INFO_LEVEL1)
+        std::cout<<"<INFO1>";
+    std::cout<<"["<<ARLCORE_CLASS_NAMES[m_class]<<"]";
+    std::cout<<"["<<this<<"] ";
+    std::cout<<text<<"\n";
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Optimization.cpp b/SrcLib/ARLcore/src/arlcore/Optimization.cpp
new file mode 100644
index 0000000..4e1ad25
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Optimization.cpp
@@ -0,0 +1,2069 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Optimization.h>
+
+#include <time.h>
+
+#include <vnl/vnl_cross.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+
+#include <vgl/vgl_point_3d.h>
+#include <vgl/vgl_distance.h>
+#include <vgl/vgl_plane_3d.h>
+
+#include <arlcore/vnl_rotation3d_vector.h>
+#include <arlcore/vnl_rigid_vector.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Camera.h>
+#include <arlcore/Misc.h>
+
+using namespace std;
+
+double arlCore::CostFunction::m_errorMax = 9e99;
+
+arlCore::CostFunction::CostFunction():
+m_errorMin(m_errorMax),
+m_firstIteration(true),
+m_observer(false),
+m_iterations(0)
+{}
+
+double arlCore::CostFunction::getCriterion( const vnl_vector<double> &x )
+{
+    m_error = m_errorMax;
+    return m_error;
+}
+
+void arlCore::CostFunction::setObserver( bool b )
+{
+    m_observer = b;
+    m_errorList.clear();
+    m_iterations = 0;
+}
+
+unsigned int arlCore::CostFunction::getNbIterations() const
+{
+    return m_iterations;
+}
+
+double arlCore::CostFunction::getError() const
+{
+    return m_error;
+}
+
+const arlCore::PointList& arlCore::CostFunction::getObservation() const
+{
+    return m_errorList;
+}
+
+double arlCore::CostFunction::error( const vnl_vector<double> &x )
+{
+    m_error = m_errorMax;
+    return observe(x);
+}
+
+double arlCore::CostFunction::observe( const vnl_vector<double> &x )
+{
+    if(m_firstIteration)
+    {
+        m_solution = x;
+        m_firstIteration = false;
+    }
+    if(m_error<m_errorMin)
+    {
+        m_errorMin = m_error;
+        m_solution = x;
+    }
+    if(m_observer)
+    {
+        long int now = clock ();// / (double)CLK_TCK * 10);
+        if(m_iterations==0)
+        {
+            m_time = now;
+            m_errorList.push_back(0.0, m_error);
+        }else m_errorList.push_back((double)(now-m_time), m_error);
+    }
+    ++m_iterations;
+    return m_error;
+}
+
+bool arlCore::CostFunction::verify( const vnl_vector<double> &x, double endError )
+{
+    bool b1 = (endError==getCriterion(x));
+    if(!b1) std::cout<<"Distorsion error/solution : "<<endError<<"*"<<getCriterion(x)<<"\n";
+    bool b2 = (endError==m_errorMin);
+    if(!b2) std::cout<<"Distorsion error min : "<<endError<<"*"<<m_errorMin<<"\n";
+    bool b3 = (x==m_solution);
+    if(!b3) std::cout<<"Distorsion solution : "<<x<<"*"<<m_solution<<"\n";
+    return b1 && b2 && b3;
+}
+
+void arlCore::CostFunction::plot() const
+{
+    std::string options = "set logscale y\n\
+        set title 'Optimization observer'\n\
+        set xlabel 'time (ms)'\n\
+        set ylabel 'error'\n";
+    m_errorList.plot( options );
+}
+
+// OptimiseICP
+arlCore::OptimiseICP::OptimiseICP( arlCore::ICP& icp):
+vnl_cost_function(6),
+m_ICP(icp)
+{}
+
+arlCore::OptimiseICP::~OptimiseICP(){}
+
+double arlCore::OptimiseICP::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    m_error = m_ICP.computeCriterion(vnl_rigid_matrix(vnl_rigid_vector(x)));
+//  std::cout<<m_error<<" ";
+    return observe(x);
+}
+
+// OptimiseICP_LS
+arlCore::OptimiseICP_LS::OptimiseICP_LS( arlCore::ICP& icp, UseGradient g ):
+vnl_least_squares_function(6, icp.getCloudSize(), g),
+m_ICP(icp)
+{}
+
+arlCore::OptimiseICP_LS::~OptimiseICP_LS(){}
+
+void arlCore::OptimiseICP_LS::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    assert(fx.size()==m_ICP.getCloudSize());
+    m_error = m_ICP.computeCriterion(vnl_rigid_matrix(vnl_rigid_vector(x)), fx);
+    //std::cout<<m_error<<" ";
+    observe(x);
+}
+
+void arlCore::OptimiseICP_LS::gradf(vnl_vector< double > const &x, vnl_matrix<double>& g)
+{
+    vnl_least_squares_function::fdgradf(x, g, 1e-8);
+}
+
+// OptimisePlane
+arlCore::OptimisePlane::OptimisePlane():
+vnl_cost_function(4)
+{}
+
+arlCore::OptimisePlane::~OptimisePlane()
+{
+    unsigned int i;
+    for( i=0 ; i<m_points.size() ; ++i )
+        if(m_points[i]!=0) delete m_points[i];
+}
+
+void arlCore::OptimisePlane::addPoint( const vgl_point_3d< double >&point )
+{
+    m_points.push_back(new vgl_point_3d< double >(point));
+}
+
+void arlCore::OptimisePlane::delPoint( unsigned int index )
+{
+    if(m_points.size()<=index) return;
+    if(m_points[index]!=0) delete m_points[index];
+    m_points[index]=0;
+}
+
+unsigned int arlCore::OptimisePlane::size( void )
+{
+    return (unsigned int)m_points.size();
+}
+
+const std::vector< vgl_point_3d< double >* > &arlCore::OptimisePlane::getPoints( void )
+{
+    return m_points;
+}
+
+double arlCore::OptimisePlane::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==4);
+    m_error=0.0;
+    vgl_plane_3d< double >p(x[0],x[1],x[2],x[3]);
+    unsigned int i;
+    for( i=0 ; i<m_points.size() ; i++ )
+        if(m_points[i]!=0)
+        {
+            const double Distance = vgl_distance(p, *(m_points[i]));
+            m_error += Distance*Distance;
+        }
+    return observe(x);
+}
+
+// Optimise3DLine
+arlCore::Optimise3DLine::Optimise3DLine(const std::vector< vgl_point_3d<double> >& pointList):
+vnl_cost_function(6),
+m_points(pointList)
+{}
+
+arlCore::Optimise3DLine::~Optimise3DLine()
+{}
+
+double arlCore::Optimise3DLine::f(vnl_vector< double > const &x)
+{
+    m_error=0.0;
+    vgl_line_3d_2_points<double> line;
+    vgl_point_3d<double>point1(x[0],x[1],x[2]);
+    vgl_point_3d<double>point2(x[3],x[4],x[5]);
+    line.set(point1, point2);
+    unsigned int i;
+    for( i=0 ; i<m_points.size() ; i++ )
+    {
+        double a = arlCore::vgl_distance_point( line, m_points[i] );
+        m_error += a*a;
+    }
+    return observe(x);
+}
+
+unsigned int arlCore::Optimise3DLine::size( void )
+{
+    return (unsigned int)m_points.size();
+}
+
+// OptimisePivot
+arlCore::OptimisePivot::OptimisePivot( PointList::csptr points ):
+vnl_cost_function(points->getDimension()),
+m_points(points),
+m_radius(0.0)
+{}
+
+arlCore::OptimisePivot::~OptimisePivot()
+{}
+
+double arlCore::OptimisePivot::getRadius( void )
+{
+    return m_radius;
+}
+
+double arlCore::OptimisePivot::f(vnl_vector< double > const &x)
+{
+    m_error=0.0;
+    unsigned int i;
+    vnl_vector<double> distances(m_points->size());
+    arlCore::Point::sptr center = arlCore::Point::New();
+    center->init(m_points->getDimension());
+    for( i=0 ; i<center->size() ; ++i )
+        center->set(i, x[i]);
+    for( i=0 ; i<m_points->size() ; i++ )
+        distances[i] = (*m_points)[i]->distance(center);
+    m_radius = distances.mean();
+    for( i=0 ; i<distances.size() ; ++i )
+        m_error += (distances[i]-m_radius)*(distances[i]-m_radius);
+    return observe(x);
+}
+
+// OptimiseVideoRobot1
+arlCore::OptimiseVideoRobot1::OptimiseVideoRobot1( const std::vector< arlCore::vnl_rigid_matrix > &M06, PointList::csptr Tip ):
+vnl_cost_function(6),
+m_tip(Tip),
+m_M06(M06),
+m_distance(0.0),
+m_stdDev(0.0)
+{
+    assert(M06.size()==m_tip->size());
+    assert(m_tip->getDimension()==3);
+}
+
+arlCore::OptimiseVideoRobot1::~OptimiseVideoRobot1()
+{}
+
+double arlCore::OptimiseVideoRobot1::getDistance( void )
+{
+    return m_distance;
+}
+
+double arlCore::OptimiseVideoRobot1::getStdDev( void )
+{
+    return m_stdDev;
+}
+
+double arlCore::OptimiseVideoRobot1::f(vnl_vector< double > const &x)
+{
+    const double ReconsErrorMax = -1;
+/*  static vnl_vector< double >xx;
+    static bool bb=false;
+    if(!bb)
+    {
+        bb=true;
+        xx=x;
+    }*/
+    m_error=0.0;
+    m_stdDev=0.0;
+    m_distance = 0.0;
+    unsigned int i;
+    double n = 0.0;
+    Point::sptr EndEffectorOrg= Point::New(3);
+    EndEffectorOrg->fill(0.0);
+    Point::sptr TipEndEffectorPlane = Point::New(3);
+    const vnl_rigid_vector V( x );
+    vnl_rigid_matrix T( V );
+    vnl_rigid_matrix video2EndEffector;
+    vnl_vector<double> distances((unsigned int)m_M06.size());
+    std::vector< vnl_vector<double> > coordinates(m_M06.size());
+    vnl_vector<double> meanCoordinates(3/*, 0.0*/);
+    meanCoordinates.fill(0.0);
+    for( i=0 ; i<m_M06.size() ; ++i )
+        if(ReconsErrorMax<0 || (*m_tip)[i]->getError()<ReconsErrorMax)
+        {
+            video2EndEffector.mult( m_M06[i], T );
+            video2EndEffector.trf( ((*m_tip)[i]), TipEndEffectorPlane );
+            coordinates[i] = TipEndEffectorPlane->getCoordinates();
+            meanCoordinates += coordinates[i];
+            distances[i]=EndEffectorOrg->distance(TipEndEffectorPlane);
+            m_distance += distances[i];
+            ++n;
+        }
+    if(n==0.0) return 0.0;
+    m_distance /= n;
+    for( i=0 ; i<distances.size() ; ++i )
+        if(ReconsErrorMax<0 || (*m_tip)[i]->getError()<ReconsErrorMax)
+        {
+            //const double Error = fabs(distances[i]-m_distance);
+            const double Error = (meanCoordinates-coordinates[i]).two_norm();
+            //std::cout<<"* "<<meanCoordinates<<" "<<coordinates[i]<<" "<<(meanCoordinates-coordinates[i]).two_norm()<<"\n";
+            //const double Error = (meanCoordinates-coordinates[i]).two_norm() + fabs(distances[i]-m_distance);
+            //std::cout<<"* "<<Error<<"\n";
+            m_error += Error*Error;
+        }
+    m_stdDev = sqrt(m_error/n);
+    return observe(x);
+}
+
+// OptimiseVideoRobot
+arlCore::OptimiseVideoRobot::OptimiseVideoRobot(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList ):
+m_M06(M06),
+m_chessboards(model3D),
+m_cameras(cams),
+m_points2DList(points2DList)
+{}
+
+arlCore::OptimiseVideoRobot::~OptimiseVideoRobot()
+{}
+
+double arlCore::OptimiseVideoRobot::criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z )
+{
+    vnl_vector<double> fx;
+    arlCore::vnl_rigid_matrix invZ = Z.computeInverse();
+    if(criterion(X,invZ,fx)) return m_error;
+    else return -1;
+}
+
+bool arlCore::OptimiseVideoRobot::criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &invZ, vnl_vector<double> &fx )
+{
+    fx.fill(0.0);
+    unsigned int i, j, k, index=0;
+    const unsigned int NbCams = (unsigned int)m_cameras.size();
+    assert(m_chessboards.size()==NbCams);
+    assert(m_points2DList.size()==NbCams);
+    const unsigned int NbPoses = (unsigned int)m_M06.size();
+    arlCore::Point::sptr  pt2D = arlCore::Point::New();
+    pt2D->init(2);
+    arlCore::Point::sptr  pt3D = arlCore::Point::New();
+    double n = 0.0;
+    m_error = 0.0;
+    for( j=0 ; j<NbPoses ; ++j )
+    {   // T = inv( X . M06i . inv(Z) )
+        arlCore::vnl_rigid_matrix T = X * m_M06[j] * invZ;
+        T.invert();
+        for( i=0 ; i<NbCams ; ++i )
+        {
+            assert(m_chessboards[i].size()==NbPoses);
+            const unsigned int NbPoints = m_chessboards[i][j]->size();
+            assert(m_points2DList[i][j]->size()==NbPoints);
+            for( k=0 ; k<NbPoints ; ++k, ++index )
+            {
+                T.trf( (*m_chessboards[i][j])[k], pt3D);
+                if(m_cameras[i]->project3DPoint(pt3D, pt2D))
+                {
+                    const double Error2 = pt2D->distance2( (*m_points2DList[i][j])[k]);
+                    m_error += Error2;
+                    if(index<fx.size()) fx[index] = Error2;
+                    ++n;
+                }
+            }
+        }
+    }
+    if(n>0) m_error = sqrt(m_error/n); else return false;
+    return true;
+}
+
+// OptimiseVideoRobotX
+arlCore::OptimiseVideoRobotX::OptimiseVideoRobotX(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &Z,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList ):
+vnl_cost_function(6),
+OptimiseVideoRobot(M06, model3D, cams, points2DList),
+m_Z(Z)
+{}
+
+arlCore::OptimiseVideoRobotX::~OptimiseVideoRobotX()
+{}
+
+double arlCore::OptimiseVideoRobotX::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    const arlCore::vnl_rigid_vector V(x);
+    arlCore::vnl_rigid_matrix invZ(m_Z), X(V);
+    invZ.invert();
+    vnl_vector<double> fx;
+    if(!criterion(X, invZ, fx)) return error(x);
+    return observe(x);
+}
+
+// OptimiseVideoRobotX LS
+arlCore::OptimiseVideoRobotX_LS::OptimiseVideoRobotX_LS(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &Z,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        unsigned int number_of_residuals, UseGradient g ):
+vnl_least_squares_function(6, number_of_residuals, g),
+OptimiseVideoRobot(M06, model3D, cams, points2DList),
+m_Z(Z)
+{}
+
+arlCore::OptimiseVideoRobotX_LS::~OptimiseVideoRobotX_LS()
+{}
+
+void arlCore::OptimiseVideoRobotX_LS::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    const arlCore::vnl_rigid_vector V(x);
+    arlCore::vnl_rigid_matrix invZ(m_Z), X(V);
+    invZ.invert();
+    if(!criterion(X, invZ, fx)) error(x);
+    observe(x);
+}
+
+void arlCore::OptimiseVideoRobotX_LS::gradf(vnl_vector< double > const &x, vnl_matrix<double>& g)
+{
+    vnl_least_squares_function::fdgradf(x, g, 1e-8);
+}
+
+// OptimiseVideoRobotZ
+arlCore::OptimiseVideoRobotZ::OptimiseVideoRobotZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &X,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList ):
+vnl_cost_function(6),
+OptimiseVideoRobot(M06, model3D, cams, points2DList),
+m_X(X)
+{}
+
+arlCore::OptimiseVideoRobotZ::~OptimiseVideoRobotZ()
+{}
+
+double arlCore::OptimiseVideoRobotZ::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    const arlCore::vnl_rigid_vector V(x);
+    arlCore::vnl_rigid_matrix invZ(V), X(m_X);
+    invZ.invert();
+    vnl_vector<double> fx;
+    if(!criterion(X, invZ, fx)) return error(x);
+    return observe(x);
+}
+
+// OptimiseVideoRobotZ LS
+arlCore::OptimiseVideoRobotZ_LS::OptimiseVideoRobotZ_LS(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const arlCore::vnl_rigid_matrix &X,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        unsigned int number_of_residuals, UseGradient g ):
+vnl_least_squares_function(6, number_of_residuals, g),
+OptimiseVideoRobot(M06, model3D, cams, points2DList),
+m_X(X)
+{}
+
+arlCore::OptimiseVideoRobotZ_LS::~OptimiseVideoRobotZ_LS()
+{}
+
+void arlCore::OptimiseVideoRobotZ_LS::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    const arlCore::vnl_rigid_vector V(x);
+    arlCore::vnl_rigid_matrix invZ(V), X(m_X);
+    invZ.invert();
+    if(!criterion(X, invZ, fx)) error(x);
+    observe(x);
+}
+
+void arlCore::OptimiseVideoRobotZ_LS::gradf(vnl_vector< double > const &x, vnl_matrix<double>& g)
+{
+    vnl_least_squares_function::fdgradf(x, g, 1e-8);
+}
+
+// OptimiseVideoRobotXZ
+arlCore::OptimiseVideoRobotXZ::OptimiseVideoRobotXZ(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList ):
+vnl_cost_function(12),
+OptimiseVideoRobot(M06, model3D, cams, points2DList)
+{}
+
+arlCore::OptimiseVideoRobotXZ::~OptimiseVideoRobotXZ()
+{}
+
+double arlCore::OptimiseVideoRobotXZ::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==12);
+    unsigned int i;
+    vnl_vector< double > x0(6), z0(6);
+    for( i=0 ; i<6 ; ++i )
+    {
+        x0[i] = x[i];
+        z0[i] = x[i+6];
+    }
+    const arlCore::vnl_rigid_vector VX(x0), VZ(z0);
+    arlCore::vnl_rigid_matrix X(VX), invZ(VZ);
+    invZ.invert();
+    vnl_vector<double> fx;
+    if(!criterion(X, invZ, fx)) return error(x);
+    return observe(x);
+}
+
+// OptimiseVideoRobotXZ LS
+arlCore::OptimiseVideoRobotXZ_LS::OptimiseVideoRobotXZ_LS(
+        const std::vector< arlCore::vnl_rigid_matrix > &M06,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &model3D,
+        const std::vector<const arlCore::Camera*> &cams,
+        const std::vector< std::vector< arlCore::PointList::csptr > > &points2DList,
+        unsigned int number_of_residuals, UseGradient g ):
+vnl_least_squares_function(12, number_of_residuals, g),
+OptimiseVideoRobot(M06, model3D, cams, points2DList)
+{}
+
+arlCore::OptimiseVideoRobotXZ_LS::~OptimiseVideoRobotXZ_LS()
+{}
+
+void arlCore::OptimiseVideoRobotXZ_LS::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==12);
+    unsigned int i;
+    vnl_vector< double > x0(6), z0(6);
+    for( i=0 ; i<6 ; ++i )
+    {
+        x0[i] = x[i];
+        z0[i] = x[i+6];
+    }
+    const arlCore::vnl_rigid_vector VX(x0), VZ(z0);
+    arlCore::vnl_rigid_matrix X(VX), invZ(VZ);
+    invZ.invert();
+    if(!criterion(X, invZ, fx)) error(x);
+    else observe(x);
+}
+
+void arlCore::OptimiseVideoRobotXZ_LS::gradf(vnl_vector< double > const &x, vnl_matrix<double>& g)
+{
+    vnl_least_squares_function::fdgradf(x, g, 1e-8);
+}
+
+// OptimiseReprojection
+arlCore::OptimiseReprojection::OptimiseReprojection(const vector<const arlCore::Camera*> &cameras, const vector<arlCore::Point::csptr> &points2D):
+vnl_cost_function(3),
+m_cameras(cameras),
+m_points2D(points2D)
+{}
+
+arlCore::OptimiseReprojection::~OptimiseReprojection(){}
+
+double arlCore::OptimiseReprojection::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==3);
+    vnl_vector_fixed<double,4> point3DH(x[0], x[1], x[2], 1.0);
+    vnl_vector_fixed<double,2> reprojPoint;
+    m_error = 0.0;
+    double errorX, errorY;
+    unsigned int i;
+    for( i=0 ; i<m_cameras.size() ; i++ )
+    {
+        assert(m_points2D[i]->size()==2);
+        m_cameras[i]->project3DPoint(point3DH, reprojPoint);
+        errorX = (reprojPoint(0)-m_points2D[i]->x());
+        errorY = (reprojPoint(1)-m_points2D[i]->y());
+        m_error += errorX*errorX + errorY*errorY;
+    }
+    return observe(x);
+}
+
+// AxxBReproj_cost_function
+/*arlCore::AxxBReproj_cost_function::AxxBReproj_cost_function(
+    const std::vector< arlCore::vnl_rigid_matrix > &A,
+    const std::vector< arlCore::vnl_rigid_matrix > &B,
+    const std::vector<const arlCore::Camera*> &videoCams,
+    const std::vector< arlCore::PointList::sptr > &models3DList,
+    const std::vector< std::vector<arlCore::PointList> > &points2DList):
+m_A_matrix(A),
+m_B_matrix(B),
+m_videoCams(videoCams),
+m_models3DList(models3DList), //[pose]
+m_points2DList(points2DList) //[cam][pose]
+{
+    assert(m_A_matrix.size()==m_B_matrix.size());
+    if(m_A_matrix.size()!=m_B_matrix.size()) std::cerr<<"AxxBReproj_cost_function : assert(m_A_matrix.size()==m_B_matrix.size());\n";
+    assert(points2DList.size()==m_videoCams.size());
+    if(points2DList.size()!=m_videoCams.size()) std::cerr<<"AxxBReproj_cost_function : assert(points2DList.size()==m_videoCams.size());\n";
+//  for(int i=0 ; i<m_videoCams.size() ; ++i )
+//      m_videoCams[i]->print();
+}
+
+arlCore::AxxBReproj_cost_function::~AxxBReproj_cost_function(){}
+
+double arlCore::AxxBReproj_cost_function::f(vnl_vector< double > const &v)
+{
+    const unsigned int NbPoses = 1;//m_A_matrix.size();
+    const unsigned int NbCams = m_videoCams.size();
+    m_error = 0.0;
+    const vnl_rigid_matrix X = arlCore::vnl_rigid_vector(v);
+    const vnl_rigid_matrix Z = arlCore::vnl_rigid_vector(v);
+    unsigned int i, j, k;
+    double n=0;
+    for( i=0 ; i<NbCams ; ++i )
+    {
+        assert(m_points2DList[i].size()==m_models3DList.size());
+        if(m_points2DList[i].size()!=m_models3DList.size()) std::cerr<<"AxxBReproj_cost_function : assert(points2DList[i].size()==m_models3DList.size());\n";
+        if(m_videoCams[i]!=0)
+            for( j=0 ; j<NbPoses ; ++j )
+            {
+                assert(m_points2DList[i][j].size()==m_models3DList[j].size());
+                if(m_points2DList[i][j].size()!=m_models3DList[j].size()) std::cerr<<"AxxBReproj_cost_function : assert(m_points2DList[i][j].size()==m_models3DList[j].size());\n";
+                vnl_rigid_matrix T = X;
+                arlCore::Point::sptr pt2D = arlCore::Point::New(2);, pt3D(3);
+                for( k=0 ; k<m_models3DList[j].size() ; ++k )
+                {
+                    T.trf(*(m_models3DList[j][k]), pt3D);
+                    if(!m_videoCams[i]->project3DPoint( pt3D, pt2D )) std::cerr<<"AxxBReproj_cost_function : Reprojection Error\n";
+                    else
+                    {
+                        m_error += m_points2DList[i][j][k]->distance(pt2D);
+                        ++n;
+                    }
+                }
+            }
+    }
+    if(n!=0.0) m_error /= n;
+    std::cout<<m_error<<"\n";
+    return observe(x);
+}*/
+
+// Dornaika_cost_function
+arlCore::Dornaika_cost_function::Dornaika_cost_function(const std::vector< vnl_rigid_matrix >&A, const std::vector< vnl_rigid_matrix >&B):
+vnl_cost_function(7),
+m_A_matrix(A),
+m_B_matrix(B){}
+
+arlCore::Dornaika_cost_function::~Dornaika_cost_function(){}
+
+double arlCore::Dornaika_cost_function::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==7);
+    const double Lambda1=1; // 1000
+    const double Lambda2=1; // 10
+    const unsigned int Lambda = 2000000;
+    unsigned int i, j;
+    m_error=0.0;
+    vnl_quaternion<double> q(x[0],x[1],x[2],x[3]);
+    vnl_vector_fixed<double,3> translation(x[4],x[5],x[6]);
+    vnl_rotation3d_matrix  rotA, rotB, rotX;
+    vnl_vector_fixed<double,3>  pi, piprime, sum2;
+    vnl_matrix_fixed<double,3,3> identite, sum1;
+    identite.set_identity();
+    sum1.fill(0.0);
+    sum2.fill(0.0);
+    vnl_rigid_matrix X;
+    double norme=0.0, frob;
+    for( i=0 ; i<m_A_matrix.size() ; ++i )
+    {
+        //extraction des vecteurs rotation et translation
+        X.setQuaternion(q);
+        rotX = X.extract(3,3);
+        rotB = m_B_matrix[i].getRotation();
+        pi = m_B_matrix[i].getTranslation();
+        rotA = m_A_matrix[i].getRotation();
+        piprime = m_A_matrix[i].getTranslation();
+        //mystere : si on normalise les vecteurs translation pi et piprime la rotation est juste
+        //calcul du premier terme
+        sum1 = rotX*rotB - rotA*rotX;
+        sum1 = sum1*sum1 ;
+        //calcul du  ( K - Id )
+        rotA = rotA - identite;
+        //rotation du vecteur translation de X
+        translation = rotA * translation;
+        //calcul du 2ieme terme
+        sum2 = rotX*pi - piprime - translation;
+        for( j=0 ; j<sum2.size() ; ++j )
+            sum2[j] = sum2[j]*sum2[j] ;
+        X.fill(0.0);
+        X.setRotation(sum1);
+        for( j=0 ; j<sum2.size() ; ++j )
+            m_error+=sum2[j]*Lambda2;
+        frob = X.frobenius_norm();
+        frob=frob*frob;
+        m_error+=frob*Lambda1;
+        translation[0] = x[4];
+        translation[1] = x[5];
+        translation[2] = x[6];
+    }
+    //calcul du terme qui assure que q est unitaire
+    for(i=0;i<q.size();i++)
+        norme+=(q[i]*q[i]);
+    norme =sqrt(norme);
+    m_error += (Lambda*(1- norme))*(Lambda*(1- norme));
+    return observe(x);
+}
+
+// Dornaika_LS_cost_function
+arlCore::Dornaika_LS_cost_function::Dornaika_LS_cost_function(const std::vector< vnl_rigid_matrix >&A, const std::vector< vnl_rigid_matrix >&B, unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g):
+vnl_least_squares_function(number_of_unknowns, number_of_residuals, g),
+m_A_matrix(A),
+m_B_matrix(B){}
+
+arlCore::Dornaika_LS_cost_function::~Dornaika_LS_cost_function(){}
+
+void arlCore::Dornaika_LS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+//  assert(x.size()==number_of_unknowns);
+    const double Lambda1=1;
+    const double Lambda2=1;
+    const unsigned int Lambda = 2000000; // 80000
+    unsigned int i, j;
+    m_error=0.0;
+    vnl_quaternion<double> q(x[0],x[1],x[2],x[3]);
+    vnl_vector_fixed<double,3> translation(x[4],x[5],x[6]);
+    vnl_rotation3d_matrix  rotA, rotB, rotX;
+    vnl_vector_fixed<double,3>  pi, piprime, sum2;
+    vnl_matrix_fixed<double,3,3> identite, sum1;
+    identite.set_identity();
+    sum1.fill(0.0);
+    sum2.fill(0.0);
+    vnl_rigid_matrix X;
+    double norme=0.0, frob, temp;
+    for( i=0 ; i<m_A_matrix.size()  ; ++i )
+    {
+        temp=0;
+        //extraction des vecteurs rotation et translation
+        X.setQuaternion(q);
+        rotX = X.extract(3,3);
+        rotB = m_B_matrix[i].getRotation();
+        pi = m_B_matrix[i].getTranslation();
+        rotA = m_A_matrix[i].getRotation();
+        piprime = m_A_matrix[i].getTranslation();
+        //calcul du premier terme
+        sum1 = rotX*rotB - rotA*rotX;
+        sum1 = sum1*sum1 ;
+        //calcul du  ( K - Id )
+        rotA = rotA - identite;
+        //rotation du vecteur translation de X
+        translation = rotA * translation;
+        //calcul du 2ieme terme
+        sum2 = rotX*pi - piprime - translation;
+        for( j=0 ; j<sum2.size() ; ++j )
+        {
+            sum2[j] = sum2[j]*sum2[j] ;
+            temp+=sum2[j]*Lambda2;
+        }
+        X.fill(0.0);
+        X.setRotation(sum1);
+        frob = X.frobenius_norm();
+        norme=0.0;
+        for(j=0;j<q.size();j++)
+            norme += (q[j]*q[j]);
+        norme = sqrt(norme);
+        fx[i] = temp+frob*frob*Lambda1+Lambda*(1- norme)*(Lambda*(1- norme));
+        m_error += fx[i];
+        translation[0] = x[4];
+        translation[1] = x[5];
+        translation[2] = x[6];
+    }
+    observe(x);
+}
+
+void arlCore::Dornaika_LS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& g)
+{
+    vnl_least_squares_function::fdgradf(x, g, 1e-8);
+}
+
+// Polynomial_cost_function
+arlCore::Polynomial_cost_function::Polynomial_cost_function( PointList::csptr real, PointList::csptr distorded, unsigned int degree ) :
+vnl_cost_function(nbPolynomialParameters(degree, m_nbEquations)),
+m_real(real),
+m_distorded(distorded),
+m_nbEquations(3),
+m_degree(degree){}
+
+arlCore::Polynomial_cost_function::~Polynomial_cost_function(){}
+
+double arlCore::Polynomial_cost_function::f( vnl_vector<double > const &x )
+{
+    assert(m_distorded->size()==m_real->size());
+    assert(nbPolynomialParameters(m_degree, m_nbEquations)==x.size());
+    m_error=0;
+    unsigned int i, j;
+    for( i=0 ; i<m_distorded->size() ; ++i )
+    {
+        vnl_vector<double> distorded(m_nbEquations), distorsion;
+        for( j=0 ; j<m_nbEquations ; ++j )
+            distorded[j] = (*m_distorded)[i]->get(j);
+        if(!computePolynomial( m_degree, x, distorded, distorsion ))
+            m_error += 10000;
+        else
+            for( j=0 ; j<m_nbEquations ; ++j )
+                m_error += (distorded[j]-distorsion[j]-(*m_real)[i]->get(j))*(distorded[j]-distorsion[j]-(*m_real)[i]->get(j));
+    }
+    return observe(x);
+}
+
+unsigned int arlCore::Polynomial_cost_function::getNbParameters()
+{
+    return nbPolynomialParameters(m_degree, m_nbEquations);
+}
+
+// OptimiseReprojectionUncertainty
+arlCore::OptimiseReprojectionUncertainty::OptimiseReprojectionUncertainty(const vector<const arlCore::Camera*> &cameras, const vector<arlCore::Point::csptr> &points2D):
+vnl_cost_function(3),
+m_cameras(cameras),
+m_points2D(points2D)
+{
+    unsigned int i;
+    //m_inv_cov_matrix.resize(m_cameras.size());
+    for( i=0 ; i<m_cameras.size() ; i++ )
+    {
+        vnl_matrix<double> tmp(2,2);
+        tmp = vnl_matrix_inverse<double>(points2D[i]->getCovMatrix());
+        m_inv_cov_matrix.push_back(tmp);
+    }
+}
+
+arlCore::OptimiseReprojectionUncertainty::~OptimiseReprojectionUncertainty(){}
+
+double arlCore::OptimiseReprojectionUncertainty::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==3);
+    vnl_vector_fixed<double,4> point3DH(x[0], x[1], x[2], 1.0);
+    vnl_vector_fixed<double,2> reprojPoint2D;
+    vnl_matrix_fixed<double,2,1> pointSubtraction;
+    vnl_matrix_fixed<double,1,1> error(0.0);
+    unsigned int i;
+    for( i=0 ; i<m_cameras.size() ; i++ )
+    {
+        assert(m_points2D[i]->size()==2);
+        m_cameras[i]->project3DPoint(point3DH, reprojPoint2D);
+        pointSubtraction[0][0] = reprojPoint2D[0]-m_points2D[i]->x();
+        pointSubtraction[1][0] = reprojPoint2D[1]-m_points2D[i]->y();
+        if(m_points2D[i]->getCovMatrix().is_zero())
+            error += pointSubtraction.transpose() * pointSubtraction;
+        else error += pointSubtraction.transpose().as_matrix() * ((m_inv_cov_matrix[i])) * pointSubtraction;
+        //std::cerr<<"mat cov  ="<<(m_inv_cov_matrix[i])<<std::endl;
+    }
+    m_error = error[0][0];
+    return observe(x);
+}
+
+// OptimiseLineIntersection
+arlCore::OptimiseLineIntersection::OptimiseLineIntersection(const std::vector< vgl_line_3d_2_points <double> > &lines):
+vnl_cost_function(3),
+m_lineList(lines){}
+
+arlCore::OptimiseLineIntersection::~OptimiseLineIntersection(){}
+
+double arlCore::OptimiseLineIntersection::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==3);
+    vgl_point_3d< double > vglPoint3D(x[0],x[1],x[2]);
+    m_error=0.0;
+    unsigned int i;
+    for( i=0 ; i<m_lineList.size() ; i++ )
+        m_error += vgl_distance(m_lineList[i], vglPoint3D);
+    return observe(x);
+}
+
+// EPPC
+arlCore::EPPC_cost_function::EPPC_cost_function(
+    const std::vector < const arlCore::Camera *> &c,
+    const std::vector<Point::csptr > &model3D,
+    const std::vector< std::vector<arlCore::Point::csptr> >&points2DList,
+    vnl_matrix_fixed<double,4,4> &trsf):
+vnl_cost_function(3*(unsigned int)model3D.size()),
+m_cameras(c),
+m_model3D(model3D),
+m_points2DList(points2DList),
+m_trsf(trsf)
+{
+    unsigned int i,j;
+    m_invCovMat3D.resize(model3D.size());
+    for( i=0 ; i<model3D.size() ; ++i )
+    {
+        if( model3D[i]->getCovMatrix().is_zero())
+            m_invCovMat3D[i].set_identity();
+        else
+            m_invCovMat3D[i] = vnl_matrix_inverse<double>(model3D[i]->getCovMatrix());
+    }
+    m_invCovMat2D.resize(points2DList.size());
+    for( i=0 ; i<points2DList.size() ; ++i )
+    {
+        m_invCovMat2D[i].resize(points2DList[i].size());
+        for( j=0 ; j<points2DList[i].size() ; ++j )
+        {
+            if( points2DList[i][j]->getCovMatrix().is_zero())
+                m_invCovMat2D[i][j].set_identity();
+            else
+                m_invCovMat2D[i][j] = vnl_matrix_inverse<double>(points2DList[i][j]->getCovMatrix());
+        }
+    }
+}
+
+double arlCore::EPPC_cost_function::f(vnl_vector< double > const &x)
+{
+    const unsigned int ModelSize = (unsigned int)m_model3D.size();
+    assert(x.size()==ModelSize*3);
+    std::vector< vnl_vector_fixed<double,4> > points3DRepereCam(ModelSize);
+    vnl_vector_fixed<double,4> points3DEstimes(1.0);
+    vnl_matrix<double> vector3Dsub(3,1);
+    vnl_matrix<double> vector2Dsub(2,1);
+    unsigned int i,j;
+    m_2Derror(0,0)=0.0;
+    m_3Derror(0,0)=0.0;
+    for( i=0 ; i<ModelSize ; ++i )
+    {
+        assert(m_model3D[i]->size()==3);
+        points3DEstimes.put(0, x[3*i]);
+        points3DEstimes.put(1, x[3*i+1]);
+        points3DEstimes.put(2, x[3*i+2]);
+        points3DRepereCam[i] = m_trsf * points3DEstimes;
+        for( j=0 ; j<3 ; ++j )
+            vector3Dsub.put(j, 0,  points3DEstimes(j) - m_model3D[i]->get(j) );
+        m_3Derror += vector3Dsub.transpose() * m_invCovMat3D[i] * (vector3Dsub);
+    }
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        assert(m_points2DList[i].size()==ModelSize);
+        for(j=0 ; j<m_points2DList[i].size() ; ++j)
+            if(m_points2DList[i][j]!=0)
+            {
+                assert(m_points2DList[i][j]->size()==2);
+                if(m_points2DList[i][j]->isVisible())
+                {
+                    vnl_vector_fixed<double,2> projPoint2D, point2D(m_points2DList[i][j]->x(),m_points2DList[i][j]->y());
+                    m_cameras[i]->project3DPoint(points3DRepereCam[j], projPoint2D);
+                    vector2Dsub.set_column(0, projPoint2D - point2D);
+                    m_2Derror += vector2Dsub.transpose() * m_invCovMat2D[i][j] * vector2Dsub;
+                }
+            }
+    }
+    m_error = m_2Derror(0,0) + m_3Derror(0,0);
+    //std::cerr<<"erreur EPPC 2D :"<< m_2Derror(0,0)<<"    3D :"<< m_3Derror(0,0)<<std::endl;
+    return observe(x);
+}
+
+void arlCore::EPPC_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// EPPC LS
+arlCore::EPPC_LS_cost_function::EPPC_LS_cost_function(const std::vector < const Camera *> &c,
+                                                    const std::vector<Point::csptr > &model3D, const std::vector< std::vector<Point::csptr> >&points2DList,
+                                                    vnl_matrix_fixed<double,4,4> &trsf, unsigned int number_of_unknowns,
+                                                    unsigned int number_of_residuals, UseGradient g):
+vnl_least_squares_function(3*model3D.size(), number_of_residuals, g),
+m_cameras(c),
+m_model3D(model3D),
+m_points2DList(points2DList),
+m_trsf(trsf)
+{
+    unsigned int i,j;
+    m_invCovMat3D.resize(model3D.size());
+    for( i=0 ; i<model3D.size() ; ++i )
+    {
+        if( model3D[i]->getCovMatrix().is_zero())
+            m_invCovMat3D[i].set_identity();
+        else
+            m_invCovMat3D[i] = vnl_matrix_inverse<double>(model3D[i]->getCovMatrix());
+    }
+    m_invCovMat2D.resize(points2DList.size());
+    for( i=0 ; i<points2DList.size() ; ++i )
+    {
+        m_invCovMat2D[i].resize(points2DList[i].size());
+        for( j=0 ; j<points2DList[i].size() ; ++j )
+        {
+            if( points2DList[i][j]->getCovMatrix().is_zero())
+                m_invCovMat2D[i][j].set_identity();
+            else
+                m_invCovMat2D[i][j] = vnl_matrix_inverse<double>(points2DList[i][j]->getCovMatrix());
+        }
+    }
+}
+
+void arlCore::EPPC_LS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    const unsigned int ModelSize = (unsigned int)m_model3D.size();
+    assert(x.size()==ModelSize*3);
+    std::vector< vnl_vector_fixed<double,4> > points3DRepereCam(ModelSize);
+    vnl_vector_fixed<double,4> points3DEstimes(1.0);
+    vnl_matrix<double> vector3Dsub(3,1);
+    vnl_matrix<double> vector2Dsub(2,1);
+    unsigned int i,j, index=0;
+    m_2Derror(0,0)=0.0;
+    m_3Derror(0,0)=0.0;
+    for( i=0 ; i<ModelSize ; ++i )
+    {
+        assert(m_model3D[i]->size()==3);
+        points3DEstimes.put(0, x[3*i]);
+        points3DEstimes.put(1, x[3*i+1]);
+        points3DEstimes.put(2, x[3*i+2]);
+        points3DRepereCam[i] = m_trsf * points3DEstimes;
+        for( j=0 ; j<3 ; ++j )
+            vector3Dsub.put(j, 0,  points3DEstimes(j) - m_model3D[i]->get(j) );
+        m_3Derror += vector3Dsub.transpose() * m_invCovMat3D[i] * (vector3Dsub);
+        fx[index] = sqrt( (vector3Dsub.transpose() * m_invCovMat3D[i] * (vector3Dsub))(0,0) );
+        ++index;
+    }
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        assert(m_points2DList[i].size()==ModelSize);
+        for(j=0 ; j<m_points2DList[i].size() ; ++j)
+        {
+            if(m_points2DList[i][j]!=0)
+            {
+                assert(m_points2DList[i][j]->size()==2);
+                if(m_points2DList[i][j]->isVisible())
+                {
+                    vnl_vector_fixed<double,2> point2D(m_points2DList[i][j]->x(),m_points2DList[i][j]->y());
+                    vnl_vector_fixed<double,2> projPoint2D;
+                    m_cameras[i]->project3DPoint(points3DRepereCam[j], projPoint2D);
+                    vector2Dsub.set_column(0, projPoint2D - point2D);
+                    m_2Derror += vector2Dsub.transpose() * m_invCovMat2D[i][j] * vector2Dsub;
+                    fx[index] = sqrt((vector2Dsub.transpose() * m_invCovMat2D[i][j] * vector2Dsub)(0,0));
+                }
+            }
+            ++index;
+        }
+    }
+    //std::cerr<<"erreur EPPC 2D :"<< m_2Derror(0,0)<<"    3D :"<< m_3Derror(0,0)<<std::endl;
+    m_error = m_2Derror(0,0) + m_3Derror(0,0);
+    observe(x);
+}
+
+void arlCore::EPPC_LS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// ISPPC
+arlCore::ISPPC_cost_function::ISPPC_cost_function(const std::vector<const Camera *>&a,
+            const std::vector< vnl_vector_fixed<double,4> > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D, bool noise_feature):
+vnl_cost_function(6),
+m_points3D(points3D),
+m_points2D(points2D),
+m_cameras(a),
+m_noise_feature(noise_feature)
+{
+    if(m_noise_feature == true)
+    {
+        unsigned int i,j;
+        m_invCovMat2D.resize(points2D.size());
+        for( i=0 ; i<points2D.size() ; ++i )
+        {
+            assert(m_points3D.size()==m_points2D[i].size());
+            m_invCovMat2D[i].resize(points2D[i].size());
+            for( j=0 ; j<points2D[i].size() ; ++j )
+            {
+                if( points2D[i][j]->getCovMatrix().is_zero())
+                    m_invCovMat2D[i][j].set_identity();
+                else
+                    m_invCovMat2D[i][j] = vnl_matrix_inverse<double>(points2D[i][j]->getCovMatrix());
+            }
+        }
+    }
+}
+
+double arlCore::ISPPC_cost_function::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    vnl_vector_fixed<double,2> projPoint2D;
+    unsigned int i,j;
+    m_error=0.0;
+    double errorX, errorY;
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+    if(!m_noise_feature)
+    {
+        for(i=0 ; i<m_cameras.size() ; ++i)
+        {
+            assert(m_points3D.size()==m_points2D[i].size());
+            for(j=0 ; j<m_points2D[i].size() ; ++j)
+                if(m_points2D[i][j]!=0)
+                    if(m_points2D[i][j]->isVisible())
+                    {
+                        vnl_vector_fixed<double,4> points3DRepereCam = trsf * m_points3D[j];
+                        if(m_cameras[i]->project3DPoint(points3DRepereCam, projPoint2D))
+                        {
+                            errorX = projPoint2D(0) - m_points2D[i][j]->x();
+                            errorY = projPoint2D(1) - m_points2D[i][j]->y();
+                            //std::cerr<< errorX << "  "<<errorY <<std::endl;
+                            m_error += errorX*errorX + errorY*errorY;
+                        }
+                    }
+        }
+    }
+    else
+    {
+        vnl_matrix<double> vector2Dsub(2,1);
+        vnl_matrix_fixed<double,1,1> matrix_2Derror;
+        matrix_2Derror.fill(0.0);
+        for(i=0 ; i<m_cameras.size() ; ++i)
+        {
+            assert(m_points3D.size()==m_points2D[i].size());
+            for(j=0 ; j<m_points2D[i].size() ; ++j)
+                if(m_points2D[i][j]!=0)
+                    if(m_points2D[i][j]->isVisible())
+                    {
+                        vnl_vector_fixed<double,4> points3DRepereCam = trsf * m_points3D[j];
+                        if(m_cameras[i]->project3DPoint(points3DRepereCam, projPoint2D))
+                        {
+                            vnl_vector_fixed<double,2> point2D(m_points2D[i][j]->x(),m_points2D[i][j]->y());
+                            vector2Dsub.set_column(0, projPoint2D - point2D);
+                            matrix_2Derror += vector2Dsub.transpose() * m_invCovMat2D[i][j] * vector2Dsub;
+                        }
+                    }
+        }
+        m_error = matrix_2Derror.get(0,0);
+    }
+    //std::cerr<<"error ISPPC POW= "<< m_error<<std::endl;
+    return observe(x);
+}
+void arlCore::ISPPC_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// ISPPC LS
+arlCore::ISPPC_LS_cost_function::ISPPC_LS_cost_function(const std::vector<const Camera *>&a,
+            const std::vector< vnl_vector_fixed<double,4> > &points3D,
+            const std::vector< std::vector<Point::csptr> > &points2D,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g, bool noise_feature):
+vnl_least_squares_function(number_of_unknowns, number_of_residuals, g),
+m_points3D(points3D),
+m_points2D(points2D),
+m_cameras(a),
+m_noise_feature(noise_feature)
+{
+    if(m_noise_feature == true)
+    {
+        unsigned int i,j;
+        m_invCovMat2D.resize(points2D.size());
+        for( i=0 ; i<points2D.size() ; ++i )
+        {
+            m_invCovMat2D[i].resize(points2D[i].size());
+            for( j=0 ; j<points2D[i].size() ; ++j )
+            {
+                if( points2D[i][j]->getCovMatrix().is_zero())
+                    m_invCovMat2D[i][j].set_identity();
+                else
+                    m_invCovMat2D[i][j] = vnl_matrix_inverse<double>(points2D[i][j]->getCovMatrix());
+            }
+        }
+    }
+}
+
+// Il faut connaitre  l'avance le nombre de points visibles (comptabilis par index).
+// Ce nombre de points visibles doit tre donn en paramtre lors de la construction
+// de l'objet arlCore::ISPPC_LS_cost_function
+void arlCore::ISPPC_LS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    vnl_vector_fixed<double,2> projPoint2D;
+    unsigned int i,j, index=0;
+    double errorX, errorY;
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+    m_error = 0.0;
+    if(m_noise_feature == false)
+    {
+        for(i=0 ; i<m_cameras.size() ; ++i)
+        {
+            assert(m_points3D.size()==m_points2D[i].size());
+            for(j=0 ; j<m_points2D[i].size() ; ++j)
+                if(m_points2D[i][j]!=0)
+                    if(m_points2D[i][j]->isVisible())
+                    {
+                        vnl_vector_fixed<double,4> points3DRepereCam = trsf * m_points3D[j];
+                        if(m_cameras[i]->project3DPoint(points3DRepereCam, projPoint2D))
+                        {
+                            errorX = projPoint2D(0)-m_points2D[i][j]->x();
+                            errorY = projPoint2D(1)-m_points2D[i][j]->y();
+                            fx[index] = sqrt(errorX *errorX + errorY*errorY);
+                            m_error += fx[index];
+                        }
+                        index++;
+                    }
+        }
+    }
+    else
+    {
+        vnl_matrix<double> vector2Dsub(2,1);
+        vnl_matrix_fixed<double,1,1> matrix_2Derror;
+        for(i=0 ; i<m_cameras.size() ; ++i)
+        {
+            assert(m_points3D.size()==m_points2D[i].size());
+            for(j=0 ; j<m_points2D[i].size() ; ++j)
+                if(m_points2D[i][j]!=0)
+                    if(m_points2D[i][j]->isVisible())
+                    {
+                        vnl_vector_fixed<double,4> points3DRepereCam = trsf * m_points3D[j];
+                        if(m_cameras[i]->project3DPoint(points3DRepereCam, projPoint2D))
+                        {
+                            vnl_vector_fixed<double,2> point2D(m_points2D[i][j]->x(),m_points2D[i][j]->y());
+                            vector2Dsub.set_column(0, projPoint2D - point2D);
+                            matrix_2Derror = vector2Dsub.transpose() * m_invCovMat2D[i][j] * vector2Dsub;
+                            //matrix_2Derror = vector2Dsub.transpose() * vector2Dsub;
+                            //toto +=  matrix_2Derror(0,0);
+                            fx[index] = sqrt(matrix_2Derror(0,0));
+                            m_error += fx[index];
+                        }
+                        index++;
+                    }
+        }
+    }
+    observe(x);
+}
+
+void arlCore::ISPPC_LS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// OSPPC
+arlCore::OSPPC_cost_function::OSPPC_cost_function(const std::vector<const arlCore::Camera *>&a,
+    const std::vector< Point::csptr  > &points3D,
+    const std::vector< std::vector<arlCore::Point::csptr> > &points2D):
+vnl_cost_function(6),
+m_points3D(points3D),
+m_points2D(points2D),
+m_cameras(a)
+{
+    unsigned int i,j;
+    m_extPoints2D.resize(m_cameras.size());
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        m_extPoints2D[i].resize(m_points2D[i].size());
+        for( j=0 ; j<m_points2D[i].size() ; ++j )
+            if(m_points2D[i][j]!=0)
+                if(m_points2D[i][j]->isVisible())
+                    m_cameras[i]->pixelPlaneToUnitFocalPlane( m_points2D[i][j], m_extPoints2D[i][j], false );
+    }
+}
+
+double arlCore::OSPPC_cost_function::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    m_error = 0.0;
+    unsigned int i,j;
+    vnl_vector_fixed<double,3> crossProduct;
+    vnl_vector_fixed<double,4> extPoints3D;
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+    for(i=0 ; i<m_cameras.size() ; ++i)
+    {
+        assert(m_points3D.size()==m_points2D[i].size());
+        for(j=0 ; j<m_points3D.size() ; ++j)
+            if(m_points2D[i][j]!=0)
+                if(m_points2D[i][j]->isVisible())
+                {   //Ce critere calcule la distance entre les demi-droites [Cimij) et les points T*Mj
+                    //On exprime d'abord le point mij dans le repere optique de la camera i
+                    //Puis on calcule les coordonnes de T*Mj dans le repere optique de la camera i
+                    //Puis on calcule cette distance en faisant le produit vectoriel [Cimij)xCiMj / norm([Cimij))= ||CiMj||sin(theta)
+                    extPoints3D = m_cameras[i]->getExtrinsic()* trsf * m_points3D[j]->getHCoordinates();
+                    crossProduct = vnl_cross_3d( m_extPoints2D[i][j], extPoints3D.extract(3) )/ m_extPoints2D[i][j].two_norm();
+                    m_error += crossProduct.squared_magnitude();
+                }
+    }
+    return observe(x);
+}
+
+void arlCore::OSPPC_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// OSPPC LS
+arlCore::OSPPC_LS_cost_function::OSPPC_LS_cost_function(const std::vector<const Camera *>&a,
+                                                        const std::vector< Point::csptr  > &points3D, const std::vector< std::vector<Point::csptr> > &points2D,
+    unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g):
+vnl_least_squares_function(number_of_unknowns, number_of_residuals, g),
+m_points3D(points3D),
+m_points2D(points2D),
+m_cameras(a)
+{
+    unsigned int i,j;
+    m_extPoints2D.resize(m_cameras.size());
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        m_extPoints2D[i].resize(m_points2D[i].size());
+        for( j=0 ; j<m_points2D[i].size() ; ++j )
+            if(m_points2D[i][j]!=0)
+                if(m_points2D[i][j]->isVisible())
+                    m_cameras[i]->pixelPlaneToUnitFocalPlane( m_points2D[i][j], m_extPoints2D[i][j], false );
+    }
+}
+
+void arlCore::OSPPC_LS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    unsigned int i,j, index=0;
+    vnl_vector_fixed<double,3> crossProduct;
+    vnl_vector_fixed<double,4> extPoints3D;
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+    m_error = 0.0;
+    for(i=0 ; i<m_cameras.size() ; ++i)
+    {
+        assert(m_points3D.size()==m_points2D[i].size());
+        for(j=0 ; j<m_points3D.size() ; ++j)
+        {
+            if(m_points2D[i][j]!=0)
+                if(m_points2D[i][j]->isVisible())
+                {   //Ce critere calcule la distance entre les demi-droites [Cimij) et les points T*Mj
+                    //On exprime d'abord le point mij dans le repere optique de la camera i
+                    //Puis on calcule les coordonnes de T*Mj dans le repere optique de la camera i
+                    //Puis on calcule cette distance en faisant le produit vectoriel [Cimij)xCiMj / norm([Cimij))= ||CiMj||sin(theta)
+                    extPoints3D = m_cameras[i]->getExtrinsic()* trsf * m_points3D[j]->getHCoordinates();
+                    crossProduct = vnl_cross_3d( m_extPoints2D[i][j], extPoints3D.extract(3) )/ m_extPoints2D[i][j].two_norm();
+                    fx[index]=sqrt(crossProduct.squared_magnitude());
+                    m_error += fx[index];
+                }
+            ++index;
+        }
+    }
+    observe(x);
+}
+
+void arlCore::OSPPC_LS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// INTRINSIC
+arlCore::Intrinsic_cost_function::Intrinsic_cost_function(unsigned int nbParameters):
+    m_nbParameters(nbParameters)//nb de parametres que l'on souhaite optimiser
+{
+    if(nbParameters==0 || nbParameters>8) m_nbParameters=8;
+    else m_nbParameters = nbParameters;
+    assert(m_nbParameters>=4);
+    m_camera = new Camera(m_universe);
+    m_verbose = false;
+    m_available_reprojection_error = false;
+}
+
+arlCore::Intrinsic_cost_function::~Intrinsic_cost_function()
+{
+    unsigned int i;
+    for( i=0 ; i<m_2DpatternsList.size() ; ++i )
+        if(m_2DpatternsList[i]!=0) delete m_2DpatternsList[i];
+    for( i=0 ; i<m_3DpatternsList.size() ; ++i )
+        if(m_3DpatternsList[i]!=0) delete m_3DpatternsList[i];
+    if(m_camera!=0) delete m_camera;
+}
+
+unsigned int arlCore::Intrinsic_cost_function::getNbParameters( void ) const
+{
+    return m_nbParameters;
+}
+
+bool arlCore::Intrinsic_cost_function::save( const std::string &fileName ) const
+{
+    if(m_camera==0) return false;
+    return m_camera->save(fileName);
+}
+
+unsigned int arlCore::Intrinsic_cost_function::addPattern( const std::vector<Point::sptr >& points2D, const std::vector<Point::sptr >& model3D )
+{// Call addPattern for each rigid pattern and each pose
+    assert(points2D.size()==model3D.size());
+    unsigned int i, size = (unsigned int)m_2DpatternsList.size();
+    PointList *patternsList2D = new PointList(2);
+    PointList *patternsList3D = new PointList(3);
+    for( i=0 ; i<points2D.size() ; ++i )
+        if(patternsList2D->push_back( points2D[i] ))
+            if(!patternsList3D->push_back( model3D[i] ))
+                patternsList2D->pop_back();
+    m_2DpatternsList.push_back(patternsList2D);
+    m_3DpatternsList.push_back(patternsList3D);
+    assert(m_2DpatternsList[size]->size()==m_3DpatternsList[size]->size());
+    assert(m_2DpatternsList.size()==m_3DpatternsList.size());
+    set_number_of_unknowns(m_nbParameters + 6 * m_2DpatternsList.size());
+    return(m_2DpatternsList[size]->size());
+}
+
+void arlCore::Intrinsic_cost_function::setVerbose(bool verbose)
+{m_verbose = verbose;}
+
+std::vector<double> arlCore::Intrinsic_cost_function::getReprojectionError( vnl_vector< double > const &x)
+{
+    m_available_reprojection_error = true;
+    f(x);
+    return m_point_reprojection_error;
+}
+
+double arlCore::Intrinsic_cost_function::f(vnl_vector< double > const &x)
+{
+    m_error = 0.0;
+    double errorX, errorY;
+    unsigned int i,j;
+    long int nbPoints = 0;
+    Point::sptr point2D = Point::New();
+    point2D->init(2);
+    m_camera->setIntrinsic(x.extract(m_nbParameters));
+    for( i=0 ; i<m_2DpatternsList.size() ; ++i )
+    {
+        arlCore::vnl_rigid_vector vec(x.extract(6,m_nbParameters+6*i));
+        arlCore::vnl_rigid_matrix Ti(vec);
+        m_camera->setExtrinsic(Ti);
+        for( j=0 ; j<m_2DpatternsList[i]->size() ; ++j,++nbPoints )
+            if(m_camera->project3DPoint( m_3DpatternsList[i]->get(j) , point2D))
+            {
+                errorX = point2D->x() - m_2DpatternsList[i]->get(j)->x();
+                errorY = point2D->y() - m_2DpatternsList[i]->get(j)->y();
+                m_error += errorX*errorX + errorY*errorY;
+                if(m_available_reprojection_error)
+                {
+                    m_point_reprojection_error.push_back(sqrt(errorX *errorX + errorY*errorY));
+                }
+            }
+            else // Focal plane
+                return error(x);
+    }
+    m_error /= nbPoints;
+    if(m_verbose){std::cerr<<"reprojection error= "<<sqrt(m_error)<<std::endl;}
+    return observe(x);
+}
+
+void arlCore::Intrinsic_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& g)
+{
+    fdgradf(x, g);
+}
+
+// INTRINSIC LS
+arlCore::IntrinsicLS_cost_function::IntrinsicLS_cost_function(unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g):
+    vnl_least_squares_function(number_of_unknowns, number_of_residuals, g)
+    //nbParameters = nb de parametre que l'on souhaite optimiser
+{
+    m_nbParameters = 8;
+//  assert(nbParameters<=10);//verifie la coherence du nombre de parametre estime
+//  if(nbParameters==0 || nbParameters>8) m_nbParameters=8;
+//  else m_nbParameters = nbParameters;
+//  assert(m_nbParameters>=4);
+    m_verbose = false;
+    m_camera = new Camera(m_universe);
+}
+
+arlCore::IntrinsicLS_cost_function::~IntrinsicLS_cost_function()
+{
+    unsigned int i;
+    for( i=0 ; i<m_2DpatternsList.size() ; ++i )
+        if(m_2DpatternsList[i]!=0) delete m_2DpatternsList[i];
+    for( i=0 ; i<m_3DpatternsList.size() ; ++i )
+        if(m_3DpatternsList[i]!=0) delete m_3DpatternsList[i];
+    if(m_camera!=0) delete m_camera;
+}
+
+unsigned int arlCore::IntrinsicLS_cost_function::getNbParameters( void ) const
+{
+    return m_nbParameters;
+}
+
+bool arlCore::IntrinsicLS_cost_function::save( const std::string &fileName ) const
+{
+    if(m_camera==0) return false;
+    return m_camera->save(fileName);
+}
+
+unsigned int arlCore::IntrinsicLS_cost_function::addPattern( const std::vector<Point::sptr >& points2D, const std::vector<Point::sptr >& model3D )
+{// faire addPattern pour chaque pattern rigide et chaque pose
+    assert(points2D.size()==model3D.size());
+    unsigned int i, size = (unsigned int)m_2DpatternsList.size();
+    PointList *patternsList2D = new PointList(2);
+    PointList *patternsList3D = new PointList(3);
+    for( i=0 ; i<points2D.size() ; ++i )
+        if(patternsList2D->push_back( points2D[i] ))
+            if(!patternsList3D->push_back( model3D[i] ))
+                patternsList2D->pop_back();
+    m_2DpatternsList.push_back(patternsList2D);
+    m_3DpatternsList.push_back(patternsList3D);
+    assert(m_2DpatternsList[size]->size()==m_3DpatternsList[size]->size());
+    assert(m_2DpatternsList.size()==m_3DpatternsList.size());
+    //set_number_of_unknowns(m_nbParameters + 6 * m_2DpatternsList.size());
+    return(m_2DpatternsList[size]->size());
+}
+
+void arlCore::IntrinsicLS_cost_function::getReprojectionError( vnl_vector< double > const &x, vnl_vector< double > &fx )
+{
+    f(x,fx);
+}
+
+void arlCore::IntrinsicLS_cost_function::setVerbose(bool verbose)
+{m_verbose = verbose;}
+
+void arlCore::IntrinsicLS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    m_error = 0.0;
+    unsigned int i,j;
+    long int index = 0, nbPoints = 0;
+    Point::sptr point2D = Point::New();
+    point2D->init(2);
+    m_camera->setIntrinsic(x.extract(m_nbParameters));
+    for( i=0 ; i<m_2DpatternsList.size() ; ++i )
+    {
+        arlCore::vnl_rigid_vector vec(x.extract(6,m_nbParameters+6*i));
+        arlCore::vnl_rigid_matrix Ti(vec);
+        m_camera->setExtrinsic(Ti);
+        for( j=0 ; j<m_2DpatternsList[i]->size() ; ++j,++index, ++nbPoints )
+            if(m_camera->project3DPoint( m_3DpatternsList[i]->get(j), point2D))
+            {
+                //fx[index + j] = point2D.distance(*(m_2DpatternsList[i]->get(j)));
+                fx[index] = point2D->distance( m_2DpatternsList[i]->get(j) );
+                m_error += fx[index]*fx[index];
+            }else
+            {   //! @todo Fixer le problme des singularits
+                //fx[index + j]=10000;
+                fx[index]=10000;
+                m_error += 10000;
+                std::cout<<"PlanFOCAL\n";
+            }
+        //index += m_2DpatternsList[i]->size();
+    }
+    m_error /= nbPoints;
+    observe(x);
+}
+
+void arlCore::IntrinsicLS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    const bool Verbose = false;
+    fdgradf(x, j, 1e-8);
+    if(Verbose)
+    {
+        std::cerr<<"calcul du gradient"<<std::endl;
+        std::cerr<<"reprojection error= "<<sqrt(m_error)<<std::endl;
+    }
+}
+
+// EXTRINSIC
+arlCore::Extrinsic_cost_function::Extrinsic_cost_function(const std::vector<const arlCore::Camera *>&a, unsigned int nou):
+vnl_cost_function(nou),
+m_cameras(a)
+{
+    m_verbose = false;
+    m_available_reprojection_error = false;
+}
+
+
+arlCore::Extrinsic_cost_function::~Extrinsic_cost_function(){}
+
+unsigned int arlCore::Extrinsic_cost_function::addPattern(const std::vector<std::vector<Point::csptr > >& points2D, const std::vector<Point::csptr >& model3D)
+{// faire addPattern pour chaque pattern rigide et chaque pose
+    //assert(points2D.size()==model3D.size());
+    unsigned int i, j;
+
+    std::vector<std::vector<Point::csptr > > patternsList2D;
+    std::vector< Point::csptr  > patternsList3D(model3D.size());
+    for( i=0 ; i<model3D.size() ; ++i )
+    {
+        patternsList3D[i] = model3D[i];
+//          if(patternsList2D->push_back(*(points2D[i])))
+//              if(!patternsList3D->push_back(*(model3D[i])))
+//                  patternsList2D->pop_back();
+    }
+    for( j=0 ; j<m_cameras.size() ; ++j )
+    {
+        std::vector<Point::csptr > tmp(points2D[j].size());
+        for( i=0 ; i<model3D.size() ; ++i )
+            tmp[i]=points2D[j][i];
+        patternsList2D.push_back(tmp);
+    }
+    m_2DpatternsList.push_back(patternsList2D);
+    m_3DpatternsList.push_back(patternsList3D);
+    //assert(m_2DpatternsList[size]->size()==m_3DpatternsList[size]->size());
+    //assert(m_2DpatternsList.size()==m_3DpatternsList.size());
+    //set_number_of_unknowns(m_nbParameters + 6 * m_2DpatternsList.size());
+    return(0);
+}
+
+void arlCore::Extrinsic_cost_function::setVerbose(bool verbose)
+{
+    m_verbose = verbose;
+}
+
+std::vector<double> arlCore::Extrinsic_cost_function::getReprojectionError(vnl_vector< double > const &x)
+{
+    m_available_reprojection_error = true;
+    f(x);
+    return m_point_reprojection_error;
+}
+
+double arlCore::Extrinsic_cost_function::f(vnl_vector< double > const &x)
+{
+    const unsigned int NbCameras = (unsigned int)m_cameras.size();
+    const unsigned int NbPoses = (unsigned int)m_3DpatternsList.size();
+    std::vector <arlCore::vnl_rigid_matrix> listTransfo(NbPoses + NbCameras -1);
+    vnl_vector_fixed<double,4> points3DRepereCam;
+    vnl_vector_fixed<double,2> projPoint2D;
+    unsigned int i,j,k,index=0;
+    m_error = 0.0;
+    double errorX, errorY;
+    // - il y a NbPoses Tei ie transformation entre les differentes poses de la mire
+    // et la camera 1
+    // - plus NbCameras-1 Tsj entre la camera 1 et les autres cameras
+    // TOTAL NbPoses + NbCameras -1 transformations a estimer
+    // par convention les NbPoses sont en premier dans le vnl_vector< double > x
+    for( i=0 ; i<NbPoses+NbCameras-1 ; ++i )
+    {
+        arlCore::vnl_rigid_vector rigid_vect;
+        for( j=0 ; j<6; ++j )
+            rigid_vect.put(j, x[6*i+j]);
+        listTransfo[i]=arlCore::vnl_rigid_matrix(rigid_vect);
+    }
+    //Calcul des coordonnes de points3d aprs application de la transfo recherche
+    for( i=0 ; i<NbPoses; ++i )
+        for( j=0 ; j<NbCameras; ++j )
+            for( k=0 ; k<m_3DpatternsList[i].size() ; ++k )
+            {
+                if(j==0) points3DRepereCam = listTransfo[i] * m_3DpatternsList[i][k]->getHCoordinates();
+                else points3DRepereCam = listTransfo[NbPoses-1+j] * listTransfo[i] * m_3DpatternsList[i][k]->getHCoordinates();
+                if(m_2DpatternsList[i][j][k]!=0)
+                {
+                    m_cameras[j]->project3DPoint(points3DRepereCam, projPoint2D);
+                    errorX = projPoint2D(0) - m_2DpatternsList[i][j][k]->x();
+                    errorY = projPoint2D(1) - m_2DpatternsList[i][j][k]->y();
+                    m_error += errorX *errorX + errorY*errorY;
+                    if(m_available_reprojection_error)
+                    {
+                        m_point_reprojection_error.push_back(sqrt(errorX *errorX + errorY*errorY));
+                        //std::cerr<<"hopla "<<errorX *errorX + errorY*errorY<<" "<<m_point_reprojection_error.size()<<"\n";
+                    }
+                    ++index;
+                }
+            }
+    m_error /= index;
+    if(m_verbose){std::cerr<<"reprojection error= "<<sqrt(m_error)<<std::endl;}
+    return observe(x);
+}
+
+//void arlCore::Extrinsic_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& g)
+//{
+//  fdgradf(x, g);
+//}
+
+// EXTRINSIC LS
+arlCore::ExtrinsicLS_cost_function::ExtrinsicLS_cost_function(const std::vector<const arlCore::Camera *>&a,unsigned int number_of_unknowns, unsigned int number_of_residuals, UseGradient g):
+    vnl_least_squares_function(number_of_unknowns, number_of_residuals, g),
+    m_cameras(a)
+{
+    m_verbose = false;
+}
+
+arlCore::ExtrinsicLS_cost_function::~ExtrinsicLS_cost_function(){}
+
+void arlCore::ExtrinsicLS_cost_function::setVerbose(bool verbose)
+{m_verbose = verbose;}
+
+unsigned int arlCore::ExtrinsicLS_cost_function::addPattern( const std::vector<std::vector<Point::csptr > >& points2D, const std::vector<Point::csptr >& model3D )
+{// faire addPattern pour chaque pattern rigide et chaque pose
+    //assert(points2D.size()==model3D.size());
+    unsigned int i, j;
+
+    std::vector<std::vector<Point::csptr > > patternsList2D;
+    std::vector< Point::csptr  > patternsList3D(model3D.size());
+    for( i=0 ; i<model3D.size() ; ++i )
+    {
+        patternsList3D[i] = model3D[i];
+//          if(patternsList2D->push_back(*(points2D[i])))
+//              if(!patternsList3D->push_back(*(model3D[i])))
+//                  patternsList2D->pop_back();
+    }
+    for( j=0 ; j<m_cameras.size() ; ++j )
+    {
+        std::vector<Point::csptr > tmp(points2D[j].size());
+        for( i=0 ; i<model3D.size() ; ++i )
+            tmp[i]=points2D[j][i];
+        patternsList2D.push_back(tmp);
+    }
+    m_2DpatternsList.push_back(patternsList2D);
+    m_3DpatternsList.push_back(patternsList3D);
+    //assert(m_2DpatternsList[size]->size()==m_3DpatternsList[size]->size());
+    //assert(m_2DpatternsList.size()==m_3DpatternsList.size());
+    //set_number_of_unknowns(m_nbParameters + 6 * m_2DpatternsList.size());
+    return 0;
+}
+
+void arlCore::ExtrinsicLS_cost_function::getReprojectionError( vnl_vector< double > const &x, vnl_vector< double > &fx )
+{
+    f(x,fx);
+}
+
+void arlCore::ExtrinsicLS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    long int index=0;// tmp_index=0;
+    //index increments for each 2D point visible in the video image.
+    //tmp_index is used in a loop and contain the number of visible 2D points for a video image
+    const unsigned int NbCameras = (unsigned int)m_cameras.size();
+    const unsigned int NbPoses = (unsigned int)m_3DpatternsList.size();
+    std::vector <arlCore::vnl_rigid_matrix> listTransfo(NbPoses+NbCameras-1);
+    vnl_vector_fixed<double,4> points3DRepereCam;
+    vnl_vector_fixed<double,2> projPoint2D;
+    unsigned int i,j,k;
+    m_error = 0.0;
+    double errorX, errorY;
+    // - il y a NbPoses Tei ie transformation entre les differentes poses de la mire
+    // et la camera 1
+    // - plus NbCameras-1 Tsj entre la camera 1 et les autres cameras
+    // TOTAL NbPoses + NbCameras -1 transformations a estimer
+    // par convention les NbPoses sont en premier dans le vnl_vector< double > x
+    for( i=0 ; i<NbPoses+NbCameras-1 ; ++i)
+    {
+        arlCore::vnl_rigid_vector rigid_vect;
+        for(j=0 ; j<6; ++j)
+            rigid_vect.put(j, x[6*i+j]);
+        listTransfo[i]=arlCore::vnl_rigid_matrix(rigid_vect);
+    }
+    for( i=0 ; i<NbPoses; ++i )
+        for( j=0 ; j<NbCameras; ++j )
+//      {
+            for( k=0 ; k<m_3DpatternsList[i].size() ; ++k )
+            {
+                if(j==0) points3DRepereCam = listTransfo[i] * m_3DpatternsList[i][k]->getHCoordinates();
+                else points3DRepereCam = listTransfo[NbPoses-1+j] * listTransfo[i] * m_3DpatternsList[i][k]->getHCoordinates();
+                if(m_2DpatternsList[i][j][k]!=0)
+                {
+                    m_cameras[j]->project3DPoint(points3DRepereCam, projPoint2D);//[i][j][k]);
+                    errorX  = projPoint2D(0) - m_2DpatternsList[i][j][k]->x();
+                    errorY  = projPoint2D(1) - m_2DpatternsList[i][j][k]->y();
+                    fx[index] = sqrt(errorX *errorX + errorY*errorY);
+                    m_error += fx[index]*fx[index];
+                    ++index;
+//                  ++tmp_index;
+                }
+            }
+//          index += tmp_index;
+//          tmp_index = 0;
+//      }
+
+    m_error /= index;
+    //std::cerr<<"erreur reprojection = "<<sqrt(m_error/index) <<"  " <<index<<std::endl;
+    observe(x);
+}
+
+void arlCore::ExtrinsicLS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+    if(m_verbose)
+    {
+        std::cerr<<"calcul du gradient"<<std::endl;
+        std::cerr<<"reprojection error= "<<sqrt(m_error)<<std::endl;
+    }
+}
+
+// AX=XB
+double arlCore::AX_XB_cost_function::f(vnl_vector< double > const &x)
+{
+    const bool Verbose = false;
+    assert(x.size()==6); //6
+    assert(m_A_matrix.size()==m_B_matrix.size());
+    arlCore::vnl_rigid_vector vX(x.extract(6));
+    arlCore::vnl_rigid_matrix mX(vX);
+    m_error = criterion( mX );
+    if(Verbose) cerr<<"error AX XB = "<<m_error/m_A_matrix.size()<<endl;
+    return observe(x);
+}
+
+double arlCore::AX_XB_cost_function::criterion( const arlCore::vnl_rigid_matrix &X )
+{
+    unsigned int i;
+    // 1=Norme de frobenius de AX-XB
+    // 2=Klaus Strobl & Gerd Hirzinger
+    const unsigned int Method = 2;
+    double error = 0.0, tErr, rErr;
+    for( i=0 ; i<m_A_matrix.size() ; ++i )
+    {
+        const vnl_rigid_matrix AX = m_A_matrix[i] * X;
+        const vnl_rigid_matrix XB = X * m_B_matrix[i];
+        AX.compare( XB, tErr, rErr );
+        const double TErr2 = tErr*tErr, RErr2 = rErr*rErr;
+        if(Method==1) error += (AX-XB).frobenius_norm();
+        if(Method==2) error += RErr2 + m_alpha*TErr2;
+    }
+    return error;
+}
+
+double arlCore::AX_XB_cost_function::getAlpha( const arlCore::vnl_rigid_matrix &X )
+{
+    const bool Verbose = false;
+    unsigned int i;
+    double tErr, rErr;
+    std::vector< double > translationErrors, rotationErrors;
+    for( i=0 ; i<m_A_matrix.size() ; ++i )
+    {
+        const vnl_rigid_matrix AX = m_A_matrix[i] * X;
+        const vnl_rigid_matrix XB = X * m_B_matrix[i];
+        AX.compare( XB, tErr, rErr );
+        translationErrors.push_back( tErr );
+        rotationErrors.push_back( rErr );
+    }
+    double min, max, rms, mean, stddev;
+    arlCore::statistic( translationErrors, min, max, rms, mean, stddev, false );
+    const double SigmaT = stddev;
+    arlCore::statistic( rotationErrors, min, max, rms, mean, stddev, false );
+    const double SigmaR = stddev;
+    if(SigmaR<1e-14) return 1.0;
+    const double Ratio = (SigmaT/SigmaR)*(SigmaT/SigmaR);
+    if(Verbose) std::cout<<"Ratio="<<Ratio<<" Sigma T"<<SigmaT<<" R"<<SigmaR<<"\n";
+    if(Ratio>1e-5) return 1.0/Ratio; else return 1.0;
+}
+
+void arlCore::AX_XB_cost_function::setAlpha( double alpha )
+{
+    m_alpha = alpha;
+}
+
+void arlCore::AX_XB_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// AXB_Z_cost_function
+double arlCore::AXB_Z_cost_function::criterion( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z )
+{
+    unsigned int i;
+    double error1 = 0.0, error2 = 0.0, error3 = 0.0, error4 = 0.0;
+    const arlCore::vnl_rigid_matrix invZ = Z.computeInverse();
+    assert( m_A_matrix.size()==m_B_matrix.size() );
+    for( i=0 ; i<m_A_matrix.size() ; ++i )
+    {
+        const arlCore::vnl_rigid_matrix AXB = m_A_matrix[i] * X * m_B_matrix[i];
+        // 1st Method : Optimization of A_iXB_i - Z
+        const vnl_matrix_fixed<double,4,4> Sum = AXB - Z.as_matrix() ;
+        error1 += Sum.frobenius_norm();
+
+        // 2nd Method : Optimization of sum_i
+        const arlCore::vnl_rigid_vector V( AXB * invZ );
+        error2 += V.as_vector().two_norm();
+
+        // 3rd Method : Optimization of distance2 between AXB & Z
+        error3 += AXB.distance2( Z, arlCore::ARLCORE_VRM_DISTANCE_3AXIS );
+
+        // 4th Method Klaus H. Strobl & Gerd Hirzinger
+        // Proceedings of the 2006 IEEE/RSJ International Conference on intelligent Robots and Systems
+        // October 9 -15, 2006, Beijing, China
+        double tErr, rErr;
+        AXB.compare( Z, tErr, rErr );
+        const double TErr2 = tErr*tErr, RErr2 = rErr*rErr;
+        error4 += RErr2 + m_alpha*TErr2;
+    }
+    return error4;
+}
+
+double arlCore::AXB_Z_cost_function::getAlpha( const arlCore::vnl_rigid_matrix &X, const arlCore::vnl_rigid_matrix &Z )
+{
+    unsigned int i;
+    double tErr, rErr;
+    std::vector< double > translationErrors, rotationErrors;
+    for( i=0 ; i<m_A_matrix.size() ; ++i )
+    {
+        const vnl_rigid_matrix BXA = m_B_matrix[i] * X * m_A_matrix[i];
+        BXA.compare( Z, tErr, rErr );
+        translationErrors.push_back( tErr );
+        rotationErrors.push_back( rErr );
+    }
+    double min, max, rms, mean, stddev;
+    arlCore::statistic( translationErrors, min, max, rms, mean, stddev, false );
+    const double SigmaT = stddev;
+    arlCore::statistic( rotationErrors, min, max, rms, mean, stddev, false );
+    const double SigmaR = stddev;
+    if(SigmaR<1e-14) return 1.0;
+    const double Ratio = (SigmaT/SigmaR)*(SigmaT/SigmaR);
+    std::cout<<"Ratio="<<Ratio<<" Sigma T"<<SigmaT<<" R"<<SigmaR<<"\n";
+    if(Ratio>1e-5) return 1.0/Ratio; else return 1.0;
+
+}
+
+double arlCore::AXB_Z_cost_function::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==12);
+    arlCore::vnl_rigid_vector vX(x.extract(6));
+    arlCore::vnl_rigid_vector vZ(x.extract(6,6));
+    arlCore::vnl_rigid_matrix X(vX);
+    arlCore::vnl_rigid_matrix Z(vZ);
+    m_error = criterion( X, Z );
+    //cerr<<"AXBZ = "<<m_error / (double)m_A_matrix.size()<<endl;
+    return observe(x);
+}
+
+void arlCore::AXB_Z_cost_function::setAlpha( double alpha )
+{
+    m_alpha = alpha;
+}
+
+void arlCore::AXB_Z_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    fdgradf(x, j, 1e-8);
+}
+
+// register3D3DUncertainty_cost_function
+arlCore::register3D3DUncertainty_cost_function::register3D3DUncertainty_cost_function(PointList::csptr points3D_source,
+            PointList::csptr points3D_cible):
+vnl_cost_function(6),
+m_points3D_source(points3D_source),
+m_points3D_cible(points3D_cible)
+{
+    assert(m_points3D_source->size()==m_points3D_cible->size());
+    unsigned int i;
+    //m_inv_cov_matrix.resize(m_cameras.size());
+    for( i=0 ; i<m_points3D_source->size() ; i++ )
+    {
+        vnl_matrix<double> tmp(3,3);
+        tmp = vnl_matrix_inverse<double>( (*points3D_cible)[i]->getCovMatrix());
+        m_inv_cov_matrix.push_back(tmp);
+    }
+}
+
+double arlCore::register3D3DUncertainty_cost_function::f(vnl_vector< double > const &x)
+{
+    assert(x.size()==6);
+    unsigned int i;
+    vnl_matrix_fixed<double,3,1> pointSubtraction;
+    vnl_matrix_fixed<double,1,1> error(0.0);
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+    m_error=0.0;
+    for(i=0 ; i<m_points3D_source->size() ; ++i)
+    {
+        arlCore::Point::sptr points3D_recale = arlCore::Point::New();
+        trsf.trf( (*m_points3D_source)[i], points3D_recale);
+        pointSubtraction[0][0] = (*points3D_recale)[0]-(*(*m_points3D_cible)[i])[0];
+        pointSubtraction[1][0] = (*points3D_recale)[1]-(*(*m_points3D_cible)[i])[1];
+        pointSubtraction[2][0] = (*points3D_recale)[2]-(*(*m_points3D_cible)[i])[2];
+        {
+            if( (*m_points3D_cible)[i]->getCovMatrix().is_zero())
+            {
+                error = pointSubtraction.transpose() * pointSubtraction;
+                m_error += error(0,0);
+                //std::cerr<<"covariance nulle"<<std::endl;
+            }
+            else
+            {
+                error = pointSubtraction.transpose().as_matrix() * ((m_inv_cov_matrix[i])) * pointSubtraction;
+                //error = pointSubtraction.transpose().as_matrix() * pointSubtraction;
+                m_error += error(0,0);
+            }
+            //std::cerr<<"mat cov  ="<<(m_inv_cov_matrix[i])<<std::endl;
+        }
+    }
+    return observe(x);
+}
+
+// register3D3DUncertainty_cost_function
+void arlCore::register3D3DUncertainty_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    //cerr<<"Calcul de gradf register3D3DUncertainty_LS_cost_function------------------"<<endl;
+    fdgradf(x, j, 1e-8);
+}
+
+
+arlCore::register3D3DUncertainty_LS_cost_function::register3D3DUncertainty_LS_cost_function(PointList::csptr points3D_source,
+            PointList::csptr points3D_cible,
+            unsigned int number_of_unknowns,
+            unsigned int number_of_residuals, UseGradient g):
+vnl_least_squares_function(number_of_unknowns, number_of_residuals, g),
+m_points3D_source(points3D_source),
+m_points3D_cible(points3D_cible)
+{
+    assert(m_points3D_source->size()==m_points3D_cible->size());
+    unsigned int i;
+    //m_inv_cov_matrix.resize(m_cameras.size());
+    for( i=0 ; i<m_points3D_source->size() ; i++ )
+    {
+        vnl_matrix<double> tmp(3,3);
+        tmp = vnl_matrix_inverse<double>( (*points3D_cible)[i]->getCovMatrix());
+        m_inv_cov_matrix.push_back(tmp);
+    }
+}
+void arlCore::register3D3DUncertainty_LS_cost_function::f(vnl_vector< double > const &x, vnl_vector< double > &fx)
+{
+    assert(x.size()==6);
+    unsigned int i;
+    vnl_matrix_fixed<double,3,1> pointSubtraction;
+    vnl_matrix_fixed<double,1,1> error(0.0);
+    arlCore::vnl_rigid_vector vec(x);
+    arlCore::vnl_rigid_matrix trsf(vec);
+
+    for(i=0 ; i<m_points3D_source->size() ; ++i)
+    {
+        arlCore::Point::sptr points3D_recale= arlCore::Point::New();
+        trsf.trf( (*m_points3D_source)[i] , points3D_recale);
+        pointSubtraction[0][0] = (*points3D_recale)[0]-(*(*m_points3D_cible)[i])[0];
+        pointSubtraction[1][0] = (*points3D_recale)[1]-(*(*m_points3D_cible)[i])[1];
+        pointSubtraction[2][0] = (*points3D_recale)[2]-(*(*m_points3D_cible)[i])[2];
+        {
+            if( (*m_points3D_cible)[i]->getCovMatrix().is_zero())
+            {
+                error = pointSubtraction.transpose() * pointSubtraction;
+                fx[i] = sqrt( error(0,0) );
+                //std::cerr<<"covariance nulle"<<std::endl;
+            }
+            else
+            {
+                error = pointSubtraction.transpose().as_matrix() * ((m_inv_cov_matrix[i])) * pointSubtraction;
+                //error = pointSubtraction.transpose().as_matrix() * pointSubtraction;
+                fx[i] = sqrt( error(0,0) );
+            }
+            //std::cerr<<"mat cov  ="<<(m_inv_cov_matrix[i])<<std::endl;
+        }
+    }
+    observe(x);
+}
+void arlCore::register3D3DUncertainty_LS_cost_function::gradf(vnl_vector< double > const &x, vnl_matrix<double>& j)
+{
+    //cerr<<"Calcul de gradf register3D3DUncertainty_LS_cost_function------------------"<<endl;
+    fdgradf(x, j, 1e-8);
+}
+
+// averageRotation_cost_function
+double arlCore::averageRotation_cost_function::f (vnl_vector< double > const &x)
+{
+//   vnl_vector_fixed<double,3> V_mean;
+    arlCore::vnl_rotation3d_vector tmp(x[0],x[1],x[2] );
+    arlCore::vnl_rotation3d_matrix M_mean(tmp);
+    unsigned int i;
+    m_error=0;
+    for(i=0;i<m_rotation_list.size();i++)
+        m_error+= M_mean.sq_rieman_dist(*(m_rotation_list[i]));
+    return observe(x);
+}
+
+void arlCore::averageRotation_cost_function::gradf(vnl_vector< double > const &x, vnl_vector<double>& j)
+{
+    //cerr<<"Calcul de gradf averageRotation------------------"<<endl;
+    fdgradf(x, j, 1e-8);
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Parameters.cpp b/SrcLib/ARLcore/src/arlcore/Parameters.cpp
new file mode 100644
index 0000000..e20884d
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Parameters.cpp
@@ -0,0 +1,261 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Parameters.h>
+
+#include <assert.h>
+#include <sstream>
+#include <fstream>
+#include <iostream>
+
+arlCore::Parameters::Parameters( const std::string &name, const std::string &fileName ):
+m_paramFile(fileName),
+m_name(name)
+{}
+
+arlCore::Parameters::~Parameters( void )
+{
+    clear();
+}
+
+
+void arlCore::Parameters::clear( void )
+{
+    m_paramNames.clear();
+    m_paramValues.clear();
+    m_paramDefaults.clear();
+    m_index.clear();
+}
+
+bool arlCore::Parameters::printParameters( void ) const
+{
+    std::cout<<getString();
+    return true;
+}
+
+bool arlCore::Parameters::reloadParameters( void )
+{
+    return load()>0;
+}
+
+bool arlCore::Parameters::reloadParameters( const std::string &fileName )
+{
+    m_paramFile = fileName;
+    return load()>0;
+}
+
+std::string arlCore::Parameters::getString( void ) const
+{
+    // TODO Afficher le type et (true,false) si booleen
+    unsigned int i;
+    std::stringstream ss;
+    ss<<"_______________________________________________________________________________\n\n";
+    ss<<"Parameter list '"<<m_name<<"' : "<<getNbParameters()<<" parameters\n";
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(double) )
+            ss<<" "<<m_paramNames[i]<<" = "<<boost::any_cast<double>(m_paramValues[i])<<" [Dft:"<<boost::any_cast<double>(m_paramDefaults[i])<<"]\n";
+        else
+            if( m_paramValues[i].type() == typeid(bool) )
+                ss<<" "<<m_paramNames[i]<<" = "<<boost::any_cast<bool>(m_paramValues[i])<<" [Dft:"<<boost::any_cast<bool>(m_paramDefaults[i])<<"]\n";
+            else ss<<" Unknown type\n";
+    ss<<"_______________________________________________________________________________\n";
+    std::string s = ss.str();
+    return s;
+}
+
+bool arlCore::Parameters::getType( unsigned int no, const std::type_info &type ) const
+{
+    assert( no<m_paramValues.size() );
+    if( no>=m_paramValues.size() ) return false;
+    return (m_paramValues[no].type()==type);
+}
+
+bool arlCore::Parameters::getIndex( const std::string &name, unsigned int &index ) const
+{
+    std::map< std::string, unsigned int >::const_iterator it;
+    it = m_index.find(name);
+    assert( it!=m_index.end() );
+    if( it==m_index.end() ) return false;
+    index = it->second;
+    return true;
+}
+
+unsigned int arlCore::Parameters::getNbParameters( void ) const
+{
+    return (unsigned int)m_paramValues.size();
+}
+
+unsigned int arlCore::Parameters::getNbDoubleParameters( void ) const
+{
+    unsigned int i, n=0;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(double) ) ++n;
+    return n;
+}
+
+unsigned int arlCore::Parameters::getNbBoolParameters( void ) const
+{
+    unsigned int i, n=0;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(bool) ) ++n;
+    return n;
+}
+
+bool arlCore::Parameters::saveParameters( const std::string &fileName, bool overwrite ) const
+{
+    //! @todo
+    return false;
+}
+
+unsigned int arlCore::Parameters::setAllDefault( void )
+{
+    unsigned int i;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        m_paramValues[i] = m_paramDefaults[i];
+    return i;
+}
+
+unsigned int arlCore::Parameters::setAllBoolParameters( bool v )
+{
+    unsigned int i;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(bool) )
+            m_paramValues[i] = v;
+    return i;
+}
+
+unsigned int arlCore::Parameters::resetAllBoolParameters( void )
+{
+    unsigned int i;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(bool) )
+            m_paramValues[i] = false;
+    return i;
+}
+
+unsigned int arlCore::Parameters::setAllDoubleParameters( double v )
+{
+    unsigned int i;
+    for( i=0 ; i<m_paramValues.size() ; ++i )
+        if( m_paramValues[i].type() == typeid(double) )
+            m_paramValues[i] = v;
+    return i;
+}
+
+//  protected:
+bool arlCore::Parameters::getBool( unsigned int no ) const
+{
+    if( !getType( no, typeid(bool) ) ) return false;
+    return boost::any_cast<bool>(m_paramValues[no]);
+}
+
+bool arlCore::Parameters::getBool( const std::string &name ) const
+{
+    unsigned int no;
+    if( !getIndex(name, no) ) return false;
+    if( !getType( no, typeid(bool) ) ) return false;
+    return boost::any_cast<bool>(m_paramValues[no]);
+}
+
+double arlCore::Parameters::getDouble( unsigned int no ) const
+{
+    if( !getType( no, typeid(double) ) ) return 0.0;
+    return boost::any_cast<double>(m_paramValues[no]);
+}
+
+double arlCore::Parameters::getDouble( const std::string &name ) const
+{
+    unsigned int no;
+    if( !getIndex(name, no) ) return 0.0;
+    if( !getType( no, typeid(double) ) ) return 0.0;
+    return boost::any_cast<double>(m_paramValues[no]);
+}
+
+bool arlCore::Parameters::setBool( unsigned int no, bool value )
+{
+    if( !getType( no, typeid(bool) ) ) return false;
+    m_paramValues[no] = value;
+    return true;
+}
+
+bool arlCore::Parameters::setBool( const std::string &name, bool value )
+{
+    unsigned int no;
+    if( !getIndex(name, no) ) return false;
+    if( !getType( no, typeid(bool) ) ) return false;
+    m_paramValues[no] = value;
+    return true;
+}
+
+bool arlCore::Parameters::setDouble( unsigned int no, double value )
+{
+    if( !getType( no, typeid(double) ) ) return false;
+    m_paramValues[no] = value;
+    return true;
+}
+
+bool arlCore::Parameters::setDouble( const std::string &name, double value )
+{
+    unsigned int no;
+    if( !getIndex(name, no) ) return false;
+    if( !getType( no, typeid(double) ) ) return false;
+    m_paramValues[no] = value;
+    return true;
+}
+
+unsigned int arlCore::Parameters::load( void )
+{
+    clear();
+    if(m_paramFile=="") return 0;
+    unsigned int n=0;
+    std::ifstream file;
+    file.open (m_paramFile.c_str(), std::fstream::in);
+    if(!file.is_open())
+    {
+        std::cerr<<"Parameters Loading error : "<<m_paramFile<<"\n";
+        return n;
+    }
+    std::string name, type, desc;
+    bool valueBool;
+    double valueDouble;
+    boost::any value;
+    while(!file.eof())
+    {
+        file>>name>>type;
+        if(type=="bool")
+        {
+            file>>valueBool;
+            m_paramValues.push_back(valueBool);
+            m_paramDefaults.push_back(valueBool);
+        }
+        if(type=="double")
+        {
+            file>>valueDouble;
+            m_paramValues.push_back(valueDouble);
+            m_paramDefaults.push_back(valueDouble);
+        }
+        m_index[name]=n;
+        std::getline(file, desc,'>');
+        std::getline(file, desc);
+        //file>>desc;
+        m_paramNames.push_back(desc);
+        ++n;
+    }
+    file.close();
+    return n;
+}
+
+unsigned int arlCore::Parameters::init( const std::string names[], const boost::any values[], unsigned int nb )
+{
+    unsigned int i;
+    for( i=0 ; i<nb ; ++i )
+    {
+        m_paramNames.push_back(names[i]);
+        m_paramValues.push_back(values[i]);
+        m_paramDefaults.push_back(values[i]);
+    }
+    return i;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Particle.cpp b/SrcLib/ARLcore/src/arlcore/Particle.cpp
new file mode 100644
index 0000000..9836998
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Particle.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Particle.h>
+
+arlCore::Particle::Particle( PlaneSystem &universe, const std::string &name ):
+m_universe( universe ),
+m_plane( universe.add3DPlane(name) )
+{}
+
+
+arlCore::Particle::Particle( const Particle& p ):
+m_universe( p.m_universe ),
+m_plane( p.m_plane )
+{}
+
+arlCore::Particle& arlCore::Particle::operator=( const Particle& p )
+{
+    m_universe = p.m_universe;;
+    m_plane = p.m_plane;
+    return *this;
+}
+
+arlCore::Particle::~Particle( void )
+{   // The particle's plane is released by the Planesystem
+    m_universe.releasePlane(m_plane);
+}
+
+std::string arlCore::Particle::getName( void ) const
+{   // The name of the particle
+    std::string name;
+    if(m_universe.getPlaneName(getPlane(), name)) return name;
+    else return "";
+}
+
+std::string arlCore::Particle::getString( void ) const
+{   // Particle's description
+    std::stringstream s;
+    s<<"Universe : \""<<m_universe.getName()<<"\" Plane : "<<m_plane<<"\n";
+    return s.str();
+}
+
+unsigned int arlCore::Particle::getPlane( void ) const
+{   // ID of the Particle's plane in the Planesystem
+    return m_plane;
+}
+
+arlCore::PlaneSystem& arlCore::Particle::getPlaneSystem( void ) const
+{   // Planesystem referency where the particle is dived
+    return m_universe;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/PlaneSystem.cpp b/SrcLib/ARLcore/src/arlcore/PlaneSystem.cpp
new file mode 100644
index 0000000..8458572
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/PlaneSystem.cpp
@@ -0,0 +1,786 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/PlaneSystem.h>
+
+#include <fstream>
+#include <algorithm>
+#include <math.h>
+
+#include <arlcore/Misc.h>
+
+const unsigned int arlCore::PlaneSystem::NoPlane = 0;
+
+arlCore::PlaneSystem::PlaneSystem( const std::string &name ):
+Object(ARLCORE_CLASS_PLANESYSTEM, name)
+{
+    setOK(true);
+}
+
+arlCore::PlaneSystem::~PlaneSystem( void )
+{
+    m_trfTable.clear();
+    m_trfState.clear();
+    m_trfWeight.clear();
+    m_lstName.clear();
+    m_status.clear();
+}
+
+bool arlCore::PlaneSystem::setPlaneName( unsigned int plane, const std::string &name )
+{
+//  assert(!outOfRange(plane));
+//  if(outOfRange(plane)) return false;
+    assert(plane>0 && plane<=m_lstName.size());
+    if(plane<1 || plane>m_lstName.size()) return false;
+    m_lstName[plane-1]=name;
+    Object::update();
+    return true;
+}
+
+std::string arlCore::PlaneSystem::getString( void ) const
+{
+    std::stringstream s;
+    unsigned int i, j, index;
+    s<<Object::getString();
+    s<<"   ";
+    for( i=0 ; i<m_status.size() ; ++i )
+        if(m_status[i]) s<<" "<<i+1<<" "; else s<<"X"<<i+1<<"X";
+    s<<"\n";
+    for( i=0 ; i<m_status.size() ; ++i )
+    {
+        if(m_status[i]) s<<" "<<i+1<<" "; else s<<"X"<<i+1<<"X";
+            for( j=0 ; j<m_lstName.size() ; ++j )
+            {
+                index=getIndex(j+1,i+1);
+                switch(m_trfState[index])
+                {
+                case STATE_UNDEFINED:   s<<" ? ";break;
+                case STATE_SET:         s<<" O ";break;
+                case STATE_CALIBRATION: s<<" C ";break;
+                case STATE_IDENTITY:    s<<" 1 ";break;
+                case STATE_COMPUTED:    s<<" = ";break;
+                default: break;
+                }
+            }
+        s<<"\n";
+    }
+    // TODO : Fill the planeSystem description
+    return s.str();
+}
+
+bool arlCore::PlaneSystem::load( const std::string &fileName )
+{
+    if(fileName=="") return false;
+    //Object::update();
+    return false;
+}
+
+bool arlCore::PlaneSystem::save( const std::string &fileName, bool overwrite ) const
+{
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    // TODO : Save the planesystem in an appropriate format
+    return false;
+}
+
+unsigned int arlCore::PlaneSystem::printGraph( void ) const
+{
+    unsigned int n=saveGraph(GRAPHVIZ_TMP);
+    if(n>0)
+    {
+        std::string exe = GRAPHVIZ_EXE;
+        std::string tmp = GRAPHVIZ_TMP;
+        std::string cmd = exe + " ";
+        cmd = cmd +tmp;
+        system(cmd.c_str());
+    }
+    return n;
+}
+
+unsigned int arlCore::PlaneSystem::saveGraph( const std::string &name ) const
+{
+    const std::string ARL_PLANE_STATE_NAMES[NBSTATES]={ "Undefined","Identity","Calibration","Measure","Computed" };
+    long int date, time;
+    getTime(date, time);
+    std::fstream s;
+    s.open (name.c_str(), std::fstream::out);
+    unsigned int i,j,size=(unsigned int)m_lstName.size();
+    s<<"/*\n";
+    s<<" PlaneSystem Graph - Use Graphviz for display it\n";
+    s<<"http://www.graphviz.org\n";
+    s<<"*/\n";
+    s<<"digraph \""<<getName()<<"\" {labelloc =\"t\" label = \""<<getName()<<" at "<<date<<"-"<<time<<"\" node [fontname = \"Arial\" label = \"\\N\" shape = \"circle\" width = \"0.50000\" height = \"0.500000\" color = \"black\"]\n";
+    for( i=0 ; i<size ; ++i )
+    {
+        if(m_status[i])
+        {
+            s<<"\""<<i+1<<"\\n"<<m_lstName[i]<<"\"[style=filled, fillcolor=green];\n";
+            for( j=0 ; j<size ; ++j )
+            {
+                if(m_status[j] && j!=i)
+                {
+                    const unsigned int Index = getIndex(i+1, j+1);
+                    const unsigned int State = m_trfState[Index];
+                    if( State!=STATE_UNDEFINED )
+                    {
+                        const double Weight = m_trfWeight[Index];
+                        if(m_trfTable[Index].isEquivalent(date,time)) s<<"edge [color = \"black\"]\n";
+                        else s<<"edge [color = \"yellow\"]\n";
+                        s<<"\""<<i+1<<"\\n"<<m_lstName[i]<<"\" -> \""<<j+1<<"\\n"<<m_lstName[j]<<"\"";
+                        s<<" [label=\""<<ARL_PLANE_STATE_NAMES[State]<<" Weight="<<Weight<<" "<<m_trfTable[Index].getText()<<"\"];\n";
+                    }
+                }
+            }
+        } else s<<"\""<<i+1<<"\\n"<<m_lstName[i]<<"\"[style=filled, fillcolor=red];\n";
+    }
+    s<<"\n}\n";
+    s.close();
+    return size;
+}
+
+bool arlCore::PlaneSystem::getPlaneID( std::string name, unsigned int &ID ) const
+{
+    unsigned int i;
+    for( i=0 ; i<m_lstName.size() ; ++i )
+        if(m_lstName[i]==name && m_status[i])
+        {
+            ID=i+1;
+            return true;
+        }
+    return false;
+}
+
+bool arlCore::PlaneSystem::getPlaneName( unsigned int ID, std::string &name) const
+{
+    assert(!outOfRange(ID));
+    if(outOfRange(ID)) return false;
+    name = m_lstName[ID-1];
+    return true;
+}
+
+unsigned int arlCore::PlaneSystem::add3DPlane ( const Object &o )
+{   // ID [1,..[
+    return add3DPlane( o.getName() );
+}
+
+unsigned int arlCore::PlaneSystem::add3DPlane ( const std::string &name )
+{   // ID [1,..[
+    const bool FillReleasedPlanes = true;
+    unsigned int plane = 0;
+    Object::update();
+    if(FillReleasedPlanes && m_releasedPlanes.size()>0)
+    {
+        plane = m_releasedPlanes.back();
+        m_releasedPlanes.pop_back();
+        m_lstName[plane-1] = name;
+        m_status[plane-1] = true;
+    }else
+    {
+        m_lstName.push_back(name);
+        m_status.push_back(true);
+        unsigned int i;
+        plane = (unsigned int)m_lstName.size();
+        m_trfTable.resize(plane*plane);
+        for( i=(plane-1)*(plane-1) ; i<m_trfTable.size() ; ++i)
+        {
+            m_trfState.push_back(STATE_UNDEFINED);
+            m_trfWeight.push_back(-1);
+        }
+    }
+    assert(m_trfTable.size()==m_trfState.size());
+    assert(m_trfTable.size()==m_trfWeight.size());
+    return plane;
+}
+
+bool arlCore::PlaneSystem::getPlaneStatus( unsigned int plane ) const
+{
+    if(plane<1 || plane>m_status.size()) return false;
+    return m_status[plane-1];
+}
+
+unsigned int arlCore::PlaneSystem::getNbPlanes( void ) const
+{
+    /*
+    unsigned int i, n=0;
+    for( i=0 ; i<m_status.size() ; ++i )
+        if(m_status[i]) ++n
+    return n;
+    */
+    return (unsigned int)m_lstName.size();
+}
+
+bool arlCore::PlaneSystem::getTrf( unsigned int plane1, unsigned int plane2, vnl_rigid_matrix &T, bool verbose )
+{
+//  verbose = false;
+    // TODO : Manage the cases when there are many paths to reach plane2
+    // TODO : Prendre uniquement le chemin le plus r�cent, le plus court, celui de poids minimum
+    // TODO : Ne pas poursuivre dans les chemins incompatible avec la date
+//  assert(!outOfRange(plane1, plane2));
+    if(outOfRange(plane1, plane2))
+    {
+        T.setIdentity();
+        T.setTime(0, 0);
+        return false;
+    }
+//  Object::update(); // ?
+    const long int Date = 0, Time = 0; // FIXME
+    if(plane1 != plane2)
+    {
+        if(isConnected( plane1, plane2, Date, Time, true, false ))
+        {
+            if(verbose) std::cout<<"From "<<plane1<<" to "<<plane2<<"\n";
+            T = m_trfTable[getIndex(plane1, plane2)];
+            return true;
+        }
+        //std::vector< unsigned int >path;
+        PlaneSystem::Path path(*this);
+        bool b=findPath( plane1, plane2, path, Date, Time );
+        if(b)
+        {
+            if(verbose) path.print();
+            setTrf(path);
+            T = m_trfTable[getIndex(plane1, plane2)];
+        }else
+        {
+            T.setIdentity();
+            T.setTime(0, 0);
+        }
+        untagAll();
+        return b;
+    }
+    T.setIdentity();
+    T.setTime(getDate(), getTime());
+    return true;
+}
+
+bool arlCore::PlaneSystem::getTrf( unsigned int plane1, unsigned int plane2, vnl_rigid_matrix &T, long int date, long int time, double ageTolerance, bool verbose )
+{
+    if(!getTrf(plane1, plane2, T, verbose)) return false;
+    long int d,t;
+    T.getTime(d,t);
+    if(date!=d) return false;
+    return fabs((double)(time-t))<=ageTolerance*10;
+}
+
+bool arlCore::PlaneSystem::getTrf( unsigned int plane1, unsigned int plane2, vnl_rigid_matrix &T, double ageTolerance, bool verbose )
+{
+    if(!getTrf(plane1, plane2, T, verbose)) return false;
+    if(ageTolerance<0.0) return true;
+    long int d,t;
+    T.getTime(d,t);
+    if(d==0 && t==0) return true;
+    if(getDate()!=d) return false;
+    return fabs((double)(getTime()-t))<=ageTolerance*10;
+}
+
+bool arlCore::PlaneSystem::setTrf( unsigned int index, const vnl_rigid_matrix& T, long int date, long int time )
+{
+    const double CALIBRATION_WEIGHT = 1;
+    const double MEASURE_WEIGHT = 5;
+
+    assert( index<m_trfTable.size() );
+    Object::update();
+    m_trfTable[index].copy(T);
+    m_trfTable[index].setTime(date,time);
+    if(date==0 && time==0)
+    {   // TODO : Calculez la transfo inverse lorsque date=0 et time=0 : Validit� permanente
+        m_trfState[index] = STATE_CALIBRATION;
+        m_trfWeight[index] = CALIBRATION_WEIGHT;
+    }else
+    {   // TODO : Calculez la transfo inverse en m�me temps ?
+        m_trfState[index] = STATE_SET;
+        m_trfWeight[index] = MEASURE_WEIGHT;
+    }
+    eraseComputedTrf(index);
+    return true;
+}
+
+bool arlCore::PlaneSystem::setTrf( unsigned int plane1, unsigned int plane2, const vnl_rigid_matrix& T )
+{
+    assert(!outOfRange(plane1, plane2) && plane1!=plane2);
+    if(outOfRange(plane1, plane2) || plane1==plane2) return false;
+    m_trfState[getIndex(plane2, plane1)] = STATE_UNDEFINED;
+    return setTrf(getIndex(plane1, plane2), T, T.getDate(), T.getTime());
+}
+
+bool arlCore::PlaneSystem::setTrf( unsigned int plane1, unsigned int plane2, const vnl_rigid_matrix& T, long int date, long int time )
+{
+    assert(!outOfRange(plane1, plane2) && plane1!=plane2);
+    if(outOfRange(plane1, plane2) || plane1==plane2) return false;
+    m_trfState[getIndex(plane2, plane1)] = STATE_UNDEFINED;
+    return setTrf(getIndex(plane1, plane2), T, date, time);
+}
+
+bool arlCore::PlaneSystem::resetTrf( unsigned int plane1, unsigned int plane2 )
+{
+    assert(!outOfRange(plane1, plane2) && plane1!=plane2);
+    if(outOfRange(plane1, plane2) || plane1==plane2) return false;
+    unsigned int i = getIndex(plane1, plane2);
+    Object::update();
+    m_trfState[i] = STATE_UNDEFINED;
+    m_trfState[getIndex(plane2, plane1)] = STATE_UNDEFINED;
+    eraseComputedTrf(i);
+    return true;
+}
+
+bool arlCore::PlaneSystem::resetTrf( unsigned int plane )
+{
+    assert(!outOfRange(plane));
+    if(outOfRange(plane)) return false;
+    Object::update();
+    unsigned int i;
+    for( i=0 ; i<m_status.size() ; ++i )
+        if(m_status[i])
+        {
+            m_trfState[getIndex(plane,i+1)] = STATE_UNDEFINED;
+            m_trfState[getIndex(i+1,plane)] = STATE_UNDEFINED;
+        }
+    // FIXME eraseComputedTrf(?);
+    return true;
+}
+
+bool arlCore::PlaneSystem::setIdentity ( unsigned int plane1, unsigned int plane2, const long int date, const long int time )
+{
+    if(outOfRange(plane1, plane2) || plane1==plane2) return false;
+    assert(!outOfRange(plane1, plane2) && plane1!=plane2);
+    unsigned int index;
+    vnl_rigid_matrix T;
+    T.setIdentity();
+    T.setTime(date, time);
+    index = getIndex(plane1, plane2);
+    eraseComputedTrf(index);
+    Object::update();
+    m_trfTable[index].copy(T);
+    m_trfState[index] = STATE_IDENTITY;
+    m_trfWeight[index] = 0;
+    index = getIndex(plane2, plane1);
+    m_trfTable[index].copy(T);
+    m_trfState[index] = STATE_IDENTITY;
+    m_trfWeight[index] = 0;
+    return true;
+}
+
+void arlCore::PlaneSystem::eraseComputedTrf( unsigned int index )
+{   //TODO : [Optimisation] Passer � STATE_UNDEFINED uniquement les transfos d�duites de la transfo[index] modifi�e
+    unsigned int i;
+    for( i=0 ; i<m_trfState.size() ; ++i )
+        if(m_trfState[i]==STATE_COMPUTED || m_trfState[i]==STATE_COMPUTED+NBSTATES)
+            m_trfState[i] = STATE_UNDEFINED;
+}
+
+bool arlCore::PlaneSystem::releasePlane( unsigned int plane )
+{
+    if(!resetTrf( plane )) return false;
+    m_status[plane-1]=false;
+    m_releasedPlanes.push_back(plane);
+    return true;
+}
+
+bool arlCore::PlaneSystem::distance( unsigned int plane1, unsigned int plane2, double &dist/*, long int &date, long int &time*/ )
+{
+    dist=0;
+    vnl_rigid_matrix T;
+    if(!getTrf ( plane1, plane2, T/*, date, time*/ )) return false; // FIXME
+    dist=sqrt(T(0,3)*T(0,3)+T(1,3)*T(1,3)+T(2,3)*T(2,3));
+//  date = T.getDate();
+//  time = T.getTime();
+    return true;
+}
+
+bool arlCore::PlaneSystem::chgPlane( unsigned int plane1, Point::csptr pt1, unsigned int plane2, Point::sptr pt2)
+{   // Set pt2 with the coordinates in Plane2 of pt1 set in Plane1
+    arlCore::vnl_rigid_matrix T;
+    if(!getTrf( plane1, plane2, T)) return false;
+    return T.trf(pt1,pt2);
+}
+
+bool arlCore::PlaneSystem::getOrigin( unsigned int plane1, unsigned int plane2, Point::sptr pt)
+{   // Set pt with the origin of Plane1 in the Plane2
+    arlCore::vnl_rigid_matrix T;
+    if(!getTrf( plane1, plane2, T)) return false;
+    arlCore::Point::sptr origin = arlCore::Point::New(0.0, 0.0, 0.0);
+    return T.trf(origin, pt);
+}
+
+// PRIVATE FUNCTIONS
+bool arlCore::PlaneSystem::outOfRange( unsigned int plane1, unsigned int plane2 ) const
+{   // True if plane 1 or 2 is out of range
+    return (outOfRange(plane1) || outOfRange(plane2));
+}
+
+bool arlCore::PlaneSystem::outOfRange( unsigned int planeNo ) const
+{   // ID=[1,n]
+    if(planeNo<1 || planeNo>m_lstName.size()) return true;
+    return !m_status[planeNo-1];
+}
+
+unsigned int arlCore::PlaneSystem::getIndex( unsigned int plane1, unsigned int plane2 ) const
+{   // Organisation concentrique des index :
+    //    |  1  2  3  4 <- plane1
+    //    |===================
+    //  1 | 00 01 04 09 ...
+    //  2 | 03 02 05 10 ...
+    //  3 | 08 07 06 11 ...
+    //  4 | 15 14 13 12 ...
+    //  ^plane2
+    assert(!outOfRange(plane1, plane2));
+    unsigned int index;
+    if(plane2<=plane1)
+        index = (plane1-1)*(plane1-1)+(plane2-1);
+    else
+        index = (plane2*plane2)-plane1;
+    assert(index<m_trfState.size());
+    assert(index==getInvIndex(getInvIndex(index)));
+    return index;
+}
+
+unsigned int arlCore::PlaneSystem::getInvIndex( unsigned int index ) const
+{
+    unsigned int alpha = (unsigned int)sqrt((double)index);
+    ++alpha;
+    const unsigned int Diagonal = alpha*alpha-alpha;
+    return index+2*(Diagonal-index);
+}
+
+void arlCore::PlaneSystem::tag( unsigned int plane1, unsigned int plane2 )
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    const unsigned int Index = getIndex(plane1, plane2);
+    if(!isTagged(Index))
+    {
+        //Object::update();
+        m_trfState[Index] = (ARL_PLANE_STATE)(m_trfState[Index] + NBSTATES);
+    }
+    const unsigned int InvIndex = getIndex(plane2, plane1);
+    if(!isTagged(InvIndex))
+    {
+        //Object::update();
+        m_trfState[InvIndex] = (ARL_PLANE_STATE)(m_trfState[InvIndex] + NBSTATES);
+    }
+}
+
+arlCore::PlaneSystem::ARL_PLANE_STATE arlCore::PlaneSystem::getStatus( unsigned int plane1, unsigned int plane2 ) const
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    return getStatus( getIndex(plane1, plane2) );
+}
+
+arlCore::PlaneSystem::ARL_PLANE_STATE arlCore::PlaneSystem::getStatus( unsigned int index ) const
+{
+    assert( index<m_trfState.size() );
+    if(!isTagged(index)) return m_trfState[index];
+    return(ARL_PLANE_STATE)(m_trfState[index] - NBSTATES);
+}
+
+void arlCore::PlaneSystem::untag( unsigned int plane1, unsigned int plane2 )
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    const unsigned int Index = getIndex(plane1, plane2);
+    if(isTagged(Index))
+    {
+        //Object::update();
+        m_trfState[Index] = (ARL_PLANE_STATE)(m_trfState[Index] - NBSTATES);
+    }
+    const unsigned int InvIndex = getIndex(plane1, plane2);
+    if(isTagged(InvIndex))
+    {
+        //Object::update();
+        m_trfState[InvIndex] = (ARL_PLANE_STATE)(m_trfState[InvIndex] - NBSTATES);
+    }
+}
+
+bool arlCore::PlaneSystem::isTagged( unsigned int index ) const
+{
+    assert( index<m_trfState.size() );
+    return( m_trfState[index]>=NBSTATES );
+}
+
+bool arlCore::PlaneSystem::isTagged( unsigned int plane1, unsigned int plane2 ) const
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    return isTagged( getIndex(plane1, plane2) );
+}
+
+void arlCore::PlaneSystem::untagAll( void )
+{
+    unsigned int i;
+    bool b = false;
+    for( i=0 ; i<m_trfState.size() ; ++i )
+        if(m_trfState[i]>=NBSTATES)
+        {
+            b = true;
+            m_trfState[i] = (ARL_PLANE_STATE)(m_trfState[i] - NBSTATES);
+        }
+    //if(b) Object::update();
+}
+
+typedef std::pair<unsigned int, double> PlaneWeight;
+bool sortPlanes(const PlaneWeight& left, const PlaneWeight& right)
+{   // Ordre croissant des poids
+    return left.second < right.second;
+}
+
+bool arlCore::PlaneSystem::findPath( unsigned int plane1, unsigned int plane2, Path &path, long int date, long int time )
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    std::vector<PlaneWeight> Who;
+    unsigned int i, n = whoIsConnected(plane1, plane2, Who, date, time, true, true);
+    if(n==0) return false;
+    path.push_back(plane1);
+    for( i=0 ; i<n ; ++i )
+    {
+        if(Who[i].first==plane2)
+        {
+            path.push_back(plane2);
+            return true;
+        }
+        if(findPath(Who[i].first,plane2,path,date,time)) return true;
+    }
+    path.pop_back();
+    return false;
+}
+
+bool arlCore::PlaneSystem::setTrf( const Path &path )
+{
+    unsigned int i, n=path.size();
+    if(n<3) return false;
+//  Object::update();
+    vnl_rigid_matrix T = m_trfTable[getIndex(path[0], path[1])];
+    arlCore::Object O;
+    O.setTime(T.getDate(), T.getTime());
+    double RMSMax = T.getRMS();
+    double stdDevMax = T.getStdDev();
+    for( i=1 ; i<n-/*2*/1 ; ++i )
+    {
+        const vnl_rigid_matrix& M = m_trfTable[getIndex(path[i], path[i+1])];
+        O.setMinTime( M.getDate(), M.getTime() );
+        T.mult(M,T);
+        if(M.getStdDev()>stdDevMax) stdDevMax = M.getStdDev();
+        if(M.getRMS()>RMSMax) RMSMax = M.getRMS();
+    }
+/*  const vnl_rigid_matrix& M = m_trfTable[getIndex(path[n-2], path[n-1])];
+    O.setMinTime( M.getDate(), M.getTime() );
+    T.mult(M,T);
+    if(M.getStdDev()>stdDevMax) stdDevMax = M.getStdDev();
+    if(M.getRMS()>RMSMax) RMSMax = M.getRMS();*/
+    T.setRMS(RMSMax);
+    T.setStdDev(stdDevMax);
+    const unsigned int Index = getIndex(path[0],path[n-1]);
+    m_trfTable[Index].copy(T);
+    m_trfTable[Index].setTime(O.getDate(), O.getTime());
+    m_trfState[Index] = STATE_COMPUTED;
+    m_trfWeight[Index] = path.weight();
+    return true;
+}
+
+unsigned int arlCore::PlaneSystem::whoIsConnected( unsigned int connectedAt, unsigned int finalDestination, std::vector<PlaneWeight> &planes, long int date, long int time, bool SetInv, bool ToTag )
+{
+    assert(!outOfRange(connectedAt, finalDestination));
+    planes.clear();
+/*  if(isConnected(connectedAt, finalDestination, date, time, SetInv, ToTag))
+    {
+        planes.push_back(PlaneWeight(finalDestination, getWeight(connectedAt, finalDestination)));
+        return 1;
+    }*/
+    unsigned int i;
+    bool sort = false;
+    double firstWeight = -1;
+    for( i=1 ; i<=m_status.size() ; ++i )
+        if(/*i!=finalDestination && */m_status[i-1])
+            if(isConnected(connectedAt, i, date, time, SetInv, ToTag))
+            {
+                const double Weight = getWeight(connectedAt, i);
+                planes.push_back(PlaneWeight(i, Weight));
+                if(!sort)
+                {// Sort weights only if it exists at least two different weights
+                    if(firstWeight<0) firstWeight = Weight;
+                    else if(Weight!=firstWeight) sort = true;
+                }
+            }
+    if(sort) std::sort(planes.begin(), planes.end(), sortPlanes);
+    return (unsigned int)planes.size();
+}
+
+bool arlCore::PlaneSystem::isConnected( unsigned int plane1, unsigned int plane2, long int date, long int time, bool SetInv, bool ToTag )
+{
+    assert(!outOfRange(plane1) && !outOfRange(plane2));
+    if(outOfRange(plane1, plane2)) return false;
+    if(plane1==plane2 || isTagged(plane1,plane2) || isTagged(plane2,plane1)) return false;
+    unsigned int index = getIndex(plane1, plane2);
+    if(getStatus(index)!=STATE_UNDEFINED && getStatus(index)!=STATE_COMPUTED/* && m_trfTable[index].isEquivalent(date,time)*/)
+    {
+        if(ToTag) tag(plane1, plane2);
+        return true;
+    }
+    const unsigned int InvIndex = getIndex(plane2, plane1);
+    if(getStatus(InvIndex)!=STATE_UNDEFINED && getStatus(InvIndex)!=STATE_COMPUTED/* && m_trfTable[inv].isEquivalent(date,time)*/)
+    {
+        if(SetInv)
+        {
+//          Object::update();
+            if(m_trfTable[index].invert(m_trfTable[InvIndex]))
+            {
+                m_trfState[index] = getStatus(InvIndex);
+                m_trfWeight[index] = getWeight(InvIndex);
+            }
+        }
+        if(ToTag) tag(plane1,plane2);
+        return true;
+    }
+    return false;
+}
+
+// PATH IN PLANESYSTEM
+arlCore::PlaneSystem::Path::Path( const PlaneSystem& universe ):
+m_universe(universe),
+m_weight(0.0)
+{}
+
+arlCore::PlaneSystem::Path::Path( const Path& p ):
+m_universe(p.m_universe),
+m_weight(p.m_weight)
+{
+    unsigned int i;
+    for( i=0 ; i<m_planes.size() ; ++i )
+        m_planes.push_back(p.m_planes[i]);
+    for( i=0 ; i<m_weights.size() ; ++i )
+        m_weights.push_back(p.m_weights[i]);
+}
+
+arlCore::PlaneSystem::Path::~Path( void )
+{}
+
+unsigned int arlCore::PlaneSystem::Path::operator[]( unsigned int i ) const
+{
+    if( i<m_planes.size() )return m_planes[i];
+    return 0;
+}
+
+void arlCore::PlaneSystem::Path::print( void ) const
+{
+    if(size()>0)
+    {
+        unsigned int i;
+        std::cout<<"From "<<m_planes[0]<<" to "<<m_planes.back()<<"\n";
+        std::cout<<m_planes[0];
+        for( i=1 ; i<m_planes.size() ; ++i )
+            std::cout<<" -> ("<<m_weights[i-1]<<") -> "<<m_planes[i];
+        std::cout<<"\nSize = "<<size()<<" ; Weight = "<<weight()<<"\n";
+    }else std::cout<<"Empty path\n";
+}
+
+unsigned int arlCore::PlaneSystem::Path::size( void ) const
+{
+    return (unsigned int)m_planes.size();
+}
+
+double arlCore::PlaneSystem::Path::weight( void ) const
+{
+    return m_weight;
+}
+
+double arlCore::PlaneSystem::getWeight( unsigned int index ) const
+{
+    assert(index<m_trfWeight.size());
+    return m_trfWeight[index];
+}
+
+double arlCore::PlaneSystem::getWeight( unsigned int plane1, unsigned int plane2 ) const
+{
+    const double DefaultWeight = 1000.0;
+    unsigned int index = getIndex(plane1, plane2);
+    if(getStatus(index)!=STATE_UNDEFINED) return getWeight(index);
+    index = getIndex(plane2, plane1);
+    if(getStatus(index)!=STATE_UNDEFINED) return getWeight(index);
+    return DefaultWeight;
+}
+
+unsigned int arlCore::PlaneSystem::Path::push_back( unsigned int plane )
+{
+    // TODO Calcul Weight de m_planes.back() -> plane dans m_universe
+    m_planes.push_back(plane);
+    if(size()==1) return 1;
+    const unsigned int Previous = m_planes[size()-2];
+    const double Weight = m_universe.getWeight(Previous, plane);
+    m_weights.push_back(Weight);
+    m_weight += Weight;
+    return (unsigned int)m_planes.size();
+}
+
+bool arlCore::PlaneSystem::Path::pop_back( void )
+{
+    if(size()<1) return false;
+    m_planes.pop_back();
+    if(size()>0)
+    {
+        double weight = m_weights.back();
+        m_weights.pop_back();
+        m_weight -= weight;
+    }
+    return true;
+}
+
+// TRANSFORMATION FILTER
+arlCore::TransformationFilter::TransformationFilter( const PlaneSystem& universe, long int duration, ARLCORE_TRF_FILTER_TYPE type ):
+m_universe(universe),
+m_duration(duration*10), //ms
+m_lastTime(0),
+m_filterType(type)
+{}
+
+arlCore::TransformationFilter::TransformationFilter( const TransformationFilter& TF ):
+m_universe(TF.m_universe)
+{
+    unsigned int i;
+    m_lastTime = TF.m_lastTime;
+    m_duration = TF.m_duration;
+    m_filterType = TF.m_filterType;
+    for( i=0 ; i<TF.m_trfList.size() ; ++i )
+        push_back(*TF.m_trfList[i]);
+}
+
+arlCore::TransformationFilter::~TransformationFilter( void )
+{
+    clear();
+}
+
+void arlCore::TransformationFilter::clear( void )
+{
+    unsigned int i;
+    for( i=0 ; i<m_trfList.size() ; ++i )
+        delete(m_trfList[i]);
+    m_trfList.clear();
+    m_lastTime = 0;
+}
+
+void arlCore::TransformationFilter::push_back( const vnl_rigid_matrix& T )
+{   // Verifier continuite & croissance temporelle
+    if(T.getTime()<m_lastTime) clear();
+    m_lastTime = T.getTime();
+    vnl_rigid_matrix* M = new vnl_rigid_matrix(T);
+    m_trfList.push_back(M);
+}
+
+unsigned int arlCore::TransformationFilter::get( arlCore::vnl_rigid_matrix& T )
+{
+    timeCleaning();
+    return filter( m_trfList, m_filterType, T );
+}
+
+void arlCore::TransformationFilter::timeCleaning( bool all )
+{
+    std::vector<const arlCore::vnl_rigid_matrix*>::iterator it=m_trfList.begin();
+//  const long int date = m_universe.getDate();
+    const long int time = m_universe.getTime() - m_duration;
+    while( it!=m_trfList.end() )
+    {
+        if( (*it)->getTime()<time )
+        {
+            delete( *it );
+            m_trfList.erase(it);
+            ++it;
+        }else if(!all) return;
+    }
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Player.cpp b/SrcLib/ARLcore/src/arlcore/Player.cpp
new file mode 100644
index 0000000..4e628bf
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Player.cpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Player.h>
+
+arlCore::Player::Player( void ):
+m_playerDirectory(""),
+m_playerFullName(""),
+m_afterHeader(0),
+m_isReady(false),
+m_eof(false),
+m_loop(false)
+{}
+
+arlCore::Player::~Player( void )
+{
+    m_playerHandle.close();
+}
+
+bool arlCore::Player::readyPlayer( void )
+{
+    return m_isReady;
+}
+
+bool arlCore::Player::getPlayerFilename( std::string &fileName )
+{
+    if(m_isReady) fileName = m_playerFullName;
+    else fileName = "";
+    return m_isReady;
+}
+
+bool arlCore::Player::setLoop( bool loop )
+{
+    m_loop=loop;
+    return m_loop;
+}
+
+bool arlCore::Player::getEOF( void ) const
+{
+    return m_eof;
+}
+
+unsigned int arlCore::Player::initPlayer( const std::string &fileName )
+{
+    m_playerFullName = fileName;
+    m_afterHeader = 0;
+    if(!readHeader(fileName)) return 0;
+    m_afterHeader = m_playerHandle.tellg();
+    unsigned int n = playNext();
+    m_isReady = n>0;
+    m_eof = !m_isReady;
+    return n;
+}
+
+unsigned int arlCore::Player::setEOF( unsigned int n )
+{
+    m_eof = true;
+    return n;
+}
+
+unsigned int arlCore::Player::playEnd( void )
+{
+    unsigned int n = 0;
+    m_eof = !m_loop;
+    if(m_loop)
+    {
+        if(!goAfterHeader()) return 0;
+// ?        n = playNext();
+    }
+    return n;
+}
+
+bool arlCore::Player::goAfterHeader( void )
+{
+    if(m_afterHeader==0) return false;
+    m_playerHandle.clear();
+    m_playerHandle.seekg(0, std::ios::beg);
+    m_playerHandle.seekg(m_afterHeader);
+    return true;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Point.cpp b/SrcLib/ARLcore/src/arlcore/Point.cpp
new file mode 100644
index 0000000..c7dfaa8
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Point.cpp
@@ -0,0 +1,1082 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Point.h>
+
+#include <fstream>
+#include <iomanip>
+#include <vnl/vnl_math.h>
+#include <vnl/vnl_vector_fixed.h>
+#include <vnl/vnl_matrix_fixed.h>
+#include <vnl/vnl_transpose.h>
+#include <vnl/vnl_cross.h>
+#include <vnl/vnl_cross_product_matrix.h>
+
+#include <arlcore/Misc.h>
+#include <arlcore/PointsList.h>
+
+arlCore::Point::Point( unsigned int dim, ARLCORE_POINT_TYPE type, long int date, long int time ):
+m_type(type),
+m_confidence(0),
+m_visibility(true),
+m_status(ARLCORE_POINT_STATUS_UNKNOWN),
+m_scalar(-1.0),
+m_isColored(false),
+m_colour(0,0,0),
+m_ponderation(1.0),
+m_error(-1.0)
+{
+    unsigned int i;
+    setOK(true);
+    //VAG setTime(date,time);
+    m_coordinates.set_size(dim);
+    m_coordinates.fill(0.0);
+    m_stat.resize(size());
+    for( i=0 ; i<size() ; ++i )
+        m_stat[i].fill(0.0);
+    initUncertainty();
+}
+
+arlCore::Point::Point( double x, double y, ARLCORE_POINT_TYPE type, long int date, long int time ):
+//VAG Object(ARLCORE_CLASS_POINT),
+m_type(type),
+m_confidence(0),
+m_visibility(true),
+m_status(ARLCORE_POINT_STATUS_UNKNOWN),
+m_scalar(-1.0),
+m_isColored(false),
+m_colour(0,0,0),
+m_ponderation(1.0),
+m_error(-1.0)
+{
+    unsigned int i;
+    //VAG  setTime(date,time);
+    m_coordinates.set_size(2);
+    m_coordinates.put(0,x);
+    m_coordinates.put(1,y);
+    m_stat.resize(size());
+    for( i=0 ; i<size() ; ++i )
+        m_stat[i].fill(0.0);
+    initUncertainty();
+    setOK(true);
+}
+
+arlCore::Point::Point( double x, double y, double z, ARLCORE_POINT_TYPE type, long int date, long int time ):
+//Object(ARLCORE_CLASS_POINT),
+m_type(type),
+m_confidence(0),
+m_visibility(true),
+m_status(ARLCORE_POINT_STATUS_UNKNOWN),
+m_scalar(-1.0),
+m_isColored(false),
+m_colour(0,0,0),
+m_ponderation(1.0),
+m_error(-1.0)
+{
+    unsigned int i;
+    //VAG setTime(date,time);
+    m_coordinates.set_size(3);
+    m_coordinates.put(0,x);
+    m_coordinates.put(1,y);
+    m_coordinates.put(2,z);
+    m_stat.resize(size());
+    for( i=0 ; i<size() ; ++i )
+        m_stat[i].fill(0.0);
+    initUncertainty();
+    setOK(true);
+}
+
+void arlCore::Point::init( unsigned int dim )
+{
+    modified();
+    unsigned int i;
+    //VAG setTime(date,time);
+    m_type=ARLCORE_POINT_TYPE_UNKNOWN;
+    m_confidence=0;
+    m_visibility=true;
+    m_status=ARLCORE_POINT_STATUS_UNKNOWN;
+    m_isColored=false;
+    m_colour.setColour(0,0,0);
+    m_scalar=-1.0;
+    m_coordinates.set_size(dim);
+    m_coordinates.fill(0.0);
+    m_covMatrix.set_size(dim,dim);
+    m_covMatrix.fill(0.0);
+    m_ponderation=1.0;
+    m_stat.resize(size());
+    for( i=0 ; i<size() ; ++i )
+        m_stat[i].fill(0.0);
+    m_error=-1.0;
+}
+
+
+arlCore::Point::sptr arlCore::Point::PointFactory( int dim )
+{
+    arlCore::Point::sptr point =::arlCore::Point::sptr( new Point( dim ) );
+    return point;
+}
+
+
+
+arlCore::Point::sptr arlCore::Point::PointFactory( arlCore::Point::csptr p )
+{
+    arlCore::Point::sptr point = ::arlCore::Point::sptr( new Point() );
+    point->copy(p);
+    return point;
+}
+
+
+arlCore::Point::sptr arlCore::Point::PointFactory( double x, double y )
+{
+    arlCore::Point::sptr point = ::arlCore::Point::sptr( new Point(x,y) );
+    return point;
+}
+
+
+
+arlCore::Point::sptr arlCore::Point::PointFactory( double x, double y, double z )
+{
+    arlCore::Point::sptr point = ::arlCore::Point::sptr( new Point(x,y,z) );
+    return point;
+}
+
+arlCore::Point::Point( arlCore::Point::csptr  p )
+// :VAG Object(ARLCORE_CLASS_POINT)
+{
+    copy(p);
+}
+
+arlCore::Point& arlCore::Point::operator=(arlCore::Point::csptr  p)
+{
+    copy(p);
+    return *this;
+}
+
+void arlCore::Point::copy(arlCore::Point::csptr  p)
+{
+    if( this== p.get() ) return;
+    //VAG arlCore::Object *a=this;
+    //VAG const arlCore::Object *b=&p;
+    //VAG *a = *b;
+    //VAGFIXME : copy helper of fwtools::Object:...Copy ?
+    unsigned int i,j,dim=p->size();
+    m_type = p->m_type;
+    m_confidence = p->m_confidence;
+    m_visibility = p->m_visibility;
+    m_status = p->m_status;
+    m_isColored = p->m_isColored;
+    m_colour = p->m_colour;
+    m_scalar = p->m_scalar;
+    m_ponderation = p->m_ponderation;
+    m_stat = p->m_stat;
+    m_error = p->m_error;
+    m_coordinates.set_size(dim);
+    m_stat.resize(size());
+    for( i=0 ; i<size() ; ++i )
+    {
+        m_coordinates.put(i,p->m_coordinates.get(i));
+        m_stat[i].fill(0.0);
+    }
+    m_covMatrix.set_size(dim,dim);
+    for( i=0 ; i<size() ; ++i)
+        for( j=0 ; j<size() ; ++j)
+            m_covMatrix.put(i,j,p->m_covMatrix.get(i,j));
+    modified();
+    return;
+}
+
+arlCore::Point::~Point( void )
+{}
+
+
+bool arlCore::Point::setOK( bool b )
+{
+    if(b!=m_ok)
+    {
+        m_ok = b;
+        modified();
+    }
+    return m_ok;
+}
+
+bool arlCore::Point::isOK( void ) const
+{
+    return m_ok;
+}
+
+
+
+
+
+std::string arlCore::Point::getString( void ) const
+{
+    std::string t;
+    switch(m_type)
+    {
+    case ARLCORE_POINT_TYPE_UNKNOWN : t="UNKNOWN";break;
+    case ARLCORE_POINT_TYPE_ARTK : t="ARTK";break;
+    case ARLCORE_POINT_TYPE_MRO : t="MRO";break;
+    case ARLCORE_POINT_TYPE_CHESS : t="CHESS";break;
+    case ARLCORE_POINT_TYPE_ROI : t="ROI";break;
+    case ARLCORE_POINT_TYPE_CLOUD : t="CLOUD";break;
+    case ARLCORE_POINT_TYPE_TIP : t="TIP";break;
+    case ARLCORE_POINT_TYPE_LINE : t="LINE";break;
+    case ARLCORE_POINT_TYPE_SIFT : t="SIFT";break;
+    default: break;
+    }
+    unsigned int i;
+    std::stringstream s;
+    s<<std::fixed<<std::setprecision(2);
+    for( i=0 ; i<size() ; ++i )
+        s<<get(i)<<" ";
+    if(m_visibility) s<<"Visible";
+    else s<<"Unvisible";
+    s<<" "<<t<<" Conf.="<<m_confidence;
+    if(m_isColored) s<<" colour("<<m_colour.getString()<<")";
+    else s<<" No colour";
+    if(m_scalar>0) s<<" scalar="<<m_scalar<<"mm";
+    switch(m_status)
+    {
+    case ARLCORE_POINT_STATUS_UNKNOWN : s<<" (Unknown)";break;
+    case ARLCORE_POINT_STATUS_DETECTED : s<<" (Detected)";break;
+    case ARLCORE_POINT_STATUS_SUBPIXEL : s<<" (Subpixel)";break;
+    case ARLCORE_POINT_STATUS_ESTIMATE : s<<" (Estimate)";break;
+    case ARLCORE_POINT_STATUS_CLOUD : s<<" (Cloud)";break;
+    case ARLCORE_POINT_REPROJECTION : s<<" (Reproj)";break;
+    default: break;
+    }
+    s<<" Error="<<m_error<<"\n";
+    //TODO Display m_covMatrix
+    return s.str();
+}
+
+bool arlCore::Point::save( const std::string &fileName, bool overwrite ) const
+{
+    if(!isOK()) return false;
+    std::fstream f;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    f.open(fileName.c_str(), std::fstream::out);
+    if(f.is_open()) f<<"Dimension "<<size()<<"\n";
+    bool b=save(f);
+    f.close();
+    f.flush();
+    return b;
+}
+
+bool arlCore::Point::save( std::fstream &f, unsigned int cam, SPTR(void) tag, int fringe ) const
+{
+    f<<"Dimension "<<size()<<"\n";
+    return save( f, true, cam, tag, fringe, 0 , ARLCORE_POINT_SAVE_FULL );
+}
+
+bool arlCore::Point::save( std::fstream &f, unsigned int no, ARLCORE_POINT_SAVE_TYPE type ) const
+{
+    return save( f, false, 0, SPTR(void)(), 0 , no, type );
+}
+
+bool arlCore::Point::save( std::fstream &f, bool ctf, unsigned int cam,  SPTR(void) tag, int fringe, unsigned no, ARLCORE_POINT_SAVE_TYPE type ) const
+{
+    if(!f.is_open()) return false;
+    unsigned int i,j,dim=size();
+    if(type==ARLCORE_POINT_SAVE_FULL)
+    {
+        if(ctf)
+        {
+            f<<"Camera "<<cam;
+            f<<"\nTag "<<tag;
+            f<<"\nFringe "<<fringe;
+        }
+        else f<<"Numero "<<no<<"";
+        f<<"\nVisibility "<<m_visibility;
+        //f<<"Status "<<""; //TODO
+        f<<"\nScalar "<<m_scalar;
+        f<<"\nConfidence "<<m_confidence;
+        f<<"\nError "<<m_error;
+        if(m_isColored)
+        {
+            unsigned int R,G,B;
+            m_colour.getColour(R,G,B);
+            f<<"\nColour "<<R<<" "<<G<<" "<<B;
+        }
+        f<<"\nCoordinates\n";
+        for( i=0 ; i<dim ; ++i )
+            f<<get(i)<<"\t";
+        f<<"\nUncertainty\n";
+        for( i=0 ; i<dim ; ++i )
+        {
+            for( j=0 ; j<dim ; ++j )
+                f<<m_covMatrix.get(i,j)<<"\t";
+            f<<"\n";
+        }
+        f<<"End\n";
+    }else
+    {
+        if(type==ARLCORE_POINT_SAVE_FULL ||type==ARLCORE_POINT_SAVE_LIGHT)
+            f<<"Numero "<<no<<" Coordinates ";
+        if(type==ARLCORE_POINT_SAVE_VTK)
+            for( i=0 ; i<3 ; ++i )
+                if(i<dim) f<<get(i)<<" "; else f<<"0.0 ";
+        else
+            for( i=0 ; i<dim ; ++i )
+                f<<get(i)<<" ";
+        if(type==ARLCORE_POINT_SAVE_FULL ||type==ARLCORE_POINT_SAVE_LIGHT)
+            f<<"End";
+        f<<"\n";
+    }
+    f.flush();
+    return true;
+}
+
+bool arlCore::Point::load( const std::string &fileName )
+{
+    if(fileName=="") return false;
+    std::ifstream f;
+    f.open (fileName.c_str(), std::fstream::in);
+    int no;
+    bool b=load(f,no);
+    f.close();
+    return b;
+}
+
+bool arlCore::Point::load( std::ifstream &f, int &no, unsigned int dim )
+{
+    unsigned int cam;
+    SPTR(void) tag;
+    int fringe;
+    return load( f, cam, tag, fringe, no, dim );
+}
+
+bool arlCore::Point::load( std::ifstream &f, unsigned int &cam, SPTR(void) tag, int &fringe )
+{
+    int no;
+    return load( f, cam, tag, fringe, no );
+}
+
+bool arlCore::Point::load( std::ifstream &f, unsigned int &cam, SPTR(void) tag, int &fringe, int &no, unsigned int dim )
+{
+    modified();
+    setOK(false);
+    if(!f.is_open()) return false;
+    init(dim);
+    no=-1;
+    unsigned int i,j;
+    std::string token,text;
+    double val; //,version;
+    bool b=false;
+    do
+    {
+        f>>token;
+        //if(token=="Version") f>>version;
+        if(token=="Visibility") f>>m_visibility;
+        //if(token=="Status") f>>""; //TODO
+        if(token=="Radius") f>>m_scalar; // Deprecated
+        if(token=="Scalar") f>>m_scalar;
+        if(token=="Confidence") f>>m_confidence;
+        if(token=="Error") f>>m_error;
+        if(token=="Numero") f>>no;
+        if(token=="Camera") f>>cam;
+        assert(false); // if(token=="Tag") f>> tag.get(); VAG serialisation of a pointer addr !!!!
+        if(token=="Fringe") f>>fringe;
+        if(token=="Name")
+        {
+            f>>text;
+            setName(text);
+        }
+        if(token=="Dimension")
+        {
+            if(dim>0) f>>i;
+            else
+            {
+                f>>dim;
+                m_coordinates.set_size(dim);
+                m_stat.resize(size());
+                for( i=0 ; i<size() ; ++i )
+                    m_stat[i].fill(0.0);
+                m_coordinates.fill(0.0);
+                m_covMatrix.set_size(dim,dim);
+                m_covMatrix.fill(0.0);
+            }
+        }
+        if(token=="Colour")
+        {
+            unsigned int R,G,B;
+            f>>R>>G>>B;
+            m_colour.setColour(R,G,B);
+            m_isColored=true;
+        }
+        if(token=="Coordinates" && dim>0)
+        {
+            for( i=0 ; i<dim ; ++i )
+            {
+                f>>val;
+                m_coordinates.put(i,val);
+            }
+            b=true;
+        }
+        if(token=="Uncertainty" && dim>0)
+        {
+            for( i=0 ; i<dim ; ++i )
+                for( j=0 ; j<dim ; ++j )
+                {
+                    f>>val;
+                    m_covMatrix.put(i,j,val);
+                }
+        }
+    }while(!f.eof() && token!="End");
+    setOK(b);
+    return b;
+}
+
+vnl_vector<double> arlCore::Point::getCoordinates() const
+{   //
+    return m_coordinates*m_ponderation;
+}
+
+vnl_vector<double> arlCore::Point::getHCoordinates() const
+{
+    unsigned int size = m_coordinates.size();
+    vnl_vector<double> homogene(size+1);
+    homogene.update(m_coordinates*m_ponderation);
+    homogene.put(size,1.0);
+    return homogene;
+}
+
+arlCore::vnl_covariance_matrix& arlCore::Point::getCovMatrix()
+{
+    modified(); //?
+    return m_covMatrix;
+}
+
+const arlCore::vnl_covariance_matrix& arlCore::Point::getCovMatrix() const
+{
+    return m_covMatrix;
+}
+
+bool arlCore::Point::isVisible() const
+{
+    return m_visibility;
+}
+
+bool arlCore::Point::getVisible() const
+{
+    return m_visibility;
+}
+
+bool arlCore::Point::setVisible(bool b)
+{
+    if(m_visibility!=b)
+    {
+        modified();
+        m_visibility=b;
+    }
+    return m_visibility;
+}
+
+arlCore::Point::ARLCORE_POINT_STATUS arlCore::Point::getStatus() const
+{
+    return m_status;
+}
+
+bool arlCore::Point::setStatus(ARLCORE_POINT_STATUS status)
+{
+    if(m_status!=status)
+    {
+        modified();
+        m_status=status;
+    }
+    return true;
+}
+
+bool arlCore::Point::setColour(unsigned int R, unsigned int G, unsigned int B)
+{
+    modified();
+    m_isColored=true;
+    m_colour.setColour(R,G,B);
+    return true;
+}
+
+bool arlCore::Point::setColour(const Colour &c)
+{
+    modified();
+    m_isColored=true;
+    m_colour.setColour(c);
+    return true;
+}
+
+bool arlCore::Point::getColour(unsigned int &R, unsigned int &G, unsigned int &B) const
+{
+    m_colour.getColour(R,G,B);
+    return m_isColored;
+}
+
+const arlCore::Colour & arlCore::Point::getColour( void ) const
+{
+    return m_colour;
+}
+
+bool arlCore::Point::isColored() const
+{
+    return m_isColored;
+}
+
+bool arlCore::Point::initUncertainty( void )
+{
+    unsigned int dim = size();
+    modified();
+    m_covMatrix.set_size(dim,dim);
+    m_covMatrix.fill(0.0);
+    return true;
+}
+
+double arlCore::Point::operator[]( unsigned int i ) const
+{
+    assert(i<size());
+    if(i<size()) return get(i);
+    else return 0.0;
+}
+
+/*double& arlCore::Point::operator []( unsigned int i )
+{
+    if(i<size()) return m_coordinates[i]*m_ponderation;
+    else throw(-1);
+}*/
+
+double arlCore::Point::get( unsigned int i ) const
+{
+    assert(i<size());
+    if(i<size()) return m_coordinates.get(i)*m_ponderation;
+    else return 0.0;
+}
+
+bool arlCore::Point::set( unsigned int i, double a )
+{
+    assert(i<size());
+    if(i>=size()) return false;
+    modified();
+    m_coordinates.put(i,a/m_ponderation); // FIXME
+    return true;
+}
+
+bool arlCore::Point::set( arlCore::Point::csptr  p )
+{
+    assert(p->size()==size());
+    if(p->size()!=size()) return false;
+    unsigned int i;
+    modified();
+    m_ponderation=1.0;
+    for( i=0 ; i<size() ; ++i )
+    {
+        m_coordinates.put(i,p->get(i));
+        m_stat[i].fill(0.0);
+    }
+    return true;
+}
+
+void arlCore::Point::fill( double a )
+{
+    unsigned int i;
+    modified();
+    m_coordinates.fill(a);
+//  for( i=0 ; i<m_coordinates.size() ; ++i )
+//      m_coordinates.put(i,a);
+    m_ponderation=1.0;
+    for( i=0 ; i<size() ; ++i )
+        m_stat[i].fill(0.0);
+}
+
+bool arlCore::Point::pond( arlCore::Point::csptr  p )
+{
+    if(p->size()!=size()) return false;
+    unsigned int i;
+    modified();
+    for( i=0 ; i<size() ; ++i )
+    {
+        m_coordinates.put(i,m_coordinates.get(i)+p->get(i));
+        arlCore::addValue(m_stat[i], p->get(i));
+    }
+    m_ponderation /= 1.0 + m_ponderation;
+    return true;
+}
+
+const std::vector< vnl_vector_fixed<double,5> >& arlCore::Point::getStatistic( void )
+{
+    return m_stat;
+}
+
+bool arlCore::Point::add( arlCore::Point::csptr  p )
+{
+    assert(p->size()==size());
+    if(p->size()!=size()) return false;
+    unsigned int i;
+    modified();
+    for( i=0 ; i<size() ; ++i )
+    {
+        m_coordinates.put(i,get(i)+p->get(i));
+        m_stat[i].fill(0.0);
+    }
+    m_ponderation = 1.0;
+    return true;
+}
+
+double arlCore::Point::x( void ) const
+{
+    assert(this->size()>0);
+    return get(0);
+}
+
+double arlCore::Point::y( void ) const
+{
+    assert(this->size()>1);
+    return get(1);
+}
+
+double arlCore::Point::z( void ) const
+{
+    assert(this->size()>2);
+    return get(2);
+}
+
+bool arlCore::Point::x( double a )
+{
+    assert(this->size()>0);
+    return set(0,a/m_ponderation); // FIXME
+}
+
+bool arlCore::Point::y( double a )
+{
+    assert(this->size()>1);
+    return set(1,a/m_ponderation); // FIXME
+}
+
+bool arlCore::Point::z( double a )
+{
+    assert(this->size()>2);
+    return set(2,a/m_ponderation); // FIXME
+}
+
+void arlCore::Point::normalize( void )
+{
+    unsigned int i;
+    Point::sptr Origin = Point::New(size());
+    const double Norm = distance(Origin);
+    for( i=0 ; i<size() ; ++i )
+    {
+        m_coordinates.put(i,get(i)/Norm);
+        m_stat[i].fill(0.0);
+    }
+    m_ponderation = 1.0;
+    modified();
+}
+
+unsigned int arlCore::Point::size( void ) const
+{
+    return m_coordinates.size();
+}
+
+arlCore::Point::ARLCORE_POINT_TYPE arlCore::Point::getType( void ) const
+{
+    return m_type;
+}
+
+bool arlCore::Point::setType( ARLCORE_POINT_TYPE type )
+{
+    if(type<ARLCORE_POINT_NBTYPES)
+    {
+        modified();
+        m_type=type;
+    }
+    return (type<ARLCORE_POINT_NBTYPES);
+}
+
+double arlCore::Point::getScalar( void ) const
+{
+    return m_scalar;
+}
+
+void arlCore::Point::setScalar( double scalar )
+{
+    modified();
+    m_scalar=scalar;
+}
+
+bool arlCore::Point::addGaussianNoise( const unsigned int index, const double std )
+{
+    if(index>=size()) return false;
+    set(index, get(index) + arlRandom::Random::gaussianRnd(std));
+    return true;
+}
+
+bool arlCore::Point::addGaussianNoise( const double std )
+{
+    unsigned int i;
+    for( i=0 ; i<size() ; ++i )
+        set(i, get(i) + arlRandom::Random::gaussianRnd(std));
+    return true;
+}
+
+void arlCore::Point::addUniformNoise( const unsigned int index, const double range )
+{
+    set(index, get(index)+arlRandom::Random::uniformDoubleRnd(-range, range));
+}
+/*
+void arlCore::Point::cubicRandom( const double side )
+{
+    unsigned int i;
+    for( i=0 ; i<size() ; ++i )
+        set(i, get(i)+arlRandom::Random::uniformDoubleRnd(-side/2,side/2));
+}
+
+void arlCore::Point::sphericRandom( const double radius )
+{
+    unsigned int i;
+    vnl_vector<double> vec(size());
+    do
+    {
+        for ( i=0 ; i<size() ; i++)
+            vec[i] = arlRandom::Random::uniformDoubleRnd(-1.0,1.0);
+    }while(vec.two_norm()>1.0);
+    for( i=0 ; i<size() ; ++i )
+        set(i, get(i)+vec[i]*radius);
+}*/
+
+bool arlCore::Point::shapeRandom( arlCore::ARLCORE_SHAPE type, const double size, const double angle )
+{
+    const unsigned int Dim = this->size();
+    vnl_vector<double> vec(Dim);
+    unsigned int i;
+    double a, theta, phi, fi_max;
+    switch(type)
+    {
+    case arlCore::ARLCORE_SHAPE_CUBE : // Size is the side of cube
+        for( i=0 ; i<Dim ; ++i )
+            set(i, get(i)+arlRandom::Random::uniformDoubleRnd(-size/2,size/2));
+        return true;
+    case arlCore::ARLCORE_SHAPE_SPHERE : // Size is the diameter
+        if(this->size()!=Dim) return false;
+        do
+        {
+            for ( i=0 ; i<Dim ; i++)
+                vec[i] = arlRandom::Random::uniformDoubleRnd(-1.0,1.0);
+        }while(vec.two_norm()>1.0);
+        for( i=0 ; i<Dim ; ++i )
+            set(i, get(i)+vec[i]*size/2);
+        return true;
+    case arlCore::ARLCORE_SHAPE_SPHERESURFACE :
+        if(this->size()!=Dim) return false;
+        theta = arlRandom::Random::uniformDoubleRnd(0,2*vnl_math::pi);
+        phi   = arlRandom::Random::uniformDoubleRnd(0, vnl_math::pi);
+        set(0, get(0) + size/2*sin(phi)*cos(theta) );
+        set(1, get(1) + size/2*sin(phi)*sin(theta) );
+        set(2, get(2) + size/2*cos(phi));
+        return true;
+    case arlCore::ARLCORE_SHAPE_SPHERE_CAP :
+        if(this->size()!=Dim) return false;
+        fi_max = acos(1-angle/2/vnl_math::pi);
+        theta = arlRandom::Random::uniformDoubleRnd(0,2*vnl_math::pi);
+        do
+        {
+            phi = arlRandom::Random::uniformDoubleRnd( 0, vnl_math::pi );
+        }while( phi > fi_max );
+        set(0, get(0) + size/2*sin(phi)*cos(theta) );
+        set(1, get(1) + size/2*sin(phi)*sin(theta) );
+        set(2, get(2) + size/2*cos(phi));
+        return true;
+    case arlCore::ARLCORE_SHAPE_DISC :
+        vec[Dim-1]=0.0;
+        do //le point tire appartient au plan xOy i.e. point.z() = 0.O
+        { //on ne boucle pas sur la derniere coordonnee
+            for ( i=0 ; i<Dim-1 ; i++)
+                vec[i] = arlRandom::Random::uniformDoubleRnd(-1.0,1.0);
+        }while(vec.two_norm()>1.0);
+        for( i=0 ; i<Dim ; ++i )
+            set(i, get(i)+vec[i]*size/2);
+        return true;
+    case arlCore::ARLCORE_SHAPE_PLAINSQUARE :
+        for( i=0 ; i<Dim-1 ; ++i )
+            set(i, get(i)+arlRandom::Random::uniformDoubleRnd(-size/2,size/2));
+        set(i, get(i) );
+        return true;
+    case arlCore::ARLCORE_SHAPE_CIRCLE :
+        if( Dim!=3 ) return false;
+        a = arlRandom::Random::uniformDoubleRnd(-vnl_math::pi,vnl_math::pi);
+        set(0, get(0) + cos(a)*size/2 );
+        set(1, get(1) + sin(a)*size/2 );
+        set(2, get(2));
+        return true;
+    case arlCore::ARLCORE_SHAPE_EDGESQUARE :
+        if( Dim!=3 ) return false;
+        for ( i=0 ; i<Dim ; i++)
+            vec[i] = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+        if(vec[1]<0.0) a=-1; else a=1;
+        if(vec[2] < 0.0)
+        {
+            set(0, get(0) + a*size/2 );
+            set(1, get(1) + vec[0] );
+        }
+        else
+        {
+            set(0, get(0) + vec[0] );
+            set(1, get(1) + a*size/2 );
+        }
+        set(2, get(2));
+        return true;
+    case arlCore::ARLCORE_SHAPE_SOLIDANGLE :
+        if( Dim!=3 ) return false;
+        double x,y,z,r;
+        double phi_max;
+        phi_max = acos(1.0-angle/2.0/vnl_math::pi);
+        do
+        {
+            x = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+            y = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+            z = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+            r = sqrt(x*x + y*y + z*z);
+            phi = acos(z/r);
+        }while( r>size/2 || phi > phi_max );
+        set(0, get(0) + x);
+        set(1, get(1) + y);
+        set(2, get(2) + z);
+        return true;
+    case arlCore::ARLCORE_SHAPE_SOLIDANGLE_SURFACE :
+        if( Dim!=3 ) return false;
+        fi_max = acos(1.0-angle/2.0/vnl_math::pi);
+        double xx,yy,zz,rr,fi;
+        do
+        {
+            xx = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+            yy = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+            zz = arlRandom::Random::uniformDoubleRnd(-size/2,size/2);
+
+            rr = sqrt(xx*xx + yy*yy + zz*zz);
+            fi = acos(zz/rr);
+        }while( rr>size/2 || fi > fi_max || fi < (fi_max - 0.01 ) );
+        set(0, get(0) + xx);
+        set(1, get(1) + yy);
+        set(2, get(2) + zz);
+        return true;
+    default: break;
+    }
+    return false;
+}
+
+double arlCore::Point::distance(arlCore::Point::csptr pt) const
+{   // Calcule la distance sur les dimensions communes
+    return ( sqrt(this->distance2(pt) ) );
+}
+
+double arlCore::Point::distance2(arlCore::Point::csptr pt) const
+{
+    unsigned int i,dim=size();
+    if(dim<pt->size()) dim=pt->size();
+    double dist = 0;
+    for(i=0 ; i<dim ; ++i)
+        dist += ((*this)[i]-(*pt)[i])*((*this)[i]-(*pt)[i]);
+    assert(dist>=0);
+    return (dist);
+}
+
+bool arlCore::Point::mult( double scalaire )
+{
+    modified();
+    m_coordinates *= scalaire;
+    return true;
+}
+
+bool arlCore::Point::cross_3D(arlCore::Point::csptr vec1, arlCore::Point::csptr vec2 )
+{
+    unsigned int i,j;
+    assert(this->size()==3 && vec1->size()==3 && vec2->size()==3);
+    vnl_vector_fixed<double,3> vnl_vec1((*vec1)[0], (*vec1)[1],(*vec1)[2]), vnl_vec2((*vec2)[0], (*vec2)[1],(*vec2)[2]), cross_prod;
+    vnl_matrix_fixed<double,3,3> Sx, Sy, res;
+    cross_prod = vnl_cross_3d(vnl_vec1, vnl_vec2);
+    for(i=0;i<3;i++)
+        this->set(i,cross_prod(i));
+    Sx = vnl_cross_product_matrix(vnl_vec1);
+    Sy = vnl_cross_product_matrix(vnl_vec2);
+    res = Sy * vec1->getCovMatrix() * vnl_transpose(Sy) + Sx * vec2->getCovMatrix() * vnl_transpose(Sx);
+    for(i=0;i<3;i++)
+        for(j=0;j<3;j++)
+            m_covMatrix.put(i, j, res(i,j) );
+    return true;
+}
+
+bool arlCore::Point::dotProduct(arlCore::Point::csptr  vec1, arlCore::Point::csptr  vec2)
+{
+    assert(this->size()==1);
+    assert(vec1->size()== vec2->size());
+    vnl_matrix<double> vnl_vec1(vec1->size(),1), vnl_vec2(vec1->size(),1);
+    vnl_matrix<double> res(1,1);
+    double dot = 0;
+    unsigned int i;
+    for( i=0 ; i<vec1->size( ); i++ )
+    {
+        dot+=(*vec1)[i]*(*vec2)[i];
+        vnl_vec1[i][0] = (*vec1)[i];
+        vnl_vec2[i][0] = (*vec2)[i];
+    }
+    this->set(0, dot);
+    res  = vnl_transpose(vnl_vec2) * vec1->getCovMatrix() * vnl_vec2
+         + vnl_transpose(vnl_vec1) * vec2->getCovMatrix() * vnl_vec1;
+    m_covMatrix.put(0, 0, res(0,0));
+    return true;
+}
+
+bool arlCore::Point::divide(arlCore::Point::csptr  var1, arlCore::Point::csptr  var2)
+{
+    assert(this->size()==1 && var1->size() ==1 && var2->size() ==1);
+    vnl_matrix<double> res(1,1);
+    //res = [1/y -x/y^2] * [sigma_x^2        0 ] * [  1/y ] = sigma_x^2 / y^2 + x^2/y^4 *sigma_y^2
+    //                     [0         sigma_y^2]   [-x/y^2]
+    res  = var1->getCovMatrix() / ((*var2)[0] * (*var2)[0]) +  var2->getCovMatrix()*((*var1)[0] * (*var1)[0])/((*var2)[0] * (*var2)[0]* (*var2)[0]* (*var2)[0]);
+    m_covMatrix.put(0, 0, res(0,0));
+    this->set(0, (*var1)[0]/(*var2)[0]);
+    return true;
+}
+
+bool arlCore::Point::multiply(arlCore::Point::csptr  scalar, arlCore::Point::csptr  vec)
+{
+    assert( this->size()== vec->size() );
+    assert( scalar->size()==1 );
+    vnl_matrix<double> res(vec->size(),vec->size()), jacobien(vec->size(),vec->size()+1), sigma(vec->size()+1,vec->size()+1);
+    unsigned int i,j;
+    for( i=0 ; i<vec->size() ; ++i )
+        this->set(i, (*scalar)[0] * (*vec)[i]);
+    sigma.fill(0);
+    sigma[0][0] = scalar->getCovMatrix()[0][0];
+    for( i=1 ; i<vec->size()+1 ; ++i )
+        for( j=1 ; j<vec->size()+1 ; ++j )
+        sigma[i][j] =  vec->getCovMatrix()[i-1][j-1];
+    //std::cerr<< "MATRIX\n"<<sigma;
+    jacobien.fill(0);
+    for( i=0 ; i<vec->size() ; ++i )
+        jacobien[i][0] = (*vec)[i];
+    for( i=0 ; i<vec->size() ; ++i )
+        jacobien[i][i+1] = (*scalar)[0];
+    //std::cerr<< "jacobien\n"<<jacobien;
+    res = jacobien * sigma * vnl_transpose(jacobien);
+    for( i=0 ; i<vec->size() ; ++i )
+        for( j=0 ; j<vec->size() ; ++j )
+            m_covMatrix.put(i, j, res(i,j));
+    return true;
+}
+
+void arlCore::Point::setError( double error )
+{
+    m_error = error;
+}
+
+double arlCore::Point::getError( void ) const
+{
+    return m_error;
+}
+
+// FONCTIONS DIVERSES : A TRIER
+/*unsigned int arlCore::load(PointsCont &list, const char *fileName, arlCore::Point::ARLCORE_POINT_TYPE type, long int date)
+{
+    unsigned int i, j, nbPoints = 0, serie=0, dim=0;
+    int n;
+    double a;
+    list.clear();
+    std::ifstream pFile(fileName);
+    std::string s;
+    if( pFile != 0 )
+    {
+        std::getline (pFile, s);
+        n = sscanf(s.c_str(),"%dDPoints\n",&dim);
+        while(!pFile.eof() && dim>0 && n==1)
+        {
+            std::getline (pFile, s);
+            n = sscanf(s.c_str(),"%d Points Serie %d\n",&nbPoints,&serie);
+            Point point(dim, type);
+            //TODO Lire tous les autres de la meme serie et moyenner
+            for( i=0 ; i<nbPoints && n==2 ; ++i )
+            {
+                for( j=0 ; j<dim ; ++j )
+                {
+                    pFile >> a;
+                    point.set(j,a);
+                }
+                point.setTime(serie,date);
+                list.push_back(point);
+            }
+            std::getline (pFile, s);
+        }
+        pFile.close();
+    }
+    return nbPoints;
+}
+*/
+double arlCore::distance( arlCore::Point::csptr pt1, arlCore::Point::csptr pt2)
+{
+    return pt1->distance(pt2);
+}
+
+double arlCore::surface( const std::vector< arlCore::Point::csptr >& ptList )
+{
+    //TODO : The next calculus is incorrect
+    // It's the sum of distances between all points
+    unsigned int i,j;
+    double s=0;
+    for( i=0 ; i<ptList.size() ; ++i )
+        for( j=i+1 ; j<ptList.size() ; ++j )
+            if(ptList[i]!=0 && ptList[j]!=0)
+                s+=ptList[i]->distance( ptList[j] );
+    return s;
+}
+
+unsigned int arlCore::closestY( const std::vector< arlCore::Point::csptr >&l, double y, unsigned int i1, unsigned int i2, int indexInit )
+{   // Si l est tri� par y croissant
+    const bool Verbose = false;
+/*#ifdef _DEBUG
+//  arlCore::save(l,"c:/ccc.txt",arlCore::ARLCORE_POINT_SAVE_GNUPLOT);
+    const bool lPasTrieCroissant = false;
+    const bool y_de_l_pas_continue_dans_Z = false;
+    unsigned int i;
+    double y0 = -99999999.99;
+    for( i=0 ; i<l.size() ; ++i )
+    {
+        // Verification de la croissance
+        if(l[i]->y()<y0) assert( lPasTrieCroissant );
+        // Verification de la continuite
+        if(i>0 && l[i]->y()!=y0+1)
+        {
+            std::cout<<"Discontinuite de l : "<<y0<<" - "<<l[i]->y()<<"\n";
+//          assert( y_de_l_pas_continue_dans_Z );
+        }
+        y0 = l[i]->y();
+    }
+#endif // _DEBUG*/
+    assert(l.size()>0);
+    if(Verbose) std::cout<<"Nb Points : "<<l.size();
+    unsigned int index[2],centre,intervalle,iterations=0,r;
+    index[0]=i1;
+    if(i2<=i1) index[1]=l.size()-1;
+    else index[1]=i2;
+    if(y<=l[index[0]]->y()) return index[0];
+    if(y>=l[index[1]]->y()) return index[1];
+    //if(index[1]>=l.size()) index[1]=l.size()-1;
+    intervalle=index[1]-index[0];
+    while(intervalle>1)
+    {
+        centre=index[0]+intervalle/2;
+        if(l[centre]->y()==y) return centre;
+        if(l[centre]->y()<y) index[0]=centre;
+        else index[1]=centre;
+        intervalle=index[1]-index[0];
+        ++iterations;
+    }
+    if(Verbose) std::cout<<" - ClosestY Nb iterations : "<<iterations<<"\n";
+    if(y-l[index[0]]->y()>l[index[1]]->y()-y) r=index[1];
+    else r=index[0];
+#ifdef _DEBUG
+    // Verification du bornage du resultat
+    if(y<l[r]->y())
+        if(r>0) assert(l[r-1]->y()<y);
+    if(y>l[r]->y())
+        if(r<l.size()-1) assert(l[r+1]->y()>y);
+#endif // _DEBUG
+    return r;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/PointsList.cpp b/SrcLib/ARLcore/src/arlcore/PointsList.cpp
new file mode 100644
index 0000000..fdcbf87
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/PointsList.cpp
@@ -0,0 +1,1477 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/PointsList.h>
+#include <arlcore/Point.h>
+
+#include <fstream>
+#include <iomanip>
+#include <algorithm>
+
+//#include <vgl/vgl_fit_plane_3d.h>
+#include <vgl/vgl_distance.h>
+#include <vgl/vgl_point_3d.h>
+
+#include <vnl/algo/vnl_powell.h>
+#include <vnl/vnl_matrix_fixed.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+#include <vnl/vnl_cross.h>
+
+#include <arlcore/Optimization.h>
+#include <arlcore/Misc.h>
+
+arlCore::PointList::PointList( unsigned int dim, const std::string &name )
+//VAG Object(ARLCORE_CLASS_POINTLIST)
+{
+    m_dimension=dim;
+//    m_pointList.reserve(dim);
+//    for (unsigned int i=0; i< dim; ++i )
+//    {
+//        m_pointList.push_back( Point::New() );
+//    }
+}
+
+arlCore::PointList::PointList( const arlCore::PointList& p )
+//VAG Object(ARLCORE_CLASS_POINTLIST)
+{
+    copy(p);
+}
+
+arlCore::PointList::PointList( const std::vector< arlCore::Point::csptr > &p )
+//VAG Object(ARLCORE_CLASS_POINTLIST)
+{
+    if(p.size()==0) m_dimension=3;
+    else
+    {
+        m_dimension=p[0]->size();
+        unsigned int i;
+        for( i=0 ; i<p.size() ; ++i )
+            if(p[i]!=0)
+                if(p[i]->size()==m_dimension) m_pointList.push_back(Point::New((p[i])));
+    }
+}
+
+arlCore::PointList::PointList( const std::vector< arlCore::Point::csptr > &p, double scalarMin, double scalarMax )
+//VAG Object(ARLCORE_CLASS_POINTLIST)
+{
+    if(p.size()==0) m_dimension=3;
+    else
+    {
+        m_dimension=p[0]->size();
+        unsigned int i;
+        for( i=0 ; i<p.size() ; ++i )
+            if(p[i]!=0)
+                if(p[i]->size()==m_dimension && p[i]->getScalar()>=scalarMin && p[i]->getScalar()<=scalarMax) m_pointList.push_back(Point::New((p[i])));
+    }
+}
+
+
+arlCore::PointList::sptr arlCore::PointList::PointListFactory( int size)
+{
+    PointList::sptr lpoint = ::arlCore::PointList::sptr( new PointList( size) );
+    return lpoint;
+}
+
+arlCore::PointList::sptr arlCore::PointList::PointListFactory( const std::vector< Point::csptr >& list )
+{
+    PointList::sptr lpoint = ::arlCore::PointList::sptr( new PointList( list ) );
+    return lpoint;
+}
+
+
+
+arlCore::PointList& arlCore::PointList::operator=( const PointList& p )
+{
+    copy(p);
+    return *this;
+}
+
+void arlCore::PointList::copy( const PointList& p )
+{
+    if(this==&p) return;
+//VAG    arlCore::Object *a=this;
+//VAG    const arlCore::Object *b=&p;
+//VAG    *a = *b;
+    clear();
+    unsigned int i;
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    m_dimension=p.m_dimension;
+    for( i=0 ; i<p.size() ; ++i )
+        m_pointList.push_back( Point::New(p.m_pointList[i]) );
+    unlockWriteMutex();
+    modified();
+}
+
+arlCore::PointList::~PointList( void )
+{
+    clear();
+}
+
+std::string arlCore::PointList::getString( void ) const
+{
+    std::stringstream s;
+    s<<"List of "<<(unsigned int)m_pointList.size()<<" points with dimension "<<getDimension()<<"\n";
+    unsigned int i;
+    for( i=0 ; i<m_pointList.size() ; ++i )
+        s<<m_pointList[i]->getString();
+    return s.str();
+}
+
+unsigned int arlCore::PointList::getDimension( void ) const
+{
+    return m_dimension;
+}
+
+bool arlCore::PointList::setDimension( unsigned int dim )
+{
+    if(size()!=0) return false;
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    m_dimension = dim;
+    unlockWriteMutex();
+    modified();
+    return true;
+}
+
+unsigned int arlCore::PointList::addGaussianNoise( double gaussianNoise )
+{
+    if(gaussianNoise<=0.0 || m_pointList.size()==0) return 0;
+    unsigned int i;
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    for( i=0 ; i<m_pointList.size() ; ++i )
+            m_pointList[i]->addGaussianNoise(gaussianNoise);
+    unlockWriteMutex();
+    modified();
+    return i;
+}
+
+unsigned int arlCore::PointList::fill( const std::vector< arlCore::vnl_rigid_matrix >& list )
+{
+    unsigned int i;
+    clear();
+    Point::sptr pt= Point::New();
+    for( i=0 ; i<list.size() ; ++i )
+    {
+        pt->fill(0.0);
+        list[i].trf( pt );
+        push_back(pt);
+    }
+    modified();
+    return i;
+}
+
+const std::vector< arlCore::Point::sptr >& arlCore::PointList::getList( void ) const
+{
+    return m_pointList;
+}
+
+
+const std::vector< arlCore::Point::csptr > arlCore::PointList::getListCopy( void ) const
+{
+    // VAG FIXME PERF
+    std::vector< arlCore::Point::csptr > res( m_pointList.size() );
+    std::copy( m_pointList.begin(), m_pointList.end(), res.begin() );
+    return res;
+}
+
+template <typename T>
+unsigned int internStatistic( const T &list, unsigned int dimension, arlCore::Point::sptr pt )
+{   // http://fr.wikipedia.org/wiki/Covariance
+    unsigned int i, j, k;
+    arlCore::Point::sptr mean = arlCore::Point::New(dimension);
+    mean->fill(0.0);
+    if(list.size()==0) return 0;
+    for( i=0 ; i<list.size() ; ++i )
+        for( j=0 ; j<dimension ; ++j )
+            if(list[i]->size()>j)
+                mean->set(j, (*mean)[j] + list[i]->get(j));
+    mean->mult(1.0/(double)list.size());
+    vnl_matrix<double> &covMatrix=mean->getCovMatrix();
+    covMatrix.fill(0.0);
+    //TODO some explanation on the formula are mandatory
+    for( i=0 ; i<list.size() ; ++i )
+        for( j=0 ; j<dimension ; ++j )
+            for( k=0 ; k<dimension ; ++k )
+                if(list[i]->size()>j && list[i]->size()>k)
+                    covMatrix[j][k] += (list[i]->get(j)- (*mean)[j])*(list[i]->get(k)-(*mean)[k]);
+    covMatrix /= list.size();
+    pt->copy(mean);
+    return (unsigned int)list.size();
+}
+
+unsigned int arlCore::statistic( const std::vector< Point::csptr > &list, unsigned int dimension, Point::sptr  pt )
+{
+    return internStatistic(list, dimension, pt);
+}
+
+unsigned int arlCore::statistic( const std::vector< Point::sptr > &list, unsigned int dimension, Point::sptr  pt )
+{
+    return internStatistic(list, dimension, pt);
+}
+
+unsigned int arlCore::PointList::statistic( Point::sptr  pt ) const
+{
+    assert(getDimension()>0);
+    return internStatistic(m_pointList, getDimension(), pt);
+}
+unsigned int arlCore::PointList::plane( vgl_homg_plane_3d< double >& homgPlane, double &rms, double &min, double &max, double scalar, double outliers ) const
+{
+    vgl_plane_3d<double> vglPlane;
+    unsigned int n = plane( vglPlane, rms, min, max, scalar, outliers );
+    homgPlane = vglPlane;
+    return n;
+}
+
+typedef std::pair<unsigned int, double> PlaneDistance;
+bool sortPoints(const PlaneDistance& left, const PlaneDistance& right)
+{   // Ordre decroissant des distances
+    return left.second > right.second;
+}
+
+unsigned int arlCore::PointList::plane( vgl_plane_3d< double >& plane, double &rms, double &min, double &max, double scalar, double outliers ) const
+{
+    if(outliers>1.0) outliers = 1.0;
+    // TODO Use #include <vgl_fit_plane_3d.h>
+    rms=-1, min=-1, max=-1;
+    if(m_dimension!=3) return 0;
+    vgl_point_3d< double > pt[3];
+    unsigned int i, j;
+//  for( i=0 ; i<3 ; ++i )
+//      pt[i].fill(0.0);
+    pt[0].set(0.0,0.0,0.0);
+    pt[1].set(0.0,0.0,0.0);
+    pt[2].set(0.0,0.0,0.0);
+    OptimisePlane meanPlane;
+    double n[3]={0.0,0.0,0.0};
+    for( i=0 ; i<size() ; ++i )
+    {
+        if(m_pointList[i]!=0)
+            if(scalar==0 || scalar==m_pointList[i]->getScalar())
+            {
+                vgl_point_3d< double > vglPt(m_pointList[i]->x(),m_pointList[i]->y(),m_pointList[i]->z());
+                meanPlane.addPoint( vglPt);
+                if(i<size()/3)
+                {
+                    n[0]++;
+                    pt[0].set(pt[0].x()+m_pointList[i]->x(), pt[0].y()+m_pointList[i]->y() , pt[0].z()+m_pointList[i]->z() );
+                }
+                if(i>=size()/3 && i<size()/3*2)
+                {
+                    n[1]++;
+                    pt[1].set(pt[1].x()+m_pointList[i]->x(), pt[1].y()+m_pointList[i]->y() , pt[1].z()+m_pointList[i]->z() );
+                }
+                if(i>=size()/3*2)
+                {
+                    n[2]++;
+                    pt[2].set(pt[2].x()+m_pointList[i]->x(), pt[2].y()+m_pointList[i]->y() , pt[2].z()+m_pointList[i]->z() );
+                }
+            }
+    }
+    if(meanPlane.size()<3) return 0;
+    for( i=0 ; i<3 ; ++i )
+        if(n[i]!=0) pt[i].set(pt[i].x()/n[i] , pt[i].y()/n[i] , pt[i].z()/n[i] );
+//  meanPlane.getPoint(0,pt[0]);
+//  meanPlane.getPoint(unsigned int(meanPlane.size()/2),pt[1]);
+//  meanPlane.getPoint(meanPlane.size()-1,pt[2]);
+    plane = vgl_plane_3d< double >(pt[0],pt[1],pt[2]);
+    if(meanPlane.size()==3) rms=0.0, min=0.0, max=0.0;
+    else
+    {
+        std::vector<PlaneDistance> distances;
+        vnl_vector<double> planSolution(4);
+        planSolution(0)=plane.a();
+        planSolution(1)=plane.b();
+        planSolution(2)=plane.c();
+        planSolution(3)=plane.d();
+        for( i=0 ; i<2 ; ++i )
+        {   //Erase outliers in the second iteration
+            if(i==1)
+            {
+                unsigned int n = distances.size()*outliers;
+                if(distances.size()-n < 3) n = distances.size()-3;
+                for( j=0 ; j<n ; ++j )
+                    meanPlane.delPoint(distances[j].first);
+            }
+            vnl_powell computeMeanPlane(&meanPlane);
+            computeMeanPlane.minimize(planSolution);
+            plane.set(planSolution(0),planSolution(1),planSolution(2),planSolution(3));
+            rms=sqrt(computeMeanPlane.get_end_error()/meanPlane.size());
+            const std::vector< vgl_point_3d< double >* > &points = meanPlane.getPoints();
+            distances.resize(points.size());
+            for( j=0 ; j<points.size() ; j++ )
+                if(points[j]!=0)
+                {
+                    distances[j].first = j;
+                    distances[j].second = vgl_distance(plane, *(points[j]));
+                    if(min<0 || distances[j].second<min) min=distances[j].second;
+                    if(max<0 || distances[j].second>max) max=distances[j].second;
+                }
+            std::sort(distances.begin(), distances.end(), sortPoints);
+        }
+    }
+    return meanPlane.size();
+}
+
+/*double arlCore::PointList::pivot( arlCore::Point::sptr center, double &error ) const
+{
+    unsigned int i;
+    const unsigned int Dim = getDimension();
+    center.init(Dim);
+    OptimisePivot pivot(*this);
+    vnl_vector<double> solution(Dim);
+    solution.fill(0.0);
+    vnl_powell computePivot(&pivot);
+    computePivot.minimize(solution);
+    for( i=0 ; i<Dim ; ++i )
+        center.set(i, solution[i]);
+    error = sqrt(computePivot.get_end_error()/size());
+    return pivot.getScalar();
+}*/
+
+///////////////////////////////////////////////////////////////////////////////////////
+//
+// We suppose that the points in the PointList are on a  sphere surface
+// This function provide an estimation of the sphere center and its radius from
+// the PointList. Three methods are now available:
+// ARLCORE_SCE_ANALYTIC, ARLCORE_SCE_GEOMETRIC, ARLCORE_SCE_OPTIMIZATION
+// How does ARLCORE_SCE_ANALYTIC work ?
+// the equation of a sphere is : (x-a)^2 + (y-b)^2 + ((z-c)^2 = R^2 where (a,b,c)
+// is the center of the sphere and R its radius.
+// By developing the parenthesis we can rewrite it:
+// x^2 +y^2 +z^2 + dx + ey + fz +g = R^2
+// where d = -2a  e = -2b  f = -2c  and a^2 + b^2 + c^2 -R^2 = g
+// Here we want to minimize : sum_i || x_i^2 +y_i^2 +z_i^2 + dx_i + ey_i + fz_i +g_i - R^2 ||^2
+// A direct derivation wrt the vector [d e f g]^T gives the following result:
+//
+// [d e f g] = -sum( (x_i^2 + y_i^2 + z_i^2)[x_i y_i z_i 1]) * inverse(sum(transpose([x_i y_i z_i 1]) . [x_i y_i z_i 1]) )
+//
+// ARLCORE_SCE_GEOMETRIC: theoretically, the sphere center should lie on each
+// plane P_i that is orthogonal to each point pair and intersecting their gravity
+// center. This method finds the point C that minimize the squared distance
+// between each mediator plane P_i and C.
+// argmin sum_i dist(C, P_i) = argmin sum_i ||ai*xc + bi*yc + ci*zc + d_i ||^2/ (a_i^2 + b_i^2 +c_i^2)
+//
+// ARLCORE_SCE_OPTIMIZATION :
+// here we use an iterative optimization to find C. The criterion that is optimized is:
+// sum_i dist(C, M_i)^2 where M_i are the points that belong to the sphere
+//
+// log[0] = sqrt( mean  (sum_i || estimated_radius_pt_i - estimated_radius ||^2) )
+// It corresponds to the average of the distance of the point cloud to the estimated sphere
+// log[1] = sqrt( mean  (sum_i || distance_to_sphere_pt_i - average_distance_to_sphere ||^2) )
+// It corresponds to the standard deviation of the distance to the sphere
+// log[2] = maximum distance of the point cloud to the estimated sphere
+////////////////////////////////////////////////////////////////////////////////////////
+bool arlCore::PointList::sphereCenterEstimation( arlCore::Point::sptr  centerEstimation, double &radius, arlCore::ARLCORE_SCE methode, std::vector<double> &optimiser_parameter, std::vector<double> &log) const
+{
+    const bool Verbose = false;
+    const unsigned int Size = size();
+    if (size() < 4)
+    {
+        std::cerr<<"Number of point is < 5 in arlCore::PointList::sphereCenterEstimation"<<std::endl;
+        assert(size() < 4);
+    }
+    if(methode==arlCore::ARLCORE_SCE_ANALYTIC)
+    {
+        vnl_matrix_fixed <double,4,4> matrix_sum(0.0);
+        vnl_matrix_fixed <double,1,4> xyz1(0.0), vector_sum(0.0), defg(0.0);
+        vnl_vector<double> radius_error( Size ), std_distance( Size );
+        unsigned int i;
+        for( i=0 ; i<Size ; ++i )
+        {
+            xyz1.put( 0, 0, get(i)->x() );
+            xyz1.put( 0, 1, (*this)[i]->y() );
+            xyz1.put( 0, 2, (*this)[i]->z() );
+            xyz1.put( 0, 3, 1.0 );
+            matrix_sum = matrix_sum.as_matrix() + xyz1.as_matrix().transpose() * xyz1;
+            vector_sum = vector_sum.as_matrix() + (xyz1(0,0)*xyz1(0,0) + xyz1(0,1)*xyz1(0,1) + xyz1(0,2)*xyz1(0,2))*xyz1.as_matrix();
+        }
+        defg = - vector_sum.as_matrix() * vnl_matrix_inverse<double> (matrix_sum.as_matrix());
+        double a = -1*defg(0,0)/2;
+        double b = -1*defg(0,1)/2;
+        double c = -1*defg(0,2)/2;
+        radius = sqrt( a*a + b*b + c*c - defg(0,3) );
+        centerEstimation->set( 0, a );
+        centerEstimation->set( 1, b );
+        centerEstimation->set( 2, c );
+        for( i=0 ; i<Size ; ++i )
+        {
+            radius_error[i] = fabs( get(i)->distance(centerEstimation) - radius );
+            if(Verbose) std::cerr<<"radius_error[i] = " <<radius_error[i]<<std::endl;
+        }
+        const double Mean = radius_error.mean();
+        for( i=0 ; i<Size ; ++i )
+            std_distance.put(i, radius_error[i] -  Mean );
+        log.clear();
+        log.push_back( radius_error.rms() );
+        centerEstimation->setError(log.back());
+        log.push_back( std_distance.rms() );
+        log.push_back( radius_error.max_value() );
+        return true;
+    }
+    if(methode==arlCore::ARLCORE_SCE_GEOMETRIC)
+    {
+        vnl_matrix_fixed <double,3,3> matrix_sum(0.0);
+        std::vector< vnl_matrix_fixed<double,1,3> > normal_vec;
+        vnl_vector<double>radius_error( Size ), std_distance( Size );
+        std::vector<double> dk;
+        vnl_matrix_fixed<double,1,3> vector_sum(0.0), center, tmp;
+        unsigned int i, j;
+        for( i=0 ; i<Size ; ++i )
+            for( j=0 ; j<Size ; ++j )
+                    if(j!=i)
+                    {
+                        tmp.put(0, 0, get(i)->x() - get(j)->x());
+                        tmp.put(0, 1, get(i)->y() - get(j)->y());
+                        tmp.put(0, 2, get(i)->z() - get(j)->z());
+                        normal_vec.push_back(tmp);
+                        dk.push_back( -1*(get(i)->x()*get(i)->x() + get(i)->y()*get(i)->y() + get(i)->z()*get(i)->z()
+                        - get(j)->x()*get(j)->x() - get(j)->y()*get(j)->y() - get(j)->z()*get(j)->z() ) /2 );
+                    }
+        if(Verbose) std::cerr<< "normal_vec size = " << (unsigned int)normal_vec.size()<<std::endl;
+        for( i=0 ; i<normal_vec.size() ; ++i )
+        {
+            matrix_sum =  matrix_sum + (normal_vec[i].as_matrix().transpose() * normal_vec[i])/( normal_vec[i](0,0)* normal_vec[i](0,0)
+            + normal_vec[i](0,1)* normal_vec[i](0,1) + normal_vec[i](0,2)* normal_vec[i](0,2) );
+
+            vector_sum = vector_sum + dk[i]/( normal_vec[i](0,0)* normal_vec[i](0,0) + normal_vec[i](0,1)* normal_vec[i](0,1)
+            + normal_vec[i](0,2)* normal_vec[i](0,2) ) * normal_vec[i];
+        }
+        center =  vector_sum.as_matrix() * vnl_matrix_inverse<double> (matrix_sum.as_matrix()) *(-1);
+        radius = 0;
+        centerEstimation->set(0, center(0,0) );
+        centerEstimation->set(1, center(0,1) );
+        centerEstimation->set(2, center(0,2) );
+        for( i = 0; i<Size; ++i)
+            radius += centerEstimation->distance( get(i) );
+        radius /= (double)Size;
+        for( i=0 ; i<Size ; ++i )
+        {
+            radius_error[i] = fabs(centerEstimation->distance( get(i) ) - radius);
+            //std::cerr<< "radius_error[i] = " <<radius_error[i]<<std::endl;
+        }
+        for( i=0 ; i<Size ; ++i )
+        {
+            std_distance[i] = radius_error.get(i)-radius_error.mean();
+        }
+        log.clear();
+        log.push_back( radius_error.rms() );
+        centerEstimation->setError(log.back());
+        log.push_back( std_distance.rms() );
+        log.push_back( radius_error.max_value() );
+        return true;
+    }
+    if(methode==arlCore::ARLCORE_SCE_OPTIMIZATION)
+    {
+        unsigned int i;
+        const unsigned int Dim = getDimension();
+        centerEstimation->init(Dim);
+        OptimisePivot pivot( const_cast< PointList *>(this)->getSptr() );
+        vnl_vector<double> solution(Dim);
+        solution.fill(0.0); // Initialisation
+        std::vector<double> tmpLog;
+        sphereCenterEstimation( centerEstimation, radius, ARLCORE_SCE_ANALYTIC, optimiser_parameter, tmpLog );
+        for( i=0 ; i<Dim ; ++i )
+            solution[i] = (*centerEstimation)[i];
+        vnl_powell computePivot(&pivot);
+        computePivot.minimize(solution);
+        for( i=0 ; i<Dim ; ++i )
+            centerEstimation->set(i, solution[i]);
+        double error = sqrt(computePivot.get_end_error()/Size);
+        radius = pivot.getRadius();
+        log.clear();
+        log.push_back( error );
+        centerEstimation->setError(log.back());
+        return true;
+    }
+    if(methode==arlCore::ARLCORE_SCE_4POINTS)
+    {
+        //computation of two lines which intersection in an estimation of
+        //the sphere center
+        vnl_vector<double>radius_error( Size ), std_distance( Size );
+        arlCore::PointList::sptr trian1, trian2, fourPoints;
+        trian1 =  arlCore::PointList::New();
+        trian2 =  arlCore::PointList::New();
+        fourPoints =  arlCore::PointList::New();
+
+        arlCore::Point::sptr line_center1, line_center2, line1_another_point, line2_another_point;
+        line_center1 =  arlCore::Point::New();
+        line_center2 =  arlCore::Point::New();
+        line1_another_point =  arlCore::Point::New();
+        line2_another_point =  arlCore::Point::New();
+        vgl_plane_3d< double > plane1, plane2;
+        for(int i=0; i<3;++i)
+        {
+            trian1->push_back( get(i) );
+            trian2->push_back( get(i+1) );
+        }
+        trian1->triangleCircumcircleOrthoLine(line_center1, plane1);
+        trian2->triangleCircumcircleOrthoLine(line_center2, plane2);
+        line1_another_point->set(0, (*line_center1)[0] + plane1.a());
+        line1_another_point->set(1, (*line_center1)[1] + plane1.b());
+        line1_another_point->set(2, (*line_center1)[2] + plane1.c());
+        line2_another_point->set(0, (*line_center2)[0] + plane2.a());
+        line2_another_point->set(1, (*line_center2)[1] + plane2.b());
+        line2_another_point->set(2, (*line_center2)[2] + plane2.c());
+        fourPoints->push_back(line_center1);
+        fourPoints->push_back(line1_another_point);
+        fourPoints->push_back(line_center2);
+        fourPoints->push_back(line2_another_point);
+        double line_error=0;
+        fourPoints->twoLinesClosestPoint( centerEstimation, line_error);
+//      std::cerr<< "line_error = "<< line_error<<std::endl;
+        radius = 0;
+        for( int i = 0; i<Size; ++i)
+            radius += centerEstimation->distance(get(i));
+        radius /= (double)Size;
+        for( int i=0 ; i<Size ; ++i )
+        {
+            radius_error[i] = fabs(centerEstimation->distance( get(i) ) - radius);
+            //std::cerr<< "radius_error[i] = " <<radius_error[i]<<std::endl;
+        }
+        for( int i=0 ; i<Size ; ++i )
+        {
+            std_distance[i] = radius_error.get(i)-radius_error.mean();
+        }
+        log.clear();
+        log.push_back( radius_error.rms() );
+        centerEstimation->setError(log.back());
+        log.push_back( std_distance.rms() );
+        log.push_back( radius_error.max_value() );
+        return true;
+    }
+    return false;
+}
+
+bool arlCore::PointList::triangleCircumcircleOrthoLine(Point::sptr centerEstimation, vgl_plane_3d< double > &trian_plane) const
+{
+    if (this->size() < 3)
+    {
+        std::cerr<<"in PointList::triangleCircumcircle Point list size in below 3"<<std::endl;
+        assert(this->size() < 3);
+    }
+    else
+    {
+        vgl_vector_3d< double > AB(this->get(0)->x() - this->get(1)->x(), this->get(0)->y() - this->get(1)->y(), this->get(0)->z() - this->get(1)->z());
+        vgl_vector_3d< double > AC(this->get(0)->x() - this->get(2)->x(), this->get(0)->y() - this->get(2)->y(), this->get(0)->z() - this->get(2)->z());
+
+        vgl_point_3d< double > A(this->get(0)->x(), this->get(0)->y(), this->get(0)->z());
+        vgl_point_3d< double > B(this->get(1)->x(), this->get(1)->y(), this->get(1)->z());
+        vgl_point_3d< double > C(this->get(2)->x(), this->get(2)->y(), this->get(2)->z());
+        vgl_point_3d< double > middle_AB( (A.x() + B.x())/2, (A.y() + B.y())/2, (A.z() + B.z())/2);
+        vgl_point_3d< double > middle_AC( (C.x() + A.x())/2, (C.y() + A.y())/2, (C.z() + A.z())/2);
+        vgl_plane_3d< double > first_plane(AB, middle_AB);
+        vgl_plane_3d< double > second_plane(AC, middle_AC);
+        vgl_plane_3d< double > triangle_plane(A, B, C);
+        vgl_point_3d< double > circumcircle_center(first_plane, second_plane, triangle_plane);
+
+        trian_plane = triangle_plane;
+
+        centerEstimation->set(0,circumcircle_center.x());
+        centerEstimation->set(1,circumcircle_center.y());
+        centerEstimation->set(2,circumcircle_center.z());
+    }
+    return true;
+}
+
+bool arlCore::PointList::twoLinesClosestPoint(Point::sptr closestPoint, double &log) const
+{
+    //p1 = pointlist[0]
+    //p2 = pointlist[1]
+    //p3 = pointlist[2]
+    //p4 = pointlist[3]
+    arlCore::Point::sptr pa =  arlCore::Point::New();
+    arlCore::Point::sptr pb =  arlCore::Point::New();
+    arlCore::Point::sptr p1 =  arlCore::Point::New( get(0) );
+    arlCore::Point::sptr p2 =  arlCore::Point::New( get(1) );
+    arlCore::Point::sptr p3 =  arlCore::Point::New( get(2) );
+    arlCore::Point::sptr p4 =  arlCore::Point::New( get(3) );
+
+    arlCore::Point::sptr p13 =  arlCore::Point::New();
+    arlCore::Point::sptr p43 =  arlCore::Point::New();
+    arlCore::Point::sptr p21 =  arlCore::Point::New();
+
+    double d1343,d4321,d1321,d4343,d2121;
+    double numer,denom, eps=1e-12;
+    p13->set(0, p1->x() - p3->x() );    p13->set(1, p1->y() - p3->y() );    p13->set(2, p1->z() - p3->z() );
+    p43->set(0, p4->x() - p3->x() );    p43->set(1, p4->y() - p3->y() );    p43->set(2, p4->z() - p3->z() );
+    if (fabs(p43->x())  < eps && fabs(p43->y())  < eps && fabs(p43->z())  < eps)
+        return(false);
+
+    p21->set(0, p2->x() - p1->x() );    p21->set(1, p2->y() - p1->y() );    p21->set(2, p2->z() - p1->z() );
+    if (fabs(p21->x())  < eps && fabs(p21->y())  < eps && fabs(p21->z())  < eps)
+       return(false);
+
+    d1343 = p13->x() * p43->x() + p13->y() * p43->y() + p13->z() * p43->z();
+    d4321 = p43->x() * p21->x() + p43->y() * p21->y() + p43->z() * p21->z();
+    d1321 = p13->x() * p21->x() + p13->y() * p21->y() + p13->z() * p21->z();
+    d4343 = p43->x() * p43->x() + p43->y() * p43->y() + p43->z() * p43->z();
+    d2121 = p21->x() * p21->x() + p21->y() * p21->y() + p21->z() * p21->z();
+
+    denom = d2121 * d4343 - d4321 * d4321;
+    if (fabs(denom) < eps)
+        return(false);
+    numer = d1343 * d4321 - d1321 * d4343;
+
+    double mua = numer / denom;
+    double mub = (d1343 + d4321 * (mua)) / d4343;
+    pa->set(0, p1->x() + mua * p21->x() );
+    pa->set(1, p1->y() + mua * p21->y() );
+    pa->set(2, p1->z() + mua * p21->z() );
+    pb->set(0, p3->x() + mub * p43->x() );
+    pb->set(1, p3->y() + mub * p43->y() );
+    pb->set(2, p3->z() + mub * p43->z() );
+//  std::cerr<<"I = " << pa.getCoordinates()<<std::endl;
+//  std::cerr<<"J = " << pb->getCoordinates()<<std::endl;
+    closestPoint->x(0.5*pa->x() + 0.5*pb->x());
+    closestPoint->y(0.5*pa->y() + 0.5*pb->y());
+    closestPoint->z(0.5*pa->z() + 0.5*pb->z());
+    log = pa->distance(pb);
+    return true;
+}
+
+unsigned int arlCore::PointList::shapeRandom( unsigned int nbPoints, ARLCORE_SHAPE type, Point::csptr centre, const double size, const double angle)
+{
+    m_pointList.clear();
+    if(type<=ARLCORE_SHAPE_UNKNOWN ||type>=ARLCORE_SHAPE_NBSHAPES) return 0;
+    unsigned int i, j;
+    if(type==ARLCORE_SHAPE_CHESSBOARD)
+    {   // nbPoints = Number of points by side of the square
+        if(centre->size()<2) return 0; // Point dimension at least = 2
+        const double Step = size/(double)(nbPoints-1);
+        arlCore::Point::sptr currentPoint = arlCore::Point::New(centre);
+        // firstPoint is the Upper left coin
+        const double Xorg = centre->x()-size/2.0;
+        const double Yorg = centre->y()-size/2.0;
+        for( i=0 ; i<nbPoints ; ++i )
+            for( j=0 ; j<nbPoints ; ++j )
+            {
+                currentPoint->x(Xorg + (double)i*Step);
+                currentPoint->y(Yorg + (double)j*Step);
+                push_back(currentPoint);
+            }
+        return nbPoints*nbPoints;
+    }
+    switch(type)
+    {
+    case ARLCORE_SHAPE_CUBE: setName("Random points in a cube");break;
+    case ARLCORE_SHAPE_SPHERE: setName("Random points in a sphere");break;
+    case ARLCORE_SHAPE_SPHERE_CAP: setName("Random points on a sphere cap");break;
+    case ARLCORE_SHAPE_DISC: setName("Random points on a disc");break;
+    case ARLCORE_SHAPE_PLAINSQUARE: setName("Random points on a plain square");break;
+    case ARLCORE_SHAPE_CIRCLE: setName("Random points on a circle");break;
+    case ARLCORE_SHAPE_EDGESQUARE: setName("Random points on a edge square");break;
+    case ARLCORE_SHAPE_SOLIDANGLE: setName("Random points in a solid angle");break;
+    case ARLCORE_SHAPE_SOLIDANGLE_SURFACE: setName("Random points on a solid angle surface");break;
+    default: break;
+    }
+    m_dimension=3;
+    for( i=0 ; i<nbPoints ; ++i )
+    {
+        arlCore::Point::sptr tmp=arlCore::Point::New(centre);
+        tmp->shapeRandom(type, size, angle);
+        push_back(tmp);
+    }
+    modified();
+    return nbPoints;
+}
+
+unsigned int arlCore::PointList::randomList( PointList::csptr A, unsigned int n )
+{
+    unsigned int i;
+    std::vector<unsigned int> v;
+    clear();
+    arlRandom::randomIndex( A->size(), v, n );
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    PointList::sptr Anc = PointList::constCast(A);
+    for( i=0 ; i<n ; ++i )
+        m_pointList.push_back( Point::New( (*Anc)[i]) ) ;
+    unlockWriteMutex();
+    modified();
+    return n;
+}
+
+bool arlCore::PointList::plot( const std::string &options ) const
+{
+    const bool JustVisible = false;
+    const bool Overwrite = true;
+    save("000000.dat", ARLCORE_POINT_SAVE_GNUPLOT, JustVisible, Overwrite);
+    std::fstream file;
+    file.open (TMP_FILE, std::fstream::out);
+    if(!file.is_open()) return false;
+    file<<"set title '"<<getName()<<"'\n";
+    file<<options<<"\n";
+    if(getDimension()==3) file<<"s";
+    file<<"plot ";
+    file<<"\"000000.dat\"\n";
+    file<<"pause -1 \"Hit return to continue\"\n";
+    file.close();
+    system(GNUPLOT_EXE);
+    //exec(GNUPLOT_EXE, TMP_FILE );
+    return true;
+}
+
+bool arlCore::PointList::SLplot( void ) const
+{
+    return false;
+    double rms, min, max;
+    int i;
+    vgl_plane_3d< double > p;
+    unsigned int n;
+    const bool JustVisible = false;
+    const bool Overwrite = true;
+    save("c:/000000.dat", ARLCORE_POINT_SAVE_GNUPLOT, JustVisible, Overwrite);
+    for( i=-30 ; i<30 ; ++i)
+    {
+        if(i!=0)
+        {
+            n=this->plane( p, rms, min, max, i);
+            if(n>3)
+            {
+                std::fstream file;
+                file.open ("c:/000000.dem", std::fstream::out);
+                file<<"set title 'Nuage de points & plans mdians\n";
+                file<<"splot ";
+                if(!file.is_open()) return false;
+                file<<"("<<p.a()<<"*x+("<<p.b()<<")*y+("<<p.d()<<"))/(-("<<p.c()<<")),";
+                file<<"\"c:/000000.dat\"\n";
+                file<<"pause -1 \"Hit return to continue\"\n";
+                file.close();
+                file.flush();
+                system ("d:/gnuplot/bin/wgnuplot c:/000000.dem" );
+            }
+        }
+    }
+    return true;
+}
+
+template <typename T>
+bool internSave( const T &pl, const std::string &fileName, const std::string &name, arlCore::ARLCORE_POINT_SAVE_TYPE type,  bool justVisible, bool overwrite )
+{
+    if(pl.size()==0) return false;
+    const unsigned int Dim = pl[0]->size();
+    unsigned int i, n;
+#ifdef _DEBUG
+    // List shoud contains points with the same dimension
+    for( i=0 ; i<pl.size() ; ++i )
+    {
+        if(pl[i]!=0)
+            if(pl[i]->isOK())
+            {
+                assert(pl[i]->size()==Dim);
+            }
+    }
+#endif // _DEBUG
+    std::fstream file;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    file.open(fileName.c_str(), std::fstream::out);
+    if(!file.is_open()) return false;
+    if(type==arlCore::ARLCORE_POINT_SAVE_FULL || type==arlCore::ARLCORE_POINT_SAVE_LIGHT)
+    {
+        file<<"FileType PointList\n";
+        file<<"Version 1.0\n";
+        file<<"Dimension "<<Dim<<"\n";
+    }
+    if(type==arlCore::ARLCORE_POINT_SAVE_GNUPLOT)
+        file<<"#ARL points list for GNUPLOT\n";
+    if(type==arlCore::ARLCORE_POINT_SAVE_VTK)
+    {
+        file<<"# vtk DataFile Version 3.1\n";
+        file<<name<<"\n";
+        file<<"ASCII\n";
+        file<<"DATASET UNSTRUCTURED_GRID\n\n";
+        file<<"POINTS "<<(unsigned int)pl.size()<<" double\n";
+    }
+    for( i=0, n=0 ; i<pl.size() ; ++i )
+        if(pl[i]!=0)
+            if(pl[i]->isOK())
+                if(!justVisible || pl[i]->isVisible())
+                {
+                    pl[i]->save(file, n, type);
+                    ++n;
+                }
+    if(type==arlCore::ARLCORE_POINT_SAVE_VTK)
+    {
+        file<<"\nCELLS 1 "<<(unsigned int)pl.size()+1<<"\n";
+        file<<(unsigned int)pl.size()<<"\t";
+        for( i=0 ; i<pl.size() ; ++i )
+            file<<i<<" ";
+        file<<"\n\nCELL_TYPES 1\n2\n";
+    }
+    file.close();
+    return true;
+}
+
+bool arlCore::PointList::save( const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type,  bool justVisible, bool overwrite ) const
+{
+    bool b = internSave( m_pointList, fileName, getName(), type, justVisible, overwrite );
+    if( b && type==arlCore::ARLCORE_POINT_SAVE_VTK )
+    {
+        unsigned int i;
+        std::fstream file;
+        file.open(fileName.c_str(), std::fstream::out | std::fstream::app);
+        if(!file.is_open()) return b;
+        file<<"\nPOINT_DATA "<<size();
+        file<<"\n\nSCALARS error double 1\nLOOKUP_TABLE default\n";
+        for( i=0 ; i<size() ; ++i )
+            if(m_pointList[i]!=0)
+                if(m_pointList[i]->isOK())
+                    file<<m_pointList[i]->getError()<<" ";
+        file<<"\nSCALARS scalar double 1\nLOOKUP_TABLE default\n";
+        for( i=0 ; i<size() ; ++i )
+            if(m_pointList[i]!=0)
+                if(m_pointList[i]->isOK())
+                    file<<m_pointList[i]->getScalar()<<" ";
+        file<<"\n\nSCALARS visible char 1\nLOOKUP_TABLE default\n";
+        for( i=0 ; i<size() ; ++i )
+            if(m_pointList[i]!=0)
+                if(m_pointList[i]->isOK())
+                {
+                    if(m_pointList[i]->isVisible())
+                        file<<"1 ";
+                    else file<<"0 ";
+                }
+        if(getDimension()==3)
+        {
+            file<<"\n\nTENSORS covariance double\n";
+            for( i=0 ; i<size() ; ++i )
+                if(m_pointList[i]!=0)
+                    if(m_pointList[i]->isOK())
+                        file<<m_pointList[i]->getCovMatrix()<<"\n";
+        }
+        file.close();
+    }
+    return b;
+}
+unsigned int addPoints( arlCore::PointList::sptr ptsList, double step )
+{
+    return 0;
+    // Reechantillonne le triangle form� par les 3 derniers points
+    unsigned int n=0;
+    const unsigned int Size = ptsList->size();
+    if(Size<3) return n;
+    arlCore::Point::csptr A = (*ptsList)[Size-1];
+    arlCore::Point::csptr B = (*ptsList)[Size-2];
+    arlCore::Point::csptr C = (*ptsList)[Size-3];
+    std::cout<<A->distance(B)<<"-";
+    std::cout<<C->distance(B)<<"-";
+    std::cout<<A->distance(C)<<"\n";
+    return n;
+}
+
+bool arlCore::PointList::load( const std::string &fileName, double step )
+{
+    if(fileName=="") return false;
+    std::ifstream file;
+    file.open (fileName.c_str(), std::fstream::in);
+    if(!file.is_open())
+    {
+        std::cerr<<"PointList Loading error : "<<fileName<<"\n";
+        return false;
+    }
+    std::string extractFolder, extractFile, ext;
+    arlString::splitFilename( fileName, extractFolder, extractFile, ext );
+    const bool Trian = (ext=="trian");
+    const bool Raw = (ext=="raw");
+    unsigned int i=0, n=0;
+    int no;
+    std::string token,text;
+    double version;
+    modified(); // TODO Optimize its position
+    m_pointList.clear();
+    if(Trian)
+    {
+        m_dimension = 3;
+        unsigned int nbPts;
+        double x,y,z;
+        file>>nbPts;
+        while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+        for( ; i<nbPts ; ++i )
+        {
+            file>>x>>y>>z;
+            Point::sptr p = Point::New();
+            p->x(x);
+            p->y(y);
+            p->z(z);
+            m_pointList.push_back( p );
+            if(step>0)
+                if((i+1)%3==0) addPoints( getSptr() , step);
+        }
+        unlockWriteMutex();
+        file.close();
+        return true;
+    }
+    if(Raw)
+    {
+        m_dimension = 3;
+        double x,y,z;
+        while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+        while(!file.eof())
+        {
+            file>>x>>y>>z;
+            Point::sptr p = Point::New();
+            p->x(x);
+            p->y(y);
+            p->z(z);
+            m_pointList.push_back( p );
+            if(step>0)
+                if((i+1)%3==0) addPoints( getSptr(), step);
+            ++i;
+        }
+        unlockWriteMutex();
+        file.close();
+        return true;
+    }
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    do
+    {   // Reading header
+        file>>token;
+        if(token=="FileType")
+        {
+            file>>text;
+            if(text!="PointList" && text!="PointsList")
+            {   // FIXME PointsList deprecated : to delete
+                unlockWriteMutex();
+                return false;
+            }
+            n=(n|1);
+        }
+        if(token=="Version") {file>>version; n=(n|2);}
+        if(token=="Dimension") {file>>m_dimension; n=(n|4);}
+        if(file.eof())
+        {
+            std::cerr<<"PointList Loading Header error : "<<fileName<<"\n";
+            unlockWriteMutex();
+            return false;
+        }
+    } while(n!=7);
+    unlockWriteMutex();
+    bool b;
+    do
+    {
+        Point::sptr p = Point::New();
+        b=p->load(file,no,m_dimension);
+        if(b)
+        {
+            if(no<0) push_back(p);
+            else
+            {
+                while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+                assert(no>=0);
+                for( i=size() ; i<=(unsigned int)no ; ++i )
+                    m_pointList.push_back( arlCore::Point::sptr() );
+                if( !m_pointList[no] )
+                    m_pointList[no]= p;
+                else m_pointList[no]->pond(p);
+                unlockWriteMutex();
+            }
+        }
+    }while(b);
+    file.close();
+    return true;
+}
+
+arlCore::Point::sptr arlCore::PointList::operator[]( unsigned int i )
+{   // FIXME Problem de validite de l'objet retourne
+    modified();
+    return get(i);
+}
+
+arlCore::Point::csptr arlCore::PointList::operator[]( unsigned int i ) const
+{   // FIXME Problem de validite de l'objet retourne
+    return get(i);
+}
+
+arlCore::Point::sptr arlCore::PointList::get( unsigned int i )
+{   // FIXME Problem de validite de l'objet retourne
+    if(i<0 || i>=size()) return arlCore::Point::sptr();
+    else return m_pointList[i];
+}
+
+arlCore::Point::csptr arlCore::PointList::get( unsigned int i ) const
+{
+    if(i<0 || i>=size()) return arlCore::Point::sptr();
+    arlCore::Point::csptr P = m_pointList[i];
+    return P;
+}
+
+arlCore::Point::sptr arlCore::PointList::back( void )
+{   // FIXME Problem de validite de l'objet retourne
+    if(size()<1) return arlCore::Point::sptr();
+    return get(size()-1);
+}
+
+arlCore::Point::csptr arlCore::PointList::back( void ) const
+{   // FIXME Problem de validite de l'objet retourne
+    if(size()<1) return arlCore::Point::sptr();
+    else return get(size()-1);
+}
+
+unsigned int arlCore::PointList::push_back(PointList::csptr p )
+{
+    unsigned int i,n=0;
+    for( i=0 ; i< p->size() ; ++i )
+        if(push_back(( (*p)[i]))) ++n;
+    modified();
+    return n;
+}
+
+bool arlCore::PointList::push_back( Point::csptr p )
+{
+    if(m_dimension!=p->size())
+        if(size()!=0) return false;
+    setDimension(p->size());
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    m_pointList.push_back( Point::constCast(p) );
+    unlockWriteMutex();
+    modified();
+    return true;
+}
+
+bool arlCore::PointList::push_back( double x, double y )
+{
+    if(m_dimension!=2)
+        if(size()!=0) return false;
+    setDimension(2);
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    arlCore::Point::sptr newPt = arlCore::Point::New();
+    newPt->init(2);
+    newPt->x(x); newPt->y(y);
+    m_pointList.push_back( newPt );
+    unlockWriteMutex();
+    modified();
+    return true;
+}
+
+bool arlCore::PointList::push_back( double x, double y, double z )
+{
+    if(m_dimension!=3)
+        if(size()!=0) return false;
+    setDimension(3);
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    arlCore::Point::sptr newPt = arlCore::Point::New();
+    newPt->x(x); newPt->y(y);newPt->z(z);
+    m_pointList.push_back( newPt );
+    unlockWriteMutex();
+    modified();
+    return true;
+}
+
+void arlCore::PointList::pop_back( void )
+{
+    if(m_pointList.size()<1) return;
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    m_pointList.pop_back();
+    unlockWriteMutex();
+    modified();
+}
+
+void arlCore::PointList::clear( void )
+{
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    m_pointList.clear();
+    unlockWriteMutex();
+    modified();
+}
+
+unsigned int arlCore::PointList::size( void ) const
+{
+    return (unsigned int)m_pointList.size();
+}
+
+unsigned int arlCore::PointList::visibleSize( void ) const
+{
+    unsigned int i, n=0;
+    for( i=0 ; i<m_pointList.size() ; ++i )
+        if(m_pointList[i])
+            if(m_pointList[i]->isVisible()) ++n;
+    return n;
+}
+
+bool arlCore::PointList::properties( arlCore::Point::sptr gravity, arlCore::Point::sptr boundingBox1, arlCore::Point::sptr boundingBox2,
+                        double &minScalar, double &maxScalar, double &std ) const
+
+{
+    if(size()<1) return false;
+    unsigned int i, j;
+    gravity->set(m_pointList[0]);
+    boundingBox1->init( getDimension() );
+    boundingBox2->init( getDimension() );
+    boundingBox1->set(m_pointList[0]);
+    boundingBox2->set(m_pointList[0]);
+    minScalar=m_pointList[0]->getScalar();
+    maxScalar=m_pointList[0]->getScalar();
+    for( i=1 ; i<size() ; ++i )
+    {
+        if(m_pointList[0]->getScalar()>maxScalar) maxScalar=m_pointList[0]->getScalar();
+        if(m_pointList[0]->getScalar()<minScalar) minScalar=m_pointList[0]->getScalar();
+        gravity->pond( m_pointList[i] );
+        for( j=0 ; j<m_dimension ; ++j )
+        {
+            if(m_pointList[i]->get(j)< (*boundingBox1)[j]) boundingBox1->set(j,m_pointList[i]->get(j));
+            if(m_pointList[i]->get(j)> (*boundingBox2)[j]) boundingBox2->set(j,m_pointList[i]->get(j));
+        }
+    }
+    vnl_vector<double> sub(size());
+    for( i=0 ; i<size() ; ++i )
+        sub(i) = m_pointList[i]->distance(gravity);
+    std = sub.rms();
+    return true;
+}
+
+#ifdef ANN
+unsigned int arlCore::PointList::generateANN( ANNpointArray& annArray ) const
+{
+    unsigned int i,j,n=0;
+    annDeallocPts( annArray );
+    annArray=annAllocPts(size(), getDimension());
+    for( i=0 ; i<size() ; ++i )
+        if(m_pointList[i]!=0)
+        {
+            ++n;
+            for( j=0 ; j<getDimension() ; ++j )
+                annArray[i][j]=m_pointList[i]->get(j);
+        }
+    return n;
+}
+#endif // ANN
+
+template <typename T>
+unsigned int internFindNearPoint( const T &from, arlCore::Point::csptr pt, std::vector< unsigned int > &pos, double &distMin, double scalar)
+{
+    pos.clear();
+    if(from.size()==0) return 0;
+    unsigned int i=0;
+    distMin = arlCore::distance( from[i] ,pt);
+    if(distMin<=scalar) pos.push_back(i);
+    for( i=1 ; i<from.size() ; ++i )
+    {
+        double d = arlCore::distance( from[i] ,pt);
+        if(d<=scalar) pos.push_back(i);
+        if(d<distMin) distMin=d;
+    }
+    return (unsigned int)pos.size();
+}
+
+unsigned int arlCore::findNearPoint( const std::vector<arlCore::Point::csptr> &from, Point::csptr pt, std::vector< unsigned int > &pos, double &distMin, double scalar)
+{
+    return internFindNearPoint(from, pt, pos, distMin, scalar);
+}
+/*
+unsigned int arlCore::findNearPoint( const std::vector<arlCore::Point::sptr> &from, Point::csptr pt, std::vector< unsigned int > &pos, double &distMin, double scalar)
+{
+    return internFindNearPoint(from, pt, pos, distMin, scalar);
+}*/
+
+unsigned int arlCore::PointList::findNearPoint(Point::csptr pt, std::vector< unsigned int > &pos, double &distMin, double scalar) const
+{
+    return internFindNearPoint(m_pointList, pt, pos, distMin, scalar);
+}
+
+bool arlCore::PointList::collapse( double g )
+{
+    Point::sptr gravity, boundingBox1, boundingBox2;
+    gravity = Point::New();
+    boundingBox1 = Point::New();
+    boundingBox2 = Point::New();
+    double minScalar, maxScalar, std;
+    unsigned int i,j;
+    properties( gravity, boundingBox1, boundingBox2, minScalar, maxScalar, std );
+    vnl_vector<double> vector(gravity->size());
+    while(!lockWriteMutex()) std::cerr<<"PointList write locked\n";
+    for( i=0 ; i<size() ; ++i )
+    {
+        vector = gravity->getCoordinates()-m_pointList[i]->getCoordinates();
+        vector.normalize();
+        for( j=0 ; j<m_pointList[i]->size() ; ++j )
+            m_pointList[i]->set(j,g*vector[j]+m_pointList[i]->get(j));
+
+    }
+    unlockWriteMutex();
+    modified();
+    return true;
+}
+
+unsigned int arlCore::PointList::tagCalibration( const std::vector<arlCore::PointList::sptr > &tagList, double delta, unsigned int nbMaxIterations, double &xLength, double &yLength )
+{   // TODO Code cleaning & code optimization
+    xLength = 0.0, yLength = 0.0;
+    assert(tagList.size()>0);
+    if(tagList.size()<1) return 0;
+    *this = *(tagList[0]);
+    if(tagList.size()==1) return 1;
+    unsigned int i, j, nbIterations=0;
+    double criterion=0;
+    arlCore::vnl_rigid_matrix T;
+    arlCore::PointList::sptr modelRegistration = arlCore::PointList::New() ;
+    std::vector< arlCore::PointList::sptr > regPL;
+    vnl_vector<double> mean1, mean2;
+    mean1.set_size(this->size());
+    mean2.set_size(tagList.size());
+    mean2.fill(0.0);
+    mean1.fill(0.0);
+    do{
+        ++nbIterations;
+        criterion=0;
+        for( i=0 ; i<tagList.size() ; ++i )
+        {
+            modelRegistration->clear();
+            T.register3D3D(tagList[i], getSptr() , false);
+            T.trf(tagList[i], modelRegistration);
+            arlCore::Point::sptr ref = arlCore::Point::New();
+            for( j=0 ; j<modelRegistration->size() ; ++j )
+            {
+                ref->x( get(j)->x() ); ref->y( get(j)->y() ); ref->y( get(j)->y() );
+                mean1[j] = (*modelRegistration)[j]->distance( ref );
+            }
+            const double M = mean1.mean();
+            criterion += abs((M - mean2[i]));
+            mean2[i] = M;
+            regPL.push_back(modelRegistration);
+        }
+        this->clear();
+        for( i=0 ; i<regPL[0]->size() ; ++i )
+        {
+            arlCore::PointList temp;
+            arlCore::Point::sptr moyenne;
+            arlCore::Point::sptr tmpPt =  arlCore::Point::New();
+            for( j=0 ; j<regPL.size() ; ++j )
+            {
+                tmpPt->x( regPL[j]->operator[](i)->x() );
+                //temp.push_back(arlCore::Point(regPL[j][i]->x(),regPL[j][i]->y(),regPL[j][i]->z()));
+            }
+            temp.statistic(moyenne);
+            this->push_back(moyenne);
+        }
+    }while(criterion>delta && nbIterations<nbMaxIterations);
+    if(this->size()>2)
+    {   // Frame choice
+        const unsigned int OrgPoint=3, XaxisPoint=2, YaxisPoint=0; // TODO Choisir d'autres reperes
+        arlCore::PointList::sptr modelAxis, unitAxis;
+        modelAxis = arlCore::PointList::New();
+        unitAxis = arlCore::PointList::New();
+        modelAxis->push_back( arlCore::Point::New( get(OrgPoint)->x(),get(OrgPoint)->y(),get(OrgPoint)->z()) );
+        modelAxis->push_back( arlCore::Point::New( get(XaxisPoint)->x(),get(XaxisPoint)->y(),get(XaxisPoint)->z()) );
+        xLength = get(OrgPoint)->distance(  get(XaxisPoint) );
+        modelAxis->push_back( arlCore::Point::New( get(YaxisPoint)->x(),get(YaxisPoint)->y(),get(YaxisPoint)->z()) );
+        yLength = get(OrgPoint)->distance( get(YaxisPoint) );
+        vnl_vector_fixed<double,3> pX, pY;
+        pX[0] = get(XaxisPoint)->x() - get(OrgPoint)->x();
+        pX[1] = get(XaxisPoint)->y() - get(OrgPoint)->y();
+        pX[2] = get(XaxisPoint)->z() - get(OrgPoint)->z();
+        pY[0] = get(YaxisPoint)->x() - get(OrgPoint)->x();
+        pY[1] = get(YaxisPoint)->y() - get(OrgPoint)->y();
+        pY[2] = get(YaxisPoint)->z() - get(OrgPoint)->z();
+        const double CosAlpha = dot_product(pX,pY)/(yLength*yLength);
+        const double SinAlpha = sqrt(1-(CosAlpha*CosAlpha));
+        unitAxis->push_back( arlCore::Point::New(0.0, 0.0, 0.0));
+        unitAxis->push_back(arlCore::Point::New(xLength, 0.0, 0.0));
+        unitAxis->push_back(arlCore::Point::New(yLength*CosAlpha, yLength*SinAlpha, 0.0));
+        T.register3D3D(modelAxis, unitAxis, true);
+        T.trf( getSptr() );
+    }
+    return nbIterations;
+}
+
+double smallerRatio( double gaussianError, const vnl_vector<double> &V )
+{   // Elements de V croissant. Ratio = Grand/Petit
+    assert(V.size()>1);
+    double ratio, min=DBL_MAX;
+    unsigned int i;//,j;
+    for( i=0 ; i<V.size()-1 ; ++i )
+    {
+        ratio = (V[i+1]-gaussianError)/(V[i]+gaussianError);
+        if(ratio<min) min=ratio;
+    }
+/*  {
+        std::cout<<V<<" ";
+        for( j=i+1 ; j<V.size() ; ++j )
+        {
+            std::cout<<V[j]/V[i]<<" ";
+            if(V[j]/V[i]<min) min=(V[j]-gaussianError)/(V[i]+gaussianError);
+        }
+        std::cout<<"\n";
+    }*/
+    return min;
+}
+
+bool shapesProperties( double gaussianError, const std::vector<vnl_vector<double> > &shapes, vnl_vector<double> &ratiosMin, vnl_vector<double> &perimeters )
+{
+    const bool Verbose = false;
+    if(shapes.size()<1) return false;
+    unsigned int i;
+//  std::vector< vnl_vector<unsigned int> >index;
+    if(Verbose) std::cerr<<"Nb de "<<shapes[0].size()<<"-formes : "<<(unsigned int)shapes.size()<<"\n";
+    ratiosMin.set_size((unsigned int)shapes.size());
+    perimeters.set_size((unsigned int)shapes.size());
+    for( i=0 ; i<(unsigned int)shapes.size() ; ++i )
+    {
+        ratiosMin[i] = smallerRatio(gaussianError, shapes[i]);
+        perimeters[i] = shapes[i].sum();
+//      std::cout<<"Shape "<<i<<" : Perimeter="<<perimeters[i]<<" - ratioMin="<<ratiosMin[i]<<"\n";
+    }
+    if(Verbose) std::cerr<<"Smaller Ratio : Min="<<ratiosMin.min_value()<<" Max="<<ratiosMin.max_value()<<" Mean="<<ratiosMin.mean()<<"\n";
+    if(Verbose) std::cerr<<"Perimeters : Min="<<perimeters.min_value()<<" Max="<<perimeters.max_value()<<" Mean="<<perimeters.mean()<<"\n";
+    return true;
+}
+
+double shapesMatching( double gaussianError, const std::vector<vnl_vector<double> >& V1, const std::vector<vnl_vector<double> >& V2, std::vector<std::pair<double, vnl_vector_fixed<unsigned int,2> > > &matching)
+{
+    if(V1.size()<=0 || V2.size()<=0) return 0.0;
+    unsigned int ShapeDim = V2[0].size();
+    vnl_vector<double> ratiosMin;
+    vnl_vector<double> perimeters;
+    shapesProperties(gaussianError,V2,ratiosMin,perimeters);
+    // Seuil mini du coefficient de discrimination des sommets
+    // Les 2 cts les plus similaires sont au moins x fois plus grand l'un que l'autre
+    const double DiscrSommetMin = ratiosMin.mean();
+//  if(DiscrSommetMin<DiscrSommetTol) DiscrSommetMin=DiscrSommetTol;
+    const unsigned int size = V1[0].size();
+    unsigned int i,j;
+    double realMax=-1;
+    for( i=0 ; i<V1.size() ; ++i )
+        for( j=0 ; j<V2.size() ; ++j )
+        {
+            assert(V1[i].size()==size && V2[j].size()==size);
+            //if(smallerRatio(V1[i])>=DiscrSommetMin && smallerRatio(V2[j])>=DiscrSommetMin)
+            if(ratiosMin[j]>=DiscrSommetMin)
+            {
+                vnl_vector_fixed<unsigned int,2> index(i,j);
+                double similarite = (V1[i]-V2[j]).rms();
+            //  if(similarite<3) std::cout<<similarite<<"\n";
+                if(similarite>realMax) realMax=similarite;
+                if(similarite<=gaussianError*2*ShapeDim) matching.push_back(std::make_pair(similarite,index));
+            }
+        }
+//  std::cout<<"Shape matching Real Max : "<<realMax<<" shapematching size="<<matching.size()<<"\n";
+    return realMax;
+}
+
+unsigned int generateTrianglesList( /*unsigned int shapeSize, */double decimage, arlCore::PointList::csptr points, std::vector<vnl_vector<double> > &shapes,  std::vector< vnl_vector<unsigned int> > &index )
+{
+    const bool Verbose = false;
+    const unsigned int ShapeSize = 3;
+    unsigned int step = (unsigned int)(1.0/decimage);
+    if(step<1) step=1;
+    const bool ImpossiblePath = true;
+    unsigned int i,j,k/*,l*/;
+    vnl_vector<unsigned int> ix(ShapeSize);
+    vnl_vector<double> sh(ShapeSize);
+//  std::vector<std::pair<double,unsigned int> > V0(ShapeSize);
+    for( i=0 ; i<points->size() ; i+=step )
+        for( j=i+1 ; j<points->size() ; j+=step )
+            for( k=j+1 ; k< points->size() ; k+=step )
+            {   // Ordonnancement des distances
+                const double d0 = arlCore::distance((*points)[i],(*points)[j] );
+                const double d1 = arlCore::distance((*points)[j],(*points)[k] );
+                const double d2 = arlCore::distance((*points)[k],(*points)[i] );
+/*              V0[0]=std::make_pair(d0,i);
+                V0[1]=std::make_pair(d1,j);
+                V0[2]=std::make_pair(d2,k);
+                std::sort( V0.begin(), V0.end() );
+                for( l=0 ; l<ShapeSize ; ++l )
+                {
+                    sh[l]=V0[l].first;
+                    ix(l)=V0[l].second;
+                }*/
+                if( d0<=d1 && d1<=d2 ) {sh[0]=d0,sh[1]=d1,sh[2]=d2,ix[0]=i,ix[1]=j,ix[2]=k;}
+                else if( d0<=d2 && d2<=d1 ) {sh[0]=d0,sh[1]=d2,sh[2]=d1,ix[0]=j,ix[1]=i,ix[2]=k;}
+                    else if( d1<=d0 && d0<=d2 ) {sh[0]=d1,sh[1]=d0,sh[2]=d2,ix[0]=k,ix[1]=j,ix[2]=i;}
+                        else if( d1<=d2 && d2<=d0 ) {sh[0]=d1,sh[1]=d2,sh[2]=d0,ix[0]=j,ix[1]=k,ix[2]=i;}
+                            else if( d2<=d0 && d0<=d1 ) {sh[0]=d2,sh[1]=d0,sh[2]=d1,ix[0]=k,ix[1]=i,ix[2]=j;}
+                                else if( d2<=d1 && d1<=d0 ) {sh[0]=d2,sh[1]=d1,sh[2]=d0,ix[0]=i,ix[1]=k,ix[2]=j;}
+                                    else assert(ImpossiblePath);
+                shapes.push_back(sh);
+                index.push_back(ix);
+            }
+    if(Verbose)
+    {   // Affichage de la liste de points, de segments et d'index
+        for( i=0 ; i<points->size() ; ++i )
+            std::cout<<i<<" : "<< (*points)[i]->getString()<<"\n";
+        for( i=0 ; i<shapes.size() ; ++i )
+            std::cout<<i<<" : "<<shapes[i]<<" Index : "<<index[i]<<"\n";
+    }
+    return (unsigned int)shapes.size();
+}
+
+unsigned int arlCore::matching3D3D( PointList::csptr a, PointList::csptr b, double gaussianError, double decimage,
+                                    PointList::sptr  Va, PointList::sptr  Vb )
+{   // b = T*a ; A=echantillon mesure ; B=modele reel
+    const bool Verbose = false;
+    const unsigned int ShapeDim = 3; // Triangle = 3 cotes
+    const double ProbaMin=10e-1;//10e-6;
+    const double NumericNoise=1e-13;
+    const double SimilariteMax=gaussianError*ShapeDim+NumericNoise; // mm
+
+    Va->clear(); Vb->clear();
+    assert(a->getDimension()==b->getDimension());
+    assert(a->size()>2 && b->size()>2);
+    unsigned int i,j;
+    std::vector<vnl_vector<double> > V1, V2;
+    std::vector< vnl_vector<unsigned int> >index1, index2;
+    generateTrianglesList( /*ShapeDim, */decimage, a, V1, index1 );
+    generateTrianglesList( /*ShapeDim, */decimage, b, V2, index2 );
+
+    std::vector<std::pair<double, vnl_vector_fixed<unsigned int,2> > > matching;
+    double simMax = shapesMatching( gaussianError, V1, V2, matching);
+    if(simMax<0) return 0;
+    // Tableau des probabilits d'appariement
+    vnl_matrix<double> matchingProb(a->size(),b->size());
+    matchingProb.fill(1.0);
+    double prob;
+    for( i=0 ; i<matching.size() ; ++i )
+        if(matching[i].first<SimilariteMax)
+        {
+            if(simMax==0) prob = 1.0; else prob = matching[i].first/simMax;
+            const unsigned int shape1Index = matching[i].second(0);
+            const unsigned int shape2Index = matching[i].second(1);
+            for( j=0 ; j<ShapeDim ; ++j )
+                matchingProb(index1[shape1Index](j),index2[shape2Index](j)) *= prob;
+        }
+    if(Verbose) std::cout<<matchingProb<<"\n";
+    for( i=0 ; i<a->size() ; ++i )
+    {
+        unsigned int indexMinR=0, indexMinC;
+        double pMin = 1.0;
+        vnl_vector<double> row=matchingProb.get_row(i);
+        for( j=0 ; j<row.size() ; ++j )
+            if(row(j)<pMin){pMin=row(j);indexMinR=j;}
+        if(pMin<ProbaMin)
+        {
+            vnl_vector<double> column=matchingProb.get_column(indexMinR);
+            pMin=1.0;indexMinC=0;
+            for( j=0 ; j<column.size() ; ++j )
+                if(column(j)<pMin){pMin=column(j);indexMinC=j;}
+            if(indexMinC==i) // Est-ce bijectif ?
+            {
+                Va->push_back( (*a)[i]);
+                Vb->push_back( (*b)[indexMinR]);
+            }
+        }
+    }
+    assert(Va->size()==Vb->size());
+    if(Verbose) std::cout<<"Matching 3D3D Nb matching : "<<(unsigned int)Va->size()<<"\n";
+    return (unsigned int)Va->size();
+}
+
+bool arlCore::distance( PointList::csptr p1, PointList::csptr p2, std::vector<double> &distances )
+{
+    if(p1->getDimension()!=p2->getDimension()) return false;
+    unsigned int i, size=p1->size();
+    if(p2->size()<size) size=p2->size();
+    for( i=0 ; i<size ; ++i )
+        if( (*p1)[i] && (*p2)[i] )
+            distances.push_back( (*p1)[i]->distance( (*p2)[i]));
+        else distances.push_back(-1);
+    return true;
+}
+
+bool arlCore::save( const  std::vector< Point::sptr  >&pl, const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type, bool justVisible, bool overwrite )
+{
+    return internSave( pl, fileName, std::string(""), type, justVisible, overwrite );
+}
+
+bool arlCore::save( const  std::vector< Point::csptr  >&pl, const std::string &fileName, ARLCORE_POINT_SAVE_TYPE type, bool justVisible, bool overwrite )
+{
+    return internSave( pl, fileName, std::string(""), type, justVisible, overwrite );
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Reconst3D.cpp b/SrcLib/ARLcore/src/arlcore/Reconst3D.cpp
new file mode 100644
index 0000000..54fb715
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Reconst3D.cpp
@@ -0,0 +1,1194 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Reconst3D.h>
+
+#include <vcl_vector.h>
+#include <vnl/vnl_real_npolynomial.h>
+#include <vnl/vnl_cross.h>
+#include <vnl/algo/vnl_rnpoly_solve.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+#include <vnl/algo/vnl_powell.h>
+#include <vnl/algo/vnl_levenberg_marquardt.h>
+#include <vnl/algo/vnl_conjugate_gradient.h>
+
+#include <arlcore/Optimization.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/Misc.h>
+#include <arlcore/vnl_rigid_vector.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/UncertaintyPropag.h>
+
+using namespace std;
+
+bool reconstruction3D( const vector<arlCore::Point::csptr> &points2D, const vector<const arlCore::Camera*> &cameras, arlCore::Point::sptr point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, vector<double> &log, const bool pixelFrame );
+
+/**
+ * @brief 3D reconstruction of a point that is seen by several cameras
+ */
+bool arlCore::reconst3D(const std::vector<arlCore::Point::csptr>&list2D, const std::vector<arlCore::Camera> &cameras, arlCore::Point::sptr point3D,
+            arlCore::ARLCORE_RECONSTRUCTION3D methode, unsigned int &plane, std::vector<double> &log, double errorMax, bool propagateCov, const bool pixelFrame)
+{
+    std::vector<const arlCore::Camera*> cams;
+    unsigned int i;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return reconst3D( list2D, cams, point3D, methode, plane, log, errorMax, propagateCov, pixelFrame);
+}
+
+bool arlCore::reconst3D( const std::vector<arlCore::Point::csptr>&list2D, const std::vector<const arlCore::Camera*> &camsList, arlCore::Point::sptr point3D,
+            arlCore::ARLCORE_RECONSTRUCTION3D methode, unsigned int &plane, std::vector<double> &log, double errorMax, bool propagateCov, const bool pixelFrame)
+{
+    assert(point3D->size()==3);
+    assert(camsList.size()>1);
+    plane = camsList[0]->getPlane();
+    arlCore::Point::sptr p3D = arlCore::Point::New(3);
+    //FIXME : Adapt code with mobile cameras : Set calibration parameters in the same plane
+    if(reconstruction3D(list2D, camsList, p3D, methode, log, pixelFrame))
+        if(errorMax<0 || errorMax>=log[0])
+        {
+            point3D->set(p3D);
+            point3D->setVisible(true);
+            point3D->setColour(1,2,3);
+            point3D->setError(p3D->getError());
+            if(propagateCov) propagateCovarianceToReconst3D(list2D, camsList, point3D, methode, log, pixelFrame);
+            else
+            {
+                arlCore::vnl_covariance_matrix &cov = point3D->getCovMatrix();
+                cov = p3D->getCovMatrix();
+            }
+    /*      unsigned int i;
+            std::cout<<"RECONST3D ERROR ("<<methode<<") : ";
+            for( i=0 ; i<log.size() ; ++i )
+                std::cout<<log[i];
+            std::cout<<"\n";*/
+            return true;
+        }
+    point3D->setError(-1.0);
+    return false;
+}
+
+/**
+ *  @brief : Triangulation of a 3D point from 2D points detected in 2 video images (and only 2)
+ * which coordinates are written in the optical frames of the cameras. These coordinates
+ * are obtained with the function arlCore::pixelPlaneToUnitFocalPlane
+ *
+ * param[in] : focalPts2D1 = 3D coordinates in the optical unit frame associated to camera 1
+ * of the 2D point detected in cam 1
+ * param[in] : focalPts2D1 = 3D coordinates in the optical unit frame associated to camera 2
+ * of the 2D point detected in cam 2
+ * param[in] : PassageMatrix 4x4 matrix between cam 1 and cam 2
+ * param[in] : methode = trinagulation method choice (Horaud or Lines)
+ *
+ */
+bool simpleRecons3D( arlCore::Point::sptr point3D, const vnl_vector_fixed<double,3>& focalPt2D1, const vnl_vector_fixed<double,3>& focalPt2D2,
+                    vnl_matrix_fixed<double,4,4>& PassageMatrix, arlCore::ARLCORE_RECONSTRUCTION3D methode, double &error )
+{
+    switch(methode)
+    {
+        case arlCore::ARLCORE_R3D_HORAUD_APPROX :
+        case arlCore::ARLCORE_R3D_HORAUD_PERFECT :
+        {// METHODE ANALYTIQUE DE HORAUD (la plus simple et la plus rapide)
+            const double &x  = focalPt2D1(0);
+            const double &y  = focalPt2D1(1);
+            const double &x_ = focalPt2D2(0);
+            const double &bx = PassageMatrix(0,3);
+            const double &bz = PassageMatrix(2,3);
+            long double alpha = x*PassageMatrix(0,0) + y*PassageMatrix(0,1) + PassageMatrix(0,2);
+            long double beta  = x*PassageMatrix(2,0) + y*PassageMatrix(2,1) + PassageMatrix(2,2);
+            assert(beta*x_-alpha!=0);
+            if(beta*x_-alpha==0) return false;
+            long double z = (bx - bz*x_) /(beta*x_ -alpha);
+            //FIXME : Instabilit� num�rique quand (beta*x_-alpha) tend vers 0
+            //Probl�me constat� � partir de 0.1
+            error=fabs(beta*x_-alpha)/z; // FIXME error grand quand le denominateur tend vers 0
+            point3D->x(x*z);
+            point3D->y(y*z);
+            point3D->z(z);
+            point3D->setError(error);
+            return true;
+        }
+        case arlCore::ARLCORE_R3D_TWO_LINES_PERFECT :
+        case arlCore::ARLCORE_R3D_TWO_LINES_APPROX :
+        {// METHODE ANALYTIQUE DU MILIEU DES DEUX DROITES (tres rapide)
+            vnl_vector_fixed<double,3> I, J, v, n1, n2, m1C1, m2C2, C1C2;
+            vnl_vector_fixed<double,4> var, C2, m2;
+            vnl_matrix_fixed<double,4,4> P;
+            double num, denom, landa1, landa2;
+            unsigned int i;
+            P =  vnl_matrix_inverse<double>(PassageMatrix.as_matrix() );
+            var.put(0, 0.0); var.put(1, 0.0); var.put(2, 0.0); var.put(3, 1.0);
+            C2 = P.as_matrix() * var.as_vector();
+            // C2 est exprimee dans le repere liée à la caméra 1
+            var.put(0, focalPt2D2(0));
+            var.put(1, focalPt2D2(1));
+            var.put(2, focalPt2D2(2));
+            var.put(3, 1.0);
+            m2 = P.as_matrix() *var.as_vector();
+            // m2 est exprimée dans le repère liee à la caméra 1
+            m1C1 = (-1.0)*focalPt2D1;
+            var  = C2 - m2;
+            m2C2.put(0, var(0)); m2C2.put(1, var(1)); m2C2.put(2, var(2));
+            C1C2.put(0, C2(0)); C1C2.put(1, C2(1)); C1C2.put(2, C2(2));
+            // Determination du premier point I sur la droite de reprojection
+            v = vnl_cross_3d(m1C1.as_vector() , m2C2.as_vector() );
+            n1= vnl_cross_3d(v.as_vector(), m1C1.as_vector() );
+            double dot1=0, dot2=0;
+            for(i=0;i<3;++i)
+            {
+                dot1 +=  C1C2(i) * n1(i);
+                dot2 +=  m2C2(i) * n1(i);
+            }
+            num   = -1*dot1;
+            denom = -1*dot2;
+            assert(denom!=0);
+            if(denom==0) return false;
+            landa1 = num/denom;
+            I.put(0, C2(0) - landa1* m2C2(0) );
+            I.put(1, C2(1) - landa1* m2C2(1) );
+            I.put(2, C2(2) - landa1* m2C2(2) );
+            // Determination du deuxieme point J sur la droite de reprojection
+            n2 = vnl_cross_3d(v, m2C2);
+            dot1 = dot2 =0;
+            for(i=0;i<3;++i)
+            {
+                dot1 +=  C1C2(i) * n2(i);
+                dot2 +=  m1C1(i) * n2(i);
+            }
+            num   = dot1;
+            denom = -1*dot2;
+            assert(denom!=0);
+            landa2 = num/denom;
+            J.put(0, -1* landa2* m1C1(0) );
+            J.put(1, -1* landa2* m1C1(1) );
+            J.put(2, -1* landa2* m1C1(2) );
+            // On prend le barycentre de I et J comme estimation de la reconstruction
+            point3D->x(0.5*I(0) + 0.5*J(0));
+            point3D->y(0.5*I(1) + 0.5*J(1));
+            point3D->z(0.5*I(2) + 0.5*J(2));
+            // Calcul des distances entre les droites par deux méthodes différentes
+            // Cette valeur permet de savoir si les deux droites correspondent bien a un point a reconstruire
+//          v.normalize();
+//          error = 0;
+//          for( i=0 ; i<3 ; ++i )
+//              error +=  v(i) * C1C2(i);
+            error = sqrt (fabs (vnl_vector_ssd(I,J) ));
+            point3D->setError(error);
+            return true;
+        }
+    default: break;
+    }
+    return false;
+}
+
+bool reconsReproj(const vector<arlCore::Point::csptr> &points2D, const vector<const arlCore::Camera*> &cameras, arlCore::Point::sptr point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, vector<double> &log);
+bool reconstruction3D( const vector<arlCore::Point::csptr> &points2D, const vector<const arlCore::Camera*> &cameras,
+        arlCore::Point::sptr point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, vector<double> &log, const bool pixelFrame )
+{
+    log.clear();
+    if( points2D.size() != cameras.size() ) return false;
+    if( cameras.size() < 2 ) return false;
+//  for(i=0; i< points2D.size(); ++i)
+//    if(points2D[i]->size() != 2)
+//      cerr <<"Pb : tous les points video n'ont pas la bonne dimension i.e. 2" << endl;
+//  if(point3D->size() != 3)
+//    cerr <<"Pb : le point resultat reconstruit n'a pas la bonne dimension i.e. 3" << endl;
+    std::vector< vnl_vector_fixed<double,3> >focalPts2D;
+    unsigned int i;
+    double error;
+    switch(methode)
+    {
+    case arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION :
+    case arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY :
+        assert(pixelFrame); // FIXME
+        return reconsReproj(points2D, cameras, point3D, methode, log);
+    case arlCore::ARLCORE_R3D_HORAUD_APPROX :
+    case arlCore::ARLCORE_R3D_TWO_LINES_APPROX :
+    case arlCore::ARLCORE_R3D_HORAUD_PERFECT :
+    case arlCore::ARLCORE_R3D_TWO_LINES_PERFECT :
+    {
+        bool perfect = (methode==arlCore::ARLCORE_R3D_HORAUD_PERFECT || methode==arlCore::ARLCORE_R3D_TWO_LINES_PERFECT);
+        focalPts2D.resize(2);
+        for( i=0 ; i<focalPts2D.size() ; ++i )
+            if(pixelFrame)
+            {
+                assert(points2D[i]->size()==2);
+                cameras[i]->pixelPlaneToUnitFocalPlane(  points2D[i] , focalPts2D[i], perfect );
+            }
+            else
+            {
+                focalPts2D[i].put(0,points2D[i]->x());
+                focalPts2D[i].put(1,points2D[i]->y());
+                focalPts2D[i].put(2,1.0);
+            }
+        vnl_matrix_fixed<double,4,4> PM1_2 = cameras[1]->getExtrinsic() * cameras[0]->getInvExtrinsic();
+        simpleRecons3D ( point3D, focalPts2D[0], focalPts2D[1], PM1_2, methode, error);
+        cameras[0]->getInvExtrinsic().trf(point3D);
+        log.push_back(error); // 1/denom pour Horaud ou la distance entre les 2 droites
+        return true;
+    }
+    case arlCore::ARLCORE_R3D_MULTI_LINES_APPROX :
+    case arlCore::ARLCORE_R3D_MULTI_LINES_PERFECT :
+    {
+        std::vector< vgl_line_3d_2_points <double> >lines;
+        vgl_line_3d_2_points <double>line;
+        focalPts2D.resize(points2D.size());
+        for( i=0 ; i<focalPts2D.size() ; ++i )
+        {
+            if(pixelFrame)
+            {
+                assert(points2D[i]->size()==2);
+                cameras[i]->pixelPlaneToUnitFocalPlane( points2D[i] , focalPts2D[i], methode==arlCore::ARLCORE_R3D_MULTI_LINES_PERFECT );
+            }
+            else
+            {
+                focalPts2D[i].put(0,points2D[i]->x());
+                focalPts2D[i].put(1,points2D[i]->y());
+                focalPts2D[i].put(2,1.0);
+            }
+            if(cameras[i]->projectiveLine(focalPts2D[i], line))
+                lines.push_back(line);
+        } // Initialisation
+        vnl_matrix_fixed<double,4,4> PM1_2 = cameras[1]->getExtrinsic() * cameras[0]->getInvExtrinsic();
+        if(!simpleRecons3D ( point3D, focalPts2D[0], focalPts2D[1], PM1_2, arlCore::ARLCORE_R3D_TWO_LINES_APPROX, error)) return false;;
+        cameras[0]->getInvExtrinsic().trf(point3D);
+        vnl_vector<double> point3DSolution = point3D->getCoordinates();
+        arlCore::OptimiseLineIntersection reconstruction(lines);
+        vnl_powell compute_reconstruction(&reconstruction);
+        compute_reconstruction.minimize(point3DSolution);
+        for( i=0; i< 3 ; ++i )
+            point3D->set(i,point3DSolution(i));
+        log.push_back(compute_reconstruction.get_end_error() / points2D.size()); // Distance moyenne aux droites
+        point3D->setError(log.back());
+        log.push_back(compute_reconstruction.get_start_error() / points2D.size());
+    return true;
+    }
+    default: break;
+    }
+    return false;
+}
+
+/**
+ * @brief
+ * Rigid registration of a 3D point set so that its reprojection on one image fits a 2D point set
+ *
+ * This function compute the rigid transformation that registers a 3D rigid object (defined
+ * in its own frame)  in the world frame of one calibrated camera (we call here
+ * world frame the frame in which the camera were calibrated). In fact, this function corresponds
+ * to arlCore::projectivePointsRegistration_3D_2D used with only one camera, but we add
+ * an initialization procedure before launching it (arlCore::planarHomographyRegistration_3D_2D).
+ * TODO This function works if the 3D model is planar (because of the initialization) !
+ * TODO We have to retrieve this constraint
+ */
+bool arlCore::monoViewPointRegistration3D2D( const arlCore::Camera &cam , const std::vector<arlCore::Point::csptr > &points2D,
+        PointList::csptr model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION method,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose )
+{
+    return monoViewPointRegistration3D2D( cam, points2D, model3D->getList(), T, method, optimiserParameters , log, verbose );
+}
+
+bool arlCore::monoViewPointRegistration3D2D( const arlCore::Camera &cam , const std::vector<arlCore::Point::csptr > &points2D,
+        const std::vector< arlCore::Point::sptr > &model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION method,
+        const std::vector<double> &optimiserParameters , std::vector<double> &log, bool verbose )
+{
+    const bool Refinement = method!=arlCore::ARLCORE_PR_UNKNOWN;
+    assert(model3D.size()>=points2D.size());
+//  plane=cam.getPlane(); // FIXME Parametre redondant ?
+    unsigned int i;
+    std::vector<arlCore::Point::csptr> p2D;
+    std::vector<arlCore::Point::csptr> p3D;
+    for( i=0 ; i<points2D.size() ; ++i )
+        if(points2D[i])
+            if(points2D[i]->isVisible())
+            {
+                p2D.push_back(points2D[i]);
+                p3D.push_back(model3D[i]);
+            }
+//  std::vector<double> optimiserParameters, log;
+    // TODO : Injecter une tolerance dans multiViewPointRegistration3D2D et sortir si elle n'est pas respectée : tol
+//  tol=0; // FIXME
+    // FIXME Tester la planeite du modele. Si inf a une certaine tolerance return false;
+    if(arlCore::planarHomographyRegistration_3D_2D(cam, p2D, p3D, T, optimiserParameters, log, verbose))
+    {
+        if(Refinement)
+        {
+            vector<const arlCore::Camera*>cams;
+            cams.push_back(&cam);
+            std::vector< std::vector<arlCore::Point::csptr> > p_2D;
+            p_2D.push_back(p2D);
+            arlCore::multiViewPointRegistration3D2D(cams, p_2D, p3D, T, method, optimiserParameters, log, verbose);
+        }
+        return true;
+    }
+    return false;
+}
+
+/**
+ * @brief
+ * Rigid registration of a 3D point set so that its reprojection on several images fits 2D point sets
+ *
+ * This function compute the rigid transformation that registers a 3D rigid object (defined
+ * in its own frame)  in the world frame of several jointly calibrated camera (we call here
+ * world frame the frame in which the camera were calibrated). Practically, this frame
+ * corresponds to the position of a chessboard that has been used during the simultaneous
+ * calibration of cameras.
+ *
+ * param[in] : cameras = camera vector used for the registration (it works also with one camera only)
+ * param[in] : points2D = vector of vector of 2D points [j] detected in the camera [i]
+ * param[in] : T = initialisation of the iterative registration
+ * param[in] : methode = choice of the optimization criterion and method (more informations on each
+ * criterion can be found in Optimization.h and in the following paper : S.Nicolau et.al. An Accuracy
+ * Certified Augmented Reality System for Therapy Guidance. In Proc. of the 8th European Conference
+ * on Computer Vision (ECCV 04), Part III, volume LNCS 3023, Prague, pages 79-91, May 2004)
+ * param[in] : optimiserParameters = parameters for optimization function used (TODO still not used)
+ *
+ * param[out] : log
+ *      EPPC:
+ *           log[0] = criterion value at the end of optimization divided by the point number
+ *           log[1] = criterion value at the beginning of optimization divided by the point number
+ *           log[2] = part of the criterion value that corresponds to the 2D contribution (TODO not divided by the point number)
+ *           log[3] = part of the criterion value that corresponds to the 3D contribution (TODO not divided by the point number)
+ *           log[4] = stop criterion of the EPPC, corresponds to the distance between the 2 last transformations
+ *      ISPPC & OSPPC:
+ *           log[0] = criterion value at the end of optimization divided by the point number
+ *           log[1] = criterion value at the beginning of optimization divided by the point number
+ *
+ * ISPPC corrsponds to the minimization of the reprojection criterion in the camera : sum i ||P(T*Mi) - mi ||^2
+ * This function can be launched for on eor several cameras. Obviously, an initialization is better than nothing
+ * but it generally works correctly without one (then it is identity).
+ * ISPPC and OSPPC assumes an isotropic noise for 2D detection in all images
+ * ISPPC_ANISOTROP and EPPC use the point covariance matrix in the criterion formula
+ *
+ * The detailed formula of each criterion is given in Optimization.h
+ *
+ */
+bool  arlCore::multiViewPointRegistration3D2D( const vector<arlCore::Camera> &cameras, const vector< vector< arlCore::Point::csptr > > &points2D, PointList::csptr model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION methode, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    unsigned int i;
+    std::vector<const arlCore::Camera*> cams;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return multiViewPointRegistration3D2D( cams, points2D, model3D, T, methode, optimiserParameters, log, verbose);
+}
+
+bool  arlCore::multiViewPointRegistration3D2D( const vector<const arlCore::Camera*> &cameras, const vector< vector< arlCore::Point::csptr > > &points2D, PointList::csptr model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION methode, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    return multiViewPointRegistration3D2D( cameras, points2D, model3D->getListCopy(), T, methode, optimiserParameters, log, verbose); //VAG PERFORMANCE !!!
+}
+
+bool  arlCore::multiViewPointRegistration3D2D( const vector<arlCore::Camera> &cameras, const vector< vector< arlCore::Point::csptr > > &points2D, const std::vector< arlCore::Point::csptr > &model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION methode, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    unsigned int i;
+    std::vector<const arlCore::Camera*> cams;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return multiViewPointRegistration3D2D( cams, points2D, model3D, T, methode, optimiserParameters, log, verbose);
+}
+
+bool  arlCore::multiViewPointRegistration3D2D( const vector<const arlCore::Camera*> &cameras, const vector< vector< arlCore::Point::csptr > > &points2D, const std::vector< arlCore::Point::csptr > &model3D, arlCore::vnl_rigid_matrix &T, arlCore::ARLCORE_PROJECTIVE_REGISTRATION methode, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    //if(cameras.size()<2) return false;
+    const unsigned int Nb2DPointsMin = 3;
+    const double EPPCfTolerance = 1e-6;
+    const double EPPCxTolerance = 1e-6;
+    const unsigned int Model3DSize = (unsigned int)model3D.size();
+    bool b = false;
+    log.clear();
+    unsigned int i,j;
+    double RMS = -1.0;
+    vnl_vector< double > init(6);
+    double nbVisiblePoints = 0.0;
+    for( i=0 ; i<cameras.size() ; ++i )
+    {
+        assert(cameras[i]);
+        if(!cameras[i]->isIntrinsicCalibrated()) return b;
+//      assert(Model3DSize==points2D[i].size());
+        if(Model3DSize!=points2D[i].size()) return b;
+        for( j=0 ; j<points2D[i].size() ; ++j )
+            if( points2D[i][j]!=0 )
+                if(points2D[i][j]->isVisible())
+                    ++nbVisiblePoints;
+    }
+    if(nbVisiblePoints<Nb2DPointsMin) return b;
+    if(methode==arlCore::ARLCORE_PR_EPPC)
+    {
+        const double RMSTrsf = 1e-4;
+        const unsigned int nbIterationsMax = 10;
+        vnl_vector< double > init_pts3D(3*Model3DSize), init_pts3D_precedent(3*Model3DSize), init_precedent(6);
+        init = arlCore::vnl_rigid_vector (T);
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i ) // TODO : Factoriser dans toute la fonction (attention OSPPC)
+        {
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+            for( j=0 ; j<3 ; ++j )
+                init_pts3D[3*i+j] = (*model3D[i])[j];
+        }
+        arlCore::ISPPC_cost_function ISPPC(cameras,estime3D,points2D, true);
+        vnl_powell computeISPPC(&ISPPC);
+        computeISPPC.minimize(init);
+        arlCore::EPPC_cost_function EPPC(cameras,model3D,points2D,T);
+        vnl_powell computeEPPC(&EPPC);
+        computeEPPC.set_f_tolerance(EPPCfTolerance);
+        computeEPPC.set_x_tolerance(EPPCxTolerance);
+        computeISPPC.set_f_tolerance(EPPCfTolerance);
+        computeISPPC.set_x_tolerance(EPPCxTolerance);
+        unsigned int nbIterations=0;
+        log.resize(5);
+        do
+        {
+            T=arlCore::vnl_rigid_matrix (arlCore::vnl_rigid_vector(init));
+//          std::cerr<<"ITERATION POW EPPC : "<<nbIterations<<std::endl;
+//          std::cerr<<"transfo ="<<std::endl<<T<<std::endl;
+//          std::cerr<<"erreur debut = "<<computeISPPC.get_start_error()<<std::endl;
+//          std::cerr<<"erreur fin = "<<computeISPPC.get_end_error()<<std::endl;
+            //Estimation des points 3D parfaits avec T(k+1)
+            computeEPPC.minimize(init_pts3D);
+            if(nbIterations==0) log[1]=sqrt(computeEPPC.get_start_error()/nbVisiblePoints);
+            init_precedent = init;
+            for(i=0; i<Model3DSize; ++i)
+                for( j=0 ; j<3 ; ++j )
+                    estime3D[i].put(j, init_pts3D[3*i+j]);
+            computeISPPC.minimize(init);
+            ++nbIterations;
+        }while( (init-init_precedent).rms()>RMSTrsf && nbIterations<nbIterationsMax );
+        RMS = sqrt(computeEPPC.get_end_error()/nbVisiblePoints);
+        log[0] = RMS;
+        // FIXME Ponderer les erreurs suivantes
+        log[2] = EPPC.get2Derror();
+        log[3] = EPPC.get3Derror();
+        log[4] = RMSTrsf;
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_EPPC_LM)
+    {
+        const double RMSTrsf = 1e-4;
+        const unsigned int nbIterationsMax = 10;
+        vnl_vector< double > init_pts3D(3*Model3DSize), init_pts3D_precedent(3*Model3DSize), init_precedent(6);
+        init = arlCore::vnl_rigid_vector (T);
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+        {
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+            for( j=0 ; j<3 ; ++j )
+                init_pts3D[3*i+j] = (*model3D[i])[j];
+        }
+        arlCore::ISPPC_LS_cost_function ISPPC(cameras,estime3D,points2D, 6, nbVisiblePoints, vnl_least_squares_function::use_gradient, true);
+        vnl_levenberg_marquardt computeISPPC(ISPPC);
+        computeISPPC.minimize_using_gradient(init);
+        arlCore::EPPC_LS_cost_function EPPC(cameras,model3D,points2D,T, 3*Model3DSize, nbVisiblePoints+Model3DSize, vnl_least_squares_function::use_gradient);
+        vnl_levenberg_marquardt computeEPPC(EPPC);
+        computeEPPC.set_f_tolerance(EPPCfTolerance);
+        computeEPPC.set_x_tolerance(EPPCxTolerance);
+        unsigned int nbIterations=0;
+        log.resize(5);
+        do
+        {
+            //std::cerr<<"ITERATION LM EPPC : "<<nbIterations<<std::endl;
+            T=arlCore::vnl_rigid_matrix (arlCore::vnl_rigid_vector(init));
+            //Estimation des points 3D parfaits avec T(k+1)
+            computeEPPC.minimize_using_gradient(init_pts3D);
+            if(nbIterations==0) log[1]=sqrt(computeEPPC.get_start_error()/nbVisiblePoints);
+            init_precedent = init;
+            for(i=0; i<Model3DSize; ++i)
+                for( j=0 ; j<3 ; ++j )
+                    estime3D[i].put(j, init_pts3D[3*i+j]);
+            computeISPPC.minimize_using_gradient(init);
+            ++nbIterations;
+        }while( (init-init_precedent).rms()>RMSTrsf && nbIterations<nbIterationsMax );
+        RMS = computeEPPC.get_end_error();
+        log[0] = RMS;
+        // FIXME Ponderer les erreurs suivantes
+        log[2] = EPPC.get2Derror();
+        log[3] = EPPC.get3Derror();
+        log[4] = RMSTrsf;
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_EPPC_CG)
+    {
+        const double RMSTrsf = 1e-4;
+        const unsigned int nbIterationsMax = 5;
+        vnl_vector< double > init_pts3D(3*Model3DSize), init_pts3D_precedent(3*Model3DSize), init_precedent(6);
+        init = arlCore::vnl_rigid_vector (T);
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+        {
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+            for( j=0 ; j<3 ; ++j )
+                init_pts3D[3*i+j] = (*model3D[i])[j];
+        }
+        arlCore::ISPPC_cost_function ISPPC(cameras,estime3D,points2D);
+        vnl_conjugate_gradient computeISPPC(ISPPC);
+        computeISPPC.minimize(init);
+        arlCore::EPPC_cost_function EPPC(cameras,model3D,points2D,T);
+        vnl_conjugate_gradient computeEPPC(EPPC);
+        computeEPPC.set_f_tolerance(EPPCfTolerance);
+        computeEPPC.set_x_tolerance(EPPCxTolerance);
+        unsigned int nbIterations=0;
+        do
+        {
+            T=arlCore::vnl_rigid_matrix (arlCore::vnl_rigid_vector(init));
+            //Estimation des points 3D parfaits avec T(k+1)
+            computeEPPC.minimize(init_pts3D);
+            init_precedent = init;
+            for( i=0 ; i<Model3DSize ; ++i )
+                for( j=0 ; j<3 ; ++j )
+                    estime3D[i].put(j, init_pts3D[3*i+j]);
+            computeISPPC.minimize(init);
+            ++nbIterations;
+        }while( (init-init_precedent).rms()>RMSTrsf && nbIterations<nbIterationsMax );
+        RMS = computeEPPC.get_end_error();
+        log.push_back(RMS);
+        log.push_back(sqrt(computeEPPC.get_start_error()/nbVisiblePoints));
+        // FIXME Ponderer les erreurs suivantes
+        log.push_back(EPPC.get2Derror());
+        log.push_back(EPPC.get3Derror());
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_ISPPC)
+    {
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::ISPPC_cost_function ISPPC(cameras,estime3D,points2D, false);
+        init = vec;
+        vnl_powell computeISPPC(&ISPPC);
+        computeISPPC.minimize(init);
+        RMS = sqrt(computeISPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeISPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_ISPPC_LM)
+    {
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::ISPPC_LS_cost_function ISPPC(cameras,estime3D,points2D, 6, nbVisiblePoints, vnl_least_squares_function::use_gradient, false);
+        init = vec;
+        vnl_levenberg_marquardt computeISPPC(ISPPC);
+        computeISPPC.minimize_using_gradient(init);
+        RMS = sqrt(computeISPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeISPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_ISPPC_ANISOTROP)
+    {
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::ISPPC_cost_function ISPPC(cameras,estime3D,points2D, true);
+        init = vec;
+        vnl_powell computeISPPC(&ISPPC);
+        computeISPPC.minimize(init);
+        RMS = sqrt(computeISPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeISPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_ISPPC_ANISOTROP_LM)
+    {
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::ISPPC_LS_cost_function ISPPC(cameras,estime3D,points2D, 6, nbVisiblePoints, vnl_least_squares_function::use_gradient, true);
+        init = vec;
+        vnl_levenberg_marquardt computeISPPC(ISPPC);
+        computeISPPC.minimize_using_gradient(init);
+        RMS = sqrt(computeISPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeISPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_ISPPC_CG)
+    {
+        std::vector< vnl_vector_fixed<double,4> > estime3D(Model3DSize);
+        for( i=0 ; i<Model3DSize ; ++i )
+            estime3D[i] = vnl_vector_fixed<double,4>((*model3D[i])[0], (*model3D[i])[1], (*model3D[i])[2], 1.0);
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::ISPPC_cost_function ISPPC(cameras,estime3D,points2D);
+        init = vec;
+        vnl_conjugate_gradient computeISPPC(ISPPC);
+        computeISPPC.minimize(init);
+        RMS = sqrt(computeISPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeISPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+
+    if(methode==arlCore::ARLCORE_PR_OSPPC)
+    {
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::OSPPC_cost_function OSPPC(cameras,model3D,points2D);
+        init = vec;
+        vnl_powell computeOSPPC(&OSPPC);
+        computeOSPPC.minimize(init);
+        RMS = sqrt(computeOSPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeOSPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_OSPPC_LM)
+    {
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::OSPPC_LS_cost_function OSPPC(cameras,model3D,points2D, 6, nbVisiblePoints, vnl_least_squares_function::use_gradient);
+        init = vec;
+        vnl_levenberg_marquardt computeOSPPC(OSPPC);
+        computeOSPPC.minimize_using_gradient(init);
+        RMS = sqrt(computeOSPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeOSPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    if(methode==arlCore::ARLCORE_PR_OSPPC_CG)
+    {
+        arlCore::vnl_rigid_vector vec(T);
+        arlCore::OSPPC_cost_function OSPPC(cameras,model3D,points2D);
+        init = vec;
+        vnl_conjugate_gradient computeOSPPC(OSPPC);
+        computeOSPPC.minimize(init);
+        RMS = sqrt(computeOSPPC.get_end_error()/nbVisiblePoints);
+        log.push_back(RMS);
+        log.push_back(sqrt(computeOSPPC.get_start_error()/nbVisiblePoints));
+        vec = init;
+        T = arlCore::vnl_rigid_matrix(vec);
+        b= true;
+    }
+    T.setRMS(RMS);
+    T.setStdDev(0.0);
+    return b;
+}
+
+/**
+ * @brief   HOMOGRAPHY WHEN THE INTRINSIC PARAMETERS ARE UNKNOWN
+ * *****************************************************************************************
+ * This function is necessary for camera calibration (see Zhang. Z. A flexible new technique for camera
+ * calibration). The notations have been kept from his paper. The idea is that the point of the
+ * chessboard model are projectively equivalent to the points detected in the video image.
+ * Then it exist an homography 3x3 H so that (assuming points on the chessboard have a Z coordinate
+ * equal to 0) :
+ *
+ *       [u_i]       [X_i]
+ * m_i = [v_i] = H x [Y_i]
+ *       [w_i]       [ 1 ]
+ *
+ *
+ * From a general point of view, this function provides "the best" homography between
+ * two point sets in 2D.
+ * Considering the camera calibration problem, the H matrix corresponds to the multiplication of
+ * the intrinsic matrix and the extrinsic matrix:
+ * [u]   [ -  h1  - ]  [X]        [ | |  |] [X]                                                 [fc1 0   cc1]
+ * [v] = [ -  h2  - ]x [Y] =A x   [r1 r2 t]x[Y]  where A is the intrinsic parameter matrix =    [0   fc2 cc2]
+ * [w]   [ -  h3  - ]  [1]        [ | |  |] [1]                                                 [0   0    1 ]
+ *
+ * where [u v w]' are PIXEL coordinates and not REAL. To find A and the extrinsic matrix, several poses
+ * of the chessboard are necessary.
+ *
+ * To find H, we seek the solution that minimize the following system:
+ * [X1 Y1 1 0 0 0 -u1X1 -u1Y1 -u1 ]   [ | ]
+ * [.                          .  ]   [ h1 ]
+ * [Xi Yi 1 0 0 0 -uiXi -uiYi -ui ]   [ | ]
+ * [.                          .  ]   [ | ]
+ * [XN YN 1 0 0 0 -uNXN -uNYN -uN ]  x[ h2 ]  = 0
+ * [0 0 0 X1 Y1 1 -v1X1 -v1Y1 -v1 ]   [ | ]
+ * [.                          .  ]   [ | ]
+ * [0 0 0 Xi Yi 1 -viXi -viYi -vi ]   [ h3 ]
+ * [.                          .  ]   [ | ]
+ * [0 0 0 XN YN 1 -vNXN -vNYN -vN ]   [ | ]
+ *                                                                            [ - h1 -]
+ * where the h vector corresponds to the homography matrix that fulfils m_i = [ - h2 -]M_i
+ *                                                                            [ - h3 -]
+ * M are the coordinates of the pattern points [X Y 1.0] in the pattern frame (note the pattern MUST be planar)
+ * m are the coordinates of its correspoding 3D points in the video image
+ * Since the homography matrix is defined up to a scale factor, the solution is given by a svd
+ * of the big matrix. Then we obtain the eigen vector associated to the smallest eigen value.
+ *
+ * To obtain an evaluation of the homography estimation quality, put optimiserParameters[0] to 1.
+ * In that case, log[0] contains the reprojection error.
+ * To apply the prenormalisation (that ensure a good computation of the svd) detailed in R. Hartely.
+ * "In defence of the 8 points algorithm", put optimiserParameters[1] to 1. In practice, this did not
+ *  change our results...
+ * ******************************************************************************************/
+template <typename Type>
+bool internPlanarHomographyUnknownIntrinsic( const Type &points2D, const Type &model3D, vnl_matrix_fixed<double,3,3> &H, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    bool normalize =false;
+    bool error_log=false;
+    //ATTENTION : Points2D and  model3D doivent �tre parfaitement appareill�s :
+    // Tailles identiques, pas de pointeur null
+    if(points2D.size()<4) return false;
+    assert(points2D.size()==model3D.size());
+    unsigned int i, size=(unsigned int)model3D.size();
+    vnl_matrix<double> P(3,3);
+    vnl_matrix_fixed<double,4,4> T_tmp;
+    vnl_matrix<double> a_matrix(size*2, 9);
+    if(optimiserParameters.size() > 0)
+        if(optimiserParameters[0] == 1)
+            error_log = true;
+    if(optimiserParameters.size() > 1)
+        if(optimiserParameters[1] == 1)
+            normalize = true;
+    // PRENORMALISATION DES DONNEES cf "In defence of the 8 points algorithm" et "Pose reconstruction with
+    // uncalibrated CT imaging device"
+    double meanX_model3D=0, meanY_model3D=0, scale_model3D=0;
+    double meanX_points2D=0, meanY_points2D=0, scale_points2D=0;
+    vnl_matrix_fixed<double,3,3> norm_mat_model3D, norm_mat_points2D;
+    if(normalize)
+    {
+        for( i=0 ; i<size ; ++i )// calcul des moyennes et des ecart-types
+        {
+            meanX_model3D += model3D[i]->x();
+            meanY_model3D += model3D[i]->y();
+            meanX_points2D += points2D[i]->x();
+            meanY_points2D += points2D[i]->y();
+        }
+        meanX_model3D /= size; meanY_model3D /= size;  meanX_points2D/=size ;  meanY_points2D/=size ;
+        for( i=0 ; i<size ; ++i )
+        {
+            scale_model3D += sqrt( (model3D[i]->x() - meanX_model3D)*(model3D[i]->x() - meanX_model3D) + (model3D[i]->y() - meanY_model3D)*(model3D[i]->y() - meanY_model3D));
+            scale_points2D += sqrt( (points2D[i]->x() - meanX_points2D)*(points2D[i]->x() - meanX_points2D) + (points2D[i]->y() - meanY_points2D)*(points2D[i]->y() - meanY_points2D));
+        }
+        scale_model3D /= (size * 1.414213562373);//1.41421356237310 = sqrt(2)
+        scale_points2D /= (size * 1.414213562373);
+        norm_mat_model3D.set_identity();   norm_mat_points2D.set_identity();
+        norm_mat_model3D(0,0) = norm_mat_model3D(1,1) = 1/scale_model3D;
+        norm_mat_points2D(0,0) = norm_mat_points2D(1,1) = 1/scale_points2D;
+        norm_mat_model3D(0,2) = -meanX_model3D/scale_model3D;
+        norm_mat_model3D(1,2) = -meanY_model3D/scale_model3D;
+        norm_mat_points2D(0,2) = -meanX_points2D/scale_points2D;
+        norm_mat_points2D(1,2) = -meanY_points2D/scale_points2D;
+    }
+    for( i=0 ; i<size ; ++i )
+    {
+        if(normalize)
+        {
+            a_matrix.put(i,0, (model3D[i]->x() - meanX_model3D)/scale_model3D);
+            a_matrix.put(i,1, (model3D[i]->y() - meanY_model3D)/scale_model3D);
+        }
+        else
+        {
+            a_matrix.put(i,0, model3D[i]->x());
+            a_matrix.put(i,1, model3D[i]->y());
+        }
+        a_matrix.put(i,2, 1.0);
+        a_matrix.put(i,3, 0.0);
+        a_matrix.put(i,4, 0.0);
+        a_matrix.put(i,5, 0.0);
+        if(normalize)
+        {
+            double scaled_pt2D = (points2D[i]->x() - meanX_points2D)/scale_points2D;
+            a_matrix.put(i,6, (model3D[i]->x() - meanX_model3D)/scale_model3D*(-1)* scaled_pt2D);
+            a_matrix.put(i,7, (model3D[i]->y() - meanY_model3D)/scale_model3D*(-1)* scaled_pt2D);
+            a_matrix.put(i,8, (-1)*scaled_pt2D);
+        }
+        else
+        {
+            a_matrix.put(i,6, model3D[i]->x()*(-1)* points2D[i]->x());
+            a_matrix.put(i,7, model3D[i]->y()*(-1)* points2D[i]->x());
+            a_matrix.put(i,8, (-1)*points2D[i]->x());
+        }
+    }
+    for( i=size ; i<2*size ; ++i )
+    {
+        a_matrix.put(i,0, 0.0);
+        a_matrix.put(i,1, 0.0);
+        a_matrix.put(i,2, 0.0);
+        if(normalize)
+        {
+            a_matrix.put(i,3, (model3D[i-size]->x() - meanX_model3D)/scale_model3D);
+            a_matrix.put(i,4, (model3D[i-size]->y() - meanY_model3D)/scale_model3D);
+        }
+        else
+        {
+            a_matrix.put(i,3, model3D[i-size]->x());
+            a_matrix.put(i,4, model3D[i-size]->y());
+        }
+        a_matrix.put(i,5, 1.0);
+        if(normalize)
+        {
+            double scaled_pt2D = (points2D[i-size]->y() - meanY_points2D)/scale_points2D;
+            a_matrix.put(i,6, (model3D[i-size]->x() - meanX_model3D)/scale_model3D*(-1)*scaled_pt2D);
+            a_matrix.put(i,7, (model3D[i-size]->y() - meanY_model3D)/scale_model3D*(-1)*scaled_pt2D);
+            a_matrix.put(i,8, (-1)*scaled_pt2D);
+        }
+        else
+        {
+            a_matrix.put(i,6, model3D[i-size]->x()*(-1)*points2D[i-size]->y());
+            a_matrix.put(i,7, model3D[i-size]->y()*(-1)*points2D[i-size]->y());
+            a_matrix.put(i,8, (-1)*points2D[i-size]->y());
+        }
+    }
+//  TODO tester si c plus rapide de passer par vnl_symmetric_eigensystem plutot que vnl_svd
+//  vnl_symmetric_eigensystem<double> objet(a_matrix.transpose()*a_matrix);
+//  cerr << "null vector = "<<objet.nullvector() << endl;
+//  vnl_matrix<double> PP(3,3);
+//  PP.set(objet.nullvector().data_block());
+//  PP/=PP.get_column(0).two_norm();
+//  cerr << "Matrice PP estimee " << endl << PP << endl;
+//
+    //a_matrix.normalize_rows();
+    vnl_svd<double> svd(a_matrix);
+    //cerr << "svd(a_matrix) U =" <<endl << svd.U() <<endl;cerr << "svd(a_matrix) V =" <<endl << svd.V() <<endl;cerr << "svd(a_matrix) W =" <<endl << svd.W() <<endl;
+    //cerr << "Vecteur propre associe a valeur singuliere minimale " << endl << svd.nullvector() << endl;
+    P.set(svd.nullvector().data_block());
+//  cerr << "Matrice P estimee " << endl << P << endl;
+    if(normalize){
+        vnl_matrix<double> tmp = vnl_matrix_inverse<double>(norm_mat_points2D);
+        P = tmp * P * norm_mat_model3D;
+    }
+    P/=P.get_column(0).two_norm();//TODO cette normalisation est-elle necessaire ?
+    // on teste si l'homographie estimee recale l'objet derriere la camera ou pas
+    // si c'est le cas alors on multiplie P par -1;
+    //cerr << "Matrice P estimee apres normalisation" << endl << P << endl;
+    vnl_vector_fixed<double,3> var_3D, test;
+    var_3D(0) = model3D[0]->x() ;
+    var_3D(1) = model3D[0]->y();
+    var_3D(2) = 1.0;
+    test = P * var_3D;
+    if(test[2] < 0.0) P*=-1.0;
+    //cerr << "Matrice P estimee " << endl << P << endl;
+    //cerr << "norme colonne 1=" <<P.get_column(0).two_norm() << endl;
+    //cerr << "norme colonne 2=" <<P.get_column(1).two_norm() << endl;
+//  if(fabs(P.get_column(1).two_norm() - 1.0) > 1e-2)//TODO evaluer la bonne valeur d'erreur (empirique pour l'instant)
+//  {
+//      T.set_identity();
+//      return false;
+//  }
+    H = P;
+    if(error_log)
+    {
+        double erreur_reprojection = 0;
+        log.clear();
+        for( i=0 ; i<size ; ++i )
+        {
+            arlCore::Point::sptr tmp2D = arlCore::Point::New(2);
+            vnl_vector_fixed<double,3> model3D_tmp, tmp3D;
+
+            model3D_tmp.put(0,model3D[i]->x());model3D_tmp.put(1,model3D[i]->y());model3D_tmp.put(2,1.0);
+            //std::cerr<<"model3D_tmp =" <<model3D_tmp<<std::endl;
+            tmp3D = H * model3D_tmp.as_vector();
+            tmp2D->set(0, tmp3D(0)/tmp3D(2));
+            tmp2D->set(1, tmp3D(1)/tmp3D(2));
+            //std::cerr<<"tmp2D =" <<tmp2D.getString()<<std::endl;
+            //std::cerr<<"points2D[i] =" <<points2D[i]->getString()<<std::endl;
+            erreur_reprojection += points2D[i]->distance(tmp2D);
+        }
+        log.push_back(erreur_reprojection/size);
+        //log.push_back(P.get_column(1).two_norm());
+    }
+    return true;
+}
+
+bool arlCore::planarHomographyUnknownIntrinsic( const vector<arlCore::Point::sptr> &points2D, const vector< arlCore::Point::sptr > &model3D, vnl_matrix_fixed<double,3,3> &H, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    return internPlanarHomographyUnknownIntrinsic( points2D, model3D, H, optimiserParameters, log, verbose);
+}
+
+bool arlCore::planarHomographyUnknownIntrinsic( arlCore::PointList::csptr points2D, arlCore::PointList::csptr model3D, vnl_matrix_fixed<double,3,3> &H, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    return internPlanarHomographyUnknownIntrinsic( *points2D, *model3D, H, optimiserParameters, log, verbose);
+}
+
+/**
+ *
+ * @brief PLANAR HOMOGRAPHY REGISTRATION METHOD
+ *******************************************************************************************
+ * We are looking for the rigid matrix R,t so that :
+ * [u]   [ [     ][  ] ] [ [     ][ ] ] [X]  [ | |  |] [X]
+ * [v] = [ [  Rw ][tw] ]x[ [  R  ][t] ] [Y] =[r1 r2 t]x[Y]
+ * [w]   [ [     ][  ] ] [ [     ][ ] ] [0]  [ | |  |] [1]
+ *       [ [0 0 0][1 ] ] [ [0 0 0][1] ] [1]
+ *
+ * where [u v w]' are the REAL coordinates (in the unit focal plane) - and not pixellic
+ *                                                                  [ - h1 -]
+ * we write the matrix [r1 r2 t] under the homographic matrix    H =[ - h2 -] with 8 degrees of freedom
+ *                                                                  [ - h3 -]
+ * then we seek the solution that minimize the systeme :
+ * [X1 Y1 1 0 0 0 -u1X1 -u1Y1 -u1 ]   [ | ]
+ * [.                          .  ]   [ h1 ]
+ * [Xi Yi 1 0 0 0 -uiXi -uiYi -ui ]   [ | ]
+ * [.                          .  ]   [ | ]
+ * [XN YN 1 0 0 0 -uNXN -uNYN -uN ]  x[ h2 ]  = 0
+ * [0 0 0 X1 Y1 1 -v1X1 -v1Y1 -v1 ]   [ | ]
+ * [.                          .  ]   [ | ]
+ * [0 0 0 Xi Yi 1 -viXi -viYi -vi ]   [ h3 ]
+ * [.                          .  ]   [ | ]
+ * [0 0 0 XN YN 1 -vNXN -vNYN -vN ]   [ | ]
+ *                                                                            [ - h1 -]
+ * where the h vector corresponds to the homographic matrix that fulfills m = [ - h2 -]M
+ *                                                                            [ - h3 -]
+ * and M are the coordinates of the points of the PLANAR pattern [X Y 1.0] in the pattern frame
+ * and m are the coordinates of its match in the video image in the REAL WORLD (in the unit focal plane)
+ * Since the homographic matrix is defined up to a scale factor , the solution is given by the svd
+ * of the big matrix. Then, we get the eigen vector associated to the smallest eigen value.
+ * Once H is computed, we multiply this matrix so that the first column is of unit norm.
+ * we compute r1 x r2 to find the third vector of the pseudo rotation matrix
+ * then we seek the closest rotation matrix of this matrix using an svd.
+ * Finally, we multiply left the found matrix with the inverse extrinsic matrix of the camera
+ * To obtain a quality evaluation of the homography estimation, optimiserParameters[0]
+ * must be set to 1. In that case, log[0] contains the reprojection error and log[1]
+ * the norm of the first column of H (which should be equal to 1 !!).
+ *
+ * To apply the prenormalisation (which ensure a good calculation of the svd), proposed in
+ * "In defence of the 8 points algorithm" (R. Hartley), optimiserParameters[1] must be set to 1.
+ *
+ */
+template <typename Type>
+bool internPlanarHomographyRegistration_3D_2D( const arlCore::Camera &camera, const vector<arlCore::Point::csptr> &points2D, const Type &model3D, arlCore::vnl_rigid_matrix &T, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    //return true;
+    if(!camera.isIntrinsicCalibrated()) return false;
+    //ATTENTION : Points2D and  model3D doivent être parfaitement appareillés :
+    // Tailles identiques, pas de pointeur null
+    bool normalize =true;
+    bool error_log=false;
+    if(points2D.size()<4) return false;
+    assert(points2D.size()==model3D.size());
+    unsigned int i, size=(unsigned int)model3D.size();
+    std::vector<vnl_vector_fixed<double,3> > focalPoints(size);
+    vnl_matrix_fixed<double,3,3> P, mat_tmp;
+    arlCore::vnl_rigid_matrix T_tmp;
+    vnl_matrix<double> a_matrix(size*2, 9);
+    if(optimiserParameters.size() > 0)
+        if(optimiserParameters[0] == 1)
+            error_log = true;
+    if(optimiserParameters.size() > 1)
+        if(optimiserParameters[1] == 1)
+            normalize = true;
+    // PRENORMALISATION DES DONNEES cf "In defence of the 8 points algorithm" et "Pose reconstruction with
+    // uncalibrated CT imaging device"
+    double meanX_model3D=0, meanY_model3D=0, scale_model3D=0;
+    double meanX_points2D=0, meanY_points2D=0, scale_points2D=0;
+    vnl_matrix_fixed<double,3,3> norm_mat_model3D, norm_mat_points2D;
+    if(normalize)
+    {
+        for( i=0 ; i<size ; ++i )// calcul des moyennes et des ecart-types
+        {
+            assert(model3D[i]);
+            assert(points2D[i]);
+            meanX_model3D += model3D[i]->x();
+            meanY_model3D += model3D[i]->y();
+            meanX_points2D += points2D[i]->x();
+            meanY_points2D += points2D[i]->y();
+        }
+        meanX_model3D /= size; meanY_model3D /= size;  meanX_points2D/=size ;  meanY_points2D/=size ;
+        for( i=0 ; i<size ; ++i )
+        {
+            scale_model3D += sqrt( (model3D[i]->x() - meanX_model3D)*(model3D[i]->x() - meanX_model3D) + (model3D[i]->y() - meanY_model3D)*(model3D[i]->y() - meanY_model3D));
+            scale_points2D += sqrt( (points2D[i]->x() - meanX_points2D)*(points2D[i]->x() - meanX_points2D) + (points2D[i]->y() - meanY_points2D)*(points2D[i]->y() - meanY_points2D));
+        }
+        scale_model3D /= (size * 1.414213562373);//1.41421356237310 = sqrt(2)
+        scale_points2D /= (size * 1.414213562373);
+        norm_mat_model3D.set_identity();   norm_mat_points2D.set_identity();
+        norm_mat_model3D(0,0) = norm_mat_model3D(1,1) = 1/scale_model3D;
+        norm_mat_points2D(0,0) = norm_mat_points2D(1,1) = 1/scale_points2D;
+        norm_mat_model3D(0,2) = -meanX_model3D/scale_model3D;
+        norm_mat_model3D(1,2) = -meanY_model3D/scale_model3D;
+        norm_mat_points2D(0,2) = -meanX_points2D/scale_points2D;
+        norm_mat_points2D(1,2) = -meanY_points2D/scale_points2D;
+    }
+    for( i=0 ; i<size ; ++i )
+    {
+        assert(points2D[i]);
+        assert(model3D[i]);
+        camera.pixelPlaneToUnitFocalPlane( points2D[i], focalPoints[i], false );
+        if(normalize)
+        {
+            a_matrix.put(i,0, (model3D[i]->x() - meanX_model3D)/scale_model3D);
+            a_matrix.put(i,1, (model3D[i]->y() - meanY_model3D)/scale_model3D);
+        }
+        else
+        {
+            a_matrix.put(i,0, model3D[i]->x());
+            a_matrix.put(i,1, model3D[i]->y());
+        }
+        a_matrix.put(i,2, 1.0);
+        a_matrix.put(i,3, 0.0);
+        a_matrix.put(i,4, 0.0);
+        a_matrix.put(i,5, 0.0);
+        if(normalize)
+        {
+            double scaled_pt2D = (focalPoints[i](0) - meanX_points2D)/scale_points2D;
+            a_matrix.put(i,6, (model3D[i]->x() - meanX_model3D)/scale_model3D*(-1)* scaled_pt2D);
+            a_matrix.put(i,7, (model3D[i]->y() - meanY_model3D)/scale_model3D*(-1)* scaled_pt2D);
+            a_matrix.put(i,8, (-1)*scaled_pt2D);
+        }
+        else
+        {
+            a_matrix.put(i,6, model3D[i]->x()*(-1)*focalPoints[i](0));
+            a_matrix.put(i,7, model3D[i]->y()*(-1)*focalPoints[i](0));
+            a_matrix.put(i,8, (-1)*focalPoints[i](0));
+        }
+    }
+    for( i=size ; i<2*size ; ++i )
+    {
+        assert(model3D[i-size]);
+        a_matrix.put(i,0, 0.0);
+        a_matrix.put(i,1, 0.0);
+        a_matrix.put(i,2, 0.0);
+        if(normalize)
+        {
+            a_matrix.put(i,3, (model3D[i-size]->x() - meanX_model3D)/scale_model3D);
+            a_matrix.put(i,4, (model3D[i-size]->y() - meanY_model3D)/scale_model3D);
+        }
+        else
+        {
+            a_matrix.put(i,3, model3D[i-size]->x());
+            a_matrix.put(i,4, model3D[i-size]->y());
+        }
+        a_matrix.put(i,5, 1.0);
+        if(normalize)
+        {
+            double scaled_pt2D = (focalPoints[i-size](1) - meanY_points2D)/scale_points2D;
+            a_matrix.put(i,6, (model3D[i-size]->x() - meanX_model3D)/scale_model3D *(-1)* scaled_pt2D);
+            a_matrix.put(i,7, (model3D[i-size]->y() - meanY_model3D)/scale_model3D *(-1)* scaled_pt2D);
+            a_matrix.put(i,8, (-1)*scaled_pt2D);
+        }
+        else
+        {
+            a_matrix.put(i,6, model3D[i-size]->x()*(-1)*focalPoints[i-size](1));
+            a_matrix.put(i,7, model3D[i-size]->y()*(-1)*focalPoints[i-size](1));
+            a_matrix.put(i,8, (-1)*focalPoints[i-size](1));
+        }
+    }
+//  TODO tester si c plus rapide de passer par vnl_symmetric_eigensystem plutot que vnl_svd
+//  vnl_symmetric_eigensystem<double> objet(a_matrix.transpose()*a_matrix);
+//  cerr << "null vector = "<<objet.nullvector() << endl;
+//  cerr << "tAA = "<<a_matrix.transpose()*a_matrix << endl;
+//  vnl_matrix<double> PP(3,3);
+//  PP.set(objet.nullvector().data_block());
+//  PP/=PP.get_column(0).two_norm();
+//  cerr << "Matrice PP estimee " << endl << PP << endl;
+//
+    //a_matrix.normalize_rows();
+    vnl_svd<double> svd(a_matrix);
+    //cerr << "svd(a_matrix) U =" <<endl << svd.U() <<endl;cerr << "svd(a_matrix) V =" <<endl << svd.V() <<endl;cerr << "svd(a_matrix) W =" <<endl << svd.W() <<endl;
+    //cerr << "Vecteur propre associe a valeur singuliere minimale " << endl << svd.nullvector() << endl;
+    P.set(svd.nullvector().data_block());
+    if(normalize){
+        vnl_matrix<double> tmp = vnl_matrix_inverse<double>(norm_mat_points2D);
+        P = tmp * P.as_matrix() * norm_mat_model3D;
+    }
+    P/=P.get_column(0).two_norm();
+    // on teste si l'homographie estimee recale l'objet derriere la camera ou pas
+    // si c'est le cas alors on multiplie P par -1;
+    vnl_vector_fixed<double,3> var_3D, test;
+    var_3D(0) = model3D[0]->x() ;
+    var_3D(1) = model3D[0]->y();
+    var_3D(2) = 1.0;
+    test = P * var_3D;
+    if(test[2] < 0.0) P*=-1.0;
+    //cerr << "Matrice P estimee " << endl << P << endl;
+    //cerr << "norme colonne 1=" <<P.get_column(0).two_norm() << endl;
+    //cerr << "norme colonne 2=" <<P.get_column(1).two_norm() << endl;
+//  if(fabs(P.get_column(1).two_norm() - 1.0) > 1e-2)//TODO evaluer la bonne valeur d'erreur (empirique pour l'instant)
+//  {
+//      T.set_identity();
+//      return false;
+//  }
+    mat_tmp.set_column(0, P.get_column(0));
+    mat_tmp.set_column(1, P.get_column(1));
+    mat_tmp.set_column(2, vnl_cross_3d(P.get_column(0), P.get_column(1)));
+    arlCore::vnl_rotation3d_matrix rot_mat(mat_tmp);
+    rot_mat.closest_rotation();
+    T_tmp.set_identity();
+    T_tmp.setRotation(rot_mat);
+    for( i=0 ; i<3 ; ++i )
+        T_tmp.put(i,3, P(i,2));
+    T = camera.getInvExtrinsic() * T_tmp.as_matrix();
+    if(error_log)
+    {
+        double erreur_reprojection = 0;
+        log.clear();
+        for( i=0 ; i<size ; ++i )
+        {
+            arlCore::Point::sptr tmp3D = arlCore::Point::New(3);
+            arlCore::Point::sptr tmp2D = arlCore::Point::New(2);
+            T.trf( model3D[i] , tmp3D );
+            camera.project3DPoint( tmp3D, tmp2D );
+            erreur_reprojection += points2D[i]->distance(tmp2D);
+        }
+        log.push_back(erreur_reprojection/size);
+        log.push_back(P.get_column(1).two_norm());
+    }
+    return true;
+}
+
+bool arlCore::planarHomographyRegistration_3D_2D( const arlCore::Camera &camera, const vector<arlCore::Point::csptr> &points2D, const std::vector< arlCore::Point::csptr > &model3D, arlCore::vnl_rigid_matrix &T, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    return internPlanarHomographyRegistration_3D_2D( camera, points2D, model3D, T, optimiserParameters, log, verbose);
+}
+/*
+bool arlCore::planarHomographyRegistration_3D_2D( const arlCore::Camera &camera, const vector<arlCore::Point::sptr> &points2D, PointList::csptr model3D, arlCore::vnl_rigid_matrix &T, const vector<double> &optimiserParameters, vector<double> &log, bool verbose)
+{
+    return internPlanarHomographyRegistration_3D_2D( camera, points2D, model3D, T, optimiserParameters, log, verbose);
+}*/
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+// en entree :
+// points2D : liste de arlCore::Point correspond aux coordonnees image (pts pixel) dans toutes les
+// cameras du point qu'on veut reconstruire
+// point3D : resultat de la reconstruction
+// methode : choix de la methode parmi (reprojection_optimisation ou reprojection_optimisation_uncertainty
+// log :qques valeurs importantes pour la qualite de la reconstruction
+//
+// reprojection_optimisation : methode iterative de reconstruction sans prise en compte de la
+// covariance sur les points 2D. Initialisation avec two_lines_approx
+// reprojection_optimisation_uncertainty : methode iterative de reconstruction avec prise en compte de la
+// covariance sur les points 2D. Initialisation avec two_lines_approx
+// En principe, methode la plus lente
+////////////////////////////////////////////////////////////////////////////////////////////////////////
+bool reconsReproj(const vector<arlCore::Point::csptr> &points2D, const vector<const arlCore::Camera*> &cameras, arlCore::Point::sptr point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, vector<double> &log)
+{
+    unsigned int i;
+    bool b=false;
+    vector<double> log_tmp;
+    reconstruction3D(points2D, cameras, point3D, arlCore::ARLCORE_R3D_TWO_LINES_APPROX, log_tmp, true);
+    vnl_vector<double> point3DSolution = point3D->getCoordinates();
+    // Methode iterative de reprojection optimale avec correction de la distorsion
+    if( methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION )
+    {
+        arlCore::OptimiseReprojection reconstruction(cameras, points2D);
+        vnl_powell compute_reconstruction(&reconstruction);
+        compute_reconstruction.minimize(point3DSolution);
+        log.push_back(compute_reconstruction.get_end_error() / points2D.size());
+        log.push_back(compute_reconstruction.get_start_error() / points2D.size() );
+        b=true;
+    }
+    // Methode iterative de reprojection optimale avec correction de la distorsion
+    // et prise en compte de la covariance
+    if( methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY )
+    {
+        arlCore::OptimiseReprojectionUncertainty reconstruction(cameras, points2D);
+        vnl_powell compute_reconstruction(&reconstruction);
+        compute_reconstruction.minimize(point3DSolution);
+        log.push_back(compute_reconstruction.get_end_error() / points2D.size() );
+        log.push_back(compute_reconstruction.get_start_error() / points2D.size() );
+        b=true;
+    }
+    for( i=0 ; i<3 ; ++i )
+        point3D->set(i,point3DSolution(i));
+    if(log.size()>0) point3D->setError(log[0]);
+    return b;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Recorder.cpp b/SrcLib/ARLcore/src/arlcore/Recorder.cpp
new file mode 100644
index 0000000..747bfdc
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Recorder.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Recorder.h>
+
+arlCore::Recorder::Recorder( void ):
+m_recorderDirectory(""),
+m_fullRecorderDirectory(""),
+m_recorderFullName(""),
+m_recorderFlag(false),
+m_recorderAfterRender(false),
+m_nbSnapshots(-1)
+{}
+
+arlCore::Recorder::~Recorder( void )
+{}
+
+bool arlCore::Recorder::getRecorderFilename( std::string &fileName )
+{
+    bool b = m_recorderHandle.is_open();
+    if(b) fileName = m_recorderFullName;
+    else fileName = "";
+    return b;
+}
+
+bool arlCore::Recorder::getRecorderDirectory( std::string &directory )
+{
+    bool b = m_recorderHandle.is_open();
+    if(b) directory = m_recorderDirectory;
+    else directory = "";
+    return b;
+}
+
+bool arlCore::Recorder::startRecorder( long int nbSnapshots, bool afterRender )
+{
+    m_nbSnapshots = nbSnapshots;
+    if( m_recorderHandle.is_open() && m_nbSnapshots!=0 )
+        m_recorderFlag=true;
+    else m_recorderFlag=false;
+    m_recorderAfterRender = afterRender;
+    return m_recorderFlag;
+}
+
+bool arlCore::Recorder::stopRecorder( void )
+{
+    m_recorderFlag=false;
+    return m_recorderFlag;
+}
+
+bool arlCore::Recorder::isRecording( void )
+{
+    return m_recorderFlag;
+}
+
+void arlCore::Recorder::closeRecorder( void )
+{
+    stopRecorder();
+    m_recorderHandle.close();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Scene.cpp b/SrcLib/ARLcore/src/arlcore/Scene.cpp
new file mode 100644
index 0000000..eabf34c
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Scene.cpp
@@ -0,0 +1,282 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Scene.h>
+
+#include <fstream>
+
+#include <arlcore/SmartPointsList.h>
+#include <arlcore/vnl_rotation3d_vector.h>
+
+arlCore::Scene::Scene( PlaneSystem &universe ):
+m_cameras(universe),
+m_universe(universe)
+{
+    m_tags = arlCore::Tags::New( universe , std::string() );
+}
+
+arlCore::Scene::Scene( PlaneSystem &universe, Tags::sptr tags ):
+m_cameras(universe),
+m_universe(universe)
+{
+    //VAG FIXMEm_tags->copy(tags);
+    assert(false); //VAG
+}
+
+arlCore::Scene::~Scene( void )
+{
+    assert(m_tags);
+}
+
+arlCore::Tag::sptr arlCore::Scene::addTag(unsigned int nbPoints, ARLCORE_SHAPE shapeType, Point::csptr centre, double size)
+{
+    PointList::sptr pointsMonde = PointList::New();
+    pointsMonde->shapeRandom(nbPoints, shapeType, centre, size);
+    return m_tags->addTag(pointsMonde);
+}
+
+bool arlCore::Scene::plot( void ) const
+{
+    assert(false); //VAG FIXME
+    /*
+    const bool JustVisible = false;
+    const bool Overwrite = true;
+    std::fstream f1,f2;
+    unsigned int i;
+    for( i=0 ; i<m_tags->size() ; ++i )
+        m_tags->getTag(i)->getGeometry().save("c:/000000.dat", ARLCORE_POINT_SAVE_GNUPLOT, JustVisible, Overwrite);
+    f1.open ("c:/000000.dat", std::fstream::out | std::fstream::app);
+    Point pt0(0.0, 0.0, 0.0),pt1(400.0, 0.0, 0.0),pt2(0.0, 300.0, 0.0), pt;
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        m_cameras[i].getInvExtrinsic().trf(pt0, pt);
+        f1<<"\n"<<pt.x()<<" "<<pt.y()<<" "<<pt.z();
+        m_cameras[i].getInvExtrinsic().trf(pt1, pt);
+        f1<<"\n"<<pt.x()<<" "<<pt.y()<<" "<<pt.z();
+        m_cameras[i].getInvExtrinsic().trf(pt2, pt);
+        f1<<"\n"<<pt.x()<<" "<<pt.y()<<" "<<pt.z();
+    }
+    f1.close();
+    //TODO Afficher tous les tags avec des couleurs differentes
+    f2.open (TMP_FILE, std::fstream::out);
+    if(!f2.is_open()) return false;
+    f2<<"set title 'Scene'\n";
+    f2<<"splot \"c:/000000.dat\"\n";
+    for( i=0 ; i<m_cameras.size() ; ++i )
+    {
+        m_cameras[i].getInvExtrinsic().trf(pt0, pt);
+        f2<<"set label \""<<i+1<<"\" at "<<pt.x()<<","<<pt.y()<<","<<pt.z()<<"\n";
+        f2<<"set arrow "<<i+1<<" from "<<pt.x()<<","<<pt.y()<<","<<pt.z()<<" to 0,0,0\n";
+    }
+    f2<<"pause -1 \"Hit return to continue\"\n";
+    f2.close();
+    system(GNUPLOT_EXE );
+    //exec("d:/gnuplot/bin/wgnuplot", "c:/000000.dem" );
+
+    */
+    return true;
+}
+
+arlCore::PlaneSystem& arlCore::Scene::getPlaneSystem( void )
+{
+    return m_universe;
+}
+
+const arlCore::CameraList& arlCore::Scene::getCameras( void ) const
+{
+    return m_cameras;
+}
+
+unsigned int arlCore::Scene::getNbCameras( void ) const
+{
+    return (unsigned int)m_cameras.size();
+}
+
+
+/*bool arlCore::Scene::nextImages( unsigned int step )
+{
+    setTime();
+    unsigned int i;
+    for( i=0 ; i<m_cameras.size() ; ++i )
+        if(m_images[i]!=0) m_images[i]->fill(0);
+    return dynamicBehavior(step);
+}*/
+/*
+unsigned int arlCore::Scene::detection( unsigned int cam, arlCore::SmartPointList &spl, std::vector< const arlCore::Tag::sptr > &tagsDetected, std::map< const arlCore::Tag::sptr, unsigned int >& allTagsDetected )
+{
+    return detectionBehavior( cam, spl, tagsDetected, allTagsDetected );
+}*/
+
+bool arlCore::Scene::addCameras(unsigned int nbCameras, Point::csptr  centre,
+                            double sphereRadius, double distMin,
+                            const std::vector<double> &intrinsic_param,
+                            const std::vector<double> &intrinsic_range)
+{
+    unsigned int i, j;
+    // tirage des points de vue des cameras
+    // on tire d'abord sa position dans une sphere autour de centre
+    // puis on l'eloigne du point de mire de la distance distMin
+    PointList::sptr CameraPOV = PointList::New(3);
+    double scalar, dist;
+    CameraPOV->shapeRandom(nbCameras,ARLCORE_SHAPE_SPHERE, centre, sphereRadius);
+    //for( j=0 ; j<nb_camera ; ++j )
+        //cerr<< "CameraPOV 1= " << CameraPOV[j]->getString() << endl;
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        dist = (*CameraPOV)[i]->distance(centre);
+        scalar = (dist+distMin)/dist;
+        for( j=0 ; j<3 ; ++j )
+            (*CameraPOV)[i]->set(j,((*(*CameraPOV)[i])[j]- (*centre)[j])*scalar + (*centre)[j] );
+    }
+    //for( j=0 ; j<nb_camera ; ++j )
+        //cerr<< "CameraPOV 2= " << CameraPOV[j]->getString() << endl;
+    // tirage des parametres intrinseques
+    Point::sptr tmp_intrinsic = Point::New( (unsigned int)intrinsic_param.size() );
+    Point::sptr tmp_intrinsic_var = Point::New( (unsigned int)intrinsic_param.size() );
+
+    std::vector<Point::sptr> tirage_intrinsic;
+    for( i=0 ; i<intrinsic_param.size() ; ++i )
+        tmp_intrinsic->set(i,intrinsic_param[i]);
+    tmp_intrinsic_var = tmp_intrinsic;
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        for( j=0 ; j<intrinsic_param.size() ; ++j )
+            tmp_intrinsic_var->addUniformNoise(j, intrinsic_range[j]);
+        tirage_intrinsic.push_back(tmp_intrinsic_var);
+        tmp_intrinsic_var = tmp_intrinsic;
+        //cerr<< "tirage_intrinsic = " << tirage_intrinsic[j].getString() << endl;
+    }
+    // construction des cameras synthetiques
+    std::vector<double> intrinsic;
+    uint32HL GUID={0,0}; // FIXME
+    unsigned int width=800, heigth=600; // FIXME
+    for(i=0; i<nbCameras; i++)
+    {
+        intrinsic.clear();
+        for(j=0; j<intrinsic_param.size(); j++)
+            intrinsic.push_back( (*(tirage_intrinsic[i]))[j]);
+        m_cameras.push_back( GUID, width, heigth );
+        m_cameras[i].syntheticCamera( centre , (*CameraPOV)[i] , intrinsic);
+        //cerr<< "CameraPOV 3= " << CameraPOV[j]->getString() << endl;
+        //intrinsic.clear();
+        //cerr<< "CamParam ["<<i<<"]= " << CamParam[i]->getString() << endl;
+    }
+    for( i=1 ; i<m_cameras.size() ; ++i )
+        m_universe.setIdentity( m_cameras[i-1].getPlane(), m_cameras[i].getPlane() );
+    return true;
+}
+
+bool arlCore::Scene::addCameras(unsigned int nbCameras, Point::csptr  centre,
+                            double sphereRadius, double distMin,
+                            const std::vector<double> &intrinsic_param,
+                            const std::vector<double> &intrinsic_range,
+                            double angleMin)
+{
+    unsigned int i, j;
+    // tirage des points de vue des cameras
+    // on tire d'abord sa position dans une sphere autour de centre
+    // puis on l'eloigne du point de mire de la distance distMin
+    PointList::sptr CameraPOV = PointList::New(3);
+    PointList::sptr CameraPOV_before = PointList::New(3);
+    double scalar, dist;
+    CameraPOV_before->shapeRandom(nbCameras,ARLCORE_SHAPE_SOLIDANGLE, centre, sphereRadius, angleMin);
+    //for(j=0; j<nb_camera; j++)
+        //cerr<< "CameraPOV 1= " << CameraPOV[j]->getString() << endl;
+
+    // choose a random direction for the solid angle
+    vnl_vector_fixed<double,3> t_null(0,0,0);
+    vnl_rotation3d_vector random_vector;
+    random_vector.uniform_random();// a random rotation is created
+    vnl_rigid_matrix mat( (vnl_rotation3d_matrix) random_vector, t_null);//this rigid matrix with the random rotation is applied to CameraPOV_before
+    mat.trf(CameraPOV_before, CameraPOV);
+
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        dist = (*CameraPOV)[i]->distance(centre);
+        scalar = (dist+distMin)/dist;
+        for( j=0 ; j<3 ; ++j )
+            (*CameraPOV)[i]->set(j,((*(*CameraPOV)[i])[j]- (*centre)[j])*scalar + (*centre)[j] );
+    }
+    //for(j=0; j<nb_camera; j++)
+        //cerr<< "CameraPOV 2= " << CameraPOV[j]->getString() << endl;
+    // tirage des parametres intrinseques
+    Point::sptr tmp_intrinsic = Point::New((unsigned int)intrinsic_param.size());
+    Point::sptr tmp_intrinsic_var = Point::New((unsigned int)intrinsic_param.size());
+    std::vector<Point::sptr> tirage_intrinsic;
+    for( i=0 ; i<intrinsic_param.size() ; ++i )
+        tmp_intrinsic->set(i, intrinsic_param[i]);
+    tmp_intrinsic_var = tmp_intrinsic;
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        for( j=0 ; j<intrinsic_param.size() ; ++j )
+            tmp_intrinsic_var->addUniformNoise(j, intrinsic_range[j]);
+        tirage_intrinsic.push_back(tmp_intrinsic_var);
+        tmp_intrinsic_var = tmp_intrinsic;
+        //cerr<< "tirage_intrinsic = " << tirage_intrinsic[j].getString() << endl;
+    }
+    // construction des cameras synthetiques
+    uint32HL GUID={0,0}; // FIXME
+    unsigned int width=800, heigth=600; // FIXME
+    std::vector<double> intrinsic;
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        intrinsic.clear();
+        for( j=0 ; j<intrinsic_param.size() ; ++j )
+            intrinsic.push_back( (*(tirage_intrinsic[i]))[j]);
+//      m_cameras.push_back( Camera (m_universe) );
+        m_cameras.push_back( GUID, width, heigth );
+        m_cameras.back().syntheticCamera( centre ,  (*CameraPOV)[i] , intrinsic);
+        //cerr<< "CameraPOV 3= " << CameraPOV[j]->getString() << endl;
+        //intrinsic.clear();
+        //cerr<< "CamParam ["<<i<<"]= " << CamParam[i]->getString() << endl;
+    }
+    for( i=0 ; i<m_cameras.size()-1 ; ++i )
+        for( j=i+1 ; j<m_cameras.size() ; ++j )
+            m_universe.setIdentity(m_cameras[i].getPlane(),m_cameras[j].getPlane());
+    return true;
+}
+
+arlCore::Tags  &arlCore::Scene::getTags( void )
+{
+    return *m_tags;
+}
+
+bool arlCore::Scene::dynamicBehavior( unsigned int step )
+{
+    return false;
+}
+
+unsigned int arlCore::Scene::detectionBehavior( unsigned int cam, SmartPointList::sptr , std::vector< Tag::csptr > &tags, std::map< Tag::csptr, unsigned int >& allTags )
+{
+    return 0;
+}
+
+unsigned int arlCore::Scene::detection( unsigned int camNo, unsigned int tagNo, SmartPointList::sptr spl, double gaussianNoise )
+{
+    if(m_tags->size()<tagNo || camNo>m_cameras.size() || camNo==0 ) return 0;
+    unsigned int i;
+    Point::sptr pt= Point::New(2,Point::ARLCORE_POINT_TYPE_ARTK);
+    Point::sptr pt3D = Point::New(3) ;
+    pt->setStatus(Point::ARLCORE_POINT_STATUS_DETECTED);
+    const double ColorMin=50.0;
+    const double ColorStep=(255.0-ColorMin)/(double)(m_tags->size()+2);
+    if(m_tags->getTag(tagNo)==0) return 0;
+    assert(m_tags->getTag(tagNo)!=0);
+    PointList::sptr tagPoints=m_tags->getTag(tagNo)->getGeometry();
+    vnl_rigid_matrix T;
+    // const bool Transfo = m_universe.getTrf( m_tags->getTag(tagNo)->getPlane(), m_cameras[camNo-1].getPlane(), T );
+    //T.invert();
+    for( i=0 ; i<tagPoints->size() ; ++i )
+    {
+        T.trf( (*tagPoints)[i], pt3D);
+        m_cameras[camNo-1].project3DPoint( pt3D, pt);
+        const Colour color(0,ColorMin+ColorStep*(tagNo+1),0);
+        pt->setColour(color);
+        if(gaussianNoise>0) pt->addGaussianNoise(gaussianNoise);
+        spl->push_back(pt, camNo, m_tags->getTag(tagNo) );
+    }
+    return tagPoints->size();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Scenes.cpp b/SrcLib/ARLcore/src/arlcore/Scenes.cpp
new file mode 100644
index 0000000..85ed2c9
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Scenes.cpp
@@ -0,0 +1,512 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Scenes.h>
+#include <arlcore/Point.h>
+
+#include <arlcore/Camera.h>
+#include <arlcore/Misc.h>
+#include <arlcore/SmartPointsList.h>
+#include <vnl/vnl_math.h>
+/**
+ * This scene is used for :
+ * arlCore::testRegistration3D3D
+ * arlCore::testProjectiveRegistration
+ * arlCore::testHomographyRegistration
+ * arlCore::testReconstructionPolyscopic
+ * arlCore::testEpipolarMatching
+ * arlCore::testReconstructionPolyscopicUncertainty
+ *
+ * It creates a scene with nbCamerasMax camera, specific intrinsic camera parameter defined below and nbPoints2DMax points
+ * The number of points is randomly chosen so that it is comprised between 4 and nbPoints2DMax+4. This is necessary for most
+ * of the unit test. For some test (arlCore::testReconstructionPolyscopicUncertainty), we choose to create only 1 point
+ * to avoid correlation within the statistical tests. This can be done by setting nbPoints2DMax to 1.
+ */
+arlCore::SceneUnitTest::SceneUnitTest( arlCore::PlaneSystem &universe, double worldPointsSize, unsigned int nbPoints2DMax):
+Scene(universe)
+{
+    m_Centre = arlCore::Point::New();
+    assert(m_Centre);
+
+    const unsigned int NbCamerasMax = 10;
+    const double size_rand_mire=300, size_cam=500, distance_mire_cam_min = 1000;//, WorldPointsSize=200;
+    arlCore::Point::sptr ZERO_MONDE = arlCore::Point::New();
+    ZERO_MONDE->fill(0.0);
+
+    std::vector<double> int_param, int_range;
+    int_param.push_back(1000);//fx
+    int_param.push_back(1000);//fy
+    int_param.push_back(400);//cx
+    int_param.push_back(200);//cy
+    int_param.push_back(0.0);// int_param.push_back(1.0);//with distortion
+    int_param.push_back(0.0);// int_param.push_back(1.0);//with distortion
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+
+//  int_range.push_back(200.0);
+//  int_range.push_back(200.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(100.0);
+    int_range.push_back(50.0);
+//  int_range.push_back(0.7);
+//  int_range.push_back(1.0);
+//  int_range.push_back(0.01);
+//  int_range.push_back(0.01);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+
+    arlCore::Point::sptr tirage_camera= arlCore::Point::New();
+    tirage_camera->init(1);
+    tirage_camera->set(0, 0.0);
+    tirage_camera->addUniformNoise(0,(double)NbCamerasMax);
+    tirage_camera->set(0, ( (*tirage_camera)[0]+(double)NbCamerasMax )/2 );
+
+    unsigned int nbCameras = (unsigned int)floor( (*tirage_camera)[0]);
+    if( nbCameras<2 ) nbCameras=2;
+//  std::cerr<< "nbCameras = " << nbCameras << std::endl;
+
+    // tirage du point de mire des cameras dans un cube de dimension size_rand_mire
+    m_Centre->shapeRandom(arlCore::ARLCORE_SHAPE_CUBE, size_rand_mire);
+//  m_Centre.shapeRandom(arlCore::ARLCORE_SHAPE_CUBE, 0.01);
+//  std::cerr<< "point_mire = " << m_Centre.getString() << std::endl;
+//  addCameras(2, m_Centre, 0.1, distance_mire_cam_min, int_param, int_range);
+    addCameras(nbCameras, m_Centre, size_cam, distance_mire_cam_min, int_param, int_range);
+
+
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // creation de points 3D autour du point mire
+    // point_monde = point dans un volume pour tester le recalage 3D/3D et ISPPC OSPPC et EPPC
+    // point_monde_plan = point dans le plan xOy pour tester le recalage homographique
+    // FONCTION(point_mire, nombre de points max, parametre de tirage, points tires, points tires bruites, param bruit)
+    arlCore::Point::sptr tirage_point = arlCore::Point::New(1);;
+
+    // il faut au moins 3 points pour le recalage 3D3D et 4 pour le calcul homographique
+    tirage_point->addUniformNoise(0,nbPoints2DMax/2);
+
+    unsigned int nbPoints = (unsigned int)floor( (*tirage_point)[0] + nbPoints2DMax/2 + 4);
+    if(nbPoints2DMax ==1) nbPoints = 1;
+    addTag(nbPoints, arlCore::ARLCORE_SHAPE_SPHERE, m_Centre, worldPointsSize);
+    addTag(nbPoints, arlCore::ARLCORE_SHAPE_PLAINSQUARE, ZERO_MONDE, worldPointsSize);
+}
+
+arlCore::SceneUnitTest::~SceneUnitTest()
+{}
+
+arlCore::Point::csptr arlCore::SceneUnitTest::getCentre( void ) const
+{
+    return m_Centre;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// French information that can be found in Scenes.h :
+// Creation d'une scene avec une camera regardant nbPoses mires planes differentes en nb de points (m_ChessNbPoints[i])
+// le point regarde par la camera n'est pas exactement l'origine : c'est un pt aleatoire dans un cube de 100x100x100 autour
+// de l'origine.
+// Le parametre k_range correspond a l'etendu de l'erreur que l'on souhaite sur les parametres de distortion de la
+// camera creee. Ce parametre supplementaire permet de se servir de cette scene pour testIntrinsicCalibration
+// et pour testInitIntrinsicCalibration
+// Apres-coup j'ai rajoute un parametre supplementaire a la fonction: le nbre de camera MAX. Cela permet de se
+// servir de cette scene a la fois pour le calibrage intrinseque d'une camera et le calibrage extrinseque de
+// plusieurs cameras
+// Attention le nb de pose MAX est un nbre entier tire dans [0, nbPoses_MAX] + 4
+arlCore::SceneUnitTestInitIntrinsicCalib::SceneUnitTestInitIntrinsicCalib( arlCore::PlaneSystem &universe, std::vector<double> k_range, const unsigned int nbCameras_MAX, const unsigned int nbPoses_MAX):
+Scene(universe)
+{
+    m_Centre = arlCore::Point::New();
+    assert(m_Centre);
+
+    const double ChessSize = 120;
+    arlCore::Point::sptr Origin =  arlCore::Point::New();
+    Origin->fill(0.0);
+    arlCore::Point::sptr zero_monde =  arlCore::Point::New();
+    zero_monde->fill(0.0),
+
+//  Origin.cubicRandom(100);
+    Origin->shapeRandom(ARLCORE_SHAPE_CUBE, 100);
+    m_nbPoses = (unsigned int)floor( arlRandom::Random::uniformDoubleRnd(0.0, nbPoses_MAX) + 4);//
+    unsigned int nbCameras = (unsigned int)floor( arlRandom::Random::uniformDoubleRnd(0.0, nbCameras_MAX) + 1);
+    if(nbCameras_MAX == 1) nbCameras = 1;
+
+    arlCore::Point ChessNbPoints_tmp(m_nbPoses);
+    unsigned int i,k;
+
+    //ChessNbPoints_tmp.cubicRandom(ChessSize);//ChessNbPoints[i] contient le nb de points 3D de la ieme mire
+    ChessNbPoints_tmp.shapeRandom(ARLCORE_SHAPE_CUBE, ChessSize);//ChessNbPoints[i] contient le nb de points 3D de la ieme mire
+    for( i=0 ; i< m_nbPoses; ++i )
+    {
+        m_ChessNbPoints.push_back((unsigned int)(floor(ChessNbPoints_tmp[i] + ChessSize/2+20)));
+        //std::cerr<<"ChessNbPoints ="<<m_ChessNbPoints[i] <<std::endl;
+    }
+    const double SphereRadius = 200, DistanceMin = 1000;
+    std::vector<double> int_param, int_range;
+    int_param.push_back(1000);
+    int_param.push_back(1000);
+    int_param.push_back(400);
+    int_param.push_back(200);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+
+    int_range.push_back(200.0);
+    int_range.push_back(200.0);
+    int_range.push_back(100.0);
+    int_range.push_back(50.0);
+    int_range.push_back(k_range[0]);
+    int_range.push_back(k_range[1]);
+    int_range.push_back(k_range[2]);
+    int_range.push_back(k_range[3]);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+
+    //creation d'une camera sans distortion dont on recherche les parametres pour tester initIntrinsicCalibration
+    //Elle est orientee vers le point Origin(0,0,0)
+    addCameras(nbCameras, Origin, SphereRadius, DistanceMin, int_param, int_range);
+    //creation de m_nbPoses Tags qui contiennent ChessNbPoints[k] pts3D
+    for( k=0 ; k<m_nbPoses ; ++k )
+        addTag(m_ChessNbPoints[k], arlCore::ARLCORE_SHAPE_PLAINSQUARE, zero_monde, ChessSize);
+}
+
+arlCore::SceneUnitTestInitIntrinsicCalib::~SceneUnitTestInitIntrinsicCalib()
+{}
+
+arlCore::Point::csptr arlCore::SceneUnitTestInitIntrinsicCalib::getCentre( void ) const
+{
+    return m_Centre;
+}
+const unsigned int arlCore::SceneUnitTestInitIntrinsicCalib::getNbPoses(void) const
+{
+    return m_nbPoses;
+}
+
+const unsigned int arlCore::SceneUnitTestInitIntrinsicCalib::getChessNbPoints( unsigned int i) const
+{
+    return m_ChessNbPoints[i];
+}
+
+// In randomParam you should find in the following order:
+// number of point
+// number of camera
+// angle between the camera
+// size of the shape in which the 3D points are randomly chosen
+// shape of the random 3D points
+// number of control point
+// distance between the control point center and the registration point
+// size of the shape in which the control points are randomly chosen
+// shape of the random control points
+arlCore::SceneCriterionComparison::SceneCriterionComparison( arlCore::PlaneSystem &universe, std::vector<double> parameters,
+ std::vector<double> staticStatus, std::vector<double> noiseValues, double RSB_3D, double RSB_2D ):
+Scene(universe)
+{
+    m_Centre = arlCore::Point::New();
+    assert(m_Centre);
+
+    bool calibration_endo = true;
+
+    unsigned int nbCameras, nbPoints, nbControlPoints;
+    double angleCameras, registrationPointsSize, controlPointsSize, distanceRegControlPoints;
+    const double size_rand_point_de_mire_camera=300, size_cam=500, distance_mire_cam_min = 1000;
+    arlCore::Point::sptr ZERO_MONDE = arlCore::Point::New();
+    arlCore::ARLCORE_SHAPE regPointShape, controlPointShape;
+
+    /////////////////////////////////////////////////////////////
+    // Determination of the number of point /////////////////////
+    if( parameters[0] < 3 && parameters[0] > 10000)
+    {
+        nbPoints = 4;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison nbPoints3DMax < 4 or >10000"<<std::endl;
+    }
+    else
+        if(staticStatus[0] != 0) nbPoints = (unsigned int)parameters[0];
+        else
+        {   // il faut au moins 3 points pour le recalage 3D3D et 4 pour le calcul homographique
+            nbPoints = (unsigned int)floor(arlRandom::Random::uniformDoubleRnd(4.0,  parameters[0]) );
+        }
+    std::cerr<<"Nombre de points du modele ="<<nbPoints<<std::endl;
+
+    ///////////////////////////////////////////////////////////////
+    //  Determination of the number of camera /////////////////////
+    if( parameters[1] < 2 && parameters[1] > 100)
+    {
+        nbCameras = 2;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison nbCameras < 2 or >100"<<std::endl;
+    }
+    else
+        if(staticStatus[1] != 0) nbCameras = (unsigned int)parameters[1];
+        else
+            nbCameras = (unsigned int)floor(arlRandom::Random::uniformDoubleRnd(2.0,  parameters[1]) );
+    std::cerr<<"Nombre de cameras ="<<nbCameras<<std::endl;
+
+    ////////////////////////////////////////////////////////////////////////
+    //  Determination of the angle between the cameras /////////////////////
+    if( parameters[2] < 0 && parameters[2] > 720)
+    {
+        angleCameras = 2*vnl_math::pi;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison angleCamera < 0 or >720"<<std::endl;
+    }
+    else
+        if(staticStatus[2] != 0) angleCameras = parameters[2]*vnl_math::pi/180;
+        else
+            angleCameras = 4*vnl_math::pi;//(unsigned int)floor(arlRandom::Random::uniformDoubleRnd(10.0,  parameters[2]) );
+    std::cerr<<"Angle entre les cameras ="<<angleCameras*180/vnl_math::pi<<std::endl;
+
+    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
+    //  Determination of the size of the shape in which the 3D points are randomly chosen /////////////////////
+    if( parameters[3] < 0 && parameters[3] > 1500)
+    {
+        registrationPointsSize = 500;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison registrationPointsSize < 0 or >1500"<<std::endl;
+    }
+    else
+        if(staticStatus[3] != 0) registrationPointsSize = parameters[3];
+        else
+            registrationPointsSize = (unsigned int)floor(arlRandom::Random::uniformDoubleRnd(20.0,  parameters[3]) );
+    std::cerr<<"Dimension du volume de tirage des points 3D modele ="<<registrationPointsSize<<std::endl;
+
+    /////////////////////////////////////////////////////////////////////
+    //  Determination of the shape of the 3D points /////////////////////
+    if( parameters[4] < 1 && parameters[4] > (double)ARLCORE_SHAPE_NBSHAPES)
+    {
+        regPointShape = arlCore::ARLCORE_SHAPE_SPHERE;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison regPointShape < 1 or >ARLCORE_SHAPE_NBSHAPES"<<std::endl;
+    }
+    else
+        if(staticStatus[4] != 0) regPointShape = (arlCore::ARLCORE_SHAPE)(unsigned int) parameters[4];
+        else
+            regPointShape = (arlCore::ARLCORE_SHAPE)(unsigned int)floor(arlRandom::Random::uniformDoubleRnd(1.0,  parameters[4]) );
+    std::cerr<<"Forme du volume de tirage des points 3D modele ="<<arlCore::ARLCORE_SHAPE_NAMES[(int)parameters[4]]<<std::endl;
+
+    /////////////////////////////////////////////////////////////////////
+    // Determination of the number of control point /////////////////////
+    if( parameters[5] < 0 && parameters[5] > 50)
+    {
+        nbControlPoints = 10;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison nbControlPoints < 0 or >50"<<std::endl;
+    }
+    else
+        if(staticStatus[5] != 0) nbControlPoints = (unsigned int)parameters[5];
+        else
+            nbControlPoints = (unsigned int)floor(arlRandom::Random::uniformDoubleRnd(4,  parameters[5]) );
+    std::cerr<<"Nombre de points de controle ="<<nbControlPoints<<std::endl;
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    //  Determination of the size of the shape in which the control points are randomly chosen /////////////////////
+    if( parameters[6] < 0 && parameters[6] > 1500)
+    {
+        controlPointsSize = 500;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison controlPointsSize < 0 or >1500"<<std::endl;
+    }
+    else
+        if(staticStatus[6] != 0) controlPointsSize = parameters[6];
+        else
+            controlPointsSize =  (double)floor(arlRandom::Random::uniformDoubleRnd(20,  parameters[6]) );
+    std::cerr<<"Dimension du volume de tirage des points 3D controle ="<<controlPointsSize<<std::endl;
+
+    //////////////////////////////////////////////////////////////////////////////////////////////////////
+    //  Determination of the distance between the registration and the control point /////////////////////
+    if( parameters[7] < 0 && parameters[7] > 1500)
+    {
+        distanceRegControlPoints = 500;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison distanceRegControlPoints < 0 or >1500"<<std::endl;
+    }
+    else
+        if(staticStatus[7] != 0) distanceRegControlPoints = parameters[7];
+        else
+            distanceRegControlPoints =  (double)floor(arlRandom::Random::uniformDoubleRnd(50,  parameters[7]) );
+    std::cerr<<"Distance entre les points modele et les points controle ="<<distanceRegControlPoints<<std::endl;
+
+    //////////////////////////////////////////////////////////////////////////
+    //  Determination of the shape of the control points /////////////////////
+    if( parameters[8] < 1 && parameters[8] > (double)ARLCORE_SHAPE_NBSHAPES)
+    {
+        controlPointShape = arlCore::ARLCORE_SHAPE_SPHERE;
+        std::cerr<<"In SceneCriterionComparison::SceneCriterionComparison controlPointShape < 1 or >ARLCORE_SHAPE_NBSHAPES"<<std::endl;
+    }
+    else
+        if(staticStatus[8] != 0) controlPointShape = (arlCore::ARLCORE_SHAPE)(unsigned int) parameters[8];
+        else
+            controlPointShape = (arlCore::ARLCORE_SHAPE)(unsigned int)floor(arlRandom::Random::uniformDoubleRnd(1.0,  parameters[8]) );
+    std::cerr<<"Forme du volume de tirage des points 3D controle ="<<arlCore::ARLCORE_SHAPE_NAMES[(int)parameters[8]]<<std::endl;
+
+    std::vector<double> int_param, int_range;
+    int_param.push_back(1000);
+    int_param.push_back(1000);
+    int_param.push_back(400);
+    int_param.push_back(200);
+//  int_param.push_back(1.0);
+//  int_param.push_back(1.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+
+//  int_range.push_back(200.0);
+//  int_range.push_back(200.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);//100
+    int_range.push_back(0.0);//50
+//  int_range.push_back(0.7);
+//  int_range.push_back(1.0);
+//  int_range.push_back(0.01);
+//  int_range.push_back(0.01);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+
+//  std::cerr<< "nbCameras = " << nbCameras << std::endl;
+
+    // tirage du point de mire des cameras
+    m_Centre->shapeRandom(arlCore::ARLCORE_SHAPE_CUBE, size_rand_point_de_mire_camera);
+    m_ControlCentre = m_Centre;
+    m_ControlCentre->shapeRandom(arlCore::ARLCORE_SHAPE_SPHERESURFACE, distanceRegControlPoints);
+
+    if(calibration_endo == true)
+    {
+        m_Centre = ZERO_MONDE;
+        m_ControlCentre = ZERO_MONDE;
+    }
+//  std::cerr<< "point_mire = " << m_Centre.getString() << std::endl;
+    if(staticStatus[2] != 0)
+        addCameras(nbCameras, m_Centre, size_cam, distance_mire_cam_min, int_param, int_range, angleCameras);
+    else
+        addCameras(nbCameras, m_Centre, size_cam, distance_mire_cam_min, int_param, int_range);
+
+    if(calibration_endo == true)
+    {
+        unsigned int nbEndoscopePose = 10;
+        double angleVisuEndocam = 200;
+        double distance_chessbd_endocam_min = 60;
+        double size_endocam = 50;
+        int_param[0] = 250;
+        int_param[1] = 250;
+        int_param[2] = 300;
+        int_param[3] = 150;
+        addCameras(nbEndoscopePose, m_Centre, size_endocam, distance_chessbd_endocam_min, int_param, int_range, angleVisuEndocam);
+    }
+    /////////////////////////////////////////////////////////////////////////////////////////////////
+    // creation de points 3D autour du point mire
+    // creation des points de controle
+    addTag(nbPoints, regPointShape, m_Centre, registrationPointsSize);
+    addTag(nbControlPoints, controlPointShape, m_ControlCentre, controlPointsSize);
+
+    //////////////////////////////////////////////////////////////////////////////////////////////////
+    // calcul des RSB 3D et 2D
+    arlCore::PointList::sptr regPoints     = this->getTags().getTag(0)->getGeometry();
+    std::vector< arlCore::PointList::sptr > reprojection2D(nbCameras);
+    arlCore::SmartPointList::sptr  splMonde =  arlCore::SmartPointList::New();
+    unsigned int i;
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        this->detection( i+1, 0, splMonde, 0.0 );
+        splMonde->getPoints(reprojection2D[i], i+1, this->getTags().getTag(0));
+    }
+    for( i=0 ; i<5 ; ++i )
+    std::cerr<<"Noise values ="<<noiseValues[i]<<std::endl;
+
+    double c,d, std_3D=0, std_2D=0;
+    arlCore::Point::sptr gravity_3D=arlCore::Point::New();
+    arlCore::Point::sptr a=arlCore::Point::New();
+    arlCore::Point::sptr b=arlCore::Point::New();
+    arlCore::Point::sptr gravity_2D=arlCore::Point::New(); gravity_2D->init(2);
+    regPoints->properties(gravity_3D, a, b, c, d, std_3D);
+    RSB_3D = 10*log10( (std_3D/noiseValues[0] +std_3D/noiseValues[1]+std_3D/noiseValues[2])/3 );
+    std::cerr<<"RSB 3D = "<<10*log10(std_3D/noiseValues[0] +std_3D/noiseValues[1]+std_3D/noiseValues[2])<<std::endl;
+    for( i=0 ; i<nbCameras ; ++i)
+    {
+        double std_2D_ind;
+        reprojection2D[i]->properties( gravity_2D, a, b, c, d, std_2D_ind);
+        std_2D = sqrt( std_2D*std_2D + std_2D_ind*std_2D_ind );
+        std::cerr<<"RSB 2D["<<i<<"] = "<<10*log10( (std_2D/noiseValues[3]+std_2D/noiseValues[4])/2/nbCameras )<<std::endl;
+    }
+    RSB_2D = 10*log10( (std_2D/noiseValues[3]+std_2D/noiseValues[4])/2/nbCameras );
+}
+
+arlCore::Point::csptr arlCore::SceneCriterionComparison::getCentre( void ) const
+{
+    return m_Centre;
+}
+
+arlCore::SceneCriterionComparison::~SceneCriterionComparison()
+{}
+
+// SceneAXXB
+arlCore::SceneAXXB::SceneAXXB( arlCore::PlaneSystem &universe, unsigned int NbCameras ):
+Scene(universe)
+{
+    m_Centre = arlCore::Point::New();
+    assert(m_Centre);
+
+    // Chessboard
+    const unsigned int NbPoints = 13; // Number of points by side of the square
+    const double SquareEdgeSize = 200; // mm
+    // Cameras
+    const double size_rand_mire = 300; // mm
+    const double size_cam = 500; // mm
+    const double distance_mire_cam_min = 1000; // mm
+
+    arlCore::Point::sptr ZERO_MONDE = arlCore::Point::New();
+    ZERO_MONDE->fill( 0.0 );
+
+    std::vector<double> int_param, int_range;
+    int_param.push_back(1000);//fx
+    int_param.push_back(1000);//fy
+    int_param.push_back(400);//cx
+    int_param.push_back(200);//cy
+    int_param.push_back(0.0);// int_param.push_back(1.0);//with distortion
+    int_param.push_back(0.0);// int_param.push_back(1.0);//with distortion
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+    int_param.push_back(0.0);
+
+//  int_range.push_back(200.0);
+//  int_range.push_back(200.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(100.0);
+    int_range.push_back(50.0);
+//  int_range.push_back(0.7);
+//  int_range.push_back(1.0);
+//  int_range.push_back(0.01);
+//  int_range.push_back(0.01);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+    int_range.push_back(0.0);
+
+    // tirage du point de mire des cameras dans un cube de dimension size_rand_mire
+    m_Centre->shapeRandom(arlCore::ARLCORE_SHAPE_CUBE, size_rand_mire);
+    addCameras( NbCameras, m_Centre, size_cam, distance_mire_cam_min, int_param, int_range);
+
+    arlCore::Tag::sptr tag = addTag( NbPoints, arlCore::ARLCORE_SHAPE_CHESSBOARD, ZERO_MONDE, SquareEdgeSize);
+    tag->getGeometry()->save("c:/Chess.vtk",arlCore::ARLCORE_POINT_SAVE_VTK);
+    //addTag( 150, arlCore::ARLCORE_SHAPE_PLAINSQUARE, ZERO_MONDE, SquareEdgeSize);
+}
+
+arlCore::SceneAXXB::~SceneAXXB()
+{}
+
+arlCore::Point::csptr arlCore::SceneAXXB::getCentre( void ) const
+{
+    return m_Centre;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/SmartPointsList.cpp b/SrcLib/ARLcore/src/arlcore/SmartPointsList.cpp
new file mode 100644
index 0000000..6ca0b95
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/SmartPointsList.cpp
@@ -0,0 +1,526 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/SmartPointsList.h>
+
+#include <fstream>
+#include <iomanip>
+#include <algorithm>
+
+#include <arlcore/PointsList.h>
+#include <arlcore/Misc.h>
+
+arlCore::SmartPointList::SmartPointList( void )
+{   // First is always an empty list
+    m_listOfLists.resize(1);
+}
+
+arlCore::SmartPointList::SmartPointList(SmartPointList::csptr  p)
+{
+        copy(p);
+}
+
+arlCore::SmartPointList& arlCore::SmartPointList::operator=(SmartPointList::csptr  p)
+{
+    copy(p);
+    return *this;
+}
+
+void arlCore::SmartPointList::copy(SmartPointList::csptr  p)
+{
+    if(this==p.get()) return;
+    assert(false); //VAG FIXME
+//  arlCore::Object *a=this;
+//  const arlCore::Object *b=&p;
+//  *a = *b;
+    clear();
+    // TODO : Fill this with p
+//      std::vector< std::vector< Point::csptr > > m_listOfLists;
+//      std::map< double, std::vector< Point::csptr > > m_mapOfLists;
+//      std::vector< std::vector< Point::csptr > > m_listsByCam
+}
+
+arlCore::SmartPointList::~SmartPointList( void )
+{
+    clear();
+}
+
+bool arlCore::SmartPointList::integrity( void ) const
+{
+    bool b=true;
+    b &= (m_listOfLists.size()==(m_mapOfLists.size()+1));
+    if(m_mapOfLists.size()>0) b &= (m_listsByCam.size()>0);
+    return b;
+}
+
+std::string arlCore::SmartPointList::getString( void ) const
+{
+    std::stringstream s;
+    unsigned int i,j;
+    for( i=0 ; i<m_listsByCam.size() ; ++i )
+    {
+        s<<"* Cam "<<i<<"\n";
+        for( j=0 ; j<m_listsByCam[i].size() ; ++j )
+        {
+            s<<m_listsByCam[i][j]->getString();
+        }
+    }
+    s<<"\n";
+    return s.str();
+}
+
+bool arlCore::SmartPointList::save( const std::string &fileName, bool overwrite ) const
+{
+    std::fstream file;
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    file.open(fileName.c_str(), std::fstream::out);
+    if(!file.is_open()) return false;
+    file<<"FileType SmartPointList\n";
+    file<<"Version 1.0\n";
+    unsigned int cam, i, n=0;
+    SPTR(void) tag;
+    int fringe;
+    std::map<double, unsigned int, mapOrder>::const_iterator it;
+    it = m_mapOfLists.begin();
+    while(it!=m_mapOfLists.end())
+    {
+        double key = (*it).first;
+        unhash(key, cam, tag, fringe);
+        unsigned int index = (*it).second;
+        for( i=0 ; i<m_listOfLists[index].size() ; ++i )
+            if(m_listOfLists[index][i]!=0)
+                if(m_listOfLists[index][i]->isOK())
+                    m_listOfLists[index][i]->save( file, cam, tag, fringe );
+        ++it, ++n;
+    }
+    assert(m_listOfLists.size()==n+1);
+    file.close();
+    return true;
+}
+bool arlCore::SmartPointList::load( const std::string &fileName )
+{
+    if(fileName=="") return false;
+    std::ifstream file;
+    file.open (fileName.c_str(), std::fstream::in);
+    if(!file.is_open())
+    {
+        std::cerr<<"SmartPointList Loading error : "<<fileName<<"\n";
+        return false;
+    }
+    unsigned int n=0;
+    std::string token,text;
+    double version;
+    clear();
+//  Object::update(); // TODO Optimize its position
+    Point::sptr p= Point::New();
+    do
+    {   // Reading header
+        file>>token;
+        if(token=="FileType")
+        {
+            file>>text;
+            if(text!="SmartPointList") return false;
+            n=(n|1);
+        }
+        if(token=="Version") {file>>version; n=(n|2);}
+        if(file.eof())
+        {
+            std::cerr<<"SmartPointList Loading Header error : "<<fileName<<"\n";
+            return false;
+        }
+    } while(n!=3);
+    bool b;
+    do
+    {
+        unsigned int cam;
+        SPTR(void) tag;
+        int fringe;
+        b=p->load(file, cam, tag, fringe);
+        if(b) push_back(p, cam, tag, fringe);
+    }while(b);
+    file.close();
+    return true;
+}
+unsigned int arlCore::SmartPointList::findNearPoint(double x, double y, unsigned int cam, std::vector< Point::csptr > &found, double &distance, double radius) const
+{
+    found.clear();
+    if(m_listsByCam.size()<cam) return 0;
+    Point::sptr pt = Point::New(x,y);
+    unsigned int i, n;
+    std::vector<unsigned int> pos;
+    n=arlCore::findNearPoint(m_listsByCam[cam-1], pt, pos, distance, radius);
+    for( i=0 ; i<pos.size() ; ++i )
+        found.push_back( m_listsByCam[cam-1][pos[i]] );
+    return (unsigned int)found.size();
+}
+/*
+const arlCore::Point* arlCore::SmartPointList::findNearPoint(const  arlCore::Point::sptr pt, double &distance) const
+{
+    if(m_listsByCam.size()<1) return 0;
+    const arlCore::Point* r=0;
+    double dist;
+    unsigned int pos;
+    if(arlCore::findNearPoint(m_listsByCam[0], pt, pos, dist))
+    {
+        r=m_listsByCam[0][pos];
+        distance=dist;
+    }
+    unsigned int i;
+    for( i=1 ; i<m_listsByCam.size() ; ++i )
+    {
+        if(arlCore::findNearPoint(m_listsByCam[i], pt, pos, dist))
+            if(r==0)
+            {
+                r=m_listsByCam[i][pos];
+                distance=dist;
+            }else
+            {
+                if(dist<distance)
+                {
+                    r=m_listsByCam[i][pos];
+                    distance=dist;
+                }
+            }
+    }
+    return 0;
+}*/
+
+arlCore::Point::csptr arlCore::SmartPointList::push_back( arlCore::Point::csptr pt, unsigned int cam, SPTR(void) tag, int fringe )
+{
+    if(cam<1) return arlCore::Point::csptr();
+    arlCore::Point::csptr p= Point::New(pt);
+    privateGetList(cam).push_back(p);
+    if(tag!=0)
+    {
+        privateGetList(cam,tag).push_back(p);
+        if(fringe!=0) privateGetList(cam,tag,fringe).push_back(p);
+    }
+    return p;
+}
+
+unsigned int arlCore::SmartPointList::push_back( const std::vector< arlCore::Point::csptr >& ptList, unsigned int cam, SPTR(void) tag, int fringe )
+{
+    unsigned int i, n = 0;
+    if(cam<1) return n;
+    std::vector< arlCore::Point::csptr >& camList = privateGetList(cam);
+    std::vector< arlCore::Point::csptr >& tagList = privateGetList(cam, tag);
+    std::vector< arlCore::Point::csptr >& frgList = privateGetList(cam, tag, fringe);
+    for( i=0 ; i<ptList.size() ; ++i )
+    {
+        if(ptList[i]!=0)
+        {
+            arlCore::Point::csptr p=  ptList[i] ;
+            ++n;
+            camList.push_back(p);
+            if(tag)
+            {
+                tagList.push_back(p);
+                if(fringe!=0) frgList.push_back(p);
+            }
+        }
+    }
+    return n;
+}
+
+bool arlCore::SmartPointList::addPoint( arlCore::Point::csptr pt, unsigned int cam, SPTR(void) tag, unsigned int tagNo )
+{
+    if(cam<1 || tag==0) return false;
+    unsigned int i;
+    std::vector< arlCore::Point::csptr > &pointList = privateGetList( cam, tag );
+    for( i=(unsigned int)pointList.size() ; i<tagNo+1 ; ++i )
+        pointList.push_back( arlCore::Point::sptr() );
+    if(pointList[tagNo]==0)
+    {
+        arlCore::Point::sptr p= Point::New(pt);
+        privateGetList(cam).push_back(p);
+        pointList[tagNo]=p;
+    } else arlCore::Point::constCast( pointList[tagNo])->copy(pt);
+    return true;
+}
+
+const double MaxFringes=100.0, MaxCams=10.0, HalfMaxFringes=MaxFringes/2.0;
+
+double arlCore::SmartPointList::hash( unsigned int cam, SPTR(void) tag, int fringe ) const
+{
+    long int p=(long int)tag.get();
+    double key=(double)p*MaxCams*MaxFringes+(HalfMaxFringes+(double)fringe)*MaxCams+(double)cam;
+    unsigned int c;
+    SPTR(void) t;
+    int f;
+    assert(unhash( key, c, t, f ));
+    // VAG FIXME assert(cam==c && tag.get()==t.get() && fringe==f);
+    // FIXME Test only in Debug mode
+    unhash( key, c, t, f );
+
+    //VAG if(cam!=c || tag.get()!=t.get() || fringe!=f)
+    //VAG    std::cout<<"*****UNHASH ERROR***** "<<cam<<","<<tag.get()<<","<<fringe<<" => "<<c<<","<<t<<","<<f<<" ****************\n";
+    return key;
+}
+
+bool arlCore::SmartPointList::unhash( double key, unsigned int &cam, SPTR(void) tag, int &fringe ) const
+{
+    long int t = (long int)(key/(MaxCams*MaxFringes));
+    //tag = (SPTR(void))t; VAG necessary ???? FIXME
+    key = key-t*MaxCams*MaxFringes;
+    int f = (int)(key/MaxCams);
+    fringe = f-(int)HalfMaxFringes;
+    cam = (int)key-f*(int)MaxCams;
+    return true;
+}
+
+std::vector< arlCore::Point::csptr >& arlCore::SmartPointList::privateGetList( unsigned int cam, SPTR(void) tag, int fringe )
+{
+    if(tag==0 && fringe==0)
+    {
+        assert(cam>0);
+        if(cam>m_listsByCam.size()) m_listsByCam.resize(cam);
+        assert(cam<=m_listsByCam.size());
+        //unsigned int n = (unsigned int)m_listsByCam[cam-1].size();
+        return m_listsByCam[cam-1];
+    }
+    unsigned int n;
+    double key = hash(cam, tag, fringe);
+    std::map< double, unsigned int, mapOrder >::iterator it;
+    it = m_mapOfLists.find(key);
+    if(it==m_mapOfLists.end())
+    {
+        n=(unsigned int)m_listOfLists.size();
+        m_listOfLists.resize(n+1);
+        m_mapOfLists[key]=n;
+    } else n=it->second;
+    assert(n<m_listOfLists.size());
+    return m_listOfLists[n];
+}
+
+const std::vector< arlCore::Point::csptr >& arlCore::SmartPointList::getList( unsigned int cam, SPTR(void) tag, int fringe ) const
+{
+    if(tag==0 && fringe==0 && cam>0 && cam <=m_listsByCam.size()) return m_listsByCam[cam-1];
+    std::map< double, unsigned int, mapOrder >::const_iterator it;
+    it = m_mapOfLists.find(hash(cam, tag, fringe));
+    if(it!=m_mapOfLists.end()) return m_listOfLists[it->second];
+    return m_listOfLists[0]; // Empty list
+}
+
+unsigned int arlCore::SmartPointList::getPointByCam( std::vector<arlCore::Point::csptr>&pl, const std::vector<arlCore::Camera> &cameras, SPTR(void) tag, unsigned int no, std::vector< bool >&whichCams ) const
+{
+    std::vector<const arlCore::Camera*> cams;
+    unsigned int i;
+    for( i=0 ; i<cameras.size() ; ++i )
+        cams.push_back(&cameras[i]);
+    return getPointByCam( pl, cams, tag, no, whichCams );
+}
+
+unsigned int arlCore::SmartPointList::getPointByCam( std::vector<arlCore::Point::csptr>&pl, const std::vector<const arlCore::Camera*> &cams, SPTR(void) tag, unsigned int no, std::vector< bool >&whichCams ) const
+{
+    pl.clear();
+    whichCams.resize(cams.size());
+    unsigned int cam;
+    for( cam=0 ; cam<whichCams.size() ; ++cam )
+    {
+        whichCams[cam]=false;
+        if(cams[cam]->isIntrinsicCalibrated())
+        {
+            const std::vector< arlCore::Point::csptr > &l=getList(cam+1,tag);
+            if(no<l.size())
+                if(l[no]!=0)
+                    if(l[no]->isVisible())
+                    {
+                        whichCams[cam]=true;
+                        pl.push_back( l[no] );
+                    }
+        }
+    }
+    return (unsigned int)pl.size();
+}
+
+bool arlCore::SmartPointList::getPoint( arlCore::Point::csptr &p, unsigned int cam, SPTR(void) t, unsigned int tagNo ) const
+{
+    if(cam<=0) return false;
+    const std::vector< arlCore::Point::csptr > &l=getList(cam,t);
+    if(tagNo>=l.size()) return false;
+    p=l[tagNo];
+    return p!=0;
+}
+
+unsigned int arlCore::SmartPointList::getPoints( std::vector< arlCore::Point::csptr >&pl, unsigned int cam, SPTR(void) t ) const
+{
+    pl.clear();
+    if(cam<=0) return 0;
+    const std::vector< arlCore::Point::csptr > &l=getList(cam,t);
+    unsigned int i;
+    for( i=0 ; i<l.size() ; ++i )
+        pl.push_back( l[i] );
+    return (unsigned int)pl.size();
+}
+
+unsigned int arlCore::SmartPointList::getPoints( arlCore::PointList::sptr pl, unsigned int cam, SPTR(void) t ) const
+{
+    pl->clear();
+    if(cam<=0) return 0;
+    const std::vector< arlCore::Point::csptr > &l=getList(cam,t);
+    unsigned int i;
+    for( i=0 ; i<l.size() ; ++i )
+        pl->push_back( l[i] );
+    return pl->size();
+}
+
+unsigned int arlCore::SmartPointList::getInvisiblePoints( std::vector< arlCore::Point::csptr >&pl, unsigned int cam, SPTR(void) t ) const
+{
+    pl.clear();
+    if(cam<=0) return 0;
+    const std::vector< arlCore::Point::csptr > &l=getList(cam,t);
+    unsigned int i;
+    for( i=0 ; i<l.size() ; ++i )
+        if(l[i]!=0)
+            if(!l[i]->isVisible())
+                pl.push_back(  l[i] );
+    return (unsigned int)pl.size();
+}
+
+bool arlCore::SmartPointList::clear( void )
+{
+    m_listsByCam.clear();
+    m_mapOfLists.clear();
+    m_listOfLists.clear();
+    m_listOfLists.resize(1);
+    return true;
+}
+
+unsigned int arlCore::SmartPointList::size( unsigned int cam, SPTR(void) tag, int fringe ) const
+{
+    return (unsigned int)getList( cam, tag, fringe ).size();
+}
+
+unsigned int arlCore::epipolarMatching( const std::vector<Camera>& cameras, SmartPointList::csptr spl, std::vector< std::vector<arlCore::Point::csptr> >&matching, double gaussianNoise )
+{
+    unsigned int nbCameras = (unsigned int)cameras.size();
+    if(nbCameras<2) return 0;
+    if(nbCameras>2) nbCameras=2;
+    // Bruit minimum lié aux incertitudes sur le calcul
+    const double NumericNoise = 1e-3;
+    // On retient que les points a une distance de la droite epipolaire < 'DistPixMax'
+    // Cette valeur est fonction du bruit estimé sur les points 2D
+    const double DistPixMax = 2*gaussianNoise+NumericNoise;
+    //const double DistPixMax = sqrt(2*gaussianNoise*gaussianNoise)+NumericNoise;
+    // Le second plus proche doit imperativement etre à plus de DistPixMin de la droite epipolaire
+    // Les voisins doivent être à l'extérieur de la zone d'incertitude
+    const double DistPixMin = DistPixMax;
+
+    // Elagage des points trop eloignes de la droite epipolaire
+    // Actuellement inutile car l'algo actuel prend en compte le premier et le second
+
+    // On retient que les 'Best'*100% points les plus proches de la droite epipolaire
+    // Garde au minimum les BestMin premiers quelque soit le pourcentage
+
+    // Cas avec 2 cameras - TODO : avec n cameras
+    // distanceTab[no point de la cam0][no point de la cam 1]
+    // vnl_vector_fixed<double,4> ={
+    // distance point cam1 a droite du point cam0 ,
+    // distance du second plus proche dans la cam1,
+    // distance point cam0 a droite du point cam1,
+    // distance du second plus proche dans la cam0
+    std::vector< std::vector< vnl_vector_fixed<double,4> > > distanceTab;
+    const vnl_vector_fixed<double,4> InitVector(DBL_MAX);
+
+    unsigned int i,j,k,l,n;
+    Point::sptr point3D = Point::New(3);
+    // Passage dans le plan de la focale
+    const bool PerfectDisto = true;
+    std::vector< PointList > focalPlanePoints(cameras.size());
+    std::vector< std::vector<arlCore::Point::csptr> >pixelPoints(cameras.size());
+    for( i=0 ; i<nbCameras ; ++i )
+    {
+        n = spl->getPoints( pixelPoints[i], i+1 );
+        // Cas avec 2 cameras - TODO : avec n cameras
+        if(i==0) distanceTab.resize(n);
+        if(i==1)
+            for( j=0 ; j<distanceTab.size() ; ++j )
+            {
+                distanceTab[j].resize(n);
+                for( k=0 ; k<n ; ++k )
+                    distanceTab[j][k]=InitVector;
+            }
+        for( j=0 ; j<n ; ++j )
+        {
+            arlCore::Point::constCast( pixelPoints[i][j] )->setScalar(-1); // Numero appariement pour visu
+            if(cameras[i].pixelPlaneToUnitFocalPlane(  pixelPoints[i][j] , point3D, PerfectDisto ))
+                focalPlanePoints[i].push_back(point3D);
+        }
+    }
+    // Calcul des droites epipolaires et des distances
+    // Constitution du graphe des appariements potentiels
+    double distance;
+    for( i=0 ; i<nbCameras ; ++i )
+        for( j=0 ; j<nbCameras ; ++j )
+            if(i!=j /*&& cameras[i]!=0 && cameras[j]!=0*/ )
+            {
+                vnl_matrix_fixed<double,4,4> PMi_j = cameras[j].getExtrinsic() * cameras[i].getInvExtrinsic();
+                for( k=0 ; k<focalPlanePoints[i].size() ; ++k )
+                {
+                    if(focalPlanePoints[j].size()>0)
+                    {
+                        std::vector< std::pair<double,unsigned int> > distances(focalPlanePoints[j].size());
+                        for( l=0 ; l<focalPlanePoints[j].size() ; ++l )
+                        {
+                            double a,b,c;
+                            if(getEpipolar( focalPlanePoints[i][k] , PMi_j, a, b, c))
+                            {
+                                distance = (a * focalPlanePoints[j][l]->x() + b * focalPlanePoints[j][l]->y() + c) / sqrt(a*a +b*b);
+                                distance = sqrt(distance*distance)*cameras[j].getfx();
+                                distances[l]=std::make_pair(distance,l);
+                            }else distances[l]=std::make_pair(DBL_MAX,l);
+                        }
+                        std::sort( distances.begin(), distances.end() );
+                        // On retient les Best*100% meilleurs points
+/*                      for( l=0 ; l<distances.size() ; ++l )
+                            if(l+1>BestMin && (l+1)/distances.size()>Best)
+                                distances[l].first = DBL_MAX;
+*/                      // Cas avec 2 cameras - TODO : avec n cameras
+                        if(i<2 && j<2)
+                        {
+                            unsigned int cam0,cam1,index;
+                            if(i==0) {cam0=k; cam1=distances[0].second; index=0;}
+                            if(i==1) {cam1=k; cam0=distances[0].second; index=2;}
+                            distanceTab[cam0][cam1](index)=distances[0].first;
+                            if(distances.size()>1)
+                                distanceTab[cam0][cam1](index+1)=distances[1].first;
+                            else distanceTab[cam0][cam1](index+1)=DBL_MAX;
+                            // Creer un arc de pixelPoints[i][k] vers pixelPoints[j][distance[l].second]
+                            // avec comme poids distance[l].first
+                        }
+                    }
+                }
+            }
+    // Elimination pour chaque point de chaque camera des liens multiples vers une autre meme camera
+    // Elimination prioritaire des points ayant le moins bon score
+    matching.clear();
+    for( i=0 ; i<distanceTab.size() ; ++i )
+    {   // Appariement Point i de la camera 0
+        double maxSecondDistance = 0; // Indice de confiance
+        int chosenPoint = -1;
+        for( j=0 ; j<distanceTab[i].size() ; ++j )
+        {
+            double minDistofsecond, meanDistToLine = (distanceTab[i][j](0)+distanceTab[i][j](2))/2;
+            if(distanceTab[i][j](1) < distanceTab[i][j](3))
+                minDistofsecond = distanceTab[i][j](1);
+            else minDistofsecond = distanceTab[i][j](3);
+            if(meanDistToLine<=DistPixMax)
+                if(minDistofsecond>DistPixMin && minDistofsecond>maxSecondDistance)
+                {
+                    maxSecondDistance=minDistofsecond;
+                    chosenPoint = j;
+                }
+        }
+        if(chosenPoint>=0)
+        {
+            matching.resize(matching.size()+1);
+            matching.back().push_back(pixelPoints[0][i]);
+            matching.back().push_back(pixelPoints[1][chosenPoint]);
+        }
+    }
+    // TODO Trier matching en fonction de la confiance : Les plus surs en premiers.
+    return (unsigned int)matching.size();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Tag.cpp b/SrcLib/ARLcore/src/arlcore/Tag.cpp
new file mode 100644
index 0000000..a70b6f1
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Tag.cpp
@@ -0,0 +1,167 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Tag.h>
+
+#include <arlcore/PlaneSystem.h>
+
+arlCore::Tag::Tag( arlCore::PlaneSystem &universe, const std::string &name ):
+Particle( universe, name ),
+Parameters("Tag"),
+m_geometry( PointList::New() ),
+m_measures( PointList::New() ),
+m_measuresPlane( 0 ),
+m_registrationType( ARLCORE_TAG_REGISTRATION_UNKNOWN ),
+m_registrationMaxError(-1.0),
+m_persistence(-1)
+{
+    init();
+}
+
+arlCore::Tag::Tag( PlaneSystem &universe, PointList::csptr pl ):
+//VAG Object(arlCore::ARLCORE_CLASS_TAG, "Points cloud"),
+Particle( universe, "Points cloud" ),
+Parameters("Tag"),
+m_geometry( PointList::New() ),
+m_measures( PointList::New() ),
+m_measuresPlane( 0 ),
+m_registrationType( ARLCORE_TAG_REGISTRATION_3D3D ),
+m_registrationMaxError(-1.0),
+m_persistence(-1)
+{
+    init();
+    arlCore::Point::sptr p0 = arlCore::Point::New(0.0, 0.0, 0.0);
+    p0->setVisible(false);
+    unsigned int i;
+    for(i=0 ; i<pl->size() ; ++i)
+    {
+        m_geometry->push_back( (*pl)[i] );
+        m_measures->push_back(p0);
+    }
+    getPlaneSystem().setPlaneName(getPlane(), Object::getName());
+    //VAG FIXME setOK();
+}
+
+
+
+
+
+arlCore::Tag::sptr arlCore::Tag::TagFactory( arlCore::PlaneSystem &universe, const std::string &name)
+{
+    return arlCore::Tag::sptr(  new Tag(universe, name)  );
+}
+arlCore::Tag::sptr arlCore::Tag::TagFactory( arlCore::PlaneSystem &universe, arlCore::PointList::csptr pl )
+{
+    return arlCore::Tag::sptr( new Tag(universe,pl)  );
+}
+
+
+bool arlCore::Tag::init( void )
+{
+    Parameters::init( ARLCORE_TAGPARAMETERS_NAMES, ARLCORE_TAGPARAMETERS_DEFAULTS, ARLCORE_TAG_NBPARAMETERS );
+    return true;
+}
+
+arlCore::Tag::~Tag( void )
+{}
+
+std::string arlCore::Tag::getString( void ) const
+{
+    std::stringstream s;
+    //VAG FIXMEs<<this->Object::getString();
+    //VAG FIXMEs<<this->Particle::getString();
+    if(m_registrationMaxError<0)
+        s<<"No registration max error\n";
+    else s<<"Registration max error = "<<m_registrationMaxError<<"\n";
+    s<<"Measures plane "<<m_measuresPlane<<"\n";
+    return s.str();
+}
+
+unsigned int arlCore::Tag::getMeasuresPlane() const
+{
+    return m_measuresPlane;
+}
+
+unsigned int arlCore::Tag::getNbPoints() const
+{
+    return m_geometry->size();
+}
+
+arlCore::PointList::csptr  arlCore::Tag::getGeometry() const
+{
+    return m_geometry;
+}
+
+arlCore::PointList::sptr arlCore::Tag::getGeometry()
+{
+    return m_geometry;
+}
+
+arlCore::PointList::csptr  arlCore::Tag::getMeasures() const
+{
+    return m_measures;
+}
+
+arlCore::PointList::sptr arlCore::Tag::getMeasures()
+{
+    return m_measures;
+}
+
+arlCore::Tag::ARLCORE_TAG_REGISTRATION_TYPE arlCore::Tag::getRegistrationType( void )
+{
+    return m_registrationType;
+}
+
+double arlCore::Tag::getRegistrationMaxError( void )
+{
+    return m_registrationMaxError;
+}
+
+void arlCore::Tag::setRegistrationMaxError( double error )
+{
+    m_registrationMaxError=error;
+}
+
+void arlCore::Tag::reset( void )
+{
+    m_measuresPlane=0;
+    m_measures->clear();
+}
+
+bool arlCore::Tag::setRegistration( unsigned int plane, arlCore::vnl_rigid_matrix &T, long int date, long int time, bool reset )
+{
+    //VAG FIXME setTime(date,time);
+    //std::vector<double> errors;
+    //T.RMS3D3D( m_geometry, m_measures, errors);
+    const double Error = T.getRMS();
+    if(m_registrationMaxError>=0 && Error>m_registrationMaxError)
+    {
+        m_measuresPlane = arlCore::PlaneSystem::NoPlane;
+        getPlaneSystem().resetTrf( getPlane(), plane );
+        //VAG FIXME  m_log<<"REGISTRATION FAILED : RMS="<<Error<<" > RMSMax="<<m_registrationMaxError<<"\n";
+        //VAG FIXME  log(ARLCORE_LOG_WARNING);
+        return false;
+    }
+    if(reset) this->reset();
+    unsigned int i;
+    for( i=0 ; i<m_geometry->size() ; ++i )
+    {
+        if(i>=m_measures->size())
+        {
+            m_measures->push_back( (*m_geometry)[i]);
+            (*m_measures)[i]->setVisible(false);
+        }
+        if(!(*m_measures)[i]->isVisible())
+        {
+            assert(m_measures->size()>=i);
+            T.trf( (*m_geometry)[i],(*m_measures)[i]);
+            (*m_measures)[i]->setVisible(true);
+        }
+    }
+    bool b = getPlaneSystem().setTrf( getPlane(), plane, T, date,time );
+    if(b) m_measuresPlane=plane;
+    return b;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Tags.cpp b/SrcLib/ARLcore/src/arlcore/Tags.cpp
new file mode 100644
index 0000000..e180674
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Tags.cpp
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Tags.h>
+
+#include <arlcore/Misc.h>
+
+//const long int ARLCORE_TAG_RANGES[2]={1000,100000};
+//const unsigned int MAXNBMARKERS=10;
+
+arlCore::Tags::Tags( arlCore::PlaneSystem &universe, const std::string &name ):
+m_universe(universe)
+{
+    setName(name);
+    //VAG FIXME setOK(true);
+}
+
+//arlCore::Tags::Tags( const Tags& t ):
+//Object(t),
+//m_universe(t.m_universe)
+//{
+//    copy(t);
+//}
+
+
+arlCore::Tags::sptr arlCore::Tags::TagsFactory( arlCore::PlaneSystem &universe, const std::string &name)
+{
+    return arlCore::Tags::sptr( new Tags(universe, name ) );
+}
+
+
+//VAG
+//arlCore::Tags& arlCore::Tags::operator=( const Tags& t )
+//{
+//    copy(t);
+//    return *this;
+//}
+
+arlCore::Tags::~Tags( void )
+{
+    reset();
+}
+
+bool arlCore::Tags::reset( void )
+{
+    unsigned int i;
+    for( i=0 ; i<m_tags.size() ; ++i )
+    {
+        assert(m_tags[i]!=0);
+    }
+    m_tags.clear();
+    return true;
+}
+
+bool arlCore::Tags::copy(  Tags::csptr t )
+{
+    //VAG FIXME
+    assert(false);
+    /* VAG
+    if(this==t.get()) return false;
+    reset();
+    arlCore::Object *a=this;
+    const arlCore::Object *b=&t;
+    *a = *b;
+    unsigned int i;
+    for( i=0 ; i<t.m_tags.size() ; ++i )
+        m_tags.push_back(new arlCore::Tag(*t.m_tags[i]));
+    */
+    return true;
+}
+
+unsigned int arlCore::Tags::size( void ) const
+{
+    return (unsigned int)m_tags.size();
+}
+
+std::string arlCore::Tags::getString( void ) const
+{
+    std::stringstream s;
+    unsigned int i;
+    // s<<this->Object::getString();
+    for( i=0 ; i<m_tags.size() ; ++i )
+        s<<m_tags[i]->getString();
+    return s.str();
+}
+
+bool arlCore::Tags::load( const std::string &fileName )
+{
+    if(fileName=="") return false;
+    return false;
+}
+
+bool arlCore::Tags::save( const std::string &fileName, bool overwrite ) const
+{
+    if(arlFile::fileExist(fileName) && !overwrite) return false;
+    // TODO
+    return false;
+}
+
+arlCore::Tag::csptr arlCore::Tags::getTag( unsigned int index ) const
+{
+    assert(index>=0 && index<m_tags.size());
+    if(index<0 || index>=m_tags.size()) return arlCore::Tag::sptr();
+    else return m_tags[index];
+}
+
+arlCore::Tag::sptr arlCore::Tags::getTag( unsigned int index )
+{
+    assert(index>=0 && index<m_tags.size());
+    if(index<0 || index>=m_tags.size()) return arlCore::Tag::sptr();
+    else return m_tags[index];
+}
+
+bool arlCore::Tags::delTag( arlCore::Tag::csptr T )
+{
+    if(T==0) return false;
+    std::vector< arlCore::Tag::sptr >::iterator it=m_tags.begin();
+    while( it!=m_tags.end() )
+        if(*it==T)
+        {
+            m_tags.erase(it);
+            return true;
+        }else ++it;
+    return false;
+}
+
+/*arlCore::Tag::csptr arlCore::Tags::addTag( const std::string &fileName )
+{
+    arlCore::Tag::sptr T=new arlCore::Tag(m_universe, fileName);
+    if(addTag(T)==0)
+    {
+        delete T;
+        m_log<<"Loading Tag \""<<fileName<<" failed";
+        log(ARL_LOG_WARNING);
+        return 0;
+    }
+    m_log<<"Tag \""<<fileName<<" is loaded";
+    log(ARL_LOG_INFO);
+    return T;
+}*/
+
+arlCore::Tag::sptr arlCore::Tags::addTag( arlCore::PointList::csptr pl )
+{
+    arlCore::Tag::sptr T= arlCore::Tag::New(m_universe, pl);
+    if(addTag(T)==0)
+    {
+        return arlCore::Tag::sptr();
+    }
+    return T;
+}
+
+arlCore::Tag::csptr arlCore::Tags::addTag( arlCore::Tag::sptr T )
+{
+    bool b=(T!=0);
+    // if(b) b=T->isOK(); VAG FIXME
+    if(!b) return arlCore::Tag::csptr();
+    m_tags.push_back(T);
+    return T;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/Tracker.cpp b/SrcLib/ARLcore/src/arlcore/Tracker.cpp
new file mode 100644
index 0000000..8e8520d
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/Tracker.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/Tracker.h>
+
+arlCore::Tracker::Tracker( const std::string &name ):
+Object(arlCore::ARLCORE_CLASS_TRACKER, name)
+{}
+
+arlCore::Tracker::~Tracker( void )
+{}
+
+std::string arlCore::Tracker::getString( void ) const
+{
+    std::stringstream s;
+    s<<this->Object::getString();
+    return s.str();
+}
diff --git a/SrcLib/ARLcore/src/arlcore/UncertaintyPropag.cpp b/SrcLib/ARLcore/src/arlcore/UncertaintyPropag.cpp
new file mode 100644
index 0000000..90d7924
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/UncertaintyPropag.cpp
@@ -0,0 +1,643 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/UncertaintyPropag.h>
+#include <stdlib.h>
+
+#include <stdlib.h>
+#include <cstdio>
+
+#include <vnl/algo/vnl_matrix_inverse.h>
+#include <vnl/vnl_transpose.h>
+
+#include <arlcore/Point.h>
+#include <arlcore/Misc.h>
+#include <arlcore/vnl_covariance_matrix.h>
+
+bool arlCore::propagateCovarianceToReconst3D( const std::vector<arlCore::Point::csptr>&list2D, const std::vector<const arlCore::Camera*> &camsList,
+     arlCore::Point::sptr point3D, arlCore::ARLCORE_RECONSTRUCTION3D methode, std::vector<double> &log, const bool pixelFrame)
+{
+    unsigned int i, l, perfect_reproj2D_nb=0;;
+    if(methode == arlCore::ARLCORE_R3D_TWO_LINES_PERFECT || methode == arlCore::ARLCORE_R3D_MULTI_LINES_APPROX || methode == arlCore::ARLCORE_R3D_MULTI_LINES_PERFECT)
+    {
+        const bool verbose=false;
+        if(verbose){std::cerr<<"point3D cov matrix= \n"<< point3D->getCovMatrix() <<std::endl;}
+
+        for(l=0;l<camsList.size();++l)
+            if( list2D[l]->getCovMatrix().is_zero() )
+                perfect_reproj2D_nb++;
+
+        if(perfect_reproj2D_nb > 1)// it means that 2 lines are perfect, then the cov matrix is zero
+        {
+            arlCore::vnl_covariance_matrix &cov_mat = point3D->getCovMatrix();
+            for(i=0;i<3;++i)
+                for(l=0;l<3;++l)
+                    cov_mat.put(i,l,0.0);// = Sigma_Point_Rec;
+            return true;
+        }
+
+        arlCore::vnl_covariance_matrix &cov_mat = point3D->getCovMatrix();
+        for(i=0;i<3;++i)
+            for(l=0;l<3;++l)
+                cov_mat.put(i,l,0.0);// = Sigma_Point_Rec;
+        return true;
+    }
+    if(methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION || methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY)
+    {
+        for(l=0;l<camsList.size();++l)
+            if( list2D[l]->getCovMatrix().is_zero() )
+                perfect_reproj2D_nb++;
+
+        if(perfect_reproj2D_nb > 1)// it means that 2 lines are perfect, then the cov matrix is zero
+        {
+            arlCore::vnl_covariance_matrix &cov_mat = point3D->getCovMatrix();
+            for(i=0;i<3;++i)
+                for(l=0;l<3;++l)
+                    cov_mat.put(i,l,0.0);// = Sigma_Point_Rec;
+            return true;
+        }
+    const bool verbose = false;
+    std::vector< vnl_matrix_fixed<double,2,3> > dml_dM(camsList.size());
+    std::vector< vnl_matrix_fixed<double,3,2> > dPhi_dml(camsList.size());
+    vnl_matrix_fixed<double,3,3> H, Hinv, Gamma, Sigma_Point_Rec;
+    H.fill(0.0);
+    Gamma.fill(0.0);
+
+    vnl_matrix_fixed<double,1,3> mat_Cint;
+    vnl_matrix_fixed<double,2,1> tmp_mat_2_1;
+    vnl_matrix_fixed<double,1,2> tilde_mi_sous_mi;
+    arlCore::Point::sptr tmp_arl_pt = arlCore::Point::New(3);
+    arlCore::Point::sptr p2D_undistorted = arlCore::Point::New(2);
+    double inner_product_Cl_Pil_M;
+
+    for(l=0;l<camsList.size();++l)
+    {
+        camsList[l]->undistort2DPoint( list2D[l], p2D_undistorted);
+        camsList[l]->getExtrinsic().trf(point3D,tmp_arl_pt);
+        inner_product_Cl_Pil_M = camsList[l]->getCint()[0] * (*tmp_arl_pt)[0]
+                                +camsList[l]->getCint()[1] * (*tmp_arl_pt)[1]
+                                +camsList[l]->getCint()[2] * (*tmp_arl_pt)[2];
+        if(verbose){std::cerr<<"inner= "<<inner_product_Cl_Pil_M<<std::endl;}
+        mat_Cint.set_row(0,camsList[l]->getCint());
+        tmp_mat_2_1.set_column(0,p2D_undistorted->getCoordinates());
+        if(verbose){std::cerr<<"mat_Cint= "<<mat_Cint<<std::endl;
+        std::cerr<<"tmp_mat_2_1= "<<tmp_mat_2_1<<std::endl;
+        std::cerr<<"tmp_arl_pt= "<<tmp_arl_pt->print()<<std::endl;}
+        if(verbose){std::cerr<<"Qint = "<<camsList[l]->getQint().as_matrix()<<std::endl;
+        std::cerr<<"tmp_mat_2_1 * mat_Cint "<<tmp_mat_2_1 * mat_Cint<<std::endl;}
+        //dml_dM[l] = (camsList[l]->getQint().as_matrix() + toto.as_matrix());// * camsList[l]->getExtrinsic().getRotation().as_matrix();
+        dml_dM[l] = (camsList[l]->getQint().as_matrix() - tmp_mat_2_1 * mat_Cint) * camsList[l]->getExtrinsic().getRotation();
+        dml_dM[l] /= inner_product_Cl_Pil_M;
+        if(verbose){std::cerr<<"dml_dM[l]= "<<dml_dM[l]<<std::endl;}
+
+        vnl_matrix_fixed<double,3,3> U;
+        arlCore::Point::sptr point3Dreproj= arlCore::Point::New(2);
+        camsList[l]->project3DPoint(point3D,point3Dreproj,false);
+        tilde_mi_sous_mi.set_row(0, p2D_undistorted->getCoordinates() - point3Dreproj->getCoordinates() );
+        if(methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION)
+        {
+            double sigma2D_2 = list2D[l]->getCovMatrix()(0,0);
+            if(verbose){std::cerr<<"mat cov="<<  list2D[l]->getCovMatrix()(0,0) <<" "<<list2D[l]->getCovMatrix()(1,1)<<"\n";}
+            // calcul de U + U.transpose NEGLIGEABLE !!
+            U = (camsList[l]->getExtrinsic().getRotation()).transpose().as_matrix() * (mat_Cint.transpose().as_matrix()) * tilde_mi_sous_mi.as_matrix() * dml_dM[l];
+            //std::cerr<<"U + U^t/sigma2D/<Cl|Pil*M>= "<<1/sigma2D_2/inner_product_Cl_Pil_M *(U+U.transpose())<<std::endl;
+            dPhi_dml[l] = -1/sigma2D_2 * dml_dM[l].transpose();
+            H += 1/sigma2D_2 * dml_dM[l].transpose() * dml_dM[l] + 1/sigma2D_2/inner_product_Cl_Pil_M *(U+U.transpose());
+            //std::cerr<<"H^l="<<H<<std::endl;
+            Gamma += sigma2D_2 * dPhi_dml[l] * dPhi_dml[l].transpose();
+        }
+        if(methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY)
+        {
+            vnl_matrix<double> sigma2D_inv = vnl_matrix_inverse<double>(list2D[l]->getCovMatrix());
+            // calcul de U + U.transpose NEGLIGEABLE !!
+            U = (camsList[l]->getExtrinsic().getRotation()).transpose().as_matrix() * (mat_Cint.transpose().as_matrix()) * tilde_mi_sous_mi.as_matrix() * sigma2D_inv * dml_dM[l];
+            //std::cerr<<"U + U^t/sigma2D/<Cl|Pil*M>= "<<1/sigma2D_2/inner_product_Cl_Pil_M *(U+U.transpose())<<std::endl;
+            dPhi_dml[l] = - dml_dM[l].transpose() * sigma2D_inv;
+            H += dml_dM[l].transpose()* sigma2D_inv * dml_dM[l] + 1/inner_product_Cl_Pil_M *(U+U.transpose());
+            //std::cerr<<"H^l="<<H<<std::endl;
+            Gamma += dPhi_dml[l] * list2D[l]->getCovMatrix() *dPhi_dml[l].transpose();
+        }
+    }
+    if(verbose){std::cerr<< "Hessian matrix ="<< H<<std::endl;}
+    Hinv = vnl_matrix_inverse<double>(H);
+    if(verbose){std::cerr<< "Hessian inv ="<< Hinv <<std::endl;
+    std::cerr<< "Gamma="<< Gamma <<std::endl;}
+    Sigma_Point_Rec  = Hinv * Gamma.as_matrix() * Hinv.transpose();
+    if(verbose){std::cerr<< "matrice covariance 3D = "<< Sigma_Point_Rec << std::endl;}
+    arlCore::vnl_covariance_matrix &cov_mat = point3D->getCovMatrix();
+    for(i=0;i<3;++i)
+        for(l=0;l<3;++l)
+            cov_mat.put(i,l,Sigma_Point_Rec[i][l]);// = Sigma_Point_Rec;
+    return true;
+    }//if(methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION || methode == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY)
+
+    if(methode == arlCore::ARLCORE_R3D_TWO_LINES_APPROX)
+    {
+        const bool verbose = false;
+        const bool verbose_cov = false;
+        //vnl_vector_fixed<double,3> I, J, m1C1, m2C2, C1C2, v, n1, n2;
+        vnl_vector_fixed<double,4> var, C2, m2;
+        arlCore::vnl_rigid_matrix P;//,PassageMatrix = camsList[1]->getExtrinsic() * camsList[0]->getInvExtrinsic();
+        //double num, denom, landa1, landa2;
+        unsigned int i, j;
+//      P =  vnl_matrix_inverse<double>(PassageMatrix.as_matrix() );
+        P = camsList[0]->getExtrinsic() * camsList[1]->getInvExtrinsic();
+        if(verbose_cov){std::cerr<<"Passage matrix =\n"<< P;}
+        arlCore::Point::sptr focal_m1 = arlCore::Point::New(3);
+        arlCore::Point::sptr focal_m2 = arlCore::Point::New(3);
+        camsList[0]->pixelPlaneToUnitFocalPlane( list2D[0], focal_m1, false );
+        camsList[1]->pixelPlaneToUnitFocalPlane( list2D[1], focal_m2, false );
+
+        arlCore::vnl_covariance_matrix &cov_mat_focal_m1 = focal_m1->getCovMatrix();
+        arlCore::vnl_covariance_matrix &cov_mat_focal_m2 = focal_m2->getCovMatrix();
+        vnl_matrix_fixed<double,3,3> tmp;
+
+        if(verbose_cov){std::cerr<<"cov_mat_m1 =\n"<<list2D[0]->getCovMatrix()<<"\n";
+        std::cerr<<"cov_mat_m2 =\n"<<list2D[1]->getCovMatrix()<<"\n";}
+
+        cov_mat_focal_m1.fill(0);
+        cov_mat_focal_m2.fill(0);tmp.fill(0);
+        cov_mat_focal_m1.put(0,0,(list2D[0]->getCovMatrix()[0][0]) / (camsList[0]->getfx()*camsList[0]->getfx()));
+        cov_mat_focal_m1.put(1,1,(list2D[0]->getCovMatrix()[1][1]) / (camsList[0]->getfy()*camsList[0]->getfy()));
+        tmp.put(0,0,(list2D[1]->getCovMatrix()[0][0]) / (camsList[1]->getfx()*camsList[1]->getfx()));
+        tmp.put(1,1,(list2D[1]->getCovMatrix()[1][1]) / (camsList[1]->getfy()*camsList[1]->getfy()));
+        if(verbose){std::cerr<<"tmp ="<< tmp <<"\n";}
+
+//      tmp = vnl_transpose(P.getRotation()) * tmp * P.getRotation();
+        tmp = P.getRotation() * tmp * vnl_transpose(P.getRotation() );
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_focal_m2.put(i,j,tmp[i][j]);// = Sigma_Point_Rec;
+
+        if(verbose_cov){std::cerr<<"cov_mat_focal_m1 =\n"<<cov_mat_focal_m1<<"\n";
+        std::cerr<<"cov_mat_focal_m2 =\n"<<cov_mat_focal_m2<<"\n";}
+
+        var.put(0, 0.0); var.put(1, 0.0); var.put(2, 0.0); var.put(3, 1.0);
+        C2 = P.as_matrix() * var.as_vector();
+        if(verbose){std::cerr<<"C2 ="<<C2<<"\n";}
+        // maintenant C2 est exprim�e dans le repere li�e � la cam�ra 1
+        var.put(0, (*focal_m2)[0]);
+        var.put(1, (*focal_m2)[1]);
+        var.put(2, (*focal_m2)[2]);
+        var.put(3, 1.0);
+        m2 = P.as_matrix() *var.as_vector();
+        if(verbose){std::cerr<<"m2 ="<<m2<<"\n";}
+        // maintenant m2 est exprim�e dans le repere li�e � la cam�ra 1
+        arlCore::Point::sptr m1C1 = arlCore::Point::New((-1.0)*(*focal_m1)[0], (-1.0)*(*focal_m1)[1], (-1.0)*(*focal_m1)[2]);
+        if(verbose){std::cerr<<"m1C1 ="<<m1C1->print()<<"\n";}
+        arlCore::vnl_covariance_matrix &cov_mat_m1C1 = m1C1->getCovMatrix();
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_m1C1.put(i,j,cov_mat_focal_m1[i][j]);
+
+        if(verbose_cov){std::cerr<<"cov_mat_focal_m1C1 =\n"<<cov_mat_m1C1<<"\n";}
+
+        var  = C2 - m2;
+        arlCore::Point::sptr m2C2 = arlCore::Point::New( C2[0] - m2[0], C2[1] - m2[1], C2[2] - m2[2]);
+        if(verbose){std::cerr<<"m2C2 ="<<m2C2->print()<<"\n";}
+        arlCore::vnl_covariance_matrix &cov_mat_m2C2 = m2C2->getCovMatrix();
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_m2C2.put(i,j,cov_mat_focal_m2[i][j]);
+
+        if(verbose_cov){std::cerr<<"cov_mat_focal_m2C2 =\n"<<cov_mat_m2C2<<"\n";}
+        //m2C2.put(0, var(0)); m2C2.put(1, var(1)); m2C2.put(2, var(2));
+        arlCore::Point::sptr C1C2 = arlCore::Point::New( C2[0], C2[1], C2[2]);
+        arlCore::vnl_covariance_matrix &cov_mat_C1C2 = C1C2->getCovMatrix();
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_C1C2.put(i,j,0.0);
+
+        if(verbose_cov){std::cerr<<"cov_mat_C1C2 =\n"<<cov_mat_C1C2<<"\n";}
+        //C1C2.put(0, C2(0)); C1C2.put(1, C2(1)); C1C2.put(2, C2(2));
+        // Determination du premier point I sur la droite de reprojection
+        //v = vnl_cross_3d(m1C1.as_vector() , m2C2.as_vector() );
+        arlCore::Point::sptr v  =  arlCore::Point::New(3);
+        arlCore::Point::sptr n1 =  arlCore::Point::New(3);
+        arlCore::Point::sptr n2 =  arlCore::Point::New(3);
+
+        v->cross_3D(m1C1 , m2C2);
+        if(verbose_cov){std::cerr<<"cov_mat_v =\n"<<v->getCovMatrix()<<"\n";}
+        //n1= vnl_cross_3d(v.as_vector(), m1C1.as_vector() );
+        n1->cross_3D(v, m1C1);
+        if(verbose){std::cerr<<"v ="<<v->print()<<"\n";
+        std::cerr<<"n1 ="<<n1->print()<<"\n";}
+        if(verbose_cov){std::cerr<<"cov_mat_n1 =\n"<<n1->getCovMatrix()<<"\n";}
+        //double dot1=0, dot2=0;
+        arlCore::Point::sptr dot1 =  arlCore::Point::New(1);
+        arlCore::Point::sptr dot2 =  arlCore::Point::New(1);
+        dot1->dotProduct(C1C2, n1);
+        dot2->dotProduct(m2C2, n1);
+        if(verbose){std::cerr<<"dot1="<< (*dot1)[0]<<"\n";std::cerr<<"cov_mat_dot1 =\n"<<dot1->getCovMatrix()<<"\n";
+        std::cerr<<"dot2="<< (*dot2)[0]<<"\n";std::cerr<<"cov_mat_dot2 =\n"<<dot2->getCovMatrix()<<"\n";}
+
+        assert( (*dot2)[0]!=0);
+        //landa1 = num/denom;
+        arlCore::Point::sptr landa1 = arlCore::Point::New(1);
+        landa1->divide(dot1,dot2);
+
+        arlCore::Point::sptr I = arlCore::Point::New(3);
+        arlCore::Point::sptr J = arlCore::Point::New(3);
+        arlCore::Point::sptr int_I = arlCore::Point::New(3);
+        arlCore::Point::sptr int_J = arlCore::Point::New(3);
+        int_I->multiply(landa1, m2C2);
+
+        I->set(0, C2(0) - (*landa1)[0]* (*m2C2)[0] );
+        I->set(1, C2(1) - (*landa1)[0]* (*m2C2)[1] );
+        I->set(2, C2(2) - (*landa1)[0]* (*m2C2)[2] );
+        arlCore::vnl_covariance_matrix &cov_mat_I = I->getCovMatrix();
+
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_I.put(i,j, int_I->getCovMatrix()[i][j]);
+//      for(i=0;i<3;++i)
+//          for(j=0;j<3;++j)
+//              cov_mat_I.put(i,j, landa1[0]*landa1[0]*m2C2.getCovMatrix()[i][j]);
+
+        if(verbose_cov){std::cerr<<"cov_mat_int_I =\n"<<int_I->getCovMatrix()<<"\n";
+        std::cerr<<"cov_mat_I =\n"<<I->getCovMatrix()<<"\n";}
+        // Determination du deuxieme point J sur la droite de reprojection
+        //n2 = vnl_cross_3d(v, m2C2);
+        n2->cross_3D(v, m2C2);
+        if(verbose){std::cerr<<"n2="<<n2->print()<<"\n";}
+//      dot1 = dot2 =0;
+//      for(i=0;i<3;++i)
+//      {
+//          dot1 +=  C1C2(i) * n2(i);
+//          dot2 +=  m1C1(i) * n2(i);
+//      }
+        dot1->dotProduct(C1C2, n2);
+        dot2->dotProduct(m1C1, n2);
+        //dot2.set(0, -1*dot2[0]);
+        if(verbose){std::cerr<<"dot1="<<(*dot1)[0]<<"\n";
+        std::cerr<<"dot2="<<(*dot2)[0]<<"\n";}
+        assert( (*dot2)[0]!=0);
+        arlCore::Point::sptr landa2 = arlCore::Point::New(1);
+//      landa2 = num/denom;
+        landa2->divide(dot1,dot2);
+        if(verbose){std::cerr<<"landa2="<< (*landa2)[0]<<"\n";}
+        int_J->multiply(landa2, m1C1);
+
+        J->set(0,  (*landa2)[0]* (*m1C1)[0] );
+        J->set(1,  (*landa2)[0]* (*m1C1)[1] );
+        J->set(2,  (*landa2)[0]* (*m1C1)[2] );
+        arlCore::vnl_covariance_matrix &cov_mat_J = J->getCovMatrix();
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_J.put(i,j, int_J->getCovMatrix()[i][j]);
+//      for(i=0;i<3;++i)
+//          for(j=0;j<3;++j)
+//              cov_mat_J.put(i,j, landa2[0]*landa2[0]*m1C1.getCovMatrix()[i][j]);
+
+        if(verbose_cov){std::cerr<<"cov_mat_J_int =\n"<<int_J->getCovMatrix()<<"\n";
+        std::cerr<<"cov_mat_J =\n"<<J->getCovMatrix()<<"\n";}
+        // On prend le barycentre de I et J comme estimation de la reconstruction
+        arlCore::Point::sptr point3D_rep_cam = arlCore::Point::New(3);;
+        point3D_rep_cam->x(0.5*(*I)[0] + 0.5*(*J)[0]);
+        point3D_rep_cam->y(0.5*(*I)[1] + 0.5*(*J)[1]);
+        point3D_rep_cam->z(0.5*(*I)[2] + 0.5*(*J)[2]);
+
+        if(verbose){std::cerr<<"point3D_rep_cam="<<point3D_rep_cam->print()<<"\n";}
+
+        arlCore::vnl_covariance_matrix &cov_mat_point3D = point3D->getCovMatrix();
+        vnl_matrix<double> toto(3,3);
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                toto.put(i,j, 0.5*0.5*I->getCovMatrix()[i][j] +  0.5*0.5*J->getCovMatrix()[i][j] );
+
+        if(verbose_cov){std::cerr<<"cov_mat_toto =\n"<< toto <<"\n";}
+
+        toto = camsList[0]->getInvExtrinsic().getRotation() * toto * camsList[0]->getExtrinsic().getRotation();
+//      toto = camsList[0]->getInvExtrinsic().getRotation() * toto;
+
+        for(i=0;i<3;++i)
+            for(j=0;j<3;++j)
+                cov_mat_point3D.put(i,j, toto[i][j]);
+        if(verbose_cov){std::cerr<<"cov_mat_point3D =\n"<< cov_mat_point3D <<"\n";}
+
+        if( cov_mat_point3D[0][0] < 0.0 || cov_mat_point3D[1][1] < 0.0 || cov_mat_point3D[2][2] < 0.0)
+            {std::cerr<<"Covariance Matrix has negative values "<<std::endl;assert(true);}
+    }
+    return true;
+}
+
+void arlCore::WriteTableau ( char *nom, std::vector<double> tab, unsigned int n)
+{
+    unsigned int  i;
+    FILE *f = fopen (nom, "w");
+    for( i=0 ; i<n ; ++i )
+        if(tab[i] != 0)
+    fprintf (f,"%1.8f\n", tab[i]);
+    fclose(f);
+}
+
+double arlCore::CumulativeChi2_3(double mu2)
+{   // Validation : KS test, mean and covar
+    return arlCore::IncompleteGammaP(3.0/2., mu2/2.);
+}
+
+double* arlCore::KSValidation3D(char* index_file)
+{
+    double I,*Itab,I2,ksp,ksdiff;
+    int N, i;
+    FILE *fd;
+    double *Result;
+    Result = new double[3];
+    /**************  ouverture du fichier passe en argument **********/
+    if((fd = fopen (index_file, "r")) == NULL)
+    {
+        fprintf (stderr, "no file %s\n", index_file);
+        assert(true);
+    }
+    N=0;
+    while( fscanf(fd,"%lg\n",&I) != EOF ) N++;
+        rewind(fd);
+    if( N==0)
+    {
+        fprintf (stderr, "le fichier est vide %s!!\n", index_file);
+        assert(true);
+    }
+    Itab = new double[N];
+    //    E_ISERR(FALSE,"Validation", "Allocation problem");
+    I = 0.0;
+    for(i=0;i<N;i++)
+    {
+        fscanf(fd,"%lg\n",Itab+i);
+        I += Itab[i];
+    }
+    I /= ((double) N);
+    I2 = 0;
+    for(i=0;i<N;i++)
+        I2 += (I-Itab[i])*(I-Itab[i]);
+    if( N > 1)
+        I2 /= ((double) N -1.);
+    /* KS test */
+    ksp = arlCore::SimpleKSTest( Itab, N, CumulativeChi2_3, &ksdiff);
+//  printf("*****************************************************************\n");
+//  printf("   Mean Val Index     -  Variance Val Index   - K-S significance \n");
+//  printf("   Expected: 3.0      -     %12.6g    -     0.01 / 1.0\n",sqrt(6.0));
+//  printf("       %12.6g    -     %12.6g   -    %12.6g\n",I,sqrt(I2),ksp);
+//  printf("*****************************************************************\n\n");
+    Result[0] = I;
+    Result[1] = sqrt(I2);
+    Result[2] = ksp;
+    /* fclose(fd); */
+    delete [] Itab;
+    //    K_Free( (void **) &Itab );
+    fclose(fd);
+    return(Result);
+}
+
+//////////////////////////////
+/************************************************************************/
+/* Probabilistic tests and densities */
+/************************************************************************/
+double arlCore::ProbKSTest(double alam)
+{   // Kolmogorov-Smirnov probability
+    const double EPS1 = 0.001;
+    const double EPS2 = 1.0e-12;
+    unsigned int i;
+    double fac=2.0,sum=0.0,term,termbf=0.0;
+    const double a2 = -2.0*alam*alam;
+    for( i=1 ; i<=100 ; ++i )
+    {
+        term=fac*exp(a2*i*i);
+        sum += term;
+        if( fabs(term)<=EPS1*termbf || fabs(term)<=EPS2*sum )
+            return sum;
+        fac = -fac;
+        termbf=fabs(term);
+    }
+    return 1.0;
+}
+double arlCore::LnGamma( double xx )
+{   // Log of Gamma Function (NRC : gammln)
+    double x,y,tmp,ser;
+    static double cof[6]=
+        {76.18009172947146, -86.50532032941677, 24.01409824083091,
+        -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5};
+    unsigned int i;
+    y=x=xx;
+    tmp=x+5.5;
+    tmp -= (x+0.5)*log(tmp);
+    ser=1.000000000190015;
+    for( i=0 ; i<6 ; ++i )
+        ser += cof[i]/++y;
+    return -tmp+log(2.5066282746310005*ser/x);
+}
+
+double IGammaCFraction(double a, double x)
+{   // Incomplete Gamma Function Continuous fraction estimation
+    const double FPMIN = 1.0e-30;
+    const double EPS = 3.0e-7;
+    const unsigned int ITMAX = 100;
+    int i;
+    double an,b,c,d,del,h;
+    const double gln = arlCore::LnGamma(a);
+    b=x+1.0-a;
+    c=1.0/FPMIN;
+    d=1.0/b;
+    h=d;
+    for( i=1 ; i<ITMAX ; ++i )
+    {
+        an = -i*(i-a);
+        b += 2.0;
+        d=an*d+b;
+        if(fabs(d) < FPMIN) d=FPMIN;
+        c=b+an/c;
+        if(fabs(c) < FPMIN) c=FPMIN;
+        d=1.0/d;
+        del=d*c;
+        h *= del;
+        if(fabs(del-1.0) < EPS) break;
+    }
+    //  E_ERR(i >= ITMAX, E_ERRNULL, -2.0, "IGammaCFraction(a,x)",   "a too large, ITMAX too small");
+    return(exp(-x+a*log(x)-(gln))*h);
+}
+
+double IGammaSeries(double a, double x)
+{   // Incomplete Gamma Function Series representation estimation
+    const double EPS = 3.0e-7;
+    const unsigned int ITMAX = 100;
+    unsigned int i;
+    double sum,del,ap, gamser;
+    if( x<=0.0 )
+    {
+        std::cerr<<"Error in IGammaSeries : x==0.0\n";
+        return 0.0;
+    }
+    //     {
+    //       E_ERR(x < 0.0, E_ERRNULL, -2.0,"IGammaSeries",
+    //      "x less than 0 in routine gser");
+    //       return 0.0;
+    //     }
+    else
+    {
+        const double gln = arlCore::LnGamma(a);
+        ap=a;
+        del=sum=1.0/a;
+        for( i=0 ; i<ITMAX ; ++i )
+        {
+            ++ap;
+            del *= x/ap;
+            sum += del;
+            if(fabs(del) < fabs(sum)*EPS)
+            {
+                gamser=sum*exp(-x+a*log(x)-(gln));
+                return gamser;
+            }
+        }
+    //     E_XERR(E_ERRNULL, -2.0, "IGammaSeries(a,x)",
+    //      "a too large, ITMAX too small");
+    }
+    return -2.0;
+}
+
+double arlCore::IncompleteGammaP(double a, double x)
+{   // Incomplete Gamma Function P(a,x)
+    // Cumulative pdf of chi^2_d : IncompleteGammaP(d/2, mu2/2)
+//   E_ERR (x < 0.0 || a <= 0.0, E_ERRNULL,-1.,
+//   "IncompleteGammaP", "Invalid arguments (must be positive)");
+    if(x < (a+1.0)) return IGammaSeries(a,x);
+    else return 1.0-IGammaCFraction(a,x);
+}
+
+double arlCore::CumulativeChi2(double mu2, int n)
+{   // Cumulative distribution of chi2_n(mu2)
+    return arlCore::IncompleteGammaP(n/2., mu2/2.);
+}
+
+double IBetaSeries(double a, double b, double x)
+{   // Continued fraction for Incomplete Beta Function   (NRC : betacf)
+    const unsigned int MAXIT = 100;
+    const double EPS = 3.0e-7;
+    const double FPMIN = 1.0e-30;
+    unsigned int m,m2;
+    double aa,c,d,del,h,qab,qam,qap;
+
+    qab=a+b;
+    qap=a+1.0;
+    qam=a-1.0;
+    c=1.0;
+    d=1.0-qab*x/qap;
+    if(fabs(d) < FPMIN) d=FPMIN;
+    d=1.0/d;
+    h=d;
+    for (m=1;m<=MAXIT;m++)
+    {
+        m2=2*m;
+        aa=m*(b-m)*x/((qam+m2)*(a+m2));
+        d=1.0+aa*d;
+        if(fabs(d) < FPMIN) d=FPMIN;
+        c=1.0+aa/c;
+        if(fabs(c) < FPMIN) c=FPMIN;
+        d=1.0/d;
+        h *= d*c;
+        aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
+        d=1.0+aa*d;
+        if(fabs(d) < FPMIN) d=FPMIN;
+        c=1.0+aa/c;
+        if(fabs(c) < FPMIN) c=FPMIN;
+        d=1.0/d;
+        del=d*c;
+        h *= del;
+        if(fabs(del-1.0) < EPS) break;
+    }
+//   E_ERR(m > MAXIT, E_ERRNULL, -1,
+//  "IBetaSeries","a or b too big, or MAXIT too small in IBetaSeries");
+  return h;
+}
+
+double arlCore::IncompleteBetaI(register double a, register double b,register  double x)
+{   // Incomplete Beta Function Ix(a,b)  (NRC : betai)
+  register double bt;
+//   E_ERR (x < 0.0 || x > 1, E_ERRNULL,-1.,
+//   "IncompleteBetaI","Invalid x argument (must be between 0 and 1)");
+  if(x == 0.0 || x == 1.0)
+    bt=0.0;
+  else
+    bt=exp(LnGamma(a+b)-LnGamma(a)-LnGamma(b)+a*log(x)+b*log(1.0-x));
+  if(x < (a+1.0)/(a+b+2.0))
+    return bt*IBetaSeries(a,b,x)/a;
+  else
+    return 1.0-bt*IBetaSeries(b,a,1.0-x)/b;
+}
+
+double arlCore::CumulativeFisher(double a, double b, double x)
+{   // Cumulative distribution of Fisher-Snedecor F(a,b)(x)
+    return(1.0 - IncompleteBetaI(b/2., a/2., b/(b+a*x) ));
+}
+
+double CumulativeHotelling(double p, double n, double x)
+{   // Cumulative distribution for Hotelling's test :  F(p,n-p)(x)
+    return(1.0 - arlCore::IncompleteBetaI((n-p)/2., p/2., (n-p)/(n+p*(x-1.)) ));
+}
+
+int dcmp(double *a, double *b)
+{
+    if( *a<*b ) return(-1);
+    else if(*a > *b) return(+1);
+        else return(0);
+}
+
+//! @return maximum of 2 variables
+template <typename T> inline T max( const T& a, const T& b ){if(a>b) return a; else return b;}
+
+//! @return minimum of 2 variables
+template <typename T> inline T min( const T& a, const T& b ){if(a<b) return a; else return b;}
+
+double arlCore::SimpleKSTest( double *data, int n, double (*pdf)(double), double *d)
+{
+/*----------------------------------------------------------------------*/
+/* Simple Kolmogorov-Smirnov test : compare a set of n samples */
+/*  (stored in array data) with the (cumulative) pdf  */
+/* Output : d = maxdiff between distributions */
+/* Returned value = corresponding probability */
+/*----------------------------------------------------------------------*/
+    unsigned int i;
+    double dt, en, ff, fn, fo=0.0;
+    qsort( (void *) data,  n, sizeof(double), (int(*)(const void *, const void *)) dcmp);
+    en=n; // Pourquoi cette nouvelle variable?
+    *d=0.0;
+    for( i=0 ; i<n ; ++i )
+    {
+        fn = i/en; // Test Division par zero
+        ff = (*pdf)(data[i]);
+        dt = max(fabs(fo-ff),fabs(fn-ff));
+        if( dt>*d ) *d=dt;
+        fo=fn;
+    }
+    /* en=sqrt(en); */
+    /*return ProbKSTest((en+0.12+0.11/en)*(*d)); */
+    return ProbKSTest(sqrt(en)*(*d));
+}
+
+double arlCore::DoubleKSTest( double *data1, int n1, double *data2, int n2, double *d)
+{
+/*----------------------------------------------------------------------*/
+/* Double Kolmogorov-Smirnov test : compare the set of n1 samples data1 */
+/*   with the set of n2 samples data2 */
+/* Output : d = maxdiff between distributions */
+/* Returned value = corresponding probability */
+/*----------------------------------------------------------------------*/
+    int j1=0,j2=0;
+    double d1,d2,dt,en1,en2,en,fn1=0.0,fn2=0.0;
+    qsort( (void *) data1,  n1, sizeof(double),
+        (int(*)(const void *, const void *)) dcmp);
+    qsort( (void *) data2,  n2, sizeof(double),
+        (int(*)(const void *, const void *)) dcmp);
+    en1=n1;
+    en2=n2;
+    *d=0.0;
+    while(j1 < n1 && j2 < n2)
+    {
+        if((d1=data1[j1]) <= (d2=data2[j2])) fn1=j1++/en1;
+        if(d2 <= d1) fn2=j2++/en2;
+        if((dt=fabs(fn2-fn1)) > *d) *d=dt;
+    }
+    en=sqrt(en1*en2/(en1+en2));
+    return arlCore::ProbKSTest((en+0.12+0.11/en)*(*d));
+}
diff --git a/SrcLib/ARLcore/src/arlcore/UnitTestArlCore.cpp b/SrcLib/ARLcore/src/arlcore/UnitTestArlCore.cpp
new file mode 100644
index 0000000..8a25f67
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/UnitTestArlCore.cpp
@@ -0,0 +1,1948 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/UnitTestArlCore.h>
+
+#include <vector>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+#include <time.h>
+#include <iostream>
+#ifdef _WIN32
+  #include <conio.h> // kbhit & getch
+#endif //_WIN32
+
+#include <vnl/vnl_math.h>
+#include <vnl/algo/vnl_matrix_inverse.h>
+
+#include <arlcore/Misc.h>
+#include <arlcore/Camera.h>
+#include <arlcore/Calibration.h>
+#include <arlcore/FieldCorrection.h>
+#include <arlcore/Point.h>
+#include <arlcore/PointsList.h>
+#include <arlcore/SmartPointsList.h>
+#include <arlcore/PlaneSystem.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Reconst3D.h>
+#include <arlcore/Optimization.h>
+#include <arlcore/UncertaintyPropag.h>
+#include <arlcore/vnl_rigid_vector.h>
+#include <arlcore/vnl_rotation3d_matrix.h>
+#include <arlcore/vnl_rotation3d_vector.h>
+#include <arlcore/Scenes.h>
+#include <arlcore/Mesh.h>
+#include <arlcore/ICP.h>
+
+static long int m_date;
+static long int m_time;
+
+void printHeader( const std::string &name, unsigned int nbIterations, double tolerance )
+{
+    const long int Seed = 1171888051;
+    std::cerr<<"\n************\n";
+    std::cerr<<"* Unit Test : "<<name<<"\n";
+    std::cerr<<"************\n";
+    std::cerr<<"* Iterations  = "<<nbIterations<<"\n";
+    std::cerr<<"* Tolerance   = "<<tolerance<<"\n";
+    if(!arlRandom::Random::initRandom("Random-100000000.txt",500000)==0)
+        std::cerr<<"* Random seed = Random-100000000.txt,500000\n";
+    else std::cerr<<"* Random seed = "<<arlRandom::Random::initRandom(Seed)<<"\n";
+    std::cerr<<"*\n";
+    m_date = arlTime::getNowDate();
+    m_time = arlTime::getNowTime();
+}
+
+bool printErrors( const std::string &name, const vnl_vector<double>& error, long int robustnessOK, long int robustnessTotal, double tolerance, bool Verbose=false)
+{
+    const unsigned int precision=4;
+    const double mean=error.mean();
+    double stdDev = 0;
+    unsigned int i;
+    for( i=0 ; i<error.size() ; ++i )
+        stdDev += (error[i]-mean)*(error[i]-mean);
+    if(error.size()>0) stdDev = sqrt(stdDev/error.size());
+    //Calcul de l'écart type plus elegant mais couteux en memoire
+    //vnl_vector<double> meanVect(error.size());
+    //meanVect.fill(mean);
+    //stdDev = (error-meanVect).rms();
+    bool test=true;
+    if(tolerance>=0) test=error.max_value()<=tolerance;
+    std::cerr<<std::setprecision(precision);
+    if(Verbose)
+        for( i=0; i<error.size() ; ++i )
+            std::cerr<<"* "<<name<<"["<<i<<"]="<<error[i]<<"\n";
+    std::cerr<<"* "<<name<<" : ";
+    if(tolerance>=0)
+    {
+        if(test) std::cerr<<"OK OK";
+        else std::cerr<<"ERROR";
+    }
+    std::cerr<<"\n*  Mean/Std = {"<<mean<<" , "<<stdDev<<"}\n";
+    std::cerr<<"*  Min/Max  = ["<<error.min_value()<<" , "<<error.max_value()<<"]\n";
+    double p=0;
+    if(robustnessTotal!=0) p=(double)robustnessOK*100.0/(double)robustnessTotal;
+    std::cerr<<"*  Robustness = "<<robustnessOK<<" / "<<robustnessTotal<<" = "<<p<<"%\n";
+    return test;
+}
+
+bool printErrors( const std::string &name, const vnl_vector_fixed<double,5>& stat, long int robustnessOK, long int robustnessTotal, double tolerance, bool Verbose=false)
+{
+    double min, max, mean, stdDev, RMS;
+    arlCore::computeStat( stat, min, max, mean, stdDev, RMS );
+    const unsigned int Precision=4;
+    const bool Test = max<tolerance;
+    std::cerr<<std::setprecision(Precision);
+    std::cerr<<"* "<<name<<" : ";
+    if(Test) std::cerr<<"OK OK\n";
+    else std::cerr<<"ERROR\n";
+    std::cerr<<"*  Mean/Std/RMS = {"<<mean<<" , "<<stdDev<<" , "<<RMS<<"}\n";
+    std::cerr<<"*  Min/Max  = ["<<min<<" , "<<max<<"]\n";
+    double p=0;
+    if(robustnessTotal!=0) p=(double)robustnessOK*100.0/(double)robustnessTotal;
+    std::cerr<<"*  Robustness = "<<robustnessOK<<" / "<<robustnessTotal<<" = "<<p<<"%\n";
+    return Test;
+}
+
+
+bool printFooter( unsigned int nbIterations, bool test )
+{
+    double b = (double)m_time;
+    m_date = arlTime::getNowDate();
+    m_time = arlTime::getNowTime();
+    double sec=0; //m_date-a;
+    if(b>m_time)
+        sec+=1.0-(b+(double)m_time)/1000000.0;
+    else
+        sec+=((double)m_time-b)/((double)CLK_TCK*10);
+    std::cerr<<"*\n";
+    std::cerr<<"*  Total Time = "<<sec<<" seconds\n";
+    std::cerr<<"*  Time/Iter. = "<<sec/nbIterations<<" seconds\n";
+    if(test) std::cerr<<"** OK OK OK OK OK OK OK OK";
+    else     std::cerr<<"** ERROR ERROR ERROR ERROR";
+    std::cerr<<"\n************\n";
+    return test;
+}
+
+// testRegistration3D3D
+bool arlCore::testRegistration3D3D( long int nbIterations, double tolerance )
+{
+    const bool Verbose = false;
+    const double VolumeSize = 500.0;
+    printHeader("Registration 3D/3D",nbIterations, tolerance);
+    vnl_vector<double> errorRotation(nbIterations);
+    vnl_vector<double> errorTranslation(nbIterations);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+        const arlCore::PointList::sptr regPoints = scene.getTags().getTag(0)->getGeometry();
+        arlCore::PointList::sptr modelPoints = arlCore::PointList::New(3);
+        arlCore::vnl_rigid_matrix T1, T2;
+        T1.uniform_random(VolumeSize);
+        T1.trf(regPoints, modelPoints);
+//      unsigned int i;
+//      for( i=0 ; i<modelPoints->size() ; ++i )
+//          (*modelPoints)[i]->addGaussianNoise(GaussianNoise3D);
+        if(T2.register3D3D(regPoints, modelPoints, true))
+        {
+            ++robustnessOK;
+            T1.compare(T2, errorTranslation[compteur], errorRotation[compteur]);
+            //T2.RMS3D3D( modelPoints, regPoints, regPoints.size(),
+            //          erreur_recalage3D3D, errorVector[compteur], EC_3D3D);
+        }
+        ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreur sur la translation",errorTranslation,robustnessOK,robustnessTotal,tolerance , Verbose);
+    test = printErrors("Erreur sur la rotation",errorRotation,robustnessOK,robustnessTotal,tolerance , Verbose ) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testICPRegistration
+bool arlCore::testICPRegistration( long int nbIterations, double tolerance )
+{
+    const bool Verbose = false;
+    const double VolumeSize = 10.0;
+    const double GaussianNoise3D = 0.0;
+    printHeader("ICP Registration",nbIterations, tolerance);
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    arlCore::vnl_rigid_matrix T1, T2, Identity;
+    unsigned int i;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        const double Width=50, Length=50, Degree=2.0, ModelNoise=0.0;
+        arlCore::PointList::sptr summits = arlCore::PointList::New();
+        arlCore::Mesh meshModel(1.0);
+        double altitude = 10.0, modelXStep=0.2, modelZStep=0.2;
+        double cloudXStep = 0.1, cloudZStep = 2.0;
+        const double FringeWidth = cloudZStep/4.0;
+        unsigned int nbSummits = 8;
+       PointList::csptr model = meshModel.getPointList();
+        if(compteur==0) meshModel.load("G:/Mouse/ToSort/19052008-sd-ext.raw", GaussianNoise3D);
+        if(compteur>0 || meshModel.getPointList()->size()<1 )
+        {
+            for( i=0 ; i<nbSummits ; ++i )
+            {
+                const double X = arlRandom::Random::uniformDoubleRnd( 0, Width );
+                const double Z = arlRandom::Random::uniformDoubleRnd( 0, Length );
+                double Y = arlRandom::Random::uniformDoubleRnd( altitude/2, altitude );
+                if(i<4) Y = arlRandom::Random::uniformDoubleRnd( 0, altitude/2 );
+                summits->push_back(arlCore::Point::New(X, Y, Z));
+            }
+            meshModel.generateY( Width, Length, modelXStep, modelZStep, Degree, ModelNoise, summits );
+        }
+        std::stringstream modelName;
+        modelName<<"../Model"<<compteur<<".raw";
+        meshModel.save(modelName.str());
+        if(compteur==0) meshModel.resampling(.5);
+        //if(Verbose) std::cout<<compteur<<"\n";
+        // Set Random transformation
+        const double Phi = arlRandom::Random::uniformDoubleRnd( -15*arlCore::DegToRad, 15*arlCore::DegToRad );
+        const double Theta = arlRandom::Random::uniformDoubleRnd( -15*arlCore::DegToRad, 15*arlCore::DegToRad );
+        const double Psy = arlRandom::Random::uniformDoubleRnd( -15*arlCore::DegToRad, 15*arlCore::DegToRad );
+        vnl_rotation3d_matrix rot( Phi, Theta, Psy );
+        T1.setRotation(rot);
+        T1.put(0,3,arlRandom::Random::uniformDoubleRnd( -VolumeSize/2, VolumeSize/2 ));
+        T1.put(1,3,arlRandom::Random::uniformDoubleRnd( -VolumeSize/2, VolumeSize/2 ));
+        T1.put(2,3,arlRandom::Random::uniformDoubleRnd( -VolumeSize/2, VolumeSize/2 ));
+        //T1.uniform_random(VolumeSize);
+        //T1.trf(model, cloud);
+        if(Verbose) std::cout<<T1.getString();
+        arlCore::Mesh meshCloud(-1.0);
+        arlCore::PointList fringes(3);
+        const arlCore::PointList::sptr cloud = arlCore::PointList::New();
+        if(compteur==0)
+        {
+            arlCore::Point::sptr gravity =  arlCore::Point::New();
+            arlCore::Point::sptr boundingBox1 =  arlCore::Point::New();
+            arlCore::Point::sptr boundingBox2 =  arlCore::Point::New();
+            double minRadius, maxRadius, std;
+            model->properties( gravity, boundingBox1, boundingBox2, minRadius, maxRadius, std );
+            const double Ratio = (FringeWidth/2.0)/cloudZStep;
+            for( i=0 ; i<model->size() ; ++i )
+                if( (*model)[i])
+                {
+                    //if(Verbose) std::cout<<"Ratio = "<<Ratio<<"\n";
+                    arlCore::Point::sptr point = arlCore::Point::New( (*model)[i] );
+                    const double Z = point->z();
+                    int fringeNo = int(Z/cloudZStep);
+                    //if(Verbose) std::cout<<"FringeNo = "<<fringeNo<<"\n";
+                    point->setScalar(-fringeNo);
+                    double d = fabs((Z/cloudZStep)-(double)fringeNo);
+                    //if(Verbose) std::cout<<"d = "<<d<<"\n";
+                    if(d<=Ratio) fringes.push_back(point);
+                }
+            cloud->copy(fringes);
+        }else
+        {
+            meshCloud.generateY( Width, Length, cloudXStep, cloudZStep, Degree, GaussianNoise3D, summits );
+            cloud->copy( *(meshCloud.getPointList()) );
+        }
+        std::stringstream cloudName, cloudName2;
+        cloudName<<"../Cloud"<<compteur<<".raw";
+        cloudName2<<"../Cloud"<<compteur<<".pts";
+        if(compteur==0) fringes.save(cloudName2.str());
+        else meshCloud.save(cloudName.str());
+        if(Verbose) std::cout<<"Cloud ("<<cloud->size()<<") = "<<cloudName.str()<<"\n";
+        if(Verbose) std::cout<<"Model ("<<model->size()<<") = "<<modelName.str()<<"\n";
+        T2=T1;
+        std::stringstream trfName;
+        trfName<<"../init"<<compteur<<".trf";
+        T2.save(trfName.str());
+        //T2.invert();
+        const bool JustVisible = false;
+        const unsigned int NbIterationsMax = 500;
+        arlCore::ICP icp( model, cloud, JustVisible);
+        icp.setMaxIterations(NbIterationsMax);
+        icp.initSolution(T2);
+        //if(T2.registerICP( model, *cloud, firstRMS, lastRMS, iterations, JustVisible, RmsMax, NbIterationsMax ))
+        if(icp.solve())
+        {
+            double errorT, errorR;
+            ++robustnessOK;
+            Identity.compare(icp.getSolution(), errorT, errorR);
+            addValue(errorTranslation, errorT);
+            addValue(errorRotation, errorR);
+            if(Verbose)
+            {
+                std::cout<<"*** ICP Initialization\n";
+                std::cout<<"RMS = "<<icp.getStartError()<<" -> "<<icp.getEndError()<<"\n";
+                std::cout<<"Iterations = "<<icp.getNbIterations()<<"\n";
+                std::cout<<"Error Translation = "<<errorT<<"\n";
+                std::cout<<"Error Rotation = "<<errorR<<"\n";
+                std::cout<<icp.getSolution().getString()<<"\n";
+            }
+            icp.optimiseLS();
+            Identity.compare(icp.getSolution(), errorT, errorR);
+            if(Verbose)
+            {
+                std::cout<<"*** ICP LM optimisation\n";
+                std::cout<<"RMS = "<<icp.getStartError()<<" -> "<<icp.getEndError()<<"\n";
+                std::cout<<"Iterations = "<<icp.getNbIterations()<<"\n";
+                std::cout<<"Error Translation = "<<errorT<<"\n";
+                std::cout<<"Error Rotation = "<<errorR<<"\n";
+                std::cout<<icp.getSolution().getString()<<"\n";
+            }
+        }
+        ++robustnessTotal;
+    }//boucle compteur
+    std::string name="Translation error";
+    bool test = printErrors(name, errorTranslation, robustnessOK, robustnessTotal, tolerance);
+    name="Rotation error";
+    test = printErrors(name, errorRotation, robustnessOK, robustnessTotal, tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testRegistration3D3DUncertainty
+bool arlCore::testRegistration3D3DUncertainty( long int nbIterations, double tolerance )
+{
+    const double VolumeSize = 500.0;
+    printHeader("Registration Uncertainty 3D/3D",nbIterations, tolerance);
+    vnl_vector<double> errorRotation(nbIterations);
+    vnl_vector<double> errorTranslation(nbIterations);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    std::vector<double> log, opt_param;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+       PointList::sptr worldPoints = scene.getTags().getTag(0)->getGeometry();
+        arlCore::PointList::sptr modelPoints= arlCore::PointList::New(3);
+        arlCore::vnl_rigid_matrix T1, T2;
+        T1.uniform_random(VolumeSize);
+        T1.trf(worldPoints, modelPoints);
+
+        double rangeGaussianNoise3D_x = arlRandom::Random::gaussianRnd(VolumeSize/100.0);
+        double rangeGaussianNoise3D_y = arlRandom::Random::gaussianRnd(VolumeSize/100.0);
+        double rangeGaussianNoise3D_z = arlRandom::Random::gaussianRnd(VolumeSize/100.0);
+        if(rangeGaussianNoise3D_x < 1e-3){rangeGaussianNoise3D_x = 0.1;}
+        if(rangeGaussianNoise3D_y < 1e-3){rangeGaussianNoise3D_y = 0.1;}
+        if(rangeGaussianNoise3D_z < 1e-3){rangeGaussianNoise3D_z = 0.1;}
+//      for(unsigned int i=0 ; i<modelPoints->size() ; ++i )
+//      {
+//          (*modelPoints)[i]->set(0, (*modelPoints)[i]->x() + arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_x));
+//          (*modelPoints)[i]->set(1, (*modelPoints)[i]->y() + arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_y));
+//          (*modelPoints)[i]->set(2, (*modelPoints)[i]->z() + arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_z));
+//      }
+        // we fill the covariance matrix to check that the optimization process takes it into account
+        // we do not apply any noise on the data !! This is only done for uncertainty prediction
+        for( unsigned int i=0 ; i<modelPoints->size() ; ++i )
+        {
+            arlCore::vnl_covariance_matrix &cov_mat = (*modelPoints)[i]->getCovMatrix();
+            cov_mat.fill(0.0);
+            cov_mat.put(0,0,rangeGaussianNoise3D_x*rangeGaussianNoise3D_x);
+            cov_mat.put(1,1,rangeGaussianNoise3D_y*rangeGaussianNoise3D_y);
+            cov_mat.put(2,2,rangeGaussianNoise3D_z*rangeGaussianNoise3D_z);
+            //std::cerr<<"mat cov = " << cov_mat <<std::endl;
+        }
+
+        if(T2.register3D3DUncertainty(worldPoints, modelPoints, arlCore::ARLCORE_REGISTER3D3D_GC, opt_param, log/*, worldPoints.size()*/) )
+        {
+            ++robustnessOK;
+            T1.compare(T2, errorTranslation[compteur], errorRotation[compteur]);
+            //T2.RMS3D3D( modelPoints, worldPoints, worldPoints.size(),
+            //          erreur_recalage3D3D, errorVector[compteur], EC_3D3D);
+        }
+        ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreur sur la translation",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur la rotation",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testProjectiveRegistration
+bool arlCore::testProjectiveRegistration( long int nbIterations, double tolerance )
+{
+    const double TransfVolumeSize = 500.0;
+    const double GaussianNoise2D = 0.0;
+    const unsigned int nbTypes = arlCore::ARLCORE_PR_NBTYPES;
+    printHeader("Projective registration",nbIterations, tolerance);
+    std::vector< vnl_vector_fixed<double,5> > errorRotation(nbTypes);
+    std::vector< vnl_vector_fixed<double,5> > errorTranslation(nbTypes);
+    std::vector<long int> robustnessOK(nbTypes), robustnessTotal(nbTypes);
+    double errorT, errorR;
+    long int compteur;
+    unsigned int enum_3D2D, i,j;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        //std::cerr<<"Iteration "<<compteur<<std::endl;
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+        const arlCore::CameraList &cameras = scene.getCameras();
+        PointList::sptr worldPoints = scene.getTags().getTag(0)->getGeometry();
+        std::vector< std::vector<arlCore::Point::csptr> > reprojection2D(cameras.size());
+        arlCore::SmartPointList::sptr splMonde = arlCore::SmartPointList::New();
+        //std::cerr<<"Camera Number "<<cameras.size()<<std::endl;
+        //std::cerr<<"Point Number "<<worldPoints.size()<<std::endl;
+        for( j=0 ; j<cameras.size() ; ++j )
+        {
+            scene.detection( j+1, 0, splMonde, GaussianNoise2D );
+            splMonde->getPoints(reprojection2D[j], j+1, ::boost::dynamic_pointer_cast<void>(scene.getTags().getTag(0)) );
+        }
+        arlCore::vnl_rigid_matrix T1,T2;
+        T1.uniform_random(TransfVolumeSize);
+        arlCore::PointList::sptr modelPoints =arlCore::PointList::New(3);
+        T1.trf(worldPoints, modelPoints);
+        for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_NBTYPES; ++enum_3D2D,++i)
+        {
+            if( enum_3D2D!=ARLCORE_PR_ISPPC_CG && enum_3D2D!=ARLCORE_PR_OSPPC_CG && enum_3D2D!=ARLCORE_PR_EPPC_CG )
+            {
+                //std::cerr<<"Method :"<<ARLCORE_PROJECTIVE_REGISTRATION_NAMES[enum_3D2D]<<std::endl;
+                if(compteur==0)
+                {
+                    errorTranslation[i].fill(0.0);
+                    errorRotation[i].fill(0.0);
+                    robustnessOK[i]=0;
+                    robustnessTotal[i]=0;
+                }
+                T2.setIdentity();
+                std::vector<double> log, param_optimisation;
+                if(arlCore::multiViewPointRegistration3D2D( cameras.getList(), reprojection2D, modelPoints,
+                    T2, (arlCore::ARLCORE_PROJECTIVE_REGISTRATION)enum_3D2D, param_optimisation, log, 0))
+                {
+                    T1.compareInverse(T2, errorT, errorR);
+                    addValue(errorTranslation[i], errorT);
+                    addValue(errorRotation[i], errorR);
+                    ++robustnessOK[i];
+                }
+                ++robustnessTotal[i];
+            }
+        }
+    }//boucle compteur
+    bool test=true;
+    for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_NBTYPES; ++enum_3D2D,++i)
+    {
+        if( enum_3D2D!=ARLCORE_PR_ISPPC_CG && enum_3D2D!=ARLCORE_PR_OSPPC_CG && enum_3D2D!=ARLCORE_PR_EPPC_CG )
+        {
+            std::string name="Translation error ("+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[enum_3D2D]+")";
+            test = printErrors(name,errorTranslation[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+            name="Rotation error ("+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[enum_3D2D]+")";
+            test = printErrors(name,errorRotation[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+        }
+    }
+    return printFooter(nbIterations, test);
+}
+
+// testHomographyRegistration
+bool arlCore::testHomographyRegistration( long int nbIterations, double tolerance )
+{
+    const double VolumeSize = 500.0;
+    const double GaussianNoise2D = 0.0;
+    printHeader("Homography registration",nbIterations, tolerance);
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    double errorT, errorR;
+    unsigned int i;
+    long int  compteur;
+    for(compteur=0;compteur<nbIterations;++compteur)
+    {
+        //std::cerr<<"Compteur ="<<compteur<<std::endl;
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+        arlCore::Point::csptr centre=scene.getCentre();
+        const arlCore::CameraList &cameras = scene.getCameras();
+        arlCore::Tag::sptr tag_monde_plan = scene.getTags().getTag(1);
+        arlCore::PointList::sptr point_monde_plan = tag_monde_plan->getGeometry();
+        arlCore::vnl_rotation3d_vector random_rot_vec;
+        arlCore::Point translation(0,0,0),tmp_trf;
+        random_rot_vec.uniform_random();
+        translation.shapeRandom(ARLCORE_SHAPE_CUBE, VolumeSize);
+        arlCore::vnl_rotation3d_matrix random_rot_mat(random_rot_vec);
+        arlCore::vnl_rigid_matrix T1, T2;
+        T1.setRotation(random_rot_mat);
+        for( i=0 ; i<3 ; ++i )
+             T1.put(i,3, translation[i] );
+        arlCore::PointList::sptr point_plan_a_recaler = arlCore::PointList::New(3);
+            //on change la transfo de maniere a positionner les points dans le champ de vue des cameras
+        T1.put(0,3, centre->x() );T1.put(1,3, centre->y() );T1.put(2,3, centre->z() );
+        for(i=0; i<point_monde_plan->size(); ++i)
+        {//on met dans point_plan_a_recaler la position des points plans 3D dans le repere monde avec z=0
+            point_plan_a_recaler->push_back( (*point_monde_plan)[i] );
+            T1.trf( (*point_monde_plan)[i] );
+        }
+        T1.invert();
+        for( i=0 ; i<cameras.size() ; ++i)
+        {
+            std::vector<arlCore::Point::csptr> reprojection2D;
+            arlCore::SmartPointList::sptr splMonde = arlCore::SmartPointList::New();
+            scene.detection( i+1, 1, splMonde, GaussianNoise2D );
+            splMonde->getPoints(reprojection2D, i+1, tag_monde_plan);
+            std::vector<double> log, param_optimisation;
+            T2.setIdentity();
+            std::vector< arlCore::Point::csptr> tmp =  point_plan_a_recaler->getListCopy();
+            if( arlCore::planarHomographyRegistration_3D_2D(cameras[i], reprojection2D, tmp ,  T2, param_optimisation, log, true) ) //VAG FIXME PERF getListCopy()
+            {
+                T1.compareInverse(T2, errorT, errorR);
+                addValue(errorTranslation, errorT);
+                addValue(errorRotation, errorR);
+                ++robustnessOK;
+            }
+            ++robustnessTotal;
+        }
+    }//boucle compteur
+    bool test = printErrors("Erreur sur la translation",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur la rotation",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testReconstructionPolyscopic
+bool arlCore::testReconstructionPolyscopic( long int nbIterations, double tolerance)
+{
+    printHeader("Polyscopic reconstruction",nbIterations, tolerance);
+    const bool Verbose = false;
+    const double GaussianNoise2D=0.0;
+    std::vector<double> log;
+    std::vector<long int> robustnessOK, robustnessTotal;
+    arlCore::Point::sptr point_reconstruit = arlCore::Point::New();
+    long int compteur;
+    unsigned int i,j,k,enum_recons,plane=0;
+    std::vector< vnl_vector_fixed<double,5> > errorReproj;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        //std::cerr << "Iteration " << compteur <<std::endl;
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+        const unsigned int NbCameras = (unsigned int)scene.getCameras().size();
+        const unsigned int NbPoints = (unsigned int)scene.getTags().getTag(0)->getGeometry()->size();
+        const std::vector<arlCore::Camera> &cameras = scene.getCameras().getList();
+        // creation de points 3D autour du point mire
+        // worldPoints = point dans un volume pour tester le recalage 3D/3D et ISPPC OSPPC et EPPC
+        // FONCTION(point_mire, nombre de points max, parametre de tirage, points tires, points tires bruites, param bruit)
+        const arlCore::Tag::sptr tag_monde = scene.getTags().getTag(0);
+        const arlCore::Tag::sptr tag_monde_plan = scene.getTags().getTag(1);
+       PointList::csptr worldPoints = tag_monde->getGeometry();
+        std::vector< std::vector<arlCore::Point::csptr> > reprojection2D(NbCameras);
+        arlCore::SmartPointList::sptr splMonde= arlCore::SmartPointList::New();
+        for( j=0 ; j<NbCameras ; ++j)
+        {
+            scene.detection( j+1, 0, splMonde, GaussianNoise2D );
+            splMonde->getPoints(reprojection2D[j], j+1, tag_monde);
+        }
+        for(enum_recons=arlCore::ARLCORE_R3D_UNKNOWN +1,k=0; enum_recons<arlCore::ARLCORE_R3D_NBTYPE; ++enum_recons,++k)
+        {
+            if(Verbose) std::cerr << "Changement de methode\n";
+            if( compteur==0 )
+            {
+                vnl_vector_fixed<double,5> tmp(0.0);
+                errorReproj.push_back(tmp);
+                robustnessOK.push_back(0);
+                robustnessTotal.push_back(0);
+            }
+            for( i=0 ; i<NbPoints ; ++i )
+            {
+                std::vector<arlCore::Point::csptr> pointList2D;
+                    for( j=0 ; j<NbCameras ; ++j )
+                        pointList2D.push_back(reprojection2D[j][i]);
+                    if( arlCore::reconst3D( pointList2D, cameras, point_reconstruit, (arlCore::ARLCORE_RECONSTRUCTION3D) enum_recons, plane, log) )
+                    {
+                        const double Error = point_reconstruit->distance( (*worldPoints)[i] );
+                        addValue(errorReproj[k], Error);
+                        if(Verbose) std::cerr << "Point reconstruit = "<< (*point_reconstruit)[0] <<" "<< (*point_reconstruit)[1] <<" "<<(*point_reconstruit)[2] <<"\n";
+                        ++robustnessOK[k];
+                    }
+                    ++robustnessTotal[k];
+            }
+        }
+    }//boucle compteur
+    bool test = true;
+    for(enum_recons=arlCore::ARLCORE_R3D_UNKNOWN+1,i=0; enum_recons<arlCore::ARLCORE_R3D_NBTYPE; ++enum_recons,++i)
+    {
+        std::string name="Reconstruction error ("+arlCore::ARLCORE_RECONSTRUCTION3D_NAMES[enum_recons]+")";
+        test = printErrors(name,errorReproj[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+    }
+    return printFooter(nbIterations, test);
+}
+
+// testReconstructionPolyscopicUncertainty
+bool arlCore::testReconstructionPolyscopicUncertainty( long int nbIterations, double tolerance)
+{
+    printHeader("Polyscopic reconstruction uncertainty",nbIterations, tolerance);
+    const bool Verbose = false;
+    const double rangeGaussianNoise2D_x=2.0, rangeGaussianNoise2D_y=2.0;
+    std::vector<double> log;
+    std::vector< std::vector<double> > index_mu(6);//(nbIterations);
+    std::vector< vnl_vector<double> > errorVector;
+    std::vector<long int> robustnessOK, robustnessTotal;
+    arlCore::Point::sptr point_reconstruit =  arlCore::Point::New();
+    long int compteur, nbpt=0;
+    unsigned int i,j,k,enum_recons,plane=0;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe,200,1);
+        const unsigned int nbCameras = (unsigned int)scene.getCameras().size();
+        const unsigned int nbPoints = scene.getTags().getTag(0)->getGeometry()->size();
+        const std::vector<arlCore::Camera> &cameras = scene.getCameras().getList();
+        // creation de points 3D autour du point mire
+        // worldPoints = point dans un volume pour tester le recalage 3D/3D et ISPPC OSPPC et EPPC
+        // FONCTION(point_mire, nombre de points max, parametre de tirage, points tires, points tires bruites, param bruit)
+        const arlCore::Tag::sptr tag_monde = scene.getTags().getTag(0);
+        const arlCore::Tag::sptr tag_monde_plan = scene.getTags().getTag(1);
+       PointList::csptr worldPoints = tag_monde->getGeometry();
+        std::vector< std::vector<arlCore::Point::sptr> > reprojection2D(nbCameras);
+        std::vector< std::vector<arlCore::Point::csptr> > reprojection2D_nonoise(nbCameras);
+        arlCore::SmartPointList::sptr  splMonde = arlCore::SmartPointList::New();
+        for( j=0 ; j<nbCameras ; ++j)
+        {
+            scene.detection( j+1, 0, splMonde, 0.0 );
+            splMonde->getPoints(reprojection2D_nonoise[j], j+1, tag_monde);
+            for( i=0 ; i<nbPoints ; ++i )
+            {
+                arlCore::Point::sptr tmp = arlCore::Point::New(2);
+                reprojection2D[j].push_back(tmp);
+            }
+        }
+        double GaussianNoise2D_x = arlRandom::Random::gaussianRnd(rangeGaussianNoise2D_x);
+        double GaussianNoise2D_y = arlRandom::Random::gaussianRnd(rangeGaussianNoise2D_y);
+        double GaussianNoise2D = 0.1;//arlRandom::Random::gaussianRnd(rangeGaussianNoise2D);
+//      std::cerr << "GaussianNoise2D_x["<<compteur<<"] =" << GaussianNoise2D_x<<std::endl;
+//      std::cerr << "GaussianNoise2D_y["<<compteur<<"] =" << GaussianNoise2D_y<<std::endl;
+        std::cerr << "GaussianNoise2D["<<compteur<<"] =" << GaussianNoise2D<<std::endl;
+//      for( j=0 ; j<nbCameras ; ++j)
+//          for( i=0 ; i<nbPoints ; ++i )
+//          {
+//              reprojection2D[j][i]->set(0, reprojection2D[j][i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise2D_x));
+//              reprojection2D[j][i]->set(1, reprojection2D[j][i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise2D_y));
+//              arlCore::vnl_covariance_matrix &cov_mat = reprojection2D[j][i]->getCovMatrix();
+//              cov_mat.put(0,0,GaussianNoise2D_x*GaussianNoise2D_x);
+//              cov_mat.put(1,0,0.0);
+//              cov_mat.put(0,1,0.0);
+//              cov_mat.put(1,1,GaussianNoise2D_y*GaussianNoise2D_y);
+//          }
+
+//      for(enum_recons=arlCore::ARLCORE_R3D_UNKNOWN +1,k=0; enum_recons<arlCore::ARLCORE_R3D_NBTYPE; ++enum_recons,++k)
+        for(enum_recons=arlCore::ARLCORE_R3D_TWO_LINES_APPROX ,k=0; enum_recons<=arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION; ++enum_recons,++k)
+//      for(enum_recons=arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION ,k=0; enum_recons<=arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY; ++enum_recons,++k)
+        {
+            if( compteur==0 )
+            {
+                vnl_vector<double> tmp(nbIterations);
+                errorVector.push_back(tmp);
+                robustnessOK.push_back(0);
+                robustnessTotal.push_back(0);
+            }
+
+            if(enum_recons == arlCore::ARLCORE_R3D_TWO_LINES_APPROX || enum_recons == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION)
+{
+            if(enum_recons == arlCore::ARLCORE_R3D_TWO_LINES_APPROX)
+            {
+                for( j=0 ; j<nbCameras ; ++j)
+                {
+                    for( i=0 ; i<nbPoints ; ++i )
+                    {
+                        //*reprojection2D[j][i] = *reprojection2D_nonoise[j][i];
+                        //std::cerr<<"reprojection2D_nonoise ="<<reprojection2D_nonoise[j][i]->x()<<" "<<reprojection2D_nonoise[j][i]->y()<<"\n";
+                        reprojection2D[j][i]->set(0, reprojection2D_nonoise[j][i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise2D));
+                        reprojection2D[j][i]->set(1, reprojection2D_nonoise[j][i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise2D));
+                        //std::cerr<<"reprojection2D="<<reprojection2D[j][i]->x()<<" "<<reprojection2D[j][i]->y()<<"\n";
+                        arlCore::vnl_covariance_matrix &cov_mat = reprojection2D[j][i]->getCovMatrix();
+                        cov_mat.put(0,0,GaussianNoise2D*GaussianNoise2D);
+                        cov_mat.put(1,0,0.0);
+                        cov_mat.put(0,1,0.0);
+                        cov_mat.put(1,1,GaussianNoise2D*GaussianNoise2D);
+                        //std::cerr<<"cov_mat="<<cov_mat<<"\n";
+                    }
+                }
+            }
+//          if(enum_recons == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION)
+//          {
+//              for( j=0 ; j<nbCameras ; ++j)
+//              {
+//                  for( i=0 ; i<nbPoints ; ++i )
+//                  {
+//                      //*reprojection2D[j][i] = *reprojection2D_nonoise[j][i];
+//                      //std::cerr<<"reprojection2D_nonoise ="<<reprojection2D_nonoise[j][i]->x()<<" "<<reprojection2D_nonoise[j][i]->y()<<"\n";
+//                      reprojection2D[j][i]->set(0, reprojection2D_nonoise[j][i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise2D));
+//                      reprojection2D[j][i]->set(1, reprojection2D_nonoise[j][i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise2D));
+//                      //std::cerr<<"reprojection2D="<<reprojection2D[j][i]->x()<<" "<<reprojection2D[j][i]->y()<<"\n";
+//                      arlCore::vnl_covariance_matrix &cov_mat = reprojection2D[j][i]->getCovMatrix();
+//                      cov_mat.put(0,0,GaussianNoise2D*GaussianNoise2D);
+//                      cov_mat.put(1,0,0.0);
+//                      cov_mat.put(0,1,0.0);
+//                      cov_mat.put(1,1,GaussianNoise2D*GaussianNoise2D);
+//                      //std::cerr<<"cov_mat="<<cov_mat<<"\n";
+//                  }
+//              }
+//          }
+            if(enum_recons == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY)
+            {
+                for( j=0 ; j<nbCameras ; ++j)
+                {
+                    for( i=0 ; i<nbPoints ; ++i )
+                    {
+                        //*reprojection2D[j][i] = *reprojection2D_nonoise[j][i];
+                        //std::cerr<<"reprojection2D_nonoise ="<<reprojection2D_nonoise[j][i]->x()<<" "<<reprojection2D_nonoise[j][i]->y()<<"\n";
+                        ((Point::sptr)reprojection2D[j][i])->set(0, reprojection2D_nonoise[j][i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise2D_x));
+                        ((Point::sptr)reprojection2D[j][i])->set(1, reprojection2D_nonoise[j][i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise2D_y));
+                        //std::cerr<<"reprojection2D="<<reprojection2D[j][i]->x()<<" "<<reprojection2D[j][i]->y()<<"\n";
+                        arlCore::vnl_covariance_matrix &cov_mat = ((Point::sptr)reprojection2D[j][i])->getCovMatrix();
+                        cov_mat.put(0,0,GaussianNoise2D_x*GaussianNoise2D_x);
+                        cov_mat.put(1,0,0.0);
+                        cov_mat.put(0,1,0.0);
+                        cov_mat.put(1,1,GaussianNoise2D_y*GaussianNoise2D_y);
+                        //std::cerr<<"cov_mat="<<cov_mat<<"\n";
+                    }
+                }
+
+            }
+            double reconstructionError = 0.0;
+            for( i=0 ; i<nbPoints ; ++i )
+            {
+                std::vector<arlCore::Point::csptr> pointList2D;
+                    for( j=0 ; j<nbCameras ; ++j )
+                        pointList2D.push_back(reprojection2D[j][i]);
+                    if(arlCore::reconst3D( pointList2D, cameras, point_reconstruit, (arlCore::ARLCORE_RECONSTRUCTION3D) enum_recons, plane, log))
+                    {
+//                      if(i==0)
+                        {
+                            vnl_matrix<double> soustraction(3,1);
+                            vnl_vector<double> tt(3);
+                            tt[0] = (*worldPoints)[i]->x();tt[1] = (*worldPoints)[i]->y();tt[2] = (*worldPoints)[i]->z();
+                            soustraction.set_column(0, point_reconstruit->getCoordinates() - tt);
+                            //std::cerr << "soustraction =\n"<<soustraction<<std::endl;
+                            //std::cerr << "cov matrice =\n"<<point_reconstruit.getCovMatrix()<<std::endl;
+                            //std::cerr << "trace cov matrice =\n"<<sqrt( point_reconstruit.getCovMatrix()[0][0] +point_reconstruit.getCovMatrix()[1][1]+point_reconstruit.getCovMatrix()[2][2])<<std::endl;
+//                          index_mu[compteur] = (soustraction.transpose() * vnl_matrix_inverse<double> (point_reconstruit.getCovMatrix()) * soustraction)(0,0);
+                            index_mu[k].push_back( (soustraction.transpose() * vnl_matrix_inverse<double> (point_reconstruit->getCovMatrix()) * soustraction)(0,0) );
+                            std::cerr << "index_mu["<<k<<"]["<<compteur<<"] =" << index_mu[k][compteur]<<std::endl;
+//                          std::cerr << "index_mu["<<compteur<<"] =" << index_mu[compteur]<<std::endl;
+                        }
+                        reconstructionError += point_reconstruit->distance( (*worldPoints)[i] );
+                        if(Verbose) std::cerr << "Point reconstruit = "<< (*point_reconstruit)[0] <<" "<< (*point_reconstruit)[1] <<" "<<(*point_reconstruit)[2] <<"\n";
+                        ++robustnessOK[k];
+                        ++nbpt;
+                    }
+                    ++robustnessTotal[k];
+            }
+            errorVector[k][compteur] = reconstructionError/(double)nbPoints;
+}
+        }
+    }//boucle compteur
+    for(enum_recons=arlCore::ARLCORE_R3D_TWO_LINES_APPROX ,k=0; enum_recons<=arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION; ++enum_recons,++k)
+    {
+        if(enum_recons == arlCore::ARLCORE_R3D_TWO_LINES_APPROX || enum_recons == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION)
+        {
+            std::cerr << "index_mu["<<k<<"] size =" << (unsigned int)index_mu[k].size()<<std::endl;
+            //for( i=0 ; i<index_mu[k].size() ; ++i )
+            //  std::cerr << "index_mu ["<<k<<"] =" << index_mu[k][i]<<std::endl;
+
+            if(enum_recons == arlCore::ARLCORE_R3D_TWO_LINES_APPROX)
+            {
+                arlCore::WriteTableau ( (char *)"PredictionSigma3D_ARLCORE_R3D_TWO_LINES_APPROX", index_mu[k], nbIterations);
+                arlCore::KSValidation3D(  (char *)"PredictionSigma3D_ARLCORE_R3D_TWO_LINES_APPROX" );
+            }
+
+            if(enum_recons == arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION)
+            {
+                arlCore::WriteTableau (   (char *)"PredictionSigma3D_ARLCORE_R3D_REPROJECTION_OPTIMIZATION", index_mu[k], nbIterations);
+                arlCore::KSValidation3D(  (char *)"PredictionSigma3D_ARLCORE_R3D_REPROJECTION_OPTIMIZATION" );
+            }
+
+        }
+    }
+
+    bool test = true;
+    for(enum_recons=arlCore::ARLCORE_R3D_UNKNOWN+1,i=0; enum_recons<arlCore::ARLCORE_R3D_NBTYPE; ++enum_recons,++i)
+    {
+        std::string name="Reconstruction error ("+arlCore::ARLCORE_RECONSTRUCTION3D_NAMES[enum_recons]+")";
+        test = printErrors(name,errorVector[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+    }
+    return printFooter(nbIterations, test);
+}
+
+// testEpipolarMatching
+bool arlCore::testEpipolarMatching( long int nbIterations, double tolerance )
+{
+    const double VolumeSize = 2000.0;
+    const double GaussianNoise2D = 0.0;
+    printHeader("Epipolar matching",nbIterations, tolerance);
+    arlCore::Point::sptr reprojection2D = arlCore::Point::New(2);
+    arlCore::Point::csptr p;
+    unsigned int i,j,k;
+    vnl_vector<double> corrects(nbIterations,0.0);
+    vnl_vector<double> nonCorrects(nbIterations,0.0);
+    vnl_vector<double> nonApparies(nbIterations,0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        const unsigned int NbPointsModel = (unsigned int)arlRandom::Random::uniformDoubleRnd( 10, 20 );
+        //TODO : Gerer outliers 2D
+        arlCore::PlaneSystem universe;
+        arlCore::SceneUnitTest scene(universe);
+        arlCore::SmartPointList::sptr spl = arlCore::SmartPointList::New();
+        arlCore::PointList::sptr worldPoints = arlCore::PointList::New();
+        worldPoints->shapeRandom(NbPointsModel, arlCore::ARLCORE_SHAPE_SPHERE,arlCore::Point::New(0.0,0.0,0.0), VolumeSize); //arlCore::ARLCORE_SHAPE_PLAINSQUARE
+        const std::vector<arlCore::Camera> &cameras = scene.getCameras().getList();
+        if(cameras.size()>=2)
+        {   // Il doit y a avoir au moins 2 cameras dans la scene
+            const unsigned int NbCameras = 2;
+            ++robustnessTotal;
+            std::vector< std::vector< arlCore::Point::csptr > > realMatching(worldPoints->size());
+            std::vector< std::vector<arlCore::Point::csptr> > matching;
+            // Creation du jeu d'essai
+            for( i=0 ; i<worldPoints->size() ; ++i )
+                for( j=0 ; j<NbCameras ; ++j )
+                {
+                    cameras[j].project3DPoint( (*worldPoints)[i], reprojection2D);
+                    reprojection2D->addGaussianNoise(GaussianNoise2D);
+                    p = spl->push_back( reprojection2D , j+1);
+                    realMatching[i].push_back(p);
+                }
+            arlCore::epipolarMatching( cameras, spl, matching, GaussianNoise2D );
+            if(matching.size()>0)
+            {   // Est-ce que les appariements obtenus sont corrects ?
+                ++robustnessOK;
+                for( i=0 ; i<matching.size() ; ++i )
+                {
+                    bool found = false;
+                    for( j=0 ; j<realMatching.size() && !found ; ++j )
+                    {
+                        bool b=true;
+                        for( k=0 ; k<NbCameras ; ++k )
+                            b=b && matching[i][k]==realMatching[j][k];
+                        found = found || b;
+                    }
+                    if(!found) ++nonCorrects[compteur]; else ++corrects[compteur];
+                }
+            }
+            nonApparies[compteur]=realMatching.size()-corrects[compteur];
+        }
+    }//boucle compteur
+    vnl_vector<double> total(nbIterations);
+    total=corrects+nonCorrects;
+    bool test = printErrors("Nombre d'appariements incorrects",nonCorrects,robustnessOK,robustnessTotal,tolerance);
+    printErrors("Proportion vrais appariements/total",element_quotient(corrects,total),robustnessOK,robustnessTotal,-1);
+    printErrors("Proportion faux appariements/total",element_quotient(nonCorrects,total),robustnessOK,robustnessTotal,-1);
+    printErrors("Proportion non apparies/total",element_quotient(nonApparies,total),robustnessOK,robustnessTotal,-1);
+    return printFooter(nbIterations, test);
+}
+
+// testInitIntrinsicCalibration
+bool arlCore::testInitIntrinsicCalibration( long int nbIterations, double tolerance )
+{
+    const unsigned int nb_Cameras_MAX = 1, nb_Poses_MAX=30;
+    printHeader("Intrinsic calibration initialization",nbIterations, tolerance);
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    vnl_vector_fixed<double,5> errorIntrinsic(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        arlCore::PlaneSystem universe;
+        std::vector<double> k_range(4);
+        k_range[0]=k_range[1]=k_range[2]=k_range[3]=0;
+        SceneUnitTestInitIntrinsicCalib scene(universe, k_range, nb_Cameras_MAX, nb_Poses_MAX);
+        const unsigned int nbPoses = scene.getNbPoses();
+        unsigned int i,j;
+        const std::vector< arlCore::Camera > &liste_camera = scene.getCameras().getList();
+        const arlCore::Camera &cam = liste_camera[0];
+        std::vector< arlCore::PointList::csptr > listeWorldPoints(nbPoses);
+        //listeWorldPoints[k] contient la geometrie 3D de Tag[k]
+        for( i=0 ; i<nbPoses ; ++i )
+        {
+           PointList::csptr worldPoints = scene.getTags().getTag(i)->getGeometry();
+           listeWorldPoints[i] = worldPoints ;
+        }
+        arlCore::vnl_rotation3d_matrix rot_mat;
+        std::vector< arlCore::vnl_rigid_matrix > liste_extrinsic_alea(nbPoses);
+        for( i=0 ; i<nbPoses ; ++i )
+        {   //creation de petites transformations appliquees au damier 3D
+            arlCore::vnl_rigid_matrix tmp;
+            tmp.uniform_random( 30 );
+            liste_extrinsic_alea[i] = tmp;
+        }//liste_extrinsic_alea[i] contient 1 transfo aleatoire representant un mouvement du Tag[i]
+        std::vector< arlCore::PointList::sptr > reprojection2DNC(nbPoses);
+        for( i=0 ; i<nbPoses ; ++i )//pour chaque position du damier on calcule les reprojections 2D
+            {   //on applique liste_extrinsic_alea[i] au Tag[i]
+                reprojection2DNC[i] = arlCore::PointList::New();
+                arlCore::PointList::sptr  modelPoints = arlCore::PointList::New(listeWorldPoints[i]->size() );
+                liste_extrinsic_alea[i].trf( listeWorldPoints[i] , modelPoints );
+                cam.project3DPoint(modelPoints, reprojection2DNC[i]);
+            }
+        //VAG FIXME PERF BEGIN
+        std::vector< arlCore::PointList::csptr > reprojection2D(nbPoses);
+        std::copy( reprojection2DNC.begin(),  reprojection2DNC.end(),  reprojection2D.begin() );
+        //VAG FIXME PERF END
+
+        vnl_matrix_fixed<double,3,3> mat_arrangee;
+        for( i=0 ; i<nbPoses ; ++i )// avec notre facon de creer le monde H[i] = IntrinsicMatrix * ExtrinsicMatrixModifie * liste_extrinsic_alea[i]
+        {//ExtrinsicMatrixModifie est la matrice 3x3 [r1 r2 t] ou r1 r2 et t sont les 1er, 2nd et 4ieme vecteur colonne de ExtrinsicMatrix
+            for( j=0 ; j<3 ; ++j)
+                {
+                    mat_arrangee(j,0) = (cam.getExtrinsic()* liste_extrinsic_alea[i])(j,0);
+                    mat_arrangee(j,1) = (cam.getExtrinsic()* liste_extrinsic_alea[i])(j,1);
+                    mat_arrangee(j,2) = (cam.getExtrinsic()* liste_extrinsic_alea[i])(j,3);
+                }
+                //std::cerr<<"matrice arrangee = "<<mat_arrangee<<std::endl;
+                //std::cerr<<"H[i] solution = "<<cam.getIntrinsicMatrix() * mat_arrangee/(cam.getIntrinsicMatrix() * mat_arrangee)(2,2)<<std::endl;
+        }
+        arlCore::Camera camera_init(universe);
+        std::vector< arlCore::vnl_rigid_matrix > extrinsic_init(nbPoses);
+        /////////////////////////INITIALISATION
+        std::vector<double> log, optimiser_parameters;
+        if(arlCore::initIntrinsicCalibration(listeWorldPoints, reprojection2D, camera_init, extrinsic_init, optimiser_parameters, log))
+        {   //Calcul des erreurs
+            double errorI, errorR=0 ,errorT=0;
+            errorI = fabs(camera_init.getfx()-cam.getfx())+fabs(camera_init.getfy()-cam.getfy())
+                            + fabs(camera_init.getcx()-cam.getcx())+fabs(camera_init.getcy()-cam.getcy());
+            for( i=0 ; i<nbPoses ; ++i )
+            {   //verification du calcul des matrices extrinseques
+                arlCore::vnl_rigid_vector realT(cam.getExtrinsic()*liste_extrinsic_alea[i]), estimateT(extrinsic_init[i]);
+                //std::cerr<<"extrinsic_init["<<i<<"]" << std::endl << extrinsic_init[i] <<std::endl;
+                //std::cerr<<"verite extrinsic["<<i<<"]"<< std::endl<<cam.getExtrinsic()*liste_extrinsic_alea[i]<<std::endl;
+                errorR += fabs(realT[0]- estimateT[0])+fabs(realT[1]- estimateT[1])+fabs(realT[2]- estimateT[2]);
+                errorT += fabs(realT[3]- estimateT[3])+fabs(realT[4]- estimateT[4])+fabs(realT[5]- estimateT[5]);
+            }
+            addValue(errorTranslation, errorT/3/nbPoses);
+            addValue(errorRotation, errorR/3/nbPoses);
+            addValue(errorIntrinsic, errorI);
+            ++robustnessOK;
+        }
+        ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreurs sur la translation extrinseque",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur la rotation extrinseque",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    test = printErrors("Erreur sur les parametres intrinseques",errorIntrinsic,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testIntrinsicCalibration
+bool arlCore::testIntrinsicCalibration( long int nbIterations, double tolerance )
+{
+    const double GaussianNoise2D = 0.0;
+    const unsigned int nbParameters = 8, nb_Cameras_MAX=1, nb_Poses_MAX=30;
+    printHeader("Intrinsic calibration",nbIterations, tolerance);
+
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    vnl_vector_fixed<double,5> errorIntrinsic(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        //std::cerr<<"Compteur ="<<compteur<<std::endl;
+        arlCore::PlaneSystem universe;
+        std::vector<double> k_range(4);
+        k_range[0]=0.01;k_range[1]=0.01;k_range[2]=0.0001;k_range[3]=0.0001;
+//      k_range[0]=0.0;k_range[1]=0.0;k_range[2]=0.0;k_range[3]=0.0;
+
+        SceneUnitTestInitIntrinsicCalib scene(universe, k_range, nb_Cameras_MAX, nb_Poses_MAX);
+        const unsigned int nbPoses = scene.getNbPoses();
+        unsigned int i,k;
+
+        const arlCore::Camera &cam = scene.getCameras()[0];
+        std::vector< arlCore::PointList::csptr > listeWorldPoints;
+        listeWorldPoints.reserve(nbPoses);//listeWorldPoints[k] contient la geometrie 3D de Tag[k]
+        for( k=0 ; k<nbPoses ; ++k )
+        {
+           PointList::csptr worldPoints = scene.getTags().getTag(k)->getGeometry();
+           listeWorldPoints.push_back(  worldPoints );
+        }
+        arlCore::Point::sptr point2D = arlCore::Point::New(2);;
+        arlCore::vnl_rotation3d_matrix rot_mat;
+        std::vector< arlCore::vnl_rigid_matrix > liste_extrinsic_alea(nbPoses);
+        for( k=0 ; k<nbPoses ; ++k )
+        {   //creation de petites transformations appliquees au damier 3D
+            arlCore::vnl_rigid_matrix tmp;
+            tmp.uniform_random( 30 );
+            liste_extrinsic_alea[k] = tmp;
+        }//liste_extrinsic_alea[k] contient 1 transfo aleatoire représentant un mouvement du Tag[k]
+        std::vector< arlCore::PointList::sptr > reprojection2DNC(nbPoses);
+        std::vector< arlCore::PointList::sptr > reprojection2D_bruiteeNC(nbPoses);
+        for( k=0 ; k<nbPoses ; ++k )//pour chaque position du damier on calcule les reprojections 2D
+        {   //on applique liste_extrinsic_alea[k] au Tag[k]
+            reprojection2DNC[k] =  arlCore::PointList::New();
+            reprojection2D_bruiteeNC[k] =  arlCore::PointList::New();
+            arlCore::PointList::sptr modelPoints =  arlCore::PointList::New(listeWorldPoints[k]->size() );
+            liste_extrinsic_alea[k].trf(listeWorldPoints[k],modelPoints);
+            cam.project3DPoint(modelPoints, reprojection2DNC[k]);
+            cam.project3DPoint(modelPoints, reprojection2D_bruiteeNC[k]);
+        }
+        for( k=0 ; k<nbPoses ; ++k )//on rajoute du bruit 2D sur la variable reprojection2D_bruitee
+            for( i=0 ; i<scene.getChessNbPoints(k) ; ++i)//cela servira a initialiser imparfaitement pour refineIntrinsicCalibration
+            {
+                (*(reprojection2D_bruiteeNC[k]))[i]->addGaussianNoise(GaussianNoise2D);
+                //std::cerr<<"reprojection2D_bruitee["<<k<<"]["<<i<<"]="<<reprojection2D_bruitee[k][i]->getString() <<std::endl;
+                //std::cerr<<"reprojection2D["<<k<<"]["<<i<<"]="<<reprojection2D[k][i]->getString() <<std::endl;
+            }
+        vnl_matrix_fixed<double,3,3> mat_arrangee;
+        for( k=0 ; k<nbPoses ; ++k )// avec notre facon de creer le monde H[k] = IntrinsicMatrix * ExtrinsicMatrixModifie * liste_extrinsic_alea[k]
+        {//ExtrinsicMatrixModifie est la matrice 3x3 [r1 r2 t] ou r1 r2 et t sont les 1er, 2nd et 4ieme vecteur colonne de ExtrinsicMatrix
+            for( i=0 ; i<3 ; ++i)
+                {
+                    mat_arrangee(i,0) = (cam.getExtrinsic()* liste_extrinsic_alea[k])(i,0);
+                    mat_arrangee(i,1) = (cam.getExtrinsic()* liste_extrinsic_alea[k])(i,1);
+                    mat_arrangee(i,2) = (cam.getExtrinsic()* liste_extrinsic_alea[k])(i,3);
+                }
+//              std::cerr<<"matrice arrangee = "<<mat_arrangee<<std::endl;
+//              std::cerr<<"H[i] solution = "<<cam.getIntrinsicMatrix() * mat_arrangee/(cam.getIntrinsicMatrix() * mat_arrangee)(2,2)<<std::endl;
+        }
+        arlCore::Camera camera_init(universe);
+        std::vector< arlCore::vnl_rigid_matrix > extrinsic_init(nbPoses);
+        /////////////////////////INITIALISATION & RAFFINEMENT
+        std::vector<double> log, optimiser_parameters;
+        optimiser_parameters.push_back(0);//Optimisation method choice 0 =LM, 1=POWELL
+        optimiser_parameters.push_back(0);//Verbose choice
+//      optimiser_parameters.push_back(1e-10);//set f_tolerance
+
+        //VAG FIXME PERF BEGIN
+        std::vector< arlCore::PointList::csptr > reprojection2D_bruitee(nbPoses);
+        std::vector< arlCore::PointList::csptr > reprojection2D(nbPoses);
+        std::copy( reprojection2D_bruiteeNC.begin(),  reprojection2D_bruiteeNC.end(),  reprojection2D_bruitee.begin() );
+        std::copy( reprojection2DNC.begin(),  reprojection2DNC.end(),  reprojection2D.begin() );
+        //VAG FIXME PERF END
+        if(arlCore::initIntrinsicCalibration(listeWorldPoints, reprojection2D_bruitee, camera_init, extrinsic_init, optimiser_parameters, log))
+            if(arlCore::refineIntrinsicCalibration(listeWorldPoints, reprojection2D, nbParameters, camera_init, extrinsic_init, optimiser_parameters, log))
+            {   // Calcul des erreurs
+                double errorI, errorR=0 ,errorT=0;
+                errorI = fabs(camera_init.getfx()-cam.getfx())+fabs(camera_init.getfy()-cam.getfy())
+                        + fabs(camera_init.getcx()-cam.getcx())+fabs(camera_init.getcy()-cam.getcy())
+                        + fabs(camera_init.getkc(0)-cam.getkc(0))+fabs(camera_init.getkc(1)-cam.getkc(1))
+                        + fabs(camera_init.getkc(2)-cam.getkc(2))+fabs(camera_init.getkc(3)-cam.getkc(3));
+//              std::cerr<<"error intrinseque ="<<errorI<<std::endl;
+//              std::cerr<<"Solution   fx fy cx cy k1 k2 k3 k4 = "<<cam.getfx()<<" "<<cam.getfy()<<" "<<cam.getcx()<<" "<<cam.getcy()<<" "<<cam.getkc(0)<<" "<<cam.getkc(1)<<" "<<cam.getkc(2)<<" "<<cam.getkc(3)<<" "<<std::endl;
+//              std::cerr<<"Estimation fx fy cx cy k1 k2 k3 k4 = "<<camera_init.getfx()<<" "<<camera_init.getfy()<<" "<<camera_init.getcx()<<" "<<camera_init.getcy()<<" "<<camera_init.getkc(0)<<" "<<camera_init.getkc(1)<<" "<<camera_init.getkc(2)<<" "<<camera_init.getkc(3)<<" "<<std::endl;
+                for( k=0 ; k<nbPoses ; ++k )
+                {   //verification du calcul des matrices extrinseques
+                    arlCore::vnl_rigid_vector realT(cam.getExtrinsic()*liste_extrinsic_alea[k]), estimateT(extrinsic_init[k]);
+//                  std::cerr<<"extrinsic_init["<<k<<"]" << std::endl << extrinsic_init[k] <<std::endl;
+//                  std::cerr<<"verite extrinsic["<<k<<"]"<< std::endl<<cam.getExtrinsic()*liste_extrinsic_alea[k]<<std::endl;
+                    errorR += fabs(realT[0]- estimateT[0])+fabs(realT[1]- estimateT[1])+fabs(realT[2]- estimateT[2]);
+                    errorT += fabs(realT[3]- estimateT[3])+fabs(realT[4]- estimateT[4])+fabs(realT[5]- estimateT[5]);
+                }
+                addValue(errorTranslation, errorT/3/nbPoses);
+                addValue(errorRotation, errorR/3/nbPoses);
+                addValue(errorIntrinsic, errorI);
+                ++robustnessOK;
+            }
+            ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreurs sur la translation extrinseque",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur la rotation extrinseque",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    test = printErrors("Erreur sur les parametres intrinseques",errorIntrinsic,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testInitExtrinsicCalibration
+bool arlCore::testInitExtrinsicCalibration( long int nbIterations, double tolerance )
+{
+// TODO : description du test unitaire
+// Ce test unitaire cree une scene contenant plusieurs cameras avec plusieurs poses
+// les cameras sont tires dans une sphere ayant pour centre un point proche de l'origine.
+// toutes les cameras sont orientes vers ce point (tire dans une sphere de rayon 100 autour de l'origine)
+// Les poses sont des objets plans avec Z=0 tires  autour de l'origine
+// pour simuler des poses, on applique a ces objets des transformation rigides aleatoires
+// avec un faible alea sur les translations (les trsf sont contenues dans liste_extrinsic_alea)
+// On calcule ensuite la reprojection des objets rigidement transformes dans les cameras
+// On lance alors les algorithmes de calibrage extrinseques et on les compare a la verite terrain.
+// Le calcul de la verite terrain se fait grace a la connaissance de la position de chaque camera
+// par rapport au repere monde et grace a la connaissance des trsf aleatoires appliques aux objets rigides de calibrage
+// On rappelle qu'on cherche a determiner :
+// 1) les poses extrinseques Te_k par rapport a la premiere camera tel que
+// sum ||P1(Te_k*Mk_i) - mk_i ||^2 soit minimal. P1 correspond a la fonction de projection
+// de la premiere camera avec des parametres extrinseque a l'identit� !!
+// Mk_i sont les pts 3D du modele dans son repere pour la pose k
+// mk_i sont les points 2D reprojetes visibles ET invisibles (ils sont alors NULL) pour la pose k
+//
+// 2) les transformations Ts_j entre les reperes de chaque camera par rapport a la premiere, tel que
+// sum ||Pj(Ts_j*Te_0*M0_i) - m0_j_i ||^2 soit minimal. Pj correspond a la fonction de projection
+// de la j ieme camera avec des parametres extrinseque a l'identit� aussi.
+// M0_i sont les pts 3D du modele dans son repere pour la pose 0 de la camera j
+// m0_j_i sont les pts 3D du modele dans son repere pour la pose 0 de la camera j
+//
+// Mk_i sont les points des modeles 3D originaux avant applications des trsf aleatoires
+// les points reprojetes correspondant dans chaque camera sont les:
+// mk_j_i = T_ext_cam_j * T_alea_k * Mk_i
+// En l'occurence la verite terrain des Te_k vaut  T_ext_cam_0 * T_alea_k (on rappelle que
+// les parametres intrinseques de chaque camera sont consideres a l'identite lors de l'optimisation du critere)
+//
+// la verite terrain des Ts_j peut se calculer a partir de la pose 0 uniquement (en supposant que
+// l'objet pose 0 est visible par toutes les cameras en meme temps) alors:
+// mk_j_i = T_ext_cam_j * T_alea_k * Mk_i = Ts_j * Te_0 = Ts_j * T_ext_cam_0 * T_alea_k * Mk_i
+// donc    T_ext_cam_j = Ts_j * T_ext_cam_0        donc     Ts_j  = T_ext_cam_j * T_ext_cam_0^(-1)
+    const double gaussianNoise2D = 0.0;
+    const unsigned int nb_Cameras_MAX = 10, nb_Poses_MAX=10;
+    printHeader("Extrinsic initialization calibration",nbIterations, tolerance);
+
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    vnl_vector_fixed<double,5> errorIntrinsic(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        arlCore::PlaneSystem universe;
+        std::vector<double> k_range(4);
+        k_range[0]=0.5;k_range[1]=1.0;k_range[2]=0.01;k_range[3]=0.01;
+
+        SceneUnitTestInitIntrinsicCalib scene(universe, k_range, nb_Cameras_MAX, nb_Poses_MAX);
+        const unsigned int nbPoses = scene.getNbPoses();
+        const unsigned int nbCameras = (unsigned int)scene.getCameras().size();
+        unsigned int i,j,k;
+        const std::vector< arlCore::Camera > &liste_camera = scene.getCameras().getList();
+        std::vector< arlCore::PointList::csptr > listeWorldPoints(nbPoses);//listeWorldPoints[k] contient la geometrie 3D de Tag[k]
+        for( k=0 ; k<nbPoses ; ++k )
+        {
+           PointList::csptr worldPoints = scene.getTags().getTag(k)->getGeometry();
+           assert( worldPoints );
+           assert( worldPoints->size() );
+           listeWorldPoints[k] = worldPoints;
+        }
+        arlCore::Point::sptr point2D = arlCore::Point::New(2);;
+        arlCore::vnl_rotation3d_matrix rot_mat;
+        std::vector< arlCore::vnl_rigid_matrix > liste_extrinsic_alea(nbPoses);
+        for( k=0 ; k<nbPoses ; ++k )
+        {   //creation de petites transformations appliquees au damier 3D
+            arlCore::vnl_rigid_matrix tmp;
+            tmp.uniform_random( 30 );
+            liste_extrinsic_alea[k] = tmp;
+//          std::cerr<<"liste_extrinsic_alea["<<k<<"]="<<liste_extrinsic_alea[k].getString()<<std::endl;
+        }//liste_extrinsic_alea[k] contient 1 transfo aleatoire reprzsentant un mouvement du Tag[k]
+        std::vector< std::vector< std::vector< arlCore::Point::csptr > > > reprojection2D(nbPoses);
+        for( k=0 ; k<nbPoses ; ++k)
+        {
+            reprojection2D[k].resize(nbCameras);
+            arlCore::PointList::sptr modelPoints =  arlCore::PointList::New(listeWorldPoints[k]->size() );
+            liste_extrinsic_alea[k].trf(listeWorldPoints[k],modelPoints);
+            for( j=0 ; j<nbCameras ; ++j )//pour chaque position du damier on calcule les reprojections 2D
+            {   //on applique liste_extrinsic_alea[k] au Tag[k]
+                reprojection2D[k][j].resize(listeWorldPoints[k]->size());
+//              std::cerr<<"listeWorldPoints[k].size()"<<listeWorldPoints[k].size()<<std::endl;
+//              std::cerr<<"reprojection2D["<<k<<"]["<<j<<"].size()"<<reprojection2D[k][j].size()<<std::endl;
+                for( i=0 ; i< listeWorldPoints[k]->size(); ++i )
+                {
+                    arlCore::Point::sptr pt = arlCore::Point::New(2);
+                    liste_camera[j].project3DPoint( (*modelPoints)[i],  pt );
+                    reprojection2D[k][j][i] = pt;
+                }
+            }
+        }
+        for( k=0 ; k<nbPoses ; ++k )//on rajoute du bruit 2D sur la variable reprojection2D_bruitee
+            for( j=0 ; j<nbCameras ; ++j )
+                for( i=0 ; i<scene.getChessNbPoints(k) ; ++i)//cela servira a initialiser imparfaitement pour refineIntrinsicCalibration
+                {
+                    arlCore::Point::constCast( reprojection2D[k][j][i] )->addGaussianNoise(gaussianNoise2D);
+                    //std::cerr<<"reprojection2D_bruitee["<<k<<"]["<<i<<"]="<<reprojection2D_bruitee[k][i]->getString() <<std::endl;
+                    //std::cerr<<"reprojection2D["<<k<<"]["<<i<<"]="<<reprojection2D[k][i]->getString() <<std::endl;
+                }
+        std::vector< arlCore::Camera > liste_camera_identity;
+        arlCore::vnl_rigid_matrix identity;
+        identity.set_identity();
+        for( j=0 ; j<nbCameras ; ++j )
+        {
+            liste_camera_identity.push_back(arlCore::Camera (liste_camera[j]));
+            liste_camera_identity[j].setExtrinsic(identity);
+        }
+        std::vector< arlCore::vnl_rigid_matrix> init_rigid_trsf((nbCameras-1)+nbPoses);
+        std::vector<double> log_init, optimiser_parameters;
+        //INITIALISATION DU CALIBRAGE
+//        //VAG FIXME PERF BEGIN
+//        std::vector< arlCore::PointList::csptr > reprojection2D(nbPoses);
+//        std::copy( reprojection2DNC.begin(),  reprojection2DNC.end(),  reprojection2D.begin() );
+//        //VAG FIXME PERF END
+        arlCore::initExtrinsicCalibration( listeWorldPoints, reprojection2D, liste_camera_identity, init_rigid_trsf, optimiser_parameters, log_init );
+        std::vector<arlCore::vnl_rigid_matrix> solution((nbCameras-1)+nbPoses);
+        for( k=0 ; k<nbPoses ; ++k )
+        {
+            arlCore::vnl_rigid_matrix var;
+            var.mult(liste_camera[0].getExtrinsic(), liste_extrinsic_alea[k]);
+            solution[k] = var;
+        }
+        for( i=1 ; i<nbCameras ; ++i )
+        {
+            arlCore::vnl_rigid_matrix var;
+            var.mult(liste_camera[i].getExtrinsic(), liste_camera[0].getInvExtrinsic());
+            solution[nbPoses+i-1] = var;
+        }
+        for( i=0 ; i<(nbCameras-1)+nbPoses ; ++i )
+        {
+            double error_t, error_r;
+            init_rigid_trsf[i].compare(solution[i], error_t, error_r);
+//          std::cerr<<"erreur t = "<< error_t << "   erreur r = "<< error_r<<std::endl;
+        }
+        double errorR=0 ,errorT=0;
+        for( i=0 ; i<(nbCameras-1)+nbPoses ; ++i )
+        {   //verification du calcul des matrices extrinseques
+            arlCore::vnl_rigid_vector realT(solution[i]), estimateT(init_rigid_trsf[i]);
+            //std::cerr<<"extrinsic_init["<<i<<"]" << std::endl << extrinsic_init[i] <<std::endl;
+            //std::cerr<<"verite extrinsic["<<i<<"]"<< std::endl<<cam.getExtrinsic()*liste_extrinsic_alea[i]<<std::endl;
+            errorR += fabs(realT[0]- estimateT[0])+fabs(realT[1]- estimateT[1])+fabs(realT[2]- estimateT[2]);
+            errorT += fabs(realT[3]- estimateT[3])+fabs(realT[4]- estimateT[4])+fabs(realT[5]- estimateT[5]);
+        }
+        addValue(errorTranslation, errorT/3/nbPoses);
+        addValue(errorRotation, errorR/3/nbPoses);
+        ++robustnessOK;
+        ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreurs sur les translations extrinseques",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur les rotations extrinseques",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testExtrinsicCalibration
+bool arlCore::testExtrinsicCalibration( long int nbIterations, double tolerance )
+{
+// TODO description du test unitaire
+// A SAVOIR : visiblement l'algorithme de calibrage extrinseque a du mal a s'arreter
+// lorsqu'on cree plus de 8 cameras. Il faudra peut etre ajouter une condition temporelle
+// pour forcer l'algorithme a s'arreter lorsque les erreurs stagnent
+    const double gaussianNoise2D = 0.0;
+    const unsigned int nb_Cameras_MAX=8, nb_Poses_MAX=10;
+    printHeader("Extrinsic calibration",nbIterations, tolerance);
+
+    vnl_vector_fixed<double,5> errorRotation(0.0);
+    vnl_vector_fixed<double,5> errorTranslation(0.0);
+    vnl_vector_fixed<double,5> errorIntrinsic(0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        arlCore::PlaneSystem universe;
+        std::vector<double> k_range(4);
+        k_range[0]=0.5;k_range[1]=1.0;k_range[2]=0.01;k_range[3]=0.01;
+
+        SceneUnitTestInitIntrinsicCalib scene(universe, k_range, nb_Cameras_MAX, nb_Poses_MAX);
+        const unsigned int nbPoses = scene.getNbPoses();
+        const unsigned int nbCameras = (unsigned int)scene.getCameras().size();
+        unsigned int i,j,k;
+        const std::vector< arlCore::Camera > &liste_camera = scene.getCameras().getList();
+
+        std::vector< arlCore::PointList::csptr > listeWorldPoints(nbPoses);//listeWorldPoints[k] contient la geometrie 3D de Tag[k]
+        for( i=0 ; i<nbPoses ; ++i )
+        {
+           PointList::csptr worldPoints = scene.getTags().getTag(i)->getGeometry();
+            listeWorldPoints[i] = worldPoints;
+        }
+        arlCore::Point::sptr point2D = arlCore::Point::New(2);;
+        arlCore::vnl_rotation3d_matrix rot_mat;
+        std::vector< arlCore::vnl_rigid_matrix > liste_extrinsic_alea(nbPoses);
+
+        for( i=0 ; i<nbPoses ; ++i )
+        {   //creation de petites transformations appliquees au damier 3D
+            arlCore::vnl_rigid_matrix tmp;
+            tmp.uniform_random( 30 );
+            liste_extrinsic_alea[i] = tmp;
+//          std::cerr<<"liste_extrinsic_alea["<<i<<"]="<<liste_extrinsic_alea[i].getString()<<std::endl;
+        }//liste_extrinsic_alea[i] contient 1 transfo aleatoire représentant un mouvement du Tag[k]
+        std::vector< std::vector< std::vector< arlCore::Point::csptr > > > reprojection2D(nbPoses);
+        std::vector< std::vector< std::vector< arlCore::Point::csptr > > > reprojection2D_bruitee(nbPoses);
+        for( k=0 ; k<nbPoses ; ++k)
+        {
+            reprojection2D[k].resize(nbCameras);
+            reprojection2D_bruitee[k].resize(nbCameras);
+            arlCore::PointList::sptr modelPoints = arlCore::PointList::New( listeWorldPoints[k]->size() );
+            liste_extrinsic_alea[k].trf(listeWorldPoints[k],modelPoints);
+            for( j=0 ; j<nbCameras ; ++j )//pour chaque position du damier on calcule les reprojections 2D
+            {   //on applique liste_extrinsic_alea[k] au Tag[k]
+                reprojection2D[k][j].resize(listeWorldPoints[k]->size());
+//              std::cerr<<"listeWorldPoints[k].size()"<<listeWorldPoints[k].size()<<std::endl;
+//              std::cerr<<"reprojection2D["<<k<<"]["<<j<<"].size()"<<reprojection2D[k][j].size()<<std::endl;
+
+                reprojection2D_bruitee[k][j].resize(listeWorldPoints[k]->size());
+                for( i=0 ; i< listeWorldPoints[k]->size(); ++i )
+                {
+                    arlCore::Point::sptr p1 = arlCore::Point::New(2);
+                    arlCore::Point::sptr p2 = arlCore::Point::New(2);
+                    //std::cerr<<"*((*modelPoints)[i])"<<(*modelPoints)[i]->getString()<<std::endl;
+                    liste_camera[j].project3DPoint( (*modelPoints)[i] , p1 );
+                    reprojection2D[k][j][i] = p1;
+                    liste_camera[j].project3DPoint( (*modelPoints)[i] , p2 );
+                    reprojection2D_bruitee[k][j][i] = p2;
+                }
+            }
+        }
+        for( k=0 ; k<nbPoses ; ++k )//on rajoute du bruit 2D sur la variable reprojection2D_bruitee
+            for( j=0 ; j<nbCameras ; ++j )
+                for( i=0 ; i<scene.getChessNbPoints(k) ; ++i)//cela servira a initialiser imparfaitement pour refineIntrinsicCalibration
+                {
+                    arlCore::Point::constCast( reprojection2D_bruitee[k][j][i])->addGaussianNoise(gaussianNoise2D);
+                }
+
+
+        std::vector< const arlCore::Camera* > liste_camera_identity;
+        arlCore::vnl_rigid_matrix identity;
+        identity.set_identity();
+        for( j=0 ; j<nbCameras ; ++j )
+        {
+            arlCore::Camera *var=new arlCore::Camera (liste_camera[j]);
+            var->setExtrinsic(identity);
+            liste_camera_identity.push_back(var);
+        }
+
+        std::vector< arlCore::vnl_rigid_matrix> init_rigid_trsf((nbCameras-1)+nbPoses);
+        std::vector<double> log_init, optimiser_parameters;
+        const double Method = 0; // 0=LEVENBERG-MARQUARDT 1=POWELL
+        optimiser_parameters.push_back(Method);
+        //INITIALISATION DU CALIBRAGE
+        arlCore::initExtrinsicCalibration(listeWorldPoints, reprojection2D_bruitee, liste_camera_identity, init_rigid_trsf, optimiser_parameters, log_init );
+        arlCore::refineExtrinsicCalibration(listeWorldPoints, reprojection2D, liste_camera_identity, init_rigid_trsf, optimiser_parameters, log_init );
+        std::vector<arlCore::vnl_rigid_matrix> solution((nbCameras-1)+nbPoses);
+        for( i=0 ; i<nbPoses ; ++i )
+        {
+            arlCore::vnl_rigid_matrix var;
+            var.mult(liste_camera[0].getExtrinsic(), liste_extrinsic_alea[i]);
+            solution[i] = var;
+        }
+        for( i=1 ; i<nbCameras ; ++i )
+        {
+            arlCore::vnl_rigid_matrix var;
+            var.mult(liste_camera[i].getExtrinsic(), liste_camera[0].getInvExtrinsic());
+            solution[nbPoses+i-1] = var;
+        }
+        for( i=0 ; i<(nbCameras-1)+nbPoses ; ++i )
+        {
+            double error_t, error_r;
+            init_rigid_trsf[i].compare(solution[i], error_t, error_r);
+//          std::cerr<<"erreur t = "<< error_t << "   erreur r = "<< error_r<<std::endl;
+        }
+        double errorR=0 ,errorT=0;
+        for( i=0 ; i<(nbCameras-1)+nbPoses ; ++i )
+        {   //verification du calcul des matrices extrinseques
+            arlCore::vnl_rigid_vector realT(solution[i]), estimateT(init_rigid_trsf[i]);
+            //std::cerr<<"extrinsic_init["<<i<<"]" << std::endl << extrinsic_init[i] <<std::endl;
+            //std::cerr<<"verite extrinsic["<<i<<"]"<< std::endl<<cam.getExtrinsic()*liste_extrinsic_alea[i]<<std::endl;
+            errorR += fabs(realT[0]- estimateT[0])+fabs(realT[1]- estimateT[1])+fabs(realT[2]- estimateT[2]);
+            errorT += fabs(realT[3]- estimateT[3])+fabs(realT[4]- estimateT[4])+fabs(realT[5]- estimateT[5]);
+        }
+        addValue(errorTranslation, errorT/3/nbPoses);
+        addValue(errorRotation, errorR/3/nbPoses);
+        ++robustnessOK;
+    ++robustnessTotal;
+//boucle compteur
+    }
+
+    bool test = printErrors("Erreurs sur les translations extrinseques",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur les rotations extrinseques",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+
+    return 0;
+}
+
+// testRigidTransfo
+bool arlCore::testRigidTransfo( unsigned int nbIterations, double tolerance )
+{
+    printHeader("Transformations rigides",nbIterations, tolerance);
+    const bool Verbose = false;
+    const double cubicSize = 1000;
+    unsigned int i;
+    vnl_vector_fixed<double,5> error1(0.0), error2(0.0);
+    double errorT, errorR;
+    vnl_rigid_matrix m1;
+    for( i=0 ; i<nbIterations ; ++i )
+    {
+        vnl_rigid_vector v1(m1);
+        vnl_rigid_matrix m2(v1);
+        vnl_rigid_vector v2(m2);
+        vnl_rigid_matrix m3(v2);
+        m1.compare(m3, errorT, errorR);
+        addValue(error1, errorT);
+        addValue(error2, errorR);
+        bool error = (errorT>tolerance || errorR>tolerance);
+        if(error && Verbose) std::cerr<<m1.as_matrix()<<"\n";
+/*      if(error && Verbose) std::cerr<<v1.as_vector()<<"\n\n";
+        if(error && Verbose) std::cerr<<m2.as_matrix()<<"\n";
+        if(error && Verbose) std::cerr<<v2.as_vector()<<"\n\n";*/
+        if(error && Verbose) std::cerr<<m3.as_matrix()<<"\n";
+        if(error && Verbose) std::cerr<<"----------------------------\n";
+        m1.uniform_random(cubicSize);
+    }
+    bool test = true;
+    test = printErrors("Translation error",error1,0,0,tolerance,false) && test;
+    test = printErrors("Rotation error",error2,0,0,tolerance,false) && test;
+    return printFooter(nbIterations, test);
+}
+
+// testRegistration3D3DwithoutMatching
+bool arlCore::testRegistration3D3DwithoutMatching( long int nbIterations, double tolerance )
+{
+    // Constantes de recalage
+    const double GaussianNoise3D = 0.0;
+    const double decimage = 1.0;
+    // Constantes de cr�ation du phantom
+    const double TransfVolumeSize = 500.0;
+    const double VolumeSize = 400.0;
+    const unsigned int NbpointsModel = 10;
+    const unsigned int NbOutLiers = 2;
+    const double ProbaSousEchantillon = 0.8;
+    unsigned int i;
+    Point::sptr point3D = arlCore::Point::New(3);
+    printHeader("Registration 3D/3D without matching",nbIterations, tolerance);
+    vnl_vector<double> errorRotation(nbIterations,0.0);
+    vnl_vector<double> errorTranslation(nbIterations,0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        arlCore::PointList::sptr modelPoints = arlCore::PointList::New(3);
+        arlCore::PointList::sptr worldPoints = arlCore::PointList::New(3);
+        arlCore::PointList::sptr outLiers = arlCore::PointList::New(3);
+        modelPoints->shapeRandom(NbpointsModel, ARLCORE_SHAPE_SPHERE,arlCore::Point::New(0.0,0.0,0.0), VolumeSize); //ARLCORE_SHAPE_PLAINSQUARE
+        arlCore::vnl_rigid_matrix T1, T2;
+        T1.uniform_random(TransfVolumeSize);
+        for( i=0 ; i<modelPoints->size() ; ++i)
+            if(arlRandom::Random::uniformDoubleRnd( 0.0, 1.0 )<ProbaSousEchantillon)
+            {
+                T1.trf( (*modelPoints)[i] , point3D);
+                worldPoints->push_back(point3D);
+            }
+        for( i=0 ; i<worldPoints->size() ; ++i )
+            (*worldPoints)[i]->addGaussianNoise(GaussianNoise3D);
+        outLiers->shapeRandom(NbOutLiers, ARLCORE_SHAPE_SPHERE, arlCore::Point::New(0.0,0.0,0.0), VolumeSize);
+        worldPoints->push_back(outLiers);
+        if(T2.register3D3DwithoutMatching(modelPoints, worldPoints, true, GaussianNoise3D, decimage))
+        {
+            ++robustnessOK;
+            T1.compare(T2, errorTranslation[compteur], errorRotation[compteur]);
+        }
+        ++robustnessTotal;
+    }//boucle compteur
+    bool test = printErrors("Erreur sur la translation",errorTranslation,robustnessOK,robustnessTotal,tolerance);
+    test = printErrors("Erreur sur la rotation",errorRotation,robustnessOK,robustnessTotal,tolerance) && test;
+    return printFooter(nbIterations, test);
+}
+
+// test3D3DMatching
+bool arlCore::test3D3DMatching( long int nbIterations, double tolerance )
+{
+    // Constantes de matching
+    const double GaussianNoise3D = 0.0;
+    const double Decimage = 0.8;
+    // Constantes de creation du phantom
+    const double TransfVolumeSize = 500.0;
+    const double VolumeSize = 400.0;
+    const unsigned int NbpointsModel = 15;
+    const unsigned int NbOutLiers = 5;
+    const double ProbaSousEchantillon = 0.8;
+
+    unsigned int i,j;
+    Point::sptr point3D = Point::New(3);
+    printHeader("3D/3D matching",nbIterations, tolerance);
+    vnl_vector<double> corrects(nbIterations,0.0);
+    vnl_vector<double> nonCorrects(nbIterations,0.0);
+    vnl_vector<double> nonApparies(nbIterations,0.0);
+    long int robustnessOK=0, robustnessTotal=0;
+    long int compteur;
+    for( compteur=0 ; compteur<nbIterations ; ++compteur )
+    {
+        std::vector< arlCore::Point::csptr > realMatchingA, realMatchingB;
+        arlCore::PointList::sptr modelPoints = arlCore::PointList::New(3);
+        arlCore::PointList::sptr worldPoints = arlCore::PointList::New(3);
+        arlCore::PointList::sptr outLiers = arlCore::PointList::New(3);
+        modelPoints->shapeRandom(NbpointsModel, ARLCORE_SHAPE_SPHERE,arlCore::Point::New(0.0,0.0,0.0), VolumeSize); //ARLCORE_SHAPE_PLAINSQUARE
+        arlCore::vnl_rigid_matrix T1;
+        T1.uniform_random(TransfVolumeSize);
+        for( i=0 ; i<modelPoints->size() ; ++i)
+            if(arlRandom::Random::uniformDoubleRnd( 0.0, 1.0 )<ProbaSousEchantillon)
+            {
+                T1.trf( (*modelPoints)[i] , point3D);
+                realMatchingA.push_back( (*modelPoints)[i] );
+                worldPoints->push_back(point3D);
+                realMatchingB.push_back( worldPoints->back() );
+            }
+        for( i=0 ; i<worldPoints->size() ; ++i )
+            (*worldPoints)[i]->addGaussianNoise(GaussianNoise3D);
+        outLiers->shapeRandom(NbOutLiers, ARLCORE_SHAPE_SPHERE, arlCore::Point::New(0.0,0.0,0.0), VolumeSize);
+        worldPoints->push_back(outLiers);
+        arlCore::PointList::sptr Va =  arlCore::PointList::New();
+        arlCore::PointList::sptr Vb =  arlCore::PointList::New();
+        assert(realMatchingA.size()==realMatchingB.size());
+
+        if(arlCore::matching3D3D(modelPoints, worldPoints, GaussianNoise3D, Decimage, Va, Vb)>0)
+        {   // Est-ce que les appariements obtenus sont corrects ?
+            ++robustnessOK;
+            for( i=0 ; i<Va->size() ; ++i )
+            {
+                bool found = false;
+                for( j=0 ; j<realMatchingA.size() && !found ; ++j )
+                    found = found || (realMatchingA[j]==(*Va)[i] && realMatchingB[j]==(*Vb)[i]);
+                if(!found) ++nonCorrects[compteur]; else ++corrects[compteur];
+            }
+        }
+        nonApparies[compteur]=realMatchingA.size()-corrects[compteur];
+        ++robustnessTotal;
+    }//boucle compteur
+    vnl_vector<double> total(nbIterations);
+    total=corrects+nonCorrects;
+
+    bool test = printErrors("Nombre d'appariements incorrects",nonCorrects,robustnessOK,robustnessTotal,tolerance);
+    printErrors("Proportion vrais appariements/total",element_quotient(corrects,total),robustnessOK,robustnessTotal,-1);
+    printErrors("Proportion faux appariements/total",element_quotient(nonCorrects,total),robustnessOK,robustnessTotal,-1);
+    printErrors("Proportion non apparies/total",element_quotient(nonApparies,total),robustnessOK,robustnessTotal,-1);
+    return printFooter(nbIterations, test);
+}
+
+    // The 9 first parameters are used for the initialization of SceneCriterionComparison:
+    // number of point (parameters[0])
+    // number of camera  (parameters[1])
+    // angle between the camera  (parameters[2])
+    // size of the shape in which the 3D points are randomly chosen  (parameters[3])
+    // shape of the random 3D points  (parameters[4])
+    // number of control point  (parameters[5])
+    // distance between the control point center and the registration point   (parameters[6])
+    // size of the shape in which the control points are randomly chosen  (parameters[7])
+    // shape of the random control points   (parameters[8])
+    //
+    // Then the other parameters of the experiments (variable or static) are found at the end of the vector
+    // noise on 3D points (parameters[9][10][11])
+    // noise on 2D points (parameters[12][13])
+    // information on the initilisation rigid transformation (0=close to the solution; 1=identity; 2=randomly chosen)(parameters[14])
+bool arlCore::testRegistrationCriteriaComparison( long int nbIterations, std::vector<double> parameters, std::vector<double> staticStatus,
+                                                std::vector< vnl_vector<double>* > erreur_recalage_methode, std::vector< vnl_vector<double>* > duree_recalage_methode,
+                                                 std::vector< vnl_vector<double>* > robustesse_recalage_methode )
+{
+    const bool Verbose = false;
+    const unsigned int nbMethode = 12;
+    erreur_recalage_methode.resize(nbMethode);
+    duree_recalage_methode.resize(nbMethode);
+    robustesse_recalage_methode.resize(nbMethode);
+    const double TransfVolumeSize = 500.0;
+    const double rangeGaussianNoise3D_X = parameters[9], rangeGaussianNoise3D_Y = parameters[10], rangeGaussianNoise3D_Z = parameters[11];
+    const double rangeGaussianNoise2D_X = parameters[12], rangeGaussianNoise2D_Y = parameters[13];
+    double GaussianNoise3D_X, GaussianNoise3D_Y, GaussianNoise3D_Z, GaussianNoise2D_X, GaussianNoise2D_Y, RSB_3D=0.0, RSB_2D=0.0;
+    const unsigned int nbTypes = arlCore::ARLCORE_PR_NBTYPES;
+    //printHeader("Projective registration",nbIterations, tolerance);
+//  std::vector< vnl_vector<double> > erreur_recalage_methode(nbMethode);
+//  std::vector< vnl_vector<double> > duree_recalage_methode(nbMethode);
+    std::vector< vnl_vector_fixed<double,5> > errorRotation(nbTypes);
+    std::vector< vnl_vector_fixed<double,5> > errorTranslation(nbTypes);
+    std::vector<long int> robustnessOK(nbTypes), robustnessTotal(nbTypes);
+    long int compteur;
+    arlCore::Object registrationDuration;
+    unsigned int enum_3D2D, enum_3D3D, i, plane_reconstruction;
+    long int j;
+    std::vector<double> log_reconstruction, registrationError;
+    for( i=0 ; i<nbMethode ; ++i )
+    {
+        erreur_recalage_methode[i] = new vnl_vector<double>(nbIterations);
+        duree_recalage_methode[i] = new vnl_vector<double>(nbIterations);
+        robustesse_recalage_methode[i] = new vnl_vector<double>(nbIterations);
+    }
+    for( compteur=0 ; compteur<nbIterations ; ++compteur)
+    {
+        //std::cerr<<"ITERATION No "<<compteur<<std::endl;
+        //Scene creation
+        arlCore::PlaneSystem universe;
+        std::vector<double> noiseValues(5);
+        //do{
+        //Noise computation
+        if(staticStatus[9] == 0 && staticStatus[10] == 0 && staticStatus[11] == 0 ){
+        GaussianNoise3D_X = fabs(arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_X));
+        GaussianNoise3D_Y = fabs(arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_Y));
+        GaussianNoise3D_Z = fabs(arlRandom::Random::gaussianRnd(rangeGaussianNoise3D_Z));}
+        else{
+        GaussianNoise3D_X = rangeGaussianNoise3D_X;
+        GaussianNoise3D_Y = rangeGaussianNoise3D_Y;
+        GaussianNoise3D_Z = rangeGaussianNoise3D_Z;}
+        if(Verbose) std::cerr<<"GaussianNoise3D_X ="<<GaussianNoise3D_X<<std::endl<<"GaussianNoise3D_Y ="<<GaussianNoise3D_Y<<std::endl<<"GaussianNoise3D_Z ="<<GaussianNoise3D_Z<<std::endl;
+        if(staticStatus[12] == 0 && staticStatus[13] == 0){
+        GaussianNoise2D_X = fabs(arlRandom::Random::gaussianRnd(rangeGaussianNoise2D_X));
+        GaussianNoise2D_Y = fabs(arlRandom::Random::gaussianRnd(rangeGaussianNoise2D_Y));}
+        else{
+        GaussianNoise2D_X = rangeGaussianNoise2D_X;
+        GaussianNoise2D_Y = rangeGaussianNoise2D_Y;}
+        if(Verbose) std::cerr<<"GaussianNoise2D_X ="<<GaussianNoise2D_X<<std::endl<<"GaussianNoise2D_Y ="<<GaussianNoise2D_Y<<std::endl;
+        noiseValues[0] = GaussianNoise3D_X; noiseValues[1] = GaussianNoise3D_Y; noiseValues[2] = GaussianNoise3D_Z;
+        noiseValues[3] = GaussianNoise2D_X; noiseValues[4] = GaussianNoise2D_Y;
+        //arlCore::SceneCriterionComparison *scene_test=0;
+        //if(scene_test != 0)
+        //  delete scene_test;
+        //scene_test = new arlCore::SceneCriterionComparison(universe, parameters, staticStatus, noiseValues, RSB_3D, RSB_2D);
+        //}while(RSB_3D < 35 || RSB_2D < 35);exit(0);
+        arlCore::SceneCriterionComparison scene(universe, parameters, staticStatus, noiseValues, RSB_3D, RSB_2D);
+        const unsigned int nbCameras = (unsigned int)scene.getCameras().size();
+        const unsigned int nbModelPoints = scene.getTags().getTag(0)->getGeometry()->size();
+        const std::vector<arlCore::Camera> &cameras = scene.getCameras().getList();
+       PointList::csptr regPoints     = scene.getTags().getTag(0)->getGeometry();
+       PointList::csptr controlPoints = scene.getTags().getTag(1)->getGeometry();
+        std::vector< std::vector<arlCore::Point::csptr> >reprojection2D(cameras.size());
+        arlCore::SmartPointList::sptr  splMonde =  arlCore::SmartPointList::New();
+        for( i=0 ; i<cameras.size() ; ++i )
+        {
+            scene.detection( i+1, 0, splMonde, 0.0 );
+            splMonde->getPoints(reprojection2D[i], i+1, scene.getTags().getTag(0));
+        }
+        //Step 0 : creation of the seeked transformation T2 (= T1^-1 )
+        // creation of the initialisation
+        // application of T1 to modelPoints and controlModelPoints
+        arlCore::vnl_rigid_matrix T1,T2;
+        T1.uniform_random(TransfVolumeSize);
+        arlCore::PointList::sptr modelPoints= arlCore::PointList::New(3);
+        arlCore::PointList::sptr controlModelPoints= arlCore::PointList::New(3);
+
+        T1.trf(regPoints, modelPoints);
+        T1.trf(controlPoints, controlModelPoints);
+        T2.invert(T1);
+
+        std::vector< vnl_rigid_matrix > T_list; //list that contains the solution matrix
+        vnl_rigid_matrix trf_initialisation;
+        if(parameters[14] == 0)
+        {
+            trf_initialisation = T2;
+            trf_initialisation.setTranslation( trf_initialisation(0,3)+arlRandom::Random::uniformDoubleRnd(0,3), trf_initialisation(1,3)+arlRandom::Random::uniformDoubleRnd(0,3),trf_initialisation(2,3)+arlRandom::Random::uniformDoubleRnd(0,3));
+        }
+        if(parameters[14] == 1)
+            trf_initialisation.set_identity();
+        if(parameters[14] == 2)
+            trf_initialisation.uniform_random(TransfVolumeSize);
+
+        //Step 1 : creation of the noisy 3D points
+        arlCore::PointList::sptr modelPointsNoisy = arlCore::PointList::New(3);
+        for( i=0 ; i<modelPoints->size() ; ++i )
+        {
+            arlCore::Point::sptr tmp=arlCore::Point::New(3);
+            tmp->set(0, (*modelPoints)[i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise3D_X) );
+            tmp->set(1, (*modelPoints)[i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise3D_Y) );
+            tmp->set(2, (*modelPoints)[i]->z() + arlRandom::Random::gaussianRnd(GaussianNoise3D_Z) );
+            if(Verbose) std::cerr<<"modelPointsNoisy["<<i<<"]"<< (*modelPointsNoisy)[i]->getCoordinates()<<std::endl;
+            arlCore::vnl_covariance_matrix &cov_mat = tmp->getCovMatrix();
+            cov_mat.fill(0.0);
+            cov_mat.put(0,0,GaussianNoise3D_X*GaussianNoise3D_X);
+            cov_mat.put(1,1,GaussianNoise3D_Y*GaussianNoise3D_Y);
+            cov_mat.put(2,2,GaussianNoise3D_Z*GaussianNoise3D_Z);
+            if(Verbose) std::cerr<<"cov mat 3D["<<i<<"] ="<< tmp->getCovMatrix()<<std::endl;
+            modelPointsNoisy->push_back(tmp);
+        }
+        //Step 2 : creation of the noisy 2D points
+        std::vector< std::vector<arlCore::Point::csptr> > reprojection2DNoisy(cameras.size());
+        for( j=0 ; j<(long int)nbCameras ; ++j)
+        {
+            //reprojection2DNoisy[j].setDimension(2);
+            for( i=0 ; i<nbModelPoints ; ++i )
+            {
+                arlCore::Point::sptr tmp =  arlCore::Point::New(2);
+                tmp->set(0, reprojection2D[j][i]->x() + arlRandom::Random::gaussianRnd(GaussianNoise2D_X));
+                tmp->set(1, reprojection2D[j][i]->y() + arlRandom::Random::gaussianRnd(GaussianNoise2D_Y));
+                if(Verbose) std::cerr<<"reprojection2D["<<j<<"]["<<i<<"]"<<reprojection2D[j][i]->getCoordinates()<<std::endl;
+                if(Verbose) std::cerr<<"reprojection2DNoisy["<<j<<"]["<<i<<"]"<<reprojection2DNoisy[j][i]->getCoordinates()<<std::endl;
+                arlCore::vnl_covariance_matrix &cov_mat = tmp->getCovMatrix();
+                cov_mat.fill(0.0);
+                cov_mat.put(0,0,GaussianNoise2D_X*GaussianNoise2D_X);
+                cov_mat.put(1,1,GaussianNoise2D_Y*GaussianNoise2D_Y);
+                if(Verbose) std::cerr<<"cov mat 2D["<<i<<"] ="<< tmp->getCovMatrix()<<std::endl;
+                reprojection2DNoisy[j].push_back(tmp);
+            }
+        }
+        //Step 3 : reconstruction of the 2D points for 3D/3D registration
+        arlCore::PointList::sptr reconstructedPoints_Lines = arlCore::PointList::New(3);
+        arlCore::PointList::sptr reconstructedPoints_Opt = arlCore::PointList::New(3);
+        for( i=0 ; i<regPoints->size() ; ++i )
+        {
+            arlCore::Point::sptr tmp1 = arlCore::Point::New();
+            arlCore::Point::sptr tmp2 = arlCore::Point::New();
+            reconstructedPoints_Lines->push_back(tmp1);
+            reconstructedPoints_Opt->push_back(tmp2);
+            std::vector<Point::csptr> tmp_2D_point_list;
+            for( j=0 ; j<(long int)cameras.size() ; ++j )
+                tmp_2D_point_list.push_back(reprojection2DNoisy[j][i]);
+
+            registrationDuration.startLap();
+            reconst3D( tmp_2D_point_list, cameras, (*reconstructedPoints_Lines)[i], arlCore::ARLCORE_R3D_MULTI_LINES_APPROX, plane_reconstruction, log_reconstruction);
+            (*duree_recalage_methode[0])[compteur] = registrationDuration.getLap();
+            if(Verbose) std::cerr<<"(*reconstructedPoints_Lines)["<<i<<"]"<<(*reconstructedPoints_Lines)[i]->getCoordinates()<<std::endl;
+            registrationDuration.startLap();
+            reconst3D( tmp_2D_point_list, cameras, (*reconstructedPoints_Opt)[i]  , arlCore::ARLCORE_R3D_REPROJECTION_OPTIMIZATION_UNCERTAINTY, plane_reconstruction, log_reconstruction, -1, true);
+            (*duree_recalage_methode[1])[compteur] = registrationDuration.getLap();
+            (*duree_recalage_methode[2])[compteur] = registrationDuration.getLap();
+            (*duree_recalage_methode[3])[compteur] = registrationDuration.getLap();
+            if(Verbose) std::cerr<<"reconstructedPoints_Opt["<<i<<"]"<< (*reconstructedPoints_Opt)[i]->getCoordinates()<<std::endl;
+        }
+
+        //Step 4 : computation of the 3D/3D registration
+        T_list.push_back(trf_initialisation);
+        registrationDuration.startLap();
+        T_list[0].register3D3D(modelPointsNoisy, reconstructedPoints_Lines, true);
+        (*duree_recalage_methode[0])[compteur] += registrationDuration.getLap();// += because we take into account the time to reconstruct the points
+        if(T_list[0] == trf_initialisation)//check the robustness : has it converged or not ?
+                (*robustesse_recalage_methode[0])[compteur] = 1;
+
+        if(Verbose) std::cerr<<"T1 ="<<T1<<std::endl;
+        //std::cerr<<"T solution ="<<T2<<std::endl;
+        if(Verbose) std::cerr<<"T_list[0] ="<<T_list[0]<<std::endl;
+        T_list.push_back(trf_initialisation);
+        registrationDuration.startLap();
+        T_list[1].register3D3D(modelPointsNoisy, reconstructedPoints_Opt, true);
+        (*duree_recalage_methode[1])[compteur] += registrationDuration.getLap();// += because we take into account the time to reconstruct the points
+        if(T_list[1] == trf_initialisation)//check the robustness : has it converged or not ?
+                (*robustesse_recalage_methode[1])[compteur] = 1;
+        if(Verbose) std::cerr<<"Recalage 3D3D : methode directe"<<std::endl;
+        //std::cerr<<"T_list[1] ="<<T_list[1]<<std::endl;}
+
+        for(enum_3D3D = arlCore::ARLCORE_REGISTER3D3D_UNKNOWN+1,i=0; enum_3D3D <arlCore::ARLCORE_REGISTER3D3D_GC; ++enum_3D3D,++i)
+        {
+            std::vector< double > optimise_param, log_3D3D;
+            std::string name="Recalage 3D3D : methode "+arlCore::ARLCORE_REGISTER3D3D_NAMES[i+1];
+            if(Verbose) std::cerr<<name<<std::endl;
+            T_list.push_back(trf_initialisation);
+            registrationDuration.startLap();
+            T_list[2+i].register3D3DUncertainty(modelPointsNoisy, reconstructedPoints_Opt, (arlCore::ARLCORE_REGISTER3D3D)enum_3D3D, optimise_param, log_3D3D/*, modelPoints->size()*/ );
+            (*duree_recalage_methode[2+i])[compteur] += registrationDuration.getLap();// += because we take into account the time to reconstruct the points
+            if(Verbose)
+            {
+                for(j=0;j<(long int)log_3D3D.size();++j)
+                    std::cerr<<"log["<<j<<"] ="<<log_3D3D[j]<<std::endl;
+                std::cerr<<"T_list[2+i] ="<<T_list[2+i]<<std::endl;
+            }
+            if(T_list[2+i] == trf_initialisation)//check the robustness : has it converged or not ?
+                (*robustesse_recalage_methode[2+i])[compteur] = 1;
+        }
+        //Step 5 : computation of the 3D/2D registration
+        int offset = (int)T_list.size();
+        if(Verbose) std::cerr<<"T_list.size() ="<<(unsigned int)T_list.size()<<std::endl;
+        for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_ISPPC_CG; ++enum_3D2D,++i)
+        //for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_EPPC; ++enum_3D2D,++i)
+        {
+            std::string name="Recalage 3D2D : methode "+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[i+1];
+            if(Verbose) std::cerr<<name<<std::endl;
+            T_list.push_back(trf_initialisation);
+            //std::cerr<<"T_list[offset+i] ="<<T_list[offset+i]<<std::endl;
+            std::vector<double> log, param_optimisation;
+            registrationDuration.startLap();
+            arlCore::multiViewPointRegistration3D2D( cameras, reprojection2DNoisy ,  modelPointsNoisy ,
+                T_list[offset+i], (arlCore::ARLCORE_PROJECTIVE_REGISTRATION)enum_3D2D, param_optimisation, log, 1);
+            (*duree_recalage_methode[offset+i])[compteur] = registrationDuration.getLap();
+//          {
+//              T1.compareInverse(T2, errorT, errorR);
+//              addValue(errorTranslation[i], errorT);
+//              addValue(errorRotation[i], errorR);
+//              ++robustnessOK[i];
+//          }
+            if(Verbose)
+            {
+                for(j=0;j<(long int)log.size();++j)
+                    std::cerr<<"log["<<j<<"] ="<<log[j]<<std::endl;
+                std::cerr<<"T_list["<<offset+i<<"] ="<<T_list[offset+i]<<std::endl;
+            }
+            if(T_list[2+i] == trf_initialisation)//check the robustness : has it converged or not ?
+                (*robustesse_recalage_methode[2+i])[compteur] = 1;
+//          ++robustnessTotal[i];
+        }
+        //Step 6 : computation of registration error of each method using the control points
+        if(Verbose) std::cerr<< "CALCUL DES ERREURS "<<std::endl;
+        for(i=0;i<T_list.size();++i)
+        {
+            double error = 0;
+            arlCore::PointList::sptr temp_points = arlCore::PointList::New(3);
+            arlCore::Point::sptr toto = arlCore::Point::New(3);
+            for( j=0 ; j<(long int)controlModelPoints->size() ; ++j )
+                temp_points->push_back(toto);
+            T_list[i].trf(controlModelPoints,temp_points);
+            for( j=0 ; j<(long int)controlModelPoints->size() ; ++j )
+                error += (*temp_points)[j]->distance( (*controlPoints)[j] );
+            (*erreur_recalage_methode[i])[compteur] = error;
+            //std::cerr<< "Erreur de recalage methode ["<<i<<"]="<<registrationError[i] <<std::endl;
+        }
+    }//boucle compteur
+
+    for(enum_3D3D = arlCore::ARLCORE_REGISTER3D3D_UNKNOWN+1,i=0; enum_3D3D <arlCore::ARLCORE_REGISTER3D3D_GC; ++i)
+    {
+        if(i==0){
+        std::string name="Recalage 3D3D : methode directe avec reconstruction droite";
+        std::cerr<<name<<std::endl;}
+        else {if(i==1){
+        std::string name="Recalage 3D3D : methode directe avec reconstruction optimale";
+        std::cerr<<name<<std::endl;}
+        else{
+        std::string name="Recalage 3D3D : methode "+arlCore::ARLCORE_REGISTER3D3D_NAMES[i-1];
+        std::cerr<<name<<std::endl;++enum_3D3D;}}
+
+        vnl_vector<double> sub(nbIterations);
+        for( j=0 ; j<nbIterations ; ++j )
+        {
+            if(Verbose){std::cerr<< "Erreur de recalage methode ["<<i<<"]="<<(*erreur_recalage_methode[i])[j] <<std::endl;}
+            sub[j] = (*erreur_recalage_methode[i])[j] - erreur_recalage_methode[i]->mean();
+        }
+        std::cerr<< "Erreur MOYENNE de recalage methode ["<<i<<"]="<<erreur_recalage_methode[i]->mean() <<std::endl;
+        std::cerr<< "Erreur MAX de recalage methode ["<<i<<"]="<<erreur_recalage_methode[i]->max_value() <<std::endl;
+        std::cerr<< "Ecart-type de recalage methode ["<<i<<"]="<<sub.rms() <<std::endl;
+        std::cerr<<std::setprecision(10)<< "Duree MOYENNE de recalage methode ["<<i<<"]="<<duree_recalage_methode[i]->mean() <<std::endl<<std::endl;
+        std::cerr<< "Robustesse methode ["<<i<<"]="<<robustesse_recalage_methode[i]->sum() <<std::endl<<std::endl;
+    }
+    int offset2 = i;
+    std::cerr<<i<<std::endl;
+    //for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_EPPC; ++enum_3D2D,++i)
+    for(enum_3D2D=arlCore::ARLCORE_PR_UNKNOWN+1,i=0; enum_3D2D <arlCore::ARLCORE_PR_ISPPC_CG; ++enum_3D2D,++i)
+    {
+        std::string name="Recalage 3D2D : methode "+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[i+1];
+        std::cerr<<name<<std::endl;
+        vnl_vector<double> sub(nbIterations);
+        for( j=0 ; j<nbIterations ; ++j)
+        {
+            if(Verbose){std::cerr<< "Erreur de recalage methode ["<<i<<"]="<<(*erreur_recalage_methode[i+offset2])[j] <<std::endl;}
+            sub[j] = (*erreur_recalage_methode[i+offset2])[j] - erreur_recalage_methode[i+offset2]->mean();
+        }
+        std::cerr<< "Erreur MOYENNE de recalage methode ["<<i<<"]="<<erreur_recalage_methode[i+offset2]->mean() <<std::endl;
+        std::cerr<< "Erreur MAX de recalage methode ["<<i<<"]="<<erreur_recalage_methode[i+offset2]->max_value() <<std::endl;
+        std::cerr<< "Ecart-type de recalage methode ["<<i<<"]="<<sub.rms() <<std::endl;
+        std::cerr<<std::setprecision(10)<< "Duree MOYENNE de recalage methode ["<<i<<"]="<<duree_recalage_methode[i+offset2]->mean() <<std::endl<<std::endl;
+        std::cerr<< "Robustesse methode ["<<i<<"]="<<robustesse_recalage_methode[i+offset2]->sum() <<std::endl<<std::endl;
+    }
+    bool test=true;
+//  for(enum_3D2D=arlCore::ARLCORE_PR_ISPPC,i=0; enum_3D2D <arlCore::ARLCORE_PR_NBTYPES; ++enum_3D2D,++i)
+//  {
+//      std::string name="Translation error ("+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[enum_3D2D]+")";
+//      //test = printErrors(name,errorTranslation[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+//      name="Rotation error ("+arlCore::ARLCORE_PROJECTIVE_REGISTRATION_NAMES[enum_3D2D]+")";
+//      //test = printErrors(name,errorRotation[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+//  }
+    return printFooter(nbIterations, test);
+}
+
+// testSphereCenterEstimation
+bool arlCore::testSphereCenterEstimation( long int nbIterations, double tolerance )
+{
+    const bool Verbose = false;
+    const double GaussianNoise3D = 0.0; //0.001;
+    std::vector< vnl_vector_fixed<double,5> >errorRadius;
+    printHeader("Sphere center estimation from sparse point on its surface",nbIterations, tolerance);
+    double error;
+    std::vector<long int> robustnessOK, robustnessTotal;
+    long int i, compteur;
+    unsigned int enum_method;
+    for(enum_method=arlCore::ARLCORE_SCE_UNKNOWN+1,i=0; enum_method <arlCore::ARLCORE_SCE_NBMETHOD; ++enum_method, ++i)
+    {
+        for( compteur=0 ; compteur<nbIterations ; ++compteur )
+        {
+            if( compteur==0 )
+            {
+                vnl_vector_fixed<double,5> tmp(0.0);
+                errorRadius.push_back(tmp);
+                robustnessOK.push_back(0);
+                robustnessTotal.push_back(0);
+            }
+            unsigned int nbPoints = (unsigned int)floor( arlRandom::Random::uniformDoubleRnd(4, 50) );
+            arlCore::PointList::sptr surface_points =  arlCore::PointList::New(3);
+            arlCore::PointList::sptr  surface_points_rotated = arlCore::PointList::New(3);
+
+            arlCore::Point::sptr center =  arlCore::Point::New(0,0,0);
+            arlCore::Point::sptr center_estimation =  arlCore::Point::New(0,0,0);
+            double diameter, angle, radius_estimation;
+            std::vector<double> optimiser_parameter, log;
+            arlCore::vnl_rigid_matrix T;
+            T.uniform_random(0.0);
+            diameter = arlRandom::Random::uniformDoubleRnd(20, 500);
+            angle =  arlRandom::Random::uniformDoubleRnd(10, 360);
+            center->shapeRandom(arlCore::ARLCORE_SHAPE_CUBE,1000);
+            if(Verbose) std::cerr<< "nbPoints = "<<nbPoints <<std::endl;
+            if(Verbose) std::cerr<< "diameter/2 = "<<diameter/2 <<std::endl;
+            surface_points->shapeRandom(nbPoints, arlCore::ARLCORE_SHAPE_SPHERE_CAP, center, diameter, angle );
+            T.trf(surface_points, surface_points_rotated);
+            T.trf(center);
+            //if(Verbose) std::cerr<< "centre = "<<center->print() <<std::endl;
+            for( unsigned int j=0 ; j<surface_points_rotated->size() ; ++j )
+                (*surface_points_rotated)[j]->addGaussianNoise(GaussianNoise3D);
+            arlCore::ARLCORE_SCE type = (arlCore::ARLCORE_SCE)enum_method;
+            if( surface_points_rotated->sphereCenterEstimation( center_estimation, radius_estimation, type, optimiser_parameter, log) )
+            {
+                ++robustnessOK[i];
+                //if(Verbose) std::cerr<< "centre_estimation = "<<center_estimation->print()<<std::endl;
+                error = center_estimation->distance(center);
+                addValue( errorRadius[i], error );
+    /*          std::cerr<< "Erreur d'estimation centre sphere = " <<error<<std::endl;
+                std::cerr<< "Rayon estime = " <<radius_estimation<<std::endl;
+                std::cerr<< "log[0] = " <<log[0]<<std::endl;
+                std::cerr<< "log[1] = " <<log[1]<<std::endl;
+                std::cerr<< "log[2] = " <<log[2]<<std::endl;*/
+            }
+            ++robustnessTotal[i];
+        }//boucle compteur
+    }
+    bool test = true;
+    for(enum_method=arlCore::ARLCORE_SCE_UNKNOWN+1,i=0; enum_method<arlCore::ARLCORE_SCE_NBMETHOD; ++enum_method,++i)
+    {
+        std::string name="Radius error ("+arlCore::ARLCORE_SCE_NAMES[enum_method]+")";
+        test = printErrors(name,errorRadius[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+    }
+    return printFooter(nbIterations, test);
+}
+
+// testPolynomialFieldDistortion
+bool arlCore::testPolynomialFieldDistortion( long int nbIterations, double tolerance )
+{
+    const double CubeRadius = 4.0;
+    std::vector< vnl_vector_fixed<double,5> >errorCorrection;
+    printHeader("Polynomial field distorsion",nbIterations, tolerance);
+    std::vector<long int> robustnessOK, robustnessTotal;
+    long int n=0, compteur;
+    unsigned int i, j, k;
+    unsigned int interpolationDegree, interpolationDegreeMin=2, interpolationDegreeMax=3;
+    assert(interpolationDegreeMin<=interpolationDegreeMax);
+    vnl_vector<double> coordinates(3), distorsion(3);
+    for( interpolationDegree=interpolationDegreeMin ; interpolationDegree<=interpolationDegreeMax ; ++interpolationDegree, ++n )
+    {
+
+        for( compteur=0 ; compteur<nbIterations ; ++compteur )
+        {
+            if( compteur==0 )
+            {
+                vnl_vector_fixed<double,5> tmp(0.0);
+                errorCorrection.push_back(tmp);
+                robustnessOK.push_back(0);
+                robustnessTotal.push_back(0);
+            }
+            const unsigned int NbEquations = 3;
+            arlCore::PointList::sptr real = arlCore::PointList::New();
+            vnl_vector_fixed<double,3> ResGrid(0.6);
+            for( i=2 ; i<CubeRadius/ResGrid[0] ; ++i )
+                for( j=2 ; j<CubeRadius/ResGrid[1] ; ++j )
+                    for( k=2 ; k<CubeRadius/ResGrid[2] ; ++k )
+                        real->push_back(arlCore::Point::New( ResGrid[0]*(double)i, ResGrid[1]*(double)j, ResGrid[2]*(double)k));
+            // Distorsion model
+            const unsigned int modelDegree = 2;
+            const double ModelNoise = 5.0;
+            vnl_vector<double>model(nbPolynomialParameters(modelDegree, NbEquations));
+            for( i=0 ; i<model.size() ; ++i )
+                model[i] = arlRandom::Random::gaussianRnd( ModelNoise );
+            //VAG arlCore::PointList::sptr distorded =  arlCore::PointList::New(real);
+            arlCore::PointList::sptr distorded =  arlCore::PointList::New( ); //VAG
+            distorded->copy( *real ); //VAG
+            for( i=0 ; i<real->size() ; ++i )
+            {
+                for( j=0 ; j<3 ; ++j )
+                    coordinates[j] = (*real)[i]->get(j);
+                arlCore::computePolynomial( modelDegree, model, coordinates, distorsion );
+                for( j=0 ; j<3 ; ++j )
+                    (*real)[i]->set(j, (*real)[i]->x() - distorsion[j]);
+            }
+            // Estimation of model of deformation from synthetic points
+            vnl_vector<double> parameters;
+            double RMS;
+            fieldCalibration( real, distorded, interpolationDegree, parameters, RMS );
+            // Correct points with estimated model
+            FieldCorrector fc( interpolationDegree );
+            fc.setParameters( parameters );
+            fc.activCorrection( true );
+            for( i=0 ; i<distorded->size() ; ++i )
+            {
+                arlCore::Point::sptr undistorded = arlCore::Point::New(3);
+                fc.correct( (*distorded)[i], undistorded );
+                addValue( errorCorrection[n], undistorded->distance( (*real)[i]) );
+
+            }
+            ++robustnessOK[n];
+            ++robustnessTotal[n];
+        }//boucle compteur
+    }
+    bool test = true;
+    for( i=0 ; i<=interpolationDegreeMax-interpolationDegreeMin ; ++i )
+    {
+        std::stringstream s;
+        s<<"Correction error for polynomial of degree "<<i+interpolationDegreeMin;
+        test = printErrors(s.str(),errorCorrection[i],robustnessOK[i],robustnessTotal[i],tolerance) && test;
+    }
+    return printFooter(nbIterations, test);
+}
+
diff --git a/SrcLib/ARLcore/src/arlcore/vnl_covariance_matrix.cpp b/SrcLib/ARLcore/src/arlcore/vnl_covariance_matrix.cpp
new file mode 100644
index 0000000..15f9d13
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/vnl_covariance_matrix.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/vnl_covariance_matrix.h>
+
+arlCore::vnl_covariance_matrix::vnl_covariance_matrix( unsigned int n ):
+vnl_matrix<double>(n,n)
+{}
+
+arlCore::vnl_covariance_matrix::vnl_covariance_matrix( void ):
+vnl_matrix<double>(0,0)
+{}
+
+arlCore::vnl_covariance_matrix::vnl_covariance_matrix( const vnl_covariance_matrix& rv )
+{
+    copy_in(rv);
+}
+
+arlCore::vnl_covariance_matrix::~vnl_covariance_matrix( void )
+{}
+
+arlCore::vnl_covariance_matrix& arlCore::vnl_covariance_matrix::operator=( const arlCore::vnl_covariance_matrix& rv )
+{
+    copy_in(rv);
+    return *this;
+}
+
+void arlCore::vnl_covariance_matrix::copy_in( const vnl_covariance_matrix& rv )
+{
+    if(this==&rv) return;
+    unsigned int i,j;
+    for( i=0 ; i<rv.rows() ; ++i )
+        for( j=0 ; j<rv.columns() ; ++j )
+            put(i,j,rv.get(i,j));
+}
+
+bool arlCore::vnl_covariance_matrix::errorEllipse( double &a, double &b, double &theta ) const
+{   // http://ieeexplore.ieee.org/iel5/7695/21048/00977046.pdf
+    a=0,b=0,theta=0;
+    if(is_zero()) return true;
+    if(size()!=4) return false;
+    double sigma1P2 = get(0,0);
+    double sigma2P2 = get(1,1);
+    double sigma2 = sqrt(sigma2P2);
+    double sigma12P2 = get(0,1);
+    double sigma12 = sqrt(sigma12P2);
+    double sigma2P3  = sigma2P2*sigma2;
+    double x0 = sigma1P2-sigma2P2;
+    double x1 = 2*(sigma1P2*sigma2P2-sigma12P2);
+    double x2 = sigma1P2 + sigma2P2;
+    double x3 = sqrt(x0*x0+4*sigma12P2);
+    //! todo Fix cases of division by zero
+    a = sqrt(x1/(x2-x3));
+    b = sqrt(x1/(x2+x3));
+    theta = 0.5*atan((2*sigma12)/(sigma1P2-sigma2P3));
+    return true;
+}
diff --git a/SrcLib/ARLcore/src/arlcore/vnl_rigid_vector.cpp b/SrcLib/ARLcore/src/arlcore/vnl_rigid_vector.cpp
new file mode 100644
index 0000000..813fa3a
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/vnl_rigid_vector.cpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/vnl_rigid_vector.h>
+
+#include <arlcore/vnl_rotation3d_vector.h>
+#include <arlcore/MatrixR.h>
+#include <arlcore/Misc.h>
+
+arlCore::vnl_rigid_vector::vnl_rigid_vector( void ):
+vnl_vector_fixed<double,6>()
+{}
+
+arlCore::vnl_rigid_vector::vnl_rigid_vector( const vnl_rigid_vector& rv ):
+vnl_vector_fixed<double,6>()
+{
+    copy_in(rv);
+}
+
+arlCore::vnl_rigid_vector::vnl_rigid_vector( const vnl_vector<double>& v ):
+vnl_vector_fixed<double,6>()
+{
+    copy_in(v);
+}
+
+arlCore::vnl_rigid_vector::vnl_rigid_vector( const vnl_rigid_matrix& rm ):
+vnl_vector_fixed<double,6>()
+{
+    copy_in(rm);
+}
+
+arlCore::vnl_rigid_vector::~vnl_rigid_vector( void )
+{}
+
+arlCore::vnl_rigid_vector& arlCore::vnl_rigid_vector::operator=( const vnl_vector<double>& v )
+{
+    copy_in(v);
+    return *this;
+}
+
+arlCore::vnl_rigid_vector& arlCore::vnl_rigid_vector::operator=( const vnl_rigid_vector& rv )
+{
+    copy_in(rv);
+    return *this;
+}
+
+arlCore::vnl_rigid_vector& arlCore::vnl_rigid_vector::operator=( const vnl_rigid_matrix& rm )
+{
+    copy_in(rm);
+    return *this;
+}
+
+void arlCore::vnl_rigid_vector::copy_in( const vnl_rigid_vector& rv )
+{
+    if(this==&rv) return;
+    unsigned int i;
+    for( i=0 ; i<6 ; ++i )
+        put(i,rv(i));
+}
+
+void arlCore::vnl_rigid_vector::copy_in( const vnl_rigid_matrix& rm )
+{
+    vnl_rotation3d_matrix rotationM = rm.getRotation();
+    vnl_rotation3d_vector rotationV( rotationM );
+    vnl_vector_fixed<double,3> translation = rm.getTranslation();
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        put(i,rotationV.get(i));
+    for( i=0 ; i<3 ; ++i )
+        put(i+3,translation.get(i));
+}
+
+void arlCore::vnl_rigid_vector::copy_in( const vnl_vector<double>& v )
+{
+    assert(v.size()==6);
+    unsigned int i;
+    for( i=0 ; i<6 ; ++i )
+        if(i<v.size()) put(i,v.get(i));
+        else put(i,0.0);
+}
+
+arlCore::vnl_rotation3d_vector arlCore::vnl_rigid_vector::getRotation3dVector( void ) const
+{
+    vnl_rotation3d_vector rv;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        rv.put(i,get(i));
+    return rv;
+}
+
+vnl_vector_fixed<double,3> arlCore::vnl_rigid_vector::getTranslation( void ) const
+{
+    vnl_vector_fixed<double,3> translation;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        translation.put(i,get(i+3));
+    return translation;
+}
+
+void arlCore::vnl_rigid_vector::addGaussianNoise( double std )
+{
+    unsigned int i;
+    for( i=0 ; i<6 ; ++i )
+        (*this)[i] += arlRandom::Random::gaussianRnd(std);
+}
diff --git a/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_matrix.cpp b/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_matrix.cpp
new file mode 100644
index 0000000..a91d0ab
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_matrix.cpp
@@ -0,0 +1,267 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/vnl_rotation3d_matrix.h>
+
+#include <iostream>
+#include <math.h>
+
+#include <vnl/algo/vnl_svd.h>
+#include <vnl/algo/vnl_powell.h>
+#include <vnl/vnl_det.h>
+#include <vnl/vnl_trace.h>
+
+#include <arlcore/vnl_rotation3d_vector.h>
+#include <arlcore/Optimization.h>
+
+arlCore::vnl_rotation3d_matrix::vnl_rotation3d_matrix( void ):
+vnl_matrix_fixed<double,3,3>()
+{}
+
+arlCore::vnl_rotation3d_matrix::vnl_rotation3d_matrix( const vnl_rotation3d_vector& rv )
+{
+    copy_in(rv);
+}
+
+arlCore::vnl_rotation3d_matrix::vnl_rotation3d_matrix( double phi, double theta, double psy )
+{   // http://mathworld.wolfram.com/EulerAngles.html
+    put(0,0,cos(psy)*cos(phi)-cos(theta)*sin(phi)*sin(psy));
+    put(0,1,cos(psy)*sin(phi)+cos(theta)*cos(phi)*sin(psy));
+    put(0,2,sin(psy)*sin(theta));
+    put(1,0,-sin(psy)*cos(phi)-cos(theta)*sin(phi)*cos(psy));
+    put(1,1,-sin(psy)*sin(phi)+cos(theta)*cos(phi)*cos(psy));
+    put(1,2,cos(psy)*sin(theta));
+    put(2,0,sin(theta)*sin(phi));
+    put(2,1,-sin(theta)*cos(phi));
+    put(2,2,cos(theta)*1.0);
+}
+
+arlCore::vnl_rotation3d_matrix::~vnl_rotation3d_matrix( void )
+{}
+
+arlCore::vnl_rotation3d_matrix& arlCore::vnl_rotation3d_matrix::operator=( const vnl_rotation3d_vector& rv )
+{
+    copy_in(rv);
+    return *this;
+}
+
+arlCore::vnl_rotation3d_matrix::vnl_rotation3d_matrix( const vnl_matrix_fixed<double,3,3>& mat)
+{
+    copy_in(mat);
+}
+
+arlCore::vnl_rotation3d_matrix& arlCore::vnl_rotation3d_matrix::operator=( const vnl_matrix_fixed<double,3,3>& mat)
+{
+    copy_in(mat);
+    return *this;
+}
+
+bool arlCore::vnl_rotation3d_matrix::is_rotation( void ) const
+{
+    vnl_matrix_fixed<double,3,3> test_Identity;
+    test_Identity = (*this) * this->transpose(); //on verifie d'abord pour le produit
+    if( test_Identity.is_identity(1e-8) || fabs(vnl_det( *this ) -1) < 1e-6  ) return true;
+    else return false;
+}
+
+vnl_matrix<double> arlCore::vnl_rotation3d_matrix::as_matrix( void )
+{
+    vnl_matrix<double> tmp(3,3);
+    unsigned int i, j;
+    for(i=0; i<3; i++)
+        for(j=0; j<3; j++)
+             tmp(i,j) = (*this)(i,j);
+    return tmp;
+}
+
+bool arlCore::vnl_rotation3d_matrix::closest_rotation( void )
+{
+    unsigned int i,j, dim = 3;
+    double small_val = 1e-12; //TODO c'est 1e-6 en float, il faut trouver la relation et la generaliser
+    vnl_matrix_fixed<double,3,3> V, tmp2;
+    vnl_matrix<double> tmp(3,3);
+    tmp = this->as_matrix();
+    vnl_svd<double> svd_T_matrix( tmp );
+    V = svd_T_matrix.V();
+//  V.transpose();
+    tmp2 = svd_T_matrix.U() * V.transpose();
+//  this->Mul(U,V);  // R = U.Vtrp
+  double det = vnl_det( tmp2 );
+  // If s = det(U.Vtrp) id not +1 or -1 : error
+//  if( det_test >  small_val )
+//      {
+//      std::cout << "det = " << svd_T_matrix.determinant_magnitude() << "      |det|-1 = " << det_test << std::endl;
+//      std::cout << "IsValid : non unit determinant" <<std::endl;
+        //throw RotMat3D::ErrNonRotMat("LSQRot : non unit determinant");
+//      }
+  // If s = -1, we should multiply by s = -1 both the smallest
+  // singular value of diag and the corresponding ligne in R
+    if(det < 0.0)
+        {
+    // find smallest singular value
+    //    s = w(0);
+    //    Index i_dmax = 0;
+    //    for(i=1;i<dim;i++)
+    //      if( w(i) < s ) {
+    //        s = w(i);
+    //        i_dmax = i;
+    //      }
+
+    // in vxl : singular value are ranked from the largest to the smallest in svd_T_matrix.W()
+    // Multiply the sing. val and the corresponding row in V by -1
+//    w(i_dmax) *= -1.0;
+        for(i=0;i<dim;i++)
+            V(i,2) *= -1.0;
+        // and recompute the rotation
+        //this->Mul( U, V);  // R = U.Vtrp
+        tmp2 = svd_T_matrix.U() * V.transpose();
+    }
+    for(i=0; i<3; i++)
+        for(j=0; j<3; j++)
+             (*this)(i,j) = tmp2(i,j);
+  // Grep for the number of singular (0) values
+  {
+    // Find the max : dans la vxl smw = svd.W(3,3)
+    double smax = svd_T_matrix.W(0,0);
+//    for(i=0;i<dim;i++)
+//      if(w(i)>smax) smax = w(i);
+    // counting small singular values
+    int num = 0;
+    if( svd_T_matrix.W(0,0) < small_val )
+      num = dim;
+    else
+      for(i=0;i<dim;i++)
+        if( ( (double) svd_T_matrix.W(i,i)/100. + smax) == ((double) smax)) num++;
+//    if( num > 1)
+//      std::cout << "*** WARNING: Matrix has " << num << " null singular values" << std::endl;
+  }
+/* TODO Using residue
+  // compute the residue
+  {
+    double residue =0.0;
+    for(i=0;i<dim;i++)
+      residue += svd_T_matrix.W(i,i);
+    return residue;
+  }*/
+    return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+//
+// Cette fonction calcule la distance g�od�sique entre deux rotations
+// d(R1, R2) = 1/sqrt(2) || Log(R1^T * R2) || (norme de frobenius)
+// In : A matrice 3x3 de rotation
+// In : B matrice 3x3 de rotation
+// Out : Distance entre les deux matrices de rotation
+///////////////////////////////////////////////////////////////////////////////////////////////
+double arlCore::vnl_rotation3d_matrix::sq_rieman_dist ( const vnl_rotation3d_matrix &B )
+{
+//  const bool Verbose = false;
+    vnl_matrix<double> tmp(3,3), logAB(3,3);
+//  unsigned int i;
+//  if(Verbose)
+//  {
+//      for( i=0 ; i<3 ; ++i )
+//          fprintf(stderr," B %f %f %f \n",  B(i,0), B(i,1), B(i,2));
+//      fprintf(stderr,"\n Dans fonction rieman_dist \n");
+//  }
+    tmp = (this->as_matrix()).transpose() * B;
+//  if(Verbose)
+//      for( i=0 ; i<3 ; ++i )
+//          fprintf(stderr," tmp %f %f %f \n",  tmp(i,0), tmp(i,1), tmp(i,2));
+    double theta = 0.0;
+    if( fabs ( ( vnl_trace(tmp) - 1.0 )/2.0 ) <= 1.0)
+        theta = acos( ( vnl_trace(tmp) - 1.0 )/2.0 );
+//  else
+//  {
+//      if(Verbose) fprintf(stderr,"ATTENTION : dans sq_rieman_dist l'angle entre deux matrices de rotation est tellement proche de 0, qu'une erreur d'arrondi est peut-etre survenue (li� � la fonction acos qui n'est d�fini que dans [-1,1]). Par d�faut, toute valeur en dehors de cet intervalle est fix� � 1\n");
+//  }
+//  if(Verbose)
+//      fprintf(stderr,"trace = %1.14f ; theta = %g \n",vnl_trace(tmp), theta);
+
+    if(theta > 1e-6)
+    {
+        logAB = theta/(2*sin(theta)) * (tmp -tmp.transpose());
+//      if(Verbose)
+//          for( i=0 ; i<3 ; ++i )
+//              fprintf(stderr,"logAB %f %f %f \n",  logAB(i,0), logAB(i,1), logAB(i,2));
+
+        double dist_r = 0.5 *logAB.frobenius_norm() * logAB.frobenius_norm();
+//      if(Verbose)
+//      {
+//          fprintf(stderr,"dist_r = %f \n", dist_r);
+//          fprintf(stderr,"frobenius_norm = %f \n",logAB.frobenius_norm());
+//      }
+        return dist_r;
+    }
+    return 0.0;
+}
+
+double arlCore::vnl_rotation3d_matrix::average_rotation3d (const std::vector<vnl_rotation3d_matrix*> &rotation_list)
+{
+
+    arlCore::averageRotation_cost_function average_dist(rotation_list);
+    average_dist.set_matrix_list(rotation_list);
+    vnl_powell compute_average(&average_dist);
+    vnl_vector<double> vrot_solution(3);
+    vrot_solution(0)  = 0.0;  vrot_solution(1)  = 0.0;  vrot_solution(2)  = 0.0;
+    compute_average.minimize(vrot_solution);
+
+    std::cerr<<"Vecteur rotation moyen = "<<vrot_solution<<std::endl;
+    std::cerr<<"Erreur de d�but = "<< compute_average.get_start_error()<<std::endl;
+    std::cerr<<"Erreur de fin = "<< compute_average.get_end_error()<<std::endl;
+
+    arlCore::vnl_rotation3d_vector vec(vrot_solution(0),vrot_solution(1),vrot_solution(2));
+    vec.modulo();
+    arlCore::vnl_rotation3d_matrix average_rot_matrix(vec);
+    std::cerr << "Matrice de rotation moyenne" << std::endl << average_rot_matrix << std::endl;
+    return 0;
+}
+
+void arlCore::vnl_rotation3d_matrix::copy_in( const vnl_rotation3d_vector& rv )
+{   // Rotation Vector (a en radian) -> Rotation Matrix
+    double c, s, theta, k1, k2, theta2, aux;
+    unsigned int i, j;
+    theta2 = rv[0] * rv[0] + rv[1] * rv[1] + rv[2] * rv[2];
+    theta = sqrt(theta2);
+    if(theta > 1e-2 )
+    {
+        c = cos(theta);
+        s = sin(theta);
+        k1 = s / theta;
+        k2 = (1 - c) / theta2;
+    }
+    else
+    {   // Lim. Dev around theta = 0
+        k2 = 1.0/2.0 - theta2/24.0;
+        c = 1.0 - theta2*k2;
+        k1 = 1.0 - theta2/6;
+    }   // I + M*Mt
+    for ( i=0 ; i<3 ; ++i )
+        for ( j=0 ; j<=i ; ++j )
+        {
+            (*this)[i][j] = k2 * rv[i] * rv[j];
+            if(i != j) (*this)[j][i] = (*this)[i][j];
+            else (*this)[i][i] += c;
+        }
+    aux = k1 * rv[2];
+    (*this)[0][1] -= aux;
+    (*this)[1][0] += aux;
+    aux = k1 * rv[1];
+    (*this)[0][2] += aux;
+    (*this)[2][0] -= aux;
+    aux = k1 * rv[0];
+    (*this)[1][2] -= aux;
+    (*this)[2][1] += aux;
+}
+
+void arlCore::vnl_rotation3d_matrix::copy_in( const vnl_matrix_fixed<double,3,3>& mat )
+{
+    unsigned int i, j;
+    for(i=0;i<3;i++)
+        for(j=0;j<3;j++)
+            put(i,j, mat(i,j));
+}
diff --git a/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_vector.cpp b/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_vector.cpp
new file mode 100644
index 0000000..77997b3
--- /dev/null
+++ b/SrcLib/ARLcore/src/arlcore/vnl_rotation3d_vector.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <arlcore/vnl_rotation3d_vector.h>
+
+#include <math.h>
+#include <iostream>
+#include <vnl/vnl_math.h>
+#include <vnl/vnl_matrix_fixed.h>
+
+#include <arlcore/vnl_rotation3d_matrix.h>
+#include <arlcore/Misc.h>
+
+arlCore::vnl_rotation3d_vector::vnl_rotation3d_vector( void ):
+vnl_vector_fixed<double,3>()
+{}
+
+arlCore::vnl_rotation3d_vector::vnl_rotation3d_vector( double a, double b, double c ):
+vnl_vector_fixed<double,3>(a,b,c)
+{}
+
+arlCore::vnl_rotation3d_vector::vnl_rotation3d_vector( const vnl_rotation3d_matrix& rm )
+{
+    copy_in(rm);
+}
+
+arlCore::vnl_rotation3d_vector::~vnl_rotation3d_vector( void )
+{}
+
+arlCore::vnl_rotation3d_vector& arlCore::vnl_rotation3d_vector::operator=( const vnl_rotation3d_matrix& rm )
+{
+    copy_in(rm);
+    return *this;
+}
+
+void arlCore::vnl_rotation3d_vector::modulo()
+{
+    double theta, var=0, k, a;
+    unsigned int i;
+    for( i=0 ; i<3 ; ++i )
+        var+=get(i)*get(i);
+    var = sqrt(var);
+    theta = ( var/(2*vnl_math::pi) - (int)(var/(2*vnl_math::pi)) ) * 2*vnl_math::pi;
+    if(var == 0) return;
+    else if(theta >= vnl_math::pi && theta < 2*vnl_math::pi)
+    {
+        theta -= 2*vnl_math::pi;
+        k = theta/var;
+    }
+    else k = theta/var;
+    for( i=0 ; i<3 ; ++i )
+    {
+        a=get(i);
+        put(i,k*a);
+    }
+}
+
+void arlCore::vnl_rotation3d_vector::uniform_random( void )
+{
+    double coef, norme, vec[3];
+    unsigned int i;
+    do
+    { 
+        norme = 0;
+        for( i=0 ; i<3 ; ++i )
+        {
+            vec[i] = arlRandom::Random::uniformDoubleRnd(-1.0, 1.0);
+            norme += vec[i]*vec[i];
+        }
+    }while( norme > 1 || norme < 0.05 );
+    coef = arlRandom::Random::uniformDoubleRnd(-vnl_math::pi, vnl_math::pi)/sqrt(norme);
+    for ( i=0 ; i<3 ; ++i ) 
+        put( i, vec[i]*coef );
+}
+
+double arlCore::vnl_rotation3d_vector::getTheta( void )
+{
+    if(get(0)!=0) return atan(get(1)/get(0));
+    std::cerr<<"x nul : Theta ind�termin�";
+    return 0;
+}
+
+double arlCore::vnl_rotation3d_vector::getPhi( void )
+{
+    double r=sqrt(get(0)*get(0)+get(1)*get(1)+get(2)*get(2));
+    if(r!=0) return acos(get(2)/r);
+    std::cerr<<"Le vecteur rotation est de norme nulle : Phi ind�termin�";
+    return 0;
+}
+
+void arlCore::vnl_rotation3d_vector::add_gaussian_noise( double std )
+{
+    //TODO Appliquer au vecteur rotation un bruit gaussien d'�cart type std
+    // sur la direction et sur l'angle(norme)
+}
+
+bool arlCore::vnl_rotation3d_vector::copy_in ( const vnl_rotation3d_matrix& rm )
+{   // Rotation Matrix -> Rotation Vector
+    int i,k;
+    double d, c, sq, theta, fact, sin_r[3];
+    c = 0.5 * (rm[0][0] + rm[1][1] + rm[2][2] - 1.0); // cos(theta)
+    d = fabs(c);
+    if(d>1.0) c /= d;
+    theta = acos(c);
+    if(theta<0.0) return false;
+    // E_ERRN( theta < 0.0, E_ERRNULL,"RM2RV","negative theta");
+    if(fabs(theta) <= 1e-5)
+    {   // R close to identity : DL around theta = 0
+        fact = 0.5 + theta*theta/12.0;
+        (*this)[0] = (rm[2][1] - rm[1][2]) * fact;
+        (*this)[1] = (rm[0][2] - rm[2][0]) * fact;
+        (*this)[2] = (rm[1][0] - rm[0][1]) * fact;
+    } 
+    else 
+        if(fabs(theta - vnl_math::pi) <= 1e-5) 
+        {   // R is close to a symetry : DL around theta = Pi
+            // set values with diag terms of n.nt
+            for( i=0 ; i<3 ; ++i )
+            {   // approx order 0
+                // c = (rm[i][i] - 1.0)*0.5;
+                sq=1.0+(rm[i][i]-1.0)/(1-c);
+                // 0 <=  [ sq = (n[i])^2 ] <= 1
+                if(sq<0.0) sq=0.0;
+                if(sq>1.0) sq=1.0;
+                (*this)[i]=sqrt(sq);
+            }
+            d = sqrt((*this)[0]*(*this)[0] + (*this)[1]*(*this)[1] +(*this)[2]*(*this)[2]); // K_norm((*this),3);
+            if(d==0) return false;
+            // K_mulscalvect(theta/d,(*this),(*this),3);
+            (*this)[0] *= theta/d;
+            (*this)[1] *= theta/d;
+            (*this)[2] *= theta/d;
+            if((*this)[0]<0.0) return false;
+            // E_ERRN( (*this)[0] < 0.0, E_ERRNULL,"RM2RV","negative square root");
+            // set signs with off-diag terms of n.nt
+            if((rm[0][1] + rm[1][0]) < 0.0) (*this)[1] = -(*this)[1];
+            if((rm[0][2] + rm[2][0]) < 0.0) (*this)[2] = -(*this)[2];
+            // determine wether r = +/- theta*n
+            sin_r[0] = (rm[2][1] - rm[1][2]);
+            sin_r[1] = (rm[0][2] - rm[2][0]);
+            sin_r[2] = (rm[1][0] - rm[0][1]);
+            // determine the most significant term
+            k=0;
+            if( fabs(sin_r[1]) > fabs(sin_r[k])) k=1;
+            if( fabs(sin_r[2]) > fabs(sin_r[k])) k=2;
+            // choose the sign
+            if( sin_r[k] * (*this)[k] < 0.0 )
+                // They do not have the same signs : r = -(*this)
+                for( k=0;k<3;++k)
+                    (*this)[k] = -(*this)[k];
+        }
+        else 
+        {   // At last no numerical problem
+            fact = 0.5 * theta / sin(theta);
+            (*this)[0] = (rm[2][1] - rm[1][2]) * fact;
+            (*this)[1] = (rm[0][2] - rm[2][0]) * fact;
+            (*this)[2] = (rm[1][0] - rm[0][1]) * fact;
+        }
+    return true;
+}
diff --git a/SrcLib/ARLcore/test/CMakeLists.txt b/SrcLib/ARLcore/test/CMakeLists.txt
new file mode 100644
index 0000000..6f11c0a
--- /dev/null
+++ b/SrcLib/ARLcore/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time regex REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/ARLcore/test/Properties.cmake b/SrcLib/ARLcore/test/Properties.cmake
new file mode 100644
index 0000000..180cea7
--- /dev/null
+++ b/SrcLib/ARLcore/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME ARLcoreTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwData fwComEd ARLcore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/ARLcore/test/cppunit.options b/SrcLib/ARLcore/test/cppunit.options
new file mode 100644
index 0000000..fc16318
--- /dev/null
+++ b/SrcLib/ARLcore/test/cppunit.options
@@ -0,0 +1,10 @@
+
+CLASSTEST=[
+    'CalibrationTest',
+    'RegistrationTest',
+    'GeometryTest',
+]
+
+USE = ['boost','boostDateTime', 'boostRegex']
+LIB = ['fwData_0-1','ARLcore_0-1','fwTools_0-1','fwCore_0-1','fwComEd_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/ARLcore/test/tu/include/CalibrationTest.hpp b/SrcLib/ARLcore/test/tu/include/CalibrationTest.hpp
new file mode 100644
index 0000000..455a992
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/include/CalibrationTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __ARLCORE_UT_CALIBRATIONTEST_HPP__
+#define __ARLCORE_UT_CALIBRATIONTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ARLcore
+{
+namespace ut
+{
+
+class CalibrationTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CalibrationTest );
+    CPPUNIT_TEST( initIntrinsicCalibrationTest );
+    CPPUNIT_TEST( initExtrinsicCalibrationTest );
+    CPPUNIT_TEST( intrinsicCalibrationTest     );
+    CPPUNIT_TEST( extrinsicCalibrationTest     );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void initIntrinsicCalibrationTest();
+    void initExtrinsicCalibrationTest();
+    void intrinsicCalibrationTest();
+    void extrinsicCalibrationTest();
+
+
+};
+
+} //namespace ut
+} //namespace ARLCORE
+#endif //__ARLCORE_UT_CALIBRATIONTEST_HPP__
+
diff --git a/SrcLib/ARLcore/test/tu/include/GeometryTest.hpp b/SrcLib/ARLcore/test/tu/include/GeometryTest.hpp
new file mode 100644
index 0000000..5691cb5
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/include/GeometryTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __ARLCORE_UT_GEOMETRYTEST_HPP__
+#define __ARLCORE_UT_GEOMETRYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ARLcore
+{
+namespace ut
+{
+
+class GeometryTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( GeometryTest );
+    CPPUNIT_TEST( ReconstructionPolyscopicTest );
+    CPPUNIT_TEST( SphereCenterEstimationTest );
+    CPPUNIT_TEST( RigidTransfoTest     );
+    CPPUNIT_TEST( EpipolarMatchingTest     );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void ReconstructionPolyscopicTest();
+    void SphereCenterEstimationTest();
+    void RigidTransfoTest();
+    void EpipolarMatchingTest();
+
+
+
+};
+
+} //namespace ut
+} //namespace ARLCORE
+#endif //__ARLCORE_UT_GEOMETRYTEST_HPP__
+
diff --git a/SrcLib/ARLcore/test/tu/include/RegistrationTest.hpp b/SrcLib/ARLcore/test/tu/include/RegistrationTest.hpp
new file mode 100644
index 0000000..da2e9b6
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/include/RegistrationTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __ARLCORE_UT_REGISTRATIONTEST_HPP__
+#define __ARLCORE_UT_REGISTRATIONTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace ARLcore
+{
+namespace ut
+{
+
+class RegistrationTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( RegistrationTest );
+    CPPUNIT_TEST( HomographyRegistrationTest );
+    CPPUNIT_TEST( ProjectiveRegistrationTest );
+    CPPUNIT_TEST( Registration3D3DTest     );
+    //CPPUNIT_TEST( ICPRegistrationTest     ); FIXME dataset
+    CPPUNIT_TEST( threeD3DMatchingTest );
+    CPPUNIT_TEST( registration3D3DwithoutMatchingTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void HomographyRegistrationTest();
+    void ProjectiveRegistrationTest();
+    void Registration3D3DTest();
+    void ICPRegistrationTest();
+    void threeD3DMatchingTest();
+    void registration3D3DwithoutMatchingTest();
+
+
+
+};
+
+} //namespace ut
+} //namespace ARLCORE
+#endif //__ARLCORE_UT_REGISTRATIONTEST_HPP__
+
diff --git a/SrcLib/ARLcore/test/tu/src/CalibrationTest.cpp b/SrcLib/ARLcore/test/tu/src/CalibrationTest.cpp
new file mode 100644
index 0000000..258629a
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/src/CalibrationTest.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Boolean.hpp>
+
+#include "CalibrationTest.hpp"
+#include <arlcore/UnitTestArlCore.h>
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ARLcore::ut::CalibrationTest );
+
+namespace ARLcore
+{
+namespace ut
+{
+
+void CalibrationTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void CalibrationTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+
+void CalibrationTest::initIntrinsicCalibrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL(true  , arlCore::testInitExtrinsicCalibration( 100, 1e-6 ) );
+}
+
+
+
+void CalibrationTest::initExtrinsicCalibrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL(true  ,  arlCore::testInitIntrinsicCalibration( 100, 1e-5 ) );
+}
+
+
+
+
+
+void CalibrationTest::intrinsicCalibrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL(true  ,  arlCore::testIntrinsicCalibration( 8, 1e-3 ) );
+}
+
+
+
+void CalibrationTest::extrinsicCalibrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL(true  ,  arlCore::testExtrinsicCalibration( 10, 1e-6 ) );
+}
+
+
+
+
+
+
+} //namespace ut
+} //namespace ARLcore
diff --git a/SrcLib/ARLcore/test/tu/src/GeometryTest.cpp b/SrcLib/ARLcore/test/tu/src/GeometryTest.cpp
new file mode 100644
index 0000000..971c804
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/src/GeometryTest.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Boolean.hpp>
+
+#include "GeometryTest.hpp"
+#include <arlcore/UnitTestArlCore.h>
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ARLcore::ut::GeometryTest );
+
+namespace ARLcore
+{
+namespace ut
+{
+
+void GeometryTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void GeometryTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+
+
+void GeometryTest::ReconstructionPolyscopicTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testReconstructionPolyscopic( 6, 10e-10 ) );
+}
+
+
+
+void GeometryTest::SphereCenterEstimationTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testSphereCenterEstimation( 5000, 1e-4 ) );
+}
+
+
+
+void GeometryTest::RigidTransfoTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testRigidTransfo( 1000000, 1e-5 ) );
+}
+
+
+
+void GeometryTest::EpipolarMatchingTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testRegistration3D3DwithoutMatching( 10000, 1e-5 ) );
+}
+
+
+
+
+} //namespace ut
+} //namespace ARLcore
diff --git a/SrcLib/ARLcore/test/tu/src/RegistrationTest.cpp b/SrcLib/ARLcore/test/tu/src/RegistrationTest.cpp
new file mode 100644
index 0000000..0b7df11
--- /dev/null
+++ b/SrcLib/ARLcore/test/tu/src/RegistrationTest.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Boolean.hpp>
+
+#include "RegistrationTest.hpp"
+#include <arlcore/UnitTestArlCore.h>
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::ARLcore::ut::RegistrationTest );
+
+namespace ARLcore
+{
+namespace ut
+{
+
+void RegistrationTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void RegistrationTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+
+void RegistrationTest::HomographyRegistrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testHomographyRegistration( 10000, 1e-2 ) );
+}
+
+
+
+void RegistrationTest::ProjectiveRegistrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testProjectiveRegistration( 10, 1e-2 ) );
+}
+
+
+
+void RegistrationTest::Registration3D3DTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testRegistration3D3D( 15000, 1e-10 ) );
+}
+
+
+
+void RegistrationTest::ICPRegistrationTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testICPRegistration( 3, 1e-11 ) );
+}
+
+
+
+void RegistrationTest::threeD3DMatchingTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testRegistration3D3D( 15000, 1e-10 ) );
+}
+
+
+
+void RegistrationTest::registration3D3DwithoutMatchingTest()
+{
+    CPPUNIT_ASSERT_EQUAL( true, arlCore::testRegistration3D3DwithoutMatching( 10000, 1e-5 ) );
+}
+
+
+
+
+} //namespace ut
+} //namespace ARLcore
diff --git a/SrcLib/core/fwActivities/CMakeLists.txt b/SrcLib/core/fwActivities/CMakeLists.txt
new file mode 100644
index 0000000..d21be97
--- /dev/null
+++ b/SrcLib/core/fwActivities/CMakeLists.txt
@@ -0,0 +1,15 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwCore
+    fwMedData
+    fwRuntime
+    fwTools
+    )
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+
diff --git a/SrcLib/core/fwActivities/COPYING b/SrcLib/core/fwActivities/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwActivities/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwActivities/COPYING.LESSER b/SrcLib/core/fwActivities/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwActivities/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwActivities/Properties.cmake b/SrcLib/core/fwActivities/Properties.cmake
new file mode 100644
index 0000000..abb6c94
--- /dev/null
+++ b/SrcLib/core/fwActivities/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwActivities )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwData fwDataCamp fwMedData fwRuntime fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwActivities/bin/build.options b/SrcLib/core/fwActivities/bin/build.options
new file mode 100644
index 0000000..cb7ec8c
--- /dev/null
+++ b/SrcLib/core/fwActivities/bin/build.options
@@ -0,0 +1,11 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = ['boost', 'boostDateTime']
+LIB = [
+    'fwAtomConversion_0-1',
+    'fwData_0-1',
+    'fwMedData_0-1',
+    'fwRuntime_0-3',
+    'fwDataCamp_0-1',
+    'fwMath_0-1',
+    ]
diff --git a/SrcLib/core/fwActivities/include/fwActivities/IBuilder.hpp b/SrcLib/core/fwActivities/include/fwActivities/IBuilder.hpp
new file mode 100644
index 0000000..aba2680
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/IBuilder.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_IBUILDER_HPP__
+#define __FWACTIVITIES_IBUILDER_HPP__
+
+#include <boost/enable_shared_from_this.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include "fwActivities/builder/factory/new.hpp"
+#include "fwActivities/builder/registry/detail.hpp"
+#include "fwActivities/registry/Activities.hpp"
+
+#include "fwActivities/config.hpp"
+
+namespace fwData
+{
+class Vector;
+}
+
+namespace fwActivities
+{
+
+/**
+ * @brief Base class for all fwActivities builder's classes
+ */
+class FWACTIVITIES_CLASS_API IBuilder : public ::fwCore::BaseObject
+{
+
+public :
+
+    typedef ::fwActivities::builder::factory::Key Key;
+    typedef ::fwMedData::ActivitySeries::ConfigIdType ConfigIdType;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwActivities::builder::registry::get()->addFactory( functorKey,
+                                                                  &::fwActivities::builder::factory::New<T> );
+        }
+    };
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IBuilder)(::fwCore::BaseObject) );
+
+
+    /**
+     * @brief Build an ActivitySeries with required data present in currentSelection and defined in configuration.
+     * @param[in] activityInfo a structure which contains all the Activity configuration
+     * @param[in] currentSelection a vector which contains current selected data.
+     * @return specific data ActivitySeries for the specified Activity.
+     */
+    FWACTIVITIES_API virtual ::fwMedData::ActivitySeries::sptr buildData(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const = 0;
+
+protected :
+
+    FWACTIVITIES_API virtual SPTR(::fwData::Vector) getType( SPTR(::fwData::Vector) currentSelection,
+                                                             std::string type ) const;
+};
+
+} // namespace fwActivities
+
+#endif // __FWACTIVITIES_IBUILDER_HPP__
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/IValidator.hpp b/SrcLib/core/fwActivities/include/fwActivities/IValidator.hpp
new file mode 100644
index 0000000..1bee029
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/IValidator.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_IVALIDATOR_HPP__
+#define __FWACTIVITIES_IVALIDATOR_HPP__
+
+#include <boost/enable_shared_from_this.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include "fwActivities/validator/factory/new.hpp"
+#include "fwActivities/validator/registry/detail.hpp"
+#include "fwActivities/registry/Activities.hpp"
+
+#include "fwActivities/config.hpp"
+
+namespace fwData
+{
+class Vector;
+}
+
+namespace fwActivities
+{
+
+/**
+ * @brief Base class for all fwActivities validator's classes
+ */
+class FWACTIVITIES_CLASS_API IValidator : public ::fwCore::BaseObject
+{
+
+public :
+
+    /**
+     * @brief Defines validation result of an activity.
+     * First element tells if the activity is validated or not by the IValidator implementation.
+     * Second element may contains information about the result of activity validation.
+     */
+    typedef std::pair< bool, std::string > ValidationType;
+
+    typedef ::fwActivities::validator::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwActivities::validator::registry::get()->addFactory( functorKey,
+                                                                  &::fwActivities::validator::factory::New<T> );
+        }
+    };
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IValidator)(::fwCore::BaseObject) );
+
+
+    /**
+     * @brief Performs validation of given data as inputs for the considered activity.
+     * @param[in] activityInfo a structure which contains all the activity configuration
+     * @param[in] currentSelection a vector which contains current selected data.
+     * @return result of the validation
+     *
+     * @see IValidator::ValidationType
+     */
+    FWACTIVITIES_API virtual ValidationType validate(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const = 0;
+
+};
+
+} // namespace fwActivities
+
+#endif // __FWACTIVITIES_IVALIDATOR_HPP__
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeries.hpp b/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeries.hpp
new file mode 100644
index 0000000..a36cd36
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeries.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWACTIVITIES_BUILDER_ACTIVITYSERIES_HPP_
+#define _FWACTIVITIES_BUILDER_ACTIVITYSERIES_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwActivities/IBuilder.hpp"
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the default builder for the data ActivitySeries.
+ * @class   ActivitySeries
+ * @date    2013.
+ */
+class FWACTIVITIES_CLASS_API ActivitySeries : public ::fwActivities::IBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ActivitySeries)(::fwActivities::IBuilder),
+                                            (()),
+                                            ::fwActivities::builder::factory::New< ActivitySeries > );
+
+
+    typedef std::string RegistryKeyType;
+
+    /// Constructor. Do nothing.
+    FWACTIVITIES_API ActivitySeries(::fwActivities::IBuilder::Key key);
+
+    /// Destructor. Do nothing.
+    FWACTIVITIES_API virtual ~ActivitySeries();
+
+    /**
+     * @brief Build an ActivitySeries with required data present in currentSelection and defined in configuration.
+     * returns specific data ActivitySeries for the specified Activity, or a
+     * null pointer if the builder canceled the activity creation.
+     * @param[in] activityInfo a structure which contains all the Activity configuration
+     * @param[in] currentSelection a vector which contains current selected data.
+     * @return ActivitySeries or null
+     */
+    FWACTIVITIES_API virtual ::fwMedData::ActivitySeries::sptr buildData(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const;
+};
+
+} // namespace builder
+} // namespace fwActivities
+
+#endif /*_FWACTIVITIES_BUILDER_ACTIVITYSERIES_HPP_*/
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeriesInitData.hpp b/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeriesInitData.hpp
new file mode 100644
index 0000000..77f1c07
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/builder/ActivitySeriesInitData.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_BUILDER_ACTIVITYSERIESINITDATA_HPP__
+#define __FWACTIVITIES_BUILDER_ACTIVITYSERIESINITDATA_HPP__
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwActivities/builder/ActivitySeries.hpp"
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+namespace builder
+{
+
+/**
+ * @brief Defines an activity builder which instanciates a new requirement if minOccurs and maxOccurs are set to 0.
+ * @class ActivitySeriesInitData
+ */
+class FWACTIVITIES_CLASS_API ActivitySeriesInitData : public ::fwActivities::builder::ActivitySeries
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ActivitySeriesInitData)(::fwActivities::IBuilder),
+                                            (()),
+                                            ::fwActivities::builder::factory::New< ActivitySeriesInitData > );
+
+    typedef std::string RegistryKeyType;
+
+    /// Constructor. Do nothing.
+    FWACTIVITIES_API ActivitySeriesInitData(::fwActivities::IBuilder::Key key);
+
+    /// Destructor. Do nothing.
+    FWACTIVITIES_API virtual ~ActivitySeriesInitData();
+
+    /**
+     * @brief Instanciates a new object where requirement maxOccurs and minOccurs are both set to 0.
+     * @see ::fwActivities::builder::ActivitySeries::buildData
+     */
+    FWACTIVITIES_API virtual ::fwMedData::ActivitySeries::sptr buildData(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const;
+};
+
+} // namespace builder
+} // namespace fwActivities
+
+#endif /*__FWACTIVITIES_BUILDER_ACTIVITYSERIESINITDATA_HPP__*/
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/builder/factory/new.hpp b/SrcLib/core/fwActivities/include/fwActivities/builder/factory/new.hpp
new file mode 100644
index 0000000..9c5a180
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/builder/factory/new.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_BUILDER_FACTORY_NEW_HPP__
+#define __FWACTIVITIES_BUILDER_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwActivities/config.hpp"
+#include "fwActivities/builder/registry/detail.hpp"
+
+namespace fwActivities
+{
+
+class IBuilder;
+
+namespace builder
+{
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwActivities::builder::factory::New();
+
+    Key(){};
+};
+
+FWACTIVITIES_API SPTR( ::fwActivities::IBuilder ) New( const ::fwActivities::builder::registry::KeyType & classname );
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) builder = ::boost::make_shared< CLASSNAME >( Key() );
+    return builder;
+}
+
+} // namespace factory
+} // namespace builder
+} // namespace fwActivities
+
+#endif /* __FWACTIVITIES_BUILDER_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/builder/registry/detail.hpp b/SrcLib/core/fwActivities/include/fwActivities/builder/registry/detail.hpp
new file mode 100644
index 0000000..6da4c4e
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/builder/registry/detail.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_BUILDER_REGISTRY_DETAIL_HPP__
+#define __FWACTIVITIES_BUILDER_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+
+class IBuilder;
+
+namespace builder
+{
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwActivities::IBuilder) () , KeyType > Type;
+
+FWACTIVITIES_API SPTR(Type) get();
+
+} // namespace registry
+} // namespace builder
+} // namespace fwActivities
+
+#endif /* __FWACTIVITIES_BUILDER_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/builder/registry/macros.hpp b/SrcLib/core/fwActivities/include/fwActivities/builder/registry/macros.hpp
new file mode 100644
index 0000000..6d435d2
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/builder/registry/macros.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_BUILDER_REGISTRY_MACRO_HPP__
+#define __FWACTIVITIES_BUILDER_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwActivities/IBuilder.hpp"
+#include "fwActivities/builder/registry/detail.hpp"
+
+namespace fwActivities
+{
+namespace builder
+{
+namespace registry
+{
+
+#define fwActivitiesBuilderRegisterMacro( BuilderClassname, BuilderFunctorKey )   \
+    static ::fwActivities::IBuilder::Registrar< BuilderClassname >                \
+    BOOST_PP_CAT( s__factory__record__, __LINE__) ( BuilderFunctorKey );
+
+} // end namespace registry
+} // end namespace builder
+} // end namespace fwActivities
+
+#endif /*__FWACTIVITIES_BUILDER_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwActivities/include/fwActivities/config.hpp b/SrcLib/core/fwActivities/include/fwActivities/config.hpp
new file mode 100644
index 0000000..af61da0
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _FWACTIVITIES_CONFIG_HPP_
+#define _FWACTIVITIES_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWACTIVITIES_EXPORTS
+            #define FWACTIVITIES_API __declspec(dllexport)
+        #else
+            #define FWACTIVITIES_API __declspec(dllimport)
+        #endif
+
+        #define FWACTIVITIES_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWACTIVITIES_EXPORTS
+            #define FWACTIVITIES_API __attribute__ ((visibility("default")))
+            #define FWACTIVITIES_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWACTIVITIES_API __attribute__ ((visibility("hidden")))
+            #define FWACTIVITIES_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWACTIVITIES_API
+        #define FWACTIVITIES_CLASS_API
+
+    #endif
+
+#endif //FWACTIVITIES_API
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/namespace.hpp b/SrcLib/core/fwActivities/include/fwActivities/namespace.hpp
new file mode 100644
index 0000000..51cce1f
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/namespace.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_NAMESPACE_HPP__
+#define __FWACTIVITIES_NAMESPACE_HPP__
+
+/**
+ * @brief Namespace containing activities data and builder
+ */
+namespace fwActivities
+{
+
+/**
+ * @brief       The namespace fwActivities::builder contains the base interface for data ActivitySeries builder.
+ * @namespace   fwActivities::builder
+ * @date        2013.
+ *
+ */
+namespace builder
+{
+
+/**
+ * @brief       Contains fwActivities::builder::registry details
+ * @namespace   fwActivities::builder::registry
+ * @date        2013
+ */
+namespace registry
+{
+} // namespace registry
+
+/**
+ * @brief       Contains fwActivities::builder::factory utilities
+ * @namespace   fwActivities::builder::factory
+ * @date        2013
+ */
+namespace factory
+{
+} // namespace factory
+
+} // end namespace builder
+
+namespace validator
+{
+
+/**
+ * @brief       Contains fwActivities::validator::registry details
+ * @namespace   fwActivities::validator::registry
+ * @date        2013
+ */
+namespace registry
+{
+} // namespace registry
+
+
+/**
+ * @brief       Contains fwActivities::validator::factory utilities
+ * @namespace   fwActivities::validator::factory
+ * @date        2013
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace validator
+
+} // namespace fwActivities
+
+#endif /* __FWACTIVITIES_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/registry/Activities.hpp b/SrcLib/core/fwActivities/include/fwActivities/registry/Activities.hpp
new file mode 100644
index 0000000..af63955
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/registry/Activities.hpp
@@ -0,0 +1,245 @@
+#ifndef _FWACTIVITIES_REGISTRY_ACTIVITIES_HPP_
+#define _FWACTIVITIES_REGISTRY_ACTIVITIES_HPP_
+
+#include <map>
+#include <string>
+
+#include <boost/make_shared.hpp>
+#include <boost/property_tree/ptree.hpp>
+
+#include <fwCore/BaseObject.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwActivities/config.hpp"
+
+namespace fwData
+{
+class Vector;
+}
+
+namespace fwRuntime
+{
+struct Extension;
+}
+
+
+namespace fwActivities
+{
+
+namespace registry
+{
+
+typedef ::boost::property_tree::ptree ConfigType;
+
+struct FWACTIVITIES_CLASS_API ActivityAppConfigParam
+{
+    ActivityAppConfigParam(){};
+    FWACTIVITIES_API ActivityAppConfigParam(const ConfigType &config);
+
+    bool isSeshat() const
+    {
+        return (by.substr(0,1) == "@") || (by.substr(0,1) == "!");
+    }
+
+    std::string replace;
+    std::string by;
+};
+
+struct FWACTIVITIES_CLASS_API ActivityAppConfig
+{
+    typedef std::vector< ActivityAppConfigParam > ActivityAppConfigParamsType;
+
+    ActivityAppConfig(){};
+    FWACTIVITIES_API ActivityAppConfig(const ConfigType &config);
+
+    std::string id;
+    ActivityAppConfigParamsType parameters;
+};
+
+struct FWACTIVITIES_CLASS_API ActivityRequirementKey
+{
+    ActivityRequirementKey(){};
+    FWACTIVITIES_API ActivityRequirementKey(const ConfigType &config);
+
+    std::string key;
+    std::string path;
+};
+
+struct FWACTIVITIES_CLASS_API ActivityRequirement
+{
+    ActivityRequirement(){};
+    FWACTIVITIES_API ActivityRequirement(const ConfigType &config);
+
+    typedef std::vector< ActivityRequirementKey > KeyType;
+
+    std::string name;
+    std::string type;
+    unsigned int minOccurs;
+    unsigned int maxOccurs;
+    KeyType keys;
+};
+
+/**
+ * @brief Holds Activities configuration.
+ *
+ * Example :
+ * @verbatim
+    <extension implements="::fwActivities::registry::Activities">
+        <id>3DVisualization</id>
+        <title>3D Visu</title>
+        <tabinfo>3D MPR - !values.modelSeries.patient.name</tabinfo>
+        <desc>Activity description ...</desc>
+        <icon>Bundles/media_0-1/icons/icon-3D.png</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" /> <!-- defaults : minOccurs = 1, maxOccurs = 1-->
+            <requirement name="param2" type="::fwData::Mesh" maxOccurs="3" >
+                <key>Item1</key>
+                <key>Item2</key>
+                <key>Item3</key>
+            </requirement>
+            <requirement name="param3" type="::fwData::Mesh" maxOccurs="*" />
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="0" maxOccurs="2" />
+            <requirement name="modelSeries" type="::fwMedData::ModelSeries" minOccurs="1" maxOccurs="1" />
+            <!--# ...-->
+        </requirements>
+        <builder impl="::fwMedData::ActivitySeriesBuilder" />
+        <appConfig id="3DVisualization">
+            <parameters>
+                <parameter replace="registeredImageUid" by="@values.param1" />
+                <parameter replace="orientation" by="frontal" />
+                <!--# ...-->
+            </parameters>
+        </appConfig>
+    </extension>
+ * @endverbatim
+ */
+struct FWACTIVITIES_CLASS_API ActivityInfo
+{
+    typedef std::vector< ActivityRequirement > RequirementsType;
+    typedef std::pair<unsigned int, unsigned int> MinMaxType;
+    typedef std::map< std::string, MinMaxType > RequirementsMinMaxCount;
+    typedef std::map< std::string, unsigned int > DataCountType;
+
+    ActivityInfo(){};
+
+    FWACTIVITIES_API ActivityInfo(const SPTR(::fwRuntime::Extension) &ext);
+
+    FWACTIVITIES_API bool usableWith(DataCountType dataCount) const;
+
+    std::string id;
+    std::string title;
+    std::string description;
+    std::string icon;
+    std::string tabInfo;
+    RequirementsType requirements;
+    std::string builderImpl;
+    std::string validatorImpl;
+    ActivityAppConfig appConfig;
+
+protected:
+
+    RequirementsMinMaxCount m_requirementCount;
+};
+
+
+/**
+ * @class Activities
+ * @brief This class allows to register all the configuration parameters which has the point extension
+ *        "::activityReg::registry::Activities".
+ *
+ * @date 2012
+ */
+class FWACTIVITIES_CLASS_API Activities : public ::fwCore::BaseObject
+{
+
+public:
+    typedef std::vector< ActivityInfo > ActivitiesType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Activities)(::fwCore::BaseObject), (()), new Activities ) ;
+
+    /// Return the default global instance of Activities
+    FWACTIVITIES_API static Activities::sptr getDefault();
+
+    /// Destructor
+    FWACTIVITIES_API virtual ~Activities();
+
+    /**
+     * @brief Parse bundle information to retrieve config parameters declaration
+     * @warning This method must be launch only once. The same extension will not be parsed twice.
+     * @note This method is thread safe.
+     * @{
+     **/
+    FWACTIVITIES_API void parseBundleInformation();
+    FWACTIVITIES_API void parseBundleInformation(const std::vector< SPTR( ::fwRuntime::Extension ) > &extensions);
+    ///@}
+
+    /**
+     * @brief Get the parameters associated to extension id.
+     * @note This method is thread safe.
+     **/
+    FWACTIVITIES_API const ActivityInfo getInfo( const std::string & extensionId ) const;
+
+    /**
+     * @brief Tests if we have information about operator
+     * @note This method is thread safe.
+     */
+    FWACTIVITIES_API bool hasInfo( const std::string & extensionId ) const;
+
+    /**
+     * @brief Get the number of vector objects in the same type.
+     */
+    FWACTIVITIES_API ActivityInfo::DataCountType getDataCount( const SPTR(::fwData::Vector) &data ) const;
+
+    /**
+     * @brief Get all infos
+     * @note This method is thread safe.
+     */
+    FWACTIVITIES_API ActivitiesType getInfos() const;
+
+    /**
+     * @brief Get available activities for given data.
+     * @note This method is thread safe.
+     */
+    FWACTIVITIES_API ActivitiesType getInfos( const SPTR(::fwData::Vector) &data ) const;
+
+    /**
+     * @brief Get all keys
+     * @note This method is thread safe.
+     */
+    FWACTIVITIES_API std::vector< std::string > getKeys() const;
+
+    /**
+     * @brief Clear the registry.
+     * @note This method is thread safe.
+     */
+    FWACTIVITIES_API void clearRegistry();
+
+protected :
+
+    typedef std::map< std::string, ActivityInfo > Registry;
+
+    /// Container of parameter information
+    Registry m_reg;
+
+    /// Constructor
+    FWACTIVITIES_API Activities();
+
+    /// Used to protect the registry access.
+    mutable ::fwCore::mt::ReadWriteMutex m_registryMutex;
+
+    /// The global instance of the app config parameters.
+    static Activities::sptr s_activities;
+
+
+};
+
+} // namespace registry
+
+} // namespace fwActivities
+
+#endif // _FWACTIVITIES_REGISTRY_ACTIVITIES_HPP_
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/validator/ImageProperties.hpp b/SrcLib/core/fwActivities/include/fwActivities/validator/ImageProperties.hpp
new file mode 100644
index 0000000..d366c9f
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/validator/ImageProperties.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_VALIDATOR_IMAGEPROPERTIES_HPP__
+#define __FWACTIVITIES_VALIDATOR_IMAGEPROPERTIES_HPP__
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwActivities/IValidator.hpp"
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+namespace validator
+{
+
+/**
+ * @brief Defines a validator which checks that properties of given images are the same.
+ * @class ImageProperties.
+ */
+class FWACTIVITIES_CLASS_API ImageProperties : public ::fwActivities::IValidator
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ImageProperties)(::fwActivities::IValidator),
+                                            (()),
+                                            ::fwActivities::validator::factory::New< ImageProperties > );
+
+
+    /// Constructor. Do nothing.
+    FWACTIVITIES_API ImageProperties(::fwActivities::IValidator::Key key);
+
+    /// Destructor. Do nothing.
+    FWACTIVITIES_API virtual ~ImageProperties();
+
+    /**
+     * @see ::fwActivities::IValidator::validate
+     */
+    FWACTIVITIES_API virtual IValidator::ValidationType validate(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const;
+};
+
+} // namespace validator
+} // namespace fwActivities
+
+#endif // __FWACTIVITIES_VALIDATOR_IMAGEPROPERTIES_HPP__
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/validator/RelatedStudy.hpp b/SrcLib/core/fwActivities/include/fwActivities/validator/RelatedStudy.hpp
new file mode 100644
index 0000000..bc74bc2
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/validator/RelatedStudy.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_VALIDATOR_RELATEDSTUDY_HPP__
+#define __FWACTIVITIES_VALIDATOR_RELATEDSTUDY_HPP__
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwActivities/IValidator.hpp"
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+namespace validator
+{
+
+/**
+ * @brief Defines a validator which checks that given series refer to the same study.
+ * @class RelatedStudy.
+ */
+class FWACTIVITIES_CLASS_API RelatedStudy : public ::fwActivities::IValidator
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (RelatedStudy)(::fwActivities::IValidator),
+                                            (()),
+                                            ::fwActivities::validator::factory::New< RelatedStudy > );
+
+
+    /// Constructor. Do nothing.
+    FWACTIVITIES_API RelatedStudy(::fwActivities::IValidator::Key key);
+
+    /// Destructor. Do nothing.
+    FWACTIVITIES_API virtual ~RelatedStudy();
+
+    /**
+     * @see ::fwActivities::IValidator::validate
+     */
+    FWACTIVITIES_API virtual IValidator::ValidationType validate(
+            const ::fwActivities::registry::ActivityInfo& activityInfo,
+            SPTR(::fwData::Vector) currentSelection ) const;
+};
+
+} // namespace validator
+} // namespace fwActivities
+
+#endif // __FWACTIVITIES_VALIDATOR_RELATEDSTUDY_HPP__
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/validator/factory/new.hpp b/SrcLib/core/fwActivities/include/fwActivities/validator/factory/new.hpp
new file mode 100644
index 0000000..72c20be
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/validator/factory/new.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_VALIDATOR_FACTORY_NEW_HPP__
+#define __FWACTIVITIES_VALIDATOR_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwActivities/config.hpp"
+#include "fwActivities/validator/registry/detail.hpp"
+
+namespace fwActivities
+{
+
+class IValidator;
+
+namespace validator
+{
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwActivities::validator::factory::New();
+
+    Key(){};
+};
+
+FWACTIVITIES_API SPTR( ::fwActivities::IValidator ) New( const ::fwActivities::validator::registry::KeyType & classname );
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) validator = ::boost::make_shared< CLASSNAME >( Key() );
+    return validator;
+}
+
+} // namespace factory
+} // namespace validator
+} // namespace fwActivities
+
+#endif /* __FWACTIVITIES_VALIDATOR_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/validator/registry/detail.hpp b/SrcLib/core/fwActivities/include/fwActivities/validator/registry/detail.hpp
new file mode 100644
index 0000000..eecf4af
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/validator/registry/detail.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_VALIDATOR_REGISTRY_DETAIL_HPP__
+#define __FWACTIVITIES_VALIDATOR_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwActivities/config.hpp"
+
+namespace fwActivities
+{
+
+class IValidator;
+
+namespace validator
+{
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwActivities::IValidator) () , KeyType > Type;
+
+FWACTIVITIES_API SPTR(Type) get();
+
+} // namespace registry
+} // namespace validator
+} // namespace fwActivities
+
+#endif /* __FWACTIVITIES_VALIDATOR_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwActivities/include/fwActivities/validator/registry/macros.hpp b/SrcLib/core/fwActivities/include/fwActivities/validator/registry/macros.hpp
new file mode 100644
index 0000000..9b11516
--- /dev/null
+++ b/SrcLib/core/fwActivities/include/fwActivities/validator/registry/macros.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_VALIDATOR_REGISTRY_MACRO_HPP__
+#define __FWACTIVITIES_VALIDATOR_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwActivities/IValidator.hpp"
+#include "fwActivities/validator/registry/detail.hpp"
+
+namespace fwActivities
+{
+namespace validator
+{
+namespace registry
+{
+
+#define fwActivitiesValidatorRegisterMacro( ValidatorClassname, ValidatorFunctorKey )   \
+    static ::fwActivities::IValidator::Registrar< ValidatorClassname >                \
+    BOOST_PP_CAT( s__factory__record__, __LINE__) ( ValidatorFunctorKey );
+
+} // end namespace registry
+} // end namespace validator
+} // end namespace fwActivities
+
+#endif /*__FWACTIVITIES_VALIDATOR_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwActivities/src/fwActivities/IBuilder.cpp b/SrcLib/core/fwActivities/src/fwActivities/IBuilder.cpp
new file mode 100644
index 0000000..55aacf0
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/IBuilder.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include "fwActivities/IBuilder.hpp"
+
+
+namespace fwActivities
+{
+
+//------------------------------------------------------------------------------
+
+::fwData::Vector::sptr IBuilder::getType( ::fwData::Vector::sptr currentSelection, std::string type ) const
+{
+    SLM_ASSERT("currentSelection not instanced", currentSelection);
+
+    ::fwData::Vector::sptr subSelection = ::fwData::Vector::New();
+    BOOST_FOREACH(::fwData::Vector::value_type obj, *currentSelection)
+    {
+        OSLM_ASSERT("Object not instanced in selection", obj);
+        if(obj->isA(type))
+        {
+            subSelection->getContainer().push_back(obj);
+        }
+    }
+    return subSelection;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwActivities
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeries.cpp b/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeries.cpp
new file mode 100644
index 0000000..ae704c8
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeries.cpp
@@ -0,0 +1,133 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Vector.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include "fwActivities/builder/registry/macros.hpp"
+#include "fwActivities/builder/ActivitySeries.hpp"
+
+namespace fwActivities
+{
+namespace builder
+{
+
+fwActivitiesBuilderRegisterMacro(::fwActivities::builder::ActivitySeries, "::fwActivities::builder::ActivitySeries");
+
+//-----------------------------------------------------------------------------
+
+ActivitySeries::ActivitySeries(::fwActivities::IBuilder::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ActivitySeries::~ActivitySeries()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr vectorToComposite(::fwData::Vector::sptr vector,
+                                            const ::fwActivities::registry::ActivityRequirement &req)
+{
+    namespace ActReg = ::fwActivities::registry;
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+
+    OSLM_ASSERT("Each possible items in requirement need to have a maching key", req.keys.size() >= req.maxOccurs );
+
+    ActReg::ActivityRequirement::KeyType::const_iterator iter = req.keys.begin();
+
+    BOOST_FOREACH(const ::fwData::Object::sptr &obj, *vector)
+    {
+        const ActReg::ActivityRequirementKey &keyTag = (*iter++);
+        if(keyTag.path.empty())
+        {
+            (*composite)[keyTag.key] = obj;
+        }
+        else
+        {
+            (*composite)[keyTag.key] = ::fwDataCamp::getObject( obj, keyTag.path );
+        }
+    }
+
+    return composite;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwMedData::ActivitySeries::sptr ActivitySeries::buildData(
+        const ::fwActivities::registry::ActivityInfo& activityInfo,
+        ::fwData::Vector::sptr currentSelection ) const
+{
+    ::fwMedData::ActivitySeries::sptr actSeries = ::fwMedData::ActivitySeries::New();
+
+    ::fwMedData::Series::sptr series;
+    BOOST_FOREACH(const ::fwData::Object::sptr& obj, *currentSelection)
+    {
+        series = ::fwMedData::Series::dynamicCast(obj);
+        if(series)
+        {
+            break;
+        }
+    }
+
+    if(series)
+    {
+        actSeries->setPatient( ::fwData::Object::copy(series->getPatient()) );
+        actSeries->setStudy( ::fwData::Object::copy(series->getStudy()) );
+        actSeries->setEquipment( ::fwData::Object::copy(series->getEquipment()) );
+    }
+
+    actSeries->setModality("OT");
+    actSeries->setInstanceUID("fwActivities." + ::fwTools::UUID::generateUUID() );
+
+    ::boost::posix_time::ptime now = ::boost::posix_time::second_clock::local_time();
+    actSeries->setDate(::fwTools::getDate(now));
+    actSeries->setTime(::fwTools::getTime(now));
+
+    actSeries->setActivityConfigId(activityInfo.id);
+    ::fwData::Composite::sptr data = actSeries->getData();
+
+    namespace ActReg = ::fwActivities::registry;
+
+    ActReg::ActivityInfo::RequirementsType reqVect = activityInfo.requirements;
+    BOOST_FOREACH(const ActReg::ActivityRequirement& req, reqVect)
+    {
+        ::fwData::Vector::sptr vectorType = this->getType(currentSelection, req.type);
+        // param is optional (minOccurs==0) or required (minOccurs==1), but is single (maxOccurs == 1)
+        if(req.maxOccurs == 1 && req.minOccurs == 1)
+        {
+            OSLM_ASSERT("No param name "<<req.name<<" with type "<<req.type, !vectorType->empty());
+            (*data)[req.name] = (*vectorType)[0];
+        }
+        else //optional single parameter
+        {
+            (*data)[req.name] = vectorToComposite(vectorType, req);
+        }
+    }
+
+    return actSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwActivities
+
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeriesInitData.cpp b/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeriesInitData.cpp
new file mode 100644
index 0000000..62d8027
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/builder/ActivitySeriesInitData.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Vector.hpp>
+#include <fwData/Composite.hpp>
+
+#include "fwActivities/builder/registry/macros.hpp"
+#include "fwActivities/builder/ActivitySeriesInitData.hpp"
+
+namespace fwActivities
+{
+namespace builder
+{
+
+fwActivitiesBuilderRegisterMacro(
+        ::fwActivities::builder::ActivitySeriesInitData, "::fwActivities::builder::ActivitySeriesInitData");
+
+//-----------------------------------------------------------------------------
+
+ActivitySeriesInitData::ActivitySeriesInitData(::fwActivities::IBuilder::Key key)
+    : fwActivities::builder::ActivitySeries(key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ActivitySeriesInitData::~ActivitySeriesInitData()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwMedData::ActivitySeries::sptr ActivitySeriesInitData::buildData(
+        const ::fwActivities::registry::ActivityInfo& activityInfo,
+        ::fwData::Vector::sptr currentSelection ) const
+{
+    ::fwMedData::ActivitySeries::sptr actSeries = this->ActivitySeries::buildData(activityInfo, currentSelection);
+    ::fwData::Composite::sptr data = actSeries->getData();
+
+    namespace ActReg = ::fwActivities::registry;
+
+    ActReg::ActivityInfo::RequirementsType reqVect = activityInfo.requirements;
+    BOOST_FOREACH(const ActReg::ActivityRequirement& req, reqVect)
+    {
+        if(req.maxOccurs == 0 && req.minOccurs == 0)
+        {
+            (*data)[req.name] = ::fwData::factory::New(req.type);
+        }
+    }
+
+    return actSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwActivities
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/builder/factory/new.cpp b/SrcLib/core/fwActivities/src/fwActivities/builder/factory/new.cpp
new file mode 100644
index 0000000..11537e9
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/builder/factory/new.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwActivities/IBuilder.hpp"
+#include "fwActivities/builder/factory/new.hpp"
+
+
+namespace fwActivities
+{
+namespace builder
+{
+namespace factory
+{
+
+::fwActivities::IBuilder::sptr New( const ::fwActivities::builder::registry::KeyType & classname )
+{
+    return ::fwActivities::builder::registry::get()->create(classname);
+}
+
+} // namespace factory
+} // namespace builder
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/builder/registry/detail.cpp b/SrcLib/core/fwActivities/src/fwActivities/builder/registry/detail.cpp
new file mode 100644
index 0000000..78d96e7
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/builder/registry/detail.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwActivities/builder/registry/detail.hpp"
+
+
+namespace fwActivities
+{
+namespace builder
+{
+namespace registry
+{
+
+struct FwActivitiesBuilderRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwActivitiesBuilderRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+} // namespace builder
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/registry/Activities.cpp b/SrcLib/core/fwActivities/src/fwActivities/registry/Activities.cpp
new file mode 100644
index 0000000..3928954
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/registry/Activities.cpp
@@ -0,0 +1,316 @@
+#include <limits>
+
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/Convert.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include "fwActivities/registry/Activities.hpp"
+
+namespace fwActivities
+{
+namespace registry
+{
+
+ActivityAppConfigParam::ActivityAppConfigParam(const ConfigType &config) :
+    replace(config.get<std::string>("<xmlattr>.replace")),
+    by(config.get<std::string>("<xmlattr>.by"))
+{
+}
+
+//-----------------------------------------------------------------------------
+
+ActivityAppConfig::ActivityAppConfig(const ConfigType &config) :
+    id(config.get<std::string>("<xmlattr>.id"))
+{
+    if(config.count("parameters") == 1 )
+    {
+        const ConfigType &configParameters = config.get_child("parameters");
+        BOOST_FOREACH( const ConfigType::value_type &v, configParameters.equal_range("parameter") )
+        {
+            ActivityAppConfigParam parameter( v.second );
+            parameters.push_back( parameter );
+        }
+    }
+    OSLM_ASSERT("At most 1 <parameters> tag is allowed", config.count("parameters") < 2);
+}
+
+//-----------------------------------------------------------------------------
+
+ActivityRequirementKey::ActivityRequirementKey(const ConfigType &config) :
+    key(config.get_value<std::string>()),
+    path(config.get_optional<std::string>("<xmlattr>.path").get_value_or(""))
+{
+}
+
+//-----------------------------------------------------------------------------
+
+ActivityRequirement::ActivityRequirement(const ConfigType &config) :
+    name(config.get<std::string>("<xmlattr>.name")),
+    type(config.get<std::string>("<xmlattr>.type")),
+    minOccurs(config.get_optional<unsigned int>("<xmlattr>.minOccurs").get_value_or(1)),
+    maxOccurs(config.get_optional<unsigned int>("<xmlattr>.maxOccurs").get_value_or(1))
+{
+    BOOST_FOREACH( const ConfigType::value_type &v, config.equal_range("key") )
+    {
+        keys.push_back(ActivityRequirementKey(v.second));
+    }
+
+    if (config.get_optional<std::string>("<xmlattr>.maxOccurs").get_value_or("") == "*")
+    {
+        this->maxOccurs = std::numeric_limits<unsigned int>::max();
+    }
+
+    OSLM_ASSERT( "minOccurs value shall be equal or greater than 0 and lower or equal to maxOccurs (" << maxOccurs << ")",
+                 0 <= minOccurs && minOccurs <= maxOccurs);
+    OSLM_TRACE( "ActivityRequirement : " << name << " : " << type << ", " << minOccurs << "-" << maxOccurs );
+}
+
+//-----------------------------------------------------------------------------
+
+ActivityInfo::ActivityInfo(const SPTR(::fwRuntime::Extension) &ext) :
+    id(ext->findConfigurationElement("id")->getValue()),
+    title(ext->findConfigurationElement("title")->getValue()),
+    tabInfo(title),
+    description(ext->findConfigurationElement("desc")->getValue()),
+    icon(ext->findConfigurationElement("icon")->getValue()),
+    builderImpl(ext->findConfigurationElement("builder")->getValue()),
+    appConfig(::fwRuntime::Convert::toPropertyTree(ext->findConfigurationElement("appConfig")).get_child("appConfig"))
+{
+
+    if(ext->findConfigurationElement("tabinfo"))
+    {
+        tabInfo = ext->findConfigurationElement("tabinfo")->getValue();
+    }
+
+
+    ::fwRuntime::ConfigurationElement::sptr req = ext->findConfigurationElement("requirements");
+    for(  ::fwRuntime::ConfigurationElementContainer::Iterator elem = req->begin();
+          elem != req->end();
+          ++elem )
+    {
+        ActivityRequirement requirement( ::fwRuntime::Convert::toPropertyTree(*elem).get_child("requirement") );
+        requirements.push_back( requirement );
+
+        MinMaxType &minMax = m_requirementCount[requirement.type];
+
+        minMax.first += requirement.minOccurs;
+
+        if (requirement.maxOccurs <  (std::numeric_limits<unsigned int>::max() - minMax.second) )
+        {
+            minMax.second += requirement.maxOccurs;
+        }
+        else
+        {
+            minMax.second = std::numeric_limits<unsigned int>::max();
+        }
+    }
+
+    ::fwRuntime::ConfigurationElement::sptr validatorCfg = ext->findConfigurationElement("validator");
+    if(validatorCfg)
+    {
+        std::string validatorImplStr = validatorCfg->getValue();
+        if(!validatorImplStr.empty())
+        {
+            validatorImpl = validatorImplStr;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool ActivityInfo::usableWith(DataCountType dataCounts) const
+{
+    bool ok = dataCounts.size() <= m_requirementCount.size();
+
+    if(ok)
+    {
+        BOOST_FOREACH( const RequirementsMinMaxCount::value_type &reqCount, m_requirementCount )
+        {
+            const MinMaxType &reqMinMax = reqCount.second;
+            DataCountType::iterator iter = dataCounts.find(reqCount.first);
+            if (iter != dataCounts.end())
+            {
+                unsigned int dataCount = iter->second;
+                ok = dataCount && reqMinMax.first <= dataCount && dataCount <= reqMinMax.second;
+                dataCounts.erase(iter);
+            }
+            else
+            {
+                ok = (reqMinMax.first == 0);
+            }
+            if( !ok )
+            {
+                break;
+            }
+        }
+
+        if(ok)
+        {
+            BOOST_FOREACH( const DataCountType::value_type &dataCount, dataCounts )
+            {
+                if(m_requirementCount.find(dataCount.first) == m_requirementCount.end())
+                {
+                    ok = false;
+                    break;
+                }
+            }
+        }
+    }
+
+    return ok;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+Activities::sptr Activities::s_activities = Activities::New();
+
+//-----------------------------------------------------------------------------
+
+Activities::sptr Activities::getDefault()
+{
+    return s_activities;
+}
+
+//-----------------------------------------------------------------------------
+
+Activities::~Activities()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Activities::parseBundleInformation()
+{
+    std::vector< SPTR( ::fwRuntime::Extension ) >  extensions
+        = ::fwRuntime::getAllExtensionsForPoint("::fwActivities::registry::Activities");
+
+    this->parseBundleInformation(extensions);
+
+}
+
+void Activities::parseBundleInformation(const std::vector< SPTR( ::fwRuntime::Extension ) > &extensions)
+{
+
+    BOOST_FOREACH( const SPTR( ::fwRuntime::Extension ) &ext, extensions )
+    {
+        OSLM_DEBUG("Parsing <" << ext->getBundle()->getIdentifier() << "> Activities");
+        ActivityInfo info(ext);
+
+        ::fwCore::mt::WriteLock lock(m_registryMutex);
+        SLM_ASSERT("The id " <<  info.id << "(" << info.title << ")"
+                << " already exists in the Activities registry", m_reg.find( info.id ) == m_reg.end());
+        m_reg.insert( Registry::value_type(info.id, info) );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+Activities::Activities()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Activities::clearRegistry()
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_reg.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+bool Activities::hasInfo( const std::string & extensionId ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    Registry::const_iterator iter = m_reg.find( extensionId );
+    return iter != m_reg.end();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ActivityInfo > Activities::getInfos() const
+{
+    std::vector< ActivityInfo > infos;
+
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+
+    BOOST_FOREACH( Registry::value_type val, m_reg )
+    {
+        infos.push_back( val.second );
+    }
+
+    return infos;
+}
+
+//-----------------------------------------------------------------------------
+
+ActivityInfo::DataCountType Activities::getDataCount( const ::fwData::Vector::sptr &data ) const
+{
+    ActivityInfo::DataCountType dataCount;
+
+    BOOST_FOREACH( const ::fwData::Object::sptr &obj, *data)
+    {
+        ++dataCount[obj->getClassname()];
+    }
+
+    return dataCount;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ActivityInfo > Activities::getInfos( const ::fwData::Vector::sptr &data ) const
+{
+    ActivityInfo::DataCountType dataCount = this->getDataCount(data);
+    std::vector< ActivityInfo > infos;
+
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+
+    BOOST_FOREACH( const Registry::value_type &regValue, m_reg )
+    {
+        const ActivityInfo &activity = regValue.second;
+        if (activity.usableWith(dataCount))
+        {
+            infos.push_back(activity);
+        }
+    }
+
+    return infos;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > Activities::getKeys() const
+{
+    std::vector< std::string > keys;
+
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+
+    BOOST_FOREACH( Registry::value_type val, m_reg )
+    {
+        keys.push_back( val.first );
+    }
+
+    return keys;
+}
+
+//-----------------------------------------------------------------------------
+
+const ActivityInfo Activities::getInfo( const std::string & extensionId ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    Registry::const_iterator iter = m_reg.find( extensionId );
+    SLM_ASSERT("The id " <<  extensionId << " is not found in the application configuration parameter registry", iter != m_reg.end());
+    return iter->second;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+
+} // namespace fwActivities
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/validator/ImageProperties.cpp b/SrcLib/core/fwActivities/src/fwActivities/validator/ImageProperties.cpp
new file mode 100644
index 0000000..928f003
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/validator/ImageProperties.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+#include <fwData/Vector.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwMath/Compare.hpp>
+
+#include "fwActivities/validator/registry/macros.hpp"
+#include "fwActivities/validator/ImageProperties.hpp"
+
+namespace fwActivities
+{
+namespace validator
+{
+
+fwActivitiesValidatorRegisterMacro(
+        ::fwActivities::validator::ImageProperties, "::fwActivities::validator::ImageProperties");
+
+//-----------------------------------------------------------------------------
+
+ImageProperties::ImageProperties(::fwActivities::IValidator::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ImageProperties::~ImageProperties()
+{}
+
+//-----------------------------------------------------------------------------
+
+IValidator::ValidationType ImageProperties::validate(
+        const ::fwActivities::registry::ActivityInfo& activityInfo,
+        ::fwData::Vector::sptr currentSelection ) const
+{
+    IValidator::ValidationType validation;
+
+    if(currentSelection->size() > 1)
+    {
+        validation.first = true;
+        validation.second = "Input images have the same properties.";
+
+        ::fwMedData::ImageSeries::sptr imgSeries0 = ::fwMedData::ImageSeries::dynamicCast((*currentSelection)[0]);
+        SLM_ASSERT("Failed to retrieve an image series", imgSeries0);
+        ::fwData::Image::sptr img0 = imgSeries0->getImage();
+        SLM_ASSERT("Failed to retrieve image from image series", img0);
+
+        ::fwData::Image::SizeType size = img0->getSize();
+        ::fwData::Image::SpacingType spacing = img0->getSpacing();
+        ::fwData::Image::OriginType origin = img0->getOrigin();
+
+        ::fwData::Vector::ContainerType::const_iterator it; 
+        for(it = currentSelection->begin() + 1; it != currentSelection->end(); ++it)
+        {
+            ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(*it);
+            SLM_ASSERT("Failed to retrieve an image series", imgSeries);
+            ::fwData::Image::sptr img = imgSeries->getImage();
+            SLM_ASSERT("Failed to retrieve an image data", img);
+
+            if (  size != img->getSize() ||
+                    !::fwMath::isContainerEqual< const ::fwData::Image::SpacingType >(spacing, img->getSpacing()) ||
+                    !::fwMath::isContainerEqual< const ::fwData::Image::OriginType >(origin, img->getOrigin()) )
+            {
+                std::string errorMsg = "Images in selection have not the same properties :\n";
+                errorMsg += (size != img->getSize()) ? "- size\n":"";
+                errorMsg += (spacing != img->getSpacing())?"- spacing\n":"";
+                errorMsg += (origin != img->getOrigin())?"- origin":"";
+
+                validation.first = false;
+                validation.second = errorMsg;
+
+                break;
+            }
+        }
+    }
+    else
+    {
+        validation.first = true;
+        validation.second = "Only one data provided to check images properties, assuming validation as ok.";
+    }
+
+    return validation;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace validator
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/validator/RelatedStudy.cpp b/SrcLib/core/fwActivities/src/fwActivities/validator/RelatedStudy.cpp
new file mode 100644
index 0000000..e0e24af
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/validator/RelatedStudy.cpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/algorithm/string.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "fwActivities/validator/registry/macros.hpp"
+#include "fwActivities/validator/RelatedStudy.hpp"
+
+namespace fwActivities
+{
+namespace validator
+{
+
+fwActivitiesValidatorRegisterMacro(
+        ::fwActivities::validator::RelatedStudy, "::fwActivities::validator::RelatedStudy");
+
+//-----------------------------------------------------------------------------
+
+RelatedStudy::RelatedStudy(::fwActivities::IValidator::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+RelatedStudy::~RelatedStudy()
+{}
+
+//-----------------------------------------------------------------------------
+
+IValidator::ValidationType RelatedStudy::validate(
+        const ::fwActivities::registry::ActivityInfo& activityInfo,
+        ::fwData::Vector::sptr currentSelection ) const
+{
+    IValidator::ValidationType validation;
+
+    if(currentSelection->size() > 1)
+    {
+        validation.first = true;
+        validation.second = "Selected series refer to the same study.";
+
+        ::fwMedData::Series::sptr seriesRef = ::fwMedData::Series::dynamicCast((*currentSelection)[0]);
+        ::fwMedData::Study::sptr studyRef = seriesRef->getStudy();
+
+        std::string instanceUIDRef = studyRef->getInstanceUID();
+        ::boost::algorithm::trim(instanceUIDRef);
+
+        ::fwData::Vector::ContainerType::const_iterator it; 
+        for(it = currentSelection->begin() + 1; it != currentSelection->end(); ++it)
+        {
+            ::fwMedData::Series::sptr series = ::fwMedData::Series::dynamicCast(*it);
+            ::fwMedData::Study::sptr study = series->getStudy();
+
+            std::string instanceUID = study->getInstanceUID();
+            ::boost::algorithm::trim(instanceUID);
+
+            if(instanceUIDRef != instanceUID)
+            {
+                validation.first = false;
+                validation.second = "Selected series don't refer to the same study.";
+
+                break;
+            }
+        }
+    }
+    else
+    {
+        validation.first = true;
+        validation.second = "Only one series provided to check study affiliation, assuming validation as ok.";
+    }
+
+    return validation;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace validator
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/validator/factory/new.cpp b/SrcLib/core/fwActivities/src/fwActivities/validator/factory/new.cpp
new file mode 100644
index 0000000..0fab144
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/validator/factory/new.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwActivities/IValidator.hpp"
+#include "fwActivities/validator/factory/new.hpp"
+
+
+namespace fwActivities
+{
+namespace validator
+{
+namespace factory
+{
+
+::fwActivities::IValidator::sptr New( const ::fwActivities::validator::registry::KeyType & classname )
+{
+    return ::fwActivities::validator::registry::get()->create(classname);
+}
+
+} // namespace factory
+} // namespace validator
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/src/fwActivities/validator/registry/detail.cpp b/SrcLib/core/fwActivities/src/fwActivities/validator/registry/detail.cpp
new file mode 100644
index 0000000..5ef34f9
--- /dev/null
+++ b/SrcLib/core/fwActivities/src/fwActivities/validator/registry/detail.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwActivities/validator/registry/detail.hpp"
+
+
+namespace fwActivities
+{
+namespace validator
+{
+namespace registry
+{
+
+struct FwActivitiesValidatorRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwActivitiesValidatorRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+} // namespace validator
+} // namespace fwActivities
+
+
diff --git a/SrcLib/core/fwActivities/test/CMakeLists.txt b/SrcLib/core/fwActivities/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwActivities/test/Properties.cmake b/SrcLib/core/fwActivities/test/Properties.cmake
new file mode 100644
index 0000000..a2097dd
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwActivitiesTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwData fwMedData fwActivities )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwActivities/test/cppunit.options b/SrcLib/core/fwActivities/test/cppunit.options
new file mode 100644
index 0000000..4371241
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/cppunit.options
@@ -0,0 +1,9 @@
+
+CLASSTEST=[
+          'ActivitySeriesBuilderTest',
+          'ActivityRegistryTest',
+          ]
+
+USE = ['boost', 'cppunit']
+LIB = ['fwData_0-1', 'fwMedData_0-1', 'fwActivities_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwActivities/test/tu/include/builder/ActivitySeriesBuilderTest.hpp b/SrcLib/core/fwActivities/test/tu/include/builder/ActivitySeriesBuilderTest.hpp
new file mode 100644
index 0000000..c3623fb
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/include/builder/ActivitySeriesBuilderTest.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_UT_BUILDER_ACTIVITYSERIESBUILDERTEST_HPP__
+#define __FWACTIVITIES_UT_BUILDER_ACTIVITYSERIESBUILDERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwActivities
+{
+
+namespace ut
+{
+
+class ActivitySeriesBuilderTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActivitySeriesBuilderTest );
+
+    CPPUNIT_TEST(builDataTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void builDataTest();
+
+protected:
+    SPTR( ::fwRuntime::Bundle ) m_bundle;
+    SPTR( ::fwActivities::registry::Activities ) m_activities;
+
+};
+
+} //namespace ut
+} //namespace fwActivities
+
+#endif //__FWACTIVITIES_UT_BUILDER_ACTIVITYSERIESBUILDERTEST_HPP__
+
diff --git a/SrcLib/core/fwActivities/test/tu/include/registry/ActivityRegistryTest.hpp b/SrcLib/core/fwActivities/test/tu/include/registry/ActivityRegistryTest.hpp
new file mode 100644
index 0000000..fa4b4c4
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/include/registry/ActivityRegistryTest.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWACTIVITIES_UT_REGISTRY_ACTIVITYREGISTRYTEST_HPP__
+#define __FWACTIVITIES_UT_REGISTRY_ACTIVITYREGISTRYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwRuntime
+{
+struct Bundle;
+}
+
+namespace fwActivities
+{
+
+namespace ut
+{
+
+class ActivityRegistryTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActivityRegistryTest );
+
+    CPPUNIT_TEST(registryTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void registryTest();
+
+protected:
+
+    SPTR( fwRuntime::Bundle ) m_bundle;
+    SPTR( fwActivities::registry::Activities ) m_activities;
+};
+
+} //namespace ut
+} //namespace fwActivities
+
+#endif //__FWACTIVITIES_UT_REGISTRY_ACTIVITYREGISTRYTEST_HPP__
+
diff --git a/SrcLib/core/fwActivities/test/tu/rc/tu_builder/plugin.xml b/SrcLib/core/fwActivities/test/tu/rc/tu_builder/plugin.xml
new file mode 100644
index 0000000..eb1a56a
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/rc/tu_builder/plugin.xml
@@ -0,0 +1,27 @@
+<plugin id="tu_fwActivities" >
+
+    <extension-point id="::fwActivities::registry::Activities" schema="activities.xsd"/>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test0</id>
+        <title>Title Test0</title>
+        <desc>Desc Test0</desc>
+        <icon>Icon Test0</icon>
+        <requirements>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="1" maxOccurs="1" />
+            <requirement name="modelSeries" type="::fwMedData::ModelSeries" minOccurs="0" maxOccurs="2" >
+              <key>key1</key>
+              <key>key2</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test0">
+            <parameters>
+                <parameter replace="RefModel" by="@values.modelSeries" />
+                <parameter replace="RefImage" by="@values.imageSeries.value.image" />
+            </parameters>
+        </appConfig>
+    </extension>
+
+</plugin>
+
diff --git a/SrcLib/core/fwActivities/test/tu/rc/tu_registry/plugin.xml b/SrcLib/core/fwActivities/test/tu/rc/tu_registry/plugin.xml
new file mode 100644
index 0000000..1f209f4
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/rc/tu_registry/plugin.xml
@@ -0,0 +1,181 @@
+<plugin id="tu_fwActivities" >
+
+    <extension-point id="::fwActivities::registry::Activities" schema="activities.xsd"/>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test0</id>
+        <title>Title Test0</title>
+        <desc>Desc Test0</desc>
+        <icon>Icon Test0</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" /> <!-- defaults : minOccurs = 1, maxOccurs = 1-->
+            <requirement name="param2" type="::fwData::Mesh" maxOccurs="8" >
+              <key>key1</key>
+              <key>key2</key>
+              <key>key3</key>
+              <key>key4</key>
+              <key>key5</key>
+              <key>key6</key>
+              <key>key7</key>
+              <key>key8</key>
+            </requirement>
+            <requirement name="param3" type="::fwData::Mesh" maxOccurs="10" > <!-- '*' not managed right now -->
+              <key>key1</key>
+              <key>key2</key>
+              <key>key3</key>
+              <key>key4</key>
+              <key>key5</key>
+              <key>key6</key>
+              <key>key7</key>
+              <key>key8</key>
+              <key>key9</key>
+              <key>key10</key>
+            </requirement>
+            <requirement name="imageSeries" type="::fwMedData::ImageSeries" minOccurs="0" maxOccurs="2" >
+              <key>key1</key>
+              <key>key2</key>
+            </requirement>
+            <requirement name="modelSeries" type="::fwMedData::ModelSeries" minOccurs="1" maxOccurs="1" />
+            <!--# ...-->
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test0">
+            <parameters>
+                <parameter replace="refImageUid" by="@values.param1"  />
+                <parameter replace="registeredImageUid" by="@values.param2" />
+                <parameter replace="orientation" by="frontal" />
+            </parameters>
+        </appConfig>
+    </extension>
+
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test1</id>
+        <title>Title Test1</title>
+        <desc>1 image</desc>
+        <icon>Icon Test1</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test1" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test2</id>
+        <title>Title Test2</title>
+        <desc>1 image, 1 mesh</desc>
+        <icon>Icon Test2</icon>
+        <requirements>
+            <requirement name="img" type="::fwData::Image" />
+            <requirement name="mesh" type="::fwData::Mesh" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test2" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test3</id>
+        <title>Title Test3</title>
+        <desc>1-2 image</desc>
+        <icon>Icon Test3</icon>
+        <requirements>
+          <requirement name="param1" type="::fwData::Image" maxOccurs="2" >
+            <key>key1</key>
+            <key>key2</key>
+          </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test3" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test4</id>
+        <title>Title Test4</title>
+        <desc>* image</desc>
+        <icon>Icon Test4</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" maxOccurs="10" > <!-- '*' not managed right now -->
+              <key>key1</key>
+              <key>key2</key>
+              <key>key3</key>
+              <key>key4</key>
+              <key>key5</key>
+              <key>key6</key>
+              <key>key7</key>
+              <key>key8</key>
+              <key>key9</key>
+              <key>key10</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test4" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test5</id>
+        <title>Title Test5</title>
+        <desc>4-8 image</desc>
+        <icon>Icon Test5</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" minOccurs="4" maxOccurs="8">
+              <key>key1</key>
+              <key>key2</key>
+              <key>key3</key>
+              <key>key4</key>
+              <key>key5</key>
+              <key>key6</key>
+              <key>key7</key>
+              <key>key8</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test5" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test6</id>
+        <title>Title Test6</title>
+        <desc>2 image</desc>
+        <icon>Icon Test6</icon>
+        <requirements>
+            <requirement name="param1" type="::fwData::Image" />
+            <requirement name="param2" type="::fwData::Image" />
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test6" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+
+    <extension implements="::fwActivities::registry::Activities">
+        <id>Test7</id>
+        <title>Title Test7</title>
+        <desc>1 image, 0-1 mesh</desc>
+        <icon>Icon Test3</icon>
+        <requirements>
+            <requirement name="img" type="::fwData::Image" />
+            <requirement name="mesh" type="::fwData::Mesh" minOccurs="0" >
+              <key>key1</key>
+            </requirement>
+        </requirements>
+        <builder>::fwActivities::builder::ActivitySeries</builder>
+        <appConfig id="Test7" >
+            <parameters/>
+        </appConfig>
+    </extension>
+
+
+</plugin>
+
diff --git a/SrcLib/core/fwActivities/test/tu/src/builder/ActivitySeriesBuilderTest.cpp b/SrcLib/core/fwActivities/test/tu/src/builder/ActivitySeriesBuilderTest.cpp
new file mode 100644
index 0000000..5d99ad5
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/src/builder/ActivitySeriesBuilderTest.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/Bundle.hpp>
+#include <fwRuntime/Extension.hpp>
+#include <fwRuntime/io/BundleDescriptorReader.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+#include <fwActivities/IBuilder.hpp>
+
+#include "builder/ActivitySeriesBuilderTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwActivities::ut::ActivitySeriesBuilderTest );
+
+namespace fwActivities
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesBuilderTest::setUp()
+{
+    // Set up context before running a test.
+#ifdef SPECIALINSTALL
+	::boost::filesystem::path plugin = std::string(SHAREPATH)+"tu_exec_fwActivities_0-0/tu_builder";
+#else
+	::boost::filesystem::path plugin = "share/tu_exec_fwActivities_0-0/tu_builder";
+#endif
+
+    m_bundle = ::fwRuntime::io::BundleDescriptorReader::createBundle(plugin);
+
+    m_activities = ::fwActivities::registry::Activities::New();
+
+    ::fwRuntime::Bundle::ExtensionContainer extensionsSet( m_bundle->extensionsBegin(), m_bundle->extensionsEnd());
+    std::vector< SPTR( ::fwRuntime::Extension ) > extensions(extensionsSet.begin(), extensionsSet.end());
+    m_activities->parseBundleInformation(extensions);
+
+    CPPUNIT_ASSERT_EQUAL( size_t(1), extensions.size());
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesBuilderTest::tearDown()
+{
+    // Clean up after the test run.
+    m_bundle.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesBuilderTest::builDataTest()
+{
+    ::fwData::Vector::sptr selection = ::fwData::Vector::New();
+    ::fwMedData::ImageSeries::sptr imgSeriesSelected = ::fwMedData::ImageSeries::New();
+    ::fwMedData::ModelSeries::sptr modelSeriesSelected = ::fwMedData::ModelSeries::New();
+    selection->getContainer().push_back(imgSeriesSelected);
+    selection->getContainer().push_back(modelSeriesSelected);
+
+    ::fwActivities::registry::Activities::ActivitiesType activities;
+    activities = m_activities->getInfos(selection);
+    CPPUNIT_ASSERT_EQUAL(size_t(1), activities.size());
+
+    ::fwActivities::registry::ActivityInfo activityInfo = activities[0];
+    ::fwMedData::ActivitySeries::sptr actSeries;
+    ::fwActivities::IBuilder::sptr builder;
+    builder = ::fwActivities::builder::factory::New(activityInfo.builderImpl);
+    CPPUNIT_ASSERT_MESSAGE("<" + activityInfo.builderImpl + "> instantiation failed", builder);
+    actSeries = builder->buildData(activityInfo, selection);
+
+    CPPUNIT_ASSERT_MESSAGE("ActivitySeries instantiation failed", actSeries);
+
+    CPPUNIT_ASSERT_EQUAL(activityInfo.id, actSeries->getActivityConfigId());
+
+    ::fwData::Composite::sptr dataActivity = actSeries->getData();
+    CPPUNIT_ASSERT_EQUAL(size_t(2), dataActivity->size());
+
+    const std::string imageKey = "imageSeries";
+    const std::string modelKey = "modelSeries";
+    CPPUNIT_ASSERT_MESSAGE(imageKey + " key is missing", dataActivity->find(imageKey) != dataActivity->end());
+    CPPUNIT_ASSERT_MESSAGE(modelKey + " key is missing", dataActivity->find(modelKey) != dataActivity->end());
+
+    //single param [1;1]
+    ::fwData::Object::sptr obj = (*dataActivity)[imageKey];
+    CPPUNIT_ASSERT(obj == imgSeriesSelected);
+
+    //set of param [0;2]
+    obj = (*dataActivity)[modelKey];
+    ::fwData::Composite::sptr composite = ::fwData::Composite::dynamicCast(obj);
+    CPPUNIT_ASSERT_MESSAGE(modelKey + " param dynamicCast to fwData::Composite failed", composite);
+    CPPUNIT_ASSERT_EQUAL(size_t(1), composite->size());
+    CPPUNIT_ASSERT(modelSeriesSelected == (*composite)["key1"]);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwActivities
diff --git a/SrcLib/core/fwActivities/test/tu/src/registry/ActivityRegistryTest.cpp b/SrcLib/core/fwActivities/test/tu/src/registry/ActivityRegistryTest.cpp
new file mode 100644
index 0000000..1c6f075
--- /dev/null
+++ b/SrcLib/core/fwActivities/test/tu/src/registry/ActivityRegistryTest.cpp
@@ -0,0 +1,205 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include <fwRuntime/Bundle.hpp>
+#include <fwRuntime/Extension.hpp>
+#include <fwRuntime/io/BundleDescriptorReader.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Vector.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include "registry/ActivityRegistryTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwActivities::ut::ActivityRegistryTest );
+
+namespace fwActivities
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ActivityRegistryTest::setUp()
+{
+
+#ifdef SPECIALINSTALL
+	::boost::filesystem::path plugin = std::string(SHAREPATH)+"tu_exec_fwActivities_0-0/tu_registry";
+#else
+	::boost::filesystem::path plugin = "share/tu_exec_fwActivities_0-0/tu_registry";
+#endif
+    m_bundle = ::fwRuntime::io::BundleDescriptorReader::createBundle(plugin);
+
+    m_activities = fwActivities::registry::Activities::New();
+
+    ::fwRuntime::Bundle::ExtensionContainer extensionsSet( m_bundle->extensionsBegin(), m_bundle->extensionsEnd());
+    std::vector< SPTR( ::fwRuntime::Extension ) > extensions(extensionsSet.begin(), extensionsSet.end());
+    m_activities->parseBundleInformation(extensions);
+
+    CPPUNIT_ASSERT_EQUAL( size_t(8) , extensions.size());
+
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ActivityRegistryTest::tearDown()
+{
+    // Clean up after the test run.
+    m_bundle.reset();
+}
+
+//------------------------------------------------------------------------------
+
+struct activities_less_than_key
+{
+    inline bool operator() (const ::fwActivities::registry::ActivityInfo& a,
+                            const ::fwActivities::registry::ActivityInfo& b)
+    {
+        return (a.id < b.id);
+    }
+};
+
+void ActivityRegistryTest::registryTest()
+{
+
+    ::fwData::Vector::sptr v = ::fwData::Vector::New();
+    ::fwActivities::registry::Activities::ActivitiesType activities;
+
+    // 1 image
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test1"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test3"), activities.at(1).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(2).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test7"), activities.at(3).id );
+
+
+    // 2 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(3), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test3"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(1).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test6"), activities.at(2).id );
+
+    // 3 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(1), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+
+    // 4 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test5"), activities.at(1).id );
+
+    // 5 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test5"), activities.at(1).id );
+
+    // 6 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test5"), activities.at(1).id );
+
+    // 7 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test5"), activities.at(1).id );
+
+    // 8 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test5"), activities.at(1).id );
+
+    // 9 images
+    v->getContainer().push_back( ::fwData::Image::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(1), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test4"), activities.at(0).id );
+
+    // 9 images, 1 mesh
+    v->getContainer().push_back( ::fwData::Mesh::New() );
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(0), activities.size() );
+
+    // 1 images, 1 mesh
+    v->getContainer().clear();
+    v->getContainer().push_back( ::fwData::Image::New() );
+    v->getContainer().push_back( ::fwData::Mesh::New() );
+
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(2), activities.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test2"), activities.at(0).id );
+    CPPUNIT_ASSERT_EQUAL( std::string("Test7"), activities.at(1).id );
+
+    // 1 images, 2 mesh, 1 ImageSeries, 1 ModelSeries
+    v->getContainer().push_back( ::fwData::Mesh::New() );
+    v->getContainer().push_back( ::fwMedData::ImageSeries::New() );
+    v->getContainer().push_back( ::fwMedData::ModelSeries::New() );
+
+    activities = m_activities->getInfos(v);
+    std::sort(activities.begin(), activities.end(), activities_less_than_key());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(1), activities.size() );
+    const ::fwActivities::registry::ActivityInfo &info = activities[0];
+    CPPUNIT_ASSERT_EQUAL( std::string("Test0"), info.id );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), info.appConfig.parameters.size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("refImageUid"), info.appConfig.parameters.at(0).replace );
+    CPPUNIT_ASSERT_EQUAL( std::string("@values.param1"), info.appConfig.parameters.at(0).by );
+    CPPUNIT_ASSERT_EQUAL( std::string("registeredImageUid"), info.appConfig.parameters.at(1).replace );
+    CPPUNIT_ASSERT_EQUAL( std::string("@values.param2"), info.appConfig.parameters.at(1).by );
+    CPPUNIT_ASSERT_EQUAL( std::string("orientation"), info.appConfig.parameters.at(2).replace );
+    CPPUNIT_ASSERT_EQUAL( std::string("frontal"), info.appConfig.parameters.at(2).by );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwActivities
diff --git a/SrcLib/core/fwAtomConversion/CMakeLists.txt b/SrcLib/core/fwAtomConversion/CMakeLists.txt
new file mode 100644
index 0000000..af732ee
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/CMakeLists.txt
@@ -0,0 +1,16 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwAtoms
+    fwCamp
+    fwCore
+    fwMemory
+    fwTools
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
+
diff --git a/SrcLib/core/fwAtomConversion/Properties.cmake b/SrcLib/core/fwAtomConversion/Properties.cmake
new file mode 100644
index 0000000..5abae15
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomConversion )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtoms fwCamp fwCore fwData fwDataCamp fwMemory fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtomConversion/bin/build.options b/SrcLib/core/fwAtomConversion/bin/build.options
new file mode 100644
index 0000000..de44af4
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/bin/build.options
@@ -0,0 +1,4 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = ['boost','camp']
+LIB = ['fwData_0.1', 'fwAtoms_0.1', 'fwDataCamp_0.1']
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomToDataMappingVisitor.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomToDataMappingVisitor.hpp
new file mode 100644
index 0000000..2387e93
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomToDataMappingVisitor.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWATOMCONVERSION_ATOMTODATAMAPPINGVISITOR_HPP__
+#define  __FWATOMCONVERSION_ATOMTODATAMAPPINGVISITOR_HPP__
+
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/AtomVisitor.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+
+/**
+ * @brief This visitor visits data object to fill it with associated atom object attributes.
+ * This class is used by AtomVisitor to convert an fwData::Object.
+ * @class AtomToDataMappingVisitor
+ * @date 2013
+ */
+class FWATOMCONVERSION_CLASS_API AtomToDataMappingVisitor : public ::camp::ExtendedClassVisitor
+{
+
+public:
+
+    /// Constructor. Initializes visitor.
+    FWATOMCONVERSION_API AtomToDataMappingVisitor(
+            SPTR(::fwData::Object) dataObj,
+            SPTR(::fwAtoms::Object) atomObj,
+            AtomVisitor::DataCacheType & cache,
+            const AtomVisitor::IReadPolicy &uuidPolicy
+            );
+
+    /// Destructor. Does nothing.
+    FWATOMCONVERSION_API virtual ~AtomToDataMappingVisitor();
+
+    /// Visits data object simple property and fill it with associated atom attribute.
+    FWATOMCONVERSION_API void visit(const camp::SimpleProperty& property);
+
+    /// Visits data object enum property and fill it with associated atom attribute.
+    FWATOMCONVERSION_API void visit(const camp::EnumProperty& property);
+
+    /**
+     * @brief Visits data object user property and fill it with associated atom attribute.
+     * Manages null fwAtoms::Base::sptr by inserting a null fwData::Object::sptr.
+     */
+    FWATOMCONVERSION_API void visit(const camp::UserProperty& property);
+
+    /**
+     * @brief Visits data object array property and fill it with associated atom attribute.
+     * Manages null fwAtoms::Base::sptr by inserting a null fwData::Object::sptr.
+     *
+     * Only array that contains ::fwAtoms::Base::BOOLEAN, ::fwAtoms::Base::NUMERIC, ::fwAtoms::Base::STRING and
+     * ::fwAtoms::Base::OBJECT are managed.
+     */
+    FWATOMCONVERSION_API void visit(const camp::ArrayProperty& property);
+
+    /**
+     * @brief Visits data object map property and fill it with associated atom attribute.
+     * Manages null fwAtoms::Base::sptr by inserting a null fwData::Object::sptr.
+     *
+     * Only map that contains ::fwAtoms::Base::BOOLEAN, ::fwAtoms::Base::NUMERIC, ::fwAtoms::Base::STRING and
+     * ::fwAtoms::Base::OBJECT are managed.
+     */
+    FWATOMCONVERSION_API void visit(const camp::MapProperty& property);
+
+private:
+
+    /// Converted data object
+    SPTR(::fwData::Object) m_dataObj;
+
+    /// Reflection in camp world of m_dataObj
+    ::camp::UserObject m_campDataObj;
+
+    /// Atom object to convert
+    SPTR(::fwAtoms::Object) m_atomObj;
+
+    /// Cache to register the atoms already converted, used when an atom is referenced multiple times.
+    AtomVisitor::DataCacheType & m_cache;
+
+    /// Atom visitor uuids policy
+    const AtomVisitor::IReadPolicy & m_uuidPolicy;
+};
+
+} // end namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_ATOMTODATAMAPPINGVISITOR_HPP__
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomVisitor.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomVisitor.hpp
new file mode 100644
index 0000000..dfdfdbb
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/AtomVisitor.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWATOMCONVERSION_ATOMVISITOR_HPP__
+#define  __FWATOMCONVERSION_ATOMVISITOR_HPP__
+
+#include <map>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+
+/**
+ * @brief This class is used to convert a fwAtoms to a fwData.
+ * @class AtomVisitor
+ * @date 2013
+ */
+class FWATOMCONVERSION_CLASS_API AtomVisitor
+{
+
+public:
+
+    /**
+     * @brief Visitor UUID Management policies
+     * @{
+     */
+    struct IReadPolicy
+    {
+        virtual SPTR(::fwData::Object) operator() (const std::string &uuid, const std::string &classname) const = 0;
+    };
+
+    /**
+     * @brief This policy reuses the data associated with an existing uuid
+     */
+    struct ReusePolicy: IReadPolicy
+    { FWATOMCONVERSION_API virtual SPTR(::fwData::Object) operator() (const std::string &uuid, const std::string &classname) const; };
+
+    /**
+     * @brief This policy changes data's uuid if it already exists
+     */
+    struct ChangePolicy: IReadPolicy
+    { FWATOMCONVERSION_API virtual SPTR(::fwData::Object) operator() (const std::string &uuid, const std::string &classname) const; };
+
+    /**
+     * @brief This policy throws an exception if the loaded uuid is not available
+     */
+    struct StrictPolicy: IReadPolicy
+    { FWATOMCONVERSION_API virtual SPTR(::fwData::Object) operator() (const std::string &uuid, const std::string &classname) const; };
+    /** @} */
+
+
+    typedef std::map< ::fwTools::UUID::UUIDType, SPTR(::fwData::Object) > DataCacheType;
+
+    /// Constructors. Initializes parameters.
+    FWATOMCONVERSION_API AtomVisitor( const ::fwAtoms::Object::sptr &atomObj, DataCacheType & cache,
+                                      const IReadPolicy &uuidPolicy );
+
+    /// Destructor. Does nothing.
+    FWATOMCONVERSION_API virtual ~AtomVisitor();
+
+    /**
+     * @brief Visits the atom information to create the data object and store it in the cache.
+     *
+     * Creates a new ::fwData::Object from classname store in meta info CLASSNAME_METAINFO.
+     * Creates this new object with UUID store in fwAtoms::Object ID.
+     *
+     * @throw ::fwAtomConversion::exception::DataFactoryNotFound if the data class is not found in ::fwData::factory
+     * @throw ::fwAtomConversion::exception::DuplicatedDataUUID if the data uuid already exists in the system.
+     */
+    FWATOMCONVERSION_API void visit();
+
+    /// Returns the data object. Calls this method after visit().
+    FWATOMCONVERSION_API SPTR(::fwData::Object) getDataObject() const;
+
+private:
+
+    /// Creates an empty data object from the classname in atom info and store it in the cache.
+    void processMetaInfos( const ::fwAtoms::Object::MetaInfosType & metaInfos );
+
+    /// Visits data object to fill it from atom (use AtomToDataMappingVisitor).
+    void processAttributes( const ::fwAtoms::Object::AttributesType & attributes );
+
+    /// Atom object to convert
+    ::fwAtoms::Object::sptr m_atomObj;
+
+    /// Converted data object
+    SPTR(::fwData::Object) m_dataObj;
+
+    /// Cache to register the atoms already converted, used when an atom is referenced multiple times.
+    DataCacheType & m_cache;
+
+    /// Atom visitor uuids policy
+    const IReadPolicy &m_uuidPolicy;
+};
+
+} // end namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_ATOMVISITOR_HPP__
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/DataVisitor.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/DataVisitor.hpp
new file mode 100644
index 0000000..376a958
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/DataVisitor.hpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWATOMCONVERSION_DATAVISITOR_HPP__
+#define  __FWATOMCONVERSION_DATAVISITOR_HPP__
+
+#include <map>
+
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+
+/**
+ * @brief Visitor used to convert a fwData to a fwAtoms. fwData camp property
+ * names are used like key to store attributes in fwAtoms::Object
+ * @class DataVisitor
+ * @date 2013
+ * @throw ::camp::ClassNotFound if data class is not found in camp world during visit
+ */
+class FWATOMCONVERSION_CLASS_API DataVisitor : public ::camp::ExtendedClassVisitor
+{
+
+public:
+
+    typedef std::map< ::fwTools::UUID::UUIDType, SPTR(::fwAtoms::Object) > AtomCacheType;
+
+    typedef std::string ClassnameType;
+
+    /// Key of the meta info to store data object classname
+    FWATOMCONVERSION_API static const std::string CLASSNAME_METAINFO;
+    /// Key of the meta info to store data object ID
+    FWATOMCONVERSION_API static const std::string ID_METAINFO;
+
+    /**
+     * @brief Constructor. Initializes atom object and store it in the cache.
+     *
+     * Creates a new ::fwAtoms::Object. Sets : ID from dataObj UUID, meta info
+     * CLASSNAME_METAINFO from dataObj classname() and add tag information from camp data
+     */
+    FWATOMCONVERSION_API DataVisitor( SPTR(::fwData::Object) dataObj, AtomCacheType & cache );
+
+    /// Destructor. Does nothing.
+    FWATOMCONVERSION_API virtual ~DataVisitor();
+
+    /**
+     * @brief Visit simple property
+     * @todo Hack : problem with size_t conversion.
+     */
+    FWATOMCONVERSION_API void visit(const camp::SimpleProperty& property);
+
+    /// Visit enum property. Uses fwAtoms::String to store enum name (and not enum value)
+    FWATOMCONVERSION_API void visit(const camp::EnumProperty& property);
+
+    /// Visit user property. Null fwData::Object::sptr attribute is converted to null fwAtoms::Base::sptr attributes
+    FWATOMCONVERSION_API void visit(const camp::UserProperty& property);
+
+    /// Visit array property. Null fwData::Object::sptr attribute is converted to null fwAtoms::Base::sptr attributes
+    FWATOMCONVERSION_API void visit(const camp::ArrayProperty& property);
+
+    /**
+     * @brief Visit map property. Null fwData::Object::sptr attribute is converted to
+     * null fwAtoms::Base::sptr attributes
+     *
+     * Only map with key of type enum, string, real or int are managed ( real and int are
+     * converted in string ). In other cases, an assertion is raised.
+     */
+    FWATOMCONVERSION_API void visit(const camp::MapProperty& property);
+
+    /// Returns the atom object (representation of dataObj in fwAtoms) . Calls this methods after the visit.
+    FWATOMCONVERSION_API SPTR(::fwAtoms::Object) getAtomObject() const;
+
+private:
+
+    /// Reflection in camp world of m_dataObj
+    ::camp::UserObject m_campDataObj;
+
+    /// converted atom object.
+    SPTR(::fwAtoms::Object) m_atomObj;
+
+    /// cache to register already converted object. Used when a data is referenced several times.
+    AtomCacheType & m_cache;
+};
+
+} // end namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_DATAVISITOR_HPP__
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/camp/ValueMapper.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/camp/ValueMapper.hpp
new file mode 100644
index 0000000..f1d0b8e
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/camp/ValueMapper.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef __FWATOMCONVERSION_VALUEMAPPER_HPP__
+#define __FWATOMCONVERSION_VALUEMAPPER_HPP__
+#include <camp/valuemapper.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+namespace camp_ext
+{
+
+/// New value mapper to manage conversion in camp world between ::fwAtoms::Blob and a ::fwMemory::BufferObject
+template <>
+struct ValueMapper< ::fwAtoms::Blob::sptr >
+{
+    typedef ::fwAtoms::Blob::sptr  ReturnType;
+
+    static const int type = camp::userType;
+
+    static const  ::fwMemory::BufferObject::sptr to(const ReturnType& source)
+    {
+        return source->getBufferObject();
+    }
+
+    static ReturnType from(bool source)
+    {
+        CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));
+    }
+
+    static ReturnType from(long source)
+    {
+        CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));
+    }
+
+    static ReturnType from(double source)
+    {
+        CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));
+    }
+
+    static ReturnType from(const std::string& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));
+    }
+
+    static ReturnType from(const camp::EnumObject& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));
+    }
+
+    static ReturnType from(const camp::UserObject& source)
+    {
+        ::fwMemory::BufferObject::sptr tmp = source.get< ::fwMemory::BufferObject::sptr>()->getSptr();
+        return ::fwAtoms::Blob::New(tmp);
+    }
+};
+
+}
+
+
+#endif /* __FWATOMCONVERSION_VALUEMAPPER_HPP__ */
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/config.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/config.hpp
new file mode 100644
index 0000000..5bdb744
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWATOMCONVERSION_CONFIG_HPP_
+#define _FWATOMCONVERSION_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMCONVERSION_EXPORTS
+            #define FWATOMCONVERSION_API __declspec(dllexport)
+        #else
+            #define FWATOMCONVERSION_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMCONVERSION_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMCONVERSION_EXPORTS
+            #define FWATOMCONVERSION_API __attribute__ ((visibility("default")))
+            #define FWATOMCONVERSION_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMCONVERSION_API __attribute__ ((visibility("hidden")))
+            #define FWATOMCONVERSION_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMCONVERSION_API
+        #define FWATOMCONVERSION_CLASS_API
+
+    #endif
+
+#endif //FWATOMCONVERSION_API
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/convert.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/convert.hpp
new file mode 100644
index 0000000..5d5ba8e
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/convert.hpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_CONVERT_HPP__
+#define __FWATOMCONVERSION_CONVERT_HPP__
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/AtomVisitor.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+
+    /**
+     * @brief Helper to convert a ::fwData::Object to a ::fwAtoms::Object
+     *
+     * @param data data object to convert
+     * @return Converted ::fwAtoms::Object
+     *
+     * @throw ::camp::ClassNotFound if data class is not found in camp world during visit
+     * @throw ::fwAtomConversion::exception::ConversionNotManaged if data has attribute type not managed by algorithm
+     *
+     * @note All data must be camped or mapped by a specific ::fwAtomConversion::mapper::Base
+     * @note fwData camp property names are used like key to store attributes in fwAtoms::Object
+     * @note sub objects multi-referenced in the fwData structure are represented by the same fwAtoms::Object
+     * ( also multi-referenced in fwAtoms structure )
+     * @note null ::fwData::Object::sptr are kept and are converted in null ::fwAtoms::Base::sptr
+     * @note Only std::vector of type fwData::Object::sptr, enum, bool, string, int or real are managed
+     * @note Only std::map with key value : string, int or real are managed
+     * @note Only std::map with type value : fwData::Object::sptr, bool, enum, string, int or real are managed
+     */
+    FWATOMCONVERSION_API SPTR(::fwAtoms::Object) convert( const SPTR(::fwData::Object) &data );
+
+    /**
+     * @brief Converts a ::fwData::Object to a ::fwAtoms::Object.
+     * @param dataObj data to convert
+     * @param cache   cache to register already converted data, used when a data is referenced multiple times.
+     * @return Returns the converted atom.
+     * @throw ::camp::ClassNotFound if data class is not found in camp world during visit
+     */
+    FWATOMCONVERSION_API SPTR(::fwAtoms::Object) convert( const SPTR(::fwData::Object) &dataObj,
+                                                          DataVisitor::AtomCacheType & cache );
+
+    /**
+     * @brief Helper to convert a ::fwAtoms::Object to a ::fwData::Object
+     *
+     * @param atom atom to convert
+     * @param uuidPolicy AtomVisitor policy
+     * @return Converted ::fwData::Object
+     *
+     * @throw ::camp::ClassNotFound if data class is not found in camp world during visit
+     * @throw ::fwAtomConversion::exception::DataFactoryNotFound if the data class is not found in ::fwData::factory
+     * @throw ::fwAtomConversion::exception::DuplicatedDataUUID if the data uuid already exists in the system.
+     * @throw ::fwAtomConversion::exception::ConversionNotManaged if atom is not data compliant
+     *
+     * @note see notes of convert(::fwData::Object::sptr data) method
+     */
+    FWATOMCONVERSION_API SPTR(::fwData::Object) convert(
+                                        const SPTR(::fwAtoms::Object) &atom,
+                                        const AtomVisitor::IReadPolicy &uuidPolicy = AtomVisitor::ChangePolicy()
+                                        );
+
+    /**
+     * @brief Converts a ::fwAtoms::Object to a ::fwData::Object
+     *
+     * @param atomObj atom to convert
+     * @param cache  cache to register the atoms already converted, used when an atom is referenced multiple times
+     * @param uuidPolicy AtomVisitor policy
+     * @return Converted ::fwData::Object.
+     *
+     * @throw ::fwAtomConversion::exception::DataFactoryNotFound if the data class is not found in ::fwData::factory
+     * @throw ::fwAtomConversion::exception::DuplicatedDataUUID if the data uuid already exists in the system.
+     */
+    FWATOMCONVERSION_API SPTR(::fwData::Object) convert( const SPTR(::fwAtoms::Object) &atomObj,
+                                                         AtomVisitor::DataCacheType & cache,
+                                                         const AtomVisitor::IReadPolicy &uuidPolicy );
+
+} // end namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_CONVERT_HPP__
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ClassnameMismatch.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ClassnameMismatch.hpp
new file mode 100644
index 0000000..f4a7959
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ClassnameMismatch.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_CLASSNAMEMISMATCH_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_CLASSNAMEMISMATCH_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+namespace exception
+{
+
+/// Throw this exception when a new data is created with a specific uuid, but this data already exists in system
+struct FWATOMCONVERSION_CLASS_API ClassnameMismatch : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API ClassnameMismatch( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_EXCEPTION_CLASSNAMEMISMATCH_HPP__
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ConversionNotManaged.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ConversionNotManaged.hpp
new file mode 100644
index 0000000..0eaedd4
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ConversionNotManaged.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_CONVERSIONNOTMANAGED_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_CONVERSIONNOTMANAGED_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+namespace exception
+{
+
+/// Throw this exception when a conversion between data and atom is not managed (error message explains the reasons)
+struct FWATOMCONVERSION_CLASS_API ConversionNotManaged : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API ConversionNotManaged( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_EXCEPTION_CONVERSIONNOTMANAGED_HPP__
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DataFactoryNotFound.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DataFactoryNotFound.hpp
new file mode 100644
index 0000000..6a3adf1
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DataFactoryNotFound.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_DATAFACTORYNOTFOUND_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_DATAFACTORYNOTFOUND_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+namespace exception
+{
+
+/// Throw this exception when an object classname is not found exception in ::fwData::factory.
+struct FWATOMCONVERSION_CLASS_API DataFactoryNotFound : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API DataFactoryNotFound( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_EXCEPTION_DATAFACTORYNOTFOUND_HPP__
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DuplicatedDataUUID.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DuplicatedDataUUID.hpp
new file mode 100644
index 0000000..c556208
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/DuplicatedDataUUID.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_DUPLICATEDDATAUUID_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_DUPLICATEDDATAUUID_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+namespace exception
+{
+
+/// Throw this exception when a new data is created with a specific uuid, but this data already exists in system
+struct FWATOMCONVERSION_CLASS_API DuplicatedDataUUID : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API DuplicatedDataUUID( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwAtomConversion
+
+#endif // __FWATOMCONVERSION_EXCEPTION_DUPLICATEDDATAUUID_HPP__
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/NullPointer.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/NullPointer.hpp
new file mode 100644
index 0000000..4e68cb4
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/NullPointer.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_NULLPOINTER_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_NULLPOINTER_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+
+namespace exception
+{
+
+/// Null pointer exception.
+struct NullPointer : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API NullPointer ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwAtomConversion
+
+#endif /* __FWATOMCONVERSION_EXCEPTION_NULLPOINTER_HPP__ */
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ObjectNotFound.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ObjectNotFound.hpp
new file mode 100644
index 0000000..499e02c
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/exception/ObjectNotFound.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_EXCEPTION_OBJECTNOTFOUND_HPP__
+#define __FWATOMCONVERSION_EXCEPTION_OBJECTNOTFOUND_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+
+namespace exception
+{
+
+/// Object not found exception.
+struct ObjectNotFound : ::fwCore::Exception
+{
+    FWATOMCONVERSION_API ObjectNotFound ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwAtomConversion
+
+#endif /* __FWATOMCONVERSION_EXCEPTION_OBJECTNOTFOUND_HPP__ */
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Base.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Base.hpp
new file mode 100644
index 0000000..d051ef8
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Base.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_MAPPER_BASE_HPP__
+#define __FWATOMCONVERSION_MAPPER_BASE_HPP__
+
+#include <string>
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/mapper/factory/new.hpp"
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/AtomVisitor.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+
+/// Base class of custom mapper between fwData and fwAtoms
+class FWATOMCONVERSION_CLASS_API Base
+{
+public:
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwAtomConversion::mapper::registry::get()->addFactory(
+                    functorKey,
+                    &::fwAtomConversion::mapper::factory::New<T>
+                    );
+        }
+    };
+
+    virtual ~Base(){};
+
+    /**
+     * @brief Convert a ::fwData::Object to a ::fwAtoms::Object.
+     * @param object data to convert
+     * @param cache  cache to register the data already converted, used when a data is referenced multiple times.
+     */
+    FWATOMCONVERSION_API virtual SPTR(::fwAtoms::Object) convert(SPTR(::fwData::Object) object,
+                                                                 DataVisitor::AtomCacheType & cache) = 0;
+
+    /**
+     * @brief Convert a ::fwAtoms::Object to a ::fwData::Object.
+     * @param atom atom to convert
+     * @param cache  cache to register the atoms already converted, used when an atom is referenced multiple times.
+     * @param uuidPolicy AtomVisitor's policy
+     */
+    FWATOMCONVERSION_API virtual SPTR(::fwData::Object) convert(SPTR(::fwAtoms::Object) atom,
+                                                                AtomVisitor::DataCacheType & cache,
+                                                                const AtomVisitor::IReadPolicy &uuidPolicy
+                                                                ) = 0;
+
+};
+
+}
+}
+
+#endif /* __FWATOMCONVERSION_MAPPER_BASE_HPP__ */
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Graph.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Graph.hpp
new file mode 100644
index 0000000..f4cb8dd
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/Graph.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_MAPPER_GRAPH_HPP__
+#define __FWATOMCONVERSION_MAPPER_GRAPH_HPP__
+
+
+#include "fwAtomConversion/AtomVisitor.hpp"
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/mapper/Base.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+
+/**
+ * @brief Specific mapper used to convert a ::fwData::Graph.
+ * @class Graph
+ * @date 2012-2013
+ *
+ * The attribute ::fwData::Graph::m_connections ( of type ::fwData::Graph::ConnectionContainer ) is
+ * represented in fwAtoms world like a fwAtoms::Sequence that contains fwAtoms::Object with three
+ * attributes "edge", "source" and "destination".
+ */
+class FWATOMCONVERSION_CLASS_API Graph : public Base
+{
+public:
+
+    /**
+     * @brief Convert a ::fwData::Object to a ::fwAtoms::Object.
+     * @param object data to convert. It must be a ::fwData::Graph.
+     * @param cache  cache to register the data already converted, used when a data is referenced multiple times.
+     */
+    FWATOMCONVERSION_API virtual SPTR(::fwAtoms::Object) convert ( SPTR(::fwData::Object) object,
+                                                                   DataVisitor::AtomCacheType & cache );
+
+    /**
+     * @brief Convert a ::fwAtoms::Object to a ::fwData::Object (which represent a ::fwData::Graph).
+     * @param atom atom to convert
+     * @param cache  cache to register the atoms already converted, used when an atom is referenced multiple times.
+     * @param uuidPolicy AtomVisitor policy
+     */
+    FWATOMCONVERSION_API virtual SPTR(::fwData::Object) convert ( SPTR(::fwAtoms::Object) atom,
+                                                                  AtomVisitor::DataCacheType & cache,
+                                                                  const AtomVisitor::IReadPolicy &uuidPolicy
+                                                                  );
+
+};
+
+}
+}
+
+#endif /*  __FWATOMCONVERSION_MAPPER_GRAPH_HPP__*/
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/factory/new.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/factory/new.hpp
new file mode 100644
index 0000000..5b8a1fe
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/factory/new.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_MAPPER_FACTORY_NEW_HPP__
+#define __FWATOMCONVERSION_MAPPER_FACTORY_NEW_HPP__
+
+#include <string>
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/mapper/registry/detail.hpp"
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+
+class Mapper;
+
+namespace factory
+{
+
+template<class CLASSNAME > SPTR( CLASSNAME ) New();
+
+FWATOMCONVERSION_API SPTR(::fwAtomConversion::mapper::Base) New(
+        const ::fwAtomConversion::mapper::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME ) New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >();
+    return obj;
+}
+
+} // namespace mapper
+} // namespace factory
+} // namespace fwAtomConversion
+
+#endif /* __FWATOMCONVERSION_MAPPER_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/detail.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/detail.hpp
new file mode 100644
index 0000000..c38fcff
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/detail.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_MAPPER_REGISTRY_DETAIL_HPP__
+#define __FWATOMCONVERSION_MAPPER_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwAtomConversion/config.hpp"
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+
+class Base;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwAtomConversion::mapper::Base)() , KeyType > Type;
+
+FWATOMCONVERSION_API SPTR(Type) get();
+
+} // namespace mapper
+} // namespace registry
+} // namespace fwAtomConversion
+
+#endif /* __FWATOMCONVERSION_MAPPER_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/macros.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/macros.hpp
new file mode 100644
index 0000000..fbab716
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/mapper/registry/macros.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_MAPPER_REGISTRY_MACRO_HPP__
+#define __FWATOMCONVERSION_MAPPER_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwAtomConversion/mapper/Base.hpp"
+#include "fwAtomConversion/mapper/registry/detail.hpp"
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+namespace registry
+{
+
+#define fwAtomConversionRegisterMacro( classname, functorKey )         \
+    static ::fwAtomConversion::mapper::Base::Registrar< classname >  \
+    BOOST_PP_CAT( s__factory__record__, __LINE__) ( BOOST_PP_STRINGIZE(functorKey) );
+
+} // end namespace registry
+} // end namespace mapper
+} // end namespace fwAtomConversion
+
+#endif /*__FWATOMCONVERSION_MAPPER_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwAtomConversion/include/fwAtomConversion/namespace.hpp b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/namespace.hpp
new file mode 100644
index 0000000..fbe6b0c
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/include/fwAtomConversion/namespace.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef __FWATOMCONVERSION_NAMESPACE_HPP__
+#define __FWATOMCONVERSION_NAMESPACE_HPP__
+
+/**
+ * @namespace fwAtomConversion
+ * @brief This namespace contains the necessary class for fwData <-> fwAtoms conversion.
+ * @date 2012- 2013
+ */
+namespace fwAtomConversion
+{
+
+/**
+ * @brief This namespace contains the exception raised by fwData <-> fwAtoms conversion
+ */
+namespace exception
+{
+} // namespace exception
+
+/**
+ * @brief This namespace contains the specific mappers used to convert few data
+ */
+namespace mapper
+{
+/**
+ * @brief Contains fwAtomConversion::mapper::factory utilities
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+/**
+ * @brief Contains fwAtomConversion::mapper::registry details
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace mapper
+
+}  // namespace fwAtomConversion
+
+#endif /* __FWATOMCONVERSION_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomToDataMappingVisitor.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomToDataMappingVisitor.cpp
new file mode 100644
index 0000000..cf7cade
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomToDataMappingVisitor.cpp
@@ -0,0 +1,441 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwCamp/factory/new.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include "fwAtomConversion/camp/ValueMapper.hpp"
+
+#include "fwAtomConversion/AtomToDataMappingVisitor.hpp"
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/mapper/Base.hpp"
+#include "fwAtomConversion/camp/ValueMapper.hpp"
+#include "fwAtomConversion/convert.hpp"
+#include "fwAtomConversion/exception/ConversionNotManaged.hpp"
+
+namespace fwAtomConversion
+{
+
+//-----------------------------------------------------------------------------
+
+class NumericSimplePropertyVisitor : public boost::static_visitor<void>
+{
+public:
+
+    ::fwAtoms::Numeric::sptr m_typedAtom;
+    ::camp::UserObject & m_campDataObj;
+    const camp::SimpleProperty& m_property;
+
+    NumericSimplePropertyVisitor( const ::fwAtoms::Numeric::sptr & typedAtom,
+                                  ::camp::UserObject & campDataObj,
+                                  const camp::SimpleProperty& property ) :
+        m_typedAtom(typedAtom), m_campDataObj(campDataObj), m_property(property) {}
+
+    void operator()( ::boost::blank & ) const
+    {
+        m_property.set( m_campDataObj, m_typedAtom->getString() );
+    }
+
+    void operator()( const ::boost::blank & ) const
+    {
+        m_property.set( m_campDataObj, m_typedAtom->getString() );
+    }
+
+    template <typename U>
+    void operator()( U & value ) const
+    {
+        m_property.set( m_campDataObj, value );
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+class NumericArrayPropertyVisitor : public boost::static_visitor<void>
+{
+public:
+
+    ::fwAtoms::Numeric::sptr m_typedAtom;
+    ::camp::UserObject & m_campDataObj;
+    const camp::ArrayProperty& m_property;
+    unsigned int m_index;
+
+    NumericArrayPropertyVisitor( const ::fwAtoms::Numeric::sptr & typedAtom,
+                                 ::camp::UserObject & campDataObj,
+                                 const camp::ArrayProperty& property,
+                                 unsigned int index ) :
+                 m_typedAtom(typedAtom), m_campDataObj(campDataObj), m_property(property), m_index(index) {}
+
+    void operator()( ::boost::blank & ) const
+    {
+        if( m_property.dynamic() )
+        {
+            m_property.insert( m_campDataObj, m_index, m_typedAtom->getString() );
+        }
+        else
+        {
+            m_property.set( m_campDataObj, m_index, m_typedAtom->getString() );
+        }
+    }
+
+    void operator()( const ::boost::blank & ) const
+    {
+        if( m_property.dynamic() )
+        {
+            m_property.insert( m_campDataObj, m_index, m_typedAtom->getString() );
+        }
+        else
+        {
+            m_property.set( m_campDataObj, m_index, m_typedAtom->getString() );
+        }
+    }
+
+    template <typename U>
+    void operator()( U & value ) const
+    {
+        if( m_property.dynamic() )
+        {
+            m_property.insert( m_campDataObj, m_index, value );
+        }
+        else
+        {
+            m_property.set( m_campDataObj, m_index, value );
+        }
+    }
+};
+
+//-----------------------------------------------------------------------------
+class NumericMapPropertyVisitor : public boost::static_visitor<void>
+{
+public:
+
+    ::fwAtoms::Numeric::sptr m_typedAtom;
+    ::camp::UserObject & m_campDataObj;
+    const camp::MapProperty& m_property;
+    std::string m_key;
+
+    NumericMapPropertyVisitor( const ::fwAtoms::Numeric::sptr & typedAtom,
+                               ::camp::UserObject & campDataObj,
+                               const camp::MapProperty& property,
+                               const std::string & key ) :
+        m_typedAtom(typedAtom), m_campDataObj(campDataObj), m_property(property), m_key(key) {}
+
+    void operator()( ::boost::blank & ) const
+    {
+        m_property.set( m_campDataObj, m_key, m_typedAtom->getString() );
+    }
+
+    void operator()( const ::boost::blank & ) const
+    {
+        m_property.set( m_campDataObj, m_key, m_typedAtom->getString() );
+    }
+
+    template <typename U>
+    void operator()( U & value ) const
+    {
+        m_property.set( m_campDataObj, m_key, value );
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+AtomToDataMappingVisitor::AtomToDataMappingVisitor(
+        ::fwData::Object::sptr dataObj,
+         ::fwAtoms::Object::sptr atomObj,
+          AtomVisitor::DataCacheType & cache,
+          const AtomVisitor::IReadPolicy &uuidPolicy)
+ : m_dataObj(dataObj),
+   m_campDataObj( m_dataObj.get() ),
+   m_atomObj(atomObj),
+   m_cache(cache),
+   m_uuidPolicy(uuidPolicy)
+{}
+
+
+AtomToDataMappingVisitor::~AtomToDataMappingVisitor(){}
+
+
+void AtomToDataMappingVisitor::visit(const camp::SimpleProperty& property)
+{
+    const std::string& name ( property.name() );
+    ::fwAtoms::Base::sptr atom = m_atomObj->getAttribute( name );
+
+    std::stringstream msg;
+    msg << "Atom attribute is not well formed. Attribute '" << name << "' missing for data conversion";
+    FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( msg.str() ), ! atom );
+
+    switch( atom->type() )
+    {
+    case ::fwAtoms::Base::NUMERIC :
+    {
+        ::fwAtoms::Numeric::sptr typedAtom = ::fwAtoms::Numeric::dynamicCast( atom );
+        ::boost::apply_visitor( NumericSimplePropertyVisitor(typedAtom,m_campDataObj,property),
+                                typedAtom->getVariant() );
+        break;
+    }
+    default:
+    {
+        property.set( m_campDataObj, atom->getString() );
+        break;
+    }
+    }
+
+}
+
+
+void AtomToDataMappingVisitor::visit(const camp::EnumProperty& property)
+{
+    const std::string& name ( property.name() );
+    ::fwAtoms::Base::sptr atom = m_atomObj->getAttribute( name );
+
+    std::stringstream msg;
+    msg << "Atom attribute is not well formed. Attribute '" << name << "' missing for data conversion";
+    FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( msg.str() ), ! atom );
+
+    property.set( m_campDataObj, atom->getString() );
+}
+
+
+void AtomToDataMappingVisitor::visit(const camp::UserProperty& property)
+{
+    const std::string& name ( property.name() );
+    ::fwAtoms::Base::sptr atom = m_atomObj->getAttribute( name );
+    if ( atom ) // attribute not exist if was a null object sptr
+    {
+        switch( atom->type() )
+        {
+        case ::fwAtoms::Base::BLOB :
+        {
+            ::fwAtoms::Blob::sptr blobAtom = ::fwAtoms::Blob::dynamicCast(atom);
+            ::fwMemory::BufferObject::sptr buffer;
+            buffer = ::camp_ext::ValueMapper< ::fwAtoms::Blob::sptr >::to(blobAtom);
+            FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged(
+                    "A blob cannot contain a null buffer pointer"),
+                    ! buffer );
+            property.set( m_campDataObj, ::camp::UserObject(buffer) );
+            break;
+        }
+        case ::fwAtoms::Base::OBJECT :
+        {
+            ::fwAtoms::Object::sptr objectAtom = ::fwAtoms::Object::dynamicCast(atom);
+            ::fwData::Object::sptr objectData = ::fwAtomConversion::convert( objectAtom, m_cache, m_uuidPolicy );
+            property.set( m_campDataObj, objectData );
+            break;
+        }
+        default :
+        {
+            std::stringstream msg;
+            msg << "Attribute of type '";
+            switch( atom->type() )
+            {
+            case ::fwAtoms::Base::BOOLEAN :
+                msg << "BOOLEAN";
+                break;
+            case ::fwAtoms::Base::STRING :
+                msg << "STRING";
+                break;
+            case ::fwAtoms::Base::NUMERIC :
+                msg << "NUMERIC";
+                break;
+            case ::fwAtoms::Base::MAP :
+                msg << "MAP";
+                break;
+            case ::fwAtoms::Base::SEQUENCE :
+                msg << "SEQUENCE";
+                break;
+            default:
+                break;
+            }
+            msg <<"', are not supported in the data conversion process.";
+            FW_RAISE_EXCEPTION( exception::ConversionNotManaged(msg.str()) );
+            break;
+        }
+        }
+    }
+}
+
+
+void AtomToDataMappingVisitor::visit(const camp::ArrayProperty& property)
+{
+    const std::string& name ( property.name() );
+    ::fwAtoms::Base::sptr atom = m_atomObj->getAttribute( name );
+
+    std::stringstream msg;
+    msg << "Atom attribute is not well formed. Attribute '" << name << "' missing for data conversion";
+    FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( msg.str() ), ! atom );
+
+    ::fwAtoms::Sequence::sptr seqAtom = ::fwAtoms::Sequence::dynamicCast(atom);
+    unsigned int index = 0;
+    BOOST_FOREACH( ::fwAtoms::Base::sptr elemAtom, seqAtom->getValue() )
+    {
+        if (!elemAtom)
+        {
+            FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( "Not supported null element in Atom sequence." ),
+                                   property.elementType() != ::camp::userType );
+
+            ::fwData::Object::sptr objectData;
+            if( property.dynamic() )
+            {
+                property.insert( m_campDataObj, index, objectData );
+            }
+            else
+            {
+                property.set( m_campDataObj, index, objectData );
+            }
+        }
+        else
+        {
+            switch( elemAtom->type() )
+            {
+            case ::fwAtoms::Base::BOOLEAN :
+            case ::fwAtoms::Base::STRING :
+            {
+                std::string value = elemAtom->getString();
+
+                if( property.dynamic() )
+                {
+                    property.insert( m_campDataObj, index, value );
+                }
+                else
+                {
+                    property.set( m_campDataObj, index, value );
+                }
+                break;
+            }
+            case ::fwAtoms::Base::NUMERIC :
+            {
+                ::fwAtoms::Numeric::sptr typedAtom = ::fwAtoms::Numeric::dynamicCast( elemAtom );
+                ::boost::apply_visitor( NumericArrayPropertyVisitor(typedAtom,m_campDataObj,property,index),
+                                        typedAtom->getVariant() );
+                break;
+            }
+
+            case ::fwAtoms::Base::OBJECT :
+            {
+                ::fwAtoms::Object::sptr objectAtom = ::fwAtoms::Object::dynamicCast(elemAtom);
+                ::fwData::Object::sptr objectData = ::fwAtomConversion::convert( objectAtom, m_cache, m_uuidPolicy);
+
+                if( property.dynamic() )
+                {
+                    property.insert( m_campDataObj, index, objectData );
+                }
+                else
+                {
+                    property.set( m_campDataObj, index, objectData );
+                }
+                break;
+            }
+            default :
+            {
+                std::stringstream msg;
+                msg << "fwAtoms::Sequence elements of type '";
+                switch( elemAtom->type() )
+                {
+                case ::fwAtoms::Base::BLOB :
+                    msg << "BLOB";
+                    break;
+                case ::fwAtoms::Base::MAP :
+                    msg << "MAP";
+                    break;
+                case ::fwAtoms::Base::SEQUENCE :
+                    msg << "SEQUENCE";
+                    break;
+                default:
+                    break;
+                }
+                msg <<"', are not supported in the data conversion process.";
+                FW_RAISE_EXCEPTION( exception::ConversionNotManaged(msg.str()) );
+                break;
+            }
+            }
+        }
+        ++index;
+    }
+}
+
+
+void AtomToDataMappingVisitor::visit(const camp::MapProperty& property)
+{
+    const std::string& name ( property.name() );
+    ::fwAtoms::Base::sptr atom = m_atomObj->getAttribute( name );
+
+    std::stringstream msg;
+    msg << "Atom attribute is not well formed. Attribute '" << name << "' missing for data conversion";
+    FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( msg.str() ), ! atom );
+
+    ::fwAtoms::Map::sptr mapAtom = ::fwAtoms::Map::dynamicCast(atom);
+
+    BOOST_FOREACH( ::fwAtoms::Map::ValueType elemAtom, mapAtom->getValue() )
+    {
+        if (!elemAtom.second)
+        {
+            FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged( "Not supported null element in Atom map." ),
+                                   property.elementType() != ::camp::userType );
+
+            ::fwData::Object::sptr objectData;
+            property.set( m_campDataObj, elemAtom.first, objectData );
+        }
+        else
+        {
+            switch( elemAtom.second->type() )
+            {
+            case ::fwAtoms::Base::BOOLEAN :
+            case ::fwAtoms::Base::STRING :
+            {
+                std::string value = elemAtom.second->getString();
+                property.set( m_campDataObj, elemAtom.first, value );
+                break;
+            }
+            case ::fwAtoms::Base::NUMERIC :
+            {
+                ::fwAtoms::Numeric::sptr typedAtom = ::fwAtoms::Numeric::dynamicCast( elemAtom.second );
+                ::boost::apply_visitor( NumericMapPropertyVisitor(typedAtom,m_campDataObj,property,elemAtom.first),
+                                        typedAtom->getVariant() );
+                break;
+            }
+            case ::fwAtoms::Base::OBJECT :
+            {
+                ::fwAtoms::Object::sptr objectAtom = ::fwAtoms::Object::dynamicCast(elemAtom.second);
+                ::fwData::Object::sptr objectData = ::fwAtomConversion::convert( objectAtom, m_cache, m_uuidPolicy);
+                property.set( m_campDataObj, elemAtom.first, objectData );
+                break;
+            }
+            default :
+            {
+                std::stringstream msg;
+                msg << "fwAtoms::Map value elements of type '";
+                switch( elemAtom.second->type() )
+                {
+                case ::fwAtoms::Base::BLOB :
+                    msg << "BLOB";
+                    break;
+                case ::fwAtoms::Base::MAP :
+                    msg << "MAP";
+                    break;
+                case ::fwAtoms::Base::SEQUENCE :
+                    msg << "SEQUENCE";
+                    break;
+                default:
+                    break;
+                }
+                msg <<"', are not supported in the data conversion process.";
+                FW_RAISE_EXCEPTION( exception::ConversionNotManaged(msg.str()) );
+                break;
+            }
+            }
+        }
+    }
+}
+
+} // end namespace fwAtomConversion
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomVisitor.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomVisitor.cpp
new file mode 100644
index 0000000..4358dd4
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/AtomVisitor.cpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+
+#include "fwAtomConversion/AtomVisitor.hpp"
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/AtomToDataMappingVisitor.hpp"
+#include "fwAtomConversion/exception/DataFactoryNotFound.hpp"
+#include "fwAtomConversion/exception/DuplicatedDataUUID.hpp"
+#include "fwAtomConversion/exception/ClassnameMismatch.hpp"
+
+namespace fwAtomConversion
+{
+
+::fwData::Object::sptr AtomVisitor::ReusePolicy::operator()(const std::string &uuid, const std::string &classname) const
+{
+    ::fwData::Object::sptr obj = ::fwData::Object::dynamicCast(::fwTools::UUID::get(uuid));
+
+    FW_RAISE_EXCEPTION_IF(
+                          exception::ClassnameMismatch("Loaded object classname (" + classname
+                              + ") for UUID '" + uuid
+                              + "' does not match existing classname (" + obj->classname() + ")"  ),
+                          classname != obj->getClassname());
+
+    if (!obj)
+    {
+        ::fwData::Object::sptr obj = ::fwData::factory::New(classname);
+
+
+        FW_RAISE_EXCEPTION_IF(
+            exception::DataFactoryNotFound(
+                    std::string("Unable to build '") + classname + "': the data factory may be missing.")
+                , ! obj
+                );
+        bool uuidIsSet = ::fwTools::UUID::set(obj, uuid);
+
+        OSLM_ASSERT( "UUID '" << uuid << "' should not exist", uuidIsSet );
+    }
+
+    return obj;
+}
+
+::fwData::Object::sptr AtomVisitor::ChangePolicy::operator()(const std::string &uuid, const std::string &classname) const
+{
+    ::fwData::Object::sptr obj = ::fwData::factory::New(classname);
+    // uuid is set only if the given uuid is available
+
+    FW_RAISE_EXCEPTION_IF(
+        exception::DataFactoryNotFound(
+                std::string("Unable to build '") + classname + "': the data factory may be missing.")
+            , ! obj
+            );
+
+    ::fwTools::UUID::set(obj, uuid);
+    return obj;
+}
+
+::fwData::Object::sptr AtomVisitor::StrictPolicy::operator()(const std::string &uuid, const std::string &classname) const
+{
+
+    ::fwData::Object::sptr obj = ::fwData::factory::New(classname);
+
+    FW_RAISE_EXCEPTION_IF(
+        exception::DataFactoryNotFound(
+                std::string("Unable to build '") + classname + "': the data factory may be missing.")
+            , ! obj
+            );
+
+    bool uuidIsSet = ::fwTools::UUID::set(obj, uuid);
+
+    FW_RAISE_EXCEPTION_IF(
+        exception::DuplicatedDataUUID(
+                std::string( "Try to create new data object '") + classname + "' with uuid '"
+                + uuid + "' but this uuid is already used."
+                ), ! uuidIsSet );
+
+    return obj;
+
+}
+
+
+
+AtomVisitor::AtomVisitor(const ::fwAtoms::Object::sptr &atomObj, DataCacheType & cache, const IReadPolicy &uuidPolicy)
+: m_atomObj ( atomObj ),
+  m_cache ( cache ),
+  m_uuidPolicy(uuidPolicy)
+{}
+
+AtomVisitor::~AtomVisitor()
+{}
+
+void AtomVisitor::visit()
+{
+    this->processMetaInfos( m_atomObj->getMetaInfos() );
+    this->processAttributes( m_atomObj->getAttributes() );
+}
+
+void AtomVisitor::processMetaInfos( const ::fwAtoms::Object::MetaInfosType & metaInfos )
+{
+    const DataVisitor::ClassnameType& classname = metaInfos.find( DataVisitor::CLASSNAME_METAINFO )->second;
+    const ::fwTools::UUID::UUIDType& uuid = metaInfos.find( DataVisitor::ID_METAINFO )->second;
+
+    m_dataObj = m_uuidPolicy(uuid, classname);
+    m_cache[uuid] = m_dataObj;
+}
+
+void AtomVisitor::processAttributes( const ::fwAtoms::Object::AttributesType & attributes )
+{
+    const camp::Class& metaclass = ::camp::classByName( m_dataObj->getClassname() );
+    ::fwAtomConversion::AtomToDataMappingVisitor visitor ( m_dataObj, m_atomObj, m_cache, m_uuidPolicy );
+    metaclass.visit(visitor);
+}
+
+::fwData::Object::sptr AtomVisitor::getDataObject() const
+{
+    return m_dataObj;
+}
+
+} // end namespace fwAtomConversion
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/DataVisitor.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/DataVisitor.cpp
new file mode 100644
index 0000000..6a623a1
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/DataVisitor.cpp
@@ -0,0 +1,257 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <camp/class.hpp>
+
+#include <fwCamp/factory/new.hpp>
+#include <fwCamp/Mapper/ValueMapper.hpp>
+
+#include <fwData/camp/mapper.hpp>
+#include <fwData/Array.hpp>
+
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Base.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwDataCamp/Version.hpp>
+
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/mapper/factory/new.hpp"
+#include "fwAtomConversion/convert.hpp"
+#include "fwAtomConversion/exception/ConversionNotManaged.hpp"
+
+
+namespace fwAtomConversion
+{
+
+static int dataCampVersion = ::fwDataCamp::Version::s_CURRENT_VERSION; // Hack to force link with fwDataCamp
+
+const std::string DataVisitor::CLASSNAME_METAINFO = "CLASSNAME_METAINFO";
+const std::string DataVisitor::ID_METAINFO        = "ID_METAINFO";
+
+//-----------------------------------------------------------------------------
+
+struct DataConversionValueVisitor : public ::camp::ValueVisitor< ::fwAtoms::Base::sptr >
+{
+    DataVisitor::AtomCacheType & m_cache;
+
+    DataConversionValueVisitor( DataVisitor::AtomCacheType & cache ) : m_cache(cache)
+    {}
+
+    ::fwAtoms::Base::sptr operator()(camp::NoType value)
+    {
+        FW_RAISE_EXCEPTION( exception::ConversionNotManaged(
+                "Enter in void GetCampValueVisitor()(camp::NoType value) : case not managed" ) );
+        ::fwAtoms::Base::sptr val;
+        return val;
+    }
+
+    ::fwAtoms::Base::sptr operator()(bool value)
+    {
+        return ::fwAtoms::Boolean::New( value );
+    }
+
+    ::fwAtoms::Base::sptr operator()(long value)
+    {
+        return ::fwAtoms::Numeric::New( value );
+    }
+
+    ::fwAtoms::Base::sptr operator()(double value)
+    {
+        return ::fwAtoms::Numeric::New( value );
+    }
+
+    ::fwAtoms::Base::sptr operator()(std::string value)
+    {
+        return ::fwAtoms::String::New( value );
+    }
+
+    ::fwAtoms::Base::sptr operator()(const camp::EnumObject& value)
+    {
+        return ::fwAtoms::String::New( value.name() );
+    }
+
+    ::fwAtoms::Base::sptr operator()(const camp::UserObject& value)
+    {
+        ::fwAtoms::Base::sptr baseObj;
+
+        if ( value.pointer() )
+        {
+            DataVisitor::ClassnameType classname = value.call("classname").to<std::string>();
+
+            if( classname == "::fwMemory::BufferObject" )
+            {
+                ::fwMemory::BufferObject * ptr = value.get< ::fwMemory::BufferObject * >();
+                baseObj = ::fwAtoms::Blob::New( ptr->getSptr() );
+            }
+            else
+            {
+                // get fwData object
+                ::fwData::Object * ptr = value.get< ::fwData::Object * >();
+                ::fwData::Object::sptr dataObj = ptr->getSptr();
+
+                baseObj = ::fwAtomConversion::convert( dataObj, m_cache );
+            }
+        }
+
+        return baseObj;
+    }
+ };
+
+//-----------------------------------------------------------------------------
+
+DataVisitor::DataVisitor( ::fwData::Object::sptr dataObj, AtomCacheType & cache )
+: m_campDataObj( dataObj.get() ), m_cache( cache )
+{
+
+    // Create atom object
+    m_atomObj = ::fwAtoms::Object::New();
+    ClassnameType classname = m_campDataObj.call("classname").to<std::string>();
+    m_atomObj->setMetaInfo( DataVisitor::CLASSNAME_METAINFO, classname );
+    ::fwTools::UUID::UUIDType uuid = ::fwTools::UUID::get(dataObj);
+    m_atomObj->setMetaInfo( DataVisitor::ID_METAINFO, uuid );
+    m_cache[uuid] = m_atomObj;
+
+    // Fill atom object with tag
+    const camp::Class& metaclass = ::camp::classByName(classname);
+    std::size_t tagCount = metaclass.tagCount();
+    for ( std::size_t i = 0; i < tagCount; ++i )
+    {
+        const ::camp::Value & tag = metaclass.tagId(i);
+        const ::camp::Value & val = metaclass.tag(tag);
+        m_atomObj->setMetaInfo( tag.to< std::string >() , val.to< std::string >() );
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+DataVisitor::~DataVisitor()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DataVisitor::visit(const camp::SimpleProperty& property)
+{
+    const std::string& name ( property.name() );
+    const ::camp::Value& val ( property.get( m_campDataObj ) );
+
+    /// ACH Hack !
+    if( val.type() != camp::intType )
+    {
+        DataConversionValueVisitor visitor(m_cache);
+        ::fwAtoms::Base::sptr atom = val.visit( visitor );
+        m_atomObj->setAttribute( name, atom );
+    }
+    else
+    {
+        ::fwAtoms::Base::sptr atom = ::fwAtoms::Numeric::New( val.to<long>() );
+        m_atomObj->setAttribute( name, atom );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void DataVisitor::visit(const camp::EnumProperty& property)
+{
+    const std::string& name ( property.name() );
+    const ::camp::Value& val ( property.get( m_campDataObj ) );
+
+    DataConversionValueVisitor visitor(m_cache);
+    ::fwAtoms::Base::sptr atom = val.visit( visitor );
+    m_atomObj->setAttribute( name, atom );
+}
+
+//-----------------------------------------------------------------------------
+
+void DataVisitor::visit(const camp::MapProperty& property)
+{
+    const std::string name ( property.name() );
+    ::fwAtoms::Map::sptr atom = ::fwAtoms::Map::New();
+
+    std::pair< ::camp::Value, ::camp::Value > value;
+    ::fwAtoms::Base::sptr valAtom;
+    ::camp::Value first;
+    ::camp::Value second;
+
+    const size_t size = property.getSize( m_campDataObj );
+    for (size_t index = 0; index < size; ++index)
+    {
+        value = property.getElement(m_campDataObj, index);
+
+        first = value.first;
+        second = value.second;
+
+        DataConversionValueVisitor valVisitor(m_cache);
+        valAtom = second.visit( valVisitor );
+
+        FW_RAISE_EXCEPTION_IF(
+                exception::ConversionNotManaged("Not managed type for map key (only support string, int and real)"),
+                first.type() != ::camp::stringType &&
+                first.type() != ::camp::intType &&
+                first.type() != ::camp::realType );
+        atom->insert( first.to< std::string >(), valAtom );
+    }
+
+    m_atomObj->setAttribute( name, atom );
+}
+
+//-----------------------------------------------------------------------------
+
+void DataVisitor::visit(const camp::ArrayProperty& property)
+{
+    const std::string name ( property.name() );
+    ::fwAtoms::Sequence::sptr atom = ::fwAtoms::Sequence::New();
+
+    ::camp::Value val;
+    ::fwAtoms::Base::sptr valAtom;
+    const size_t size = property.size( m_campDataObj );
+    for (size_t index = 0; index < size; ++index)
+    {
+        val = property.get( m_campDataObj, index );
+
+        DataConversionValueVisitor visitor(m_cache);
+        valAtom = val.visit( visitor );
+        atom->push_back( valAtom );
+    }
+
+    m_atomObj->setAttribute( name, atom );
+}
+
+//-----------------------------------------------------------------------------
+
+void DataVisitor::visit(const camp::UserProperty& property)
+{
+    const std::string& name ( property.name() );
+    const ::camp::Value& val ( property.get( m_campDataObj ) );
+
+    DataConversionValueVisitor visitor(m_cache);
+    ::fwAtoms::Base::sptr atom = val.visit( visitor );
+    m_atomObj->setAttribute( name, atom );
+
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DataVisitor::getAtomObject() const
+{
+    return this->m_atomObj;
+}
+
+} // fwAtomConversion
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/convert.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/convert.cpp
new file mode 100644
index 0000000..3d125ad
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/convert.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Object.hpp>
+
+#include <fwData/Object.hpp>
+
+#include "fwAtomConversion/convert.hpp"
+#include "fwAtomConversion/DataVisitor.hpp"
+#include "fwAtomConversion/AtomVisitor.hpp"
+#include "fwAtomConversion/mapper/Base.hpp"
+
+namespace fwAtomConversion
+{
+
+::fwAtoms::Object::sptr convert(const ::fwData::Object::sptr &data )
+{
+    DataVisitor::AtomCacheType cache;
+    return convert( data, cache );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr convert(const ::fwData::Object::sptr &dataObj, DataVisitor::AtomCacheType & cache )
+{
+    ::fwAtoms::Object::sptr atom;
+
+    DataVisitor::AtomCacheType::iterator elem = cache.find( ::fwTools::UUID::get( dataObj ) );
+
+    if ( elem == cache.end() )
+    {
+        SPTR(mapper::Base) mapper = mapper::factory::New( dataObj->getClassname() );
+        if ( mapper )
+        {
+            atom = mapper->convert( dataObj, cache );
+        }
+        else
+        {
+            const camp::Class& metaclass = ::camp::classByName( dataObj->getClassname() );
+            ::fwAtomConversion::DataVisitor visitor ( dataObj, cache );
+            metaclass.visit(visitor);
+            atom = visitor.getAtomObject();
+        }
+    }
+    else // already analysed
+    {
+        atom = elem->second;
+    }
+
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr convert( const ::fwAtoms::Object::sptr &atom,
+                                const AtomVisitor::IReadPolicy &uuidPolicy
+                                )
+{
+    AtomVisitor::DataCacheType cache;
+    return convert( atom, cache, uuidPolicy );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr convert( const ::fwAtoms::Object::sptr &atomObj, AtomVisitor::DataCacheType & cache,
+                                const AtomVisitor::IReadPolicy &uuidPolicy
+                                )
+{
+    ::fwData::Object::sptr data;
+
+    AtomVisitor::DataCacheType::iterator elem = cache.find( atomObj->getMetaInfo( DataVisitor::ID_METAINFO ) );
+
+    if ( elem == cache.end() )
+    {
+        SPTR(mapper::Base) mapper = mapper::factory::New( atomObj->getMetaInfo( DataVisitor::CLASSNAME_METAINFO ) );
+        if ( mapper )
+        {
+            data = mapper->convert( atomObj, cache, uuidPolicy );
+        }
+        else
+        {
+            ::fwAtomConversion::AtomVisitor visitor ( atomObj, cache, uuidPolicy );
+            visitor.visit();
+            data = visitor.getDataObject();
+        }
+    }
+    else // already analyzed
+    {
+        data = elem->second;
+    }
+
+    return data;
+}
+
+} /// end namespace fwAtomConversion
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/NullPointer.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/NullPointer.cpp
new file mode 100644
index 0000000..5e7f106
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/NullPointer.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/exception/NullPointer.hpp"
+
+namespace fwAtomConversion
+{
+
+namespace exception
+{
+
+NullPointer::NullPointer ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwAtomConversion
+
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/ObjectNotFound.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/ObjectNotFound.cpp
new file mode 100644
index 0000000..bf8379f
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/exception/ObjectNotFound.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwAtomConversion/config.hpp"
+#include "fwAtomConversion/exception/ObjectNotFound.hpp"
+
+namespace fwAtomConversion
+{
+
+namespace exception
+{
+
+ObjectNotFound::ObjectNotFound ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwAtomConversion
+
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/Graph.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/Graph.cpp
new file mode 100644
index 0000000..a329293
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/Graph.cpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwData/Graph.hpp>
+
+#include "fwAtomConversion/mapper/Graph.hpp"
+#include "fwAtomConversion/mapper/registry/macros.hpp"
+#include "fwAtomConversion/convert.hpp"
+#include "fwAtomConversion/exception/ConversionNotManaged.hpp"
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+
+//-----------------------------------------------------------------------------
+
+fwAtomConversionRegisterMacro( ::fwAtomConversion::mapper::Graph, ::fwData::Graph);
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Graph::convert( ::fwData::Object::sptr object,
+                                        DataVisitor::AtomCacheType & cache )
+{
+    const camp::Class& metaclass = ::camp::classByName( object->getClassname() );
+    ::fwAtomConversion::DataVisitor visitor ( object, cache );
+    metaclass.visit(visitor);
+    ::fwAtoms::Object::sptr atom = visitor.getAtomObject();
+
+    ::fwData::Graph::sptr graph = ::fwData::Graph::dynamicCast(object);
+
+    ::fwAtoms::Sequence::sptr sequence = ::fwAtoms::Sequence::New();
+
+    typedef ::fwData::Graph::ConnectionContainer GraphConnections;
+    ::fwAtoms::Object::sptr value;
+    BOOST_FOREACH( GraphConnections::value_type elem, graph->getCRefConnections() )
+    {
+        value = ::fwAtoms::Object::New();
+
+        value->setAttribute("edge", ::fwAtomConversion::convert(elem.first, cache));
+        value->setAttribute("source", ::fwAtomConversion::convert(elem.second.first, cache));
+        value->setAttribute("destination", ::fwAtomConversion::convert(elem.second.second, cache));
+
+        sequence->push_back(value);
+    }
+
+    atom->setAttribute("connections", sequence );
+
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr Graph::convert(  ::fwAtoms::Object::sptr atom,
+                                        AtomVisitor::DataCacheType & cache,
+                                        const AtomVisitor::IReadPolicy &uuidPolicy
+                                        )
+{
+    ::fwAtomConversion::AtomVisitor visitor ( atom, cache, uuidPolicy );
+    visitor.visit();
+    ::fwData::Object::sptr data = visitor.getDataObject();
+    ::fwData::Graph::sptr graph = ::fwData::Graph::dynamicCast(data);
+
+    ::fwAtoms::Sequence::sptr seqAtom = ::fwAtoms::Sequence::dynamicCast( atom->getAttribute("connections") );
+    BOOST_FOREACH( ::fwAtoms::Base::sptr elemAtom , seqAtom->getValue() )
+    {
+        FW_RAISE_EXCEPTION_IF( exception::ConversionNotManaged(
+                "sub atoms stored in fwAtom::Sequence 'connections' must be atom objects"),
+                elemAtom->type() != ::fwAtoms::Base::OBJECT );
+
+        ::fwAtoms::Object::sptr objectAtom = ::fwAtoms::Object::dynamicCast( elemAtom );
+
+        ::fwAtoms::Object::sptr edgeAtom = ::fwAtoms::Object::dynamicCast( objectAtom->getAttribute("edge") );
+        ::fwData::Edge::sptr edge = ::fwData::Edge::dynamicCast( ::fwAtomConversion::convert( edgeAtom, cache, uuidPolicy ) );
+
+        ::fwAtoms::Object::sptr srcAtom = ::fwAtoms::Object::dynamicCast( objectAtom->getAttribute("source") );
+        ::fwData::Node::sptr src = ::fwData::Node::dynamicCast( ::fwAtomConversion::convert( srcAtom, cache, uuidPolicy ) );
+
+        ::fwAtoms::Object::sptr destAtom = ::fwAtoms::Object::dynamicCast( objectAtom->getAttribute("destination") );
+        ::fwData::Node::sptr dest = ::fwData::Node::dynamicCast( ::fwAtomConversion::convert( destAtom, cache, uuidPolicy ) );
+
+        graph->addEdge( edge, src, dest );
+    }
+
+    return graph;
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace mapper
+} //namespace fwAtomConversion
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/factory/new.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/factory/new.cpp
new file mode 100644
index 0000000..2262016
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/factory/new.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomConversion/mapper/Base.hpp"
+
+#include "fwAtomConversion/mapper/factory/new.hpp"
+
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+namespace factory
+{
+
+SPTR(::fwAtomConversion::mapper::Base) New( const ::fwAtomConversion::mapper::registry::KeyType & classname )
+{
+    return ::fwAtomConversion::mapper::registry::get()->create(classname);
+}
+
+} // namespace factory
+} // namespace mapper
+} // namespace fwAtomConversion
+
+
diff --git a/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/registry/detail.cpp b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/registry/detail.cpp
new file mode 100644
index 0000000..f04a126
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/src/fwAtomConversion/mapper/registry/detail.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwAtomConversion/mapper/registry/detail.hpp"
+
+
+namespace fwAtomConversion
+{
+namespace mapper
+{
+namespace registry
+{
+
+struct FwAtomConversionRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwAtomConversionRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+} // namespace mapper
+} // namespace fwAtomConversion
+
+
diff --git a/SrcLib/core/fwAtomConversion/test/CMakeLists.txt b/SrcLib/core/fwAtomConversion/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwAtomConversion/test/Properties.cmake b/SrcLib/core/fwAtomConversion/test/Properties.cmake
new file mode 100644
index 0000000..e5f695e
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomConversionTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwDataCamp fwAtomConversion )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtomConversion/test/cppunit.options b/SrcLib/core/fwAtomConversion/test/cppunit.options
new file mode 100644
index 0000000..c2bc828
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/test/cppunit.options
@@ -0,0 +1,12 @@
+
+CLASSTEST=[
+    'ConversionTest'
+]
+
+LIB = ['fwTools_0-1',
+       'fwCore_0-1',
+       'fwTest_0-1',
+       'fwAtomConversion_0-1', 
+       'fwDataCamp_0-1'
+      ]
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwAtomConversion/test/tu/include/ConversionTest.hpp b/SrcLib/core/fwAtomConversion/test/tu/include/ConversionTest.hpp
new file mode 100644
index 0000000..1964b5f
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/test/tu/include/ConversionTest.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMCONVERSION_UT_METAHELPERTEST_HPP__
+#define __FWATOMCONVERSION_UT_METAHELPERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwAtomConversion
+{
+namespace ut
+{
+
+class ConversionTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ConversionTest );
+    CPPUNIT_TEST( dataToAtomTest );
+    CPPUNIT_TEST( materialConversionTest );
+    CPPUNIT_TEST( graphConversionTest );
+    CPPUNIT_TEST( tfConversionTest );
+    CPPUNIT_TEST( seriesDBConversionTest );
+    CPPUNIT_TEST( objectMultiReferencedTest );
+    CPPUNIT_TEST( recursiveObjectTest );
+    CPPUNIT_TEST( uuidExceptionTest );
+    CPPUNIT_TEST( uuidChangeTest );
+    CPPUNIT_TEST( uuidReuseTest );
+    CPPUNIT_TEST( dataFactoryNotFoundExceptionTest );
+    CPPUNIT_TEST( campFactoryNotFoundExceptionTest );
+    CPPUNIT_TEST( conversionNotManagedExceptionTest );
+    CPPUNIT_TEST( nullPtrManagmentTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    /// Test conversion from fwData to fwAtoms
+    void dataToAtomTest();
+
+    /// Test the conversion fwData::Material -> fwAtoms::Object -> fwData::Material
+    void materialConversionTest();
+
+    //// Test fwData::Graph conversion, UUID management, and object field conversion
+    void graphConversionTest();
+
+    //// Test fwData::TransferFunction conversion
+    void tfConversionTest();
+
+    /// Test fwMedData::SeriesDB conversion
+    void seriesDBConversionTest();
+
+    /// Test using an object multi referenced in different structures, test also fwData::Composite conversion
+    void objectMultiReferencedTest();
+
+    /// Test recursive data conversion
+    void recursiveObjectTest();
+
+
+    /// Test exception throwing if uuid already exist
+    void uuidExceptionTest();
+
+    /// Test exception throwing if uuid already exist
+    void uuidChangeTest();
+
+    /// Test exception throwing if uuid already exist
+    void uuidReuseTest();
+
+    /// Test exception throwing if during atom to data conversion a classname is not found in data factory
+    void dataFactoryNotFoundExceptionTest();
+
+    /// Test exception throwing if during data to atom conversion a classname is not found in camp factory
+    void campFactoryNotFoundExceptionTest();
+
+    /// Test exception throwing if during data/atom conversion a conversion is not managed
+    void conversionNotManagedExceptionTest();
+
+    /// Test null ptr management (null ptr attribut, null ptr in vector, null ptr in map)
+    void nullPtrManagmentTest();
+
+};
+
+
+}  // namespace ut
+}  // namespace fwAtomConversion
+
+
+
+#endif // __FWATOMCONVERSION_UT_METAHELPERTEST_HPP__
diff --git a/SrcLib/core/fwAtomConversion/test/tu/src/ConversionTest.cpp b/SrcLib/core/fwAtomConversion/test/tu/src/ConversionTest.cpp
new file mode 100644
index 0000000..50e7dc2
--- /dev/null
+++ b/SrcLib/core/fwAtomConversion/test/tu/src/ConversionTest.cpp
@@ -0,0 +1,662 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/log/SpyLogger.hpp>
+#include <fwTools/UUID.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Graph.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwCamp/macros.hpp>
+#include <fwCamp/Mapper/ValueMapper.hpp>
+#include <fwCamp/UserObject.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include <fwTest/generator/SeriesDB.hpp>
+#include <fwTest/generator/Object.hpp>
+
+#include <fwAtomConversion/convert.hpp>
+#include <fwAtomConversion/DataVisitor.hpp>
+#include <fwAtomConversion/exception/DataFactoryNotFound.hpp>
+#include <fwAtomConversion/exception/DuplicatedDataUUID.hpp>
+#include <fwAtomConversion/exception/ConversionNotManaged.hpp>
+
+#include "ConversionTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtomConversion::ut::ConversionTest );
+
+namespace fwAtomConversion
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+// Set up context before running a test.
+void ConversionTest::setUp()
+{};
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::dataToAtomTest()
+{
+    const ::fwData::Object::sptr VALUES[] = {
+            ::fwData::Integer::New(1337),
+            ::fwData::Float::New(),
+            ::fwData::String::New(),
+            ::fwData::Boolean::New(),
+            ::fwData::Vector::New(),
+            ::fwData::Color::New(1.4f, 0.9f, 1.1f, 1.67f),
+            ::fwData::Array::New(),
+            ::fwData::Image::New(),
+            ::fwData::Mesh::New(),
+            ::fwData::Material::New(),
+            ::fwData::Reconstruction::New(),
+            ::fwData::Composite::New(),
+            ::fwData::Point::New(),
+            ::fwData::PointList::New(),
+            ::fwData::TransformationMatrix3D::New(),
+            ::fwData::TransferFunction::New(),
+            ::fwData::Graph::New(),
+    };
+
+    ::fwAtoms::Object::sptr atom;
+
+    BOOST_FOREACH ( fwData::Object::sptr  object, VALUES )
+    {
+        atom = ::fwAtomConversion::convert(object);
+
+        const ::camp::Class& metaClass = ::camp::classByName(object->getClassname());
+
+        //Type test
+        CPPUNIT_ASSERT_EQUAL( object->getClassname(),
+                              atom->getMetaInfo( ::fwAtomConversion::DataVisitor::CLASSNAME_METAINFO ) );
+
+         //Test attribute type
+        BOOST_FOREACH( ::fwAtoms::Object::AttributesType::value_type elem, atom->getAttributes() )
+        {
+            std::string classname = atom->getMetaInfo( ::fwAtomConversion::DataVisitor::CLASSNAME_METAINFO );
+            if ( ! (  classname == "::fwData::Graph" &&
+                    elem.first == "connections" ) )
+            {
+                int type = metaClass.property(elem.first).type();
+                std::string attribute = metaClass.property(elem.first).name();
+                switch(type)
+                {
+                case camp::stringType:
+                    CPPUNIT_ASSERT(elem.second->isString());
+                    CPPUNIT_ASSERT(elem.second->isValue());
+                    break;
+                case camp::realType :
+                case camp::intType :
+                    CPPUNIT_ASSERT(elem.second->isNumeric());
+                    CPPUNIT_ASSERT(elem.second->isValue());
+                    break;
+                case camp::boolType :
+                    CPPUNIT_ASSERT(elem.second->isBoolean());
+                    CPPUNIT_ASSERT(elem.second->isValue());
+                    break;
+                case camp::userType:
+                    if( ( ( classname == "::fwData::Mesh" ) && ( attribute == "cell_colors" ) ) ||
+                            ( ( classname == "::fwData::Mesh" ) && ( attribute == "cell_normals" ) ) ||
+                            ( ( classname == "::fwData::Mesh" ) && ( attribute == "point_colors" ) ) ||
+                            ( ( classname == "::fwData::Mesh" ) && ( attribute == "point_normals" ) ) ||
+                            ( ( classname == "::fwData::Reconstruction" ) && ( attribute == "image" ) ) ||
+                            ( ( classname == "::fwData::Reconstruction" ) && ( attribute == "mesh" ) ) )
+                    {
+                        CPPUNIT_ASSERT(!elem.second);
+                    }
+                    else
+                    {
+                        CPPUNIT_ASSERT(elem.second->isObject() || elem.second->isBlob());
+                    }
+                    break;
+                case camp::mappingType:
+                    CPPUNIT_ASSERT(elem.second->isMapping());
+                    break;
+                case camp::enumType:
+                    CPPUNIT_ASSERT(elem.second->isString());
+                    CPPUNIT_ASSERT(elem.second->isValue());
+                    break;
+                case camp::arrayType:
+                    CPPUNIT_ASSERT(elem.second->isSequence());
+                    break;
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::materialConversionTest()
+{
+    ::fwData::Color::sptr color = ::fwData::Color::New(0.2f, 1.2f, 1.3f, 0.9f);
+    ::fwData::Material::sptr material = ::fwData::Material::New();
+    material->setAmbient(color);
+
+    // Create Atom
+    ::fwData::Material::sptr materialTmp;
+    materialTmp = ::fwData::Object::copy( material );
+    ::fwAtoms::Object::sptr atom = ::fwAtomConversion::convert( materialTmp );
+    materialTmp.reset();
+
+    // Create Data from Atom
+    ::fwData::Object::sptr materialRes = ::fwAtomConversion::convert(atom);
+    ::fwData::Material::sptr materialResultat = ::fwData::Material::dynamicCast(materialRes);
+
+    compare(material, materialResultat);
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::graphConversionTest()
+{
+    ::fwAtoms::Object::sptr atom;
+    ::fwTools::UUID::UUIDType gID,n1ID,n2ID,n3ID,e12ID,e23ID;
+    {
+        ::fwData::Graph::sptr g = ::fwData::Graph::New();
+        gID = ::fwTools::UUID::get(g);
+        ::fwData::Node::sptr  n1 = ::fwData::Node::New();
+        n1ID = ::fwTools::UUID::get(n1);
+        ::fwData::Node::sptr  n2 = ::fwData::Node::New();
+        n2ID = ::fwTools::UUID::get(n2);
+        ::fwData::Node::sptr  n3 = ::fwData::Node::New();
+        n3ID = ::fwTools::UUID::get(n3);
+        ::fwData::Edge::sptr  e12 = ::fwData::Edge::New();
+        e12ID = ::fwTools::UUID::get(e12);
+        ::fwData::Edge::sptr  e23 = ::fwData::Edge::New();
+        e23ID = ::fwTools::UUID::get(e23);
+
+        // build graph
+        g->addNode(n1);
+        g->addNode(n2);
+        g->addNode(n3);
+
+        n1->addOutputPort( ::fwData::Port::New() );
+        n2->addInputPort( ::fwData::Port::New() );
+        n2->addOutputPort( ::fwData::Port::New() );
+        n3->addInputPort( ::fwData::Port::New() );
+
+        e12->setIdentifiers("IDNOTdefined","IDNOTdefined");
+        e23->setIdentifiers("IDNOTdefined","IDNOTdefined");
+
+        g->addEdge(e12,n1,n2);
+        g->addEdge(e23,n2,n3);
+
+        // Test field on edge
+        e12->setField("infoTest",::fwData::String::New("valueInfoTest"));
+
+        // Create Atom
+        atom = ::fwAtomConversion::convert( g );
+    }
+
+   // Create Data from Atom
+   ::fwData::Graph::sptr newGraph = ::fwData::Graph::dynamicCast( ::fwAtomConversion::convert(atom) );
+
+   // nodes
+   ::fwData::Node::sptr n1, n2, n3;
+
+   // Test nodes
+   const ::fwData::Graph::NodeContainer & nodes = newGraph->getCRefNodes();
+   CPPUNIT_ASSERT_EQUAL_MESSAGE("Graph nodes size" ,  (size_t)3, nodes.size() );
+   BOOST_FOREACH( ::fwData::Node::sptr node, nodes )
+   {
+       ::fwTools::UUID::UUIDType nodeID = ::fwTools::UUID::get(node);
+       CPPUNIT_ASSERT_MESSAGE("Test node uuid" ,  nodeID == n1ID || nodeID == n2ID || nodeID == n3ID );
+       if (  nodeID == n1ID ) { n1 = node; }
+       else if  (  nodeID == n2ID ) { n2 = node; }
+       else if  (  nodeID == n3ID ) { n3 = node; }
+
+   }
+   CPPUNIT_ASSERT_MESSAGE("Test node n1" , n1 );
+   CPPUNIT_ASSERT_MESSAGE("Test node n2" , n2 );
+   CPPUNIT_ASSERT_MESSAGE("Test node n3" , n3 );
+
+   // Test edges
+   const ::fwData::Graph::ConnectionContainer & connections = newGraph->getCRefConnections();
+   CPPUNIT_ASSERT_EQUAL_MESSAGE("Graph connections size" ,  (size_t)2, connections.size() );
+   BOOST_FOREACH( ::fwData::Graph::ConnectionContainer::value_type elem , connections )
+   {
+       ::fwTools::UUID::UUIDType edgeID = ::fwTools::UUID::get(elem.first);
+       CPPUNIT_ASSERT_MESSAGE("Test edge uuid" ,  edgeID == e12ID || edgeID == e23ID );
+       if ( edgeID == e12ID )
+       {
+           CPPUNIT_ASSERT( newGraph->getSourceNode( elem.first ) == n1 );
+           CPPUNIT_ASSERT( newGraph->getDestinationNode( elem.first ) == n2 );
+
+           // test field
+           CPPUNIT_ASSERT( elem.first->getField("infoTest") );
+           CPPUNIT_ASSERT( elem.first->getField< ::fwData::String >("infoTest")->value() == "valueInfoTest" );
+       }
+       else
+       {
+           CPPUNIT_ASSERT( newGraph->getSourceNode( elem.first ) == n2 );
+           CPPUNIT_ASSERT( newGraph->getDestinationNode( elem.first ) == n3 );
+       }
+   }
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::tfConversionTest()
+{
+    ::fwAtoms::Object::sptr atom;
+
+    ::fwData::TransferFunction::sptr tf = ::fwTest::generator::Object::createTFColor(15, 120, 50);
+
+    // Create Atom
+    atom = ::fwAtomConversion::convert( tf );
+
+    ::fwData::TransferFunction::sptr newTF =
+            ::fwData::TransferFunction::dynamicCast( ::fwAtomConversion::convert(atom) );
+
+    compare(tf, newTF);
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::seriesDBConversionTest()
+{
+    ::fwAtoms::Object::sptr atom;
+
+    ::fwMedData::SeriesDB::sptr sdb = ::fwTest::generator::SeriesDB::createSeriesDB(2, 3, 1);
+
+    // Create Atom
+    atom = ::fwAtomConversion::convert( sdb );
+
+
+    ::fwMedData::SeriesDB::sptr newSdb =
+            ::fwMedData::SeriesDB::dynamicCast( ::fwAtomConversion::convert(atom) );
+
+    compare(sdb, newSdb);
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::objectMultiReferencedTest()
+{
+    ::fwAtoms::Object::sptr atom;
+    {
+        ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+        ::fwData::String::sptr data = ::fwData::String::New();
+        composite->getContainer()["key1"] = data;
+        composite->getContainer()["key2"] = data;
+
+        // Create Atom
+        atom = ::fwAtomConversion::convert( composite );
+    }
+
+    // Create Data from Atom
+    ::fwData::Composite::sptr newComposite = ::fwData::Composite::dynamicCast( ::fwAtomConversion::convert(atom) );
+    ::fwData::Composite::ContainerType & dataMap = newComposite->getContainer();
+    CPPUNIT_ASSERT( dataMap.find("key1") != dataMap.end() );
+    CPPUNIT_ASSERT( dataMap.find("key2") != dataMap.end() );
+    CPPUNIT_ASSERT( dataMap["key1"] );
+    CPPUNIT_ASSERT( dataMap["key2"] );
+    CPPUNIT_ASSERT( dataMap["key2"] == dataMap["key1"] );
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::recursiveObjectTest()
+{
+    ::fwAtoms::Object::sptr atom;
+    ::fwTools::UUID::UUIDType compositeID;
+    {
+        ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+        compositeID = ::fwTools::UUID::get( composite );
+        composite->getContainer()["key"] = composite;
+        // Create Atom
+        atom = ::fwAtomConversion::convert( composite );
+
+        // Hack, remove composite to destroy composite
+        composite->getContainer().erase("key");
+    }
+
+    CPPUNIT_ASSERT( ! ::fwTools::UUID::exist( compositeID ) );
+
+    // Create Data from Atom
+    ::fwData::Composite::sptr newComposite = ::fwData::Composite::dynamicCast( ::fwAtomConversion::convert(atom) );
+    ::fwData::Composite::ContainerType & dataMap = newComposite->getContainer();
+    CPPUNIT_ASSERT( dataMap.find("key") != dataMap.end() );
+    CPPUNIT_ASSERT( newComposite == dataMap["key"] );
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::dataFactoryNotFoundExceptionTest()
+{
+    ::fwAtoms::Object::sptr atom;
+    {
+        ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+        ::fwData::String::sptr data = ::fwData::String::New();
+        composite->getContainer()["key"] = data;
+
+        // Create Atom
+        atom = ::fwAtomConversion::convert( composite );
+    }
+
+    {
+        ::fwAtoms::Map::sptr map = ::fwAtoms::Map::dynamicCast( atom->getAttribute("values") );
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast( (*map)["key"] );
+        obj->eraseMetaInfo( ::fwAtomConversion::DataVisitor::CLASSNAME_METAINFO );
+        obj->setMetaInfo( ::fwAtomConversion::DataVisitor::CLASSNAME_METAINFO, "CHANGE::CLASNAME" );
+    }
+
+    CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert(atom),
+                          ::fwAtomConversion::exception::DataFactoryNotFound );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::uuidExceptionTest()
+{
+    // Create data
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    ::fwData::String::sptr data = ::fwData::String::New();
+    composite->getContainer()["key"] = data;
+
+    // Create Atom
+    ::fwAtoms::Object::sptr atom = ::fwAtomConversion::convert( composite );
+
+    CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::StrictPolicy()),
+            ::fwAtomConversion::exception::DuplicatedDataUUID );
+}
+
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::uuidChangeTest()
+{
+    // Create data
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    ::fwData::String::sptr data = ::fwData::String::New();
+    composite->getContainer()["key"] = data;
+
+    // Create Atom
+    ::fwAtoms::Object::sptr atom = ::fwAtomConversion::convert( composite );
+
+    ::fwData::Composite::sptr compositeReloaded;
+    ::fwData::String::sptr dataReloaded;
+
+    compositeReloaded = ::fwData::Composite::dynamicCast(
+                            ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::ChangePolicy())
+                            );
+    dataReloaded = ::fwData::String::dynamicCast((*compositeReloaded)["key"]);
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::get(composite) != ::fwTools::UUID::get(compositeReloaded) );
+    CPPUNIT_ASSERT( ::fwTools::UUID::get(data) != ::fwTools::UUID::get(dataReloaded) );
+
+}
+
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::uuidReuseTest()
+{
+    // Create data
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    ::fwData::String::sptr data = ::fwData::String::New();
+    composite->getContainer()["key"] = data;
+
+    // Create Atom
+    ::fwAtoms::Object::sptr atom = ::fwAtomConversion::convert( composite );
+
+
+    ::fwData::Composite::sptr compositeReloaded;
+    ::fwData::String::sptr dataReloaded;
+
+    compositeReloaded = ::fwData::Composite::dynamicCast(
+                            ::fwAtomConversion::convert(atom, ::fwAtomConversion::AtomVisitor::ReusePolicy())
+                            );
+    dataReloaded = ::fwData::String::dynamicCast((*compositeReloaded)["key"]);
+
+    CPPUNIT_ASSERT_EQUAL( composite, compositeReloaded );
+    CPPUNIT_ASSERT_EQUAL( data, dataReloaded );
+}
+
+//-----------------------------------------------------------------------------
+
+class ClassNotCamped : public ::fwData::Object
+{
+
+public :
+
+    fwCoreClassDefinitionsWithNFactoriesMacro( (ClassNotCamped)(::fwData::Object),
+       ((::fwData::factory::New< ClassNotCamped > ,() )) );
+
+    ClassNotCamped(::fwData::Object::Key key){};
+    void cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache ){};
+
+};
+
+
+void ConversionTest::campFactoryNotFoundExceptionTest()
+{
+    ClassNotCamped::sptr obj = ClassNotCamped::New();
+    CPPUNIT_ASSERT(obj);
+    CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert( obj ), ::camp::ClassNotFound );
+}
+
+//-----------------------------------------------------------------------------
+
+void ConversionTest::nullPtrManagmentTest()
+{
+    // null shared ptr attribute managed
+    {
+        ::fwAtoms::Object::sptr atom;
+        {
+            ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+            CPPUNIT_ASSERT( ! mesh->getPointColorsArray() );
+
+            // Create Atom
+            atom = ::fwAtomConversion::convert( mesh );
+        }
+
+        // null ptr must be also in atom
+        CPPUNIT_ASSERT( atom->getAttributes().find("point_colors") != atom->getAttributes().end() );
+
+        ::fwData::Mesh::sptr newMesh = ::fwData::Mesh::dynamicCast( ::fwAtomConversion::convert(atom) );
+        CPPUNIT_ASSERT( newMesh );
+        CPPUNIT_ASSERT( ! newMesh->getPointColorsArray() );
+    }
+
+    // null shared ptr in map is managed
+    {
+        ::fwAtoms::Object::sptr atom;
+        {
+            ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+            composite->getContainer()["key1"] = ::fwData::String::New();
+            composite->getContainer()["key2"] = ::fwData::Object::sptr();
+
+            // Create Atom
+            atom = ::fwAtomConversion::convert( composite );
+        }
+
+        {
+            ::fwAtoms::Map::sptr map = ::fwAtoms::Map::dynamicCast( atom->getAttribute("values") );
+            CPPUNIT_ASSERT_EQUAL( (size_t)2, map->size() );
+            CPPUNIT_ASSERT( map->find("key2") != map->end() );
+            CPPUNIT_ASSERT( ! (*map)["key2"] );
+        }
+
+        ::fwData::Composite::sptr newComposite = ::fwData::Composite::dynamicCast( ::fwAtomConversion::convert(atom) );
+        ::fwData::Composite::ContainerType & dataMap = newComposite->getContainer();
+        CPPUNIT_ASSERT( newComposite );
+        CPPUNIT_ASSERT_EQUAL( (size_t)2, dataMap.size() );
+        CPPUNIT_ASSERT( dataMap["key1"] );
+        CPPUNIT_ASSERT( dataMap.find("key2") != dataMap.end() );
+        CPPUNIT_ASSERT( ! dataMap["key2"] );
+    }
+
+    // null shared ptr in vector is managed
+    {
+        ::fwAtoms::Object::sptr atom;
+        {
+            ::fwData::Vector::sptr vector = ::fwData::Vector::New();
+            vector->getContainer().push_back( ::fwData::String::New() );
+            vector->getContainer().push_back( ::fwData::Object::sptr() );
+
+            // Create Atom
+            atom = ::fwAtomConversion::convert( vector );
+        }
+
+        {
+            ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::dynamicCast( atom->getAttribute("values") );
+            CPPUNIT_ASSERT_EQUAL( (size_t)2, seq->size() );
+            CPPUNIT_ASSERT( ! (*seq)[1] );
+        }
+
+        ::fwData::Vector::sptr newVector = ::fwData::Vector::dynamicCast( ::fwAtomConversion::convert(atom) );
+        ::fwData::Vector::ContainerType & dataVec = newVector->getContainer();
+        CPPUNIT_ASSERT( newVector );
+        CPPUNIT_ASSERT_EQUAL( (size_t)2, dataVec.size() );
+        CPPUNIT_ASSERT( dataVec[0] );
+        CPPUNIT_ASSERT( ! dataVec[1] );
+    }
+}
+
+
+}  // namespace ut
+}  // namespace fwAtomConversion
+
+//-----------------------------------------------------------------------------
+
+#define EMTPY_CLASS_API
+fwCampAutoDeclareDataMacro((fwAtomConversion)(ut)(ClassNotManaged),EMTPY_CLASS_API);
+
+namespace fwAtomConversion {
+namespace ut {
+
+class ClassNotManaged : public ::fwData::Object
+{
+
+public :
+
+    fwCoreClassDefinitionsWithNFactoriesMacro( (ClassNotManaged)(::fwData::Object),
+       ((::fwData::factory::New< ClassNotManaged > ,() )) );
+
+    fwCampMakeFriendDataMacro((fwAtomConversion)(ut)(ClassNotManaged));
+
+    ClassNotManaged(::fwData::Object::Key key)
+    {
+        m_values.insert( std::make_pair( ::fwData::String::New(), 0.2 ) );
+    };
+
+    void cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache ){};
+
+    std::map< ::fwData::String::sptr, double > m_values;
+
+};
+
+}  // namespace ut
+}  // namespace fwAtomConversion
+
+
+fwCampImplementDataMacro((fwAtomConversion)(ut)(ClassNotManaged))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwAtomConversion")
+        .base< ::fwData::Object>()
+        .property("values", &::fwAtomConversion::ut::ClassNotManaged::m_values);
+}
+
+namespace fwAtomConversion {
+namespace ut {
+
+void ConversionTest::conversionNotManagedExceptionTest()
+{
+    // Test ConversionNotManaged throwing during data to atom conversion
+    {
+        localDeclarefwAtomConversionutClassNotManaged();
+
+        ClassNotManaged::sptr classNotManaged = ClassNotManaged::New();
+
+        CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert( classNotManaged ),
+                              ::fwAtomConversion::exception::ConversionNotManaged );
+    }
+
+    // Test ConversionNotManaged throwing during atom to data conversion
+    {
+        ::fwAtoms::Object::sptr atomObj = ::fwAtoms::Object::New();
+        atomObj->setMetaInfo( DataVisitor::CLASSNAME_METAINFO, "::fwData::Vector" );
+        atomObj->setMetaInfo( DataVisitor::ID_METAINFO, ::fwTools::UUID::generateUUID() );
+
+        CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert( atomObj ),
+                              ::fwAtomConversion::exception::ConversionNotManaged );
+    }
+
+    // Test ConversionNotManaged throwing during atom to data conversion
+    {
+        ::fwAtoms::Object::sptr atomObj = ::fwAtoms::Object::New();
+        atomObj->setMetaInfo( DataVisitor::CLASSNAME_METAINFO, "::fwData::Vector");
+        atomObj->setMetaInfo( DataVisitor::ID_METAINFO, ::fwTools::UUID::generateUUID());
+
+        ::fwAtoms::Map::sptr atomFields = ::fwAtoms::Map::New();
+        atomObj->setAttribute("fields",atomFields);
+
+        ::fwAtoms::Sequence::sptr atomSeq = ::fwAtoms::Sequence::New();
+        atomObj->setAttribute("values",atomSeq);
+
+        ::fwAtoms::Map::sptr atomBasicMap = ::fwAtoms::Map::New();
+        atomSeq->push_back( atomBasicMap );
+
+        CPPUNIT_ASSERT_THROW( ::fwAtomConversion::convert( atomObj ),
+                              ::fwAtomConversion::exception::ConversionNotManaged );
+    }
+}
+
+}  // namespace ut
+}  // namespace fwAtomConversion
+
+
diff --git a/SrcLib/core/fwAtoms/CMakeLists.txt b/SrcLib/core/fwAtoms/CMakeLists.txt
new file mode 100644
index 0000000..1c3a1fb
--- /dev/null
+++ b/SrcLib/core/fwAtoms/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwMemory
+    fwTools
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
+
+
diff --git a/SrcLib/core/fwAtoms/COPYING b/SrcLib/core/fwAtoms/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwAtoms/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwAtoms/COPYING.LESSER b/SrcLib/core/fwAtoms/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwAtoms/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwAtoms/Properties.cmake b/SrcLib/core/fwAtoms/Properties.cmake
new file mode 100644
index 0000000..979377c
--- /dev/null
+++ b/SrcLib/core/fwAtoms/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtoms )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCamp fwCore fwMemory fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtoms/bin/build.options b/SrcLib/core/fwAtoms/bin/build.options
new file mode 100644
index 0000000..82807f3
--- /dev/null
+++ b/SrcLib/core/fwAtoms/bin/build.options
@@ -0,0 +1,5 @@
+TYPE = 'shared'
+VERSION = '0.1'
+
+USE = ['boost']
+LIB = ['fwCore_0.1','fwTools_0.1','fwMemory_0-1']
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Base.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Base.hpp
new file mode 100644
index 0000000..6800227
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Base.hpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_BASE_BASE_HPP__
+#define __FWATOMS_BASE_BASE_HPP__
+
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include "fwAtoms/factory/new.hpp"
+#include "fwAtoms/registry/detail.hpp"
+#include "fwAtoms/config.hpp"
+
+
+namespace fwAtoms
+{
+
+/**
+ * @brief Base class for all Atom classes.
+ */
+class FWATOMS_CLASS_API Base : public ::fwCore::BaseObject
+{
+public:
+    typedef ::fwAtoms::factory::Key Key;
+
+    /// Defines fwAtoms version.
+    FWATOMS_API static const std::string s_VERSION;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwAtoms::registry::get()->addFactory(T::classname(), &::fwAtoms::factory::New<T>);
+        }
+    };
+
+    typedef enum {
+        BOOLEAN = 1,
+        NUMERIC,
+        STRING,
+        OBJECT,
+        SEQUENCE,
+        MAP,
+        BLOB
+    } AtomType;
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (Base)(::fwCore::BaseObject) );
+    fwCoreAllowSharedFromThis();
+
+    virtual ~Base(){};
+
+    /**
+     * @brief Returns a clone object
+     */
+    virtual Base::sptr clone() const = 0;
+
+    /**
+     *@brief Test if the current base is a value or not (Value = {string;numeric;boolean})
+     *@return the test result
+     */
+    bool isValue() const {return (type() == BOOLEAN) || (type() == NUMERIC) || (type() == STRING);};
+
+    /**
+     *@brief Test if the current base is a boolean
+     *@return the test result
+     */
+    bool isBoolean() const {return (type() == BOOLEAN);};
+
+    /**
+     *@brief Test if the current base is a Numeric (real or integer)
+     *@return the test result
+     */
+    bool isNumeric() const {return (type() == NUMERIC);};
+
+    /**
+     *@brief Test if the current base is a string
+     *@return the test result
+     */
+    bool isString() const {return (type() == STRING);};
+
+    /**
+     *@brief Test if the current base is a sequence
+     *@return the test result
+     */
+    bool isSequence() const {return (type() == SEQUENCE);};
+
+    /**
+     *@brief Test if the current base is a mapping
+     *@return the test result
+     */
+    bool isMapping() const {return (type() == MAP);};
+
+    /**
+     *@brief Test if the current base is a blob (a object with a buffer)
+     *@return the test result
+     */
+    bool isBlob() const {return (type() == BLOB);};
+
+    /**
+     *@brief Test if the current base is an object (representation of fwData)
+     *@return the test result
+     */
+    bool isObject() const {return (type() == OBJECT);};
+
+    /**
+     * @brief Return the string representation of a value.
+     * @return the value's representation, else "<Unknown>"
+     */
+    FWATOMS_API virtual std::string getString() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    virtual AtomType type() const = 0;
+
+protected :
+    /**
+     * @brief Constructor
+     */
+    Base(){};
+
+};
+
+}
+
+#endif /* __FWATOMS_BASE_BASE_HPP__ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Blob.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Blob.hpp
new file mode 100644
index 0000000..b56e155
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Blob.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_BASE_BLOB_HPP__
+#define __FWATOMS_BASE_BLOB_HPP__
+
+#include <fwMemory/BufferObject.hpp>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+/**
+ * @brief Representation of a buffer
+ *
+ * A blob wraps a buffer
+ */
+class FWATOMS_CLASS_API Blob : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Blob)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Blob >) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Blob(::fwAtoms::Base::Key key)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Blob()
+    {}
+
+    /**
+     * @brief create a new Blob shared ptr.
+     * @param buffer the buffer object
+     */
+    FWATOMS_API static Blob::sptr New(::fwMemory::BufferObject::sptr buffer);
+
+    /**
+     * @brief create a new Blob shared ptr.
+     * @param buffer the buffer
+     * @param size the buffer size
+     */
+    FWATOMS_API static Blob::sptr New(void* buffer, unsigned int size);
+
+    /**
+     * @brief buffer accessor.
+     * @return the a pointer to the first buffer element.
+     * @{
+     */
+    FWATOMS_API ::fwMemory::BufferObject::sptr getBufferObject() const;
+    FWATOMS_API void setBufferObject(const ::fwMemory::BufferObject::sptr &bo);
+    /// @}
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::BLOB;};
+
+protected:
+
+    ::fwMemory::BufferObject::sptr m_bufferObject;
+};
+
+}
+
+
+
+#endif /* _FWATOMS_BASE_BLOB_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Boolean.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Boolean.hpp
new file mode 100644
index 0000000..67515eb
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Boolean.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_BASE_BOOLEAN_HPP_
+#define _FWATOMS_BASE_BOOLEAN_HPP_
+
+
+#include <string>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+/**
+ * @brief Represented a Boolean value
+ *
+ */
+class FWATOMS_CLASS_API Boolean : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Boolean)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Boolean > ) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Boolean(::fwAtoms::Base::Key key) : m_value(false)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Boolean()
+    {}
+
+    FWATOMS_API virtual std::string getString() const;
+
+    FWATOMS_API virtual void setString(const std::string& value);
+
+    /**
+     * @brief Construct an object storing a bool value
+     * @param value a string representing a boolean.
+     *
+     * If value = "true" then true is stored otherwise false is stored.
+     */
+    FWATOMS_API static Boolean::sptr New(std::string value);
+
+    /**
+     * @brief Construct an object storing a bool value
+     * @param value the boolean value.
+     */
+    FWATOMS_API static Boolean::sptr New(bool value);
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::BOOLEAN;};
+
+    bool getValue() const {return m_value;};
+
+protected:
+
+    /**
+     * @brief Construct an object storing a bool value
+     * @param value the boolena value.
+     */
+    FWATOMS_API Boolean(bool value);
+
+    /**
+     * @brief Construct an object storing a bool value
+     * @param value a string representing a boolean.
+     *
+     * If value = "true" then true is stored otherwise false is stored.
+     */
+    FWATOMS_API Boolean(std::string& value);
+
+    bool m_value;
+};
+
+}
+
+
+
+#endif /* _FWATOMS_BASE_BOOLEAN_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Exception.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Exception.hpp
new file mode 100644
index 0000000..1dbbf47
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Exception.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_EXCEPTION_HPP_
+#define _FWATOMS_EXCEPTION_HPP_
+
+#include <exception>
+#include <string>
+
+#include <fwCore/Exception.hpp>
+#include "fwAtoms/config.hpp"
+
+namespace fwAtoms
+{
+
+/**
+ * @brief   Implements atoms exception
+ */
+struct FWATOMS_CLASS_API Exception : public ::fwCore::Exception
+{
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   message a string containing the failure message
+     */
+    FWATOMS_API Exception(const std::string &message) throw();
+
+    /**
+     * @brief   Destructor : do nothing.
+     */
+    FWATOMS_API ~Exception() throw();
+
+
+};
+
+} // namespace fwAtoms
+
+#endif // _FWATOMS_EXCEPTION_HPP_
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Map.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Map.hpp
new file mode 100644
index 0000000..4f14e1e
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Map.hpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_BASE_MAP_HPP_
+#define __FWATOMS_BASE_MAP_HPP_
+
+
+#include <map>
+#include <string>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/Object.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+/**
+ *
+ * @brief Map is a container for mapping representation.
+ *
+ * For exemple, this metadata is used to bind :
+ * \li std::map
+ * \li boost::unordered_map
+ * \li fwData::Graph (a part)
+ * \li boost graph
+ */
+class FWATOMS_CLASS_API Map : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Map)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Map >) ;
+
+    typedef std::map<std::string, Base::sptr> MapType;
+
+    typedef MapType::key_type KeyType;
+    typedef MapType::mapped_type MappedType;
+    typedef MapType::value_type ValueType;
+    typedef MapType::iterator IteratorType;
+    typedef MapType::const_iterator ConstIteratorType;
+    typedef MapType::reverse_iterator ReverseIteratorType;
+    typedef MapType::const_reverse_iterator ConstReverseIteratorType;
+    typedef MapType::size_type SizeType;
+
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef MapType::key_type key_type;
+    typedef MapType::mapped_type mapped_type;
+    typedef MapType::value_type value_type;
+    typedef MapType::iterator iterator;
+    typedef MapType::const_iterator const_iterator;
+    typedef MapType::reverse_iterator reverse_iterator;
+    typedef MapType::const_reverse_iterator const_reverse_iterator;
+    typedef MapType::size_type size_type;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Map(::fwAtoms::Base::Key key)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Map()
+    {}
+
+    /**
+     * @brief Insert a new value in the map.
+     * @param key the key, if exist the oldest value is erased.
+     * @param value the new value
+     */
+    std::pair<IteratorType, bool> insert(const std::string &key, const Base::sptr &value)
+    { return m_value.insert( ValueType(key, value) ); }
+
+    /**
+     * @brief retrieve size of map
+     * @return the map size
+     */
+    size_t size() const {return m_value.size();}
+
+    /**
+     *@brief Provide an iterator on the first element
+     *@return An iterator on the first element, end() if map is empty.
+     */
+    IteratorType begin(){return m_value.begin();}
+
+    /**
+     *@brief Provide a const iterator on the first element
+     *@return An iterator on the first element, end() if map is empty.
+     */
+    ConstIteratorType begin() const{return m_value.begin();}
+
+    /**
+     * @brief Return an iterator after the last element in the map
+     */
+    IteratorType end(){return m_value.end();}
+
+    /**
+     * @brief Return a const iterator after the last element in the map
+     */
+    ConstIteratorType end() const{return m_value.end();}
+
+    //! clear the map
+    void  clear() {m_value.clear();}
+
+    /**
+     * @brief test if the map is empty
+     * @return true if empty
+     */
+    bool empty() const {return m_value.empty();}
+
+    /**
+     * @brief returns atom's map
+     */
+    const MapType& getValue() const {return m_value;}
+
+
+    /**
+     * @brief find an element in the map
+     * @param key the key
+     * @return an iterator on value pointed by key if exist, else return
+     * Map.end()
+     */
+    MapType::const_iterator find(const std::string &key) const {return m_value.find(key);}
+
+
+    /**
+     * @brief Access to a member with []
+     * @param key a key in the map
+     * @return the value associated with the key or an empty base if the key
+     *         is not in the map.
+     */
+    Base::sptr operator[](const std::string &key){return m_value[key];}
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::MAP;}
+
+
+protected:
+     MapType m_value;
+};
+
+}
+
+
+#endif /* __FWATOMS_BASE_MAP_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hpp
new file mode 100644
index 0000000..4d9db18
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_BASE_NUMERIC_HPP_
+#define _FWATOMS_BASE_NUMERIC_HPP_
+
+#include <string>
+
+#include <boost/cstdint.hpp>
+#include <boost/blank.hpp>
+#include <boost/variant/variant.hpp>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+/**
+* @brief Storing a  numeric value
+**/
+class FWATOMS_CLASS_API Numeric : public Base
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Numeric)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Numeric >) ;
+
+
+    typedef enum
+    {
+        EMPTY = 0,
+        INT,
+        UINT,
+        FLOAT,
+        DOUBLE
+    } NumericType;
+
+    typedef ::boost::variant< ::boost::blank, ::boost::int64_t, ::boost::uint64_t, float, double > ValueType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Numeric(::fwAtoms::Base::Key key)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Numeric() {}
+
+
+    /**
+     * @brief Build a new numeric type
+     * @param value reference of all numeric type
+     * Supported tested type are (int8/16/32/64, uint8/16/32/64, float, double)
+     **/
+    template< typename T >
+    static Numeric::sptr New(T value);
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::NUMERIC;}
+
+    /**
+     * @brief Returns currently held numeric type
+     */
+    NumericType variantType() const {return static_cast< NumericType >(m_value.which());}
+
+    /**
+     * @brief Returns const reference to numeric's variant
+     *
+     * @return
+     */
+    const ValueType &getVariant() const {return m_value;}
+
+    /**
+     * @brief Returns a string representing the currently held numeric value
+     */
+    FWATOMS_API virtual std::string getString() const;
+
+    /**
+     * @brief Sets Numeric's value from given string, using Numeric::valueFromString
+     */
+    FWATOMS_API void setFromString(const std::string &s, NumericType type = EMPTY);
+
+    /**
+     * @brief Retuns a ValueType from a std::string
+     *
+     * @param s source string
+     * @param type type hint
+     *
+     * If hint is EMPTY (default), this method tries to find a fitting type ( in
+     * order : int64, uint64, double)
+     *
+     * @throw fwAtoms::Exception if unable to cast givent string
+     *
+     * @return a ValueType containing the numeric value
+     */
+    FWATOMS_API static ValueType valueFromString(const std::string &s, NumericType type = EMPTY);
+
+    /**
+     * @brief Returns the held value static_casted to T
+     *
+     * @tparam T wanted type
+     *
+     * @throw boost::positive_overflow
+     * @throw boost::negative_overflow
+     */
+    template <typename T>
+    T getValue() const;
+
+
+
+protected:
+
+    ValueType m_value;
+
+};
+
+}
+
+
+
+#endif /* _FWATOMS_BASE_NUMERIC_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hxx b/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hxx
new file mode 100644
index 0000000..f61bb45
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Numeric.hxx
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_BASE_NUMERIC_HXX__
+#define __FWATOMS_BASE_NUMERIC_HXX__
+
+
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/variant/get.hpp>
+#include <boost/mpl/and.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+#include <boost/utility/enable_if.hpp>
+
+
+#include "fwAtoms/Exception.hpp"
+
+namespace fwAtoms
+{
+
+class NumericSetter
+{
+    friend class Numeric;
+
+
+    template< typename T >
+    static void setValue( Numeric::ValueType &v,
+                          typename ::boost::enable_if_c<
+                         ::boost::is_same<
+                                typename ::boost::remove_reference< typename ::boost::remove_const <T>::type >::type,
+                                std::string
+                            >::value
+
+                          , T>::type value )
+    {
+        v = Numeric::valueFromString(value);
+    }
+
+
+    template< typename T >
+    static void setValue( Numeric::ValueType &v,
+                          typename ::boost::enable_if_c<
+                         ::boost::mpl::and_< ::boost::is_signed<T>, ::boost::is_integral<T> >::value
+                          , T>::type value )
+    {
+        v = static_cast< ::boost::int64_t>(value);
+    }
+
+
+    template< typename T >
+    static void setValue( Numeric::ValueType &v,
+                          typename ::boost::enable_if_c<
+                         ::boost::mpl::and_< ::boost::is_unsigned<T>,::boost::is_integral<T> >::value
+                          , T>::type value )
+    {
+        v = static_cast< ::boost::uint64_t>(value);
+    }
+
+    template< typename T >
+    static void setValue( Numeric::ValueType &v,
+                          typename ::boost::enable_if_c< ::boost::is_floating_point<T>::value, T>::type value )
+    {
+        v = value;
+    }
+
+};
+
+//--------------------------------------------------------------------------
+
+template<typename T>
+Numeric::sptr Numeric::New( T value )
+{
+    Numeric::sptr valueSptr = Numeric::New();
+    NumericSetter::setValue<T>(valueSptr->m_value, value);
+    return valueSptr;
+}
+
+//--------------------------------------------------------------------------
+
+template<typename T>
+class get_casted_value : public boost::static_visitor<T>
+{
+public:
+
+    T operator()( ::boost::blank & ) const
+    {
+        FW_RAISE_EXCEPTION(::fwAtoms::Exception("Unable to get value of an empty numeric"));
+        return T();
+    }
+    T operator()( const ::boost::blank & ) const
+    {
+        FW_RAISE_EXCEPTION(::fwAtoms::Exception("Unable to get value of an empty numeric"));
+        return T();
+    }
+
+    template <typename U>
+    T operator()( U & value ) const
+    {
+        return ::boost::numeric_cast<T>(value);
+    }
+
+};
+
+template<typename T>
+T Numeric::getValue() const
+{
+    T val = boost::apply_visitor( get_casted_value<T>(), m_value );
+    return val;
+}
+
+}
+
+#endif
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Object.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Object.hpp
new file mode 100644
index 0000000..a3eeffa
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Object.hpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWATOMS_OBJECT_HPP__
+#define  __FWATOMS_OBJECT_HPP__
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+/**
+ * @brief Class represented a fwData::Object
+ *
+ */
+class FWATOMS_CLASS_API Object : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Object)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Object >) ;
+
+    typedef std::map<std::string, Base::sptr> AttributesType;
+    typedef std::map<std::string, std::string> MetaInfosType;
+
+    //--------------------------------------------------------------------------
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Object(::fwAtoms::Base::Key key)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Object()
+    {}
+
+    //! Sets the attributes map
+    FWATOMS_API void setAttributes(const AttributesType& attrs);
+
+    //! Returns the internal map
+    const AttributesType& getAttributes() const {return m_attributes;}
+
+
+    //! Returns requested attribute if exists, empty sptr else.
+    FWATOMS_API Base::sptr getAttribute(const std::string& key) const;
+
+    //! Returns requested attribute casted in OBJECT_TYPE::sptr if exists, empty sptr else.
+    template < typename OBJECT_TYPE >
+    SPTR(OBJECT_TYPE) getAttribute(const std::string& key) const;
+
+    //! add a atrtribut, old value is erased
+    FWATOMS_API void setAttribute(const std::string& key, const Base::sptr&);
+
+    /**
+     * @brief Removes an attributes
+     *
+     * @param key Key of the element to be removed
+     *
+     * @return returns the number of elements erased
+     */
+    FWATOMS_API AttributesType::size_type eraseAttribute(const std::string& key);
+
+    //! clear attributes
+    FWATOMS_API void clearAttribute();
+
+    //--------------------------------------------------------------------------
+
+    /**
+     * @brief Add a metainfo in the object
+     * MetaInfo coud be anything limited to string type
+     */
+    FWATOMS_API void setMetaInfo(const std::string& key, const std::string& value);
+
+    //!Replace metaInfos.
+    FWATOMS_API void setMetaInfos(const MetaInfosType& metaInfos);
+
+    //! Returns one meta information
+    FWATOMS_API std::string getMetaInfo(const std::string& key) const;
+
+    //! Get internal metaInfo mapping
+    const MetaInfosType& getMetaInfos() const { return m_metaInfos; }
+
+    /**
+     * @brief Removes a MetaInfo
+     *
+     * @param key Key of the element to be removed
+     *
+     * @return returns the number of elements erased
+     */
+    FWATOMS_API MetaInfosType::size_type eraseMetaInfo(const std::string& key);
+
+    //! clear MetaInfos
+    FWATOMS_API void clearMetaInfo();
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::OBJECT;};
+
+
+private:
+
+    MetaInfosType  m_metaInfos;
+    AttributesType m_attributes;
+
+};
+
+}
+
+#endif /*  _FWATOMS_OBJECT_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Object.hxx b/SrcLib/core/fwAtoms/include/fwAtoms/Object.hxx
new file mode 100644
index 0000000..edcafc0
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Object.hxx
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWATOMS_OBJECT_HXX__
+#define  __FWATOMS_OBJECT_HXX__
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+#ifndef __FWATOMS_OBJECT_HPP__
+#error fwAtoms/Object.hpp not included
+#endif
+
+namespace fwAtoms
+{
+
+template < typename OBJECT_TYPE >
+SPTR(OBJECT_TYPE) Object::getAttribute(const std::string& key) const
+{
+    ::fwAtoms::Base::sptr base = this->getAttribute(key);
+    return ::boost::dynamic_pointer_cast< OBJECT_TYPE >(base);
+}
+
+}
+
+#endif /*  __FWATOMS_OBJECT_HXX__ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/Sequence.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/Sequence.hpp
new file mode 100644
index 0000000..738973e
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/Sequence.hpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_BASE_SEQUENCE_HPP_
+#define _FWATOMS_BASE_SEQUENCE_HPP_
+
+#include <vector>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+/**
+ * @brief Sequence represented a list of meta object.
+ *
+ */
+class FWATOMS_CLASS_API Sequence : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Sequence)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< Sequence > ) ;
+
+    typedef std::vector<Base::sptr> SequenceType;
+
+    typedef SequenceType::value_type ValueType;
+    typedef SequenceType::reference ReferenceType;
+    typedef SequenceType::const_reference ConstReferenceType;
+    typedef SequenceType::iterator IteratorType;
+    typedef SequenceType::const_iterator ConstIteratorType;
+    typedef SequenceType::reverse_iterator ReverseIteratorType;
+    typedef SequenceType::const_reverse_iterator ConstReverseIteratorType;
+    typedef SequenceType::size_type SizeType;
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef SequenceType::value_type value_type;
+    typedef SequenceType::reference reference;
+    typedef SequenceType::const_reference const_reference;
+    typedef SequenceType::iterator iterator;
+    typedef SequenceType::const_iterator const_iterator;
+    typedef SequenceType::reverse_iterator reverse_iterator;
+    typedef SequenceType::const_reverse_iterator const_reverse_iterator;
+    typedef SequenceType::size_type size_type;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    Sequence(::fwAtoms::Base::Key key)
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~Sequence()
+    {}
+
+    /**
+     * @brief push an atom in the sequence.
+     */
+    void push_back(const Base::sptr &value){m_value.push_back(value);};
+
+    //! Begin of sequence iterator
+    IteratorType  begin(){return m_value.begin();}
+
+    //! End of sequence iterator
+    IteratorType  end() {return m_value.end();}
+
+    //! Begin of sequence const iterator
+    ConstIteratorType begin() const {return m_value.begin();}
+
+    //! End of sequence const iterator
+    ConstIteratorType end() const {return m_value.end();}
+
+
+    //! Returns the sequence size
+    size_type size() const {return m_value.size();}
+
+    //! clear the sequence
+    void  clear() {m_value.clear();}
+
+    //! Test if the sequence is empty
+    bool empty() const {return m_value.empty();}
+
+    //! Returns internal vector
+    const SequenceType& getValue() const{return m_value;};
+
+    //! access an element in position index
+    Base::sptr &operator[](unsigned int index){return m_value[index];}
+    const Base::sptr &operator[](unsigned int index) const {return m_value[index];}
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::SEQUENCE;};
+
+
+protected:
+    SequenceType m_value;
+};
+
+}
+#endif
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/String.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/String.hpp
new file mode 100644
index 0000000..230fa2b
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/String.hpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_BASE_STRING_HPP_
+#define _FWATOMS_BASE_STRING_HPP_
+
+#include <string>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/Base.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+/**
+ * @brief Class represented a String
+ *
+ */
+class FWATOMS_CLASS_API String : public Base
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (String)(::fwAtoms::Base), (()), ::fwAtoms::factory::New< String > ) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    String(::fwAtoms::Base::Key key) : m_value("")
+    {}
+
+    /**
+     * @brief   Destructor
+     */
+    virtual ~String()
+    {}
+
+    const std::string& getValue() const {return m_value;};
+
+    void setValue( const std::string &value ){m_value=value;};
+
+    std::string getString() const {return m_value;};
+
+    /**
+     * @brief Construct a new Object represented a string.
+     * @param value the internal string.
+     *
+     */
+    FWATOMS_API static String::sptr New(std::string value);
+
+    /**
+     * @brief Returns a clone object
+     */
+    FWATOMS_API virtual Base::sptr clone() const;
+
+    /**
+     * @brief returns Atom type
+     */
+    ::fwAtoms::Base::AtomType type() const {return ::fwAtoms::Base::STRING;};
+
+
+protected:
+
+    std::string m_value;
+};
+
+}
+
+
+
+#endif /* _FWATOMS_BASE_STRING_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/config.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/config.hpp
new file mode 100644
index 0000000..66506ab
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _FWATOMS_CONFIG_HPP_
+#define _FWATOMS_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMS_EXPORTS
+            #define FWATOMS_API __declspec(dllexport)
+        #else
+            #define FWATOMS_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMS_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMS_EXPORTS
+            #define FWATOMS_API __attribute__ ((visibility("default")))
+            #define FWATOMS_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMS_API __attribute__ ((visibility("hidden")))
+            #define FWATOMS_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMS_API
+        #define FWATOMS_CLASS_API
+
+    #endif
+
+#endif //FWATOMS_API
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/factory/namespace.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/factory/namespace.hpp
new file mode 100644
index 0000000..2478078
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/factory/namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_FACTORY_NAMESPACE_HPP__
+#define __FWATOMS_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwAtoms
+{
+
+/**
+ * @brief       Contains fwAtoms::factory utilities
+ * @namespace   fwAtoms::factory
+ * @date        2009-2013
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwAtoms
+
+#endif /* __FWATOMS_FACTORY_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/factory/new.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/factory/new.hpp
new file mode 100644
index 0000000..8bd9b60
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/factory/new.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_FACTORY_NEW_HPP__
+#define __FWATOMS_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwAtoms/config.hpp"
+#include "fwAtoms/registry/detail.hpp"
+
+namespace fwAtoms
+{
+
+class Base;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwAtoms::factory::New();
+
+    Key(){};
+};
+
+
+FWATOMS_API SPTR( ::fwAtoms::Base ) New( const ::fwAtoms::registry::KeyType & classname );
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace fwAtoms
+
+#endif /* __FWATOMS_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/namespace.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/namespace.hpp
new file mode 100644
index 0000000..8d5cd15
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/namespace.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C), 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMS_NAMESPACE_HPP_
+#define _FWATOMS_NAMESPACE_HPP_
+
+/**
+ * @namespace   fwAtoms
+ *
+ *@brief fwAtoms contains basic objects to represent any other kind of object
+ *
+ * fwAtoms contains seven basic types :
+ * \li  Numeric : real and integer type.
+ * \li  Boolean : boolean type.
+ * \li  String  : String type.
+ * \li  Object : complex type.
+ * \li  Map : string:Atom association
+ * \li  Sequence : sequence of simple Atoms (Numeric, Boolean, String).
+ * \li  Blob: representing a raw buffer.
+ */
+namespace fwAtoms
+{
+}
+
+#endif /* _FWATOMS_NAMESPACE_HPP_ */
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/registry/detail.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/registry/detail.hpp
new file mode 100644
index 0000000..44ef655
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/registry/detail.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_REGISTRY_DETAIL_HPP__
+#define __FWATOMS_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwAtoms/config.hpp"
+
+namespace fwAtoms
+{
+
+class Base;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwAtoms::Base) () , KeyType > Type;
+
+FWATOMS_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace fwAtoms
+
+#endif /* __FWATOMS_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/registry/macros.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/registry/macros.hpp
new file mode 100644
index 0000000..8eab1ad
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/registry/macros.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_REGISTRY_MACRO_HPP__
+#define __FWATOMS_REGISTRY_MACRO_HPP__
+
+#include "fwAtoms/registry/detail.hpp"
+
+namespace fwAtoms
+{
+namespace registry
+{
+
+#define fwAtomsRegisterMacro( classname )                                  \
+    static ::fwAtoms::Base::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // end namespace registry
+} // end namespace fwAtoms
+
+#endif /*__FWATOMS_REGISTRY_MACRO_HPP__*/
+
diff --git a/SrcLib/core/fwAtoms/include/fwAtoms/registry/namespace.hpp b/SrcLib/core/fwAtoms/include/fwAtoms/registry/namespace.hpp
new file mode 100644
index 0000000..a02b3ef
--- /dev/null
+++ b/SrcLib/core/fwAtoms/include/fwAtoms/registry/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_REGISTRY_NAMESPACE_HPP__
+#define __FWATOMS_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwAtoms
+{
+
+/**
+ * @brief       Contains fwAtoms::registry details
+ * @namespace   fwAtoms::registry
+ * @date        2009-2013
+ *
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwAtoms
+
+#endif /* __FWATOMS_REGISTRY_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Base.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Base.cpp
new file mode 100644
index 0000000..100aa80
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Base.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/Exception.hpp"
+#include "fwAtoms/Base.hpp"
+
+
+namespace fwAtoms
+{
+
+const std::string Base::s_VERSION = "1";
+
+std::string Base::getString() const
+{
+    FW_RAISE_EXCEPTION( fwAtoms::Exception("No string conversion available.") );
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Blob.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Blob.cpp
new file mode 100644
index 0000000..7035f44
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Blob.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Blob.hpp"
+
+fwAtomsRegisterMacro( ::fwAtoms::Blob );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+Blob::sptr Blob::New(::fwMemory::BufferObject::sptr buffer)
+{
+    Blob::sptr blob = Blob::New();
+    blob->m_bufferObject = buffer;
+
+    return blob;
+}
+
+//------------------------------------------------------------------------------
+
+Blob::sptr Blob::New(void* buffer, unsigned int size)
+{
+    ::fwMemory::BufferObject::sptr bufferObject = ::fwMemory::BufferObject::New();
+    bufferObject->setBuffer(buffer, size);
+    Blob::sptr blob = Blob::New(bufferObject);
+    return blob;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMemory::BufferObject::sptr Blob::getBufferObject() const
+{
+    return m_bufferObject;
+}
+
+//------------------------------------------------------------------------------
+
+void Blob::setBufferObject(const ::fwMemory::BufferObject::sptr &bo)
+{
+    m_bufferObject = bo;
+}
+
+Base::sptr Blob::clone() const
+{
+    ::fwMemory::BufferObject::sptr bufferObjectDest = ::fwMemory::BufferObject::New();
+    Blob::sptr cloneBlob = Blob::New(bufferObjectDest);
+    if(m_bufferObject)
+    {
+        bufferObjectDest->allocate(m_bufferObject->getSize());
+
+        ::fwMemory::BufferObject::Lock lockerSource(m_bufferObject);
+        char * buffSrc = static_cast< char * >( lockerSource.getBuffer() );
+
+        ::fwMemory::BufferObject::Lock lockerDest(bufferObjectDest);
+        char * buffDest = static_cast< char * >( lockerDest.getBuffer() );
+
+        std::copy(buffSrc, buffSrc + m_bufferObject->getSize(), buffDest );
+    }
+    return cloneBlob;
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Boolean.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Boolean.cpp
new file mode 100644
index 0000000..edaeedf
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Boolean.cpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Boolean.hpp"
+
+fwAtomsRegisterMacro( ::fwAtoms::Boolean );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+Boolean::sptr Boolean::New(std::string value)
+{
+    Boolean::sptr valueSptr = Boolean::New();
+    valueSptr->m_value = (value.compare("true") == 0);
+    return valueSptr;
+}
+
+//------------------------------------------------------------------------------
+
+Boolean::sptr Boolean::New(bool value)
+{
+    Boolean::sptr valueSptr = Boolean::New();
+    valueSptr->m_value = value;
+    return valueSptr;
+}
+
+//------------------------------------------------------------------------------
+
+std::string Boolean::getString() const
+{
+    return m_value ? "true" : "false";
+}
+
+//------------------------------------------------------------------------------
+
+void Boolean::setString(const std::string& value)
+{
+    m_value = (!value.compare("true"));
+}
+
+//------------------------------------------------------------------------------
+
+Base::sptr Boolean::clone() const
+{
+    return Boolean::New(m_value);
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Exception.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Exception.cpp
new file mode 100644
index 0000000..295d466
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Exception.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/Exception.hpp"
+
+namespace fwAtoms
+{
+
+Exception::Exception(const std::string &message) throw()
+: ::fwCore::Exception(message)
+{}
+
+
+Exception::~Exception() throw()
+{}
+
+
+
+} // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Map.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Map.cpp
new file mode 100644
index 0000000..94ecdb7
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Map.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Map.hpp"
+
+fwAtomsRegisterMacro( ::fwAtoms::Map );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+Base::sptr Map::clone() const
+{
+    Map::sptr cloneMap = Map::New();
+    BOOST_FOREACH(const ValueType &elem, m_value)
+    {
+        cloneMap->m_value.insert( ValueType(elem.first, elem.second->clone() ) );
+    }
+    return cloneMap;
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Numeric.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Numeric.cpp
new file mode 100644
index 0000000..696cf70
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Numeric.cpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Exception.hpp"
+#include "fwAtoms/Numeric.hpp"
+#include "fwAtoms/Numeric.hxx"
+
+fwAtomsRegisterMacro( ::fwAtoms::Numeric );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+Base::sptr Numeric::clone() const
+{
+    Numeric::sptr clone = Numeric::New();
+    clone->m_value = m_value;
+    return clone;
+}
+
+
+//------------------------------------------------------------------------------
+
+std::string Numeric::getString() const
+{
+    FW_RAISE_EXCEPTION_IF( ::fwAtoms::Exception("Empty numeric atom"), m_value.which() == 0);
+    return ::boost::lexical_cast<std::string>(m_value);
+}
+
+//------------------------------------------------------------------------------
+
+template < typename T >
+bool lexicalCast( Numeric::ValueType &v, const std::string &s )
+{
+    bool ok = false;
+
+    try
+    {
+        T val = ::boost::lexical_cast< T >( s );
+        v = val;
+        ok = true;
+    }
+    catch ( const ::boost::bad_lexical_cast &)
+    {
+        OSLM_TRACE("lexicalCast failed for '" << s << "'" << " to type: " << typeid(T).name() );
+    }
+    return ok;
+}
+
+//------------------------------------------------------------------------------
+
+Numeric::ValueType Numeric::valueFromString(const std::string &s, Numeric::NumericType type)
+{
+    Numeric::ValueType res;
+    SLM_ASSERT("Invalid variant type requested", EMPTY <= type && type <= DOUBLE);
+
+    if ( type == EMPTY)
+    {
+        FW_RAISE_EXCEPTION_IF(
+            ::fwAtoms::Exception( std::string("Unable to get numeric from '") + s + "'"),
+            !(lexicalCast< ::boost::int64_t >(res, s)
+              || lexicalCast< ::boost::uint64_t >(res, s)
+              || lexicalCast< double >(res, s))
+            );
+    }
+    else if ( type == INT)
+    {
+        FW_RAISE_EXCEPTION_IF(
+            ::fwAtoms::Exception( std::string("Unable to get int64 numeric from '") + s + "'"),
+            !lexicalCast< ::boost::int64_t >(res, s)
+            );
+    }
+    else if ( type == UINT)
+    {
+        FW_RAISE_EXCEPTION_IF(
+            ::fwAtoms::Exception( std::string("Unable to get uint64 numeric from '") + s + "'"),
+            !lexicalCast< ::boost::uint64_t >(res, s)
+            );
+    }
+    else if ( type == DOUBLE)
+    {
+        FW_RAISE_EXCEPTION_IF(
+            ::fwAtoms::Exception( std::string("Unable to get double numeric from '") + s + "'"),
+            !lexicalCast< double >(res, s)
+            );
+    }
+
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+
+void Numeric::setFromString(const std::string &s, Numeric::NumericType type)
+{
+    m_value = Numeric::valueFromString(s, type);
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Object.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Object.cpp
new file mode 100644
index 0000000..7c42c45
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Object.cpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/type_traits.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Object.hpp"
+
+
+fwAtomsRegisterMacro( ::fwAtoms::Object );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+void Object::setAttribute(const std::string& key, const Base::sptr &value)
+{
+    m_attributes[key] = value;
+}
+
+//------------------------------------------------------------------------------
+
+Base::sptr Object::getAttribute(const std::string& key) const
+{
+    AttributesType::const_iterator iterAttr = m_attributes.find(key);
+    if (iterAttr != m_attributes.end())
+    {
+        return iterAttr->second;
+    }
+    return Base::sptr();
+}
+
+//------------------------------------------------------------------------------
+
+void Object::setAttributes(const Object::AttributesType& attrs)
+{
+    m_attributes = attrs;
+}
+
+//------------------------------------------------------------------------------
+
+Base::sptr Object::clone() const
+{
+    Object::sptr obj = Object::New();
+    obj->m_metaInfos = m_metaInfos;
+
+    BOOST_FOREACH(const AttributesType::value_type& elem, m_attributes)
+    {
+        if ( elem.second )
+        {
+            obj->m_attributes.insert( AttributesType::value_type(elem.first, elem.second->clone() ) );
+        }
+        else
+        {
+            Base::sptr nullData;
+            obj->m_attributes.insert( AttributesType::value_type(elem.first, nullData) );
+        }
+    }
+
+    return obj;
+}
+
+//------------------------------------------------------------------------------
+
+void Object::setMetaInfo(const std::string& key, const std::string& value)
+{
+    m_metaInfos[key] = value;
+}
+
+//------------------------------------------------------------------------------
+
+std::string Object::getMetaInfo(const std::string& key) const
+{
+    MetaInfosType::const_iterator iterMetaInfos = m_metaInfos.find(key);
+    if(iterMetaInfos != m_metaInfos.end())
+    {
+        return iterMetaInfos->second;
+    }
+    return "";
+}
+
+
+//------------------------------------------------------------------------------
+
+void Object::setMetaInfos(const MetaInfosType& metaInfos)
+{
+    m_metaInfos = metaInfos;
+}
+
+//------------------------------------------------------------------------------
+
+Object::AttributesType::size_type Object::eraseAttribute(const std::string& key)
+{
+    return m_attributes.erase(key);
+}
+
+//------------------------------------------------------------------------------
+
+void Object::clearAttribute()
+{
+    m_attributes.clear();
+}
+
+//------------------------------------------------------------------------------
+
+Object::MetaInfosType::size_type Object::eraseMetaInfo(const std::string& key)
+{
+    return m_metaInfos.erase(key);
+}
+
+//------------------------------------------------------------------------------
+
+void Object::clearMetaInfo()
+{
+    m_metaInfos.clear();
+}
+
+
+
+}  // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/Sequence.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/Sequence.cpp
new file mode 100644
index 0000000..b2876dd
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/Sequence.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/Sequence.hpp"
+
+fwAtomsRegisterMacro( ::fwAtoms::Sequence );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+Base::sptr Sequence::clone() const
+{
+    Sequence::sptr cloneSeq = Sequence::New();
+    cloneSeq->m_value.resize(m_value.size());
+    std::transform(m_value.begin(), m_value.end(), cloneSeq->m_value.begin(), boost::bind(&::fwAtoms::Base::clone, _1));
+    return cloneSeq;
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/String.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/String.cpp
new file mode 100644
index 0000000..f9f2957
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/String.cpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/registry/macros.hpp"
+#include "fwAtoms/String.hpp"
+
+fwAtomsRegisterMacro( ::fwAtoms::String );
+
+namespace fwAtoms
+{
+
+//------------------------------------------------------------------------------
+
+String::sptr String::New(std::string value)
+{
+    String::sptr std = String::New();
+    std->m_value = value;
+    return std;
+}
+
+//------------------------------------------------------------------------------
+
+Base::sptr String::clone() const
+{
+    return String::New(m_value);
+}
+
+}
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/factory/new.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/factory/new.cpp
new file mode 100644
index 0000000..f069190
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/factory/new.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtoms/Object.hpp"
+#include "fwAtoms/factory/new.hpp"
+
+namespace fwAtoms
+{
+
+namespace factory
+{
+
+::fwAtoms::Base::sptr New( const ::fwAtoms::registry::KeyType & classname )
+{
+    return ::fwAtoms::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace fwAtoms
+
+
diff --git a/SrcLib/core/fwAtoms/src/fwAtoms/registry/detail.cpp b/SrcLib/core/fwAtoms/src/fwAtoms/registry/detail.cpp
new file mode 100644
index 0000000..de09fd3
--- /dev/null
+++ b/SrcLib/core/fwAtoms/src/fwAtoms/registry/detail.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwAtoms/registry/detail.hpp"
+
+
+namespace fwAtoms
+{
+
+namespace registry
+{
+
+struct FwAtomsRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwAtomsRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace fwAtoms
+
+
diff --git a/SrcLib/core/fwAtoms/test/CMakeLists.txt b/SrcLib/core/fwAtoms/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwAtoms/test/Properties.cmake b/SrcLib/core/fwAtoms/test/Properties.cmake
new file mode 100644
index 0000000..8c9bbac
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwAtoms )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtoms/test/cppunit.options b/SrcLib/core/fwAtoms/test/cppunit.options
new file mode 100644
index 0000000..4224546
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/cppunit.options
@@ -0,0 +1,10 @@
+
+CLASSTEST=[
+    'AtomTest',
+    'NumericTest',
+    'BooleanTest',
+    'StringTest',
+]
+
+LIB = ['fwTools_0-1','fwCore_0-1', 'fwAtoms_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwAtoms/test/tu/include/AtomTest.hpp b/SrcLib/core/fwAtoms/test/tu/include/AtomTest.hpp
new file mode 100644
index 0000000..4f2be1c
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/include/AtomTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_UT_ATOMTEST_HPP__
+#define __FWATOMS_UT_ATOMTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+class AtomTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( AtomTest );
+    CPPUNIT_TEST( blobTest );
+    CPPUNIT_TEST( mapTest );
+    CPPUNIT_TEST( objectTest );
+    CPPUNIT_TEST( sequenceTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void blobTest();
+    void mapTest();
+    void objectTest();
+    void sequenceTest();
+};
+
+
+}  // namespace ut
+}  // namespace fwAtoms
+
+
+
+#endif // __FWATOMS_UT_ATOMTEST_HPP__
+
diff --git a/SrcLib/core/fwAtoms/test/tu/include/BooleanTest.hpp b/SrcLib/core/fwAtoms/test/tu/include/BooleanTest.hpp
new file mode 100644
index 0000000..00b0b6f
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/include/BooleanTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_UT_BOOLEANTEST_HPP__
+#define __FWATOMS_UT_BOOLEANTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+class BooleanTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( BooleanTest );
+    CPPUNIT_TEST( conversion );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void conversion();
+};
+
+
+}  // namespace ut
+}  // namespace fwAtoms
+
+
+
+#endif // __FWATOMS_UT_BOOLEANTEST_HPP__
+
diff --git a/SrcLib/core/fwAtoms/test/tu/include/NumericTest.hpp b/SrcLib/core/fwAtoms/test/tu/include/NumericTest.hpp
new file mode 100644
index 0000000..894cebf
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/include/NumericTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_UT_NUMERIC_HPP__
+#define __FWATOMS_UT_NUMERIC_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+class NumericTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( NumericTest );
+    CPPUNIT_TEST( emptyTest );
+    CPPUNIT_TEST( intTest );
+    CPPUNIT_TEST( floatingTest );
+    CPPUNIT_TEST( mixedTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void emptyTest();
+    void intTest();
+    void floatingTest();
+    void mixedTest();
+
+};
+
+}  // namespace ut
+}  // namespace fwAtoms
+
+
+
+#endif // __FWATOMS_UT_NUMERIC_HPP__
+
diff --git a/SrcLib/core/fwAtoms/test/tu/include/StringTest.hpp b/SrcLib/core/fwAtoms/test/tu/include/StringTest.hpp
new file mode 100644
index 0000000..12b28ad
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/include/StringTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMS_UT_STRINGTEST_HPP__
+#define __FWATOMS_UT_STRINGTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+class StringTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StringTest );
+    CPPUNIT_TEST( conversion );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void conversion();
+};
+
+
+}  // namespace ut
+}  // namespace fwAtoms
+
+
+
+#endif // __FWATOMS_UT_STRINGTEST_HPP__
+
diff --git a/SrcLib/core/fwAtoms/test/tu/src/AtomTest.cpp b/SrcLib/core/fwAtoms/test/tu/src/AtomTest.cpp
new file mode 100644
index 0000000..30df3fc
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/src/AtomTest.cpp
@@ -0,0 +1,185 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <limits>
+
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Exception.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Sequence.hpp>
+#include "AtomTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtoms::ut::AtomTest );
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+
+
+void AtomTest::setUp()
+{
+}
+
+void AtomTest::tearDown()
+{
+}
+
+
+void AtomTest::blobTest()
+{
+    ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+
+    CPPUNIT_ASSERT_THROW(blob->getString(), ::fwAtoms::Exception);
+
+    ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+    blob->setBufferObject(bo);
+    CPPUNIT_ASSERT_EQUAL(bo, blob->getBufferObject());
+}
+
+
+void AtomTest::mapTest()
+{
+    ::fwAtoms::Map::sptr map = ::fwAtoms::Map::New();
+    CPPUNIT_ASSERT( map->empty() );
+
+    CPPUNIT_ASSERT_THROW(map->getString(), ::fwAtoms::Exception);
+
+    ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+    ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::New();
+    ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::New();
+    map->insert("blob", blob);
+    map->insert("object", obj);
+    map->insert("sequence", seq);
+
+    CPPUNIT_ASSERT_EQUAL( size_t(3), map->size() );
+
+    ::fwAtoms::Map::sptr clone = ::fwAtoms::Map::dynamicCast(map->clone());
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->size() );
+
+    map->clear();
+    CPPUNIT_ASSERT_EQUAL( size_t(0), map->size() );
+    CPPUNIT_ASSERT( map->empty() );
+
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->size() );
+
+}
+
+
+void AtomTest::objectTest()
+{
+    ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::New();
+
+    CPPUNIT_ASSERT_THROW(obj->getString(), ::fwAtoms::Exception);
+
+    ::fwAtoms::Map::sptr map = ::fwAtoms::Map::New();
+    ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+    ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::New();
+
+    obj->setAttribute("blob", blob);
+    obj->setAttribute("object", obj);
+    obj->setAttribute("map", map);
+    obj->setAttribute("sequence", seq);
+
+    CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(blob), obj->getAttribute("blob") );
+    CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(obj), obj->getAttribute("object") );
+    CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(map), obj->getAttribute("map") );
+    CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(seq), obj->getAttribute("sequence") );
+    CPPUNIT_ASSERT_EQUAL( blob, obj->getAttribute< ::fwAtoms::Blob >("blob") );
+    CPPUNIT_ASSERT_EQUAL( obj, obj->getAttribute< ::fwAtoms::Object >("object") );
+    CPPUNIT_ASSERT_EQUAL( map, obj->getAttribute< ::fwAtoms::Map >("map") );
+    CPPUNIT_ASSERT_EQUAL( seq, obj->getAttribute< ::fwAtoms::Sequence >("sequence") );
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), obj->getAttributes().size() );
+    CPPUNIT_ASSERT_EQUAL( size_t(1), obj->eraseAttribute("object") );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), obj->getAttributes().size() );
+
+    obj->setMetaInfo("info 0", "A");
+    obj->setMetaInfo("info 1", "B");
+    obj->setMetaInfo("info 2", "C");
+    obj->setMetaInfo("info 3", "D");
+
+    CPPUNIT_ASSERT_EQUAL( std::string("A"), obj->getMetaInfo("info 0") );
+    CPPUNIT_ASSERT_EQUAL( std::string("B"), obj->getMetaInfo("info 1") );
+    CPPUNIT_ASSERT_EQUAL( std::string("C"), obj->getMetaInfo("info 2") );
+    CPPUNIT_ASSERT_EQUAL( std::string("D"), obj->getMetaInfo("info 3") );
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), obj->getMetaInfos().size() );
+    CPPUNIT_ASSERT_EQUAL( size_t(1), obj->eraseMetaInfo("info 1") );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), obj->getMetaInfos().size() );
+
+    ::fwAtoms::Object::sptr clone = ::fwAtoms::Object::dynamicCast(obj->clone());
+
+    CPPUNIT_ASSERT( ::fwAtoms::Base::sptr(blob) != clone->getAttribute("blob") );
+    CPPUNIT_ASSERT( ::fwAtoms::Base::sptr(map) != clone->getAttribute("map") );
+    CPPUNIT_ASSERT( ::fwAtoms::Base::sptr(seq) != clone->getAttribute("sequence") );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->getAttributes().size() );
+    CPPUNIT_ASSERT_EQUAL( std::string("A"), clone->getMetaInfo("info 0") );
+    CPPUNIT_ASSERT_EQUAL( std::string("C"), clone->getMetaInfo("info 2") );
+    CPPUNIT_ASSERT_EQUAL( std::string("D"), clone->getMetaInfo("info 3") );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->getMetaInfos().size() );
+
+
+
+    obj->clearAttribute();
+    CPPUNIT_ASSERT_EQUAL( size_t(0), obj->getAttributes().size() );
+    obj->clearMetaInfo();
+    CPPUNIT_ASSERT_EQUAL( size_t(0), obj->getMetaInfos().size() );
+
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->getAttributes().size() );
+    CPPUNIT_ASSERT_EQUAL( size_t(3), clone->getMetaInfos().size() );
+}
+
+
+void AtomTest::sequenceTest()
+{
+    ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::New();
+    CPPUNIT_ASSERT( seq->empty() );
+
+    CPPUNIT_ASSERT_THROW(seq->getString(), ::fwAtoms::Exception);
+
+    seq->push_back(::fwAtoms::Blob::New());
+    seq->push_back(::fwAtoms::Object::New());
+    seq->push_back(::fwAtoms::Map::New());
+    seq->push_back(::fwAtoms::Sequence::New());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), seq->size() );
+
+    ::fwAtoms::Sequence::sptr clone = ::fwAtoms::Sequence::dynamicCast(seq->clone());
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), clone->size() );
+
+
+    ::fwAtoms::Sequence::ConstIteratorType iterSeq = seq->begin();
+    ::fwAtoms::Sequence::ConstIteratorType iterClone = clone->begin();
+
+    CPPUNIT_ASSERT_EQUAL( (*(iterClone++))->type(), (*(iterSeq++))->type() );
+    CPPUNIT_ASSERT_EQUAL( (*(iterClone++))->type(), (*(iterSeq++))->type() );
+    CPPUNIT_ASSERT_EQUAL( (*(iterClone++))->type(), (*(iterSeq++))->type() );
+    CPPUNIT_ASSERT_EQUAL( (*(iterClone++))->type(), (*(iterSeq++))->type() );
+
+    CPPUNIT_ASSERT( seq->end() == iterSeq );
+    CPPUNIT_ASSERT( clone->end() == iterClone );
+
+    seq->clear();
+    CPPUNIT_ASSERT_EQUAL( size_t(0), seq->size() );
+    CPPUNIT_ASSERT( seq->empty() );
+
+    CPPUNIT_ASSERT_EQUAL( size_t(4), clone->size() );
+}
+
+
+
+}  // namespace ut
+}  // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtoms/test/tu/src/BooleanTest.cpp b/SrcLib/core/fwAtoms/test/tu/src/BooleanTest.cpp
new file mode 100644
index 0000000..584b37b
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/src/BooleanTest.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <limits>
+
+#include <fwAtoms/Boolean.hpp>
+#include "BooleanTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtoms::ut::BooleanTest );
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+void BooleanTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//-----------------------------------------------------------------------------
+
+void BooleanTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+void BooleanTest::conversion()
+{
+    const bool VALUES[] = {true, false};
+
+    ::fwAtoms::Boolean::sptr meta;
+
+    BOOST_FOREACH ( bool BOOL, VALUES )
+    {
+        std::string res = BOOL ? "true" : "false";
+
+        meta = ::fwAtoms::Boolean::New(BOOL);
+
+        CPPUNIT_ASSERT_EQUAL(res, meta->getString());
+    }
+}
+
+
+}  // namespace ut
+}  // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtoms/test/tu/src/NumericTest.cpp b/SrcLib/core/fwAtoms/test/tu/src/NumericTest.cpp
new file mode 100644
index 0000000..432422b
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/src/NumericTest.cpp
@@ -0,0 +1,198 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <limits>
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+
+#include <fwAtoms/Exception.hpp>
+
+#include "NumericTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtoms::ut::NumericTest );
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+void NumericTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//-----------------------------------------------------------------------------
+
+void NumericTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+//-----------------------------------------------------------------------------
+
+void NumericTest::emptyTest()
+{
+    fwAtoms::Numeric::sptr numeric = fwAtoms::Numeric::New();
+    CPPUNIT_ASSERT_THROW(numeric->getString(), ::fwAtoms::Exception);
+}
+
+//-----------------------------------------------------------------------------
+
+void NumericTest::intTest()
+{
+    fwAtoms::Numeric::sptr numeric;
+
+    numeric = fwAtoms::Numeric::New(42);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(42), numeric->getString());
+
+    numeric = fwAtoms::Numeric::New(1ULL<<63);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(1ULL<<63), numeric->getString());
+    CPPUNIT_ASSERT_THROW( numeric->getValue<int>(), boost::numeric::positive_overflow );
+
+    numeric = fwAtoms::Numeric::New(-22);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(-22), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(-22), numeric->getValue<int>());
+    CPPUNIT_ASSERT_THROW( numeric->getValue<unsigned int>(), boost::numeric::negative_overflow );
+
+    numeric = fwAtoms::Numeric::New(true);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(true), numeric->getString());
+
+    numeric = fwAtoms::Numeric::New('a');
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(static_cast<int>('a')), numeric->getString());
+
+    numeric = fwAtoms::Numeric::New(std::string("42"));
+    CPPUNIT_ASSERT_EQUAL(std::string("42"), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(static_cast<char>(42), numeric->getValue<char>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(42), numeric->getValue<unsigned char>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(42), numeric->getValue<unsigned short>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(42), numeric->getValue<unsigned int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned long int>(42), numeric->getValue<unsigned long int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned long long int>(42), numeric->getValue<unsigned long long int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<char>(42), numeric->getValue<char>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<short>(42), numeric->getValue<short>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(42), numeric->getValue<int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long int>(42), numeric->getValue<long int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<long long int>(42), numeric->getValue<long long int>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<float>(42), numeric->getValue<float>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<double>(42), numeric->getValue<double>());
+
+    numeric = fwAtoms::Numeric::New(std::string("422"));
+    CPPUNIT_ASSERT_EQUAL(422, numeric->getValue<int>());
+    CPPUNIT_ASSERT_THROW( numeric->getValue<char>(), boost::numeric::positive_overflow );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void NumericTest::floatingTest()
+{
+    fwAtoms::Numeric::sptr numeric;
+
+    typedef boost::variant<float, double> VariantType;
+
+    double d1 = 0.234;
+    double d2 = std::numeric_limits< double >::max();
+    double d3 = -42.4;
+    float  f1 = 4327.452359;
+
+    numeric = fwAtoms::Numeric::New(d1);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(VariantType(d1)), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(d1, numeric->getValue<double>());
+    CPPUNIT_ASSERT_EQUAL((float)d1, numeric->getValue<float>());
+
+    numeric = fwAtoms::Numeric::New(d2);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(VariantType(d2)), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(d2, numeric->getValue<double>());
+    CPPUNIT_ASSERT_THROW( numeric->getValue< float >(), boost::numeric::positive_overflow );
+    CPPUNIT_ASSERT_THROW( numeric->getValue< ::boost::uint64_t >(), boost::numeric::positive_overflow );
+
+    numeric = fwAtoms::Numeric::New(d3);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(VariantType(d3)), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(d3, numeric->getValue<double>());
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(d3), numeric->getValue<int>());
+    CPPUNIT_ASSERT_THROW( numeric->getValue< unsigned int >(), boost::numeric::negative_overflow );
+
+    numeric = fwAtoms::Numeric::New(f1);
+    CPPUNIT_ASSERT_EQUAL(::boost::lexical_cast<std::string>(VariantType(f1)), numeric->getString());
+    CPPUNIT_ASSERT_EQUAL(f1, numeric->getValue<float>());
+    CPPUNIT_ASSERT_EQUAL((double)f1, numeric->getValue<double>());
+    CPPUNIT_ASSERT_THROW( numeric->getValue< char >(), boost::numeric::positive_overflow );
+};
+
+//-----------------------------------------------------------------------------
+
+
+class variant_visitor : public boost::static_visitor<>
+{
+public:
+
+    void operator()( ::boost::blank & ) const
+    {
+        CPPUNIT_ASSERT_MESSAGE("This shall not happen", 0);
+    }
+    template <typename U>
+    void operator()( U & value ) const
+    {
+        fwAtoms::Numeric::sptr numeric = ::fwAtoms::Numeric::New(value);
+        CPPUNIT_ASSERT_EQUAL(U(value), numeric->getValue<U>());
+        CPPUNIT_ASSERT_EQUAL(
+                             ::boost::lexical_cast<std::string>(fwAtoms::Numeric::ValueType(value)),
+                             numeric->getString()
+                             );
+
+        CPPUNIT_ASSERT_EQUAL(typeid(U).name(), numeric->getVariant().type().name());
+    }
+};
+
+
+void NumericTest::mixedTest()
+{
+    fwAtoms::Numeric::ValueType values[] = {
+        std::numeric_limits<  ::boost::int64_t >::min(),
+        ::boost::int64_t(-1234),
+        ::boost::int64_t(0),
+        ::boost::int64_t(1234),
+        std::numeric_limits<  ::boost::int64_t >::max(),
+
+        std::numeric_limits<  ::boost::uint64_t >::min(),
+        ::boost::uint64_t(-1234),
+        ::boost::uint64_t(0),
+        ::boost::uint64_t(1234),
+        std::numeric_limits<  ::boost::uint64_t >::max(),
+
+        -std::numeric_limits<  float >::max(),
+        float(-1234),
+        float(0),
+        std::numeric_limits<  float >::min(),
+        float(1234),
+        std::numeric_limits<  float >::max(),
+
+        -std::numeric_limits<  double >::max(),
+        double(-1234),
+        double(0),
+        std::numeric_limits<  double >::min(),
+        double(1234),
+        std::numeric_limits<  double >::max()
+
+    };
+
+    BOOST_FOREACH ( fwAtoms::Numeric::ValueType &v, values )
+    {
+        boost::apply_visitor( variant_visitor(), v );
+    }
+
+}
+
+}  // namespace ut
+}  // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtoms/test/tu/src/StringTest.cpp b/SrcLib/core/fwAtoms/test/tu/src/StringTest.cpp
new file mode 100644
index 0000000..4298b07
--- /dev/null
+++ b/SrcLib/core/fwAtoms/test/tu/src/StringTest.cpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <limits>
+
+#include <fwAtoms/String.hpp>
+#include "StringTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtoms::ut::StringTest );
+
+namespace fwAtoms
+{
+namespace ut
+{
+
+void StringTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//-----------------------------------------------------------------------------
+
+void StringTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+void StringTest::conversion()
+{
+    const std::string VALUES[] = {"", "azerty"};
+    fwAtoms::String::sptr metaString;
+
+    BOOST_FOREACH ( std::string str, VALUES )
+    {
+        metaString = ::fwAtoms::String::New(str);
+
+        CPPUNIT_ASSERT_EQUAL(str, metaString->getString());
+    }
+}
+
+}  // namespace ut
+}  // namespace fwAtoms
+
diff --git a/SrcLib/core/fwAtomsFilter/CMakeLists.txt b/SrcLib/core/fwAtomsFilter/CMakeLists.txt
new file mode 100644
index 0000000..1c3a1fb
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwMemory
+    fwTools
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
+
+
diff --git a/SrcLib/core/fwAtomsFilter/Properties.cmake b/SrcLib/core/fwAtomsFilter/Properties.cmake
new file mode 100644
index 0000000..6e92074
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/Properties.cmake
@@ -0,0 +1,13 @@
+
+set( NAME fwAtomsFilter )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES 
+    fwAtoms
+    fwAtomsPatch
+    fwTools
+    fwActivities
+)
+
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtomsFilter/bin/build.options b/SrcLib/core/fwAtomsFilter/bin/build.options
new file mode 100644
index 0000000..6a594b5
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/bin/build.options
@@ -0,0 +1,10 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = ['boost']
+LIB = [
+    'fwAtoms_0-1',
+    'fwAtomsPatch_0-1',
+    'fwData_0-1',
+    'fwTools_0-1',
+    'fwActivities_0-1',
+    ]
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/IFilter.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/IFilter.hpp
new file mode 100644
index 0000000..7c422fa
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/IFilter.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_IFILTER_HPP__
+#define __FWATOMSFILTER_IFILTER_HPP__
+
+#include <string>
+#include <map>
+
+#include <fwCore/base.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsFilter/registry/detail.hpp"
+#include "fwAtomsFilter/factory/new.hpp"
+#include "fwAtomsFilter/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace fwAtomsFilter
+{
+
+/**
+ * @class IFilter
+ * @brief Removes atom attributes which are not managed by a context.
+ */
+class FWATOMSFILTER_CLASS_API IFilter : public ::fwCore::BaseObject
+{
+
+public:
+    /// Factory key used by IFilter implementations 
+    typedef ::fwAtomsFilter::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwAtomsFilter::registry::get()->addFactory(functorKey, &::fwAtomsFilter::factory::New<T>);
+        }
+    };
+
+
+    fwCoreNonInstanciableClassDefinitionsMacro((IFilter));
+    fwCoreAllowSharedFromThis();
+
+    /// Constructor.
+    FWATOMSFILTER_API IFilter();
+
+    /// Destructor.
+    FWATOMSFILTER_API virtual ~IFilter();
+
+    /// Applies the filter onto the specified object
+    FWATOMSFILTER_API virtual void apply(const SPTR(::fwAtoms::Object)& object) = 0;
+
+};
+
+
+} //fwAtomsFilter
+
+#endif /* __FWATOMSFILTER_IFILTER_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/config.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/config.hpp
new file mode 100644
index 0000000..0916ffa
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMSFILTER_CONFIG_HPP_
+#define _FWATOMSFILTER_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMSFILTER_EXPORTS
+            #define FWATOMSFILTER_API __declspec(dllexport)
+        #else
+            #define FWATOMSFILTER_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMSFILTER_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMSFILTER_EXPORTS
+            #define FWATOMSFILTER_API __attribute__ ((visibility("default")))
+            #define FWATOMSFILTER_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMSFILTER_API __attribute__ ((visibility("hidden")))
+            #define FWATOMSFILTER_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMSFILTER_API
+        #define FWATOMSFILTER_CLASS_API
+
+    #endif
+
+#endif //FWATOMSFILTER_API
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/factory/new.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/factory/new.hpp
new file mode 100644
index 0000000..8bd309e
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/factory/new.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_FACTORY_NEW_HPP__
+#define __FWATOMSFILTER_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwAtomsFilter/config.hpp"
+#include "fwAtomsFilter/registry/detail.hpp"
+
+
+namespace fwAtomsFilter
+{
+
+class IFilter;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwAtomsFilter::factory::New();
+
+    Key(){};
+};
+
+
+FWATOMSFILTER_API SPTR(::fwAtomsFilter::IFilter) New(
+        const ::fwAtomsFilter::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace fwAtomsFilter
+
+#endif /* __FWATOMSFILTER_FACTORY_NEW_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/functions.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/functions.hpp
new file mode 100644
index 0000000..d1cea83
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/functions.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_FUNCTIONS_HPP__
+#define __FWATOMSFILTER_FUNCTIONS_HPP__
+
+#include <fwCore/macros.hpp>
+
+#include "fwAtomsFilter/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+namespace fwAtomsFilter
+{
+
+    /**
+     * @brief Returns true if given atom matches a defined ::fwMedData::Series implementations.
+     * */
+    FWATOMSFILTER_API bool isSeriesKnown(const SPTR(::fwAtoms::Object)& series);
+
+} // namespace fwAtomsFilter
+
+#endif // __FWATOMSFILTER_FUNCTIONS_HPP__
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/namespace.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/namespace.hpp
new file mode 100644
index 0000000..f30b573
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/namespace.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_FACTORY_NAMESPACE_HPP__
+#define __FWATOMSFILTER_FACTORY_NAMESPACE_HPP__
+
+/**
+ * @brief Proposes an API to filter atoms.
+ * @namespace fwAtomsFilter
+ */
+namespace fwAtomsFilter
+{
+
+/**
+ * @brief       Contains fwAtomsFilter::factory utilities
+ * @namespace   factory
+ */
+namespace factory
+{
+} // namespace factory
+
+/**
+ * @brief       Contains fwAtomsFilter::registry details
+ * @namespace   registry
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwAtomsFilter
+
+#endif /* __FWATOMSFILTER_FACTORY_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/detail.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/detail.hpp
new file mode 100644
index 0000000..0488e81
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/detail.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_REGISTRY_DETAIL_HPP__
+#define __FWATOMSFILTER_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwAtomsFilter/config.hpp"
+
+namespace fwAtomsFilter
+{
+
+class IFilter;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwAtomsFilter::IFilter) () , KeyType > Type;
+
+FWATOMSFILTER_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace fwAtomsFilter
+
+#endif /* __FWATOMSFILTER_REGISTRY_DETAIL_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/macros.hpp b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/macros.hpp
new file mode 100644
index 0000000..d3c34ee
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/include/fwAtomsFilter/registry/macros.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSFILTER_REGISTRY_MACRO_HPP__
+#define __FWATOMSFILTER_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwAtomsFilter/registry/detail.hpp"
+
+namespace fwAtomsFilter
+{
+
+namespace registry
+{
+
+#define  fwAtomsFilterRegisterMacro( classname, objectKey )                                  \
+    static ::fwAtomsFilter::IFilter::Registrar< classname >                  \
+    BOOST_PP_CAT(s__factory__record__object__, __LINE__) ( objectKey ) ;
+
+} // namespace registry
+
+} // namespace fwAtomsFilter
+
+#endif /*__FWATOMSFILTER_REGISTRY_MACRO_HPP__*/
+
diff --git a/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/IFilter.cpp b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/IFilter.cpp
new file mode 100644
index 0000000..6f156c2
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/IFilter.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsFilter/IFilter.hpp"
+
+namespace fwAtomsFilter
+{
+
+IFilter::IFilter()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IFilter::~IFilter()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+} //fwAtomsFilter
+
diff --git a/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/factory/new.cpp b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/factory/new.cpp
new file mode 100644
index 0000000..00fbee9
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/factory/new.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsFilter/factory/new.hpp"
+
+#include "fwAtomsFilter/IFilter.hpp"
+
+namespace fwAtomsFilter
+{
+
+namespace factory
+{
+
+SPTR(::fwAtomsFilter::IFilter) New( const ::fwAtomsFilter::registry::KeyType & classname )
+{
+    return ::fwAtomsFilter::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace fwAtomsFilter
+
diff --git a/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/functions.cpp b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/functions.cpp
new file mode 100644
index 0000000..e0610c2
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/functions.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <string>
+
+#include <boost/foreach.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwData/registry/detail.hpp>
+
+#include "fwAtomsFilter/functions.hpp"
+
+
+namespace fwAtomsFilter
+{
+
+bool isSeriesKnown(const SPTR(::fwAtoms::Object)& series)
+{
+    bool isKnown = false;
+
+    namespace reg = ::fwActivities::registry;
+    reg::Activities::sptr registry = reg::Activities::getDefault();
+    const std::vector< reg::ActivityInfo >& infos = registry->getInfos();
+
+    const std::string& classname = ::fwAtomsPatch::helper::getClassname(series);
+
+    SPTR(::fwData::registry::Type) objectRegistry = ::fwData::registry::get();
+    ::fwData::registry::Type::KeyVectorType keys = objectRegistry->getFactoryKeys();
+    ::fwData::registry::Type::KeyVectorType::iterator itKey = std::find(keys.begin(), keys.end(), classname);
+
+    if(itKey != keys.end())
+    {
+        if(classname == "::fwMedData::ActivitySeries")
+        {
+            // Check if activity config id is known
+            ::fwAtoms::String::sptr asId = series->getAttribute< ::fwAtoms::String >("activity_config_id");
+
+            BOOST_FOREACH(reg::ActivityInfo info, infos)
+            {
+                if(info.id == asId->getString())
+                {
+                    isKnown = true;
+                    break;
+                }
+            }
+        }
+        else
+        {
+            isKnown = true;
+        }
+    }
+
+    return isKnown;
+}
+
+} // namespace fwAtomsFilter
+
diff --git a/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/registry/detail.cpp b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/registry/detail.cpp
new file mode 100644
index 0000000..dbea4a0
--- /dev/null
+++ b/SrcLib/core/fwAtomsFilter/src/fwAtomsFilter/registry/detail.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwAtomsFilter/registry/detail.hpp"
+
+
+namespace fwAtomsFilter
+{
+
+namespace registry
+{
+
+struct FwDataRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwDataRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace fwAtomsFilter
+
diff --git a/SrcLib/core/fwAtomsPatch/CMakeLists.txt b/SrcLib/core/fwAtomsPatch/CMakeLists.txt
new file mode 100644
index 0000000..abee515
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/CMakeLists.txt
@@ -0,0 +1,11 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwAtomConversion
+    fwAtoms
+    fwCore
+    fwTools
+)
+
+
+
diff --git a/SrcLib/core/fwAtomsPatch/COPYING b/SrcLib/core/fwAtomsPatch/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwAtomsPatch/COPYING.LESSER b/SrcLib/core/fwAtomsPatch/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwAtomsPatch/Properties.cmake b/SrcLib/core/fwAtomsPatch/Properties.cmake
new file mode 100644
index 0000000..19b9731
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsPatch )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtomConversion fwAtoms fwCore fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwAtomsPatch/bin/build.options b/SrcLib/core/fwAtomsPatch/bin/build.options
new file mode 100644
index 0000000..72bb38a
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/bin/build.options
@@ -0,0 +1,9 @@
+TYPE = 'shared'
+VERSION = '0.1'
+#USE = []
+LIB = [
+    'fwCore_0-1', 
+    'fwAtoms_0-1',
+    'fwAtomConversion_0-1',
+    'fwData_0-1'
+]
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IPatch.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IPatch.hpp
new file mode 100644
index 0000000..a440529
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IPatch.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_IPATCH_HPP__
+#define __FWATOMSPATCH_IPATCH_HPP__
+
+#include <string>
+#include <map>
+
+#include <fwCore/base.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class IPatch
+ * @brief Base class of all patches
+ */
+class FWATOMSPATCH_CLASS_API IPatch : public ::fwCore::BaseObject
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro((IPatch));
+    fwCoreAllowSharedFromThis();
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef std::map< ::fwAtoms::Object::sptr, ::fwAtoms::Object::sptr > NewVersionsType;
+    /**  @} */
+
+    /// Constructor. Does nothing.
+    FWATOMSPATCH_API IPatch();
+
+    /// Copy constructor
+    FWATOMSPATCH_API IPatch( const IPatch &cpy );
+
+    /// Destructor. Does nothing.
+    FWATOMSPATCH_API virtual ~IPatch();
+
+    /// Applies the patch to the specified object
+    FWATOMSPATCH_API virtual void apply(const ::fwAtoms::Object::sptr& previous,
+             const ::fwAtoms::Object::sptr& current,
+             ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)=0;
+
+    /// Returns the origin classname of the object
+    FWATOMSPATCH_API virtual const std::string& getOriginClassname() const;
+
+    /// Returns the origin version of the object
+    FWATOMSPATCH_API virtual const std::string& getOriginVersion() const;
+
+
+protected:
+
+    /// Origin classname of the object
+    std::string m_originClassname;
+
+    /// Origin version of the object
+    std::string m_originVersion;
+
+};
+
+
+} //fwAtomsPatch
+#endif /* __FWATOMSPATCH_IPATCH_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/ISemanticPatch.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/ISemanticPatch.hpp
new file mode 100644
index 0000000..803ae90
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/ISemanticPatch.hpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_ISemanticPatch_HPP__
+#define __FWATOMSPATCH_ISemanticPatch_HPP__
+
+#include <string>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtomsPatch/IPatch.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class ISemanticPatch
+ * @brief Base class of contextual patches.
+ */
+class FWATOMSPATCH_CLASS_API ISemanticPatch : public IPatch
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro((ISemanticPatch));
+    fwCoreAllowSharedFromThis();
+
+
+
+    /// Constructor
+    FWATOMSPATCH_API ISemanticPatch();
+
+    /// Copy constructor
+    FWATOMSPATCH_API ISemanticPatch( const ISemanticPatch &cpy );
+
+    /// Destructor
+    FWATOMSPATCH_API virtual ~ISemanticPatch();
+
+    /**
+     * @brief Applies modifications between given objects.
+     *
+     * @param previous object from which modifications will be applied
+     * @param current object receiving modifications
+     * @param newVersions map containing already patched sub objects
+     *
+     * @pre previous and current objects must have the same classname and version.
+     */
+    FWATOMSPATCH_API virtual void apply(const SPTR(::fwAtoms::Object)& previous,
+             const SPTR(::fwAtoms::Object)& current,
+             ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+    /**
+     * @brief Returns true if patch is applicable into the context from origin to target versions.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API virtual bool isApplicable(
+            const std::string& context,
+            const std::string& originVersion,
+            const std::string& targetVersion) const;
+
+protected:
+
+    ///Struct used to store a context and the versions where the patch can be applied
+    struct Context
+    {
+        std::string m_context;
+        std::string m_originVersion;
+        std::string m_targetVersion;
+
+        Context(const std::string& context, const std::string& originVersion, const std::string& targetVersion)
+            : m_context(context), m_originVersion(originVersion), m_targetVersion(targetVersion)
+        {}
+
+        bool operator==(const Context& b) const
+        {
+            return m_context == b.m_context
+                && m_originVersion == b.m_originVersion
+                && m_targetVersion == b.m_targetVersion;
+        }
+    };
+
+    /**
+     * @brief Add a context where the patch can be applied
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API virtual void addContext(const std::string& context,
+                                             const std::string& originVersion,
+                                             const std::string& targetVersion);
+
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef std::vector< Context > ContextVectorType;
+    /**  @} */
+
+    /// Mutex to protect concurrent access for m_contexts
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    ///Vector used to store the contexts where the patch can be applied
+    ContextVectorType m_contexts;
+
+};
+
+
+} //fwAtomsPatch
+#endif /* __FWATOMSPATCH_ISemanticPatch_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralCreator.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralCreator.hpp
new file mode 100644
index 0000000..54e1ef6
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralCreator.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_ISTRUCTURALCREATOR_HPP__
+#define __FWATOMSPATCH_ISTRUCTURALCREATOR_HPP__
+
+#include <string>
+
+#include <fwCore/base.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class IStructuralCreator
+ * @brief Base class of all structural creators. Creates a new atom object with the default values corresponding
+ * to a data object.
+ */
+class FWATOMSPATCH_CLASS_API IStructuralCreator : public ::fwCore::BaseObject
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro((IStructuralCreator));
+    fwCoreAllowSharedFromThis();
+
+    /// Constructor
+    FWATOMSPATCH_API IStructuralCreator();
+
+    /// Copy constructor
+    FWATOMSPATCH_API IStructuralCreator( const IStructuralCreator &cpy );
+
+    /// Destructor
+    FWATOMSPATCH_API virtual ~IStructuralCreator();
+
+    /// Creates the specified object
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr create() = 0;
+
+    /// Returns the version of the object
+    FWATOMSPATCH_API virtual const std::string& getObjectVersion() const;
+
+    /// Returns the classname of the object
+    FWATOMSPATCH_API virtual const std::string& getObjectClassname() const;
+
+protected:
+
+    /// Create the object base : create meta infos : classname, version and id
+    FWATOMSPATCH_API ::fwAtoms::Object::sptr createObjBase() const;
+
+    /// Object classname
+    std::string m_classname;
+
+    /// Object version
+    std::string m_version;
+};
+
+
+} //fwAtomsPatch
+#endif /* __FWATOMSPATCH_ISTRUCTURALCREATOR_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralPatch.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralPatch.hpp
new file mode 100644
index 0000000..83be1b5
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/IStructuralPatch.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_ISTRUCTURALPATCH_HPP__
+#define __FWATOMSPATCH_ISTRUCTURALPATCH_HPP__
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtomsPatch/IPatch.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtoms
+{
+class Object;
+}
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class IStructuralPatch
+ * @brief Base class of all structural patches
+ */
+class FWATOMSPATCH_CLASS_API IStructuralPatch : public IPatch
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro((IStructuralPatch));
+    fwCoreAllowSharedFromThis();
+
+    ///Constructor
+    FWATOMSPATCH_API IStructuralPatch();
+
+    ///Copy constructor
+    FWATOMSPATCH_API IStructuralPatch( const IStructuralPatch &cpy );
+
+    ///Destructor
+    FWATOMSPATCH_API virtual ~IStructuralPatch();
+
+    /**
+     * @brief Applies the patch to the specified object
+     *
+     * @param previous object from which modifications will be applied
+     * @param current object receiving modifications
+     * @param newVersions map containing already patched sub objects
+     *
+     * @pre previous and current objects must have the same classname and version.
+     */
+    FWATOMSPATCH_API virtual void apply(const SPTR(::fwAtoms::Object)& previous,
+                                        const SPTR(::fwAtoms::Object)& current,
+                                        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+    /// Returns the target classname of the object
+    FWATOMSPATCH_API virtual const std::string& getTargetClassname() const;
+
+    /// Returns the target version of the object
+    FWATOMSPATCH_API virtual const std::string& getTargetVersion() const;
+
+protected:
+
+    /// Updates the version of the patched object
+    FWATOMSPATCH_API void updateVersion(SPTR(::fwAtoms::Object) current);
+
+    /// Target type
+    std::string m_targetClassname;
+
+    /// Target version
+    std::string m_targetVersion;
+};
+
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_ISTRUCTURALPATCH_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/LinkDescriptor.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/LinkDescriptor.hpp
new file mode 100644
index 0000000..e8b4888
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/LinkDescriptor.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_LINKDESCRIPTOR_HPP__
+#define __FWATOMSPATCH_LINKDESCRIPTOR_HPP__
+
+#include <map>
+
+#include "fwCore/BaseObject.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+/**
+* @brief Link descriptor used to identify a link between two versions.
+**/
+class FWATOMSPATCH_CLASS_API LinkDescriptor
+{
+
+public:
+
+    /// Struct used to compare two LinkDescriptor
+    struct Compare {
+        bool operator() (LinkDescriptor a, LinkDescriptor b) const {
+            return (a.m_originVersion+a.m_targetVersion) < (b.m_originVersion+b.m_targetVersion);
+        }
+    };
+
+    /// VersionID used to link type and version
+    typedef std::pair< std::string, std::string > VersionIDType;
+
+    /// Links used to link two versions.
+    typedef std::map< VersionIDType, VersionIDType > LinksType;
+
+    /// Constructor
+    LinkDescriptor();
+
+    /// Constructor
+    LinkDescriptor(const std::string& context, const std::string& originVersion, const std::string& targetVersion,
+                   const std::string& patcher, LinksType links, int weight = 1);
+
+    /// Destructor
+    ~LinkDescriptor();
+
+    /// Returns link weight.
+    int getWeight() const { return m_weight; }
+
+    /// Returns context name.
+    const std::string& getContext() const { return m_context; }
+
+    /// Returns origin version.
+    const std::string& getOriginVersion() const { return m_originVersion; }
+
+    /// Returns target version.
+    const std::string& getTargetVersion() const { return m_targetVersion; }
+
+    /// Returns patcher classname.
+    const std::string& getPatcher() const { return m_patcher; }
+
+    /// Returns map of links between versions.
+    const LinksType& getLinks() const { return m_links; }
+
+private:
+
+    friend class VersionsGraph;
+
+    /// Weight of the link
+    int m_weight;
+
+    /// Context in which the link takes place
+    std::string m_context;
+
+    /// Origin version
+    std::string m_originVersion;
+
+    /// Target version
+    std::string m_targetVersion;
+
+    /// Patcher name
+    std::string m_patcher;
+
+    /// Links between versions.
+    LinksType m_links;
+};
+
+
+
+} // fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_LINKDESCRIPTOR_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/PatchingManager.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/PatchingManager.hpp
new file mode 100644
index 0000000..8c9e805
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/PatchingManager.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_PATCHINGMANAGER_HPP__
+#define __FWATOMSPATCH_PATCHINGMANAGER_HPP__
+
+#include <fwCore/macros.hpp>
+
+#include "fwAtomsPatch/VersionsGraph.hpp"
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtoms
+{
+    class Object;
+}
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class PatchingManager
+ * @brief Manages object patching.
+ *
+ * To be used, PatchingManager requires that available contexts and versions are loaded into
+ * the graph of versions through the VersionsManager.
+ */
+class FWATOMSPATCH_CLASS_API PatchingManager
+{
+public:
+
+    /// Default constructor
+    FWATOMSPATCH_API PatchingManager(SPTR(::fwAtoms::Object) object);
+
+    /// Default destructor
+    FWATOMSPATCH_API ~PatchingManager();
+
+    /**
+     * @brief Transforms the object to the given version.
+     * @pre Given version must be known by the VersionsManager
+     *
+     * @throw ::fwAtomsPatch::exceptions::MissingInformation if an information about patching is missing
+     * @throw ::fwAtomsPatch::exceptions::ImpossibleConversion if there is no patch available to transform an object
+     */
+    FWATOMSPATCH_API ::fwAtoms::Object::sptr transformTo(const std::string& newVersion);
+
+protected:
+
+    /// Object that we want to patch
+    SPTR(::fwAtoms::Object) m_object;
+};
+
+}
+
+#endif //__FWATOMSPATCH_PATCHINGMANAGER_HPP__
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/SemanticPatchDB.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/SemanticPatchDB.hpp
new file mode 100644
index 0000000..a9e284d
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/SemanticPatchDB.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_SemanticPatchDB_HPP__
+#define __FWATOMSPATCH_SemanticPatchDB_HPP__
+
+#include <string>
+#include <vector>
+#include <map>
+#include <utility>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+class ISemanticPatch;
+
+/**
+ * @brief Contextual patch database.
+ * All contextual patches are stored in this database.
+ */
+class FWATOMSPATCH_CLASS_API SemanticPatchDB
+{
+public:
+
+    typedef SPTR(SemanticPatchDB) sptr;
+    ///Typedef used to store the pair type/version of a data structure
+    typedef std::pair< std::string, std::string > VersionIDType;
+    ///Typedef used to store a list of contextual patches applicable on an object
+    typedef std::vector< SPTR(::fwAtomsPatch::ISemanticPatch) > PatchVectorType;
+    ///Typedef used to store all the contextual patches
+    typedef std::map< VersionIDType, PatchVectorType > PatchesType;
+
+    /// Registers a new patch.
+    FWATOMSPATCH_API void registerPatch(SPTR(::fwAtomsPatch::ISemanticPatch) patch);
+
+    /**
+     * @brief Retrieves a patch allowing to go to specified data type/version target.
+     * @param context current context
+     * @param originVersion origin context version.
+     * @param targetVersion target version.
+     * @param objOriginClassname origin classname of the object.
+     * @param objOriginVersion origin version of the object.
+     *
+     * @return patch applicable for data patching, or empty pointer if no such patch found.
+     **/
+    FWATOMSPATCH_API SPTR(::fwAtomsPatch::ISemanticPatch) getPatch(
+            const std::string& context,
+            const std::string& originVersion,
+            const std::string& targetVersion,
+            const std::string& objOriginClassname,
+            const std::string& objOriginVersion) const;
+
+   /// Returns the number of patches.
+   FWATOMSPATCH_API size_t size() const;
+
+   /// Return default instance of SemanticPatchDB
+   FWATOMSPATCH_API static SemanticPatchDB::sptr getDefault();
+
+   /// Constructor. Does nothing.
+   FWATOMSPATCH_API SemanticPatchDB();
+
+   /// Destructor. Does nothing.
+   FWATOMSPATCH_API virtual ~SemanticPatchDB();
+
+private:
+
+   /// Copy constructor. Does nothing.
+   FWATOMSPATCH_API SemanticPatchDB( const SemanticPatchDB &cpy );
+
+   /// Mutex to protect concurrent access for m_patches
+   mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    /// Patches
+    PatchesType m_patches;
+
+    /// Default instance of SemanticPatchDB;
+    static SemanticPatchDB::sptr s_default;
+
+};
+
+} // fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_SemanticPatchDB_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralCreatorDB.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralCreatorDB.hpp
new file mode 100644
index 0000000..ca1bb1d
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralCreatorDB.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_STRUCTURALCREATORDB_HPP__
+#define __FWATOMSPATCH_STRUCTURALCREATORDB_HPP__
+
+#include <string>
+#include <map>
+#include <utility>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtoms
+{
+class Object;
+}
+
+namespace fwAtomsPatch
+{
+
+class IStructuralCreator;
+
+/**
+ * @brief Structural creator database.
+ * All structural creators are stored in this database.
+ */
+class FWATOMSPATCH_CLASS_API StructuralCreatorDB
+{
+
+public:
+    typedef SPTR(StructuralCreatorDB) sptr;
+    ///Typedef used to store the pair classname/version of a data structure
+    typedef std::pair< std::string, std::string > VersionIDType;
+    ///Typedef used to store all the structural creators
+    typedef std::map< VersionIDType, SPTR(::fwAtomsPatch::IStructuralCreator) > CreatorsType;
+
+    /**
+     * @brief Registers a new creator.
+     * @param creator the new creator.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API void registerCreator(SPTR(::fwAtomsPatch::IStructuralCreator) creator);
+
+    /**
+     * @brief Retrieves creator to create data revision.
+     * @param classname the structure classname.
+     * @param version the structure version.
+     * @return creator used to generate the data structure.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API SPTR(::fwAtomsPatch::IStructuralCreator) getCreator(const std::string& classname,
+         const std::string& version);
+
+    /**
+     * @brief Creates a new object instance with given classname and version.
+     * @note This method is thread safe.
+     */
+
+    FWATOMSPATCH_API SPTR(::fwAtoms::Object) create(const std::string& classname, const std::string& version);
+
+   /// Returns the number of creators.
+   FWATOMSPATCH_API size_t size() const;
+
+   /// Returns the default instance of StructuralCreatorDB.
+   static StructuralCreatorDB::sptr getDefault() { return s_default; }
+
+   /// Constructor
+   StructuralCreatorDB() {};
+
+    /// Destructor
+    ~StructuralCreatorDB() {};
+
+private:
+
+    /// Copy constructor
+    StructuralCreatorDB( const StructuralCreatorDB &cpy ) {};
+
+    /// Mutex to protect concurrent access for m_creators
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    /// Structural creators
+    CreatorsType m_creators;
+
+    FWATOMSPATCH_API static StructuralCreatorDB::sptr s_default;
+
+};
+
+
+} // fwAtomsPatch
+
+
+
+#endif /* __FWATOMSPATCH_STRUCTURALCREATORDB_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralPatchDB.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralPatchDB.hpp
new file mode 100644
index 0000000..2a9fa40
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/StructuralPatchDB.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_STRUCTURALPATCHDB_HPP__
+#define __FWATOMSPATCH_STRUCTURALPATCHDB_HPP__
+
+#include <string>
+#include <vector>
+#include <map>
+#include <utility>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+#include "fwAtomsPatch/IStructuralPatch.hpp"
+
+namespace fwAtomsPatch
+{
+
+class IStructuralPatch;
+
+/**
+ * @brief Structural patch database.
+ * All structural patches are stored in this database.
+ */
+class FWATOMSPATCH_CLASS_API StructuralPatchDB
+{
+
+public:
+    typedef SPTR(StructuralPatchDB) sptr;
+    ///Typedef used to store the pair classname/version of a data structure
+    typedef std::pair< std::string, std::string > VersionIDType;
+    ///Typedef used to store link to data structure
+    typedef std::pair< VersionIDType, VersionIDType > PatchKeyType;
+    ///Typedef used to store all the structural patches
+    typedef std::map< PatchKeyType, SPTR(::fwAtomsPatch::IStructuralPatch) > PatchesType;
+
+    /**
+     * @brief Registers a new Path.
+     * @param patch the new Patch.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API void registerPatch(SPTR(::fwAtomsPatch::IStructuralPatch) patch);
+
+    /**
+     * @brief Retrieves patch to go to specified data revision.
+     * @param originClassname origin classname.
+     * @param originVersion origin version.
+     * @param targetClassname target classname.
+     * @param targetVersion target version.
+     *
+     * @return patch that must be applied, or empty pointer if no such patch is found.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API SPTR(::fwAtomsPatch::IStructuralPatch) getPatch(const std::string& originClassname,
+                                                                            const std::string& originVersion,
+                                                                            const std::string& targetClassname,
+                                                                            const std::string& targetVersion) const;
+
+    /// Retrieves number of patch.
+   FWATOMSPATCH_API size_t size() const;
+
+   /// Returns default instance.
+   static ::fwAtomsPatch::StructuralPatchDB::sptr getDefault() { return s_default; }
+
+   /// Constructor
+    StructuralPatchDB() {};
+
+    /// Destructor
+    ~StructuralPatchDB() {};
+
+private:
+
+
+    /// Copy constructor
+    StructuralPatchDB( const StructuralPatchDB &cpy ) {};
+
+    /// Mutex to protect concurrent access for m_patches
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    /// Patches
+    PatchesType m_patches;
+
+    /// Default instance;
+    FWATOMSPATCH_API static ::fwAtomsPatch::StructuralPatchDB::sptr s_default;
+};
+
+} // fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_STRUCTURALPATCHDB_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionDescriptor.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionDescriptor.hpp
new file mode 100644
index 0000000..c8f42fe
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionDescriptor.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_VERSIONDESCRIPTOR_HPP__
+#define __FWATOMSPATCH_VERSIONDESCRIPTOR_HPP__
+
+#include <map>
+#include <string>
+
+#include <fwCore/BaseObject.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @brief Version descriptor used to identify a version.
+ */
+class FWATOMSPATCH_CLASS_API VersionDescriptor
+{
+
+public:
+
+    /**
+     * @brief Struct used to compare two VersionDescriptor
+     */
+    struct Compare {
+        bool operator() (VersionDescriptor a, VersionDescriptor b) const {
+            return a.getVersionName() < b.getVersionName();
+        }
+    };
+
+    /**
+     * @brief VersionIDs used to link type and version
+     */
+    typedef std::map< std::string, std::string > VersionsType;
+
+    /**
+     * @brief Constructor
+     */
+    VersionDescriptor();
+
+    /**
+     * @brief Constructor
+     */
+    VersionDescriptor(const std::string& context, const std::string& versionName, const VersionsType& versions);
+
+    /**
+     * @brief Destructor
+     */
+    ~VersionDescriptor();
+
+    /// Returns context name.
+    const std::string& getContext() const { return m_context; }
+
+    /// Returns version name.
+    const std::string& getVersionName() const { return m_versionName; }
+
+    /// Returns versions.
+    const VersionsType& getVersions() const { return m_versions; }
+
+private:
+
+    /// Context name.
+    std::string m_context;
+
+    /// Version name.
+    std::string m_versionName;
+
+    /// Versions.
+    VersionsType m_versions;
+};
+
+} // fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_VERSIONDESCRIPTOR_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsGraph.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsGraph.hpp
new file mode 100644
index 0000000..4782f2e
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsGraph.hpp
@@ -0,0 +1,148 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_VERSIONSGRAPH_HPP__
+#define __FWATOMSPATCH_VERSIONSGRAPH_HPP__
+
+
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/adjacency_list.hpp>
+
+#include <fwCore/BaseObject.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/VersionDescriptor.hpp"
+#include "fwAtomsPatch/LinkDescriptor.hpp"
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+/**
+* @brief Versions graph description.
+**/
+class FWATOMSPATCH_CLASS_API VersionsGraph : public ::fwCore::BaseObject
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (VersionsGraph)(::fwAtomsPatch::VersionsGraph), (()), new VersionsGraph);
+    fwCoreAllowSharedFromThis();
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef ::fwAtomsPatch::VersionDescriptor NodeType;
+    typedef ::fwAtomsPatch::LinkDescriptor EdgeType;
+    typedef ::boost::adjacency_list< ::boost::listS, ::boost::vecS, ::boost::directedS, NodeType, EdgeType> GraphType;
+    typedef ::boost::graph_traits<GraphType>::vertex_descriptor NodeIDType;
+    typedef ::boost::graph_traits<GraphType>::edge_descriptor EdgeIDType;
+    typedef std::map<NodeType, NodeIDType, ::fwAtomsPatch::VersionDescriptor::Compare> ExistingNodesType;
+    typedef std::map<EdgeType, EdgeIDType, ::fwAtomsPatch::LinkDescriptor::Compare> ExistingEdgesType;
+    typedef std::vector< NodeIDType > VersionSeriesType;
+    typedef std::pair<LinkDescriptor::VersionIDType, bool> LinkedVersionType;
+    /**  @} */
+
+    /**
+     * Default constructor
+     */
+    FWATOMSPATCH_API VersionsGraph();
+
+    /**
+     * Default destructor
+     */
+    FWATOMSPATCH_API ~VersionsGraph();
+
+    /**
+     * @brief Add a new version described by the given node.
+     * @param node new version to be added to the versions graph.
+     */
+    FWATOMSPATCH_API void addNode(NodeType node);
+
+    /**
+     * @brief Add a new edge described by the given edge.
+     * @param edge new edge to be added to the versions graph.
+     */
+    FWATOMSPATCH_API void addEdge(EdgeType edge);
+
+    /**
+     * @brief Compute shortest path between two data version (i.e nodes).
+     * @param origin the source version name
+     * @param target the target version name
+     */
+    FWATOMSPATCH_API VersionSeriesType shortestPath(const std::string& origin, const std::string& target);
+
+    /**
+     * @brief Returns the node matching given node ID.
+     */
+    FWATOMSPATCH_API NodeType getNode(const NodeIDType& nodeID);
+
+    /**
+     * @brief Returns node ID matching given version name.
+     */
+    FWATOMSPATCH_API NodeIDType getNode(const std::string& name) const;
+
+    /**
+     * @brief Returns the edge located between given node IDs.
+     */
+    FWATOMSPATCH_API EdgeType getEdge(const NodeIDType& origin, const NodeIDType& target);
+
+    /**
+     * @brief Returns the linked version of the current version and a boolean to say if a match has been found.
+     * (Do not rely on the versionID if returned bool is set to false).
+     */
+    FWATOMSPATCH_API LinkedVersionType getLinkedVersion(
+            const NodeIDType& originID, const NodeIDType& targetID, LinkDescriptor::VersionIDType current);
+
+    /**
+     * @brief Get connected versions
+     */
+    FWATOMSPATCH_API std::vector< std::string > getConnectedVersions(const std::string &currentVersion);
+
+private:
+
+    /**
+     * @brief Create or update a node
+     * @param node the created/updated node
+     */
+    FWATOMSPATCH_API NodeIDType createOrUpdateNode(const NodeType& node);
+
+    /**
+     * @brief Create an edge
+     * @param edge the created edge
+     */
+    FWATOMSPATCH_API EdgeIDType createEdge(const EdgeType& edge);
+
+    /**
+     * @brief Compute shortest path between two data versions.
+     * @param origin the source node
+     * @param target the target node
+     */
+    FWATOMSPATCH_API VersionSeriesType shortestPath(const NodeType& origin, const NodeType& target);
+
+    /// Mutex to protect concurrent access for m_graph
+    mutable ::fwCore::mt::ReadWriteMutex m_graphMutex;
+
+    /// Mutex to protect concurrent access for m_nodes
+    mutable ::fwCore::mt::ReadWriteMutex m_nodesMutex;
+
+    /// Mutex to protect concurrent access for m_edges
+    mutable ::fwCore::mt::ReadWriteMutex m_edgesMutex;
+
+    /// Versions graph
+    GraphType m_graph;
+
+    /// Nodes
+    ExistingNodesType m_nodes;
+
+    /// Edges
+    ExistingEdgesType m_edges;
+};
+
+} // fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_VERSIONSGRAPH_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsManager.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsManager.hpp
new file mode 100644
index 0000000..e3480d2
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/VersionsManager.hpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_VERSIONMANAGER_HPP__
+#define __FWATOMSPATCH_VERSIONMANAGER_HPP__
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwAtomsPatch/VersionsGraph.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+
+/**
+ * @class VersionsManager
+ * @brief Maintains a table of object versions and a table of links between objects.
+ *
+ * Version and link tables are built from .versions and .graphlink files.
+ */
+class FWATOMSPATCH_CLASS_API VersionsManager
+{
+
+public:
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef std::vector< ::boost::filesystem::path > ListPathType;
+    typedef std::map< std::string, VersionsGraph::sptr > VersionsGraphMapType;
+    /**  @} */
+
+    FWATOMSPATCH_API VersionsManager();
+    FWATOMSPATCH_API ~VersionsManager();
+
+    /**
+     * @brief Returns graph corresponding to given context.
+     * @param context context of the requested VersionGraph.
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API VersionsGraph::sptr getGraph(const std::string& context);
+
+    /**
+     * @brief Generates a .versions file with currently known data versions.
+     * @param filePath path of .versions file to write.
+     * @param context context of the VersionGraph.
+     * @param versionName name of the version to write.
+     * @todo Ignoring file in ignored library.
+     */
+    FWATOMSPATCH_API static void generateNewFile(const ::boost::filesystem::path& filePath, const std::string& context,
+                                                 const std::string& versionName);
+
+    /**
+     * @brief Builds version table.
+     * @param dirPath directory to search for .versions files
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API void buildVersionTable(const std::string& dirPath);
+
+    /**
+     * @brief Builds link table.
+     * @param dirPath directory to search for .graphlink files
+     * @note This method is thread safe.
+     */
+    FWATOMSPATCH_API void buildLinkTable(const std::string& dirPath);
+
+    /// Returns the default instance of VersionsManager
+    static SPTR(VersionsManager) getDefault() {return s_default; }
+
+private:
+
+
+    /**
+     * @brief Loads a file containing object versions.
+     * @param filePath path to a .versions file
+     */
+    FWATOMSPATCH_API static ::fwAtomsPatch::VersionDescriptor getVersion(
+            const ::boost::filesystem::path& filePath);
+
+    /**
+     * @brief Loads a file containing links between objects versions.
+     * @param filePath path to a .graphlink file
+     */
+    FWATOMSPATCH_API static ::fwAtomsPatch::LinkDescriptor getLink(
+            const ::boost::filesystem::path& filePath);
+
+    /**
+     * @brief Generates the versions graph.
+     * @note This method is NOT thread safe.
+     */
+    FWATOMSPATCH_API void generateVersionsGraph();
+
+    /// Mutex to protect m_versionTable access;
+    ::fwCore::mt::ReadWriteMutex m_versionMutex;
+
+    /// Mutex to protect m_linkTable access;
+    ::fwCore::mt::ReadWriteMutex m_linkMutex;
+
+    /// Mutex to protect m_versionsGraphMap access;
+    ::fwCore::mt::ReadWriteMutex m_graphMutex;
+
+    /// Version table
+    ListPathType m_versionTable;
+
+    /// Link table
+    ListPathType m_linkTable;
+
+     /// Versions graphs
+    VersionsGraphMapType m_versionsGraphMap;
+
+    /// Default instance of Versions Manager
+    FWATOMSPATCH_API static SPTR(VersionsManager) s_default;
+};
+
+} // fwAtomsPatch
+
+#endif /* _FWATOMSPATCH_VERSIONMANAGER_HPP_ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/Abstract.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/Abstract.hpp
new file mode 100644
index 0000000..af3b564
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/Abstract.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_CONDITION_ABSTRACT_HPP__
+#define __FWATOMSPATCH_CONDITION_ABSTRACT_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <fwAtoms/Base.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+namespace conditions
+{
+
+/**
+ * @class Abstract
+ * @brief Defines a condition in the patch.
+ */
+class FWATOMSPATCH_CLASS_API Abstract : public ::fwCore::BaseObject
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((Abstract), (()), new Abstract );
+    fwCoreAllowSharedFromThis();
+
+    /// Default value getter
+    FWATOMSPATCH_API virtual ::fwAtoms::Base::sptr getDefaultValue();
+
+    /// Test in replacement value
+    FWATOMSPATCH_API virtual bool test(::fwAtoms::Base::sptr old, ::fwAtoms::Base::sptr newValue);
+
+    /// Test with one value (remove/add/rename)
+    FWATOMSPATCH_API virtual bool test(::fwAtoms::Base::sptr old);
+
+protected:
+    Abstract() {};
+    Abstract(::fwAtoms::Base::sptr defaultValue);
+
+    ::fwAtoms::Base::sptr m_defaultValue;
+    std::string m_message;
+
+};
+
+} // namespace conditions
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_CONDITION_ABSTRACT_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/NumericOverflow.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/NumericOverflow.hpp
new file mode 100644
index 0000000..4b6dd97
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/conditions/NumericOverflow.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_CONDITIONS_NUMERICOVERFLOW_HPP__
+#define __FWATOMSPATCH_CONDITIONS_NUMERICOVERFLOW_HPP__
+
+#include <fwAtoms/Numeric.hpp>
+
+#include "fwAtomsPatch/conditions/Abstract.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+namespace conditions
+{
+/**
+ * @class NumericOverflow
+ * @brief Applies condition on numeric value.
+ */
+class FWATOMSPATCH_CLASS_API NumericOverflow : public Abstract
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((NumericOverflow), (()), new NumericOverflow);
+    fwCoreAllowSharedFromThis();
+
+    /// Numerical test
+    FWATOMSPATCH_API virtual bool test(::fwAtoms::Base::sptr old, ::fwAtoms::Base::sptr newValue);
+
+    /// Numerical test
+    FWATOMSPATCH_API virtual bool test(::fwAtoms::Base::sptr old);
+
+    /// Set the maximum treshold
+    FWATOMSPATCH_API virtual void setTreshold(::fwAtoms::Numeric::sptr treshold);
+
+    /// Constructor
+    FWATOMSPATCH_API static NumericOverflow::sptr New(::fwAtoms::Base::sptr defaultValue);
+
+
+protected:
+    NumericOverflow() {};
+    NumericOverflow(::fwAtoms::Base::sptr defaultValue);
+
+    ::fwAtoms::Numeric::sptr m_treshold;
+};
+
+} // namesapce conditions
+} // namesapce fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_CONDITIONS_NUMERICOVERFLOW_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/config.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/config.hpp
new file mode 100644
index 0000000..320f3ba
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWATOMSPATCH_CONFIG_HPP_
+#define _FWATOMSPATCH_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMSPATCH_EXPORTS
+            #define FWATOMSPATCH_API __declspec(dllexport)
+        #else
+            #define FWATOMSPATCH_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMSPATCH_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMSPATCH_EXPORTS
+            #define FWATOMSPATCH_API __attribute__ ((visibility("default")))
+            #define FWATOMSPATCH_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMSPATCH_API __attribute__ ((visibility("hidden")))
+            #define FWATOMSPATCH_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMSPATCH_API
+        #define FWATOMSPATCH_CLASS_API
+
+    #endif
+
+#endif //FWATOMSPATCH_API
+
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/BadExtension.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/BadExtension.hpp
new file mode 100644
index 0000000..0e9f8e5
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/BadExtension.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_EXCEPTIONS_BADEXTENSION_HPP__
+#define __FWATOMSPATCH_EXCEPTIONS_BADEXTENSION_HPP__
+
+#include "fwAtomsPatch/exceptions/Base.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+/**
+ * @brief Exception defining a wrong extension in a filename.
+ */
+class BadExtension: public fwAtomsPatch::exceptions::Base
+{
+public:
+    BadExtension(const std::string& message);
+    virtual ~BadExtension() throw(){};
+};
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_EXCEPTIONS_BADEXTENSION_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/Base.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/Base.hpp
new file mode 100644
index 0000000..9227414
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/Base.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef __FWATOMSPATCH_EXCEPTIONS_BASE_HPP__
+#define __FWATOMSPATCH_EXCEPTIONS_BASE_HPP__
+
+#include <fwCore/Exception.hpp>
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+/**
+ * @brief Base class of fwAtomsPatch exceptions
+ */
+class Base: public fwCore::Exception
+{
+public:
+    Base(const std::string& message);
+    virtual ~Base() throw () {};
+};
+
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_EXCEPTIONS_BASE_HPP__ */
+
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/ImpossibleConversion.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/ImpossibleConversion.hpp
new file mode 100644
index 0000000..d00f368
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/ImpossibleConversion.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_EXCEPTIONS_IMPOSSIBLECONVERSION_HPP__
+#define __FWATOMSPATCH_EXCEPTIONS_IMPOSSIBLECONVERSION_HPP__
+
+#include "fwAtomsPatch/exceptions/Base.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+/**
+ * @brief Reports an impossible conversion between data objects.
+ */
+class ImpossibleConversion: public fwAtomsPatch::exceptions::Base
+{
+public:
+    ImpossibleConversion(const std::string& message);
+    virtual ~ImpossibleConversion() throw(){};
+};
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_EXCEPTIONS_IMPOSSIBLECONVERSION_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/MissingInformation.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/MissingInformation.hpp
new file mode 100644
index 0000000..29bd58c
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/MissingInformation.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_EXCEPTIONS_MISSINGINFORMATION_HPP__
+#define __FWATOMSPATCH_EXCEPTIONS_MISSINGINFORMATION_HPP__
+
+#include "fwAtomsPatch/exceptions/Base.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+/**
+ * @brief Reports an missing information required for data object patching.
+ */
+class MissingInformation: public fwAtomsPatch::exceptions::Base
+{
+public:
+    MissingInformation(const std::string& message);
+    virtual ~MissingInformation() throw(){};
+};
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_EXCEPTIONS_MISSINGINFORMATION_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/UnknownVersion.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/UnknownVersion.hpp
new file mode 100644
index 0000000..4536ba8
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/exceptions/UnknownVersion.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_EXCEPTIONS_UNKNOWNVERSION_HPP__
+#define __FWATOMSPATCH_EXCEPTIONS_UNKNOWNVERSION_HPP__
+
+#include "fwAtomsPatch/exceptions/Base.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+/**
+ * @brief Thrown when a given object version is unknown and can't be processed.
+ */
+class UnknownVersion: public fwAtomsPatch::exceptions::Base
+{
+public:
+    UnknownVersion(const std::string& message);
+    virtual ~UnknownVersion() throw() {};
+};
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_EXCEPTIONS_UNKNOWNVERSION_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/Object.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/Object.hpp
new file mode 100644
index 0000000..59467f1
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/Object.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_HELPER_OBJECT_HPP__
+#define __FWATOMSPATCH_HELPER_OBJECT_HPP__
+
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/conditions/Abstract.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+namespace helper
+{
+
+namespace conditions = ::fwAtomsPatch::conditions;
+
+/**
+ * @class Object
+ * @brief Object helper
+ */
+class FWATOMSPATCH_CLASS_API Object
+{
+public:
+
+    /// Constructor
+    FWATOMSPATCH_API Object(::fwAtoms::Object::sptr metaObject );
+
+    /// Destructor
+    FWATOMSPATCH_API ~Object();
+
+    /// Adds a new attribute in the current object
+    FWATOMSPATCH_API void addAttribute(const std::string& name,
+                                      ::fwAtoms::Base::sptr value,
+                                      conditions::Abstract::sptr condition = conditions::Abstract::New());
+
+    /// Adds or replaces an attribute in the current object
+    FWATOMSPATCH_API void addOrReplaceAttribute(const std::string& name,
+                                      ::fwAtoms::Base::sptr value,
+                                      conditions::Abstract::sptr condition = conditions::Abstract::New());
+
+    /// Removes an attribute
+    FWATOMSPATCH_API void removeAttribute(const std::string& name,
+                                         conditions::Abstract::sptr condition = conditions::Abstract::New());
+
+    /// Replaces an attribute
+    FWATOMSPATCH_API void replaceAttribute(const std::string& name,
+                                          ::fwAtoms::Base::sptr newValue,
+                                          conditions::Abstract::sptr condition = conditions::Abstract::New());
+
+    /// Renames an attribute.
+    FWATOMSPATCH_API void renameAttribute(const std::string& name, const std::string& newName,
+                                         conditions::Abstract::sptr condition = conditions::Abstract::New()
+                                         );
+
+    /// Atom::Object getter
+    FWATOMSPATCH_API ::fwAtoms::Object::sptr getObject() const;
+
+private:
+
+    /// Object
+    ::fwAtoms::Object::sptr m_object;
+};
+
+} //helper
+} //fwAtomHelper
+
+#endif /* __FWATOMSPATCH_HELPER_OBJECT_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/functions.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/functions.hpp
new file mode 100644
index 0000000..5cdf9a2
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/helper/functions.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_HELPER_FUNCTIONS_HPP__
+#define __FWATOMSPATCH_HELPER_FUNCTIONS_HPP__
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+namespace helper
+{
+    /// Get classname of an object
+    FWATOMSPATCH_API std::string getClassname( const ::fwAtoms::Object::sptr & obj );
+
+    /// Set classname of an object
+    FWATOMSPATCH_API void setClassname( const ::fwAtoms::Object::sptr & obj, const std::string & newClassname );
+
+    /// Get version of an object
+    FWATOMSPATCH_API std::string getVersion( const ::fwAtoms::Object::sptr & obj );
+
+    /// Set version of an object
+    FWATOMSPATCH_API void setVersion( const ::fwAtoms::Object::sptr & obj, const std::string & newVersion );
+
+    /// Generates new id for the object (also creates it if it is missing )
+    FWATOMSPATCH_API void generateID( const ::fwAtoms::Object::sptr & obj );
+
+    /// Cleans object fields (also creates them if they are missing)
+    FWATOMSPATCH_API void cleanFields( const ::fwAtoms::Object::sptr & obj );
+
+    /// Generates new UUID for object and child objects
+    FWATOMSPATCH_API void changeUID( const ::fwAtoms::Object::sptr & obj );
+
+    /// Generates new UUID for map objects and child objects
+    FWATOMSPATCH_API void changeMapUID( const ::fwAtoms::Map::sptr & map );
+
+    /// Generates new UUID for seq objects and child objects
+    FWATOMSPATCH_API void changeSeqUID( const ::fwAtoms::Sequence::sptr & seq );
+
+} //helper
+} //fwAtomHelper
+
+#endif // __FWATOMSPATCH_HELPER_FUNCTIONS_HPP__
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/Logger.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/Logger.hpp
new file mode 100644
index 0000000..24ff3c4
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/Logger.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_INFOS_LOGGER_HPP__
+#define __FWATOMSPATCH_INFOS_LOGGER_HPP__
+
+#include <string>
+#include <vector>
+#include <utility>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+namespace infos
+{
+
+/**
+ * @class Logger
+ * @brief Logs events occurring during object patching.
+ */
+class FWATOMSPATCH_CLASS_API Logger
+{
+public:
+
+    typedef std::ostringstream StreamType;
+    typedef ::boost::shared_ptr< StreamType  > StreamPtrType;
+
+    /// Logger destructor
+    FWATOMSPATCH_API ~Logger();
+
+    /// Error message
+    FWATOMSPATCH_API void error(const std::string& message);
+
+    /// Bad cast message
+    FWATOMSPATCH_API void badCast(const std::string& message);
+
+    /// Out of range message
+    FWATOMSPATCH_API void outOfRange(const std::string& message);
+
+    /// Information message
+    FWATOMSPATCH_API void info(const std::string& message);
+
+    /// New attribute message
+    FWATOMSPATCH_API void addAttribute(const std::string& message);
+
+    /// Erase attribute message
+    FWATOMSPATCH_API void eraseAttribute(const std::string& message);
+
+    /// Replace attribute message
+    FWATOMSPATCH_API void replaceAttribute(const std::string& message);
+
+    static Logger &getLogger() {return s_logger;}
+
+    FWATOMSPATCH_API static StreamPtrType getStream();
+
+private:
+
+    /// Logger constructor
+    FWATOMSPATCH_API Logger();
+
+    /// Default instance
+    FWATOMSPATCH_API static Logger s_logger;
+
+    /// Log stream
+    FWATOMSPATCH_API static StreamPtrType s_stream;
+};
+
+} //infos
+} //fwAtomHelper
+
+#endif /* __FWATOMSPATCH_INFOS_LOGGER_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/log.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/log.hpp
new file mode 100644
index 0000000..66b4250
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/infos/log.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_INFOS_LOG_HPP__
+#define __FWATOMSPATCH_INFOS_LOG_HPP__
+
+#include <fwAtomsPatch/infos/Logger.hpp>
+
+/** @{ */
+# ifdef _DEBUG
+/** Info message macros for patch log. */
+#  define fwAtomsPatchInfoLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().info(message)
+/** Error message macros for patch log. */
+#  define fwAtomsPatchErrorLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().error(message)
+/** Bad cast message macros for patch log. */
+#  define fwAtomsPatchBadCastLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().badCast(message)
+/** Out of range message macros for patch log. */
+#  define fwAtomsPatchOutOfRangeLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().outOfRange(message)
+/** Add attribute message macros for patch log. */
+#  define fwAtomsPatchAddAttributeLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().addAttribute(message)
+/** Erase attribute message macros for patch log. */
+#  define fwAtomsPatchEraseAttributeLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().eraseAttribute(message)
+/** Replace attribute message macros for patch log. */
+#  define fwAtomsPatchReplaceAttributeLogMacro(message) \
+        ::fwAtomsPatch::infos::Logger::getLogger().replaceAttribute(message)
+# else
+/** Info message macros for patch log. */
+#  define fwAtomsPatchInfoLogMacro(message) // nothing
+/** Error message macros for patch log. */
+#  define fwAtomsPatchErrorLogMacro(message) // nothing
+/** Bad cast message macros for patch log. */
+#  define fwAtomsPatchBadCastLogMacro(message) // nothing
+/** Out of range message macros for patch log. */
+#  define fwAtomsPatchOutOfRangeLogMacro(message) // nothing
+/** Add attribute message macros for patch log. */
+#  define fwAtomsPatchAddAttributeLogMacro(message) // nothing
+/** Erase attribute message macros for patch log. */
+#  define fwAtomsPatchEraseAttributeLogMacro(message) // nothing
+/** Replace attribute message macros for patch log. */
+#  define fwAtomsPatchReplaceAttributeLogMacro(message) // nothing
+# endif
+/**  @} */
+
+#endif  // __FWATOMSPATCH_INFOS_LOG_HPP__
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/namespace.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/namespace.hpp
new file mode 100644
index 0000000..1efe15b
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/namespace.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_NAMESPACE_HPP__
+#define __FWATOMSPATCH_NAMESPACE_HPP__
+
+/**
+ * @brief Contains base functionalities used to transform objects from a version to another.
+ * @namespace fwAtomsPatch
+ */
+namespace fwAtomsPatch
+{
+
+    /**
+     * @brief Contains functions used to control patching process by defining conditions on objects.
+     * @namespace fwAtomsPatch::conditions
+     */
+    namespace conditions
+    {
+    }
+
+    /**
+     * @brief Contains exceptions related to patching process.
+     * @namespace fwAtomsPatch::exceptions
+     */
+    namespace exceptions
+    {
+    }
+
+    /**
+     * @brief Contains functions to facilitate object patching.
+     * @namespace fwAtomsPatch::helper
+     */
+    namespace helper
+    {
+    }
+
+    /**
+     * @brief Contains utilities to report informations about patching.
+     * @namespace fwAtomsPatch::infos
+     */
+    namespace infos
+    {
+    }
+
+    /**
+     * @brief Contains patchers allowing to transform objects using patches.
+     * @namespace fwAtomsPatch::patcher
+     */
+    namespace patcher
+    {
+
+        /**
+         * @brief       Contains fwAtomsPatch::factory utilities
+         * @namespace   fwAtomsPatch::patcher::factory
+         * @date        2009-2013
+         */
+        namespace factory
+        {
+        } // namespace factory
+
+        /**
+         * @brief       Contains fwAtomsPatch::regjstry utilities
+         * @namespace   fwAtomsPatch::patcher::registry
+         * @date        2009-2013
+         */
+        namespace registry
+        {
+        } // namespace registry
+
+
+    } // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/DefaultPatcher.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/DefaultPatcher.hpp
new file mode 100644
index 0000000..9e82ce5
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/DefaultPatcher.hpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_PATCHER_DEFAULTPATCHER_HPP__
+#define __FWATOMSPATCH_PATCHER_DEFAULTPATCHER_HPP__
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtomsPatch/VersionDescriptor.hpp"
+
+#include "fwAtomsPatch/patcher/IPatcher.hpp"
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+/**
+ * @class DefaultPatcher
+ * @brief Default patcher
+ */
+class FWATOMSPATCH_CLASS_API DefaultPatcher : public IPatcher
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((DefaultPatcher)(::fwAtomsPatch::patcher::IPatcher), (()),
+                ::fwAtomsPatch::patcher::factory::New< DefaultPatcher >);
+
+    /// Constructor
+    FWATOMSPATCH_API DefaultPatcher(::fwAtomsPatch::patcher::IPatcher::Key key);
+
+    /// Destructor
+    FWATOMSPATCH_API virtual ~DefaultPatcher();
+
+    /// Apply the patch to the specified object
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr transformObject(::fwAtoms::Object::sptr object,
+            const std::string &context,
+            const std::string &currentVersion,
+            const std::string &targetVersion);
+
+protected:
+
+    /// Process structural atom object.
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr processStructuralObject(::fwAtoms::Object::sptr current);
+
+    /// Process contextual atom object.
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr processContextualObject(::fwAtoms::Object::sptr current);
+
+    /// Process atom base.
+    FWATOMSPATCH_API virtual ::fwAtoms::Base::sptr processBase(::fwAtoms::Base::sptr base);
+
+    /// Process atom mapping.
+    FWATOMSPATCH_API virtual ::fwAtoms::Map::sptr processMapping(::fwAtoms::Map::sptr map);
+
+    /// Process atom sequence.
+    FWATOMSPATCH_API virtual ::fwAtoms::Sequence::sptr processSequence(::fwAtoms::Sequence::sptr seq);
+
+    /// Apply structural patch.
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr applyStructuralPatch(::fwAtoms::Object::sptr previous,
+            ::fwAtoms::Object::sptr current);
+
+    /// Apply contextual patch.
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr applyContextualPatch(::fwAtoms::Object::sptr previous,
+            ::fwAtoms::Object::sptr current);
+
+    /// Type of the pass
+    enum PassType { Structural, Contextual };
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef std::map<std::string, ::fwAtoms::Object::sptr > CacheType;
+    typedef std::map< ::fwAtoms::Object::sptr, ::fwAtoms::Object::sptr > NewVersionsType;
+    /**  @} */
+
+    /// Current type of pass during patching.
+    PassType m_pass;
+
+    /// Cache used to store objects which have already been patched (in order to avoid patching the same object twice).
+    CacheType m_cache;
+
+    /// Map used to store the correspondence between an old object and a new one
+    NewVersionsType m_newVersions;
+
+    /// Current object being patched.
+    ::fwAtoms::Object::sptr m_object;
+
+    /// Context where the object is patched.
+    std::string m_context;
+
+    /// Current object version.
+    ::fwAtomsPatch::VersionsGraph::NodeIDType m_currentVersion;
+
+    /// Target version for current object.
+    ::fwAtomsPatch::VersionsGraph::NodeIDType m_targetVersion;
+
+    /// Versions graph.
+    ::fwAtomsPatch::VersionsGraph::sptr m_versionsGraph;
+
+};
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_PATCHER_DEFAULTPATCHER_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/IPatcher.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/IPatcher.hpp
new file mode 100644
index 0000000..bb551ff
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/IPatcher.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_PATCHER_IPATCHER_HPP__
+#define __FWATOMSPATCH_PATCHER_IPATCHER_HPP__
+
+#include <string>
+
+#include <fwTools/Object.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/patcher/factory/new.hpp"
+#include "fwAtomsPatch/patcher/registry/detail.hpp"
+
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtomsPatch/VersionDescriptor.hpp"
+#include "fwAtomsPatch/VersionsGraph.hpp"
+
+#include "fwAtomsPatch/patcher/registry/detail.hpp"
+#include "fwAtomsPatch/patcher/factory/new.hpp"
+
+
+
+#include "fwAtomsPatch/config.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+/**
+ * @class IPatcher
+ * @brief Base class of all patchers
+ */
+class FWATOMSPATCH_CLASS_API IPatcher : public ::fwTools::Object
+{
+
+public:
+
+    /// Factory key used by IPatcher implementations 
+    typedef ::fwAtomsPatch::patcher::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwAtomsPatch::patcher::registry::get()->addFactory(functorKey, &::fwAtomsPatch::patcher::factory::New<T>);
+        }
+    };
+
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro((IPatcher)(::fwTools::Object));
+    fwCoreAllowSharedFromThis();
+
+    /// Constructor
+    FWATOMSPATCH_API IPatcher();
+
+    /// Destructor
+    FWATOMSPATCH_API virtual ~IPatcher();
+
+    /// Transform the specified object
+    FWATOMSPATCH_API virtual ::fwAtoms::Object::sptr transformObject(::fwAtoms::Object::sptr object,
+            const std::string &context,
+            const std::string &currentVersion,
+            const std::string &targetVersion)=0;
+
+};
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_PATCHER_IPATCHER_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/namespace.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/namespace.hpp
new file mode 100644
index 0000000..4e5118e
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/namespace.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_FACTORY_NAMESPACE_HPP__
+#define __FWATOMSPATCH_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+/**
+ * @brief       Contains fwAtomsPatch::factory utilities
+ * @namespace   factory
+ * 
+ * @date        2009-2013
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/new.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/new.hpp
new file mode 100644
index 0000000..ff45f99
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/factory/new.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_FACTORY_NEW_HPP__
+#define __FWATOMSPATCH_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+#include "fwAtomsPatch/patcher/registry/detail.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+class IPatcher;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwAtomsPatch::patcher::factory::New();
+
+    Key(){};
+};
+
+
+FWATOMSPATCH_API SPTR(::fwAtomsPatch::patcher::IPatcher) New(
+        const ::fwAtomsPatch::patcher::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/detail.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/detail.hpp
new file mode 100644
index 0000000..31dcd82
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/detail.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_REGISTRY_DETAIL_HPP__
+#define __FWATOMSPATCH_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+class IPatcher;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwAtomsPatch::patcher::IPatcher) () , KeyType > Type;
+
+FWATOMSPATCH_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCHE_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/macros.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/macros.hpp
new file mode 100644
index 0000000..ceb1ce6
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/macros.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_REGISTRY_MACRO_HPP__
+#define __FWATOMSPATCH_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwAtomsPatch/patcher/registry/detail.hpp"
+
+namespace fwAtomsPatch
+{
+
+
+namespace patcher
+{
+
+namespace registry
+{
+
+#define patcherRegisterMacro( classname, objectKey )                                  \
+    static ::fwAtomsPatch::patcher::IPatcher::Registrar< classname >                  \
+    BOOST_PP_CAT(s__factory__record__object__, __LINE__) ( objectKey ) ;
+
+} // namespace registry
+
+} // namespace pacther
+
+} // namespace fwAtomsPatch
+
+#endif /*__FWATOMSPATCH_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/namespace.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/namespace.hpp
new file mode 100644
index 0000000..d6aefec
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/patcher/registry/namespace.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_REGISTRY_NAMESPACE_HPP__
+#define __FWATOMSPATCH_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+/**
+ * @brief       fwAtomsPatch fwAtomsPatch::registry details
+ * @namespace   registry
+ * 
+ * @date        2009-2013
+ *
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+#endif /* __FWATOMSPATCH_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/types.hpp b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/types.hpp
new file mode 100644
index 0000000..1928fac
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/include/fwAtomsPatch/types.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSPATCH_TYPES_HPP__
+#define __FWATOMSPATCH_TYPES_HPP__
+
+#include <string>
+
+#include <fwAtomConversion/DataVisitor.hpp>
+
+#include "fwAtomsPatch/config.hpp"
+
+namespace fwAtomsPatch
+{
+    /// Key used in object meta infos to define an object classname.
+    static const std::string s_OBJ_CLASSNAME = ::fwAtomConversion::DataVisitor::CLASSNAME_METAINFO;
+
+    /// Key used in object meta infos to define an object version.
+    static const std::string s_OBJ_VERSION = "object_version";
+
+    /// Key used in object meta infos to define an object ID.
+    static const std::string s_OBJ_ID  = ::fwAtomConversion::DataVisitor::ID_METAINFO;
+
+} // namespace fwAtomsPatch
+
+#endif // __FWATOMSPATCH_TYPES_HPP__
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IPatch.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IPatch.cpp
new file mode 100644
index 0000000..2f4307e
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IPatch.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/IPatch.hpp"
+
+namespace fwAtomsPatch
+{
+
+IPatch::IPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IPatch::~IPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IPatch::IPatch( const IPatch &cpy )
+{
+    m_originClassname =  cpy.getOriginClassname();
+    m_originVersion = cpy.getOriginVersion();
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IPatch::getOriginClassname() const
+{
+    return m_originClassname;
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IPatch::getOriginVersion() const
+{
+    return m_originVersion;
+}
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/ISemanticPatch.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/ISemanticPatch.cpp
new file mode 100644
index 0000000..6f97af4
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/ISemanticPatch.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/ISemanticPatch.hpp"
+#include "fwAtomsPatch/types.hpp"
+
+namespace fwAtomsPatch
+{
+
+ISemanticPatch::ISemanticPatch() : IPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+ISemanticPatch::~ISemanticPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+ISemanticPatch::ISemanticPatch( const ISemanticPatch &cpy ) : IPatch(cpy)
+{
+    m_originClassname = cpy.getOriginClassname();
+    m_originVersion = cpy.getOriginVersion();
+}
+
+// ----------------------------------------------------------------------------
+
+void ISemanticPatch::addContext(const std::string& context,
+                                  const std::string& originVersion,
+                                  const std::string& targetVersion)
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    m_contexts.push_back(Context(context, originVersion, targetVersion));
+}
+
+// ----------------------------------------------------------------------------
+
+bool ISemanticPatch::isApplicable(const std::string& context,
+            const std::string& originVersion,
+            const std::string& targetVersion) const
+{
+    Context c(context, originVersion, targetVersion);
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    ContextVectorType::const_iterator it = std::find(m_contexts.begin(), m_contexts.end(), c);
+    return it != m_contexts.end();
+}
+
+// ----------------------------------------------------------------------------
+
+void ISemanticPatch::apply(const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    OSLM_ASSERT("The type of the previous object ("
+            << ::fwAtomsPatch::helper::getClassname(previous) << "does not match"
+            "the required type (" << m_originClassname << ").",
+            ::fwAtomsPatch::helper::getClassname(previous) == m_originClassname);
+
+    OSLM_ASSERT("The version of the previous object (" << ::fwAtomsPatch::helper::getVersion(previous) <<
+                "does not match the required version (" << m_originVersion << ").",
+                ::fwAtomsPatch::helper::getVersion(previous) == m_originVersion);
+}
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralCreator.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralCreator.cpp
new file mode 100644
index 0000000..7577ed2
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralCreator.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/types.hpp>
+
+#include "fwAtomsPatch/IStructuralCreator.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+
+namespace fwAtomsPatch
+{
+
+IStructuralCreator::IStructuralCreator()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IStructuralCreator::~IStructuralCreator()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IStructuralCreator::IStructuralCreator( const IStructuralCreator &cpy )
+{
+    m_classname =  cpy.getObjectClassname();
+    m_version = cpy.getObjectVersion();
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IStructuralCreator::getObjectVersion() const
+{
+    return m_version;
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IStructuralCreator::getObjectClassname() const
+{
+    return m_classname;
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr IStructuralCreator::createObjBase() const
+{
+    ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::New();
+
+    ::fwAtomsPatch::helper::setClassname(obj, m_classname);
+    ::fwAtomsPatch::helper::setVersion(obj, m_version);
+    ::fwAtomsPatch::helper::generateID( obj );
+
+    // All data objects has a parameter fields
+    fwAtomsPatch::helper::cleanFields( obj );
+
+    return obj;
+}
+
+// ----------------------------------------------------------------------------
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralPatch.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralPatch.cpp
new file mode 100644
index 0000000..26ff130
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/IStructuralPatch.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtomsPatch/types.hpp>
+
+#include "fwAtomsPatch/IStructuralPatch.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+
+namespace fwAtomsPatch
+{
+
+IStructuralPatch::IStructuralPatch() : IPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IStructuralPatch::~IStructuralPatch()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IStructuralPatch::IStructuralPatch( const IStructuralPatch &cpy ) : IPatch(cpy)
+{
+    m_originClassname =  cpy.getOriginClassname();
+    m_targetClassname = cpy.getTargetClassname();
+    m_originVersion = cpy.getOriginVersion();
+    m_targetVersion = cpy.getTargetVersion();
+}
+
+// ----------------------------------------------------------------------------
+
+void IStructuralPatch::updateVersion(::fwAtoms::Object::sptr current)
+{
+    ::fwAtomsPatch::helper::setClassname(current, m_targetClassname);
+    ::fwAtomsPatch::helper::setVersion(current, m_targetVersion);
+}
+
+// ----------------------------------------------------------------------------
+
+void IStructuralPatch::apply(const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    OSLM_ASSERT("The type of the previous object (" << ::fwAtomsPatch::helper::getClassname(previous)
+            << ") does not match the required type (" << m_originClassname << ").",
+            ::fwAtomsPatch::helper::getClassname(previous) == m_originClassname);
+    OSLM_ASSERT("The version of the previous object (" << ::fwAtomsPatch::helper::getVersion(previous)
+            << ") does not match the required version (" << m_originVersion << ").",
+            ::fwAtomsPatch::helper::getVersion(previous) == m_originVersion);
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IStructuralPatch::getTargetClassname() const
+{
+    return m_targetClassname;
+}
+
+// ----------------------------------------------------------------------------
+
+const std::string& IStructuralPatch::getTargetVersion() const
+{
+    return m_targetVersion;
+}
+
+
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/LinkDescriptor.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/LinkDescriptor.cpp
new file mode 100644
index 0000000..5352750
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/LinkDescriptor.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/LinkDescriptor.hpp"
+
+namespace fwAtomsPatch
+{
+
+LinkDescriptor::LinkDescriptor() :
+        m_weight(1), m_context(""), m_originVersion(""), m_targetVersion("")
+{
+}
+
+// ----------------------------------------------------------------------------
+
+LinkDescriptor::LinkDescriptor(const std::string& context, const std::string& originVersion,
+                               const std::string& targetVersion, const std::string& patcher,
+                               LinksType links, int weight) :
+        m_weight(weight), m_context(context), m_originVersion(originVersion), m_targetVersion(targetVersion),
+        m_patcher(patcher), m_links(links)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+LinkDescriptor::~LinkDescriptor()
+{
+}
+
+} //namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/PatchingManager.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/PatchingManager.cpp
new file mode 100644
index 0000000..cc811f3
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/PatchingManager.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Object.hpp>
+
+#include "fwAtomsPatch/infos/log.hpp"
+#include "fwAtomsPatch/VersionsManager.hpp"
+#include "fwAtomsPatch/VersionsGraph.hpp"
+#include "fwAtomsPatch/patcher/IPatcher.hpp"
+#include "fwAtomsPatch/exceptions/MissingInformation.hpp"
+#include "fwAtomsPatch/exceptions/ImpossibleConversion.hpp"
+#include "fwAtomsPatch/PatchingManager.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+PatchingManager::PatchingManager(::fwAtoms::Object::sptr object)
+: m_object(object)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+PatchingManager::~PatchingManager()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr PatchingManager::transformTo(const std::string& newVersion)
+{
+    const std::string& context = m_object->getMetaInfo("context");
+    const std::string& currentVersion = m_object->getMetaInfo("version_name");
+
+    if(currentVersion == newVersion)
+    {
+        OSLM_WARN("Trying to patch an object with the same version (" << currentVersion << ").");
+        return m_object;
+    }
+
+    FW_RAISE_EXCEPTION_IF(
+            ::fwAtomsPatch::exceptions::MissingInformation("Context information is missing."),
+             context.empty());
+
+    FW_RAISE_EXCEPTION_IF(
+            ::fwAtomsPatch::exceptions::MissingInformation("Version information is missing."),
+             currentVersion.empty());
+
+
+    ::fwAtomsPatch::VersionsGraph::sptr versionsGraph;
+    versionsGraph = ::fwAtomsPatch::VersionsManager::getDefault()->getGraph(context);
+
+    FW_RAISE_EXCEPTION_IF( ::fwAtomsPatch::exceptions::ImpossibleConversion(
+            "There is no way to go from version '" + currentVersion + "' to version '" +
+            newVersion + "' for context '" + context +"'."), !versionsGraph);
+
+
+    ::fwAtomsPatch::VersionsGraph::VersionSeriesType series
+             = versionsGraph->shortestPath(currentVersion, newVersion);
+
+    FW_RAISE_EXCEPTION_IF( ::fwAtomsPatch::exceptions::ImpossibleConversion(
+            "There is no way to go from version '" + currentVersion + "' to version '" +
+            newVersion + "' for context '" + context +"'."),
+            series.empty());
+
+    ::fwAtomsPatch::VersionsGraph::NodeIDType currentVersionNode = versionsGraph->getNode(currentVersion);
+
+    ::fwAtomsPatch::patcher::IPatcher::sptr patcher;
+    std::string currentName, targetName;
+
+    SLM_TRACE("[PATCHING] Starting...");
+
+    BOOST_FOREACH(::fwAtomsPatch::VersionsGraph::VersionSeriesType::value_type elt, series)
+    {
+        ::fwAtomsPatch::VersionsGraph::NodeIDType targetVersionNode = elt;
+
+        //Retrieve versions names
+        currentName = versionsGraph->getNode(currentVersionNode).getVersionName();
+        targetName = versionsGraph->getNode(targetVersionNode).getVersionName();
+
+        //Retrieve link
+        const ::fwAtomsPatch::LinkDescriptor& link
+                = versionsGraph->getEdge(currentVersionNode, targetVersionNode);
+
+        //Retrieve patcher
+        patcher = ::fwAtomsPatch::patcher::factory::New(link.getPatcher());
+        OSLM_ASSERT("There is no patcher called \"" << link.getPatcher() << "\".", patcher);
+
+        OSLM_TRACE("[PATCHING] '" << currentName << "' -> '" << targetName << "'.");
+        fwAtomsPatchInfoLogMacro("Begin patcher '" + link.getPatcher() + "'");
+
+        //Patching
+        m_object = patcher->transformObject(m_object, context, currentName, targetName);
+        fwAtomsPatchInfoLogMacro("End patcher '" + link.getPatcher() + "'");
+
+        currentVersionNode = targetVersionNode;
+    }
+
+    m_object->setMetaInfo("version_name", newVersion);
+
+    return m_object;
+}
+
+} //namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/SemanticPatchDB.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/SemanticPatchDB.cpp
new file mode 100644
index 0000000..7b1b2ee
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/SemanticPatchDB.cpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+
+#include "fwAtomsPatch/SemanticPatchDB.hpp"
+#include "fwAtomsPatch/ISemanticPatch.hpp"
+
+namespace fwAtomsPatch
+{
+
+
+SemanticPatchDB::sptr SemanticPatchDB::s_default = ::boost::make_shared<SemanticPatchDB>();
+
+// ----------------------------------------------------------------------------
+
+SemanticPatchDB::SemanticPatchDB()
+{}
+
+// ----------------------------------------------------------------------------
+
+SemanticPatchDB::~SemanticPatchDB()
+{}
+
+// ----------------------------------------------------------------------------
+
+SemanticPatchDB::SemanticPatchDB( const SemanticPatchDB &cpy )
+{}
+
+// ----------------------------------------------------------------------------
+
+void SemanticPatchDB::registerPatch(::fwAtomsPatch::ISemanticPatch::sptr patch)
+{
+    VersionIDType origin = std::make_pair(patch->getOriginClassname(), patch->getOriginVersion());
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    m_patches[origin].push_back(patch);
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtomsPatch::ISemanticPatch::sptr SemanticPatchDB::getPatch(
+        const std::string& context,
+        const std::string& originVersion,
+        const std::string& targetVersion,
+        const std::string& objOriginClassname,
+        const std::string& objOriginVersion) const
+{
+    VersionIDType origin = std::make_pair(objOriginClassname, objOriginVersion);
+
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    PatchesType::const_iterator it = m_patches.find(origin);
+    if(it != m_patches.end())
+    {
+        PatchVectorType::const_iterator itVec;
+        for(itVec = it->second.begin(); itVec != it->second.end(); ++itVec)
+        {
+            if((*itVec)->isApplicable(context, originVersion, targetVersion))
+            {
+                return *itVec;
+            }
+        }
+    }
+
+    return ::fwAtomsPatch::ISemanticPatch::sptr();
+}
+
+// ----------------------------------------------------------------------------
+
+size_t SemanticPatchDB::size() const
+{
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    return m_patches.size();
+}
+
+// ----------------------------------------------------------------------------
+
+SemanticPatchDB::sptr SemanticPatchDB::getDefault()
+{
+    return s_default;
+}
+
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralCreatorDB.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralCreatorDB.cpp
new file mode 100644
index 0000000..b37dbf4
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralCreatorDB.cpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+
+#include "fwAtomsPatch/infos/log.hpp"
+#include "fwAtomsPatch/IStructuralCreator.hpp"
+#include "fwAtomsPatch/StructuralCreatorDB.hpp"
+
+namespace fwAtomsPatch
+{
+
+StructuralCreatorDB::sptr StructuralCreatorDB::s_default = ::boost::make_shared<StructuralCreatorDB>();
+
+void StructuralCreatorDB::registerCreator(::fwAtomsPatch::IStructuralCreator::sptr creator)
+{
+    VersionIDType key = std::make_pair(creator->getObjectClassname(), creator->getObjectVersion());
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    m_creators[key] = creator;
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtomsPatch::IStructuralCreator::sptr StructuralCreatorDB::getCreator(const std::string& classname,
+     const std::string& version)
+{
+    VersionIDType key = std::make_pair(classname, version);
+
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    CreatorsType::const_iterator it = m_creators.find(key);
+    if(it != m_creators.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        return ::fwAtomsPatch::IStructuralCreator::sptr();
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr StructuralCreatorDB::create(const std::string& classname, const std::string& version)
+{
+    ::fwAtomsPatch::IStructuralCreator::sptr creator = this->getCreator( classname, version );
+    OSLM_ASSERT( "object creator of type '"<< classname <<"' and version '"<< version <<"' not found", creator );
+    fwAtomsPatchInfoLogMacro("Create '" + classname + "|" + version + "'");
+    ::fwAtoms::Object::sptr obj = creator->create();
+    return obj;
+}
+
+// ----------------------------------------------------------------------------
+
+size_t StructuralCreatorDB::size() const
+{
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    return m_creators.size();
+}
+
+
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralPatchDB.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralPatchDB.cpp
new file mode 100644
index 0000000..468716d
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/StructuralPatchDB.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+
+#include "fwAtomsPatch/StructuralPatchDB.hpp"
+
+namespace fwAtomsPatch
+{
+
+StructuralPatchDB::sptr StructuralPatchDB::s_default = ::boost::make_shared<StructuralPatchDB>();
+
+void StructuralPatchDB::registerPatch(::fwAtomsPatch::IStructuralPatch::sptr patch)
+{
+    VersionIDType source = std::make_pair(patch->getOriginClassname(), patch->getOriginVersion());
+    VersionIDType target = std::make_pair(patch->getTargetClassname(), patch->getTargetVersion());
+    PatchKeyType key = std::make_pair(source, target);
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    m_patches[key] = patch;
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtomsPatch::IStructuralPatch::sptr StructuralPatchDB::getPatch(const std::string& originClassname,
+    const std::string& originVersion,
+    const std::string& targetClassname,
+    const std::string& targetVersion) const
+{
+    const VersionIDType source = std::make_pair(originClassname, originVersion);
+    const VersionIDType target = std::make_pair(targetClassname, targetVersion);
+    const PatchKeyType key = std::make_pair(source, target);
+
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    PatchesType::const_iterator it = m_patches.find(key);
+    if(it != m_patches.end())
+    {
+        return it->second;
+    }
+    else
+    {
+        return ::fwAtomsPatch::IStructuralPatch::sptr();
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+size_t StructuralPatchDB::size() const
+{
+    ::fwCore::mt::ReadLock lock(m_mutex);
+    return m_patches.size();
+}
+
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionDescriptor.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionDescriptor.cpp
new file mode 100644
index 0000000..3cd4786
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionDescriptor.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/VersionDescriptor.hpp"
+
+namespace fwAtomsPatch
+{
+
+VersionDescriptor::VersionDescriptor()
+: m_context(""), m_versionName("")
+{
+}
+
+// ----------------------------------------------------------------------------
+
+VersionDescriptor::VersionDescriptor(
+        const std::string& context, const std::string& versionName, const VersionsType& versions)
+: m_context(context), m_versionName(versionName), m_versions(versions)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+VersionDescriptor::~VersionDescriptor()
+{
+}
+
+} //namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsGraph.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsGraph.cpp
new file mode 100644
index 0000000..8ecaee0
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsGraph.cpp
@@ -0,0 +1,246 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <boost/graph/graph_traits.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/breadth_first_search.hpp>
+#include <fwCore/spyLog.hpp>
+
+#include "fwAtomsPatch/exceptions/UnknownVersion.hpp"
+
+#include "fwAtomsPatch/VersionsGraph.hpp"
+
+namespace fwAtomsPatch
+{
+
+class VertexVisitor : public boost::default_bfs_visitor
+{
+public:
+
+    VertexVisitor(std::vector< std::string >* vector): m_vector(vector)
+    {
+    }
+
+    void discover_vertex(VersionsGraph::NodeIDType n, VersionsGraph::GraphType g)
+    {
+        m_vector->push_back( g[n].getVersionName());
+    }
+
+protected:
+  std::vector< std::string >* m_vector;
+};
+
+VersionsGraph::VersionsGraph()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::~VersionsGraph()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsGraph::addNode(NodeType node)
+{
+    ::fwCore::mt::WriteLock lock(m_nodesMutex);
+    NodeIDType newNode = this->createOrUpdateNode(node);
+    m_nodes[node] = newNode;
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsGraph::addEdge(EdgeType edge)
+{
+    ::fwCore::mt::WriteLock lock(m_edgesMutex);
+    EdgeIDType newEdge = this->createEdge(edge);
+    m_edges[edge] = newEdge;
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::VersionSeriesType VersionsGraph::shortestPath(const std::string& origin,
+                                                    const std::string& target)
+{
+    NodeIDType originID = this->getNode(origin);
+    NodeIDType targetID = this->getNode(target);
+    return this->shortestPath(this->getNode(originID), this->getNode(targetID));
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::VersionSeriesType VersionsGraph::shortestPath(const NodeType& origin, const NodeType& target)
+{
+    VersionSeriesType serie;
+
+    ::fwCore::mt::ReadLock nodesLock(m_nodesMutex);
+    ::fwCore::mt::ReadLock graphLock(m_graphMutex);
+
+    std::vector< NodeIDType > predecessor( ::boost::num_vertices(m_graph) );
+    std::vector< int > distances( ::boost::num_vertices(m_graph) );
+
+    const NodeIDType& vOrig = m_nodes[origin];
+    ::boost::dijkstra_shortest_paths(m_graph, vOrig,
+            ::boost::weight_map(get(&EdgeType::m_weight, m_graph))
+            .predecessor_map(&predecessor[0])
+            .distance_map(::boost::make_iterator_property_map(distances.begin(), ::boost::get(::boost::vertex_index, m_graph )))
+            );
+
+    NodeIDType current = m_nodes[target];
+
+    while(current != predecessor[current])
+    {
+        serie.insert(serie.begin(), current);
+        current = predecessor[current];
+    }
+
+    return serie;
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::NodeType VersionsGraph::getNode(const NodeIDType& nodeID)
+{
+    ::fwCore::mt::ReadLock lock(m_graphMutex);
+    return m_graph[nodeID];
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::NodeIDType VersionsGraph::getNode(const std::string& name) const
+{
+    ::fwCore::mt::ReadLock lock(m_nodesMutex);
+    ExistingNodesType::const_iterator it;
+    for(it = m_nodes.begin(); it != m_nodes.end(); ++it)
+    {
+        if(it->first.getVersionName() == name)
+        {
+            break;
+        }
+    }
+
+    if(it == m_nodes.end())
+    {
+        throw ::fwAtomsPatch::exceptions::UnknownVersion("There is no version named \"" + name + "\".");
+    }
+
+    return it->second;
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::EdgeType VersionsGraph::getEdge(const NodeIDType& origin, const NodeIDType& target)
+{
+    EdgeIDType edgeID;
+    bool success = false;
+    ::fwCore::mt::ReadLock lock(m_graphMutex);
+    ::boost::tie(edgeID,success) = ::boost::edge(origin, target, m_graph);
+    OSLM_ASSERT("There is no edge between '" << m_graph[origin].getVersionName() <<"' and '"
+            << m_graph[target].getVersionName() << "'.", success);
+    return m_graph[edgeID];
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::LinkedVersionType VersionsGraph::getLinkedVersion(
+        const NodeIDType& originID, const NodeIDType& targetID, LinkDescriptor::VersionIDType current)
+{
+    NodeType origin = this->getNode(originID);
+    NodeType target = this->getNode(targetID);
+    EdgeType edge = this->getEdge(originID, targetID);
+
+    bool success = false;
+    LinkDescriptor::VersionIDType result;
+    LinkDescriptor::LinksType::const_iterator linkIt;
+
+    //Explicit
+    const LinkDescriptor::LinksType& links = edge.getLinks();
+    linkIt = links.find(current);
+    if(linkIt != links.end())
+    {
+        result = linkIt->second;
+        success = true;
+    }
+    //Implicit
+    else
+    {
+        VersionDescriptor::VersionsType::const_iterator versIt;
+        VersionDescriptor::VersionsType::const_iterator versItEnd = target.getVersions().end();
+        for(versIt = target.getVersions().begin(); versIt != versItEnd; ++versIt)
+        {
+            //Same type
+            if(current.first == versIt->first)
+            {
+                result = *versIt;
+                success = true;
+                break;
+            }
+        }
+    }
+
+    return std::make_pair(result, success);
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::NodeIDType VersionsGraph::createOrUpdateNode(const NodeType& node)
+{
+    ExistingNodesType::const_iterator cIt = m_nodes.find(node);
+    if(cIt != m_nodes.end())
+    {
+        return cIt->second;
+    }
+    else
+    {
+        ::fwCore::mt::WriteLock lock(m_graphMutex);
+        NodeIDType v = ::boost::add_vertex(m_graph);
+        m_graph[v] = node;
+        return v;
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::EdgeIDType VersionsGraph::createEdge(const EdgeType& edge)
+{
+    NodeIDType origin = this->getNode(edge.getOriginVersion());
+    NodeIDType target = this->getNode(edge.getTargetVersion());
+
+    EdgeIDType newEdge;
+    bool success = false;
+    ::fwCore::mt::ReadLock lock(m_graphMutex);
+    ::boost::tie(newEdge, success) = ::boost::add_edge(origin,target,edge,m_graph);
+
+    OSLM_ASSERT("Unable to create the edge between '" << edge.getOriginVersion() << "' "
+            "and '" << edge.getTargetVersion() << "'", success);
+
+    return newEdge;
+}
+
+// ----------------------------------------------------------------------------
+
+std::vector< std::string > VersionsGraph::getConnectedVersions(const std::string &currentVersion)
+{
+    std::vector< std::string > vector;
+    VertexVisitor vis(&vector);
+    try
+    {
+        ::fwCore::mt::ReadLock lock(m_graphMutex);
+        VersionsGraph::NodeIDType nodeId = this->getNode(currentVersion);
+        ::boost::breadth_first_search( m_graph, nodeId, ::boost::visitor(vis) );
+        vector.erase(vector.begin());
+    }
+    catch ( ::fwAtomsPatch::exceptions::UnknownVersion & )
+    {}
+
+    return vector;
+}
+
+
+} // fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsManager.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsManager.cpp
new file mode 100644
index 0000000..b949ced
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/VersionsManager.cpp
@@ -0,0 +1,254 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+
+#include <boost/foreach.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/exceptions.hpp>
+
+#include <camp/class.hpp>
+
+#include <fwCore/spyLog.hpp>
+
+#include "fwAtomsPatch/VersionsManager.hpp"
+#include "fwAtomsPatch/exceptions/MissingInformation.hpp"
+#include "fwAtomsPatch/exceptions/BadExtension.hpp"
+#include "fwAtomsPatch/types.hpp"
+
+
+
+namespace fwAtomsPatch {
+
+std::string getValue(const ::boost::property_tree::ptree& node, const std::string& name,
+                     const ::boost::filesystem::path& filePath )
+{
+    std::string value;
+    try
+    {
+        value = node.get< std::string >(name);
+    }
+    catch( ::boost::property_tree::ptree_bad_path & )
+    {
+        FW_RAISE_EXCEPTION(::fwAtomsPatch::exceptions::MissingInformation(
+                               name + " information are missing in '"+ filePath.string() +"'."));
+    }
+
+    return value;
+}
+
+SPTR(VersionsManager) VersionsManager::s_default = ::boost::make_shared<VersionsManager>();
+
+// ----------------------------------------------------------------------------
+
+VersionsManager::VersionsManager()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsManager::~VersionsManager()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsManager::buildVersionTable(const std::string& dirPath)
+{
+    ::fwCore::mt::WriteLock lock(m_versionMutex);
+    for (::boost::filesystem::recursive_directory_iterator end, dir(dirPath); dir != end; ++dir)
+    {
+        if(  !::boost::filesystem::is_directory(*dir)
+          && ::boost::filesystem::extension(*dir) == ".versions")
+        {
+            m_versionTable.push_back((*dir).path());
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsManager::buildLinkTable(const std::string& dirPath)
+{
+    ::fwCore::mt::WriteLock lock(m_linkMutex);
+    for ( ::boost::filesystem::recursive_directory_iterator end, dir(dirPath);
+        dir != end; ++dir )
+    {
+        if(  !::boost::filesystem::is_directory(*dir)
+          && ::boost::filesystem::extension(*dir) == ".graphlink")
+        {
+            m_linkTable.push_back((*dir).path());
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsManager::generateNewFile(const ::boost::filesystem::path& filePath,
+                                      const std::string& context, const std::string& versionName)
+{
+    FW_RAISE_EXCEPTION_IF( ::fwAtomsPatch::exceptions::BadExtension(".versions file required"),
+            filePath.extension() != ".versions");
+
+    namespace pt = ::boost::property_tree;
+    std::size_t classCount = ::camp::classCount();
+    pt::ptree root;
+
+    root.put("context", context);
+    root.put("version_name", versionName);
+
+    pt::ptree versions;
+    for (int i = 0; i < classCount; ++i)
+    {
+        const ::camp::Class& metaclass = ::camp::classByIndex(i);
+        const std::string& className = metaclass.name();
+
+        if (metaclass.hasTag(::fwAtomsPatch::s_OBJ_VERSION))
+        {
+            const ::camp::Value& value = metaclass.tag(::fwAtomsPatch::s_OBJ_VERSION);
+            versions.put(className, value.to<std::string>());
+        }
+    }
+
+    root.push_back( pt::ptree::value_type("versions", pt::ptree(versions)));
+    pt::json_parser::write_json(filePath.string(), root);
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtomsPatch::VersionDescriptor VersionsManager::getVersion(const ::boost::filesystem::path& filePath)
+{
+    FW_RAISE_EXCEPTION_IF( ::fwAtomsPatch::exceptions::BadExtension(".versions file required"),
+            filePath.extension() != ".versions");
+
+    namespace pt = ::boost::property_tree;
+    pt::ptree root;
+
+    ::fwAtomsPatch::VersionDescriptor::VersionsType versionids;
+
+    std::ifstream file(filePath.string().c_str());
+    std::istream input(file.rdbuf());
+    pt::json_parser::read_json(input, root);
+    const std::string& context = getValue(root, "context", filePath);
+    const std::string& versionName = getValue(root, "version_name", filePath);
+
+    BOOST_FOREACH(pt::ptree::value_type &node, root.get_child("versions"))
+    {
+        versionids[node.first] = std::string(node.second.data().c_str());
+    }
+
+    file.close();
+
+    return ::fwAtomsPatch::VersionDescriptor(context, versionName, versionids);
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtomsPatch::LinkDescriptor VersionsManager::getLink(const ::boost::filesystem::path& filePath)
+{
+    FW_RAISE_EXCEPTION_IF( ::fwAtomsPatch::exceptions::BadExtension(".graphlink file required"),
+            filePath.extension() != ".graphlink");
+
+    namespace pt = ::boost::property_tree;
+    typedef std::vector< std::pair< std::string, std::string > > LinkType;
+
+    LinkType link;
+    ::fwAtomsPatch::LinkDescriptor::LinksType links;
+    pt::ptree root;
+
+    std::ifstream file(filePath.string().c_str());
+    std::istream input(file.rdbuf());
+    pt::json_parser::read_json(input, root);
+
+    const std::string& context = getValue(root, "context", filePath);
+    const std::string& originVersion = getValue(root, "origin_version", filePath);
+    const std::string& targetVersion = getValue(root, "target_version", filePath);
+
+    const std::string& patcher = root.get("patcher", "DefaultPatcher");
+
+    BOOST_FOREACH(pt::ptree::value_type &child, root.get_child("links"))
+    {
+        BOOST_FOREACH(pt::ptree::value_type &node, (child.second).get_child(""))
+        {
+            link.push_back(std::make_pair(node.first, node.second.data()));
+        }
+
+        FW_RAISE_EXCEPTION_IF(::fwAtomsPatch::exceptions::MissingInformation(
+                        "A link should contain an origin version and a target version."), link.size() != 2);
+
+        links[link[0]] = link[1];
+
+        // Clear the vector
+        LinkType().swap(link);
+    }
+
+    file.close();
+
+    return ::fwAtomsPatch::LinkDescriptor(context, originVersion, targetVersion, patcher, links);
+}
+
+// ----------------------------------------------------------------------------
+
+void VersionsManager::generateVersionsGraph()
+{
+    {
+        ::fwCore::mt::ReadLock versionLock(m_versionMutex);
+        //For every versions
+        BOOST_FOREACH(VersionsManager::ListPathType::value_type elt, m_versionTable)
+        {
+            ::fwAtomsPatch::VersionDescriptor version = VersionsManager::getVersion(elt);
+
+            if(m_versionsGraphMap.find(version.getContext()) == m_versionsGraphMap.end())
+            {
+                m_versionsGraphMap[version.getContext()] = VersionsGraph::New();
+            }
+
+            m_versionsGraphMap[version.getContext()]->addNode(version);
+        }
+    }
+
+    {
+        ::fwCore::mt::ReadLock linkLock(m_linkMutex);
+        //For every links
+        BOOST_FOREACH(VersionsManager::ListPathType::value_type elt, m_linkTable)
+        {
+            ::fwAtomsPatch::LinkDescriptor link = VersionsManager::getLink(elt);
+
+            OSLM_ASSERT("There is no graph created for the context \"" << link.getContext() << "\".",
+                        m_versionsGraphMap.find(link.getContext()) != m_versionsGraphMap.end());
+
+            m_versionsGraphMap[link.getContext()]->addEdge(link);
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+VersionsGraph::sptr VersionsManager::getGraph(const std::string& context)
+{
+    VersionsGraph::sptr vg;
+
+    ::fwCore::mt::ReadToWriteLock lock(m_graphMutex);
+    if (m_versionsGraphMap.empty())
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+        VersionsManager::generateVersionsGraph();
+    }
+
+    VersionsGraphMapType::iterator elem = m_versionsGraphMap.find(context);
+    if (elem != m_versionsGraphMap.end())
+    {
+        vg = elem->second;
+    }
+
+    return vg;
+}
+
+} // namespace fwAtomsPatch
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/Abstract.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/Abstract.cpp
new file mode 100644
index 0000000..888bc64
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/Abstract.cpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwAtomsPatch/conditions/Abstract.hpp"
+
+namespace fwAtomsPatch
+{
+namespace conditions
+{
+
+Abstract::Abstract(::fwAtoms::Base::sptr defaultValue)
+    : m_defaultValue(defaultValue){}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr Abstract::getDefaultValue()
+{
+    return m_defaultValue;
+}
+
+// ----------------------------------------------------------------------------
+
+bool Abstract::test(::fwAtoms::Base::sptr old, ::fwAtoms::Base::sptr newValue)
+{
+    return true;
+}
+
+// ----------------------------------------------------------------------------
+
+bool Abstract::test(::fwAtoms::Base::sptr value)
+{
+    return true;
+}
+
+} //conditions
+
+} //fwAtomsPatch
+
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/NumericOverflow.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/NumericOverflow.cpp
new file mode 100644
index 0000000..52004df
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/conditions/NumericOverflow.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+
+#include "fwAtomsPatch/infos/log.hpp"
+#include "fwAtomsPatch/conditions/NumericOverflow.hpp"
+
+
+namespace fwAtomsPatch
+{
+namespace conditions
+{
+
+NumericOverflow::NumericOverflow(::fwAtoms::Base::sptr defaultValue) : Abstract(defaultValue)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void NumericOverflow::setTreshold(::fwAtoms::Numeric::sptr treshold)
+{
+    m_treshold = treshold;
+}
+
+// ----------------------------------------------------------------------------
+
+bool NumericOverflow::test(::fwAtoms::Base::sptr old,
+                     ::fwAtoms::Base::sptr newValue)
+{
+    return this->test(newValue);
+}
+
+// ----------------------------------------------------------------------------
+
+bool NumericOverflow::test(::fwAtoms::Base::sptr value)
+{
+    if(value->isNumeric())
+    {
+        ::fwAtoms::Numeric::sptr numeric =  ::fwAtoms::Numeric::dynamicCast(value);
+        return numeric->getValue<double>() <= m_treshold->getValue<double>();
+    }
+    else
+    {
+        fwAtomsPatchErrorLogMacro("the value is not a numeric");
+        return false;
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+
+NumericOverflow::sptr NumericOverflow::New(::fwAtoms::Base::sptr defaultValue)
+{
+    NumericOverflow::sptr valueSptr(new NumericOverflow(defaultValue));
+    return valueSptr;
+}
+
+} //conditions
+} //fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/BadExtension.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/BadExtension.cpp
new file mode 100644
index 0000000..c392227
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/BadExtension.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/exceptions/BadExtension.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+BadExtension::BadExtension(const std::string& message) : ::fwAtomsPatch::exceptions::Base(message)
+{
+
+}
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/Base.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/Base.cpp
new file mode 100644
index 0000000..a2d0dea
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/Base.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwAtomsPatch/exceptions/Base.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+
+Base::Base(const std::string& message) : ::fwCore::Exception(message)
+{
+}
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/ImpossibleConversion.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/ImpossibleConversion.cpp
new file mode 100644
index 0000000..090f3be
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/ImpossibleConversion.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/exceptions/ImpossibleConversion.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+ImpossibleConversion::ImpossibleConversion(const std::string& message) : ::fwAtomsPatch::exceptions::Base(message)
+{
+
+}
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/MissingInformation.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/MissingInformation.cpp
new file mode 100644
index 0000000..e4e1c21
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/MissingInformation.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/exceptions/MissingInformation.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+MissingInformation::MissingInformation(const std::string& message) : ::fwAtomsPatch::exceptions::Base(message)
+{
+
+}
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/UnknownVersion.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/UnknownVersion.cpp
new file mode 100644
index 0000000..1733bed
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/exceptions/UnknownVersion.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/exceptions/UnknownVersion.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace exceptions
+{
+
+UnknownVersion::UnknownVersion(const std::string& message) : ::fwAtomsPatch::exceptions::Base(message)
+{
+
+}
+
+} // namespace exceptions
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/Object.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/Object.cpp
new file mode 100644
index 0000000..df29a92
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/Object.cpp
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/infos/log.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+
+namespace fwAtomsPatch
+{
+namespace helper
+{
+
+Object::Object(::fwAtoms::Object::sptr metaObject) : m_object(metaObject)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+Object::~Object()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void Object::addAttribute(const std::string& name,
+                ::fwAtoms::Base::sptr value,
+                conditions::Abstract::sptr condition)
+{
+    if(m_object->getAttributes().find(name) == m_object->getAttributes().end())
+    {
+        if(condition->test(value))
+        {
+            m_object->setAttribute(name, value);
+            fwAtomsPatchAddAttributeLogMacro("'"
+                    + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                    + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+        }
+    }
+    else
+    {
+        fwAtomsPatchErrorLogMacro("Attribute '" + name + "' already exists");
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void Object::addOrReplaceAttribute(const std::string& name,
+                ::fwAtoms::Base::sptr value,
+                conditions::Abstract::sptr condition)
+{
+    if(m_object->getAttributes().find(name) != m_object->getAttributes().end())
+    {
+        m_object->eraseAttribute(name);
+        fwAtomsPatchEraseAttributeLogMacro("'"
+                + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+    }
+
+    if(condition->test(value))
+    {
+        m_object->setAttribute(name, value);
+        fwAtomsPatchAddAttributeLogMacro("'"
+                + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void Object::removeAttribute(const std::string& name,
+                        conditions::Abstract::sptr condition)
+{
+    ::fwAtoms::Object::AttributesType::const_iterator it = m_object->getAttributes().find(name);
+
+    if(it != m_object->getAttributes().end())
+    {
+        if(condition->test(it->second))
+        {
+            m_object->eraseAttribute(name);
+            fwAtomsPatchEraseAttributeLogMacro("'"
+                    + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                    + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+        }
+    }
+    else
+    {
+        fwAtomsPatchErrorLogMacro("Missing attribute '" + name + "'");
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void Object::replaceAttribute(const std::string& name,
+                          ::fwAtoms::Base::sptr newValue,
+                          conditions::Abstract::sptr condition)
+{
+    ::fwAtoms::Object::AttributesType::const_iterator cIt = m_object->getAttributes().find(name);
+
+    if(cIt != m_object->getAttributes().end())
+    {
+        fwAtomsPatchReplaceAttributeLogMacro("'"
+                + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+
+        if(condition->test(cIt->second, newValue))
+        {
+            m_object->setAttribute(name, newValue);
+        }
+        else
+        {
+            m_object->setAttribute(name, condition->getDefaultValue());
+            fwAtomsPatchOutOfRangeLogMacro("Value '" + name
+                                + "' is out of range, using default value : '"
+                                + condition->getDefaultValue()->getString() + "'");
+        }
+    }
+    else
+    {
+        fwAtomsPatchErrorLogMacro("Missing attribute '" + name + "'");
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void Object::renameAttribute(const std::string& name, const std::string& newName,
+                             conditions::Abstract::sptr condition)
+{
+    ::fwAtoms::Object::AttributesType::const_iterator it = m_object->getAttributes().find(name);
+
+    if(it != m_object->getAttributes().end())
+    {
+        if(condition->test(it->second))
+        {
+            ::fwAtoms::Base::sptr base = m_object->getAttribute(name);
+            fwAtomsPatchEraseAttributeLogMacro("'"
+                    + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                    + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + name + "'");
+            fwAtomsPatchAddAttributeLogMacro("'"
+                    + ::fwAtomsPatch::helper::getClassname(m_object) + "|"
+                    + ::fwAtomsPatch::helper::getVersion(m_object) + "' : '" + newName + "'");
+            m_object->setAttribute(newName, base);
+            m_object->eraseAttribute(name);
+        }
+    }
+    else
+    {
+        fwAtomsPatchErrorLogMacro("Missing attribute '" + name + "'");
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Object::getObject() const
+{
+    return m_object;
+}
+
+} //helper
+} //fwAtomHelper
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/functions.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/functions.cpp
new file mode 100644
index 0000000..6d87d3c
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/helper/functions.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/types.hpp"
+
+namespace fwAtomsPatch
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+std::string getClassname( const ::fwAtoms::Object::sptr & obj )
+{
+    return obj->getMetaInfo( ::fwAtomsPatch::s_OBJ_CLASSNAME );
+}
+
+//-----------------------------------------------------------------------------
+
+void setClassname( const ::fwAtoms::Object::sptr & obj, const std::string & newClassname )
+{
+    obj->setMetaInfo( ::fwAtomsPatch::s_OBJ_CLASSNAME, newClassname );
+}
+
+//-----------------------------------------------------------------------------
+
+std::string getVersion( const ::fwAtoms::Object::sptr & obj )
+{
+    return obj->getMetaInfo( ::fwAtomsPatch::s_OBJ_VERSION );
+}
+
+//-----------------------------------------------------------------------------
+
+void setVersion( const ::fwAtoms::Object::sptr & obj, const std::string & newVersion )
+{
+    obj->setMetaInfo( ::fwAtomsPatch::s_OBJ_VERSION, newVersion );
+}
+
+//-----------------------------------------------------------------------------
+
+void generateID( const ::fwAtoms::Object::sptr & obj )
+{
+    obj->setMetaInfo( fwAtomsPatch::s_OBJ_ID, ::fwTools::UUID::generateUUID() );
+}
+
+//-----------------------------------------------------------------------------
+
+void cleanFields( const ::fwAtoms::Object::sptr & obj )
+{
+    obj->setAttribute("fields", ::fwAtoms::Map::New());
+}
+
+//-----------------------------------------------------------------------------
+
+void changeUID( const ::fwAtoms::Object::sptr & obj )
+{
+    BOOST_FOREACH( const ::fwAtoms::Object::AttributesType::value_type& elem, obj->getAttributes() )
+    {
+        if ( elem.second )
+        {
+            switch ( elem.second->type() )
+            {
+            case ::fwAtoms::Base::SEQUENCE :
+            {
+                changeSeqUID( ::fwAtoms::Sequence::dynamicCast( elem.second ) );
+                break;
+            }
+            case ::fwAtoms::Base::MAP :
+            {
+                changeMapUID( ::fwAtoms::Map::dynamicCast( elem.second ) );
+                break;
+            }
+            case ::fwAtoms::Base::OBJECT :
+            {
+                changeUID( ::fwAtoms::Object::dynamicCast( elem.second ) );
+                break;
+            }
+            default :
+                break;
+            }
+        }
+    }
+
+    ::fwAtomsPatch::helper::generateID( obj );
+}
+
+//-----------------------------------------------------------------------------
+
+void changeMapUID( const ::fwAtoms::Map::sptr & map )
+{
+    BOOST_FOREACH( ::fwAtoms::Map::ValueType elem, map->getValue() )
+    {
+        if ( elem.second )
+        {
+            switch ( elem.second->type() )
+            {
+            case ::fwAtoms::Base::SEQUENCE :
+            {
+                changeSeqUID( ::fwAtoms::Sequence::dynamicCast( elem.second ) );
+                break;
+            }
+            case ::fwAtoms::Base::MAP :
+            {
+                changeMapUID( ::fwAtoms::Map::dynamicCast( elem.second ) );
+                break;
+            }
+            case ::fwAtoms::Base::OBJECT :
+            {
+                changeUID( ::fwAtoms::Object::dynamicCast( elem.second ) );
+                break;
+            }
+            default :
+                break;
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void changeSeqUID( const ::fwAtoms::Sequence::sptr & seq )
+{
+    BOOST_FOREACH( ::fwAtoms::Base::sptr elem, seq->getValue() )
+    {
+        if ( elem )
+        {
+            switch ( elem->type() )
+            {
+            case ::fwAtoms::Base::SEQUENCE :
+            {
+                changeSeqUID( ::fwAtoms::Sequence::dynamicCast( elem ) );
+                break;
+            }
+            case ::fwAtoms::Base::MAP :
+            {
+                changeMapUID( ::fwAtoms::Map::dynamicCast( elem ) );
+                break;
+            }
+            case ::fwAtoms::Base::OBJECT :
+            {
+                changeUID( ::fwAtoms::Object::dynamicCast( elem ) );
+                break;
+            }
+            default :
+                break;
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} //helper
+} //fwAtomHelper
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/infos/Logger.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/infos/Logger.cpp
new file mode 100644
index 0000000..6cba854
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/infos/Logger.cpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/log/attributes.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/sources/channel_logger.hpp>
+#include <boost/log/trivial.hpp>
+#include <boost/log/sinks.hpp>
+#include <boost/parameter/keyword.hpp>
+#include <boost/log/keywords/channel.hpp>
+#include <boost/log/utility/setup/common_attributes.hpp>
+#include <boost/log/sources/global_logger_storage.hpp>
+#include <boost/log/utility/setup/file.hpp>
+#include <boost/log/expressions/formatters/date_time.hpp>
+#include <boost/log/support/date_time.hpp>
+
+#include "fwAtomsPatch/infos/Logger.hpp"
+
+namespace fwAtomsPatch
+{
+namespace infos
+{
+
+Logger::StreamPtrType Logger::s_stream = ::boost::make_shared< Logger::StreamType >();
+Logger Logger::s_logger;
+
+BOOST_LOG_GLOBAL_LOGGER(lg_channel,
+                        ::boost::log::sources::channel_logger<std::string>);
+
+BOOST_LOG_GLOBAL_LOGGER_CTOR_ARGS(lg_channel,
+                                  ::boost::log::sources::channel_logger_mt<std::string>,
+                                   (std::string("patch")));
+
+
+Logger::Logger()
+{
+    namespace expr = ::boost::log::expressions;
+    namespace keywords = ::boost::log::keywords;
+
+    ::boost::log::add_file_log (
+                // file name pattern
+                keywords::file_name = "PATCH.log",
+                // rotate files every 10 MiB...
+                keywords::rotation_size = 10 * 1024 * 1024,
+                // ...or at midnight
+                keywords::time_based_rotation = ::boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
+                // log record format
+                keywords::format = (
+                        expr::stream
+                        << "[" << expr::format_date_time< ::boost::posix_time::ptime >("TimeStamp", "%d.%m.%Y %H:%M:%S.%f")
+                        << "][" << expr::format_date_time< ::boost::posix_time::ptime >("Uptime", "%H:%M:%S.%f")
+                        << "][" << expr::attr< std::string >("Channel")
+                        << "] " << expr::smessage
+                ),
+                // auto-flush feature of the backend
+                keywords::auto_flush = true,
+                keywords::filter = (expr::attr< std::string >("Channel") == "patch")
+    );
+
+    // Construct the sink
+    typedef ::boost::log::sinks::synchronous_sink< ::boost::log::sinks::text_ostream_backend > text_sink;
+    boost::shared_ptr< text_sink > pSink = boost::make_shared< text_sink >();
+
+    // Add a stream to write log to
+    pSink->locked_backend()->add_stream(s_stream);
+
+    // Register the sink in the logging core
+    ::boost::log::core::get()->add_sink(pSink);
+}
+
+// ----------------------------------------------------------------------------
+
+Logger::~Logger()
+{}
+
+// ----------------------------------------------------------------------------
+
+Logger::StreamPtrType Logger::getStream()
+{
+    return s_stream;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::error(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "PATCH_ERROR" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::badCast(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "BADCAST" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::outOfRange(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "OUTOFRANGE" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::info(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "INFO" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::addAttribute(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "ADD_ATTR" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::eraseAttribute(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "ERASE_ATTR" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+void Logger::replaceAttribute(const std::string& message)
+{
+    BOOST_LOG_STREAM(lg_channel::get()) << "REPLACE_ATTR" << ": " << message;
+}
+
+// ----------------------------------------------------------------------------
+
+} //infos
+} //fwAtomHelper
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/DefaultPatcher.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/DefaultPatcher.cpp
new file mode 100644
index 0000000..3eead31
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/DefaultPatcher.cpp
@@ -0,0 +1,334 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+
+#include "fwAtomsPatch/infos/log.hpp"
+#include "fwAtomsPatch/types.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/VersionsManager.hpp"
+#include "fwAtomsPatch/IPatch.hpp"
+#include "fwAtomsPatch/IStructuralPatch.hpp"
+#include "fwAtomsPatch/StructuralPatchDB.hpp"
+#include "fwAtomsPatch/ISemanticPatch.hpp"
+#include "fwAtomsPatch/SemanticPatchDB.hpp"
+#include "fwAtomsPatch/patcher/registry/macros.hpp"
+#include "fwAtomsPatch/patcher/DefaultPatcher.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+patcherRegisterMacro(::fwAtomsPatch::patcher::DefaultPatcher, "DefaultPatcher");
+
+DefaultPatcher::DefaultPatcher(::fwAtomsPatch::patcher::IPatcher::Key key)
+{
+}
+
+//----------------------------------------------------------------------------
+
+DefaultPatcher::~DefaultPatcher()
+{
+}
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DefaultPatcher::transformObject(::fwAtoms::Object::sptr object,
+        const std::string &context,
+        const std::string &currentVersion,
+        const std::string &targetVersion)
+{
+    m_object = object;
+    m_context = context;
+    m_versionsGraph = ::fwAtomsPatch::VersionsManager::getDefault()->getGraph(context);
+    m_currentVersion = m_versionsGraph->getNode(currentVersion);
+    m_targetVersion = m_versionsGraph->getNode(targetVersion);
+
+    fwAtomsPatchInfoLogMacro("Transform from version '"
+            + m_versionsGraph->getNode(m_currentVersion).getVersionName() + "' to '"
+            + m_versionsGraph->getNode(m_targetVersion).getVersionName() + "' in context '"
+            + m_context + "'");
+    fwAtomsPatchInfoLogMacro("Begin structural pass");
+
+    // Structural
+    m_newVersions.clear();
+    m_cache.clear();
+    m_pass = Structural;
+    this->processStructuralObject(m_object);
+    fwAtomsPatchInfoLogMacro("End structural pass");
+
+    // Contextual
+    fwAtomsPatchInfoLogMacro("Begin contextual pass");
+    m_cache.clear();
+    m_pass = Contextual;
+    ::fwAtoms::Object::sptr obj = this->processContextualObject(m_object);
+    fwAtomsPatchInfoLogMacro("End contextual pass");
+
+    return obj;
+}
+
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DefaultPatcher::processStructuralObject(::fwAtoms::Object::sptr current)
+{
+    CacheType::const_iterator cIt = m_cache.find(current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID ));
+
+    // If the object has not been processed yet.
+    if(cIt == m_cache.end())
+    {
+        ::fwAtoms::Object::sptr newAtomObject = ::fwAtoms::Object::New();
+
+        // Cache update
+        m_cache[current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID )] = newAtomObject;
+        m_newVersions[current] = newAtomObject;
+
+        // Set id
+        newAtomObject->setMetaInfo( ::fwAtomsPatch::s_OBJ_ID,
+                current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID ));
+
+        // Set meta Info
+        newAtomObject->setMetaInfos(current->getMetaInfos());
+
+        // Fetch all attributes and affect them in the new object.
+        BOOST_FOREACH( ::fwAtoms::Object::AttributesType::value_type elem, current->getAttributes() )
+        {
+            newAtomObject->setAttribute(elem.first, processBase(elem.second));
+        }
+
+        return this->applyStructuralPatch(current, newAtomObject);
+    }
+    // If the object has already been processed.
+    else
+    {
+        return cIt->second;
+    }
+}
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DefaultPatcher::processContextualObject(::fwAtoms::Object::sptr current)
+{
+    CacheType::const_iterator cIt = m_cache.find(current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID ));
+
+    // If the object has not been processed yet.
+    if(cIt == m_cache.end())
+    {
+        // Cache update
+        m_cache[current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID )] = m_newVersions[current];
+
+        // Fetch all attributes and affect them in the new object.
+        BOOST_FOREACH( ::fwAtoms::Object::AttributesType::value_type elem, current->getAttributes() )
+        {
+            if ( elem.second )
+            {
+                if(elem.second->isObject())
+                {
+                    ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast(elem.second);
+                    m_newVersions[obj] = this->processContextualObject(obj);
+                }
+                else
+                {
+                    this->processBase(elem.second);
+                }
+            }
+        }
+
+        return this->applyContextualPatch(current, m_newVersions[current]);
+    }
+    // If the object has already been processed.
+    else
+    {
+        return m_cache[current->getMetaInfo( ::fwAtomsPatch::s_OBJ_ID )];
+    }
+}
+
+//  ----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr DefaultPatcher::processBase(::fwAtoms::Base::sptr base)
+{
+    ::fwAtoms::Base::sptr newBase;
+
+    if ( ! base )
+    {
+        return newBase;
+    }
+
+    if(base->isObject())
+    {
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast(base);
+        if(m_pass == Structural)
+        {
+            newBase = this->processStructuralObject(obj);
+        }
+        else
+        {
+            newBase = this->processContextualObject(obj);
+        }
+    }
+    else if(base->isSequence())
+    {
+        ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::dynamicCast(base);
+        newBase = this->processSequence(seq);
+    }
+    else if(base->isMapping())
+    {
+        ::fwAtoms::Map::sptr map = ::fwAtoms::Map::dynamicCast(base);
+        newBase = this->processMapping(map);
+    }
+    else if(base->isString())
+    {
+        newBase = ::fwAtoms::String::New(base->getString());
+    }
+    else if(base->isNumeric())
+    {
+        newBase = ::fwAtoms::Numeric::New(base->getString());
+    }
+    else if(base->isBoolean())
+    {
+        newBase = ::fwAtoms::Boolean::New(base->getString());
+    }
+    else if(base->isBlob())
+    {
+        ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::dynamicCast(base);
+        newBase = ::fwAtoms::Blob::New(blob->getBufferObject());
+    }
+
+
+    return newBase;
+}
+
+//  ----------------------------------------------------------------------------
+
+::fwAtoms::Map::sptr DefaultPatcher::processMapping(::fwAtoms::Map::sptr map)
+{
+    ::fwAtoms::Map::sptr newMap = ::fwAtoms::Map::New();
+
+    // Fetch all attributes and affect them in the new object
+    std::string key;
+    ::fwAtoms::Base::sptr value;
+
+    BOOST_FOREACH( ::fwAtoms::Map::MapType::value_type elem, map->getValue() )
+    {
+        key = elem.first;
+        value = elem.second;
+
+        newMap->insert( key, this->processBase(value) );
+    }
+
+    return newMap;
+}
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Sequence::sptr DefaultPatcher::processSequence(::fwAtoms::Sequence::sptr seq)
+{
+    ::fwAtoms::Sequence::sptr newSeq = ::fwAtoms::Sequence::New();
+
+    // Fetch all attributes and affect them in the new object
+    BOOST_FOREACH( ::fwAtoms::Base::sptr elem, seq->getValue() )
+    {
+        newSeq->push_back(this->processBase(elem));
+    }
+
+    return newSeq;
+}
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DefaultPatcher::applyStructuralPatch(
+        ::fwAtoms::Object::sptr previous, ::fwAtoms::Object::sptr current)
+{
+    if(previous)
+    {
+        // Get new version of the object.
+        fwAtomsPatch::LinkDescriptor::VersionIDType currentInfos;
+        bool success;
+        const std::string& classname = ::fwAtomsPatch::helper::getClassname(current);
+        const std::string& version = ::fwAtomsPatch::helper::getVersion(current);
+
+        ::boost::tie(currentInfos,success) = m_versionsGraph->getLinkedVersion(
+                m_currentVersion, m_targetVersion,
+                std::make_pair(classname, version) );
+
+        if(success)
+        {
+            // Get patch
+            ::fwAtomsPatch::IStructuralPatch::sptr patch = ::fwAtomsPatch::StructuralPatchDB::getDefault()->getPatch(
+                    classname, version, currentInfos.first, currentInfos.second);
+
+            if(patch)
+            {
+                OSLM_TRACE("[SP] " << classname);
+                fwAtomsPatchInfoLogMacro("Apply structural patch to transform '" + classname
+                                                                + "|" + version + "' to '"
+                                  + currentInfos.first + "|" + currentInfos.second + "'");
+                // Applying a patch on current (the current object is modified)
+                patch->apply(previous, current, m_newVersions);
+                fwAtomsPatchInfoLogMacro("End structural patch");
+            }
+            else
+            {
+                fwAtomsPatchInfoLogMacro("Move object '" + classname + "|" + version + "' to '"
+                               + currentInfos.first + "|" + currentInfos.second + "'");
+                ::fwAtomsPatch::helper::setClassname(current, currentInfos.first);
+                ::fwAtomsPatch::helper::setVersion(current, currentInfos.second);
+            }
+        }
+        else
+        {
+            fwAtomsPatchErrorLogMacro("No linked version found for object '" + classname
+                                                             + "' with version '" + version + "'");
+        }
+    }
+
+    return current;
+}
+
+//----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr DefaultPatcher::applyContextualPatch(
+        ::fwAtoms::Object::sptr previous, ::fwAtoms::Object::sptr current)
+{
+    if(previous)
+    {
+        const std::string currentName = m_versionsGraph->getNode(m_currentVersion).getVersionName();
+        const std::string targetName = m_versionsGraph->getNode(m_targetVersion).getVersionName();
+
+        // Get patch
+        ::fwAtomsPatch::SemanticPatchDB::sptr contextDB = ::fwAtomsPatch::SemanticPatchDB::getDefault();
+        ::fwAtomsPatch::ISemanticPatch::sptr patch =
+                contextDB->getPatch(m_context, currentName, targetName,
+                         ::fwAtomsPatch::helper::getClassname(previous),
+                         ::fwAtomsPatch::helper::getVersion(previous));
+
+        if(patch)
+        {
+            OSLM_TRACE("[CP] " << ::fwAtomsPatch::helper::getClassname(current));
+            fwAtomsPatchInfoLogMacro("Apply contextual patch to transform '"
+                    + ::fwAtomsPatch::helper::getClassname(previous)
+                    + "|" + ::fwAtomsPatch::helper::getVersion(previous) + "' to '"
+                    + ::fwAtomsPatch::helper::getClassname(current)
+                    + "|" + ::fwAtomsPatch::helper::getVersion(current) + "'");
+
+            // Applying a patch on current (the current object is modified)
+            patch->apply(previous, current, m_newVersions);
+            fwAtomsPatchInfoLogMacro("End contextual patch");
+        }
+    }
+
+    return current;
+}
+
+} //  namespace patcher
+
+} //  namespace fwAtomsPatch
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/IPatcher.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/IPatcher.cpp
new file mode 100644
index 0000000..c1f2625
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/IPatcher.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwAtomsPatch/patcher/IPatcher.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+IPatcher::IPatcher()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+IPatcher::~IPatcher()
+{
+}
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/factory/new.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/factory/new.cpp
new file mode 100644
index 0000000..c0d7713
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/factory/new.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwAtomsPatch/patcher/factory/new.hpp"
+
+#include "fwAtomsPatch/patcher/IPatcher.hpp"
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+namespace factory
+{
+
+SPTR(::fwAtomsPatch::patcher::IPatcher) New( const ::fwAtomsPatch::patcher::registry::KeyType & classname )
+{
+    return ::fwAtomsPatch::patcher::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+
diff --git a/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/registry/detail.cpp b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/registry/detail.cpp
new file mode 100644
index 0000000..0511785
--- /dev/null
+++ b/SrcLib/core/fwAtomsPatch/src/fwAtomsPatch/patcher/registry/detail.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwAtomsPatch/patcher/registry/detail.hpp"
+
+
+namespace fwAtomsPatch
+{
+
+namespace patcher
+{
+
+namespace registry
+{
+
+struct FwDataRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwDataRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace patcher
+
+} // namespace fwAtomsPatch
+
+
diff --git a/SrcLib/core/fwCamp/CMakeLists.txt b/SrcLib/core/fwCamp/CMakeLists.txt
new file mode 100644
index 0000000..7c3708f
--- /dev/null
+++ b/SrcLib/core/fwCamp/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package (CAMP REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS}
+    ${CAMP_INCLUDE_DIR}
+    )
+fwLink(
+    ${CAMP_LIBRARIES}
+    )
+
diff --git a/SrcLib/core/fwCamp/Properties.cmake b/SrcLib/core/fwCamp/Properties.cmake
new file mode 100644
index 0000000..07a89e1
--- /dev/null
+++ b/SrcLib/core/fwCamp/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwCamp )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCamp/bin/build.options b/SrcLib/core/fwCamp/bin/build.options
new file mode 100644
index 0000000..77addec
--- /dev/null
+++ b/SrcLib/core/fwCamp/bin/build.options
@@ -0,0 +1,7 @@
+TYPE = 'shared'
+VERSION = '0.1'
+
+USE = ['boost', 'camp']
+LIB = [
+        'fwCore_0-1',
+      ]
diff --git a/SrcLib/core/fwCamp/include/fwCamp/Mapper/ArrayMapper.hpp b/SrcLib/core/fwCamp/include/fwCamp/Mapper/ArrayMapper.hpp
new file mode 100644
index 0000000..c50fc40
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/Mapper/ArrayMapper.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_MAPPER_ARRAYMAPPER_HPP__
+#define __FWCAMP_MAPPER_ARRAYMAPPER_HPP__
+
+#include <set>
+
+#include <camp/valuemapper.hpp>
+#include <camp/type.hpp>
+#include <camp/camptype.hpp>
+
+namespace camp_ext
+{
+/*
+ * Specialization of ArrayMapper for std::set
+ */
+template <typename T>
+struct ArrayMapper<std::set<T> >
+{
+    typedef T ElementType;
+
+    static bool dynamic()
+    {
+        return true;
+    }
+
+    static std::size_t size(const std::set<T>& arr)
+    {
+        return arr.size();
+    }
+
+    static const T& get(const std::set<T>& arr, std::size_t index)
+    {
+        typename std::set<T>::const_iterator cIt = arr.begin();
+        for(int i =0;i < index; i++)
+        {
+            ++cIt;
+        }
+        return *cIt;
+    }
+
+    static void set(std::set<T>& arr, std::size_t index, const T& value)
+    {
+    }
+
+    static void insert(std::set<T>& arr, std::size_t before, const T& value)
+    {
+        arr.insert(value);
+    }
+
+    static void remove(std::set<T>& arr, std::size_t index)
+    {
+        typename std::set<T>::const_iterator cIt = arr.begin();
+        for(int i =0;i < index; ++i)
+        {
+            ++cIt;
+        }
+        arr.erase(cIt);
+    }
+};
+
+
+} //camp_ext
+
+
+#endif /* __FWCAMP_MAPPER_ARRAYMAPPER_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/Mapper/ValueMapper.hpp b/SrcLib/core/fwCamp/include/fwCamp/Mapper/ValueMapper.hpp
new file mode 100644
index 0000000..3b56ceb
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/Mapper/ValueMapper.hpp
@@ -0,0 +1,253 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_VALUEMAPPER_HPP__
+#define __FWCAMP_VALUEMAPPER_HPP__
+
+#include <boost/lexical_cast.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/logic/tribool.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <camp/valuemapper.hpp>
+#include <camp/type.hpp>
+#include <camp/camptype.hpp>
+
+namespace camp_ext
+{
+
+template <>
+struct ValueMapper< ::boost::uint64_t>
+{
+    // The corresponding CAMP type is "string"
+    static const int type = camp::intType;
+
+    // Convert from MyStringClass to std::string
+    static std::string to(const ::boost::uint64_t& source)
+    {
+        return boost::lexical_cast<std::string>(source);
+    }
+
+    // Convert from any type to MyStringClass
+    // Be smart, just reuse ValueMapper<std::string> :)
+    template <typename T>
+    static ::boost::uint64_t from(const T& source)
+    {
+        return boost::lexical_cast< ::boost::uint64_t>(source);
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+template<typename T>
+struct wrapperTribbol
+{
+    static ::boost::logic::tribool get(const T& source)
+    {
+        return ::boost::logic::tribool();
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+template<>
+struct wrapperTribbol<std::string >
+{
+    static ::boost::logic::tribool get(const std::string& source)
+    {
+        ::boost::logic::tribool value;
+
+        if (source.compare("true") == 0)
+        {
+            value = true;
+        }
+        else if (source.compare("false") == 0)
+        {
+            value = false;
+        }
+        else
+        {
+            value = boost::logic::indeterminate;
+        }
+
+        return value;
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+template <>
+struct ValueMapper< ::boost::logic::tribool>
+{
+    // The corresponding CAMP type is "string"
+    static const int type = camp::stringType;
+
+    // Convert from MyStringClass to std::string
+    static std::string to(const ::boost::logic::tribool& source)
+    {
+        std::string value;
+
+        if (source)
+        {
+            value = "true";
+        }
+        else if (!source)
+        {
+            value = "false";
+        }
+        else
+        {
+            value = "indeterminate";
+        }
+        return value;
+    }
+    template <typename T>
+    static ::boost::logic::tribool from(const T& source)
+    {
+        return wrapperTribbol<T>::get(source);;
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+template <>
+struct ValueMapper< ::boost::posix_time::ptime >
+{
+    typedef boost::posix_time::ptime ReturnType;
+    static const int type = camp::stringType;
+    static const std::string to(const ReturnType& source)
+    {
+        return boost::posix_time::to_simple_string(source);
+    }
+
+    static ReturnType from(bool source)                    {CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));}
+    static ReturnType from(long source)                    {CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));}
+    static ReturnType from(double source)                  {CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const camp::EnumObject& source) {CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const camp::UserObject& source) {CAMP_ERROR(camp::BadType(camp::userType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const std::string& source)
+    {
+        return boost::posix_time::time_from_string(source);
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+template <>
+struct ValueMapper< ::boost::filesystem::path >
+{
+    typedef ::boost::filesystem::path ReturnType;
+    static const int type = camp::stringType;
+    static const std::string to(const ReturnType& source)
+    {
+        return source.string();
+    }
+
+    static ReturnType from(bool source)
+    {
+        CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(long source)
+    {
+        CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(double source)
+    {
+        CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const camp::EnumObject& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const camp::UserObject& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::userType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const std::string& source)
+    {
+        return ::boost::filesystem::path(source);
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+/*
+ * Specialization of ValueMapper for unsigned char
+ */
+template <>
+struct ValueMapper<unsigned char>
+{
+    static const int type = camp::stringType;
+    static std::string to(unsigned char source)
+    {
+        unsigned int intValue = boost::numeric_cast<unsigned int>(source);;
+
+        return boost::lexical_cast<std::string>(intValue);
+    }
+
+    static unsigned char from(bool source)                    {return static_cast<unsigned char>(source);}
+    static unsigned char from(long source)                    {return static_cast<unsigned char>(source);}
+    static unsigned char from(double source)                  {return static_cast<unsigned char>(source);}
+    static unsigned char from(const std::string& source)
+    {
+        unsigned int intValue = boost::lexical_cast<unsigned int>(source);
+        return boost::numeric_cast<unsigned char>(intValue);
+    }
+    static unsigned char from(const camp::EnumObject& source) {return static_cast<unsigned char>(source.value());}
+    static unsigned char from(const camp::UserObject&)        {CAMP_ERROR(camp::BadType(camp::userType, camp::realType));}
+};
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+struct ValueMapper<boost::shared_ptr<T> >
+{
+    typedef boost::shared_ptr<T> ReturnType;
+    static const int type = camp::userType;
+    static const camp::UserObject to(const ReturnType& source)
+    {
+        return camp::UserObject(source);
+    }
+
+    static ReturnType from(bool source)
+    {
+        CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(long source)
+    {
+        CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(double source)
+    {
+        CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const std::string& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::stringType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const camp::EnumObject& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));
+    }
+    static ReturnType from(const camp::UserObject& source)
+    {
+        ReturnType result;
+        try
+        {
+            T* ptr = source.get< T* >();
+            result = T::dynamicCast(ptr->getSptr());
+        }
+        catch(...)
+        {
+            boost::shared_ptr<T> tmp;
+            return tmp;
+        }
+        return result;
+    }
+};
+}  // namespace camp_ext
+
+#endif /* __FWCAMP_VALUEMAPPER_HPP__ */
+
diff --git a/SrcLib/core/fwCamp/include/fwCamp/UserObject.hpp b/SrcLib/core/fwCamp/include/fwCamp/UserObject.hpp
new file mode 100644
index 0000000..a42de0d
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/UserObject.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_USEROBJECT_HPP__
+#define __FWCAMP_USEROBJECT_HPP__
+
+#include <camp/userobject.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwCamp/factory/new.hpp"
+#include "fwCamp/registry/detail.hpp"
+
+namespace fwCamp
+{
+
+/**
+ * @brief Helper to register and manage the conversion between an fwData::Object and a camp::userObject
+ */
+template<typename T>
+struct UserObjectRegistrar
+{
+    /**
+     * @brief Register an object of type name in factory.
+     */
+    UserObjectRegistrar( const std::string &name )
+    {
+        ::fwCamp::registry::get()->addFactory(name, &::fwCamp::factory::New<T>);
+    }
+};
+
+}
+
+#endif
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/ExtendedClassVisitor.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/ExtendedClassVisitor.hpp
new file mode 100644
index 0000000..64bf6e2
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/ExtendedClassVisitor.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_EXTENDEDCLASSVISITOR_HPP__
+#define __FWCAMP_CAMP_EXTENDEDCLASSVISITOR_HPP__
+
+#include <camp/classvisitor.hpp>
+#include "fwCamp/camp/MapProperty.hpp"
+#include "fwCamp/config.hpp"
+
+namespace camp
+{
+
+class FWCAMP_CLASS_API ExtendedClassVisitor : public ClassVisitor
+{
+public:
+
+    virtual void visit(const Property& property){ClassVisitor::visit(property);};
+    virtual void visit(const SimpleProperty& property){ClassVisitor::visit(property);};
+    virtual void visit(const ArrayProperty& property){ClassVisitor::visit(property);};
+    virtual void visit(const EnumProperty& property){ClassVisitor::visit(property);};
+    virtual void visit(const UserProperty& property){ClassVisitor::visit(property);};
+    virtual void visit(const Function& function){ClassVisitor::visit(function);};
+
+
+    FWCAMP_API virtual void visit(const MapProperty& property){}
+
+
+};
+
+
+} //camp
+
+#endif /* __FWCAMP_CAMP_EXTENDEDCLASSVISITOR_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/MapMapper.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/MapMapper.hpp
new file mode 100644
index 0000000..aba90bb
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/MapMapper.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_MAPMAPPER_HPP__
+#define __FWCAMP_CAMP_MAPMAPPER_HPP__
+
+#include <boost/utility/enable_if.hpp>
+#include "fwCamp/camp/traits.hpp"
+
+namespace camp_ext
+{
+
+template <typename T, typename C = void>
+struct MapMapper
+{
+};
+
+template <typename MAP>
+struct MapMapper< MAP , typename boost::enable_if_c<camp::isMapping<MAP>::value>::type >
+{
+   typedef MAP MapType;
+   typedef typename MapType::value_type ValueType;
+   typedef typename MapType::key_type KeyType;
+   typedef typename MapType::mapped_type MappedType;
+
+
+   static std::size_t size(const MapType& map)
+   {
+       return map.size();
+   }
+
+   static const ValueType& get(const MapType& map, std::size_t index)
+   {
+       typename MapType::const_iterator it = map.begin();
+       std::advance(it, index);
+       return *it;
+   }
+
+   static void set(MapType& map, const KeyType & key, const MappedType& value)
+   {
+       map[key] = value;
+   }
+};
+
+}  // namespace camp_ext
+
+
+
+
+#endif /* __FWCAMP_CAMP_MAPMAPPER_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/MapProperty.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/MapProperty.hpp
new file mode 100644
index 0000000..8d3ec53
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/MapProperty.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_MAPPROPERTY_HPP__
+#define __FWCAMP_CAMP_MAPPROPERTY_HPP__
+
+#include <camp/property.hpp>
+#include <camp/value.hpp>
+#include <camp/userobject.hpp>
+#include <camp/camptype.hpp>
+
+#include "fwCamp/config.hpp"
+
+namespace camp
+{
+
+class FWCAMP_CLASS_API MapProperty : public Property
+{
+public:
+
+    typedef std::pair< Value, Value > ValuePair;
+    typedef std::pair< UserObject, UserObject> ObjectPair;
+
+    FWCAMP_API MapProperty(const std::string& name, Type elementType);
+    /**
+     * \brief Destructor
+     */
+    FWCAMP_API virtual ~MapProperty();
+
+    /**
+     * \brief Get the type of the map elements
+     *
+     * \return Type of elements
+     */
+    FWCAMP_API Type elementType() const;
+
+    /**
+     * \brief Do the actual reading of the value
+     *
+     * This function is a pure virtual which has to be implemented in derived classes.
+     *
+     * \param object Object
+     *
+     * \return Value of the property
+     */
+    FWCAMP_API virtual Value getValue(const UserObject& object) const;
+
+    /**
+     * \brief Do the actual writing of the value
+     *
+     * This function is a pure virtual which has to be implemented in derived classes.
+     *
+     * \param object Object
+     * \param value New value to assign to the property
+     */
+    FWCAMP_API virtual void setValue(const UserObject& object, const Value& value) const;
+
+
+    /**
+     * \brief Do the actual retrieval of the size
+     *
+     * \param object Object
+     *
+     * \return Size of the map
+     */
+    FWCAMP_API virtual std::size_t getSize(const UserObject& object) const = 0;
+
+    /**
+     * \brief Accept the visitation of a ClassVisitor
+     *
+     * \param visitor Visitor to accept
+     */
+    FWCAMP_API virtual void accept(ClassVisitor& visitor) const;
+
+    FWCAMP_API virtual ValuePair getElement(const UserObject& object, std::size_t index) const = 0;
+
+    FWCAMP_API virtual void set(const UserObject& object, const Value& key, const Value& value) const = 0;
+
+private:
+
+    Type m_elementType; ///< Type of the individual elements of the map
+};
+
+}  // namespace camp
+
+CAMP_TYPE(camp::MapProperty::ValuePair);
+
+#endif /* __FWCAMP_CAMP_MAPPROPERTY_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/MapValueMapper.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/MapValueMapper.hpp
new file mode 100644
index 0000000..85f790e
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/MapValueMapper.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_MAPVALUEMAPPER_HPP__
+#define __FWCAMP_CAMP_MAPVALUEMAPPER_HPP__
+
+#include <camp/valuemapper.hpp>
+#include "fwCamp/camp/traits.hpp"
+
+namespace camp_ext
+{
+
+template <typename T>
+struct ValueMapper<T, typename boost::enable_if_c<camp::isMapping<T>::value>::type>
+{
+    static const int type = camp::mappingType;
+};
+
+}  // namespace camp_ext
+
+
+
+
+#endif /* __FWCAMP_CAMP_MAPVALUEMAPPER_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/customtype.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/customtype.hpp
new file mode 100644
index 0000000..b0ac780
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/customtype.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_TYPE_HPP__
+#define __FWCAMP_CAMP_TYPE_HPP__
+
+namespace camp
+{
+
+enum CustomType
+{
+    mappingType = 0x404,
+    pairType
+};
+
+} //camp
+
+#endif /* __FWCAMP_CAMP_TYPE_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hpp
new file mode 100644
index 0000000..12bd72f
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_MAPPROPERTYIMPL_HPP__
+#define __FWCAMP_CAMP_MAPPROPERTYIMPL_HPP__
+
+#include "fwCamp/camp/MapValueMapper.hpp"
+#include "fwCamp/camp/MapMapper.hpp"
+#include "fwCamp/camp/MapProperty.hpp"
+
+namespace camp
+{
+namespace detail
+{
+
+template <typename A>
+class MapPropertyImpl : public MapProperty
+{
+public:
+
+    typedef MapProperty::ValuePair ValuePair;
+    typedef MapProperty::ObjectPair ObjectPair;
+
+    /**
+     * \brief Construct the property
+     *
+     * \param name Name of the property
+     * \param accessor Object used to access the actual C++ property
+     */
+    MapPropertyImpl(const std::string& name, const A& accessor);
+
+protected:
+
+    /**
+     * \see ArrayProperty::getSize
+     */
+    virtual std::size_t getSize(const UserObject& object) const;
+
+    MapProperty::ValuePair getElement(const UserObject& object, std::size_t index ) const;
+
+    virtual void set(const UserObject& object, const Value& key, const Value& value) const;
+
+private:
+
+    typedef typename boost::remove_reference<typename A::DataType>::type MapType;
+    typedef camp_ext::MapMapper<MapType> Mapper;
+    typedef typename Mapper::ValueType ValueType;
+
+    /**
+     * \brief Retrieve a reference to the array
+     *
+     * \param object Owner object
+     *
+     * \return Reference to the underlying array
+     */
+    MapType& map(const UserObject& object) const;
+
+    A m_accessor; ///< Object used to access the actual C++ property
+};
+
+
+} // namespace detail
+}  // namespace camp
+
+#include "fwCamp/camp/detail/MapPropertyImpl.hxx"
+
+#endif /* __FWCAMP_CAMP_MAPPROPERTYIMPL_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hxx b/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hxx
new file mode 100644
index 0000000..c2824e7
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/detail/MapPropertyImpl.hxx
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_MAPPROPERTYIMPL_HXX__
+#define __FWCAMP_CAMP_MAPPROPERTYIMPL_HXX__
+
+#include <camp/userobject.hpp>
+
+#include <fwCamp/Mapper/ValueMapper.hpp>
+
+namespace camp
+{
+
+namespace detail
+{
+
+template <typename A>
+MapPropertyImpl<A>::MapPropertyImpl(const std::string& name, const A& accessor) :
+    camp::MapProperty(name, camp::mapType<ValueType>())
+   ,m_accessor(accessor)
+{
+}
+
+template <typename A>
+std::size_t MapPropertyImpl<A>::getSize(const UserObject& object) const
+{
+    return Mapper::size(map(object));
+}
+template <typename A>
+void MapPropertyImpl<A>::set(const UserObject& object, const Value& key, const Value& value) const
+{
+    const typename Mapper::KeyType& typedKey = key.to< typename Mapper::KeyType >();
+    const typename Mapper::MappedType& typedValue = value.to< typename Mapper::MappedType >();
+
+    Mapper::set(map(object), typedKey  ,typedValue );
+}
+
+
+template <typename A>
+MapProperty::ValuePair MapPropertyImpl<A>::getElement(const UserObject& object, std::size_t index ) const
+{
+
+    ValueType p (Mapper::get(map(object),index));
+    return ValuePair(p.first, p.second);
+}
+
+template <typename A>
+typename MapPropertyImpl<A>::MapType&
+MapPropertyImpl<A>::map(const UserObject& object) const
+{
+    return m_accessor.get(object.get<typename A::ClassType>());
+}
+
+/*
+ * Instantiate map properties
+ */
+template <typename A>
+struct PropertyMapper<A, camp::mappingType>
+{
+    typedef MapPropertyImpl<A> Type;
+};
+
+
+} // namespace detail
+} // namespace camp
+
+#endif /* __FWCAMP_CAMP_MAPPROPERTYIMPL_HXX__*/
diff --git a/SrcLib/core/fwCamp/include/fwCamp/camp/traits.hpp b/SrcLib/core/fwCamp/include/fwCamp/camp/traits.hpp
new file mode 100644
index 0000000..81287a5
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/camp/traits.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_CAMP_TRAITS_HPP__
+#define __FWCAMP_CAMP_TRAITS_HPP__
+
+#include <camp/detail/yesnotype.hpp>
+
+namespace camp
+{
+
+
+template <typename T>
+struct isMapping
+{
+    template <typename U> static camp::detail::TypeYes check(typename U::mapped_type*);
+    template <typename U> static camp::detail::TypeNo  check(...);
+
+    //fwData hack to avoid composite passing this test
+    template <typename U> static camp::detail::TypeNo  checkSptr(typename U::sptr*);
+    template <typename U> static camp::detail::TypeYes checkSptr(...);
+
+    enum {value = (
+            sizeof(check< T >(0)) == sizeof(camp::detail::TypeYes)
+            && sizeof(checkSptr< T >(0)) == sizeof(camp::detail::TypeYes)
+            )  };
+};
+
+
+}// namespace camp
+
+
+
+
+#endif /* __FWCAMP_CAMP_TRAITS_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/config.hpp b/SrcLib/core/fwCamp/include/fwCamp/config.hpp
new file mode 100644
index 0000000..8ac261d
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCAMP_CONFIG_HPP_
+#define _FWCAMP_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWCAMP_EXPORTS
+            #define FWCAMP_API __declspec(dllexport)
+        #else
+            #define FWCAMP_API __declspec(dllimport)
+        #endif
+
+        #define FWCAMP_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWCAMP_EXPORTS
+            #define FWCAMP_API __attribute__ ((visibility("default")))
+            #define FWCAMP_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWCAMP_API __attribute__ ((visibility("hidden")))
+            #define FWCAMP_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWCAMP_API
+        #define FWCAMP_CLASS_API
+
+    #endif
+
+#endif //FWCAMP_API
+
diff --git a/SrcLib/core/fwCamp/include/fwCamp/factory/namespace.hpp b/SrcLib/core/fwCamp/include/fwCamp/factory/namespace.hpp
new file mode 100644
index 0000000..60cebaa
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/factory/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_FACTORY_NAMESPACE_HPP__
+#define __FWCAMP_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwCamp
+{
+
+/**
+ * @brief       Contains fwCamp::factory utilities
+ * @namespace   fwCamp::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwCamp
+
+#endif /* __FWCAMP_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCamp/include/fwCamp/factory/new.hpp b/SrcLib/core/fwCamp/include/fwCamp/factory/new.hpp
new file mode 100644
index 0000000..1083446
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/factory/new.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_FACTORY_NEW_HPP__
+#define __FWCAMP_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwCamp/config.hpp"
+#include "fwCamp/registry/detail.hpp"
+
+namespace fwCamp
+{
+namespace factory
+{
+
+FWCAMP_API SPTR( ::camp::UserObject ) New( const ::fwCamp::registry::KeyType & classname, ::fwTools::Object *object);
+
+template<class CLASSNAME > SPTR( ::camp::UserObject )  New(::fwTools::Object *object)
+{
+    SPTR(::camp::UserObject) obj = ::boost::make_shared< ::camp::UserObject >(*(dynamic_cast<CLASSNAME*>( object )));
+    return obj;
+}
+
+} // namespace factory
+} // namespace fwCamp
+
+#endif /* __FWCAMP_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwCamp/include/fwCamp/macros.hpp b/SrcLib/core/fwCamp/include/fwCamp/macros.hpp
new file mode 100644
index 0000000..19a30b6
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/macros.hpp
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP__MACROS_HPP__
+#define __FWCAMP__MACROS_HPP__
+
+#include <boost/preprocessor/seq/fold_left.hpp>
+
+#include <camp/class.hpp>
+#include <camp/camptype.hpp>
+#include <camp/enum.hpp>
+
+#include <fwCore/macros.hpp>
+
+#define __FWCAMP_CAT(_s_, _state_, _elem_) BOOST_PP_CAT(_state_, _elem_)
+#define __FWCAMP_NAMESPACE_CAT(_s_, _state_, _elem_) _state_::_elem_
+
+#define __FWCAMP_FUNC_SUFFIX(desc)\
+    BOOST_PP_SEQ_FOLD_LEFT( __FWCAMP_CAT, BOOST_PP_SEQ_HEAD(desc), BOOST_PP_SEQ_TAIL(desc))
+
+#define __FWCAMP_NAMESPACE_NAME(desc)\
+    ::BOOST_PP_SEQ_FOLD_LEFT( __FWCAMP_NAMESPACE_CAT, BOOST_PP_SEQ_HEAD(desc), BOOST_PP_SEQ_TAIL(desc))
+
+#define __FWCAMP_DECLARE_FUNC_NAME(desc)        BOOST_PP_CAT(fwCampDeclare, __FWCAMP_FUNC_SUFFIX(desc))
+#define __FWCAMP_DECLARE_LOCAL_FUNC_NAME(desc)  BOOST_PP_CAT(localDeclare, __FWCAMP_FUNC_SUFFIX(desc))
+
+#define __FWCAMP_CLASS_BUILDER_TYPE(desc)\
+    camp::ClassBuilder< __FWCAMP_NAMESPACE_NAME(desc) >
+
+#define __FWCAMP_AUTO_TYPE_NONCOPYABLE(type, registerFunc)\
+    CAMP_TYPE_NONCOPYABLE( type)
+
+#define __FWCAMP__AUTO__DECLARE__MACRO(desc) \
+    void __FWCAMP_DECLARE_FUNC_NAME(desc)(__FWCAMP_CLASS_BUILDER_TYPE(desc) &);\
+    inline void __FWCAMP_DECLARE_LOCAL_FUNC_NAME(desc)() \
+    { \
+        __FWCAMP_CLASS_BUILDER_TYPE(desc) builder = camp::Class::declare< __FWCAMP_NAMESPACE_NAME(desc) >(BOOST_PP_STRINGIZE( __FWCAMP_NAMESPACE_NAME(desc) ));\
+        __FWCAMP_DECLARE_FUNC_NAME(desc)(builder);\
+    } \
+    __FWCAMP_AUTO_TYPE_NONCOPYABLE(__FWCAMP_NAMESPACE_NAME(desc), __FWCAMP_DECLARE_LOCAL_FUNC_NAME(desc))
+
+#define __FWCAMP__REG_NAME(desc)\
+        BOOST_PP_CAT(__FWCAMP_FUNC_SUFFIX(desc), Reg)
+
+#define __FWCAMP__USEROBJREG(desc)\
+        ::fwCamp::UserObjectRegistrar< __FWCAMP_NAMESPACE_NAME(desc)>
+//----------------------------------------------------------------------------
+
+
+/**
+ *
+ * desc is a BOOST_PP_SEQ
+ * fwCampMakeFriendMacro((a)(b)(c)) expands to : Friend void ::fwCampDeclareabc(camp::ClassBuilder< ::a::b::c > &builder)
+ */
+#define fwCampMakeFriendDataMacro(desc) \
+    friend void ::__FWCAMP_DECLARE_FUNC_NAME(desc)(__FWCAMP_CLASS_BUILDER_TYPE(desc) &builder);\
+
+//----------------------------------------------------------------------------
+
+#define fwCampMakeFriendMacro(desc) \
+    friend void ::__FWCAMP_DECLARE_FUNC_NAME(desc)(__FWCAMP_CLASS_BUILDER_TYPE(desc) &builder);\
+
+//----------------------------------------------------------------------------
+
+#define fwCampDeclareMacro(classname) \
+    CAMP_TYPE_NONCOPYABLE(classname)
+
+//----------------------------------------------------------------------------
+
+#define fwCampAutoDeclareDataMacro( desc , export) \
+    namespace fwCamp\
+    {\
+        template<typename T>\
+        struct UserObjectRegistrar;\
+    }\
+    fwCorePredeclare(desc) \
+    __FWCAMP__AUTO__DECLARE__MACRO(desc)
+
+//----------------------------------------------------------------------------
+
+#define fwCampAutoDeclareMacro( desc , export) \
+    fwCorePredeclare(desc) \
+    export __FWCAMP__AUTO__DECLARE__MACRO(desc)
+
+//----------------------------------------------------------------------------
+
+
+#define fwCampAutoDeclareEnumMacro(desc) \
+    void __FWCAMP_DECLARE_FUNC_NAME(desc)(camp::EnumBuilder &);\
+    inline void __FWCAMP_DECLARE_LOCAL_FUNC_NAME(desc)() \
+    { \
+        camp::EnumBuilder builder = camp::Enum::declare< __FWCAMP_NAMESPACE_NAME(desc) >(BOOST_PP_STRINGIZE( __FWCAMP_NAMESPACE_NAME(desc) ));\
+        __FWCAMP_DECLARE_FUNC_NAME(desc)(builder);\
+    } \
+    CAMP_TYPE(__FWCAMP_NAMESPACE_NAME(desc))
+
+//----------------------------------------------------------------------------
+
+
+#define fwCampImplementMacro(desc) \
+    void __FWCAMP_DECLARE_FUNC_NAME(desc)(__FWCAMP_CLASS_BUILDER_TYPE(desc) &builder)
+
+//----------------------------------------------------------------------------
+
+
+#define fwCampImplementDataMacro(desc) \
+    static __FWCAMP__USEROBJREG(desc) __FWCAMP__REG_NAME(desc)(BOOST_PP_STRINGIZE( __FWCAMP_NAMESPACE_NAME(desc) ));\
+    void __FWCAMP_DECLARE_FUNC_NAME(desc)(__FWCAMP_CLASS_BUILDER_TYPE(desc) &builder)
+
+//----------------------------------------------------------------------------
+
+
+/**
+ * @brief Implementation of enumeration into camp introspection
+ * @see fwCampAutoDeclareEnumMacro
+ */
+#define fwCampImplementEnumMacro(desc) \
+    void __FWCAMP_DECLARE_FUNC_NAME(desc)(camp::EnumBuilder &builder)
+
+
+
+/**
+ * @brief This macro is used when you want to set a smart pointer into an object
+ * @param object the type of the main object ex: (fwData)(Mesh)
+ * @param attribut the type of smart pointer attribut ex: (fwData)(Array)
+ */
+#define fwCampDeclareAccessor(object, attribut)\
+namespace camp {\
+namespace detail {\
+\
+template <>\
+class Accessor1< __FWCAMP_NAMESPACE_NAME(object), SPTR( __FWCAMP_NAMESPACE_NAME(attribut) )& >\
+{\
+public:\
+    typedef SPTR( __FWCAMP_NAMESPACE_NAME(attribut) )& ReturnType ;\
+    typedef ObjectTraits< SPTR( __FWCAMP_NAMESPACE_NAME(attribut) )& > Traits;\
+    typedef Traits::DataType DataType;\
+    typedef __FWCAMP_NAMESPACE_NAME(object) ClassType;\
+\
+    enum\
+    {\
+        canRead = true,\
+        canWrite = true\
+    };\
+\
+    template <typename F>\
+    Accessor1(F getter)\
+        : m_getter(getter)\
+    {\
+    }\
+\
+    ReturnHelper< ReturnType>::Type get(ClassType& objectptr) const\
+    {\
+        ReturnType ptr = m_getter(objectptr);\
+        return ReturnHelper< ReturnType>::get(ptr);\
+    }\
+\
+    bool set(ClassType& objectptr, const Value& value) const\
+    {\
+        ReturnType ptr = m_getter(objectptr);\
+        ptr = __FWCAMP_NAMESPACE_NAME(attribut)::dynamicCast(value.to< DataType* >()->getSptr());\
+        return true;\
+    }\
+\
+private:\
+\
+    boost::function< ReturnType (ClassType&)> m_getter;\
+};\
+\
+}\
+}
+
+
+
+
+#endif // __FWCAMP__MACROS_HPP__
+
+
+
+
+
+
+
diff --git a/SrcLib/core/fwCamp/include/fwCamp/namespace.hpp b/SrcLib/core/fwCamp/include/fwCamp/namespace.hpp
new file mode 100644
index 0000000..fc65e40
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/namespace.hpp
@@ -0,0 +1,15 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @brief       All necessary for camp binding with simple types.
+ * @namespace   fwCamp
+ * 
+ * @date        2009-2012
+ */
+namespace fwCamp
+{
+}  // namespace fwCamp
diff --git a/SrcLib/core/fwCamp/include/fwCamp/registry/detail.hpp b/SrcLib/core/fwCamp/include/fwCamp/registry/detail.hpp
new file mode 100644
index 0000000..63392da
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/registry/detail.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_REGISTRY_DETAIL_HPP__
+#define __FWCAMP_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwCamp/config.hpp"
+
+fwCorePredeclare((camp)(UserObject));
+fwCorePredeclare((fwTools)(Object));
+
+namespace fwCamp
+{
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::camp::UserObject)(::fwTools::Object*), KeyType > Type;
+
+FWCAMP_API SPTR(Type) get();
+
+} // namespace registry
+} // namespace fwCamp
+
+#endif /* __FWCAMP_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwCamp/include/fwCamp/registry/namespace.hpp b/SrcLib/core/fwCamp/include/fwCamp/registry/namespace.hpp
new file mode 100644
index 0000000..53de9e5
--- /dev/null
+++ b/SrcLib/core/fwCamp/include/fwCamp/registry/namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCAMP_REGISTRY_NAMESPACE_HPP__
+#define __FWCAMP_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwCamp
+{
+
+/**
+ * @brief       Contains fwCamp::registry details
+ * @namespace   fwCamp::registry
+ * 
+ * @date        2009-2012
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwCamp
+
+#endif /* __FWCAMP_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCamp/src/fwCamp/camp/MapProperty.cpp b/SrcLib/core/fwCamp/src/fwCamp/camp/MapProperty.cpp
new file mode 100644
index 0000000..2a05399
--- /dev/null
+++ b/SrcLib/core/fwCamp/src/fwCamp/camp/MapProperty.cpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwCamp/camp/customtype.hpp"
+#include "fwCamp/camp/MapProperty.hpp"
+#include "fwCamp/camp/ExtendedClassVisitor.hpp"
+
+namespace camp
+{
+
+MapProperty::MapProperty(const std::string& name, Type elementType):
+            Property(name, (::camp::Type) mappingType),
+            m_elementType(elementType)
+{}
+
+//-----------------------------------------------------------------------------
+
+MapProperty::~MapProperty()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void MapProperty::accept(ClassVisitor& visitor) const
+{
+    ExtendedClassVisitor* mapVisitor = dynamic_cast< ExtendedClassVisitor*>(&visitor);
+    if (mapVisitor)
+    {
+        mapVisitor->visit(*this);
+    }
+    else
+    {
+        visitor.visit(*this);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+Value MapProperty::getValue(const UserObject& object) const
+{
+    return getElement(object, 0);
+}
+
+//-----------------------------------------------------------------------------
+
+void MapProperty::setValue(const UserObject& object, const Value& value) const
+{
+    //FIXME XXX TODO DO something
+}
+
+//-----------------------------------------------------------------------------
+
+Type MapProperty::elementType() const
+{
+    return m_elementType;
+}
+
+}  // namespace camp
diff --git a/SrcLib/core/fwCamp/src/fwCamp/factory/new.cpp b/SrcLib/core/fwCamp/src/fwCamp/factory/new.cpp
new file mode 100644
index 0000000..d0243ab
--- /dev/null
+++ b/SrcLib/core/fwCamp/src/fwCamp/factory/new.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwCamp/UserObject.hpp"
+#include "fwCamp/factory/new.hpp"
+
+namespace fwCamp
+{
+namespace factory
+{
+
+SPTR( ::camp::UserObject ) New( const ::fwCamp::registry::KeyType & classname, ::fwTools::Object *object )
+{
+    return ::fwCamp::registry::get()->create(classname, object);
+}
+
+} // namespace factory
+} // namespace fwCamp
+
+
diff --git a/SrcLib/core/fwCamp/src/fwCamp/registry/detail.cpp b/SrcLib/core/fwCamp/src/fwCamp/registry/detail.cpp
new file mode 100644
index 0000000..94c8d03
--- /dev/null
+++ b/SrcLib/core/fwCamp/src/fwCamp/registry/detail.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <camp/userobject.hpp>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwCamp/registry/detail.hpp"
+
+namespace fwCamp
+{
+namespace registry
+{
+
+struct FwCampRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwCampRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+} // namespace fwCamp
+
+
diff --git a/SrcLib/core/fwCom/CMakeLists.txt b/SrcLib/core/fwCom/CMakeLists.txt
new file mode 100644
index 0000000..ba6d654
--- /dev/null
+++ b/SrcLib/core/fwCom/CMakeLists.txt
@@ -0,0 +1,11 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(fwCore fwThread)
+
+find_package (Boost COMPONENTS thread REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS} )
+fwLink(${Boost_LIBRARIES})
+
+
+
diff --git a/SrcLib/core/fwCom/COPYING b/SrcLib/core/fwCom/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwCom/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwCom/COPYING.LESSER b/SrcLib/core/fwCom/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwCom/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwCom/Properties.cmake b/SrcLib/core/fwCom/Properties.cmake
new file mode 100644
index 0000000..d132c0d
--- /dev/null
+++ b/SrcLib/core/fwCom/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwCom )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwThread )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCom/bin/build.options b/SrcLib/core/fwCom/bin/build.options
new file mode 100644
index 0000000..2e83913
--- /dev/null
+++ b/SrcLib/core/fwCom/bin/build.options
@@ -0,0 +1,10 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = [
+    'boost',
+    'boostThread',
+    ]
+LIB = [
+    'fwCore_0-1',
+    'fwThread_0-1',
+    ]
diff --git a/SrcLib/core/fwCom/include/fwCom/Connection.hpp b/SrcLib/core/fwCom/include/fwCom/Connection.hpp
new file mode 100644
index 0000000..5175a12
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Connection.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_CONNECTION_HPP__
+#define __FWCOM_CONNECTION_HPP__
+
+#include "fwCom/config.hpp"
+
+#include "fwCom/SlotConnectionBase.hpp"
+
+namespace fwCom
+{
+
+/// Class managing Signal-Slot connections.
+struct Connection
+{
+    /// Class allowing to block a Connection.
+    struct Blocker
+    {
+        Blocker()
+        { }
+
+        Blocker( Connection connection )
+            : m_blocker(connection.getBlocker())
+        { }
+
+        /// Unblock the related Connection.
+        void reset()
+        {
+            m_blocker.reset();
+        }
+
+    protected:
+        SlotConnectionBase::BlockerSptrType m_blocker;
+    };
+
+    Connection()
+    { }
+
+    Connection(const SlotConnectionBase::sptr &connection)
+        :m_connectionBase(connection)
+    {
+    }
+
+    /// Disconnect related Connection.
+    void disconnect()
+    {
+        SlotConnectionBase::sptr connection(m_connectionBase.lock());
+        if(connection)
+        {
+            connection->disconnect();
+        }
+    };
+
+    /// Returns whether this Connection is expired or not.
+    bool expired() const
+    {
+        return m_connectionBase.expired();
+    }
+
+protected:
+
+    /// Returns a Blocker.
+    SlotConnectionBase::BlockerSptrType getBlocker()
+    {
+        SlotConnectionBase::BlockerSptrType blocker;
+        SlotConnectionBase::sptr connection(m_connectionBase.lock());
+        if(connection)
+        {
+            blocker = connection->getBlocker();
+        }
+        return blocker;
+    }
+
+    SlotConnectionBase::wptr m_connectionBase;
+
+};
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_CONNECTION_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/HasSignals.hpp b/SrcLib/core/fwCom/include/fwCom/HasSignals.hpp
new file mode 100644
index 0000000..105b405
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/HasSignals.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_HASIGNALS_HPP__
+#define __FWCOM_HASIGNALS_HPP__
+
+#include "fwCom/config.hpp"
+#include "fwCom/Signals.hpp"
+
+namespace fwCom
+{
+
+struct SignalBase;
+
+/**
+ * @class   HasSignals
+ * @brief   This class proposes a mapping between a SignalKeyType and a SignalBase.
+ * @date   2012.
+ */
+class HasSignals
+{
+
+public:
+
+    typedef ::boost::shared_ptr< HasSignals > sptr;
+
+    HasSignals(){}
+
+    SPTR( SignalBase ) signal( const Signals::SignalKeyType & key ) const
+    {
+        return m_signals[key];
+    }
+
+    template< typename SignalType >
+    SPTR( SignalType ) signal( const Signals::SignalKeyType & key ) const
+    {
+        SPTR( SignalType ) Signal = ::boost::dynamic_pointer_cast< SignalType >( this->signal(key) );
+        return Signal;
+    }
+
+
+protected:
+
+    /// Copy constructor forbidden
+    HasSignals( const HasSignals& );
+
+    /// Copy operator forbiden
+    HasSignals& operator=( const HasSignals& );
+
+    Signals m_signals;
+};
+
+} // namespace fwCom
+
+#endif // __FWCOM_HASIGNALS_HPP__
diff --git a/SrcLib/core/fwCom/include/fwCom/HasSlots.hpp b/SrcLib/core/fwCom/include/fwCom/HasSlots.hpp
new file mode 100644
index 0000000..b4fdaf8
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/HasSlots.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_HASSLOTS_HPP__
+#define __FWCOM_HASSLOTS_HPP__
+
+#include "fwCom/config.hpp"
+#include "fwCom/Slots.hpp"
+
+namespace fwCom
+{
+
+struct SlotBase;
+
+/**
+ * @class   HasSlots
+ * @brief   This class proposes a mapping between a SlotKeyType and a SlotBase.
+ * @date   2012.
+ */
+class HasSlots
+{
+
+public:
+
+    typedef ::boost::shared_ptr< HasSlots > sptr;
+
+    HasSlots(){}
+
+    SPTR( SlotBase ) slot( const Slots::SlotKeyType & key ) const
+    {
+        return m_slots[key];
+    }
+
+    template< typename SlotType >
+    SPTR( SlotType ) slot( const Slots::SlotKeyType & key ) const
+    {
+        SPTR( SlotType ) slot = ::boost::dynamic_pointer_cast< SlotType >( this->slot(key) );
+        return slot;
+    }
+
+
+protected:
+
+    /// Copy constructor forbidden
+    HasSlots( const HasSlots& );
+
+    /// Copy operator forbiden
+    HasSlots& operator=( const HasSlots& );
+
+    Slots m_slots;
+};
+
+} // namespace fwCom
+
+#endif // __FWCOM_HASSLOTS_HPP__
diff --git a/SrcLib/core/fwCom/include/fwCom/Signal.hpp b/SrcLib/core/fwCom/include/fwCom/Signal.hpp
new file mode 100644
index 0000000..5bf6c4b
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Signal.hpp
@@ -0,0 +1,737 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SIGNAL_HPP__
+#define __FWCOM_SIGNAL_HPP__
+
+#include <list>
+#include <map>
+#include <utility>
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwCom/SignalBase.hpp"
+
+namespace fwCom
+{
+
+struct SlotConnectionBase;
+struct SlotBase;
+
+template < typename F >
+struct Signal;
+
+template < typename F >
+struct SlotRun;
+
+/**
+ * @brief Signal implementation.
+ * Template parameter T must always be void.
+ */
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct Signal< R ( A1, A2, A3, A4, A5 ) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3, A4, A5 );
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R( A1, A2, A3, A4, A5 )>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+struct Signal< R ( A1, A2, A3, A4 ) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3, A4 );
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R( A1, A2, A3, A4 )>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A1 a1, A2 a2, A3 a3, A4 a4 ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A1 a1, A2 a2, A3 a3, A4 a4 ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+template < typename R, typename A1, typename A2, typename A3 >
+struct Signal< R ( A1, A2, A3 ) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3 );
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R( A1, A2, A3 )>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A1 a1, A2 a2, A3 a3 ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A1 a1, A2 a2, A3 a3 ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+template < typename R, typename A1, typename A2 >
+struct Signal< R ( A1, A2 ) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2 );
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R( A1, A2 )>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A1 a1, A2 a2 ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A1 a1, A2 a2 ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+template < typename R, typename A1 >
+struct Signal< R ( A1 ) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1 );
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R( A1 )>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A1 a1 ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A1 a1 ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+template < typename R>
+struct Signal< R () > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType();
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R()>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit() const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit() const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+struct Signal< R (A...) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType(A...);
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R(A...)>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A...a ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A...a ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SIGNAL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Signal.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/Signal.hpp.vrdc
new file mode 100644
index 0000000..bf1e81a
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Signal.hpp.vrdc
@@ -0,0 +1,138 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SIGNAL_HPP__
+#define __FWCOM_SIGNAL_HPP__
+
+#include <list>
+#include <map>
+#include <utility>
+
+#include <boost/type_traits/is_same.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwCom/SignalBase.hpp"
+
+namespace fwCom
+{
+
+struct SlotConnectionBase;
+struct SlotBase;
+
+template < typename F >
+struct Signal;
+
+template < typename F >
+struct SlotRun;
+
+/**
+ * @brief Signal implementation.
+ * Template parameter T must always be void.
+ */
+template < typename R, typename ...A >
+struct Signal< R (A...) > : SignalBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType(A...);
+
+    typedef Signal< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotSptr;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    typedef std::list< PairType* > SlotContainerType;
+
+    typedef std::map< WPTR( SlotBase ), WPTR( SlotConnectionBase ) > ConnectionMapType;
+    /**  @} */
+
+    /// Constructs a new Signal of type Signal<R(A...)>.
+    static sptr New();
+
+    /// Destructor : disconnects all remaining connections.
+    ~Signal()
+    {
+        this->disconnectAll();
+    }
+
+    /**
+     * @brief Connects the given slot.
+     *
+     * @return an object managing the connection.
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    Connection connect ( SPTR( SlotBase ) slot );
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    void disconnect ( SPTR( SlotBase ) slot );
+
+    /// Disconnects all slots.
+    void disconnectAll();
+
+    /// Requests execution of slots with given arguments.
+    void emit( A...a ) const;
+
+    /// Requests asynchronous execution of slots with given arguments.
+    void asyncEmit( A...a ) const;
+
+    /// Returns number of connected slots.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_slots.size();
+    }
+
+
+    /**
+     * @brief Returns the connection handler matching given slot.
+     * @throws BadSlot if given slot is not connected and `throws` is true.
+     */
+    Connection getConnection( SPTR( SlotBase ) slot, bool throws = false );
+
+protected:
+
+    template < typename F >
+    friend struct SlotConnection;
+
+    /**
+     * @brief Connects the given slot.
+     * Tries to connect a slot of type R (A1, A2, ..., Am, An) :
+     * returns a connection on succes, otherwise try to connect
+     * the same slot with the type R (A1, A2, ..., Am).
+     *
+     * @throws BadSlot If given slot doesn't match signal type.
+     * @throws AlreadyConnected If given slot is already connected.
+     */
+    template< typename FROM_F >
+    Connection connect( SPTR( SlotBase ) slot );
+
+    /// Connected slots.
+    SlotContainerType m_slots;
+
+    /// Container of current connections.
+    ConnectionMapType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+
+private:
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+
+};
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SIGNAL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Signal.hxx b/SrcLib/core/fwCom/include/fwCom/Signal.hxx
new file mode 100644
index 0000000..b342c94
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Signal.hxx
@@ -0,0 +1,1478 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SIGNAL_HXX__
+#define __FWCOM_SIGNAL_HXX__
+
+#ifndef __FWCOM_SIGNAL_HPP__
+#error fwCom/Signal.hpp not included
+#endif
+
+#include <boost/foreach.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/make_shared.hpp>
+
+#include "fwCom/exception/BadSlot.hpp"
+#include "fwCom/exception/AlreadyConnected.hpp"
+#include "fwCom/SlotConnection.hpp"
+#include "fwCom/SlotConnection.hxx"
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+#include "fwCom/util/remove_last_arg.hpp"
+#include "fwCom/util/log.hpp"
+
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+typename Signal< R ( A1, A2, A3, A4, A5 ) >::sptr Signal< R ( A1, A2, A3, A4, A5 ) >::New()
+{
+    return ::boost::make_shared< Signal< R ( A1, A2, A3, A4, A5 ) > > () ;
+}
+
+
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+typename Signal< R ( A1, A2, A3, A4 ) >::sptr Signal< R ( A1, A2, A3, A4 ) >::New()
+{
+    return ::boost::make_shared< Signal< R ( A1, A2, A3, A4 ) > > () ;
+}
+
+
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+typename Signal< R ( A1, A2, A3 ) >::sptr Signal< R ( A1, A2, A3 ) >::New()
+{
+    return ::boost::make_shared< Signal< R ( A1, A2, A3 ) > > () ;
+}
+
+
+
+
+template < typename R, typename A1, typename A2 >
+typename Signal< R ( A1, A2 ) >::sptr Signal< R ( A1, A2 ) >::New()
+{
+    return ::boost::make_shared< Signal< R ( A1, A2 ) > > () ;
+}
+
+
+
+
+template < typename R, typename A1 >
+typename Signal< R ( A1 ) >::sptr Signal< R ( A1 ) >::New()
+{
+    return ::boost::make_shared< Signal< R ( A1 ) > > () ;
+}
+
+
+
+
+template < typename R>
+typename Signal< R () >::sptr Signal< R () >::New()
+{
+    return ::boost::make_shared< Signal< R () > > () ;
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+typename Signal< R (A...) >::sptr Signal< R (A...) >::New()
+{
+    return ::boost::make_shared< Signal< R (A...) > > () ;
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+Connection Signal< R ( A1, A2, A3, A4, A5 ) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+Connection Signal< R ( A1, A2, A3, A4 ) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+Connection Signal< R ( A1, A2, A3 ) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+template < typename R, typename A1, typename A2 >
+Connection Signal< R ( A1, A2 ) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+template < typename R, typename A1 >
+Connection Signal< R ( A1 ) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+template < typename R>
+Connection Signal< R () >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+Connection Signal< R (A...) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+void Signal< R ( A1, A2, A3, A4, A5 ) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+void Signal< R ( A1, A2, A3, A4 ) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+void Signal< R ( A1, A2, A3 ) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2 >
+void Signal< R ( A1, A2 ) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+template < typename R, typename A1 >
+void Signal< R ( A1 ) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+template < typename R>
+void Signal< R () >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+void Signal< R (A...) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+void Signal< R ( A1, A2, A3, A4, A5 ) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+void Signal< R ( A1, A2, A3, A4 ) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+void Signal< R ( A1, A2, A3 ) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+template < typename R, typename A1, typename A2 >
+void Signal< R ( A1, A2 ) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+template < typename R, typename A1 >
+void Signal< R ( A1 ) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+template < typename R>
+void Signal< R () >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+void Signal< R (A...) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+void Signal< R ( A1, A2, A3, A4, A5 ) >::emit( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run( a1, a2, a3, a4, a5 );
+        }
+    }
+}
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+void Signal< R ( A1, A2, A3, A4 ) >::emit( A1 a1, A2 a2, A3 a3, A4 a4 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run( a1, a2, a3, a4 );
+        }
+    }
+}
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+void Signal< R ( A1, A2, A3 ) >::emit( A1 a1, A2 a2, A3 a3 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run( a1, a2, a3 );
+        }
+    }
+}
+
+
+template < typename R, typename A1, typename A2 >
+void Signal< R ( A1, A2 ) >::emit( A1 a1, A2 a2 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run( a1, a2 );
+        }
+    }
+}
+
+
+template < typename R, typename A1 >
+void Signal< R ( A1 ) >::emit( A1 a1 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run( a1 );
+        }
+    }
+}
+
+
+template < typename R>
+void Signal< R () >::emit() const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run();
+        }
+    }
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+void Signal< R (A...) >::emit( A...a ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run(a...);
+        }
+    }
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+void Signal< R ( A1, A2, A3, A4, A5 ) >::asyncEmit( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun( a1, a2, a3, a4, a5 );
+        }
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+void Signal< R ( A1, A2, A3, A4 ) >::asyncEmit( A1 a1, A2 a2, A3 a3, A4 a4 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun( a1, a2, a3, a4 );
+        }
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+void Signal< R ( A1, A2, A3 ) >::asyncEmit( A1 a1, A2 a2, A3 a3 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun( a1, a2, a3 );
+        }
+    }
+}
+
+
+
+template < typename R, typename A1, typename A2 >
+void Signal< R ( A1, A2 ) >::asyncEmit( A1 a1, A2 a2 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun( a1, a2 );
+        }
+    }
+}
+
+
+
+template < typename R, typename A1 >
+void Signal< R ( A1 ) >::asyncEmit( A1 a1 ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun( a1 );
+        }
+    }
+}
+
+
+
+template < typename R>
+void Signal< R () >::asyncEmit() const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun();
+        }
+    }
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+void Signal< R (A...) >::asyncEmit( A...a ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun(a...);
+        }
+    }
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template< typename FROM_F >
+Connection Signal< R( A1, A2, A3, A4, A5 ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A1, A2, A3, A4, A5 ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A1, A2, A3, A4, A5 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3, A4, A5 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void ( A1, A2, A3, A4, A5 ) > >::New(wrappedSlot);
+            typename Signal< R( A1, A2, A3, A4, A5 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3, A4, A5 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+template< typename FROM_F >
+Connection Signal< R( A1, A2, A3, A4 ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A1, A2, A3, A4 ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A1, A2, A3, A4 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3, A4 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void ( A1, A2, A3, A4 ) > >::New(wrappedSlot);
+            typename Signal< R( A1, A2, A3, A4 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3, A4 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+template< typename FROM_F >
+Connection Signal< R( A1, A2, A3 ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A1, A2, A3 ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A1, A2, A3 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void ( A1, A2, A3 ) > >::New(wrappedSlot);
+            typename Signal< R( A1, A2, A3 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2, A3 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+template < typename R, typename A1, typename A2 >
+template< typename FROM_F >
+Connection Signal< R( A1, A2 ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A1, A2 ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A1, A2 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void ( A1, A2 ) > >::New(wrappedSlot);
+            typename Signal< R( A1, A2 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1, A2 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+template < typename R, typename A1 >
+template< typename FROM_F >
+Connection Signal< R( A1 ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A1 ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A1 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void ( A1 ) > >::New(wrappedSlot);
+            typename Signal< R( A1 ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A1 ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+template < typename R>
+template< typename FROM_F >
+Connection Signal< R() >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void() > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R() >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R() > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void () > >::New(wrappedSlot);
+            typename Signal< R() >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R() > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+template< typename FROM_F >
+Connection Signal< R( A... ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A... ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A... ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A... ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void (A...) > >::New(wrappedSlot);
+            typename Signal< R( A... ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A... ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+Connection Signal< R( A1, A2, A3, A4, A5 ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R, typename A1, typename A2, typename A3, typename A4 >
+Connection Signal< R( A1, A2, A3, A4 ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R, typename A1, typename A2, typename A3 >
+Connection Signal< R( A1, A2, A3 ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R, typename A1, typename A2 >
+Connection Signal< R( A1, A2 ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R, typename A1 >
+Connection Signal< R( A1 ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R>
+Connection Signal< R() >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename R, typename ...A >
+Connection Signal< R( A... ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SIGNAL_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Signal.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/Signal.hxx.vrdc
new file mode 100644
index 0000000..38dbfca
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Signal.hxx.vrdc
@@ -0,0 +1,222 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SIGNAL_HXX__
+#define __FWCOM_SIGNAL_HXX__
+
+#ifndef __FWCOM_SIGNAL_HPP__
+#error fwCom/Signal.hpp not included
+#endif
+
+#include <boost/foreach.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/make_shared.hpp>
+
+#include "fwCom/exception/BadSlot.hpp"
+#include "fwCom/exception/AlreadyConnected.hpp"
+#include "fwCom/SlotConnection.hpp"
+#include "fwCom/SlotConnection.hxx"
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+#include "fwCom/util/remove_last_arg.hpp"
+#include "fwCom/util/log.hpp"
+
+
+namespace fwCom
+{
+
+
+
+template < typename R, typename ...A >
+typename Signal< R (A...) >::sptr Signal< R (A...) >::New()
+{
+    return ::boost::make_shared< Signal< R (A...) > > () ;
+}
+
+
+
+template < typename R, typename ...A >
+Connection Signal< R (A...) >::connect( SlotBase::sptr slot )
+{
+    return this->connect< SignatureType >(slot);
+}
+
+template < typename R, typename ...A >
+void Signal< R (A...) >::disconnect( SlotBase::sptr slot )
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter != m_connections.end())
+    {
+        SlotConnectionBase::sptr connection ( iter->second.lock() );
+        SLM_ASSERT( "Connection has been previously destroyed", connection );
+        if (connection)
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            connection->disconnectWeakLock();
+            // m_connections.erase(slot.get()); // done in connection->disconnect
+        }
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+    }
+}
+
+
+template < typename R, typename ...A >
+void Signal< R (A...) >::disconnectAll()
+{
+    ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+
+    ConnectionMapType connections = m_connections;
+
+    BOOST_FOREACH( const typename ConnectionMapType::value_type &conn, connections )
+    {
+        SlotConnectionBase::sptr connection( conn.second.lock() );
+
+        if(connection)
+        {
+            connection->disconnectWeakLock();
+        }
+    }
+
+}
+
+template < typename R, typename ...A >
+void Signal< R (A...) >::emit( A...a ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("emit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->run(a...);
+        }
+    }
+}
+
+template < typename R, typename ...A >
+void Signal< R (A...) >::asyncEmit( A...a ) const
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    OSLM_COM("asyncEmit '"<< this->getID() <<"' sig ( nb connected slots = " << m_slots.size() << " )" );
+    typename SlotContainerType::const_iterator iter;
+    typename SlotContainerType::const_iterator end = m_slots.end();
+    for ( iter = m_slots.begin() ; iter != end; ++iter )
+    {
+        if ((*iter)->first)
+        {
+            (*iter)->second->asyncRun(a...);
+        }
+    }
+}
+
+
+template < typename R, typename ...A >
+template< typename FROM_F >
+Connection Signal< R( A... ) >::connect( SlotBase::sptr slot )
+{
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+
+        if(m_connections.find( slot ) != m_connections.end())
+        {
+            FW_RAISE_EXCEPTION( fwCom::exception::AlreadyConnected("Slot already connected") );
+        }
+    }
+
+    typedef SlotConnection< void( A... ) > ConnectionType;
+    Connection connection;
+
+    unsigned int sigArity = ::boost::function_types::function_arity< SignatureType >::value;
+    if ( sigArity == slot->arity() )
+    {
+        SlotSptr slotToConnect = boost::dynamic_pointer_cast< SlotRunType >(slot);
+        if(slotToConnect)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            typename Signal< R( A... ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A... ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slotToConnect);
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+        }
+    }
+    else if ( sigArity > slot->arity() )
+    {
+
+        typedef SlotRun< FROM_F > WrappedSlotRunType;
+        typename SPTR(WrappedSlotRunType) wrappedSlot = boost::dynamic_pointer_cast< WrappedSlotRunType >(slot);
+
+        if(wrappedSlot)
+        {
+            ::fwCore::mt::WriteLock lock(m_connectionsMutex);
+            SlotSptr slotToConnect = Slot < Slot < void (A...) > >::New(wrappedSlot);
+            typename Signal< R( A... ) >::sptr sig =
+                boost::dynamic_pointer_cast < Signal< R( A... ) > > ( this->shared_from_this() );
+            typename ConnectionType::sptr slotConnection = ConnectionType::New( sig, slot, slotToConnect );
+            slot->m_connections.insert(slotConnection);
+            m_connections.insert( typename ConnectionMapType::value_type( slot, slotConnection ) );
+            slotConnection->connectNoLock();
+            connection = Connection(slotConnection);
+        }
+        else
+        {
+            connection = this->connect< typename ::fwCom::util::remove_last_arg< FROM_F >::type >( slot );
+        }
+
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "Incompatible slot" ) );
+    }
+
+    return connection;
+
+}
+
+
+template < typename R, typename ...A >
+Connection Signal< R( A... ) >::getConnection( SlotBase::sptr slot, bool throws )
+{
+    ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+    Connection connection;
+
+    ConnectionMapType::const_iterator iter = m_connections.find(slot);
+
+    if (iter == m_connections.end() )
+    {
+        if(throws)
+        {
+            FW_RAISE_EXCEPTION( ::fwCom::exception::BadSlot( "No such slot connected" ) );
+        }
+    }
+    else
+    {
+        SlotConnectionBase::sptr slotConnection (iter->second);
+        connection = Connection( slotConnection );
+    }
+
+    return connection;
+
+}
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SIGNAL_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SignalBase.hpp b/SrcLib/core/fwCom/include/fwCom/SignalBase.hpp
new file mode 100644
index 0000000..a168531
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SignalBase.hpp
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SIGNALBASE_HPP__
+#define __FWCOM_SIGNALBASE_HPP__
+
+#ifdef COM_LOG
+#include <boost/lexical_cast.hpp>
+#include <fwCore/mt/types.hpp>
+#endif
+
+#include <fwCore/BaseObject.hpp>
+
+#include "fwCom/config.hpp"
+
+#include "fwCom/Connection.hpp"
+
+namespace fwCom
+{
+
+struct SlotBase;
+
+/**
+ * @brief Signal base class.
+ */
+struct SignalBase : virtual fwCore::BaseObject
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef SPTR( SignalBase ) sptr;
+    typedef WPTR( SignalBase )   wptr;
+    /**  @} */
+
+    SignalBase()
+    {
+#ifdef COM_LOG
+        ::fwCore::mt::ScopedLock lock(s_mutexCounter);
+        m_id = "Signal-" + ::boost::lexical_cast<std::string>(s_idCount++);
+#endif
+    };
+
+    virtual ~SignalBase(){};
+
+    /**
+     * @brief Connects the given slot.
+     * @throws BadSlot If given slot doesn't match signal type.
+     */
+    virtual Connection connect ( SPTR( SlotBase ) slot ) = 0;
+
+    /**
+     * @brief Disconnects the given slot.
+     * @throws BadSlot If given slot is not found in current connections.
+     */
+    virtual void disconnect ( SPTR( SlotBase ) slot ) = 0;
+
+    /// Returns number of connections.
+    virtual size_t getNumberOfConnections() const = 0;
+
+protected:
+    /// Copy constructor forbidden
+    SignalBase( const SignalBase& );
+
+    /// Copy operator forbiden
+    SignalBase& operator=( const SignalBase& );
+
+#ifdef COM_LOG
+
+public :
+
+    typedef std::string IDType;
+
+    /// Gets current m_id
+    IDType getID() const
+    {
+        return m_id;
+    }
+
+    /// Sets new m_id
+    void setID( IDType newId )
+    {
+        m_id = newId;
+    }
+
+private :
+
+    /// Id of signal (not mandatory)
+    IDType m_id;
+
+    /// Id counter
+    FWCOM_API static size_t s_idCount;
+
+    /// Mutex to protect id counter
+    FWCOM_API static ::fwCore::mt::Mutex s_mutexCounter;
+
+#endif
+
+};
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SIGNALBASE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Signals.hpp b/SrcLib/core/fwCom/include/fwCom/Signals.hpp
new file mode 100644
index 0000000..03b1fff
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Signals.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_SIGNALS_HPP__
+#define __FWCOM_SIGNALS_HPP__
+
+#include <map>
+#include <vector>
+
+#include "fwCore/macros.hpp"
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+struct SignalBase;
+
+/**
+ * @class   Signals
+ * @brief   This class proposes a mapping between a SignalKeyType and a SignalBase.
+ *
+ * 
+ * @date   2012.
+ */
+class FWCOM_CLASS_API Signals
+{
+public:
+
+    typedef std::string SignalKeyType;
+    typedef std::map< SignalKeyType, SPTR( SignalBase ) > SignalMapType;
+    typedef std::vector < SignalKeyType > SignalKeyContainerType;
+
+    /// Constructor, does nothing
+    FWCOM_API Signals();
+
+    /// Constructor, check if all signals are disconnected
+    FWCOM_API virtual ~Signals();
+
+    /// Registers SignalBase in m_signals
+    FWCOM_API Signals& operator()( const SignalKeyType &key, const SPTR( SignalBase ) &Signal );
+
+    /// Returns the SignalBase associated to the key, if key does not exist, the ptr is null
+    FWCOM_API SPTR( SignalBase ) operator[]( const SignalKeyType &key ) const;
+
+    /// Returns all SignalKeyType registered in m_signals
+    FWCOM_API SignalKeyContainerType getSignalKeys() const;
+
+#ifdef COM_LOG
+    /// Set new id for all signals using their key in m_signals, a prefix can be added
+    FWCOM_API void setID( const std::string prefix = "" );
+#endif
+
+protected:
+
+    /// Copy constructor forbidden
+    Signals( const Signals& );
+
+    /// Copy constructor forbidden
+    Signals& operator=( const Signals& );
+
+    /// Association < key , SPTR( SignalBase ) >
+    SignalMapType m_signals;
+};
+
+} // namespace fwCom
+
+#endif //__FWCOM_SIGNALS_HPP__
diff --git a/SrcLib/core/fwCom/include/fwCom/Slot.hpp b/SrcLib/core/fwCom/include/fwCom/Slot.hpp
new file mode 100644
index 0000000..be93509
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slot.hpp
@@ -0,0 +1,570 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOT_HPP__
+#define __FWCOM_SLOT_HPP__
+
+#include <boost/function.hpp>
+
+#include "fwCom/SlotCall.hpp"
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+
+template< typename F >
+struct Slot;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct Slot< ::boost::function< R ( A1, A2, A3, A4, A5 ) > > : Slot< R ( A1, A2, A3, A4, A5 ) >
+{
+    typedef R SignatureType( A1, A2, A3, A4, A5 );
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A1, A2, A3, A4, A5 ) >(),  m_func(f)
+    { }
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func( a1, a2, a3, a4, a5 );
+    };
+
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func( a1, a2, a3, a4, a5 );
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+struct Slot< ::boost::function< R ( A1, A2, A3, A4 ) > > : Slot< R ( A1, A2, A3, A4 ) >
+{
+    typedef R SignatureType( A1, A2, A3, A4 );
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A1, A2, A3, A4 ) >(),  m_func(f)
+    { }
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4 ) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func( a1, a2, a3, a4 );
+    };
+
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4 ) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func( a1, a2, a3, a4 );
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+template<typename R, typename A1, typename A2, typename A3 >
+struct Slot< ::boost::function< R ( A1, A2, A3 ) > > : Slot< R ( A1, A2, A3 ) >
+{
+    typedef R SignatureType( A1, A2, A3 );
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A1, A2, A3 ) >(),  m_func(f)
+    { }
+
+    virtual void run( A1 a1, A2 a2, A3 a3 ) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func( a1, a2, a3 );
+    };
+
+    virtual R   call( A1 a1, A2 a2, A3 a3 ) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func( a1, a2, a3 );
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+template<typename R, typename A1, typename A2 >
+struct Slot< ::boost::function< R ( A1, A2 ) > > : Slot< R ( A1, A2 ) >
+{
+    typedef R SignatureType( A1, A2 );
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A1, A2 ) >(),  m_func(f)
+    { }
+
+    virtual void run( A1 a1, A2 a2 ) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func( a1, a2 );
+    };
+
+    virtual R   call( A1 a1, A2 a2 ) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func( a1, a2 );
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+template<typename R, typename A1 >
+struct Slot< ::boost::function< R ( A1 ) > > : Slot< R ( A1 ) >
+{
+    typedef R SignatureType( A1 );
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A1 ) >(),  m_func(f)
+    { }
+
+    virtual void run( A1 a1 ) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func( a1 );
+    };
+
+    virtual R   call( A1 a1 ) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func( a1 );
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+template<typename R>
+struct Slot< ::boost::function< R () > > : Slot< R () >
+{
+    typedef R SignatureType();
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R () >(),  m_func(f)
+    { }
+
+    virtual void run() const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func();
+    };
+
+    virtual R   call() const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func();
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+struct Slot< ::boost::function< R ( A... ) > > : Slot< R ( A... ) >
+{
+    typedef R SignatureType(A...);
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A... ) >(),  m_func(f)
+    { }
+
+    virtual void run(A...a) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func(a...);
+    };
+
+    virtual R   call(A...a) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func(a...);
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct Slot< Slot< R ( A1, A2, A3, A4, A5 ) > > : Slot< boost::function < R ( A1, A2, A3, A4, A5 ) > >
+{
+
+
+    typedef R SignatureType ( A1, A2, A3, A4, A5 ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R( A1, A2, A3, A4, A5 ) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+struct Slot< Slot< R ( A1, A2, A3, A4 ) > > : Slot< boost::function < R ( A1, A2, A3, A4 ) > >
+{
+
+
+    typedef R SignatureType ( A1, A2, A3, A4 ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R( A1, A2, A3, A4 ) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+template<typename R, typename A1, typename A2, typename A3 >
+struct Slot< Slot< R ( A1, A2, A3 ) > > : Slot< boost::function < R ( A1, A2, A3 ) > >
+{
+
+
+    typedef R SignatureType ( A1, A2, A3 ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R( A1, A2, A3 ) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+template<typename R, typename A1, typename A2 >
+struct Slot< Slot< R ( A1, A2 ) > > : Slot< boost::function < R ( A1, A2 ) > >
+{
+
+
+    typedef R SignatureType ( A1, A2 ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R( A1, A2 ) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+template<typename R, typename A1 >
+struct Slot< Slot< R ( A1 ) > > : Slot< boost::function < R ( A1 ) > >
+{
+
+
+    typedef R SignatureType ( A1 ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R( A1 ) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+template<typename R>
+struct Slot< Slot< R () > > : Slot< boost::function < R () > >
+{
+
+
+    typedef R SignatureType () ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R() > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+struct Slot< Slot< R ( A... ) > > : Slot< boost::function < R ( A... ) > >
+{
+
+
+    typedef R SignatureType ( A... ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R(A...) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct Slot< R ( A1, A2, A3, A4, A5 ) > : SlotCall< R ( A1, A2, A3, A4, A5 ) >
+{
+    typedef R SignatureType( A1, A2, A3, A4, A5 );
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R ( A1, A2, A3, A4, A5 ) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A1, A2, A3, A4, A5 ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R( A1, A2, A3, A4, A5 ) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R( A1, A2, A3, A4, A5 ) > ) New( F f, O o ); //{}
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+struct Slot< R ( A1, A2, A3, A4 ) > : SlotCall< R ( A1, A2, A3, A4 ) >
+{
+    typedef R SignatureType( A1, A2, A3, A4 );
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R ( A1, A2, A3, A4 ) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A1, A2, A3, A4 ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R( A1, A2, A3, A4 ) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R( A1, A2, A3, A4 ) > ) New( F f, O o ); //{}
+
+};
+template<typename R, typename A1, typename A2, typename A3 >
+struct Slot< R ( A1, A2, A3 ) > : SlotCall< R ( A1, A2, A3 ) >
+{
+    typedef R SignatureType( A1, A2, A3 );
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R ( A1, A2, A3 ) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A1, A2, A3 ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R( A1, A2, A3 ) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R( A1, A2, A3 ) > ) New( F f, O o ); //{}
+
+};
+template<typename R, typename A1, typename A2 >
+struct Slot< R ( A1, A2 ) > : SlotCall< R ( A1, A2 ) >
+{
+    typedef R SignatureType( A1, A2 );
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R ( A1, A2 ) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A1, A2 ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R( A1, A2 ) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R( A1, A2 ) > ) New( F f, O o ); //{}
+
+};
+template<typename R, typename A1 >
+struct Slot< R ( A1 ) > : SlotCall< R ( A1 ) >
+{
+    typedef R SignatureType( A1 );
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R ( A1 ) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A1 ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R( A1 ) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R( A1 ) > ) New( F f, O o ); //{}
+
+};
+template<typename R>
+struct Slot< R () > : SlotCall< R () >
+{
+    typedef R SignatureType();
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R () >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R () >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R() > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R() > ) New( F f, O o ); //{}
+
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+struct Slot< R ( A... ) > : SlotCall< R (A...) >
+{
+    typedef R SignatureType(A...);
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R (A...) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A... ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R(A...) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R(A...) > ) New( F f, O o ); //{}
+
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5 ); //{}
+
+
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4 ); //{}
+
+
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3 ); //{}
+
+
+
+
+template<typename F, typename Bindings1, typename Bindings2 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings1  bindings1, Bindings2  bindings2 ); //{}
+
+
+
+
+template<typename F, typename Bindings1 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings1  bindings1 ); //{}
+
+
+
+
+template<typename F>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f); //{}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename F, typename ...Bindings>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings ...bindings); //{}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOT_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Slot.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/Slot.hpp.vrdc
new file mode 100644
index 0000000..b206bef
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slot.hpp.vrdc
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOT_HPP__
+#define __FWCOM_SLOT_HPP__
+
+#include <boost/function.hpp>
+
+#include "fwCom/SlotCall.hpp"
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+
+template< typename F >
+struct Slot;
+
+template<typename R, typename ...A >
+struct Slot< ::boost::function< R ( A... ) > > : Slot< R ( A... ) >
+{
+    typedef R SignatureType(A...);
+    typedef ::boost::function< SignatureType > FunctionType;
+
+
+    template< typename FUNCTOR >
+        Slot( FUNCTOR f ) : Slot< R ( A... ) >(),  m_func(f)
+    { }
+
+    virtual void run(A...a) const
+    {
+        OSLM_COM("run '"<< this->getID() <<"' slot");
+        m_func(a...);
+    };
+    
+    virtual R   call(A...a) const
+    {
+        OSLM_COM("call '"<< this->getID() <<"'  slot");
+        return m_func(a...);
+    };
+
+
+protected:
+    FunctionType m_func;
+};
+
+
+
+
+template<typename R, typename ...A >
+struct Slot< Slot< R ( A... ) > > : Slot< boost::function < R ( A... ) > >
+{
+
+
+    typedef R SignatureType ( A... ) ;
+    typedef ::boost::function< SignatureType > FunctionType;
+
+    template< typename F >
+    Slot( SPTR( SlotRun< F > ) slot );
+    template< typename F >
+    Slot( SPTR( Slot< F > ) slot );
+
+    template< typename F_IN >
+    static SPTR( Slot< R(A...) > ) New( SPTR( SlotRun< F_IN > ) slot ); //{}
+
+};
+
+
+template<typename R, typename ...A >
+struct Slot< R ( A... ) > : SlotCall< R (A...) >
+{
+    typedef R SignatureType(A...);
+    typedef Slot< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+
+
+    Slot() : SlotCall< R (A...) >()
+    {
+        // 'this->' is needed by gcc 4.2
+        this->SlotBase::m_signature = SlotBase::getTypeName< R ( A... ) >();
+    }
+
+    template< typename F >
+    static SPTR( Slot< R(A...) > ) New( F f ); //{}
+
+    template< typename F, typename O >
+    static SPTR( Slot< R(A...) > ) New( F f, O o ); //{}
+
+};
+
+
+
+
+template<typename F, typename ...Bindings>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, Bindings ...bindings); //{}
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOT_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Slot.hxx b/SrcLib/core/fwCom/include/fwCom/Slot.hxx
new file mode 100644
index 0000000..e02be1e
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slot.hxx
@@ -0,0 +1,690 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOT_HXX__
+#define __FWCOM_SLOT_HXX__
+
+#ifndef __FWCOM_SLOT_HPP__
+#error fwCom/Slot.hpp not included
+#endif
+
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include "fwCom/util/AutoBind.hpp"
+#include "fwCom/util/AutoBind.hxx"
+
+#include "fwCom/SlotCall.hxx"
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3, A4, A5 ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3, A4 ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3 ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename R, typename A1, typename A2 >
+template< typename F >
+Slot< Slot< R ( A1, A2 ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename R, typename A1 >
+template< typename F >
+Slot< Slot< R ( A1 ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename R>
+template< typename F >
+Slot< Slot< R () > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+template< typename F >
+Slot< Slot< R ( A... ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3, A4, A5 ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3, A4 ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+template< typename F >
+Slot< Slot< R ( A1, A2, A3 ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+template<typename R, typename A1, typename A2 >
+template< typename F >
+Slot< Slot< R ( A1, A2 ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+template<typename R, typename A1 >
+template< typename F >
+Slot< Slot< R ( A1 ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+template<typename R>
+template< typename F >
+Slot< Slot< R () > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+template< typename F >
+Slot< Slot< R ( A... ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename F, typename BINDING1, typename BINDING2, typename BINDING3, typename BINDING4, typename BINDING5 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING1  binding1, BINDING2  binding2, BINDING3  binding3, BINDING4  binding4, BINDING5  binding5 )
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 5 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 5 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding1, binding2, binding3, binding4, binding5 );
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+template<typename F, typename BINDING1, typename BINDING2, typename BINDING3, typename BINDING4 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING1  binding1, BINDING2  binding2, BINDING3  binding3, BINDING4  binding4 )
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 4 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 4 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding1, binding2, binding3, binding4 );
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+template<typename F, typename BINDING1, typename BINDING2, typename BINDING3 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING1  binding1, BINDING2  binding2, BINDING3  binding3 )
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 3 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 3 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding1, binding2, binding3 );
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+template<typename F, typename BINDING1, typename BINDING2 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING1  binding1, BINDING2  binding2 )
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 2 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 2 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding1, binding2 );
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+template<typename F, typename BINDING1 >
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING1  binding1 )
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 1 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 1 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding1 );
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+template<typename F>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f)
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( 0 < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( 0 < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f);
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename F, typename ...BINDING>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING ...binding)
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( sizeof...(binding) < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( sizeof...(binding) < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding...);
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template<typename F>
+SPTR( Slot< R ( A1, A2, A3, A4, A5 ) > ) Slot< R ( A1, A2, A3, A4, A5 ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+template<typename F>
+SPTR( Slot< R ( A1, A2, A3, A4 ) > ) Slot< R ( A1, A2, A3, A4 ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+template<typename F>
+SPTR( Slot< R ( A1, A2, A3 ) > ) Slot< R ( A1, A2, A3 ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+template<typename R, typename A1, typename A2 >
+template<typename F>
+SPTR( Slot< R ( A1, A2 ) > ) Slot< R ( A1, A2 ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+template<typename R, typename A1 >
+template<typename F>
+SPTR( Slot< R ( A1 ) > ) Slot< R ( A1 ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+template<typename R>
+template<typename F>
+SPTR( Slot< R () > ) Slot< R () >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+template<typename F>
+SPTR( Slot< R ( A... ) > ) Slot< R ( A... ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template<typename F, typename O>
+SPTR( Slot< R ( A1, A2, A3, A4, A5 ) > ) Slot< R ( A1, A2, A3, A4, A5 ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+template<typename F, typename O>
+SPTR( Slot< R ( A1, A2, A3, A4 ) > ) Slot< R ( A1, A2, A3, A4 ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+template<typename F, typename O>
+SPTR( Slot< R ( A1, A2, A3 ) > ) Slot< R ( A1, A2, A3 ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+template<typename R, typename A1, typename A2 >
+template<typename F, typename O>
+SPTR( Slot< R ( A1, A2 ) > ) Slot< R ( A1, A2 ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+template<typename R, typename A1 >
+template<typename F, typename O>
+SPTR( Slot< R ( A1 ) > ) Slot< R ( A1 ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+template<typename R>
+template<typename F, typename O>
+SPTR( Slot< R () > ) Slot< R () >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+template<typename F, typename O>
+SPTR( Slot< R ( A... ) > ) Slot< R ( A... ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template<typename F_IN >
+SPTR( Slot< R ( A1, A2, A3, A4, A5 ) > ) Slot< Slot< R ( A1, A2, A3, A4, A5 ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A1, A2, A3, A4, A5 ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A1, A2, A3, A4, A5 ) > > > ( slot );
+}
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+template<typename F_IN >
+SPTR( Slot< R ( A1, A2, A3, A4 ) > ) Slot< Slot< R ( A1, A2, A3, A4 ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A1, A2, A3, A4 ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A1, A2, A3, A4 ) > > > ( slot );
+}
+
+
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+template<typename F_IN >
+SPTR( Slot< R ( A1, A2, A3 ) > ) Slot< Slot< R ( A1, A2, A3 ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A1, A2, A3 ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A1, A2, A3 ) > > > ( slot );
+}
+
+
+
+
+template<typename R, typename A1, typename A2 >
+template<typename F_IN >
+SPTR( Slot< R ( A1, A2 ) > ) Slot< Slot< R ( A1, A2 ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A1, A2 ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A1, A2 ) > > > ( slot );
+}
+
+
+
+
+template<typename R, typename A1 >
+template<typename F_IN >
+SPTR( Slot< R ( A1 ) > ) Slot< Slot< R ( A1 ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A1 ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A1 ) > > > ( slot );
+}
+
+
+
+
+template<typename R>
+template<typename F_IN >
+SPTR( Slot< R () > ) Slot< Slot< R () > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R () >::value
+        );
+    return boost::make_shared< Slot< Slot< R () > > > ( slot );
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+template<typename F_IN >
+SPTR( Slot< R ( A... ) > ) Slot< Slot< R ( A... ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A... ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A... ) > > > ( slot );
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOT_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Slot.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/Slot.hxx.vrdc
new file mode 100644
index 0000000..ef8bbad
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slot.hxx.vrdc
@@ -0,0 +1,112 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOT_HXX__
+#define __FWCOM_SLOT_HXX__
+
+#ifndef __FWCOM_SLOT_HPP__
+#error fwCom/Slot.hpp not included
+#endif
+
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include "fwCom/util/AutoBind.hpp"
+#include "fwCom/util/AutoBind.hxx"
+
+#include "fwCom/SlotCall.hxx"
+
+namespace fwCom
+{
+
+
+
+template<typename R, typename ...A >
+template< typename F >
+Slot< Slot< R ( A... ) > >::Slot( SPTR( SlotRun< F > ) slot )
+    : Slot< FunctionType >(
+            ::fwCom::util::AutoBind<
+                    SignatureType,
+                    ::boost::function_types::function_arity< F >::value
+                >::wrap( &SlotRun< F >::run, slot.get() )
+                                                        )
+{
+    BOOST_STATIC_ASSERT( (boost::is_same<void, R>::value) );
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+template<typename R, typename ...A >
+template< typename F >
+Slot< Slot< R ( A... ) > >::Slot( SPTR( Slot< F > ) slot )
+: Slot< FunctionType >(
+        ::fwCom::util::AutoBind<
+                SignatureType,
+                ::boost::function_types::function_arity< F >::value
+            >::wrap( &Slot< F >::call, slot.get() )
+                                                    )
+{ 
+    this->setWorker(slot->getWorker());
+#ifdef COM_LOG
+    this->setID("wrapped_"+ slot->getID());
+#endif
+}
+
+
+
+
+template<typename F, typename ...BINDING>
+SPTR( Slot< typename ::fwCom::util::convert_function_type< F >::type > ) newSlot(F f, BINDING ...binding)
+{
+#ifndef BOOST_NO_VARIADIC_TEMPLATES
+    BOOST_STATIC_ASSERT( sizeof...(binding) < 2 );
+#else
+    SLM_ASSERT( "Too many arguments", ( sizeof...(binding) < 2 ) );
+#endif
+    typedef ::boost::function< typename ::fwCom::util::convert_function_type< F >::type > FunctionType;
+    FunctionType func = ::fwCom::util::autobind(f, binding...);
+    return ::boost::make_shared< Slot< FunctionType > > ( func );
+}
+
+template<typename R, typename ...A >
+template<typename F>
+SPTR( Slot< R ( A... ) > ) Slot< R ( A... ) >::New( F f )
+{
+    return newSlot(f);
+}
+
+
+template<typename R, typename ...A >
+template<typename F, typename O>
+SPTR( Slot< R ( A... ) > ) Slot< R ( A... ) >::New( F f, O o )
+{
+    return newSlot(f, o);
+}
+
+
+template<typename R, typename ...A >
+template<typename F_IN >
+SPTR( Slot< R ( A... ) > ) Slot< Slot< R ( A... ) > >::New( SPTR( SlotRun< F_IN > ) slot )
+{
+    assert (
+        ::boost::function_types::function_arity< F_IN >::value <= ::boost::function_types::function_arity< R ( A... ) >::value
+        );
+    return boost::make_shared< Slot< Slot< R ( A... ) > > > ( slot );
+}
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOT_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp b/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp
new file mode 100644
index 0000000..de8110c
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp
@@ -0,0 +1,233 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTBASE_HPP__
+#define __FWCOM_SLOTBASE_HPP__
+
+#include <set>
+#include <queue>
+
+#include <boost/foreach.hpp>
+#include <boost/thread/future.hpp>
+
+#ifdef COM_LOG
+#include <boost/lexical_cast.hpp>
+#endif
+
+#include <fwCore/mt/types.hpp>
+#include <fwCore/BaseObject.hpp>
+#include <fwCore/spyLog.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/util/convert_function_type.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotRun;
+
+template< typename F >
+struct Slot;
+
+struct SlotConnectionBase;
+
+/**
+ * @brief Base class for Slot implementations.
+ */
+struct FWCOM_CLASS_API SlotBase : virtual fwCore::BaseObject
+{
+
+    /**
+     * @name typedefs
+     * @{
+     * Slot pointer types. */
+    typedef SPTR( SlotBase ) sptr;
+    typedef WPTR( SlotBase ) wptr;
+    typedef SPTR( SlotBase const ) csptr;
+    typedef WPTR( SlotBase const ) cwptr;
+
+    typedef std::string IDType;
+    /**  @} */
+
+    /// SlotBase::asyncRun return type.
+    typedef ::boost::shared_future< void > VoidSharedFutureType;
+
+    /// Connections container type
+    typedef std::set< CSPTR( SlotConnectionBase ) > ConnectionSetType;
+
+    virtual ~SlotBase() {};
+
+    /**
+     * @brief Returns Slot's arity.
+     * The arity defines the number of parameters in Slot signature.
+     */
+    unsigned int arity() const
+    {
+        return m_arity;
+    }
+
+    /// Sets Slot's Worker.
+    void setWorker(const SPTR(::fwThread::Worker) &worker)
+    {
+        ::fwCore::mt::WriteLock lock(m_workerMutex);
+
+        m_worker = worker;
+    }
+
+    /// Returns Slot's Worker.
+    SPTR(::fwThread::Worker) getWorker() const
+    {
+        ::fwCore::mt::ReadLock lock(m_workerMutex);
+        return m_worker;
+    }
+
+    /**
+     * @brief  Run the Slot.
+     * @throw  BadRun if given arguments do not match the slot implementation
+     */
+    /**
+     * @name Run helpers
+     * @{ */
+    template< typename A1, typename A2, typename A3 > void run(A1 a1, A2 a2, A3 a3) const;
+    template< typename A1, typename A2 > void run(A1 a1, A2 a2) const;
+    template< typename A1 > void run(A1 a1) const;
+    FWCOM_API void run() const;
+    /**  @} */
+
+    /**
+     * @brief  Call the Slot (with return value).
+     * @throw  BadCall if given arguments do not match the slot implementation
+     */
+    /**
+     * @name Call helpers
+     * @{ */
+    template< typename R, typename A1, typename A2, typename A3 > R call(A1 a1, A2 a2, A3 a3) const;
+    template< typename R, typename A1, typename A2 > R call(A1 a1, A2 a2) const;
+    template< typename R, typename A1 > R call(A1 a1) const;
+    template< typename R > R call() const;
+    /**  @} */
+
+    /**
+     * @brief  Run the Slot asynchronously.
+     * @throw  BadRun if given arguments do not match the slot implementation
+     * @throws NoWorker if given worker is not valid.
+     */
+    /**
+     * @name Asynchronous run helpers
+     * @{ */
+    template< typename A1, typename A2, typename A3 > VoidSharedFutureType asyncRun(A1 a1, A2 a2, A3 a3) const;
+    template< typename A1, typename A2 > VoidSharedFutureType asyncRun(A1 a1, A2 a2) const;
+    template< typename A1 > VoidSharedFutureType asyncRun(A1 a1) const;
+    FWCOM_API VoidSharedFutureType asyncRun() const;
+    /**  @} */
+
+    /**
+     * @brief  Call the Slot asynchronously (with return value).
+     * @throw  BadCall if given arguments do not match the slot implementation
+     * @throws NoWorker if given worker is not valid.
+     */
+    /**
+     * @name Asynchronous call helpers
+     * @{ */
+    template< typename R, typename A1, typename A2, typename A3 > ::boost::shared_future< R > asyncCall(A1 a1, A2 a2, A3 a3) const;
+    template< typename R, typename A1, typename A2 > ::boost::shared_future< R > asyncCall(A1 a1, A2 a2) const;
+    template< typename R, typename A1 > ::boost::shared_future< R > asyncCall(A1 a1) const;
+    template< typename R > ::boost::shared_future< R > asyncCall() const;
+    /**  @} */
+
+    /// Returns number of connections.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_connections.size();
+    }
+protected:
+
+    /// Copy constructor forbidden
+    SlotBase( const SlotBase& );
+
+    /// Copy operator forbiden
+    SlotBase& operator=( const SlotBase& );
+
+    /**
+     * @name SlotBase's friends
+     * @{ */
+    template < typename F >
+    friend struct SlotConnection;
+
+    template < typename F >
+    friend struct Signal;
+    /**  @} */
+
+
+    /// Returns F typeid name.
+    template < typename F >
+    std::string getTypeName() const
+    {
+        std::string signature = std::string("function_type(") + typeid(F).name() + ")";
+        return signature;
+    }
+
+    SlotBase(unsigned int arity) : m_arity(arity)
+    {
+#ifdef COM_LOG
+        ::fwCore::mt::ScopedLock lock(s_mutexCounter);
+        m_id = "Slot-" + ::boost::lexical_cast<std::string>(s_idCount++);
+#endif
+    };
+
+
+    /// Slot's signature based on typeid.
+    std::string m_signature;
+
+    /// Slot's arity.
+    const unsigned int m_arity;
+
+    /// Slot's Worker.
+    SPTR(::fwThread::Worker) m_worker;
+
+    /// Container of current connections.
+    ConnectionSetType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+    mutable ::fwCore::mt::ReadWriteMutex m_workerMutex;
+
+#ifdef COM_LOG
+
+public:
+
+    /// Gets current m_id
+    IDType getID() const
+    {
+        return m_id;
+    }
+
+    /// Sets new m_id
+    void setID( IDType newId )
+    {
+        m_id = newId;
+    }
+
+private :
+
+    /// Id of signal (not mandatory)
+    IDType m_id;
+
+    /// Id counter
+    FWCOM_API static size_t s_idCount;
+
+    /// Mutex to protect id counter
+    FWCOM_API static ::fwCore::mt::Mutex s_mutexCounter;
+
+#endif
+};
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTBASE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp.vrdc
new file mode 100644
index 0000000..de8110c
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotBase.hpp.vrdc
@@ -0,0 +1,233 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTBASE_HPP__
+#define __FWCOM_SLOTBASE_HPP__
+
+#include <set>
+#include <queue>
+
+#include <boost/foreach.hpp>
+#include <boost/thread/future.hpp>
+
+#ifdef COM_LOG
+#include <boost/lexical_cast.hpp>
+#endif
+
+#include <fwCore/mt/types.hpp>
+#include <fwCore/BaseObject.hpp>
+#include <fwCore/spyLog.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/util/convert_function_type.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotRun;
+
+template< typename F >
+struct Slot;
+
+struct SlotConnectionBase;
+
+/**
+ * @brief Base class for Slot implementations.
+ */
+struct FWCOM_CLASS_API SlotBase : virtual fwCore::BaseObject
+{
+
+    /**
+     * @name typedefs
+     * @{
+     * Slot pointer types. */
+    typedef SPTR( SlotBase ) sptr;
+    typedef WPTR( SlotBase ) wptr;
+    typedef SPTR( SlotBase const ) csptr;
+    typedef WPTR( SlotBase const ) cwptr;
+
+    typedef std::string IDType;
+    /**  @} */
+
+    /// SlotBase::asyncRun return type.
+    typedef ::boost::shared_future< void > VoidSharedFutureType;
+
+    /// Connections container type
+    typedef std::set< CSPTR( SlotConnectionBase ) > ConnectionSetType;
+
+    virtual ~SlotBase() {};
+
+    /**
+     * @brief Returns Slot's arity.
+     * The arity defines the number of parameters in Slot signature.
+     */
+    unsigned int arity() const
+    {
+        return m_arity;
+    }
+
+    /// Sets Slot's Worker.
+    void setWorker(const SPTR(::fwThread::Worker) &worker)
+    {
+        ::fwCore::mt::WriteLock lock(m_workerMutex);
+
+        m_worker = worker;
+    }
+
+    /// Returns Slot's Worker.
+    SPTR(::fwThread::Worker) getWorker() const
+    {
+        ::fwCore::mt::ReadLock lock(m_workerMutex);
+        return m_worker;
+    }
+
+    /**
+     * @brief  Run the Slot.
+     * @throw  BadRun if given arguments do not match the slot implementation
+     */
+    /**
+     * @name Run helpers
+     * @{ */
+    template< typename A1, typename A2, typename A3 > void run(A1 a1, A2 a2, A3 a3) const;
+    template< typename A1, typename A2 > void run(A1 a1, A2 a2) const;
+    template< typename A1 > void run(A1 a1) const;
+    FWCOM_API void run() const;
+    /**  @} */
+
+    /**
+     * @brief  Call the Slot (with return value).
+     * @throw  BadCall if given arguments do not match the slot implementation
+     */
+    /**
+     * @name Call helpers
+     * @{ */
+    template< typename R, typename A1, typename A2, typename A3 > R call(A1 a1, A2 a2, A3 a3) const;
+    template< typename R, typename A1, typename A2 > R call(A1 a1, A2 a2) const;
+    template< typename R, typename A1 > R call(A1 a1) const;
+    template< typename R > R call() const;
+    /**  @} */
+
+    /**
+     * @brief  Run the Slot asynchronously.
+     * @throw  BadRun if given arguments do not match the slot implementation
+     * @throws NoWorker if given worker is not valid.
+     */
+    /**
+     * @name Asynchronous run helpers
+     * @{ */
+    template< typename A1, typename A2, typename A3 > VoidSharedFutureType asyncRun(A1 a1, A2 a2, A3 a3) const;
+    template< typename A1, typename A2 > VoidSharedFutureType asyncRun(A1 a1, A2 a2) const;
+    template< typename A1 > VoidSharedFutureType asyncRun(A1 a1) const;
+    FWCOM_API VoidSharedFutureType asyncRun() const;
+    /**  @} */
+
+    /**
+     * @brief  Call the Slot asynchronously (with return value).
+     * @throw  BadCall if given arguments do not match the slot implementation
+     * @throws NoWorker if given worker is not valid.
+     */
+    /**
+     * @name Asynchronous call helpers
+     * @{ */
+    template< typename R, typename A1, typename A2, typename A3 > ::boost::shared_future< R > asyncCall(A1 a1, A2 a2, A3 a3) const;
+    template< typename R, typename A1, typename A2 > ::boost::shared_future< R > asyncCall(A1 a1, A2 a2) const;
+    template< typename R, typename A1 > ::boost::shared_future< R > asyncCall(A1 a1) const;
+    template< typename R > ::boost::shared_future< R > asyncCall() const;
+    /**  @} */
+
+    /// Returns number of connections.
+    size_t getNumberOfConnections() const
+    {
+        ::fwCore::mt::ReadLock lock(m_connectionsMutex);
+        return m_connections.size();
+    }
+protected:
+
+    /// Copy constructor forbidden
+    SlotBase( const SlotBase& );
+
+    /// Copy operator forbiden
+    SlotBase& operator=( const SlotBase& );
+
+    /**
+     * @name SlotBase's friends
+     * @{ */
+    template < typename F >
+    friend struct SlotConnection;
+
+    template < typename F >
+    friend struct Signal;
+    /**  @} */
+
+
+    /// Returns F typeid name.
+    template < typename F >
+    std::string getTypeName() const
+    {
+        std::string signature = std::string("function_type(") + typeid(F).name() + ")";
+        return signature;
+    }
+
+    SlotBase(unsigned int arity) : m_arity(arity)
+    {
+#ifdef COM_LOG
+        ::fwCore::mt::ScopedLock lock(s_mutexCounter);
+        m_id = "Slot-" + ::boost::lexical_cast<std::string>(s_idCount++);
+#endif
+    };
+
+
+    /// Slot's signature based on typeid.
+    std::string m_signature;
+
+    /// Slot's arity.
+    const unsigned int m_arity;
+
+    /// Slot's Worker.
+    SPTR(::fwThread::Worker) m_worker;
+
+    /// Container of current connections.
+    ConnectionSetType m_connections;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_connectionsMutex;
+    mutable ::fwCore::mt::ReadWriteMutex m_workerMutex;
+
+#ifdef COM_LOG
+
+public:
+
+    /// Gets current m_id
+    IDType getID() const
+    {
+        return m_id;
+    }
+
+    /// Sets new m_id
+    void setID( IDType newId )
+    {
+        m_id = newId;
+    }
+
+private :
+
+    /// Id of signal (not mandatory)
+    IDType m_id;
+
+    /// Id counter
+    FWCOM_API static size_t s_idCount;
+
+    /// Mutex to protect id counter
+    FWCOM_API static ::fwCore::mt::Mutex s_mutexCounter;
+
+#endif
+};
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTBASE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx b/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx
new file mode 100644
index 0000000..79553f6
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx
@@ -0,0 +1,265 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTBASE_HXX__
+#define __FWCOM_SLOTBASE_HXX__
+
+#ifndef __FWCOM_SLOTBASE_HPP__
+#error fwCom/SlotBase.hpp not included
+#endif
+
+#include <boost/function.hpp>
+
+#include <boost/function_types/function_arity.hpp>
+
+#include "fwCom/exception/BadCall.hpp"
+
+#include "fwCom/SlotRun.hpp"
+#include "fwCom/SlotRun.hxx"
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+
+
+namespace fwCom
+{
+
+
+template< typename A1, typename A2, typename A3 >
+void SlotBase::run(A1 a1, A2 a2, A3 a3) const
+{
+    typedef SlotRun< void(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR( "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2, A3) >() );
+        this->run(a1,a2);
+    }
+}
+
+template< typename A1, typename A2 >
+void SlotBase::run(A1 a1, A2 a2) const
+{
+    typedef SlotRun< void(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2) >() );
+        this->run(a1);
+    }
+}
+
+template< typename A1 >
+void SlotBase::run(A1 a1) const
+{
+    typedef SlotRun< void(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->run(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1) >() );
+        return this->run();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template< typename R, typename A1, typename A2, typename A3 >
+R SlotBase::call(A1 a1, A2 a2, A3 a3) const
+{
+    typedef Slot< R (A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2, A3) >() );
+        return this->call<R>(a1,a2);
+    }
+}
+
+template< typename R, typename A1, typename A2 >
+R SlotBase::call(A1 a1, A2 a2) const
+{
+    typedef Slot< R(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2) >() );
+        return this->call<R>(a1);
+    }
+}
+
+template< typename R, typename A1 >
+R SlotBase::call(A1 a1) const
+{
+    typedef Slot< R(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1) >() );
+        return this->call<R>();
+    }
+}
+
+template< typename R >
+R SlotBase::call() const
+{
+    typedef Slot< R() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call();
+    }
+    OSLM_ERROR( "failed to call : " + m_signature + " with " + SlotBase::getTypeName< R() >() );
+    FW_RAISE_EXCEPTION( ::fwCom::exception::BadCall( "Failed to find right signature for call" ) );
+}
+
+//------------------------------------------------------------------------------
+
+template< typename A1, typename A2, typename A3 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1, A2 a2, A3 a3) const
+{
+    typedef SlotRun< void(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2, A3) >() );
+        return this->asyncRun(a1,a2);
+    }
+}
+
+template< typename A1, typename A2 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1, A2 a2) const
+{
+    typedef SlotRun< void(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2) >() );
+        return this->asyncRun(a1);
+    }
+}
+
+template< typename A1 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1) const
+{
+    typedef SlotRun< void(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1) >() );
+        return this->asyncRun();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template< typename R, typename A1, typename A2, typename A3 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1, A2 a2, A3 a3) const
+{
+    typedef Slot< R(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2, A3) >() );
+        return this->asyncCall<R>(a1,a2);
+    }
+}
+
+template< typename R, typename A1, typename A2 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1, A2 a2) const
+{
+    typedef Slot< R(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2) >() );
+        return this->asyncCall<R>(a1);
+    }
+}
+
+template< typename R, typename A1 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1) const
+{
+    typedef Slot< R(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1) >() );
+        return this->asyncCall<R>();
+    }
+}
+
+template< typename R >
+::boost::shared_future< R > SlotBase::asyncCall() const
+{
+    typedef Slot< R() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall();
+    }
+    else
+    {
+        OSLM_ERROR( "failed to asyncCall : " + m_signature + " with " + SlotBase::getTypeName< R() >() );
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadCall( "Failed to find right signature for asyncCall" ) );
+    }
+}
+
+
+
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTBASE_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx.vrdc
new file mode 100644
index 0000000..79553f6
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotBase.hxx.vrdc
@@ -0,0 +1,265 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTBASE_HXX__
+#define __FWCOM_SLOTBASE_HXX__
+
+#ifndef __FWCOM_SLOTBASE_HPP__
+#error fwCom/SlotBase.hpp not included
+#endif
+
+#include <boost/function.hpp>
+
+#include <boost/function_types/function_arity.hpp>
+
+#include "fwCom/exception/BadCall.hpp"
+
+#include "fwCom/SlotRun.hpp"
+#include "fwCom/SlotRun.hxx"
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+
+
+namespace fwCom
+{
+
+
+template< typename A1, typename A2, typename A3 >
+void SlotBase::run(A1 a1, A2 a2, A3 a3) const
+{
+    typedef SlotRun< void(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR( "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2, A3) >() );
+        this->run(a1,a2);
+    }
+}
+
+template< typename A1, typename A2 >
+void SlotBase::run(A1 a1, A2 a2) const
+{
+    typedef SlotRun< void(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2) >() );
+        this->run(a1);
+    }
+}
+
+template< typename A1 >
+void SlotBase::run(A1 a1) const
+{
+    typedef SlotRun< void(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->run(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to run : " << m_signature << " with " << SlotBase::getTypeName< void(A1) >() );
+        return this->run();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template< typename R, typename A1, typename A2, typename A3 >
+R SlotBase::call(A1 a1, A2 a2, A3 a3) const
+{
+    typedef Slot< R (A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2, A3) >() );
+        return this->call<R>(a1,a2);
+    }
+}
+
+template< typename R, typename A1, typename A2 >
+R SlotBase::call(A1 a1, A2 a2) const
+{
+    typedef Slot< R(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2) >() );
+        return this->call<R>(a1);
+    }
+}
+
+template< typename R, typename A1 >
+R SlotBase::call(A1 a1) const
+{
+    typedef Slot< R(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to call : " << m_signature << " with " << SlotBase::getTypeName< R(A1) >() );
+        return this->call<R>();
+    }
+}
+
+template< typename R >
+R SlotBase::call() const
+{
+    typedef Slot< R() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call();
+    }
+    OSLM_ERROR( "failed to call : " + m_signature + " with " + SlotBase::getTypeName< R() >() );
+    FW_RAISE_EXCEPTION( ::fwCom::exception::BadCall( "Failed to find right signature for call" ) );
+}
+
+//------------------------------------------------------------------------------
+
+template< typename A1, typename A2, typename A3 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1, A2 a2, A3 a3) const
+{
+    typedef SlotRun< void(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2, A3) >() );
+        return this->asyncRun(a1,a2);
+    }
+}
+
+template< typename A1, typename A2 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1, A2 a2) const
+{
+    typedef SlotRun< void(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1, A2) >() );
+        return this->asyncRun(a1);
+    }
+}
+
+template< typename A1 >
+SlotBase::VoidSharedFutureType SlotBase::asyncRun(A1 a1) const
+{
+    typedef SlotRun< void(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncRun : " << m_signature << " with " << SlotBase::getTypeName< void(A1) >() );
+        return this->asyncRun();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template< typename R, typename A1, typename A2, typename A3 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1, A2 a2, A3 a3) const
+{
+    typedef Slot< R(A1, A2, A3) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1,a2,a3);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2, A3) >() );
+        return this->asyncCall<R>(a1,a2);
+    }
+}
+
+template< typename R, typename A1, typename A2 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1, A2 a2) const
+{
+    typedef Slot< R(A1, A2) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1,a2);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1, A2) >() );
+        return this->asyncCall<R>(a1);
+    }
+}
+
+template< typename R, typename A1 >
+::boost::shared_future< R > SlotBase::asyncCall(A1 a1) const
+{
+    typedef Slot< R(A1) > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall(a1);
+    }
+    else
+    {
+        OSLM_ERROR(  "failed to asyncCall : " << m_signature << " with " << SlotBase::getTypeName< R(A1) >() );
+        return this->asyncCall<R>();
+    }
+}
+
+template< typename R >
+::boost::shared_future< R > SlotBase::asyncCall() const
+{
+    typedef Slot< R() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncCall();
+    }
+    else
+    {
+        OSLM_ERROR( "failed to asyncCall : " + m_signature + " with " + SlotBase::getTypeName< R() >() );
+        FW_RAISE_EXCEPTION( ::fwCom::exception::BadCall( "Failed to find right signature for asyncCall" ) );
+    }
+}
+
+
+
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTBASE_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp b/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp
new file mode 100644
index 0000000..107017d
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp
@@ -0,0 +1,426 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCALL_HPP__
+#define __FWCOM_SLOTCALL_HPP__
+
+#include "fwCom/SlotRun.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotCall;
+
+/**
+ * @brief Slot call interface (call with return value).
+ *
+ * @tparam R Slot's return type.
+ * @tparam A Slot's arguments types.
+ */
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct SlotCall< R ( A1, A2, A3, A4, A5 ) > : SlotRun< void ( A1, A2, A3, A4, A5 ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3, A4, A5 );
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A1, A2, A3, A4, A5 ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call( A1, A2, A3, A4, A5 ) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+struct SlotCall< R ( A1, A2, A3, A4 ) > : SlotRun< void ( A1, A2, A3, A4 ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3, A4 );
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A1, A2, A3, A4 ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call( A1, A2, A3, A4 ) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+};
+template< typename R, typename A1, typename A2, typename A3 >
+struct SlotCall< R ( A1, A2, A3 ) > : SlotRun< void ( A1, A2, A3 ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2, A3 );
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A1, A2, A3 ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call( A1, A2, A3 ) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3 ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A1 args1, A2 args2, A3 args3 ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3 ) const;
+};
+template< typename R, typename A1, typename A2 >
+struct SlotCall< R ( A1, A2 ) > : SlotRun< void ( A1, A2 ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1, A2 );
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A1, A2 ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call( A1, A2 ) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2 ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A1 args1, A2 args2 ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A1 args1, A2 args2 ) const;
+};
+template< typename R, typename A1 >
+struct SlotCall< R ( A1 ) > : SlotRun< void ( A1 ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType( A1 );
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A1 ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call( A1 ) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A1 args1 ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A1 args1 ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A1 args1 ) const;
+};
+template< typename R>
+struct SlotCall< R () > : SlotRun< void () >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType();
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void () >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call() const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall() const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall() const;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ...A >
+struct SlotCall< R (A...) > : SlotRun< void ( A... ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType(A...);
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A... ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call(A...) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A... args ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A... args ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A...args  ) const;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCALL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp.vrdc
new file mode 100644
index 0000000..d60aa6f
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotCall.hpp.vrdc
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCALL_HPP__
+#define __FWCOM_SLOTCALL_HPP__
+
+#include "fwCom/SlotRun.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotCall;
+
+/**
+ * @brief Slot call interface (call with return value).
+ *
+ * @tparam R Slot's return type.
+ * @tparam A Slot's arguments types.
+ */
+template< typename R, typename ...A >
+struct SlotCall< R (A...) > : SlotRun< void ( A... ) >
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef R SignatureType(A...);
+    typedef SlotCall< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    typedef ::boost::shared_future< R > SharedFutureType;
+    /**  @} */
+
+
+    SlotCall() :  SlotRun< void ( A... ) >() {}
+
+    /**
+     * @brief Call the Slot with the given parameters.
+     */
+    virtual R call(A...) const = 0;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     *
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SharedFutureType asyncCall( const SPTR(::fwThread::Worker) &worker, A... args ) const;
+
+    /**
+     * @brief Call the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's call result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SharedFutureType asyncCall( A... args ) const;
+
+protected:
+
+    template< typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the call method within a R() function.
+     *
+     * @return a R() function.
+     */
+    virtual ::boost::function< R() > bindCall( A...args  ) const;
+};
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCALL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx b/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx
new file mode 100644
index 0000000..6c0e192
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx
@@ -0,0 +1,664 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCALL_HXX__
+#define __FWCOM_SLOTCALL_HXX__
+
+#ifndef __FWCOM_SLOTCALL_HPP__
+#error fwCom/SlotCall.hpp not included
+#endif
+
+#include <boost/thread/future.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwThread/TaskHandler.hpp>
+#include <fwThread/Worker.hpp>
+
+#include "fwCom/exception/NoWorker.hpp"
+
+#include "fwCom/util/WeakCall.hpp"
+
+#include "fwCom/SlotRun.hxx"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< R() > SlotCall< R ( A1, A2, A3, A4, A5 ) >::bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    return ::boost::bind( ( R (SlotCall< R ( A1, A2, A3, A4, A5 ) >::*)( A1, A2, A3, A4, A5 )const ) &SlotCall< R ( A1, A2, A3, A4, A5 ) >::call, this, args1, args2, args3, args4, args5 );
+}
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< R() > SlotCall< R ( A1, A2, A3, A4 ) >::bindCall( A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    return ::boost::bind( ( R (SlotCall< R ( A1, A2, A3, A4 ) >::*)( A1, A2, A3, A4 )const ) &SlotCall< R ( A1, A2, A3, A4 ) >::call, this, args1, args2, args3, args4 );
+}
+
+
+template< typename R, typename A1, typename A2, typename A3 >
+::boost::function< R() > SlotCall< R ( A1, A2, A3 ) >::bindCall( A1 args1, A2 args2, A3 args3 ) const
+{
+    return ::boost::bind( ( R (SlotCall< R ( A1, A2, A3 ) >::*)( A1, A2, A3 )const ) &SlotCall< R ( A1, A2, A3 ) >::call, this, args1, args2, args3 );
+}
+
+
+template< typename R, typename A1, typename A2 >
+::boost::function< R() > SlotCall< R ( A1, A2 ) >::bindCall( A1 args1, A2 args2 ) const
+{
+    return ::boost::bind( ( R (SlotCall< R ( A1, A2 ) >::*)( A1, A2 )const ) &SlotCall< R ( A1, A2 ) >::call, this, args1, args2 );
+}
+
+
+template< typename R, typename A1 >
+::boost::function< R() > SlotCall< R ( A1 ) >::bindCall( A1 args1 ) const
+{
+    return ::boost::bind( ( R (SlotCall< R ( A1 ) >::*)( A1 )const ) &SlotCall< R ( A1 ) >::call, this, args1 );
+}
+
+
+template< typename R>
+::boost::function< R() > SlotCall< R () >::bindCall() const
+{
+    return ::boost::bind( ( R (SlotCall< R () >::*)()const ) &SlotCall< R () >::call, this);
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ...A >
+::boost::function< R() > SlotCall< R (A...) >::bindCall( A...args  ) const
+{
+    return ::boost::bind( ( R (SlotCall< R (A...) >::*)( A... )const ) &SlotCall< R (A...) >::call, this, args... );
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    typename SlotCall< R ( A1, A2, A3, A4, A5 ) >::SharedFutureType
+    SlotCall< R ( A1, A2, A3, A4, A5 ) >::asyncCall( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args1, args2, args3, args4, args5 ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args1, args2, args3, args4, args5 ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3, args4, args5 )
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+    typename SlotCall< R ( A1, A2, A3, A4 ) >::SharedFutureType
+    SlotCall< R ( A1, A2, A3, A4 ) >::asyncCall( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args1, args2, args3, args4 ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args1, args2, args3, args4 ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3, args4 )
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3 >
+    typename SlotCall< R ( A1, A2, A3 ) >::SharedFutureType
+    SlotCall< R ( A1, A2, A3 ) >::asyncCall( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args1, args2, args3 ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args1, args2, args3 ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3 )
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2 >
+    typename SlotCall< R ( A1, A2 ) >::SharedFutureType
+    SlotCall< R ( A1, A2 ) >::asyncCall( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args1, args2 ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args1, args2 ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2 )
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1 >
+    typename SlotCall< R ( A1 ) >::SharedFutureType
+    SlotCall< R ( A1 ) >::asyncCall( const ::fwThread::Worker::sptr &worker, A1 args1 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args1 ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args1 ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1 )
+                        )
+                );
+}
+
+
+
+template< typename R>
+    typename SlotCall< R () >::SharedFutureType
+    SlotCall< R () >::asyncCall( const ::fwThread::Worker::sptr &worker) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall() ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall(),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall()
+                        )
+                );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ...A >
+    typename SlotCall< R (A...) >::SharedFutureType
+    SlotCall< R (A...) >::asyncCall( const ::fwThread::Worker::sptr &worker, A... args ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args... ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args... ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args... )
+                        )
+                );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+typename SlotCall< R ( A1, A2, A3, A4, A5 ) >::SharedFutureType
+SlotCall< R ( A1, A2, A3, A4, A5 ) >::asyncCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R ( A1, A2, A3, A4, A5 ) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args1, args2, args3, args4, args5 );
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3, args4, args5 ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+typename SlotCall< R ( A1, A2, A3, A4 ) >::SharedFutureType
+SlotCall< R ( A1, A2, A3, A4 ) >::asyncCall( A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R ( A1, A2, A3, A4 ) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args1, args2, args3, args4 );
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3, args4 ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3 >
+typename SlotCall< R ( A1, A2, A3 ) >::SharedFutureType
+SlotCall< R ( A1, A2, A3 ) >::asyncCall( A1 args1, A2 args2, A3 args3 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R ( A1, A2, A3 ) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args1, args2, args3 );
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2, args3 ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1, typename A2 >
+typename SlotCall< R ( A1, A2 ) >::SharedFutureType
+SlotCall< R ( A1, A2 ) >::asyncCall( A1 args1, A2 args2 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R ( A1, A2 ) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args1, args2 );
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1, args2 ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+template< typename R, typename A1 >
+typename SlotCall< R ( A1 ) >::SharedFutureType
+SlotCall< R ( A1 ) >::asyncCall( A1 args1 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R ( A1 ) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args1 );
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args1 ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+template< typename R>
+typename SlotCall< R () >::SharedFutureType
+SlotCall< R () >::asyncCall() const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R () >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker);
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall(),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ... A >
+typename SlotCall< R (A...) >::SharedFutureType
+SlotCall< R (A...) >::asyncCall(A... args) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R (A...) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args...);
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args... ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R ( A1, A2, A3, A4, A5 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R ( A1, A2, A3, A4 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename R, typename A1, typename A2, typename A3 >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R ( A1, A2, A3 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename R, typename A1, typename A2 >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R ( A1, A2 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename R, typename A1 >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R ( A1 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename R>
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R () >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ... A >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R (A...) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCALL_HXX__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx.vrdc
new file mode 100644
index 0000000..b6a00d6
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotCall.hxx.vrdc
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCALL_HXX__
+#define __FWCOM_SLOTCALL_HXX__
+
+#ifndef __FWCOM_SLOTCALL_HPP__
+#error fwCom/SlotCall.hpp not included
+#endif
+
+#include <boost/thread/future.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwThread/TaskHandler.hpp>
+#include <fwThread/Worker.hpp>
+
+#include "fwCom/exception/NoWorker.hpp"
+
+#include "fwCom/util/WeakCall.hpp"
+
+#include "fwCom/SlotRun.hxx"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+
+template< typename R, typename ...A >
+::boost::function< R() > SlotCall< R (A...) >::bindCall( A...args  ) const
+{
+    return ::boost::bind( ( R (SlotCall< R (A...) >::*)( A... )const ) &SlotCall< R (A...) >::call, this, args... );
+}
+
+template< typename R, typename ...A >
+    typename SlotCall< R (A...) >::SharedFutureType
+    SlotCall< R (A...) >::asyncCall( const ::fwThread::Worker::sptr &worker, A... args ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncCall '"<< this->getID() <<"' slot");
+    // ::boost::packaged_task<R>   task( ::fwCom::util::weakcall( this->shared_from_this(), this->bindCall( args... ) ) );
+
+    // ::boost::packaged_task< R > task(::fwCom::util::weakcall(
+    //                             this->shared_from_this(),
+    //                             this->bindCall( args... ),
+    //                             this->m_workerMutex ));
+
+    // ::boost::future< R > ufuture = task.get_future();
+    // ::boost::function< void() > f = ::fwThread::moveTaskIntoFunction(task);
+    // worker->post(f);
+
+    // return ::boost::move(ufuture);
+
+    return postWeakCall(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args... )
+                        )
+                );
+}
+
+
+template< typename R, typename ... A >
+typename SlotCall< R (A...) >::SharedFutureType
+SlotCall< R (A...) >::asyncCall(A... args) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    // typename SlotCall< R (A...) >::SharedFutureType ufuture;
+    // ufuture = this->asyncCall(this->m_worker, args...);
+    // return ufuture;
+
+    return postWeakCall(
+                this->m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindCall( args... ),
+                        this->m_workerMutex
+                        )
+                );
+}
+
+
+template< typename R, typename ... A >
+template< typename WEAKCALL >
+::boost::shared_future< R > SlotCall< R (A...) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCALL_HXX__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp
new file mode 100644
index 0000000..f964c2d
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp
@@ -0,0 +1,715 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCONNECTION_HPP__
+#define __FWCOM_SLOTCONNECTION_HPP__
+
+#include "fwCom/SlotConnectionBase.hpp"
+
+
+namespace fwCom
+{
+
+template < typename F >
+struct Signal;
+
+template < typename F >
+struct SlotConnection;
+
+struct SlotBase;
+
+/**
+ * @brief Slot connection implementation.
+ * This class is for internal use purpose.
+ */
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct SlotConnection< void ( A1, A2, A3, A4, A5 ) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3, A4, A5 );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+template < typename A1, typename A2, typename A3, typename A4 >
+struct SlotConnection< void ( A1, A2, A3, A4 ) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3, A4 );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+template < typename A1, typename A2, typename A3 >
+struct SlotConnection< void ( A1, A2, A3 ) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3 );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+template < typename A1, typename A2 >
+struct SlotConnection< void ( A1, A2 ) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2 );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+template < typename A1 >
+struct SlotConnection< void ( A1 ) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1 );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+template <>
+struct SlotConnection< void () > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType();
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+struct SlotConnection< void (A...) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A... );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCONNECTION_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp.vrdc
new file mode 100644
index 0000000..7e9a3d3
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hpp.vrdc
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCONNECTION_HPP__
+#define __FWCOM_SLOTCONNECTION_HPP__
+
+#include "fwCom/SlotConnectionBase.hpp"
+
+
+namespace fwCom
+{
+
+template < typename F >
+struct Signal;
+
+template < typename F >
+struct SlotConnection;
+
+struct SlotBase;
+
+/**
+ * @brief Slot connection implementation.
+ * This class is for internal use purpose.
+ */
+template < typename ...A >
+struct SlotConnection< void (A...) > : SlotConnectionBase
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A... );
+    typedef SlotConnection< SignatureType > SelfType;
+
+    typedef SPTR( SelfType ) sptr;
+
+    typedef Signal< SignatureType > SignalType;
+    typedef SPTR( SignalType )      SignalSptrType;
+    typedef WPTR( SignalType )      SignalWptrType;
+
+    typedef SlotRun< SignatureType > SlotWrapperType;
+    typedef SPTR( SlotWrapperType )  SlotWrapperSptrType;
+
+    typedef SlotRun< SignatureType > SlotRunType;
+    typedef SPTR( SlotRunType )      SlotRunSptrType;
+
+    typedef std::pair< bool, SlotRunType* > PairType;
+    /**  @} */
+
+    /// Build a new connection with the given signal and slot.
+    static sptr New( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    static sptr New( const SignalSptrType &signal,
+                     const SPTR( SlotBase ) &slot,
+                     const SlotWrapperSptrType &slotWrapper
+                    );
+
+    /// Disconnect the related slot.
+    void disconnect();
+
+    ~SlotConnection();
+
+
+    /// Build a new connection with the given signal and slot.
+    SlotConnection( const SignalSptrType &signal, const SlotRunSptrType &slot );
+
+    /// Build a new connection with the given signal, slot and wrapper.
+    SlotConnection( const SignalSptrType &signal,
+                    const SPTR( SlotBase ) &slot,
+                    const SlotWrapperSptrType &slotWrapper
+                    );
+
+
+protected:
+
+    template < typename F >
+    friend struct Signal;
+
+    /// Connect the related Signal and Slot together.
+    void connectNoLock();
+
+
+    /// *NOT THREAD SAFE* Disconnect the related signal.
+    void disconnectSignalNoLock(const SignalSptrType &sig);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot.
+    void disconnectSlotNoLock(const SPTR( SlotBase ) &slot);
+
+    /// *NOT THREAD SAFE* Disconnect the related slot and signal.
+    void disconnectWeakLock();
+
+    /**
+     * @brief Returns a blocker on the connection.
+     * The connection is blocked until the returned shared pointer dies.
+     */
+    SlotConnectionBase::BlockerSptrType getBlocker();
+
+    /// Unblock this connection.
+    void unblock();
+
+    /// Related Signal.
+    SignalWptrType m_signal;
+
+    /// Related Slot.
+    WPTR( SlotBase ) m_connectedSlot;
+
+    /// Slot wrapper.
+    SlotWrapperSptrType m_slotWrapper;
+
+    /**
+     * @brief Associates state of this connection to related Slot.
+     * If m_pair.first is false, the connection is blocked.
+     */
+    PairType m_pair;
+
+    /// Connection blocker.
+    SlotConnectionBase::BlockerWptrType m_weakBlocker;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCONNECTION_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx
new file mode 100644
index 0000000..7e10808
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx
@@ -0,0 +1,1558 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCONNECTION_HXX__
+#define __FWCOM_SLOTCONNECTION_HXX__
+
+#ifndef __FWCOM_SLOTCONNECTION_HPP__
+#error fwCom/SlotConnection.hpp not included
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/make_shared.hpp>
+
+#include "fwCom/SlotBase.hpp"
+#include "fwCom/SlotRun.hpp"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3, A4, A5 ) > >  SlotConnection< void ( A1, A2, A3, A4, A5 ) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3, A4 ) > >  SlotConnection< void ( A1, A2, A3, A4 ) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3 ) > >  SlotConnection< void ( A1, A2, A3 ) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+template < typename A1, typename A2 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2 ) > >  SlotConnection< void ( A1, A2 ) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+template < typename A1 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1 ) > >  SlotConnection< void ( A1 ) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+
+inline ::boost::shared_ptr< SlotConnection< void () > >  SlotConnection< void () >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline ::boost::shared_ptr< SlotConnection< void (A...) > >  SlotConnection< void (A...) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3, A4, A5 ) > > SlotConnection< void ( A1, A2, A3, A4, A5 ) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3, A4 ) > > SlotConnection< void ( A1, A2, A3, A4 ) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2, A3 ) > > SlotConnection< void ( A1, A2, A3 ) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+template < typename A1, typename A2 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1, A2 ) > > SlotConnection< void ( A1, A2 ) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+template < typename A1 >
+inline ::boost::shared_ptr< SlotConnection< void ( A1 ) > > SlotConnection< void ( A1 ) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+
+inline ::boost::shared_ptr< SlotConnection< void () > > SlotConnection< void () >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline ::boost::shared_ptr< SlotConnection< void (A...) > > SlotConnection< void (A...) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline SlotConnection< void ( A1, A2, A3, A4, A5 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline SlotConnection< void ( A1, A2, A3, A4 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+template < typename A1, typename A2, typename A3 >
+inline SlotConnection< void ( A1, A2, A3 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+template < typename A1, typename A2 >
+inline SlotConnection< void ( A1, A2 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+template < typename A1 >
+inline SlotConnection< void ( A1 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+
+inline SlotConnection< void () >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline SlotConnection< void (A...) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline SlotConnection< void ( A1, A2, A3, A4, A5 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline SlotConnection< void ( A1, A2, A3, A4 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline SlotConnection< void ( A1, A2, A3 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+template < typename A1, typename A2 >
+inline SlotConnection< void ( A1, A2 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+template < typename A1 >
+inline SlotConnection< void ( A1 ) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+
+inline SlotConnection< void () >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline SlotConnection< void (A...) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline SlotConnection< void ( A1, A2, A3, A4, A5 ) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline SlotConnection< void ( A1, A2, A3, A4 ) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline SlotConnection< void ( A1, A2, A3 ) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+template < typename A1, typename A2 >
+inline SlotConnection< void ( A1, A2 ) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+template < typename A1 >
+inline SlotConnection< void ( A1 ) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+
+inline SlotConnection< void () >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline SlotConnection< void (A...) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+
+inline void SlotConnection< void () >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+
+inline void SlotConnection< void () >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void ( A1, A2, A3, A4, A5 ) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void ( A1, A2, A3, A4, A5 ) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void ( A1, A2, A3, A4 ) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void ( A1, A2, A3, A4 ) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void ( A1, A2, A3 ) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void ( A1, A2, A3 ) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void ( A1, A2 ) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void ( A1, A2 ) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void ( A1 ) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void ( A1 ) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+
+inline void SlotConnection< void () >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void () > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void () > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void (A...) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void (A...) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+inline void SlotConnection< void () >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+
+inline void SlotConnection< void () >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void ( A1, A2, A3, A4, A5 ) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void ( A1, A2, A3, A4, A5 ) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void ( A1, A2, A3, A4 ) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void ( A1, A2, A3, A4 ) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void ( A1, A2, A3 ) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void ( A1, A2, A3 ) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+template < typename A1, typename A2 >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void ( A1, A2 ) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void ( A1, A2 ) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+template < typename A1 >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void ( A1 ) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void ( A1 ) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void () >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void () >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void (A...) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void (A...) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline void SlotConnection< void ( A1, A2, A3, A4, A5 ) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+inline void SlotConnection< void ( A1, A2, A3, A4 ) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+template < typename A1, typename A2, typename A3 >
+inline void SlotConnection< void ( A1, A2, A3 ) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+template < typename A1, typename A2 >
+inline void SlotConnection< void ( A1, A2 ) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+template < typename A1 >
+inline void SlotConnection< void ( A1 ) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+
+inline void SlotConnection< void () >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template < typename ...A >
+inline void SlotConnection< void (A...) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCONNECTION_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx.vrdc
new file mode 100644
index 0000000..ee6be8a
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotConnection.hxx.vrdc
@@ -0,0 +1,217 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCONNECTION_HXX__
+#define __FWCOM_SLOTCONNECTION_HXX__
+
+#ifndef __FWCOM_SLOTCONNECTION_HPP__
+#error fwCom/SlotConnection.hpp not included
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/make_shared.hpp>
+
+#include "fwCom/SlotBase.hpp"
+#include "fwCom/SlotRun.hpp"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+
+template < typename ...A >
+inline ::boost::shared_ptr< SlotConnection< void (A...) > >  SlotConnection< void (A...) >::New(
+                                                                const SignalSptrType &signal,
+                                                                const SlotRunSptrType &slot
+                                                                )
+{
+    return boost::make_shared< SelfType >(signal, slot);
+}
+
+
+
+template < typename ...A >
+inline ::boost::shared_ptr< SlotConnection< void (A...) > > SlotConnection< void (A...) >::New(
+                                                          const SignalSptrType &signal,
+                                                          const SlotBase::sptr &slot,
+                                                          const SlotWrapperSptrType &slotWrapper
+                                                        )
+{
+    return boost::make_shared< SelfType >(signal, slot, slotWrapper);
+}
+
+
+template < typename ...A >
+inline SlotConnection< void (A...) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotRunSptrType &slot
+                                                     )
+    : m_signal(signal), m_connectedSlot(slot), m_pair(true, slot.get())
+{ }
+
+template < typename ...A >
+inline SlotConnection< void (A...) >::SlotConnection(
+                                                     const SignalSptrType &signal,
+                                                     const SlotBase::sptr &slot,
+                                                     const SlotWrapperSptrType &slotWrapper
+                                                    )
+    : m_signal(signal), m_connectedSlot(slot), m_slotWrapper(slotWrapper), m_pair(true, slotWrapper.get())
+{ }
+
+
+template < typename ...A >
+inline SlotConnection< void (A...) >::~SlotConnection()
+{
+    this->disconnect();
+}
+
+
+
+
+
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::connectNoLock()
+{
+    SignalSptrType sig(m_signal);
+    sig->m_slots.push_back( &m_pair );
+    OSLM_COM("Connect '"<< sig->getID() <<"' sig <=> '"<< m_connectedSlot.lock()->getID() <<"' slot");
+}
+
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectSignalNoLock(const SignalSptrType &sig)
+{
+    sig->m_slots.remove( &m_pair );
+    sig->m_connections.erase(m_connectedSlot);
+    OSLM_COM("Disconnect '"<< sig->getID() <<"' sig <=> '"  <<
+            (m_connectedSlot.expired() ? "<dead slot>" : m_connectedSlot.lock()->getID()) <<"' slot" );
+}
+
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectSlotNoLock(const SlotBase::sptr &slot)
+{
+    try
+    {
+        boost::shared_ptr< const SlotConnection< void (A...) > > thisSptr =
+            boost::dynamic_pointer_cast< const SlotConnection< void (A...) > > ( this->shared_from_this() );
+        slot->m_connections.erase( thisSptr );
+        OSLM_COM("Disconnect '"
+                << (m_signal.expired() ? "<dead signal>" : m_signal.lock()->getID())
+                <<"' sig <=> '"  <<  slot->getID() <<"' slot" );
+    }
+    catch(const boost::bad_weak_ptr&)
+    {
+        // SlotConnection destruction is under way, no need to remove
+        // shared_ptr from connections
+    }
+}
+
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnect()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        ::fwCore::mt::WriteLock lock(sig->m_connectionsMutex);
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::disconnectWeakLock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+
+    SignalSptrType sig(m_signal.lock());
+    SlotBase::sptr slot(m_connectedSlot.lock());
+
+    if(sig)
+    {
+        this->disconnectSignalNoLock(sig);
+    }
+
+    m_slotWrapper.reset();
+
+    if(slot)
+    {
+        ::fwCore::mt::WriteLock lock(slot->m_connectionsMutex);
+        this->disconnectSlotNoLock(slot);
+    }
+
+    m_signal.reset();
+    m_connectedSlot.reset();
+}
+
+
+
+template < typename ...A >
+inline SlotConnectionBase::BlockerSptrType SlotConnection< void (A...) >::getBlocker()
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_mutex);
+
+    SlotConnectionBase::BlockerSptrType blocker(m_weakBlocker.lock());
+    if( !blocker )
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+
+        blocker = m_weakBlocker.lock();
+
+        if(!blocker)
+        {
+            blocker = SlotConnectionBase::BlockerSptrType(
+                              (void*)NULL,
+                              boost::bind( &SlotConnection< void (A...) >::unblock, this )
+                              );
+            m_weakBlocker = blocker;
+
+            // signal has to be locked : signal got a pointer on m_pair
+            SignalSptrType sig(m_signal);
+            ::fwCore::mt::ReadLock lock(sig->m_connectionsMutex);
+            m_pair.first = false;
+        }
+    }
+    return blocker;
+}
+
+
+
+template < typename ...A >
+inline void SlotConnection< void (A...) >::unblock()
+{
+    ::fwCore::mt::WriteLock lock(m_mutex);
+    // signal has to be locked : signal got a pointer on m_pair
+    SignalSptrType sig(m_signal);
+    ::fwCore::mt::ReadLock connectionLock(sig->m_connectionsMutex);
+    m_pair.first = true;
+}
+
+
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCONNECTION_HXX__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotConnectionBase.hpp b/SrcLib/core/fwCom/include/fwCom/SlotConnectionBase.hpp
new file mode 100644
index 0000000..ff44449
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotConnectionBase.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTCONNECTIONBASE_HPP__
+#define __FWCOM_SLOTCONNECTIONBASE_HPP__
+
+#include <fwCore/BaseObject.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+/**
+ * @brief Base class for Slot connection implementation.
+ * This class is for internal use purpose.
+ */
+struct SlotConnectionBase: virtual fwCore::BaseObject
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef ::boost::shared_ptr< SlotConnectionBase > sptr;
+    typedef ::boost::shared_ptr< SlotConnectionBase const > csptr;
+    typedef ::boost::weak_ptr< SlotConnectionBase > wptr;
+    typedef ::boost::weak_ptr< SlotConnectionBase const > cwptr;
+
+    typedef boost::shared_ptr< void > BlockerSptrType;
+    typedef boost::weak_ptr< void >   BlockerWptrType;
+    /**  @} */
+
+    SlotConnectionBase(){}
+
+    /// Disconnect a Slot from this connection.
+    virtual void disconnect() = 0;
+
+    /// Returns a .. to block this connection.
+    virtual BlockerSptrType getBlocker() = 0;
+
+protected:
+
+    /// Copy constructor forbidden
+    SlotConnectionBase( const SlotConnectionBase& );
+
+    /// Copy operator forbiden
+    SlotConnectionBase& operator=( const SlotConnectionBase& );
+
+    /**
+     * @name SlotConnectionBase's friends
+     * @{ */
+    template < typename F >
+    friend struct Signal;
+    /**  @} */
+
+    /// *NOT THREAD SAFE* Disconnect a Slot from this connection.
+    virtual void disconnectWeakLock() = 0;
+
+
+    /// *NOT THREAD SAFE* Connect the related Signal and Slot together.
+    virtual void connectNoLock() = 0;
+};
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTCONNECTIONBASE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp b/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp
new file mode 100644
index 0000000..8ee3955
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp
@@ -0,0 +1,423 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTRUN_HPP__
+#define __FWCOM_SLOTRUN_HPP__
+
+#include <set>
+
+#include <boost/function.hpp>
+
+#include "fwCom/SlotBase.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotRun;
+
+/**
+ * @brief Slot run interface (call without return value).
+ *
+ * @tparam A Slot's arguments types.
+ */
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct SlotRun< void ( A1, A2, A3, A4, A5 ) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3, A4, A5 );
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 5 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5 ) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const;
+
+};
+template< typename A1, typename A2, typename A3, typename A4 >
+struct SlotRun< void ( A1, A2, A3, A4 ) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3, A4 );
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 4 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4 ) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4 ) const;
+
+};
+template< typename A1, typename A2, typename A3 >
+struct SlotRun< void ( A1, A2, A3 ) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2, A3 );
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 3 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run( A1  a1, A2  a2, A3  a3 ) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2, A3 args3 ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( A1 args1, A2 args2, A3 args3 ) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3 ) const;
+
+};
+template< typename A1, typename A2 >
+struct SlotRun< void ( A1, A2 ) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1, A2 );
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 2 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run( A1  a1, A2  a2 ) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A1 args1, A2 args2 ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( A1 args1, A2 args2 ) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A1 args1, A2 args2 ) const;
+
+};
+template< typename A1 >
+struct SlotRun< void ( A1 ) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType( A1 );
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 1 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run( A1  a1 ) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A1 args1 ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( A1 args1 ) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A1 args1 ) const;
+
+};
+template<>
+struct SlotRun< void () > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType();
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( 0 ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run() const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun() const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun() const;
+
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A >
+struct SlotRun< void (A...) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType(A...);
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( sizeof...(A) ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run(A ... a) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A... args ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun(A... args) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A...args  ) const;
+
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTRUN_HPP__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp.vrdc
new file mode 100644
index 0000000..6ec41c2
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotRun.hpp.vrdc
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTRUN_HPP__
+#define __FWCOM_SLOTRUN_HPP__
+
+#include <set>
+
+#include <boost/function.hpp>
+
+#include "fwCom/SlotBase.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+template< typename F >
+struct SlotRun;
+
+/**
+ * @brief Slot run interface (call without return value).
+ *
+ * @tparam A Slot's arguments types.
+ */
+template< typename ... A >
+struct SlotRun< void (A...) > : SlotBase
+{
+
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef void SignatureType(A...);
+    typedef SlotRun< SignatureType > SelfType;
+    typedef SPTR( SelfType ) sptr;
+    typedef WPTR( SelfType ) wptr;
+    /**  @} */
+
+    SlotRun() : SlotBase( sizeof...(A) ) {}
+
+    /**
+     * @brief Run the Slot with the given parameters.
+     */
+    virtual void run(A ... a) const = 0;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     *
+     * @param worker Worker that will run the Slot.
+     * @param args run arguments.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if given worker is not valid.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun( const SPTR(::fwThread::Worker) &worker, A... args ) const;
+
+    /**
+     * @brief Run the Slot with the given parameters asynchronously.
+     * The execution of this slot will occur on it's own worker.
+     * @pre Slot's worker must be set.
+     *
+     * @return a shared_future object associated with Slot's run result.
+     * @throws NoWorker if slot has no worker set.
+     */
+    virtual SlotBase::VoidSharedFutureType asyncRun(A... args) const;
+
+protected:
+
+    template< typename R, typename WEAKCALL >
+    static ::boost::shared_future< R > postWeakCall( const SPTR(::fwThread::Worker) &worker, WEAKCALL f );
+
+    /**
+     * @brief Binds the given parameters to the run method within a void() function.
+     *
+     * @return a void() function.
+     */
+    virtual ::boost::function< void() > bindRun( A...args  ) const;
+
+};
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTRUN_HPP__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx b/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx
new file mode 100644
index 0000000..980eb77
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx
@@ -0,0 +1,577 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTRUN_HXX__
+#define __FWCOM_SLOTRUN_HXX__
+
+#ifndef __FWCOM_SLOTRUN_HPP__
+#error fwCom/SlotRun.hpp not included
+#endif
+
+#include <boost/thread/future.hpp>
+
+#include <fwThread/TaskHandler.hpp>
+#include <fwThread/Worker.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwCom/exception/NoWorker.hpp"
+
+#include "fwCom/util/WeakCall.hpp"
+
+#include "fwCom/SlotBase.hxx"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline ::boost::function< void() > SlotRun< void ( A1, A2, A3, A4, A5 ) >::bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A1, A2, A3, A4, A5 ) const ) &SelfType::run, this, args1, args2, args3, args4, args5 );
+}
+
+
+template< typename A1, typename A2, typename A3, typename A4 >
+inline ::boost::function< void() > SlotRun< void ( A1, A2, A3, A4 ) >::bindRun( A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A1, A2, A3, A4 ) const ) &SelfType::run, this, args1, args2, args3, args4 );
+}
+
+
+template< typename A1, typename A2, typename A3 >
+inline ::boost::function< void() > SlotRun< void ( A1, A2, A3 ) >::bindRun( A1 args1, A2 args2, A3 args3 ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A1, A2, A3 ) const ) &SelfType::run, this, args1, args2, args3 );
+}
+
+
+template< typename A1, typename A2 >
+inline ::boost::function< void() > SlotRun< void ( A1, A2 ) >::bindRun( A1 args1, A2 args2 ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A1, A2 ) const ) &SelfType::run, this, args1, args2 );
+}
+
+
+template< typename A1 >
+inline ::boost::function< void() > SlotRun< void ( A1 ) >::bindRun( A1 args1 ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A1 ) const ) &SelfType::run, this, args1 );
+}
+
+
+
+inline ::boost::function< void() > SlotRun< void () >::bindRun() const
+{
+    return ::boost::bind( ( void (SelfType::*)() const ) &SelfType::run, this);
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A >
+inline ::boost::function< void() > SlotRun< void (A...) >::bindRun( A...args  ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A... ) const ) &SelfType::run, this, args... );
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void ( A1, A2, A3, A4, A5 ) >::asyncRun( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3, args4, args5 )
+                        )
+                );
+}
+
+
+template< typename A1, typename A2, typename A3, typename A4 >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void ( A1, A2, A3, A4 ) >::asyncRun( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3, args4 )
+                        )
+                );
+}
+
+
+template< typename A1, typename A2, typename A3 >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void ( A1, A2, A3 ) >::asyncRun( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2, A3 args3 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3 )
+                        )
+                );
+}
+
+
+template< typename A1, typename A2 >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void ( A1, A2 ) >::asyncRun( const ::fwThread::Worker::sptr &worker, A1 args1, A2 args2 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2 )
+                        )
+                );
+}
+
+
+template< typename A1 >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void ( A1 ) >::asyncRun( const ::fwThread::Worker::sptr &worker, A1 args1 ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1 )
+                        )
+                );
+}
+
+
+
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void () >::asyncRun( const ::fwThread::Worker::sptr &worker) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun()
+                        )
+                );
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void (A...) >::asyncRun( const ::fwThread::Worker::sptr &worker, A... args ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args... )
+                        )
+                );
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+inline SlotBase::VoidSharedFutureType SlotRun< void ( A1, A2, A3, A4, A5 ) >::asyncRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3, args4, args5 ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+template< typename A1, typename A2, typename A3, typename A4 >
+inline SlotBase::VoidSharedFutureType SlotRun< void ( A1, A2, A3, A4 ) >::asyncRun( A1 args1, A2 args2, A3 args3, A4 args4 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3, args4 ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+template< typename A1, typename A2, typename A3 >
+inline SlotBase::VoidSharedFutureType SlotRun< void ( A1, A2, A3 ) >::asyncRun( A1 args1, A2 args2, A3 args3 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2, args3 ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+template< typename A1, typename A2 >
+inline SlotBase::VoidSharedFutureType SlotRun< void ( A1, A2 ) >::asyncRun( A1 args1, A2 args2 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1, args2 ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+template< typename A1 >
+inline SlotBase::VoidSharedFutureType SlotRun< void ( A1 ) >::asyncRun( A1 args1 ) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args1 ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+
+inline SlotBase::VoidSharedFutureType SlotRun< void () >::asyncRun() const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun(),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A >
+inline SlotBase::VoidSharedFutureType SlotRun< void (A...) >::asyncRun(A... args) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args... ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+// Copied from fwThread::Worker because of issues with gcc 4.2 and template
+// keyword
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void ( A1, A2, A3, A4, A5 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename A1, typename A2, typename A3, typename A4 >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void ( A1, A2, A3, A4 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename A1, typename A2, typename A3 >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void ( A1, A2, A3 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename A1, typename A2 >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void ( A1, A2 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+template< typename A1 >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void ( A1 ) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void () >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void (A...) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTRUN_HXX__ */
+
+
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx.vrdc
new file mode 100644
index 0000000..907db9d
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/SlotRun.hxx.vrdc
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_SLOTRUN_HXX__
+#define __FWCOM_SLOTRUN_HXX__
+
+#ifndef __FWCOM_SLOTRUN_HPP__
+#error fwCom/SlotRun.hpp not included
+#endif
+
+#include <boost/thread/future.hpp>
+
+#include <fwThread/TaskHandler.hpp>
+#include <fwThread/Worker.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwCom/exception/NoWorker.hpp"
+
+#include "fwCom/util/WeakCall.hpp"
+
+#include "fwCom/SlotBase.hxx"
+
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+template< typename ... A >
+inline ::boost::function< void() > SlotRun< void (A...) >::bindRun( A...args  ) const
+{
+    return ::boost::bind( ( void (SelfType::*)( A... ) const ) &SelfType::run, this, args... );
+}
+
+template< typename ... A >
+inline
+SlotBase::VoidSharedFutureType
+SlotRun< void (A...) >::asyncRun( const ::fwThread::Worker::sptr &worker, A... args ) const
+{
+    if(!worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("No valid worker.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+
+    return postWeakCall< void >(
+                worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args... )
+                        )
+                );
+}
+
+template< typename ... A >
+inline SlotBase::VoidSharedFutureType SlotRun< void (A...) >::asyncRun(A... args) const
+{
+    ::fwCore::mt::ReadLock lock(this->m_workerMutex);
+
+    if(!this->m_worker)
+    {
+        FW_RAISE_EXCEPTION( ::fwCom::exception::NoWorker("Slot has no worker set.") );
+    }
+
+    OSLM_COM("asyncRun '"<< this->getID() <<"' slot");
+    
+    return postWeakCall< void >(
+                m_worker,
+                ::fwCom::util::weakcall(
+                        this->shared_from_this(),
+                        this->bindRun( args... ),
+                        this->m_workerMutex
+                        )
+                );
+
+}
+
+
+
+// Copied from fwThread::Worker because of issues with gcc 4.2 and template
+// keyword
+template< typename ... A >
+template< typename R, typename WEAKCALL >
+::boost::shared_future< R > SlotRun< void (A...) >::postWeakCall( const ::fwThread::Worker::sptr &worker, WEAKCALL f )
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    worker->post(ftask);
+
+    return ::boost::move(ufuture);
+}
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_SLOTRUN_HXX__ */
+
+
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/Slots.hpp b/SrcLib/core/fwCom/include/fwCom/Slots.hpp
new file mode 100644
index 0000000..7e4ab89
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slots.hpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_SLOTS_HPP__
+#define __FWCOM_SLOTS_HPP__
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include "fwCore/macros.hpp"
+#include "fwCom/config.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+struct SlotBase;
+
+template< typename F >
+struct Slot;
+
+/**
+ * @class   Slots
+ * @brief   This class proposes a mapping between a SlotKeyType and a SlotBase.
+ *
+ * @date   2012.
+ */
+class FWCOM_CLASS_API Slots
+{
+public:
+
+    typedef std::string SlotKeyType;
+    typedef std::map< SlotKeyType, SPTR( SlotBase ) > SlotMapType;
+    typedef std::vector < SlotKeyType > SlotKeyContainerType;
+
+    /// Constructor, does nothing
+    FWCOM_API Slots();
+
+    /// Constructor, check if all slots are disconnected
+    FWCOM_API virtual ~Slots();
+
+    /// Registers SlotBase in m_slots
+    FWCOM_API Slots& operator()( const SlotKeyType &key, const SPTR( SlotBase ) &slot );
+
+    /// Registers Slot  in m_slots
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3, A4, A5 ) >) slot ); //{}
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3, A4 ) >) slot ); //{}
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3 ) >) slot ); //{}
+
+
+template<typename R, typename A1, typename A2 >
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2 ) >) slot ); //{}
+
+
+template<typename R, typename A1 >
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R ( A1 ) >) slot ); //{}
+
+
+template<typename R>
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R () >) slot ); //{}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A>
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R (A...) >) slot ); //{}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+/// Creates in intern a new slot from function and registers it in m_slots
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename F, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    Slots& operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{}
+
+
+template<typename F, typename A1, typename A2, typename A3, typename A4 >
+    Slots& operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{}
+
+
+template<typename F, typename A1, typename A2, typename A3 >
+    Slots& operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3 ); //{}
+
+
+template<typename F, typename A1, typename A2 >
+    Slots& operator()( const SlotKeyType &key, F f, A1 a1, A2 a2 ); //{}
+
+
+template<typename F, typename A1 >
+    Slots& operator()( const SlotKeyType &key, F f, A1 a1 ); //{}
+
+
+template<typename F>
+    Slots& operator()( const SlotKeyType &key, F f); //{}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename F, typename ...A>
+    Slots& operator()( const SlotKeyType &key, F f, A...a ); //{}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+/// Returns the SlotBase associated to the key, if key does not exist, the ptr is null
+    FWCOM_API SPTR( SlotBase ) operator[]( const SlotKeyType &key ) const;
+
+    /// Assigns the worker to all slots stored in m_slots
+    FWCOM_API void setWorker( const SPTR(::fwThread::Worker) &worker );
+
+    /// Returns all SlotKeyType registered in m_slots
+    FWCOM_API SlotKeyContainerType getSlotKeys() const;
+
+#ifdef COM_LOG
+    /// Set new id for all slots using their key in m_slots, a prefix can be added
+    FWCOM_API void setID( const std::string prefix = "" );
+#endif
+
+protected:
+
+    /// Copy constructor forbidden
+    Slots( const Slots& );
+
+    /// Copy constructor forbidden
+    Slots& operator=( const Slots& );
+
+    /// Association < key , SPTR( SlotBase ) >
+    SlotMapType m_slots;
+};
+
+} // namespace fwCom
+
+#endif //__FWCOM_SLOTS_HPP__
diff --git a/SrcLib/core/fwCom/include/fwCom/Slots.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/Slots.hpp.vrdc
new file mode 100644
index 0000000..7b32785
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slots.hpp.vrdc
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_SLOTS_HPP__
+#define __FWCOM_SLOTS_HPP__
+
+#include <map>
+#include <vector>
+#include <string>
+
+#include "fwCore/macros.hpp"
+#include "fwCom/config.hpp"
+
+fwCorePredeclare( (fwThread)(Worker) );
+
+namespace fwCom
+{
+
+struct SlotBase;
+
+template< typename F >
+struct Slot;
+
+/**
+ * @class   Slots
+ * @brief   This class proposes a mapping between a SlotKeyType and a SlotBase.
+ *
+ * @date   2012.
+ */
+class FWCOM_CLASS_API Slots
+{
+public:
+
+    typedef std::string SlotKeyType;
+    typedef std::map< SlotKeyType, SPTR( SlotBase ) > SlotMapType;
+    typedef std::vector < SlotKeyType > SlotKeyContainerType;
+
+    /// Constructor, does nothing
+    FWCOM_API Slots();
+
+    /// Constructor, check if all slots are disconnected
+    FWCOM_API virtual ~Slots();
+
+    /// Registers SlotBase in m_slots
+    FWCOM_API Slots& operator()( const SlotKeyType &key, const SPTR( SlotBase ) &slot );
+
+    /// Registers Slot  in m_slots
+    template<typename R, typename ...A>
+    Slots& operator()( const SlotKeyType &key, SPTR(Slot< R (A...) >) slot ); //{}
+
+    /// Creates in intern a new slot from function and registers it in m_slots
+    template<typename F, typename ...A>
+    Slots& operator()( const SlotKeyType &key, F f, A...a ); //{}
+
+    /// Returns the SlotBase associated to the key, if key does not exist, the ptr is null
+    FWCOM_API SPTR( SlotBase ) operator[]( const SlotKeyType &key ) const;
+
+    /// Assigns the worker to all slots stored in m_slots
+    FWCOM_API void setWorker( const SPTR(::fwThread::Worker) &worker );
+
+    /// Returns all SlotKeyType registered in m_slots
+    FWCOM_API SlotKeyContainerType getSlotKeys() const;
+
+#ifdef COM_LOG
+    /// Set new id for all slots using their key in m_slots, a prefix can be added
+    FWCOM_API void setID( const std::string prefix = "" );
+#endif
+
+protected:
+
+    /// Copy constructor forbidden
+    Slots( const Slots& );
+
+    /// Copy constructor forbidden
+    Slots& operator=( const Slots& );
+
+    /// Association < key , SPTR( SlotBase ) >
+    SlotMapType m_slots;
+};
+
+} // namespace fwCom
+
+#endif //__FWCOM_SLOTS_HPP__
diff --git a/SrcLib/core/fwCom/include/fwCom/Slots.hxx b/SrcLib/core/fwCom/include/fwCom/Slots.hxx
new file mode 100644
index 0000000..123248c
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slots.hxx
@@ -0,0 +1,178 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_SLOTS_HXX__
+#define __FWCOM_SLOTS_HXX__
+
+
+#ifndef __FWCOM_SLOTS_HPP__
+#error fwCom/Slots.hpp not included
+#endif
+
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+
+//-----------------------------------------------------------------------------
+
+namespace fwCom
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3, A4, A5 ) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3, A4 ) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+template<typename R, typename A1, typename A2, typename A3 >
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2, A3 ) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+template<typename R, typename A1, typename A2 >
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R ( A1, A2 ) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+template<typename R, typename A1 >
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R ( A1 ) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+template<typename R>
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R () >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A>
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R (A...) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename F, typename A1, typename A2, typename A3, typename A4, typename A5 >
+Slots& Slots::operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a1, a2, a3, a4, a5 ) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+template<typename F, typename A1, typename A2, typename A3, typename A4 >
+Slots& Slots::operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a1, a2, a3, a4 ) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+template<typename F, typename A1, typename A2, typename A3 >
+Slots& Slots::operator()( const SlotKeyType &key, F f, A1 a1, A2 a2, A3 a3 )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a1, a2, a3 ) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+template<typename F, typename A1, typename A2 >
+Slots& Slots::operator()( const SlotKeyType &key, F f, A1 a1, A2 a2 )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a1, a2 ) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+template<typename F, typename A1 >
+Slots& Slots::operator()( const SlotKeyType &key, F f, A1 a1 )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a1 ) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+template<typename F>
+Slots& Slots::operator()( const SlotKeyType &key, F f)
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename F, typename ...A>
+Slots& Slots::operator()( const SlotKeyType &key, F f, A...a )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a...) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} // namespace fwCom
+
+#endif //__FWCOM_SLOTS_HXX__
diff --git a/SrcLib/core/fwCom/include/fwCom/Slots.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/Slots.hxx.vrdc
new file mode 100644
index 0000000..23b28f7
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/Slots.hxx.vrdc
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_SLOTS_HXX__
+#define __FWCOM_SLOTS_HXX__
+
+
+#ifndef __FWCOM_SLOTS_HPP__
+#error fwCom/Slots.hpp not included
+#endif
+
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+
+//-----------------------------------------------------------------------------
+
+namespace fwCom
+{
+
+template<typename R, typename ...A>
+Slots& Slots::operator()( const SlotKeyType &key, SPTR(Slot< R (A...) >) slot )
+{
+    SPTR( SlotBase ) slotBase = ::boost::dynamic_pointer_cast< SlotBase >( slot );
+    m_slots.insert( SlotMapType::value_type(key, slotBase) );
+    return *this;
+}
+
+template<typename F, typename ...A>
+Slots& Slots::operator()( const SlotKeyType &key, F f, A...a )
+{
+    SPTR( SlotBase ) slot = ::boost::dynamic_pointer_cast< SlotBase >( ::fwCom::newSlot(f, a...) );
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+
+} // namespace fwCom
+
+#endif //__FWCOM_SLOTS_HXX__
diff --git a/SrcLib/core/fwCom/include/fwCom/config.hpp b/SrcLib/core/fwCom/include/fwCom/config.hpp
new file mode 100644
index 0000000..851d0c1
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2012.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWCOM_CONFIG_HPP_
+#define _FWCOM_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWCOM_EXPORTS
+            #define FWCOM_API __declspec(dllexport)
+        #else
+            #define FWCOM_API __declspec(dllimport)
+        #endif
+
+        #define FWCOM_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWCOM_EXPORTS
+            #define FWCOM_API __attribute__ ((visibility("default")))
+            #define FWCOM_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWCOM_API __attribute__ ((visibility("hidden")))
+            #define FWCOM_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWCOM_API
+        #define FWCOM_CLASS_API
+
+    #endif
+
+#endif //FWCOM_API
+
diff --git a/SrcLib/core/fwCom/include/fwCom/exception/AlreadyConnected.hpp b/SrcLib/core/fwCom/include/fwCom/exception/AlreadyConnected.hpp
new file mode 100644
index 0000000..69ca432
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/exception/AlreadyConnected.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_EXCEPTION_ALREADYCONNECTED_HPP__
+#define __FWCOM_EXCEPTION_ALREADYCONNECTED_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+/// Bad call exception.
+struct AlreadyConnected : ::fwCore::Exception
+{
+    FWCOM_API AlreadyConnected ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwCom
+
+#endif /* __FWCOM_EXCEPTION_ALREADYCONNECTED_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/exception/BadCall.hpp b/SrcLib/core/fwCom/include/fwCom/exception/BadCall.hpp
new file mode 100644
index 0000000..06b5418
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/exception/BadCall.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_EXCEPTION_BADCALL_HPP__
+#define __FWCOM_EXCEPTION_BADCALL_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+/// Bad call exception.
+struct BadCall : ::fwCore::Exception
+{
+    FWCOM_API BadCall ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwCom
+
+#endif /* __FWCOM_EXCEPTION_BADCALL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/exception/BadRun.hpp b/SrcLib/core/fwCom/include/fwCom/exception/BadRun.hpp
new file mode 100644
index 0000000..841f493
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/exception/BadRun.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_EXCEPTION_BADRUN_HPP__
+#define __FWCOM_EXCEPTION_BADRUN_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+/// Bad run exception.
+struct BadRun : ::fwCore::Exception
+{
+    FWCOM_API BadRun ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwCom
+
+#endif /* __FWCOM_EXCEPTION_BADRUN_HPP__ */
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/exception/BadSlot.hpp b/SrcLib/core/fwCom/include/fwCom/exception/BadSlot.hpp
new file mode 100644
index 0000000..70f770a
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/exception/BadSlot.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_EXCEPTION_BADSLOT_HPP__
+#define __FWCOM_EXCEPTION_BADSLOT_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+/// Bad slot exception.
+struct BadSlot : ::fwCore::Exception
+{
+    FWCOM_API BadSlot ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwCom
+
+#endif /* __FWCOM_EXCEPTION_BADSLOT_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/exception/NoWorker.hpp b/SrcLib/core/fwCom/include/fwCom/exception/NoWorker.hpp
new file mode 100644
index 0000000..644b6cb
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/exception/NoWorker.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_EXCEPTION_NOWORKDER_HPP__
+#define __FWCOM_EXCEPTION_NOWORKDER_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+
+namespace fwCom
+{
+namespace exception
+{
+
+/// No worker exception.
+struct NoWorker : ::fwCore::Exception
+{
+    FWCOM_API NoWorker ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+
+} // namespace fwCom
+
+#endif /* __FWCOM_EXCEPTION_NOWORKDER_HPP__ */
+
+
+
diff --git a/SrcLib/core/fwCom/include/fwCom/namespace.hpp b/SrcLib/core/fwCom/include/fwCom/namespace.hpp
new file mode 100644
index 0000000..fe68d09
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/namespace.hpp
@@ -0,0 +1,245 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_NAMESPACE_HPP__
+#define __FWCOM_NAMESPACE_HPP__
+
+/**
+ * @brief Namespace containing fw4spl communication tools
+ */
+namespace fwCom
+{
+
+/**
+ * @brief fwCom's exceptions
+ */
+namespace exception
+{
+
+
+} // namespace exception
+
+
+/**
+ * @brief fwCom's utilities
+ */
+namespace util
+{
+
+
+} // namespace util
+
+
+
+/**
+ * @page SigSlot fwCom Signal/Slot system
+ *
+ * @tableofcontents
+ *
+ * fwCom library provides a set of tools dedicated to communication. These
+ * communications are based on
+ * <a href="http://en.wikipedia.org/wiki/Signals_and_slots">Signal and slots concept</a>.
+ *
+ * fwCom provides the following features :
+ *  - function and method wrapping
+ *  - direct slot calling
+ *  - asynchronous slot calling
+ *  - ability to work with multiple threads
+ *  - auto-deconnection of slot and signals
+ *  - arguments loss between slots and signals
+ *
+ *
+ * @section Slots Slots
+ *
+ * Slots are wrappers for functions and class methods that can be attached to a
+ * fwThread::Worker. The purpose of this class is to provide synchronous and
+ * asynchronous mecanisms for method and function calling.
+ *
+ * Slots have a common base class : SlotBase. This allows to store them in the
+ * same container. Slots are designed to permit calling them by knowing only the
+ * argument types.
+ *
+ * Examples :
+ *
+ * This declares a slot wrapping the function `sum`, which is a function with the
+ * signature `int (int, int)`
+ *
+ *     ::fwCom::Slot< int (int, int) >::sptr slotSum = ::fwCom::newSlot( &sum );
+ *
+ * This declares a Slot wrapping the method `start` with signature `void()` of
+ * the object `a` which class type is `A`
+ *
+ *     ::fwCom::Slot< void () >::sptr slotStart = ::fwCom::newSlot( &A::start, &a );
+ *
+ * This executes the slots using the method `run`.
+ *
+ *     slotSum->run(40,2);
+ *     slotStart->run();
+ *
+ * This executes the slots using the method `call`, which returns the result of
+ * the function/method execution.
+ *
+ *     int result = slotSum->call(40,2);
+ *     slotStart->call();
+ *
+ * The same, through a SlotBase :
+ *
+ *     ::fwCom::Slot< size_t (std::string) > slotLen = ::fwCom::Slot< size_t (std::string) >::New( &len );
+ *     ::fwCom::SlotBase::sptr slotBaseLen = slotLen;
+ *     ::fwCom::SlotBase::sptr slotBaseSum = slotSum;
+ *     slotBaseSum->run(40,2);
+ *     slotBaseSum->run<int, int>(40,2);
+ *     slotBaseLen->run<std::string>("R2D2"); // This one needs the explicit argument type
+ *     result = slotBaseSum->call<int>(40,2);
+ *     result = slotBaseSum->call<int, int, int>(40,2);
+ *     result = slotBaseLen->call<size_t, std::string>("R2D2");
+ *
+ * @subsection SlotAsync Asynchronous calls
+ *
+ * Slots are able to work with fwThread::Worker. If a Slot has a Worker, each
+ * asynchronous execution request will be done in it's worker, otherwise
+ * asynchronous requests can not be satisfied without specifying a worker.
+ *
+ * Setting worker example :
+ *
+ *     ::fwThread::Worker::sptr w = ::fwThread::Worker::New();
+ *     slotSum->setWorker(w);
+ *     slotStart->setWorker(w);
+ *
+ * @subsubsection SlotAsync Asynchronous `run`
+ *
+ * `asyncRun` method returns a <a
+ * href="http://www.boost.org/doc/libs/1_52_0/doc/html/thread/synchronization.html#thread.synchronization.futures">`boost::shared_future<
+ * void >`</a>, that makes it possible to wait for end-of-execution.
+ *
+ *     ::boost::future< void > future = slotStart->asyncRun();
+ *     // do something else ...
+ *     future.wait(); //ensures slotStart is finished before continuing
+ *
+ * @subsubsection SlotAsync Asynchronous `call`
+ *
+ * `asyncCall` method returns a <a
+ * href="http://www.boost.org/doc/libs/1_52_0/doc/html/thread/synchronization.html#thread.synchronization.futures">
+ * `boost::shared_future< R >`</a> where R is the return type, this allows to
+ * wait for end-of-execution and to get the computed value.
+ *
+ *     ::boost::future< int > future = slotSum->asyncCall();
+ *     // do something else ...
+ *     future.wait(); //ensures slotStart is finished before continuing
+ *     int result = future.get();
+ *
+ *
+ * @section Signals Signals
+ *
+ * Signal allows to perform grouped calls on slots.  In this purpose, Signal
+ * provides a mechanism to connect slots to itself.
+ *
+ * Examples:
+ *
+ * The following instruction declares a Signal able to execute slots of type
+ * `void()` :
+ *
+ *     ::fwCom::Signal< void() >::sptr sig = ::fwCom::Signal< void() >::New();
+ *
+ * This connects a Slot having the same type as the previously declared Signal,
+ * and connects the Slot to this Signal :
+ *
+ *     sig->connect(slotStart);
+ *
+ *
+ * Finally, the following instruction will trigger the execution of all slots
+ * connected to this Signal:
+ *
+ *     sig->emit();
+ *
+ * Thus, it is possible to connect multiple slots having the same type to the
+ * same Signal and trigger simultaneously their execution.
+ *
+ * Following the same idea, signals can take several arguments and be triggered
+ * by passing the right arguments to `emit`.
+ *
+ * The following will declare a Signal of type `void(int, int)` and connects it
+ * to slots of type `void (int)` and `int (int, int)`.
+ *
+ *     using namespace fwCom;
+ *     Signal< void(int, int) >::sptr sig2 = Signal< void(int, int) >::New();
+ *     Slot< int(int, int) >::sptr    slot1 = Slot< int(int, int) >::New(...);
+ *     Slot< void(int) >::sptr        slot2 = Slot< void(int) >::New(...);
+ *
+ *     sig2->connect(slot1);
+ *     sig2->connect(slot2);
+ *
+ *     sig2->emit(21, 42);
+ *
+ * In the latter example, 2 points need to highlighted :
+ *  - the return type of the Signal is `void`. Signal cannot return values, so
+ *  their return type is always declared as `void`. Thus, it is not possible to
+ *  retrieve `slot1` Slot return value if it is executed using a Signal.
+ *  Therefore, both slots are run succesfully.
+ *  - the arguments types of `slot2` slot doesn't match exactly sig2 signature.
+ *  `slot2` is nevertheless successfully connected and executed. `slot2` receive
+ *  the value 21 as argument, 42 is ignored).
+ *
+ *
+ * @subsection SignalAsyncEmit Asynchronous emit
+ *
+ * As slots can work asynchronously, triggering a Signal with
+ * `asyncEmit` results in the execution of connected slots in their worker :
+ *
+ *     sig2->asyncEmit(21, 42);
+ *
+ * The instruction above has for consequence to run each connected slot in it's own
+ * worker. @note Each connected slot *must have* a worker set in order to use
+ * `asyncEmit`.
+ *
+ * @subsection SignalDisconnect Disconnection
+ *
+ * Finally, the `disconnect` method will cause the given Slot to be disconnected
+ * from the Signal. Thus, the Slot won't be executed anymore each time the
+ * Signal is triggered.
+ *
+ *     sig2->disconnect(slot1);
+ *     sig2->emit(21, 42); //do not trigger slot1 anymore
+ *
+ * The instructions above will cause `slot2` Slot execution : `slot1` having
+ * been disconnected, it won't be executed.
+ *
+ *
+ * @section Connection Connection handling
+ *
+ * The connection of a Slot to a Signal returns a Connection handler :
+ *
+ *     ::fwCom::Connection connection = signal->connect(slot);
+ *
+ * Connection provides a mechanism which allows to temporarily disable a Slot
+ * in a Signal. The slot stays connected to the Signal, but it will not be
+ * triggered while the Connection is blocked :
+ *
+ *     ::fwCom::Connection::Blocker lock(connection);
+ *     signal->emit();
+ *     // 'slot' will not be executed while 'lock' is alive or until lock is
+ *     // reset
+ *
+ * Connection handlers can also be used to disconnect a Slot from a Signal :
+ *
+ *     connection.disconnect();
+ *     //slot is not connected anymore
+ *
+ * @section Autodisconnect Auto-disconnection
+ *
+ * Slot and signals can handle automatic disconnection :
+ *  - on Slot destruction : the Slot will disconnect itself from every signals
+ *  it is connected on destruction
+ *  - on Signal destruction : the Signal will disconnect all connected slots
+ *  before destruction
+ *
+ * All related connection handlers will be invalidated when an automatic
+ * disconnection occurs.
+ *
+ */
+} // namespace fwCom
+
+#endif /* __FWCOM_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp
new file mode 100644
index 0000000..3be846d
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp
@@ -0,0 +1,411 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_AUTOBIND_HPP__
+#define __FWCOM_UTIL_AUTOBIND_HPP__
+
+#include <boost/function.hpp>
+
+#include "fwCom/util/convert_function_type.hpp"
+
+
+/**
+ * @brief fwCom
+ */
+namespace fwCom
+{
+
+
+    /**
+     * @brief util
+     */
+namespace util
+{
+
+
+/**
+ * @class AutoBind
+ * @brief Automatic binding class.
+ * This class allow to bind automatically a function/method with the right number of arguments.
+ *
+ * @tparam F Desired binding signature.
+ * @tparam PLACEHOLDERS_NB number of placeholders to use.
+ */
+template< typename F, int PLACEHOLDERS_NB >
+struct AutoBind;
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 0 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 1 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 2 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 3 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 4 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 5 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 6 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 7 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 8 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 9 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template< typename W, typename A1, typename A2, typename A3 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2, A3 a3 ); //{};
+template< typename W, typename A1, typename A2 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1, A2 a2 ); //{};
+template< typename W, typename A1 >
+    static ::boost::function< FunctionType > wrap( W f, A1 a1 ); //{};
+template< typename W>
+    static ::boost::function< FunctionType > wrap( W f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+};
+
+
+/**
+ * @brief Automatic bind of given function
+ *
+ * @return a boost function of type F if F is a function type, of type *F if F is a function pointer,
+ * or of the corresponding function type if F is a member method pointer (like R (C::*)(A1, A2, ..))
+ * If F is a member method pointer, autobind takes the object on wich we desire to call the method
+ * as second argument.
+ */
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ); //{};
+template <typename F, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3, A4 a4 ); //{};
+template <typename F, typename A1, typename A2, typename A3 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3 ); //{};
+template <typename F, typename A1, typename A2 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2 ); //{};
+template <typename F, typename A1 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1 ); //{};
+template <typename F>
+::boost::function< typename convert_function_type< F >::type > autobind(F f); //{};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename F, typename ...A >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A...a); //{};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_AUTOBIND_HPP__ */
diff --git a/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp.vrdc
new file mode 100644
index 0000000..b000289
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hpp.vrdc
@@ -0,0 +1,168 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_AUTOBIND_HPP__
+#define __FWCOM_UTIL_AUTOBIND_HPP__
+
+#include <boost/function.hpp>
+
+#include "fwCom/util/convert_function_type.hpp"
+
+
+/**
+ * @brief fwCom
+ */
+namespace fwCom
+{
+
+
+    /**
+     * @brief util
+     */
+namespace util
+{
+
+
+/**
+ * @class AutoBind
+ * @brief Automatic binding class.
+ * This class allow to bind automatically a function/method with the right number of arguments.
+ *
+ * @tparam F Desired binding signature.
+ * @tparam PLACEHOLDERS_NB number of placeholders to use.
+ */
+template< typename F, int PLACEHOLDERS_NB >
+struct AutoBind;
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 0 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 1 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 2 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 3 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 4 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 5 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 6 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 7 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 8 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/// AutoBind specialization.
+template< typename F >
+struct AutoBind< F, 9 >
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+
+template< typename W, typename ...A >
+    static ::boost::function< FunctionType > wrap( W f, A...a ); //{};
+};
+
+
+/**
+ * @brief Automatic bind of given function 
+ *
+ * @return a boost function of type F if F is a function type, of type *F if F is a function pointer,
+ * or of the corresponding function type if F is a member method pointer (like R (C::*)(A1, A2, ..))
+ * If F is a member method pointer, autobind takes the object on wich we desire to call the method
+ * as second argument.
+ */
+template <typename F, typename ...A >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A...a); //{};
+
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_AUTOBIND_HPP__ */
diff --git a/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx
new file mode 100644
index 0000000..79508c2
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx
@@ -0,0 +1,855 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_AUTOBIND_HXX__
+#define __FWCOM_UTIL_AUTOBIND_HXX__
+
+#ifndef __FWCOM_UTIL_AUTOBIND_HPP__
+#error fwCom/util/AutoBind.hpp not included
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/function_types/function_arity.hpp>
+
+
+namespace fwCom
+{
+
+
+namespace util
+{
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f)
+{
+    return ::boost::bind( f);
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a... );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f)
+{
+    return ::boost::bind( f, _1 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4, _5 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4, _5 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4, _5 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4, _5 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4, _5 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4, _5 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, a5, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    return ::boost::bind( f, a1, a2, a3, a4, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2, typename A3 >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A1 a1, A2 a2, A3 a3 )
+{
+    return ::boost::bind( f, a1, a2, a3, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1, typename A2 >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A1 a1, A2 a2 )
+{
+    return ::boost::bind( f, a1, a2, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+template< typename F >
+template< typename W, typename A1 >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A1 a1 )
+{
+    return ::boost::bind( f, a1, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+template< typename F >
+template< typename W>
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f)
+{
+    return ::boost::bind( f, _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename F, typename A1, typename A2, typename A3, typename A4, typename A5 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 )
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a1, a2, a3, a4, a5 );
+}
+
+
+
+
+template <typename F, typename A1, typename A2, typename A3, typename A4 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3, A4 a4 )
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a1, a2, a3, a4 );
+}
+
+
+
+
+template <typename F, typename A1, typename A2, typename A3 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2, A3 a3 )
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a1, a2, a3 );
+}
+
+
+
+
+template <typename F, typename A1, typename A2 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1, A2 a2 )
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a1, a2 );
+}
+
+
+
+
+template <typename F, typename A1 >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A1 a1 )
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a1 );
+}
+
+
+
+
+template <typename F>
+::boost::function< typename convert_function_type< F >::type > autobind(F f)
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f);
+}
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename F, typename ...A >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A...a)
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a...);
+}
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_AUTOBIND_HXX__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx.vrdc b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx.vrdc
new file mode 100644
index 0000000..5c93e7f
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/AutoBind.hxx.vrdc
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_AUTOBIND_HXX__
+#define __FWCOM_UTIL_AUTOBIND_HXX__
+
+#ifndef __FWCOM_UTIL_AUTOBIND_HPP__
+#error fwCom/util/AutoBind.hpp not included
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/function_types/function_arity.hpp>
+
+
+namespace fwCom
+{
+
+
+namespace util
+{
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 0 >::FunctionType > AutoBind< F, 0 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a... );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 1 >::FunctionType > AutoBind< F, 1 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 2 >::FunctionType > AutoBind< F, 2 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 3 >::FunctionType > AutoBind< F, 3 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 4 >::FunctionType > AutoBind< F, 4 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 5 >::FunctionType > AutoBind< F, 5 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 6 >::FunctionType > AutoBind< F, 6 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 7 >::FunctionType > AutoBind< F, 7 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 8 >::FunctionType > AutoBind< F, 8 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7, _8 );
+}
+
+
+template< typename F >
+template< typename W, typename ...A >
+::boost::function< typename AutoBind< F, 9 >::FunctionType > AutoBind< F, 9 >::wrap( W f, A...a )
+{
+    return ::boost::bind( f, a..., _1, _2, _3, _4, _5, _6, _7, _8, _9 );
+}
+
+
+template <typename F, typename ...A >
+::boost::function< typename convert_function_type< F >::type > autobind(F f, A...a)
+{
+    typedef typename convert_function_type< F >::type FunctionType;
+    const int arity = ::boost::function_types::function_arity< FunctionType >::value;
+    return AutoBind< F, arity >::wrap(f, a...);
+}
+
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_AUTOBIND_HXX__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/WeakCall.hpp b/SrcLib/core/fwCom/include/fwCom/util/WeakCall.hpp
new file mode 100644
index 0000000..a5d758f
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/WeakCall.hpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_WEAKCALL_HPP__
+#define __FWCOM_UTIL_WEAKCALL_HPP__
+
+#include <boost/function.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#ifdef COM_LOG
+#include "fwCom/SlotBase.hpp"
+#endif // COM_LOG
+#include "fwCom/util/log.hpp"
+
+namespace fwCom
+{
+
+namespace util
+{
+
+/**
+ * @brief Weak functor class.
+ * Store a zero-arg-function and a weak pointer on an object. The WeakCall is
+ * callable only once.
+ * A bad_weak_ptr exception is thrown if the weak_ptr is expired when operator()
+ * is called
+ * @tparam T Stored object type.
+ * @tparam R Stored function return type.
+ */
+template< typename T, typename R >
+struct WeakCall
+{
+
+    WeakCall( const ::boost::shared_ptr< T const > &ptr, ::boost::function< R() > f)
+        : m_weakPtr(ptr), m_func(f)
+    {
+        OSLM_COM("WeakCall object : " << ptr->getFullClassname() );
+#ifdef COM_LOG
+        this->m_objectType = ptr->getFullClassname();
+        ::fwCom::SlotBase::csptr slot = ::boost::dynamic_pointer_cast< const ::fwCom::SlotBase >(ptr);
+        if(slot)
+        {
+            this->m_objectId = slot->getID();
+        }
+#endif // COM_LOG
+    }
+
+    WeakCall( const ::boost::shared_ptr< T const > &ptr, ::boost::function< R() > f, ::fwCore::mt::ReadWriteMutex& m)
+        : m_weakPtr(ptr), m_func(f), m_lock( ::boost::make_shared< ::fwCore::mt::ReadLock > (::boost::ref(m)) )
+    {
+        OSLM_COM("WeakCall object : " << ptr->getFullClassname() );
+#ifdef COM_LOG
+        this->m_objectType = ptr->getFullClassname();
+        ::fwCom::SlotBase::csptr slot = ::boost::dynamic_pointer_cast< const ::fwCom::SlotBase >(ptr);
+        if(slot)
+        {
+            this->m_objectId = slot->getID();
+        }
+#endif // COM_LOG
+    }
+
+    ~WeakCall()
+    {
+
+    }
+
+    R operator ()() const
+    {
+        OSLM_COM("WeakCall : trying to execute WeakCall related to :"
+                 << this->m_objectType << ", " << this->m_objectId);
+
+        OSLM_COM_IF( "Failed to execute WeakCall related to :"
+                 << this->m_objectType << ", " << this->m_objectId,
+                 this->m_weakPtr.expired() );
+
+        ::boost::shared_ptr< T const > ptr(this->m_weakPtr.lock());
+
+        if (!ptr)
+        {
+            try
+            {
+                this->m_lock.reset();
+            }
+            catch(...)
+            {
+                // may throw an exception if pointed lock locks a destroyed mutex
+            }
+            // will throw an exception because m_weakPtr is expired
+            ::boost::shared_ptr< T const > ptr(this->m_weakPtr);
+        }
+
+        ::boost::shared_ptr< ::fwCore::mt::ReadLock > lock(this->m_lock);
+
+        this->m_lock.reset();
+
+        this->m_weakPtr.reset();
+
+        return this->m_func();
+    }
+
+protected:
+    mutable ::boost::weak_ptr< T const > m_weakPtr;
+    ::boost::function< R() > m_func;
+    mutable ::boost::shared_ptr< ::fwCore::mt::ReadLock > m_lock;
+
+#ifdef COM_LOG
+    std::string m_objectType;
+    std::string m_objectId;
+#endif // COM_LOG
+};
+
+
+/// Returns weak call from given object and function.
+template <typename T, typename R >
+WeakCall<T, R> weakcall( const ::boost::shared_ptr< T const > &ptr, ::boost::function< R() > f)
+{
+    return WeakCall<T, R>(ptr, f);
+}
+
+/// Returns weak call from given object, function and mutex.
+template <typename T, typename R >
+WeakCall<T, R> weakcall( const ::boost::shared_ptr< T const > &ptr, ::boost::function< R() > f, ::fwCore::mt::ReadWriteMutex& m)
+{
+    return WeakCall<T, R>(ptr, f, m);
+}
+
+
+
+} // namespace util
+
+} // namespace fwCom
+
+#endif /* __FWCOM_UTIL_WEAKCALL_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp b/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp
new file mode 100644
index 0000000..708c7d8
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__
+#define __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__
+
+#include <boost/function.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+
+
+namespace fwCom
+{
+
+
+namespace util
+{
+
+
+template <typename F>
+struct convert_function_type;
+
+/// Convert class member method type to equivalent function type.
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3, Args4, Args5 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3, Args4 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3 )  >
+{
+    typedef R type( Args1, Args2, Args3 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2 >
+struct convert_function_type< R (C::*) ( Args1, Args2 )  >
+{
+    typedef R type( Args1, Args2 ) ;
+};
+template <typename R, typename C, typename Args1 >
+struct convert_function_type< R (C::*) ( Args1 )  >
+{
+    typedef R type( Args1 ) ;
+};
+template <typename R, typename C>
+struct convert_function_type< R (C::*) ()  >
+{
+    typedef R type() ;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename R, typename C, typename ...Args >
+struct convert_function_type< R (C::*) ( Args... )  >
+{
+    typedef R type( Args... ) ;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+/// Convert class const member method type to equivalent function type.
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3, Args4, Args5 ) const  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3, Args4 ) const  >
+{
+    typedef R type( Args1, Args2, Args3, Args4 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3 >
+struct convert_function_type< R (C::*) ( Args1, Args2, Args3 ) const  >
+{
+    typedef R type( Args1, Args2, Args3 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2 >
+struct convert_function_type< R (C::*) ( Args1, Args2 ) const  >
+{
+    typedef R type( Args1, Args2 ) ;
+};
+template <typename R, typename C, typename Args1 >
+struct convert_function_type< R (C::*) ( Args1 ) const  >
+{
+    typedef R type( Args1 ) ;
+};
+template <typename R, typename C>
+struct convert_function_type< R (C::*) () const  >
+{
+    typedef R type() ;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename R, typename C, typename ...Args >
+struct convert_function_type< R (C::*) ( Args... ) const  >
+{
+    typedef R type( Args... ) ;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+/// Extract function type from a boost function.
+template <typename F>
+struct convert_function_type< ::boost::function< F > >
+{
+    typedef F type;
+};
+
+/// Convert function pointer type to function type.
+template <typename F>
+struct convert_function_type
+{
+    typedef typename ::boost::remove_pointer<F>::type type;
+};
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp.vrdc b/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp.vrdc
new file mode 100644
index 0000000..2d25ff3
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/convert_function_type.hpp.vrdc
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__
+#define __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__
+
+#include <boost/function.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+
+
+namespace fwCom
+{
+
+
+namespace util
+{
+
+
+template <typename F>
+struct convert_function_type;
+
+/// Convert class member method type to equivalent function type.
+template <typename R, typename C, typename ...Args >
+struct convert_function_type< R (C::*) ( Args... )  >
+{
+    typedef R type( Args... ) ;
+};
+
+/// Convert class const member method type to equivalent function type.
+template <typename R, typename C, typename ...Args >
+struct convert_function_type< R (C::*) ( Args... ) const  >
+{
+    typedef R type( Args... ) ;
+};
+
+/// Extract function type from a boost function.
+template <typename F>
+struct convert_function_type< ::boost::function< F > >
+{
+    typedef F type;
+};
+
+/// Convert function pointer type to function type.
+template <typename F>
+struct convert_function_type
+{
+    typedef typename ::boost::remove_pointer<F>::type type;
+};
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_CONVERT_FUNCTION_TYPE_HPP__ */
+
diff --git a/SrcLib/core/fwCom/include/fwCom/util/log.hpp b/SrcLib/core/fwCom/include/fwCom/util/log.hpp
new file mode 100644
index 0000000..366154e
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/log.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOM_UTIL_LOG_HPP_
+#define _FWCOM_UTIL_LOG_HPP_
+
+#include <fwCore/spyLog.hpp>
+
+/** @{ */
+# ifdef COM_LOG
+/** Communication message macros.  */
+#  define SLM_COM(message)                      \
+    SL_ERROR(_SPYLOG_SPYLOGGER_, message)
+/** Com stringstream message macros.  */
+#  define OSLM_COM(message)                     \
+    OSL_ERROR(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal com message macros.  */
+#  define SLM_COM_IF(message, cond)                     \
+    SL_ERROR_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal com stringstream message macros.  */
+#  define OSLM_COM_IF(message, cond)                    \
+    OSL_ERROR_IF(_SPYLOG_SPYLOGGER_, message, cond)
+# else
+/** Communication message macros.  */
+#  define SLM_COM(message) // nothing
+/** Com stringstream message macros.  */
+#  define OSLM_COM(message) // nothing
+/** Conditionnal com message macros.  */
+#  define SLM_COM_IF(message, cond) // nothing
+/** Conditionnal com stringstream message macros.  */
+#  define OSLM_COM_IF(message, cond) // nothing
+# endif
+/**  @} */
+
+#endif  // _FWCOM_UTIL_LOG_HPP_
diff --git a/SrcLib/core/fwCom/include/fwCom/util/remove_last_arg.hpp b/SrcLib/core/fwCom/include/fwCom/util/remove_last_arg.hpp
new file mode 100644
index 0000000..b2da341
--- /dev/null
+++ b/SrcLib/core/fwCom/include/fwCom/util/remove_last_arg.hpp
@@ -0,0 +1,112 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCOM_UTIL_REMOVE_LAST_ARG_HPP__
+#define __FWCOM_UTIL_REMOVE_LAST_ARG_HPP__
+
+namespace fwCom
+{
+
+
+namespace util
+{
+
+/**
+ * @class remove_last_arg
+ * @brief Last argument removal class.
+ * Removes the last argument type from a function type. If the given function type has no argument,
+ * remove_last_arg is the identity.
+ *
+ * @tparam F Funtion type whereof to remove last argument
+ */
+template < typename F > 
+struct remove_last_arg;
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 > 
+struct remove_last_arg< R(A1, A2, A3, A4, A5, A6, A7, A8, A9) >
+{
+    typedef R type(A1, A2, A3, A4, A5, A6, A7, A8);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 > 
+struct remove_last_arg< R(A1, A2, A3, A4, A5, A6, A7, A8) >
+{
+    typedef R type(A1, A2, A3, A4, A5, A6, A7);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 , typename A5 , typename A6 , typename A7 > 
+struct remove_last_arg< R(A1, A2, A3, A4, A5, A6, A7) >
+{
+    typedef R type(A1, A2, A3, A4, A5, A6);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 , typename A5 , typename A6 > 
+struct remove_last_arg< R(A1, A2, A3, A4, A5, A6) >
+{
+    typedef R type(A1, A2, A3, A4, A5);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 , typename A5 > 
+struct remove_last_arg< R(A1, A2, A3, A4, A5) >
+{
+    typedef R type(A1, A2, A3, A4);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 , typename A4 > 
+struct remove_last_arg< R(A1, A2, A3, A4) >
+{
+    typedef R type(A1, A2, A3);
+};
+
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2, typename A3 > 
+struct remove_last_arg< R(A1, A2, A3) >
+{
+    typedef R type(A1, A2);
+};
+
+/// remove_last_arg specialization.
+template < typename R, typename A1, typename A2 > 
+struct remove_last_arg< R(A1, A2) >
+{
+    typedef R type(A1);
+};
+
+/// remove_last_arg specialization.
+template < typename R, typename A1 > 
+struct remove_last_arg< R(A1) >
+{
+    typedef R type();
+};
+
+
+/// remove_last_arg specialization.
+template < typename R > 
+struct remove_last_arg< R() >
+{
+    typedef R type();
+};
+
+
+} //namespace util
+
+} //namespace fwCom
+
+#endif /* __FWCOM_UTIL_REMOVE_LAST_ARG_HPP__ */
+
+
diff --git a/SrcLib/core/fwCom/scripts/test/unpacked.cpp b/SrcLib/core/fwCom/scripts/test/unpacked.cpp
new file mode 100644
index 0000000..6bcd5fc
--- /dev/null
+++ b/SrcLib/core/fwCom/scripts/test/unpacked.cpp
@@ -0,0 +1,2123 @@
+//  SLM_LOG
+#include <memory>
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/typeof/std/utility.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/algorithm/string/join.hpp>
+
+#include <boost/asio/io_service.hpp>
+#include <boost/thread.hpp>
+
+
+
+#include <boost/signals2/signal.hpp>
+
+
+template <typename F> struct convert_function_types;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5, typename Args6, typename Args7, typename Args8, typename Args9 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4, Args5, Args6, Args7, Args8, Args9 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5, Args6, Args7, Args8, Args9 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5, typename Args6, typename Args7, typename Args8 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4, Args5, Args6, Args7, Args8 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5, Args6, Args7, Args8 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5, typename Args6, typename Args7 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4, Args5, Args6, Args7 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5, Args6, Args7 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5, typename Args6 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4, Args5, Args6 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5, Args6 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4, typename Args5 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4, Args5 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4, Args5 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3, typename Args4 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3, Args4 )  >
+{
+    typedef R type( Args1, Args2, Args3, Args4 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2, typename Args3 >
+struct convert_function_types< R (C::*) ( Args1, Args2, Args3 )  >
+{
+    typedef R type( Args1, Args2, Args3 ) ;
+};
+template <typename R, typename C, typename Args1, typename Args2 >
+struct convert_function_types< R (C::*) ( Args1, Args2 )  >
+{
+    typedef R type( Args1, Args2 ) ;
+};
+template <typename R, typename C, typename Args1 >
+struct convert_function_types< R (C::*) ( Args1 )  >
+{
+    typedef R type( Args1 ) ;
+};
+template <typename R, typename C>
+struct convert_function_types< R (C::*) ()  >
+{
+    typedef R type() ;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename R, typename C, typename ...Args >
+struct convert_function_types< R (C::*) ( Args... )  >
+{
+    typedef R type( Args... ) ;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+template <typename F>
+struct convert_function_types< boost::function< F > >
+{
+    typedef F type;
+};
+
+template <typename F>
+struct convert_function_types
+{
+    typedef typename boost::remove_pointer<F>::type type;
+};
+
+//-----------------------------------------------------------------------------
+
+
+template < typename F, typename enable = void >
+struct function_types ;
+
+template < typename F>
+struct function_types <F, typename boost::enable_if<typename boost::is_function< F >::type >::type >
+{
+    typedef  F FunctionType;
+    enum { arity = boost::function_types::function_arity< FunctionType >::value } ;
+    typedef typename boost::function_types::result_type<FunctionType>::type result_type;
+    template < int ARG_NUMBER, bool check = false >
+    struct arg
+    {
+        BOOST_STATIC_ASSERT( (!check) || ARG_NUMBER < boost::function_types::function_arity< FunctionType >::value );
+        typedef typename boost::mpl::at_c<boost::function_types::parameter_types< FunctionType >,ARG_NUMBER>::type type;
+    };
+};
+
+
+
+//-----------------------------------------------------------------------------
+
+
+struct Slot
+{
+
+    struct bad_call { };
+    struct bad_run { };
+
+    virtual ~Slot(){};
+
+    template< typename A1, typename A2, typename A3 > void run(A1 a1, A2 a2, A3 a3);
+    template< typename A1, typename A2 > void run(A1 a1, A2 a2);
+    template< typename A1 > void run(A1 a1);
+    void run();
+
+    template< typename R, typename A1, typename A2, typename A3 > R call(A1 a1, A2 a2, A3 a3);
+    template< typename R, typename A1, typename A2 > R call(A1 a1, A2 a2);
+    template< typename R, typename A1 > R call(A1 a1);
+    template< typename R > R call();
+
+
+protected:
+    template < typename F >
+    std::string getTypeName()
+    {
+        std::string signature = std::string("type(") + typeid(F).name() + ")";
+        return signature;
+    }
+
+    std::string m_signature;
+
+};
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1 = boost::mpl::void_, typename A2 = boost::mpl::void_, typename A3 = boost::mpl::void_, typename A4 = boost::mpl::void_, typename A5 = boost::mpl::void_, typename A6 = boost::mpl::void_, typename A7 = boost::mpl::void_, typename A8 = boost::mpl::void_, typename A9 = boost::mpl::void_ >
+struct slot_args : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5, A6  a6, A7  a7, A8  a8, A9  a9 ) = 0;
+};
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+struct slot_args< A1, A2, A3, A4, A5, A6, A7, A8 , boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5, A6  a6, A7  a7, A8  a8 ) = 0;
+};
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+struct slot_args< A1, A2, A3, A4, A5, A6, A7 , boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5, A6  a6, A7  a7 ) = 0;
+};
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+struct slot_args< A1, A2, A3, A4, A5, A6 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5, A6  a6 ) = 0;
+};
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct slot_args< A1, A2, A3, A4, A5 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4, A5  a5 ) = 0;
+};
+template< typename A1, typename A2, typename A3, typename A4 >
+struct slot_args< A1, A2, A3, A4 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3, A4  a4 ) = 0;
+};
+template< typename A1, typename A2, typename A3 >
+struct slot_args< A1, A2, A3 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2, A3  a3 ) = 0;
+};
+template< typename A1, typename A2 >
+struct slot_args< A1, A2 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1, A2  a2 ) = 0;
+};
+template< typename A1 >
+struct slot_args< A1 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run( A1  a1 ) = 0;
+};
+template<>
+struct slot_args< boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_> : Slot
+{
+    virtual void run() = 0;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ... A>
+struct slot_args : Slot
+{
+    virtual void run(A ... a) = 0;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1 = boost::mpl::void_ , typename A2 = boost::mpl::void_ , typename A3 = boost::mpl::void_ , typename A4 = boost::mpl::void_ , typename A5 = boost::mpl::void_ , typename A6 = boost::mpl::void_ , typename A7 = boost::mpl::void_ , typename A8 = boost::mpl::void_ , typename A9 = boost::mpl::void_  >
+struct slot_result : slot_args< A1, A2, A3, A4, A5, A6, A7, A8, A9 >
+{
+    virtual R call( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+struct slot_result<  R, A1, A2, A3, A4, A5, A6, A7, A8 , boost::mpl::void_ > : slot_args< A1, A2, A3, A4, A5, A6, A7, A8 >
+{
+    virtual R call( A1, A2, A3, A4, A5, A6, A7, A8 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+struct slot_result<  R, A1, A2, A3, A4, A5, A6, A7 , boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2, A3, A4, A5, A6, A7 >
+{
+    virtual R call( A1, A2, A3, A4, A5, A6, A7 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+struct slot_result<  R, A1, A2, A3, A4, A5, A6 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2, A3, A4, A5, A6 >
+{
+    virtual R call( A1, A2, A3, A4, A5, A6 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct slot_result<  R, A1, A2, A3, A4, A5 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2, A3, A4, A5 >
+{
+    virtual R call( A1, A2, A3, A4, A5 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+struct slot_result<  R, A1, A2, A3, A4 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2, A3, A4 >
+{
+    virtual R call( A1, A2, A3, A4 ) = 0;
+};
+template< typename R, typename A1, typename A2, typename A3 >
+struct slot_result<  R, A1, A2, A3 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2, A3 >
+{
+    virtual R call( A1, A2, A3 ) = 0;
+};
+template< typename R, typename A1, typename A2 >
+struct slot_result<  R, A1, A2 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1, A2 >
+{
+    virtual R call( A1, A2 ) = 0;
+};
+template< typename R, typename A1 >
+struct slot_result<  R, A1 , boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args< A1 >
+{
+    virtual R call( A1 ) = 0;
+};
+template< typename R>
+struct slot_result<  R, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_, boost::mpl::void_ > : slot_args<>
+{
+    virtual R call() = 0;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ... A >
+struct slot_result : slot_args<A...>
+{
+    virtual R call(A...) = 0;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+
+
+template< typename F > struct SlotFunction;
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) > > : SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ) {        m_func( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ) { return m_func( a1, a2, a3, a4, a5, a6, a7, a8, a9 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4, A5, A6, A7, A8 ) > > : SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7, A8 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4, A5, A6, A7, A8 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ) {        m_func( a1, a2, a3, a4, a5, a6, a7, a8 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ) { return m_func( a1, a2, a3, a4, a5, a6, a7, a8 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4, A5, A6, A7 ) > > : SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4, A5, A6, A7 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ) {        m_func( a1, a2, a3, a4, a5, a6, a7 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ) { return m_func( a1, a2, a3, a4, a5, a6, a7 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4, A5, A6 ) > > : SlotFunction< R ( A1, A2, A3, A4, A5, A6 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4, A5, A6 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ) {        m_func( a1, a2, a3, a4, a5, a6 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ) { return m_func( a1, a2, a3, a4, a5, a6 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4, A5 ) > > : SlotFunction< R ( A1, A2, A3, A4, A5 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4, A5 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) {        m_func( a1, a2, a3, a4, a5 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ) { return m_func( a1, a2, a3, a4, a5 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+struct SlotFunction< boost::function< R ( A1, A2, A3, A4 ) > > : SlotFunction< R ( A1, A2, A3, A4 ) >
+{
+    typedef R FunctorType ( A1, A2, A3, A4 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3, A4 a4 ) {        m_func( a1, a2, a3, a4 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3, A4 a4 ) { return m_func( a1, a2, a3, a4 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2, typename A3 >
+struct SlotFunction< boost::function< R ( A1, A2, A3 ) > > : SlotFunction< R ( A1, A2, A3 ) >
+{
+    typedef R FunctorType ( A1, A2, A3 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2, A3 a3 ) {        m_func( a1, a2, a3 ); };
+    virtual R   call( A1 a1, A2 a2, A3 a3 ) { return m_func( a1, a2, a3 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1, typename A2 >
+struct SlotFunction< boost::function< R ( A1, A2 ) > > : SlotFunction< R ( A1, A2 ) >
+{
+    typedef R FunctorType ( A1, A2 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1, A2 a2 ) {        m_func( a1, a2 ); };
+    virtual R   call( A1 a1, A2 a2 ) { return m_func( a1, a2 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R, typename A1 >
+struct SlotFunction< boost::function< R ( A1 ) > > : SlotFunction< R ( A1 ) >
+{
+    typedef R FunctorType ( A1 ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run( A1 a1 ) {        m_func( a1 ); };
+    virtual R   call( A1 a1 ) { return m_func( a1 ); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+template<typename R>
+struct SlotFunction< boost::function< R () > > : SlotFunction< R () >
+{
+    typedef R FunctorType () ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run() {        m_func(); };
+    virtual R   call() { return m_func(); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+struct SlotFunction< boost::function< R ( A... ) > > : SlotFunction< R ( A... ) >
+{
+    typedef R FunctorType ( A... ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run(A...a) {        m_func(a...); };
+    virtual R   call(A...a) { return m_func(a...); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+struct SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) > : slot_result< R, A1, A2, A3, A4, A5, A6, A7, A8, A9 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+struct SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7, A8 ) > : slot_result< R, A1, A2, A3, A4, A5, A6, A7, A8 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4, A5, A6, A7, A8 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+struct SlotFunction< R ( A1, A2, A3, A4, A5, A6, A7 ) > : slot_result< R, A1, A2, A3, A4, A5, A6, A7 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4, A5, A6, A7 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+struct SlotFunction< R ( A1, A2, A3, A4, A5, A6 ) > : slot_result< R, A1, A2, A3, A4, A5, A6 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4, A5, A6 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+struct SlotFunction< R ( A1, A2, A3, A4, A5 ) > : slot_result< R, A1, A2, A3, A4, A5 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4, A5 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3, typename A4 >
+struct SlotFunction< R ( A1, A2, A3, A4 ) > : slot_result< R, A1, A2, A3, A4 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3, A4 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2, typename A3 >
+struct SlotFunction< R ( A1, A2, A3 ) > : slot_result< R, A1, A2, A3 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2, A3 ) >();
+    }
+
+};
+template<typename R, typename A1, typename A2 >
+struct SlotFunction< R ( A1, A2 ) > : slot_result< R, A1, A2 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1, A2 ) >();
+    }
+
+};
+template<typename R, typename A1 >
+struct SlotFunction< R ( A1 ) > : slot_result< R, A1 >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A1 ) >();
+    }
+
+};
+template<typename R>
+struct SlotFunction< R () > : slot_result< R>
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R () >();
+    }
+
+};
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename R, typename ...A >
+struct SlotFunction< R ( A... ) > : slot_result< R, A... >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A... ) >();
+    }
+
+};
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+
+
+
+
+
+
+
+template< typename A1, typename A2, typename A3 > void Slot::run(A1 a1, A2 a2, A3 a3)
+{
+    typedef slot_args< A1, A2, A3 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2,a3);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1, A2, A3) >()  << std::endl;
+        this->run(a1,a2);
+    }
+}
+template< typename A1, typename A2 > void Slot::run(A1 a1, A2 a2)
+{
+    typedef slot_args< A1, A2 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1, A2) >()  << std::endl;
+        this->run(a1);
+    }
+}
+template< typename A1 > void Slot::run(A1 a1)
+{
+    typedef slot_args< A1 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1) >()  << std::endl;
+        this->run();
+    }
+}
+void Slot::run()
+{
+    typedef slot_args< > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run();
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void() >()  << std::endl;
+        throw Slot::bad_run();
+    }
+}
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3 > R Slot::call(A1 a1, A2 a2, A3 a3)
+{
+    typedef SlotFunction< R (A1, A2, A3) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2,a3);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1, A2, A3) >()  << std::endl;
+        return this->call<R>(a1,a2);
+    }
+}
+template< typename R, typename A1, typename A2 > R Slot::call(A1 a1, A2 a2)
+{
+    typedef SlotFunction< R(A1, A2) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1, A2) >()  << std::endl;
+        return this->call<R>(a1);
+    }
+}
+template< typename R, typename A1 > R Slot::call(A1 a1)
+{
+    typedef SlotFunction< R(A1) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1) >()  << std::endl;
+        return this->call<R>();
+    }
+}
+template< typename R > R Slot::call()
+{
+    typedef slot_result< R > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void() >()  << std::endl;
+        return fun->call();
+    }
+    throw Slot::bad_call();
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+
+
+class Slots
+{
+public:
+    typedef std::string SlotKeyType;
+    typedef boost::shared_ptr< Slot > SlotPtr;
+    typedef std::map< SlotKeyType, SlotPtr > SlotMap;
+
+    Slots(){}
+    Slots( const SlotKeyType &key, SlotPtr slot )
+    {
+        (*this)(key, slot);
+    }
+
+
+    Slots& operator()( const SlotKeyType &key, SlotPtr slot )
+    {
+        m_slots.insert( SlotMap::value_type(key, slot) );
+        return *this;
+    }
+
+    SlotPtr operator()( const SlotKeyType &key )
+    {
+        SlotMap::iterator it = m_slots.find(key);
+
+        if(it != m_slots.end())
+        {
+            return it->second;
+        }
+
+        return SlotPtr();
+    }
+
+protected:
+    SlotMap m_slots;
+};
+
+
+
+
+//-----------------------------------------------------------------------------
+
+
+
+template<typename T>
+struct is_shared_ptr
+{
+    enum { value = false };
+};
+
+template<typename T>
+struct is_shared_ptr< boost::shared_ptr< T > >
+{
+    enum { value = true };
+};
+
+
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+// thread management
+
+
+void WorkerThread( boost::asio::io_service & io_service )
+{
+std::cout << "Thread " << boost::this_thread::get_id() <<" Start\n";
+io_service.run();
+std::cout << "Thread " << boost::this_thread::get_id() <<" Finish\n";
+}
+
+
+class Worker
+{
+public:
+    typedef ::boost::asio::io_service IOServiceType;
+    typedef ::boost::asio::io_service::work WorkType;
+    typedef ::boost::shared_ptr< WorkType > WorkPtrType;
+
+    Worker();
+    ~Worker();
+
+    template< typename Handler>
+    void post(Handler handler)
+    {
+        m_ioService.post(handler);
+    }
+
+protected:
+    Worker( const Worker& );
+    Worker& operator=( const Worker& );
+
+
+    IOServiceType m_ioService;
+    WorkPtrType m_work;
+    boost::thread m_thread;
+};
+
+Worker::Worker() :
+    m_ioService(),
+    m_work( ::boost::make_shared< WorkType >(boost::ref(m_ioService)) ),
+    m_thread( ::boost::bind(&WorkerThread, boost::ref(m_ioService)) )
+{
+}
+
+Worker::~Worker()
+{
+    m_work.reset();
+    m_ioService.stop();
+    m_thread.join();
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+
+template <typename R>
+struct TaskHandler
+{
+    TaskHandler(boost::packaged_task<R>& task) : m_Task(boost::move(task)) {}
+    TaskHandler(const TaskHandler& that) : m_Task(boost::move(that.m_Task)) {}
+
+    void operator ()() { this->m_Task(); }
+
+private:
+    mutable boost::packaged_task<R> m_Task;
+};
+
+
+template <typename R>
+inline boost::function< void() > moveTaskIntoFunction(boost::packaged_task<R>& task)
+{
+    return TaskHandler<R>(task);
+}
+
+
+
+
+
+class Method
+{
+public :
+
+
+    Method(Slots::SlotPtr slot) : m_slot(slot) {}
+
+    Slots::SlotPtr operator=(Slots::SlotPtr slot) { m_slot = slot ; return slot;}
+    Method& operator=(const Method &other) { m_slot = other.m_slot ; return *this;}
+    // template < typename SLOTPTR >
+    // Method( const SLOTPTR &slot, typename boost::enable_if_c< is_shared_ptr< SLOTPTR >::value >::type*x=0 )  : m_slot(slot) {}
+
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 0 >::type*x=0  ) { setSlot(f); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 1 >::type*x=0  ) { setSlot(f,_1); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 2 >::type*x=0  ) { setSlot(f,_1,_2); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 3 >::type*x=0  ) { setSlot(f,_1,_2,_3); }
+
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 0 >::type*x=0 ) { setSlot(f,o); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 1 >::type*x=0 ) { setSlot(f,o,_1); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 2 >::type*x=0 ) { setSlot(f,o,_1,_2); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 3 >::type*x=0 ) { setSlot(f,o,_1,_2,_3); }
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7, args8, args9 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7, args8 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4 >
+    void operator()( A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        m_slot->run( args1, args2, args3, args4 );
+    }
+
+template < typename A1, typename A2, typename A3 >
+    void operator()( A1 args1, A2 args2, A3 args3 )
+    {
+        m_slot->run( args1, args2, args3 );
+    }
+
+template < typename A1, typename A2 >
+    void operator()( A1 args1, A2 args2 )
+    {
+        m_slot->run( args1, args2 );
+    }
+
+template < typename A1 >
+    void operator()( A1 args1 )
+    {
+        m_slot->run( args1 );
+    }
+
+
+    void operator()()
+    {
+        m_slot->run();
+    }
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename ...A>
+    void operator()( A... args  )
+    {
+        m_slot->run( args... );
+    }
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7, args8, args9 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7, args8 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6, args7 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5, args6 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        m_slot->run( args1, args2, args3, args4, args5 );
+    }
+
+template < typename A1, typename A2, typename A3, typename A4 >
+    void run( A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        m_slot->run( args1, args2, args3, args4 );
+    }
+
+template < typename A1, typename A2, typename A3 >
+    void run( A1 args1, A2 args2, A3 args3 )
+    {
+        m_slot->run( args1, args2, args3 );
+    }
+
+template < typename A1, typename A2 >
+    void run( A1 args1, A2 args2 )
+    {
+        m_slot->run( args1, args2 );
+    }
+
+template < typename A1 >
+    void run( A1 args1 )
+    {
+        m_slot->run( args1 );
+    }
+
+
+    void run()
+    {
+        m_slot->run();
+    }
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename ...A>
+    void run( A... args  )
+    {
+        m_slot->run( args... );
+    }
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4, args5, args6, args7, args8, args9 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4, args5, args6, args7, args8 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4, args5, args6, args7 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4, args5, args6 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4, args5 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4 >
+    R call( A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        return m_slot->call<R>( args1, args2, args3, args4 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3 >
+    R call( A1 args1, A2 args2, A3 args3 )
+    {
+        return m_slot->call<R>( args1, args2, args3 );
+    }
+
+
+
+template <typename R, typename A1, typename A2 >
+    R call( A1 args1, A2 args2 )
+    {
+        return m_slot->call<R>( args1, args2 );
+    }
+
+
+
+template <typename R, typename A1 >
+    R call( A1 args1 )
+    {
+        return m_slot->call<R>( args1 );
+    }
+
+
+
+template <typename R>
+    R call()
+    {
+        return m_slot->call<R>();
+    }
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename R, typename ...A>
+    R call( A... args  )
+    {
+        return m_slot->call<R>( args... );
+    }
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4, A5, A6, A7, A8, A9 >( args1, args2, args3, args4, args5, args6, args7, args8, args9 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4, A5, A6, A7, A8 >( args1, args2, args3, args4, args5, args6, args7, args8 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4, A5, A6, A7 >( args1, args2, args3, args4, args5, args6, args7 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4, A5, A6 >( args1, args2, args3, args4, args5, args6 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3, typename A4, typename A5 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4, A5 >( args1, args2, args3, args4, args5 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3, typename A4 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3, A4 >( args1, args2, args3, args4 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2, typename A3 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2, A3 args3 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2, A3 >( args1, args2, args3 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1, typename A2 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1, A2 args2 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1, A2 >( args1, args2 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+template< typename A1 >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A1 args1 )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A1 >( args1 ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+    ::boost::shared_future< void > asyncRun( Worker &worker)
+    {
+        ::boost::packaged_task<void> task(  this->bindRun() );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename ...A >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A... args )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A... >( args... ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4, A5, A6, A7, A8, A9 >( args1, args2, args3, args4, args5, args6, args7, args8, args9 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4, A5, A6, A7, A8 >( args1, args2, args3, args4, args5, args6, args7, args8 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4, A5, A6, A7 >( args1, args2, args3, args4, args5, args6, args7 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4, A5, A6 >( args1, args2, args3, args4, args5, args6 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4, A5 >( args1, args2, args3, args4, args5 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3, typename A4 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3, A4 >( args1, args2, args3, args4 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2, A3 args3 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2, A3 >( args1, args2, args3 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1, typename A2 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1, A2 args2 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1, A2 >( args1, args2 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R, typename A1 >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A1 args1 )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A1 >( args1 ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+template< typename R>
+    ::boost::shared_future< R > asyncCall( Worker &worker)
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R>() );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template< typename R, typename ...A >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A... args )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A... >( args... ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+Slots::SlotPtr slot(){return m_slot;};
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) ) &Method::run< A1, A2, A3, A4, A5, A6, A7, A8, A9 >, this, args1, args2, args3, args4, args5, args6, args7, args8, args9 );
+    }
+
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4, A5, A6, A7, A8 ) ) &Method::run< A1, A2, A3, A4, A5, A6, A7, A8 >, this, args1, args2, args3, args4, args5, args6, args7, args8 );
+    }
+
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4, A5, A6, A7 ) ) &Method::run< A1, A2, A3, A4, A5, A6, A7 >, this, args1, args2, args3, args4, args5, args6, args7 );
+    }
+
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4, A5, A6 ) ) &Method::run< A1, A2, A3, A4, A5, A6 >, this, args1, args2, args3, args4, args5, args6 );
+    }
+
+
+template < typename A1, typename A2, typename A3, typename A4, typename A5 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4, A5 ) ) &Method::run< A1, A2, A3, A4, A5 >, this, args1, args2, args3, args4, args5 );
+    }
+
+
+template < typename A1, typename A2, typename A3, typename A4 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3, A4 ) ) &Method::run< A1, A2, A3, A4 >, this, args1, args2, args3, args4 );
+    }
+
+
+template < typename A1, typename A2, typename A3 >
+    boost::function< void() > bindRun( A1 args1, A2 args2, A3 args3 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2, A3 ) ) &Method::run< A1, A2, A3 >, this, args1, args2, args3 );
+    }
+
+
+template < typename A1, typename A2 >
+    boost::function< void() > bindRun( A1 args1, A2 args2 )
+    {
+        return boost::bind( ( void (Method::*)( A1, A2 ) ) &Method::run< A1, A2 >, this, args1, args2 );
+    }
+
+
+template < typename A1 >
+    boost::function< void() > bindRun( A1 args1 )
+    {
+        return boost::bind( ( void (Method::*)( A1 ) ) &Method::run< A1 >, this, args1 );
+    }
+
+
+
+    boost::function< void() > bindRun()
+    {
+        return boost::bind( ( void (Method::*)() ) &Method::run, this);
+    }
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename ...A>
+    boost::function< void() > bindRun( A... args  )
+    {
+        return boost::bind( ( void (Method::*)(A...) ) &Method::run< A... >, this, args... );
+    }
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8, A9 args9 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4, A5, A6, A7, A8, A9 ) ) &Method::call<R, A1, A2, A3, A4, A5, A6, A7, A8, A9 >, this, args1, args2, args3, args4, args5, args6, args7, args8, args9 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7, A8 args8 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4, A5, A6, A7, A8 ) ) &Method::call<R, A1, A2, A3, A4, A5, A6, A7, A8 >, this, args1, args2, args3, args4, args5, args6, args7, args8 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6, A7 args7 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4, A5, A6, A7 ) ) &Method::call<R, A1, A2, A3, A4, A5, A6, A7 >, this, args1, args2, args3, args4, args5, args6, args7 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5, A6 args6 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4, A5, A6 ) ) &Method::call<R, A1, A2, A3, A4, A5, A6 >, this, args1, args2, args3, args4, args5, args6 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4, typename A5 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4, A5 args5 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4, A5 ) ) &Method::call<R, A1, A2, A3, A4, A5 >, this, args1, args2, args3, args4, args5 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3, typename A4 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3, A4 args4 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3, A4 ) ) &Method::call<R, A1, A2, A3, A4 >, this, args1, args2, args3, args4 );
+    }
+
+
+
+template <typename R, typename A1, typename A2, typename A3 >
+    boost::function< R() > bindCall( A1 args1, A2 args2, A3 args3 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2, A3 ) ) &Method::call<R, A1, A2, A3 >, this, args1, args2, args3 );
+    }
+
+
+
+template <typename R, typename A1, typename A2 >
+    boost::function< R() > bindCall( A1 args1, A2 args2 )
+    {
+        return boost::bind( ( R (Method::*)( A1, A2 ) ) &Method::call<R, A1, A2 >, this, args1, args2 );
+    }
+
+
+
+template <typename R, typename A1 >
+    boost::function< R() > bindCall( A1 args1 )
+    {
+        return boost::bind( ( R (Method::*)( A1 ) ) &Method::call<R, A1 >, this, args1 );
+    }
+
+
+
+template <typename R>
+    boost::function< R() > bindCall()
+    {
+        return boost::bind( ( R (Method::*)() ) &Method::call<R>, this);
+    }
+
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template <typename R, typename ...A>
+    boost::function< R() > bindCall( A... args  )
+    {
+        return boost::bind( ( R (Method::*)(A...) ) &Method::call<R, A...>, this, args... );
+    }
+
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+protected:
+#ifdef BOOST_NO_VARIADIC_TEMPLATES
+//===============================================================================
+//===============================================================================
+//==================================== BEGIN ====================================
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5, typename Bindings6, typename Bindings7, typename Bindings8, typename Bindings9 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5, Bindings6  bindings6, Bindings7  bindings7, Bindings8  bindings8, Bindings9  bindings9 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4, bindings5, bindings6, bindings7, bindings8, bindings9 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5, typename Bindings6, typename Bindings7, typename Bindings8 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5, Bindings6  bindings6, Bindings7  bindings7, Bindings8  bindings8 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4, bindings5, bindings6, bindings7, bindings8 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5, typename Bindings6, typename Bindings7 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5, Bindings6  bindings6, Bindings7  bindings7 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4, bindings5, bindings6, bindings7 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5, typename Bindings6 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5, Bindings6  bindings6 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4, bindings5, bindings6 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4, typename Bindings5 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4, Bindings5  bindings5 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4, bindings5 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3, typename Bindings4 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3, Bindings4  bindings4 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3, bindings4 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2, typename Bindings3 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2, Bindings3  bindings3 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2, bindings3 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1, typename Bindings2 > void setSlot(F f, Bindings1  bindings1, Bindings2  bindings2 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1, bindings2 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F, typename Bindings1 > void setSlot(F f, Bindings1  bindings1 )
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings1 ) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+template<typename F> void setSlot(F f)
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+//===================================== END =====================================
+//===============================================================================
+//===============================================================================
+
+#else  // BOOST_NO_VARIADIC_TEMPLATES
+template<typename F, typename ...Bindings> void setSlot(F f, Bindings ...bindings)
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings...) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+
+#endif  // BOOST_NO_VARIADIC_TEMPLATES
+Slots::SlotPtr m_slot;
+};
+
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+
+struct Event{};
+struct KeyEvent:Event{};
+
+struct has_slots
+{
+    Slots::SlotPtr slot( Slots::SlotKeyType key ){ return m_slots(key);};
+protected:
+    Slots m_slots;
+};
+
+//-----------------------------------------------------------------------------
+
+class A : public has_slots
+{
+
+public:
+    A()
+    {
+        has_slots::m_slots
+            ( "start"      , Method(&A::start      , this).slot() )
+            ( "update"     , Method(&A::update     , this).slot() )
+            ( "onEvent"    , Method(&A::onEvent    , this).slot() )
+            ( "onKeyPress" , Method(&A::onKeyPress , this).slot() )
+            ;
+
+    }
+    void start(){ std::cout<<"A::start"<<std::endl; }
+    void update(){ std::cout<<"A::update"<<std::endl; }
+    void onEvent( Event *e )
+    {
+        std::cout<<"A::onEvent "<< e <<std::endl;
+    }
+    void onKeyPress( KeyEvent *e )
+    {
+        std::cout<<"A::onKeyPress " << e <<std::endl;
+    }
+    void print( std::string msg ){ std::cout << "A::print " <<msg<<std::endl; }
+
+};
+
+//-----------------------------------------------------------------------------
+
+class B : public has_slots
+{
+public:
+    B()
+    {
+        has_slots::m_slots
+            ( "invoke", Method(&B::invoke, this).slot() )
+            ;
+
+    }
+    void invoke() { std::cout<<"B::invoke"<<std::endl; }
+
+    void print( std::string str ) { std::cout<< str <<std::endl; }
+};
+
+//-----------------------------------------------------------------------------
+
+
+int sum(int a, int b)
+{
+    return a + b;
+}
+
+void fe(Event*)
+{
+    std::cout << "fe " <<std::endl;
+}
+
+void fke(KeyEvent*)
+{
+    std::cout << "fke " <<std::endl;
+}
+
+
+int main(int argc, char* argv[])
+{
+
+    using namespace std;
+
+    A * a = new A();
+    B b;
+
+    Event e;
+    KeyEvent ke;
+
+    cout << "============ v2 ============" << endl;
+    // v2
+    {
+        Method call ( &A::start, a );
+        call();
+        call.call<void>();
+    }
+
+    {
+        Method call ( &B::invoke, &b );
+        call();
+        call.call<void>();
+        call.call<void>("toto", 3);
+        call.call<void>(true, Event());
+    }
+
+
+    {
+        Method call ( &A::onEvent, a );
+        call(&e);
+        call.run<Event*>(&ke);
+    }
+
+    {
+        Method call ( &sum );
+        call(5,7);
+        call(5,7,8);
+        call.run(5,7,8);
+        cout << "sum: " << call.call<int>(5,7) << endl;
+    }
+
+    {
+        Method call ( &A::onKeyPress, a );
+        call.run(&ke);
+    }
+
+    cout << "============ v3 ============" << endl;
+
+    // v3
+    {
+        Method call ( a->slot("start") );
+        call.run();
+        call.call<void>();
+
+        call = b.slot("invoke");
+
+        Method call2 = call;
+        call2.run();
+
+        call2 = call;
+        call2.run();
+
+        call = a->slot("update");
+        Method call3(call);
+        call3.run();
+    }
+
+    {
+        Method call ( b.slot("invoke") );
+        call();
+        call.call<void>();
+    }
+
+    {
+        Method call ( a->slot("onEvent") );
+        call.run(&e);
+        call.run<Event*>(&ke);
+    }
+
+    {
+        Method call ( a->slot("onKeyPress") );
+        call.run(&ke);
+
+        a->slot("onKeyPress")->run(&ke);
+    }
+
+
+    {
+
+        Slots slots;
+        slots
+            ( "sum_slot", Method( &sum ).slot() )
+            ;
+
+        Method call ( slots("sum_slot") ) ;
+
+        cout << "sum_slot: " << call.call<int>(44,66) << endl;
+    }
+
+
+    cout << "============ slot ============" << endl;
+
+    // direct slot
+    {
+        a->slot("start")->run(&ke);
+        a->slot("onEvent")->run(&e);
+        a->slot("onKeyPress")->run(&ke);
+        b.slot("invoke")->run();
+    }
+
+
+    cout << "============ signals ============" << endl;
+    // signal
+    {
+          boost::signals2::signal<void (Event*)> sig;
+
+          Method call1 ( &A::start, a );
+          Method call2 ( &B::invoke, &b );
+          Method call3 ( &A::onEvent, a );
+
+          sig.connect(boost::ref(call1));
+          sig.connect(boost::ref(call2));
+          sig.connect(boost::ref(call3));
+
+          sig( &e );
+    }
+
+
+    cout << "============ worker ============" << endl;
+    cout << "============ worker & async ============" << endl;
+
+    {
+        Method invoke ( &B::invoke, &b );
+        Method print ( &B::print, &b );
+        // call.call<void>();
+        // call.call<void>("toto", 3);
+        // call.call<void>(true, Event());
+
+        Worker w;
+
+        w.post(invoke);
+        w.post( boost::bind( &B::invoke, &b ) );
+        w.post( boost::bind( &B::print, &b, "iosrv") );
+
+        // print.bindRun(std::string("bind test"))();
+
+        // w.post(print.bindRun(std::string("bind test")));
+
+        w.post( boost::bind( &B::print, &b, "print : 1") );
+        w.post( boost::bind( &B::print, &b, "print : 2") );
+        w.post( boost::bind( &B::print, &b, "print : 3") );
+
+
+        Method sumFunc ( &sum );
+
+        Worker w1;
+        Worker w2;
+
+        boost::shared_future< int > future = sumFunc.asyncCall<int>(w1, 2,8);
+        cout << "sum.is_ready(): " << future.is_ready() << endl;
+
+        invoke.asyncRun(w1);
+        print.asyncRun(w1, std::string("async run w1 0"));
+        print.asyncRun(w1, std::string("async run w1 1"));
+        print.asyncRun(w1, std::string("async run w1 2"));
+        print.asyncRun(w1, std::string("async run w1 3"));
+        print.asyncRun(w1, std::string("async run w1 4"));
+        print.asyncRun(w1, std::string("async run w1 5"));
+
+
+        print.asyncRun(w2, std::string("async run w2 0"));
+        print.asyncRun(w2, std::string("async run w2 1"));
+        print.asyncRun(w2, std::string("async run w2 2"));
+        print.asyncRun(w2, std::string("async run w2 3"));
+        print.asyncRun(w2, std::string("async run w2 4"));
+        print.asyncRun(w2, std::string("async run w2 5"));
+
+
+
+        future.wait();
+        cout << "sum.is_ready(): " << future.is_ready() << endl;
+        cout << "sum.has_value(): " << future.has_value() << endl;
+        cout << "sum.has_exception(): " << future.has_exception() << endl;
+        cout << "sum: " << future.get() << endl;
+
+
+
+        print.asyncRun(w1, std::string("async run w1 with wait")).wait();
+        print.asyncRun(w2, std::string("async run w2 with wait")).wait();
+
+    }
+
+
+
+    delete a;
+    return 0;
+}
+
+/* Output :
+============ v2 ============
+A::start
+A::start
+B::invoke
+B::invoke
+B::invoke
+B::invoke
+A::onEvent 0x7fff5fbff500
+A::onEvent 0x7fff5fbff4f8
+sum: 12
+A::onKeyPress 0x7fff5fbff4f8
+============ v3 ============
+A::start
+A::start
+B::invoke
+B::invoke
+A::onEvent 0x7fff5fbff500
+A::onEvent 0x7fff5fbff4f8
+A::onKeyPress 0x7fff5fbff4f8
+A::onKeyPress 0x7fff5fbff4f8
+sum_slot: 110
+============ slot ============
+A::start
+A::onEvent 0x7fff5fbff500
+A::onKeyPress 0x7fff5fbff4f8
+B::invoke
+============ signals ============
+A::start
+B::invoke
+A::onEvent 0x7fff5fbff500
+
+*/
+
+
diff --git a/SrcLib/core/fwCom/scripts/test/variadic.cpp b/SrcLib/core/fwCom/scripts/test/variadic.cpp
new file mode 100644
index 0000000..f39aa91
--- /dev/null
+++ b/SrcLib/core/fwCom/scripts/test/variadic.cpp
@@ -0,0 +1,848 @@
+//  SLM_LOG
+#include <memory>
+#include <functional>
+#include <iostream>
+#include <map>
+#include <sstream>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/function_types/function_arity.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/parameter_types.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/typeof/std/utility.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/algorithm/string/join.hpp>
+
+#include <boost/asio/io_service.hpp>
+#include <boost/thread.hpp>
+
+
+
+#include <boost/signals2/signal.hpp>
+
+
+template <typename F> struct convert_function_types;
+
+template <typename R, typename C, typename ...Args >
+struct convert_function_types< R (C::*) ( Args... )  >
+{
+    typedef R type( Args... ) ;
+};
+
+template <typename F>
+struct convert_function_types< boost::function< F > >
+{
+    typedef F type;
+};
+
+template <typename F>
+struct convert_function_types
+{
+    typedef typename boost::remove_pointer<F>::type type;
+};
+
+//-----------------------------------------------------------------------------
+
+
+template < typename F, typename enable = void >
+struct function_types ;
+
+template < typename F>
+struct function_types <F, typename boost::enable_if<typename boost::is_function< F >::type >::type >
+{
+    typedef  F FunctionType;
+    enum { arity = boost::function_types::function_arity< FunctionType >::value } ;
+    typedef typename boost::function_types::result_type<FunctionType>::type result_type;
+    template < int ARG_NUMBER, bool check = false >
+    struct arg
+    {
+        BOOST_STATIC_ASSERT( (!check) || ARG_NUMBER < boost::function_types::function_arity< FunctionType >::value );
+        typedef typename boost::mpl::at_c<boost::function_types::parameter_types< FunctionType >,ARG_NUMBER>::type type;
+    };
+};
+
+
+
+//-----------------------------------------------------------------------------
+
+
+struct Slot
+{
+
+    struct bad_call { };
+    struct bad_run { };
+
+    virtual ~Slot(){};
+
+    template< typename A1, typename A2, typename A3 > void run(A1 a1, A2 a2, A3 a3);
+    template< typename A1, typename A2 > void run(A1 a1, A2 a2);
+    template< typename A1 > void run(A1 a1);
+    void run();
+
+    template< typename R, typename A1, typename A2, typename A3 > R call(A1 a1, A2 a2, A3 a3);
+    template< typename R, typename A1, typename A2 > R call(A1 a1, A2 a2);
+    template< typename R, typename A1 > R call(A1 a1);
+    template< typename R > R call();
+
+
+protected:
+    template < typename F >
+    std::string getTypeName()
+    {
+        std::string signature = std::string("type(") + typeid(F).name() + ")";
+        return signature;
+    }
+
+    std::string m_signature;
+
+};
+
+
+template< typename ... A>
+struct slot_args : Slot
+{
+    virtual void run(A ... a) = 0;
+};
+
+
+template< typename R, typename ... A >
+struct slot_result : slot_args<A...>
+{
+    virtual R call(A...) = 0;
+};
+
+
+
+
+template< typename F > struct SlotFunction;
+
+
+template<typename R, typename ...A >
+struct SlotFunction< boost::function< R ( A... ) > > : SlotFunction< R ( A... ) >
+{
+    typedef R FunctorType ( A... ) ;
+
+    template< typename FUNCTOR > SlotFunction( FUNCTOR f ) : m_func(f)
+    { }
+
+
+    virtual void run(A...a) {        m_func(a...); };
+    virtual R   call(A...a) { return m_func(a...); };
+protected:
+    boost::function< FunctorType > m_func;
+};
+
+
+
+template<typename R, typename ...A >
+struct SlotFunction< R ( A... ) > : slot_result< R, A... >
+{
+    SlotFunction()
+    {
+        // this-> needed by gcc 4.2
+        this->Slot::m_signature = Slot::getTypeName< R ( A... ) >();
+    }
+
+};
+
+
+
+
+
+
+
+template< typename A1, typename A2, typename A3 > void Slot::run(A1 a1, A2 a2, A3 a3)
+{
+    typedef slot_args< A1, A2, A3 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2,a3);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1, A2, A3) >()  << std::endl;
+        this->run(a1,a2);
+    }
+}
+template< typename A1, typename A2 > void Slot::run(A1 a1, A2 a2)
+{
+    typedef slot_args< A1, A2 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1,a2);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1, A2) >()  << std::endl;
+        this->run(a1);
+    }
+}
+template< typename A1 > void Slot::run(A1 a1)
+{
+    typedef slot_args< A1 > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run(a1);
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void(A1) >()  << std::endl;
+        this->run();
+    }
+}
+void Slot::run()
+{
+    typedef slot_args< > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run();
+    }
+    else
+    {
+        std::cerr << "failed to run : " << m_signature << " with " << Slot::getTypeName< void() >()  << std::endl;
+        throw Slot::bad_run();
+    }
+}
+
+
+
+
+template< typename R, typename A1, typename A2, typename A3 > R Slot::call(A1 a1, A2 a2, A3 a3)
+{
+    typedef SlotFunction< R (A1, A2, A3) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2,a3);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1, A2, A3) >()  << std::endl;
+        return this->call<R>(a1,a2);
+    }
+}
+template< typename R, typename A1, typename A2 > R Slot::call(A1 a1, A2 a2)
+{
+    typedef SlotFunction< R(A1, A2) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1,a2);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1, A2) >()  << std::endl;
+        return this->call<R>(a1);
+    }
+}
+template< typename R, typename A1 > R Slot::call(A1 a1)
+{
+    typedef SlotFunction< R(A1) > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->call(a1);
+    }
+    else
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void(A1) >()  << std::endl;
+        return this->call<R>();
+    }
+}
+template< typename R > R Slot::call()
+{
+    typedef slot_result< R > SlotFuncType;
+    SlotFuncType *fun = dynamic_cast< SlotFuncType* >(this);
+    if(fun)
+    {
+        std::cerr << "failed to call : " << m_signature << " with " << Slot::getTypeName< void() >()  << std::endl;
+        return fun->call();
+    }
+    throw Slot::bad_call();
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+
+
+class Slots
+{
+public:
+    typedef std::string SlotKeyType;
+    typedef boost::shared_ptr< Slot > SlotPtr;
+    typedef std::map< SlotKeyType, SlotPtr > SlotMap;
+
+    Slots(){}
+    Slots( const SlotKeyType &key, SlotPtr slot )
+    {
+        (*this)(key, slot);
+    }
+
+
+    Slots& operator()( const SlotKeyType &key, SlotPtr slot )
+    {
+        m_slots.insert( SlotMap::value_type(key, slot) );
+        return *this;
+    }
+
+    SlotPtr operator()( const SlotKeyType &key )
+    {
+        SlotMap::iterator it = m_slots.find(key);
+
+        if(it != m_slots.end())
+        {
+            return it->second;
+        }
+
+        return SlotPtr();
+    }
+
+protected:
+    SlotMap m_slots;
+};
+
+
+
+
+//-----------------------------------------------------------------------------
+
+
+
+template<typename T>
+struct is_shared_ptr
+{
+    enum { value = false };
+};
+
+template<typename T>
+struct is_shared_ptr< boost::shared_ptr< T > >
+{
+    enum { value = true };
+};
+
+
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+// thread management
+
+
+void WorkerThread( boost::asio::io_service & io_service )
+{
+std::cout << "Thread " << boost::this_thread::get_id() <<" Start\n";
+io_service.run();
+std::cout << "Thread " << boost::this_thread::get_id() <<" Finish\n";
+}
+
+
+class Worker
+{
+public:
+    typedef ::boost::asio::io_service IOServiceType;
+    typedef ::boost::asio::io_service::work WorkType;
+    typedef ::boost::shared_ptr< WorkType > WorkPtrType;
+
+    Worker();
+    ~Worker();
+
+    template< typename Handler>
+    void post(Handler handler)
+    {
+        m_ioService.post(handler);
+    }
+
+protected:
+    Worker( const Worker& );
+    Worker& operator=( const Worker& );
+
+
+    IOServiceType m_ioService;
+    WorkPtrType m_work;
+    boost::thread m_thread;
+};
+
+Worker::Worker() :
+    m_ioService(),
+    m_work( ::boost::make_shared< WorkType >(boost::ref(m_ioService)) ),
+    m_thread( ::boost::bind(&WorkerThread, boost::ref(m_ioService)) )
+{
+}
+
+Worker::~Worker()
+{
+    m_work.reset();
+    m_ioService.stop();
+    m_thread.join();
+}
+
+
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+
+template <typename R>
+struct TaskHandler
+{
+    TaskHandler(boost::packaged_task<R>& task) : m_Task(boost::move(task)) {}
+    TaskHandler(const TaskHandler& that) : m_Task(boost::move(that.m_Task)) {}
+
+    void operator ()() { this->m_Task(); }
+
+private:
+    mutable boost::packaged_task<R> m_Task;
+};
+
+
+template <typename R>
+inline boost::function< void() > moveTaskIntoFunction(boost::packaged_task<R>& task)
+{
+    return TaskHandler<R>(task);
+}
+
+
+
+
+
+class Method
+{
+public :
+
+
+    Method(Slots::SlotPtr slot) : m_slot(slot) {}
+
+    Slots::SlotPtr operator=(Slots::SlotPtr slot) { m_slot = slot ; return slot;}
+    Method& operator=(const Method &other) { m_slot = other.m_slot ; return *this;}
+    // template < typename SLOTPTR >
+    // Method( const SLOTPTR &slot, typename boost::enable_if_c< is_shared_ptr< SLOTPTR >::value >::type*x=0 )  : m_slot(slot) {}
+
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 0 >::type*x=0  ) { setSlot(f); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 1 >::type*x=0  ) { setSlot(f,_1); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 2 >::type*x=0  ) { setSlot(f,_1,_2); }
+    template<typename F>
+    Method( F f, typename boost::enable_if_c< function_types< typename boost::remove_pointer<F>::type >::arity == 3 >::type*x=0  ) { setSlot(f,_1,_2,_3); }
+
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 0 >::type*x=0 ) { setSlot(f,o); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 1 >::type*x=0 ) { setSlot(f,o,_1); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 2 >::type*x=0 ) { setSlot(f,o,_1,_2); }
+    template<typename F, typename O >
+    Method( F f, O *o, typename boost::enable_if_c< function_types< typename convert_function_types< F >::type >::arity == 3 >::type*x=0 ) { setSlot(f,o,_1,_2,_3); }
+
+    template <typename ...A>
+    void operator()( A... args  )
+    {
+        m_slot->run( args... );
+    }
+    template <typename ...A>
+    void run( A... args  )
+    {
+        m_slot->run( args... );
+    }
+    template <typename R, typename ...A>
+    R call( A... args  )
+    {
+        return m_slot->call<R>( args... );
+    }
+
+
+    template< typename ...A >
+    ::boost::shared_future< void > asyncRun( Worker &worker, A... args )
+    {
+        ::boost::packaged_task<void> task(  this->bindRun< A... >( args... ) );
+        ::boost::future< void > ufuture = task.get_future();
+
+        boost::function< void () > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+    template< typename R, typename ...A >
+    ::boost::shared_future< R > asyncCall( Worker &worker, A... args )
+    {
+        ::boost::packaged_task<R> task( this->bindCall< R, A... >( args... ) );
+        ::boost::future< R > ufuture = task.get_future();
+
+        boost::function< void() > f = moveTaskIntoFunction(task);
+
+        worker.post(f);
+
+        return boost::move(ufuture);
+    }
+
+
+
+    Slots::SlotPtr slot(){return m_slot;};
+
+
+    template <typename ...A>
+    boost::function< void() > bindRun( A... args  )
+    {
+        return boost::bind( ( void (Method::*)(A...) ) &Method::run< A... >, this, args... );
+    }
+
+    template <typename R, typename ...A>
+    boost::function< R() > bindCall( A... args  )
+    {
+        return boost::bind( ( R (Method::*)(A...) ) &Method::call<R, A...>, this, args... );
+    }
+
+
+protected:
+    template<typename F, typename ...Bindings> void setSlot(F f, Bindings ...bindings)
+    {
+        typedef ::boost::function< typename convert_function_types< F >::type > FunctionType;
+        FunctionType func;
+        func = boost::bind(f, bindings...) ;
+        m_slot = boost::make_shared< SlotFunction< FunctionType > > ( func );
+    }
+
+    Slots::SlotPtr m_slot;
+};
+
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+
+struct Event{};
+struct KeyEvent:Event{};
+
+struct has_slots
+{
+    Slots::SlotPtr slot( Slots::SlotKeyType key ){ return m_slots(key);};
+protected:
+    Slots m_slots;
+};
+
+//-----------------------------------------------------------------------------
+
+class A : public has_slots
+{
+
+public:
+    A()
+    {
+        has_slots::m_slots
+            ( "start"      , Method(&A::start      , this).slot() )
+            ( "update"     , Method(&A::update     , this).slot() )
+            ( "onEvent"    , Method(&A::onEvent    , this).slot() )
+            ( "onKeyPress" , Method(&A::onKeyPress , this).slot() )
+            ;
+
+    }
+    void start(){ std::cout<<"A::start"<<std::endl; }
+    void update(){ std::cout<<"A::update"<<std::endl; }
+    void onEvent( Event *e )
+    {
+        std::cout<<"A::onEvent "<< e <<std::endl;
+    }
+    void onKeyPress( KeyEvent *e )
+    {
+        std::cout<<"A::onKeyPress " << e <<std::endl;
+    }
+    void print( std::string msg ){ std::cout << "A::print " <<msg<<std::endl; }
+
+};
+
+//-----------------------------------------------------------------------------
+
+class B : public has_slots
+{
+public:
+    B()
+    {
+        has_slots::m_slots
+            ( "invoke", Method(&B::invoke, this).slot() )
+            ;
+
+    }
+    void invoke() { std::cout<<"B::invoke"<<std::endl; }
+
+    void print( std::string str ) { std::cout<< str <<std::endl; }
+};
+
+//-----------------------------------------------------------------------------
+
+
+int sum(int a, int b)
+{
+    return a + b;
+}
+
+void fe(Event*)
+{
+    std::cout << "fe " <<std::endl;
+}
+
+void fke(KeyEvent*)
+{
+    std::cout << "fke " <<std::endl;
+}
+
+
+int main(int argc, char* argv[])
+{
+
+    using namespace std;
+
+    A * a = new A();
+    B b;
+
+    Event e;
+    KeyEvent ke;
+
+    cout << "============ v2 ============" << endl;
+    // v2
+    {
+        Method call ( &A::start, a );
+        call();
+        call.call<void>();
+    }
+
+    {
+        Method call ( &B::invoke, &b );
+        call();
+        call.call<void>();
+        call.call<void>("toto", 3);
+        call.call<void>(true, Event());
+    }
+
+
+    {
+        Method call ( &A::onEvent, a );
+        call(&e);
+        call.run<Event*>(&ke);
+    }
+
+    {
+        Method call ( &sum );
+        call(5,7);
+        call(5,7,8);
+        call.run(5,7,8);
+        cout << "sum: " << call.call<int>(5,7) << endl;
+    }
+
+    {
+        Method call ( &A::onKeyPress, a );
+        call.run(&ke);
+    }
+
+    cout << "============ v3 ============" << endl;
+
+    // v3
+    {
+        Method call ( a->slot("start") );
+        call.run();
+        call.call<void>();
+
+        call = b.slot("invoke");
+
+        Method call2 = call;
+        call2.run();
+
+        call2 = call;
+        call2.run();
+
+        call = a->slot("update");
+        Method call3(call);
+        call3.run();
+    }
+
+    {
+        Method call ( b.slot("invoke") );
+        call();
+        call.call<void>();
+    }
+
+    {
+        Method call ( a->slot("onEvent") );
+        call.run(&e);
+        call.run<Event*>(&ke);
+    }
+
+    {
+        Method call ( a->slot("onKeyPress") );
+        call.run(&ke);
+
+        a->slot("onKeyPress")->run(&ke);
+    }
+
+
+    {
+
+        Slots slots;
+        slots
+            ( "sum_slot", Method( &sum ).slot() )
+            ;
+
+        Method call ( slots("sum_slot") ) ;
+
+        cout << "sum_slot: " << call.call<int>(44,66) << endl;
+    }
+
+
+    cout << "============ slot ============" << endl;
+
+    // direct slot
+    {
+        a->slot("start")->run(&ke);
+        a->slot("onEvent")->run(&e);
+        a->slot("onKeyPress")->run(&ke);
+        b.slot("invoke")->run();
+    }
+
+
+    cout << "============ signals ============" << endl;
+    // signal
+    {
+          boost::signals2::signal<void (Event*)> sig;
+
+          Method call1 ( &A::start, a );
+          Method call2 ( &B::invoke, &b );
+          Method call3 ( &A::onEvent, a );
+
+          sig.connect(boost::ref(call1));
+          sig.connect(boost::ref(call2));
+          sig.connect(boost::ref(call3));
+
+          sig( &e );
+    }
+
+
+    cout << "============ worker ============" << endl;
+    cout << "============ worker & async ============" << endl;
+
+    {
+        Method invoke ( &B::invoke, &b );
+        Method print ( &B::print, &b );
+        // call.call<void>();
+        // call.call<void>("toto", 3);
+        // call.call<void>(true, Event());
+
+        Worker w;
+
+        w.post(invoke);
+        w.post( boost::bind( &B::invoke, &b ) );
+        w.post( boost::bind( &B::print, &b, "iosrv") );
+
+        // print.bindRun(std::string("bind test"))();
+
+        // w.post(print.bindRun(std::string("bind test")));
+
+        w.post( boost::bind( &B::print, &b, "print : 1") );
+        w.post( boost::bind( &B::print, &b, "print : 2") );
+        w.post( boost::bind( &B::print, &b, "print : 3") );
+
+
+        Method sumFunc ( &sum );
+
+        Worker w1;
+        Worker w2;
+
+        boost::shared_future< int > future = sumFunc.asyncCall<int>(w1, 2,8);
+        cout << "sum.is_ready(): " << future.is_ready() << endl;
+
+        invoke.asyncRun(w1);
+        print.asyncRun(w1, std::string("async run w1 0"));
+        print.asyncRun(w1, std::string("async run w1 1"));
+        print.asyncRun(w1, std::string("async run w1 2"));
+        print.asyncRun(w1, std::string("async run w1 3"));
+        print.asyncRun(w1, std::string("async run w1 4"));
+        print.asyncRun(w1, std::string("async run w1 5"));
+
+
+        print.asyncRun(w2, std::string("async run w2 0"));
+        print.asyncRun(w2, std::string("async run w2 1"));
+        print.asyncRun(w2, std::string("async run w2 2"));
+        print.asyncRun(w2, std::string("async run w2 3"));
+        print.asyncRun(w2, std::string("async run w2 4"));
+        print.asyncRun(w2, std::string("async run w2 5"));
+
+
+
+        future.wait();
+        cout << "sum.is_ready(): " << future.is_ready() << endl;
+        cout << "sum.has_value(): " << future.has_value() << endl;
+        cout << "sum.has_exception(): " << future.has_exception() << endl;
+        cout << "sum: " << future.get() << endl;
+
+
+
+        print.asyncRun(w1, std::string("async run w1 with wait")).wait();
+        print.asyncRun(w2, std::string("async run w2 with wait")).wait();
+
+    }
+
+
+
+    delete a;
+    return 0;
+}
+
+/* Output :
+============ v2 ============
+A::start
+A::start
+B::invoke
+B::invoke
+B::invoke
+B::invoke
+A::onEvent 0x7fff5fbff500
+A::onEvent 0x7fff5fbff4f8
+sum: 12
+A::onKeyPress 0x7fff5fbff4f8
+============ v3 ============
+A::start
+A::start
+B::invoke
+B::invoke
+A::onEvent 0x7fff5fbff500
+A::onEvent 0x7fff5fbff4f8
+A::onKeyPress 0x7fff5fbff4f8
+A::onKeyPress 0x7fff5fbff4f8
+sum_slot: 110
+============ slot ============
+A::start
+A::onEvent 0x7fff5fbff500
+A::onKeyPress 0x7fff5fbff4f8
+B::invoke
+============ signals ============
+A::start
+B::invoke
+A::onEvent 0x7fff5fbff500
+
+*/
+
+
diff --git a/SrcLib/core/fwCom/scripts/variadic_parser.py b/SrcLib/core/fwCom/scripts/variadic_parser.py
new file mode 100644
index 0000000..64f5fe5
--- /dev/null
+++ b/SrcLib/core/fwCom/scripts/variadic_parser.py
@@ -0,0 +1,452 @@
+# -*- coding: UTF8 -*-
+
+
+import collections
+import os
+import re
+
+from pyparsing import Word, alphas, OneOrMore, Literal, Optional, \
+        delimitedList, Group, nestedExpr, Forward, CharsNotIn, \
+        originalTextFor, printables, White
+
+try:
+    import watchdog
+except:
+    watchdog = None
+
+def flatten(l):
+    for el in l:
+        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
+            for sub in flatten(el):
+                yield sub
+        else:
+            yield el
+
+
+
+def parse_variadic_templates(txt):
+    template_param_type = Word(alphas)
+    template_variadic = Literal('...')
+    template_id = Word(alphas)
+
+    template_variadic_param = Group(
+            template_param_type + template_variadic + template_id
+            )
+
+    template_param = Group( template_param_type + template_id )
+
+    # template_params = Group ( delimitedList( template_variadic_param | Optional(template_param) ) )
+    template_params = (
+            Optional( OneOrMore(template_param + ',') )
+            + template_variadic_param
+            + Optional( OneOrMore( ',' + template_param ) )
+            )
+
+    template_params_no_variadic = (
+            template_param + Optional( OneOrMore( ',' + template_param ) )
+            )
+
+    template_decl = Optional(
+            "template"
+            + Literal("<") + template_params_no_variadic +  Literal(">")
+            ) + "template" + Literal("<") + template_params +  Literal(">")
+
+    block_content = Forward()
+    block = nestedExpr('{', '}', content=block_content) + Literal(';') * (0,1)
+    block_content <<  ( CharsNotIn('{}') | block )
+
+    decl = originalTextFor( template_decl + CharsNotIn('{') + block )
+
+
+    template_file = Forward()
+    code_block = decl | White() | Word(printables)
+    template_file << ( Optional(OneOrMore(code_block)) | template_file)
+
+
+    parsed = template_file.parseString( txt )
+
+    return parsed
+
+
+def unpack_variadic_template(tpl, dim, max_dim=-1):
+
+    comma_reg = "(?P<comma>,?) *"
+    comma_sub = "" if dim == 0 else "\g<comma> "
+
+    comma_end_reg = "(?P<comma_end>,?) *"
+    comma_end_sub = "" if dim == 0 else "\g<comma_end> "
+
+    variadic_declaration = '(?P<var_decl_type>(typename|class)) *\.\.\. *(?P<var_decl_id>\w+)'
+
+    void = 'boost::mpl::void_'
+
+    subs = []
+    subs_nocomma = []
+
+    if max_dim == -1:
+        max_dim = dim
+
+    dim_diff = max_dim-dim
+
+    is_tpl_decl = False
+
+    # Add mpl::void_ elements to simulate variadic templates structs/classes
+    template_decl_reg = ("(?P<decl_part_1>template *<(?P<decl_args>(?P<pre_var_args>[^.>]*)"
+            + variadic_declaration +
+            "(?P<post_var_args>[^>.]*))>\s*(struct|class) *\w+)"
+                         "(?P<decl_part_2>\s*[^<:{]*\s*[:{])")
+
+
+    if dim < max_dim:
+        def template_decl_sub(m):
+            spec_args = ''.join(
+                        (
+                        m.group('pre_var_args'),
+                        )
+
+                        + ( (
+                        m.group('var_decl_id'), '... ',', '
+                        ) if dim != 0 else tuple() )
+
+                        +(
+                        ', '.join( (void, ) * dim_diff ),
+
+                        m.group('post_var_args'),
+                        )
+                    )
+
+            spec_args = spec_args.replace('typename','')
+            spec_args = spec_args.replace('class','')
+
+            sub = ''
+            sub += m.group('decl_part_1')
+
+            sub += '<' + spec_args + '>'
+            sub += m.group('decl_part_2') + ' '
+            return sub
+    else:
+        if re.search(template_decl_reg, tpl):
+            is_tpl_decl = True
+
+        def template_decl_sub(m):
+            sub = ''
+            part1 = m.group('decl_part_1')
+            part1 = re.sub(variadic_declaration, '\g<0> = '+ void, part1)
+            sub += part1
+            sub += m.group('decl_part_2') + ' '
+            return sub
+
+
+
+    r = range(1, dim+1)
+
+    variadic_declaration_reg = variadic_declaration
+    variadic_declaration_sub = '\g<var_decl_type> \g<var_decl_id>{0}'
+
+    if is_tpl_decl:
+        # need to match added default values
+        variadic_declaration_reg += '(?P<has_def_value> *=? *)(?P<def_value>[^>,)]+)'
+        variadic_declaration_sub += '\g<has_def_value>\g<def_value>'
+
+
+#comma for T... or t...
+    def variadic_expand(m):
+        sub = ''
+        if dim == 0 :
+            if m.group('comma') and m.group('comma_end'):
+                sub = ', '
+        else:
+            sub += m.group('comma') + ' '
+            sub += ', '.join((m.group('id')+"{0}").format(i) for i in r)
+            sub += m.group('comma_end') + ' '
+        return sub
+
+
+
+    subs += [
+
+# Add mpl::void_ elements to simulate variadic templates structs/classes
+            (template_decl_reg, template_decl_sub),
+
+#variadic declaration ( ...T )
+            (variadic_declaration_reg,
+                ', '.join(variadic_declaration_sub.format(i) for i in r)),
+
+#function apply ( some_func(a)... )
+            ('(?P<func>\w+) *\((?P<id>\w+)\) *\.\.\.',
+                ', '.join("\g<func>( \g<id>{0} )".format(i) for i in r)),
+
+# T...t
+            ('(?P<qual>(const *)?)(?P<type>\w+)(?P<qual2> *[&*]*) *\.\.\. *(?P<arg>\w+)',
+                ', '.join("\g<qual>\g<type>{0}\g<qual2> \g<arg>{0}".format(i) for i in r)),
+
+# T... or t...
+            # ('(?P<id>\w+) *\.\.\. *(?P<end_comma>,?)',
+            ('(?P<id>\w+) *\.\.\.',
+                variadic_expand
+                # ', '.join("\g<id>{0}".format(i) for i in r)
+                ),
+
+    ]
+
+    subs_nocomma += [
+#variadic sizeof
+            ('sizeof\.\.\.\(\w+\)', str(dim)),
+            ]
+
+
+    for reg, sub in subs_nocomma:
+            tpl = re.sub(reg, sub, tpl)
+
+    for reg, sub in subs:
+        if isinstance(sub, basestring):
+            tpl = re.sub(
+                    comma_reg + reg + comma_end_reg,
+                    comma_sub + sub + comma_end_sub,
+                    tpl)
+        else:
+            tpl = re.sub(
+                    # reg,
+                    comma_reg + reg + comma_end_reg,
+                    sub, tpl )
+
+
+    # keep template<> for struct & classes, remove others
+    def fix_bad_template(m):
+        sub = m.group('g1')
+        if re.search('(\\bstruct\\b|\\bclass\\b)', sub):
+            sub = m.expand('\g<0>')
+        return sub
+
+    tpl = re.sub('template *< *>(?P<g1>\s*.+)', fix_bad_template, tpl)
+
+    #Fixes bad empty '<>'. To protect goods '<>' inside blocks, use typedefs
+    def fix_bad_chevrons(m):
+        sub = m.group('part1')
+        if 'typedef' in sub:
+            sub += '<>'
+        sub += m.group('part2')
+        return sub
+
+    tpl = re.sub('(?P<part1>\s*(?!typedef).*(?<!template) *)< *>(?P<part2>[^{;]*;)', fix_bad_chevrons, tpl)
+
+    return tpl
+
+
+
+def get_unpacked_content( f, nb_args ):
+
+    txt = open(f,'r').read()
+
+
+    output = []
+
+    append = output.append
+
+    for p in parse_variadic_templates(txt):
+        if '...' in p:
+            append( '' + '\n' )
+            append( '#ifdef BOOST_NO_VARIADIC_TEMPLATES' + '\n' )
+            append( '//' + '='*79 + '\n' )
+            append( '//' + '='*79 + '\n' )
+            append( '//' + '='*36 + ' BEGIN ' + '='*36 + '\n' )
+            for i in reversed(range(nb_args+1)):
+                append( (unpack_variadic_template(p,i,nb_args)) + '\n' )
+            append( '//' + '='*37 + ' END ' + '='*37 + '\n' )
+            append( '//' + '='*79 + '\n' )
+            append( '//' + '='*79 + '\n' )
+            append( '' + '\n' )
+            append( '#else  // BOOST_NO_VARIADIC_TEMPLATES' + '\n' )
+            append(p + '\n' )
+            append( '#endif  // BOOST_NO_VARIADIC_TEMPLATES' + '\n' )
+        else:
+            append( p )
+
+    unpacked = ''.join(output)
+
+    return re.sub(' +$', '', unpacked, 0, re.M)
+
+
+
+
+
+
+
+def process_one_file(input_path, unpack_num, output_path = None):
+
+    result = get_unpacked_content(input_path, unpack_num)
+
+    if output_path:
+        open(output_path, 'wb').write(result)
+    else:
+        print result
+
+
+def process_dir(input_path, unpack_num, extension, force = False):
+    fname_end = '.' + extension
+    offset = 1+len(extension)
+    for dirpath, dirnames, filenames in os.walk(input_path):
+        for fname in filenames:
+            if fname.endswith(fname_end):
+                file_in = os.path.join(dirpath, fname)
+                file_out = os.path.join(dirpath, fname[:-offset])
+                t_in, t_out = 0,0
+                try:
+                    t_in = os.path.getmtime(file_in)
+                    t_out = os.path.getmtime(file_out)
+                except OSError:
+                    pass
+                if force or t_in >= t_out:
+                    print 'processing', file_in, '...'
+                    process_one_file(file_in, unpack_num, file_out)
+
+
+
+
+def main():
+
+    import argparse
+
+    desc = '''Aproximative processing of variadic templates.
+Generate a file emulating variadic templates with given number of argument.
+'''
+
+    parser = argparse.ArgumentParser( description=desc )
+
+    parser.add_argument('input_path', metavar='PATH', type=str,
+                    help='c++ file or dir to process')
+    parser.add_argument('-n', dest='num', type=int, default=9,
+            help='Max number of argument to emulate')
+
+    parser.add_argument('-o', dest='output_file', type=str, default=None,
+            help='output file')
+
+    parser.add_argument('-e', dest='extension', type=str, default='vrdc',
+            help='extension of files to parse')
+
+    parser.add_argument('-f', dest='force', action='store_true',
+            help='force file processing in directory')
+
+
+    if watchdog:
+        parser.add_argument('--watch','-w', action='store_true',
+                help='watch mode : run %(prog)s as daemon, watching changes '
+                'in specified file/dir')
+
+    options = parser.parse_args()
+
+    path_is_dir = os.path.isdir(options.input_path)
+
+    if path_is_dir:
+        if options.output_file is not None :
+            parser.error("-o is incompatible with directory processing")
+        process_dir(
+                options.input_path,
+                options.num,
+                options.extension,
+                options.force
+                )
+    else:
+        process_one_file(options.input_path, options.num, options.output_file)
+
+    if options.watch:
+        if path_is_dir:
+            print 'watching "{0}" ...'.format( options.input_path )
+        from watchdog.observers import Observer
+        from watchdog.events import PatternMatchingEventHandler
+        import Queue
+
+        events = Queue.Queue()
+
+        import signal
+
+
+        def keyboard_interrupt_handler(signal, frame):
+            print 'exiting ...'
+            keyboard_interrupt_handler.interupted = True
+
+        keyboard_interrupt_handler.interupted = False
+
+        signal.signal(signal.SIGINT, keyboard_interrupt_handler)
+
+        class ModifiedEventHandler(PatternMatchingEventHandler):
+
+            def __init__(self, extension):
+                super(ModifiedEventHandler, self).__init__(
+                        ['*.' + extension],
+                        ignore_directories=True
+                        )
+
+                self.extension = extension
+                self.offset = 1+len(extension)
+
+            def process(self, file_path):
+                output_path = file_path[:-self.offset]
+                events.put( (file_path, options.num, output_path) )
+
+            def on_created(self, event):
+                self.process(event.src_path)
+
+            def on_moved(self, event):
+                if event.dest_path.endswith(self.extension):
+                    self.process(event.dest_path)
+
+            def on_modified(self, event):
+                self.process(event.src_path)
+
+
+        event_handler = ModifiedEventHandler(options.extension)
+        observer = Observer()
+        observer.schedule(
+                event_handler,
+                path=options.input_path,
+                recursive=True
+                )
+        observer.start()
+
+        count = 0
+        while not keyboard_interrupt_handler.interupted:
+            try:
+                toProcess = events.get(True, 0.1)
+                count += 1
+                print '[{0}]'.format(count),'processing', \
+                        toProcess[0], '=>', toProcess[2]
+                process_one_file(*toProcess)
+                print '[{0}]'.format(count),'done'
+            except Queue.Empty:
+                pass
+
+        observer.stop()
+        observer.join()
+
+
+
+if __name__ == '__main__':
+    main()
+
+else:
+    import difflib
+    import sys
+    import unittest
+
+    class TestSequenceFunctions(unittest.TestCase):
+
+        def test_get_unpacked_content(self):
+            reference = open('test/unpacked.cpp').read()
+            result = get_unpacked_content('test/variadic.cpp', 9);
+
+
+            reference = reference.splitlines(True)
+            result = result.splitlines(True)
+
+            diff = ''.join(difflib.unified_diff(reference, result))
+
+            no_diff = '' == diff
+
+            if not no_diff:
+                sys.stderr.write(diff)
+
+            self.assertTrue(no_diff)
+
+
+
diff --git a/SrcLib/core/fwCom/src/fwCom/SignalBase.cpp b/SrcLib/core/fwCom/src/fwCom/SignalBase.cpp
new file mode 100644
index 0000000..07cde07
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/SignalBase.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwCom/SlotBase.hpp"
+#include "fwCom/SlotBase.hxx"
+
+#include "fwCom/SignalBase.hpp"
+
+namespace fwCom
+{
+
+#ifdef COM_LOG
+size_t SignalBase::s_idCount = 0;
+::fwCore::mt::Mutex SignalBase::s_mutexCounter;
+#endif
+
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/Signals.cpp b/SrcLib/core/fwCom/src/fwCom/Signals.cpp
new file mode 100644
index 0000000..9f3c1f6
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/Signals.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#ifdef DEBUG
+#include "fwCore/spyLog.hpp"
+#endif
+
+#include "fwCom/SignalBase.hpp"
+#include "fwCom/Signals.hpp"
+
+namespace fwCom
+{
+
+Signals::Signals(){}
+
+
+Signals::~Signals()
+{
+#ifdef DEBUG
+    BOOST_FOREACH( SignalMapType::value_type elem, m_signals )
+    {
+        OSLM_ASSERT( "Signal '"<< elem.first <<"' has connected slots", elem.second->getNumberOfConnections() == 0 );
+    }
+#endif
+}
+
+Signals& Signals::operator()( const SignalKeyType &key, const SignalBase::sptr &Signal )
+{
+    m_signals.insert( SignalMapType::value_type(key, Signal) );
+    return *this;
+}
+
+SignalBase::sptr Signals::operator[]( const SignalKeyType &key ) const
+{
+    SignalMapType::const_iterator it = m_signals.find(key);
+
+    if(it != m_signals.end())
+    {
+        return it->second;
+    }
+
+    return SignalBase::sptr();
+}
+
+Signals::SignalKeyContainerType Signals::getSignalKeys() const
+{
+    Signals::SignalKeyContainerType SignalKeys;
+    BOOST_FOREACH( SignalMapType::value_type elem, m_signals )
+    {
+        SignalKeys.push_back(elem.first);
+    }
+    return SignalKeys;
+}
+
+Signals::Signals( const Signals& )
+{}
+
+Signals& Signals::operator=( const Signals& )
+{
+    return *this;
+}
+
+#ifdef COM_LOG
+void Signals::setID( const std::string prefix )
+{
+    BOOST_FOREACH( SignalMapType::value_type elem, m_signals )
+    {
+        elem.second->setID( prefix + elem.first );
+    }
+}
+#endif
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/SlotBase.cpp b/SrcLib/core/fwCom/src/fwCom/SlotBase.cpp
new file mode 100644
index 0000000..ceb6abe
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/SlotBase.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwCom/exception/BadRun.hpp"
+
+#include "fwCom/SlotBase.hpp"
+#include "fwCom/SlotBase.hxx"
+
+namespace fwCom
+{
+
+#ifdef COM_LOG
+size_t SlotBase::s_idCount = 0;
+::fwCore::mt::Mutex SlotBase::s_mutexCounter;
+#endif
+
+void SlotBase::run() const
+{
+    typedef SlotRun< void() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        fun->run();
+    }
+    else
+    {
+        OSLM_ERROR( "failed to run : " + m_signature + " with " + SlotBase::getTypeName< void() >() );
+        FW_RAISE_EXCEPTION( fwCom::exception::BadRun( "Failed to find right signature for run"  ) );
+    }
+}
+
+SlotBase::VoidSharedFutureType SlotBase::asyncRun() const
+{
+    typedef SlotRun< void() > SlotFuncType;
+    const SlotFuncType *fun = dynamic_cast< const SlotFuncType* >(this);
+    if(fun)
+    {
+        return fun->asyncRun();
+    }
+    else
+    {
+        OSLM_ERROR( "failed to asyncRun : " + m_signature + " with " + SlotBase::getTypeName< void() >() );
+        FW_RAISE_EXCEPTION( fwCom::exception::BadRun( "Failed to find right signature for asyncRun"  ) );
+    }
+}
+
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/Slots.cpp b/SrcLib/core/fwCom/src/fwCom/Slots.cpp
new file mode 100644
index 0000000..d1c295b
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/Slots.cpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include "fwCom/Slot.hpp"
+#include "fwCom/Slot.hxx"
+
+#include "fwCom/Slots.hpp"
+
+namespace fwCom
+{
+
+Slots::Slots(){}
+
+Slots::~Slots()
+{
+#ifdef DEBUG
+    BOOST_FOREACH( SlotMapType::value_type elem, m_slots )
+    {
+        SLM_ASSERT( "Slot '"<< elem.first <<"' has connected signals", elem.second->getNumberOfConnections() == 0 );
+    }
+#endif
+}
+
+void Slots::setWorker( const ::fwThread::Worker::sptr &worker )
+{
+    BOOST_FOREACH( SlotMapType::value_type elem, m_slots )
+    {
+        elem.second->setWorker(worker);
+    }
+}
+
+Slots& Slots::operator()( const SlotKeyType &key, const SlotBase::sptr &slot )
+{
+    m_slots.insert( SlotMapType::value_type(key, slot) );
+    return *this;
+}
+
+SlotBase::sptr Slots::operator[]( const SlotKeyType &key ) const
+{
+    SlotMapType::const_iterator it = m_slots.find(key);
+
+    if(it != m_slots.end())
+    {
+        return it->second;
+    }
+
+    return SlotBase::sptr();
+}
+
+Slots::SlotKeyContainerType Slots::getSlotKeys() const
+{
+    Slots::SlotKeyContainerType slotKeys;
+    BOOST_FOREACH( SlotMapType::value_type elem, m_slots )
+    {
+        slotKeys.push_back(elem.first);
+    }
+    return slotKeys;
+}
+
+Slots::Slots( const Slots& )
+{}
+
+Slots& Slots::operator=( const Slots& )
+{
+    return *this;
+}
+
+#ifdef COM_LOG
+void Slots::setID( const std::string prefix )
+{
+    BOOST_FOREACH( SlotMapType::value_type elem, m_slots )
+    {
+        elem.second->setID( prefix + elem.first );
+    }
+}
+#endif
+
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/exception/AlreadyConnected.cpp b/SrcLib/core/fwCom/src/fwCom/exception/AlreadyConnected.cpp
new file mode 100644
index 0000000..83b58b8
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/exception/AlreadyConnected.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/exception/AlreadyConnected.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+AlreadyConnected::AlreadyConnected ( const std::string &err ) : ::fwCore::Exception(err)
+{} ;
+
+} // namespace exception
+
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/exception/BadCall.cpp b/SrcLib/core/fwCom/src/fwCom/exception/BadCall.cpp
new file mode 100644
index 0000000..a5c53f7
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/exception/BadCall.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/exception/BadCall.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+BadCall::BadCall ( const std::string &err ) : ::fwCore::Exception(err)
+{} ;
+
+} // namespace exception
+
+} // namespace fwCom
+
diff --git a/SrcLib/core/fwCom/src/fwCom/exception/BadRun.cpp b/SrcLib/core/fwCom/src/fwCom/exception/BadRun.cpp
new file mode 100644
index 0000000..fca40b0
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/exception/BadRun.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/exception/BadRun.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+BadRun::BadRun ( const std::string &err ) : ::fwCore::Exception(err)
+{} ;
+
+} // namespace exception
+
+} // namespace fwCom
+
+
diff --git a/SrcLib/core/fwCom/src/fwCom/exception/BadSlot.cpp b/SrcLib/core/fwCom/src/fwCom/exception/BadSlot.cpp
new file mode 100644
index 0000000..3a8b715
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/exception/BadSlot.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/exception/BadSlot.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+BadSlot::BadSlot ( const std::string &err ) : ::fwCore::Exception(err)
+{} ;
+
+} // namespace exception
+
+} // namespace fwCom
+
+
diff --git a/SrcLib/core/fwCom/src/fwCom/exception/NoWorker.cpp b/SrcLib/core/fwCom/src/fwCom/exception/NoWorker.cpp
new file mode 100644
index 0000000..ec76fa7
--- /dev/null
+++ b/SrcLib/core/fwCom/src/fwCom/exception/NoWorker.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwCom/config.hpp"
+#include "fwCom/exception/NoWorker.hpp"
+
+namespace fwCom
+{
+
+namespace exception
+{
+
+NoWorker::NoWorker ( const std::string &err ) : ::fwCore::Exception(err)
+{} ;
+
+} // namespace exception
+
+} // namespace fwCom
+
+
diff --git a/SrcLib/core/fwCom/test/CMakeLists.txt b/SrcLib/core/fwCom/test/CMakeLists.txt
new file mode 100644
index 0000000..cbbc9a5
--- /dev/null
+++ b/SrcLib/core/fwCom/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwCom/test/Properties.cmake b/SrcLib/core/fwCom/test/Properties.cmake
new file mode 100644
index 0000000..0121d1f
--- /dev/null
+++ b/SrcLib/core/fwCom/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwComTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwCom fwThread )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCom/test/cppunit.options b/SrcLib/core/fwCom/test/cppunit.options
new file mode 100644
index 0000000..34d66fc
--- /dev/null
+++ b/SrcLib/core/fwCom/test/cppunit.options
@@ -0,0 +1,21 @@
+CLASSTEST=[
+    'SlotTest',
+    'SignalTest',
+    'UtilTest',
+    'SlotsTest',
+    'SignalsTest',
+]
+
+USE = [
+    'boost',
+    'boostThread',
+    'boostDateTime',
+    'boostFilesystem',
+    ]
+LIB = [
+    'fwTest_0-1',
+    'fwCom_0-1',
+    'fwThread_0-1',
+    ]
+
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwCom/test/tu/include/SignalTest.hpp b/SrcLib/core/fwCom/test/tu/include/SignalTest.hpp
new file mode 100644
index 0000000..ec00e6a
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/include/SignalTest.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_UT_SIGNALTEST_HPP__
+#define __FWCOM_UT_SIGNALTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCom
+{
+namespace ut
+{
+
+class SignalTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SignalTest );
+
+    CPPUNIT_TEST( buildTest );
+    CPPUNIT_TEST( connectTest );
+    CPPUNIT_TEST( emitTest );
+    CPPUNIT_TEST( autoSlotDisconnectTest );
+    CPPUNIT_TEST( blockTest );
+    CPPUNIT_TEST( argumentLossTest );
+    CPPUNIT_TEST( asyncEmitTest );
+    CPPUNIT_TEST( asyncArgumentLossTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void buildTest ();
+    void connectTest ();
+    void emitTest ();
+    void autoSlotDisconnectTest();
+    void blockTest();
+    void argumentLossTest();
+    void asyncEmitTest ();
+    void asyncArgumentLossTest();
+};
+
+} //namespace ut
+} //namespace fwCom
+#endif //__FWCOM_UT_SIGNALTEST_HPP__
+
diff --git a/SrcLib/core/fwCom/test/tu/include/SignalsTest.hpp b/SrcLib/core/fwCom/test/tu/include/SignalsTest.hpp
new file mode 100644
index 0000000..55447e0
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/include/SignalsTest.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_UT_SIGNALSTEST_HPP__
+#define __FWCOM_UT_SIGNALSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCom
+{
+namespace ut
+{
+
+class SignalsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SignalsTest );
+
+    CPPUNIT_TEST( buildTest );
+    CPPUNIT_TEST( hasSignalsTest );
+    CPPUNIT_TEST( signalsIDTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void buildTest();
+    void hasSignalsTest();
+    void signalsIDTest();
+};
+
+} //namespace ut
+} //namespace fwCom
+#endif //__FWCOM_UT_SIGNALSTEST_HPP__
diff --git a/SrcLib/core/fwCom/test/tu/include/SlotTest.hpp b/SrcLib/core/fwCom/test/tu/include/SlotTest.hpp
new file mode 100644
index 0000000..ce198ff
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/include/SlotTest.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_UT_SLOTTEST_HPP__
+#define __FWCOM_UT_SLOTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCom
+{
+namespace ut
+{
+
+class SlotTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SlotTest );
+
+    CPPUNIT_TEST( buildTest );
+    CPPUNIT_TEST( runTest );
+    CPPUNIT_TEST( callTest );
+    CPPUNIT_TEST( asyncTest );
+    CPPUNIT_TEST( slotBaseTest );
+    CPPUNIT_TEST( exceptionTest );
+    CPPUNIT_TEST( workerSwapTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void buildTest ();
+    void runTest ();
+    void callTest ();
+    void asyncTest ();
+    void slotBaseTest ();
+    void exceptionTest ();
+    void workerSwapTest();
+
+};
+
+} //namespace ut
+} //namespace fwCom
+
+#endif //__FWCOM_UT_SLOTTEST_HPP__
+
diff --git a/SrcLib/core/fwCom/test/tu/include/SlotsTest.hpp b/SrcLib/core/fwCom/test/tu/include/SlotsTest.hpp
new file mode 100644
index 0000000..fc91b68
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/include/SlotsTest.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_UT_SLOTSTEST_HPP__
+#define __FWCOM_UT_SLOTSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCom
+{
+namespace ut
+{
+
+class SlotsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SlotsTest );
+
+    CPPUNIT_TEST( buildTest );
+    CPPUNIT_TEST( hasSlotsTest );
+    CPPUNIT_TEST( slotsIDTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void buildTest();
+    void hasSlotsTest();
+    void slotsIDTest();
+
+};
+
+} //namespace ut
+} //namespace fwCom
+#endif //__FWCOM_UT_SLOTSTEST_HPP__
diff --git a/SrcLib/core/fwCom/test/tu/include/UtilTest.hpp b/SrcLib/core/fwCom/test/tu/include/UtilTest.hpp
new file mode 100644
index 0000000..bab069b
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/include/UtilTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOM_UT_UTILTEST_HPP__
+#define __FWCOM_UT_UTILTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCom
+{
+namespace ut
+{
+
+class UtilTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( UtilTest );
+
+    CPPUNIT_TEST( autoBindTest );
+    CPPUNIT_TEST( convertFunctionTypeTest );
+    CPPUNIT_TEST( removeLastArgTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void autoBindTest ();
+    void convertFunctionTypeTest ();
+    void removeLastArgTest ();
+
+};
+
+} //namespace ut
+} //namespace fwCom
+#endif //__FWCOM_UT_UTILTEST_HPP__
+
diff --git a/SrcLib/core/fwCom/test/tu/src/SignalTest.cpp b/SrcLib/core/fwCom/test/tu/src/SignalTest.cpp
new file mode 100644
index 0000000..86a503b
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/src/SignalTest.cpp
@@ -0,0 +1,657 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <boost/thread.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/chrono/duration.hpp>
+
+
+#include "fwCom/exception/BadSlot.hpp"
+#include "fwCom/exception/AlreadyConnected.hpp"
+
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slot.hxx>
+
+#include <fwThread/Worker.hpp>
+
+#include "SignalTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCom::ut::SignalTest );
+
+namespace fwCom
+{
+namespace ut
+{
+
+void SignalTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void SignalTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::buildTest ()
+{
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+        CPPUNIT_ASSERT( sig );
+    }
+
+    {
+        typedef void Signature(int);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+        CPPUNIT_ASSERT( sig );
+    }
+
+    {
+        typedef void Signature(char, float);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+        CPPUNIT_ASSERT( sig );
+    }
+
+    {
+        typedef void Signature(short, double, std::string);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+        CPPUNIT_ASSERT( sig );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+struct SignalTestClass
+{
+    SignalTestClass() :
+        m_method00(false),
+        m_method0(false),
+        m_method1(false),
+        m_method2(false),
+        m_method3(false)
+    {}
+
+    void method0(){ m_method0 = true; }
+
+    void method00(){ m_method00 = true; }
+
+    float method1(float f){
+        m_method1 = true;
+        return 2*f;
+    }
+
+    float method2(float f, int i){
+        m_method2 = true;
+        return 2*f;
+    }
+
+    float method3(float f, double d, std::string s){
+        m_method3 = true;
+        return 2*f;
+    }
+
+    bool m_method00;
+    bool m_method0;
+    bool m_method1;
+    bool m_method2;
+    bool m_method3;
+
+};
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::connectTest()
+{
+    SignalTestClass testObject;
+    ::fwCom::Slot< void() >::sptr slot0
+        = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+    ::fwCom::Slot< float(float) >::sptr slot1
+        = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+    ::fwCom::Slot< float(float, int) >::sptr slot2
+        = ::fwCom::newSlot(&SignalTestClass::method2, &testObject);
+    ::fwCom::Slot< float(float, double, std::string) >::sptr slot3
+        = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+
+    ::fwCom::Connection connection;
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot0);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot1);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, int);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot2);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, double, std::string);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot3);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    // Disconnect
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot0);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        connection.disconnect();
+        CPPUNIT_ASSERT(connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+    }
+
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        sig->connect(slot0);
+        connection = sig->getConnection(slot0);
+
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        connection.disconnect();
+        CPPUNIT_ASSERT(connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+
+        CPPUNIT_ASSERT_THROW(sig->getConnection(slot3, true), ::fwCom::exception::BadSlot);
+    }
+
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot0);
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        sig->disconnect(slot0);
+        CPPUNIT_ASSERT(connection.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+    }
+
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        ::fwCom::Slot< void() >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+
+        connection = sig->connect(slot0);
+        ::fwCom::Connection connection2 = sig->connect(slot);
+
+        CPPUNIT_ASSERT(!connection.expired());
+        CPPUNIT_ASSERT(!connection2.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)2, sig->getNumberOfConnections());
+        sig->disconnectAll();
+        CPPUNIT_ASSERT(connection.expired());
+        CPPUNIT_ASSERT(connection2.expired());
+        CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+    }
+
+    {
+        typedef void Signature(std::string);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        CPPUNIT_ASSERT_THROW( sig->connect(slot1), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->connect(slot2), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->connect(slot3), fwCom::exception::BadSlot);
+    }
+
+    {
+        typedef void Signature(std::string);
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot1), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot2), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot3), fwCom::exception::BadSlot);
+
+        sig->connect(slot0);
+
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot1), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot2), fwCom::exception::BadSlot);
+        CPPUNIT_ASSERT_THROW( sig->disconnect(slot3), fwCom::exception::BadSlot);
+
+        sig->disconnect(slot0);
+
+    }
+
+    {
+        typedef void Signature();
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        sig->connect(slot0);
+        CPPUNIT_ASSERT_THROW(sig->connect(slot0), fwCom::exception::AlreadyConnected);
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+    }
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::emitTest()
+{
+    ::fwCom::Connection connection;
+
+    {
+        typedef void Signature();
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< Signature >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        sig->emit();
+        CPPUNIT_ASSERT(testObject.m_method0);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->emit(21.0f);
+        CPPUNIT_ASSERT(testObject.m_method1);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, int);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float, int) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method2, &testObject);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->emit(21.0f, 42);
+        CPPUNIT_ASSERT(testObject.m_method2);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, double, std::string);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float, double, std::string) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->emit(21.0f, 42.0, "emit");
+        CPPUNIT_ASSERT(testObject.m_method3);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::autoSlotDisconnectTest()
+{
+    typedef void Signature(float);
+    SignalTestClass testObject;
+
+    ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+    {
+        ::fwCom::Slot< void() >::sptr slot0
+            = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+
+        sig->connect(slot0);
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        {
+            ::fwCom::Slot< float(float) >::sptr slot1
+                = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+
+            sig->connect(slot1);
+            CPPUNIT_ASSERT_EQUAL((size_t)2, sig->getNumberOfConnections());
+        }
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        {
+            ::fwCom::Slot< void() >::sptr slot00
+                = ::fwCom::newSlot(&SignalTestClass::method00, &testObject);
+
+            sig->connect(slot00);
+            CPPUNIT_ASSERT_EQUAL((size_t)2, sig->getNumberOfConnections());
+        }
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+    }
+
+    CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::argumentLossTest()
+{
+    typedef void Signature(float, double, std::string);
+    SignalTestClass testObject;
+
+    ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+    ::fwCom::Slot< void() >::sptr slot0
+        = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+    ::fwCom::Slot< float(float) >::sptr slot1
+        = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+    ::fwCom::Slot< float(float, double, std::string) >::sptr slot3
+        = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+
+    sig->connect(slot0);
+    CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+    sig->connect(slot1);
+    CPPUNIT_ASSERT_EQUAL((size_t)2, sig->getNumberOfConnections());
+
+    sig->connect(slot3);
+    CPPUNIT_ASSERT_EQUAL((size_t)3, sig->getNumberOfConnections());
+
+    sig->emit(21.0f, 42.0, "emit");
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+    sig->disconnectAll();
+    CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::asyncArgumentLossTest()
+{
+    typedef void Signature(float, double, std::string);
+    SignalTestClass testObject;
+
+    ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+    ::fwCom::Slot< void() >::sptr slot0
+        = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+    ::fwCom::Slot< float(float) >::sptr slot1
+        = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+    ::fwCom::Slot< float(float, double, std::string) >::sptr slot3
+        = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+    slot0->setWorker(worker);
+    slot1->setWorker(worker);
+    slot3->setWorker(worker);
+
+    sig->connect(slot0);
+    CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+    sig->connect(slot1);
+    CPPUNIT_ASSERT_EQUAL((size_t)2, sig->getNumberOfConnections());
+
+    sig->connect(slot3);
+    CPPUNIT_ASSERT_EQUAL((size_t)3, sig->getNumberOfConnections());
+
+    sig->asyncEmit(21.0f, 42.0, "asyncEmit");
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+
+    sig->disconnectAll();
+    CPPUNIT_ASSERT_EQUAL((size_t)0, sig->getNumberOfConnections());
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::blockTest()
+{
+    typedef void Signature(float, double, std::string);
+    SignalTestClass testObject;
+
+    ::fwCom::Connection connection;
+
+    ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+    ::fwCom::Slot< void() >::sptr slot0
+        = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+    ::fwCom::Slot< float(float) >::sptr slot1
+        = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+    ::fwCom::Slot< float(float, double, std::string) >::sptr slot3
+        = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+
+    sig->connect(slot0);
+    connection = sig->connect(slot1);
+    sig->connect(slot3);
+
+    CPPUNIT_ASSERT_EQUAL((size_t)3, sig->getNumberOfConnections());
+
+    sig->emit(21.0f, 42.0, "emit");
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+    testObject.m_method0 = false;
+    testObject.m_method1 = false;
+    testObject.m_method3 = false;
+
+    {
+        ::fwCom::Connection::Blocker block(connection);
+        sig->emit(21.0f, 42.0, "emit");
+    }
+
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(!testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+    testObject.m_method0 = false;
+    testObject.m_method1 = false;
+    testObject.m_method3 = false;
+
+    sig->emit(21.0f, 42.0, "emit");
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+
+    testObject.m_method0 = false;
+    testObject.m_method1 = false;
+    testObject.m_method3 = false;
+
+    {
+        ::fwCom::Connection::Blocker block(connection);
+        block.reset();
+        sig->emit(21.0f, 42.0, "emit");
+    }
+
+
+    CPPUNIT_ASSERT(testObject.m_method0);
+    CPPUNIT_ASSERT(testObject.m_method1);
+    CPPUNIT_ASSERT(testObject.m_method3);
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalTest::asyncEmitTest()
+{
+    ::fwCom::Connection connection;
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+    {
+        typedef void Signature();
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< Signature >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method0, &testObject);
+        slot->setWorker(worker);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+        sig->asyncEmit();
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+        CPPUNIT_ASSERT(testObject.m_method0);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method1, &testObject);
+        slot->setWorker(worker);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->asyncEmit(21.0f);
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+        CPPUNIT_ASSERT(testObject.m_method1);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, int);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float, int) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method2, &testObject);
+        slot->setWorker(worker);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->asyncEmit(21.0f, 42);
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+        CPPUNIT_ASSERT(testObject.m_method2);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+
+    {
+        typedef void Signature(float, double, std::string);
+        SignalTestClass testObject;
+
+        ::fwCom::Slot< float(float, double, std::string) >::sptr slot
+            = ::fwCom::newSlot(&SignalTestClass::method3, &testObject);
+        slot->setWorker(worker);
+
+        ::fwCom::Signal< Signature >::sptr sig = ::fwCom::Signal< Signature >::New();
+
+        connection = sig->connect(slot);
+        CPPUNIT_ASSERT(!connection.expired());
+
+        CPPUNIT_ASSERT_EQUAL((size_t)1, sig->getNumberOfConnections());
+
+        sig->asyncEmit(21.0f, 42.0, "emit");
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+        CPPUNIT_ASSERT(testObject.m_method3);
+    }
+
+    CPPUNIT_ASSERT(connection.expired());
+}
+
+} //namespace ut
+} //namespace fwCom
diff --git a/SrcLib/core/fwCom/test/tu/src/SignalsTest.cpp b/SrcLib/core/fwCom/test/tu/src/SignalsTest.cpp
new file mode 100644
index 0000000..e111658
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/src/SignalsTest.cpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCom/HasSignals.hpp>
+#include <fwCom/Signals.hpp>
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+
+#include "SignalsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCom::ut::SignalsTest );
+
+namespace fwCom
+{
+namespace ut
+{
+
+void SignalsTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void SignalsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalsTest::buildTest()
+{
+    ::fwCom::Signals signals;
+
+    ::fwCom::Signal< void() >::sptr sig = ::fwCom::Signal< void() >::New();
+    CPPUNIT_ASSERT( sig );
+
+    typedef void Signature(int, float);
+    ::fwCom::Signal< Signature >::sptr sig2 = ::fwCom::Signal< Signature >::New();
+    CPPUNIT_ASSERT( sig2 );
+
+    signals("sig", sig)
+           ("sig2", sig2);
+
+    CPPUNIT_ASSERT(sig == signals["sig"]);
+    CPPUNIT_ASSERT(sig2 == signals["sig2"]);
+    CPPUNIT_ASSERT(!signals["wrong_signal"]);
+
+    CPPUNIT_ASSERT_EQUAL((size_t)2, signals.getSignalKeys().size());
+}
+
+//-----------------------------------------------------------------------------
+
+struct SignalsTestHasSignals : public HasSignals
+{
+    typedef ::fwCom::Signal< void()> SignalType;
+
+    SignalsTestHasSignals()
+    {
+        SignalType::sptr signal = SignalType::New();
+        HasSignals::m_signals("sig", signal);
+#ifdef COM_LOG
+        signal->setID("sig");
+#endif
+    }
+};
+
+struct SignalsTestA
+{
+
+    SignalsTestA()
+    {
+        m_val = false;
+    }
+
+    void changeStatus()
+    {
+        m_val = ! m_val;
+    }
+
+    bool m_val;
+};
+//-----------------------------------------------------------------------------
+
+void SignalsTest::hasSignalsTest()
+{
+    SignalsTestHasSignals obj;
+    SignalsTestA srv;
+    Slot< void()>::sptr slot = ::fwCom::newSlot( &SignalsTestA::changeStatus, &srv );
+#ifdef COM_LOG
+    slot->setID("changeStatus");
+#endif
+    obj.signal("sig")->connect( slot );
+    obj.signal< SignalsTestHasSignals::SignalType >("sig")->emit();
+
+    CPPUNIT_ASSERT( srv.m_val );
+    obj.signal("sig")->disconnect( slot );
+}
+
+//-----------------------------------------------------------------------------
+
+void SignalsTest::signalsIDTest()
+{
+#ifdef COM_LOG
+    ::fwCom::Signals signals;
+
+    ::fwCom::Signal< void() >::sptr sig1 = ::fwCom::Signal< void() >::New();
+
+    typedef void Signature(int, float);
+    ::fwCom::Signal< Signature >::sptr sig2 = ::fwCom::Signal< Signature >::New();
+
+    signals("sig1", sig1)
+           ("sig2", sig2);
+
+    signals.setID();
+    CPPUNIT_ASSERT_EQUAL( std::string("sig1"), sig1->getID() );
+    CPPUNIT_ASSERT_EQUAL( std::string("sig2"), sig2->getID() );
+
+    signals.setID("prefix::");
+    CPPUNIT_ASSERT_EQUAL( std::string("prefix::sig1"), sig1->getID() );
+    CPPUNIT_ASSERT_EQUAL( std::string("prefix::sig2"), sig2->getID() );
+#endif
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwCom
diff --git a/SrcLib/core/fwCom/test/tu/src/SlotTest.cpp b/SrcLib/core/fwCom/test/tu/src/SlotTest.cpp
new file mode 100644
index 0000000..c820ce4
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/src/SlotTest.cpp
@@ -0,0 +1,415 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/thread/future.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/chrono/duration.hpp>
+
+
+#include <fwThread/Worker.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwCom/exception/BadCall.hpp"
+#include "fwCom/exception/BadRun.hpp"
+#include "fwCom/exception/NoWorker.hpp"
+
+#include "fwCom/util/AutoBind.hpp"
+#include "fwCom/util/AutoBind.hxx"
+
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slot.hxx>
+
+#include "SlotTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCom::ut::SlotTest );
+
+namespace fwCom
+{
+namespace ut
+{
+
+void SlotTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void SlotTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+struct A
+{
+    A() :
+        m_method0(false),
+        m_method1(false)
+    {}
+
+    void method0(){ m_method0 = true; }
+    float method1(float f){
+        m_method1 = true;
+        return 2*f;
+    }
+
+    bool m_method0;
+    bool m_method1;
+
+};
+
+
+static int lastSumResult = 0;
+
+int sum (int a, int b)
+{
+    lastSumResult = a+b;
+    return lastSumResult;
+}
+
+void SlotTest::buildTest ()
+{
+    A a;
+
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &sum );
+    ::fwCom::Slot< void () >::sptr        slot2 = ::fwCom::newSlot( &A::method0, &a );
+    ::fwCom::Slot< float (float) >::sptr  slot3 = ::fwCom::newSlot( &A::method1, &a  );
+
+    CPPUNIT_ASSERT( slot1 );
+    CPPUNIT_ASSERT( slot2 );
+    CPPUNIT_ASSERT( slot3 );
+
+
+    CPPUNIT_ASSERT_EQUAL( (unsigned int) 2 , slot1->arity() );
+    CPPUNIT_ASSERT_EQUAL( (unsigned int) 0 , slot2->arity() );
+    CPPUNIT_ASSERT_EQUAL( (unsigned int) 1 , slot3->arity() );
+
+
+
+    ::fwCom::SlotCall< int (int, int) >::sptr slotcall1
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotCall< int (int, int) > > ( slot1 );
+    ::fwCom::SlotCall< void () >::sptr          slotcall2
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotCall< void () >        > ( slot2 );
+    ::fwCom::SlotCall< float (float) >::sptr  slotcall3
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotCall< float (float) >  > ( slot3 );
+
+    CPPUNIT_ASSERT( slotcall1 );
+    CPPUNIT_ASSERT( slotcall2 );
+    CPPUNIT_ASSERT( slotcall3 );
+
+
+
+    ::fwCom::SlotRun< void (int, int) >::sptr slotrun1
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotRun< void (int, int) > > ( slot1 );
+    ::fwCom::SlotRun< void () >::sptr          slotrun2
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotRun< void () >         > ( slot2 );
+    ::fwCom::SlotRun< void (float) >::sptr  slotrun3
+        = ::boost::dynamic_pointer_cast< ::fwCom::SlotRun< void (float) >    > ( slot3 );
+
+    CPPUNIT_ASSERT( slotrun1 );
+    CPPUNIT_ASSERT( slotrun2 );
+    CPPUNIT_ASSERT( slotrun3 );
+
+
+
+    ::fwCom::SlotBase::sptr slotbase1 = ::boost::dynamic_pointer_cast< ::fwCom::SlotBase > ( slot1 );
+    ::fwCom::SlotBase::sptr slotbase2 = ::boost::dynamic_pointer_cast< ::fwCom::SlotBase > ( slot2 );
+    ::fwCom::SlotBase::sptr slotbase3 = ::boost::dynamic_pointer_cast< ::fwCom::SlotBase > ( slot3 );
+
+    CPPUNIT_ASSERT( slotbase1 );
+    CPPUNIT_ASSERT( slotbase2 );
+    CPPUNIT_ASSERT( slotbase3 );
+
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SlotTest::runTest ()
+{
+    A a;
+
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &sum );
+    ::fwCom::Slot< void () >::sptr        slot2 = ::fwCom::newSlot( &A::method0, &a );
+    ::fwCom::Slot< float (float) >::sptr  slot3 = ::fwCom::newSlot( &A::method1, &a );
+
+    lastSumResult = 0;
+    CPPUNIT_ASSERT( !a.m_method0 );
+    CPPUNIT_ASSERT( !a.m_method1 );
+
+    slot1->run(34,66);
+    slot2->run();
+    slot3->run(88.1236);
+
+    CPPUNIT_ASSERT_EQUAL( 100, lastSumResult );
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT( a.m_method1 );
+}
+//-----------------------------------------------------------------------------
+
+void SlotTest::callTest ()
+{
+    A a;
+
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &sum );
+    ::fwCom::Slot< void () >::sptr        slot2 = ::fwCom::newSlot( &A::method0, &a );
+    ::fwCom::Slot< float (float) >::sptr  slot3 = ::fwCom::newSlot( &A::method1, &a );
+
+    CPPUNIT_ASSERT_EQUAL( 42, slot1->call(40,2) );
+    slot2->call();
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT_EQUAL( 4.2f, slot3->call(2.1f) );
+    CPPUNIT_ASSERT( a.m_method1 );
+}
+
+//-----------------------------------------------------------------------------
+
+void SlotTest::asyncTest ()
+{
+    A a;
+
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &sum );
+    ::fwCom::Slot< void () >::sptr        slot2 = ::fwCom::newSlot( &A::method0, &a );
+    ::fwCom::Slot< float (float) >::sptr  slot3 = ::fwCom::newSlot( &A::method1, &a );
+
+    fwThread::Worker::sptr w = fwThread::Worker::New();
+
+    slot1->setWorker(w);
+    slot2->setWorker(w);
+    slot3->setWorker(w);
+
+
+    slot1->asyncRun(40, 2).wait();
+    slot2->asyncRun();
+    slot3->asyncRun(2.1f).wait();
+
+    CPPUNIT_ASSERT_EQUAL( 42, lastSumResult );
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+    lastSumResult = 0;
+    a.m_method0 = false;
+    a.m_method1 = false;
+
+    boost::shared_future< int >   f1 = slot1->asyncCall(40,2);
+    boost::shared_future< void >  f2 = slot2->asyncCall();
+    boost::shared_future< float > f3 = slot3->asyncCall(2.1f);
+
+    f1.wait();
+    CPPUNIT_ASSERT( f1.is_ready() );
+    CPPUNIT_ASSERT( f1.has_value() );
+    CPPUNIT_ASSERT( !f1.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 42, f1.get() );
+
+    f2.wait();
+    CPPUNIT_ASSERT( f2.is_ready() );
+    CPPUNIT_ASSERT( f2.has_value() );
+    CPPUNIT_ASSERT( !f2.has_exception() );
+    CPPUNIT_ASSERT( a.m_method0 );
+
+
+    f3.wait();
+    CPPUNIT_ASSERT( f3.is_ready() );
+    CPPUNIT_ASSERT( f3.has_value() );
+    CPPUNIT_ASSERT( !f3.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 4.2f, f3.get() );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SlotTest::slotBaseTest ()
+{
+    A a;
+
+    ::fwCom::SlotBase::sptr slot1 = ::fwCom::newSlot( &sum );
+    ::fwCom::SlotBase::sptr slot2 = ::fwCom::newSlot( &A::method0, &a );
+    ::fwCom::SlotBase::sptr slot3 = ::fwCom::newSlot( &A::method1, &a );
+
+    lastSumResult = 0;
+
+    slot1->run(40,2);
+    slot2->run();
+    slot3->run(2.1f);
+
+    CPPUNIT_ASSERT_EQUAL( 42, lastSumResult );
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+    lastSumResult = 0;
+    a.m_method0 = false;
+    a.m_method1 = false;
+
+    CPPUNIT_ASSERT_EQUAL( 42, slot1->call<int>(40,2) );
+    slot2->call<void>();
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT_EQUAL( 4.2f, slot3->call<float>(2.1f) );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+
+    lastSumResult = 0;
+    a.m_method0 = false;
+    a.m_method1 = false;
+
+    fwThread::Worker::sptr w = fwThread::Worker::New();
+
+    slot1->setWorker(w);
+    slot2->setWorker(w);
+    slot3->setWorker(w);
+
+    slot1->asyncRun(40, 2).wait();
+    slot2->asyncRun();
+    slot3->asyncRun(2.1f).wait();
+
+    CPPUNIT_ASSERT_EQUAL( 42, lastSumResult );
+    CPPUNIT_ASSERT( a.m_method0 );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+    lastSumResult = 0;
+    a.m_method0 = false;
+    a.m_method1 = false;
+
+    boost::shared_future< int >   f1 = slot1->asyncCall<int>(40,2);
+    boost::shared_future< void >  f2 = slot2->asyncCall<void>();
+    boost::shared_future< float > f3 = slot3->asyncCall<float>(2.1f);
+
+    f1.wait();
+    CPPUNIT_ASSERT( f1.is_ready() );
+    CPPUNIT_ASSERT( f1.has_value() );
+    CPPUNIT_ASSERT( !f1.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 42, f1.get() );
+
+    f2.wait();
+    CPPUNIT_ASSERT( f2.is_ready() );
+    CPPUNIT_ASSERT( f2.has_value() );
+    CPPUNIT_ASSERT( !f2.has_exception() );
+    CPPUNIT_ASSERT( a.m_method0 );
+
+
+    f3.wait();
+    CPPUNIT_ASSERT( f3.is_ready() );
+    CPPUNIT_ASSERT( f3.has_value() );
+    CPPUNIT_ASSERT( !f3.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 4.2f, f3.get() );
+    CPPUNIT_ASSERT( a.m_method1 );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SlotTest::exceptionTest ()
+{
+
+    ::fwCom::SlotBase::sptr slot = ::fwCom::newSlot( &sum );
+
+    CPPUNIT_ASSERT_THROW(slot->run(), fwCom::exception::BadRun);
+    CPPUNIT_ASSERT_THROW(slot->call<int>(), fwCom::exception::BadCall);
+    CPPUNIT_ASSERT_THROW(slot->call<void>(3,4), fwCom::exception::BadCall);
+    CPPUNIT_ASSERT_THROW(slot->asyncRun(), fwCom::exception::BadRun);
+    CPPUNIT_ASSERT_THROW(slot->asyncCall<int>(), fwCom::exception::BadCall);
+    CPPUNIT_ASSERT_THROW(slot->asyncRun(5,6), fwCom::exception::NoWorker);
+    CPPUNIT_ASSERT_THROW(slot->asyncCall<int>(4,5), fwCom::exception::NoWorker);
+}
+
+//-----------------------------------------------------------------------------
+
+struct B
+{
+    B() : m_threadId()
+    {
+    }
+
+    ::boost::thread::id waitSeconds(const unsigned int nbSeconds)
+    {
+        ::fwCore::mt::WriteLock lock(m_mutex);
+        ::boost::thread::id oldId = m_threadId;
+        m_threadId = ::boost::this_thread::get_id();
+
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(nbSeconds));
+
+        return oldId;
+    }
+
+    ::boost::thread::id m_threadId;
+
+    ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+
+
+void SlotTest::workerSwapTest()
+{
+    {
+        typedef ::boost::thread::id Signature(const unsigned int);
+
+        B b;
+
+        ::fwThread::Worker::sptr w1 = ::fwThread::Worker::New();
+        ::fwThread::Worker::sptr w2 = ::fwThread::Worker::New();
+
+        ::fwCom::Slot< Signature >::sptr m0 = ::fwCom::newSlot( &B::waitSeconds, &b );
+
+        CPPUNIT_ASSERT(b.m_threadId == ::boost::thread::id());
+
+        m0->setWorker(w1);
+        ::fwCom::Slot< Signature >::VoidSharedFutureType future1 = m0->asyncRun(1);
+
+        m0->setWorker(w2);
+        future1.wait();
+        CPPUNIT_ASSERT(b.m_threadId == w1->getThreadId());
+
+        ::fwCom::Slot< Signature >::VoidSharedFutureType future2 = m0->asyncRun(1);
+
+        future2.wait();
+
+        CPPUNIT_ASSERT(b.m_threadId == w2->getThreadId());
+    }
+
+
+    {
+        typedef ::boost::thread::id Signature(const unsigned int);
+
+        B b;
+
+        ::fwThread::Worker::sptr w1 = ::fwThread::Worker::New();
+        ::fwThread::Worker::sptr w2 = ::fwThread::Worker::New();
+
+        ::fwCom::Slot< Signature >::sptr m0 = ::fwCom::newSlot( &B::waitSeconds, &b );
+
+        CPPUNIT_ASSERT(b.m_threadId == ::boost::thread::id());
+
+        m0->setWorker(w1);
+        ::fwCom::Slot< Signature >::SharedFutureType future1 = m0->asyncCall(1);
+
+        m0->setWorker(w2);
+        future1.wait();
+        CPPUNIT_ASSERT(b.m_threadId == w1->getThreadId());
+
+        ::fwCom::Slot< Signature >::SharedFutureType future2 = m0->asyncCall(1);
+
+        future2.wait();
+
+        CPPUNIT_ASSERT(b.m_threadId == w2->getThreadId());
+        CPPUNIT_ASSERT(future1.get() == ::boost::thread::id());
+        CPPUNIT_ASSERT(future2.get() == w1->getThreadId());
+
+    }
+
+}
+
+} //namespace ut
+
+} //namespace fwCom
+
diff --git a/SrcLib/core/fwCom/test/tu/src/SlotsTest.cpp b/SrcLib/core/fwCom/test/tu/src/SlotsTest.cpp
new file mode 100644
index 0000000..982f7d6
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/src/SlotsTest.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+#include <fwCom/HasSlots.hpp>
+
+#include "SlotsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCom::ut::SlotsTest );
+
+namespace fwCom
+{
+namespace ut
+{
+
+static ::fwTest::Exception fwTestException(""); // force link with fwTest
+
+void SlotsTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void SlotsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+int slotsTestSum (int a, int b)
+{
+    return a+b;
+}
+
+void slotsTestPrint(const std::string &str)
+{
+    SLM_TRACE(str);
+}
+
+struct SlotsTestBasic
+{
+    SlotsTestBasic()
+    {}
+
+    int sum(int a, int b)
+    {
+        return a+b;
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+void SlotsTest::buildTest()
+{
+    ::fwCom::Slots slots;
+
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &slotsTestSum );
+    ::fwCom::Slot< void (const std::string &) >::sptr slot2 = ::fwCom::newSlot( &slotsTestPrint );
+
+    slots("sum", ::boost::dynamic_pointer_cast< SlotBase >(slot1))
+         ("print", ::boost::dynamic_pointer_cast< SlotBase >(slot2))
+         ("another_key", slot1);
+
+    CPPUNIT_ASSERT(slot1 == slots["sum"]);
+    CPPUNIT_ASSERT(slot2 == slots["print"]);
+    CPPUNIT_ASSERT(slots["sum"] == slots["another_key"]);
+    CPPUNIT_ASSERT(!slots["wrong_slot"]);
+
+
+    SlotsTestBasic slotsBasicStruct;
+    slots("struct_sum", &SlotsTestBasic::sum, &slotsBasicStruct);
+
+    CPPUNIT_ASSERT_EQUAL(14, slots["struct_sum"]->call<int>(5,9));
+
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+    slots.setWorker(worker);
+
+    int count = 0;
+    BOOST_FOREACH(::fwCom::Slots::SlotKeyType key, slots.getSlotKeys())
+    {
+        ::fwCom::SlotBase::sptr slot = slots[key];
+        CPPUNIT_ASSERT(worker == slot->getWorker());
+        ++count;
+    }
+    CPPUNIT_ASSERT_EQUAL(4, count);
+}
+
+//-----------------------------------------------------------------------------
+
+struct SlotsTestHasSlots : public HasSlots
+{
+    typedef Slot< int()> GetValueSlotType;
+
+    SlotsTestHasSlots()
+    {
+        GetValueSlotType::sptr slotGetValue = ::fwCom::newSlot( &SlotsTestHasSlots::getValue, this );
+        HasSlots::m_slots("sum", &SlotsTestHasSlots::sum, this)
+                         ("getValue", slotGetValue );
+    }
+
+    int sum(int a, int b)
+    {
+        return a+b;
+    }
+
+    int getValue()
+    {
+        return 4;
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+void SlotsTest::hasSlotsTest()
+{
+    SlotsTestHasSlots obj;
+    CPPUNIT_ASSERT_EQUAL(14, obj.slot("sum")->call<int>(5,9));
+    CPPUNIT_ASSERT_EQUAL(4, obj.slot< SlotsTestHasSlots::GetValueSlotType >("getValue")->call());
+}
+
+//-----------------------------------------------------------------------------
+
+void SlotsTest::slotsIDTest()
+{
+#ifdef COM_LOG
+    ::fwCom::Slot< int (int, int) >::sptr slot1 = ::fwCom::newSlot( &slotsTestSum );
+    ::fwCom::Slot< void (const std::string &) >::sptr slot2 = ::fwCom::newSlot( &slotsTestPrint );
+
+    ::fwCom::Slots slots;
+    slots( "sum", slot1 )
+         ( "print", slot2 );
+
+    slots.setID();
+    CPPUNIT_ASSERT_EQUAL( std::string("sum"), slot1->getID() );
+    CPPUNIT_ASSERT_EQUAL( std::string("print"), slot2->getID() );
+
+    slots.setID("prefix::");
+    CPPUNIT_ASSERT_EQUAL( std::string("prefix::sum"), slot1->getID() );
+    CPPUNIT_ASSERT_EQUAL( std::string("prefix::print"), slot2->getID() );
+#endif
+}
+
+//-----------------------------------------------------------------------------
+} //namespace ut
+} //namespace fwCom
diff --git a/SrcLib/core/fwCom/test/tu/src/UtilTest.cpp b/SrcLib/core/fwCom/test/tu/src/UtilTest.cpp
new file mode 100644
index 0000000..b87cdc3
--- /dev/null
+++ b/SrcLib/core/fwCom/test/tu/src/UtilTest.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/typeof/typeof.hpp>
+
+#include <fwCom/util/AutoBind.hpp>
+#include <fwCom/util/AutoBind.hxx>
+#include <fwCom/util/convert_function_type.hpp>
+#include <fwCom/util/remove_last_arg.hpp>
+
+#include "UtilTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCom::ut::UtilTest );
+
+namespace fwCom
+{
+namespace ut
+{
+
+void UtilTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void UtilTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+
+int f (int a, int b)
+{
+    return a+b;
+}
+
+std::string g (const std::string &a, const std::string &b, const std::string &c)
+{
+    return a+b+c;
+}
+
+
+void UtilTest::autoBindTest ()
+{
+    CPPUNIT_ASSERT_EQUAL( 10, ::fwCom::util::autobind(&f)(4,6) );
+    CPPUNIT_ASSERT_EQUAL( 42, (::fwCom::util::AutoBind< int (int), 1 >::wrap( f, 40 )(2)) );
+    CPPUNIT_ASSERT_EQUAL( std::string("abc"), ::fwCom::util::autobind(&g)("a","b","c") );
+}
+
+//-----------------------------------------------------------------------------
+
+class C;
+
+// double func( float, const char* ){};
+
+void UtilTest::convertFunctionTypeTest ()
+{
+    typedef void (C::* CM2C) (int, float) const;
+    typedef void (C::* CM2) (int, float);
+
+    typedef ::boost::function< void (int, float) > BF2;
+
+    typedef void F2 (int, float);
+
+    CPPUNIT_ASSERT( ( boost::is_same< F2, ::fwCom::util::convert_function_type< CM2C >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F2, ::fwCom::util::convert_function_type< CM2 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F2, ::fwCom::util::convert_function_type< BF2 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F2, ::fwCom::util::convert_function_type< F2* >::type >::value ) );
+}
+
+//-----------------------------------------------------------------------------
+
+
+void UtilTest::removeLastArgTest ()
+{
+    typedef long long F9 (int*, double, float, char, double*, float*, char*, int, const char*);
+    typedef long long F8 (int*, double, float, char, double*, float*, char*, int);
+    typedef long long F7 (int*, double, float, char, double*, float*, char*) ;
+    typedef long long F6 (int*, double, float, char, double*, float*) ;
+    typedef long long F5 (int*, double, float, char, double*) ;
+    typedef long long F4 (int*, double, float, char) ;
+    typedef long long F3 (int*, double, float) ;
+    typedef long long F2 (int*, double) ;
+    typedef long long F1 (int*) ;
+    typedef long long F0 ();
+
+
+    CPPUNIT_ASSERT( ( boost::is_same< F8, ::fwCom::util::remove_last_arg< F9 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F7, ::fwCom::util::remove_last_arg< F8 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F6, ::fwCom::util::remove_last_arg< F7 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F5, ::fwCom::util::remove_last_arg< F6 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F4, ::fwCom::util::remove_last_arg< F5 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F3, ::fwCom::util::remove_last_arg< F4 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F2, ::fwCom::util::remove_last_arg< F3 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F1, ::fwCom::util::remove_last_arg< F2 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F0, ::fwCom::util::remove_last_arg< F1 >::type >::value ) );
+    CPPUNIT_ASSERT( ( boost::is_same< F0, ::fwCom::util::remove_last_arg< F0 >::type >::value ) );
+
+}
+
+//-----------------------------------------------------------------------------
+
+
+} //namespace ut
+} //namespace fwCom
diff --git a/SrcLib/core/fwComEd/CMakeLists.txt b/SrcLib/core/fwComEd/CMakeLists.txt
new file mode 100644
index 0000000..e11cb88
--- /dev/null
+++ b/SrcLib/core/fwComEd/CMakeLists.txt
@@ -0,0 +1,20 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCom
+    fwData
+    fwMedData
+    fwMemory
+    fwRuntime
+    fwServices
+    fwTools
+)
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
+
+
+
+
diff --git a/SrcLib/core/fwComEd/COPYING b/SrcLib/core/fwComEd/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwComEd/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwComEd/COPYING.LESSER b/SrcLib/core/fwComEd/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwComEd/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwComEd/Properties.cmake b/SrcLib/core/fwComEd/Properties.cmake
new file mode 100644
index 0000000..f0d4f56
--- /dev/null
+++ b/SrcLib/core/fwComEd/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwComEd )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCom fwCore fwData fwMath fwMedData fwMemory fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwComEd/bin/build.options b/SrcLib/core/fwComEd/bin/build.options
new file mode 100644
index 0000000..84c6407
--- /dev/null
+++ b/SrcLib/core/fwComEd/bin/build.options
@@ -0,0 +1,13 @@
+TYPE    = 'shared'
+VERSION = '0-1'
+USE     = [ 'boost' ]
+LIB     = [
+          'fwData_0-1',
+          'fwMedData_0-1',
+          'fwServices_0-1',
+          'fwCore_0-1',
+          'fwTools_0-1',
+          'fwRuntime_0-3'
+          ]
+
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/BooleanMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/BooleanMsg.hpp
new file mode 100644
index 0000000..ceb0ace
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/BooleanMsg.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_BOOLEANMSG_HPP_
+#define _FWCOMED_BOOLEANMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Boolean : store modification information
+ * @class   BooleanMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API BooleanMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((BooleanMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< BooleanMsg > );
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API BooleanMsg(::fwServices::ObjectMsg::Key key);
+
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~BooleanMsg() throw();
+
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_BOOLEANMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/CameraMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/CameraMsg.hpp
new file mode 100644
index 0000000..bc74ded
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/CameraMsg.hpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_CAMERAMSG_HPP_
+#define _FWCOMED_CAMERAMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for Camera : store modification information
+ * @class   CameraMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API CameraMsg : public ::fwServices::ObjectMsg
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((CameraMsg)(::fwServices::ObjectMsg), (( )) ,
+                                           ::fwServices::factory::message::New< CameraMsg > );
+
+
+    /// Event identifier used to inform that a new camera is created
+    FWCOMED_API static std::string NEW_CAMERA;
+
+    /// Event identifier used to inform that a the camera is moving
+    FWCOMED_API static std::string CAMERA_MOVING;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API CameraMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+    * @brief    Destuctor : does nothing.
+    */
+    FWCOMED_API virtual ~CameraMsg() throw();
+
+
+    /**
+     * @name    Camera position
+     */
+    // @{
+
+    /**
+     * @brief       Set the new camera position.
+     * @param[in]   _positionValue array containing the x,y,z coordinates of the camera
+     */
+    FWCOMED_API void setPositionCamera( const double _positionValue[3]);
+
+    /**
+     * @brief   Get the new camera position.
+     * @return  An array containing the x,y,z coordinates of the camera
+     */
+    FWCOMED_API const double* getPositionCamera( void )const;
+    //@}
+
+
+    /**
+     * @name    Camera focal
+     */
+    // @{
+
+    /**
+     * @brief       Set the new camera focal.
+     * @param[in]   _focalValue array containing the focal coordinates.
+     */
+    FWCOMED_API void setFocalCamera( const double _focalValue[4] );
+
+    /**
+     * @brief   Get the new camera focal.
+     * @return  An array containing the focal coordinates.
+     */
+    FWCOMED_API const double* getFocalCamera( void )const;
+    // @}
+
+
+    /**
+     * @name    Camera view up
+     */
+    // @{
+
+    /**
+     * @brief       Set the new camera view up.
+     * @param[in]   _viewUpValue array containing the view up coordinates.
+     */
+    FWCOMED_API void setViewUpCamera( const double _viewUpValue[3] );
+
+    /**
+     * @brief   Get the new camera view up.
+     * @return  An array containing the view up coordinates.
+     */
+    FWCOMED_API const double* getViewUpCamera( void )const;
+    //@}
+
+
+protected:
+
+    /**
+      * @brief used by operator<<(std::ostream & _sstream, IService& _service)
+      */
+    FWCOMED_API virtual void info(std::ostream &_sstream ) const;
+
+private:
+
+    double m_positionCamera[3]; ///< Camera position
+    double m_focalCamera[4];    ///< Camera focal
+    double m_viewUpCamera[3];   ///< Camera view up
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_CAMERAMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ColorMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ColorMsg.hpp
new file mode 100644
index 0000000..8ca19cc
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ColorMsg.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_COLORMSG_HPP_
+#define _FWCOMED_COLORMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Color : store modification information
+ * @class   ColorMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ColorMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((ColorMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< ColorMsg > );
+
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ColorMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~ColorMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_COLORMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/CompositeMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/CompositeMsg.hpp
new file mode 100644
index 0000000..3f27a7f
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/CompositeMsg.hpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_COMPOSITEMSG_HPP_
+#define _FWCOMED_COMPOSITEMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Composite.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Composite : store modification information
+ * @class   CompositeMsg
+ * 
+ * @date    2005-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API CompositeMsg : public ::fwServices::ObjectMsg
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((CompositeMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< CompositeMsg > );
+
+    /// Event identifier used to inform that keys were added
+    FWCOMED_API static std::string ADDED_KEYS;
+
+    /// Event identifier used to inform that keys were removed
+    FWCOMED_API static std::string REMOVED_KEYS;
+
+    /// Event identifier used to inform that keys were changed
+    FWCOMED_API static std::string CHANGED_KEYS;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API CompositeMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~CompositeMsg() throw();
+
+    /**
+     * @brief       This method add an object in the composite of added keys.
+     * @param[in]   _compositeKey : the key of the added object.
+     * @param[in]   _pNewObject   : the added object.
+     */
+    FWCOMED_API void appendAddedKey( std::string _compositeKey, ::fwData::Object::sptr _pNewObject );
+
+    /**
+     * @brief   Return the composite of the added keys.
+     */
+    FWCOMED_API ::fwData::Composite::sptr getAddedKeys() const;
+
+
+    /**
+     * @brief       This method add an object in the composite of removed keys.
+     * @param[in]   _compositeKey : the key of the removed object.
+     * @param[in]   _pOldObject   : the object which will be removed.
+     */
+    FWCOMED_API void appendRemovedKey( std::string _compositeKey, ::fwData::Object::sptr _pOldObject );
+
+    /**
+     * @brief   Return the composite of the removed keys.
+     */
+    FWCOMED_API ::fwData::Composite::sptr getRemovedKeys() const;
+
+    /**
+     * @brief       This method add an object in the composites of changed keys.
+     * @param[in]   _compositeKey : the key of the changed object.
+     * @param[in]   _pOldObject   : the old object which will be replaced.
+     * @param[in]   _pNewObject   : the new object.
+     */
+    FWCOMED_API void appendChangedKey( std::string _compositeKey, ::fwData::Object::sptr _pOldObject, ::fwData::Object::sptr _pNewObject );
+
+    /**
+     * @brief   Return the composite of the old changed keys (key which will be replaced).
+     */
+    FWCOMED_API ::fwData::Composite::sptr  getOldChangedKeys() const;
+
+    /**
+    * @brief   Return the composite of the new changed keys.
+    */
+    FWCOMED_API ::fwData::Composite::sptr  getNewChangedKeys() const;
+
+private :
+
+    ::fwData::Composite::sptr m_removedKeys;
+    ::fwData::Composite::sptr m_addedKeys;
+    ::fwData::Composite::sptr m_oldChangedKeys;
+    ::fwData::Composite::sptr m_newChangedKeys;
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_COMPOSITEMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/Dictionary.hpp b/SrcLib/core/fwComEd/include/fwComEd/Dictionary.hpp
new file mode 100644
index 0000000..538ebe7
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/Dictionary.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_DICTIONARY_HPP_
+#define _FWCOMED_DICTIONARY_HPP_
+
+#include <string>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+/**
+ * @brief   Centralization of all identifiers used for communication and storage of dynamic attributes
+ * @note    probably not dynamic enough but allows at least to have an overview of information that can be exchanged
+ * 
+
+ * @date    2007-2009.
+ */
+struct FWCOMED_CLASS_API Dictionary
+{
+    /// position oriented IDs
+    FWCOMED_API const static std::string position;
+
+    /// visualization oriented IDs
+    /// @{
+    FWCOMED_API static const std::string localGui;
+    FWCOMED_API static const std::string m_axialSliceCountId;
+    FWCOMED_API static const std::string m_frontalSliceCountId;
+    FWCOMED_API static const std::string m_sagittalSliceCountId;
+    FWCOMED_API static const std::string m_axialSliceIndexId;
+    FWCOMED_API static const std::string m_frontalSliceIndexId;
+    FWCOMED_API static const std::string m_sagittalSliceIndexId;
+    FWCOMED_API static const std::string m_transferFunctionCompositeId;
+    FWCOMED_API static const std::string m_globalMatrixId;
+    FWCOMED_API static const std::string m_errorId;
+    FWCOMED_API static const std::string m_imageLandmarksId;
+    FWCOMED_API static const std::string m_imageDistancesId;
+    FWCOMED_API static const std::string m_commentId;
+    FWCOMED_API static const std::string m_colorId;
+    FWCOMED_API static const std::string m_labelId;         ///< to assign a label
+    FWCOMED_API static const std::string m_relatedServiceId; ///< to store uid (simple) of service which create the object
+    FWCOMED_API static const std::string m_imageLabelId;
+    FWCOMED_API static const std::string m_acquisitionCountId;
+    /// @}
+
+    /// processing oriented IDs
+    /// @{
+    FWCOMED_API static const std::string m_roi;
+    /// @}
+
+
+    /// processing oriented data
+    /// @{
+    FWCOMED_API static const std::string DATA_IS_LOCKED;
+    /// @}
+};
+
+}
+
+#endif /*_FWCOMED_DICTIONARY_HPP_*/
diff --git a/SrcLib/core/fwComEd/include/fwComEd/DictionaryOrganMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/DictionaryOrganMsg.hpp
new file mode 100644
index 0000000..9e179c4
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/DictionaryOrganMsg.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_DICTIONARYORGANMSG_HPP_
+#define _FWCOMED_DICTIONARYORGANMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for DictionaryOrgan : store modification information
+ * @class   DictionaryOrganMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API DictionaryOrganMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((DictionaryOrganMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                            ::fwServices::factory::message::New< DictionaryOrganMsg > );
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string ROI4ORGAN_EXP_IS_MODIFIED;
+    FWCOMED_API static std::string ROI4ORGAN_NODE_IS_MODIFIED;
+    FWCOMED_API static std::string MASK_DATA_NODE_IS_MODIFIED;
+    FWCOMED_API static std::string MESH_DATA_NODE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API DictionaryOrganMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~DictionaryOrganMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_DICTIONARYORGANMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/FloatMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/FloatMsg.hpp
new file mode 100644
index 0000000..2e71989
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/FloatMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_FLOATMSG_HPP_
+#define _FWCOMED_FLOATMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for float field : store modification information
+ * @class   FloatMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API FloatMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((FloatMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< FloatMsg >);
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API FloatMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~FloatMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_FloatMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/GraphMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/GraphMsg.hpp
new file mode 100644
index 0000000..dbb39b0
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/GraphMsg.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_GRAPHMSG_HPP_
+#define _FWCOMED_GRAPHMSG_HPP_
+
+#include "boost/tuple/tuple.hpp"
+
+#include <fwData/Node.hpp>
+#include <fwData/Edge.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for Graph : store modification information
+ * @class   GraphMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API GraphMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((GraphMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< GraphMsg >);
+
+    /**
+     * @name Event identifier
+     * @{
+     */
+    /// @brief Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_GRAPH;
+    FWCOMED_API static std::string CLEANING_GRAPH;
+    FWCOMED_API static std::string ADD_NODE;
+    FWCOMED_API static std::string REMOVE_NODE; // msg notified AFTER removing a node
+    FWCOMED_API static std::string REMOVING_NODE;  // msg notified TO REMOVE a node
+    FWCOMED_API static std::string ADD_EDGE; // msg notified AFTER adding an edge
+    FWCOMED_API static std::string ADDING_EDGE; // msg notified TO ADD an edge
+    FWCOMED_API static std::string REMOVE_EDGE;
+    FWCOMED_API static std::string SELECTED_NODE;
+    FWCOMED_API static std::string UNSELECTED_NODE;
+    FWCOMED_API static std::string SELECTED_OPERATOR;
+    FWCOMED_API static std::string EXECUTE_GRAPH;
+    FWCOMED_API static std::string CANCEL_EXECUTE_GRAPH;
+    FWCOMED_API static std::string CHANGED_NODE_STATE;
+    FWCOMED_API static std::string NODE_PROCESS_ERROR; // datainfo = node to process
+    FWCOMED_API static std::string NODE_PROCESS_WARN;  // datainfo = node to process
+    FWCOMED_API static std::string NODE_PROCESS_DONE;  // datainfo = node to process
+    FWCOMED_API static std::string NODE_PROCESS;       // datainfo = node to process
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API GraphMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : does nothing.
+      */
+    FWCOMED_API virtual ~GraphMsg() throw();
+
+    /// Add a ADD_NODE event with a dataInfo containing the node.
+    FWCOMED_API virtual void addedNode( ::fwData::Node::csptr node );
+    /// Return the added node contained in the dataInfo of ADD_NODE event
+    FWCOMED_API virtual ::fwData::Node::csptr getAddedNode() const;
+
+    /// Add a REMOVE_NODE event with a dataInfo containing the node.
+    FWCOMED_API virtual void removedNode( ::fwData::Node::csptr node );
+    /// Return the removed node contained in the dataInfo of REMOVE_NODE event
+    FWCOMED_API virtual ::fwData::Node::csptr getRemovedNode() const;
+
+    /// Add a REMOVING_NODE event with a dataInfo containing the node.
+    FWCOMED_API virtual void removingNode( ::fwData::Node::csptr node );
+    /// Return the removed node contained in the dataInfo of REMOVING_NODE event
+    FWCOMED_API virtual ::fwData::Node::csptr getRemovingNode() const;
+
+    /// Add a ADDING_EDGE event with a dataInfo containing the node.
+    FWCOMED_API virtual void addingEdge( ::fwData::Node::csptr nodeFrom, ::fwData::Node::csptr nodeTo, std::string outputPortId, std::string inputPortId );
+    /// Return the removed node contained in the dataInfo of ADDING_EDGE event
+    FWCOMED_API virtual ::boost::tuple< ::fwData::Node::csptr, ::fwData::Node::csptr, std::string, std::string > getAddingEdge() const;
+
+
+    /// Add a SELECTED_NODE event with a dataInfo containing the node.
+    FWCOMED_API virtual void selectedNode( ::fwData::Node::csptr node );
+    /// Return the selected node contained in the dataInfo of SELECTED_NODE event
+    FWCOMED_API virtual ::fwData::Node::csptr getSelectedNode() const;
+
+    /// Add a UNSELECTED_NODE event with a dataInfo containing the node.
+    FWCOMED_API virtual void unselectedNode( ::fwData::Node::csptr node );
+    /// Return the unselected node contained in the dataInfo of UNSELECTED_NODE event
+    FWCOMED_API virtual ::fwData::Node::csptr getUnselectedNode() const;
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_GRAPHMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/HistogramMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/HistogramMsg.hpp
new file mode 100644
index 0000000..28c9d14
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/HistogramMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_FLOAT_MSG_HPP_
+#define _FWCOMED_FLOAT_MSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for histogram field.
+ * @class   HistogramMsg
+ * 
+ * @date    2011.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API HistogramMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((HistogramMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< HistogramMsg >);
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API HistogramMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~HistogramMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_HISTOGRAM_MSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ImageMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ImageMsg.hpp
new file mode 100644
index 0000000..e77e7cf
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ImageMsg.hpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_IMAGEMSG_HPP_
+#define _FWCOMED_IMAGEMSG_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for image : store modification information
+ * @class   ImageMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ImageMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ImageMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< ImageMsg > );
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_IMAGE;
+    FWCOMED_API static std::string BUFFER;
+    FWCOMED_API static std::string MODIFIED;
+    FWCOMED_API static std::string DIMENSION;
+    FWCOMED_API static std::string SPACING;
+    FWCOMED_API static std::string REGION;
+    FWCOMED_API static std::string PIXELTYPE;
+    FWCOMED_API static std::string LANDMARK;
+    FWCOMED_API static std::string NEW_DISTANCE;
+    FWCOMED_API static std::string DISTANCE;
+    FWCOMED_API static std::string DELETE_DISTANCE;
+    FWCOMED_API static std::string SLICE_INDEX;
+    FWCOMED_API static std::string ACTIVATE_SYNC_CROSS;
+    FWCOMED_API static std::string INACTIVATE_SYNC_CROSS;
+    FWCOMED_API static std::string CHANGE_SLICE_TYPE;
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+    FWCOMED_API static std::string TRANSPARENCY;
+    FWCOMED_API static std::string VISIBILITY;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ImageMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : does nothing.
+     */
+    FWCOMED_API virtual ~ImageMsg() throw();
+
+    /**
+     * @brief Add a SLICE_INDEX even with the slice index position.
+     * @param[in] a : axial position
+     * @param[in] f : frontal position
+     * @param[in] s : sagittal position
+     * @param[in] _pDataInfo : message data info (optional)
+     */
+    FWCOMED_API void setSliceIndex(::fwData::Integer::sptr a, ::fwData::Integer::sptr f, ::fwData::Integer::sptr s, ::fwData::Object::sptr _pDataInfo = ::fwData::Object::sptr() );
+
+    /**
+     * @brief Get the slice index position.
+     * @pre   The message must have a SLICE_INDEX even
+     * @param[out] a : axial position
+     * @param[out] f : frontal position
+     * @param[out] s : sagittal position
+     */
+    FWCOMED_API void getSliceIndex(::fwData::Integer::sptr &a, ::fwData::Integer::sptr &f, ::fwData::Integer::sptr &s ) const;
+
+    /**
+     * @brief Get the window min and max.
+     * @pre   The message must have a WINDOWING even
+     * @param[out] min : window min
+     * @param[out] max : window max
+     */
+    FWCOMED_API void getWindowMinMax(::fwData::Integer::sptr min, ::fwData::Integer::sptr max ) const;
+
+    /**
+     * @brief Get the window and level .
+     * @pre   The message must have a WINDOWING even
+     * @param[out] : the window of the image tf
+     */
+    FWCOMED_API double getWindow() const;
+    /**
+     * @brief Get the level .
+     * @pre   The message must have a WINDOWING even
+     * @param[out] : the level of the image tf
+     */
+    FWCOMED_API double getLevel() const;
+
+protected:
+    /// Axial slice index
+    ::fwData::Integer::sptr m_axialIndex;
+    /// Frontal slice index
+    ::fwData::Integer::sptr m_frontalIndex;
+    /// Sagittal slice index
+    ::fwData::Integer::sptr m_sagittalIndex;
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_IMAGEMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/IntegerMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/IntegerMsg.hpp
new file mode 100644
index 0000000..09ff9dc
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/IntegerMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_INTEGERMSG_HPP_
+#define _FWCOMED_INTEGERMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for integer field : store modification information
+ * @class   IntegerMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API IntegerMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((IntegerMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< IntegerMsg > );
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API IntegerMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~IntegerMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_INTEGERMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/InteractionMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/InteractionMsg.hpp
new file mode 100644
index 0000000..463b30d
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/InteractionMsg.hpp
@@ -0,0 +1,138 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_INTERACTIONMSG_HPP_
+#define _FWCOMED_INTERACTIONMSG_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for interaction : store modification information
+ * @class   InteractionMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API InteractionMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((InteractionMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< InteractionMsg > );
+
+    typedef ::fwData::Point::PointCoordType PointCoordType;
+
+    //typedef enum
+    //{
+        //KEY_UP    ,
+        //KEY_DOWN  ,
+        //MOUSE_UP  ,
+        //MOUSE_DOWN,
+        //MOUSE_MOVE
+    //} EventType;
+
+    //typedef enum
+    //{
+        //LEFT           = (1 << 0),
+        //MIDDLE         = (1 << 1),
+        //RIGHT          = (1 << 2),
+        //WHEEL_FORWARD  = (1 << 3),
+        //WHEEL_BACKWARD = (1 << 4),
+    //} MouseButtons;
+
+    typedef enum
+    {
+        NONE      = 0,
+        CTRL      = (1 << 0),
+        SHIFT     = (1 << 1),
+        //ALT     = (1 << 2),
+        //SUPER     = (1 << 3),
+        //APPLE_CMD = (1 << 4),
+    } Modifiers;
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string MOUSE_LEFT_UP;
+    FWCOMED_API static std::string MOUSE_RIGHT_UP;
+    FWCOMED_API static std::string MOUSE_MIDDLE_UP;
+    FWCOMED_API static std::string MOUSE_WHEELFORWARD_UP;
+    FWCOMED_API static std::string MOUSE_WHEELBACKWARD_UP;
+
+    FWCOMED_API static std::string MOUSE_LEFT_DOWN;
+    FWCOMED_API static std::string MOUSE_RIGHT_DOWN;
+    FWCOMED_API static std::string MOUSE_MIDDLE_DOWN;
+    FWCOMED_API static std::string MOUSE_WHEELFORWARD_DOWN;
+    FWCOMED_API static std::string MOUSE_WHEELBACKWARD_DOWN;
+
+    FWCOMED_API static std::string MOUSE_MOVE;
+
+    //FWCOMED_API static std::string KEY_UP;
+    //FWCOMED_API static std::string KEY_DOWN;
+
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API InteractionMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : does nothing.
+     */
+    FWCOMED_API virtual ~InteractionMsg() throw();
+
+    /// Set the state of the modifier k.
+    FWCOMED_API void setModifiersStatus(Modifiers k, bool state = true);
+    /// Get the state of the modifier k.
+    FWCOMED_API bool getModifiersStatus(Modifiers k) const;
+
+    /// Get the control status.
+    bool getControlStatus() const {return getModifiersStatus(CTRL);}
+    /// Get the shift status.
+    bool getShiftStatus() const {return getModifiersStatus(SHIFT);}
+
+    /**
+     * @brief Set the message event
+     * @note  An InteractionMsg can only handle one event.
+     */
+    FWCOMED_API void setEvent(std::string event);
+
+    /// Set the point coordinates of the event.
+    FWCOMED_API void setEventPoint(::fwData::Point::csptr point);
+    /// Set the point coordinates of the event.
+    FWCOMED_API void setEventPoint(PointCoordType x, PointCoordType y, PointCoordType z);
+
+    /// Return the point coordinates of the event.
+    FWCOMED_API ::fwData::Point::csptr getEventPoint() const;
+
+protected:
+
+    /// Event point coordinates
+    ::fwData::Point::sptr m_eventPoint;
+
+    /// Modifiers status
+    unsigned char m_modifiersStatus;
+
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_INTERACTIONMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/LocationMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/LocationMsg.hpp
new file mode 100644
index 0000000..77f139b
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/LocationMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_LOCATIONMSG_HPP_
+#define _FWCOMED_LOCATIONMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for location object : store modification information
+ * @class   LocationMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API LocationMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((LocationMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< LocationMsg > );
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string LOCATION_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API LocationMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~LocationMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_LOCATIONMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/MaterialMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/MaterialMsg.hpp
new file mode 100644
index 0000000..b8c0dac
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/MaterialMsg.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_MATERIALMSG_HPP_
+#define _FWCOMED_MATERIALMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for material : store modification information
+ * @class   MaterialMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API MaterialMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((MaterialMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< MaterialMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string MATERIAL_IS_MODIFIED;
+    /// @}
+
+    /**
+     * @brief   Constructor : do nothing.
+     */
+    FWCOMED_API MaterialMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~MaterialMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_MATERIALMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/MeshMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/MeshMsg.hpp
new file mode 100644
index 0000000..c3eaec8
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/MeshMsg.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_MESHMSG_HPP_
+#define _FWCOMED_MESHMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Mesh : store modification information
+ * @class   MeshMsg
+ * 
+ * @date    2011.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API MeshMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MeshMsg)(::fwServices::ObjectMsg), (( )) ,
+                                            ::fwServices::factory::message::New< MeshMsg > );
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_MESH;
+    FWCOMED_API static std::string VERTEX_MODIFIED;
+    FWCOMED_API static std::string POINT_COLORS_MODIFIED;
+    FWCOMED_API static std::string CELL_COLORS_MODIFIED;
+    FWCOMED_API static std::string POINT_NORMALS_MODIFIED;
+    FWCOMED_API static std::string CELL_NORMALS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API MeshMsg(::fwServices::ObjectMsg::Key key);
+
+    /// Destructor. Do nothing.
+    FWCOMED_API virtual ~MeshMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_MESHMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ModelMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ModelMsg.hpp
new file mode 100644
index 0000000..54c60e7
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ModelMsg.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_MODELMSG_HPP_
+#define _FWCOMED_MODELMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for model : store modification information
+ * @class   ModelMsg
+ * 
+ * @date    2007-2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ModelMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((ModelMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< ModelMsg >);
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_MODEL;
+
+    /**
+     * @brief   Constructor : does nothing.
+     */
+    FWCOMED_API ModelMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : does nothing.
+     */
+    FWCOMED_API virtual ~ModelMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_MODELMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ModelSeriesMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ModelSeriesMsg.hpp
new file mode 100644
index 0000000..83c64af
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ModelSeriesMsg.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_MODELSERIESMSG_HPP__
+#define __FWCOMED_MODELSERIESMSG_HPP__
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for model series : store modification information
+ * @class   ModelSeriesMsg
+ * @date    2013
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ModelSeriesMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ModelSeriesMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< ModelSeriesMsg > );
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string ADD_RECONSTRUCTION;
+    FWCOMED_API static std::string REMOVED_RECONSTRUCTIONS;
+    FWCOMED_API static std::string SHOW_RECONSTRUCTIONS;
+    FWCOMED_API static std::string VISIBILITY;
+    FWCOMED_API static std::string NEW_RECONSTRUCTION_SELECTED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ModelSeriesMsg(::fwServices::ObjectMsg::Key key);
+
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~ModelSeriesMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //__FWCOMED_MODELSERIESMSG_HPP__
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/Namespace.hpp b/SrcLib/core/fwComEd/include/fwComEd/Namespace.hpp
new file mode 100644
index 0000000..f59356c
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWCOMEDNAMESPACE_HPP_
+#define FWCOMEDNAMESPACE_HPP_
+
+/**
+ * @brief       This namespace fwComEd contains the classes used in communication edition like definition of message used in the FW4SPL.
+ * @namespace   fwComEd
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwComEd
+{
+}
+#endif /* FWCOMEDNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/PlaneListMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/PlaneListMsg.hpp
new file mode 100644
index 0000000..c47ea6d
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/PlaneListMsg.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PLANELISTMSG_HPP_
+#define _FWCOMED_PLANELISTMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for PlaneList : store modification information
+ * @class   PlaneListMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API PlaneListMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((PlaneListMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< PlaneListMsg >);
+
+    /**
+     * @name Event identifier
+     * @{
+     */
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string ADD_PLANE;
+    FWCOMED_API static std::string REMOVE_PLANE;
+    FWCOMED_API static std::string PLANELIST_VISIBILITY;
+    FWCOMED_API static std::string PLANELIST_MODIFIED;
+    FWCOMED_API static std::string DESELECT_ALL_PLANES;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API PlaneListMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : does nothing.
+      */
+    FWCOMED_API virtual ~PlaneListMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_PLANELISTMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/PlaneMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/PlaneMsg.hpp
new file mode 100644
index 0000000..c097b46
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/PlaneMsg.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PLANEMSG_HPP_
+#define _FWCOMED_PLANEMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for PlaneList : store modification information
+ * @class   PlaneMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API PlaneMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((PlaneMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< PlaneMsg > );
+
+    /**
+     * @name Event identifier
+     * @{
+     */
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string PLANE_MODIFIED;
+    FWCOMED_API static std::string START_PLANE_INTERACTION;
+    FWCOMED_API static std::string DESELECT_PLANE;
+    FWCOMED_API static std::string WAS_SELECTED;
+    FWCOMED_API static std::string WAS_DESELECTED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API PlaneMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : does nothing.
+      */
+    FWCOMED_API virtual ~PlaneMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_PLANEMSG_HPP_
+
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/PointListMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/PointListMsg.hpp
new file mode 100644
index 0000000..abd8e8c
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/PointListMsg.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_POINTLISTMSG_HPP_
+#define _FWCOMED_POINTLISTMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for PointList : store modification information
+ * @class   PointListMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API PointListMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((PointListMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< PointListMsg >);
+
+    /**
+     * @name Event identifier
+     * @{
+     */
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string ELEMENT_MODIFIED;
+    FWCOMED_API static std::string ELEMENT_ADDED;
+    FWCOMED_API static std::string ELEMENT_REMOVED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API PointListMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~PointListMsg() throw();
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_POINTLISTMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/PointMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/PointMsg.hpp
new file mode 100644
index 0000000..c06147e
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/PointMsg.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_POINTMSG_HPP_
+#define _FWCOMED_POINTMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for Point : store modification information
+ * @class   PointMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API PointMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((PointMsg)(::fwServices::ObjectMsg), ( () ),
+                                            ::fwServices::factory::message::New< PointMsg > );
+
+    /**
+     * @name Event identifier
+     * @{
+     */
+    /// @brief Event identifier used to inform for modification
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+    FWCOMED_API static std::string POINT_IS_MODIFIED;
+    FWCOMED_API static std::string START_POINT_INTERACTION;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API PointMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : does nothing.
+      */
+    FWCOMED_API virtual ~PointMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_POINTMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ReconstructionMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ReconstructionMsg.hpp
new file mode 100644
index 0000000..c9c3b57
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ReconstructionMsg.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_RECONSTRCUTIONMSG_HPP_
+#define _FWCOMED_RECONSTRCUTIONMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for reconstruction : store modification information
+ * @class   ReconstructionMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ReconstructionMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ReconstructionMsg)(::fwServices::ObjectMsg), ( () ),
+                                            ::fwServices::factory::message::New< ReconstructionMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string MESH;
+    FWCOMED_API static std::string VISIBILITY;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ReconstructionMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~ReconstructionMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_RECONSTRCUTIONMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ResectionDBMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ResectionDBMsg.hpp
new file mode 100644
index 0000000..dbf8117
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ResectionDBMsg.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_RESECTIONDBMSG_HPP_
+#define _FWCOMED_RESECTIONDBMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Resection.hpp>
+#include <fwData/ResectionDB.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for resectionDB : store modification information
+ * @class   ResectionDBMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ResectionDBMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ResectionDBMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< ResectionDBMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// @brief Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_RESECTIONDB_SELECTED;
+    FWCOMED_API static std::string RESECTIONDB_SELECTED;
+    FWCOMED_API static std::string NEW_RESECTION_SELECTED;
+    FWCOMED_API static std::string NEW_SAFE_PART_SELECTED;
+    FWCOMED_API static std::string ADD_RESECTION;
+    FWCOMED_API static std::string ADD_SAFE_PART;
+    FWCOMED_API static std::string MODIFIED;
+    FWCOMED_API static std::string RESECTIONDB_INVALIDATED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ResectionDBMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~ResectionDBMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_RESECTIONDBMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/ResectionMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/ResectionMsg.hpp
new file mode 100644
index 0000000..14c9ee1
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/ResectionMsg.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_RESECTIONMSG_HPP_
+#define _FWCOMED_RESECTIONMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for resection : store modification information
+ * @class   ResectionMsg
+ * 
+ * @date    2009
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API ResectionMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ResectionMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< ResectionMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// @brief Event identifier used to inform for modification
+    FWCOMED_API static std::string ADD_RECONSTRUCTION;
+    FWCOMED_API static std::string VISIBILITY;
+    FWCOMED_API static std::string NEW_RECONSTRUCTION_SELECTED;
+    FWCOMED_API static std::string MODIFIED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API ResectionMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~ResectionMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_RESECTIONMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/SeriesDBMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/SeriesDBMsg.hpp
new file mode 100644
index 0000000..c706a9e
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/SeriesDBMsg.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_SERIESDBMSG_HPP__
+#define __FWCOMED_SERIESDBMSG_HPP__
+
+#include <fwData/Vector.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for SeriesDB : store modification information
+ * @class   SeriesDBMsg
+ * @date    2005-2013.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API SeriesDBMsg : public ::fwServices::ObjectMsg
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((SeriesDBMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< SeriesDBMsg > );
+
+
+    /// Event identifier used to inform that Series were added
+    FWCOMED_API static std::string ADDED_OBJECTS;
+
+    /// Event identifier used to inform that Series were removed
+    FWCOMED_API static std::string REMOVED_OBJECTS;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API SeriesDBMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~SeriesDBMsg() throw();
+
+
+    /**
+     * @brief       This method add a Series in the vector of added Series.
+     * @param[in]   newSeries   : the added Series.
+     */
+    FWCOMED_API void appendAddedSeries( ::fwMedData::Series::sptr newSeries );
+
+    /**
+     * @brief   Return the vector of the added Series.
+     */
+    FWCOMED_API ::fwData::Vector::sptr getAddedSeries() const;
+
+
+    /**
+     * @brief       This method add a Series in SeriesDB of removed Series.
+     * @param[in]   oldSeries   : the Series which will be removed.
+     */
+    FWCOMED_API void appendRemovedSeries( ::fwMedData::Series::sptr oldSeries );
+
+    /**
+     * @brief   Return the vector of the removed Series.
+     */
+    FWCOMED_API ::fwData::Vector::sptr getRemovedSeries() const;
+
+private :
+
+    /// Stores removed object from SeriesDB
+    ::fwData::Vector::sptr m_removedSeries;
+
+    /// Stores new added object in SeriesDB
+    ::fwData::Vector::sptr m_addedSeries;
+};
+
+} // namespace fwComEd
+
+#endif //__FWCOMED_SERIESDBMSG_HPP__
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/SplineMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/SplineMsg.hpp
new file mode 100644
index 0000000..e53e4be
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/SplineMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_SPLINEMSG_HPP_
+#define _FWCOMED_SPLINEMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for Spline : store modification information
+ * @class   SplineMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API SplineMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((SplineMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< SplineMsg > );
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_SPLINE;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API SplineMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~SplineMsg() throw();
+
+};
+
+} // namespace op
+
+#endif //_FWCOMED_SPLINEMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/StringMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/StringMsg.hpp
new file mode 100644
index 0000000..24b848b
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/StringMsg.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_STRINGMSG_HPP_
+#define _FWCOMED_STRINGMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for string field : store modification information
+ * @class   StringMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API StringMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((StringMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< StringMsg >);
+
+    /// Event identifier used to inform that the value is modified.
+    FWCOMED_API static std::string VALUE_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API StringMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : do nothing
+      */
+    FWCOMED_API virtual ~StringMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_STRINGMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/TagMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/TagMsg.hpp
new file mode 100644
index 0000000..9c24d6e
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/TagMsg.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TAGMSG_HPP_
+#define _FWCOMED_TAGMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Tag : store modification information
+ * @class   TagMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API TagMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((TagMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< TagMsg >);
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string TAG_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API TagMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : do nothing.
+      */
+    FWCOMED_API virtual ~TagMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_TAGMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/TransferFunctionMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/TransferFunctionMsg.hpp
new file mode 100644
index 0000000..a32cb78
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/TransferFunctionMsg.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TRANSFERFUNCTIONMSG_HPP_
+#define _FWCOMED_TRANSFERFUNCTIONMSG_HPP_
+
+#include <fwData/Object.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for transfer function : store modification information
+ * @class   TransferFunctionMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API TransferFunctionMsg : public ::fwServices::ObjectMsg
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((TransferFunctionMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< TransferFunctionMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string MODIFIED_POINTS;
+    FWCOMED_API static std::string WINDOWING;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API TransferFunctionMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : does nothing.
+     */
+    FWCOMED_API virtual ~TransferFunctionMsg() throw();
+
+    /**
+     * @brief Add a WINDOWING even with window and level.
+     * @param[in] level : level of the image tf
+     * @param[in] window : window of the image tf
+     */
+    FWCOMED_API void setWindowLevel( double window, double level );
+
+    /**
+     * @brief Get the window and level .
+     * @pre   The message must have a WINDOWING even
+     * @param[out] : the window of the image tf
+     */
+    FWCOMED_API double getWindow() const;
+    /**
+     * @brief Get the level .
+     * @pre   The message must have a WINDOWING even
+     * @param[out] : the level of the image tf
+     */
+    FWCOMED_API double getLevel() const;
+
+protected:
+
+    /// Windowing min
+    double m_level;
+    /// Windowing max
+    double m_window;
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_TRANSFERFUNCTIONMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/TransformationMatrix3DMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/TransformationMatrix3DMsg.hpp
new file mode 100644
index 0000000..9cc7f8d
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/TransformationMatrix3DMsg.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TRANSFORMATIONMATRIX3DMSG_HPP_
+#define _FWCOMED_TRANSFORMATIONMATRIX3DMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for TransformationMatrix3D : store modification information
+ * @class   TransformationMatrix3DMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API TransformationMatrix3DMsg : public fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((TransformationMatrix3DMsg)(::fwServices::ObjectMsg), ( ( ) ),
+                                           ::fwServices::factory::message::New< TransformationMatrix3DMsg >);
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string MATRIX_IS_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API TransformationMatrix3DMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destuctor : do nothing.
+     */
+    FWCOMED_API virtual ~TransformationMatrix3DMsg() throw();
+
+};
+
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_TRANSFORMATIONMATRIX3DMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/TriangularMeshMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/TriangularMeshMsg.hpp
new file mode 100644
index 0000000..79e2506
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/TriangularMeshMsg.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TRIANGULARMESHMSG_HPP_
+#define _FWCOMED_TRIANGULARMESHMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for TriangularMesh : store modification information
+ * @class   TriangularMeshMsg
+ * 
+ * @date    2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API TriangularMeshMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TriangularMeshMsg)(::fwServices::ObjectMsg), (( )) ,
+                                             ::fwServices::factory::message::New< TriangularMeshMsg > );
+
+    /// Event identifier used to inform for modification
+    FWCOMED_API static std::string NEW_MESH;
+    FWCOMED_API static std::string VERTEX_MODIFIED;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API TriangularMeshMsg(::fwServices::ObjectMsg::Key key);
+
+    /// Destructor. Do nothing.
+    FWCOMED_API virtual ~TriangularMeshMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_TRIANGULARMESHMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/VectorMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/VectorMsg.hpp
new file mode 100644
index 0000000..8bba288
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/VectorMsg.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_VECTORMSG_HPP__
+#define __FWCOMED_VECTORMSG_HPP__
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwData/Vector.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object event message specialized for Vector : store modification information
+ * @class   VectorMsg
+ * 
+ * @date    2005-2009.
+ * @see     ::fwServices::ObjectMsg
+ */
+class FWCOMED_CLASS_API VectorMsg : public ::fwServices::ObjectMsg
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((VectorMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< VectorMsg > );
+
+
+    /// Event identifier used to inform that objects were added
+    FWCOMED_API static std::string ADDED_OBJECTS;
+
+    /// Event identifier used to inform that objects were removed
+    FWCOMED_API static std::string REMOVED_OBJECTS;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API VectorMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWCOMED_API virtual ~VectorMsg() throw();
+
+
+    /**
+     * @brief       This method add an object in the vector of added objects.
+     * @param[in]   _pNewObject   : the added object.
+     */
+    FWCOMED_API void appendAddedObject( ::fwData::Object::sptr _pNewObject );
+
+    /**
+     * @brief   Return the vector of the added objects.
+     */
+    FWCOMED_API ::fwData::Vector::sptr getAddedObjects() const;
+
+
+    /**
+     * @brief       This method add an object in the vector of removed objects.
+     * @param[in]   _pOldObject   : the object which will be removed.
+     */
+    FWCOMED_API void appendRemovedObject( ::fwData::Object::sptr _pOldObject );
+
+    /**
+     * @brief   Return the vector of the removed objects.
+     */
+    FWCOMED_API ::fwData::Vector::sptr getRemovedObjects() const;
+
+private :
+
+    /// Stores removed object from the vector
+    ::fwData::Vector::sptr m_removedObjects;
+
+    /// Stores new added object in the vector
+    ::fwData::Vector::sptr m_addedObjects;
+};
+
+} // namespace fwComEd
+
+#endif //__FWCOMED_VECTORMSG_HPP__
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/VideoMsg.hpp b/SrcLib/core/fwComEd/include/fwComEd/VideoMsg.hpp
new file mode 100644
index 0000000..1e29128
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/VideoMsg.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_VIDEOMSG_HPP_
+#define _FWCOMED_VIDEOMSG_HPP_
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+/**
+ * @brief   Object message specialized for Video : store modification information
+ * @class   VideoMsg
+ * 
+ * @date    2007-2009.
+ * @see     ::fwServices::ObjectMsg
+ * @todo specialize it when Video class is clearly defined
+ */
+class FWCOMED_CLASS_API VideoMsg : public ::fwServices::ObjectMsg
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((VideoMsg)(::fwServices::ObjectMsg), ( () ),
+                                           ::fwServices::factory::message::New< VideoMsg >);
+
+    /**
+     * @name Event identifier
+     */
+    /// @{
+    /// Event identifier used to inform for modification
+    FWCOMED_API static  std::string VIDEO_IS_REFRESHED;
+    FWCOMED_API static  std::string VIDEO_IS_INITIALIZED;
+    /// @}
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWCOMED_API VideoMsg(::fwServices::ObjectMsg::Key key);
+
+    /**
+      * @brief  Destuctor : do nothing.
+      */
+    FWCOMED_API virtual ~VideoMsg() throw();
+
+};
+
+} // namespace fwComEd
+
+#endif //_FWCOMED_VIDEOMSG_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/export.hpp b/SrcLib/core/fwComEd/include/fwComEd/export.hpp
new file mode 100644
index 0000000..b0592b2
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_CONFIG_HPP_
+#define _FWCOMED_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWCOMED_EXPORTS
+    #define FWCOMED_API __declspec(dllexport)
+    #else
+    #define FWCOMED_API __declspec(dllimport)
+    #endif
+    
+    #define FWCOMED_CLASS_API 
+
+    #pragma warning(disable: 4290)
+    
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWCOMED_EXPORTS
+        #define FWCOMED_API __attribute__ ((visibility("default")))
+        #define FWCOMED_CLASS_API __attribute__ ((visibility("default")))
+        #else
+        #define FWCOMED_API __attribute__ ((visibility("hidden")))
+        #define FWCOMED_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+#else
+
+    #define FWCOMED_API
+    #define FWCOMED_CLASS_API
+
+#endif
+
+
+#endif //_FWCOMED_CONFIG_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/MedicalImageHelpers.hpp b/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/MedicalImageHelpers.hpp
new file mode 100644
index 0000000..20ec966
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/MedicalImageHelpers.hpp
@@ -0,0 +1,399 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_FIELDHELPER_MEDICALIMAGEHELPERS_HPP_
+#define _FWCOMED_FIELDHELPER_MEDICALIMAGEHELPERS_HPP_
+
+#include <utility> // std::pair
+#include <numeric>
+
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Point.hpp>
+
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/NumericRoundCast.hxx>
+#include <fwServices/IService.hpp>
+
+#include "fwComEd/export.hpp"
+#include "fwComEd/helper/Image.hpp"
+
+namespace fwComEd
+{
+namespace fieldHelper
+{
+
+
+template <class T> struct bitwise_or : std::binary_function <T,T,T>
+{
+  T operator() (const T& x, const T& y) const
+    {return x|y;}
+};
+
+
+/**
+ * @class   MedicalImageHelpers
+ * @brief   This class contains helpers for medical image fields.
+ * 
+ * @date    2009.
+ */
+class FWCOMED_CLASS_API MedicalImageHelpers
+{
+public :
+
+    /**
+     * @brief       Check if the image has a landmark field.
+     *
+     * If the image hasn't landmark field, it is added and the method return true.
+     *
+     * @param[in]   _pImg   image which must contains the field.
+     * @return      true if the field is added.
+     */
+    FWCOMED_API static bool checkLandmarks( ::fwData::Image::sptr _pImg );
+
+    /**
+     * @brief       Check if the image is valid.
+     *
+     * The image size must be > 1 for each dimension.
+     *
+     * @param[in]   _pImg   image checked.
+     * @return      true if the image is valid.
+     */
+    FWCOMED_API static bool checkImageValidity( ::fwData::Image::sptr _pImg );
+
+    /**
+     * @brief       Check if the image has slice index fields.
+     *
+     * If the image hasn't frontal, axial and sagittal slice index fields, they are added.
+     *
+     * @param       _pImg   image which must contains the field.
+     * @return      true if the fields are added.
+     */
+    FWCOMED_API static bool checkImageSliceIndex( ::fwData::Image::sptr _pImg );
+
+    /**
+     * @brief       Get the X,Y,Z slice position.
+     * @param[in]   _pImg   current image.
+     * @return      X,Y,Z  slice position of the current image if exist field exist
+     *              else install field and return (imgSizeX/2,imgSizeY/2,imgSizeZ/2).
+     */
+    FWCOMED_API static ::fwData::Point::sptr   getImageSliceIndices( ::fwData::Image::sptr _pImg );
+
+    /**
+     * @brief       Check if the image has a comment field.
+     *
+     * If the image has no comment field, this is added with default name ("Original image").
+     *
+     * @param[in]   _pImg image which contains the comment field.
+     * @return      true if the comment field is added.
+     */
+    FWCOMED_API static bool checkComment( ::fwData::Image::sptr _pImg );
+
+    /**
+     * @brief       Initialized an image to 0 from image source (same field, pixel type, buffer size...).
+     *
+     *
+     * @param[in]   imgSrc             image which gives information (field, pixel type, buffer size...).
+     * @param[in]   imgToInitialize    image to initialized (if not null).
+     *
+     * @return      Returns initialized image.
+     */
+    FWCOMED_API static ::fwData::Image::sptr initialize( ::fwData::Image::sptr imgSrc, ::fwData::Image::sptr imgToInitialize = ::fwData::Image::sptr());
+
+    /**
+     * @brief       Return true if the pixel value is null.
+     * @param[in] image : image containing the pixel
+     * @param[in] point : the coordinate of the pixel in the image.
+     */
+    template < typename INT_INDEX>
+    static bool isPixelNull(::fwData::Image::sptr image, INT_INDEX &point);
+
+    FWCOMED_API static bool isBufNull(const ::fwData::Image::BufferType *buf, const unsigned int len);
+
+
+    /**
+     * @brief Set a pixel value.
+     * @param[in] image : image containing the pixel
+     * @param[in] point : coordinate of the pixel
+     * @param[in] value : the pixel value
+     */
+    template < typename T , typename INT_INDEX>
+    static void setPixel(::fwData::Image::sptr image, INT_INDEX &point, T &value);
+
+    /**
+     * @brief Set a pixel value.
+     * @param[in] pImage : image containing the pixel
+     * @param[in] point : coordinate of the pixel
+     * @param[in] value : the pixel value
+     */
+    template < typename T >
+    static void setPixel(::fwData::Image::sptr pImage, ::fwData::Point::sptr point, T &value);
+
+
+    /**
+     * @brief Return a buffer of image type's size, containing 'value' casted to image data type
+     * @param[in] image : reference image
+     * @param[in] value : value to map
+     */
+    template < typename T >
+    static SPTR( ::fwData::Image::BufferType ) getPixelBufferInImageSpace(::fwData::Image::sptr image, T &value);
+
+
+    /**
+     * @brief Return minimum and maximum values contained in image. If image
+     * min or max value is out of MINMAXTYPE range, they are clamped to
+     * MINMAXTYPE capacity
+     * @param[in] _img : image
+     * @param[out] _min : minimum value
+     * @param[out] _max : maximum value
+     */
+    template < typename MINMAXTYPE >
+    static void getMinMax(const ::fwData::Image::sptr _img, MINMAXTYPE &_min, MINMAXTYPE &_max);
+
+};
+
+
+//------------------------------------------------------------------------------
+
+template < typename VALUE >
+class PixelCastAndSetFunctor
+{
+public:
+    class Param
+    {
+        public:
+        typedef VALUE ValueType;
+        typedef SPTR( ::fwData::Image::BufferType ) BufferTypeSptr;
+
+        Param(ValueType &v): value (v)
+        {};
+
+        const ValueType &value;
+        BufferTypeSptr res;
+    };
+
+    template < typename IMAGE >
+    void operator()( Param &param )
+    {
+        unsigned char imageTypeSize = sizeof(IMAGE);
+
+        IMAGE val = ::fwTools::numericRoundCast<IMAGE>(param.value);
+
+        ::fwData::Image::BufferType *buf = reinterpret_cast< ::fwData::Image::BufferType* > (&val);
+
+        SPTR( ::fwData::Image::BufferType ) res ( new ::fwData::Image::BufferType[imageTypeSize] );
+        std::copy(buf, buf+imageTypeSize, res.get());
+        param.res = res;
+    }
+
+};
+
+
+//------------------------------------------------------------------------------
+
+template < typename VALUE, typename INT_INDEX >
+class CastAndSetFunctor
+{
+public:
+    class Param
+    {
+        public:
+        typedef VALUE ValueType;
+        typedef INT_INDEX PointType;
+
+            Param(PointType &p, ValueType &v):
+                value (v), point(p)
+            {};
+
+        ::fwData::Image::sptr image;
+        const ValueType &value;
+        const PointType &point;
+    };
+
+    template < typename IMAGE >
+    void operator()( Param &param )
+    {
+        ::fwComEd::helper::Image imagehelper(param.image);
+        IMAGE * buffer = static_cast < IMAGE* > (imagehelper.getBuffer());
+        const INT_INDEX &p = param.point;
+        const ::fwData::Image::SizeType &size = param.image->getSize();
+        const int &sx = size[0];
+        const int &sy = size[1];
+        const int &offset = p[0] + sx*p[1] + p[2]*sx*sy;
+        *(buffer+offset) = ::fwTools::numericRoundCast<IMAGE>(param.value);
+    }
+
+};
+
+
+
+//------------------------------------------------------------------------------
+
+template < typename T >
+void MedicalImageHelpers::setPixel(::fwData::Image::sptr image, ::fwData::Point::sptr point, T &value)
+{
+    setPixel(image, point->getCoord(), value);
+}
+
+
+//------------------------------------------------------------------------------
+
+template < typename T , typename INT_INDEX>
+void MedicalImageHelpers::setPixel(::fwData::Image::sptr image, INT_INDEX &point, T &value)
+{
+    typename CastAndSetFunctor<T,INT_INDEX>::Param param(point, value);
+    param.image = image;
+
+    ::fwTools::DynamicType type = image->getPixelType();
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , CastAndSetFunctor<T, INT_INDEX> >::invoke( type, param );
+}
+
+
+
+//------------------------------------------------------------------------------
+
+template < typename T >
+SPTR( ::fwData::Image::BufferType ) MedicalImageHelpers::getPixelBufferInImageSpace(::fwData::Image::sptr image, T &value)
+{
+    typename PixelCastAndSetFunctor<T>::Param param(value);
+
+    ::fwTools::DynamicType type = image->getPixelType();
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , PixelCastAndSetFunctor<T> >::invoke( type, param );
+    return param.res;
+}
+
+
+
+//------------------------------------------------------------------------------
+
+template < typename INT_INDEX >
+class CastAndCheckFunctor
+{
+public:
+    class Param
+    {
+        public:
+        typedef INT_INDEX PointType;
+
+        Param(PointType &p, bool &b):
+            point(p), isNull(b)
+        {};
+
+        ::fwData::Image::sptr image;
+        const PointType &point;
+        bool &isNull;
+    };
+
+    template < typename IMAGE >
+    void operator()( Param &param )
+    {
+        ::fwComEd::helper::Image imagehelper(param.image);
+        IMAGE * buffer = static_cast < IMAGE* > (imagehelper.getBuffer());
+        const INT_INDEX &p = param.point;
+        const std::vector<boost::int32_t> &size = param.image->getCRefSize();
+        const int &sx = size[0];
+        const int &sy = size[1];
+        const int &offset = p[0] + sx*p[1] + p[2]*sx*sy;
+        param.isNull = (*(buffer+offset) == 0);
+    }
+
+};
+
+//------------------------------------------------------------------------------
+
+template < typename INT_INDEX>
+bool MedicalImageHelpers::isPixelNull(::fwData::Image::sptr image, INT_INDEX &point)
+{
+    ::fwComEd::helper::Image imageLock ( image );
+    const unsigned char imageTypeSize = image->getPixelType().sizeOf();
+    ::fwData::Image::BufferType *buf = static_cast< ::fwData::Image::BufferType *> (imageLock.getPixelBuffer(point[0], point[1], point[2]));
+
+    return isBufNull(buf, imageTypeSize);
+}
+
+//------------------------------------------------------------------------------
+
+template < typename T >
+class MinMaxFunctor
+{
+public:
+    class Param
+    {
+        public:
+
+        Param(::fwData::Image::sptr _img, T &_min, T &_max):
+            image(_img), min(_min), max(_max)
+        {};
+
+        ::fwData::Image::sptr image;
+        T &min;
+        T &max;
+    };
+
+    template < typename IMAGE >
+    void operator()( Param &param )
+    {
+        ::fwComEd::helper::Image imageLock ( param.image );
+        IMAGE * buffer = static_cast < IMAGE* > (imageLock.getBuffer());
+        const ::fwData::Image::SizeType &size = param.image->getSize();
+        ::fwData::Image::SizeType::value_type len = size[0]*size[1]*size[2];
+
+        T &min = param.min;
+        T &max = param.max;
+
+        typedef std::numeric_limits<IMAGE> ImgLimits;
+        IMAGE imin = ImgLimits::max();
+        IMAGE imax = (ImgLimits::is_integer || !ImgLimits::is_signed) ? ImgLimits::min() : - ImgLimits::max();
+
+        IMAGE * bufEnd = buffer + len;
+        IMAGE currentVoxel;
+
+        for (IMAGE * voxel = buffer; voxel < bufEnd; ++voxel )
+        {
+            currentVoxel = *voxel;
+
+            if ( currentVoxel < imin )
+            {
+                imin = currentVoxel;
+            }
+            else if (currentVoxel > imax)
+            {
+                imax = currentVoxel;
+            }
+        }
+
+        typedef std::numeric_limits<T> TLimits;
+        T minT =  (TLimits::is_integer || !ImgLimits::is_signed) ? TLimits::min() : - TLimits::max();
+        T maxT = TLimits::max();
+
+        min = ( imin < minT ) ? minT : static_cast< T > (imin) ;
+        max = ( imax > maxT ) ? maxT : static_cast< T > (imax) ;
+
+    }
+
+};
+
+
+template < typename MINMAXTYPE >
+void MedicalImageHelpers::getMinMax(const ::fwData::Image::sptr _img, MINMAXTYPE &_min, MINMAXTYPE &_max)
+{
+    typename MinMaxFunctor<MINMAXTYPE>::Param param(_img, _min, _max);
+
+    ::fwTools::DynamicType type = _img->getPixelType();
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , MinMaxFunctor<MINMAXTYPE> >::invoke( type, param );
+}
+
+
+
+} // fieldHelper
+} // fwComEd
+
+
+#endif // _FWCOMED_FIELDHELPER_MEDICALIMAGEHELPERS_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/Namespace.hpp b/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/Namespace.hpp
new file mode 100644
index 0000000..3d8622a
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/fieldHelper/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWCOMEDFIELDHELPERNAMESPACE_HPP_
+#define FWCOMEDFIELDHELPERNAMESPACE_HPP_
+
+namespace fwComEd
+{
+/**
+ * @brief       This namespace fwComEd::fieldHelper contains several helpers for using field.
+ * @namespace   fwComEd::fieldHelper
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fieldHelper
+{
+}
+
+}
+#endif /* FWCOMEDFIELDHELPERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Array.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Array.hpp
new file mode 100644
index 0000000..5d4372e
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Array.hpp
@@ -0,0 +1,183 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_HELPER_ARRAY_HPP_
+#define _FWCOMED_HELPER_ARRAY_HPP_
+
+#include <fwTools/Type.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwData/Array.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+/**
+ * @class   Array
+ * @brief   Helper to manage array buffer. Lock the buffer before to modify it.
+ * 
+ * @date    2012
+ */
+class FWCOMED_CLASS_API Array
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((Array), (((::fwData::Array::sptr))), new Array );
+
+
+    FWCOMED_API Array( ::fwData::Array::sptr array );
+
+    FWCOMED_API virtual ~Array();
+
+    /**
+     * @brief Setter for one item components of the array
+     *
+     * @param id Item id
+     * @param value Valid buffer of elements of type \<m_type\> with a length equal to \<m_nbOfComponents\> to be copied to array 'id'
+     */
+    FWCOMED_API virtual void setItem(const ::fwData::Array::IndexType &id, const void *value);
+
+    /**
+     * @brief Setter for one item component of the array
+     *
+     * @param id Item id
+     * @param component Component id to write data in.
+     * @param value Valid buffer of elements of type \<m_type\> with a length equal to \<m_nbOfComponents\> to be copied to array 'id', component n° 'component'
+     *
+     */
+    FWCOMED_API virtual void setItem(const ::fwData::Array::IndexType &id, const size_t component, const void *value);
+
+    ///
+    /**
+     * @brief Getter for a buffer item. pointer to the requested item in the buffer
+     *
+     * @param id Item id
+     * @param component Component id
+     *
+     * @return Pointer to the requested item in the buffer
+     */
+    FWCOMED_API virtual void* getItem(const ::fwData::Array::IndexType &id, const size_t component = 0);
+
+    /**
+     * @brief Typed version of getItem
+     *
+     * @tparam T Type in which the pointer will be returned
+     * @param id Item id
+     * @param component Component id
+     *
+     * @return Array buffer pointer casted to T
+     */
+    template< typename T > T* getItem(const ::fwData::Array::IndexType &id, const size_t component = 0);
+
+    /**
+     * @brief Copies the data into the buffer pointed by <value>
+     *
+     * @param id Item id
+     * @param[out] value Buffer to write into
+     */
+    FWCOMED_API virtual void getItem(const ::fwData::Array::IndexType &id, void *value) const;
+    FWCOMED_API virtual void getItem(const ::fwData::Array::IndexType &id, const size_t component, void *value) const;
+
+    /**
+     * @brief Getter for the array buffer
+     *
+     * @return Array's buffer, if exists, else NULL
+     * @{
+     */
+    FWCOMED_API virtual void *getBuffer();
+    FWCOMED_API virtual const void *getBuffer() const;
+    ///@}
+
+    /**
+     * @brief Setter for the array buffer.
+     *
+     * An existing buffer will be released if the array own it.
+     *
+     * @param buf            Buffer to set as Array's buffer
+     * @param takeOwnership  if true, the Array will manage allocation and destroy the buffer when needed.
+     * @param type           Type of the array view
+     * @param size           Size of the array view
+     * @param nbOfComponents Number of components of the array view, Min value : 1
+     */
+    FWCOMED_API void setBuffer( void *buf, bool takeOwnership,
+                                const ::fwTools::Type &type,
+                                const ::fwData::Array::SizeType &size,
+                                size_t nbOfComponents );
+
+    /// Returns the begining/end of the buffer interpreted as a char buffer
+    FWCOMED_API virtual char* begin();
+    FWCOMED_API virtual char* end();
+    FWCOMED_API virtual const char* begin() const;
+    FWCOMED_API virtual const char* end() const;
+
+
+    /// Returns the begining/end of the buffer, casted to T
+    template< typename T > T* begin();
+    template< typename T > T* end();
+
+    /**
+     * @brief Get a pointer to the value described by given parameters
+     *
+     * @param id Item id
+     * @param component Item component id
+     * @param sizeOfType size of a component
+     *
+     * @return buffer item pointer
+     * @{
+     */
+    FWCOMED_API char *getBufferPtr( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType );
+    FWCOMED_API const char *getBufferPtr( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType ) const;
+    ///@}
+
+    /// Returns a copy of current lock on array
+    FWCOMED_API ::fwMemory::BufferObject::Lock getLock() const;
+
+protected:
+
+    /**
+     * @brief Protected setter for the array buffer.
+     * An existing buffer will be released if the array own it.
+     *
+     * @param buf Buffer to set as Array's buffer
+     * @param takeOwnership if true, the Array will manage allocation and destroy the buffer when needed.
+     */
+    FWCOMED_API virtual void setBuffer(void *buf, bool takeOwnership = false);
+
+
+    ::fwData::Array::sptr m_array;
+    ::fwMemory::BufferObject::Lock m_lock;
+
+};
+
+template< typename T >
+T* Array::begin()
+{
+    return static_cast<T*>(this->getBuffer());
+}
+
+template< typename T >
+T* Array::end()
+{
+    return reinterpret_cast<T*> (static_cast<char*>(this->getBuffer()) + m_array->getSizeInBytes());
+}
+
+template< typename T >
+T* Array::getItem(const  ::fwData::Array::IndexType &id, const size_t component)
+{
+    return static_cast<T*> (this->getItem(id, component));
+}
+
+
+} // namespace helper
+
+} // namespace fwData
+
+#endif // _FWCOMED_HELPER_ARRAY_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Composite.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Composite.hpp
new file mode 100644
index 0000000..a5249f0
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Composite.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_HELPER_COMPOSITE_HPP_
+#define _FWCOMED_HELPER_COMPOSITE_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwComEd/export.hpp"
+#include "fwComEd/CompositeMsg.hpp"
+#include "fwData/Composite.hpp"
+
+
+
+namespace fwComEd
+{
+namespace helper
+{
+
+/**
+ * @brief   Defines an helper to modify an ::fwData::Composite and create in parallel the message to announce this modification.
+ * @struct  Composite
+ * 
+ * @date    2007-2009.
+ */
+class FWCOMED_CLASS_API Composite
+{
+
+public :
+
+    /// Constructor. Initialize parameters.
+    FWCOMED_API Composite( ::fwData::Composite::wptr _composite );
+
+    /// Destrucotr. Do nothing.
+    FWCOMED_API ~Composite();
+
+    /**
+     * @brief Add an object in the composite.
+     * @param[in] _compositeKey key of the object in the composite.
+     * @param[in] _newObject    object to add in the composite
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void add( std::string _compositeKey, ::fwData::Object::sptr _newObject );
+
+    /**
+     * @brief Remove an object in the composite.
+     * @param[in] _compositeKey key of the object in the composite.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void remove( std::string _compositeKey );
+
+    /**
+     * @brief Clear all objects in the composite.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void clear();
+
+    /**
+     * @brief Replace an object in the composite.
+     * @param[in] _compositeKey key of the object in the composite.
+     * @param[in] _newObject    the new object to add in the composite.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void swap( std::string _compositeKey, ::fwData::Object::sptr _newObject );
+
+    /// Send the message of modification
+    FWCOMED_API void notify( ::fwServices::IService::sptr _serviceSource );
+
+private :
+
+    ::fwComEd::CompositeMsg::sptr m_compositeMsg;
+    ::fwData::Composite::wptr m_composite;
+};
+
+} // namespace helper
+} // namespace fwComEd
+
+#endif // _FWCOMED_HELPER_COMPOSITE_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Field.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Field.hpp
new file mode 100644
index 0000000..2ff48b4
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Field.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_HELPER_FIELD_HPP_
+#define _FWCOMED_HELPER_FIELD_HPP_
+
+#include <fwServices/IService.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwData/Object.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+namespace helper
+{
+
+/**
+ * @brief   Defines an helper to modify field on a ::fwData::Object and create a message notifying this modification.
+ * 
+ * @date    2007-2009.
+ */
+class FWCOMED_CLASS_API Field
+{
+
+public :
+
+    /// Constructor. Initialize parameters.
+    FWCOMED_API Field( ::fwData::Object::sptr object );
+
+    /// Destructor. Do nothing.
+    FWCOMED_API ~Field();
+
+    /**
+     * @brief Returns a pointer of corresponding field. If field did not exist, it is set to defaultValue if defaultValue is not null.
+     * @param[in] name Field name
+     * @param[in] defaultValue default return value if field was not found
+     * @return pointer to corresponding field.
+     */
+    template< typename DATA_TYPE >
+    SPTR(DATA_TYPE) setDefaultField( const ::fwData::Object::FieldNameType& name, SPTR(DATA_TYPE) defaultValue );
+
+    /**
+     * @brief Register field with specified name. If the name does already exist, the matching field will be replaced.
+     */
+    FWCOMED_API void setField( const ::fwData::Object::FieldNameType & name, ::fwData::Object::sptr obj );
+
+    /**
+     * @brief Replace the field map content.
+     */
+    FWCOMED_API void setFields( const ::fwData::Object::FieldMapType & newFields );
+
+    /**
+     * @brief Updates the field map content with fieldMap. Duplicated name will be replaced.
+     */
+    FWCOMED_API void updateFields( const ::fwData::Object::FieldMapType & fieldMap );
+
+    /**
+     * @brief Removes field with specified name.
+     */
+    FWCOMED_API void removeField( const ::fwData::Object::FieldNameType &name );
+
+    /// Send the built message
+    FWCOMED_API void notify( ::fwServices::IService::sptr _serviceSource );
+
+protected:
+    FWCOMED_API void buildMessage(
+            const ::fwData::Object::FieldMapType &oldFields,
+            const ::fwData::Object::FieldMapType &newFields
+            );
+
+    ::fwServices::ObjectMsg::sptr m_objectMsg;
+
+    ::fwData::Object::wptr m_object;
+};
+
+
+
+template<typename DATA_TYPE>
+inline SPTR(DATA_TYPE) Field::setDefaultField(const fwData::Object::FieldNameType& name, SPTR(DATA_TYPE) defaultValue)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    ::fwData::Object::sptr object = m_object.lock();
+    ::fwData::Object::sptr field = object->getField(name);
+    if (!field)
+    {
+        m_objectMsg->appendAddedField(name, defaultValue);
+    }
+    return object->setDefaultField(name, defaultValue);
+}
+
+} // namespace helper
+} // namespace fwComEd
+
+#endif // _FWCOMED_HELPER_FIELD_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Image.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Image.hpp
new file mode 100644
index 0000000..181bbaa
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Image.hpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_IMAGE_HPP_
+#define _FWCOMED_IMAGE_HPP_
+
+#include <fwData/Image.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "fwComEd/export.hpp"
+#include "fwComEd/ImageMsg.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+/**
+ * @brief   Defines an helper to modify an ::fwData::Image by adding few medical fields
+ * and create in parallel the message to announce these modifications.
+ * @struct  Image
+ * 
+ * @date    2007-20012.
+ */
+class FWCOMED_CLASS_API Image
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((Image), (((::fwData::Image::sptr))), new Image );
+
+    typedef ::fwData::Image::SizeType SizeType;
+    typedef ::fwData::Image::IndexType IndexType;
+    typedef ::fwData::Image::BufferType BufferType;
+    typedef ::fwData::Image::BufferIndexType BufferIndexType;
+
+    /// Constructor. Initialize parameters.
+    FWCOMED_API Image( ::fwData::Image::sptr image );
+
+    /// Destrucotr. Do nothing.
+    FWCOMED_API virtual ~Image();
+
+    /**
+     * @brief Create landmark fields if not exist, NOT GENERATE MESSAGE.
+     *
+     * If the image hasn't landmark field, it is added and the method return true.
+     *
+     * @return true if the field is added.
+     */
+    FWCOMED_API bool createLandmarks();
+
+    /**
+     * @brief Create transfer function pool if the pool is not present, NOT GENERATE MESSAGE.
+     *
+     * If the image has not transfer functions, the pool is
+     * created and a grey level transfer function is added.
+     */
+    FWCOMED_API bool createTransferFunctionPool(::fwServices::IService::sptr serviceSource = ::fwServices::IService::sptr() );
+
+    /**
+     * @brief Create slice index if indexes are not present, NOT GENERATE MESSAGE.
+     *
+     * If the image hasn't frontal, axial and sagittal slice index fields, they are added.
+     *
+     * @return true if the fields are added.
+     */
+    FWCOMED_API bool createImageSliceIndex();
+
+    /// Send the message of modification
+    FWCOMED_API void notify( ::fwServices::IService::sptr _serviceSource );
+
+    /// Returns image buffer
+    FWCOMED_API void * getBuffer();
+
+    /** @{
+     * @brief Helpers for 3D images
+     */
+    FWCOMED_API void* getPixelBuffer( SizeType::value_type x, SizeType::value_type y, SizeType::value_type z );
+
+    FWCOMED_API void* getPixelBuffer( IndexType index );
+
+    FWCOMED_API void setPixelBuffer( IndexType index , Image::BufferType * pixBuf);
+
+    FWCOMED_API const std::string getPixelAsString(SizeType::value_type x,
+                                                   SizeType::value_type y,
+                                                   SizeType::value_type z );
+    // @}
+
+    /// Returns a copy of current lock on image
+    FWCOMED_API ::fwMemory::BufferObject::Lock getLock() const;
+
+private :
+
+    ::fwComEd::ImageMsg::sptr m_imageMsg;
+
+    ::fwData::Image::sptr m_image;
+
+    ::fwMemory::BufferObject::Lock m_lock;
+};
+
+} // helper
+} // fwComEd
+
+
+#endif // _FWCOMED_IMAGE_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hpp
new file mode 100644
index 0000000..2a222ea
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_IMAGEGETTER_HPP_
+#define _FWCOMED_IMAGEGETTER_HPP_
+
+#include <vector>
+
+#include <fwData/Image.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+
+template < typename SERVICE = ::fwServices::IService >
+class FWCOMED_CLASS_API ImageGetter
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (ImageGetter) );
+
+    ::fwData::Image::sptr getImage();
+};
+
+
+} //namespace helper
+
+} //namespace fwComEd
+
+#include "fwComEd/helper/ImageGetter.hxx"
+
+#endif // _FWCOMED_IMAGEGETTER_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hxx b/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hxx
new file mode 100644
index 0000000..791f36f
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/ImageGetter.hxx
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef _FWCOMED_IMAGEGETTER_HXX_
+#define _FWCOMED_IMAGEGETTER_HXX_
+
+#include <fwData/Image.hpp>
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+template < typename SERVICE >
+::fwData::Image::sptr ImageGetter< SERVICE >::getImage()
+{
+    SERVICE *image = dynamic_cast< SERVICE* > (this);
+    return image->template getObject< ::fwData::Image >();
+}
+
+} //namespace helper
+
+} //namespace fwComEd
+
+
+
+#endif // _FWCOMED_IMAGEGETTER_HXX_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/MedicalImageAdaptor.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/MedicalImageAdaptor.hpp
new file mode 100644
index 0000000..4b9c25b
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/MedicalImageAdaptor.hpp
@@ -0,0 +1,345 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_MEDICALIMAGEADAPTOR_HPP_
+#define _FWCOMED_MEDICALIMAGEADAPTOR_HPP_
+
+#include <vector>
+
+#include <fwCom/Connection.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include "fwComEd/TransferFunctionMsg.hpp"
+#include "fwComEd/helper/ImageGetter.hpp"
+#include "fwComEd/export.hpp"
+
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+/**
+ * @class   MedicalImageAdaptor
+ * @brief   Helpers for medical image.
+ * 
+ * @date    2010
+ */
+class FWCOMED_CLASS_API MedicalImageAdaptor
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (MedicalImageAdaptor) );
+
+
+    /// Image orientation
+    typedef enum {
+        X_AXIS = 0,
+        Y_AXIS,
+        Z_AXIS
+    } Orientation ;
+
+    /// Destructor. Do nothing.
+    FWCOMED_API virtual ~MedicalImageAdaptor();
+
+    /// Set the image orientation.
+    FWCOMED_API void setOrientation( Orientation orientation );
+
+    /// Return the image orientation.
+    Orientation getOrientation(){ return m_orientation; }
+
+
+
+    /**
+     * @brief Set the tf pool and the key that represents the current selection of TransferFunction.
+     */
+    FWCOMED_API void setTFParameters( ::fwData::Composite::sptr tfPool, std::string tfSelectionId );
+
+    /// Set TF Selection fwID
+    FWCOMED_API void setTFSelectionFwID( const std::string & fwid );
+
+    /// Get TF Selection fwID
+    FWCOMED_API const std::string & getTFSelectionFwID() const;
+
+    /// Set selected TF Key
+    FWCOMED_API void setSelectedTFKey( const std::string & key );
+
+    /// Get selected TF Key
+    FWCOMED_API const std::string & getSelectedTFKey() const;
+
+    /// Set selected TF Key and TF Selection fwID from config
+    FWCOMED_API void parseTFConfig( ::fwRuntime::ConfigurationElement::sptr configuration );
+
+    /// Get the window of the selected tf
+    FWCOMED_API double getWindow() const;
+
+    /// Set the window of the selected tf
+    FWCOMED_API void setWindow( double window );
+
+    /// Set the window level of the selected tf from window min/max
+    FWCOMED_API void setWindowLevel( double windowMin, double windowMax );
+
+    /// Get the level of the selected tf
+    FWCOMED_API double getLevel() const;
+
+    /// Set the level of the selected tf
+    FWCOMED_API void setLevel( double level );
+
+protected:
+
+
+    /// Constructor. Do nothing.
+    FWCOMED_API MedicalImageAdaptor(); // this class VISUVTKADAPTOR_CLASS_API must be specialized
+
+    /**
+     * @brief Set the orientation of the image.
+     * @param[in] orientation must be 0 (X_AXIS), 1 (Y_AXIS) or 2 (Z_AXIS).
+     */
+    FWCOMED_API void setOrientation( int orientation );
+
+    /**
+     * @brief Get the image spacing.
+     * @param[out] spacing : the image spacing
+     */
+    FWCOMED_API void getImageSpacing(double spacing[3]);
+
+    /**
+     * @brief Get the image origin.
+     * @param[out] origin : the image origin
+     */
+    FWCOMED_API void getImageOrigin(double origin[3]);
+
+    /**
+     * @brief Get the image data size (number of slices).
+     * @param[out] size : the image size
+     */
+    FWCOMED_API void getImageDataSize(int size[3]);
+
+    /**
+     * @brief Get the image size ( = dataSize * spacing ).
+     * @param[out] size : the image size
+     */
+    FWCOMED_API void getImageSize(double size[3]);
+
+    /**
+     * @brief Get the slice center
+     * @param[out] center : the slice center
+     */
+    FWCOMED_API void getCurrentSliceCenter(double center[3]);
+
+    // Retrieve the grey level from an image from physical world
+    //float getPixelvalue( double worldPosition[3]);
+
+    /**
+     * @brief Convert world coordinates to slice index coordinates
+     * @param[in] world : coordinate in the world
+     * @param[out] index : coordinate in the slice index
+     */
+    FWCOMED_API void worldToSliceIndex(const double world[3],int index[3] );
+
+    /**
+     * @brief Convert coordinates in the world to coordinates in the image
+     * @param[in] world : coordinate in the world
+     * @param[out] index : coordinate in the image
+     */
+    FWCOMED_API void worldToImageSliceIndex(const double world[3], int index[3] );
+
+    /**
+     * @brief Convert from world coordinates system to image coordinates system
+     * @param[in] index : coordinate in the image
+     * @param[out] world : coordinate in the world
+     */
+    FWCOMED_API void sliceIndexToWorld(const int index[3], double world[3] );
+
+    /**
+     * @brief Get the image spacing.
+     * @param[out] spacing : the image spacing
+     */
+    template< typename FLOAT_ARRAY_3 >
+    void getImageSpacing(FLOAT_ARRAY_3 spacing);
+
+    /**
+     * @brief Get the image data size (number of slices).
+     * @param[out] size : the image size
+     */
+    template< typename INT_INDEX >
+    void getImageDataSize(INT_INDEX size);
+
+    /**
+     * @brief Convert world coordinates to slice index coordinates
+     * @param[in] world : coordinate in the world
+     * @param[out] index : coordinate in the slice index
+     */
+    template< typename WORLD, typename INT_INDEX >
+    void worldToSliceIndex(const WORLD world, INT_INDEX index );
+
+    /**
+     * @brief Convert coordinates in the world to coordinates in the image
+     * @param[in] world : coordinate in the world
+     * @param[out] index : coordinate in the image
+     */
+    template< typename WORLD, typename INT_INDEX >
+    void worldToImageSliceIndex(const WORLD world, INT_INDEX index );
+
+
+
+
+    /**
+     * @brief Return the 4 points of the image plane
+     *
+     * - points are ordered in the following way : image origin is the first point
+     * - points are inserted using the preference follow X axis if exists, if not exists follow Y axis
+     * if Y axis is not present follow Z axis
+     */
+    FWCOMED_API void getPlane( double points[4][3], int sliceNumber );
+
+    /// Set the slice index
+    FWCOMED_API bool setSliceIndex(const int index[3]);
+    /// Get the slice index
+    FWCOMED_API void getSliceIndex(::fwData::Integer::sptr index[3]);
+
+    /// Get the current transfer function
+    FWCOMED_API ::fwData::TransferFunction::sptr getTransferFunction() const;
+
+    /// Get the current transfer function selection
+    FWCOMED_API ::fwData::Composite::sptr getTransferFunctionSelection() const;
+
+    /// Update the image information (slice index, min/max,...)
+    FWCOMED_API void updateImageInfos( ::fwData::Image::sptr image  );
+
+    /// Update the transfer function information
+    FWCOMED_API void updateTransferFunction( ::fwData::Image::sptr image, ::fwServices::IService::sptr srv );
+
+    /// Return the image
+    FWCOMED_API ::fwData::Image::sptr getImage();
+
+    /// Image orientation
+    Orientation m_orientation;
+
+    /// Current image
+    ::fwData::Image::wptr m_weakImage;
+
+    /// Axial slice index
+    ::fwData::Integer::sptr m_axialIndex;
+    /// Frontal slice index
+    ::fwData::Integer::sptr m_frontalIndex;
+    /// Sagittal slice index
+    ::fwData::Integer::sptr m_sagittalIndex;
+
+    // Install TF pool event handler (CHANGED_KEYS, ADDED_KEYS and REMOVED_KEYS)
+    FWCOMED_API void installTFSelectionEventHandler( ::fwServices::IService* srv );
+
+    // Install TF Observer ( com channel )
+    FWCOMED_API void installTFObserver( ::fwServices::IService::sptr srv );
+
+    // Remove TF Observer ( com channel )
+    FWCOMED_API void removeTFObserver();
+
+    FWCOMED_API bool upadteTFObserver(::fwServices::ObjectMsg::csptr msg, ::fwServices::IService::sptr srv);
+
+    // Helper to send a windowing notification in the current tf
+    FWCOMED_API ::fwComEd::TransferFunctionMsg::sptr notifyTFWindowing( ::fwServices::IService::sptr srv );
+
+private :
+
+    ::fwCom::Connection m_tfSelectionConnection;
+    ::fwCom::Connection m_tfConnection;
+
+    /// Transfer function selection
+    ::fwData::Composite::wptr m_tfSelection;
+
+    /// fwID of tf selections ( used during configuration )
+    std::string m_tfSelectionFwID;
+
+    /// Identifier of the key containing the current selection of TransferFunction in TFSelection
+    std::string m_selectedTFKey;
+
+};
+
+struct Image0 {} ;
+struct Image1 {} ;
+
+template < typename IMAGEID >
+class FWCOMED_CLASS_API MedicalImageAdaptorTpl : public MedicalImageAdaptor
+{};
+
+typedef MedicalImageAdaptorTpl<Image0> MedicalImageAdaptorImg0;
+typedef MedicalImageAdaptorTpl<Image1> MedicalImageAdaptorImg1;
+
+
+//------------------------------------------------------------------------------
+template< typename FLOAT_ARRAY_3 >
+void MedicalImageAdaptor::getImageSpacing(FLOAT_ARRAY_3 spacing)
+{
+    ::fwData::Image::sptr image = this->getImage();;
+
+    const ::fwData::Image::SpacingType imSpacing = image->getSpacing();
+    std::copy(imSpacing.begin(), imSpacing.end(), spacing);
+}
+
+//------------------------------------------------------------------------------
+template< typename INT_INDEX >
+void MedicalImageAdaptor::getImageDataSize(INT_INDEX size)
+{
+    ::fwData::Image::sptr image = this->getImage();
+
+    const ::fwData::Image::SizeType imSize = image->getSize();
+    std::copy(imSize.begin(), imSize.end(), size);
+}
+
+//------------------------------------------------------------------------------
+
+template< typename WORLD, typename INT_INDEX >
+void MedicalImageAdaptor::worldToSliceIndex(const WORLD world, INT_INDEX index )
+{
+    double spacing[3];
+    this->getImageSpacing(spacing);
+    double origin[3];
+    this->getImageOrigin(origin);
+    for ( int i=0 ; i<3 ; ++i )
+    {
+        index[i] = static_cast< int >( ( (world[i] - origin[i])/spacing[i] ) + ( ( (world[i] - origin[i])/spacing[i] ) >= 0 ? 0.5 : -0.5 ) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template< typename WORLD, typename INT_INDEX >
+void MedicalImageAdaptor::worldToImageSliceIndex(const WORLD world, INT_INDEX index )
+{
+    int imageSize[3];
+    this->getImageDataSize(imageSize);
+    this->worldToSliceIndex(world, index);
+
+    int idval;
+    for (int i = 0; i < 3; i++)
+    {
+        int max = imageSize[i]-1;
+        idval = index[i];
+        if (idval < 0)
+        {
+            index[i] = 0;
+        }
+        else if (idval > max)
+        {
+            index[i] = max;
+        }
+    }
+}
+
+} //namespace helper
+
+} //namespace fwComEd
+
+#endif // _FWCOMED_MEDICALIMAGEADAPTOR_HPP_
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Mesh.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Mesh.hpp
new file mode 100644
index 0000000..26be7dc
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Mesh.hpp
@@ -0,0 +1,229 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_HELPER_MESH_HPP_
+#define _FWCOMED_HELPER_MESH_HPP_
+
+#include <fwTools/Type.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwData/Mesh.hpp>
+
+#include "fwComEd/helper/Array.hpp"
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+/**
+ * @class   Mesh
+ * @brief   Helper to manage Mesh. Lock the mesh buffer before to modify it.
+ * 
+ * @date    2012
+ */
+class FWCOMED_CLASS_API Mesh
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((Mesh), (((::fwData::Mesh::sptr))), new Mesh );
+
+    FWCOMED_API Mesh( ::fwData::Mesh::sptr mesh );
+
+    FWCOMED_API virtual ~Mesh();
+
+    /// Updates locks on all internal data Array of Mesh
+    FWCOMED_API void updateLock();
+
+    /**
+     * @brief Insert a point into the mesh.
+     * Reallocates the point array if needed.
+     *
+     * @param p point coordinates
+     *
+     * @return The id of the new point
+     *
+     * @throw ::fwData::Exception
+     */
+    FWCOMED_API  ::fwData::Mesh::Id insertNextPoint(const ::fwData::Mesh::PointValueType p[3])
+    throw(::fwData::Exception);
+
+    /**
+     * @brief Insert a point into the mesh.
+     * @see insertNextPoint
+     */
+    FWCOMED_API ::fwData::Mesh::Id insertNextPoint(::fwData::Mesh::PointValueType x,
+                                                   ::fwData::Mesh::PointValueType y,
+                                                   ::fwData::Mesh::PointValueType z) throw(::fwData::Exception);
+
+    /**
+      * @brief Set a point coordinates.
+      * The mesh must be allocated before calling this method.
+      *
+      * @param id point index
+      * @param p point coordinates
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API void setPoint(::fwData::Mesh::Id id, const ::fwData::Mesh::PointValueType p[3]);
+
+     /**
+      * @brief Set a point coordinates.
+      * @see setPoint
+      */
+     FWCOMED_API void setPoint(::fwData::Mesh::Id id,
+                               ::fwData::Mesh::PointValueType x,
+                               ::fwData::Mesh::PointValueType y,
+                               ::fwData::Mesh::PointValueType z);
+
+     /**
+      * @brief Set a point color.
+      *
+      * Depending on the type of allocated point-colors array (RGB or RGBA), 3
+      * or 4 points will be read from p.
+      * The color array must be allocated before calling this method.
+      *
+      * @param id point index
+      * @param c color
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API void setPointColor(::fwData::Mesh::Id id, const ::fwData::Mesh::ColorValueType c[4]);
+
+     /**
+      * @brief Set a cell color.
+      *
+      * Depending on the type of allocated cell-colors array (RGB or RGBA), 3 or
+      * 4 points will be read from p.
+      * The color array must be allocated before calling this method.
+      *
+      * @param id cell index
+      * @param c color
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API void setCellColor(::fwData::Mesh::Id id, const ::fwData::Mesh::ColorValueType c[4]);
+
+     /**
+      * @brief Set a point normal.
+      *
+      * The normal array must be allocated before calling this method.
+      *
+      * @param id point index
+      * @param n normal
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API void setPointNormal(::fwData::Mesh::Id id, const ::fwData::Mesh::NormalValueType n[3]);
+
+     /**
+      * @brief Set a cell normal.
+      *
+      * The normal array must be allocated before calling this method.
+      *
+      * @param id cell index
+      * @param n normal
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API void setCellNormal(::fwData::Mesh::Id id, const ::fwData::Mesh::NormalValueType n[3]);
+
+     /**
+      * @brief Insert a cell into the mesh.
+      *
+      * Reallocates the mesh concerned arrays if needed.
+      *
+      * @return The id of the new cell
+      *
+      * @throw ::fwData::Exception
+      */
+     FWCOMED_API ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellTypesEnum type,
+                                                   const ::fwData::Mesh::CellValueType *cell,
+                                                   size_t nb ) throw(::fwData::Exception);
+     /**
+      * @brief Insert a cell into the mesh.
+      * @see insertNextCell
+      */
+     FWCOMED_API ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellValueType p)  throw(::fwData::Exception);
+     /**
+      * @brief Insert a cell into the mesh.
+      * @see insertNextCell
+      */
+     FWCOMED_API ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellValueType p1,
+                                                   ::fwData::Mesh::CellValueType p2 ) throw(::fwData::Exception);
+     /**
+      * @brief Insert a cell into the mesh.
+      * @see insertNextCell
+      */
+     FWCOMED_API ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellValueType p1,
+                                                   ::fwData::Mesh::CellValueType p2,
+                                                   ::fwData::Mesh::CellValueType p3 ) throw(::fwData::Exception);
+     /**
+      * @brief Insert a cell into the mesh.
+      * @see insertNextCell
+      */
+     FWCOMED_API ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellValueType p1,
+                                                   ::fwData::Mesh::CellValueType p2,
+                                                   ::fwData::Mesh::CellValueType p3,
+                                                   ::fwData::Mesh::CellValueType p4 ) throw(::fwData::Exception);
+     /**
+      * @brief Insert a cell into the mesh.
+      * @see insertNextCell
+      */
+     template <typename T> ::fwData::Mesh::Id insertNextCell(::fwData::Mesh::CellTypesEnum type,
+                                                             const T &pointsBegin,
+                                                             const T &pointsEnd ) throw(::fwData::Exception);
+
+
+
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::PointsMultiArrayType          getPoints() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::CellTypesMultiArrayType       getCellTypes() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::CellDataMultiArrayType        getCellData() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::CellDataOffsetsMultiArrayType getCellDataOffsets() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::PointColorsMultiArrayType     getPointColors() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::CellColorsMultiArrayType      getCellColors() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::PointNormalsMultiArrayType    getPointNormals() const;
+     /// Returns the internal corresponding array as a boost::multi_array_ref
+     FWCOMED_API ::fwData::Mesh::CellNormalsMultiArrayType     getCellNormals() const;
+
+     /// Returns the internal ::fwData::Mesh
+     FWCOMED_API ::fwData::Mesh::csptr getMesh() const;
+
+     /*!
+      * @brief Return true if the mesh is closed.
+      * The result is computed for each call.
+      */
+     FWCOMED_API bool isClosed();
+
+protected:
+
+    ::fwData::Mesh::sptr m_mesh;
+
+    ::fwComEd::helper::Array::sptr m_helperPoints;
+    ::fwComEd::helper::Array::sptr m_helperCellTypes;
+    ::fwComEd::helper::Array::sptr m_helperCellData;
+    ::fwComEd::helper::Array::sptr m_helperCellDataOffsets;
+    ::fwComEd::helper::Array::sptr m_helperPointColors;
+    ::fwComEd::helper::Array::sptr m_helperCellColors;
+    ::fwComEd::helper::Array::sptr m_helperPointNormals;
+    ::fwComEd::helper::Array::sptr m_helperCellNormals;
+
+};
+
+
+} // namespace helper
+
+} // namespace fwData
+
+#endif // _FWCOMED_HELPER_MESH_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/MsgHelper.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/MsgHelper.hpp
new file mode 100644
index 0000000..0cc0171
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/MsgHelper.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_HELPER_MSGHELPER_HPP_
+#define _FWCOMED_HELPER_MSGHELPER_HPP_
+
+
+#include <fwServices/IService.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+/**
+ * @class   MsgHelper
+ * @brief   This class contains helpers for Messages.
+ * 
+ * @date    2010.
+ */
+class FWCOMED_CLASS_API MsgHelper
+{
+public :
+
+    /**
+     * @brief       Creates associated ObjectMsg for the ::fwData::Object.
+     *
+     * @param[in]   _obj a specific ::fwData::Object.
+     * @return      ObjectMsg associated to the ::fwData::Object.
+     */
+    FWCOMED_API static ::fwServices::ObjectMsg::sptr createAssociatedMsg( ::fwData::Object::csptr _obj);
+
+    /**
+     * @brief       Returns associated ObjectMsg type for the ::fwData::Object.
+     *
+     * @param[in]   _obj a specific ::fwData::Object.
+     * @return      a std::string with the ObjectMsg type associated to the ::fwData::Object.
+     */
+    FWCOMED_API static const std::string getAssociatedMsgType( ::fwData::Object::csptr _obj);
+};
+
+} // helper
+} // fwComEd
+
+#endif /* _FWCOMED_HELPER_MSGHELPER_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Namespace.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Namespace.hpp
new file mode 100644
index 0000000..40a6fdc
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWCOMEDHELPERNAMESPACE_HPP_
+#define FWCOMEDHELPERNAMESPACE_HPP_
+
+namespace fwComEd
+{
+/**
+ * @brief       This namespace fwComEd::helper contains several helpers for using data like Image, Composite, Message.
+ * @namespace   fwComEd::helper
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace helper
+{
+}
+
+}
+#endif /* FWCOMEDHELPERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/SeriesDB.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/SeriesDB.hpp
new file mode 100644
index 0000000..877e980
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/SeriesDB.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_HELPER_SERIESDB_HPP__
+#define __FWCOMED_HELPER_SERIESDB_HPP__
+
+#include <fwServices/IService.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include "fwComEd/export.hpp"
+#include "fwComEd/SeriesDBMsg.hpp"
+
+
+
+namespace fwComEd
+{
+namespace helper
+{
+
+/**
+ * @brief Defines an helper to modify an ::fwMedData::SeriesDB and create in parallel the message to announce this modification.
+ * @class  SeriesDB
+ * @date  2007-20013.
+ */
+class FWCOMED_CLASS_API SeriesDB
+{
+
+public :
+
+    /// Constructor. Initialize parameters.
+    FWCOMED_API SeriesDB( ::fwMedData::SeriesDB::wptr seriesDB );
+
+    /// Destrucotr. Do nothing.
+    FWCOMED_API ~SeriesDB();
+
+    /**
+     * @brief Add a Series in the SeriesDB.
+     * @param[in] newSeries object to add in the SeriesDB
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void add( ::fwMedData::Series::sptr newSeries );
+
+    /**
+     * @brief Remove a Series in the SeriesDB.
+     * @param[in] oldSeries object to remove from the SeriesDB.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void remove( ::fwMedData::Series::sptr oldSeries );
+
+    /**
+     * @brief Clear all series in the SeriesDB.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void clear();
+
+    /**
+     * @brief Merge seriesDBIn all series from seriesDBIn to the SeriesDB.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void merge(::fwMedData::SeriesDB::sptr seriesDBIn);
+
+    /// Send the message of modification
+    FWCOMED_API void notify( ::fwServices::IService::sptr serviceSource, bool notifySource = false );
+
+private :
+
+    ::fwComEd::SeriesDBMsg::sptr m_seriesDBMsg;
+    ::fwMedData::SeriesDB::wptr m_seriesDB;
+};
+
+} // namespace helper
+} // namespace fwComEd
+
+#endif // __FWCOMED_HELPER_SERIESDB_HPP__
diff --git a/SrcLib/core/fwComEd/include/fwComEd/helper/Vector.hpp b/SrcLib/core/fwComEd/include/fwComEd/helper/Vector.hpp
new file mode 100644
index 0000000..7724720
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/helper/Vector.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_HELPER_VECTOR_HPP__
+#define __FWCOMED_HELPER_VECTOR_HPP__
+
+#include <fwServices/IService.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include "fwComEd/export.hpp"
+#include "fwComEd/VectorMsg.hpp"
+
+
+
+namespace fwComEd
+{
+namespace helper
+{
+
+/**
+ * @brief   Defines an helper to modify an ::fwData::Vector and create in parallel the message to announce this modification.
+ * @class  Vector
+ * 
+ * @date    2007-20013.
+ */
+class FWCOMED_CLASS_API Vector
+{
+
+public :
+
+    /// Constructor. Initialize parameters.
+    FWCOMED_API Vector( ::fwData::Vector::wptr vector );
+
+    /// Destrucotr. Do nothing.
+    FWCOMED_API ~Vector();
+
+    /**
+     * @brief Add an object in the vector.
+     * @param[in] _newObject    object to add in the vector
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void add( ::fwData::Object::sptr _newObject );
+
+    /**
+     * @brief Remove an object in the vector.
+     * @param[in] _oldObject object to remove from the vector.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void remove( ::fwData::Object::sptr _oldObject );
+
+    /**
+     * @brief Clear all objects in the vector.
+     *
+     * Prepare the message to announce the modification.
+     */
+    FWCOMED_API void clear();
+
+    /// Send the message of modification
+    FWCOMED_API void notify( ::fwServices::IService::sptr _serviceSource, bool notifySource=false );
+
+private :
+
+    ::fwComEd::VectorMsg::sptr m_vectorMsg;
+    ::fwData::Vector::wptr m_vector;
+};
+
+} // namespace helper
+} // namespace fwComEd
+
+#endif // __FWCOMED_HELPER_VECTOR_HPP__
diff --git a/SrcLib/core/fwComEd/include/fwComEd/parser/Composite.hpp b/SrcLib/core/fwComEd/include/fwComEd/parser/Composite.hpp
new file mode 100644
index 0000000..f6adc79
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/parser/Composite.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PARSER_COMPOSITE_HPP_
+#define _FWCOMED_PARSER_COMPOSITE_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IXMLParser.hpp>
+
+#include <fwServices/AppConfigManager.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+namespace parser
+{
+/**
+ * @brief   Specific service for the construction of a Composite and its associated services from an XML-based description.
+ * @class   Composite
+ * 
+
+ * @date    2007-2009
+ * @see     ::fwServices::IXMLParser
+ */
+class FWCOMED_CLASS_API Composite : public ::fwServices::IXMLParser
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (Composite)(::fwServices::IXMLParser) ) ;
+
+    /**
+     * @brief   Constructor : does nothing.
+     */
+    Composite( ) {};
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~Composite() {};
+
+    FWCOMED_API void createConfig( ::fwTools::Object::sptr _obj );
+
+    FWCOMED_API void startConfig();
+
+    FWCOMED_API void updateConfig();
+
+    FWCOMED_API void stopConfig();
+
+    FWCOMED_API void destroyConfig();
+
+protected:
+
+    /**
+     * @brief   Updating method : create composite object.
+     *
+     * Parse the composite configuration element to configure and add its objects.
+     */
+    FWCOMED_API virtual void updating( ) throw(fwTools::Failed) ;
+
+private :
+
+    /// To verify some conditions in xml file
+    bool refObjectValidator( ::fwRuntime::ConfigurationElement::sptr _cfgElement );
+
+    std::vector< ::fwServices::AppConfigManager::sptr > m_ctmContainer;
+};
+
+} //namespace parser
+} //namespace fwcomEd
+
+#endif /* _FWCOMED_PARSER_COMPOSITE_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/parser/GenericField.hpp b/SrcLib/core/fwComEd/include/fwComEd/parser/GenericField.hpp
new file mode 100644
index 0000000..2c38322
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/parser/GenericField.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PARSER_GENERICFIELD_HPP_
+#define _FWCOMED_PARSER_GENERICFIELD_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IXMLParser.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+namespace parser
+{
+/**
+ * @brief   Specific service for the construction of a GenericField and its associated services from an XML-based description.
+ * @class   TransformationMatrix3D
+ * 
+
+ * @date    2007-2009
+ * @see     ::fwServices::IXMLParser
+ */
+class FWCOMED_CLASS_API GenericField  : public ::fwServices::IXMLParser
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (GenericField)(::fwServices::IXMLParser) ) ;
+
+    /// Constructor : does nothing.
+    GenericField() {};
+
+    /// Destructor : does nothing.
+    virtual ~GenericField() {};
+
+    FWCOMED_API void createConfig( ::fwTools::Object::sptr _obj );
+protected:
+
+    /**
+     * @brief Updating method : create the process object.
+     *
+     * Parse the configuration element to configure inputs and outputs and add
+     * them in the process object.
+     */
+    FWCOMED_API virtual void updating( ) throw(fwTools::Failed) ;
+
+};
+
+class BooleanParser : public GenericField{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (BooleanParser)(::fwServices::IXMLParser) ) ;
+};
+class IntegerParser : public GenericField{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (IntegerParser)(::fwServices::IXMLParser) ) ;
+};
+class FloatParser : public GenericField{
+public:
+        fwCoreServiceClassDefinitionsMacro ( (FloatParser)(::fwServices::IXMLParser) ) ;
+};
+class StringParser : public GenericField{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (StringParser)(::fwServices::IXMLParser) ) ;
+};
+
+} //namespace parser
+} //namespace fwComEd
+
+#endif // _FWCOMED_PARSER_GENERICFIELD_HPP_
diff --git a/SrcLib/core/fwComEd/include/fwComEd/parser/List.hpp b/SrcLib/core/fwComEd/include/fwComEd/parser/List.hpp
new file mode 100644
index 0000000..26e13b9
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/parser/List.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PARSER_LIST_HPP_
+#define _FWCOMED_PARSER_LIST_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IXMLParser.hpp>
+
+#include <fwServices/AppConfigManager.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+namespace parser
+{
+/**
+ * @brief   Specific service for the construction of a List and its associated services from an XML-based description.
+ * @class   List
+ * 
+
+ * @date    2007-2009
+ * @see     ::fwServices::IXMLParser
+ */
+class FWCOMED_CLASS_API List : public ::fwServices::IXMLParser
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (List)(::fwServices::IXMLParser) ) ;
+
+    /**
+     * @brief   Constructor : does nothing.
+     */
+    List( ) {};
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~List() {};
+
+    FWCOMED_API void createConfig( ::fwTools::Object::sptr _obj );
+
+    FWCOMED_API void startConfig();
+
+    FWCOMED_API void updateConfig();
+
+    FWCOMED_API void stopConfig();
+
+    FWCOMED_API void destroyConfig();
+
+protected:
+
+    /**
+     * @brief   Updating method : create List object.
+     *
+     * Parse the List configuration element to configure and add its objects.
+     */
+    FWCOMED_API virtual void updating( ) throw(fwTools::Failed) ;
+
+private :
+
+    /// To verify some conditions in xml file
+    bool refObjectValidator( ::fwRuntime::ConfigurationElement::sptr _cfgElement );
+
+    std::vector< ::fwServices::AppConfigManager::sptr > m_ctmContainer;
+};
+
+} //namespace parser
+} //namespace fwcomEd
+
+#endif /* _FWCOMED_PARSER_LIST_HPP_ */
+
diff --git a/SrcLib/core/fwComEd/include/fwComEd/parser/Object.hpp b/SrcLib/core/fwComEd/include/fwComEd/parser/Object.hpp
new file mode 100644
index 0000000..6c51c5a
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/parser/Object.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PARSER_OBJECT_HPP_
+#define _FWCOMED_PARSER_OBJECT_HPP_
+
+#include <fwTools/Object.hpp>
+#include <fwServices/IXMLParser.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+namespace parser
+{
+
+/**
+ * @class Object
+ * @brief Specific ::fwTools::Object parser. Does nothing as no IService method is specialized: IXMLParser base class methods are therefore considered.
+ *
+ * @note This implementation is only written to avoid the mixing both the service type IXMLParser and the ::fwTools::Object implementation (for homogeneity).
+ * 
+ */
+class FWCOMED_CLASS_API Object : public ::fwServices::IXMLParser
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (Object)(::fwServices::IXMLParser) ) ;
+
+    FWCOMED_API Object( ) ;
+    FWCOMED_API virtual ~Object() ;
+
+    FWCOMED_API void createConfig( ::fwTools::Object::sptr _obj );
+    FWCOMED_API void startConfig();
+    FWCOMED_API void updateConfig();
+    FWCOMED_API void stopConfig();
+    FWCOMED_API void destroyConfig();
+
+protected :
+
+    bool refObjectValidator( ::fwRuntime::ConfigurationElement::csptr _cfgElement );
+    void updating() throw( fwTools::Failed );
+
+    std::vector< ::fwServices::AppConfigManager::sptr > m_ctmContainer;
+};
+
+} //namespace parser
+} //namespace fwComEd
+
+#endif /* _FWCOMED_PARSER_OBJECT_HPP_ */
diff --git a/SrcLib/core/fwComEd/include/fwComEd/parser/TransformationMatrix3D.hpp b/SrcLib/core/fwComEd/include/fwComEd/parser/TransformationMatrix3D.hpp
new file mode 100644
index 0000000..b2ab6e5
--- /dev/null
+++ b/SrcLib/core/fwComEd/include/fwComEd/parser/TransformationMatrix3D.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_PARSER_TRANSFORMATIONMATRIX3D_HPP_
+#define _FWCOMED_PARSER_TRANSFORMATIONMATRIX3D_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwServices/IXMLParser.hpp>
+
+#include "fwComEd/export.hpp"
+
+namespace fwComEd
+{
+namespace parser
+{
+/**
+ * @brief   Specific service for the construction of a TransformationMatrix3D and its associated services from an XML-based description.
+ * @class   TransformationMatrix3D
+ * 
+
+ * @date    2007-2009
+ * @see     ::fwServices::IXMLParser
+ */
+class FWCOMED_CLASS_API TransformationMatrix3D : public ::fwServices::IXMLParser
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (TransformationMatrix3D)(::fwServices::IXMLParser) ) ;
+
+    /// Constructor : does nothing.
+    TransformationMatrix3D() {};
+
+    /// Destructor : does nothing.
+    virtual ~TransformationMatrix3D() {};
+
+    FWCOMED_API void createConfig( ::fwTools::Object::sptr _obj );
+protected:
+
+    /**
+     * @brief Updating method : create the process object.
+     *
+     * Parse the configuration element to configure inputs and outputs and add
+     * them in the process object.
+     */
+    FWCOMED_API virtual void updating( ) throw(fwTools::Failed) ;
+
+};
+
+} //namespace parser
+} //namespace fwComEd
+
+#endif // _FWCOMED_PARSER_TRANSFORMATIONMATRIX3D_HPP_
diff --git a/SrcLib/core/fwComEd/src/fwComEd/BooleanMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/BooleanMsg.cpp
new file mode 100644
index 0000000..1aaa611
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/BooleanMsg.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/BooleanMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::BooleanMsg );
+
+namespace fwComEd
+{
+
+
+//-----------------------------------------------------------------------------
+
+std::string BooleanMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+BooleanMsg::BooleanMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+BooleanMsg::~BooleanMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/CameraMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/CameraMsg.cpp
new file mode 100644
index 0000000..4bc1b33
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/CameraMsg.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/CameraMsg.hpp"
+
+//fwServicesMessageRegisterMacro( ::fwComEd::CameraMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string CameraMsg::NEW_CAMERA="NEW_CAMERA";
+std::string CameraMsg::CAMERA_MOVING="CAMERA_MOVING";
+
+//-----------------------------------------------------------------------------
+
+CameraMsg::CameraMsg(::fwServices::ObjectMsg::Key key)
+{
+    m_positionCamera[0] = 0.f;
+    m_positionCamera[1] = 0.f;
+    m_positionCamera[2] = 0.f;
+
+    m_focalCamera[0] = 0.f;
+    m_focalCamera[1] = 0.f;
+    m_focalCamera[2] = 0.f;
+    m_focalCamera[3] = 0.f;
+
+    m_viewUpCamera[0] = 0.f;
+    m_viewUpCamera[1] = 0.f;
+    m_viewUpCamera[2] = 0.f;
+}
+
+//-----------------------------------------------------------------------------
+
+CameraMsg::~CameraMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void CameraMsg::info(std::ostream &_sstream ) const
+{
+    this->ObjectMsg::info(_sstream) ;
+}
+
+//-----------------------------------------------------------------------------
+
+void CameraMsg::setPositionCamera( const double _positionValue[3]  )
+{
+    m_positionCamera[0] = _positionValue[0];
+    m_positionCamera[1] = _positionValue[1];
+    m_positionCamera[2] = _positionValue[2];
+}
+
+//-----------------------------------------------------------------------------
+
+const double* CameraMsg::getPositionCamera( void )const
+{
+    return m_positionCamera ;
+}
+
+//-----------------------------------------------------------------------------
+
+void CameraMsg::setFocalCamera( const double _focalValue[4] )
+{
+    m_focalCamera[0] = _focalValue[0];
+    m_focalCamera[1] = _focalValue[1];
+    m_focalCamera[2] = _focalValue[2];
+    m_focalCamera[3] = _focalValue[3];
+}
+
+//-----------------------------------------------------------------------------
+
+const double* CameraMsg::getFocalCamera( void )const
+{
+    return m_focalCamera ;
+}
+
+//-----------------------------------------------------------------------------
+
+void CameraMsg::setViewUpCamera( const double _viewUpValue[3] )
+{
+    m_viewUpCamera[0] = _viewUpValue[0];
+    m_viewUpCamera[1] = _viewUpValue[1];
+    m_viewUpCamera[2] = _viewUpValue[2];
+}
+
+//-----------------------------------------------------------------------------
+
+const double* CameraMsg::getViewUpCamera( void )const
+{
+    return m_viewUpCamera;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ColorMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ColorMsg.cpp
new file mode 100644
index 0000000..36969f8
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ColorMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ColorMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ColorMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string ColorMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+ColorMsg::ColorMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ColorMsg::~ColorMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/CompositeMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/CompositeMsg.cpp
new file mode 100644
index 0000000..e37c6f5
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/CompositeMsg.cpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/CompositeMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::CompositeMsg );
+
+namespace fwComEd
+{
+
+std::string CompositeMsg::ADDED_KEYS = "ADDED_KEYS";
+std::string CompositeMsg::REMOVED_KEYS = "REMOVED_KEYS";
+std::string CompositeMsg::CHANGED_KEYS = "CHANGED_KEYS";
+
+//-------------------------------------------------------------------------
+
+CompositeMsg::CompositeMsg(::fwServices::ObjectMsg::Key key)
+{
+    m_removedKeys    = ::fwData::Composite::New();
+    m_addedKeys      = ::fwData::Composite::New();
+    m_oldChangedKeys = ::fwData::Composite::New();
+    m_newChangedKeys = ::fwData::Composite::New();
+}
+
+//-------------------------------------------------------------------------
+
+CompositeMsg::~CompositeMsg() throw()
+{}
+
+//-------------------------------------------------------------------------
+
+void CompositeMsg::appendAddedKey( std::string _compositeKey, ::fwData::Object::sptr _pNewObject )
+{
+    if( ! this->hasEvent( ADDED_KEYS ) )
+    {
+        this->addEvent( ADDED_KEYS, m_addedKeys );
+    }
+
+    SLM_ASSERT("This composite key is already register", m_addedKeys->find(_compositeKey) == m_addedKeys->end() );
+
+    m_addedKeys->getContainer()[ _compositeKey ] = _pNewObject;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr CompositeMsg::getAddedKeys() const
+{
+    return m_addedKeys;
+}
+
+//-----------------------------------------------------------------------------
+
+void CompositeMsg::appendRemovedKey( std::string _compositeKey, ::fwData::Object::sptr _pOldObject )
+{
+    if( ! this->hasEvent( REMOVED_KEYS ) )
+    {
+        this->addEvent( REMOVED_KEYS, m_removedKeys );
+    }
+
+    SLM_ASSERT("This composite key is already register", m_removedKeys->find(_compositeKey) == m_removedKeys->end() );
+
+    m_removedKeys->getContainer()[ _compositeKey ] = _pOldObject;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr CompositeMsg::getRemovedKeys() const
+{
+    return m_removedKeys;
+}
+
+//-----------------------------------------------------------------------------
+
+void CompositeMsg::appendChangedKey( std::string _compositeKey, ::fwData::Object::sptr _pOldObject, ::fwData::Object::sptr _pNewObject )
+{
+    if( ! this->hasEvent( CHANGED_KEYS ) )
+    {
+        this->addEvent( CHANGED_KEYS, m_oldChangedKeys );
+    }
+
+    SLM_ASSERT("This composite key is already register", m_oldChangedKeys->find(_compositeKey) == m_oldChangedKeys->end() );
+
+    m_oldChangedKeys->getContainer()[ _compositeKey ] = _pOldObject;
+    m_newChangedKeys->getContainer()[ _compositeKey ] = _pNewObject;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr CompositeMsg::getOldChangedKeys() const
+{
+    return m_oldChangedKeys;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr CompositeMsg::getNewChangedKeys() const
+{
+    return m_newChangedKeys;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace op
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/Dictionary.cpp b/SrcLib/core/fwComEd/src/fwComEd/Dictionary.cpp
new file mode 100644
index 0000000..4947abe
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/Dictionary.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwComEd/Dictionary.hpp"
+
+namespace fwComEd
+{
+
+const std::string Dictionary::DATA_IS_LOCKED                 ( "DATA_IS_LOCKED" );
+
+const std::string Dictionary::position                       ( "position" );
+
+const std::string Dictionary::localGui                       ( "Local GUI" );
+const std::string Dictionary::m_axialSliceCountId            ( "Axial Slice Count" );
+const std::string Dictionary::m_frontalSliceCountId          ( "Frontal Slice Count" );
+const std::string Dictionary::m_sagittalSliceCountId         ( "Sagittal Slice Count" );
+const std::string Dictionary::m_axialSliceIndexId            ( "Axial Slice Index" );
+const std::string Dictionary::m_frontalSliceIndexId          ( "Frontal Slice Index" );
+const std::string Dictionary::m_sagittalSliceIndexId         ( "Sagittal Slice Index" );
+const std::string Dictionary::m_transferFunctionCompositeId  ( "m_transferFunctionCompositeId" );
+const std::string Dictionary::m_imageLandmarksId             ("m_imageLandmarksId");
+const std::string Dictionary::m_imageDistancesId             ("m_imageDistancesId");
+const std::string Dictionary::m_commentId                    ("m_commentId");
+const std::string Dictionary::m_labelId                      ("m_labelId");
+const std::string Dictionary::m_colorId                      ("m_colorId");
+const std::string Dictionary::m_relatedServiceId             ("m_relatedServiceId");
+const std::string Dictionary::m_imageLabelId                 ("m_imageLabelId");
+const std::string Dictionary::m_acquisitionCountId           ("m_acquisitionCountId");
+
+const std::string Dictionary::m_globalMatrixId               ("Global Matrix");
+const std::string Dictionary::m_errorId                      ("Error");
+
+const std::string Dictionary::m_roi                          ( "ROI" );
+
+}
diff --git a/SrcLib/core/fwComEd/src/fwComEd/DictionaryOrganMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/DictionaryOrganMsg.cpp
new file mode 100644
index 0000000..8827f1c
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/DictionaryOrganMsg.cpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/DictionaryOrganMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::DictionaryOrganMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string DictionaryOrganMsg::ROI4ORGAN_EXP_IS_MODIFIED  = "ROI4ORGAN_EXP_IS_MODIFIED" ;
+std::string DictionaryOrganMsg::ROI4ORGAN_NODE_IS_MODIFIED = "ROI4ORGAN_NODE_IS_MODIFIED" ;
+std::string DictionaryOrganMsg::MASK_DATA_NODE_IS_MODIFIED = "MASK_DATA_NODE_IS_MODIFIED" ;
+std::string DictionaryOrganMsg::MESH_DATA_NODE_IS_MODIFIED = "MESH_DATA_NODE_IS_MODIFIED" ;
+
+//-----------------------------------------------------------------------------
+
+DictionaryOrganMsg::DictionaryOrganMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+DictionaryOrganMsg::~DictionaryOrganMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/FloatMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/FloatMsg.cpp
new file mode 100644
index 0000000..c5b98ae
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/FloatMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/FloatMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::FloatMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string FloatMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+FloatMsg::FloatMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+FloatMsg::~FloatMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/GraphMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/GraphMsg.cpp
new file mode 100644
index 0000000..e7a39e4
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/GraphMsg.cpp
@@ -0,0 +1,151 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/GraphMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::GraphMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string GraphMsg::NEW_GRAPH            = "NEW_GRAPH";
+std::string GraphMsg::CLEANING_GRAPH       = "CLEANING_GRAPH";
+std::string GraphMsg::ADD_NODE             = "ADD_NODE";
+std::string GraphMsg::REMOVE_NODE          = "REMOVE_NODE";
+std::string GraphMsg::REMOVING_NODE        = "REMOVING_NODE";
+std::string GraphMsg::ADD_EDGE             = "ADD_EDGE";
+std::string GraphMsg::ADDING_EDGE          = "ADDING_EDGE";
+std::string GraphMsg::REMOVE_EDGE          = "REMOVE_EDGE";
+std::string GraphMsg::SELECTED_NODE        = "SELECTED_NODE";
+std::string GraphMsg::UNSELECTED_NODE      = "UNSELECTED_NODE";
+std::string GraphMsg::SELECTED_OPERATOR    = "SELECTED_OPERATOR";
+std::string GraphMsg::EXECUTE_GRAPH        = "EXECUTE_GRAPH";
+std::string GraphMsg::CANCEL_EXECUTE_GRAPH = "CANCEL_EXECUTE_GRAPH";
+std::string GraphMsg::CHANGED_NODE_STATE   = "CHANGED_NODE_STATE";
+std::string GraphMsg::NODE_PROCESS_ERROR   = "NODE_PROCESS_ERROR";
+std::string GraphMsg::NODE_PROCESS_WARN    = "NODE_PROCESS_WARN";
+std::string GraphMsg::NODE_PROCESS_DONE    = "NODE_PROCESS_DONE";
+std::string GraphMsg::NODE_PROCESS         = "NODE_PROCESS";
+
+//-----------------------------------------------------------------------------
+
+GraphMsg::GraphMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+GraphMsg::~GraphMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+
+void GraphMsg::addedNode( ::fwData::Node::csptr node )
+{
+    addEvent( GraphMsg::ADD_NODE , node );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Node::csptr GraphMsg::getAddedNode() const
+{
+    return ::fwData::Node::dynamicConstCast( getDataInfo( GraphMsg::ADD_NODE ) );
+}
+
+//-----------------------------------------------------------------------------
+
+void GraphMsg::removedNode( ::fwData::Node::csptr node )
+{
+    addEvent( GraphMsg::REMOVE_NODE , node );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Node::csptr GraphMsg::getRemovedNode() const
+{
+    return ::fwData::Node::dynamicConstCast( getDataInfo( GraphMsg::REMOVE_NODE ) );
+}
+
+//-----------------------------------------------------------------------------
+
+void GraphMsg::removingNode( ::fwData::Node::csptr node )
+{
+    addEvent( GraphMsg::REMOVING_NODE , node );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Node::csptr GraphMsg::getRemovingNode() const
+{
+    return ::fwData::Node::dynamicConstCast( getDataInfo( GraphMsg::REMOVING_NODE ) );
+}
+
+//-----------------------------------------------------------------------------
+
+void GraphMsg::addingEdge( ::fwData::Node::csptr nodeFrom, ::fwData::Node::csptr nodeTo, std::string outputPortId, std::string inputPortId )
+{
+    ::fwData::Composite::sptr edgeInfo = ::fwData::Composite::New();
+    (*edgeInfo)["nodeFrom"] = ::fwData::Node::constCast( nodeFrom );
+    (*edgeInfo)["nodeTo"] = ::fwData::Node::constCast( nodeTo );
+    (*edgeInfo)["outputPortId"] = ::fwData::String::New( outputPortId );
+    (*edgeInfo)["inputPortId"] = ::fwData::String::New( inputPortId );
+    addEvent( GraphMsg::ADDING_EDGE , edgeInfo );
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::tuple< ::fwData::Node::csptr, ::fwData::Node::csptr, std::string, std::string > GraphMsg::getAddingEdge() const
+{
+    ::fwData::Composite::csptr edgeInfoConst = ::fwData::Composite::dynamicConstCast( getDataInfo( GraphMsg::ADDING_EDGE ) );
+    ::fwData::Composite::sptr edgeInfo = ::fwData::Composite::constCast( edgeInfoConst );
+
+    ::fwData::Node::csptr nodeFrom = ::fwData::Node::dynamicConstCast( (*edgeInfo)["nodeFrom"] );
+    ::fwData::Node::csptr nodeTo = ::fwData::Node::dynamicConstCast( (*edgeInfo)["nodeTo"] );
+    std::string outputPortId = ::fwData::String::dynamicConstCast( (*edgeInfo)["outputPortId"] )->value();
+    std::string inputPortId = ::fwData::String::dynamicConstCast( (*edgeInfo)["inputPortId"] )->value();
+
+    return ::boost::make_tuple( nodeFrom, nodeTo, outputPortId, inputPortId);
+}
+
+//-----------------------------------------------------------------------------
+
+void GraphMsg::selectedNode( ::fwData::Node::csptr node )
+{
+    addEvent( GraphMsg::SELECTED_NODE , node );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Node::csptr GraphMsg::getSelectedNode() const
+{
+    return ::fwData::Node::dynamicConstCast( getDataInfo( GraphMsg::SELECTED_NODE ) );
+}
+
+//-----------------------------------------------------------------------------
+
+void GraphMsg::unselectedNode( ::fwData::Node::csptr node )
+{
+    addEvent( GraphMsg::UNSELECTED_NODE , node );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Node::csptr GraphMsg::getUnselectedNode() const
+{
+    return ::fwData::Node::dynamicConstCast( getDataInfo( GraphMsg::UNSELECTED_NODE ) );
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/HistorgramMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/HistorgramMsg.cpp
new file mode 100644
index 0000000..b3b858b
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/HistorgramMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/HistogramMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::HistogramMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string HistogramMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+HistogramMsg::HistogramMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+HistogramMsg::~HistogramMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ImageMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ImageMsg.cpp
new file mode 100644
index 0000000..f424773
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ImageMsg.cpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ImageMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ImageMsg );
+
+namespace fwComEd
+{
+
+std::string ImageMsg::NEW_IMAGE = "NEW_IMAGE";
+std::string ImageMsg::BUFFER = "BUFFER";
+std::string ImageMsg::MODIFIED = "MODIFIED";
+std::string ImageMsg::DIMENSION = "DIMENSION";
+std::string ImageMsg::SPACING = "SPACING";
+std::string ImageMsg::REGION = "REGION";
+std::string ImageMsg::PIXELTYPE = "PIXELTYPE";
+std::string ImageMsg::LANDMARK = "LANDMARK";
+std::string ImageMsg::DISTANCE = "DISTANCE";
+std::string ImageMsg::NEW_DISTANCE = "NEW_DISTANCE";
+std::string ImageMsg::DELETE_DISTANCE = "DELETE_DISTANCE";
+std::string ImageMsg::SLICE_INDEX = "SLICE_INDEX";
+std::string ImageMsg::ACTIVATE_SYNC_CROSS = "ACTIVATE_SYNC_CROSS";
+std::string ImageMsg::INACTIVATE_SYNC_CROSS = "INACTIVATE_SYNC_CROSS";
+std::string ImageMsg::CHANGE_SLICE_TYPE = "CHANGE_SLICE_TYPE";
+std::string ImageMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+std::string ImageMsg::TRANSPARENCY = "TRANSPARENCY";
+std::string ImageMsg::VISIBILITY = "VISIBILITY";
+
+//-----------------------------------------------------------------------------
+
+ImageMsg::ImageMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ImageMsg::~ImageMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ImageMsg::setSliceIndex(::fwData::Integer::sptr a, ::fwData::Integer::sptr f, ::fwData::Integer::sptr s, ::fwData::Object::sptr _pDataInfo )
+{
+    this->addEvent( ::fwComEd::ImageMsg::SLICE_INDEX, _pDataInfo );
+    m_axialIndex = a;
+    m_frontalIndex = f;
+    m_sagittalIndex = s;
+}
+
+//-----------------------------------------------------------------------------
+
+void ImageMsg::getSliceIndex(::fwData::Integer::sptr &a, ::fwData::Integer::sptr &f, ::fwData::Integer::sptr &s) const
+{
+    SLM_ASSERT( "SLICE_INDEX Event not found in msg", this->hasEvent( ::fwComEd::ImageMsg::SLICE_INDEX ));
+    a->setValue( m_axialIndex->getValue() );
+    f->setValue( m_frontalIndex->getValue() );
+    s->setValue( m_sagittalIndex->getValue() );
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/IntegerMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/IntegerMsg.cpp
new file mode 100644
index 0000000..6eaa4f9
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/IntegerMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/IntegerMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::IntegerMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string IntegerMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+IntegerMsg::IntegerMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+IntegerMsg::~IntegerMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/InteractionMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/InteractionMsg.cpp
new file mode 100644
index 0000000..be005a9
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/InteractionMsg.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <limits>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/InteractionMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::InteractionMsg );
+
+namespace fwComEd
+{
+
+std::string InteractionMsg::MOUSE_LEFT_UP            = "MOUSE_LEFT_UP";
+std::string InteractionMsg::MOUSE_RIGHT_UP           = "MOUSE_RIGHT_UP";
+std::string InteractionMsg::MOUSE_MIDDLE_UP          = "MOUSE_MIDDLE_UP";
+std::string InteractionMsg::MOUSE_WHEELFORWARD_UP    = "MOUSE_WHEELFORWARD_UP";
+std::string InteractionMsg::MOUSE_WHEELBACKWARD_UP   = "MOUSE_WHEELBACKWARD_UP";
+std::string InteractionMsg::MOUSE_LEFT_DOWN          = "MOUSE_LEFT_DOWN";
+std::string InteractionMsg::MOUSE_RIGHT_DOWN         = "MOUSE_RIGHT_DOWN";
+std::string InteractionMsg::MOUSE_MIDDLE_DOWN        = "MOUSE_MIDDLE_DOWN";
+std::string InteractionMsg::MOUSE_WHEELFORWARD_DOWN  = "MOUSE_WHEELFORWARD_DOWN";
+std::string InteractionMsg::MOUSE_WHEELBACKWARD_DOWN = "MOUSE_WHEELBACKWARD_DOWN";
+std::string InteractionMsg::MOUSE_MOVE               = "MOUSE_MOVE";
+
+//-----------------------------------------------------------------------------
+
+InteractionMsg::InteractionMsg(::fwServices::ObjectMsg::Key key)
+{
+    m_eventPoint = ::fwData::Point::New();
+    m_modifiersStatus = NONE;
+}
+
+//-----------------------------------------------------------------------------
+
+InteractionMsg::~InteractionMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void InteractionMsg::setEvent(std::string event)
+{
+    SLM_ASSERT("InteractionMsg cannot handle several events in the same message",
+            m_eventId2DataInfo.size()==0 );
+    addEvent(event);
+}
+
+//-----------------------------------------------------------------------------
+
+void InteractionMsg::setModifiersStatus(Modifiers k, bool state)
+{
+    if (state)
+    {
+        m_modifiersStatus = static_cast<unsigned char>(m_modifiersStatus | k);
+    }
+    else
+    {
+        m_modifiersStatus = static_cast<unsigned char>( m_modifiersStatus & (std::numeric_limits<unsigned char>::max() - k));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool InteractionMsg::getModifiersStatus(Modifiers k) const
+{
+    return m_modifiersStatus & k;
+}
+
+//-----------------------------------------------------------------------------
+
+void InteractionMsg::setEventPoint(::fwData::Point::csptr point)
+{
+    SLM_ASSERT("Null point pointer", point);
+    m_eventPoint = ::fwData::Object::copy(point);
+}
+
+//-----------------------------------------------------------------------------
+
+void InteractionMsg::setEventPoint(PointCoordType x, PointCoordType y, PointCoordType z)
+{
+    ::fwData::Point::PointCoordArrayType &coords = m_eventPoint->getRefCoord();
+    coords[0] = x;
+    coords[1] = y;
+    coords[2] = z;
+}
+
+
+//-----------------------------------------------------------------------------
+::fwData::Point::csptr InteractionMsg::getEventPoint() const
+{
+    return m_eventPoint;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/LocationMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/LocationMsg.cpp
new file mode 100644
index 0000000..9a265bc
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/LocationMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/LocationMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::LocationMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string LocationMsg::LOCATION_IS_MODIFIED = "LOCATION_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+LocationMsg::LocationMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+LocationMsg::~LocationMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/MaterialMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/MaterialMsg.cpp
new file mode 100644
index 0000000..f7e546b
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/MaterialMsg.cpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/MaterialMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::MaterialMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+std::string MaterialMsg::MATERIAL_IS_MODIFIED = "MATERIAL_IS_MODIFIED";
+//-----------------------------------------------------------------------------
+
+MaterialMsg::MaterialMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MaterialMsg::~MaterialMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/MeshMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/MeshMsg.cpp
new file mode 100644
index 0000000..70a41ad
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/MeshMsg.cpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/MeshMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::MeshMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string MeshMsg::NEW_MESH              = "NEW_MESH";
+std::string MeshMsg::VERTEX_MODIFIED       = "VERTEX_MODIFIED";
+std::string MeshMsg::POINT_COLORS_MODIFIED = "POINT_COLORS_MODIFIED";
+std::string MeshMsg::CELL_COLORS_MODIFIED  = "CELL_COLORS_MODIFIED";
+std::string MeshMsg::POINT_NORMALS_MODIFIED = "POINT_NORMALS_MODIFIED";
+std::string MeshMsg::CELL_NORMALS_MODIFIED  = "CELL_NORMALS_MODIFIED";
+
+
+//-----------------------------------------------------------------------------
+
+FWCOMED_API MeshMsg::MeshMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MeshMsg::~MeshMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ModelMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ModelMsg.cpp
new file mode 100644
index 0000000..505b50a
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ModelMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ModelMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ModelMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string ModelMsg::NEW_MODEL = "NEW_MODEL";
+
+//-----------------------------------------------------------------------------
+
+ModelMsg::ModelMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ModelMsg::~ModelMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ModelSeriesMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ModelSeriesMsg.cpp
new file mode 100644
index 0000000..3a24c0c
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ModelSeriesMsg.cpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "fwComEd/ModelSeriesMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ModelSeriesMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string ModelSeriesMsg::ADD_RECONSTRUCTION          = "ADD_RECONSTRUCTION";
+std::string ModelSeriesMsg::REMOVED_RECONSTRUCTIONS     = "REMOVED_RECONSTRUCTIONS";
+std::string ModelSeriesMsg::SHOW_RECONSTRUCTIONS        = "ShowReconstructions";
+std::string ModelSeriesMsg::VISIBILITY                  = "VISIBILITY";
+std::string ModelSeriesMsg::NEW_RECONSTRUCTION_SELECTED = "NEW_RECONSTRUCTION_SELECTED";
+
+//-----------------------------------------------------------------------------
+
+ModelSeriesMsg::ModelSeriesMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ModelSeriesMsg::~ModelSeriesMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/PlaneListMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/PlaneListMsg.cpp
new file mode 100644
index 0000000..79581fb
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/PlaneListMsg.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/PlaneListMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::PlaneListMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string PlaneListMsg::ADD_PLANE            = "PLANE_IS_ADDED";
+std::string PlaneListMsg::REMOVE_PLANE         = "REMOVE_PLANE";
+std::string PlaneListMsg::PLANELIST_VISIBILITY = "PLANELIST_VISIBILITY";
+std::string PlaneListMsg::PLANELIST_MODIFIED   = "PLANELIST_MODIFIED";
+std::string PlaneListMsg::DESELECT_ALL_PLANES  = "DESELECT_ALL_PLANES";
+
+//-----------------------------------------------------------------------------
+
+PlaneListMsg::PlaneListMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+PlaneListMsg::~PlaneListMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/PlaneMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/PlaneMsg.cpp
new file mode 100644
index 0000000..eea0542
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/PlaneMsg.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/PlaneMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::PlaneMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string PlaneMsg::PLANE_MODIFIED          = "PLANE_MODIFIED";
+std::string PlaneMsg::START_PLANE_INTERACTION = "START_PLANE_INTERACTION";
+std::string PlaneMsg::DESELECT_PLANE          = "DESELECT_PLANE";
+std::string PlaneMsg::WAS_SELECTED            = "WAS_SELECTED";
+std::string PlaneMsg::WAS_DESELECTED          = "WAS_DESELECTED";
+
+//-----------------------------------------------------------------------------
+
+PlaneMsg::PlaneMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+PlaneMsg::~PlaneMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/PointListMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/PointListMsg.cpp
new file mode 100644
index 0000000..be9ad2b
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/PointListMsg.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/PointListMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::PointListMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string PointListMsg::ELEMENT_MODIFIED = "ELEMENT_MODIFIED";
+std::string PointListMsg::ELEMENT_ADDED    = "ELEMENT_ADDED";
+std::string PointListMsg::ELEMENT_REMOVED  = "ELEMENT_REMOVED";
+
+//-----------------------------------------------------------------------------
+
+PointListMsg::PointListMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+PointListMsg::~PointListMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/PointMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/PointMsg.cpp
new file mode 100644
index 0000000..44bdff2
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/PointMsg.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/PointMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::PointMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string PointMsg::VALUE_IS_MODIFIED       = "VALUE_IS_MODIFIED";
+std::string PointMsg::POINT_IS_MODIFIED       = "POINT_IS_MODIFIED";
+std::string PointMsg::START_POINT_INTERACTION = "START_POINT_INTERACTION";
+
+//-----------------------------------------------------------------------------
+
+PointMsg::PointMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+PointMsg::~PointMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ReconstructionMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ReconstructionMsg.cpp
new file mode 100644
index 0000000..d8e4f5b
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ReconstructionMsg.cpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ReconstructionMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ReconstructionMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+std::string ReconstructionMsg::MESH = "MESH";
+std::string ReconstructionMsg::VISIBILITY = "VISIBILITY";
+//-----------------------------------------------------------------------------
+
+ReconstructionMsg::ReconstructionMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ReconstructionMsg::~ReconstructionMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ResectionDBMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ResectionDBMsg.cpp
new file mode 100644
index 0000000..d31742d
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ResectionDBMsg.cpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ResectionDBMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::ResectionDBMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string ResectionDBMsg::NEW_RESECTIONDB_SELECTED = "NEW_RESECTIONDB_SELECTED";
+std::string ResectionDBMsg::RESECTIONDB_SELECTED     = "RESECTIONDB_SELECTED";
+std::string ResectionDBMsg::NEW_RESECTION_SELECTED   = "NEW_RESECTION_SELECTED";
+std::string ResectionDBMsg::NEW_SAFE_PART_SELECTED   = "NEW_SAFE_PART_SELECTED";
+std::string ResectionDBMsg::ADD_RESECTION            = "ADD_RESECTION";
+std::string ResectionDBMsg::ADD_SAFE_PART            = "ADD_SAFE_PART";
+std::string ResectionDBMsg::MODIFIED                 = "MODIFIED";
+std::string ResectionDBMsg::RESECTIONDB_INVALIDATED  = "RESECTIONDB_INVALIDATED";
+
+//-----------------------------------------------------------------------------
+
+ResectionDBMsg::ResectionDBMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ResectionDBMsg::~ResectionDBMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/ResectionMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/ResectionMsg.cpp
new file mode 100644
index 0000000..1a1d238
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/ResectionMsg.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/ResectionMsg.hpp"
+
+fwServicesMessageRegisterMacro(::fwComEd::ResectionMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string ResectionMsg::ADD_RECONSTRUCTION = "ADD_RECONSTRUCTION";
+std::string ResectionMsg::VISIBILITY = "VISIBILITY";
+std::string ResectionMsg::NEW_RECONSTRUCTION_SELECTED = "NEW_RECONSTRUCTION_SELECTED";
+std::string ResectionMsg::MODIFIED = "MODIFIED";
+
+
+//-----------------------------------------------------------------------------
+
+ResectionMsg::ResectionMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ResectionMsg::~ResectionMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/SeriesDBMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/SeriesDBMsg.cpp
new file mode 100644
index 0000000..388e560
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/SeriesDBMsg.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/SeriesDBMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::SeriesDBMsg );
+
+namespace fwComEd
+{
+
+std::string SeriesDBMsg::ADDED_OBJECTS = "ADDED_OBJECTS";
+std::string SeriesDBMsg::REMOVED_OBJECTS = "REMOVED_OBJECTS";
+
+//-------------------------------------------------------------------------
+
+SeriesDBMsg::SeriesDBMsg(::fwServices::ObjectMsg::Key key)
+{
+    m_removedSeries    = ::fwData::Vector::New();
+    m_addedSeries      = ::fwData::Vector::New();
+}
+
+//-------------------------------------------------------------------------
+
+SeriesDBMsg::~SeriesDBMsg() throw()
+{}
+
+//-------------------------------------------------------------------------
+
+void SeriesDBMsg::appendAddedSeries( ::fwMedData::Series::sptr newSeries )
+{
+    ::fwData::Vector::ContainerType& addedSeries = m_addedSeries->getContainer();
+    if( ! this->hasEvent( ADDED_OBJECTS ) )
+    {
+        this->addEvent( ADDED_OBJECTS, m_addedSeries );
+    }
+
+    SLM_ASSERT("This Series is already registered",
+               std::find(addedSeries.begin(), addedSeries.end(), newSeries) == addedSeries.end() );
+
+    addedSeries.push_back(newSeries);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Vector::sptr SeriesDBMsg::getAddedSeries() const
+{
+    return m_addedSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDBMsg::appendRemovedSeries( ::fwMedData::Series::sptr oldSeries )
+{
+    ::fwData::Vector::ContainerType& removedSeries = m_removedSeries->getContainer();
+    if( ! this->hasEvent( REMOVED_OBJECTS ) )
+    {
+        this->addEvent( REMOVED_OBJECTS, m_removedSeries );
+    }
+
+    SLM_ASSERT("This Series is already register",
+               std::find(removedSeries.begin(), removedSeries.end(), oldSeries) == removedSeries.end() );
+
+    removedSeries.push_back( oldSeries );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Vector::sptr SeriesDBMsg::getRemovedSeries() const
+{
+    return m_removedSeries;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace op
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/SplineMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/SplineMsg.cpp
new file mode 100644
index 0000000..244975f
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/SplineMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/SplineMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::SplineMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string SplineMsg::NEW_SPLINE="NEW_SPLINE";
+
+//-----------------------------------------------------------------------------
+
+SplineMsg::SplineMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+SplineMsg::~SplineMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/StringMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/StringMsg.cpp
new file mode 100644
index 0000000..d662a80
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/StringMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/StringMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::StringMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string StringMsg::VALUE_IS_MODIFIED = "VALUE_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+StringMsg::StringMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+StringMsg::~StringMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/TagMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/TagMsg.cpp
new file mode 100644
index 0000000..8dfcc43
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/TagMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/TagMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::TagMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string TagMsg::TAG_IS_MODIFIED="TAG_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+TagMsg::TagMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TagMsg::~TagMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/TransferFunctionMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/TransferFunctionMsg.cpp
new file mode 100644
index 0000000..7775ba3
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/TransferFunctionMsg.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/TransferFunctionMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::TransferFunctionMsg );
+
+namespace fwComEd
+{
+
+std::string TransferFunctionMsg::MODIFIED_POINTS = "MODIFIED_POINTS";
+std::string TransferFunctionMsg::WINDOWING = "WINDOWING";
+
+//-----------------------------------------------------------------------------
+
+TransferFunctionMsg::TransferFunctionMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TransferFunctionMsg::~TransferFunctionMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TransferFunctionMsg::setWindowLevel( double window, double level )
+{
+    this->addEvent( ::fwComEd::TransferFunctionMsg::WINDOWING );
+    m_level = level;
+    m_window = window;
+}
+
+//-----------------------------------------------------------------------------
+
+double TransferFunctionMsg::getWindow() const
+{
+    SLM_ASSERT( "WINDOWING Event not found in msg", this->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING ));
+    return(m_window);
+}
+
+//-----------------------------------------------------------------------------
+
+double TransferFunctionMsg::getLevel() const
+{
+    SLM_ASSERT( "WINDOWING Event not found in msg", this->hasEvent( ::fwComEd::TransferFunctionMsg::WINDOWING ));
+    return (m_level);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/TransformationMatrix3DMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/TransformationMatrix3DMsg.cpp
new file mode 100644
index 0000000..ca2c3b2
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/TransformationMatrix3DMsg.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/TransformationMatrix3DMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::TransformationMatrix3DMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string TransformationMatrix3DMsg::MATRIX_IS_MODIFIED = "MATRIX_IS_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+TransformationMatrix3DMsg::TransformationMatrix3DMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TransformationMatrix3DMsg::~TransformationMatrix3DMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/TriangularMeshMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/TriangularMeshMsg.cpp
new file mode 100644
index 0000000..3a8adf6
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/TriangularMeshMsg.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/TriangularMeshMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::TriangularMeshMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string TriangularMeshMsg::NEW_MESH = "NEW_MESH";
+std::string TriangularMeshMsg::VERTEX_MODIFIED = "VERTEX_MODIFIED";
+
+//-----------------------------------------------------------------------------
+
+TriangularMeshMsg::TriangularMeshMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TriangularMeshMsg::~TriangularMeshMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/VectorMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/VectorMsg.cpp
new file mode 100644
index 0000000..7ca3aa6
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/VectorMsg.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/VectorMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::VectorMsg );
+
+namespace fwComEd
+{
+
+std::string VectorMsg::ADDED_OBJECTS = "ADDED_OBJECTS";
+std::string VectorMsg::REMOVED_OBJECTS = "REMOVED_OBJECTS";
+
+//-------------------------------------------------------------------------
+
+VectorMsg::VectorMsg(::fwServices::ObjectMsg::Key key)
+{
+    m_removedObjects    = ::fwData::Vector::New();
+    m_addedObjects      = ::fwData::Vector::New();
+}
+
+//-------------------------------------------------------------------------
+
+VectorMsg::~VectorMsg() throw()
+{}
+
+//-------------------------------------------------------------------------
+
+void VectorMsg::appendAddedObject( ::fwData::Object::sptr _pNewObject )
+{
+    if( ! this->hasEvent( ADDED_OBJECTS ) )
+    {
+        this->addEvent( ADDED_OBJECTS, m_addedObjects );
+    }
+
+    SLM_ASSERT("This object is already registered",
+               std::find(m_addedObjects->begin(), m_addedObjects->end(), _pNewObject) == m_addedObjects->end() );
+
+    m_addedObjects->getContainer().push_back(_pNewObject);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Vector::sptr VectorMsg::getAddedObjects() const
+{
+    return m_addedObjects;
+}
+
+//-----------------------------------------------------------------------------
+
+void VectorMsg::appendRemovedObject( ::fwData::Object::sptr _pOldObject )
+{
+    if( ! this->hasEvent( REMOVED_OBJECTS ) )
+    {
+        this->addEvent( REMOVED_OBJECTS, m_removedObjects );
+    }
+
+    SLM_ASSERT("This object is already register",
+               std::find(m_removedObjects->begin(), m_removedObjects->end(), _pOldObject) == m_removedObjects->end() );
+
+    m_removedObjects->getContainer().push_back( _pOldObject );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Vector::sptr VectorMsg::getRemovedObjects() const
+{
+    return m_removedObjects;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace op
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/VideoMsg.cpp b/SrcLib/core/fwComEd/src/fwComEd/VideoMsg.cpp
new file mode 100644
index 0000000..1a869de
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/VideoMsg.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/message/macros.hpp>
+
+#include "fwComEd/VideoMsg.hpp"
+
+fwServicesMessageRegisterMacro( ::fwComEd::VideoMsg );
+
+namespace fwComEd
+{
+
+//-----------------------------------------------------------------------------
+
+std::string VideoMsg::VIDEO_IS_REFRESHED="VIDEO_IS_REFRESHED";
+std::string VideoMsg::VIDEO_IS_INITIALIZED="VIDEO_IS_INITIALIZED";
+
+//-----------------------------------------------------------------------------
+
+VideoMsg::VideoMsg(::fwServices::ObjectMsg::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+VideoMsg::~VideoMsg() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/fieldHelper/MedicalImageHelpers.cpp b/SrcLib/core/fwComEd/src/fwComEd/fieldHelper/MedicalImageHelpers.cpp
new file mode 100644
index 0000000..d36b3fa
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/fieldHelper/MedicalImageHelpers.cpp
@@ -0,0 +1,203 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Integer.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/ResectionDB.hpp>
+
+#include <fwMath/MeshFunctions.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/Dictionary.hpp"
+#include "fwComEd/fieldHelper/MedicalImageHelpers.hpp"
+
+namespace fwComEd
+{
+
+namespace fieldHelper
+{
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageHelpers::checkLandmarks( ::fwData::Image::sptr _pImg )
+{
+    bool fieldIsModified = false;
+
+    // Manage image landmarks
+    if ( ! _pImg->getField( ::fwComEd::Dictionary::m_imageLandmarksId ) )
+    {
+        ::fwData::PointList::sptr pl = ::fwData::PointList::New();
+        _pImg->setField( ::fwComEd::Dictionary::m_imageLandmarksId, pl );
+        fieldIsModified = true;
+    }
+
+    return fieldIsModified;
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageHelpers::checkImageValidity( ::fwData::Image::sptr _pImg )
+{
+    SLM_TRACE_FUNC();
+
+    // Test if the image is allocated
+    bool dataImageIsAllocated = (_pImg != ::fwData::Image::sptr());
+
+    if (dataImageIsAllocated)
+    {
+        size_t nbDim = _pImg->getNumberOfDimensions();
+        dataImageIsAllocated &= nbDim > 1;
+
+        for ( size_t k = 0; dataImageIsAllocated && k < nbDim; ++k )
+        {
+            dataImageIsAllocated = dataImageIsAllocated && ( _pImg->getSize()[k] >= 1 );
+        }
+    }
+
+    return dataImageIsAllocated;
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageHelpers::checkImageSliceIndex( ::fwData::Image::sptr _pImg )
+{
+    SLM_ASSERT("_pImg pointer null", _pImg);
+
+    bool fieldIsModified = false;
+
+    const ::fwData::Image::SizeType &imageSize = _pImg->getSize();
+
+    ::fwData::Integer::sptr axialIdx    = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_axialSliceIndexId );
+    ::fwData::Integer::sptr frontalIdx  = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_frontalSliceIndexId);
+    ::fwData::Integer::sptr sagittalIdx = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_sagittalSliceIndexId );
+
+    // Manage image landmarks
+    if ( ! (axialIdx && frontalIdx && sagittalIdx) )
+    {
+        // Set value
+        axialIdx = ::fwData::Integer::New(-1);
+        _pImg->setField( ::fwComEd::Dictionary::m_axialSliceIndexId, axialIdx );
+
+        frontalIdx = ::fwData::Integer::New(-1);
+        _pImg->setField( ::fwComEd::Dictionary::m_frontalSliceIndexId, frontalIdx );
+
+        sagittalIdx = ::fwData::Integer::New(-1);
+        _pImg->setField( ::fwComEd::Dictionary::m_sagittalSliceIndexId, sagittalIdx );
+
+        fieldIsModified = true;
+    }
+
+
+    SLM_ASSERT (
+            "Information on image slice index is not correct, miss one of these fields : m_axialSliceIndexId, m_frontalSliceIndexId, m_sagittalSliceIndexId.",
+            axialIdx && frontalIdx && sagittalIdx
+            );
+
+    // Get value
+    if( axialIdx->value() < 0 ||  imageSize[2] < axialIdx->value() )
+    {
+        axialIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[2] / 2);
+        fieldIsModified = true;
+    }
+
+    if( frontalIdx->value() < 0 ||  imageSize[1] < frontalIdx->value() )
+    {
+        frontalIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[1] / 2);
+        fieldIsModified = true;
+    }
+
+    if( sagittalIdx->value() < 0 ||  imageSize[0] < sagittalIdx->value() )
+    {
+        sagittalIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[0] / 2);
+        fieldIsModified = true;
+    }
+
+
+    return fieldIsModified;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Point::sptr   MedicalImageHelpers::getImageSliceIndices( ::fwData::Image::sptr _pImg )
+{
+    SLM_ASSERT("_pImg pointer null", _pImg);
+
+    ::fwData::Point::sptr point = ::fwData::Point::New();
+
+    MedicalImageHelpers::checkImageSliceIndex(_pImg);
+
+    point->getRefCoord()[0] = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_sagittalSliceIndexId )->value();
+    point->getRefCoord()[1] = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_frontalSliceIndexId  )->value();
+    point->getRefCoord()[2] = _pImg->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_axialSliceIndexId    )->value();
+
+    return point;
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageHelpers::checkComment( ::fwData::Image::sptr _pImg )
+{
+    SLM_ASSERT("_pImg pointer null", _pImg);
+
+    bool fieldIsModified = false;
+
+    if ( ! _pImg->getField( ::fwComEd::Dictionary::m_commentId ) )
+    {
+        // Set value
+        ::fwData::String::sptr param = ::fwData::String::New("Original image");
+        _pImg->setField( ::fwComEd::Dictionary::m_commentId, param );
+        fieldIsModified = true;
+    }
+
+    return fieldIsModified;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Image::sptr MedicalImageHelpers::initialize( ::fwData::Image::sptr imgSrc, ::fwData::Image::sptr imgToInitialize)
+{
+    SLM_ASSERT("Image source must be initialized", imgSrc);
+    SLM_ASSERT("Image source must be valid", MedicalImageHelpers::checkImageValidity(imgSrc));
+
+    if(!imgToInitialize)
+    {
+        imgToInitialize = ::fwData::Image::New();
+    }
+    ::fwData::Array::sptr imgData = imgSrc->getDataArray();
+    imgSrc->setDataArray(::fwData::Array::sptr(), false);
+
+    imgToInitialize = ::fwData::Object::copy(imgSrc);
+
+    imgSrc->setDataArray(imgData, false);
+
+    imgToInitialize->allocate();
+
+    return imgToInitialize;
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageHelpers::isBufNull(const ::fwData::Image::BufferType *buf, const unsigned int len)
+{
+    bool isNull;
+    const ::fwData::Image::BufferType *ucbuf = static_cast< const ::fwData::Image::BufferType *> (buf);
+    isNull = 0 == std::accumulate(
+            ucbuf,
+            ucbuf+len,
+            0,
+            bitwise_or< ::fwData::Image::BufferType >()
+            );
+    return isNull;
+}
+
+//------------------------------------------------------------------------------
+
+} // fieldHelper
+} // fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Array.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Array.cpp
new file mode 100644
index 0000000..fc98452
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Array.cpp
@@ -0,0 +1,185 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwComEd/helper/Array.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+Array::Array( ::fwData::Array::sptr array ) : m_array (array)
+{
+    SLM_ASSERT("Array ptr is null.", array);
+    m_lock = array->getBufferObject()->lock();
+}
+
+//-----------------------------------------------------------------------------
+
+Array::~Array()
+{
+
+}
+
+//-----------------------------------------------------------------------------
+
+void *Array::getBuffer()
+{
+    return m_lock.getBuffer();
+}
+
+//-----------------------------------------------------------------------------
+
+const void *Array::getBuffer() const
+{
+    return m_lock.getBuffer();
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setBuffer(void *buf, bool takeOwnership)
+{
+    if(m_array->getIsBufferOwner())
+    {
+        if(!m_array->getBufferObject()->isEmpty())
+        {
+            m_array->getBufferObject()->destroy();
+        }
+    }
+    else
+    {
+        ::fwMemory::BufferObject::sptr newBufferObject = ::fwMemory::BufferObject::New();
+        ::fwMemory::BufferObject::sptr oldBufferObject = m_array->getBufferObject();
+        oldBufferObject->swap(newBufferObject);
+    }
+    m_array->getBufferObject()->setBuffer(buf, (buf == NULL) ? 0 : m_array->getSizeInBytes());
+    m_array->setIsBufferOwner(takeOwnership);
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setBuffer(
+        void *buf,
+        bool takeOwnership,
+        const ::fwTools::Type &type,
+        const  ::fwData::Array::SizeType &size,
+        size_t nbOfComponents )
+{
+    m_array->resize( type, size, nbOfComponents, false);
+    this->setBuffer(buf, takeOwnership);
+}
+
+//-----------------------------------------------------------------------------
+
+char *Array::begin()
+{
+    void *v = this->getBuffer();
+    return static_cast<char*>(v);
+}
+
+//------------------------------------------------------------------------------
+
+char *Array::end()
+{
+    return reinterpret_cast<char*> (static_cast<char*>(this->getBuffer()) + m_array->getSizeInBytes());
+}
+//------------------------------------------------------------------------------
+
+const char *Array::begin() const
+{
+    return static_cast<const char*>(this->getBuffer());
+}
+
+//------------------------------------------------------------------------------
+
+const char *Array::end() const
+{
+    return reinterpret_cast<const char*> (static_cast<const char*>(this->getBuffer()) + m_array->getSizeInBytes());
+}
+
+//-----------------------------------------------------------------------------
+
+char *Array::getBufferPtr( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType )
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    size_t offset = m_array->getBufferOffset(id, component, sizeOf);
+    char *item = static_cast<char*>(this->getBuffer()) + offset;
+    return item;
+}
+
+//------------------------------------------------------------------------------
+
+const char *Array::getBufferPtr( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType ) const
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    size_t offset = m_array->getBufferOffset(id, component, sizeOf);
+    const char *item = static_cast<const char*>(this->getBuffer()) + offset;
+    return item;
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setItem(const ::fwData::Array::IndexType &id, const void *value)
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    const char *val  = static_cast<const char*>(value);
+    char *item = this->getBufferPtr(id, 0, sizeOf);
+    std::copy(val, val + m_array->getNumberOfComponents()*sizeOf, item);
+}
+//------------------------------------------------------------------------------
+
+
+void Array::setItem(const ::fwData::Array::IndexType &id, const size_t component, const void *value)
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    const char *val  = static_cast<const char*>(value);
+    char *item = this->getBufferPtr(id, component, sizeOf);
+    std::copy(val, val + sizeOf, item);
+}
+
+
+//------------------------------------------------------------------------------
+
+void *Array::getItem(const ::fwData::Array::IndexType &id, const size_t component)
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    char *item = this->getBufferPtr(id, component, sizeOf);
+    return item;
+}
+
+//------------------------------------------------------------------------------
+
+void Array::getItem(const ::fwData::Array::IndexType &id, void *value) const
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    const char *item = this->getBufferPtr(id, 0, sizeOf);
+    char *val  = static_cast<char*>(value);
+    std::copy(item, item + m_array->getNumberOfComponents()*sizeOf, val);
+}
+
+//------------------------------------------------------------------------------
+
+void Array::getItem(const ::fwData::Array::IndexType &id, const size_t component, void *value) const
+{
+    size_t sizeOf = m_array->getType().sizeOf();
+    const char *item = this->getBufferPtr(id, component, sizeOf);
+    char *val  = static_cast<char*>(value);
+    std::copy(item, item + m_array->getNumberOfComponents()*sizeOf, val);
+}
+
+//------------------------------------------------------------------------------
+
+::fwMemory::BufferObject::Lock Array::getLock() const
+{
+    return m_lock;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Composite.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Composite.cpp
new file mode 100644
index 0000000..bff5fc1
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Composite.cpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/helper/Composite.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+Composite::Composite( ::fwData::Composite::wptr _composite )
+    :   m_compositeMsg ( ::fwComEd::CompositeMsg::New() ),
+        m_composite ( _composite )
+{}
+
+//-----------------------------------------------------------------------------
+
+Composite::~Composite()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Composite::add( std::string _compositeKey, ::fwData::Object::sptr _newObject )
+{
+    OSLM_FATAL_IF( "Sorry the composite key " << _compositeKey << " must not exist in composite." , m_composite.lock()->find(_compositeKey) != m_composite.lock()->end() );
+
+    // Modify composite
+    m_composite.lock()->getContainer()[ _compositeKey ] = _newObject;
+
+    // Modify message
+    m_compositeMsg->appendAddedKey( _compositeKey, _newObject );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Composite::remove( std::string _compositeKey )
+{
+    OSLM_FATAL_IF( "Sorry the composite key " << _compositeKey << " must exist in composite." , m_composite.lock()->find(_compositeKey) == m_composite.lock()->end() );
+
+    // Get old object
+    ::fwData::Object::sptr objBackup = m_composite.lock()->getContainer()[ _compositeKey ];
+
+    // Modify composite
+    m_composite.lock()->getContainer().erase( _compositeKey );
+
+    // Modify message
+    m_compositeMsg->appendRemovedKey( _compositeKey, objBackup );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Composite::clear()
+{
+    ::fwData::Composite::sptr composite = m_composite.lock();
+    std::vector<std::string> vectKey;
+    std::transform( composite->begin(), composite->end(),
+                std::back_inserter(vectKey),
+                ::boost::bind(& ::fwData::Composite::value_type::first,_1) );
+
+    BOOST_FOREACH(std::string key, vectKey)
+    {
+        this->remove(key);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Composite::swap( std::string _compositeKey, ::fwData::Object::sptr _newObject )
+{
+    OSLM_FATAL_IF( "Sorry the composite key " << _compositeKey << " must exist in composite." , m_composite.lock()->find(_compositeKey) == m_composite.lock()->end() );
+
+
+    // Get old object
+    ::fwData::Object::sptr objBackup = m_composite.lock()->getContainer()[ _compositeKey ];
+
+    if( objBackup != _newObject )
+    {
+        // Modify composite
+        m_composite.lock()->getContainer()[ _compositeKey ] = _newObject;
+
+        // Modify message
+        m_compositeMsg->appendChangedKey( _compositeKey, objBackup, _newObject );
+    }
+    else
+    {
+        OSLM_INFO("Cannot swap this object ( "<< _compositeKey <<" ) in composite because it is the same object. Do nothing (not notification)");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Composite::notify( ::fwServices::IService::sptr _serviceSource )
+{
+    if ( m_compositeMsg->getEventIds().size() > 0 )
+    {
+        ::fwServices::IEditionService::notify( _serviceSource, m_composite.lock(), m_compositeMsg , true );
+    }
+    SLM_INFO_IF("Sorry, this helper cannot notify his message because the message is empty.", m_compositeMsg->getEventIds().size() == 0);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Field.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Field.cpp
new file mode 100644
index 0000000..3fdb997
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Field.cpp
@@ -0,0 +1,168 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include <boost/bind.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/helper/Field.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+Field::Field( ::fwData::Object::sptr object )
+    :   m_objectMsg ( ::fwServices::ObjectMsg::New() ),
+        m_object ( object )
+{}
+
+//-----------------------------------------------------------------------------
+
+Field::~Field()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Field::setField(const fwData::Object::FieldNameType& name, fwData::Object::sptr obj)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    ::fwData::Object::sptr object = m_object.lock();
+    ::fwData::Object::sptr field = object->getField(name);
+    if (!field)
+    {
+        m_objectMsg->appendAddedField(name, obj);
+    }
+    else
+    {
+        m_objectMsg->appendChangedField(name, field, obj);
+    }
+    object->setField(name, obj);
+}
+
+//-----------------------------------------------------------------------------
+
+void Field::setFields( const fwData::Object::FieldMapType& newFields)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    ::fwData::Object::sptr object = m_object.lock();
+    const ::fwData::Object::FieldMapType oldFields  = object->getFields();
+    this->buildMessage(newFields,oldFields);
+    object->setFields(newFields);
+}
+
+//-----------------------------------------------------------------------------
+
+void Field::updateFields( const fwData::Object::FieldMapType& fieldMap)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    ::fwData::Object::sptr object = m_object.lock();
+    const ::fwData::Object::FieldMapType oldFields  = object->getFields();
+    this->buildMessage(fieldMap,oldFields);
+    object->updateFields(fieldMap);
+}
+
+//-----------------------------------------------------------------------------
+
+void Field::removeField(const fwData::Object::FieldNameType& name)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    ::fwData::Object::sptr object = m_object.lock();
+    ::fwData::Object::sptr field = object->getField(name);
+
+    if (field)
+    {
+        m_objectMsg->appendRemovedField(name, field);
+    }
+    object->removeField(name);
+}
+
+//-----------------------------------------------------------------------------
+
+void Field::notify(fwServices::IService::sptr _serviceSource)
+{
+    SLM_ASSERT("Field helper need a non-null object pointer", !m_object.expired());
+    if ( m_objectMsg->getEventIds().size() > 0 )
+    {
+        ::fwServices::IEditionService::notify( _serviceSource, m_object.lock(), m_objectMsg , true );
+    }
+    SLM_INFO_IF("The message will not by notified because it has no event.", m_objectMsg->getEventIds().size() == 0);
+}
+
+//-----------------------------------------------------------------------------
+
+void Field::buildMessage(
+        const ::fwData::Object::FieldMapType &oldFields,
+        const ::fwData::Object::FieldMapType &newFields
+        )
+{
+    ::fwData::Object::FieldNameVectorType oldFieldNames;
+    ::fwData::Object::FieldNameVectorType newFieldNames;
+
+    std::transform(
+            oldFields.begin(), oldFields.end(),
+            std::back_inserter(oldFieldNames),
+            ::boost::bind(& ::fwData::Object::FieldMapType::value_type::first, _1)
+    );
+    std::transform(
+            newFields.begin(), newFields.end(),
+            std::back_inserter(newFieldNames),
+            ::boost::bind(& ::fwData::Object::FieldMapType::value_type::first, _1)
+    );
+
+    std::sort(oldFieldNames.begin(), oldFieldNames.end());
+    std::sort(newFieldNames.begin(), newFieldNames.end());
+
+    ::fwData::Object::FieldNameVectorType added;   // new - old
+    ::fwData::Object::FieldNameVectorType changed; // old & new
+    ::fwData::Object::FieldNameVectorType removed; // old - new
+
+    std::set_difference(
+            newFieldNames.begin(), newFieldNames.end(),
+            oldFieldNames.begin(), oldFieldNames.end(),
+            std::back_inserter(added)
+    );
+
+    std::set_intersection(
+            newFieldNames.begin(), newFieldNames.end(),
+            oldFieldNames.begin(), oldFieldNames.end(),
+            std::back_inserter(changed)
+    );
+
+    std::set_difference(
+            oldFieldNames.begin(), oldFieldNames.end(),
+            newFieldNames.begin(), newFieldNames.end(),
+            std::back_inserter(removed)
+    );
+
+    BOOST_FOREACH(const ::fwData::Object::FieldNameVectorType::value_type &fieldName, added)
+    {
+        m_objectMsg->appendAddedField(fieldName, newFields.find(fieldName)->second);
+    }
+
+    BOOST_FOREACH(const ::fwData::Object::FieldNameVectorType::value_type &fieldName, changed)
+    {
+        m_objectMsg->appendChangedField(
+                fieldName,
+                oldFields.find(fieldName)->second,
+                newFields.find(fieldName)->second
+                );
+    }
+
+    BOOST_FOREACH(const ::fwData::Object::FieldNameVectorType::value_type &fieldName, changed)
+    {
+        m_objectMsg->appendRemovedField(fieldName, oldFields.find(fieldName)->second);
+    }
+}
+
+} // namespace helper
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Image.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Image.cpp
new file mode 100644
index 0000000..0fb0b6d
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Image.cpp
@@ -0,0 +1,237 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/PointList.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/helper/Image.hpp"
+#include "fwComEd/helper/Field.hpp"
+#include "fwComEd/helper/Composite.hpp"
+#include "fwComEd/Dictionary.hpp"
+#include "fwComEd/fieldHelper/MedicalImageHelpers.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+
+//-----------------------------------------------------------------------------
+
+Image::Image( ::fwData::Image::sptr image )
+    : m_imageMsg(::fwComEd::ImageMsg::New()),
+      m_image(image)
+{
+    if ( image )
+    {
+        m_lock = image->getDataArray()->getBufferObject()->lock();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+Image::~Image()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Image::notify( ::fwServices::IService::sptr _serviceSource )
+{
+    if ( m_imageMsg->getEventIds().size() > 0 )
+    {
+        ::fwServices::IEditionService::notify( _serviceSource, m_image, m_imageMsg );
+    }
+    SLM_INFO_IF("Sorry, this helper cannot notify his message because the message is empty.", m_imageMsg->getEventIds().empty());
+}
+
+//------------------------------------------------------------------------------
+
+bool Image::createLandmarks()
+{
+    bool fieldIsCreated = false;
+
+    // Manage image landmarks
+    if ( ! m_image->getField( ::fwComEd::Dictionary::m_imageLandmarksId ) )
+    {
+        ::fwData::PointList::sptr pl = ::fwData::PointList::New();
+        m_image->setField( ::fwComEd::Dictionary::m_imageLandmarksId, pl );
+        fieldIsCreated = true;
+    }
+
+    return fieldIsCreated;
+}
+
+
+//------------------------------------------------------------------------------
+
+bool Image::createTransferFunctionPool(::fwServices::IService::sptr serviceSource)
+{
+    bool fieldIsCreated = false;
+    const std::string poolFieldName = ::fwComEd::Dictionary::m_transferFunctionCompositeId;
+    ::fwData::Composite::sptr tfPool;
+
+    tfPool = m_image->getField< ::fwData::Composite >(poolFieldName);
+    // Transfer functions
+    if ( ! tfPool )
+    {
+        tfPool = ::fwData::Composite::New();
+
+        // Set in selected image
+        ::fwComEd::helper::Field fieldHelper(m_image);
+        fieldHelper.setField(poolFieldName, tfPool);
+        if(serviceSource)
+        {
+            fieldHelper.notify(serviceSource);
+        }
+        // TF pool is modified
+        fieldIsCreated = true;
+    }
+
+    const std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+    if(tfPool->find(defaultTFName) == tfPool->end())
+    {
+        ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::createDefaultTF();
+        if (m_image->getWindowWidth() != 0 )
+        {
+            tf->setWindow( m_image->getWindowWidth() );
+            tf->setLevel( m_image->getWindowCenter() );
+        }
+        else if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(m_image))
+        {
+            double min, max;
+            ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(m_image, min, max);
+            ::fwData::TransferFunction::TFValuePairType wlMinMax(min, max);
+            tf->setWLMinMax(wlMinMax);
+        }
+        // Set in TFPool
+        ::fwComEd::helper::Composite compositeHelper(tfPool);
+        compositeHelper.add(defaultTFName, tf);
+        if(serviceSource)
+        {
+            compositeHelper.notify(serviceSource);
+        }
+    }
+
+    return fieldIsCreated;
+}
+
+
+//------------------------------------------------------------------------------
+
+bool Image::createImageSliceIndex()
+{
+    bool fieldIsCreated = false;
+
+    const ::fwData::Image::SizeType &imageSize = m_image->getSize();
+
+    ::fwData::Integer::sptr axialIdx    = m_image->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_axialSliceIndexId );
+    ::fwData::Integer::sptr frontalIdx  = m_image->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_frontalSliceIndexId);
+    ::fwData::Integer::sptr sagittalIdx = m_image->getField< ::fwData::Integer >( ::fwComEd::Dictionary::m_sagittalSliceIndexId );
+
+    // Manage image slice index
+    if ( ! (axialIdx && frontalIdx && sagittalIdx) )
+    {
+        // Set value
+        axialIdx = ::fwData::Integer::New(-1);
+        m_image->setField( ::fwComEd::Dictionary::m_axialSliceIndexId, axialIdx );
+
+        frontalIdx = ::fwData::Integer::New(-1);
+        m_image->setField( ::fwComEd::Dictionary::m_frontalSliceIndexId, frontalIdx );
+
+        sagittalIdx = ::fwData::Integer::New(-1);
+        m_image->setField( ::fwComEd::Dictionary::m_sagittalSliceIndexId, sagittalIdx );
+
+        fieldIsCreated = true;
+    }
+
+
+    SLM_ASSERT (
+            "Information on image slice index is not correct, miss one of these fields : "
+            "m_axialSliceIndexId, m_frontalSliceIndexId, m_sagittalSliceIndexId.",
+            axialIdx && frontalIdx && sagittalIdx
+            );
+
+    // Get value
+    if( axialIdx->value() < 0 ||  imageSize[2] < axialIdx->value() )
+    {
+        axialIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[2] / 2);
+        fieldIsCreated = true;
+    }
+
+    if( frontalIdx->value() < 0 ||  imageSize[1] < frontalIdx->value() )
+    {
+        frontalIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[1] / 2);
+        fieldIsCreated = true;
+    }
+
+    if( sagittalIdx->value() < 0 ||  imageSize[0] < sagittalIdx->value() )
+    {
+        sagittalIdx->value() = static_cast< ::fwData::Integer::ValueType >(imageSize[0] / 2);
+        fieldIsCreated = true;
+    }
+
+    return fieldIsCreated;
+}
+
+//-----------------------------------------------------------------------------
+
+void * Image::getBuffer()
+{
+    return m_lock.getBuffer();
+}
+
+//------------------------------------------------------------------------------
+
+void* Image::getPixelBuffer( SizeType::value_type x, SizeType::value_type y, SizeType::value_type z )
+{
+    SizeType size = m_image->getSize();
+    IndexType offset = x + size[0]*y + z*size[0]*size[1];
+    return this->getPixelBuffer(offset);
+}
+
+//------------------------------------------------------------------------------
+
+void* Image::getPixelBuffer( IndexType index )
+{
+    ::boost::uint8_t imagePixelSize = m_image->getType().sizeOf();
+    BufferType * buf = static_cast < BufferType * > (this->getBuffer());
+    BufferIndexType bufIndex = index * imagePixelSize;
+    return buf + bufIndex;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::setPixelBuffer( IndexType index , Image::BufferType * pixBuf)
+{
+    ::boost::uint8_t imagePixelSize = m_image->getType().sizeOf();
+    BufferType * buf = static_cast < BufferType * > (this->getPixelBuffer(index));
+
+    std::copy(pixBuf, pixBuf+imagePixelSize, buf);
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Image::getPixelAsString(SizeType::value_type x,
+                                          SizeType::value_type y,
+                                          SizeType::value_type z )
+{
+    return m_image->getType().toString(this->getPixelBuffer(x,y,z));
+}
+
+//------------------------------------------------------------------------------
+
+::fwMemory::BufferObject::Lock Image::getLock() const
+{
+    return m_lock;
+}
+
+//------------------------------------------------------------------------------
+
+} // helper
+} // fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/MedicalImageAdaptor.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/MedicalImageAdaptor.cpp
new file mode 100644
index 0000000..256bb4d
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/MedicalImageAdaptor.cpp
@@ -0,0 +1,520 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/CompositeMsg.hpp>
+
+#include "fwComEd/helper/MedicalImageAdaptor.hpp"
+#include "fwComEd/helper/Image.hpp"
+#include "fwComEd/helper/Composite.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+MedicalImageAdaptor::MedicalImageAdaptor()
+    : m_orientation(Z_AXIS),
+      m_tfSelectionFwID(""),
+      m_selectedTFKey("")
+{}
+
+//------------------------------------------------------------------------------
+
+MedicalImageAdaptor::~MedicalImageAdaptor()
+{}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getImageSpacing(double spacing[3])
+{
+    ::fwData::Image::sptr image = this->getImage();
+
+    const ::fwData::Image::SpacingType& imSpacing = image->getSpacing();
+    std::copy(imSpacing.begin(), imSpacing.end(), spacing);
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getImageOrigin(double origin[3])
+{
+    ::fwData::Image::sptr image = this->getImage();;
+
+    std::copy(image->getOrigin().begin(), image->getOrigin().end(), origin);
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getImageDataSize(int size[3])
+{
+    ::fwData::Image::sptr image = this->getImage();
+
+    const ::fwData::Image::SizeType& imSize = image->getSize();
+    std::copy(imSize.begin(), imSize.end(), size);
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getImageSize(double size[3])
+{
+    ::fwData::Image::sptr image = this->getImage();;
+    double spacing[3];
+
+    const ::fwData::Image::SizeType& imSize = image->getSize();
+    std::copy(imSize.begin(), imSize.end(), size);
+    this->getImageSpacing(spacing);
+
+    size[0] *= spacing[0];
+    size[1] *= spacing[1];
+    size[2] *= spacing[2];
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getCurrentSliceCenter(double center[3])
+{
+    ::fwData::Image::sptr image = this->getImage();;
+    double imageSize[3];
+    this->getImageSize(imageSize);
+    double origin[3];
+    this->getImageOrigin(origin);
+
+    ::fwData::Integer::sptr sliceIndex[3];
+    this->getSliceIndex(sliceIndex);
+    double index[3] = {sliceIndex[0]->value(), sliceIndex[1]->value(), sliceIndex[2]->value()};
+
+    center[0] = origin[0] + (imageSize[0]-1.)/ 2.;
+    center[1] = origin[1] + (imageSize[1]-1.)/ 2.;
+    center[2] = origin[2] + (imageSize[2]-1.)/ 2.;
+
+    double spacing[3];
+    this->getImageSpacing(spacing);
+    center[m_orientation] = origin[m_orientation] + index[m_orientation]*spacing[m_orientation];
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setOrientation( MedicalImageAdaptor::Orientation orientation )
+{
+    m_orientation = orientation;
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setOrientation( int orientation )
+{
+    OSLM_FATAL_IF(" orientation value must be  0,1 or 2 (value=" << orientation << ")" , orientation<0 || orientation>3);
+    m_orientation = static_cast< ::fwComEd::helper::MedicalImageAdaptor::Orientation >(orientation);
+}
+
+//------------------------------------------------------------------------------
+
+static const int indexZ[12] = { 0,2,4, 1,2,4,  1,3,4 ,0,3,4 };
+static const int indexY[12] = { 0,2,4, 1,2,4,  1,2,5 ,0,2,5 };
+static const int indexX[12] = { 0,2,4, 0,2,5,  0,3,5 ,0,3,4 };
+static const int *indexSet[3] = { indexX, indexY, indexZ  };
+void MedicalImageAdaptor::getPlane( double points[4][3] , int sliceNumber)
+{
+    ::fwData::Image::sptr image = this->getImage();;
+    double extent[6];
+    for (char i=0;  i<3; ++i )
+    {
+        extent[2*i]   =  0;
+        extent[2*i+1] = image->getSize()[i]*image->getSpacing()[i];
+    }
+    extent[2*m_orientation] = sliceNumber*image->getSpacing()[m_orientation];
+    extent[2*m_orientation+1] = sliceNumber*image->getSpacing()[m_orientation];
+
+    const int *extentIndex = indexSet[ m_orientation ];
+    for (int p=0; p<4 ; ++p)
+    {
+        for (int i=0; i<3 ; ++i)
+        {
+            points[p][i]= extent[ *(extentIndex++) ];
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::sliceIndexToWorld(const int index[3], double world[3] )
+{
+    double spacing[3];
+    this->getImageSpacing(spacing);
+    double origin[3];
+    this->getImageOrigin(origin);
+    for ( int i=0 ; i<3 ; ++i )
+    {
+        world[i] = static_cast<int>( (index[i]*spacing[i]) + 0.5*spacing[i] + origin[i] );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::worldToSliceIndex(const double world[3], int index[3] )
+{
+    double spacing[3];
+    this->getImageSpacing(spacing);
+    double origin[3];
+    this->getImageOrigin(origin);
+    for ( int i=0 ; i<3 ; ++i )
+    {
+        // nearest integer
+        index[i] = static_cast<int>( ( (world[i]-origin[i])/spacing[i] ) + ( ( (world[i]-origin[i])/spacing[i] ) >= 0 ? 0.5 : -0.5 ) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::worldToImageSliceIndex(const double world[3], int index[3] )
+{
+    int imageSize[3];
+    this->getImageDataSize(imageSize);
+    this->worldToSliceIndex(world, index);
+
+    int idval;
+    for (int i = 0; i < 3; i++)
+    {
+        int max = imageSize[i]-1;
+        idval = index[i];
+        if (idval < 0)
+        {
+            index[i] = 0;
+        }
+        else if (idval > max)
+        {
+            index[i] = max;
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::getSliceIndex(::fwData::Integer::sptr index[3])
+{
+    index[0] = m_sagittalIndex;
+    index[1] = m_frontalIndex;
+    index[2] = m_axialIndex;
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageAdaptor::setSliceIndex(const int index[3])
+{
+    bool isModified = false;
+    ::fwData::Image::sptr image = this->getImage();;
+
+    ::fwData::Integer::sptr sliceIndex[3];
+
+    this->getSliceIndex(sliceIndex);
+
+    if(    index[0] != sliceIndex[0]->value()
+        || index[1] != sliceIndex[1]->value()
+        || index[2] != sliceIndex[2]->value() )
+    {
+        sliceIndex[0]->value() = index[0];
+        sliceIndex[1]->value() = index[1];
+        sliceIndex[2]->value() = index[2];
+        isModified = true;
+    }
+    return isModified;
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::updateImageInfos( ::fwData::Image::sptr image )
+{
+    m_weakImage = image;
+    m_axialIndex    = image->setDefaultField(::fwComEd::Dictionary::m_axialSliceIndexId   , ::fwData::Integer::New(0));
+    m_frontalIndex  = image->setDefaultField(::fwComEd::Dictionary::m_frontalSliceIndexId , ::fwData::Integer::New(0));
+    m_sagittalIndex = image->setDefaultField(::fwComEd::Dictionary::m_sagittalSliceIndexId, ::fwData::Integer::New(0));
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::updateTransferFunction( ::fwData::Image::sptr image, ::fwServices::IService::sptr srv )
+{
+    if ( ! m_tfSelectionFwID.empty() )
+    {
+        if ( m_tfSelection.expired() )
+        {
+            ::fwData::Composite::sptr tfSelection = ::fwData::Composite::dynamicCast( ::fwTools::fwID::getObject( m_tfSelectionFwID ) );
+            OSLM_ASSERT( "Sorry, object with fwID " << m_tfSelectionFwID << " doesn't exist.", tfSelection );
+            OSLM_ASSERT( "Sorry, selectedTFKey must be defined, check your configuration.", ! m_selectedTFKey.empty() );
+            if ( tfSelection->find( m_selectedTFKey ) == tfSelection->end() )
+            {
+                ::fwData::TransferFunction::sptr tfGreyLevel = ::fwData::TransferFunction::createDefaultTF();
+                if (image->getWindowWidth() != 0 )
+                {
+                    tfGreyLevel->setWindow( image->getWindowWidth() );
+                    tfGreyLevel->setLevel( image->getWindowCenter() );
+                }
+                else if(::fwComEd::fieldHelper::MedicalImageHelpers::checkImageValidity(image))
+                {
+                    double min, max;
+                    ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+                    ::fwData::TransferFunction::TFValuePairType wlMinMax(min, max);
+                    tfGreyLevel->setWLMinMax(wlMinMax);
+                }
+
+                ::fwComEd::helper::Composite compositeHelper(tfSelection);
+                compositeHelper.add(m_selectedTFKey, tfGreyLevel);
+                compositeHelper.notify(srv);
+            }
+            m_tfSelection = tfSelection;
+        }
+    }
+    else
+    {
+        const std::string poolFieldName = ::fwComEd::Dictionary::m_transferFunctionCompositeId;
+        ::fwData::Composite::sptr tfSelection = image->getField< ::fwData::Composite >(poolFieldName);
+
+        if ( m_tfSelection.expired() || m_tfSelection.lock() != tfSelection )
+        {
+            const std::string defaultTFName = ::fwData::TransferFunction::s_DEFAULT_TF_NAME;
+
+            ::fwComEd::helper::Image helper(image);
+            helper.createTransferFunctionPool(srv); // do nothing if image tf pool already exist
+
+            tfSelection = image->getField< ::fwData::Composite >(poolFieldName);
+
+            m_selectedTFKey = defaultTFName;
+            m_tfSelection = tfSelection;
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Composite::sptr MedicalImageAdaptor::getTransferFunctionSelection() const
+{
+    return m_tfSelection.lock();
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr MedicalImageAdaptor::getTransferFunction() const
+{
+    return ::fwData::TransferFunction::dynamicCast((*m_tfSelection.lock())[m_selectedTFKey]);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Image::sptr MedicalImageAdaptor::getImage()
+{
+    SLM_ASSERT("Image weak pointer empty !", !m_weakImage.expired());
+    return m_weakImage.lock();
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setTFParameters( ::fwData::Composite::sptr tfPool, std::string tfSelectionId )
+{
+    if (!tfSelectionId.empty())
+    {
+        m_selectedTFKey = tfSelectionId;
+        m_tfSelection = tfPool;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setTFSelectionFwID( const std::string & fwid )
+{
+    m_tfSelectionFwID = fwid;
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setSelectedTFKey( const std::string & key )
+{
+    m_selectedTFKey = key;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string & MedicalImageAdaptor::getTFSelectionFwID() const
+{
+    return m_tfSelectionFwID;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string & MedicalImageAdaptor::getSelectedTFKey() const
+{
+    return m_selectedTFKey;
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::parseTFConfig( ::fwRuntime::ConfigurationElement::sptr configuration )
+{
+   SLM_ASSERT("Sorry, analyzed configuration is not conformed.", configuration->getName() == "config");
+   if ( configuration->hasAttribute("selectedTFKey") )
+   {
+       m_selectedTFKey = configuration->getAttributeValue("selectedTFKey");
+       SLM_FATAL_IF("'selectedTFKey' must not be empty", m_selectedTFKey.empty());
+   }
+   if ( configuration->hasAttribute("tfSelectionFwID") )
+   {
+       m_tfSelectionFwID = configuration->getAttributeValue("tfSelectionFwID");
+       SLM_FATAL_IF("'tfSelectionFwID' must not be empty", m_tfSelectionFwID.empty());
+   }
+}
+
+//------------------------------------------------------------------------------
+
+double MedicalImageAdaptor::getWindow() const
+{
+    return this->getTransferFunction()->getWindow();
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setWindow( double window )
+{
+    this->getTransferFunction()->setWindow( window );
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setWindowLevel( double windowMin, double windowMax )
+{
+    ::fwData::TransferFunction::TFValuePairType minMax(windowMin, windowMax);
+    this->getTransferFunction()->setWLMinMax( minMax );
+}
+
+//------------------------------------------------------------------------------
+
+double MedicalImageAdaptor::getLevel() const
+{
+    return this->getTransferFunction()->getLevel();
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::setLevel( double level )
+{
+    this->getTransferFunction()->setLevel( level );
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::installTFSelectionEventHandler( ::fwServices::IService* srv )
+{
+//   srv->addNewHandledEvent(::fwComEd::CompositeMsg::CHANGED_KEYS);
+//   srv->addNewHandledEvent(::fwComEd::CompositeMsg::ADDED_KEYS);
+//   srv->addNewHandledEvent(::fwComEd::CompositeMsg::REMOVED_KEYS);
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::installTFObserver( ::fwServices::IService::sptr srv )
+{
+    SLM_ASSERT( "TF connections already exist", m_tfSelectionConnection.expired() && m_tfConnection.expired());
+
+    m_tfSelectionConnection = this->getTransferFunctionSelection()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->
+                                connect(srv->slot(::fwServices::IService::s_RECEIVE_SLOT));
+
+    m_tfConnection = this->getTransferFunction()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                             srv->slot(::fwServices::IService::s_RECEIVE_SLOT));
+}
+
+//------------------------------------------------------------------------------
+
+void MedicalImageAdaptor::removeTFObserver()
+{
+    m_tfSelectionConnection.disconnect();
+    m_tfConnection.disconnect();
+}
+
+//------------------------------------------------------------------------------
+
+bool MedicalImageAdaptor::upadteTFObserver(::fwServices::ObjectMsg::csptr msg, ::fwServices::IService::sptr srv)
+{
+    bool needUpdate = false;
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(msg);
+    if(compositeMsg)
+    {
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::ADDED_KEYS ) )
+        {
+            ::fwData::Composite::sptr fields = compositeMsg->getAddedKeys();
+            ::fwData::Composite::iterator iter = fields->find(this->getSelectedTFKey());
+            if( iter != fields->end())
+            {
+                if (!m_tfConnection.expired())
+                {
+                    m_tfConnection.disconnect();
+                }
+
+                m_tfConnection = this->getTransferFunction()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                        srv->slot(::fwServices::IService::s_RECEIVE_SLOT));
+                needUpdate = true;
+            }
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::REMOVED_KEYS ) )
+        {
+            SLM_ASSERT( "Sorry, TF observer must exist", ! m_tfConnection.expired() );
+            ::fwData::Composite::sptr fields = compositeMsg->getRemovedKeys();
+            ::fwData::Composite::iterator iter = fields->find(this->getSelectedTFKey());
+            if( iter != fields->end())
+            {
+                m_tfConnection.disconnect();
+                needUpdate = true;
+            }
+        }
+
+        if ( compositeMsg->hasEvent( ::fwComEd::CompositeMsg::CHANGED_KEYS ) )
+        {
+            SLM_ASSERT( "Sorry, TF observer must exist", ! m_tfConnection.expired() );
+            ::fwData::Composite::sptr fields = compositeMsg->getNewChangedKeys();
+            ::fwData::Composite::iterator iter = fields->find(this->getSelectedTFKey());
+            if( iter != fields->end())
+            {
+                m_tfConnection.disconnect();
+                m_tfConnection = this->getTransferFunction()->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(
+                                        srv->slot(::fwServices::IService::s_RECEIVE_SLOT));
+                needUpdate = true;
+            }
+        }
+    }
+    return needUpdate;
+}
+
+//------------------------------------------------------------------------------
+
+::fwComEd::TransferFunctionMsg::sptr MedicalImageAdaptor::notifyTFWindowing( ::fwServices::IService::sptr srv )
+{
+    ::fwData::TransferFunction::sptr tf = this->getTransferFunction();
+
+    // Fire the message
+    ::fwComEd::TransferFunctionMsg::sptr msg = ::fwComEd::TransferFunctionMsg::New();
+    msg->setWindowLevel( tf->getWindow(), tf->getLevel() );
+    ::fwServices::IEditionService::notify( srv, tf, msg );
+    return msg;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace helper
+
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Mesh.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Mesh.cpp
new file mode 100644
index 0000000..d84c648
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Mesh.cpp
@@ -0,0 +1,359 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+
+#include <fwMath/MeshFunctions.hpp>
+
+#include "fwComEd/helper/Mesh.hpp"
+
+using namespace boost::assign;
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+#define POINT_REALLOC_STEP 1000
+#define CELL_REALLOC_STEP 1000
+#define CELLDATA_REALLOC_STEP 1000
+
+Mesh::Mesh( ::fwData::Mesh::sptr mesh ) : m_mesh (mesh)
+{
+    SLM_ASSERT("Mesh ptr is null.", mesh);
+    this->updateLock();
+}
+
+//-----------------------------------------------------------------------------
+
+Mesh::~Mesh()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Mesh::updateLock()
+{
+    SLM_ASSERT("Mesh ptr is null.", m_mesh);
+    m_helperPoints          = ::fwComEd::helper::Array::New(m_mesh->getPointsArray());
+    m_helperCellTypes       = ::fwComEd::helper::Array::New(m_mesh->getCellTypesArray());
+    m_helperCellData        = ::fwComEd::helper::Array::New(m_mesh->getCellDataArray());
+    m_helperCellDataOffsets = ::fwComEd::helper::Array::New(m_mesh->getCellDataOffsetsArray());
+
+    ::fwData::Array::sptr pointColors  =  m_mesh->getPointColorsArray();
+    ::fwData::Array::sptr cellColors   =  m_mesh->getCellColorsArray();
+    ::fwData::Array::sptr pointNormals =  m_mesh->getPointNormalsArray();
+    ::fwData::Array::sptr cellNormals  =  m_mesh->getCellNormalsArray();
+
+    if(pointColors)
+    {
+        m_helperPointColors = ::fwComEd::helper::Array::New(pointColors);
+    }
+    if(cellColors)
+    {
+        m_helperCellColors = ::fwComEd::helper::Array::New(cellColors);
+    }
+    if(pointNormals)
+    {
+        m_helperPointNormals = ::fwComEd::helper::Array::New(pointNormals);
+    }
+    if(cellNormals)
+    {
+        m_helperCellNormals = ::fwComEd::helper::Array::New(cellNormals);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextPoint(const ::fwData::Mesh::PointValueType p[3]) throw(::fwData::Exception)
+{
+    ::fwData::Mesh::Id nbPoints = m_mesh->getNumberOfPoints();
+    ::fwData::Array::sptr points = m_mesh->getPointsArray();
+    size_t allocatedPts = points->empty() ? 0 : points->getSize().at(0);
+    if( allocatedPts <= nbPoints )
+    {
+        points->resize(list_of(allocatedPts + POINT_REALLOC_STEP), true);
+    }
+    m_helperPoints->setItem(list_of(nbPoints), p);
+    m_mesh->setNumberOfPoints(nbPoints+1);
+    return nbPoints;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextPoint(::fwData::Mesh::PointValueType x,
+                                         ::fwData::Mesh::PointValueType y,
+                                         ::fwData::Mesh::PointValueType z) throw(::fwData::Exception)
+{
+    const ::fwData::Mesh::PointValueType p[3] = {x,y,z};
+    return this->insertNextPoint(p);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPoint(::fwData::Mesh::Id id, const ::fwData::Mesh::PointValueType p[3])
+{
+    m_helperPoints->setItem(list_of(id), p);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPoint(::fwData::Mesh::Id id,
+                    ::fwData::Mesh::PointValueType x,
+                    ::fwData::Mesh::PointValueType y,
+                    ::fwData::Mesh::PointValueType z )
+{
+    const ::fwData::Mesh::PointValueType p[3] = {x,y,z};
+    this->setPoint(id, p);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPointColor(::fwData::Mesh::Id id, const ::fwData::Mesh::ColorValueType c[4])
+{
+    m_helperPointColors->setItem(list_of(id), c);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellColor(::fwData::Mesh::Id id, const ::fwData::Mesh::ColorValueType c[4])
+{
+    m_helperCellColors->setItem(list_of(id), c);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPointNormal(::fwData::Mesh::Id id, const ::fwData::Mesh::NormalValueType n[3])
+{
+    m_helperPointNormals->setItem(list_of(id), n);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellNormal(::fwData::Mesh::Id id, const ::fwData::Mesh::NormalValueType n[3])
+{
+    m_helperCellNormals->setItem(list_of(id), n);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextCell(::fwData::Mesh::CellTypesEnum type,
+                                        const ::fwData::Mesh::CellValueType *cell,
+                                        size_t nb) throw(::fwData::Exception)
+{
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'NO_CELL'",
+            type != ::fwData::Mesh::NO_CELL || nb == 0);
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'POINT'",
+            type != ::fwData::Mesh::POINT || nb == 1);
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'EDGE'",
+            type != ::fwData::Mesh::EDGE || nb == 2);
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'TRIANGLE'",
+            type != ::fwData::Mesh::TRIANGLE || nb == 3);
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'QUAD'",
+            type != ::fwData::Mesh::QUAD || nb == 4);
+    SLM_ASSERT("Bad number of points ("<< nb << ") for cell type: 'POLY'",
+            type != ::fwData::Mesh::POLY || nb > 4);
+
+    ::fwData::Mesh::Id cellsDataSize = m_mesh->getCellDataSize();
+    ::fwData::Mesh::Id nbCells = m_mesh->getNumberOfCells();
+    ::fwData::Array::sptr cellTypes = m_mesh->getCellTypesArray();
+    ::fwData::Array::sptr cellDataOffsets = m_mesh->getCellDataOffsetsArray();
+    ::fwData::Array::sptr cellData = m_mesh->getCellDataArray();
+
+    size_t allocatedCellTypes       = cellTypes->empty() ? 0 : cellTypes->getSize().at(0);
+    size_t allocatedCellDataOffsets = cellDataOffsets->empty() ? 0 : cellDataOffsets->getSize().at(0);
+
+    if( allocatedCellTypes <= nbCells )
+    {
+        cellTypes->resize(list_of(allocatedCellTypes + CELL_REALLOC_STEP), true);
+    }
+    if( allocatedCellDataOffsets <= nbCells )
+    {
+        cellDataOffsets->resize(list_of(allocatedCellDataOffsets + CELL_REALLOC_STEP), true);
+    }
+
+
+    size_t allocatedCellData = cellData->empty() ? 0 : cellData->getSize().at(0);
+
+    if( allocatedCellData <= cellsDataSize + nb )
+    {
+        cellData->resize(list_of(allocatedCellData + CELLDATA_REALLOC_STEP), true);
+    }
+
+
+    const ::fwData::Mesh::CellTypes t[1] = {static_cast< ::fwData::Mesh::CellTypes >(type)};
+    m_helperCellTypes->setItem(list_of(nbCells), t);
+
+    ::fwData::Mesh::CellValueType *buf = reinterpret_cast< ::fwData::Mesh::CellValueType* >(
+            m_helperCellData->getBufferPtr(list_of(cellsDataSize), 0, sizeof(::fwData::Mesh::CellValueType))
+            );
+    std::copy(cell, cell+nb, buf);
+
+    const ::fwData::Mesh::CellDataOffsetType id[1] = {cellsDataSize};
+    m_helperCellDataOffsets->setItem(list_of(nbCells), id);
+
+
+    cellsDataSize += nb;
+    m_mesh->setCellDataSize(cellsDataSize);
+    m_mesh->setNumberOfCells(nbCells + 1);
+    return nbCells;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextCell(::fwData::Mesh::CellValueType p) throw(::fwData::Exception)
+{
+    ::fwData::Mesh::CellValueType point[1] = {p};
+    return this->insertNextCell(::fwData::Mesh::POINT, point, 1);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextCell(::fwData::Mesh::CellValueType p1,
+                                        ::fwData::Mesh::CellValueType p2) throw(::fwData::Exception)
+{
+    ::fwData::Mesh::CellValueType p[2] = {p1, p2};
+    return this->insertNextCell(::fwData::Mesh::EDGE, p, 2);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextCell(::fwData::Mesh::CellValueType p1,
+                                        ::fwData::Mesh::CellValueType p2,
+                                        ::fwData::Mesh::CellValueType p3) throw(::fwData::Exception)
+{
+    ::fwData::Mesh::CellValueType p[3] = {p1, p2, p3};
+    return this->insertNextCell(::fwData::Mesh::TRIANGLE, p, 3);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::insertNextCell(::fwData::Mesh::CellValueType p1,
+                                        ::fwData::Mesh::CellValueType p2,
+                                        ::fwData::Mesh::CellValueType p3,
+                                        ::fwData::Mesh::CellValueType p4) throw(::fwData::Exception)
+{
+    ::fwData::Mesh::CellValueType p[4] = {p1, p2, p3, p4};
+    return this->insertNextCell(::fwData::Mesh::QUAD, p, 4);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::PointsMultiArrayType Mesh::getPoints() const
+{
+    return ::fwData::Mesh::PointsMultiArrayType(
+            static_cast< ::fwData::Mesh::PointsMultiArrayType::element* >(m_helperPoints->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfPoints()][3]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::CellTypesMultiArrayType Mesh::getCellTypes() const
+{
+    return ::fwData::Mesh::CellTypesMultiArrayType(
+            static_cast< ::fwData::Mesh::CellTypesMultiArrayType::element *> (m_helperCellTypes->getBuffer()),
+            boost::extents[m_mesh->getNumberOfCells()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::CellDataMultiArrayType Mesh::getCellData() const
+{
+    return ::fwData::Mesh::CellDataMultiArrayType(
+            static_cast< ::fwData::Mesh::CellDataMultiArrayType::element * >(m_helperCellData->getBuffer()),
+            ::boost::extents[m_mesh->getCellDataSize()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::CellDataOffsetsMultiArrayType Mesh::getCellDataOffsets() const
+{
+    return ::fwData::Mesh::CellDataOffsetsMultiArrayType(
+            static_cast< ::fwData::Mesh::CellDataOffsetsMultiArrayType::element *>(m_helperCellDataOffsets->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfCells()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::PointColorsMultiArrayType Mesh::getPointColors() const
+{
+    ::fwData::Array::sptr pointColors = m_mesh->getPointColorsArray();
+    return ::fwData::Mesh::PointColorsMultiArrayType(
+            static_cast< ::fwData::Mesh::PointColorsMultiArrayType::element *>(m_helperPointColors->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfPoints()][pointColors->getNumberOfComponents()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::CellColorsMultiArrayType Mesh::getCellColors() const
+{
+    ::fwData::Array::sptr cellColors = m_mesh->getCellColorsArray();
+    return ::fwData::Mesh::CellColorsMultiArrayType(
+            static_cast< ::fwData::Mesh::CellColorsMultiArrayType::element *>(m_helperCellColors->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfCells()][cellColors->getNumberOfComponents()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::PointNormalsMultiArrayType Mesh::getPointNormals() const
+{
+    ::fwData::Array::sptr pointNormals = m_mesh->getPointNormalsArray();
+    return ::fwData::Mesh::PointNormalsMultiArrayType(
+            static_cast< ::fwData::Mesh::PointNormalsMultiArrayType::element *>(m_helperPointNormals->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfPoints()][pointNormals->getNumberOfComponents()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::CellNormalsMultiArrayType Mesh::getCellNormals() const
+{
+    ::fwData::Array::sptr cellNormals = m_mesh->getCellNormalsArray();
+    return ::fwData::Mesh::CellNormalsMultiArrayType(
+            static_cast< ::fwData::Mesh::CellNormalsMultiArrayType::element *>(m_helperCellNormals->getBuffer()),
+            ::boost::extents[m_mesh->getNumberOfCells()][cellNormals->getNumberOfComponents()]
+            );
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::csptr Mesh::getMesh() const
+{
+    return m_mesh;
+}
+
+//------------------------------------------------------------------------------
+
+bool Mesh::isClosed()
+{
+    bool isClosed = false;
+
+    ::fwData::Mesh::Id cellDataSize = m_mesh->getCellDataSize();
+    ::fwData::Mesh::Id nbOfCells = m_mesh->getNumberOfCells();
+
+    ::fwData::Mesh::CellValueType* cellDataBegin = m_helperCellData->begin< ::fwData::Mesh::CellValueType >();
+    ::fwData::Mesh::CellValueType* cellDataEnd = cellDataBegin + cellDataSize;
+    ::fwData::Mesh::CellDataOffsetType* cellDataOffsetsBegin = m_helperCellDataOffsets->begin< ::fwData::Mesh::CellDataOffsetType >();
+    ::fwData::Mesh::CellDataOffsetType* cellDataOffsetsEnd = cellDataOffsetsBegin + nbOfCells;
+    ::fwData::Mesh::CellTypes* cellTypesBegin = m_helperCellTypes->begin< ::fwData::Mesh::CellTypes >();
+
+    isClosed = ::fwMath::isBorderlessSurface(cellDataBegin,
+                                             cellDataEnd, cellDataOffsetsBegin,
+                                             cellDataOffsetsEnd, cellTypesBegin );
+    return isClosed;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/MsgHelper.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/MsgHelper.cpp
new file mode 100644
index 0000000..cb34ca5
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/MsgHelper.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/factory/message/new.hpp>
+
+#include "fwComEd/helper/MsgHelper.hpp"
+
+namespace fwComEd
+{
+
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+::fwServices::ObjectMsg::sptr MsgHelper::createAssociatedMsg( ::fwData::Object::csptr _obj)
+{
+    SLM_ASSERT("Object is NULL", _obj);
+    const std::string msgType = MsgHelper::getAssociatedMsgType(_obj);
+
+    ::fwServices::ObjectMsg::sptr objectMsg = ::fwServices::factory::message::New(msgType);
+    OSLM_ASSERT(msgType << " creation failed", objectMsg);
+
+    return objectMsg;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string MsgHelper::getAssociatedMsgType( ::fwData::Object::csptr _obj)
+{
+    SLM_ASSERT("Object is NULL", _obj);
+    // default ObjectMsg type
+    std::string msgType = "::fwServices::ObjectMsg";
+    std::string objType = _obj->getLeafClassname();
+
+    // TODO: improve association system
+    std::string objMsgType = "::fwComEd::" + objType + "Msg";
+    // check if instantiation of msgType is possible, standard Factory stop application if type is unknown
+    ::fwServices::ObjectMsg::sptr objMsg = ::fwServices::factory::message::New( objMsgType ) ;
+    OSLM_WARN_IF("No specific ObjectMsg type found for Object "<<objType
+            << " type "<<objMsgType<<" is unknown.", !objMsg);
+    if(objMsg)
+    {
+        // Instantiation of msgType is possible
+        msgType = objMsgType;
+    }
+
+    return msgType;
+}
+
+//------------------------------------------------------------------------------
+
+} // helper
+} // fwComEd
+
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/SeriesDB.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/SeriesDB.cpp
new file mode 100644
index 0000000..7bc0087
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/SeriesDB.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/helper/SeriesDB.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+SeriesDB::SeriesDB( ::fwMedData::SeriesDB::wptr seriesDB )
+    :   m_seriesDBMsg ( ::fwComEd::SeriesDBMsg::New() ),
+        m_seriesDB ( seriesDB )
+{}
+
+//-----------------------------------------------------------------------------
+
+SeriesDB::~SeriesDB()
+{}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDB::add( ::fwMedData::Series::sptr newSeries )
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = m_seriesDB.lock();
+    OSLM_ASSERT( "The object " << newSeries->getID() << " must not exist in SeriesDB." ,
+                 std::find(seriesDB->begin(), seriesDB->end(), newSeries) == seriesDB->end());
+
+    // Modify SeriesDB
+    seriesDB->getContainer().push_back( newSeries );
+
+    // Modify message
+    m_seriesDBMsg->appendAddedSeries( newSeries );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDB::remove( ::fwMedData::Series::sptr oldSeries )
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = m_seriesDB.lock();
+    ::fwMedData::SeriesDB::iterator iter = std::find(seriesDB->begin(), seriesDB->end(), oldSeries);
+    OSLM_ASSERT( "The object " << oldSeries->getID() << " must exist in SeriesDB." ,
+                 iter != seriesDB->end());
+
+    // Modify SeriesDB
+    seriesDB->getContainer().erase( iter );
+
+    // Modify message
+    m_seriesDBMsg->appendRemovedSeries( oldSeries );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDB::clear()
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = m_seriesDB.lock();
+
+    while (!seriesDB->empty())
+    {
+        this->remove(seriesDB->front());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDB::merge(::fwMedData::SeriesDB::sptr seriesDBIn)
+{
+    ::fwMedData::SeriesDB::ContainerType& vectIn = seriesDBIn->getContainer();
+    BOOST_FOREACH(::fwMedData::Series::sptr series, vectIn)
+    {
+        this->add(series);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void SeriesDB::notify( ::fwServices::IService::sptr serviceSource, bool notifySource )
+{
+    if ( !m_seriesDBMsg->getEventIds().empty() )
+    {
+        ::fwServices::IEditionService::notify( serviceSource, m_seriesDB.lock(), m_seriesDBMsg , notifySource );
+    }
+    SLM_INFO_IF("Sorry, this helper cannot notify his message because the message is empty.",
+                m_seriesDBMsg->getEventIds().empty());
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/helper/Vector.cpp b/SrcLib/core/fwComEd/src/fwComEd/helper/Vector.cpp
new file mode 100644
index 0000000..d706571
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/helper/Vector.cpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwData/Vector.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include "fwComEd/helper/Vector.hpp"
+
+namespace fwComEd
+{
+namespace helper
+{
+
+//-----------------------------------------------------------------------------
+
+Vector::Vector( ::fwData::Vector::wptr _vector )
+    :   m_vectorMsg ( ::fwComEd::VectorMsg::New() ),
+        m_vector ( _vector )
+{}
+
+//-----------------------------------------------------------------------------
+
+Vector::~Vector()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Vector::add( ::fwData::Object::sptr _newObject )
+{
+    ::fwData::Vector::sptr vector = m_vector.lock();
+    OSLM_ASSERT( "The object " << _newObject->getID() << " must not exist in vector." ,
+                   std::find(vector->begin(), vector->end(), _newObject) == vector->end());
+
+    // Modify vector
+    vector->getContainer().push_back(_newObject );
+
+    // Modify message
+    m_vectorMsg->appendAddedObject( _newObject );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Vector::remove( ::fwData::Object::sptr _oldObject )
+{
+    ::fwData::Vector::sptr vector = m_vector.lock();
+    ::fwData::Vector::iterator iter = std::find(vector->begin(), vector->end(), _oldObject);
+    OSLM_ASSERT( "The object " << _oldObject->getID() << " must exist in vector." ,
+                   iter != vector->end());
+
+    // Modify vector
+    vector->getContainer().erase( iter );
+
+    // Modify message
+    m_vectorMsg->appendRemovedObject( _oldObject );
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Vector::clear()
+{
+    ::fwData::Vector::sptr vector = m_vector.lock();
+
+    while (!vector->empty())
+    {
+        this->remove(vector->front());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Vector::notify( ::fwServices::IService::sptr _serviceSource, bool notifySource )
+{
+    if ( m_vectorMsg->getEventIds().size() > 0 )
+    {
+        ::fwServices::IEditionService::notify( _serviceSource, m_vector.lock(), m_vectorMsg , notifySource );
+    }
+    SLM_INFO_IF("Sorry, this helper cannot notify his message because the message is empty.",
+                m_vectorMsg->getEventIds().size() == 0);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace fwComEd
diff --git a/SrcLib/core/fwComEd/src/fwComEd/parser/Composite.cpp b/SrcLib/core/fwComEd/src/fwComEd/parser/Composite.cpp
new file mode 100644
index 0000000..46adf92
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/parser/Composite.cpp
@@ -0,0 +1,151 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include "fwComEd/parser/Composite.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::Composite, ::fwData::Composite );
+
+namespace fwComEd
+{
+namespace parser
+{
+
+//------------------------------------------------------------------------------
+
+bool Composite::refObjectValidator( ::fwRuntime::ConfigurationElement::sptr _cfgElement )
+{
+    bool isOk = true;
+
+    for(    ::fwRuntime::ConfigurationElement::Iterator configEltIter = _cfgElement->begin() ;
+            configEltIter != _cfgElement->end();
+            ++configEltIter)
+    {
+        std::string subElementName = (*configEltIter)->getName();
+        if(     subElementName != "service" &&
+                subElementName != "serviceList"    )
+        {
+            OSLM_ERROR("xml subelement \""<< subElementName <<"\" for element object is not supported for the moment when you use a reference on item composite.");
+            isOk = false;
+        }
+    }
+
+    return isOk;
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::updating( ) throw( ::fwTools::Failed)
+{
+    SLM_FATAL("Sorry, this method is depreciated.");
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::createConfig( ::fwTools::Object::sptr _obj )
+{
+    // Declaration of attributes values
+    const std::string OBJECT_BUILD_MODE = "src";
+    const std::string BUILD_OBJECT = "new";
+    const std::string GET_OBJECT = "ref";
+
+    ::fwData::Composite::sptr dataComposite = ::fwData::Composite::dynamicCast(_obj);
+    SLM_ASSERT("Sorry, object given in parameter is not a fwData::Composite",dataComposite);
+
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElement::csptr elem, m_cfg->getElements() )
+    {
+        if( elem->getName() == "item" )
+        {
+
+            // Test build mode
+            std::string buildMode = BUILD_OBJECT;
+
+            if ( elem->hasAttribute( OBJECT_BUILD_MODE ) )
+            {
+                buildMode = elem->getExistingAttributeValue( OBJECT_BUILD_MODE );
+                OSLM_ASSERT( "Sorry, buildMode \""<< buildMode <<"\" is not supported by the application.", buildMode == BUILD_OBJECT || buildMode == GET_OBJECT );
+            }
+
+            SLM_ASSERT( "Sorry, the xml element \"item\" must have an attribute named \"key\" .", elem->hasAttribute("key") );
+            std::string key = elem->getExistingAttributeValue("key");
+            SLM_ASSERT( "Sorry, the xml element \"item\" must have an attribute named \"key\" not empty.", ! key.empty() );
+            SLM_ASSERT( "Sorry, xml element item must have one (and only one) xml sub-element \"object\".", elem->size() == 1 && (*elem->getElements().begin())->getName() == "object" );
+
+            if( buildMode == BUILD_OBJECT )
+            {
+                // Test if key already exist in composite
+                OSLM_ASSERT("Sorry the key "<< key <<" already exists in the composite.", dataComposite->find( key ) == dataComposite->end() );
+
+                // Create and manage object config
+                ::fwServices::AppConfigManager::sptr ctm = ::fwServices::AppConfigManager::New();
+                ctm->setConfig( * ( elem->getElements().begin() ) );
+                m_ctmContainer.push_back( ctm );
+                ctm->create();
+                ::fwData::Object::sptr localObj = ctm->getConfigRoot< ::fwData::Object >();
+
+                // Add object
+                SLM_ASSERT("Sorry an ::fwData::Composite can contain only ::fwData::Object", localObj );
+                (*dataComposite)[ key ] = localObj;
+
+            }
+            else // if( buildMode == GET_OBJECT )
+            {
+                SLM_FATAL("ACH => Todo");
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::startConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->start();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::updateConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->update();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::stopConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->stop();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::destroyConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->destroy();
+    }
+    m_ctmContainer.clear();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace parser
+} //namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/parser/GenericField.cpp b/SrcLib/core/fwComEd/src/fwComEd/parser/GenericField.cpp
new file mode 100644
index 0000000..a4b03b1
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/parser/GenericField.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/GenericField.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+
+#include "fwComEd/parser/GenericField.hpp"
+
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::BooleanParser, ::fwData::Boolean );
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::IntegerParser, ::fwData::Integer );
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::FloatParser, ::fwData::Float );
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::StringParser, ::fwData::String );
+
+
+namespace fwComEd
+{
+namespace parser
+{
+
+//------------------------------------------------------------------------------
+
+void GenericField::updating( ) throw(fwTools::Failed)
+{
+    SLM_FATAL("Sorry, this method is depreciated.");
+}
+
+//------------------------------------------------------------------------------
+
+void GenericField::createConfig( ::fwTools::Object::sptr _obj )
+{
+    ::fwData::GenericFieldBase::sptr field = ::fwData::GenericFieldBase::dynamicCast( _obj );
+    SLM_ASSERT("GenericField not instanced", field);
+
+    ::fwRuntime::ConfigurationElementContainer configs = m_cfg->findAllConfigurationElement("value");
+    SLM_ASSERT("GenericField config must contain at most one tag <value>...</value>", configs.size() <= 1);
+
+    if ( configs.size() >= 1 )
+    {
+        ::fwRuntime::ConfigurationElement::sptr config = *configs.begin();
+        std::string input = config->getValue();
+        field->fromString(input);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace parser
+} //namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/parser/List.cpp b/SrcLib/core/fwComEd/src/fwComEd/parser/List.cpp
new file mode 100644
index 0000000..f21993b
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/parser/List.cpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/List.hpp>
+
+#include "fwComEd/parser/List.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::List, ::fwData::List );
+
+namespace fwComEd
+{
+namespace parser
+{
+
+//------------------------------------------------------------------------------
+
+bool List::refObjectValidator( ::fwRuntime::ConfigurationElement::sptr _cfgElement )
+{
+    bool isOk = true;
+
+    for(    ::fwRuntime::ConfigurationElement::Iterator configEltIter = _cfgElement->begin() ;
+            configEltIter != _cfgElement->end();
+            ++configEltIter)
+    {
+        std::string subElementName = (*configEltIter)->getName();
+        if(     subElementName != "service" &&
+                subElementName != "serviceList"    )
+        {
+            OSLM_ERROR("xml subelement \""<< subElementName <<"\" for element object is not supported for the moment when you use a reference on item List.");
+            isOk = false;
+        }
+    }
+
+    return isOk;
+}
+
+//------------------------------------------------------------------------------
+
+void List::updating( ) throw(fwTools::Failed)
+{
+    SLM_FATAL("Sorry, this method is depreciated.");
+}
+
+//------------------------------------------------------------------------------
+
+void List::createConfig( ::fwTools::Object::sptr _obj )
+{
+    // Declaration of attributes values
+    const std::string OBJECT_BUILD_MODE = "src";
+    const std::string BUILD_OBJECT = "new";
+    const std::string GET_OBJECT = "ref";
+
+    ::fwData::List::sptr dataList = ::fwData::List::dynamicCast(_obj);
+    SLM_ASSERT("Sorry, object given in parameter is not a fwData::List",dataList);
+
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElement::csptr elem, m_cfg->getElements() )
+    {
+        if( elem->getName() == "item" )
+        {
+
+            // Test build mode
+            std::string buildMode = BUILD_OBJECT;
+
+
+            if ( elem->hasAttribute( OBJECT_BUILD_MODE ) )
+            {
+                buildMode = elem->getExistingAttributeValue( OBJECT_BUILD_MODE );
+                OSLM_ASSERT( "Sorry, buildMode \""<< buildMode <<"\" is not supported by the application.", buildMode == BUILD_OBJECT || buildMode == GET_OBJECT );
+            }
+
+            if( buildMode == BUILD_OBJECT )
+            {
+
+                // Create and manage object config
+                ::fwServices::AppConfigManager::sptr ctm = ::fwServices::AppConfigManager::New();
+                ctm->setConfig( * ( elem->getElements().begin() ) );
+                m_ctmContainer.push_back( ctm );
+                ctm->create();
+                ::fwData::Object::sptr localObj = ctm->getConfigRoot< ::fwData::Object >();
+
+                // Add object
+                SLM_ASSERT("Sorry an ::fwData::List can contain only ::fwData::Object", localObj );
+                dataList->getContainer().push_back( localObj );
+
+            }
+            else // if( buildMode == GET_OBJECT )
+            {
+                SLM_FATAL("ACH => Todo");
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void List::startConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->start();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void List::updateConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->update();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void List::stopConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->stop();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void List::destroyConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->destroy();
+    }
+    m_ctmContainer.clear();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace parser
+} //namespace fwComEd
+
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/parser/Object.cpp b/SrcLib/core/fwComEd/src/fwComEd/parser/Object.cpp
new file mode 100644
index 0000000..02c1839
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/parser/Object.cpp
@@ -0,0 +1,159 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+
+#include <fwServices/macros.hpp>
+
+#include "fwComEd/parser/Object.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser , ::fwComEd::parser::Object , ::fwData::Object ) ;
+
+namespace fwComEd
+{
+namespace parser
+{
+
+//------------------------------------------------------------------------------
+
+Object::Object( )
+{}
+
+//------------------------------------------------------------------------------
+
+Object::~Object()
+{}
+
+//------------------------------------------------------------------------------
+
+bool Object::refObjectValidator( ::fwRuntime::ConfigurationElement::csptr _cfgElement )
+{
+    bool isOk = true;
+
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElement::csptr elem, _cfgElement->getElements() )
+    {
+        std::string subElementName = elem->getName();
+        if(     subElementName != "service" &&
+                subElementName != "serviceList"    )
+        {
+            OSLM_ERROR("xml subelement \""<< subElementName <<"\" for element object is not supported for the moment when you use a reference on item composite.");
+            isOk = false;
+        }
+    }
+
+    return isOk;
+}
+
+//------------------------------------------------------------------------------
+
+void Object::updating( ) throw(fwTools::Failed)
+{
+    SLM_FATAL("Sorry, this method is depreciated");
+}
+
+
+//------------------------------------------------------------------------------
+
+void Object::createConfig( ::fwTools::Object::sptr _obj )
+{
+    // Declaration of attributes values
+    const std::string OBJECT_BUILD_MODE = "src";
+    const std::string BUILD_OBJECT = "new";
+    const std::string GET_OBJECT = "ref";
+
+    ::fwData::Object::sptr associatedObject = ::fwData::Object::dynamicCast(_obj);
+    SLM_ASSERT("associatedObject not instanced", associatedObject);
+
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElement::csptr elem, m_cfg->getElements() )
+    {
+
+        if( elem->getName() == "item" )
+        {
+            // Test build mode
+            std::string buildMode = BUILD_OBJECT;
+
+            if ( elem->hasAttribute( OBJECT_BUILD_MODE ) )
+            {
+                buildMode = elem->getExistingAttributeValue( OBJECT_BUILD_MODE );
+                OSLM_ASSERT( "Sorry, buildMode \""<< buildMode <<"\" is not supported by the application.", buildMode == BUILD_OBJECT || buildMode == GET_OBJECT );
+            }
+
+
+            SLM_ASSERT( "Sorry, the xml element \"item\" must have an attribute named \"key\" .", elem->hasAttribute("key") );
+            std::string key = elem->getExistingAttributeValue("key");
+            SLM_ASSERT( "Sorry, the xml element \"item\" must have an attribute named \"key\" not empty.", ! key.empty() );
+            SLM_ASSERT( "Sorry, xml element item must have one (and only one) xml sub-element \"object\".", elem->size() == 1 && (*(elem->getElements().begin()))->getName() == "object" );
+
+            if( buildMode == BUILD_OBJECT )
+            {
+                // Test if key already exist in object
+                OSLM_ASSERT("Sorry the key "<< key <<" already exists in the object.", !associatedObject->getField( key ) );
+
+                // Create and manage object config
+                ::fwServices::AppConfigManager::sptr ctm = ::fwServices::AppConfigManager::New();
+                ctm->setConfig( *(elem->getElements().begin()) );
+                m_ctmContainer.push_back( ctm );
+                ctm->create();
+                ::fwData::Object::sptr localObj = ctm->getConfigRoot< ::fwData::Object >();
+
+                // Add object
+                associatedObject->setField(key, localObj);
+            }
+            else // if( buildMode == GET_OBJECT )
+            {
+                SLM_FATAL("ACH => Todo");
+                // ToDo
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::startConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->start();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::updateConfig()
+{
+    BOOST_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->update();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::stopConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->stop();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::destroyConfig()
+{
+    BOOST_REVERSE_FOREACH( ::fwServices::AppConfigManager::sptr ctm, m_ctmContainer )
+    {
+        ctm->destroy();
+    }
+    m_ctmContainer.clear();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace parser
+} //namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/src/fwComEd/parser/TransformationMatrix3D.cpp b/SrcLib/core/fwComEd/src/fwComEd/parser/TransformationMatrix3D.cpp
new file mode 100644
index 0000000..29ae279
--- /dev/null
+++ b/SrcLib/core/fwComEd/src/fwComEd/parser/TransformationMatrix3D.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/macros.hpp>
+#include <fwServices/Base.hpp>
+
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include "fwComEd/parser/TransformationMatrix3D.hpp"
+
+fwServicesRegisterMacro( ::fwServices::IXMLParser, ::fwComEd::parser::TransformationMatrix3D, ::fwData::TransformationMatrix3D );
+
+namespace fwComEd
+{
+namespace parser
+{
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3D::updating( ) throw(fwTools::Failed)
+{
+    SLM_FATAL("Sorry, this method is depreciated.");
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3D::createConfig( ::fwTools::Object::sptr _obj )
+{
+    ::fwData::TransformationMatrix3D::sptr matrix = ::fwData::TransformationMatrix3D::dynamicCast( _obj );
+    SLM_ASSERT("matrix not instanced", matrix);
+
+    BOOST_FOREACH( ::fwRuntime::ConfigurationElement::csptr elem, m_cfg->getElements() )
+    {
+        if ( elem->getName() == "matrix" )
+        {
+            std::string input = elem->getValue();
+            std::istringstream inputString( input );
+
+            matrix->getRefCoefficients().clear();
+            matrix->getRefCoefficients().reserve(16);
+
+            double coef;
+            for ( unsigned int k=0; k < 16; k++)
+            {
+                inputString >> coef;
+                matrix->getRefCoefficients().push_back( coef );
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace parser
+} //namespace fwComEd
+
diff --git a/SrcLib/core/fwComEd/test/CMakeLists.txt b/SrcLib/core/fwComEd/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwComEd/test/Properties.cmake b/SrcLib/core/fwComEd/test/Properties.cmake
new file mode 100644
index 0000000..447ac1b
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwComEdTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwMedData fwServices fwComEd )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwComEd/test/cppunit.options b/SrcLib/core/fwComEd/test/cppunit.options
new file mode 100644
index 0000000..d496f53
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/cppunit.options
@@ -0,0 +1,22 @@
+CLASSTEST=[
+    'ConfigParserTest',
+    'CompositeMessageTest',
+    'FieldHelperTest',
+    'MessagesTest',
+    'VectorMsgTest',
+    'SeriesDBMsgTest',
+    ]
+
+USE = ['boost']
+LIB = [
+      'fwTools_0-1',
+      'fwCore_0-1',
+      'fwRuntime_0-3',
+      'fwData_0-1',
+      'fwMedData_0-1',
+      'fwServices_0-1',
+      'fwComEd_0-1',
+      'fwTest_0-1'
+      ]
+
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwComEd/test/tu/include/CompositeMessageTest.hpp b/SrcLib/core/fwComEd/test/tu/include/CompositeMessageTest.hpp
new file mode 100644
index 0000000..533c5ed
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/CompositeMessageTest.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TU_COMPOSITEMESSAGETEST_HPP_
+#define _FWCOMED_TU_COMPOSITEMESSAGETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Test ProcessObject building from a ConfigurationElement and composite message.
+ * @see     ICompositeParser
+ * @see     CompositeEditor
+ * @see     CompositeMsg
+ */
+class CompositeMessageTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CompositeMessageTest );
+    CPPUNIT_TEST( testCompositeMessage );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+    /// Test the compositeMsg with sending and receiving the message in the test services
+    void testCompositeMessage();
+
+private:
+    /// Create a configurationElement to build the composite
+    ::fwRuntime::ConfigurationElement::sptr buildConfig();
+};
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // _FWCOMED_TU_COMPOSITEMESSAGETEST_HPP_
diff --git a/SrcLib/core/fwComEd/test/tu/include/ConfigParserTest.hpp b/SrcLib/core/fwComEd/test/tu/include/ConfigParserTest.hpp
new file mode 100644
index 0000000..2a399ba
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/ConfigParserTest.hpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TU_CONFIGPARSERTEST_HPP_
+#define _FWCOMED_TU_CONFIGPARSERTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Test ProcessObject building from a ConfigurationElement and composite message.
+ * @see     ICompositeParser
+ * @see     CompositeEditor
+ * @see     CompositeMsg
+ */
+class ConfigParserTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ConfigParserTest );
+    CPPUNIT_TEST( testObjectCreationWithConfig );
+    CPPUNIT_TEST( testBuildComposite );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    /// test object with services creation from a configuration
+    void testObjectCreationWithConfig();
+
+    /// Test the composite building
+    void testBuildComposite();
+
+private:
+    /// Create a configurationElement to build an object
+    ::fwRuntime::ConfigurationElement::sptr buildObjectConfig();
+
+    /// Create a configurationElement to build the composite
+    ::fwRuntime::ConfigurationElement::sptr buildCompositeConfig();
+};
+
+
+/**
+ * @brief   Service type for test.
+ */
+class TestService : public ::fwServices::IService
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (TestService)(::fwServices::IService) ) ;
+    TestService() throw()
+    :   m_isUpdated(false),
+        m_isUpdatedMessage(false)
+        {}
+
+    virtual ~TestService() throw() {}
+
+    /// return true if the service is updated with updating() method
+    bool getIsUpdated() { return m_isUpdated; }
+
+    /// return true if the service is updated with updating(msg) method
+    bool getIsUpdatedMessage() { return m_isUpdatedMessage; }
+
+    /// return the message receiving in updating(msg) method
+    ::fwServices::ObjectMsg::sptr getMessage() { return m_compoMsg; }
+
+    const std::string & getMessageEvent(){return m_messageEvent;}
+
+
+protected:
+    virtual void configuring() throw( ::fwTools::Failed ) {}
+    virtual void starting() throw(::fwTools::Failed) {}
+    virtual void stopping() throw(::fwTools::Failed) {}
+    virtual void updating() throw(::fwTools::Failed) {}
+    virtual void info( std::ostream &_sstream ) {_sstream << "TestService" ;}
+
+    bool m_isUpdated;
+    bool m_isUpdatedMessage;
+    std::string m_messageEvent;
+    ::fwServices::ObjectMsg::sptr m_compoMsg;
+};
+
+/**
+ * @brief   Test service implementation for composite
+ */
+class TestServiceImplementationComposite : public TestService
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (TestServiceImplementationComposite)(::fwComEd::ut::TestService) ) ;
+    TestServiceImplementationComposite() throw() {};
+    virtual ~TestServiceImplementationComposite() throw() {};
+
+    virtual void configuring() throw( ::fwTools::Failed ) {};
+    virtual void starting() throw(::fwTools::Failed) {};
+    virtual void stopping() throw(::fwTools::Failed) {
+        SLM_TRACE_FUNC();
+    };
+    virtual void updating() throw(::fwTools::Failed) { m_isUpdated = true; };
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+    {
+        ::fwComEd::CompositeMsg::csptr compositeMessage = ::fwComEd::CompositeMsg::dynamicConstCast( _msg );
+        m_messageEvent.clear();
+
+        if (compositeMessage)
+        {
+            if( compositeMessage->hasEvent(::fwComEd::CompositeMsg::ADDED_KEYS))
+            {
+                m_messageEvent += ::fwComEd::CompositeMsg::ADDED_KEYS;
+            }
+            if( compositeMessage->hasEvent(::fwComEd::CompositeMsg::CHANGED_KEYS))
+            {
+                m_messageEvent += ::fwComEd::CompositeMsg::CHANGED_KEYS;
+            }
+            if( compositeMessage->hasEvent(::fwComEd::CompositeMsg::REMOVED_KEYS))
+            {
+                m_messageEvent += ::fwComEd::CompositeMsg::REMOVED_KEYS;
+            }
+
+            m_isUpdatedMessage = true;
+            m_compoMsg = ::boost::const_pointer_cast< ::fwServices::ObjectMsg >( _msg ) ;
+        }
+    };
+};
+
+/**
+ * @brief   Test service implementation for image
+ */
+class TestServiceImplementationImage : public TestService
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (TestServiceImplementationImage)(::fwComEd::ut::TestService) ) ;
+    TestServiceImplementationImage() throw() {};
+    virtual ~TestServiceImplementationImage() throw() {};
+
+    virtual void configuring() throw( ::fwTools::Failed ) {};
+    virtual void starting() throw(::fwTools::Failed) {};
+    virtual void stopping() throw(::fwTools::Failed) {};
+    virtual void updating() throw(::fwTools::Failed) { m_isUpdated = true; };
+    virtual void receiving( ::boost::shared_ptr< const ::fwServices::ObjectMsg > _msg ) throw(::fwTools::Failed)
+    {
+        ::fwComEd::ImageMsg::csptr imageMessage = ::fwComEd::ImageMsg::dynamicConstCast( _msg );
+        if (imageMessage && imageMessage->hasEvent(::fwComEd::ImageMsg::SLICE_INDEX))
+        {
+            // if receiving a imageMsg : tag service is updated
+            m_isUpdatedMessage = true;
+            m_compoMsg = ::boost::const_pointer_cast< ::fwServices::ObjectMsg >( _msg ) ;
+        }
+    };
+};
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // _FWCOMED_TU_CONFIGPARSERTEST_HPP_
diff --git a/SrcLib/core/fwComEd/test/tu/include/FieldHelperTest.hpp b/SrcLib/core/fwComEd/test/tu/include/FieldHelperTest.hpp
new file mode 100644
index 0000000..3698a83
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/FieldHelperTest.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TU_FIELDHELPERTEST_HPP_
+#define _FWCOMED_TU_FIELDHELPERTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Test ProcessObject building from a ConfigurationElement and composite message.
+ * @see     ICompositeParser
+ * @see     CompositeEditor
+ * @see     CompositeMsg
+ */
+class FieldHelperTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( FieldHelperTest );
+    CPPUNIT_TEST( testHelper );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+    /// Test the compositeMsg with sending and receiving the message in the test services
+    void testHelper();
+
+};
+
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // _FWCOMED_TU_FIELDHELPERTEST_HPP_
diff --git a/SrcLib/core/fwComEd/test/tu/include/MessagesTest.hpp b/SrcLib/core/fwComEd/test/tu/include/MessagesTest.hpp
new file mode 100644
index 0000000..59bf2e8
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/MessagesTest.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMED_TU_MESSAGESTEST_HPP_
+#define _FWCOMED_TU_MESSAGESTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Test specified object messages.
+ */
+class MessagesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MessagesTest );
+    CPPUNIT_TEST( testFloatMsg );
+    CPPUNIT_TEST( testImageMsg );
+    CPPUNIT_TEST( messageCreationTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+
+    /// test FloatMsg
+    void testFloatMsg();
+
+    /// test ImageMsg
+    void testImageMsg();
+
+    void messageCreationTest();
+};
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // _FWCOMED_TU_MESSAGESTEST_HPP_
diff --git a/SrcLib/core/fwComEd/test/tu/include/SeriesDBMsgTest.hpp b/SrcLib/core/fwComEd/test/tu/include/SeriesDBMsgTest.hpp
new file mode 100644
index 0000000..95bee69
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/SeriesDBMsgTest.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_TU_SERIESDBMSGTEST_HPP__
+#define __FWCOMED_TU_SERIESDBMSGTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwComEd/SeriesDBMsg.hpp>
+
+#include "ConfigParserTest.hpp"
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Tests for SeriesDBMsg.
+ */
+class SeriesDBMsgTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBMsgTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST( seriesDBHelperTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+
+    void seriesDBHelperTest();
+
+};
+
+class SSeriesDBTest : public ::fwComEd::ut::TestService
+{
+
+public:
+    virtual ~SSeriesDBTest() throw() {};
+
+    fwCoreServiceClassDefinitionsMacro ( (SSeriesDBTest)(::fwComEd::ut::TestService) ) ;
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+    {
+        m_isUpdated = true;
+        m_seriesDBMsg = ::fwComEd::SeriesDBMsg::dynamicConstCast( _msg ) ;
+    }
+
+    ::fwComEd::SeriesDBMsg::csptr m_seriesDBMsg;
+};
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // __FWCOMED_TU_SERIESDBMSGTEST_HPP__
diff --git a/SrcLib/core/fwComEd/test/tu/include/VectorMsgTest.hpp b/SrcLib/core/fwComEd/test/tu/include/VectorMsgTest.hpp
new file mode 100644
index 0000000..c75df80
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/include/VectorMsgTest.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCOMED_TU_VECTORMSGTEST_HPP__
+#define __FWCOMED_TU_VECTORMSGTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwCore/base.hpp>
+
+#include "ConfigParserTest.hpp"
+
+namespace fwComEd
+{
+namespace ut
+{
+
+/**
+ * @brief   Tests for VectorMsg.
+ */
+class VectorMsgTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( VectorMsgTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST( vectorHelperTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+
+    void vectorHelperTest();
+
+};
+
+class SVectorTest : public ::fwComEd::ut::TestService
+{
+
+public:
+    virtual ~SVectorTest() throw() {};
+
+    fwCoreServiceClassDefinitionsMacro ( (SVectorTest)(::fwComEd::ut::TestService) ) ;
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+    {
+        m_isUpdated = true;
+        m_vectMsg = ::fwComEd::VectorMsg::dynamicConstCast( _msg ) ;
+    }
+
+    ::fwComEd::VectorMsg::csptr m_vectMsg;
+};
+
+} //namespace ut
+} //namespace fwComEd
+
+#endif // __FWCOMED_TU_VECTORMSGTEST_HPP__
diff --git a/SrcLib/core/fwComEd/test/tu/src/CompositeMessageTest.cpp b/SrcLib/core/fwComEd/test/tu/src/CompositeMessageTest.cpp
new file mode 100644
index 0000000..1437132
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/CompositeMessageTest.cpp
@@ -0,0 +1,225 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "ConfigParserTest.hpp"
+#include "CompositeMessageTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::CompositeMessageTest );
+
+namespace fwComEd
+{
+namespace ut
+{
+
+static ::fwTest::Exception fwTestException(""); // force link with fwTest
+
+//------------------------------------------------------------------------------
+
+void CompositeMessageTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void CompositeMessageTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void CompositeMessageTest::testCompositeMessage()
+{
+    ::fwServices::registry::ActiveWorkers::sptr activeWorkers = ::fwServices::registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    const std::string objAUUID = "imageUUID";
+    const std::string service1UUID = "service1UUID";
+    const std::string service2UUID = "service2UUID";
+
+    // build composite
+    ::fwRuntime::ConfigurationElement::sptr config = buildConfig() ;
+
+    // Create the object and its services from the configuration
+    ::fwServices::AppConfigManager::sptr configManager = ::fwServices::AppConfigManager::New();
+    configManager->setConfig( config );
+    configManager->create();
+    ::fwData::Composite::sptr compo = configManager->getConfigRoot< ::fwData::Composite >();
+
+    ::fwData::Object::sptr image = compo->getContainer()[objAUUID];
+
+    // get service 1
+    ::fwComEd::ut::TestService::sptr serviceCompo;
+    serviceCompo = ::fwComEd::ut::TestService::dynamicCast( ::fwServices::get(service1UUID) );
+    CPPUNIT_ASSERT(serviceCompo);
+
+    // get service 2
+    ::fwComEd::ut::TestService::sptr serviceCompo2;
+    serviceCompo2 = ::fwComEd::ut::TestService::dynamicCast( ::fwServices::get(service2UUID) );
+    CPPUNIT_ASSERT(serviceCompo2);
+
+    // start services
+    configManager->start();
+    CPPUNIT_ASSERT(serviceCompo->isStarted());
+    CPPUNIT_ASSERT(serviceCompo2->isStarted());
+
+    // register communication channel
+    ::fwServices::helper::SigSlotConnection::sptr helper = ::fwServices::helper::SigSlotConnection::New();
+    helper->connect( compo, serviceCompo, serviceCompo->getObjSrvConnections() );
+    helper->connect( compo, serviceCompo2, serviceCompo2->getObjSrvConnections() );
+
+    ::fwComEd::CompositeMsg::sptr compoMsg;
+    compoMsg = ::fwComEd::CompositeMsg::New();
+    compoMsg->appendAddedKey(objAUUID, image);
+    ::fwServices::IEditionService::notify(serviceCompo2, compo, compoMsg);
+
+    // Wait a little notification system
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+    // test message is received
+    CPPUNIT_ASSERT(serviceCompo->getIsUpdatedMessage());
+    CPPUNIT_ASSERT(!serviceCompo2->getIsUpdatedMessage());
+    CPPUNIT_ASSERT_EQUAL(::fwComEd::CompositeMsg::ADDED_KEYS, serviceCompo->getMessageEvent());
+
+    ::fwData::Composite::sptr addedKeys = compoMsg->getAddedKeys();
+    CPPUNIT_ASSERT((*addedKeys).find(objAUUID) != (*addedKeys).end());
+    CPPUNIT_ASSERT_EQUAL(image, (*addedKeys)[objAUUID]);
+
+
+    ::fwData::Object::sptr newImage = ::fwData::Image::New();
+    compoMsg = ::fwComEd::CompositeMsg::New();
+    compoMsg->appendChangedKey(objAUUID, image, newImage);
+    ::fwServices::IEditionService::notify(serviceCompo2, compo, compoMsg);
+
+    // Wait a little notification system
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+    // test message is received
+    CPPUNIT_ASSERT(serviceCompo->getIsUpdatedMessage());
+    CPPUNIT_ASSERT(!serviceCompo2->getIsUpdatedMessage());
+    CPPUNIT_ASSERT_EQUAL(::fwComEd::CompositeMsg::CHANGED_KEYS, serviceCompo->getMessageEvent());
+
+    ::fwData::Composite::sptr oldChangedKeys = compoMsg->getOldChangedKeys();
+    ::fwData::Composite::sptr newChangedKeys = compoMsg->getNewChangedKeys();
+    CPPUNIT_ASSERT((*oldChangedKeys).find(objAUUID) != (*oldChangedKeys).end() );
+    CPPUNIT_ASSERT_EQUAL(image, (*oldChangedKeys)[objAUUID]);
+    CPPUNIT_ASSERT((*newChangedKeys).find(objAUUID) != (*newChangedKeys).end() );
+    CPPUNIT_ASSERT_EQUAL(newImage, (*newChangedKeys)[objAUUID]);
+
+
+    compoMsg = ::fwComEd::CompositeMsg::New();
+    compoMsg->appendRemovedKey(objAUUID, image);
+    ::fwServices::IEditionService::notify(serviceCompo2, compo, compoMsg);
+
+    // Wait a little notification system
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+    // test message is received
+    CPPUNIT_ASSERT(serviceCompo->getIsUpdatedMessage());
+    CPPUNIT_ASSERT(!serviceCompo2->getIsUpdatedMessage());
+    CPPUNIT_ASSERT_EQUAL(::fwComEd::CompositeMsg::REMOVED_KEYS, serviceCompo->getMessageEvent());
+
+    ::fwData::Composite::sptr removedKeys = compoMsg->getRemovedKeys();
+    CPPUNIT_ASSERT((*removedKeys).find(objAUUID) != (*removedKeys).end());
+    CPPUNIT_ASSERT_EQUAL(image, (*removedKeys)[objAUUID]);
+
+
+
+    // unregister communication channel
+    helper->disconnect();
+    helper.reset();
+
+    // stop services
+    configManager->stopAndDestroy();
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::ConfigurationElement > CompositeMessageTest::buildConfig()
+{
+    // Composite
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("object")) ;
+    cfg->setAttributeValue( "uid" , "compositeUUID") ;
+    cfg->setAttributeValue( "type" , "::fwData::Composite") ;
+
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > itemA = cfg->addConfigurationElement("item");
+     itemA->setAttributeValue( "key" , "imageUUID") ;
+
+
+    // composite object : image
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > objA = itemA->addConfigurationElement("object");
+    objA->setAttributeValue( "uid" , "imageUUID") ;
+    objA->setAttributeValue( "type" , "::fwData::Image") ;
+
+    // image's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > imageService = objA->addConfigurationElement("service");
+    imageService->setAttributeValue( "uid" , "myImageService" ) ;
+    imageService->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > imageService2 = objA->addConfigurationElement("service");
+    imageService2->setAttributeValue( "uid" , "myImageService2" ) ;
+    imageService2->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > itemB = cfg->addConfigurationElement("item");
+     itemB->setAttributeValue( "key" , "videoUUID") ;
+
+
+    // composite object : video
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > objB = itemB->addConfigurationElement("object");
+    objB->setAttributeValue( "uid" , "videoUUID") ;
+    //objB->setAttributeValue( "id" , "videoUUID") ;
+    objB->setAttributeValue( "type" , "::fwData::Video") ;
+
+    // composite's service 1
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > service = cfg->addConfigurationElement("service");
+    service->setAttributeValue( "uid" , "service1UUID" ) ;
+    service->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationComposite" ) ;
+
+    // start / stop / update on service 1
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > start = cfg->addConfigurationElement("start");
+    start->setAttributeValue( "uid" , "service1UUID" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > update = cfg->addConfigurationElement("update");
+    update->setAttributeValue( "uid" , "service1UUID" ) ;
+
+    // composite's service 2
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > service2 = cfg->addConfigurationElement("service");
+    service2->setAttributeValue( "uid" , "service2UUID" ) ;
+    service2->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationComposite" ) ;
+
+    // start / stop / update on service 2
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > start2 = cfg->addConfigurationElement("start");
+    start2->setAttributeValue( "uid" , "service2UUID" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > update2 = cfg->addConfigurationElement("update");
+    update2->setAttributeValue( "uid" , "service2UUID" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/test/tu/src/ConfigParserTest.cpp b/SrcLib/core/fwComEd/test/tu/src/ConfigParserTest.cpp
new file mode 100644
index 0000000..a8d0f5d
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/ConfigParserTest.cpp
@@ -0,0 +1,238 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Video.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+
+#include "ConfigParserTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::ConfigParserTest );
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwComEd::ut::TestService , ::fwComEd::ut::TestServiceImplementationComposite , ::fwData::Composite ) ;
+fwServicesRegisterMacro( ::fwComEd::ut::TestService , ::fwComEd::ut::TestServiceImplementationImage , ::fwData::Image ) ;
+
+namespace fwComEd
+{
+namespace ut
+{
+
+void ConfigParserTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigParserTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigParserTest::testObjectCreationWithConfig()
+{
+    const std::string objectUUID = "objectUUID";
+    const std::string serviceUUID1 = "myTestService1";
+    const std::string serviceUUID2 = "myTestService2";
+
+    // Create object configuration
+    ::fwRuntime::ConfigurationElement::sptr config = buildObjectConfig() ;
+
+    // Create the object and its services from the configuration
+    ::fwServices::AppConfigManager::sptr configManager = ::fwServices::AppConfigManager::New();
+    configManager->setConfig( config );
+    configManager->create();
+    ::fwData::Image::sptr image = configManager->getConfigRoot< ::fwData::Image >();
+
+    // Test object uid
+    CPPUNIT_ASSERT_EQUAL(objectUUID, image->getID());
+
+    // Test if object's service is created
+    CPPUNIT_ASSERT( ::fwServices::OSR::has(image, "::fwComEd::ut::TestService"));
+
+    // Test start services
+    configManager->start();
+    CPPUNIT_ASSERT( ::fwServices::get(serviceUUID1)->isStarted() );
+    CPPUNIT_ASSERT( ::fwServices::get(serviceUUID2)->isStarted() );
+
+    // Test update services
+    configManager->update();
+    CPPUNIT_ASSERT( ::fwComEd::ut::TestService::dynamicCast( ::fwServices::get(serviceUUID1) )->getIsUpdated() );
+    CPPUNIT_ASSERT( ::fwComEd::ut::TestService::dynamicCast( ::fwServices::get(serviceUUID2) )->getIsUpdated() == false );
+
+    // Test stop services
+    configManager->stop();
+    CPPUNIT_ASSERT( ::fwServices::get(serviceUUID1)->isStopped() );
+    CPPUNIT_ASSERT( ::fwServices::get(serviceUUID2)->isStopped() );
+
+    configManager->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigParserTest::testBuildComposite()
+{
+    const std::string compositeUUID = "compositeUUID";
+    const std::string objAUUID = "imageUUID";
+    const std::string objBUUID = "videoUUID";
+    const std::string serviceUUID1 = "myTestService1";
+    const std::string objAType = "::fwData::Image";
+
+    // build composite from ConfigurationElement
+    ::boost::shared_ptr< ::fwRuntime::ConfigurationElement > config = buildCompositeConfig() ;
+
+    // Create the object and its services from the configuration
+    ::fwServices::AppConfigManager::sptr configManager = ::fwServices::AppConfigManager::New();
+    configManager->setConfig( config );
+    configManager->create();
+    ::fwData::Composite::sptr compo = configManager->getConfigRoot< ::fwData::Composite >();
+
+    // test composite
+    CPPUNIT_ASSERT_EQUAL(compositeUUID, compo->getID());
+
+    // test composite objects
+    CPPUNIT_ASSERT(compo->getContainer().size() > 0);
+
+    CPPUNIT_ASSERT(compo->find(objAUUID) != compo->end());
+
+    CPPUNIT_ASSERT_EQUAL(objAType, compo->getContainer()[objAUUID]->className());
+
+    ::fwData::Video::sptr video = ::fwData::Video::dynamicCast(compo->getContainer()[objBUUID]);
+    CPPUNIT_ASSERT_EQUAL(objBUUID, video->getID());
+
+    // test composite services
+    ::fwData::Image::sptr image = ::fwData::Image::dynamicCast(compo->getContainer()[objAUUID]);
+    CPPUNIT_ASSERT_EQUAL(objAUUID, image->getID());
+    CPPUNIT_ASSERT( ::fwServices::OSR::has(image, "::fwComEd::ut::TestService"));
+
+    CPPUNIT_ASSERT( ::fwServices::OSR::has(compo, "::fwComEd::ut::TestService"));
+
+    /// test start/update/stop service
+    configManager->start();
+    CPPUNIT_ASSERT(::fwServices::get(serviceUUID1)->isStarted());
+
+    configManager->update();
+    CPPUNIT_ASSERT(::fwComEd::ut::TestService::dynamicCast(::fwServices::get(serviceUUID1))->getIsUpdated());
+
+    configManager->stop();
+    CPPUNIT_ASSERT(::fwServices::get(serviceUUID1)->isStopped());
+
+    configManager->destroy();
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::sptr ConfigParserTest::buildObjectConfig()
+{
+    // Configuration on fwTools::Object which uid is objectUUID
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("object")) ;
+    cfg->setAttributeValue( "uid" , "objectUUID") ;
+    cfg->setAttributeValue( "type" , "::fwData::Image") ;
+
+    // Object's service A
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceA = cfg->addConfigurationElement("service");
+    serviceA->setAttributeValue( "uid" , "myTestService1" ) ;
+    serviceA->setAttributeValue( "type" , "::fwComEd::ut::TestService" ) ;
+    serviceA->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    // Object's service B
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceB = cfg->addConfigurationElement("service");
+    serviceB->setAttributeValue( "uid" , "myTestService2" ) ;
+    serviceB->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    // Start method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startA = cfg->addConfigurationElement("start");
+    startA->setAttributeValue( "uid" , "myTestService1" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startB = cfg->addConfigurationElement("start");
+    startB->setAttributeValue( "uid" , "myTestService2" ) ;
+
+    // Update method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > updateA = cfg->addConfigurationElement("update");
+    updateA->setAttributeValue( "uid" , "myTestService1" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::sptr ConfigParserTest::buildCompositeConfig()
+{
+    // Composite
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("object")) ;
+    cfg->setAttributeValue( "uid" , "compositeUUID") ;
+    cfg->setAttributeValue( "type" , "::fwData::Composite") ;
+
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > itemA = cfg->addConfigurationElement("item");
+     itemA->setAttributeValue( "key" , "imageUUID") ;
+
+
+    // composite object : image
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > objA = itemA->addConfigurationElement("object");
+    objA->setAttributeValue( "uid" , "imageUUID") ;
+    objA->setAttributeValue( "type" , "::fwData::Image") ;
+
+    // image's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > imageService = objA->addConfigurationElement("service");
+    imageService->setAttributeValue( "uid" , "myImageService" ) ;
+    imageService->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > imageService2 = objA->addConfigurationElement("service");
+    imageService2->setAttributeValue( "uid" , "myImageService2" ) ;
+    imageService2->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > itemB = cfg->addConfigurationElement("item");
+     itemB->setAttributeValue( "key" , "videoUUID") ;
+
+
+    // composite object : video
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > objB = itemB->addConfigurationElement("object");
+    objB->setAttributeValue( "uid" , "videoUUID") ;
+    //objB->setAttributeValue( "id" , "videoUUID") ;
+    objB->setAttributeValue( "type" , "::fwData::Video") ;
+
+    // composite's service 1
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > service = cfg->addConfigurationElement("service");
+    service->setAttributeValue( "uid" , "myTestService1" ) ;
+    service->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationComposite" ) ;
+
+    // start / stop / update on service 1
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > start = cfg->addConfigurationElement("start");
+    start->setAttributeValue( "uid" , "myTestService1" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > update = cfg->addConfigurationElement("update");
+    update->setAttributeValue( "uid" , "myTestService1" ) ;
+
+    // composite's service 2
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > service2 = cfg->addConfigurationElement("service");
+    service2->setAttributeValue( "uid" , "myTestService2" ) ;
+    service2->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationComposite" ) ;
+
+    // start / stop / update on service 2
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > start2 = cfg->addConfigurationElement("start");
+    start2->setAttributeValue( "uid" , "myTestService2" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > update2 = cfg->addConfigurationElement("update");
+    update2->setAttributeValue( "uid" , "myTestService2" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/test/tu/src/FieldHelperTest.cpp b/SrcLib/core/fwComEd/test/tu/src/FieldHelperTest.cpp
new file mode 100644
index 0000000..65095c9
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/FieldHelperTest.cpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/String.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/ObjectMsg.hpp>
+
+#include <fwComEd/helper/Field.hpp>
+
+#include "ConfigParserTest.hpp"
+#include "FieldHelperTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::FieldHelperTest );
+
+namespace fwComEd
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void FieldHelperTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void FieldHelperTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void FieldHelperTest::testHelper()
+{
+    const std::string FIELD_ID1 = "FIELD_ID1";
+    const std::string FIELD_ID2 = "FIELD_ID2";
+    const std::string FIELD_ID3 = "FIELD_ID3";
+
+    ::fwData::Object::sptr nullobj;
+    ::fwData::Object::sptr obj = ::fwData::String::New();
+    ::fwData::Object::sptr fieldObj1 = ::fwData::String::New();
+    ::fwData::Object::sptr fieldObj2 = ::fwData::String::New();
+
+    {
+        ::fwComEd::helper::Field fieldHelper(obj);
+        fieldHelper.setField(FIELD_ID1, fieldObj1);
+        CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID1) == fieldObj1);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID2) == nullobj);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID3) == nullobj);
+    }
+
+    ::fwData::Object::FieldMapType localFields = obj->getFields();
+    ::fwData::Object::FieldMapType localFieldsBackup = obj->getFields();
+    localFields.insert( ::fwData::Object::FieldMapType::value_type(FIELD_ID2,fieldObj2));
+
+    {
+        ::fwComEd::helper::Field fieldHelper(obj);
+        fieldHelper.updateFields(localFields);
+        CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(2));
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID1) == fieldObj1);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID2) == fieldObj2);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID3) == nullobj);
+    }
+
+    {
+        ::fwComEd::helper::Field fieldHelper(obj);
+        fieldHelper.setFields(localFieldsBackup);
+        CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID1) == fieldObj1);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID2) == nullobj);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID3) == nullobj);
+    }
+
+    {
+        ::fwComEd::helper::Field fieldHelper(obj);
+        fieldHelper.setField(FIELD_ID1, fieldObj2);
+        CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID1) == fieldObj2);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID2) == nullobj);
+        CPPUNIT_ASSERT(obj->getField(FIELD_ID3) == nullobj);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/test/tu/src/MessagesTest.cpp b/SrcLib/core/fwComEd/test/tu/src/MessagesTest.cpp
new file mode 100644
index 0000000..1001e3d
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/MessagesTest.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwComEd/FloatMsg.hpp>
+#include <fwComEd/ImageMsg.hpp>
+#include <fwComEd/helper/MsgHelper.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "MessagesTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::MessagesTest );
+
+namespace fwComEd
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void MessagesTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void MessagesTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void MessagesTest::testFloatMsg()
+{
+    // create message
+    ::fwComEd::FloatMsg::sptr floatMsg = ::fwComEd::FloatMsg::New();
+    floatMsg->addEvent(::fwComEd::FloatMsg::VALUE_IS_MODIFIED);
+
+    // check Event
+    CPPUNIT_ASSERT(floatMsg->hasEvent(::fwComEd::FloatMsg::VALUE_IS_MODIFIED));
+}
+
+//------------------------------------------------------------------------------
+
+void MessagesTest::testImageMsg()
+{
+    const std::string MYMODIF1 = ::fwComEd::ImageMsg::BUFFER;
+    const std::string MYMODIF2 = ::fwComEd::ImageMsg::SLICE_INDEX;
+
+    ::fwData::Integer::sptr intField = ::fwData::Integer::New(23);
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+
+    // create message
+    ::fwComEd::ImageMsg::sptr imageMsg = ::fwComEd::ImageMsg::New();
+    imageMsg->addEvent(MYMODIF1);
+    imageMsg->addEvent(MYMODIF2, intField);
+
+    // check Event
+    CPPUNIT_ASSERT(imageMsg->hasEvent(MYMODIF1));
+    CPPUNIT_ASSERT(imageMsg->hasEvent(MYMODIF2));
+
+    // check data info
+    ::fwData::Object::sptr obj = ::fwData::Object::constCast(imageMsg->getDataInfo(MYMODIF2));
+    ::fwData::Integer::sptr intField2 = ::fwData::Integer::dynamicCast(obj);
+    CPPUNIT_ASSERT(intField2);
+    CPPUNIT_ASSERT_EQUAL(intField, intField2);
+}
+
+//------------------------------------------------------------------------------
+
+void MessagesTest::messageCreationTest()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwServices::ObjectMsg::sptr msg = ::fwComEd::helper::MsgHelper::createAssociatedMsg(image);
+    CPPUNIT_ASSERT(msg);
+    CPPUNIT_ASSERT(::fwComEd::ImageMsg::dynamicCast(msg));
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/test/tu/src/SeriesDBMsgTest.cpp b/SrcLib/core/fwComEd/test/tu/src/SeriesDBMsgTest.cpp
new file mode 100644
index 0000000..22cbac8
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/SeriesDBMsgTest.cpp
@@ -0,0 +1,202 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/helper/SeriesDB.hpp>
+
+#include "SeriesDBMsgTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::SeriesDBMsgTest );
+
+
+fwServicesRegisterMacro( ::fwComEd::ut::TestService , ::fwComEd::ut::SSeriesDBTest , ::fwMedData::SeriesDB ) ;
+
+namespace fwComEd
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBMsgTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBMsgTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBMsgTest::basicTest()
+{
+    ::fwMedData::ImageSeries::sptr series1 = ::fwMedData::ImageSeries::New();
+    ::fwMedData::ModelSeries::sptr series2 = ::fwMedData::ModelSeries::New();
+
+    ::fwComEd::SeriesDBMsg::sptr msg = ::fwComEd::SeriesDBMsg::New();
+    msg->appendAddedSeries(series1);
+    msg->appendAddedSeries(series2);
+
+    CPPUNIT_ASSERT(msg->hasEvent(::fwComEd::SeriesDBMsg::ADDED_OBJECTS));
+
+    ::fwData::Vector::sptr vecAddedObj = msg->getAddedSeries();
+    CPPUNIT_ASSERT(std::find(vecAddedObj->begin(), vecAddedObj->end(), series1) != vecAddedObj->end());
+    CPPUNIT_ASSERT(std::find(vecAddedObj->begin(), vecAddedObj->end(), series2) != vecAddedObj->end());
+
+    ::fwComEd::SeriesDBMsg::sptr msg2 = ::fwComEd::SeriesDBMsg::New();
+    msg2->appendRemovedSeries(series1);
+    msg2->appendRemovedSeries(series2);
+
+    CPPUNIT_ASSERT(msg2->hasEvent(::fwComEd::SeriesDBMsg::REMOVED_OBJECTS));
+
+    ::fwData::Vector::sptr vecRemovedObj = msg2->getRemovedSeries();
+    CPPUNIT_ASSERT(std::find(vecRemovedObj->begin(), vecRemovedObj->end(), series1) != vecRemovedObj->end());
+    CPPUNIT_ASSERT(std::find(vecRemovedObj->begin(), vecRemovedObj->end(), series2) != vecRemovedObj->end());
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBMsgTest::seriesDBHelperTest()
+{
+    ::fwServices::registry::ActiveWorkers::sptr activeWorkers = ::fwServices::registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    ::fwMedData::ImageSeries::sptr series1 = ::fwMedData::ImageSeries::New();
+    ::fwMedData::ModelSeries::sptr series2 = ::fwMedData::ModelSeries::New();
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    ::fwServices::registry::ServiceFactory::sptr srvFactory = ::fwServices::registry::ServiceFactory::getDefault();
+    ::fwServices::IService::sptr srv = srvFactory->create("::fwComEd::ut::SSeriesDBTest");
+    ::fwServices::OSR::registerService(seriesDB, srv);
+    ::fwComEd::ut::SSeriesDBTest::sptr testSrv = ::fwComEd::ut::SSeriesDBTest::dynamicCast(srv);
+
+    srv->start().wait();
+
+    ::fwServices::helper::SigSlotConnection::sptr helper = ::fwServices::helper::SigSlotConnection::New();
+    helper->connect( seriesDB, srv, srv->getObjSrvConnections() );
+
+    // Test add series
+    {
+        ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+
+        seriesDBHelper.add(series1);
+        CPPUNIT_ASSERT_EQUAL((size_t) 1, seriesDB->size());
+        seriesDBHelper.add(series2);
+        CPPUNIT_ASSERT_EQUAL((size_t) 2, seriesDB->size());
+
+        CPPUNIT_ASSERT(std::find(seriesDB->begin(), seriesDB->end(), series1) != seriesDB->end());
+        CPPUNIT_ASSERT(std::find(seriesDB->begin(), seriesDB->end(), series2) != seriesDB->end());
+
+        seriesDBHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr addedObjects = testSrv->m_seriesDBMsg->getAddedSeries();
+
+        CPPUNIT_ASSERT(std::find(addedObjects->begin(), addedObjects->end(), series1) != addedObjects->end());
+        CPPUNIT_ASSERT(std::find(addedObjects->begin(), addedObjects->end(), series2) != addedObjects->end());
+    }
+
+    // Test remove series
+    {
+        ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+
+        seriesDBHelper.remove(series1);
+        CPPUNIT_ASSERT_EQUAL((size_t) 1, seriesDB->size());
+        seriesDBHelper.remove(series2);
+        CPPUNIT_ASSERT_EQUAL((size_t) 0, seriesDB->size());
+
+        seriesDBHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr removedObjects = testSrv->m_seriesDBMsg->getRemovedSeries();
+
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), series1) != removedObjects->end());
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), series2) != removedObjects->end());
+    }
+
+    seriesDB->getContainer().push_back(series1);
+    seriesDB->getContainer().push_back(series2);
+
+    // Test clear series
+    {
+        ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+
+        seriesDBHelper.clear();
+        CPPUNIT_ASSERT_EQUAL((size_t) 0, seriesDB->size());
+
+        seriesDBHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr removedObjects = testSrv->m_seriesDBMsg->getRemovedSeries();
+
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), series1) != removedObjects->end());
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), series2) != removedObjects->end());
+    }
+
+    seriesDB->getContainer().push_back(series1);
+    seriesDB->getContainer().push_back(series2);
+
+    // Test merge SeriesDB
+    {
+        ::fwMedData::ImageSeries::sptr series3 = ::fwMedData::ImageSeries::New();
+        ::fwMedData::SeriesDB::sptr localSeriesDB = ::fwMedData::SeriesDB::New();
+        localSeriesDB->getContainer().push_back(series3);
+
+        ::fwComEd::helper::SeriesDB seriesDBHelper(seriesDB);
+        seriesDBHelper.merge(localSeriesDB);
+
+        CPPUNIT_ASSERT_EQUAL((size_t) 3, seriesDB->size());
+
+        seriesDBHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr addedObjects = testSrv->m_seriesDBMsg->getAddedSeries();
+
+        CPPUNIT_ASSERT(std::find(addedObjects->begin(), addedObjects->end(), series3) != addedObjects->end());
+    }
+
+    srv->stop().wait();
+    ::fwServices::OSR::unregisterService(srv);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwComEd/test/tu/src/VectorMsgTest.cpp b/SrcLib/core/fwComEd/test/tu/src/VectorMsgTest.cpp
new file mode 100644
index 0000000..25e6224
--- /dev/null
+++ b/SrcLib/core/fwComEd/test/tu/src/VectorMsgTest.cpp
@@ -0,0 +1,174 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwComEd/VectorMsg.hpp>
+#include <fwComEd/helper/Vector.hpp>
+
+#include "VectorMsgTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwComEd::ut::VectorMsgTest );
+
+
+fwServicesRegisterMacro( ::fwComEd::ut::TestService , ::fwComEd::ut::SVectorTest , ::fwData::Vector ) ;
+
+namespace fwComEd
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void VectorMsgTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void VectorMsgTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void VectorMsgTest::basicTest()
+{
+    ::fwData::String::sptr str1 = ::fwData::String::New("Str1");
+    ::fwData::String::sptr str2 = ::fwData::String::New("Str2");
+
+    ::fwComEd::VectorMsg::sptr msg = ::fwComEd::VectorMsg::New();
+    msg->appendAddedObject(str1);
+    msg->appendAddedObject(str2);
+
+    CPPUNIT_ASSERT(msg->hasEvent(::fwComEd::VectorMsg::ADDED_OBJECTS));
+
+    ::fwData::Vector::sptr vecAddedObj = msg->getAddedObjects();
+    CPPUNIT_ASSERT(std::find(vecAddedObj->begin(), vecAddedObj->end(), str1) != vecAddedObj->end());
+    CPPUNIT_ASSERT(std::find(vecAddedObj->begin(), vecAddedObj->end(), str2) != vecAddedObj->end());
+
+    ::fwComEd::VectorMsg::sptr msg2 = ::fwComEd::VectorMsg::New();
+    msg2->appendRemovedObject(str1);
+    msg2->appendRemovedObject(str2);
+
+    CPPUNIT_ASSERT(msg2->hasEvent(::fwComEd::VectorMsg::REMOVED_OBJECTS));
+
+    ::fwData::Vector::sptr vecRemovedObj = msg2->getRemovedObjects();
+    CPPUNIT_ASSERT(std::find(vecRemovedObj->begin(), vecRemovedObj->end(), str1) != vecRemovedObj->end());
+    CPPUNIT_ASSERT(std::find(vecRemovedObj->begin(), vecRemovedObj->end(), str2) != vecRemovedObj->end());
+}
+
+//------------------------------------------------------------------------------
+
+void VectorMsgTest::vectorHelperTest()
+{
+    ::fwServices::registry::ActiveWorkers::sptr activeWorkers = ::fwServices::registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+
+    ::fwData::String::sptr str1 = ::fwData::String::New("Str1");
+    ::fwData::String::sptr str2 = ::fwData::String::New("Str2");
+
+    ::fwData::Vector::sptr vector = ::fwData::Vector::New();
+
+    ::fwServices::registry::ServiceFactory::sptr srvFactory = ::fwServices::registry::ServiceFactory::getDefault();
+    ::fwServices::IService::sptr srv = srvFactory->create("::fwComEd::ut::SVectorTest");
+    ::fwServices::OSR::registerService(vector, srv);
+    ::fwComEd::ut::SVectorTest::sptr testSrv = ::fwComEd::ut::SVectorTest::dynamicCast(srv);
+
+    srv->start().wait();
+
+    ::fwServices::helper::SigSlotConnection::sptr helper = ::fwServices::helper::SigSlotConnection::New();
+    helper->connect( vector, srv, srv->getObjSrvConnections() );
+
+    {
+        ::fwComEd::helper::Vector vectorHelper(vector);
+
+        vectorHelper.add(str1);
+        CPPUNIT_ASSERT_EQUAL((size_t) 1, vector->size());
+        vectorHelper.add(str2);
+        CPPUNIT_ASSERT_EQUAL((size_t) 2, vector->size());
+
+        CPPUNIT_ASSERT(std::find(vector->begin(), vector->end(), str1) != vector->end());
+        CPPUNIT_ASSERT(std::find(vector->begin(), vector->end(), str2) != vector->end());
+
+        vectorHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr addedObjects = testSrv->m_vectMsg->getAddedObjects();
+
+        CPPUNIT_ASSERT(std::find(addedObjects->begin(), addedObjects->end(), str1) != addedObjects->end());
+        CPPUNIT_ASSERT(std::find(addedObjects->begin(), addedObjects->end(), str2) != addedObjects->end());
+    }
+
+    {
+        ::fwComEd::helper::Vector vectorHelper(vector);
+
+        vectorHelper.remove(str1);
+        CPPUNIT_ASSERT_EQUAL((size_t) 1, vector->size());
+        vectorHelper.remove(str2);
+        CPPUNIT_ASSERT_EQUAL((size_t) 0, vector->size());
+
+        vectorHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr removedObjects = testSrv->m_vectMsg->getRemovedObjects();
+
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), str1) != removedObjects->end());
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), str2) != removedObjects->end());
+    }
+
+    vector->getContainer().push_back(str1);
+    vector->getContainer().push_back(str2);
+
+    {
+        ::fwComEd::helper::Vector vectorHelper(vector);
+
+        vectorHelper.clear();
+        CPPUNIT_ASSERT_EQUAL((size_t) 0, vector->size());
+
+        vectorHelper.notify(srv, true);
+
+        // Wait a little notification system
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(500) );
+
+        CPPUNIT_ASSERT(testSrv->getIsUpdated());
+
+        ::fwData::Vector::sptr removedObjects = testSrv->m_vectMsg->getRemovedObjects();
+
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), str1) != removedObjects->end());
+        CPPUNIT_ASSERT(std::find(removedObjects->begin(), removedObjects->end(), str2) != removedObjects->end());
+    }
+
+    srv->stop().wait();;
+    ::fwServices::OSR::unregisterService(srv);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwComEd
diff --git a/SrcLib/core/fwCommand/CMakeLists.txt b/SrcLib/core/fwCommand/CMakeLists.txt
new file mode 100644
index 0000000..b5a63ab
--- /dev/null
+++ b/SrcLib/core/fwCommand/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwData
+    fwServices
+    fwTools
+)
+
+find_package (Boost COMPONENTS signals REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+
diff --git a/SrcLib/core/fwCommand/COPYING b/SrcLib/core/fwCommand/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwCommand/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwCommand/COPYING.LESSER b/SrcLib/core/fwCommand/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwCommand/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwCommand/Properties.cmake b/SrcLib/core/fwCommand/Properties.cmake
new file mode 100644
index 0000000..ca028f9
--- /dev/null
+++ b/SrcLib/core/fwCommand/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwCommand )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwData fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCommand/bin/build.options b/SrcLib/core/fwCommand/bin/build.options
new file mode 100644
index 0000000..781e198
--- /dev/null
+++ b/SrcLib/core/fwCommand/bin/build.options
@@ -0,0 +1,5 @@
+TYPE = 'shared'
+VERSION = '0.1'
+
+USE = ['boost','boostSignals']
+LIB = ['fwTools_0-1','fwData_0-1','fwServices_0-1','fwComEd_0-1']
diff --git a/SrcLib/core/fwCommand/include/fwCommand/Empty.hpp b/SrcLib/core/fwCommand/include/fwCommand/Empty.hpp
new file mode 100755
index 0000000..02ab412
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/Empty.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMMAND_EMPTY_HPP_
+#define _FWCOMMAND_EMPTY_HPP_
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwCommand/ICommand.hpp"
+
+namespace fwCommand
+{
+
+/**
+ * @brief Empty command.
+ *
+ * This command is used to initialize the Manager of command and avoid an empty commands list in the Manager.
+ */
+class FWCOMMAND_CLASS_API Empty : public ICommand
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Empty)(ICommand), (( )), ::boost::make_shared< Empty > );
+
+    // Overrides.
+    FWCOMMAND_API const boost::uint32_t  getSize() const;
+
+    // Overrides.
+    FWCOMMAND_API void apply();
+
+    // Overrides.
+    FWCOMMAND_API void unapply();
+
+    // Overrides.
+    FWCOMMAND_API const std::string getDescription( void ) const;
+
+};
+
+
+} // namespace fwCommand
+
+
+#endif //#ifndef _FWCOMMAND_EMPTY_HPP_
diff --git a/SrcLib/core/fwCommand/include/fwCommand/ICommand.hpp b/SrcLib/core/fwCommand/include/fwCommand/ICommand.hpp
new file mode 100755
index 0000000..ff390a3
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/ICommand.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMMAND_ICOMMAND_H
+#define _FWCOMMAND_ICOMMAND_H
+
+#include <exception>
+#include <string>
+#include <boost/cstdint.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "fwCommand/config.hpp"
+
+namespace fwCommand
+{
+
+
+/**
+ * @brief The base class for all command.
+ *
+ * It provides do/undo operations as well as GetDescription operations for the easy
+ * tracking of the executed command (quite useful when keeping a menu of last performed
+ * operations).
+ */
+class FWCOMMAND_CLASS_API ICommand : public ::fwTools::Object
+{
+
+protected :
+
+    ::fwServices::IService::wptr m_serviceNotifier;
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (ICommand)(::fwTools::Object) ) ;
+
+    /**
+     * @brief Virtual destructor.
+     */
+    virtual ~ICommand() {};
+
+    /**
+     * @brief Retrieves the memory footprint of the command.
+     */
+    FWCOMMAND_API virtual const boost::uint32_t  getSize() const = 0;
+
+    /**
+     * @brief Pure virtual operation that in child classes encapsulates the logic of the change.
+     */
+    FWCOMMAND_API virtual void apply() /*throw(std::exception)*/ = 0;    // FIXME std::exception to net::cmd::exception
+
+    /**
+     * @brief Pure virtual operation that in child classes encapsulates the logic of undoing a change.
+     */
+    FWCOMMAND_API virtual void unapply() /*throw(std::exception)*/ = 0;
+
+    /**
+     * @brief Pure virtual operation that in child classes returns the description of the operation
+     *
+     * particularly useful for undo/redo lists presented to the user.
+     */
+    FWCOMMAND_API virtual const std::string getDescription( void ) const = 0;
+
+    void setNotifier( ::fwServices::IService::sptr serviceNotifier ) { m_serviceNotifier = serviceNotifier; }
+
+    ::fwServices::IService::sptr getNotifier() { return m_serviceNotifier.lock(); }
+};
+
+
+} // namespace fwCommand
+
+
+#endif //#ifndef _FWCOMMAND_ICOMMAND_H
diff --git a/SrcLib/core/fwCommand/include/fwCommand/Manager.hpp b/SrcLib/core/fwCommand/include/fwCommand/Manager.hpp
new file mode 100755
index 0000000..eed456e
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/Manager.hpp
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWFWCOMMAND_MANAGER_HPP_
+#define _FWFWCOMMAND_MANAGER_HPP_
+
+#include <deque>
+#include <boost/cstdint.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+#include "fwCommand/config.hpp"
+#include "fwCommand/ICommand.hpp"
+
+namespace fwCommand
+{
+
+/**
+ * @brief Keep tracking an history of commands.
+ *
+ * @todo macro command.
+ */
+class FWCOMMAND_CLASS_API Manager : public ::fwTools::Object
+{
+public:
+
+    fwCoreClassDefinitionsWithNFactoriesMacro( (Manager)(::fwTools::Object),
+           ((::boost::make_shared< Manager > ,() ))
+           ((ManagerFactory ,((::boost::uint32_t)) ((::boost::uint32_t)) ((::boost::uint32_t))  ))
+           );
+
+    /**
+     * @brief Default constructor.
+     *
+     * @param maxUndoLevel maximum number of command that could be stored in the history
+     * @param maxUndoMemory maximum number of byte that could be stored in the history (but the latest queued command is ignored by the memory usage counter. See below for more explanation)
+     * @param maxCommandMemory maximum number of byte that could be used by a single command
+     *
+     * If the size of a single command is greater than maxCommandMemory, then it would not be stored in the history.
+     *
+     * @remarks The latest queued command is ignored by the memory usage counter in order to ensure that the latest command could always being stored in the history.
+     * @remarks The maximum memory used by the history is maxUndoMemory + maxCommandMemory.
+     */
+    FWCOMMAND_API Manager( const ::boost::uint32_t  maxUndoLevel = 0, const ::boost::uint32_t  maxUndoMemory = 0, const ::boost::uint32_t  maxCommandMemory = 1024*1024*32 /* 32 MB */);
+
+    FWCOMMAND_API static sptr ManagerFactory( const ::boost::uint32_t  maxUndoLevel, const ::boost::uint32_t  maxUndoMemory , const ::boost::uint32_t  maxCommandMemory);
+
+    /**
+     * @brief Destructor.
+     */
+    FWCOMMAND_API virtual ~Manager() throw();
+
+
+    /**
+     * @name History management methods.
+     */
+    //@{
+
+    /**
+     * @brief Execute the command and push it in the history.
+     *
+     * @param cmd the command
+     * @param execute sets to true if queue must execute the given command, false if not
+     *
+     * @todo Remove use of size on list (OPT)
+     */
+    FWCOMMAND_API void queue( ICommand::sptr cmd, const bool execute = false );
+
+    /**
+     * @brief Execute the next command if any.
+     */
+    FWCOMMAND_API void forward();
+
+    /**
+     * @brief Execute the previous command if any.
+     */
+    FWCOMMAND_API void backward();
+
+    /**
+     * @brief Remove all commands in history.
+     */
+    FWCOMMAND_API void clear();
+    //@}
+
+
+    /**
+     * @brief Retrieves the first undoable command.
+     *
+     * @return a shared pointer to the first undoable command, can be empty
+     */
+    FWCOMMAND_API ICommand::sptr getFirstUndoableCommand();
+
+    /**
+     * @brief Retrieves the first redoable command.
+     *
+     * @return a shared pointer to the first undoable command, can be empty
+     */
+    FWCOMMAND_API ICommand::sptr getFirstRedoableCommand();
+
+    /**
+     * @brief Returns the maximum number of undo that could be stored in the history.
+     */
+    const ::boost::uint32_t  getMaxUndoLevel() const { return m_maxUndoLevel; }
+
+    /**
+     * @brief Returns the maximum memory that could be used by the history.
+     */
+    const ::boost::uint32_t  getMaxUndoMemory() const { return m_maxUndoMemory; }
+
+    /**
+     * @brief Returns the maximum memory that could be used by a single command.
+     */
+    const ::boost::uint32_t  getMaxCommandMemory() const { return m_maxCommandMemory; }
+
+    /**
+     * @brief Returns the number of commands that can be un-done.
+     */
+    FWCOMMAND_API const ::boost::uint32_t  getUndoSize();
+
+    /**
+     * @brief Returns the number of commans that can be re-done.
+     */
+    FWCOMMAND_API const ::boost::uint32_t  getRedoSize();
+
+    FWCOMMAND_API void setNotifier( ::fwServices::IService::sptr serviceNotifier );
+
+    FWCOMMAND_API ::fwServices::IService::sptr getNotifier();
+
+protected:
+
+    /**
+     * @brief Typedef for list of commands.
+     */
+    typedef std::deque< ICommand::sptr > CmdList;
+
+    /**
+     * @brief History
+     */
+    CmdList m_listCmd;
+
+    /**
+     * @brief  Maximum number of undo that could be stored in the history.
+     */
+    ::boost::uint32_t  m_maxUndoLevel;
+
+    /**
+     * @brief Maximum number of bytes that could be used by the history.
+     */
+    ::boost::uint32_t m_maxUndoMemory;
+
+    /**
+     * @brief Maximum number of bytes that could be used by a single command.
+     */
+    ::boost::uint32_t m_maxCommandMemory;
+
+    /**
+     * @brief Memory used by the history.
+     */
+    ::boost::uint32_t m_usedMemory;
+
+    /**
+     * @brief Iterator on the last command applied.
+     */
+    CmdList::iterator m_lastCmd;
+
+
+    /**
+     * @brief Remove first command in m_listCmd and desalocate this command.
+     *
+     * @pre m_listCmd not empty.
+     */
+    void removeFirstCmd();
+
+    ::fwServices::IService::wptr m_serviceNotifier;
+};
+
+
+} // namespace fwCommand
+
+
+#endif //#ifndef _FWCOMMAND_MANAGER_HPP_
diff --git a/SrcLib/core/fwCommand/include/fwCommand/PaintCommand.hpp b/SrcLib/core/fwCommand/include/fwCommand/PaintCommand.hpp
new file mode 100755
index 0000000..65fb137
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/PaintCommand.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCOMMAND_PAINTCOMMAND_HPP_
+#define _FWCOMMAND_PAINTCOMMAND_HPP_
+
+#include <boost/cstdint.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include "fwCommand/ICommand.hpp"
+
+namespace fwCommand
+{
+
+/**
+ * @brief Command class to be used by all paint tools.
+ */
+class FWCOMMAND_CLASS_API PaintCommand : public ICommand
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (PaintCommand)(ICommand), (( )), ::boost::make_shared< PaintCommand > );
+
+    FWCOMMAND_API PaintCommand();
+
+    // Overrides.
+    FWCOMMAND_API const boost::uint32_t  getSize() const;
+
+    // Overrides.
+    FWCOMMAND_API void apply();
+
+    // Overrides.
+    FWCOMMAND_API void unapply();
+
+    // Overrides.
+    FWCOMMAND_API const std::string getDescription( void ) const;
+
+    /// Register paint voxel on image
+    FWCOMMAND_API void paint( ::fwData::Image::BufferIndexType index, ::fwData::Image::BufferType oldValue, ::fwData::Image::BufferType newValue );
+
+
+    FWCOMMAND_API void prePaint( ::fwData::Image::IndexType x, ::fwData::Image::IndexType y, ::fwData::Image::IndexType z );
+    FWCOMMAND_API void prePaint( ::fwData::Image::IndexType index );
+
+    FWCOMMAND_API void postPaint();
+
+    FWCOMMAND_API void setImage( ::fwData::Image::sptr  image );
+
+private :
+
+     void notifyImageModification();
+
+    /**
+     * @brief Typedef for the index containers.
+     */
+    typedef std::vector< ::fwData::Image::BufferIndexType > IndexContainer;
+
+    /**
+     * @brief Typedef for the color containers.
+     */
+    typedef std::vector< std::pair< ::fwData::Image::BufferType, ::fwData::Image::BufferType > > ColorContainer;
+
+    /**
+     * @brief The index container
+     */
+    IndexContainer  m_commandIndexContainer;
+
+    /**
+     * @brief The color container
+     */
+    ColorContainer  m_commandColorContainer;
+
+    /// Working image
+    ::fwData::Image::wptr         m_image;
+    /// Helper on Working image
+    ::fwComEd::helper::Image::sptr m_imageHelper;
+
+    ::fwData::Image::IndexType m_currentPrepaintIndex;
+    std::vector< ::fwData::Image::BufferType > m_currentPrepaintBuff;
+
+};
+
+
+} // namespace fwCommand
+
+
+#endif //#ifndef _FWCOMMAND_PAINTCOMMAND_HPP_
diff --git a/SrcLib/core/fwCommand/include/fwCommand/UndoRedoManager.hpp b/SrcLib/core/fwCommand/include/fwCommand/UndoRedoManager.hpp
new file mode 100755
index 0000000..92a65e9
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/UndoRedoManager.hpp
@@ -0,0 +1,155 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWFWCOMMAND_UNDOREDOMANAGER_HPP_
+#define _FWFWCOMMAND_UNDOREDOMANAGER_HPP_
+
+#include <deque>
+
+#include <boost/signal.hpp>
+#include <boost/signals/connection.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/cstdint.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+
+#include "fwCommand/config.hpp"
+#include "fwCommand/ICommand.hpp"
+#include "fwCommand/Manager.hpp"
+
+namespace fwCommand
+{
+
+/**
+ * @brief Keep tracking an history of commands.
+ *
+ * @todo macro command.
+ */
+class FWCOMMAND_CLASS_API UndoRedoManager : public ::fwTools::Object
+{
+public:
+    typedef ::boost::signal<void (std::string)>  SignalType;
+    typedef ::boost::signals::connection         ConnectionType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (UndoRedoManager)(::fwTools::Object), (( )), ::boost::make_shared< UndoRedoManager > );
+
+    /// Return the unique Instance, create it if required at first access
+    FWCOMMAND_API static UndoRedoManager::sptr getDefault();
+
+
+    /**
+     * @brief Default constructor.
+     */
+    FWCOMMAND_API UndoRedoManager();
+
+    /**
+     * @brief Destructor.
+     */
+    FWCOMMAND_API virtual ~UndoRedoManager() throw();
+
+
+    /**
+     * @name History management methods.
+     */
+    //@{
+
+    /**
+     * @brief Execute the command and push it in the history.
+     *
+     * @param cmd the command
+     * @param execute sets to true if queue must execute the given command, false if not
+     *
+     * @todo Remove use of size on list (OPT)
+     */
+    FWCOMMAND_API void queue( ICommand::sptr cmd, const bool execute = false );
+
+    /**
+     * @brief Execute the next command if any.
+     */
+    FWCOMMAND_API void forward();
+
+    /**
+     * @brief Execute the previous command if any.
+     */
+    FWCOMMAND_API void backward();
+
+    /**
+     * @brief Remove all commands in history.
+     */
+    FWCOMMAND_API void clear();
+    //@}
+
+
+    /**
+     * @brief Retrieves the first undoable command.
+     *
+     * @return a shared pointer to the first undoable command, can be empty
+     */
+    FWCOMMAND_API ICommand::sptr getFirstUndoableCommand();
+
+    /**
+     * @brief Retrieves the first redoable command.
+     *
+     * @return a shared pointer to the first undoable command, can be empty
+     */
+    FWCOMMAND_API ICommand::sptr getFirstRedoableCommand();
+
+    /**
+     * @brief Returns the maximum number of undo that could be stored in the history.
+     */
+    FWCOMMAND_API const ::boost::uint32_t getMaxUndoLevel();
+
+    /**
+     * @brief Returns the maximum memory that could be used by the history.
+     */
+    FWCOMMAND_API const ::boost::uint32_t getMaxUndoMemory();
+
+    /**
+     * @brief Returns the maximum memory that could be used by a single command.
+     */
+    FWCOMMAND_API const ::boost::uint32_t getMaxCommandMemory();
+
+    /**
+     * @brief Returns the number of commands that can be un-done.
+     */
+    FWCOMMAND_API const ::boost::uint32_t getUndoSize();
+
+    /**
+     * @brief Returns the number of commands that can be re-done.
+     */
+    FWCOMMAND_API const ::boost::uint32_t getRedoSize();
+
+    /**
+     * @brief Set the new undo/redo manager
+     */
+    FWCOMMAND_API void setManager( Manager::sptr currentManager );
+
+    /**
+     * @brief Remove the current manager
+     */
+    FWCOMMAND_API void removeManager();
+
+
+    FWCOMMAND_API ConnectionType connect(SignalType::slot_function_type subscriber);
+
+    FWCOMMAND_API void disconnect(ConnectionType subscriber);
+
+protected:
+
+    Manager::sptr m_currentManager;
+
+
+private :
+    SignalType  m_sig;
+};
+
+
+} // namespace fwCommand
+
+
+#endif //#ifndef _FWCOMMAND_MANAGER_HPP_
diff --git a/SrcLib/core/fwCommand/include/fwCommand/config.hpp b/SrcLib/core/fwCommand/include/fwCommand/config.hpp
new file mode 100644
index 0000000..3d7abe6
--- /dev/null
+++ b/SrcLib/core/fwCommand/include/fwCommand/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWCOMMAND_CONFIG_HPP_
+#define _FWCOMMAND_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWCOMMAND_EXPORTS
+            #define FWCOMMAND_API __declspec(dllexport)
+        #else
+            #define FWCOMMAND_API __declspec(dllimport)
+        #endif
+
+        #define FWCOMMAND_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWCOMMAND_EXPORTS
+            #define FWCOMMAND_API __attribute__ ((visibility("default")))
+            #define FWCOMMAND_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWCOMMAND_API __attribute__ ((visibility("hidden")))
+            #define FWCOMMAND_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWCOMMAND_API
+        #define FWCOMMAND_CLASS_API
+
+    #endif
+
+#endif //FWCOMMAND_API
+
diff --git a/SrcLib/core/fwCommand/src/fwCommand/Empty.cpp b/SrcLib/core/fwCommand/src/fwCommand/Empty.cpp
new file mode 100755
index 0000000..bb0c197
--- /dev/null
+++ b/SrcLib/core/fwCommand/src/fwCommand/Empty.cpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwCommand/Empty.hpp"
+
+namespace fwCommand
+{
+
+
+//-----------------------------------------------------------------------------
+
+const boost::uint32_t  Empty::getSize() const
+{
+    return sizeof(*this);
+}
+
+//-----------------------------------------------------------------------------
+
+void Empty::apply()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Empty::unapply()
+{}
+
+//-----------------------------------------------------------------------------
+
+const std::string Empty::getDescription() const
+{
+    return std::string("Empty command");
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwCommand
diff --git a/SrcLib/core/fwCommand/src/fwCommand/Manager.cpp b/SrcLib/core/fwCommand/src/fwCommand/Manager.cpp
new file mode 100755
index 0000000..19ca0d8
--- /dev/null
+++ b/SrcLib/core/fwCommand/src/fwCommand/Manager.cpp
@@ -0,0 +1,204 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <iterator>
+#include <limits>
+#include <stdexcept>
+
+#include "fwCommand/Manager.hpp"
+#include "fwCommand/Empty.hpp"
+
+namespace fwCommand
+{
+
+
+//-----------------------------------------------------------------------------
+
+Manager::Manager( const ::boost::uint32_t maxUndoLevel, const ::boost::uint32_t maxUndoMemory, const ::boost::uint32_t maxCommandMemory )
+: m_maxUndoLevel  ( maxUndoLevel  ),
+  m_maxUndoMemory ( maxUndoMemory ),
+  m_maxCommandMemory (maxCommandMemory),
+  m_usedMemory ( 0 )
+{
+    m_listCmd.push_back( Empty::New() );
+    m_lastCmd = m_listCmd.end();
+    --m_lastCmd;
+}
+
+//-----------------------------------------------------------------------------
+
+Manager::sptr Manager::ManagerFactory( const ::boost::uint32_t  maxUndoLevel, const ::boost::uint32_t  maxUndoMemory, const ::boost::uint32_t  maxCommandMemory)
+{
+    ::fwCommand::Manager::sptr manager = ::fwCommand::Manager::New();
+    manager->m_maxUndoLevel = maxUndoLevel;
+    manager->m_maxUndoMemory = maxUndoMemory;
+    manager->m_maxCommandMemory = maxCommandMemory;
+    return manager;
+}
+
+//-----------------------------------------------------------------------------
+
+Manager::~Manager() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Manager::removeFirstCmd()
+{
+    SLM_ASSERT("List command is empty", !m_listCmd.empty());
+
+    CmdList::iterator pos( m_listCmd.begin() + 1 );
+    ICommand::sptr pCmd = *pos;
+    m_usedMemory -= pCmd->getSize();
+
+    m_listCmd.erase( pos );
+}
+
+//-----------------------------------------------------------------------------
+
+void Manager::queue( ICommand::sptr pCmd, const bool execute )
+{
+    pCmd->setNotifier( m_serviceNotifier.lock() );
+
+    // Erase commands after the current one.
+    CmdList::iterator i ( m_listCmd.end()-1 );
+    CmdList::iterator iEnd ( m_lastCmd   );
+
+    while( i != iEnd )
+    {
+        ICommand::sptr pCmd = (*i);
+        m_usedMemory -= pCmd->getSize();
+        --i;
+        m_listCmd.pop_back();
+    }
+
+    // Execute command, if needed
+    if ( execute )
+    {
+        pCmd->apply();
+    }
+
+    // Queue command.
+    if ( this->getMaxUndoLevel() > 0 )
+    {
+        // Ensure that the command size will not overflow the used memory counter.
+        const ::boost::uint32_t cmdSize = pCmd->getSize();
+
+        if( (std::numeric_limits< ::boost::uint32_t >::max() - m_usedMemory) <= cmdSize )
+        {
+            throw std::overflow_error( "Command size will overflow memory usage count." );
+        }
+
+        // Pushes the command
+        if ( cmdSize <= this->getMaxCommandMemory() )
+        {
+
+            if ( m_listCmd.size() + 1 > this->getMaxUndoLevel() )
+            {
+                this->removeFirstCmd();
+            }
+
+            // Purges some command in the history.
+            while (m_usedMemory + cmdSize > getMaxUndoMemory() &&  !m_listCmd.empty() )
+            {
+                this->removeFirstCmd();
+            }
+
+            m_listCmd.push_back( pCmd );
+            m_usedMemory += cmdSize;
+
+            m_lastCmd = m_listCmd.end();
+            --m_lastCmd;
+        }
+    }
+    //else nothing to do
+}
+
+//-----------------------------------------------------------------------------
+
+void Manager::forward()
+{
+    CmdList::iterator lastIter = m_listCmd.end();
+    --lastIter;
+
+    if ( m_lastCmd != lastIter )
+    {
+        ++m_lastCmd;
+        (*m_lastCmd)->apply();
+    }
+    //else nothing to do.
+}
+
+//-----------------------------------------------------------------------------
+
+void Manager::backward()
+{
+    if ( m_lastCmd != m_listCmd.begin() )
+    {
+        ICommand::sptr command( *m_lastCmd );
+
+        command->unapply();
+        --m_lastCmd;
+    }
+    //else nothing to undo.
+}
+
+//-----------------------------------------------------------------------------
+
+void Manager::clear()
+{
+    m_listCmd.clear();
+    m_listCmd.push_back( Empty::New() );
+    m_usedMemory = 0;
+    m_lastCmd = m_listCmd.begin();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t Manager::getUndoSize()
+{
+    return static_cast< ::boost::uint32_t> ( std::distance( m_listCmd.begin(), m_lastCmd ) );
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t Manager::getRedoSize()
+{
+    return static_cast< ::boost::uint32_t >( std::distance( m_lastCmd, m_listCmd.end() ) - 1 );
+}
+
+//-----------------------------------------------------------------------------
+
+ICommand::sptr Manager::getFirstUndoableCommand()
+{
+    return ( m_lastCmd != m_listCmd.begin() ) ? *m_lastCmd : ICommand::sptr();
+}
+
+//-----------------------------------------------------------------------------
+
+ICommand::sptr Manager::getFirstRedoableCommand()
+{
+    return ( m_lastCmd + 1 != m_listCmd.end() ) ? *(m_lastCmd + 1) : ICommand::sptr();
+}
+
+//-----------------------------------------------------------------------------
+
+void Manager::setNotifier( ::fwServices::IService::sptr serviceNotifier )
+{
+    m_serviceNotifier = serviceNotifier;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwServices::IService::sptr Manager::getNotifier()
+{
+    return m_serviceNotifier.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwCommand
diff --git a/SrcLib/core/fwCommand/src/fwCommand/PaintCommand.cpp b/SrcLib/core/fwCommand/src/fwCommand/PaintCommand.cpp
new file mode 100755
index 0000000..696159e
--- /dev/null
+++ b/SrcLib/core/fwCommand/src/fwCommand/PaintCommand.cpp
@@ -0,0 +1,165 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwServices/IEditionService.hpp>
+
+#include <fwComEd/ImageMsg.hpp>
+
+#include "fwCommand/PaintCommand.hpp"
+
+
+namespace fwCommand
+{
+
+
+//-----------------------------------------------------------------------------
+PaintCommand::PaintCommand() : ICommand()
+{}
+
+//-----------------------------------------------------------------------------
+
+const boost::uint32_t  PaintCommand::getSize() const
+{
+    SLM_ASSERT("Index size not correspond to color size.",
+            m_commandIndexContainer.size() == m_commandColorContainer.size() );
+    const ::boost::uint32_t sizeOf = static_cast<boost::uint32_t>(sizeof(::fwData::Image::BufferIndexType) + 2*sizeof(::fwData::Image::BufferType));
+
+    return static_cast< ::boost::uint32_t >(sizeof(*this) + m_commandIndexContainer.size()*sizeOf );
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::setImage( ::fwData::Image::sptr  image )
+{
+    m_image = image;
+    m_imageHelper = ::fwComEd::helper::Image::New(image);
+    //We assume that during all the command construction, the image do not
+    //change and is not destroyed, so we can keep a reference to it buffer
+//    m_buffer = static_cast< ::fwData::Image::BufferType* >( image->getBuffer() );
+    SLM_ASSERT("Using a paintcommand on an image without buffer is not possible", image->getSizeInBytes() > 0);
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::prePaint( ::fwData::Image::IndexType x, ::fwData::Image::IndexType y, ::fwData::Image::IndexType z )
+{
+    ::fwData::Image::sptr image = m_image.lock();
+    const ::fwData::Image::SizeType &size = image->getSize();
+    const int &sx = size[0];
+    const int &sy = size[1];
+    const ::fwData::Image::IndexType index = x + sx*y + z*sx*sy;
+    this->prePaint(index);
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::prePaint( ::fwData::Image::IndexType index )
+{
+    ::fwData::Image::sptr image = m_image.lock();
+    unsigned int imageTypeSize = image->getPixelType().sizeOf();
+
+    m_currentPrepaintIndex = index;
+    SLM_ASSERT("currentPrepaintBuff must be empty. Forgot a postPaint call ?", m_currentPrepaintBuff.empty());
+    ::fwData::Image::BufferType *pixels = static_cast< ::fwData::Image::BufferType* >( m_imageHelper->getBuffer() );
+    ::fwData::Image::BufferType *buf  = pixels + index*imageTypeSize;
+    std::copy(buf, buf+imageTypeSize, std::back_insert_iterator<std::vector< ::fwData::Image::BufferType > >(m_currentPrepaintBuff));
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::postPaint()
+{
+    ::fwData::Image::sptr image = m_image.lock();
+    ::fwData::Image::BufferType *pixels = static_cast< ::fwData::Image::BufferType* >( m_imageHelper->getBuffer() );
+    ::fwData::Image::BufferType *buf  = pixels + m_currentPrepaintIndex;
+
+    unsigned int imageTypeSize = image->getPixelType().sizeOf();
+    ::fwData::Image::BufferIndexType bufIndex = m_currentPrepaintIndex * imageTypeSize;
+
+    for (unsigned int i = 0; i < imageTypeSize; ++i)
+    {
+        this->paint( bufIndex + i, m_currentPrepaintBuff[i], buf[i]);
+    }
+    m_currentPrepaintBuff.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::paint( ::fwData::Image::BufferIndexType index, ::fwData::Image::BufferType oldValue, ::fwData::Image::BufferType newValue )
+{
+    m_commandIndexContainer.push_back(index);
+    m_commandColorContainer.push_back( std::make_pair(oldValue,newValue) );
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::apply()
+{
+    // start image editing
+    ::fwData::Image::BufferType *pixels = static_cast< ::fwData::Image::BufferType* >( m_imageHelper->getBuffer() );
+    SLM_ASSERT("commandIndexContainer and commandColorContainer must have same size",
+                m_commandColorContainer.size() == m_commandIndexContainer.size());
+
+    // do each voxel modification
+    ColorContainer::const_iterator indexC( m_commandColorContainer.begin() );
+    BOOST_FOREACH(::fwData::Image::BufferIndexType index, m_commandIndexContainer)
+    {
+        pixels[ index ] = indexC->second;
+        ++indexC;
+    }
+    this->notifyImageModification();
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::unapply()
+{
+    // start image editing
+    ::fwData::Image::BufferType *pixels = static_cast< ::fwData::Image::BufferType* >( m_imageHelper->getBuffer() );
+    SLM_ASSERT("commandIndexContainer and commandColorContainer must have same size",
+                m_commandColorContainer.size() == m_commandIndexContainer.size());
+
+    // do each voxel modification
+    ColorContainer::const_iterator indexC( m_commandColorContainer.begin() );
+    BOOST_FOREACH(::fwData::Image::BufferIndexType index, m_commandIndexContainer)
+    {
+        pixels[ index ] = indexC->first;
+        ++indexC;
+    }
+
+    this->notifyImageModification();
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string PaintCommand::getDescription() const
+{
+    return std::string("Paint command");
+}
+
+//-----------------------------------------------------------------------------
+
+void PaintCommand::notifyImageModification()
+{
+    if ( ! this->m_serviceNotifier.expired() )
+    {
+        ::fwComEd::ImageMsg::sptr msg = ::fwComEd::ImageMsg::New();
+        msg->addEvent( fwComEd::ImageMsg::BUFFER );
+        ::fwServices::IEditionService::notify( this->getNotifier(), m_image.lock(), msg );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwCommand
diff --git a/SrcLib/core/fwCommand/src/fwCommand/UndoRedoManager.cpp b/SrcLib/core/fwCommand/src/fwCommand/UndoRedoManager.cpp
new file mode 100755
index 0000000..899f1f3
--- /dev/null
+++ b/SrcLib/core/fwCommand/src/fwCommand/UndoRedoManager.cpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <iterator>
+#include <limits>
+#include <stdexcept>
+
+#include "fwCommand/UndoRedoManager.hpp"
+#include "fwCommand/Empty.hpp"
+
+namespace fwCommand
+{
+
+
+//-----------------------------------------------------------------------------
+
+UndoRedoManager::sptr UndoRedoManager::getDefault()
+{
+    SLM_TRACE_FUNC();
+    static UndoRedoManager::sptr m_instance = UndoRedoManager::New();
+    return m_instance;
+}
+
+//-----------------------------------------------------------------------------
+
+UndoRedoManager::UndoRedoManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+UndoRedoManager::~UndoRedoManager() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::queue( ICommand::sptr pCmd, const bool execute )
+{
+    m_currentManager->queue(pCmd,execute);
+    m_sig("QUEUE_EVENT");
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::forward()
+{
+    m_currentManager->forward();
+    m_sig("FORWARD_EVENT");
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::backward()
+{
+    m_currentManager->backward();
+    m_sig("BACKWARD_EVENT");
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::clear()
+{
+    m_currentManager->clear();
+    m_sig("CLEAR_EVENT");
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t UndoRedoManager::getUndoSize()
+{
+    return m_currentManager ? m_currentManager->getUndoSize() : 0;
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t UndoRedoManager::getRedoSize()
+{
+    return m_currentManager ? m_currentManager->getRedoSize() : 0;
+}
+
+//-----------------------------------------------------------------------------
+
+ICommand::sptr UndoRedoManager::getFirstUndoableCommand()
+{
+    return m_currentManager->getFirstUndoableCommand();
+}
+
+//-----------------------------------------------------------------------------
+
+ICommand::sptr UndoRedoManager::getFirstRedoableCommand()
+{
+    return m_currentManager->getFirstRedoableCommand();
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::setManager( Manager::sptr currentManager )
+{
+    m_currentManager = currentManager;
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::removeManager()
+{
+    m_currentManager.reset();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t UndoRedoManager::getMaxUndoLevel()
+{
+    return m_currentManager->getMaxUndoLevel();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t UndoRedoManager::getMaxUndoMemory()
+{
+    return m_currentManager->getMaxUndoMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::uint32_t UndoRedoManager::getMaxCommandMemory()
+{
+    return m_currentManager->getMaxCommandMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+UndoRedoManager::ConnectionType UndoRedoManager::connect(SignalType::slot_function_type subscriber)
+{
+    return m_sig.connect(subscriber);
+}
+
+//-----------------------------------------------------------------------------
+
+void UndoRedoManager::disconnect(UndoRedoManager::ConnectionType subscriber)
+{
+    subscriber.disconnect();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwCommand
diff --git a/SrcLib/core/fwCore/CMakeLists.txt b/SrcLib/core/fwCore/CMakeLists.txt
new file mode 100644
index 0000000..2bd0bad
--- /dev/null
+++ b/SrcLib/core/fwCore/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+fwLib (fwCore 0.1)
+
+
+
+find_package (Boost COMPONENTS regex filesystem date_time chrono log log_setup REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+unset(Boost_LIBRARIES)
+find_package (Boost COMPONENTS thread system REQUIRED)
+fwForwardLink(${Boost_LIBRARIES})
+
diff --git a/SrcLib/core/fwCore/COPYING b/SrcLib/core/fwCore/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwCore/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwCore/COPYING.LESSER b/SrcLib/core/fwCore/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwCore/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwCore/Properties.cmake b/SrcLib/core/fwCore/Properties.cmake
new file mode 100644
index 0000000..673f5e8
--- /dev/null
+++ b/SrcLib/core/fwCore/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwCore )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES  )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCore/bin/build.options b/SrcLib/core/fwCore/bin/build.options
new file mode 100644
index 0000000..66a982c
--- /dev/null
+++ b/SrcLib/core/fwCore/bin/build.options
@@ -0,0 +1,4 @@
+TYPE    = 'shared'
+USE     = ['boost', 'boostThread', 'boostLog', 'boostLogSetup']
+
+VERSION = '0-1'
diff --git a/SrcLib/core/fwCore/include/fwCore/BaseObject.hpp b/SrcLib/core/fwCore/include/fwCore/BaseObject.hpp
new file mode 100644
index 0000000..d09368a
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/BaseObject.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_BASEOBJECT_HPP
+#define __FWCORE_BASEOBJECT_HPP
+
+
+#include <boost/enable_shared_from_this.hpp>
+
+#include "fwCore/macros.hpp"
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+
+/**
+ * @brief Base class for all FW4SPL's classes
+ */
+class FWCORE_CLASS_API BaseObject : public ::boost::enable_shared_from_this<BaseObject>
+{
+
+public :
+    fwCoreNonInstanciableClassDefinitionsMacro( (BaseObject) );
+
+protected :
+    virtual ~BaseObject(){};
+    using ::boost::enable_shared_from_this<BaseObject>::shared_from_this;
+};
+
+} // namespace fwCore
+
+#endif // __FWCORE_BASEOBJECT_HPP
+
diff --git a/SrcLib/core/fwCore/include/fwCore/Demangler.hpp b/SrcLib/core/fwCore/include/fwCore/Demangler.hpp
new file mode 100644
index 0000000..0f9acdb
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/Demangler.hpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _FWCORE_DEMANGLER_HPP_
+#define _FWCORE_DEMANGLER_HPP_
+
+#include <string>
+#include <typeinfo>
+
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+
+ /**
+  * @brief typeid, string or object name demangler.
+  *
+  * getClassname() is an alias for getRootedClassname()
+  *
+  * @warning getRootedClassname() use on fundamentals types (int, float, ...)
+  * will give a bad result ( ex: \::int )
+  *
+  */
+class FWCORE_CLASS_API Demangler
+{
+public:
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+
+    /**
+     * @brief Constructor from a typeinfo object
+     *
+     * @param t Typeinfo to demangle
+     */
+    FWCORE_API Demangler(const std::type_info &t);
+
+    /**
+     * @brief Constructor from a std::string
+     *
+     * @param s string to demangle
+     */
+    FWCORE_API Demangler(const std::string &s);
+
+    /**
+     * @brief Constructor from any type
+     *
+     * @param s object which type has to be demangled
+     */
+    template<typename T> Demangler(T &s): m_name(typeid(s).name()) {};
+
+    /**
+     * @brief Destructor
+     */
+    FWCORE_API virtual ~Demangler();
+
+    /**  @} */
+
+    /**
+     * @brief Returns "Object" from "::some::long::namespace::Object"
+     *
+     * @return demangled class name only
+     */
+    FWCORE_API std::string getLeafClassname() const;
+
+    /**
+     * @brief Returns "some::long::namespace::Object" from "::some::long::namespace::Object"
+     *
+     * @return demangled class name with namespace (without leading "::")
+     */
+    FWCORE_API std::string getFullClassname() const;
+
+    /**
+     * @brief Like getRootedClassname(), present for backward compatibility
+     * @deprecated Use getRootedClassname() instead
+     * @return rooted (with leading "::") demangled class name
+     */
+    FWCORE_API std::string getClassname() const;
+
+    /**
+     * @brief Returns "::some::long::namespace::Object" from "::some::long::namespace::Object"
+     *
+     * @return rooted (with leading "::") demangled class name
+     */
+    FWCORE_API std::string getRootedClassname() const;
+
+    /**
+     * @brief Returns "some::long::namespace" from "::some::long::namespace::Object"
+     *
+     * @return demangled namespace (without leading "::")
+     */
+    FWCORE_API std::string getFullNamespace() const;
+
+    /**
+     * @brief Returns "::some::long::namespace" from "::some::long::namespace::Object"
+     *
+     * @return rooted demangled namespace (with leading "::")
+     */
+    FWCORE_API std::string getRootedNamespace() const;
+
+
+protected:
+    /**
+     * @brief Store the name to demangle
+     */
+    const std::string m_name;
+
+    /**
+     * @brief Process the name to demangle and return the same string whatever the OS is.
+     *
+     * @return demangled string
+     */
+    std::string demangle() const;
+};
+
+
+
+ /**
+  * @brief Type demangler.
+  * Use Demangler class to get a demangled string for the type T.
+  */
+template <class T>
+class TypeDemangler : public Demangler
+{
+public:
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+    /**
+     * @brief Constructor
+     * @tparam T Type to demangle
+     */
+    TypeDemangler<T>()  : Demangler(typeid(T)) {};
+
+    /**  @} */
+};
+
+
+
+
+/**
+ * @name Type demangling functions
+ * @brief These functions are provided as type-demangling helpers. See
+ * Demangler for details about returned values.
+ *
+ * @tparam T Type to demangle
+ *
+ * @{ */
+template <class T>
+inline std::string getLeafClassname()   { return TypeDemangler<T>().getLeafClassname();   } ;
+template <class T>
+inline std::string getFullClassname()   { return TypeDemangler<T>().getFullClassname();   } ;
+template <class T>
+inline std::string getClassname()       { return TypeDemangler<T>().getClassname();       } ;
+template <class T>
+inline std::string getRootedClassname() { return TypeDemangler<T>().getRootedClassname(); } ;
+
+template <class T>
+inline std::string getFullNamespace()   { return TypeDemangler<T>().getFullNamespace();   } ;
+template <class T>
+inline std::string getRootedNamespace() { return TypeDemangler<T>().getRootedNamespace(); } ;
+/**  @} */
+
+} // namespace fwCore
+
+#endif // _FWCORE_DEMANGLER_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/Exception.hpp b/SrcLib/core/fwCore/include/fwCore/Exception.hpp
new file mode 100644
index 0000000..83c5728
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/Exception.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef _FWCORE_EXCEPTION_HPP_
+#define _FWCORE_EXCEPTION_HPP_
+
+
+#include <stdexcept>
+#include <string>
+
+#include <boost/exception/exception.hpp>
+
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+
+
+class FWCORE_CLASS_API Exception : public std::runtime_error
+{
+
+public:
+    FWCORE_API Exception ( const std::string &err );
+
+};
+
+} //namespace fwCore
+
+#endif //_FWCORE_EXCEPTION_FWEXCEPTION_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/HiResClock.hpp b/SrcLib/core/fwCore/include/fwCore/HiResClock.hpp
new file mode 100644
index 0000000..ae83f80
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/HiResClock.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_HIRESCLOCK_HPP_
+#define _FWCORE_HIRESCLOCK_HPP_
+
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+
+
+/**
+ * @brief This namespace provides several function that returns a hi
+ * resolution EPOCH time.
+ *
+ * @warning EPOCH time has not the same reference on each operating
+ * system.
+ */
+namespace HiResClock
+{
+
+/**
+ * @brief Type returned by HiResClock Functions
+ */
+typedef double HiResClockType;
+
+
+/**
+ * @return EPOCH time in microseconds
+ */
+FWCORE_API HiResClockType getTimeInMicroSec();
+
+/**
+ * @return EPOCH time in milliseconds
+ */
+FWCORE_API HiResClockType getTimeInMilliSec();
+
+/**
+ * @return EPOCH time in seconds
+ */
+FWCORE_API HiResClockType getTimeInSec();
+
+
+} //namespace HiResClock
+
+} //namespace fwCore
+
+#endif // _FWCORE_HIRESCLOCK_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/HiResTimer.hpp b/SrcLib/core/fwCore/include/fwCore/HiResTimer.hpp
new file mode 100644
index 0000000..bfa6bfa
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/HiResTimer.hpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_HIRESTIMER_HPP_
+#define _FWCORE_HIRESTIMER_HPP_
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
+#endif
+
+#include <fwCore/BaseObject.hpp>
+#include "fwCore/HiResClock.hpp"
+#include <fwCore/config.hpp>
+
+namespace fwCore
+{
+
+/**
+ * @brief This class provide a timer (stopwatch).
+ * HiResTimer is able to measure the elapsed time with a few micro-seconds.
+ * accuracy, on Linux, Mac OS and Windows
+ */
+class FWCORE_CLASS_API HiResTimer : public BaseObject
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (HiResTimer)(BaseObject), (()), new HiResTimer) ;
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+    FWCORE_API HiResTimer();
+    FWCORE_API virtual ~HiResTimer();
+
+    /**  @} */
+
+    /**
+     * @brief Start the timer.
+     */
+    FWCORE_API void   start();
+
+    /**
+     * @brief Stop the timer.
+     * stop() will not reset the timer.
+     */
+    FWCORE_API void   stop();
+
+    /**
+     * @brief Reset the timer and leave it in the same state it was (started or stopped).
+     *
+     * @param initial_value Initial value in microseconds from which the timer
+     * will start to count.
+     */
+    FWCORE_API void   reset(::fwCore::HiResClock::HiResClockType initial_value=0.);
+
+
+    /**
+     * @name Elapsed time
+     * @brief These methods return the cumulated elapsed running time of the timer
+     * the timer is running when start() has been invoked and stop running on
+     * stop() or reset() invokation.
+     * @{ */
+
+    /**
+     * @return Elapsed time in seconds
+     */
+    FWCORE_API ::fwCore::HiResClock::HiResClockType getElapsedTimeInSec();
+
+    /**
+     * @return Elapsed time in milliseconds
+     */
+    FWCORE_API ::fwCore::HiResClock::HiResClockType getElapsedTimeInMilliSec();
+
+    /**
+     * @return Elapsed time in microseconds
+     */
+    FWCORE_API ::fwCore::HiResClock::HiResClockType getElapsedTimeInMicroSec();
+
+    /**  @} */
+protected:
+
+
+private:
+    /**
+     * @brief Last start time.
+     */
+    ::fwCore::HiResClock::HiResClockType m_startTimeInMicroSec;
+    /**
+     * @brief Last "break" time.
+     */
+    ::fwCore::HiResClock::HiResClockType m_endTimeInMicroSec;
+    /**
+     * @brief cummulated running time.
+     */
+    ::fwCore::HiResClock::HiResClockType m_cumulTimeInMicroSec;
+    /**
+     * @brief timer status.
+     */
+    bool   m_stopped;
+};
+
+} //namespace fwCore
+
+#endif // _FWCORE_HIRESTIMER_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/LogicStamp.hpp b/SrcLib/core/fwCore/include/fwCore/LogicStamp.hpp
new file mode 100644
index 0000000..257fe9d
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/LogicStamp.hpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_LOGICSTAMP_HPP
+#define __FWCORE_LOGICSTAMP_HPP
+
+#include "fwCore/base.hpp"
+#include "fwCore/HiResClock.hpp"
+
+
+namespace fwCore
+{
+
+/**
+ * @brief Provides a Logical timestamp system.
+ *
+ *
+ */
+class FWCORE_CLASS_API LogicStamp : public BaseObject
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (LogicStamp)(BaseObject), (()), new LogicStamp);
+
+    /**
+     * @brief Type used in logical typestamp.
+     */
+    typedef unsigned long LogicStampType;
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+    FWCORE_API LogicStamp()
+    {
+        this->m_modifiedLogicalTime = 0;
+    };
+
+    /**  @} */
+
+
+    /**
+     * @brief Increment global Logical counter and copy it to this LogicStamp.
+     */
+    FWCORE_API void modified();
+
+
+    /**
+     * @return LogicStamp's current value
+     */
+    FWCORE_API LogicStampType getLogicStamp() const
+    {
+        return this->m_modifiedLogicalTime;
+    };
+
+
+    /**
+     * @brief Greater than operator for LogicStamp.
+     *
+     * @param ls LogicStamp to compare to
+     */
+    FWCORE_API bool operator>(const LogicStamp& ls) const
+    {
+        return ( this->m_modifiedLogicalTime > ls.m_modifiedLogicalTime );
+    };
+
+    /**
+     * @brief Lesser than operator for LogicStamp.
+     *
+     * @param ls LogicStamp to compare to
+     */
+    FWCORE_API bool operator<(const LogicStamp& ls) const
+    {
+        return ( this->m_modifiedLogicalTime < ls.m_modifiedLogicalTime );
+    };
+
+    /**
+     * @brief Cast operator for LogicStamp.
+     */
+    FWCORE_API operator LogicStampType() const
+    {
+        return this->m_modifiedLogicalTime;
+    };
+
+
+private:
+
+    /**
+     * @brief Stored logical time
+     */
+    LogicStampType m_modifiedLogicalTime;
+
+};
+
+} //namespace fwCore
+
+#endif // __FWCORE_LOGICSTAMP_HPP
+
diff --git a/SrcLib/core/fwCore/include/fwCore/Namespace.hpp b/SrcLib/core/fwCore/include/fwCore/Namespace.hpp
new file mode 100644
index 0000000..8ff890e
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_NAMESPACE_HPP__
+#define __FWCORE_NAMESPACE_HPP__
+
+/**
+ * @brief       This namespace fwCore provides common foundations for FW4SPL.
+ * @namespace   fwCore
+ * 
+ * @date        2009-2010
+ *
+ */
+namespace fwCore
+{
+}
+#endif /* __FWCORE_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/TimeStamp.hpp b/SrcLib/core/fwCore/include/fwCore/TimeStamp.hpp
new file mode 100644
index 0000000..f1e79d7
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/TimeStamp.hpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_TIMESTAMP_HPP
+#define __FWCORE_TIMESTAMP_HPP
+
+#include "fwCore/base.hpp"
+#include "fwCore/HiResClock.hpp"
+
+namespace fwCore
+{
+
+/**
+ * @brief Provides a timestamp and a expiracy system.
+ *
+ */
+class FWCORE_CLASS_API TimeStamp : public BaseObject
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (TimeStamp)(BaseObject), (()), new TimeStamp) ;
+
+    /**
+     * @brief Type used in logical typestamp.
+     */
+    typedef ::fwCore::HiResClock::HiResClockType TimeStampType;
+
+
+
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+    FWCORE_API TimeStamp()
+    {
+        this->m_modifiedTime = 0;
+        this->m_lifePeriod   = 0;
+    };
+
+    /**  @} */
+
+
+    /**
+     * @brief Update the timestamp to the current EPOCH time
+     */
+    FWCORE_API void modified();
+
+
+    /**
+     * @return TimeStamp's current value
+     */
+    FWCORE_API TimeStampType getTimeStamp() const
+    {
+        return this->m_modifiedTime;
+    };
+
+
+
+    /**
+     * @brief Greater than operator for TimeStamp.
+     *
+     * @param ts TimeStamp to compare to
+     */
+    FWCORE_API bool operator>(const TimeStamp& ts) const
+    {
+        return ( this->m_modifiedTime > ts.m_modifiedTime );
+    };
+
+    /**
+     * @brief Lesser than operator for TimeStamp.
+     *
+     * @param ts TimeStamp to compare to
+     */
+    FWCORE_API bool operator<(const TimeStamp& ts) const
+    {
+        return ( this->m_modifiedTime < ts.m_modifiedTime );
+    };
+
+    /**
+     * @brief Cast operator for TimeStamp.
+     */
+    FWCORE_API operator TimeStampType() const
+    {
+        return this->m_modifiedTime;
+    };
+
+
+    /**
+     * @brief Setter for the life period
+     *
+     * @param period Period in milliseconds
+     */
+    FWCORE_API void setLifePeriod(TimeStampType period)
+    {
+        m_lifePeriod = period;
+    };
+
+    /**
+     * @brief Getter for the life period
+     *
+     * @return TimeStamp life period
+     */
+    FWCORE_API TimeStampType getLifePeriod() const
+    {
+        return m_lifePeriod;
+    };
+
+
+    /**
+     * @brief Check TimeStamp expiracy status
+     *
+     * @return True if more than m_lifePeriod milliseconds are elapsed from
+     * TimeStamp value
+     */
+    FWCORE_API bool periodExpired() const
+    {
+        return (::fwCore::HiResClock::getTimeInMilliSec() - this->m_modifiedTime) > m_lifePeriod;
+    }
+
+
+private:
+    /**
+     * @brief TimeStamp value (milliseconds)
+     */
+    TimeStampType m_modifiedTime;
+
+    /**
+     * @brief life period (milliseconds)
+     */
+    TimeStampType m_lifePeriod;
+
+};
+
+
+} //namespace fwCore
+
+#endif // __FWCORE_TIMESTAMP_HPP
diff --git a/SrcLib/core/fwCore/include/fwCore/base.hpp b/SrcLib/core/fwCore/include/fwCore/base.hpp
new file mode 100644
index 0000000..0d5c6c1
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/base.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/** 
+ * @file fwCore/base.hpp
+ * @brief This file includes the minimal tools to work with FW4SPL.
+ *
+ * 
+ */
+//#ifndef __FWCORE_BASE_HPP
+//#define __FWCORE_BASE_HPP
+
+#include <fwCore/BaseObject.hpp>
+#include <fwCore/macros.hpp>
+#include <fwCore/spyLog.hpp>
+#include <fwCore/exceptionmacros.hpp>
+
+//#endif //__FWCORE_BASE_HPP
diff --git a/SrcLib/core/fwCore/include/fwCore/concept_checks.hpp b/SrcLib/core/fwCore/include/fwCore/concept_checks.hpp
new file mode 100644
index 0000000..1916967
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/concept_checks.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwCore/concept_checks.hpp
+ * @brief This file defines some fw4spl concept checks.
+ *
+ * 
+ */
+#ifndef __FWCORE_CONCEPT_CHECK_HPP
+#define __FWCORE_CONCEPT_CHECK_HPP
+
+#include <boost/concept_check.hpp>
+
+#include <fwCore/macros.hpp>
+
+namespace fwCore
+{
+namespace concepts
+{
+
+
+
+template <class X>
+struct SharedPtrTypedef
+{
+ public:
+
+    BOOST_CONCEPT_USAGE(SharedPtrTypedef)
+    {
+        typename X::sptr::element_type *a=0;
+        X *b=0;
+        FwCoreNotUsedMacro(a);
+        FwCoreNotUsedMacro(b);
+        same_type(a,b);
+    }
+
+ private:
+
+    // Type deduction will fail unless the arguments have the same type.
+    template <typename T>
+    void same_type(T *, T *);
+};
+
+
+} // namespace concepts
+
+} // namespace fwCore
+
+#endif //__FWCORE_CONCEPT_CHECK_HPP
diff --git a/SrcLib/core/fwCore/include/fwCore/config.hpp b/SrcLib/core/fwCore/include/fwCore/config.hpp
new file mode 100644
index 0000000..066297e
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_CONFIG_HPP_
+#define _FWCORE_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWCORE_EXPORTS
+    #define FWCORE_API __declspec(dllexport)
+    #else
+    #define FWCORE_API __declspec(dllimport)
+    #endif
+
+    #define FWCORE_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWCORE_EXPORTS
+    #define FWCORE_API __attribute__ ((visibility("default")))
+    #define FWCORE_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWCORE_API __attribute__ ((visibility("hidden")))
+    //#define FWCORE_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWCORE_API
+    #define FWCORE_CLASS_API
+    #endif
+
+#else
+
+    #define FWCORE_API
+    #define FWCORE_CLASS_API
+
+#endif
+
+
+#endif //_FWCORE_CONFIG_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/exceptionmacros.hpp b/SrcLib/core/fwCore/include/fwCore/exceptionmacros.hpp
new file mode 100644
index 0000000..7a7048a
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/exceptionmacros.hpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_EXCEPTION_MACRO_HPP_
+# define _FWCORE_EXCEPTION_MACRO_HPP_
+
+# include <boost/exception/exception.hpp>
+# include <boost/throw_exception.hpp>
+
+# include "fwCore/Exception.hpp"
+# include "fwCore/spyLog.hpp"
+# include "fwCore/Demangler.hpp"
+
+# define LOG_FWEXCEPTIONS 1
+
+# define __FWCORE_EXCEPTION_CLASS ::fwCore::Exception
+
+# define __FWCORE_EXCEPTION_PREPARE_MSG(var, msg)       \
+    std::stringstream var;                              \
+    var << msg
+
+# define __FWCORE_EXCEPTION_GETCLASSNAME(obj)           \
+    ::fwCore::Demangler(typeid(obj)).getClassname()
+
+# define __FWCORE_EXCEPTION_INFO(excep)         \
+    "Exception: <"                              \
+    << __FWCORE_EXCEPTION_GETCLASSNAME(excep)   \
+    << ">: " << excep.what()
+
+// --------------------------------------------------------------------------------
+
+# ifdef LOG_FWEXCEPTIONS
+#  define __FWCORE_EXCEPTION_LOG(excep)         \
+    OSLM_WARN(__FWCORE_EXCEPTION_INFO(excep))
+# else
+# define __FWCORE_EXCEPTION_LOG(excep)
+# endif
+
+// --------------------------------------------------------------------------------
+
+# define __FWCORE_EXCEPT_RAISE_EXCEPTION(excep) \
+    __FWCORE_EXCEPTION_LOG(excep);              \
+    BOOST_THROW_EXCEPTION(excep)
+
+# define __FWCORE_EXCEPT_RAISE_EXCEPTION_MSG(excep_class, msg)          \
+    __FWCORE_EXCEPTION_PREPARE_MSG(_fwcore_exception_msgstream, msg);   \
+    __FWCORE_EXCEPT_RAISE_EXCEPTION(                                    \
+        excep_class(_fwcore_exception_msgstream.str()))
+
+# define __FWCORE_EXCEPT_RAISE(msg)                                     \
+    __FWCORE_EXCEPT_RAISE_EXCEPTION_MSG(__FWCORE_EXCEPTION_CLASS, msg)
+
+# define __FWCORE_EXCEPT_RAISE_EXCEPTION_IF(excep, cond)        \
+    __FWCORE_IF(cond, __FWCORE_EXCEPT_RAISE_EXCEPTION(excep);)
+
+# define __FWCORE_EXCEPT_RAISE_IF(msg, cond)            \
+    __FWCORE_IF(cond, __FWCORE_EXCEPT_RAISE(msg);)
+
+# define __FWCORE_EXCEPT_FORWARD_EXCEPTION(excep)       \
+    BOOST_THROW_EXCEPTION(excep)
+
+# define __FWCORE_EXCEPT_FORWARD_EXCEPTION_IF(excep, cond)    \
+    __FWCORE_IF(cond, BOOST_THROW_EXCEPTION(excep);)
+
+// -----------------------------------------------------------------------------
+
+# ifdef FWEXCEPTIONS_AS_ASSERTS
+
+#  undef __FWCORE_EXCEPT_RAISE_EXCEPTION
+#  define __FWCORE_EXCEPT_RAISE_EXCEPTION(excep)        \
+    OSLM_ASSERT(__FWCORE_EXCEPTION_INFO(excep), false)
+
+#  undef __FWCORE_EXCEPT_FORWARD_EXCEPTION
+#  define __FWCORE_EXCEPT_FORWARD_EXCEPTION(excep)           \
+    OSLM_ASSERT(                                             \
+        "[Forwarded] " << __FWCORE_EXCEPTION_INFO (excep),   \
+        false)
+
+#  undef __FWCORE_EXCEPT_FORWARD_EXCEPTION_IF
+#  define __FWCORE_EXCEPT_FORWARD_EXCEPTION_IF(excep, cond)     \
+    OSLM_ASSERT(                                                \
+        "[Forwarded] " << __FWCORE_EXCEPTION_INFO (excep),      \
+        cond)
+
+# endif
+
+// -----------------------------------------------------------------------------
+
+# define FW_RAISE_EXCEPTION(excep)  __FWCORE_EXPR_BLOCK(        \
+        __FWCORE_EXCEPT_RAISE_EXCEPTION(excep);                 \
+        )
+
+# define FW_RAISE_EXCEPTION_MSG(excep_class, msg) __FWCORE_EXPR_BLOCK(  \
+        __FWCORE_EXCEPT_RAISE_EXCEPTION_MSG(excep_class, msg);          \
+        )
+
+# define FW_RAISE(msg) __FWCORE_EXPR_BLOCK(     \
+        __FWCORE_EXCEPT_RAISE(msg);             \
+        )
+
+# define FW_RAISE_EXCEPTION_IF(excep, cond) __FWCORE_EXPR_BLOCK(        \
+        __FWCORE_EXCEPT_RAISE_EXCEPTION_IF(excep, cond)                 \
+        )
+
+# define FW_RAISE_IF(msg, cond) __FWCORE_EXPR_BLOCK(    \
+        __FWCORE_EXCEPT_RAISE_IF(msg, cond)             \
+        )
+
+# define FW_FORWARD_EXCEPTION(excep) __FWCORE_EXPR_BLOCK(       \
+        __FWCORE_EXCEPT_FORWARD_EXCEPTION(excep);               \
+        )
+
+# define FW_FORWARD_EXCEPTION_IF(excep, cond) __FWCORE_EXPR_BLOCK(       \
+        __FWCORE_EXCEPT_FORWARD_EXCEPTION_IF(excep, cond);               \
+        )
+
+#endif  // _FWCORE_EXCEPTION_MACRO_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/log/Namespace.hpp b/SrcLib/core/fwCore/include/fwCore/log/Namespace.hpp
new file mode 100644
index 0000000..eab42e2
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/log/Namespace.hpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_LOG_NAMESPACE_HPP__
+#define __FWCORE_LOG_NAMESPACE_HPP__
+
+namespace fwCore
+{
+/**
+ * @brief       This namespace fwCore::log provides common foundations for log in FW4SPL.
+ * @namespace   fwCore::log
+ * 
+ * @date        2012.
+ */
+namespace log
+{
+}
+
+}
+#endif /* __FWCORE_LOG_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/log/ScopedMessage.hpp b/SrcLib/core/fwCore/include/fwCore/log/ScopedMessage.hpp
new file mode 100644
index 0000000..a61a097
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/log/ScopedMessage.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_LOG_SCOPEDMESSAGE_HPP_
+#define _FWCORE_LOG_SCOPEDMESSAGE_HPP_
+
+#include <string>
+
+#include "fwCore/BaseObject.hpp"
+#include "fwCore/HiResTimer.hpp"
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+namespace log
+{
+
+class SpyLogger;
+
+/**
+ * @brief Scoped messages.
+ *
+ * Generate a scoped trace message with an enter and a leave message, and the
+ * time elapsed between the two messages.
+ *
+ * 
+ */
+class FWCORE_CLASS_API ScopedMessage: public ::fwCore::BaseObject
+{
+
+public:
+
+    FWCORE_API ScopedMessage( const char * _file, int _line, std::string enterMessage, std::string leaveMessage = "");
+
+    void use(){}; // avoid compiler warnings like "variable X never used"
+
+    FWCORE_API virtual ~ScopedMessage();
+
+protected:
+
+    const char * m_file;
+    int          m_line;
+    std::string  m_baseMsg;
+    std::string  m_leave;
+
+    ::fwCore::HiResTimer  m_timer;
+};
+
+} // namespace log
+} // namespace fwCore
+
+#endif // _FWCORE_LOG_SCOPEDMESSAGE_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/log/SpyLogger.hpp b/SrcLib/core/fwCore/include/fwCore/log/SpyLogger.hpp
new file mode 100644
index 0000000..7d98d0d
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/log/SpyLogger.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWCORE_LOG_SPYLOGGER_HPP_
+#define _FWCORE_LOG_SPYLOGGER_HPP_
+
+#include <iostream>
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwCore/BaseObject.hpp"
+#include "fwCore/config.hpp"
+
+namespace fwCore
+{
+namespace log
+{
+
+/**
+ * @brief   Implements the SpyLogger.
+ *
+ * 
+ */
+class SpyLogger : public ::fwCore::BaseObject
+{
+
+public :
+
+    enum LevelType
+    {
+        SL_TRACE,
+        SL_DEBUG,
+        SL_INFO,
+        SL_WARN,
+        SL_ERROR,
+        SL_FATAL
+    };
+
+    FWCORE_API void createBasicConfiguration();
+
+    FWCORE_API void addStreamAppender(std::ostream &os = std::clog, LevelType level = SL_TRACE);
+
+    FWCORE_API void addFileAppender(const std::string & logFile = "SLM.log", LevelType level = SL_TRACE);
+
+    // FWCORE_API void addSyslogAppender(const std::string & hostName, const std::string & facilityName);
+
+    FWCORE_API void setLevel(LevelType level);
+
+    FWCORE_API void trace(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void debug(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void info(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void warn(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void error(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void fatal(const std::string & mes, const char * file = 0, int line = -1);
+
+    FWCORE_API void log(const std::string & mes, const char * file = 0, int line = -1);
+
+    static SpyLogger &getSpyLogger() {return s_spyLogger;}
+
+protected :
+
+
+    FWCORE_API SpyLogger ();
+
+    FWCORE_API static SpyLogger s_spyLogger;
+
+}; // SpyLogger
+
+} // namespace log
+} // namespace fwCore
+
+#endif // _FWCORE_LOG_SPYLOGGER_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/macros.hpp b/SrcLib/core/fwCore/include/fwCore/macros.hpp
new file mode 100644
index 0000000..1405294
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/macros.hpp
@@ -0,0 +1,602 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWCORE_MACROS_HPP__
+#define __FWCORE_MACROS_HPP__
+
+/**
+ * @file fwCore/macros.hpp
+ * @brief This file defines fwCore base macros.
+ */
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/control/expr_if.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/facilities/empty.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/logical/and.hpp>
+#include <boost/preprocessor/logical/not.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/fold_right.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+#include <boost/preprocessor/seq/for_each_i.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/seq/transform.hpp>
+#include <boost/preprocessor/tuple/elem.hpp>
+
+#include "fwCore/Demangler.hpp"
+
+#ifdef _WIN32
+#pragma warning(disable: 4003)
+#endif //_WIN32
+
+
+
+#define FwCoreNotUsedMacro(x) ((void) x )
+
+
+/** @cond
+ */
+
+#define __FWCORE_TYPEDEF_SELF_NAME               SelfType
+#define __FWCORE_TYPEDEF_SHARED_PTR_NAME         sptr
+#define __FWCORE_TYPEDEF_WEAK_PTR_NAME           wptr
+#define __FWCORE_TYPEDEF_SHARED_PTR_CONST_NAME   csptr
+#define __FWCORE_TYPEDEF_WEAK_PTR_CONST_NAME     cwptr
+#define __FWCORE_TYPEDEF_SHARED_PTR_FACTORY_NAME NewSptr
+#define __FWCORE_FACTORY_NAME                    New
+#define __FWCORE_TYPEDEF_SUPERCLASS_NAME         BaseClass
+#define __FWCORE_TYPEDEF_ROOTCLASS_NAME          RootClass
+#define __FWCORE_DYNAMIC_CAST_FUNC_NAME          dynamicCast
+#define __FWCORE_DYNAMIC_CONST_CAST_FUNC_NAME    dynamicConstCast
+#define __FWCORE_CONST_CAST_FUNC_NAME            constCast
+#define __FWCORE_SPTR_FROM_THIS_FUNC_NAME        getSptr
+#define __FWCORE_CONST_SPTR_FROM_THIS_FUNC_NAME  getConstSptr
+#define __FWCORE_SHARED_PTR_FACTORY_CLASSNAME    __SelfNewSptr__
+#define __FWCORE_ARG_NAME                        __var
+/** @endcond */
+
+
+/**
+ * @name Smart pointers macro
+ * @{ */
+
+/** Expand to shared_ptr < _cls_ > */
+#define SPTR(_cls_)  ::boost::shared_ptr < _cls_ >
+/** Expand to shared_ptr < const _cls_ > */
+#define CSPTR(_cls_) ::boost::shared_ptr < const _cls_ >
+/** Expand to weak_ptr < _cls_ > */
+#define WPTR(_cls_)  ::boost::weak_ptr   < _cls_ >
+/** Expand to weak_ptr < const _cls_ > */
+#define CWPTR(_cls_) ::boost::weak_ptr   < const _cls_ >
+/**  @} */
+
+
+
+// @cond
+#define __FWCORE_NOTHING( _a_ )
+#define __FWCORE_NOTHING_2( _a_, _b_ )
+
+#define __FWCORE_GET_NTH_ELEM_III(_s_, _n_, _elem_) BOOST_PP_SEQ_ELEM(_n_, _elem_)
+#define __FWCORE_GET_ARGS_TYPES(_args_) BOOST_PP_SEQ_TRANSFORM(__FWCORE_GET_NTH_ELEM_III, 0, _args_)
+#define __FWCORE_GET_ARG_DEFAULT_IF_HAS_ONE(arg)             \
+    BOOST_PP_EXPR_IF(                                        \
+            BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(arg), 2 ),     \
+            =                                                \
+            )                                                \
+    BOOST_PP_EXPAND(                                         \
+            BOOST_PP_IF(                                     \
+                BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(arg), 2 ), \
+                BOOST_PP_SEQ_ELEM, __FWCORE_NOTHING_2        \
+                )                                            \
+                (1,arg)                                      \
+                )
+
+
+#define __FWCORE_SEQ_IS_EMPTY_SINGLE(_seq_) BOOST_PP_AND( BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(_seq_), 1), BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_ELEM(0,_seq_)), 0) )
+#define __FWCORE_SEQ_IS_NOT_EMPTY_SINGLE(_seq_) BOOST_PP_NOT(__FWCORE_SEQ_IS_EMPTY_SINGLE(_seq_))
+
+/*
+ * __FWCORE_GENERATE_ARGS( ((a)) ((b)) ((c)(default)) ) expands to  (a __var, ) (b __var, ) (c __var, = default) where __var is defined by __FWCORE_ARG_NAME
+ */
+#define __FWCORE_ADD_ARG_NAME_AND_VALUE_III(s, _data_, _elem_)                                                                 \
+    BOOST_PP_EXPR_IF(_data_, (BOOST_PP_SEQ_ELEM(0,_elem_) __FWCORE_ARG_NAME ,  __FWCORE_GET_ARG_DEFAULT_IF_HAS_ONE(_elem_) ) )
+#define __FWCORE_GENERATE_ARGS(_args_)                                                                                                                                   \
+    BOOST_PP_IF(                                                                                                                                                         \
+            __FWCORE_SEQ_IS_EMPTY_SINGLE(_args_),                                                                                                                        \
+            (),                                                                                                                                                          \
+            BOOST_PP_EXPR_IF(__FWCORE_SEQ_IS_NOT_EMPTY_SINGLE(_args_),BOOST_PP_SEQ_TRANSFORM)  (__FWCORE_ADD_ARG_NAME_AND_VALUE_III, BOOST_PP_SEQ_SIZE(_args_), _args_ ) \
+            )
+
+
+/*
+ * __FWCORE_GENERATE_TYPED_NUMBERED_TUPLE( ((a)) ((b)) ((c)(default)) ) expands to  (a __var0, b __var1, c __var2 = default)  or to () if _args_ is an empty boost_pp sequence
+ */
+#define __FWCORE_ADD_ID(_r_, _data_, _i_, _elem_) BOOST_PP_IF(_data_, ( BOOST_PP_CAT( BOOST_PP_TUPLE_ELEM(2, 0, _elem_), _i_) BOOST_PP_TUPLE_ELEM(2, 1, _elem_)), ())
+#define __FWCORE_GENERATE_TYPED_NUMBERED_TUPLE(_args_)                                                                            \
+    BOOST_PP_IF(                                                                                                                  \
+        __FWCORE_SEQ_IS_EMPTY_SINGLE(_args_),                                                                                     \
+        (),                                                                                                                       \
+        BOOST_PP_SEQ_TO_TUPLE(BOOST_PP_SEQ_FOR_EACH_I(__FWCORE_ADD_ID, BOOST_PP_SEQ_SIZE(_args_),__FWCORE_GENERATE_ARGS(_args_))) \
+        )
+
+
+/*
+ * __FWCORE_GENERATE_NUMBERED_TUPLE((a)(b)(c)) expands to  ( __var0, __var1, __var2)  or to () if _args_ is an empty boost_pp sequence
+ */
+#define __FWCORE_GENERATE_NUMBERED_TUPLE(_args_)                                 \
+    BOOST_PP_IF(                                                                 \
+            __FWCORE_SEQ_IS_EMPTY_SINGLE(_args_),                                \
+            (),                                                                  \
+            (BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(_args_), __FWCORE_ARG_NAME)) \
+            )
+
+/*
+ * __FWCORE_GENERATE_CONSTRUCTOR(_factory_, _classname_, superclassname, _args_)
+ *
+ *  - _args_ is a boost_pp sequence of (0, 1 or 2)-elem sequences
+ *
+ *  expands to  _classname_ (_args_) : superclassname ( _factory_ (_args_) ) {}
+ *
+ *  ex: __FWCORE_GENERATE_CONSTRUCTOR( new obj, MyClass, MySuperClass, ((int)) ((float)(5.))  )
+ *  expands to : MyClass(int __var0, float __var2 = 5.) : MySuperClass( new obj(__var0, __var1)) {}
+ *
+ *  ex: __FWCORE_GENERATE_CONSTRUCTOR( new obj, MyClass, MySuperClass, ((int)) ((string)) )
+ *  expands to : MyClass(int __var0, string __var2) : MySuperClass( new obj(__var0, __var1)) {}
+ *
+ *  and: __FWCORE_GENERATE_CONSTRUCTOR( new obj, MyClass, MySuperClass, ())
+ *  expands to : MyClass() : MySuperClass( new obj()) {}
+ *
+ */
+#define __FWCORE_GENERATE_CONSTRUCTOR( _factory_, _classname_, superclassname, _args_ )                                                   \
+    _classname_ __FWCORE_GENERATE_TYPED_NUMBERED_TUPLE(_args_) : superclassname ( _factory_ __FWCORE_GENERATE_NUMBERED_TUPLE(_args_) ) {}
+
+
+/*
+ * __FWCORE_GENERATE_ONE_CONSTRUCTOR_III(_r_, _data_, _args_)
+ *
+ * wrapper of __FWCORE_GENERATE_CONSTRUCTOR for __FWCORE_GENERATE_CONSTRUCTORS_IV needs
+ * _args_ : ( boost-needed, (factory) (classname) (superclassname), _args_)
+ */
+#define __FWCORE_GENERATE_ONE_CONSTRUCTOR_III(_r_, _data_, _args_)                                                                 \
+     __FWCORE_GENERATE_CONSTRUCTOR( BOOST_PP_SEQ_ELEM(0,_data_),BOOST_PP_SEQ_ELEM(1,_data_),BOOST_PP_SEQ_ELEM(2,_data_), _args_) ;
+
+/*
+ * __FWCORE_GENERATE_CONSTRUCTORS_IV( _factory_, _classname_, superclassname, _args_ )
+ *
+ * generates a constructor for each item of _args_ using "_factory_"
+ *
+ */
+#define __FWCORE_GENERATE_CONSTRUCTORS_IV( _factory_, _classname_, superclassname, _args_ )                          \
+    BOOST_PP_SEQ_FOR_EACH(__FWCORE_GENERATE_ONE_CONSTRUCTOR_III, (_factory_) (_classname_) (superclassname), _args_)
+
+
+/*
+ * __FWCORE_GENERATE_ONE_CONSTRUCTOR_WITH_N_FACTORIES_III(_r_, _data_, _factory_args_)
+ *
+ * wrapper of __FWCORE_GENERATE_CONSTRUCTOR for __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES_III usage
+ *
+ * _factory_args_ format : (factory, ((type1)) ((type2)) ... ((typeN)) )
+ */
+#define __FWCORE_GENERATE_ONE_CONSTRUCTOR_WITH_N_FACTORIES_III(_r_, _data_, _factory_args_) \
+     __FWCORE_GENERATE_CONSTRUCTOR(                                                         \
+             BOOST_PP_TUPLE_ELEM(2,0,_factory_args_),                                       \
+             BOOST_PP_SEQ_ELEM(0,_data_),                                                   \
+             BOOST_PP_SEQ_ELEM(1,_data_),                                                   \
+             BOOST_PP_TUPLE_ELEM(2,1,_factory_args_)                                        \
+             );
+
+/*
+ * __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES_III( _classname_, superclassname, _factories_args_ )
+ *
+ * generates a constructor for each item of _args_ using a different specified factory
+ *
+ * ex. of _factories_args_ : ((new obj, () )) ((new objFromInt, ((int)) ))
+ *
+ */
+#define __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES_III( _classname_, superclassname, _factories_args_ )                        \
+    BOOST_PP_SEQ_FOR_EACH(__FWCORE_GENERATE_ONE_CONSTRUCTOR_WITH_N_FACTORIES_III, (_classname_) (superclassname), _factories_args_)
+
+
+/*
+ * __FWCORE_GENERATE_CONSTRUCTORS( _classname_ , _factory_, _args_ )
+ *
+ * Wrapper for __FWCORE_GENERATE_CONSTRUCTORS_IV
+ *
+ */
+#define __FWCORE_GENERATE_CONSTRUCTORS( _classname_ , _factory_, _args_) \
+    __FWCORE_GENERATE_CONSTRUCTORS_IV(                                   \
+            _factory_,                                                   \
+            __FWCORE_SHARED_PTR_FACTORY_CLASSNAME,                       \
+            __FWCORE_TYPEDEF_SHARED_PTR_NAME,                            \
+            _args_                                                       \
+            )
+
+/*
+ * __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES( _classname_ , _factories_args_ )
+ *
+ * Wrapper for __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES_III *
+ */
+#define __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES( _classname_ , _factories_args_ ) \
+    __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES_III(                                  \
+            __FWCORE_SHARED_PTR_FACTORY_CLASSNAME,                                        \
+            __FWCORE_TYPEDEF_SHARED_PTR_NAME,                                             \
+            _factories_args_                                                              \
+            )
+
+
+
+/*
+ * Utils for Factories (obj::New(...)), work like constructors utils
+ */
+#define __FWCORE_GENERATE_FACTORY( _factory_, _args_ )                                                           \
+    static __FWCORE_TYPEDEF_SHARED_PTR_NAME __FWCORE_FACTORY_NAME __FWCORE_GENERATE_TYPED_NUMBERED_TUPLE(_args_) \
+        {                                                                                                        \
+            return __FWCORE_TYPEDEF_SHARED_PTR_NAME (_factory_ __FWCORE_GENERATE_NUMBERED_TUPLE(_args_)) ;       \
+        }
+
+
+#define __FWCORE_GENERATE_ONE_FACTORY(_r_, _data_, _args_)             \
+     __FWCORE_GENERATE_FACTORY( BOOST_PP_SEQ_ELEM(0,_data_), _args_) ;
+
+
+#define __FWCORE_GENERATE_FACTORIES( _factory_, _args_ )                      \
+    BOOST_PP_SEQ_FOR_EACH(__FWCORE_GENERATE_ONE_FACTORY, (_factory_), _args_)
+
+
+#define __FWCORE_GENERATE_ONE_FACTORY_WITH_N_FACTORIES(_r_, _data_, _factory_args_)                                \
+    __FWCORE_GENERATE_FACTORY( BOOST_PP_TUPLE_ELEM(2,0,_factory_args_), BOOST_PP_TUPLE_ELEM(2,1,_factory_args_)) ;
+
+
+#define __FWCORE_GENERATE_FACTORIES_WITH_N_FACTORIES_I( _factories_args_ )                                    \
+    BOOST_PP_SEQ_FOR_EACH(__FWCORE_GENERATE_ONE_FACTORY_WITH_N_FACTORIES, (BOOST_PP_EMPTY), _factories_args_)
+
+
+#define __FWCORE_GENERATE_FACTORIES_WITH_ONE_FACTORY( _factory_, _args_ ) \
+    __FWCORE_GENERATE_FACTORIES( _factory_, _args_ )
+
+
+#define __FWCORE_GENERATE_FACTORIES_WITH_N_FACTORIES( _factories_args_ ) \
+    __FWCORE_GENERATE_FACTORIES_WITH_N_FACTORIES_I( _factories_args_ )
+
+
+/*
+ * __FWCORE_GET_CLASSNAME and __FWCORE_GET_SUPERCLASSNAME work with a sequence like "(classname)(baseclassname)" or "(classname)"
+ * and return respectively 1st and 2nd element
+ *
+ * if the sequence containt only 1 element, __FWCORE_GET_SUPERCLASSNAME returns the 1st
+ */
+#define __FWCORE_GET_CLASSNAME( _seq_ ) BOOST_PP_SEQ_ELEM(0, _seq_)
+#define __FWCORE_GET_SUPERCLASSNAME( _seq_ ) BOOST_PP_SEQ_ELEM( BOOST_PP_IF( BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(_seq_), 2 ), 1, 0), _seq_)
+
+
+/*
+ * __FWCORE_CLASS_TYPEDEFS define several typdefs for classes (sptr, wptr, ...)
+ *
+ * BaseClass is a typedef to the superclass
+ * RootClass is a typedef to the toplevel base class
+ */
+#define __FWCORE_CLASS_TYPEDEFS(_classinfo_)                                                               \
+    /** Self type  */                                                                                      \
+    typedef __FWCORE_GET_CLASSNAME(_classinfo_) __FWCORE_TYPEDEF_SELF_NAME;                                \
+    /** Type of base class  */                                                                             \
+    typedef  BOOST_PP_IF( BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(_classinfo_), 2 ),                             \
+                                        __FWCORE_GET_SUPERCLASSNAME(_classinfo_),                          \
+                                        __FWCORE_TYPEDEF_SELF_NAME                                         \
+                                        ) __FWCORE_TYPEDEF_SUPERCLASS_NAME ;                               \
+                                                                                                           \
+    typedef  BOOST_PP_IF( BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(_classinfo_), 2 ),                             \
+                                        __FWCORE_TYPEDEF_SUPERCLASS_NAME::__FWCORE_TYPEDEF_ROOTCLASS_NAME, \
+                                        __FWCORE_TYPEDEF_SELF_NAME                                         \
+                                        ) __FWCORE_TYPEDEF_ROOTCLASS_NAME ;                                \
+    /** Shared pointer type  */                                                                            \
+    typedef SPTR ( __FWCORE_TYPEDEF_SELF_NAME ) __FWCORE_TYPEDEF_SHARED_PTR_NAME;                          \
+    /** Weak pointer type  */                                                                              \
+    typedef WPTR ( __FWCORE_TYPEDEF_SELF_NAME ) __FWCORE_TYPEDEF_WEAK_PTR_NAME;                            \
+    /** Const shared pointer type  */                                                                      \
+    typedef CSPTR( __FWCORE_TYPEDEF_SELF_NAME ) __FWCORE_TYPEDEF_SHARED_PTR_CONST_NAME;                    \
+    /** Const weak pointer type  */                                                                        \
+    typedef CWPTR( __FWCORE_TYPEDEF_SELF_NAME ) __FWCORE_TYPEDEF_WEAK_PTR_CONST_NAME
+
+/*
+ * Cast definition for casting from baseclassname and derived to _classname_
+ */
+#define __FWCORE_GENERATE_CAST(_classname_, _baseclassname_)                                                                             \
+    /** @brief Cast to dynamic shared pointer   */                                                                                       \
+    template< class BASETYPE > static __FWCORE_TYPEDEF_SHARED_PTR_NAME __FWCORE_DYNAMIC_CAST_FUNC_NAME ( BASETYPE const &p )             \
+    {                                                                                                                                    \
+        return ::boost::dynamic_pointer_cast< _classname_ >(p);                                                                          \
+    };                                                                                                                                   \
+    /** @brief Const shared pointer cast to dynamic pointer */                                                                           \
+    template< class BASETYPE > static __FWCORE_TYPEDEF_SHARED_PTR_CONST_NAME __FWCORE_DYNAMIC_CONST_CAST_FUNC_NAME ( BASETYPE const &p ) \
+    {                                                                                                                                    \
+        return ::boost::dynamic_pointer_cast< const _classname_ >(p);                                                                    \
+    };                                                                                                                                   \
+    /** @brief Cast to const shared pointer */                                                                                           \
+    static __FWCORE_TYPEDEF_SHARED_PTR_NAME __FWCORE_CONST_CAST_FUNC_NAME ( __FWCORE_TYPEDEF_SHARED_PTR_CONST_NAME const &p )            \
+    {                                                                                                                                    \
+        return ::boost::const_pointer_cast< _classname_ >(p);                                                                            \
+    }
+
+
+#define __FWCORE_PREDECLARE(_s_, _state_, _elem_) \
+     BOOST_PP_IF(                                 \
+                BOOST_PP_EQUAL( _s_, 2 ),         \
+                class _elem_; ,                   \
+                namespace _elem_ { _state_ }      \
+               )
+
+// @endcond
+
+/**
+ * @name Class declaration helpers
+ * @{ */
+
+/**
+ * @brief Generate getSptr and getConstSptr methods
+ *
+ * These methods use 'shared_from_this' to get a shared pointer and cast it to
+ * required type
+ *
+ */
+#define fwCoreAllowSharedFromThis()                                                                   \
+    /** @brief return a casted const shared ptr from this object */                                   \
+    __FWCORE_TYPEDEF_SHARED_PTR_CONST_NAME __FWCORE_CONST_SPTR_FROM_THIS_FUNC_NAME() const {          \
+        return __FWCORE_DYNAMIC_CONST_CAST_FUNC_NAME(this->::fwCore::BaseObject::shared_from_this()); \
+    }                                                                                                 \
+    /** @brief return a casted shared ptr from this object */                                         \
+    __FWCORE_TYPEDEF_SHARED_PTR_NAME __FWCORE_SPTR_FROM_THIS_FUNC_NAME(){                             \
+        return __FWCORE_DYNAMIC_CAST_FUNC_NAME(this->::fwCore::BaseObject::shared_from_this());       \
+    }
+
+/**
+ * @brief Generate predeclarations
+ *
+ * @param \_cls_ Class to predeclare, in the form (some)(namespace)(class)
+ *
+ *   Example :
+ *   fwCorePredeclare( (fwData)(Image) ) expands to :
+ *   namespace fwData {
+ *     class Image;
+ *     }
+ *
+ */
+#define fwCorePredeclare( _cls_ )                                           \
+    BOOST_PP_SEQ_FOLD_RIGHT( __FWCORE_PREDECLARE, BOOST_PP_SEQ_NIL, _cls_)
+
+
+#define __FWCORE_STATIC_CACHE( _type_, value )        \
+    static const _type_ __cache__(value); return __cache__;
+
+/**
+ * @brief Generate virtual methods that return classname/namespace strings
+ *
+ * Example: for ::fwData::Object,
+ * - Classname is Object
+ * - FullClassname is ::fwData::Object
+ * - RootedClassname is ::fwData::Object
+ * - FullNamespace is ::fwData
+ * - RootedNamespace is ::fwData
+ *
+ */
+#define fwCoreClassnameMacro()                                                                   \
+    /** @name Demangling methods */                                                              \
+    /** @{ */                                                                                    \
+    /** @brief return object's classname given by ::fwCore::Demangler::getLeafClassname()  */    \
+    virtual const std::string& getLeafClassname()   const                                        \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::Demangler(*this).getLeafClassname());};      \
+    static  const std::string& leafClassname()                                                   \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getLeafClassname<SelfType>());};             \
+    /** @brief return object's classname given by ::fwCore::Demangler::getClassname()  */        \
+    virtual const std::string& getClassname() const                                              \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getClassname<SelfType>());};          \
+    static  const std::string& classname()                                                       \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getClassname<SelfType>());};                 \
+    /** @brief return object's classname given by ::fwCore::Demangler::getFullClassname()  */    \
+    virtual const std::string& getFullClassname()   const                                        \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::Demangler(*this).getFullClassname());};      \
+    static  const std::string& fullClassname()                                                   \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getFullClassname<SelfType>());};             \
+    /** @brief return object's classname given by ::fwCore::Demangler::getRootedClassname()  */  \
+    virtual const std::string& getRootedClassname() const                                        \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::Demangler(*this).getRootedClassname());};    \
+    static  const std::string& rootedClassname()                                                 \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getRootedClassname<SelfType>());};           \
+                                                                                                 \
+    /** @brief return object's namespace given by ::fwCore::Demangler::getFullClassname()  */    \
+    virtual const std::string& getFullNamespace()   const                                        \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::Demangler(*this).getFullClassname());};      \
+    static  const std::string& fullNamespace()                                                   \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getFullClassname<SelfType>());};             \
+    /** @brief return object's namespace given by ::fwCore::Demangler::getRootedNamespace()  */  \
+    virtual const std::string& getRootedNamespace() const                                        \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::Demangler(*this).getRootedClassname());}     \
+    static  const std::string& rootedNamespace()                                                 \
+    { __FWCORE_STATIC_CACHE(std::string,  ::fwCore::getRootedClassname<SelfType>());}            \
+    /** @} */
+
+/**
+ * @brief Generate virtual methods that check if passed type is same type of
+ * (or a topclass of) 'this' type
+ *
+ * Example:
+ * ::fwData::Image::IsTypeOf("::fwData::Object") is true
+ * image->isA("::fwData::Object") is true
+ *
+ */
+#define fwCoreIsTypeOfMacro(_classinfo_)                                                                                                   \
+    static bool isTypeOf(const std::string &type)                                                                                           \
+    {                                                                                                                                      \
+        if (__FWCORE_TYPEDEF_SELF_NAME::classname()==type)                                                                                 \
+        {                                                                                                                                  \
+            return true;                                                                                                                   \
+        }                                                                                                                                  \
+        return BOOST_PP_IF( BOOST_PP_EQUAL( BOOST_PP_SEQ_SIZE(_classinfo_), 2 ), __FWCORE_TYPEDEF_SUPERCLASS_NAME::isTypeOf(type), false); \
+    }                                                                                                                                      \
+    virtual bool isA(const std::string &type) const                                                                                         \
+    {                                                                                                                                      \
+        return this->__FWCORE_TYPEDEF_SELF_NAME::isTypeOf(type);                                                                           \
+    }
+
+namespace fwTools
+{
+template<class, class, class>
+class ClassFactory;
+class Factory;
+}
+
+namespace boost{
+namespace serialization{
+class access;
+}}
+
+namespace boost{
+namespace python{
+namespace objects {
+template <class, class>
+struct pointer_holder;
+}}}
+
+/**
+ * @brief Generate common code for friend class Factory
+ */
+#define fwCoreFriendClassFactoryMacro()                                      \
+    friend class ::boost::serialization::access;                             \
+    template<class, class>                                                   \
+    friend struct ::boost::python::objects::pointer_holder;                  \
+    template<typename _FWCORE_CHECKED_DELETE_T_ >                            \
+    friend void ::boost::checked_delete(_FWCORE_CHECKED_DELETE_T_ *x);       \
+    template<class, class, class>                                            \
+    friend class ::fwTools::ClassFactory;                                    \
+    friend class ::fwTools::Factory;
+
+/**
+ * @brief Generate common construction methods for classes with one factory
+ *
+ * For this macro parameters, each bracket is significant.
+ * @param \_classinfo_ Class information in the form : (classname)(baseclassname) or (classname).
+ *                  baseclassname is only required for a non-base class, and should not
+ *                  be used if baseclassname == classname
+ *
+ * @param \_parameters_ ( types_param_factory0 ) (...) ( types_param_factoryN )
+ *                      - where types_param_factoryX can be :
+ *                        - for a 0-arg factory : ()
+ *                        - for a 1-arg of T type factory : ((T)) or ((T)(d))
+ *                          where d is a default value
+ *                        - for a N-parameters factory : ((type0)) ((type1)) ... ((typeN)(default_value))
+ *                      - Several types_param_factory can be declared if a factory have several signatures
+ *                        - Example for several signatures : () ( ((int)) ) ( ((int)) ((std::string)("default")) )
+ *
+ * @param \_factory_ A factory that can take arguments as defined in _parameters_ arguments
+ */
+#define fwCoreClassDefinitionsWithFactoryMacro(_classinfo_, _parameters_, _factory_)                     \
+    __FWCORE_CLASS_TYPEDEFS(_classinfo_);                                                                \
+    friend class __FWCORE_SHARED_PTR_FACTORY_CLASSNAME;                                                  \
+    /* @cond */                                                                                          \
+    class __FWCORE_SHARED_PTR_FACTORY_CLASSNAME: public __FWCORE_TYPEDEF_SHARED_PTR_NAME                 \
+    {                                                                                                    \
+        public:                                                                                          \
+          __FWCORE_GENERATE_CONSTRUCTORS (__FWCORE_GET_CLASSNAME(_classinfo_), _factory_, _parameters_); \
+    };                                                                                                   \
+    /* @endcond */                                                                                       \
+    /** Specialized version of shared_ptr (alias to shared_ptr< __FWCORE_GET_CLASSNAME(_classinfo_) > )  \
+     * with embeded factory for __FWCORE_GET_CLASSNAME(_classinfo_). */                                  \
+    typedef  __FWCORE_SHARED_PTR_FACTORY_CLASSNAME __FWCORE_TYPEDEF_SHARED_PTR_FACTORY_NAME;             \
+    /* @cond */                                                                                          \
+    /* @endcond */                                                                                       \
+    __FWCORE_GENERATE_FACTORIES_WITH_ONE_FACTORY (_factory_, _parameters_);                              \
+    __FWCORE_GENERATE_CAST(__FWCORE_GET_CLASSNAME(_classinfo_), __FWCORE_TYPEDEF_ROOTCLASS_NAME);        \
+    fwCoreFriendClassFactoryMacro()                                                                      \
+    fwCoreClassnameMacro()                                                                               \
+    fwCoreIsTypeOfMacro(_classinfo_)
+
+
+/**
+ * @brief Generate common construction methods for classes with several factories
+ *
+ * For this macro parameters, each bracket is significant.
+ * @param \_classinfo_ Class information in the form : (classname)(baseclassname) or (classname).
+ *                  baseclassname is only required for a non-base class, and should not
+ *                  be used if baseclassname == classname
+ *
+ * @param \_factories_args_ ((factory0, types_param_factory0)) ((factory1, types_param_factory1) ... ((factoryN, types_param_factoryN))
+ *                          - where types_param_factoryX can be :
+ *                            - for a 0-arg factory : ()
+ *                            - for a 1-arg of T type factory : ((T)) or ((T)(d))
+ *                              where d is a default value
+ *                            - for a N-parameters factory : ((type0)) ((type1)) ... ((typeN)(default_value))
+ *
+ */
+#define fwCoreClassDefinitionsWithNFactoriesMacro(_classinfo_, _factories_args_)                                    \
+    __FWCORE_CLASS_TYPEDEFS(_classinfo_);                                                                           \
+    friend class __FWCORE_SHARED_PTR_FACTORY_CLASSNAME;                                                             \
+    /* @cond */                                                                                                     \
+    class __FWCORE_SHARED_PTR_FACTORY_CLASSNAME: public __FWCORE_TYPEDEF_SHARED_PTR_NAME                            \
+    {                                                                                                               \
+        public:                                                                                                     \
+          __FWCORE_GENERATE_CONSTRUCTORS_WITH_N_FACTORIES (__FWCORE_GET_CLASSNAME(_classinfo_), _factories_args_);  \
+    } ;                                                                                                             \
+    /* @endcond */                                                                                                  \
+    /** Specialized version of shared_ptr (alias to shared_ptr< __FWCORE_GET_CLASSNAME(_classinfo_) > )             \
+     * with embeded factory for __FWCORE_GET_CLASSNAME(_classinfo_). */                                             \
+    typedef __FWCORE_SHARED_PTR_FACTORY_CLASSNAME __FWCORE_TYPEDEF_SHARED_PTR_FACTORY_NAME;                         \
+    /* @cond */                                                                                                     \
+                                                                                                                    \
+    __FWCORE_GENERATE_FACTORIES_WITH_N_FACTORIES (_factories_args_);                                                \
+    /* @endcond */                                                                                                  \
+    __FWCORE_GENERATE_CAST(__FWCORE_GET_CLASSNAME(_classinfo_),__FWCORE_TYPEDEF_ROOTCLASS_NAME);                    \
+    fwCoreFriendClassFactoryMacro()                                                                                 \
+    fwCoreClassnameMacro()                                                                                          \
+    fwCoreIsTypeOfMacro(_classinfo_)
+
+
+
+/**
+ * @brief Generate common code for services classes
+ *
+ * @param \_classinfo_ Class information in the form : (classname)(baseclassname) or (classname).
+ *                  baseclassname is only required for a non-base class, and should not
+ *                  be used if baseclassname == classname
+ */
+#define fwCoreServiceClassDefinitionsMacro(_classinfo_)                                           \
+    __FWCORE_CLASS_TYPEDEFS(_classinfo_);                                                         \
+    __FWCORE_GENERATE_CAST(__FWCORE_GET_CLASSNAME(_classinfo_), __FWCORE_TYPEDEF_ROOTCLASS_NAME); \
+    fwCoreFriendClassFactoryMacro()                                                               \
+    fwCoreClassnameMacro()                                                                        \
+    fwCoreIsTypeOfMacro(_classinfo_)
+
+
+
+
+
+/**
+ * @brief Generate common code for Non Instanciable classes (Interfaces, Abstract classes, ...)
+ *
+
+ * @param \_classinfo_ Class information in the form : (classname)(baseclassname) or (classname).
+ *                  baseclassname is only required for a non-base class, and should not
+ *                  be used if baseclassname == classname
+ */
+#define fwCoreNonInstanciableClassDefinitionsMacro(_classinfo_)                                   \
+    __FWCORE_CLASS_TYPEDEFS(_classinfo_);                                                         \
+    __FWCORE_GENERATE_CAST(__FWCORE_GET_CLASSNAME(_classinfo_), __FWCORE_TYPEDEF_ROOTCLASS_NAME); \
+    fwCoreClassnameMacro()                                                                        \
+    fwCoreIsTypeOfMacro(_classinfo_)
+
+
+
+
+/**  @} */
+#endif // __FWCORE_MACROS_HPP__
+
diff --git a/SrcLib/core/fwCore/include/fwCore/mt/Namespace.hpp b/SrcLib/core/fwCore/include/fwCore/mt/Namespace.hpp
new file mode 100644
index 0000000..bb21bc6
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/mt/Namespace.hpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_MT_NAMESPACE_HPP__
+#define __FWCORE_MT_NAMESPACE_HPP__
+
+namespace fwCore
+{
+/**
+ * @brief       This namespace fwCore::mt provides common foundations for multithread in FW4SPL.
+ * @namespace   fwCore::mt
+ * 
+ * @date        2012.
+ */
+namespace mt
+{
+}
+
+}
+#endif /* __FWCORE_MT_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/mt/types.hpp b/SrcLib/core/fwCore/include/fwCore/mt/types.hpp
new file mode 100644
index 0000000..bb43f28
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/mt/types.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_MT_TYPES_HPP__
+#define __FWCORE_MT_TYPES_HPP__
+
+#include <boost/thread/locks.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/shared_mutex.hpp>
+#include <boost/thread/recursive_mutex.hpp>
+
+namespace fwCore
+{
+namespace mt
+{
+
+typedef ::boost::mutex Mutex;
+typedef ::boost::unique_lock< Mutex > ScopedLock;
+
+typedef ::boost::recursive_mutex RecursiveMutex;
+typedef ::boost::unique_lock< RecursiveMutex > RecursiveScopedLock;
+
+/// Defines a single writer, multiple readers mutex.
+typedef ::boost::shared_mutex ReadWriteMutex;
+/**
+ * @brief Defines a lock of read type for read/write mutex.
+ * @note Multiple read lock can be done.
+ */
+typedef ::boost::shared_lock< ReadWriteMutex > ReadLock;
+/**
+ * @brief Defines a lock of write type for read/write mutex.
+ * @note Only one write lock can be done at once.
+ */
+typedef ::boost::unique_lock< ReadWriteMutex > WriteLock;
+/**
+ * @brief Defines an upgradable lock type for read/write mutex.
+ * @note Only one upgradable lock can be done at once but there may be multiple read lock.
+ */
+typedef ::boost::upgrade_lock< ReadWriteMutex > ReadToWriteLock;
+/**
+ * @brief Defines a write lock upgraded from ReadToWriteLock.
+ * @note Only one upgradable lock can be done at once but there may be multiple read lock.
+ */
+typedef ::boost::upgrade_to_unique_lock< ReadWriteMutex > UpgradeToWriteLock;
+
+} //namespace mt
+} //namespace fwCore
+
+#endif /* __FWCORE_MT_TYPES_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/spyLog.hpp b/SrcLib/core/fwCore/include/fwCore/spyLog.hpp
new file mode 100644
index 0000000..671f557
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/spyLog.hpp
@@ -0,0 +1,366 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file spyLog.hpp
+ * @brief This file defines SpyLog macros.
+ * These macros are used to log messages to a file or to the console during
+ * application execution.
+ *
+ * Six log levels are defined :
+ * -# Fatal
+ * -# Error
+ * -# Warning
+ * -# Info
+ * -# Debug
+ * -# Trace
+ *
+ * Log level is set by defining SPYLOG_LEVEL to N where 0 < N <= 6. If log
+ * level is set to N, every log level lesser than N will be enabled, the other
+ * macro will be define but won't have any effect.
+ *
+ * Each log level macro has two variant : SLM_<level> and OSLM_<level>.
+ * - SLM_ variant is a simple log message macros, append a loglevel-tagged
+ *   log message to the logger.
+ *   - Example : SLM_FATAL( "This should not append" );
+ * - OSLM_ variant is a stringstream log message macros, it is the same as
+ *   "Simple log message macros", but accept a stream as argument.
+ *   - Example : OSLM_INFO( "Count : " << i );
+ *
+ * FATAL macros have a particular behavior : the application is aborted after
+ * the message was logged.
+ *
+ * 
+ */
+
+#ifndef _FWCORE_SPYLOG_HPP_
+# define _FWCORE_SPYLOG_HPP_
+
+# define SPYLOG_ABORT() std::abort()
+
+# ifdef _DEBUG
+
+#  ifdef WIN32
+#   include <windows.h>
+#   define DEBUG_BREAK() DebugBreak()
+#  else
+#   include <csignal>
+#   define DEBUG_BREAK() std::raise(SIGTRAP)
+#  endif
+
+#  ifdef SPYLOG_ABORT
+#   undef SPYLOG_ABORT
+#  endif
+#  define SPYLOG_ABORT() DEBUG_BREAK()
+
+# endif
+
+# include <cassert>
+# include <sstream>
+
+# include "fwCore/log/SpyLogger.hpp"
+# include "fwCore/log/ScopedMessage.hpp"
+
+// -----------------------------------------------------------------------------
+
+/**
+ * @cond
+ */
+# ifndef SPYLOG_LEVEL
+#  define SPYLOG_LEVEL 3
+# endif
+
+// -----------------------------------------------------------------------------
+
+# ifndef __FWCORE_EXPR_BLOCK
+#  define __FWCORE_EXPR_BLOCK(expr) do { expr } while (0)
+# endif
+
+# define __FWCORE_IF(cond, code) if ( cond ) { code }
+
+# define OSL_LOG(log, loglevel, message) __FWCORE_EXPR_BLOCK(   \
+        std::stringstream oslStr;                               \
+        oslStr << message;                                      \
+        SL_##loglevel(log, oslStr.str());                       \
+        )
+
+// -----------------------------------------------------------------------------
+
+#if (SPYLOG_LEVEL < 6)
+# define __FWCORE_TRACE_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_TRACE_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+#if (SPYLOG_LEVEL < 5)
+# define __FWCORE_DEBUG_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_DEBUG_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+#if (SPYLOG_LEVEL < 4)
+# define __FWCORE_INFO_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_INFO_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+#if (SPYLOG_LEVEL < 3)
+# define __FWCORE_WARN_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_WARN_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+#if (SPYLOG_LEVEL < 2)
+# define __FWCORE_ERROR_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_ERROR_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+#if (SPYLOG_LEVEL < 1)
+# define __FWCORE_FATAL_IF_ENABLED(expr) if (0) __FWCORE_EXPR_BLOCK(expr)
+#else
+# define __FWCORE_FATAL_IF_ENABLED(expr) __FWCORE_EXPR_BLOCK(expr)
+#endif
+
+// -----------------------------------------------------------------------------
+
+
+#  define SL_TRACE(log, message) __FWCORE_TRACE_IF_ENABLED(     \
+        log.trace(message, __FILE__, __LINE__);                 \
+        )
+#  define OSL_TRACE(log, message) __FWCORE_TRACE_IF_ENABLED(    \
+        OSL_LOG(log, TRACE, message);                           \
+        )
+#  define SL_TRACE_IF(log, message, cond) __FWCORE_TRACE_IF_ENABLED(    \
+        __FWCORE_IF(cond, log.trace(message, __FILE__, __LINE__);)      \
+        )
+#  define OSL_TRACE_IF(log, message, cond) __FWCORE_TRACE_IF_ENABLED(   \
+        __FWCORE_IF(cond, OSL_LOG(log, TRACE, message);)                \
+        )
+
+
+#  define SL_DEBUG(log, message) __FWCORE_DEBUG_IF_ENABLED(     \
+        log.debug(message, __FILE__, __LINE__);                 \
+        )
+#  define OSL_DEBUG(log, message) __FWCORE_DEBUG_IF_ENABLED(    \
+        OSL_LOG(log, DEBUG, message);                           \
+        )
+#  define SL_DEBUG_IF(log, message, cond) __FWCORE_DEBUG_IF_ENABLED(  \
+      __FWCORE_IF(cond, log.trace(message, __FILE__, __LINE__);)      \
+      )
+#define OSL_DEBUG_IF(log, message, cond) __FWCORE_DEBUG_IF_ENABLED(   \
+      __FWCORE_IF(cond, OSL_LOG(log, DEBUG, message);)                \
+      )
+
+
+#define SL_INFO(log, message) __FWCORE_INFO_IF_ENABLED(       \
+      log.info(message, __FILE__, __LINE__);                  \
+      )
+#define OSL_INFO(log, message) __FWCORE_INFO_IF_ENABLED(      \
+      OSL_LOG(log, INFO, message);                            \
+      )
+#define SL_INFO_IF(log, message, cond) __FWCORE_INFO_IF_ENABLED(      \
+      __FWCORE_IF(cond, log.trace(message, __FILE__, __LINE__);)      \
+      )
+#define OSL_INFO_IF(log, message, cond) __FWCORE_INFO_IF_ENABLED(     \
+      __FWCORE_IF(cond, OSL_LOG(log, INFO, message);)                 \
+      )
+
+
+#define SL_WARN(log, message) __FWCORE_WARN_IF_ENABLED(       \
+      log.warn(message, __FILE__, __LINE__);                  \
+      )
+#define OSL_WARN(log, message) __FWCORE_WARN_IF_ENABLED(      \
+      OSL_LOG(log, WARN, message);                            \
+      )
+#define SL_WARN_IF(log, message, cond) __FWCORE_WARN_IF_ENABLED(      \
+      __FWCORE_IF(cond, log.trace(message, __FILE__, __LINE__);)      \
+      )
+#define OSL_WARN_IF(log, message, cond) __FWCORE_WARN_IF_ENABLED(     \
+      __FWCORE_IF(cond, OSL_LOG(log, WARN, message);)                 \
+      )
+
+
+#define SL_ERROR(log, message) __FWCORE_ERROR_IF_ENABLED(     \
+      log.error(message, __FILE__, __LINE__);                 \
+      )
+#define OSL_ERROR(log, message) __FWCORE_ERROR_IF_ENABLED(    \
+      OSL_LOG(log, ERROR, message);                           \
+      )
+#define SL_ERROR_IF(log, message, cond) __FWCORE_ERROR_IF_ENABLED(    \
+      __FWCORE_IF(cond, log.trace(message, __FILE__, __LINE__);)      \
+      )
+#define OSL_ERROR_IF(log, message, cond) __FWCORE_ERROR_IF_ENABLED(   \
+        __FWCORE_IF(cond, OSL_LOG(log, ERROR, message);)              \
+        )
+
+
+#define SL_FATAL(log, message) __FWCORE_FATAL_IF_ENABLED(     \
+      log.fatal(message, __FILE__, __LINE__);                 \
+      SPYLOG_ABORT();                                         \
+      )
+#define OSL_FATAL(log, message) __FWCORE_FATAL_IF_ENABLED(    \
+      OSL_LOG(log, FATAL, message);                           \
+      SPYLOG_ABORT();                                         \
+      )
+#define SL_FATAL_IF(log, message, cond) __FWCORE_FATAL_IF_ENABLED(    \
+      __FWCORE_IF(cond, SL_FATAL(log, message);)                      \
+      )
+#define OSL_FATAL_IF(log, message, cond) __FWCORE_FATAL_IF_ENABLED(   \
+        __FWCORE_IF(cond, OSL_FATAL(log, message);)                   \
+        )
+
+// -----------------------------------------------------------------------------
+
+# ifdef _DEBUG
+#  define SL_ASSERT(log, message, cond) __FWCORE_EXPR_BLOCK(            \
+        __FWCORE_IF(!(cond),                                            \
+                    std::stringstream oslStr1;                          \
+                    oslStr1 << "Assertion '" <<                         \
+                    #cond << "' failed: " << message;                   \
+                    log.fatal(oslStr1.str(), __FILE__, __LINE__);       \
+                    SPYLOG_ABORT();                                     \
+            ))
+
+#  define OSL_ASSERT(log, message, cond) __FWCORE_EXPR_BLOCK(   \
+        __FWCORE_IF(!(cond),                                    \
+                    std::stringstream oslStr;                   \
+                    oslStr << message;                          \
+                    SL_ASSERT(log, oslStr.str(), cond);         \
+            ))
+# else
+#  define SL_ASSERT(log, message, cond) // empty
+#  define OSL_ASSERT(log, message, cond) // empty
+# endif
+
+// -----------------------------------------------------------------------------
+
+#  define _SPYLOG_SPYLOGGER_            \
+    ::fwCore::log::SpyLogger::getSpyLogger()
+
+// -----------------------------------------------------------------------------
+
+/**
+ * @endcond
+ */
+
+/** @{ */
+/** Trace message macros.  */
+# define SLM_TRACE(message) SL_TRACE(_SPYLOG_SPYLOGGER_, message)
+/** Trace stringstream message macros.  */
+# define OSLM_TRACE(message) OSL_TRACE(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal trace message macros.  */
+# define SLM_TRACE_IF(message, cond) SL_TRACE_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal trace stringstream message macros.  */
+# define OSLM_TRACE_IF(message, cond) OSL_TRACE_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Debug message macros.  */
+# define SLM_DEBUG(message) SL_DEBUG(_SPYLOG_SPYLOGGER_, message)
+/** Debug stringstream message macros.  */
+# define OSLM_DEBUG(message) OSL_DEBUG(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal debug message macros.  */
+# define SLM_DEBUG_IF(message, cond) SL_DEBUG_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal debug stringstream message macros.  */
+# define OSLM_DEBUG_IF(message, cond) OSL_DEBUG_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Info message macros.  */
+# define SLM_INFO(message) SL_INFO(_SPYLOG_SPYLOGGER_, message)
+/** Info stringstream message macros.  */
+# define OSLM_INFO(message) OSL_INFO(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal info message macros.  */
+# define SLM_INFO_IF(message, cond) SL_INFO_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal info stringstream message macros.  */
+# define OSLM_INFO_IF(message, cond) OSL_INFO_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Warning message macros.  */
+# define SLM_WARN(message) SL_WARN(_SPYLOG_SPYLOGGER_, message)
+/** Warning stringstream message macros.  */
+# define OSLM_WARN(message) OSL_WARN(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal warning message macros.  */
+# define SLM_WARN_IF(message, cond) SL_WARN_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal warning stringstream message macros.  */
+# define OSLM_WARN_IF(message, cond) OSL_WARN_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Error message macros.  */
+# define SLM_ERROR(message) SL_ERROR(_SPYLOG_SPYLOGGER_, message)
+/** Error stringstream message macros.  */
+# define OSLM_ERROR(message) OSL_ERROR(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal error message macros.  */
+# define SLM_ERROR_IF(message, cond) SL_ERROR_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal error stringstream message macros.  */
+# define OSLM_ERROR_IF(message, cond) OSL_ERROR_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Fatal message macros.  */
+# define SLM_FATAL(message) SL_FATAL(_SPYLOG_SPYLOGGER_, message)
+/** Fatal stringstream message macros.  */
+# define OSLM_FATAL(message) OSL_FATAL(_SPYLOG_SPYLOGGER_, message)
+/** Conditionnal fatal message macros.  */
+# define SLM_FATAL_IF(message, cond) SL_FATAL_IF(_SPYLOG_SPYLOGGER_, message, cond)
+/** Conditionnal fatal stringstream message macros.  */
+# define OSLM_FATAL_IF(message, cond) OSL_FATAL_IF (_SPYLOG_SPYLOGGER_, message, cond)
+/**  @} */
+
+/** @{ */
+/** Log message macros.  */
+#define OSLM_LOG(message)                                          \
+         __FWCORE_EXPR_BLOCK(                                      \
+        std::stringstream stream;                                  \
+        stream << message;                                         \
+        _SPYLOG_SPYLOGGER_.log(stream.str(), __FILE__, __LINE__);  \
+        )
+/**  @} */
+
+/**
+ * @name Special macros
+ * @{ */
+
+/** @brief work like 'assert' from 'cassert', with in addition a message logged by
+ * spylog (with FATAL loglevel)  */
+# define SLM_ASSERT(message, cond)                      \
+    SL_ASSERT(_SPYLOG_SPYLOGGER_, message, cond)
+# define OSLM_ASSERT(message, cond)                     \
+    OSL_ASSERT(_SPYLOG_SPYLOGGER_, message, cond)
+
+// -----------------------------------------------------------------------------
+
+# ifdef __GNUC__                // with GCC
+#  define SLM_PRETTY_FUNC() __PRETTY_FUNCTION__
+# elif defined(_MSC_VER)        // with MSC
+#  define SLM_PRETTY_FUNC() __FUNCSIG__
+# else
+#  define SLM_PRETTY_FUNC() __func__
+# endif
+
+/**
+ * @brief Trace contextual function signature.
+ *
+ * Generate a log trace message with the (contextual) function signature.
+ */
+# ifndef SPYLOG_TIMER
+#  define SLM_TRACE_FUNC() SLM_TRACE(SLM_PRETTY_FUNC())
+# else
+
+# define SLM_TRACE_FUNC() __FWCORE_EXPR_BLOCK(                  \
+        ::fwCore::log::ScopedMessage __spylog__scoped__msg__(        \
+            __FILE__, __LINE__, SLM_PRETTY_FUNC());             \
+        __spylog__scoped__msg__.use();                          \
+        )
+
+# endif
+/**  @} */
+
+
+#endif  // _FWCORE_SPYLOG_HPP_
diff --git a/SrcLib/core/fwCore/include/fwCore/util/FactoryRegistry.hpp b/SrcLib/core/fwCore/include/fwCore/util/FactoryRegistry.hpp
new file mode 100644
index 0000000..8f6edb3
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/util/FactoryRegistry.hpp
@@ -0,0 +1,155 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UTIL_FACTORY_HPP__
+#define __FWCORE_UTIL_FACTORY_HPP__
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include <boost/bind.hpp>
+#include <boost/function.hpp>
+#include <boost/functional/factory.hpp>
+#include <boost/functional/value_factory.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "fwCore/mt/types.hpp"
+
+namespace fwCore
+{
+namespace util
+{
+
+/**
+ * @brief FactoryRegistryBase is a class used to store factories
+ * @note This class is thread safe.
+ */
+template < typename FACTORY_SIGNATURE, typename KEY_TYPE = std::string,
+         typename FACTORY_HOLDER = ::boost::function< FACTORY_SIGNATURE > >
+class FactoryRegistryBase
+{
+public:
+    typedef FACTORY_SIGNATURE FactorySignatureType;
+    typedef KEY_TYPE KeyType;
+
+    typedef FACTORY_HOLDER FactoryType;
+    typedef std::map< KeyType, FactoryType > RegistryType;
+    typedef std::vector<KeyType> KeyVectorType;
+
+    FactoryRegistryBase(){}
+
+    /**
+     * @brief Add a factory to the registry.
+     */
+    void addFactory(const KeyType& name, FactoryType factory)
+    {
+        // get exclusive access
+        ::fwCore::mt::WriteLock lock(m_mutex);
+        m_registry[name] = factory;
+    }
+
+    /**
+     * @brief returns the factory associated with the key.
+     */
+    virtual FactoryType getFactory(const KeyType& key) const
+    {
+        // get shared access
+        ::fwCore::mt::ReadLock lock(m_mutex);
+        typename RegistryType::const_iterator iter = m_registry.find(key);
+        FactoryType factory;
+        if(iter != m_registry.end())
+        {
+            factory = iter->second;
+        }
+        return factory;
+    }
+
+    /**
+     * @brief returns the registered factory keys.
+     */
+    virtual KeyVectorType getFactoryKeys() const
+    {
+        ::fwCore::mt::ReadLock lock(m_mutex);
+        KeyVectorType vectKeys;
+        std::transform( m_registry.begin(), m_registry.end(),
+                std::back_inserter(vectKeys),
+                ::boost::bind(& RegistryType::value_type::first,_1) );
+        return vectKeys;
+    }
+
+protected:
+
+    RegistryType m_registry;
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+
+/**
+ * @brief FactoryRegistry is a class used to store factories and create instance object with these factories.
+ */
+template <typename F, typename KEY_TYPE = std::string, typename FACTORY_HOLDER = ::boost::function< F > >
+class FactoryRegistry;
+
+template< typename RETURN_TYPE, typename KEY_TYPE, typename FACTORY_HOLDER >
+class FactoryRegistry< RETURN_TYPE (), KEY_TYPE, FACTORY_HOLDER > :
+        public FactoryRegistryBase < RETURN_TYPE (), KEY_TYPE >
+{
+    typedef RETURN_TYPE (FactorySignatureType)();
+    typedef FACTORY_HOLDER FactoryType;
+    typedef RETURN_TYPE ReturnType;
+    typedef KEY_TYPE KeyType;
+
+public:
+
+    /**
+     * @brief Instantiates an object with the factory associated with the specified key.
+     * @return Created instance.
+     */
+    ReturnType create(const KeyType& key) const
+    {
+        FactoryType factory = this->getFactory(key);
+
+        if(!factory)
+        {
+            ReturnType obj;
+            return obj;
+        }
+        return factory();
+    }
+};
+
+template< typename RETURN_TYPE, typename ARG1_TYPE, typename KEY_TYPE, typename FACTORY_HOLDER >
+class FactoryRegistry< RETURN_TYPE (ARG1_TYPE), KEY_TYPE, FACTORY_HOLDER > :
+            public FactoryRegistryBase < RETURN_TYPE (ARG1_TYPE), KEY_TYPE >
+{
+    typedef RETURN_TYPE (FactorySignatureType)(ARG1_TYPE);
+    typedef FACTORY_HOLDER FactoryType;
+    typedef RETURN_TYPE ReturnType;
+    typedef ARG1_TYPE Arg1Type;
+    typedef KEY_TYPE KeyType;
+
+public:
+
+    /**
+     * @brief Instantiates an object with the factory associated with the specified key, passing arg1 to the factory.
+     * @return Created instance.
+     */
+    ReturnType create(const KeyType& key, Arg1Type &arg1) const
+    {
+        FactoryType factory = this->getFactory(key);
+        ReturnType obj;
+        if(factory)
+        {
+            obj = factory(arg1);
+        }
+        return obj;
+    }
+};
+
+} //namespace util
+} //namespace fwCore
+
+#endif /* __FWCORE_UTIL_FACTORY_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/util/LazyInstantiator.hpp b/SrcLib/core/fwCore/include/fwCore/util/LazyInstantiator.hpp
new file mode 100644
index 0000000..ef73216
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/util/LazyInstantiator.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UTIL_LAZYINSTANTIATOR_HPP__
+#define __FWCORE_UTIL_LAZYINSTANTIATOR_HPP__
+
+#include <boost/make_shared.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/thread/once.hpp>
+#include <boost/noncopyable.hpp>
+
+#include "fwCore/macros.hpp"
+
+namespace fwCore
+{
+namespace util
+{
+
+struct LazyInstantiatorDefaultTag {} ;
+
+/**
+ * @brief A base class for lazy instantiation, constructed on first demand.
+ * @tparam INSTANCE_TYPE Type of object to instantiate.
+ * @tparam TAG Tag used to allow several LazyInstantiator for one INSTANCE_TYPE.
+ */
+template< typename INSTANCE_TYPE, typename TAG = LazyInstantiatorDefaultTag >
+class LazyInstantiator : ::boost::noncopyable
+{
+public:
+
+    typedef INSTANCE_TYPE InstanceType;
+    typedef TAG TagType;
+    typedef ::boost::shared_ptr<InstanceType> InstanceSptrType;
+
+    /// Returns the singleton instance. This method is thread safe.
+    static InstanceSptrType getInstance()
+    {
+        static ::boost::once_flag flag = BOOST_ONCE_INIT;
+        ::boost::call_once(&initInstance, flag);
+        return instance();
+    }
+
+protected:
+
+    /// Initializes the singleton instance
+    static void initInstance()
+    {
+        instance();
+    }
+
+    /// Initializes once and returns the instance (not thread-safe)
+    static InstanceSptrType instance()
+    {
+        static InstanceSptrType s_instance;
+        if(!s_instance)
+        {
+            s_instance = ::boost::make_shared< InstanceType >();
+        }
+        return s_instance;
+    }
+};
+
+} //namespace util
+} //namespace fwCore
+
+#endif /* __FWCORE_UTIL_LAZYINSTANTIATOR_HPP__ */
diff --git a/SrcLib/core/fwCore/include/fwCore/util/Namespace.hpp b/SrcLib/core/fwCore/include/fwCore/util/Namespace.hpp
new file mode 100644
index 0000000..06eaf4d
--- /dev/null
+++ b/SrcLib/core/fwCore/include/fwCore/util/Namespace.hpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UTIL_NAMESPACE_HPP__
+#define __FWCORE_UTIL_NAMESPACE_HPP__
+
+namespace fwCore
+{
+/**
+ * @brief       This namespace fwCore::util provides generic utilities for FW4SPL.
+ * @namespace   fwCore::util
+ * 
+ * @date        2012.
+ */
+namespace util
+{
+}
+
+}
+#endif /* __FWCORE_UTIL_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwCore/src/fwCore/Demangler.cpp b/SrcLib/core/fwCore/src/fwCore/Demangler.cpp
new file mode 100644
index 0000000..74c50b8
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/Demangler.cpp
@@ -0,0 +1,138 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <string>
+#include <vector>
+#include <typeinfo>
+
+#ifndef _WIN32
+#include <cxxabi.h>
+#include <cstdlib>
+#endif
+
+#include "fwCore/Demangler.hpp"
+
+
+namespace fwCore
+{
+
+#define COLONS std::string("::")
+#define LT std::string("<")
+
+
+Demangler::Demangler(const std::type_info &t) : m_name(t.name())
+{ }
+
+
+Demangler::Demangler(const std::string &s) : m_name(s)
+{ }
+
+
+Demangler::~Demangler()
+{ }
+
+
+std::string Demangler::getLeafClassname() const
+{
+    std::string demangled(this->demangle());
+
+    size_t lt_pos = demangled.find(LT);
+    size_t colons_pos = demangled.rfind(COLONS, lt_pos);
+
+    colons_pos = (colons_pos == std::string::npos)? 0 : colons_pos+COLONS.size();
+    return demangled.replace(0,colons_pos,"");
+}
+
+
+std::string Demangler::getClassname() const
+{
+    return getRootedClassname();
+}
+
+
+std::string Demangler::getFullClassname() const
+{
+    std::string demangled(this->demangle());
+    return demangled;
+}
+
+
+std::string Demangler::getRootedClassname() const
+{
+    std::string demangled(this->demangle());
+    return COLONS + demangled;
+}
+
+
+
+std::string Demangler::getFullNamespace() const
+{
+    std::string demangled(this->demangle());
+
+    size_t lt_pos = demangled.find(LT);
+    size_t colons_pos = demangled.rfind(COLONS, lt_pos);
+
+    if(colons_pos == std::string::npos)
+    {
+        return "";
+    }
+    return demangled.replace(colons_pos, std::string::npos,"");
+}
+
+
+std::string Demangler::getRootedNamespace() const
+{
+    return COLONS + getFullNamespace();
+}
+
+
+std::string Demangler::demangle(  ) const
+{
+    const char * mangled = m_name.c_str();
+#ifndef _WIN32
+    char * c_demangled = abi::__cxa_demangle( mangled, 0, 0, 0);
+    std::string res;
+    if (c_demangled)
+    {
+        res = c_demangled;
+        free(c_demangled);
+        return res;
+    }
+    else
+    {
+        res = mangled;
+    }
+    return res;
+#else
+   static std::vector<std::string> keywords;
+   typedef std::vector<std::string>::iterator keyword_iterator;
+   if ( keywords.empty() )
+   {
+      keywords.push_back("__cdecl");
+      keywords.push_back("class ");
+      keywords.push_back("enum ");
+      keywords.push_back("struct ");
+      keywords.push_back("union ");
+   }
+   std::string res(mangled);
+   for (keyword_iterator iter = keywords.begin(); iter != keywords.end(); ++iter )
+   {
+      while (res.find(*iter) != std::string::npos)
+         res = res.replace(res.find(*iter), iter->size(), "");
+      while (res.find(" *") != std::string::npos)
+         res = res.replace(res.find(" *"), 2, "*");
+      while (res.find(" &") != std::string::npos)
+         res = res.replace(res.find(" &"), 2, "&");
+   }
+   return res;
+#endif
+}
+
+#undef COLONS
+#undef LT
+
+} //namespace fwCore
diff --git a/SrcLib/core/fwCore/src/fwCore/Exception.cpp b/SrcLib/core/fwCore/src/fwCore/Exception.cpp
new file mode 100644
index 0000000..bf1b495
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/Exception.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwCore/Exception.hpp"
+
+
+
+namespace fwCore
+{
+
+Exception::Exception ( const std::string &err ) : std::runtime_error ( err )
+{
+}
+
+
+
+} //namespace fwCore
+
diff --git a/SrcLib/core/fwCore/src/fwCore/HiResClock.cpp b/SrcLib/core/fwCore/src/fwCore/HiResClock.cpp
new file mode 100644
index 0000000..d42c537
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/HiResClock.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwCore/HiResClock.hpp"
+
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <sys/time.h>
+#endif
+
+#include <cstdlib>
+
+
+namespace fwCore
+{
+
+namespace HiResClock
+{
+
+HiResClockType getTimeInMicroSec()
+{
+    HiResClockType TimeInMicroSec;
+
+#ifdef WIN32
+    LARGE_INTEGER count;
+    LARGE_INTEGER frequency;
+    QueryPerformanceFrequency(&frequency);
+    QueryPerformanceCounter(&count);
+
+    TimeInMicroSec = count.QuadPart * (1000000.0 / frequency.QuadPart);
+#else
+    timeval count;
+    gettimeofday(&count, NULL);
+
+    TimeInMicroSec = (count.tv_sec * 1000000.0) + count.tv_usec;
+#endif
+
+    return TimeInMicroSec;
+}
+
+HiResClockType getTimeInMilliSec()
+{
+    return getTimeInMicroSec() * 0.001;
+}
+
+
+HiResClockType getTimeInSec()
+{
+    return getTimeInMicroSec() * 0.000001;
+}
+
+} //namespace HiResClock
+
+} //namespace fwCore
diff --git a/SrcLib/core/fwCore/src/fwCore/HiResTimer.cpp b/SrcLib/core/fwCore/src/fwCore/HiResTimer.cpp
new file mode 100644
index 0000000..708f496
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/HiResTimer.cpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <stdlib.h>
+
+#include "fwCore/HiResTimer.hpp"
+
+namespace fwCore
+{
+
+HiResTimer::HiResTimer()
+{
+    m_stopped = true;
+    this->reset();
+}
+
+HiResTimer::~HiResTimer()
+{
+}
+
+void HiResTimer::start()
+{
+    m_stopped = false;
+
+    m_cumulTimeInMicroSec = m_endTimeInMicroSec - m_startTimeInMicroSec;
+    m_startTimeInMicroSec = ::fwCore::HiResClock::getTimeInMicroSec();
+}
+
+void HiResTimer::stop()
+{
+    m_stopped = true;
+
+    m_endTimeInMicroSec = ::fwCore::HiResClock::getTimeInMicroSec();
+}
+
+void HiResTimer::reset(::fwCore::HiResClock::HiResClockType initial_value){
+    bool wasStopped = m_stopped;
+    if (!wasStopped)
+    {
+        this->stop();
+    }
+    m_startTimeInMicroSec = 0.;
+    m_endTimeInMicroSec   = 0.;
+    m_cumulTimeInMicroSec = initial_value;
+    if (!wasStopped)
+    {
+        this->start();
+    }
+}
+
+::fwCore::HiResClock::HiResClockType HiResTimer::getElapsedTimeInMicroSec()
+{
+    if(!m_stopped)
+        m_endTimeInMicroSec = ::fwCore::HiResClock::getTimeInMicroSec();
+
+    return m_cumulTimeInMicroSec + (m_endTimeInMicroSec - m_startTimeInMicroSec);
+}
+
+
+::fwCore::HiResClock::HiResClockType HiResTimer::getElapsedTimeInMilliSec()
+{
+    return this->getElapsedTimeInMicroSec() * 0.001;
+}
+
+
+::fwCore::HiResClock::HiResClockType HiResTimer::getElapsedTimeInSec()
+{
+    return this->getElapsedTimeInMicroSec() * 0.000001;
+}
+
+
+} //namespace fwCore
+
diff --git a/SrcLib/core/fwCore/src/fwCore/LogicStamp.cpp b/SrcLib/core/fwCore/src/fwCore/LogicStamp.cpp
new file mode 100644
index 0000000..c11b53e
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/LogicStamp.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwCore/mt/types.hpp"
+#include "fwCore/LogicStamp.hpp"
+
+namespace fwCore
+{
+
+
+void LogicStamp::modified()
+{
+    static LogicStampType globalLogicStamp = 0;
+    static ::fwCore::mt::Mutex globalLogicStampMutex;
+
+    ::fwCore::mt::ScopedLock lock(globalLogicStampMutex);
+
+    m_modifiedLogicalTime = ++globalLogicStamp;
+
+    SLM_ASSERT("globalLogicStamp not instanced", globalLogicStamp); // detects overflow
+}
+
+
+} //namespace fwCore
diff --git a/SrcLib/core/fwCore/src/fwCore/TimeStamp.cpp b/SrcLib/core/fwCore/src/fwCore/TimeStamp.cpp
new file mode 100644
index 0000000..3534ae4
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/TimeStamp.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwCore/TimeStamp.hpp"
+
+namespace fwCore
+{
+
+
+void TimeStamp::modified()
+{
+    m_modifiedTime = ::fwCore::HiResClock::getTimeInMilliSec();
+}
+
+
+} //namespace fwCore
+
diff --git a/SrcLib/core/fwCore/src/fwCore/log/ScopedMessage.cpp b/SrcLib/core/fwCore/src/fwCore/log/ScopedMessage.cpp
new file mode 100644
index 0000000..54e22b4
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/log/ScopedMessage.cpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include "fwCore/log/SpyLogger.hpp"
+#include "fwCore/log/ScopedMessage.hpp"
+
+namespace fwCore
+{
+namespace log
+{
+
+// Msg Format :
+// [ENTERING SCOPE] "Timed{'file':m_file, 'line':m_line, 'entermessage':enterMessage}"
+// [LEAVING SCOPE] "Timed{'file':m_file, 'line':m_line, 'leavemessage':m_leave, 'elapsed':elapsedTime}"
+
+//-----------------------------------------------------------------------------
+
+ScopedMessage::ScopedMessage( const char * _file, int _line, std::string enterMessage, std::string leaveMessage)
+    : m_file(_file), m_line(_line), m_leave(leaveMessage.empty() ? enterMessage : leaveMessage)
+{
+    std::stringstream base;
+    base << "Timed{'file':'"<< m_file <<"','line':"<< m_line <<",";
+    m_baseMsg = base.str();
+
+    std::stringstream oslStr;
+    oslStr << "[ENTERING SCOPE] "<<  m_baseMsg << "'entermessage':'" <<  enterMessage << "'}";
+    ::fwCore::log::SpyLogger::getSpyLogger().trace(oslStr.str(), m_file, m_line);
+    m_timer.start();
+}
+
+//-----------------------------------------------------------------------------
+
+ScopedMessage::~ScopedMessage()
+{
+    std::stringstream oslStr;
+    oslStr << "[LEAVING SCOPE] "<<  m_baseMsg << "'leavemessage':'" << m_leave <<"','elapsed':"<<  m_timer.getElapsedTimeInMilliSec() << "}";
+    SpyLogger::getSpyLogger().trace(oslStr.str(), m_file, m_line);
+}
+
+} // namespace log
+} // namespace fwCore
+
diff --git a/SrcLib/core/fwCore/src/fwCore/log/SpyLogger.cpp b/SrcLib/core/fwCore/src/fwCore/log/SpyLogger.cpp
new file mode 100644
index 0000000..5a4ae3e
--- /dev/null
+++ b/SrcLib/core/fwCore/src/fwCore/log/SpyLogger.cpp
@@ -0,0 +1,189 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4996) // warning for sprintf() in Boost.log
+#endif // _MSC_VER
+
+#include <boost/log/core.hpp>
+#include <boost/log/attributes.hpp>
+#include <boost/log/sinks/sink.hpp>
+#include <boost/log/sources/global_logger_storage.hpp>
+#include <boost/log/sources/logger.hpp>
+#include <boost/log/sources/severity_logger.hpp>
+#include <boost/log/utility/setup/common_attributes.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/trivial.hpp>
+#include <boost/log/utility/setup/console.hpp>
+#include <boost/log/utility/setup/file.hpp>
+#include <boost/log/expressions/formatters/date_time.hpp>
+#include <boost/log/support/date_time.hpp>
+#include <boost/log/attributes/current_thread_id.hpp>
+#include <boost/log/attributes/current_process_id.hpp>
+#include <boost/log/attributes/timer.hpp>
+
+#include "fwCore/macros.hpp"
+#include "fwCore/log/SpyLogger.hpp"
+
+namespace fwCore
+{
+namespace log
+{
+
+SpyLogger SpyLogger::s_spyLogger;
+
+BOOST_LOG_GLOBAL_LOGGER(lg, ::boost::log::sources::severity_logger_mt< ::boost::log::trivial::severity_level >);
+BOOST_LOG_GLOBAL_LOGGER_DEFAULT(lg, ::boost::log::sources::severity_logger_mt< ::boost::log::trivial::severity_level >);
+
+//-----------------------------------------------------------------------------
+
+SpyLogger::SpyLogger()
+{
+    ::boost::log::add_common_attributes();
+    ::boost::log::core::get()
+        ->add_global_attribute("Uptime", ::boost::log::attributes::timer());
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::createBasicConfiguration()
+{
+#ifdef _WIN32
+    this->addFileAppender();
+#else
+    this->addStreamAppender();
+#endif
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::addStreamAppender( std::ostream &os, LevelType level )
+{
+    namespace expr = ::boost::log::expressions;
+    namespace keywords = ::boost::log::keywords;
+
+    typedef ::boost::posix_time::ptime::time_duration_type DurationType;
+
+    ::boost::log::add_console_log (
+            os,
+            keywords::format = (
+                    expr::stream << "["
+                    << expr::attr<unsigned int>("LineID")
+                    << "][" <<  expr::format_date_time< DurationType >("Uptime", "%H:%M:%S.%f")
+                    << "][" << expr::attr< ::boost::log::trivial::severity_level >("Severity")
+                    << "] " << expr::smessage
+            ),
+            keywords::filter = expr::attr< ::boost::log::trivial::severity_level >("Severity") >=
+                static_cast < ::boost::log::trivial::severity_level > (level),
+            // auto-flush feature of the backend
+            keywords::auto_flush = true
+    );
+}
+
+//-----------------------------------------------------------------------------
+
+// void SpyLogger::addSyslogAppender(const std::string & hostName, const std::string & facilityName)
+// {
+// }
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::addFileAppender(const std::string & logFile, LevelType level)
+{
+    namespace expr = ::boost::log::expressions;
+    namespace keywords = ::boost::log::keywords;
+
+    typedef ::boost::posix_time::ptime::time_duration_type DurationType;
+
+    ::boost::log::add_file_log (
+            // file name pattern
+            keywords::file_name = logFile,
+            // rotate files every 10 MiB...
+            keywords::rotation_size = 10 * 1024 * 1024,
+            // ...or at midnight
+            keywords::time_based_rotation = ::boost::log::sinks::file::rotation_at_time_point(0, 0, 0),
+            // log record format
+            keywords::format = (
+                    expr::stream
+                    << "[" << expr::format_date_time< ::boost::posix_time::ptime >("TimeStamp", "%d.%m.%Y %H:%M:%S.%f")
+                    << "][" << expr::format_date_time< DurationType >("Uptime", "%H:%M:%S.%f")
+                    << "][" << expr::attr< ::boost::log::attributes::current_process_id::value_type >("ProcessID")
+                    << "][" << expr::attr< ::boost::log::attributes::current_thread_id::value_type >("ThreadID")
+                    << "][" << expr::attr< ::boost::log::trivial::severity_level >("Severity")
+                    << "] " << expr::smessage
+                ),
+            keywords::filter = expr::attr< ::boost::log::trivial::severity_level >("Severity") >=
+                static_cast < ::boost::log::trivial::severity_level > (level),
+            // auto-flush feature of the backend
+            keywords::auto_flush = true
+    );
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::setLevel(LevelType level)
+{
+    ::boost::log::core::get()->set_filter
+    (
+        ::boost::log::expressions::attr< ::boost::log::trivial::severity_level >("Severity")
+                                            >= static_cast < ::boost::log::trivial::severity_level > (level)
+    );
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::trace(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::trace) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::debug(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::debug) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::info(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::info) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::warn(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::warning) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::error(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::error) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::fatal(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::fatal) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogger::log(const std::string & mes, const char * file, int line)
+{
+    BOOST_LOG_SEV(lg::get(), ::boost::log::trivial::error) << file << ":" << line << ": "<< mes ;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace log
+} // namespace fwCore
+
diff --git a/SrcLib/core/fwCore/test/CMakeLists.txt b/SrcLib/core/fwCore/test/CMakeLists.txt
new file mode 100644
index 0000000..56fe3ca
--- /dev/null
+++ b/SrcLib/core/fwCore/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread date_time filesystem REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwCore/test/Properties.cmake b/SrcLib/core/fwCore/test/Properties.cmake
new file mode 100644
index 0000000..1e11419
--- /dev/null
+++ b/SrcLib/core/fwCore/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwCoreTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwCore/test/cppunit.options b/SrcLib/core/fwCore/test/cppunit.options
new file mode 100644
index 0000000..1e664b0
--- /dev/null
+++ b/SrcLib/core/fwCore/test/cppunit.options
@@ -0,0 +1,4 @@
+CLASSTEST=['LazyInstantiatorTest','FactoryRegistryTest','SpyLogTest']
+USE = ['boost','boostThread','boostDateTime','boostFilesystem']
+LIB = ['fwCore_0-1', 'fwTest_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwCore/test/tu/include/FactoryRegistryTest.hpp b/SrcLib/core/fwCore/test/tu/include/FactoryRegistryTest.hpp
new file mode 100644
index 0000000..18596e9
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/include/FactoryRegistryTest.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UT_FATORYREGISTRYTEST_HPP__
+#define __FWCORE_UT_FATORYREGISTRYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCore
+{
+namespace ut
+{
+
+class FactoryRegistryTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( FactoryRegistryTest );
+    CPPUNIT_TEST( pointerTest );
+    CPPUNIT_TEST( valueTest );
+    CPPUNIT_TEST( argTest );
+    CPPUNIT_TEST( threadSafetyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void pointerTest();
+    void valueTest();
+    void argTest();
+    void threadSafetyTest();
+
+};
+
+} //namespace ut
+} //namespace fwCore
+#endif //__FWCORE_UT_FATORYREGISTRYTEST_HPP__
diff --git a/SrcLib/core/fwCore/test/tu/include/LazyInstantiatorTest.hpp b/SrcLib/core/fwCore/test/tu/include/LazyInstantiatorTest.hpp
new file mode 100644
index 0000000..1da5fad
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/include/LazyInstantiatorTest.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UT_LAZYINSTANTIATORTEST_HPP__
+#define __FWCORE_UT_LAZYINSTANTIATORTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCore
+{
+namespace ut
+{
+
+class LazyInstantiatorTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( LazyInstantiatorTest );
+    CPPUNIT_TEST( lazyTest );
+    CPPUNIT_TEST( threadSafetyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void lazyTest();
+    void threadSafetyTest();
+
+};
+
+} //namespace ut
+} //namespace fwCore
+#endif //__FWCORE_UT_LAZYINSTANTIATORTEST_HPP__
diff --git a/SrcLib/core/fwCore/test/tu/include/SpyLogTest.hpp b/SrcLib/core/fwCore/test/tu/include/SpyLogTest.hpp
new file mode 100644
index 0000000..5df806f
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/include/SpyLogTest.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWCORE_UT_SPYLOGTEST_HPP__
+#define __FWCORE_UT_SPYLOGTEST_HPP__
+
+#include <sstream>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwCore
+{
+namespace ut
+{
+
+class SpyLogTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SpyLogTest );
+    CPPUNIT_TEST( logMessageTest );
+    CPPUNIT_TEST( threadSafetyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void logMessageTest();
+    void threadSafetyTest();
+
+private:
+
+    std::vector<std::string> logToVector(const std::stringstream &logsStream);
+    void checkLog(const std::vector<std::string> &logMessagesRef, const std::vector<std::string> &logMessages);
+
+    std::stringstream m_ostream;
+};
+
+} //namespace ut
+} //namespace fwCore
+
+#endif //__FWCORE_UT_SPYLOGTEST_HPP__
diff --git a/SrcLib/core/fwCore/test/tu/src/FactoryRegistryTest.cpp b/SrcLib/core/fwCore/test/tu/src/FactoryRegistryTest.cpp
new file mode 100644
index 0000000..eb42d17
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/src/FactoryRegistryTest.cpp
@@ -0,0 +1,329 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
+#include <boost/thread.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+#include <fwCore/mt/types.hpp>
+#include <fwCore/spyLog.hpp>
+
+#include "FactoryRegistryTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCore::ut::FactoryRegistryTest );
+
+namespace fwCore
+{
+namespace ut
+{
+
+void FactoryRegistryTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void FactoryRegistryTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+class ObjectTest
+{
+public:
+    typedef ::boost::shared_ptr< ObjectTest > sptr;
+
+    ObjectTest() : m_name("ObjectTest")
+    {
+        ::fwCore::mt::ScopedLock lock(s_mutex);
+        ++s_counter;
+    }
+
+    ObjectTest(std::string name) : m_name(name)
+    {
+        ::fwCore::mt::ScopedLock lock(s_mutex);
+        ++s_counter;
+    }
+
+    ObjectTest(int msec) : m_name("ObjectTest+sleep")
+    {
+        ::fwCore::mt::ScopedLock lock(s_mutex);
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(msec));
+        ++s_counter;
+    }
+
+    virtual ~ObjectTest()
+    {}
+
+    virtual std::string getName() const
+    {
+        return m_name;
+    }
+
+    std::string m_name;
+    static int s_counter;
+    static ::fwCore::mt::Mutex s_mutex;
+};
+int ObjectTest::s_counter = 0;
+::fwCore::mt::Mutex ObjectTest::s_mutex;
+
+class DerivedObjectTest : public ObjectTest
+{
+public:
+    typedef ::boost::shared_ptr< DerivedObjectTest > sptr;
+
+    DerivedObjectTest() : ObjectTest()
+    {
+        m_name = "DerivedObjectTest";
+    }
+
+    DerivedObjectTest(std::string name)  : ObjectTest(name)
+    {
+    }
+
+    DerivedObjectTest(int msec)  : ObjectTest(msec)
+    {
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+void FactoryRegistryTest::pointerTest()
+{
+    ObjectTest::s_counter = 0;
+
+    typedef ::fwCore::util::FactoryRegistry< ObjectTest::sptr() > FactoryType;
+    FactoryType objectTestFactory;
+    objectTestFactory.addFactory("ObjectTest", ::boost::factory<ObjectTest::sptr>());
+    objectTestFactory.addFactory("DerivedObjectTest", ::boost::factory<DerivedObjectTest::sptr>());
+
+    FactoryType::KeyVectorType keys = ::boost::assign::list_of("ObjectTest") ("DerivedObjectTest");
+    std::sort(keys.begin(), keys.end());
+    FactoryType::KeyVectorType vectKeys = objectTestFactory.getFactoryKeys();
+    std::sort(vectKeys.begin(), vectKeys.end());
+    CPPUNIT_ASSERT(keys == vectKeys);
+
+
+    ObjectTest::sptr objectTest1 = objectTestFactory.create("ObjectTest");
+    CPPUNIT_ASSERT_EQUAL(1, ObjectTest::s_counter);
+
+    ObjectTest::sptr objectTest2 = objectTestFactory.create("ObjectTest");
+    CPPUNIT_ASSERT_EQUAL(2, ObjectTest::s_counter);
+
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest"), objectTest1->getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest"), objectTest2->getName());
+
+
+
+    ObjectTest::sptr derivedObjectTest1 = objectTestFactory.create("DerivedObjectTest");
+    CPPUNIT_ASSERT_EQUAL(3, ObjectTest::s_counter);
+    ObjectTest::sptr derivedObjectTest2 = objectTestFactory.create("DerivedObjectTest");
+    CPPUNIT_ASSERT_EQUAL(4, ObjectTest::s_counter);
+
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest"), derivedObjectTest1->getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest"), derivedObjectTest2->getName());
+
+    ObjectTest::s_counter = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void FactoryRegistryTest::valueTest()
+{
+    ObjectTest::s_counter = 0;
+
+    ::fwCore::util::FactoryRegistry< ObjectTest() > objectTestFactory;
+    objectTestFactory.addFactory("ObjectTest", ::boost::value_factory<ObjectTest>());
+    objectTestFactory.addFactory("DerivedObjectTest", ::boost::value_factory<DerivedObjectTest>());
+
+    ObjectTest objectTest1 = objectTestFactory.create("ObjectTest");
+    CPPUNIT_ASSERT_EQUAL(1, ObjectTest::s_counter);
+
+    ObjectTest objectTest2 = objectTestFactory.create("ObjectTest");
+    CPPUNIT_ASSERT_EQUAL(2, ObjectTest::s_counter);
+
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest"), objectTest1.getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest"), objectTest2.getName());
+
+
+    ObjectTest derivedObjectTest1 = objectTestFactory.create("DerivedObjectTest");
+    CPPUNIT_ASSERT_EQUAL(3, ObjectTest::s_counter);
+    ObjectTest derivedObjectTest2 = objectTestFactory.create("DerivedObjectTest");
+    CPPUNIT_ASSERT_EQUAL(4, ObjectTest::s_counter);
+
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest"), derivedObjectTest1.getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest"), derivedObjectTest2.getName());
+
+    ObjectTest::s_counter = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void FactoryRegistryTest::argTest()
+{
+    ObjectTest::s_counter = 0;
+
+    ::fwCore::util::FactoryRegistry< ObjectTest::sptr(std::string) > objectTestFactory;
+    objectTestFactory.addFactory("ObjectTest", ::boost::factory<ObjectTest::sptr>());
+    objectTestFactory.addFactory("DerivedObjectTest", ::boost::factory<DerivedObjectTest::sptr>());
+
+    std::string objTest1("ObjectTest1");
+    std::string objTest2("ObjectTest2");
+    ObjectTest::sptr objectTest1 = objectTestFactory.create("ObjectTest", objTest1);
+    ObjectTest::sptr objectTest2 = objectTestFactory.create("ObjectTest", objTest2);
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest1"), objectTest1->getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("ObjectTest2"), objectTest2->getName());
+
+    ObjectTest::sptr derivedObjectTest1;
+    ObjectTest::sptr derivedObjectTest2;
+    std::string derObjTest1("DerivedObjectTest1");
+    std::string derObjTest2("DerivedObjectTest2");
+    derivedObjectTest1 = objectTestFactory.create("DerivedObjectTest", derObjTest1);
+    derivedObjectTest2 = objectTestFactory.create("DerivedObjectTest", derObjTest2);
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest1"), derivedObjectTest1->getName());
+    CPPUNIT_ASSERT_EQUAL(std::string("DerivedObjectTest2"), derivedObjectTest2->getName());
+
+    CPPUNIT_ASSERT_EQUAL(4, ObjectTest::s_counter);
+
+    ObjectTest::s_counter = 0;
+}
+
+
+//-----------------------------------------------------------------------------
+
+typedef ::fwCore::util::FactoryRegistry< ObjectTest::sptr(int) > ThreadSafetyTestFactoryType;
+
+struct UseFactoryThread
+{
+
+    typedef ::boost::shared_ptr< UseFactoryThread > sptr;
+    typedef std::vector< ObjectTest::sptr > ObjectVectorType;
+
+    UseFactoryThread( const ThreadSafetyTestFactoryType &factory, std::string objType = "ObjectTest" ) :
+        m_factory(factory), m_objectType(objType)
+    {}
+
+    void run()
+    {
+        int duration = 20;
+        for (int i=0; i< s_NBOBJECTS; ++i)
+        {
+            OSLM_WARN( "building 1 " << m_objectType << "... " );
+            m_objects.push_back( m_factory.create(m_objectType, duration) );
+            OSLM_WARN( "built 1 " << m_objectType << "... " );
+        }
+    }
+
+    const ThreadSafetyTestFactoryType &m_factory;
+    ObjectVectorType m_objects;
+    std::string m_objectType;
+    static const int s_NBOBJECTS;
+};
+
+const int UseFactoryThread::s_NBOBJECTS = 10;
+
+
+struct PopulateRegistryThread
+{
+    typedef ::boost::shared_ptr< PopulateRegistryThread > sptr;
+    typedef std::vector< ObjectTest::sptr > ObjectVectorType;
+
+    PopulateRegistryThread( ThreadSafetyTestFactoryType &factory ) :
+        m_factory(factory)
+    {}
+
+    void run()
+    {
+        for (int i=0; i< s_NBREGISTRYITEMS; ++i)
+        {
+            std::stringstream ss;
+            ss << "PopulateFactoryThreadObject-" << ::boost::this_thread::get_id() <<"-" << i ;
+            std::string name = ss.str();
+            OSLM_WARN( "adding " << name << "... " );
+            m_factory.addFactory(name, ::boost::factory<ObjectTest::sptr>());
+            OSLM_WARN( "added " << name << "... " );
+            ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(1));
+        }
+
+    }
+
+    ThreadSafetyTestFactoryType &m_factory;
+    static const int s_NBREGISTRYITEMS;
+};
+
+const int PopulateRegistryThread::s_NBREGISTRYITEMS = 1000;
+
+
+void FactoryRegistryTest::threadSafetyTest()
+{
+    ObjectTest::s_counter = 0;
+
+    ThreadSafetyTestFactoryType objectTestFactory;
+    objectTestFactory.addFactory("ObjectTest", ::boost::factory<ObjectTest::sptr>());
+    objectTestFactory.addFactory("DerivedObjectTest", ::boost::factory<DerivedObjectTest::sptr>());
+
+    const int NB_THREAD(10);
+
+    typedef std::vector < UseFactoryThread::sptr > UseFactoryThreadVector;
+    ::boost::thread_group tg;
+
+    UseFactoryThreadVector objects;
+    for(size_t i = 0; i < NB_THREAD; i++)
+    {
+        UseFactoryThread::sptr uft;
+        ::boost::thread* t;
+
+        uft = ::boost::make_shared<UseFactoryThread>(objectTestFactory);
+        t = new ::boost::thread(::boost::bind(&UseFactoryThread::run, uft) );
+        tg.add_thread(t);
+        objects.push_back(uft);
+
+        uft = ::boost::make_shared<UseFactoryThread>(objectTestFactory, "DerivedObjectTest");
+        t = new ::boost::thread(::boost::bind(&UseFactoryThread::run, uft) );
+        tg.add_thread(t);
+        objects.push_back(uft);
+    }
+
+    for(size_t i = 0; i < NB_THREAD; i++)
+    {
+        PopulateRegistryThread::sptr pft;
+        ::boost::thread* t;
+
+        pft = ::boost::make_shared<PopulateRegistryThread>(::boost::ref(objectTestFactory));
+        t = new ::boost::thread(::boost::bind(&PopulateRegistryThread::run, pft) );
+        tg.add_thread(t);
+    }
+
+
+    tg.join_all();
+
+    BOOST_FOREACH(UseFactoryThreadVector::value_type uft, objects)
+    {
+        CPPUNIT_ASSERT_EQUAL(size_t(UseFactoryThread::s_NBOBJECTS), uft->m_objects.size());
+    }
+
+    CPPUNIT_ASSERT_EQUAL(NB_THREAD * UseFactoryThread::s_NBOBJECTS * 2, ObjectTest::s_counter);
+    CPPUNIT_ASSERT_EQUAL(
+                         size_t(NB_THREAD * PopulateRegistryThread::s_NBREGISTRYITEMS + 2),
+                         objectTestFactory.getFactoryKeys().size()
+                         );
+    ObjectTest::s_counter = 0;
+
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwCore
diff --git a/SrcLib/core/fwCore/test/tu/src/LazyInstantiatorTest.cpp b/SrcLib/core/fwCore/test/tu/src/LazyInstantiatorTest.cpp
new file mode 100644
index 0000000..eea7e28
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/src/LazyInstantiatorTest.cpp
@@ -0,0 +1,131 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+
+#include <boost/thread.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "LazyInstantiatorTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCore::ut::LazyInstantiatorTest );
+
+namespace fwCore
+{
+namespace ut
+{
+
+void LazyInstantiatorTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//-----------------------------------------------------------------------------
+
+void LazyInstantiatorTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+template < int SLEEP = 0 >
+class StaticCounter
+{
+public:
+    typedef ::boost::shared_ptr< StaticCounter > sptr;
+
+    StaticCounter()
+    {
+        ::fwCore::mt::ScopedLock lock(s_mutex);
+        ++s_counter;
+        ::boost::this_thread::sleep_for( ::boost::chrono::seconds(SLEEP));
+    }
+
+    static int s_counter;
+    static ::fwCore::mt::Mutex s_mutex;
+};
+
+template < int SLEEP >
+int StaticCounter<SLEEP>::s_counter = 0;
+
+template < int SLEEP >
+::fwCore::mt::Mutex StaticCounter<SLEEP>::s_mutex;
+
+struct second_counter{};
+
+//-----------------------------------------------------------------------------
+
+void LazyInstantiatorTest::lazyTest()
+{
+    StaticCounter<>::s_counter = 0;
+
+    StaticCounter<> cpt;
+
+    CPPUNIT_ASSERT_EQUAL(1, cpt.s_counter);
+
+    StaticCounter<>::sptr counter1 = ::fwCore::util::LazyInstantiator< StaticCounter<> >::getInstance();
+    CPPUNIT_ASSERT_EQUAL(2, counter1->s_counter);
+
+    StaticCounter<>::sptr counter2 = ::fwCore::util::LazyInstantiator< StaticCounter<> >::getInstance();
+    CPPUNIT_ASSERT_EQUAL(2, counter2->s_counter);
+
+    StaticCounter<>::sptr counter3 = ::fwCore::util::LazyInstantiator< StaticCounter<>, second_counter >::getInstance();
+    CPPUNIT_ASSERT_EQUAL(3, counter3->s_counter);
+
+    StaticCounter<>::s_counter = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+struct thread_counter_tag {} ;
+
+struct CounterThread
+{
+    typedef StaticCounter<5> CounterType;
+    typedef ::boost::shared_ptr< CounterThread > sptr;
+
+    CounterThread()
+    {}
+
+    void run ()
+    {
+        CounterType::sptr counter;
+        counter = ::fwCore::util::LazyInstantiator< CounterType , thread_counter_tag >::getInstance();
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+void LazyInstantiatorTest::threadSafetyTest()
+{
+    const int NB_THREAD(100);
+    CounterThread::CounterType::s_counter = 0;
+
+    ::boost::thread_group tg;
+    for(size_t i = 0; i <= NB_THREAD; i++)
+    {
+        CounterThread::sptr ct = ::boost::make_shared<CounterThread>();
+        ::boost::thread* t  = new ::boost::thread(::boost::bind(&CounterThread::run, ct) );
+        tg.add_thread(t);
+    }
+    tg.join_all();
+
+    CounterThread::CounterType::sptr counter;
+    counter = ::fwCore::util::LazyInstantiator< CounterThread::CounterType, thread_counter_tag >::getInstance();
+    CPPUNIT_ASSERT_EQUAL(1, counter->s_counter);
+
+    CounterThread::CounterType::s_counter = 0;
+}
+
+} //namespace ut
+} //namespace fwCore
diff --git a/SrcLib/core/fwCore/test/tu/src/SpyLogTest.cpp b/SrcLib/core/fwCore/test/tu/src/SpyLogTest.cpp
new file mode 100644
index 0000000..c3cc529
--- /dev/null
+++ b/SrcLib/core/fwCore/test/tu/src/SpyLogTest.cpp
@@ -0,0 +1,210 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <streambuf>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/thread.hpp>
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+#include <boost/make_shared.hpp>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/regex.hpp>
+#include <boost/algorithm/string/regex_find_format.hpp>
+
+#include <fwCore/spyLog.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "SpyLogTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwCore::ut::SpyLogTest );
+
+namespace fwCore
+{
+namespace ut
+{
+
+static ::fwTest::Exception e("");
+
+void SpyLogTest::setUp()
+{
+    ::fwCore::log::SpyLogger& log = ::fwCore::log::SpyLogger::getSpyLogger();
+    log.addStreamAppender(m_ostream);
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogTest::tearDown()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogTest::logMessageTest()
+{
+    m_ostream.clear();
+    ::fwCore::log::SpyLogger& log = ::fwCore::log::SpyLogger::getSpyLogger();
+
+    std::vector< std::string > logs;
+
+    logs.push_back("trace message");
+    log.trace(logs.back(), __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+
+    logs.push_back("debug message");
+    log.debug(logs.back(), __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+
+    logs.push_back("info message");
+    log.info(logs.back(),   __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+
+    logs.push_back("warn message");
+    log.warn(logs.back(),   __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+
+    logs.push_back("error message");
+    log.error(logs.back(), __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+
+    logs.push_back("fatal message");
+    log.fatal(logs.back(), __FILE__, __LINE__);
+    this->checkLog(logs, this->logToVector(m_ostream));
+}
+
+//-----------------------------------------------------------------------------
+
+struct LogProducerThread
+{
+    typedef ::boost::shared_ptr< LogProducerThread > sptr;
+    typedef std::vector< std::string > LogContainerType;
+
+    LogProducerThread()
+    {}
+
+    void run(LogContainerType& logs, size_t nbLogs, size_t offset)
+    {
+        ::fwCore::log::SpyLogger& log = ::fwCore::log::SpyLogger::getSpyLogger();
+        for(size_t i=offset; i < nbLogs + offset; ++i)
+        {
+            std::stringstream ss;
+            ss << "msg n ";
+            ss.width(10);
+            ss.fill('0');
+            ss << i ;
+            logs[i] = ss.str();
+            log.fatal(logs[i], __FILE__, __LINE__);
+        }
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+struct RegexLogCompare
+{
+  bool operator() (std::string a, std::string b)
+  {
+      ::boost::regex re(".*(msg n [[:digit:]]+)$");
+      ::boost::smatch matchA;
+      ::boost::smatch matchB;
+      bool doMatchA = boost::regex_match(a, matchA, re);
+      bool doMatchB = boost::regex_match(b, matchB, re);
+      CPPUNIT_ASSERT_MESSAGE( std::string("Regex do not match ") + a, doMatchA);
+      CPPUNIT_ASSERT_MESSAGE( std::string("Regex do not match ") + b, doMatchB);
+
+      std::string strA(matchA[1].first, matchA[1].second);
+      std::string strB(matchB[1].first, matchB[1].second);
+
+      return strA < strB;
+  }
+} regex_compare;
+
+void SpyLogTest::threadSafetyTest()
+{
+    m_ostream.clear();
+    const size_t NB_THREAD(100);
+    const size_t NB_LOG(100);
+    LogProducerThread::LogContainerType logs(NB_THREAD * NB_LOG, "test");
+    ::boost::thread_group tg;
+    for(size_t i = 0; i < NB_THREAD; ++i)
+    {
+        LogProducerThread::sptr ct = ::boost::make_shared<LogProducerThread>();
+        size_t offset = i * NB_LOG;
+        ::boost::thread* t  = new ::boost::thread(::boost::bind(&LogProducerThread::run, ct, boost::ref(logs), NB_LOG, offset) );
+        tg.add_thread(t);
+    }
+    tg.join_all();
+
+    LogProducerThread::LogContainerType logMessages = this->logToVector(m_ostream);
+
+    std::sort( logMessages.begin(), logMessages.end(), regex_compare);
+    this->checkLog(logs, logMessages);
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector<std::string> SpyLogTest::logToVector(const std::stringstream &logsStream)
+{
+    std::vector<std::string> lines;
+    ::boost::split_regex(lines, logsStream.str(), ::boost::regex("\r?\n"));
+
+    if(lines.back().empty())
+    {
+        lines.pop_back();
+    }
+    return lines;
+}
+
+//-----------------------------------------------------------------------------
+
+void SpyLogTest::checkLog(const std::vector<std::string> &logMessagesRef, const std::vector<std::string> &logMessages)
+{
+    CPPUNIT_ASSERT_EQUAL(logMessagesRef.size(), logMessages.size());
+
+    const std::string linePattern("(\\[[0-9]+\\])");
+    const std::string timePattern("(\\[.+\\])");
+    const std::string levelPattern("( *\\[[a-z]+\\])");
+    const std::string filePattern("( .*:)");
+    const std::string fileLinePattern("([0-9]+: )");
+    const std::string messagePattern("(.*)$");
+
+    ::boost::regex re(
+                linePattern
+                + timePattern
+                + levelPattern
+                + filePattern
+                + fileLinePattern
+                + messagePattern );
+
+    ::boost::smatch match;
+    std::string regexMessage;
+    size_t i=0;
+
+    BOOST_FOREACH(const std::string &log, logMessages)
+    {
+        bool doMatch = boost::regex_match(log, match, re);
+
+        CPPUNIT_ASSERT_MESSAGE(log + " don't match regex.", doMatch);
+
+        regexMessage.assign(match[6].first, match[6].second);
+
+        CPPUNIT_ASSERT_EQUAL(logMessagesRef[i], regexMessage);
+        ++i;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwCore
diff --git a/SrcLib/core/fwData/CMakeLists.txt b/SrcLib/core/fwData/CMakeLists.txt
new file mode 100644
index 0000000..f45665f
--- /dev/null
+++ b/SrcLib/core/fwData/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCamp
+    fwCom
+    fwCore
+    fwMath
+    fwMemory
+    fwTools
+)
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+fwLink(${Boost_LIBRARIES})
+
diff --git a/SrcLib/core/fwData/COPYING b/SrcLib/core/fwData/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwData/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwData/COPYING.LESSER b/SrcLib/core/fwData/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwData/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwData/Properties.cmake b/SrcLib/core/fwData/Properties.cmake
new file mode 100644
index 0000000..ca99c0a
--- /dev/null
+++ b/SrcLib/core/fwData/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwData )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCamp fwCom fwCore fwMath fwMemory fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwData/bin/build.options b/SrcLib/core/fwData/bin/build.options
new file mode 100644
index 0000000..6ff51d0
--- /dev/null
+++ b/SrcLib/core/fwData/bin/build.options
@@ -0,0 +1,6 @@
+TYPE    = 'shared'
+LIB     = ['fwTools_0-1' , 'fwMath_0-1', 'fwCamp_0-1', 'fwCom_0-1','fwMemory_0-1']
+USE     = ['boost', 'boostDateTime',]
+VERSION = '0-1'
+
+
diff --git a/SrcLib/core/fwData/include/fwData/Array.hpp b/SrcLib/core/fwData/include/fwData/Array.hpp
new file mode 100644
index 0000000..fbc9396
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Array.hpp
@@ -0,0 +1,251 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_ARRAY_HPP_
+#define _FWDATA_ARRAY_HPP_
+
+#include <fwTools/Type.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include "fwData/Exception.hpp"
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Array), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @class   Array
+ * @brief   Provides a way to manage a view on a multidimentionnal array.
+ * If the array own his buffer, it will perform the allocation, reallocation,
+ * destruction of the buffer. Else, this class will provide a array "view" of the
+ * buffer
+ * 
+ * @date    2011.
+ */
+class FWDATA_CLASS_API Array : public ::fwData::Object
+{
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Array)(::fwData::Object), (()), ::fwData::factory::New< Array >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Array));
+
+    /**
+     * @brief Array size type
+     */
+    typedef std::vector<size_t> SizeType;
+    /**
+     * @brief Offset type
+     */
+    typedef std::vector<size_t> OffsetType;
+    /**
+     * @brief Index type
+     */
+    typedef OffsetType IndexType;
+
+
+    /*
+     * public API
+     */
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Array( ::fwData::Object::Key key );
+
+    FWDATA_API virtual ~Array();
+
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+     * @brief Resizes and allocate (if needed) the array.
+     *
+     * If no buffer is allocated and reallocate is true, this method will
+     * allocate a buffer and take it ownership.
+     *
+     * If the combination of type, size and components parameters do not match
+     * anymore the size of the previously allocated buffer, a reallocation is needed.
+     * In this case :
+     *  * if reallocate is true and if the Array do not own the buffer, an
+     *  exception is thrown
+     *  * else if reallocate is false, the array will update the view
+     *  informations
+     *  * else, the reallocation is performed.
+     *
+     * @param type           Type of the array view
+     * @param size           Size of the array view
+     * @param nbOfComponents Number of components of the array view, Min value : 1
+     * @param reallocate     If true, allow buffer reallocation
+     *
+     * @return return the size of the array view
+     *
+     * @throw ::fwData::Exception
+     */
+    FWDATA_API virtual size_t resize(const ::fwTools::Type &type, const SizeType &size, size_t nbOfComponents, bool reallocate = false) throw(::fwData::Exception);
+
+    /// Aliases to the resize method
+    FWDATA_API virtual size_t resize(const std::string &type, const SizeType &size, size_t nbOfComponents, bool reallocate = false) throw(::fwData::Exception);
+    FWDATA_API virtual size_t resize(const SizeType &size, size_t nbOfComponents, bool reallocate = false) throw(::fwData::Exception);
+    FWDATA_API virtual size_t resize(const SizeType &size, bool reallocate = false) throw(::fwData::Exception);
+
+    /**
+     * @brief Clear this array.
+     * Size, type, nbOfComponents are reset, buffer is released.
+     */
+    FWDATA_API virtual void clear();
+
+    /**
+     * @brief Test whether array is empty
+     *
+     * @return Returns whether array is empty, ie. this->getSize() is an empty
+     * vector.
+     */
+    FWDATA_API virtual bool empty() const;
+
+
+    /**
+     * @brief Get the size of one element of the array,
+     * ie. sizeof type * nbOfComponents
+     *
+     * @return One array elemet size in bytes.
+     */
+    FWDATA_API virtual size_t getElementSizeInBytes() const;
+
+    /**
+     * @brief Get the number of elements of type <getType()> in the array
+     *
+     * @return number of array elements
+     */
+    FWDATA_API virtual size_t getNumberOfElements() const;
+
+    /**
+     * @brief Getter for the array view size
+     *
+     * @return  Array view size in bytes.
+     */
+    FWDATA_API virtual size_t getSizeInBytes() const;
+
+    /**
+     * @brief Getter for the array size
+     *
+     * @return vector of size lengths in each dimension
+     */
+    FWDATA_API virtual const SizeType &getSize() const;
+
+    /**
+     * @brief Getter for the array strides
+     *
+     * @return vector of steps in each dimension for array walking
+     */
+    FWDATA_API virtual const OffsetType &getStrides() const;
+
+    /**
+     * @brief Setter for array's number of components
+     * If the array has a buffer and owns it, the buffer will be reallocated
+     *
+     * @param nb number of components
+     */
+    FWDATA_API virtual void setNumberOfComponents(size_t nb);
+
+    /**
+     * @brief Getter for number of components
+     *
+     * @return Array's number of components
+     */
+    FWDATA_API virtual size_t getNumberOfComponents() const;
+
+    /**
+     * @brief Getter for number of dimensions, ie. getSize().size()
+     *
+     * @return Array's number of dimensions
+     */
+    FWDATA_API virtual size_t getNumberOfDimensions() const;
+
+    /**
+     * @brief Set array's buffer ownership
+     *
+     * @param own New ownership value
+     */
+    FWDATA_API virtual void setIsBufferOwner(const bool own);
+
+    /**
+     * @brief Getter for array's buffer ownership
+     *
+     * @return Current array buffer ownership
+     */
+    FWDATA_API virtual bool getIsBufferOwner() const;
+
+    /**
+     * @brief Setter for array's type
+     *
+     * @param type new array type
+     */
+    FWDATA_API virtual void setType(const std::string &type);
+    FWDATA_API virtual void setType(const ::fwTools::Type &type);
+
+    /**
+     * @brief Getter for array's type
+     *
+     * @return Type of array
+     */
+    FWDATA_API virtual ::fwTools::Type getType() const;
+
+    /**
+     * @brief Compute offset in buffer for given parameters
+     * of type
+     *
+     * @param id Item id
+     * @param component Item component id
+     * @param sizeOfType size of a component
+     *
+     * @return buffer offset
+     */
+    FWDATA_API size_t getBufferOffset( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType ) const;
+
+    /**
+     * @brief Compute strides for given parameters
+     *
+     * @param size Array size
+     * @param nbOfComponents number of components
+     * @param sizeOfType size of a component
+     *
+     * @return
+     */
+    FWDATA_API static OffsetType computeStrides( SizeType size, size_t nbOfComponents, size_t sizeOfType );
+
+    fwDataGetSetSptrMacro(BufferObject, ::fwMemory::BufferObject::sptr);
+
+    /// Exchanges the content of the Array with the content of _source.
+    FWDATA_API void swap( Array::sptr _source );
+
+protected:
+
+    /// Not implemented
+    Array( const Array& );
+
+    const Array & operator= ( const Array& );
+
+    OffsetType m_strides;
+    ::fwTools::Type m_type;
+    ::fwMemory::BufferObject::sptr m_attrBufferObject;
+    SizeType m_size;
+    size_t m_nbOfComponents;
+    bool m_isBufferOwner;
+
+};
+
+
+} // namespace fwData
+
+#endif // _FWDATA_ARRAY_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Boolean.hpp b/SrcLib/core/fwData/include/fwData/Boolean.hpp
new file mode 100644
index 0000000..dd2d05f
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Boolean.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_BOOLEAN_HPP_
+#define _FWDATA_BOOLEAN_HPP_
+
+#include "fwData/GenericField.hpp"
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Boolean), FWDATA_API);
+namespace fwData
+{
+
+/**
+ * @class   Boolean
+ * @brief   This class contains a boolean value
+ *
+ * Boolean object is essentially used as a field in other objects.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Boolean : public GenericField< bool >
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Boolean)(::fwData::Object),( ((const bool)(false)) ), GenericFieldFactory< Boolean >) ;
+    fwCampMakeFriendDataMacro((fwData)(Boolean));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Boolean( ::fwData::Object::Key key ) throw();
+
+    /**
+     * @brief Destructor.
+     */
+    FWDATA_API virtual ~Boolean() throw();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected:
+
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_BOOLEAN_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Camera.hpp b/SrcLib/core/fwData/include/fwData/Camera.hpp
new file mode 100644
index 0000000..8debea6
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Camera.hpp
@@ -0,0 +1,160 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_CAMERA_HPP_
+#define _FWDATA_CAMERA_HPP_
+
+#include <utility>
+
+#include <boost/cstdint.hpp>
+#include <boost/array.hpp>
+
+#include "fwData/Object.hpp"
+#include "fwData/TransformationMatrix3D.hpp"
+#include "fwData/factory/new.hpp"
+
+
+fwCampAutoDeclareDataMacro((fwData)(Camera), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Camera
+ * @brief   This class defines a camera object.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Camera : public Object
+{
+public:
+    fwCampMakeFriendDataMacro((fwData)(Camera));
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (Camera)(::fwData::Object),
+            (()),
+            ::fwData::factory::New< Camera >);
+
+    typedef struct
+    {
+        unsigned long Low;
+        unsigned long High;
+    } uint32HL;
+
+    typedef ::boost::array<double, 5> DistArray;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Camera( ::fwData::Object::Key key );
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~Camera() throw();
+
+    /// @brief set the extrinsic transformation matrix
+    void setExtrinsicCameraTransformation(
+            ::fwData::TransformationMatrix3D::sptr transMat)
+    { m_extrinsicMatrix = transMat; }
+
+    /// @brief set the intrinsic transformation matrix
+    void setIntrinsicCameraTransformation(
+            ::fwData::TransformationMatrix3D::sptr transMat)
+    { m_intrinsicMatrix = transMat; }
+
+    /// @brief get the extrinsic transformation matrix
+    ::fwData::TransformationMatrix3D::sptr
+     getExtrinsicCameraTransformation() const
+    { return m_extrinsicMatrix; };
+
+    /// @brief get the intrinsic transformation matrix
+    ::fwData::TransformationMatrix3D::sptr
+     getIntrinsicCameraTransformation() const
+    { return m_intrinsicMatrix; };
+
+    /// @return cx or u0 = x-coordinate of optical center
+    ::fwData::TransformationMatrix3D::TM3DType getCx() const
+    { return m_intrinsicMatrix->getCoefficient(0, 2); };
+
+    /// @return cy or v0 = y-coordinate of optical center
+    ::fwData::TransformationMatrix3D::TM3DType getCy() const
+    { return m_intrinsicMatrix->getCoefficient(1, 2); };
+
+    /// @brief set cx or u0 = x-coordinate of optical center
+    void setCx(::fwData::TransformationMatrix3D::TM3DType cx)
+    { m_intrinsicMatrix->setCoefficient(0, 2, cx); };
+
+    /// @brief set cy or v0 = y-coordinate of optical center
+    void setCy(::fwData::TransformationMatrix3D::TM3DType cy)
+    { m_intrinsicMatrix->setCoefficient(1, 2, cy); };
+
+    /// @return fx = x-coordinate of optical center
+    ::fwData::TransformationMatrix3D::TM3DType getFx() const
+    { return m_intrinsicMatrix->getCoefficient(0, 0); };
+
+    /// @brief set fx = x-coordinate of optical center
+    void setFx(::fwData::TransformationMatrix3D::TM3DType fx)
+    { m_intrinsicMatrix->setCoefficient(0, 0, fx); };
+
+    /// @return fy = y-coordinate of optical center
+    ::fwData::TransformationMatrix3D::TM3DType getFy() const
+    { return m_intrinsicMatrix->getCoefficient(1, 1); };
+
+    /// @brief set fy = y-coordinate of optical center
+    void setFy(::fwData::TransformationMatrix3D::TM3DType fy)
+    { m_intrinsicMatrix->setCoefficient(1, 1, fy); };
+
+    FWDATA_API void setDistortionCoefficient(
+            double k1, double k2, double p1, double p2, double k3);
+    fwDataGetSetCRefMacro(DistortionCoefficient, DistArray);
+
+    fwDataGetSetMacro(Skew, double);
+
+    /// @brief get flag if data is available
+    bool &dataAvailable()
+    { return m_dataAvailable; }
+
+    /**
+     * @brief get universal ID for the physic's camera
+     */
+    std::pair< bool, uint32HL > getCameraGUID() const
+                { return m_cameraGUID; };
+
+    /**
+     * @brief set universal ID for the physic's camera
+     */
+    FWDATA_API void setCameraGUID(uint32HL _cameraGUID);
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected:
+
+    /// extrinsic matrix
+    ::fwData::TransformationMatrix3D::sptr m_extrinsicMatrix;
+
+    /// intrinsic matrix
+    ::fwData::TransformationMatrix3D::sptr m_intrinsicMatrix;
+
+    /**
+     * Image distortion coefficients (radial and tangential distortions,
+     * [k1, k2, p1, p2, k3])
+     */
+    DistArray m_attrDistortionCoefficient;
+
+    /// skew coefficient (angle between the x and y pixel axes)
+    double m_attrSkew;
+
+    //! Universal ID for the physic's camera
+    std::pair< bool, uint32HL > m_cameraGUID;
+
+    //! flag if data is available
+    bool m_dataAvailable;
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_CAMERA_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Color.hpp b/SrcLib/core/fwData/include/fwData/Color.hpp
new file mode 100644
index 0000000..401ab84
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Color.hpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_COLOR_HPP_
+#define _FWDATA_COLOR_HPP_
+
+#include <boost/array.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Color), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Color
+ * @brief   This class defines color object.
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API Color : public Object
+{
+
+public :
+
+    typedef float ColorType;
+    typedef ::boost::array<ColorType,4> ColorArray;
+
+    fwCoreClassDefinitionsWithNFactoriesMacro( (Color)(::fwData::Object),
+       ((::fwData::factory::New< Color > ,() ))
+       ((ColorFactory ,((ColorType)) ((ColorType)(1.0)) ((ColorType) (1.0)) ((ColorType)(1.0)) ))
+       );
+
+    fwCampMakeFriendDataMacro((fwData)(Color));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Color( ::fwData::Object::Key key );
+
+    /// Destructor
+    FWDATA_API virtual ~Color();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    fwGettersSettersDocMacro(RGBA, vRGBA, ColorArray, the array of color values (red, green, blue, alpha).);
+
+    ///@{
+    ///@brief set RGBA color
+    ///@param[in] red
+    ///@param[in] green
+    ///@param[in] blue
+    ///@param[in] alpha
+    FWDATA_API void setRGBA( const ColorType red, const ColorType green, const ColorType blue, const ColorType alpha=1.0 );
+
+    ///@brief set RGBA from hexadecimal format (\#ffffff)
+    ///@param[in] hexaColor c hexadecimal format (\#ffffff)
+    FWDATA_API void setRGBA( std::string hexaColor );
+    ///@}
+
+    /** @name color attributes accessor */
+    /**@brief Get editable reference to color attributes
+     * @{
+     */
+    FWDATA_API ColorType  &red();
+    FWDATA_API ColorType  &green();
+    FWDATA_API ColorType  &blue();
+    FWDATA_API ColorType  &alpha();
+    /// @}
+
+    /**@brief Get read-only reference to color attributes
+     * @{
+     */
+    FWDATA_API const ColorType  &red()   const ;
+    FWDATA_API const ColorType  &green() const ;
+    FWDATA_API const ColorType  &blue()  const ;
+    FWDATA_API const ColorType  &alpha() const;
+    //@}
+
+protected :
+
+
+    FWDATA_API static sptr ColorFactory(ColorType red, ColorType green, ColorType blue, ColorType alpha);
+
+    //! RGBA of the image (in terms of points)
+    ColorArray  m_vRGBA;
+
+
+
+}; // end class Color
+
+} // end namespace fwData
+
+
+#endif // _FWDATA_COLOR_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Composite.hpp b/SrcLib/core/fwData/include/fwData/Composite.hpp
new file mode 100644
index 0000000..ba69f2b
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Composite.hpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_COMPOSITE_HPP_
+#define _FWDATA_COMPOSITE_HPP_
+
+#include <map>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwData/config.hpp"
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+
+// boost 1.47 issue with FOREACH
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 104700
+#include <boost/foreach.hpp>
+
+namespace fwData
+{ class Composite; }
+
+inline boost::mpl::true_ * boost_foreach_is_noncopyable( ::fwData::Composite *&, BOOST_FOREACH_TAG_DEFAULT )
+{ return 0; }
+
+#endif //BOOST_VERSION >= 104700
+
+
+
+fwCampAutoDeclareDataMacro((fwData)(Composite), FWDATA_API);
+
+
+namespace fwData
+{
+
+/**
+ * @class   Composite
+ * @brief   This class defines a composite object.
+ *
+ * Composite contains a map of ::fwData::Object.
+ *
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API Composite : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Composite)(::fwData::Object), (()), ::fwData::factory::New< Composite >) ;
+    fwCampMakeFriendDataMacro((fwData)(Composite));
+
+    typedef std::map< std::string, ::fwData::Object::sptr > ContainerType;
+
+    typedef ContainerType::key_type KeyType;
+    typedef ContainerType::mapped_type MappedType;
+    typedef ContainerType::value_type ValueType;
+    typedef ContainerType::iterator IteratorType;
+    typedef ContainerType::const_iterator ConstIteratorType;
+    typedef ContainerType::reverse_iterator ReverseIteratorType;
+    typedef ContainerType::const_reverse_iterator ConstReverseIteratorType;
+    typedef ContainerType::size_type SizeType;
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef ContainerType::key_type key_type;
+    typedef ContainerType::mapped_type mapped_type;
+    typedef ContainerType::value_type value_type;
+    typedef ContainerType::iterator iterator;
+    typedef ContainerType::const_iterator const_iterator;
+    typedef ContainerType::reverse_iterator reverse_iterator;
+    typedef ContainerType::const_reverse_iterator const_reverse_iterator;
+    typedef ContainerType::size_type size_type;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Composite( ::fwData::Object::Key key );
+
+    /// Destructor
+    FWDATA_API virtual ~Composite();
+
+
+    IteratorType begin() { return m_attrContainer.begin(); }
+    IteratorType end()   { return m_attrContainer.end(); }
+    ConstIteratorType begin() const { return m_attrContainer.begin(); }
+    ConstIteratorType end()   const { return m_attrContainer.end(); }
+
+    ReverseIteratorType rbegin() { return m_attrContainer.rbegin(); }
+    ReverseIteratorType rend()   { return m_attrContainer.rend(); }
+    ConstReverseIteratorType rbegin() const { return m_attrContainer.rbegin(); }
+    ConstReverseIteratorType rend()   const { return m_attrContainer.rend(); }
+
+    bool empty() const { return m_attrContainer.empty(); }
+    SizeType size() const { return m_attrContainer.size(); }
+
+    mapped_type& operator[] ( KeyType n )
+    {return this->m_attrContainer[n];}
+
+    IteratorType find ( const KeyType& x ) { return m_attrContainer.find(x); }
+    ConstIteratorType find ( const KeyType& x ) const { return m_attrContainer.find(x); }
+
+    SizeType count ( const KeyType& x ) const { return m_attrContainer.count(x); }
+    /// @}
+
+
+
+    /// @brief get/set the map of std::string/::fwData::Object
+    /// @{
+    ContainerType &getContainer(){ return m_attrContainer; };
+    fwDataGetSetCRefMacro(Container, ContainerType);
+    /// @}
+
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Method to initialize a ::fwData::Composite from a std::map< string, X >
+    template< class DATATYPE >
+    void setDataContainer( const std::map< std::string, SPTR(DATATYPE) > & map )
+    {
+        this->getContainer().clear();
+        this->getContainer().insert( map.begin(), map.end() );
+    }
+
+    /// Method to get a std::map< string, X > from ::fwData::Composite
+    template< class DATATYPE >
+    std::map< std::string, SPTR(DATATYPE) > getDataContainer() const
+    {
+        std::map< std::string, SPTR(DATATYPE) > map;
+        SPTR(DATATYPE) castedData;
+        BOOST_FOREACH( ::fwData::Composite::value_type elem, *this )
+        {
+            castedData = ::boost::dynamic_pointer_cast<DATATYPE>( elem.second );
+            OSLM_ASSERT("DynamicCast "<< ::fwCore::TypeDemangler<DATATYPE>().getFullClassname()<<" failed", castedData);
+            map[elem.first] = castedData;
+        }
+
+        return map;
+    }
+
+protected:
+    ContainerType m_attrContainer;
+};
+
+
+} //namespace fwData
+
+
+
+#endif /* _FWDATA_COMPOSITE_HPP_ */
+
diff --git a/SrcLib/core/fwData/include/fwData/Edge.hpp b/SrcLib/core/fwData/include/fwData/Edge.hpp
new file mode 100644
index 0000000..95bf229
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Edge.hpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_EDGE_HPP_
+#define _FWDATA_EDGE_HPP_
+
+#include <utility>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Edge), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Edge
+ * @brief   This class defines an edge object.
+ *
+ * An edge is reprensented by a to identifier ("from" and "to") and a nature.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Edge : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Edge)(::fwData::Object), (()), ::fwData::factory::New< Edge >) ;
+    fwCampMakeFriendDataMacro((fwData)(Edge));
+
+    FWDATA_API static std::string NATURE_FLOW;
+    FWDATA_API static std::string NATURE_DATA;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Edge( ::fwData::Object::Key key );
+    /// Destructor
+    FWDATA_API virtual ~Edge();
+
+
+    /// @brief do a shallow copy of edge
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// @brief do a deep copy of edge
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+     * @brief Set the edge identifier ("ID_SIZEX" , ...)
+     * @param[in] _fromPortIndentifier identifier of port "from"
+     * @param[in] _toPortIndentifier identifier of port "to"
+     */
+    FWDATA_API void setIdentifiers(const std::string & _fromPortIndentifier, const std::string & _toPortIndentifier);
+
+    /**
+     * @brief Get the edge identifier
+     *
+     * @return std::pair <from,to>
+     */
+    FWDATA_API std::pair<std::string,std::string> getIdentifiers() const;
+
+    /// @brief return "from" identifier
+    FWDATA_API std::string getFromPortID() const;
+
+    /// @brief return "to" identifier
+    FWDATA_API std::string getToPortID() const;
+
+    /// @brief return "to or from" identifier accroding to upStream
+    FWDATA_API std::string getPortID(bool upStream) const;
+
+    /// @brief Set edge nature ("FLOW" , "FWDATA")
+    FWDATA_API void setNature(std::string nature);
+
+    /// @brief Get edge nature ("FLOW" , "FWDATA")
+    FWDATA_API const std::string &getNature() const;
+
+protected :
+
+    std::string m_fromPortIdentifier; // "ID_SIZEX" , ...
+    std::string m_toPortIdentifier; // "ID_SIZEX" , ...
+    std::string m_nature; // "FLOW" , "FWDATA"
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_EDGE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Exception.hpp b/SrcLib/core/fwData/include/fwData/Exception.hpp
new file mode 100644
index 0000000..3fc8308
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Exception.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_EXCEPTION_HPP_
+#define _FWDATA_EXCEPTION_HPP_
+
+#include <exception>
+#include <string>
+
+#include "fwCore/Exception.hpp"
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+
+/**
+ * @brief   Implements data exception class
+ * @class   Exception
+ * 
+ * @date    2007-2009.
+ */
+struct FWDATA_CLASS_API Exception : public ::fwCore::Exception
+{
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   message a string containing the failure message
+     */
+    FWDATA_API Exception(const std::string &message) throw();
+
+    /**
+     * @brief   Destructor : do nothing.
+     */
+    FWDATA_API ~Exception() throw();
+
+
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_EXCEPTION_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Float.hpp b/SrcLib/core/fwData/include/fwData/Float.hpp
new file mode 100644
index 0000000..cfc6956
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Float.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_FLOAT_HPP_
+#define _FWDATA_FLOAT_HPP_
+
+#include "fwData/GenericField.hpp"
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Float), FWDATA_API);
+
+
+namespace fwData
+{
+
+/**
+ * @class   Float
+ * @brief   This class contains an float value
+ *
+ * Float object is essentially used as a field in other objects.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Float : public GenericField< float >
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Float)(::fwData::Object),( ((const float)(0.0f)) ), GenericFieldFactory< Float >) ;
+
+
+    fwCampMakeFriendDataMacro((fwData)(Float));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Float( ::fwData::Object::Key key ) throw();
+
+    /**
+     * @brief Destructor.
+     */
+    FWDATA_API virtual ~Float() throw();
+
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected:
+
+    FWDATA_API Float() throw();
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_FLOAT_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/GenericField.hpp b/SrcLib/core/fwData/include/fwData/GenericField.hpp
new file mode 100644
index 0000000..43594b6
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/GenericField.hpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_GENERICFIELD_HPP_
+#define _FWDATA_GENERICFIELD_HPP_
+
+#include <string>
+
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwData/factory/new.hpp"
+#include "fwData/config.hpp"
+#include "fwData/GenericFieldBase.hpp"
+
+namespace fwData
+{
+
+/**
+ * @class   GenericField
+ * @brief   Generic "field" object template.
+ *
+ * A generic object contains a value.
+ *
+ * @see     ::fwData::Float, ::fwData::Boolean, ::fwData::Integer
+ *
+ * 
+ * @date    2007-2009.
+ */
+template< typename T >
+class FWDATA_CLASS_API GenericField : public GenericFieldBase
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (GenericField<T>)(::fwData::Object) );
+
+    typedef T ValueType;
+
+    /// @brief Get the value (mutable version).
+    T& value() throw() { return m_value; }
+
+    /// @brief Get the value (constant version).
+    const T& value() const throw() { return m_value; }
+
+    /// @brief set the value
+    void setValue(const T &newValue) throw() { m_value = newValue; }
+
+    /// @brief get the value
+    T getValue() const throw() { return m_value; }
+
+    /// @brief Conversion to a scalar type.
+    operator T() throw() { return m_value; }
+
+    bool operator== (const GenericFieldBase &lf)
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField );
+        return ( this->m_value == gField.value() );
+    }
+
+    bool operator!= (const GenericFieldBase &lf )
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField);
+        return ( this->m_value != gField.value() );
+    }
+
+    bool operator< (const GenericFieldBase &lf )
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField);
+        return ( this->m_value < gField.value() );
+    }
+
+    bool operator> (const GenericFieldBase &lf)
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField);
+        return ( this->m_value > gField.value() );
+    }
+
+    bool operator<= (const GenericFieldBase &lf)
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField);
+        return ( this->m_value <= gField.value() );
+    }
+
+    bool operator>= (const GenericFieldBase &lf )
+    {
+        const ::fwData::GenericField<T> &gField =  dynamic_cast< const ::fwData::GenericField<T> & >(lf);
+        SLM_ASSERT("GenericField must have same ValueType.", &gField);
+        return ( this->m_value >= gField.value() );
+    }
+
+    virtual ::std::string toString() const
+    {
+       return ::boost::lexical_cast< ::std::string >(this->m_value);
+    }
+
+    virtual void fromString(const ::std::string &_value)
+    {
+       this->m_value = ::boost::lexical_cast< T >(_value);
+    }
+
+protected:
+
+    template< typename GT >
+    static typename GT::sptr GenericFieldFactory(const typename GT::ValueType value);
+
+    static sptr GenericFieldFactory(const T value);
+
+
+    /**
+     * @brief Constructor.
+     * @param[in] value The initial value.
+     */
+    GenericField( const T value = T( ) ) throw()
+    :   m_value( value )
+    {}
+
+    /**
+     * @brief Destructor.
+     */
+    virtual ~GenericField() throw() {}
+
+    virtual std::ostream & toOStream( std::ostream &_os ) const
+    {
+        return _os << this->value();
+    }
+
+    /// @brief The stored value.
+    T m_value;
+};
+
+
+template< typename T >
+template< typename GT >
+typename GT::sptr GenericField<T>::GenericFieldFactory(const typename GT::ValueType value)
+{
+    typename GT::sptr field;
+    field = ::fwData::factory::New< GT >();
+    field->value() = value;
+    return field;
+}
+
+template< typename T >
+typename GenericField<T>::sptr GenericField<T>::GenericFieldFactory(const T value)
+{
+    typename GenericField<T>::sptr field;
+    field = GenericFieldFactory< GenericField<T> >(value);
+    field->value() = value;
+    return field;
+}
+
+
+} // namespace fwData
+
+#endif // _FWDATA_GENERICFIELD_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/GenericFieldBase.hpp b/SrcLib/core/fwData/include/fwData/GenericFieldBase.hpp
new file mode 100644
index 0000000..924523c
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/GenericFieldBase.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_GENERICFIELDBASE_HPP_
+#define _FWDATA_GENERICFIELDBASE_HPP_
+
+#include <string>
+#include <ostream>
+
+#include <fwCore/base.hpp>
+
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+
+namespace fwData
+{
+
+/**
+ * @class   GenericFieldBase
+ *
+ * 
+ * @date    2009-2010.
+ */
+class FWDATA_CLASS_API GenericFieldBase : public Object
+{
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (GenericFieldBase) );
+
+    FWDATA_API virtual bool operator== (const GenericFieldBase &lf ) = 0;
+    FWDATA_API virtual bool operator!= (const GenericFieldBase &lf ) = 0;
+    FWDATA_API virtual bool operator<  (const GenericFieldBase &lf ) = 0;
+    FWDATA_API virtual bool operator>  (const GenericFieldBase &lf ) = 0;
+    FWDATA_API virtual bool operator<= (const GenericFieldBase &lf ) = 0;
+    FWDATA_API virtual bool operator>= (const GenericFieldBase &lf ) = 0;
+    FWDATA_API friend std::ostream& operator<<( std::ostream &, const GenericFieldBase & );
+
+    FWDATA_API virtual ::std::string toString() const = 0;
+    FWDATA_API virtual void fromString(const ::std::string &_value) = 0;
+
+
+private :
+    FWDATA_API virtual std::ostream & toOStream( std::ostream &_os ) const = 0;
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_GENERICFIELDBASE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Graph.hpp b/SrcLib/core/fwData/include/fwData/Graph.hpp
new file mode 100644
index 0000000..adf4a66
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Graph.hpp
@@ -0,0 +1,233 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_GRAPH_HPP_
+#define _FWDATA_GRAPH_HPP_
+
+#include <map>
+#include <set>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Edge.hpp"
+#include "fwData/Node.hpp"
+
+
+fwCampAutoDeclareDataMacro((fwData)(Graph), FWDATA_API);
+
+namespace fwData {
+/**
+ * @class   Graph
+ * @brief   This class defines a graph object.
+ *
+ * A graph is represented by connections between Edge and Node.
+ *
+ * @see     ::fwData::Edge, ::fwData::Node
+ *
+ *
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API Graph : public ::fwData::Object {
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Graph)(::fwData::Object), (()), ::fwData::factory::New< Graph >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Graph));
+
+    FWDATA_API static const bool UP_STREAM;
+    FWDATA_API static const bool DOWN_STREAM;
+
+    typedef std::map< Edge::sptr,  std::pair<  Node::sptr,  Node::sptr > > ConnectionContainer;
+    typedef std::set< Node::sptr >                                         NodeContainer;  //  Be careful, if you change we use erase(it++)
+
+    /// Type of signal m_sigUpdated
+    typedef std::vector< ::fwData::Object::sptr > UpdatedDataType;
+
+
+    /**
+     * @brief Update signal type
+     * Signal updated is composed of two parameters which represent added and removed elements in the graph.
+     */
+    typedef ::fwCom::Signal< void (UpdatedDataType, UpdatedDataType ) > UpdatedSignalType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Graph(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Graph();
+
+    /**
+     * @brief add a node
+     *
+     * @return true on success( node not already in graph)
+     */
+    FWDATA_API bool addNode( Node::sptr _node);
+
+    /**
+     * @brief remove a node
+     *
+     * @return true on sucess
+     */
+    FWDATA_API bool removeNode( Node::csptr _node);
+
+    /**
+     * @{
+     * @brief Get the node container
+     */
+    FWDATA_API NodeContainer &getRefNodes();
+    FWDATA_API const NodeContainer &getCRefNodes() const;
+    ///@}
+
+    /**
+     * @brief Get the connection container
+     *
+     * A connection is defined by an edge, a source node and a destination node.
+     *
+     * @return map<Edge, pair<source node, destination node> >
+     */
+    FWDATA_API const ConnectionContainer &getCRefConnections() const;
+    FWDATA_API ConnectionContainer &getRefConnections();
+
+    /**
+     * @brief Add and edge
+     *
+     * @return true if success
+     * @li nodes exist
+     * @li edge is unique
+     * @li port is compatible identifier & type
+     */
+    FWDATA_API bool addEdge(Edge::sptr _edge, Node::csptr _nodeSource, Node::csptr _nodeDestination);
+
+    /**
+     * @brief create an edge from given info and add edge in the graph
+     *
+     * @return new edge created if success else return null one
+     */
+    FWDATA_API
+    Edge::sptr makeConnection(  Node::csptr _nodeSource,
+                                std::string _nodeSourceOutputPortID,
+                                Node::csptr _nodeDestination,
+                                std::string _nodeDestinationInputPortID,
+                                std::string _EdgeNature
+                             );
+
+    /**
+     * @brief remove an edge
+     *
+     * @param[in] _edge edge to be remove
+     * @return true iif success
+     */
+    FWDATA_API bool removeEdge(Edge::sptr _edge);
+
+    /**
+     * @brief Get source node
+     *
+     * @param[in] _edge edge associated with the node
+     */
+    FWDATA_API Node::sptr getSourceNode(Edge::sptr _edge);
+
+    /**
+     * @brief Get destination node
+     *
+     * @param[in] _edge edge associated with the node
+     */
+    FWDATA_API Node::sptr getDestinationNode(Edge::sptr _edge);
+
+    /**
+     * @brief Get node
+     *
+     * @param[in] _edge edge associated with the node
+     * @param[in] _upStream if true return source node, else return destination node
+     *
+     * @return source or destination node if edge exists, else return a new node
+     */
+    FWDATA_API Node::sptr getNode(Edge::sptr _edge, bool _upStream);
+
+    /**
+     * @brief Get input edges
+     *
+     * @param[in] _node source node
+     * @return a vector of edges where _node is source node
+     */
+    FWDATA_API std::vector< Edge::sptr > getInputEdges(Node::csptr _node);
+
+    /**
+     * @brief Get output edges
+     *
+     * @param[in] _node destination node
+     * @return a vector of  edges where _node is destination node
+     */
+    FWDATA_API std::vector< Edge::sptr > getOutputEdges(Node::csptr _node);
+
+    /**
+     * @brief Get a vector of edges
+     *
+     * @param[in] _node node associated with the edges
+     * @param[in] _upStream if true _node is a source node, else _node is a destination node
+     * @param[in] _nature if nature is an empty string : no check on nature of edge
+     * @param[in] _portID if portID not specified (no check) : porID must be an BoolupStream port of given node
+     *
+     * @return the vector of all edges with correct nature and portID where _node is a source/destination node
+     */
+    FWDATA_API std::vector< Edge::sptr > getEdges(const Node::csptr &_node, bool _upStream,
+                                                  const std::string &_nature="",
+                                                  const std::string &_portID="");
+
+    /**
+     * @brief Get a vector of nodes
+     *
+     * @param[in] node node associated with the nodes
+     * @param[in] upStream if true _node is a source node, else _node is a destination node
+     * @param[in] nature if nature is an empty string : no check on nature of edge
+     * @param[in] portID if portID not specified (no check) : porID muts be an BoolupStream port of given node
+     *
+     * @return the vector of all nodes associated with _node
+     */
+    FWDATA_API  std::vector< ::fwData::Node::sptr > getNodes( const ::fwData::Node::csptr &node, bool upStream,
+                                                              const std::string &nature="",
+                                                              const std::string &portID="" );
+
+    /**
+     * @return Number of nodes
+     */
+    FWDATA_API size_t getNbNodes() const;
+
+    /**
+     * @return Number of edges
+     */
+    FWDATA_API size_t getNbEdges() const;
+
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+     * @brief Check if an edge is connected to the node
+     *
+     * @return true if at least one edge is connected to given node
+     */
+    FWDATA_API bool haveConnectedEdges(Node::csptr _node ) const;
+
+    /// Updated signal key
+    FWDATA_API static const ::fwCom::Signals::SignalKeyType s_UPDATED_SIG;
+
+protected :
+
+    NodeContainer m_nodes;
+    ConnectionContainer m_connections;
+
+    /// Updated signal
+    UpdatedSignalType::sptr m_sigUpdated;
+};
+
+}
+
+#endif // _FWDATA_GRAPH_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Histogram.hpp b/SrcLib/core/fwData/include/fwData/Histogram.hpp
new file mode 100644
index 0000000..7163e4e
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Histogram.hpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_HISTOGRAM_HPP_
+#define _FWDATA_HISTOGRAM_HPP_
+
+#include "fwData/factory/new.hpp"
+#include "fwData/Object.hpp"
+
+#include "fwData/config.hpp"
+
+#include <boost/shared_ptr.hpp>
+
+fwCampAutoDeclareDataMacro((fwData)(Histogram), FWDATA_API);
+
+namespace fwData
+{
+
+
+/**
+ * @class   Histogram
+ * @brief   This class defines the histogram of an image.
+ *
+ * 
+ * @date    2011.
+ */
+class FWDATA_CLASS_API Histogram : public Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Histogram)(::fwData::Object), (()), ::fwData::factory::New< Histogram > );
+
+    fwCampMakeFriendDataMacro((fwData)(Histogram));
+
+    typedef std::vector< long > fwHistogramValues;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Histogram(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Histogram();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+     * @brief Add the given pixel value into the histogram.
+     *
+     * This void will chose the right bins where the pixel must be added (if the bins width parameter is greater than 1).
+     *
+     * @param pixel the pixel value to be added into the histogram.
+     */
+    FWDATA_API void addPixel( float pixel );
+
+    /**
+     * @brief Return the number of pixels of the histogram that are within the range defined by the given parameters min and max.
+     *
+     * @param _min lower value of the range
+     * @param _max upper value of the range
+     *
+     * @return number of pixels that are within [_min, _max]
+     */
+    FWDATA_API long getNbPixels( float _min, float _max );
+
+    /**
+     * @brief Initialize the histogram.
+     *
+     * @param min Defines the lower pixel value of the image that this histogram belongs to.
+     * @param max Defines the upper pixel value of the image that this histogram belongs to.
+     * @param binsWidth Defines the desired bins' width in order to classify pixels.
+     */
+    FWDATA_API void initialize( float min, float max, float binsWidth );
+
+    /**
+     * @brief Return true if the given pixel value is set within histogram's boudaries.
+     *
+     * @param _pixel the pixel value
+     *
+     * @return true if the pixel value is set within histogram's boundaries.
+     */
+    FWDATA_API bool isInRange( float _pixel );
+
+    fwGettersSettersDocMacro(BinsWidth, binsWidth, float, bins width);
+    fwGettersSettersDocMacro(Values, values, fwHistogramValues, histogram values);
+    fwGettersSettersDocMacro(MinValue, minValue, float, minimum value within the histogram);
+    fwGettersSettersDocMacro(MaxValue, maxValue, float, maximum value within the histogram);
+
+protected:
+
+    /**
+     * @brief Histogram values.
+     */
+    fwHistogramValues m_values;
+
+    /**
+     * @brief The pixel width of the bins (a default value is set to 1).
+     */
+    float m_binsWidth;
+
+    /**
+     * @brief The minimum pixel value within the histogram (a default value is set to 0).
+     */
+    float m_minValue;
+
+    /**
+     * @brief The maximum pixel value within the histogram (a default value is set to 100).
+     */
+    float m_maxValue;
+};
+
+}
+
+#endif // _FWDATA_HISTOGRAM_HPP_
+
diff --git a/SrcLib/core/fwData/include/fwData/Image.hpp b/SrcLib/core/fwData/include/fwData/Image.hpp
new file mode 100644
index 0000000..dda7982
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Image.hpp
@@ -0,0 +1,206 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_IMAGE_HPP_
+#define _FWDATA_IMAGE_HPP_
+
+#include <vector>
+
+#include <boost/shared_array.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/cstdint.hpp>
+
+#include <fwTools/Type.hpp>
+#include <fwTools/DynamicType.hpp>
+
+#include "fwData/Object.hpp"
+#include "fwData/Array.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Image), FWDATA_API);
+
+
+
+
+namespace fwData
+{
+
+/**
+ * @class   Image
+ * @brief   This class defines an image
+ *
+ * An image contains a buffer and is defined by some parameters (size, spacing, pixel type, ...)
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Image : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Image)(::fwData::Object), (()), ::fwData::factory::New< Image > ) ;
+    fwCoreAllowSharedFromThis();
+    fwCampMakeFriendDataMacro((fwData)(Image));
+
+    /**
+     * @brief Image size type
+     */
+    typedef ::fwData::Array::SizeType SizeType;
+
+    /**
+     * @brief Image spacing type
+     */
+    typedef std::vector< double > SpacingType;
+
+    /**
+     * @brief Image origin type
+     */
+    typedef std::vector< double > OriginType;
+
+    typedef SizeType::value_type IndexType;
+    typedef size_t BufferIndexType;
+    typedef ::boost::uint8_t BufferType;
+    typedef ::boost::shared_array< BufferType > SharedArray;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Image(::fwData::Object::Key key);
+
+    /**
+     * @brief Destructor
+     */
+    FWDATA_API virtual ~Image() throw();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// @brief get image information from source. Informations are spacing,origin,size ... expect Fields
+    FWDATA_API void copyInformation( Image::csptr _source );
+
+    /// Number of dimension of the image (3 for 3D image)
+    FWDATA_API size_t getNumberOfDimensions() const;
+
+    /** @{
+     * @brief get/set image spacing
+     */
+
+    FWDATA_API const SpacingType &getSpacing() const;
+    FWDATA_API void setSpacing(const SpacingType &spacing);
+    // @}
+
+    /** @{
+     * @brief get/set image origin
+     */
+    FWDATA_API const OriginType &getOrigin() const;
+    FWDATA_API void setOrigin(const OriginType &origin);
+    // @}
+
+    /** @{
+     * @brief get/set image size
+     */
+    FWDATA_API const SizeType &getSize() const;
+    FWDATA_API void setSize(const SizeType &size);
+    // @}
+
+    /**
+     * @brief Get/set prefered window center
+     */
+    fwDataGetSetMacro(WindowCenter, double);
+
+    /**
+     * @brief Get/set prefered window width
+     */
+    fwDataGetSetMacro(WindowWidth , double);
+
+
+    /**
+     * @brief Get/set prefered window center
+     */
+    fwDataGetSetMacro(NumberOfComponents, size_t);
+
+    /**
+     * @brief set data array
+     *
+     * @param[in] array data array
+     * @param[in] copyArrayInfo if true, the image will copy the size and type information from the array
+     *
+     */
+    FWDATA_API void setDataArray(::fwData::Array::sptr array, bool copyArrayInfo = true);
+
+    ///get data array
+    FWDATA_API ::fwData::Array::sptr getDataArray() const;
+
+    /** @{
+     * @brief get/set image type
+     */
+    FWDATA_API void setType(::fwTools::Type type);
+    FWDATA_API void setType(const std::string &type);
+    FWDATA_API ::fwTools::Type getType() const;
+    // @}
+
+    /// get a DynamicType for retrocompatibility
+    FWDATA_API ::fwTools::DynamicType getPixelType() const;
+
+    /** @{
+     * @brief Allocate image
+     *
+     * If the data array owns its buffer, these methods will always work (until it remain free memory)
+     * Otherwise an exception is thrown :
+     *  - if m_dataArray does not own it buffer and image's size and type combination do not match anymore array's one
+     *  - if there is no memory left
+     *
+     * @return Allocated size in bytes
+     */
+    FWDATA_API size_t allocate() throw(::fwData::Exception);
+    FWDATA_API size_t allocate(SizeType::value_type x, SizeType::value_type y,  SizeType::value_type z,
+                               const ::fwTools::Type &type, size_t numberOfComponents = 1) throw(::fwData::Exception);
+    FWDATA_API size_t allocate(const SizeType &size, const ::fwTools::Type &type, size_t numberOfComponents = 1)
+        throw(::fwData::Exception);
+    // @}
+
+
+     /// @brief return image size in bytes
+    FWDATA_API size_t getSizeInBytes() const;
+     /// @brief return allocated image size in bytes
+    size_t getAllocatedSizeInBytes() const;
+
+protected :
+
+    //! Size of the image (in terms of points)
+    SizeType m_size;
+
+    //! type of image pixel
+    ::fwTools::Type m_type;
+
+    //! An array on the voxel size of the image
+    SpacingType m_spacing;
+
+    //! Origin of the image in 3D repair
+    OriginType m_origin;
+
+    //! Preferred window center/with
+    ///@{
+    double m_attrWindowCenter;
+    double m_attrWindowWidth;
+    ///@}
+
+    //! Number of components
+    size_t m_attrNumberOfComponents;
+
+    //! image buffer
+    ::fwData::Array::sptr m_dataArray;
+};
+
+
+} // namespace fwData
+
+#endif //_FWDATA_IMAGE_HPP_
+
diff --git a/SrcLib/core/fwData/include/fwData/Integer.hpp b/SrcLib/core/fwData/include/fwData/Integer.hpp
new file mode 100644
index 0000000..74e99e4
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Integer.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_INTEGER_HPP_
+#define _FWDATA_INTEGER_HPP_
+
+#include "fwData/config.hpp"
+#include "fwData/GenericField.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Integer), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @class   Integer
+ * @brief   This class contains an integer value
+ *
+ * Integer object is essentially used as a field in other objects.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Integer : public GenericField< int >
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Integer)(::fwData::Object),( ((const int)(0)) ), GenericFieldFactory< Integer >) ;
+    fwCampMakeFriendDataMacro((fwData)(Integer));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Integer( ::fwData::Object::Key key ) throw();
+
+    /**
+     * @brief Destructor.
+     */
+    FWDATA_API virtual ~Integer() throw();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+};
+
+} // namespace fwData
+
+
+
+#endif // _FWDATA_INTEGER_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Line.hpp b/SrcLib/core/fwData/include/fwData/Line.hpp
new file mode 100644
index 0000000..2f54bf6
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Line.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_LINE_HPP_
+#define _FWDATA_LINE_HPP_
+
+#include <vector>
+#include <utility>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Point.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Line), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Line
+ * @brief   This class defines a Line defined by two points.
+ * @see     ::fwData::Line
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Line : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (Line)(::fwData::Object),
+        (()), ::fwData::factory::New< Line >) ;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Line(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Line();
+
+    fwCampMakeFriendDataMacro((fwData)(Line));
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    FWDATA_API void setValue( ::fwData::Point::sptr _position, ::fwData::Point::sptr  _direction);
+
+    /// Points container
+    fwGettersSettersDocMacro(Position, position, ::fwData::Point::sptr, a point positon);
+    fwGettersSettersDocMacro(Direction, direction, ::fwData::Point::sptr, a point direction);
+
+protected :
+
+    //! Points container
+    ::fwData::Point::sptr m_position;
+    ::fwData::Point::sptr m_direction;
+
+}; // end class Line
+
+} // end namespace fwData
+
+#endif // _FWDATA_LINE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/List.hpp b/SrcLib/core/fwData/include/fwData/List.hpp
new file mode 100644
index 0000000..40fe802
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/List.hpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_LIST_HPP_
+#define _FWDATA_LIST_HPP_
+
+#include <list>
+#include <boost/shared_ptr.hpp>
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(List), FWDATA_API);
+
+namespace fwData
+{
+
+
+
+/**
+ * @class   List
+ * @brief   This class defines a list of objects.
+ *
+ * List contains a list of ::fwData::Object.
+ *
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API List : public Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (List)(::fwData::Object), (()), ::fwData::factory::New< List >) ;
+
+
+    fwCampMakeFriendDataMacro((fwData)(List));
+
+    typedef std::list< Object::sptr > ContainerType;
+
+    typedef ContainerType::value_type ValueType;
+    typedef ContainerType::reference ReferenceType;
+    typedef ContainerType::const_reference ConstReferenceType;
+    typedef ContainerType::iterator IteratorType;
+    typedef ContainerType::const_iterator ConstIteratorType;
+    typedef ContainerType::reverse_iterator ReverseIteratorType;
+    typedef ContainerType::const_reverse_iterator ConstReverseIteratorType;
+    typedef ContainerType::size_type SizeType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API List(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~List();
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef ContainerType::value_type value_type;
+    typedef ContainerType::iterator iterator;
+    typedef ContainerType::const_iterator const_iterator;
+    typedef ContainerType::reverse_iterator reverse_iterator;
+    typedef ContainerType::const_reverse_iterator const_reverse_iterator;
+    typedef ContainerType::size_type size_type;
+
+    typedef List Container;
+
+    IteratorType begin() { return m_attrContainer.begin(); }
+    IteratorType end()   { return m_attrContainer.end(); }
+    ConstIteratorType begin() const { return m_attrContainer.begin(); }
+    ConstIteratorType end()   const { return m_attrContainer.end(); }
+
+    ReverseIteratorType rbegin() { return m_attrContainer.rbegin(); }
+    ReverseIteratorType rend()   { return m_attrContainer.rend(); }
+    ConstReverseIteratorType rbegin() const { return m_attrContainer.rbegin(); }
+    ConstReverseIteratorType rend()   const { return m_attrContainer.rend(); }
+
+    bool empty() const { return m_attrContainer.empty(); }
+    SizeType size() const { return m_attrContainer.size(); }
+
+    ReferenceType front(){ return m_attrContainer.front(); }
+    ReferenceType back(){ return m_attrContainer.back(); }
+    ConstReferenceType front() const{ return m_attrContainer.front(); }
+    ConstReferenceType back() const{ return m_attrContainer.back(); }
+    /// @}
+
+    /// @brief get/set the list of ::fwData::Object
+    /// @{
+    ContainerType &getContainer(){ return m_attrContainer; };
+    fwDataGetSetCRefMacro(Container, ContainerType);
+    /// @}
+
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected:
+
+    ContainerType m_attrContainer;
+};
+}
+
+#endif /* _FWDATA_LIST_HPP_ */
+
diff --git a/SrcLib/core/fwData/include/fwData/Material.hpp b/SrcLib/core/fwData/include/fwData/Material.hpp
new file mode 100644
index 0000000..cded6b2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Material.hpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _DATA_MATERIAL_HPP_
+#define _DATA_MATERIAL_HPP_
+
+
+#include "fwData/Object.hpp"
+#include "fwData/Color.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Material), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Material
+ * @brief   This class defines a material. A material is represented by an ambient color and a diffuse color
+ * @see     ::fwData::Color
+ *
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API Material : public Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Material)(::fwData::Object), (()), ::fwData::factory::New< Material >) ;
+    fwCampMakeFriendDataMacro((fwData)(Material));
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Material(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Material();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+    * @brief returns editable ambient color
+    */
+    FWDATA_API Color::sptr ambient() const;
+
+    /**
+     * @brief Setter for ambient color
+     *
+     * @param ambient color
+     */
+    FWDATA_API void setAmbient(Color::sptr ambient);
+
+    /**
+    * @brief returns editable diffuse color
+    */
+    FWDATA_API Color::sptr diffuse() const;
+
+    /**
+     * @brief Setter for diffuse color
+     *
+     * @param diffuse color
+     */
+    FWDATA_API void setDiffuse(Color::sptr diffuse);
+
+    /**
+     * @brief Options
+     */
+    typedef enum
+    {
+        MODE_STANDARD = 1,
+        MODE_NORMALS  = 2,
+    } OPTIONS_MODE;
+
+    /**
+     * @brief Shading models
+     */
+    typedef enum
+    {
+        MODE_FLAT    = 1,
+        MODE_GOURAUD = 2,//MODE_FLAT<<1 -> 10
+        MODE_PHONG   = 4,//MODE_FLAT<<2 -> 100
+    } SHADING_MODE;
+
+    /**
+     * @brief Representation models
+     */
+    typedef enum
+    {
+        MODE_SURFACE   = 1, //1
+        MODE_POINT     = 2, //MODE_SURFACE<<1 -> 10
+        MODE_WIREFRAME = 4, //MODE_SURFACE<<2 -> 100
+        MODE_EDGE      = 5, //MODE_SURFACE|MODE_WIREFRAME -> 101
+    } REPRESENTATION_MODE;
+
+
+
+
+    fwGettersSettersDocMacro(ShadingMode, shadingMode, SHADING_MODE, the shading models(flat, gouraud, phong).);
+    fwGettersSettersDocMacro(RepresentationMode, representationMode, REPRESENTATION_MODE, the representation models(edge, point, wireframe, surface).);
+    fwGettersSettersDocMacro(OptionsMode, optionsMode, OPTIONS_MODE, the option representation (Standard, normals).);
+
+
+
+protected :
+
+
+    SHADING_MODE m_shadingMode;
+    REPRESENTATION_MODE m_representationMode;
+    OPTIONS_MODE m_optionsMode;
+
+    Color::sptr m_ambient;
+    Color::sptr m_diffuse;
+};
+
+} //namespace fwData
+
+#endif /* _DATA_MATERIAL_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/Mesh.hpp b/SrcLib/core/fwData/include/fwData/Mesh.hpp
new file mode 100644
index 0000000..8c29480
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Mesh.hpp
@@ -0,0 +1,368 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_MESH_HPP_
+#define _FWDATA_MESH_HPP_
+
+#include <camp/class.hpp>
+
+#include <fwCore/macros.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/multi_array.hpp>
+#include "fwData/Array.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/factory/new.hpp"
+
+#include "fwData/config.hpp"
+#include "fwData/Array.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Mesh), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @class   Mesh
+ * @brief   Data holding a geometric structure composed of points, lines,
+ * triangles, quads or polygons
+ * 
+ * @date    2011.
+ *
+ * It is the new structure that represent mesh in fw4spl. For the moment, this new structure is available
+ * to register mesh with triangle cells, with quad cells or with triangle and quad cells. Peharps, in future
+ * work other cell type will be available (ex: POLYGON)
+ *
+ * This structure contains some information stock in ::fwData::Array \n
+ *
+ * An array (m_points) which contains point coord (x,y,z) \n
+ * An array (m_cellTypes) which contains cell type (TRIAN or QUAD for the moment) \n
+ * An array (m_cellData) which contains point indexes in m_points used to create cells, 3 indexes are necessary to create a triangle cell, 4 for quad cell. \n
+ * An array (m_cellDataOffsets) which contains indexes relative to m_cellData, to retrieve the first point necessary to the cell creation. \n
+ *
+ * Example : \n
+ * m_points.size = number of mesh points  * 3 \n
+ * m_points = [ x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3, ... ] \n
+ * m_cellTypes.size = number of mesh cells \n
+ * m_cellTypes = [TRIANGLE, TRIANGLE, QUAD, QUAD, TRIANGLE ... ] \n
+ * m_cellDataOffsets.size = number of mesh cells \n
+ * m_cellDataOffsets = [0, 3, 6, 10, 14, ... ] ( offset shifting in  m_cellData = +3 if triangle cell rr +4 if quad cell ) \n
+ * number of mesh cells * 3 (if only triangle cell) < m_cellData.size < number of mesh cells * 4 (if only quad cell) \n
+ * m_cellData = [0, 1, 2, 0, 1, 3, 0, 1, 3, 5... ] ( correspond to point id ) \n
+ *
+ * Get the points coordinates of the third cell \n
+ * m_cellTypes[2] => cell type = QUAD \n
+ * m_cellDataOffsets[2] => index in m_cellData of cell definition = 6 \n
+ * index of p1 = m_cellData[6] = 0 \n
+ * index of p2 = m_cellData[6+1] = 1 \n
+ * index of p3 = m_cellData[6+2] = 3 \n
+ * index of p4 = m_cellData[6+3] = 5 \n
+ * p1 = [ x0=m_points[0]  y0 z0 ] ( 0 * 3 = 0 ) \n
+ * p2 = [ x1=m_points[3]  y1 z1 ] ( 1 * 3 = 3 ) \n
+ * p3 = [ x3=m_points[9]  y3 z3 ] ( 3 * 3 = 9 ) \n
+ * p4 = [ x5=m_points[15] y5 z5 ] ( 5 * 3 = 15 ) \n
+ *
+ * We have another array to stock normal by points, normal by edges, color by points or color by cells, to short : \n
+ * Normal arrays contains normal vector (x,y,z) \n
+ * normals.size = number of mesh points (respc cells)  * 3 \n
+ * normals = [ x0, y0, z0, x1, y1, z1, x2, y2, z2, x3, y3, z3, ... ] \n
+ * Color arrays contains RGB or RGBA colors ( check the number of components 3 or 4 of array ) \n
+ * colors.size = number of mesh points (respc cells) * 3 (respc 4) \n
+ * colors = [ r0, g0, b0, r1, g1, b1, ... ] \n
+ * or colors = [ r0, g0, b0, a0, r1, g1, b1, a1, ... ] \n
+ */
+class FWDATA_CLASS_API Mesh : public ::fwData::Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Mesh)(::fwData::Object), (()), ::fwData::factory::New< Mesh >) ;
+
+
+    fwCampMakeFriendDataMacro((fwData)(Mesh));
+
+
+    typedef std::map< std::string, ::fwData::Array::sptr > ArrayMapType;
+    typedef boost::uint64_t Id;
+
+
+    typedef enum {
+        NO_CELL = 0,
+        POINT,
+        EDGE,
+        TRIANGLE,
+        QUAD,
+        POLY,
+        TETRA
+    } CellTypesEnum;
+
+    typedef enum {
+        RGB = 3,
+        RGBA = 4
+    } ColorArrayTypes;
+
+    typedef float          PointValueType;
+    typedef boost::uint8_t ColorValueType;
+    typedef float          NormalValueType;
+    typedef Id             CellValueType;
+    typedef Id             CellDataOffsetType;
+    typedef boost::uint8_t CellTypes;
+
+    typedef boost::multi_array_ref<PointValueType    , 2> PointsMultiArrayType;
+    typedef boost::multi_array_ref<CellTypes         , 1> CellTypesMultiArrayType;
+    typedef boost::multi_array_ref<CellValueType     , 1> CellDataMultiArrayType;
+    typedef boost::multi_array_ref<CellDataOffsetType, 1> CellDataOffsetsMultiArrayType;
+    typedef boost::multi_array_ref<ColorValueType    , 2> PointColorsMultiArrayType;
+    typedef boost::multi_array_ref<ColorValueType    , 2> CellColorsMultiArrayType;
+    typedef boost::multi_array_ref<NormalValueType   , 2> PointNormalsMultiArrayType;
+    typedef boost::multi_array_ref<NormalValueType   , 2> CellNormalsMultiArrayType;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Mesh(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Mesh() ;
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+
+    /**
+     * @brief Allocate Mesh memory
+     *
+     * Initializes points, cell-types, cell-data, and cell-data-offsets arrays
+     * with informations given by the parameters. if nbCellData is zero, it
+     * will be initialized to 3*nbCells
+     * @param nbPts
+     * @param nbCells
+     * @param nbCellsData
+     *
+     * @return
+     *
+     * @throw ::fwData::Exception
+     */
+    FWDATA_API size_t allocate(size_t nbPts, size_t nbCells, size_t nbCellsData = 0)
+        throw(::fwData::Exception);
+
+    /// Allocates normals array according to the number of points of the mesh.
+    FWDATA_API size_t allocatePointNormals() throw(::fwData::Exception);
+
+    /// Allocates colors array according to the number of points of the mesh.
+    FWDATA_API size_t allocatePointColors(ColorArrayTypes t) throw(::fwData::Exception);
+
+    /// Allocates normals array according to the number of cells of the mesh.
+    FWDATA_API size_t allocateCellNormals() throw(::fwData::Exception);
+
+    /// Allocates colors array according to the number of cells of the mesh.
+    FWDATA_API size_t allocateCellColors(ColorArrayTypes t) throw(::fwData::Exception);
+
+
+    /**
+     * @brief Adjust mesh memory usage
+     *
+     * The array (points, cell-types, cell-data, cell-data-offsets, and if they
+     * exists point-colors/normals and cell-colors/normals) will be resized
+     * according to the number of points and cells of the mesh (they may have
+     * been defined before adjusting by setNumberOfPoints or setNumberOfCells).
+     * Arrays in array-map are not impacted by this method.
+     *
+     * @return true if memory usage changed
+     *
+     * @throw ::fwData::Exception
+     */
+    FWDATA_API bool adjustAllocatedMemory() throw(::fwData::Exception);
+
+    /// Sets the internal corresponding array
+    FWDATA_API void setPointsArray           (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setCellTypesArray        (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setCellDataArray         (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setCellDataOffsetsArray  (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setPointColorsArray      (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setCellColorsArray       (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setPointNormalsArray     (::fwData::Array::sptr array);
+    /// Sets the internal corresponding array
+    FWDATA_API void setCellNormalsArray      (::fwData::Array::sptr array);
+
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getPointsArray           () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getCellTypesArray        () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getCellDataArray         () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getCellDataOffsetsArray  () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getPointColorsArray      () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getCellColorsArray       () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getPointNormalsArray     () const;
+    /// Returns the internal corresponding array
+    FWDATA_API ::fwData::Array::sptr getCellNormalsArray      () const;
+
+    /**
+     * @brief Clear mesh points.
+     * Calling this method don't impact memory allocation.
+     */
+    FWDATA_API void clearPoints();
+
+    /**
+     * @brief Clear mesh cells.
+     * Calling this method don't impact memory allocation.
+     */
+    FWDATA_API void clearCells();
+
+    /**
+     * @brief Remove all data contained in the mesh. Memory is freed.
+     */
+    FWDATA_API void clear();
+
+    /// Remove corresponding array, memory is freed.
+    FWDATA_API void clearPointNormals();
+    /// Remove corresponding array, memory is freed.
+    FWDATA_API void clearPointColors();
+    /// Remove corresponding array, memory is freed.
+    FWDATA_API void clearCellNormals();
+    /// Remove corresponding array, memory is freed.
+    FWDATA_API void clearCellColors();
+
+
+    /// Set number of points.
+    FWDATA_API void setNumberOfPoints(Id nb);
+
+    /// Get number of points.
+    FWDATA_API Id getNumberOfPoints() const;
+
+    /// Set number of cells.
+    FWDATA_API void setNumberOfCells(Id nb);
+
+    /// Get number of cells.
+    FWDATA_API Id getNumberOfCells() const;
+
+    /// Set cell data size.
+    FWDATA_API void setCellDataSize(Id nb);
+
+    /// Get cell data size.
+    FWDATA_API Id getCellDataSize() const;
+
+
+    /**
+     * @brief Get the mesh data size in bytes.
+     *
+     * @return Mesh data size in bytes
+     */
+    FWDATA_API size_t getDataSizeInBytes() const;
+
+    /**
+     * @brief Get the amount of memory allocated in this mesh. Mey be bigger
+     * than getDataSizeInBytes().
+     *
+     * @return Mesh data size in bytes
+     */
+    FWDATA_API size_t getAllocatedSizeInBytes() const;
+
+    /// Add an array in the mesh array-map
+    FWDATA_API void addDataArray(const std::string &name, ::fwData::Array::sptr array);
+
+    /// Get an array in the mesh array-map
+    FWDATA_API ::fwData::Array::sptr getDataArray(const std::string &name) const;
+
+    /// Remove an array in the mesh array-map
+    FWDATA_API void removeDataArray(const std::string &name);
+
+    /// Return all array names stock in the mesh array-map
+    FWDATA_API std::vector<std::string> getDataArrayNames() const;
+
+protected:
+
+    /**
+     * @brief Initializes points, cell-types, cell-data, and cell-data-offsets arrays.
+     */
+    FWDATA_API void initArrays();
+
+    /// Number of points defined for the mesh
+    Id m_nbPoints;
+
+    /// Number of cells defined for the mesh
+    Id m_nbCells;
+
+    /// Number of point index defined for mesh (size of m_cellData)
+    Id m_cellsDataSize;
+
+    /**
+     * @brief Mesh point array : 3-components 1-dimension float array, size = m_nbPoints x 3.
+     *
+     * This array contains points : [ x1 y1 z1 x2 y2 z2 ... xn yn zn ]
+     */
+    ::fwData::Array::sptr m_points;
+    /**
+     * @brief Cell types array : 1-components 1-dimension uint8 array, size = m_nbCells.
+     *
+     * This array each cell type : [ TRIANGLE QUAD QUAD ... TRIANGLE TRIANGLE QUAD ]
+     */
+    ::fwData::Array::sptr m_cellTypes;
+    /**
+     * @brief Cell data array : 1-components 1-dimension uint64 array, size = m_cellsDataSize.
+     *
+     * Contains cell data : cell points ids are contiguously stored regardless
+     * of the cell type. Size depends of cell type. If we have only TRIANGLE type, size = m_nbCells x 3.
+     *
+     * This array contains point indexes (index in m_points) : [ TRIAN_ID1, TRIAN_ID2, TRIAN_ID3, QUAD_ID1, QUAD_ID2, QUAD_ID3, QUAD_ID4, ... ]
+     */
+    ::fwData::Array::sptr m_cellData;
+    /**
+     * @brief Cell data offsets array : 1-components 1-dimension uint64 array, size = m_nbCells.
+     *
+     * Contains cell data offsets : for each cell, gives the offset of
+     * the first item of this cell in m_cellData.
+     *
+     * This array contains cell indexes m_cellData : [ INDEX_TRIAN_1, INDEX_QUAD_1, INDEX_QUAD_2 ...  ]
+     */
+    ::fwData::Array::sptr m_cellDataOffsets;
+    /**
+     * @brief point colors array : 3 or 4-components 1-dimension float array, size = m_nbPoints.
+     *
+     * This array contains point colors : [ R1 G1 B1 R2 G2 B2 ... ] or [ R1 G1 B1 A1 R2 G2 B2 A2 ... ]
+     */
+    ::fwData::Array::sptr m_pointColors;
+    /**
+     * @brief Mesh point array : 3 or 4-components 1-dimension uint8_t array, size = m_nbCells.
+     *
+     * This array contains cell colors : [ R1 G1 B1 R2 G2 B2 ... ] or [ R1 G1 B1 A1 R2 G2 B2 A2 ... ]
+     */
+    ::fwData::Array::sptr m_cellColors;
+    /**
+     * @brief Mesh point array : 3-components 1-dimension uint8_t array, size = m_nbPoints.
+     *
+     * This array contains point normals : [ nx1 ny1 nz1 nx2 ny2 nz2 ... ]
+     */
+    ::fwData::Array::sptr m_pointNormals;
+    /**
+     * @brief Mesh point array : 3-components 1-dimension float array, size = m_nbCells.
+     *
+     * This array contains cell normals : [ nx1 ny1 nz1 nx2 ny2 nz2 ... ]
+     */
+    ::fwData::Array::sptr m_cellNormals;
+
+    /// Array map where you can add few additional arrays registered thanks to a key to perform/conserve some specific analysis.
+    ArrayMapType m_arrayMap;
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_MESH_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Model.hpp b/SrcLib/core/fwData/include/fwData/Model.hpp
new file mode 100644
index 0000000..03a3677
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Model.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_MODEL_HPP_
+#define _FWDATA_MODEL_HPP_
+
+#include <map>
+#include <boost/shared_ptr.hpp>
+
+#include "fwData/config.hpp"
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/TriangularMesh.hpp"
+#include "fwData/Material.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Model), FWDATA_API);
+
+namespace fwData
+{
+
+
+/**
+ * @class   Model
+ * @brief   This model class focusses on 3D model such as meshes
+ *
+ * A model is represented by a triangular mesh and a material
+ *
+ * @see     ::fwData::TriangularMesh, ::fwData::Material
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Model : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Model)(::fwData::Object), (()), ::fwData::factory::New< Model >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Model));
+
+    /// mesh and material container
+    typedef std::map< ::fwData::TriangularMesh::sptr , ::fwData::Material::sptr  > Container ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Model(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~Model() throw();
+
+    /**
+     * @brief returns editable mesh container
+     */
+    FWDATA_API Container &getRefMap() ;
+
+    /**
+     * @brief returns read-only mesh container
+     */
+    FWDATA_API const Container &getCRefMap() const ;
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected:
+
+    Container m_map;
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_MODEL_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Namespace.hpp b/SrcLib/core/fwData/include/fwData/Namespace.hpp
new file mode 100644
index 0000000..c5fefc8
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATANAMESPACE_HPP_
+#define FWDATANAMESPACE_HPP_
+
+/**
+ * @brief       This namespace fwData contains the representation of the data objects used in the framework.
+ * @namespace   fwData
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwData
+{
+}
+#endif /* FWDATANAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/Node.hpp b/SrcLib/core/fwData/include/fwData/Node.hpp
new file mode 100644
index 0000000..18fce3f
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Node.hpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_NODE_HPP_
+#define _FWDATA_NODE_HPP_
+
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/Port.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Node), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Node
+ * @brief   This class defines a node
+ *
+ * A node is represented by input and output ports.
+ *
+ * @see     ::fwData::Port
+ *
+ *
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Node : public ::fwData::Object
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Node)(::fwData::Object), (()), ::fwData::factory::New< Node >) ;
+    fwCampMakeFriendDataMacro((fwData)(Node));
+
+    /// Port container
+    typedef std::vector< ::fwData::Port::sptr > PortContainer;
+
+    /// Type of 'updated' signal
+    typedef ::fwCom::Signal< void () > UpdatedSignalType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Node(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Node();
+
+    /// Add an input port
+    FWDATA_API void addInputPort(::fwData::Port::sptr port);
+
+    /// Add an output port
+    FWDATA_API void addOutputPort(::fwData::Port::sptr port);
+
+    /// Get the container of input ports
+    FWDATA_API PortContainer & getInputPorts();
+
+    /// Get the container of output ports
+    FWDATA_API PortContainer & getOutputPorts();
+
+    /// Set object to the node
+    FWDATA_API void setObject( ::fwData::Object::sptr object );
+
+    /// Get node object
+    FWDATA_API ::fwData::Object::sptr getObject() const;
+
+    /**
+     * @brief Get the port with given identifier
+     *
+     * @param[in] _identifier port identifier
+     * @param[in] _modeInput if true find input port, else find output port
+     *
+     * @return input or output port with given identifier
+     */
+    FWDATA_API Port::sptr findPort(const std::string &_identifier, /*const std::string &type,*/ bool _modeInput) const;
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Updated signal key
+    FWDATA_API static const ::fwCom::Signals::SignalKeyType s_UPDATED_SIG;
+
+protected :
+
+    /// node object
+    ::fwData::Object::sptr m_object;
+
+    //! Input port container
+    PortContainer m_inputs;
+
+    //! Output port container
+    PortContainer m_outputs;
+
+    /// Updated signal
+    UpdatedSignalType::sptr m_sigUpdated;
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_NODE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Object.hpp b/SrcLib/core/fwData/include/fwData/Object.hpp
new file mode 100644
index 0000000..3ba775a
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Object.hpp
@@ -0,0 +1,315 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_OBJECT_HPP_
+#define _FWDATA_OBJECT_HPP_
+
+#include <boost/unordered_map.hpp>
+#include <string>
+
+#include <boost/enable_shared_from_this.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include <fwCamp/macros.hpp>
+#include <fwCamp/camp/customtype.hpp>
+#include <fwCamp/camp/MapProperty.hpp>
+#include <fwCamp/camp/MapMapper.hpp>
+#include <fwCamp/camp/MapValueMapper.hpp>
+#include <fwCamp/Mapper/ArrayMapper.hpp>
+#include <fwCamp/camp/detail/MapPropertyImpl.hpp>
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/DynamicAttributes.hxx>
+
+#include <fwCom/HasSignals.hpp>
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+
+#include "fwData/factory/new.hpp"
+#include "fwData/registry/detail.hpp"
+
+#include "fwData/macros.hpp"
+#include "fwData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Object), FWDATA_API);
+
+fwCorePredeclare( (fwServices)(ObjectMsg) );
+
+namespace fwData
+{
+
+
+/**
+ * @brief   Base class for each data object.
+ * Each object can optionally embed sub-object with string identifier. We name this concept a Field.
+ * An Object containing a field name "dummy" corresponds to having a labeledObject with label "dummy" and
+ * containing a specific Object. When accessing to this object with getField("dummy") we get the specific Object
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Object  : public ::fwTools::Object, public ::fwTools::DynamicAttributes< ::fwData::Object >,
+                                 public ::fwCom::HasSignals
+{
+public:
+
+    typedef ::fwData::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwData::registry::get()->addFactory(T::classname(), &::fwData::factory::New<T>);
+        }
+    };
+
+
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (Object)(::fwTools::Object) );
+    fwCoreAllowSharedFromThis();
+    fwCampMakeFriendDataMacro((fwData)(Object));
+
+    typedef std::string FieldNameType;
+    typedef std::vector<FieldNameType> FieldNameVectorType;
+    typedef ::boost::unordered_map< FieldNameType, ::fwData::Object::sptr > FieldMapType;
+
+    typedef ::boost::unordered_map< ::fwData::Object::csptr, ::fwData::Object::sptr > DeepCopyCacheType;
+
+    /**
+     * @brief Returns a pointer of corresponding field (null if non exist).
+     * @param[in] name Field name
+     * @param[in] defaultValue Default value
+     * @return defaultValue if field is not found
+     */
+    FWDATA_API ::fwData::Object::sptr getField( const FieldNameType & name, ::fwData::Object::sptr defaultValue = ::fwData::Object::sptr() ) const;
+
+    /**
+     * @brief Returns a pointer of corresponding field.
+     * @param[in] name Field name
+     * @return pointer to corresponding field, nullptr if field is not found.
+     */
+    template< typename DATA_TYPE >
+    SPTR(DATA_TYPE) getField( const FieldNameType& name ) const;
+
+    /**
+     * @brief Returns a pointer of corresponding field.
+     * @param[in] name Field name
+     * @param[in] defaultValue Default value
+     * @return pointer to corresponding field, defaultValue if field is not found.
+     */
+    template< typename DATA_TYPE >
+    SPTR(DATA_TYPE) getField( const FieldNameType& name, SPTR(DATA_TYPE) defaultValue ) const;
+
+    /**
+     * @brief Returns a pointer of corresponding field. If field did not exist, it is set to defaultValue if defaultValue is not null.
+     * @param[in] name Field name
+     * @param[in] defaultValue default return value if field was not found
+     * @return pointer to corresponding field.
+     */
+    template< typename DATA_TYPE >
+    SPTR(DATA_TYPE) setDefaultField( const FieldNameType& name, SPTR(DATA_TYPE) defaultValue );
+
+    /**
+     * @brief Returns a pointer of corresponding field (null if non exist).
+     * @param[in] name Field name
+     * @return null sptr if field is not found
+     */
+    FWDATA_API ::fwData::Object::csptr getConstField( const FieldNameType & name ) const;
+
+    /**
+     * @brief Returns fields map.
+     */
+    FWDATA_API const FieldMapType& getFields() const;
+
+    /**
+     * @brief Returns vector of field names.
+     */
+    FWDATA_API FieldNameVectorType getFieldNames() const;
+
+    /**
+     * @brief Register field with specified name. If the name does already exist, the matching field will be replaced.
+     * @param[in] name Field name
+     * @param[in] obj  Field
+     */
+    FWDATA_API void setField( const FieldNameType & name, ::fwData::Object::sptr obj );
+
+    /**
+     * @brief Replace the field map content.
+     */
+    FWDATA_API void setFields( const FieldMapType & fieldMap );
+
+    /**
+     * @brief Removes field with specified name.
+     * @param[in] name Field name
+     */
+    FWDATA_API void removeField( const FieldNameType & name ) ;
+
+    /**
+     * @brief Updates the field map content with fieldMap. Duplicated name will be replaced.
+     */
+    FWDATA_API void updateFields( const FieldMapType & fieldMap );
+
+    /**
+     * @brief A shallow copy of fields (objects in m_children)
+     * @param[in] source source of the copy.
+     */
+    FWDATA_API virtual void shallowCopy( const ::fwData::Object::csptr &source );
+
+    /**
+     * @brief Make a deep copy from the source
+     * Calling this method may invalidate any DumpLock, RescursiveLock or helper
+     * on the object. Prefer using fwData::Object::copy instead.
+     */
+    FWDATA_API void deepCopy( const ::fwData::Object::csptr &source );
+
+    /**
+     * @brief return a copy of the source. if source is a null pointer, return a null pointer.
+     * @{
+     */
+    FWDATA_API static ::fwData::Object::sptr copy(const ::fwData::Object::csptr &source);
+    template <typename DATA_TYPE>
+    static SPTR(DATA_TYPE) copy(const CSPTR(DATA_TYPE) &source);
+    template <typename DATA_TYPE>
+    static SPTR(DATA_TYPE) copy(const SPTR(DATA_TYPE) &source);
+    /** @} */
+
+    /**
+     * @brief A shallow copy of fields (objects in m_children)
+     * @param[in] source source of the copy.
+     */
+    FWDATA_API void fieldShallowCopy( const ::fwData::Object::csptr &source );
+
+    /**
+     * @brief A deep copy of fields (objects in m_children)
+     * @param[in] source source of the copy.
+     */
+    FWDATA_API void fieldDeepCopy( const ::fwData::Object::csptr &source );
+
+    //-----------------------------------------------------------------------------
+
+    /// Returns the object's mutex.
+    ::fwCore::mt::ReadWriteMutex &getMutex() { return m_mutex; }
+
+    FWDATA_API virtual ~Object() ;
+
+    /// Type of signal m_sigObjectModified
+    typedef ::fwCom::Signal< void ( CSPTR( ::fwServices::ObjectMsg ) ) > ObjectModifiedSignalType;
+
+    /// Key in m_signals map of signal m_sigObjectModified
+    FWDATA_API static const ::fwCom::Signals::SignalKeyType s_OBJECT_MODIFIED_SIG;
+
+#ifdef COM_LOG
+    /**
+      * @brief Set a newID  for the object, the oldest one is released.
+      * @warning Cannot set a empty ID.
+      * @note This method is thread-safe. This method is used to better trace communication between signals and slots
+      */
+    FWDATA_API void setID( ::fwTools::fwID::IDType newID );
+#endif
+
+protected:
+
+    FWDATA_API Object();
+
+    /**
+     * @brief Internal-use methods to implement Object's deepCopy
+     * @{
+     */
+    FWDATA_API static ::fwData::Object::sptr copy(const ::fwData::Object::csptr &source, DeepCopyCacheType &cache);
+    FWDATA_API void fieldDeepCopy( const ::fwData::Object::csptr &source, DeepCopyCacheType &cache );
+    FWDATA_API virtual void cachedDeepCopy(const ::fwData::Object::csptr &source, DeepCopyCacheType &cache) = 0;
+    template <typename DATA_TYPE>
+    static SPTR(DATA_TYPE) copy(const CSPTR(DATA_TYPE) &source, DeepCopyCacheType &cache);
+    template <typename DATA_TYPE>
+    static SPTR(DATA_TYPE) copy(const SPTR(DATA_TYPE) &source, DeepCopyCacheType &cache);
+    /** @} */
+
+    /// Fields
+    FieldMapType m_fields;
+
+    /// Mutex to protect object access.
+    ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    /// Signal that emits ObjectMsg when object is modified
+    ObjectModifiedSignalType::sptr m_sigObjectModified;
+};
+
+
+template <typename DATA_TYPE>
+SPTR(DATA_TYPE) Object::copy(const CSPTR(DATA_TYPE) &source, DeepCopyCacheType &cache)
+{
+    return DATA_TYPE::dynamicCast( ::fwData::Object::copy(::fwData::Object::csptr(source), cache) );
+}
+
+
+template <typename DATA_TYPE>
+SPTR(DATA_TYPE) Object::copy(const SPTR(DATA_TYPE) &source, DeepCopyCacheType &cache)
+{
+    return DATA_TYPE::dynamicCast( ::fwData::Object::copy(::fwData::Object::csptr(source), cache) );
+}
+
+template <typename DATA_TYPE>
+SPTR(DATA_TYPE) Object::copy(const CSPTR(DATA_TYPE) &source)
+{
+    return DATA_TYPE::dynamicCast( ::fwData::Object::copy(::fwData::Object::csptr(source)) );
+}
+
+template <typename DATA_TYPE>
+SPTR(DATA_TYPE) Object::copy(const SPTR(DATA_TYPE) &source)
+{
+    return DATA_TYPE::dynamicCast( ::fwData::Object::copy(::fwData::Object::csptr(source)) );
+}
+
+//-----------------------------------------------------------------------------
+
+template< typename DATA_TYPE >
+SPTR(DATA_TYPE) Object::getField( const FieldNameType& name ) const
+{
+    ::fwData::Object::sptr field;
+    field = this->getField( name, field );
+    SPTR(DATA_TYPE) result  = DATA_TYPE::dynamicCast( field );
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+template< typename DATA_TYPE >
+SPTR(DATA_TYPE) Object::getField( const FieldNameType& name, SPTR(DATA_TYPE) defaultValue ) const
+{
+    ::fwData::Object::sptr field = defaultValue;
+    field = this->getField( name, field );
+    SPTR(DATA_TYPE) result  = DATA_TYPE::dynamicCast( field );
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+template< typename DATA_TYPE >
+SPTR(DATA_TYPE) Object::setDefaultField( const FieldNameType& name, SPTR(DATA_TYPE) defaultValue )
+{
+    SPTR(DATA_TYPE) result = getField< DATA_TYPE >(name);
+    if( !result && defaultValue)
+    {
+        result = defaultValue;
+        this->setField(name, defaultValue);
+    }
+    return result;
+}
+
+} // namespace fwData
+
+#endif //_FWDATA_OBJECT_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/ObjectLock.hpp b/SrcLib/core/fwData/include/fwData/ObjectLock.hpp
new file mode 100644
index 0000000..d32ee94
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/ObjectLock.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_OBJECTLOCK_HPP_
+#define _FWDATA_OBJECTLOCK_HPP_
+
+#include <vector>
+
+#include "fwData/Image.hpp"
+#include "fwData/Array.hpp"
+#include "fwData/Mesh.hpp"
+#include "fwData/Reconstruction.hpp"
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+
+
+/**
+ * @class  ObjectLock
+ * @brief  A simple helper to lock specific object, manages : Image, Mesh and Array.
+ * 
+ * @date   2007-2012.
+ */
+class FWDATA_CLASS_API ObjectLock
+{
+
+public :
+
+    ObjectLock(){}
+
+    FWDATA_API ObjectLock( const ObjectLock & );
+    FWDATA_API ObjectLock( ::fwData::Object::sptr obj );
+
+    FWDATA_API ~ObjectLock();
+
+    FWDATA_API ObjectLock & operator=(const ObjectLock & );
+private :
+
+
+    typedef std::vector< ::fwMemory::BufferObject::Lock > LocksType;
+    typedef std::vector< ::fwData::Object::sptr > ObjectsType;
+
+    void lock( ::fwData::Array::sptr array, LocksType & locks );
+    void lock( ::fwData::Image::sptr image, LocksType & locks );
+    void lock( ::fwData::Mesh::sptr mesh, LocksType & locks );
+    void lock( ::fwData::Reconstruction::sptr rec, LocksType & locks );
+
+    LocksType m_locks;
+    ObjectsType m_objects;
+};
+
+} // fwData
+
+#endif // _FWDATA_OBJECTLOCK_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Plane.hpp b/SrcLib/core/fwData/include/fwData/Plane.hpp
new file mode 100644
index 0000000..2d2606f
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Plane.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_PLANE_HPP_
+#define _FWDATA_PLANE_HPP_
+
+#include <vector>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Point.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Plane), FWDATA_API);
+namespace fwData
+{
+/**
+ * @class   Plane
+ * @brief   This class defines a plane defined by tree points.
+ * @see     ::fwData::Point
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Plane : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (Plane)(::fwData::Object),
+        (()), ::fwData::factory::New< Plane >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Plane));
+
+    typedef ::boost::array< ::fwData::Point::sptr, 3> PointContainer;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Plane(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Plane();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /*
+     * @brief Compare method
+     *
+     * Compare plane normal and distance from origin
+     */
+    FWDATA_API bool operator==( const Plane & _plane ) ;
+
+    /// get the plane coordinate
+    fwPlane getPlane() const {return m_plane;};
+
+    /// Re-initialize the plane with 3 points
+    FWDATA_API void setValue(::fwData::Point::sptr _point1, ::fwData::Point::sptr _point2, ::fwData::Point::sptr _point3);
+
+    /// Compute plane normal and distance from points coordinates
+    FWDATA_API void computePlaneFromPoints();
+
+    /// Points container
+    fwGettersSettersDocMacro(Points, vPoints, PointContainer, a container of all points);
+
+    fwGettersSettersDocMacro(IsIntersection, isIntersection, bool, flag if the plane is an intersection one (else an union one));
+
+protected :
+
+    fwPlane m_plane;
+    //! Points container
+    PointContainer m_vPoints;
+
+    //! flag if the plane is an intersection (else an union)
+    bool m_isIntersection;
+
+}; // end class Plane
+
+} // end namespace fwData
+
+#endif // _FWDATA_PLANE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/PlaneList.hpp b/SrcLib/core/fwData/include/fwData/PlaneList.hpp
new file mode 100644
index 0000000..492565c
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/PlaneList.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_PLANELIST_HPP_
+#define _FWDATA_PLANELIST_HPP_
+
+#include <vector>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Plane.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(PlaneList), FWDATA_API);
+namespace fwData
+{
+/**
+ * @class   PlaneList
+ * @brief   This class defines a list of planes
+ * @see     ::fwData::Point
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API PlaneList : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (PlaneList)(::fwData::Object),
+        (()), ::fwData::factory::New< PlaneList >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(PlaneList));
+
+    typedef std::vector< ::fwData::Plane::sptr > PlaneListContainer;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API PlaneList(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~PlaneList();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    // Looking for duplicate plan
+    FWDATA_API void deleteDuplicatedPlan(void);
+
+    /// Planes container
+    fwGettersSettersDocMacro(Planes, vPlanes, PlaneListContainer, a container of all planes);
+
+protected :
+
+    //! Planes container
+    PlaneListContainer m_vPlanes;
+
+}; // end class PlaneList
+
+} // end namespace fwData
+
+#endif // _FWDATA_PLANELIST_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Point.hpp b/SrcLib/core/fwData/include/fwData/Point.hpp
new file mode 100644
index 0000000..d7a0bd2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Point.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_POINT_HPP_
+#define _FWDATA_POINT_HPP_
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Point), FWDATA_API);
+
+
+namespace fwData
+{
+/**
+ * @class   Point
+ * @brief   This class define a 3D point.
+ * 
+ * @date    2007-2009.
+ */
+
+
+class FWDATA_CLASS_API Point : public Object
+{
+
+public :
+
+    fwCoreClassDefinitionsWithNFactoriesMacro( (Point)(::fwData::Object),
+       ((::fwData::factory::New< Point > ,() ))
+       ((PointFactory ,((float)) ((float)(0.0)) ((float) (0.0)) ))
+       ((PointFactory ,((Point::sptr)) ))
+       );
+
+    fwCampMakeFriendDataMacro((fwData)(Point));
+
+    typedef double PointCoordType;
+    typedef fwVec3d PointCoordArrayType;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Point(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Point();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Coordinates of point
+    fwGettersSettersDocMacro(Coord, vCoord, fwVec3d, point coordinates. );
+
+protected :
+
+    /// Point factory
+    FWDATA_API static Point::sptr PointFactory(float x, float y, float z);
+    FWDATA_API static Point::sptr PointFactory( Point::sptr p );
+
+    /// point coordinates
+    PointCoordArrayType m_vCoord;
+
+}; // end class Point
+
+} // end namespace fwData
+
+#endif // _FWDATA_POINT_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/PointList.hpp b/SrcLib/core/fwData/include/fwData/PointList.hpp
new file mode 100644
index 0000000..ef3a7b7
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/PointList.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_POINT_LIST_HPP_
+#define _FWDATA_POINT_LIST_HPP_
+
+#include <vector>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Point.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(PointList), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   PointList
+ * @brief   This class defines a list of points
+ * @see     ::fwData::Point
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API PointList : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (PointList)(::fwData::Object),
+        (()), ::fwData::factory::New< PointList >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(PointList));
+
+    typedef std::vector< ::fwData::Point::sptr > PointListContainer;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API PointList(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~PointList();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Points container
+    fwGettersSettersDocMacro(Points, vPoints, PointListContainer, a container of all points);
+
+protected :
+
+    //! Points container
+    PointListContainer m_vPoints;
+
+}; // end class PointList
+
+} // end namespace fwData
+
+#endif // _FWDATA_POINT_LIST_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Port.hpp b/SrcLib/core/fwData/include/fwData/Port.hpp
new file mode 100644
index 0000000..cdd31d0
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Port.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_PORT_HPP_
+#define _FWDATA_PORT_HPP_
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Port), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Port
+ * @brief   A port is defined by an identifier and a type.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Port : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Port)(::fwData::Object), (()), ::fwData::factory::New< Port >) ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Port(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Port();
+
+    fwGettersSettersDocMacro(Identifier, identifier, std::string,the port identifier (example : "ID_SIZEX", "THRESHOLD_LOW") );
+
+    fwGettersSettersDocMacro(Type, type, std::string, the port type (example : "Image", "Mesh", a %data className));
+
+    fwCampMakeFriendDataMacro((fwData)(Port));
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected :
+
+    //! port identifier
+    std::string  m_identifier; // example "ID_SIZEX", "THRESHOLD_LOW"
+    //! port type
+    std::string  m_type ; // example "Image, Mesh" un className de data
+};
+
+}
+
+#endif // _FWDATA_PORT_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/ProcessObject.hpp b/SrcLib/core/fwData/include/fwData/ProcessObject.hpp
new file mode 100644
index 0000000..9ee4a6e
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/ProcessObject.hpp
@@ -0,0 +1,175 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_PROCESSOBJECT_HPP_
+#define _FWDATA_PROCESSOBJECT_HPP_
+
+#include <map>
+#include <vector>
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCorePredeclare( (fwData)(Field) );
+
+
+fwCampAutoDeclareDataMacro((fwData)(ProcessObject), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   ProcessObject
+ * @brief   Provides the notion of Process Object: object having inputs and outputs
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API ProcessObject : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ProcessObject)(::fwData::Object), (()), ::fwData::factory::New< ProcessObject >) ;
+
+
+    fwCampMakeFriendDataMacro((fwData)(ProcessObject));
+
+    typedef std::string ParamNameType;
+    typedef std::vector<std::string> ParamNameVectorType;
+    typedef std::map< ParamNameType, ::fwData::Object::sptr > ProcessObjectMapType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API ProcessObject(::fwData::Object::Key key) ;
+
+    /**
+     * @brief   Destructor
+     */
+    FWDATA_API virtual ~ProcessObject();
+
+    /**
+     * @brief Retrieves the input data associated with specified name (null if non exist).
+     * @param[in] name Input name
+     * @return null sptr if input is not found
+     */
+    FWDATA_API ::fwData::Object::sptr getInput(const ParamNameType& name);
+
+    /**
+     * @brief Retrieves the input data associated with specified name type OBJECTTYPE (null if non exist).
+     * @param[in] name Input name
+     * @return null sptr if input is not found
+     */
+    template< class OBJECTTYPE >
+    typename OBJECTTYPE::sptr getInput(const ParamNameType& name)
+    {
+        return OBJECTTYPE::dynamicCast( this->getInput( name ) ) ;
+    }
+
+    /**
+     * @brief Retrieves the output data associated with specified name (null if non exist).
+     * @param[in] name Output name
+     * @return null sptr if output is not found
+     */
+    FWDATA_API ::fwData::Object::sptr getOutput(const ParamNameType& name);
+
+    /**
+     * @brief Retrieves the output data associated with specified name type OBJECTTYPE (null if non exist).
+     * @param[in] name Output name
+     * @return null sptr if output is not found
+     */
+    template< class OBJECTTYPE >
+    typename OBJECTTYPE::sptr getOutput(const ParamNameType& name)
+    {
+        return OBJECTTYPE::dynamicCast( this->getOutput( name ) ) ;
+    }
+
+    /// Retrieve the input data
+    fwDataGetSetCRefMacro(Inputs, ProcessObjectMapType);
+
+    /// Retrieve the output data
+    fwDataGetSetCRefMacro(Outputs, ProcessObjectMapType);
+
+    /**
+     * @brief Register input value with specified name.
+     * If the name does already exist, the matching value will be replaced.
+     * @param[in] name Input name
+     * @param[in] object  Input value
+     */
+    FWDATA_API void setInputValue(const ParamNameType& name, ::fwData::Object::sptr object);
+
+    /**
+     * @brief Register output value with specified name.
+     * If the name does already exist, the matching value will be replaced.
+     * @param[in] name Output name
+     * @param[in] object  Output value
+     */
+    FWDATA_API void setOutputValue(const ParamNameType& name, ::fwData::Object::sptr object);
+
+    /**
+     * @brief Returns vector of input parameters names.
+     */
+    FWDATA_API ParamNameVectorType getInputsParamNames() const;
+
+    /**
+     * @brief Returns vector of output parameters names.
+     */
+    FWDATA_API ParamNameVectorType getOutputsParamNames() const;
+
+    /**
+     * @brief Unregister all inputs parameters.
+     */
+    FWDATA_API void clearInputs();
+
+    /**
+     * @brief Unregister all output parameters.
+     */
+    FWDATA_API void clearOutputs();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& source, DeepCopyCacheType &cache);
+
+protected:
+
+    /**
+     * @brief Returns vector of parameters names from params map.
+     */
+    FWDATA_API ParamNameVectorType getParamNames(const ProcessObjectMapType& params) const;
+
+    /**
+     * @brief Register value with specified name in params map.
+     * If the name does already exist, the matching value will be replaced.
+     * @param[in] name Param name
+     * @param[in] object  Param
+     * @param params parameters map to insert object
+     */
+    FWDATA_API void setValue(const ParamNameType& name, ::fwData::Object::sptr object, ProcessObjectMapType& params);
+
+    /**
+     * @brief Retrieves data associated with specified name in params map (null if non exist).
+     * @param[in] name Param name
+     * @param params parameters map containing the data
+     * @return null sptr if param is not found
+     */
+    FWDATA_API ::fwData::Object::sptr getValue(const ParamNameType& name, const ProcessObjectMapType& params);
+
+    /**
+     * @brief Unregister all parameters in params map.
+     */
+    FWDATA_API void clearParams(ProcessObjectMapType& params);
+
+    /// Inputs values map
+    ProcessObjectMapType m_attrInputs;
+
+    /// Outputs values map
+    ProcessObjectMapType m_attrOutputs;
+};
+
+} // namespace fwData
+
+
+#endif //_FWDATA_PROCESSOBJECT_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/ROITraits.hpp b/SrcLib/core/fwData/include/fwData/ROITraits.hpp
new file mode 100644
index 0000000..060ca84
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/ROITraits.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_ROITRAITS_HPP__
+#define __FWDATA_ROITRAITS_HPP__
+
+#include "fwData/Node.hpp"
+#include "fwData/StructureTraits.hpp"
+#include "fwData/factory/new.hpp"
+
+
+fwCampAutoDeclareDataMacro((fwData)(ROITraits), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   ROITraits
+ * @brief   This class defines ROI traits.
+ * 
+ * @date    2007-2011.
+ *
+ * A ROI traits contains :
+ *  - an identifier
+ *  - an evaluated expression : ex. inter(skin,liver)
+ *  - a ROI mask node used for ROI, the only case where sptr can be null is when evaluated expression correspond to "W" ( W <=> World <=> no roi constraint ).
+ *  - a structure traits associated to the ROI
+ *
+ * @note Several ROITraits can be associated to the same structure.
+ * @see StructureTraits
+ */
+class FWDATA_CLASS_API ROITraits : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ROITraits)(::fwData::Object), (()), ::fwData::factory::New< ROITraits >) ;
+    fwCampMakeFriendDataMacro((fwData)(ROITraits));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API ROITraits(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~ROITraits();
+
+    fwGettersSettersDocMacro(Identifier, identifier, std::string, the ROIs identifier);
+
+    fwGettersSettersDocMacro(EvaluatedExp, evaluatedExp, StructureTraits::ROIExpression, the ROI evaluated expression);
+
+    /// Set the ROI mask node used for ROI
+    FWDATA_API void setMaskOpNode( ::fwData::Node::sptr maskOpNode );
+
+    /// Get the ROI mask node used for ROI, the only case where sptr can be null is when m_evaluatedExp correspond to "W" ( W <=> World <=> no roi constraint ).
+    FWDATA_API ::fwData::Node::sptr getMaskOpNode();
+
+    /// Set the associated structure traits
+    FWDATA_API void setStructureTraits( ::fwData::StructureTraits::sptr structureTraits );
+
+    /// Get the associated structure traits
+    FWDATA_API ::fwData::StructureTraits::sptr getStructureTraits();
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+private:
+
+    /// ROI identifier
+    std::string m_identifier;
+
+    /// mask node used for ROITraits
+    ::fwData::Node::sptr m_maskOpNode;
+
+    /// associated structure traits
+    ::fwData::StructureTraits::sptr m_structureTraits;
+
+    /// roi evaluated expression
+    StructureTraits::ROIExpression m_evaluatedExp;
+};
+
+} // namespace fwData
+
+#endif // __FWDATA_ROITRAITS_HPP__
diff --git a/SrcLib/core/fwData/include/fwData/Reconstruction.hpp b/SrcLib/core/fwData/include/fwData/Reconstruction.hpp
new file mode 100755
index 0000000..1530cda
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Reconstruction.hpp
@@ -0,0 +1,107 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_RECONSTRUCTION_HPP_
+#define _FWDATA_RECONSTRUCTION_HPP_
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+#include "fwData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Reconstruction), FWDATA_API);
+
+namespace fwData
+{
+
+class Image;
+class Material;
+class Mesh;
+
+/**
+ * @class Reconstruction
+ * @brief This class defines a reconstruction object
+ *
+ * A reconstruction is represented by a triangular mesh, a material and an image.
+ *
+ * @see ::fwData::Image, ::fwData::Mesh, ::fwData::Material
+ */
+
+class FWDATA_CLASS_API Reconstruction : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Reconstruction)(::fwData::Object), (()), ::fwData::factory::New< Reconstruction >) ;
+
+    fwCoreAllowSharedFromThis()
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Reconstruction(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Reconstruction();
+
+    fwCampMakeFriendDataMacro((fwData)(Reconstruction));
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+
+    // Generator result---------------------------------------------------------
+    fwGettersSettersDocMacro(IsVisible, bIsVisible, bool, the visibility of the reconstruction (true if visible));
+
+    fwGettersSettersDocMacro(OrganName, sOrganName, std::string, organ name);
+
+    fwGettersSettersDocMacro(StructureType, sStructureType, std::string, structure type);
+
+    /**
+     * @brief Get/Set the image associated with the acquisition
+     */
+    fwDataGetSetSptrMacro(Image, SPTR(::fwData::Image));
+
+    /**
+     * @brief Get/Set the mesh associated with the acquisition
+     */
+    fwDataGetSetSptrMacro(Mesh, SPTR(::fwData::Mesh));
+
+    /**
+     * @brief Get/Set the material associated with the acquisition
+     */
+    fwDataGetSetSptrMacro(Material, SPTR(::fwData::Material));
+
+protected :
+
+    //! true if this reconstruction is visible
+    bool m_bIsVisible;
+
+    //! Organ name
+    std::string m_sOrganName;
+
+    //! Structure type
+    std::string m_sStructureType;
+
+    //--------------------------------------------------------------------------
+
+
+    //! Reconstruction's material
+    SPTR(::fwData::Material) m_attrMaterial;
+
+    //! Reconstruction's mask
+    SPTR(::fwData::Image) m_attrImage;
+
+    //! Reconstruction's mesh
+    SPTR(::fwData::Mesh) m_attrMesh;
+
+};
+
+} // namespace fwData
+
+#endif // _FWDATA_RECONSTRUCTION_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/ReconstructionTraits.hpp b/SrcLib/core/fwData/include/fwData/ReconstructionTraits.hpp
new file mode 100644
index 0000000..4a788f2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/ReconstructionTraits.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_RECONSTRUCTIONTRAITS_HPP__
+#define __FWDATA_RECONSTRUCTIONTRAITS_HPP__
+
+#include "fwData/Node.hpp"
+#include "fwData/StructureTraits.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(ReconstructionTraits), FWDATA_API);
+namespace fwData
+{
+/**
+ * @class   ReconstructionTraits
+ * @brief   This class defines Reconstruction traits.
+ * 
+ * @date    2007-20011.
+ *
+ * A ReconstructionTraits contains :
+ *  - an identifier
+ *  - a structure traits associated to the reconstruction
+ *  - a mask operator node
+ *  - a mesh operator node
+ *
+ * @see StructureTraits
+ */
+class FWDATA_CLASS_API ReconstructionTraits : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ReconstructionTraits)(::fwData::Object), (()), ::fwData::factory::New< ReconstructionTraits >) ;
+    fwCampMakeFriendDataMacro((fwData)(ReconstructionTraits));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API ReconstructionTraits(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~ReconstructionTraits();
+
+    fwGettersSettersDocMacro(Identifier, identifier, std::string, the ROIs identifier);
+
+    /// Set the reconstruction operator mask node
+    FWDATA_API void setMaskOpNode( ::fwData::Node::sptr maskOpNode );
+
+    /// Get the reconstruction operator mask node. Return a null pointer if the mask node is not defined.
+    FWDATA_API ::fwData::Node::sptr getMaskOpNode();
+
+    /// Set the reconstruction operator mesh node.
+    FWDATA_API void setMeshOpNode( ::fwData::Node::sptr meshOpNode );
+
+    /// Get the reconstruction operator mesh node. Return a null pointer if the mesh node is not defined.
+    FWDATA_API ::fwData::Node::sptr getMeshOpNode();
+
+    /// Set the associated structure traits
+    FWDATA_API void setStructureTraits( ::fwData::StructureTraits::sptr structureTraits );
+
+    /// Get the associated structure traits
+    FWDATA_API ::fwData::StructureTraits::sptr getStructureTraits();
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+private:
+
+    /// ROI identifier
+    std::string m_identifier;
+
+    /// reconstruction mask operator node
+    ::fwData::Node::sptr m_maskOpNode;
+
+    /// reconstruction mesh operator node
+    ::fwData::Node::sptr m_meshOpNode;
+
+    /// associated structure traits
+    ::fwData::StructureTraits::sptr m_structureTraits;
+
+};
+
+} // namespace fwData
+
+#endif // __FWDATA_RECONSTRUCTIONTRAITS_HPP__
diff --git a/SrcLib/core/fwData/include/fwData/Resection.hpp b/SrcLib/core/fwData/include/fwData/Resection.hpp
new file mode 100644
index 0000000..8f3eea7
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Resection.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_RESECTION_HPP_
+#define _FWDATA_RESECTION_HPP_
+
+#include <vector>
+
+#include "fwData/config.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Reconstruction.hpp"
+#include "fwData/PlaneList.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Resection), FWDATA_API);
+namespace fwData
+{
+/**
+ * @class   Resection
+ * @brief   This class defines a resection
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Resection : public ::fwData::Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (Resection)(::fwData::Object),
+        (()), ::fwData::factory::New< Resection >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Resection));
+
+    typedef std::vector< ::fwData::Reconstruction::sptr > ResectionInputs;
+    typedef std::vector< ::fwData::Reconstruction::sptr > ResectionOutputs;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Resection(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Resection();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// PlaneList
+    fwGettersSettersDocMacro(PlaneList, planeList, ::fwData::PlaneList::sptr, the plane list);
+    /// Inputs
+    fwGettersSettersDocMacro(Inputs, vInputs, ResectionInputs, the resection inputs);
+    /// Outputs
+    fwGettersSettersDocMacro(Outputs, vOutputs, ResectionOutputs, the resection outputs);
+
+    fwGettersSettersDocMacro(IsSafePart, isSafePart, bool, the flag if the part is safe);
+
+    fwGettersSettersDocMacro(Name, name, std::string, the resection name);
+
+    fwGettersSettersDocMacro(IsVisible, isVisible, bool, the flag if the resection is visible);
+
+    fwGettersSettersDocMacro(IsValid, isValid, bool, the flag if the resection is valid);
+
+protected :
+
+    //! Resection name
+    std::string m_name;
+
+    //! Planes list
+    ::fwData::PlaneList::sptr m_planeList;
+
+    //! Inputs (reconstructions)
+    ResectionInputs m_vInputs;
+
+    //! Outputs (reconstructions)
+    ResectionOutputs m_vOutputs;
+
+    //! flag if the part is safe
+    bool m_isSafePart;
+
+    //! flag if the resection is valid
+    bool m_isValid;
+
+    //! flag if the resection is visible
+    bool m_isVisible;
+
+}; // end class Resection
+
+} // end namespace fwData
+
+#endif // _FWDATA_RESECTION_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/ResectionDB.hpp b/SrcLib/core/fwData/include/fwData/ResectionDB.hpp
new file mode 100644
index 0000000..49a2583
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/ResectionDB.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_RESECTIONDB_HPP_
+#define _FWDATA_RESECTIONDB_HPP_
+
+#include <boost/cstdint.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Resection.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(ResectionDB), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   ResectionDB
+ * @brief   This class defines a resection container.
+ *
+ * @see     ::fwData::Resection
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API ResectionDB : public Object
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ResectionDB)(::fwData::Object), (()), ::fwData::factory::New< ResectionDB >) ;
+    fwCampMakeFriendDataMacro((fwData)(ResectionDB));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API ResectionDB(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~ResectionDB();
+
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    typedef std::vector< ::fwData::Resection::sptr > ResectionContainerType;
+
+    /**
+     * @brief Get the number of resections
+     */
+    FWDATA_API ResectionContainerType::size_type getNumberOfResections() const;
+
+    /**
+     * @brief add resection
+     */
+    FWDATA_API void addResection( ::fwData::Resection::sptr resection );
+
+    fwDataGetSetCRefMacro(Resections, ResectionContainerType);
+
+    fwGettersSettersDocMacro(SafeResection, safeResection, ::fwData::Resection::sptr, Get the safe part of the resections);
+
+protected:
+
+    ::fwData::Resection::sptr m_safeResection;
+
+    ResectionContainerType m_attrResections;
+};
+
+}//end namespace fwData
+
+
+
+
+#endif // _FWDATA_RESECTIONDB_HPP_
+
+
diff --git a/SrcLib/core/fwData/include/fwData/Spline.hpp b/SrcLib/core/fwData/include/fwData/Spline.hpp
new file mode 100644
index 0000000..d4ee6ad
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Spline.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_SPLINE_HPP_
+#define _FWDATA_SPLINE_HPP_
+
+#include <vector>
+#include <boost/cstdint.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Color.hpp"
+
+namespace fwData
+{
+/**
+ * @class   Spline
+ * @brief   This class defines a spline object.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Spline : public Object
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (Spline)(::fwData::Object), (()), ::fwData::factory::New< Spline >) ;
+
+    /**
+     * @struct point
+     * @brief Defines a 3D %point for a spline.
+     */
+    class point
+    {
+    public:
+
+        int id;                      /**< @brief Identifier */
+        double p[3];                 /**< @brief Point coordinates */
+        double normal[3];            /**< @brief Normal coordinates*/
+        ::fwData::Color::sptr c;     /**< @brief Point color*/
+        bool isVisible;              /**< @brief Flag if %point is visible */
+
+        point &operator=( const point & _point )
+        {
+            this->id = _point.id;
+            this->p[0] = _point.p[0];
+            this->p[1] = _point.p[1];
+            this->p[2] = _point.p[2];
+            this->normal[0] = _point.normal[0];
+            this->normal[1] = _point.normal[1];
+            this->normal[2] = _point.normal[2];
+            this->isVisible = _point.isVisible;
+            c = ::fwData::Object::copy( _point.c );
+            return(*this);
+        };
+    };
+
+    /// 3D %point container
+    typedef std::vector< point > Points ;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Spline(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~Spline() ;
+
+    /**
+     * @brief returns editable point container
+     */
+    FWDATA_API Points &points() ;
+
+    fwGettersSettersDocMacro(Radius, radius, double, radius value);
+
+    fwGettersSettersDocMacro(NbSides, nbSides, int, number of slices);
+
+    fwGettersSettersDocMacro(IdSpline, idSpline, int, spline identifier);
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected :
+
+    /// Points container
+    Points      m_points ;
+    double      m_radius;
+    int         m_nbSides;
+    int         m_idSpline;
+
+} ;
+
+}
+
+#endif // _FWDATA_SPLINE_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/String.hpp b/SrcLib/core/fwData/include/fwData/String.hpp
new file mode 100644
index 0000000..2f78c9c
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/String.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_STRING_HPP_
+#define _FWDATA_STRING_HPP_
+
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/GenericField.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(String), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   String
+ * @brief   This class contains an std::string value
+ *
+ * String object is essentially used as a field in other objects.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API String : public GenericField< std::string >
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (String)(::fwData::Object), ( ((const std::string)("")) ), GenericFieldFactory< String >) ;
+    fwCampMakeFriendDataMacro((fwData)(String));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API String(::fwData::Object::Key key) throw();
+
+    /**
+     * @brief Destructor.
+     */
+    FWDATA_API virtual ~String() throw();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+};
+
+
+
+}
+
+#endif /*_FWDATA_STRING_HPP_*/
diff --git a/SrcLib/core/fwData/include/fwData/StructureTraits.hpp b/SrcLib/core/fwData/include/fwData/StructureTraits.hpp
new file mode 100644
index 0000000..42b19e0
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/StructureTraits.hpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_STRUCTURETRAITS_HPP__
+#define __FWDATA_STRUCTURETRAITS_HPP__
+
+#include "fwData/Color.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+
+fwCampAutoDeclareDataMacro((fwData)(StructureTraits), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   StructureTraits
+ * @brief   This class defines structure traits.
+ * 
+ * @date    2007-2011.
+ *
+ * A structure traits contains :
+ *  - [required] a type (ie. Skin, Liver, ...)
+ *  - [required] a category (or more) : Body, Head, Neck, Thorax, Abdomen, Pelvis, Arm, Leg, Liver_segments, Other
+ *  - [required] a class : Tool, Environment, Vessel, Lesion, Organ, Functional, No_constraint
+ *  - [required] a color
+ *  - [optional] an attachment only if class is LESION or FUNCTIONAL
+ *  - [optional] a native ROI expression : ex. inter(world(type(Skin)),not(class(Organ)))
+ *  - [optional] a native geometric ROI expression
+ */
+class FWDATA_CLASS_API StructureTraits : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (StructureTraits)(::fwData::Object), (()), ::fwData::factory::New< StructureTraits >) ;
+    fwCampMakeFriendDataMacro((fwData)(StructureTraits));
+
+    /// Defines structure categories
+    typedef enum
+    {
+        BODY,
+        HEAD,
+        NECK,
+        THORAX,
+        ABDOMEN,
+        PELVIS,
+        ARM,
+        LEG,
+        LIVER_SEGMENTS,
+        OTHER
+    }Category;
+
+    typedef std::vector<Category> CategoryContainer;
+    typedef std::string ROIExpression;
+
+    /// Defines structure class
+    typedef enum
+    {
+        TOOL,
+        ENVIRONMENT,
+        VESSEL,
+        LESION,
+        ORGAN,
+        FUNCTIONAL,
+        NO_CONSTRAINT
+    }StructureClass;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API StructureTraits(::fwData::Object::Key key);
+
+    /// Destructor. Does nothing.
+    FWDATA_API virtual ~StructureTraits();
+
+    fwGettersSettersDocMacro(Type, type, std::string, the structure type);
+
+    fwGettersSettersDocMacro(Categories, categories, CategoryContainer, the structure type);
+
+    fwGettersSettersDocMacro(Class, class, StructureClass, the structure class);
+
+    fwGettersSettersDocMacro(NativeExp, nativeExp, ROIExpression, the native ROI expression);
+
+    fwGettersSettersDocMacro(NativeGeometricExp, nativeGeometricExp, ROIExpression, the native geometric ROI expression);
+
+    fwGettersSettersDocMacro(AttachmentType, attachmentType, std::string, structure attachment type if class is LESION or FUNCTIONAL);
+
+    fwGettersSettersDocMacro(Color, color, ::fwData::Color::sptr, structure default color);
+
+    /// Get Organ dicom Designation.
+
+    fwGettersSettersDocMacro(AnatomicRegion, anatomicRegion, std::string, Dicom anatomic region);
+
+    fwGettersSettersDocMacro(PropertyCategory, propertyCategory, std::string, Dicom property category);
+
+    fwGettersSettersDocMacro(PropertyType, propertyType, std::string, Dicom property type);
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+private:
+
+    /// structure type (ie. Liver, Skin, ...)
+    std::string m_type;
+
+    /// structure categories (ie. abdomen, body, ...)
+    CategoryContainer m_categories;
+
+    /// structure default color
+    ::fwData::Color::sptr m_color;
+
+    /// structure class (TOOL, ENVIRONMENT, VESSEL, LESION, ORGAN, FUNCTIONAL, NO_CONSTRAINT)
+    StructureClass m_class;
+
+    /// native ROI expression (can be empty)
+    ROIExpression m_nativeExp;
+
+    /// native geometric ROI expression
+    ROIExpression m_nativeGeometricExp;
+
+    /// structure attachment type if class is LESION or FUNCTIONAL (can be empty)
+    std::string m_attachmentType;
+
+    /// Dicom designation of Anatomic region if unknown it must be set to "ToDefine"
+    std::string m_anatomicRegion;
+
+    /// Dicom property category of organ if unknown it must be set to "ToDefine"
+    std::string m_propertyCategory;
+
+    /// Dicom property type of organ if unknown it must be set to "ToDefine"
+    std::string m_propertyType;
+};
+
+} // namespace fwData
+
+#endif // __FWDATA_STRUCTURETRAITS_HPP__
diff --git a/SrcLib/core/fwData/include/fwData/StructureTraitsDictionary.hpp b/SrcLib/core/fwData/include/fwData/StructureTraitsDictionary.hpp
new file mode 100644
index 0000000..4beabed
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/StructureTraitsDictionary.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_STRUCTURETRAITSDICTIONARY_HPP__
+#define __FWDATA_STRUCTURETRAITSDICTIONARY_HPP__
+
+#include "fwData/StructureTraits.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(StructureTraitsDictionary), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   StructureTraitsDictionary
+ * @brief   This class defines a dictionary of structure traits.
+ * 
+ * @date    2007-2011.
+ *
+ * @note The dictionary cannot contain two structure with the same type.
+ * @see StructureTraits
+ */
+class FWDATA_CLASS_API StructureTraitsDictionary : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (StructureTraitsDictionary)(::fwData::Object), (()), ::fwData::factory::New< StructureTraitsDictionary >) ;
+    fwCampMakeFriendDataMacro((fwData)(StructureTraitsDictionary));
+
+    typedef std::vector<std::string> StructureTypeNameContainer;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API StructureTraitsDictionary(::fwData::Object::Key key);
+
+    /// Destructor. Does nothing.
+    FWDATA_API virtual ~StructureTraitsDictionary();
+
+
+    /**
+     * @brief Add a structure in dictionary
+     * @param [in] structureTraits a StructureTraits correctly initialized.
+     * @pre A structure with the same type cannot exist in dictionary.
+     * @pre Only structure of class 'Lesion' or 'Functional' can have attachment.
+     * @pre Structure attachment must be of class 'Organ' and must exist in dictionary.
+     * @pre Structure type cannot contain space.
+     */
+    FWDATA_API void addStructure(StructureTraits::sptr structureTraits);
+
+    /**
+     * @brief Return the structure traits for given type
+     * @pre given 'type' must exist in dictionary
+     */
+    FWDATA_API StructureTraits::sptr getStructure(std::string type);
+
+    /// Return all array names stock in the structureTraits-map
+    FWDATA_API StructureTypeNameContainer getStructureTypeNames() const;
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+private:
+
+    typedef std::map< std::string, ::fwData::StructureTraits::sptr > StructureTraitsMapType;
+
+    /// map to register structure traits. Map key is structure type.
+    StructureTraitsMapType m_structureTraitsMap;
+
+};
+
+} // namespace fwData
+
+#endif // __FWDATA_STRUCTURETRAITSDICTIONARY_HPP__
diff --git a/SrcLib/core/fwData/include/fwData/StructureTraitsHelper.hpp b/SrcLib/core/fwData/include/fwData/StructureTraitsHelper.hpp
new file mode 100644
index 0000000..4cec9d6
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/StructureTraitsHelper.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_STRUCTURETRAITSHELPER_HPP__
+#define __FWDATA_STRUCTURETRAITSHELPER_HPP__
+
+#include <boost/bimap/bimap.hpp>
+
+#include <fwData/StructureTraits.hpp>
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+/**
+ * @class   StructureTraitsHelper
+ * @brief   This class defines some helper for the structure traits.
+ * 
+ * @date    2007-20011.
+ */
+
+class FWDATA_CLASS_API StructureTraitsHelper
+{
+
+public :
+
+    typedef ::boost::bimaps::bimap< ::fwData::StructureTraits::StructureClass, std::string > ClassTranslatorType;
+    /// Map to translate structure class (string vs enum)
+    FWDATA_API static const ClassTranslatorType s_CLASSTRANSLATOR;
+
+    typedef ::boost::bimaps::bimap< ::fwData::StructureTraits::Category, std::string > CategoryTranslatorType;
+    /// Map to translate structure categories (string vs enum)
+    FWDATA_API static const CategoryTranslatorType s_CATEGORYTRANSLATOR;
+
+};
+
+} // namespace fwData
+
+#endif // __FWDATA_STRUCTURETRAITSHELPER_HPP__
+
diff --git a/SrcLib/core/fwData/include/fwData/Tag.hpp b/SrcLib/core/fwData/include/fwData/Tag.hpp
new file mode 100644
index 0000000..d5d3822
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Tag.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_TAG_HPP_
+#define _FWDATA_TAG_HPP_
+
+
+#include <vector>
+
+#include "fwData/config.hpp"
+#include "fwData/PointList.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Tag), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   Tag
+ * @brief   This class represent a tag. A tag contains a list of points.
+ *
+ * @see ::fwData::PointList
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Tag : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (Tag)(::fwData::Object), (()), ::fwData::factory::New< Tag >) ;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Tag(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Tag();
+
+    fwCampMakeFriendDataMacro((fwData)(Tag));
+
+    fwGettersSettersDocMacro(PointList, pointList, ::fwData::PointList::sptr, the list of points )
+
+    fwGettersSettersDocMacro(Type, sType, std::string, the type of tag)
+
+    fwGettersSettersDocMacro(Size, size, double, the size of the tag)
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& source, DeepCopyCacheType &cache);
+
+protected :
+
+    /// list of points
+    ::fwData::PointList::sptr  m_pointList;
+
+    /// type of tag
+    std::string m_sType;
+
+    /// size of tag
+    double m_size;
+
+}; // end class Tag
+
+} // end namespace fwData
+
+
+#endif // _FWDATA_TAG_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/TransferFunction.hpp b/SrcLib/core/fwData/include/fwData/TransferFunction.hpp
new file mode 100644
index 0000000..bd1b89d
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/TransferFunction.hpp
@@ -0,0 +1,221 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_TRANSFERFUNCTION_HPP_
+#define _FWDATA_TRANSFERFUNCTION_HPP_
+
+#include <vector>
+#include <map>
+#include <limits>
+
+#include "fwData/config.hpp"
+#include "fwData/macros.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(TransferFunction), FWDATA_API);
+
+namespace fwData
+{
+/**
+ * @class   TransferFunction
+ * @brief   This class defines a transfer function.
+ *
+ * A transfer function is composed of some points which have a color and a value.
+ *
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API TransferFunction : public Object
+{
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TransferFunction)(::fwData::Object), (()), ::fwData::factory::New< TransferFunction >) ;
+
+    /// Macro for deep and shallow copies
+
+    fwCampMakeFriendDataMacro((fwData)(TransferFunction));
+
+
+    /// Defines color structure for TF
+    struct TFColor
+    {
+        typedef double ColorType;
+
+        /// red color (value [0,1])
+        ColorType r;
+        /// green color (value [0,1])
+        ColorType g;
+        /// blue color (value [0,1])
+        ColorType b;
+        /// alpha (value [0,1])
+        ColorType a;
+
+        // Default constructor
+        TFColor()
+        {
+            r = 0.0;
+            g = 0.0;
+            b = 0.0;
+            a = 0.0;
+        };
+
+        TFColor( ColorType _r, ColorType _g, ColorType _b, ColorType _a )
+        {
+            r = _r;
+            g = _g;
+            b = _b;
+            a = _a;
+        };
+
+        inline bool operator== (const TFColor& _color) const
+        {
+            return (r == _color.r && g == _color.g && b == _color.b && a == _color.a);
+        };
+
+    };
+
+    /// Defines the available modes {LINEAR, NEAREST} to interpolate color between two TF color points.
+
+    typedef enum
+    {
+        LINEAR,
+        NEAREST
+    } InterpolationMode;
+
+    typedef double TFValueType;
+    typedef std::vector<TFValueType> TFValueVectorType;
+
+    typedef std::vector<TFColor> TFColorVectorType;
+    typedef std::map< TFValueType, TFColor > TFDataType;
+
+    typedef std::pair< TFValueType, TFValueType > TFValuePairType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API TransferFunction(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~TransferFunction();
+
+    // Initialize a default TF.
+    FWDATA_API void initTF();
+
+    // Create a default TF
+    FWDATA_API static TransferFunction::sptr createDefaultTF();
+
+    /// Shallow copy method
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Deep copy method
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Get all the point values of the TF (keys of the map m_tfData)
+    FWDATA_API TFValueVectorType getTFValues() const;
+
+    /// Get all the point values of the TF scaled and shifted with the window level
+    FWDATA_API TFValueVectorType getScaledValues() const;
+
+    /// Get the first and last point values of the tf data
+    FWDATA_API TFValuePairType getMinMaxTFValues() const;
+
+    /// Get the min/max of the window level
+    FWDATA_API TFValuePairType getWLMinMax() const;
+
+    /// Set the min/max of the window level
+    FWDATA_API void setWLMinMax(const TFValuePairType& minMax);
+
+    /// Return the nearest point value of a value.
+    FWDATA_API TFValueType getNearestValue( TFValueType value ) const;
+
+    /// Get all the TF data .
+    FWDATA_API const TFDataType& getTFData() const;
+
+    /// Set all the TF data (clear previous tf data).
+    FWDATA_API void setTFData( const TFDataType & tfData );
+
+    /// Add a new TF color point.
+    FWDATA_API void addTFColor( TFValueType value, const TFColor & color );
+
+    /// Erase a TF color point.
+    FWDATA_API void eraseTFValue( TFValueType value);
+
+    /// Clear all the TF data.
+    FWDATA_API void clear();
+
+    /// Get all the colors of the TF
+    FWDATA_API TFColorVectorType getTFColors() const;
+
+    /// Get the nearest color of a value.
+    FWDATA_API TFColor getNearestColor( TFValueType value ) const;
+
+    /// Get the color for a value (the color is computed with a linear interpolation).
+    FWDATA_API TFColor getLinearColor( TFValueType value ) const;
+
+    /// Get the interpolated color of the TF for a value.The result depends of the current interpolation mode.
+    FWDATA_API TFColor getInterpolatedColor( TFValueType value ) const;
+
+    // Get the color associated to the value.
+    FWDATA_API const TFColor& getTFColor( TFValueType value ) const;
+
+    /// Interpolation mode
+    fwDataGetSetMacro(InterpolationMode, InterpolationMode);
+
+    /// Level
+    fwDataGetSetMacro(Level, double);
+
+    /// Window
+    fwDataGetSetMacro(Window, double);
+
+    /// Transfert function name
+    fwDataGetSetCRefMacro(Name, std::string);
+
+    /// is TF clamped
+    fwDataGetSetMacro(IsClamped, bool);
+
+    /// set the TF background color when tf 'IsClamped' is true
+    fwDataGetSetCRefMacro(BackgroundColor, TFColor);
+
+    /// Default transfer function name
+    FWDATA_API static const std::string s_DEFAULT_TF_NAME;
+
+private :
+
+    /// Current visualization level
+    double m_attrLevel;
+
+    /// Current visualization window
+    double m_attrWindow;
+
+    ///  Function transfer name.
+    std::string m_attrName;
+
+    /// The recommended background color to use this TF.
+    TFColor m_attrBackgroundColor;
+
+    /// The Transfer function data.
+    TFDataType m_tfData;
+
+    /// The current interpolation mode.
+    InterpolationMode m_attrInterpolationMode;
+
+    /**
+     *  @brief Defines interpolation mode on extremities
+     *
+     *  if m_isClamped == true then after extremity point, the returned TF color is TFColor(0,0,0,0).
+     *  if m_isClamped == false then after extremity point, the returned TF color is one of the extremity color value.
+    **/
+    bool m_attrIsClamped;
+
+}; // end class TransferFunction
+
+} // end namespace fwData
+
+
+#endif // _FWDATA_TRANSFERFUNCTION_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/TransformationMatrix3D.hpp b/SrcLib/core/fwData/include/fwData/TransformationMatrix3D.hpp
new file mode 100644
index 0000000..58d656b
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/TransformationMatrix3D.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_TRANSFORMATIONMATRIX3D_HPP_
+#define _FWDATA_TRANSFORMATIONMATRIX3D_HPP_
+
+#include <vector>
+#include <iostream>
+#include <assert.h>
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(TransformationMatrix3D), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @class   TransformationMatrix3D
+ * @brief   This class represents a 3D transformation matrix (4x4)
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API TransformationMatrix3D : public Object
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (TransformationMatrix3D)(::fwData::Object),
+            (()), ::fwData::factory::New< TransformationMatrix3D >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(TransformationMatrix3D));
+
+    typedef double TM3DType;
+    typedef std::vector<TM3DType> TMCoefArray;
+
+    //duplication methods
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API TransformationMatrix3D(::fwData::Object::Key key);
+
+    //! @brief destructor
+    FWDATA_API virtual ~TransformationMatrix3D();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+
+    fwGettersSettersDocMacro(Coefficients, vCoefficients, TMCoefArray, the elements of the matrix)
+
+    /**
+     * @{
+     * @brief Get/Set value of the coefficient in the given position (matrix[l][c])
+     */
+    FWDATA_API double getCoefficient(int l, int c) const;
+    FWDATA_API void setCoefficient(int l, int c, TM3DType val);
+    /// @}
+
+    /// maximum size of the matrix (MATRIX_SIZE x MATRIX_SIZE)
+    static const int MATRIX_SIZE = 4;
+
+    /// Print the coefficients of the matrix
+    friend std::ostream& operator<<(std::ostream& s, const TransformationMatrix3D& mat)
+    {
+        for(int l = 0; l < MATRIX_SIZE; l++)
+        {
+            for(int c = 0; c < MATRIX_SIZE; c++)
+            {
+                s << mat.getCoefficient(l, c) << "\t";
+            }
+            s << std::endl;
+        }
+        return s;
+    }
+
+protected :
+
+    //! Matrix coefficient number (4x4). m_vCoefficients[0] to m_vCoefficients[3] is the first row of the matrix
+    TMCoefArray m_vCoefficients;
+};
+
+}; // namespace fwData
+
+#endif // _FWDATA_TRANSFORMATIONMATRIX3D_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/TriangularMesh.hpp b/SrcLib/core/fwData/include/fwData/TriangularMesh.hpp
new file mode 100644
index 0000000..24657c9
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/TriangularMesh.hpp
@@ -0,0 +1,133 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_TRIANGULARMESH_HPP_
+#define _FWDATA_TRIANGULARMESH_HPP_
+
+#include <vector>
+
+#include <boost/function.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(TriangularMesh), FWDATA_API);
+namespace fwData
+{
+/**
+ * @class     TriangularMesh
+ * @brief     This class defines a mesh.
+ *
+ * A mesh is represented by a container of 3D points and a container of cells.
+ * A cell contains indices of the three points related to a triangular cell.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API TriangularMesh : public Object
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (TriangularMesh)(::fwData::Object), (()), ::fwData::factory::New< TriangularMesh >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(TriangularMesh));
+
+    /// 3D point container
+    typedef std::vector< std::vector< float > >         PointContainer ;
+    typedef const std::vector< std::vector< float > >   ConstPointContainer ;
+
+    /// A cell contains indices of the three points related to a triangular cell
+    typedef std::vector< std::vector< int > >           CellContainer ;
+    typedef const std::vector< std::vector< int > >     ConstCellContainer ;
+
+    /**
+     * Typedef using for pointer function
+     */
+    typedef ::boost::function<void      ( ::fwData::TriangularMesh*, int, float, float, float ) > set1ValueFunc;
+    typedef ::boost::function<double*   ( ::fwData::TriangularMesh*, int)  > get1ValueFunc;
+    typedef ::boost::function<void      ( ::fwData::TriangularMesh*, int, int, int, int ) > set1IndexFunc;
+    typedef ::boost::function<const int ( ::fwData::TriangularMesh* ) > get1IndexFunc;
+    typedef ::boost::function<void      ( ::fwData::TriangularMesh*, int, float, float, float ) > set1NormalFunc;
+    typedef ::boost::function<const int ( ::fwData::TriangularMesh* ) > get1NormalFunc;
+    typedef ::boost::function<const int ( ::fwData::TriangularMesh* ) > getNumPointsFunc;
+    typedef ::boost::function<const int ( ::fwData::TriangularMesh* ) > getNumCellsFunc;
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API TriangularMesh(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~TriangularMesh() ;
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /**
+     * @brief returns editable point container
+     */
+    FWDATA_API PointContainer &points() ;
+
+    /**
+     * @brief returns point container
+     */
+    FWDATA_API ConstPointContainer &points() const;
+
+    /**
+     * @brief returns editable cell container
+     */
+    FWDATA_API CellContainer &cells() ;
+
+    /**
+     * @brief returns cell container
+     */
+    FWDATA_API ConstCellContainer &cells() const;
+
+    /**
+     * Clear the point container
+     */
+    FWDATA_API void clearPoints();
+
+    /**
+     * Clear the cell container
+     */
+    FWDATA_API void clearCells();
+
+    FWDATA_API void setOneVectorInPointList(int _iIndex, float _fX, float _fY, float _fZ);
+
+    FWDATA_API void setOneIndexInIndexList(int _iIndex, int _p1, int _p2, int _p3);
+
+    FWDATA_API double* getOneVectorFromPointList(int _pt) const;
+
+    FWDATA_API int getOneIndexFromIndexList(void) const;
+
+    FWDATA_API void setOneVectorInNormalList(int x, float, float, float);
+
+    FWDATA_API int getOneIndexFromNormalList(void) const;
+
+    FWDATA_API size_t getNumPoints(void) const ;
+
+    FWDATA_API size_t getNumCells(void) const ;
+
+protected :
+
+    PointContainer m_points ;
+    CellContainer  m_cells ;
+
+} ;
+
+}
+
+#endif //_FWDATA_TRIANGULARMESH_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/Vector.hpp b/SrcLib/core/fwData/include/fwData/Vector.hpp
new file mode 100644
index 0000000..f1047e2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Vector.hpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_VECTOR_HPP_
+#define _FWDATA_VECTOR_HPP_
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <camp/class.hpp>
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/config.hpp"
+
+fwCorePredeclare((fwData)(Vector))
+
+fwCampAutoDeclareDataMacro((fwData)(Vector), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @class   Vector
+ * @brief   This class defines a vector of objects.
+ *
+ * Vector contains a vector of ::fwData::Object.
+ *
+ * 
+ * @date    2007-2009.
+ */
+
+class FWDATA_CLASS_API Vector : public Object
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Vector)(::fwData::Object), (()), ::fwData::factory::New< Vector >) ;
+    fwCampMakeFriendDataMacro((fwData)(Vector));
+
+    typedef std::vector< Object::sptr > ContainerType;
+
+    typedef ContainerType::value_type ValueType;
+    typedef ContainerType::reference ReferenceType;
+    typedef ContainerType::const_reference ConstReferenceType;
+    typedef ContainerType::iterator IteratorType;
+    typedef ContainerType::const_iterator ConstIteratorType;
+    typedef ContainerType::reverse_iterator ReverseIteratorType;
+    typedef ContainerType::const_reverse_iterator ConstReverseIteratorType;
+    typedef ContainerType::size_type SizeType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Vector(::fwData::Object::Key key);
+
+    /// Destructor
+    FWDATA_API virtual ~Vector();
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef ContainerType::value_type value_type;
+    typedef ContainerType::iterator iterator;
+    typedef ContainerType::const_iterator const_iterator;
+    typedef ContainerType::reverse_iterator reverse_iterator;
+    typedef ContainerType::const_reverse_iterator const_reverse_iterator;
+    typedef ContainerType::size_type size_type;
+
+    typedef Vector Container;
+
+    IteratorType begin() { return m_attrContainer.begin(); }
+    IteratorType end()   { return m_attrContainer.end(); }
+    ConstIteratorType begin() const { return m_attrContainer.begin(); }
+    ConstIteratorType end()   const { return m_attrContainer.end(); }
+
+    ReverseIteratorType rbegin() { return m_attrContainer.rbegin(); }
+    ReverseIteratorType rend()   { return m_attrContainer.rend(); }
+    ConstReverseIteratorType rbegin() const { return m_attrContainer.rbegin(); }
+    ConstReverseIteratorType rend()   const { return m_attrContainer.rend(); }
+
+    bool empty() const { return m_attrContainer.empty(); }
+    SizeType size() const { return m_attrContainer.size(); }
+
+    ValueType front(){ return m_attrContainer.front(); }
+    ValueType back(){ return m_attrContainer.back(); }
+
+    ReferenceType operator[] ( size_type n )
+    {return this->m_attrContainer[n];}
+    ConstReferenceType operator[] ( size_type n ) const
+    {return this->m_attrContainer[n];}
+
+    ReferenceType at ( SizeType n ) {return m_attrContainer.at(n);}
+    ConstReferenceType at ( SizeType n ) const {return m_attrContainer.at(n);}
+    /// @}
+
+    /// @brief get/set the vector of ::fwData::Object
+    /// @{
+    ContainerType &getContainer(){ return m_attrContainer; };
+    fwDataGetSetCRefMacro(Container, ContainerType);
+    /// @}
+
+
+
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Method to initialize a ::fwData::Vector from a std::vector
+    template< class DATATYPE >
+    void setDataContainer( const std::vector< SPTR(DATATYPE) > & vec )
+    {
+        this->m_attrContainer.clear();
+        std::copy( vec.begin(), vec.end(), std::back_inserter(this->getContainer()) );
+    }
+
+    /// Method to get a std::vector from ::fwData::Vector
+    template< class DATATYPE >
+    std::vector< SPTR(DATATYPE) > getDataContainer() const
+    {
+        std::vector< SPTR(DATATYPE) > vec;
+        vec.reserve( this->size() );
+        SPTR(DATATYPE) castedData;
+        BOOST_FOREACH( ::fwData::Object::sptr data, this->getContainer() )
+        {
+            castedData = ::boost::dynamic_pointer_cast<DATATYPE>( data );
+            OSLM_ASSERT("DynamicCast "<< ::fwCore::TypeDemangler<DATATYPE>().getFullClassname()<<" failed", castedData);
+            vec.push_back( castedData );
+        }
+
+        return vec;
+    }
+
+protected:
+
+    ContainerType m_attrContainer;
+};
+} //namespace fwData
+
+#endif /* _FWDATA_VECTOR_HPP_ */
+
diff --git a/SrcLib/core/fwData/include/fwData/Video.hpp b/SrcLib/core/fwData/include/fwData/Video.hpp
new file mode 100644
index 0000000..c38e880
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/Video.hpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_VIDEO_HPP_
+#define _FWDATA_VIDEO_HPP_
+
+#include <boost/cstdint.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/Camera.hpp"
+#include "fwData/TransformationMatrix3D.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(Video), FWDATA_API);
+
+namespace fwData
+{
+
+/**
+ * @brief   This class focuses on video
+ * @note    This version is done for test purposes (augmented reality and visualization) and will have to be accurately design
+ * @note    Information to be stored here does not necessarily concern video buffer.
+ * 
+ * @date    2007-2009.
+ * @todo    implement appropriate API
+ */
+class FWDATA_CLASS_API Video : public Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Video)(::fwData::Object), (()), ::fwData::factory::New< Video >) ;
+
+    fwCampMakeFriendDataMacro((fwData)(Video));
+
+    typedef ::boost::uint8_t VideoType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWDATA_API Video(::fwData::Object::Key key);
+
+    /**
+     * @brief destructor
+     */
+    FWDATA_API virtual ~Video() throw();
+
+    /// @brief Get the buffer size along X axis
+    ::boost::uint32_t  getXSize() const { return m_ui32XSize; };
+
+    /// @brief Get the buffer size along Y axis
+    ::boost::uint32_t  getYSize() const { return m_ui32YSize; };
+
+    /// @brief Get the number of bits per pixel
+    VideoType  getBPP() const { return m_ui8BPP; };
+
+    /// @brief Get the address of the image buffer
+    VideoType  * getImageBuffer() const { return m_pImageBuffer; };
+
+    /// @brief Get the camera associated with the video
+    ::fwData::Camera::sptr getCamera() const { return m_camera; };
+
+    /// @brief Return True if the data is available
+    FWDATA_API bool &dataAvailable();
+
+    /// @brief Get value of the last modification
+    FWDATA_API ::boost::uint64_t getLastModified();
+
+    /**
+     * @brief Increments the count of modification
+     */
+    FWDATA_API void Modified();
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    //! The buffer size along X axis
+    ::boost::uint32_t  m_ui32XSize;
+
+    //! The buffer size along Y axis
+    ::boost::uint32_t  m_ui32YSize;
+
+    //! The number of bit by pixel
+    VideoType  m_ui8BPP;
+
+    //! The address of the image buffer
+    VideoType  * m_pImageBuffer;
+
+protected :
+
+    /// Flag if the video is available
+    bool m_dataAvailable;
+
+    /// Value of the last modification (incremented by Modified() method
+    ::boost::uint64_t m_lastModified;
+
+    /// Camera
+    ::fwData::Camera::sptr m_camera;
+};
+
+} // namespace fwData
+
+
+#endif // _FWDATA_VIDEO_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/camp/mapper.hpp b/SrcLib/core/fwData/include/fwData/camp/mapper.hpp
new file mode 100644
index 0000000..04eed5d
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/camp/mapper.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_CAMP_MAPPER_HPP__
+#define __FWDATA_CAMP_MAPPER_HPP__
+
+ #include <boost/algorithm/string.hpp>
+
+#include <fwCamp/Mapper/ValueMapper.hpp>
+
+#include "fwData/TransferFunction.hpp"
+
+namespace camp_ext
+{
+
+template <>
+struct ValueMapper< ::fwData::TransferFunction::TFColor >
+{
+    typedef ::fwData::TransferFunction::TFColor ReturnType;
+    static const int type = camp::stringType;
+    static const std::string to(const ReturnType& source)
+    {
+        std::string result ="";
+
+        std::string current = boost::lexical_cast< std::string>(source.r);
+        result += current;
+        result += ";";
+
+        current = boost::lexical_cast< std::string>(source.g);
+        result += current;
+        result += ";";
+
+        current =  boost::lexical_cast< std::string>(source.b);
+        result += current;
+        result += ";";
+
+        current =  boost::lexical_cast< std::string>(source.a);
+        result += current;
+        result += ";";
+
+        return result;
+    }
+
+    static ReturnType from(bool source)                    {CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));}
+    static ReturnType from(long source)                    {CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));}
+    static ReturnType from(double source)                  {CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const camp::EnumObject& source) {CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const camp::UserObject& source) {CAMP_ERROR(camp::BadType(camp::userType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const std::string& source)
+    {
+        std::vector< std::string> result;
+        ReturnType tfColor;
+        ::boost::split(result, source, boost::is_any_of(";"));
+
+        if(result.size() >= 4)
+        {
+            tfColor.r = ValueMapper<float>::from(result[0]);
+            tfColor.g = ValueMapper<float>::from(result[1]);
+            tfColor.b = ValueMapper<float>::from(result[2]);
+            tfColor.a = ValueMapper<float>::from(result[3]);
+        }
+        else
+        {
+            OSLM_WARN("Your tf color is not correctly setted, nb of component : " << result.size());
+        }
+        return tfColor;
+    }
+};
+
+
+} //camp_ext
+
+#endif /* __FWDATA_CAMPMAPPER_HPP_ _*/
diff --git a/SrcLib/core/fwData/include/fwData/config.hpp b/SrcLib/core/fwData/include/fwData/config.hpp
new file mode 100644
index 0000000..25f793f
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/config.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_CONFIG_HPP_
+#define _FWDATA_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWDATA_EXPORTS
+    #define FWDATA_API __declspec(dllexport)
+    #define FWDATA_TEMPLATE_API
+    #else
+    #define FWDATA_API __declspec(dllimport)
+    #define FWDATA_TEMPLATE_API extern
+    #endif
+
+    #define FWDATA_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWDATA_EXPORTS
+    #define FWDATA_API __attribute__ ((visibility("default")))
+    #define FWDATA_CLASS_API __attribute__ ((visibility("default")))
+    #define FWDATA_TEMPLATE_API extern
+    #else
+    #define FWDATA_API __attribute__ ((visibility("hidden")))
+    #define FWDATA_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWDATA_TEMPLATE_API extern
+    #endif
+
+#else
+
+    #define FWDATA_API
+    #define FWDATA_CLASS_API
+    #define FWDATA_TEMPLATE_API extern
+
+#endif
+
+#endif //FWDATA_CONFIG_API
diff --git a/SrcLib/core/fwData/include/fwData/factory/namespace.hpp b/SrcLib/core/fwData/include/fwData/factory/namespace.hpp
new file mode 100644
index 0000000..b6ab4b5
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/factory/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_FACTORY_NAMESPACE_HPP__
+#define __FWDATA_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwData
+{
+
+/**
+ * @brief       Contains fwData::factory utilities
+ * @namespace   fwData::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwData
+
+#endif /* __FWDATA_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwData/include/fwData/factory/new.hpp b/SrcLib/core/fwData/include/fwData/factory/new.hpp
new file mode 100644
index 0000000..ebab9f2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/factory/new.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_FACTORY_NEW_HPP__
+#define __FWDATA_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+#include <fwTools/DynamicAttributes.hxx>
+
+#include "fwData/config.hpp"
+#include "fwData/registry/detail.hpp"
+
+namespace fwData
+{
+
+class Object;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwData::factory::New();
+
+    Key(){};
+};
+
+
+FWDATA_API SPTR( ::fwData::Object ) New( const ::fwData::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+
+    ::fwTools::DynamicAttributesBase *dynAttr = obj.get();
+    dynAttr->__FWTOOLS_ATTRIBUTES_REGISTER_FUNC_NAME();
+
+#ifdef COM_LOG
+    obj->setID(obj->getID());
+#endif
+
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace fwData
+
+#endif /* __FWDATA_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwData/include/fwData/location/Folder.hpp b/SrcLib/core/fwData/include/fwData/location/Folder.hpp
new file mode 100644
index 0000000..ba8224d
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/location/Folder.hpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _DATA_LOCATION_FOLDER_HPP_
+#define _DATA_LOCATION_FOLDER_HPP_
+
+
+#include <boost/filesystem.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/location/ILocation.hpp"
+#include "fwData/factory/new.hpp"
+
+
+fwCampAutoDeclareDataMacro((fwData)(location)(Folder), FWDATA_API);
+
+namespace fwData
+{
+namespace location
+{
+/**
+ * @class Folder
+ * @brief This class defines a folder location.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API Folder  : public ILocation
+{
+public:
+
+    fwCoreClassDefinitionsWithNFactoriesMacro(
+            (Folder)(ILocation),
+            ((::fwData::factory::New< Folder > ,() ))
+            ((FolderFactory ,((::boost::filesystem::path)) ((bool)(false)) ))
+    );
+
+    fwCampMakeFriendDataMacro((fwData)(location)(Folder));
+
+    /// Constructor
+    FWDATA_API Folder( ::fwData::Object::Key key );
+
+    /// Destructor
+    FWDATA_API virtual ~Folder();
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// @brief Set folder filesystem path
+    FWDATA_API void setFolder( PathType folder);
+
+    /// @brief Get folder filesystem path
+    FWDATA_API PathType getFolder() const;
+
+    /// @brief Set the flag if folder location is recursive
+    FWDATA_API void setRecursive( bool recursive);
+
+    /// @brief Get the flag if folder location is recursive
+    FWDATA_API bool getRecursive();
+
+protected :
+
+    FWDATA_API static sptr FolderFactory(PathType path, bool recursive=false );
+
+    /// %Folder path
+    PathType m_folder;
+
+    /// Flag if folder is recursive
+    bool m_isRecursive;
+
+};
+
+/**
+ * @struct enableFolder
+ * @brief This class is derived by reader/writer.
+ *
+ * Reader/Writer classes should only need to implement get/setLocation
+ *
+ * 
+ * @date    2007-2009.
+ */
+template<class RW> // reader or writer class should only need to implement get/setLocation
+struct enableFolder
+{
+    /**
+     * @brief constructor
+     * @param[in] rw reader or writer
+     */
+    enableFolder(RW *rw) : m_rw(rw)
+    {
+        SLM_ASSERT("m_rw not instanced", m_rw);
+    }
+
+    /// @brief Set folder filesystem path
+    void setFolder(ILocation::PathType folder)
+    {
+        getLocation<Folder>(m_rw)->setFolder(folder);
+    }
+
+    /// @brief Get folder filesystem path
+    ILocation::PathType getFolder()
+    {
+        return getLocation<Folder>(m_rw)->getFolder();
+    }
+
+    /// @brief Set the flag if folder location is recursive
+    void setRecursive( bool val)
+    {
+        getLocation<Folder>(m_rw)->setRecursive(val);
+    }
+
+    /// @brief Get the flag if folder location is recursive
+    bool getRecursive()
+    {
+        return getLocation<Folder>(m_rw)->getRecursive();
+    }
+
+private :
+    /// Not implemented must use constructor with one parameter
+    enableFolder();
+
+    /// Reader or writer
+    RW *m_rw;
+
+};
+
+}
+}
+
+#endif /* _DATA_LOCATION_FOLDER_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/location/ILocation.hpp b/SrcLib/core/fwData/include/fwData/location/ILocation.hpp
new file mode 100644
index 0000000..c258bc8
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/location/ILocation.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_LOCATION_HPP_
+#define _FWDATA_LOCATION_HPP_
+
+#include "fwData/config.hpp"
+#include "fwData/Object.hpp"
+
+
+namespace fwData
+{
+/**
+ * @namespace ::fwData::location
+ * @brief This namespace contains the classes which define a %location ( fileSystem, directory(IES) etc.... ).
+ * 
+ * @date    2007-2009.
+ *
+ */
+namespace location
+{
+
+/**
+ * @brief Abstract class to define a %location ( fileSystem, directory(IES) etc.... )
+ *
+ * @note cannot be instantiated but derived class OK
+ * @see Folder, MultiFiles, SingleFile
+ */
+class FWDATA_CLASS_API ILocation : public ::fwData::Object
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (ILocation)(::fwData::Object) );
+
+    typedef ::boost::filesystem::path PathType;
+    typedef std::vector<PathType> VectPathType;
+
+protected:
+
+    /// Constructor : cannot be instantiated but derivated class OK
+    FWDATA_API ILocation();
+
+    /// Destructor
+    FWDATA_API virtual ~ILocation();
+};
+
+
+/**
+ * @brief Get reader or writer %location
+ * @param[in] rw reader or writer
+ */
+template<class LOCATION, class RW >
+inline typename LOCATION::sptr getLocation(RW *rw)
+{
+    SLM_ASSERT("rw not instanced", rw);
+    typename LOCATION::sptr location;
+    location = LOCATION::dynamicCast( rw->getLocation() );
+    if ( !location )
+    {
+        location = LOCATION::New();
+        rw->setLocation(location);
+    }
+    return location;
+}
+
+/// test if a Reader/writer (ie a class implementing get/setLocation) have an specialized LOCATION
+template<class LOCATION, class RW >
+inline bool have(RW *rw)
+{
+    return LOCATION::dynamicCast( rw->getLocation() );
+}
+
+}
+}
+
+#endif /* LOCATION_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/location/MultiFiles.hpp b/SrcLib/core/fwData/include/fwData/location/MultiFiles.hpp
new file mode 100644
index 0000000..d27f7d2
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/location/MultiFiles.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_LOCATION_MULTIFILES_HPP_
+#define _FWDATA_LOCATION_MULTIFILES_HPP_
+
+#include <vector>
+#include <boost/filesystem/path.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/location/ILocation.hpp"
+
+
+namespace fwData
+{
+namespace location
+{
+/**
+ * @class MultiFiles
+ * @brief This class defines a multi files location.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API MultiFiles  : public ILocation
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MultiFiles)(ILocation), (()),  ::fwData::factory::New< MultiFiles > ) ;
+
+    /// Constructor
+    FWDATA_API MultiFiles( ::fwData::Object::Key key );
+
+    /// Destructor
+    FWDATA_API virtual ~MultiFiles();
+
+    /// Set file system paths
+    FWDATA_API void setPaths( VectPathType paths );
+
+    /// Set file system paths
+    FWDATA_API VectPathType getPaths();
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+protected :
+
+    /// file system paths
+    VectPathType m_paths;
+
+};
+
+/**
+ * @struct enableMultiFiles
+ * @brief This class is derived by reader/writer.
+ *
+ * Reader/Writer classes should only need to implement get/setLocation
+ *
+ * 
+ * @date 2007-2009.
+ */
+template<class RW> // reader or writer class should only need to implement get/setLocation
+struct enableMultiFiles
+{
+    /**
+     * @brief constructor
+     * @param[in] rw reader or writer
+     */
+    enableMultiFiles(RW *rw) : m_rw(rw)
+    {
+        SLM_ASSERT("m_rw not instanced", m_rw);
+    }
+
+    /// Set file system paths
+    void setFiles( ILocation::VectPathType paths )
+    {
+        getLocation<MultiFiles>(m_rw)->setPaths(paths);
+    }
+
+    /// Get file system paths
+    ILocation::VectPathType getFiles()
+    {
+        return getLocation<MultiFiles>(m_rw)->getPaths();
+    }
+
+private :
+    /// Not implemented must use constructor with one parameter
+    enableMultiFiles();
+    RW *m_rw;
+};
+
+}
+}
+
+#endif /* _FWDATA_LOCATION_MULTIFILES_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/location/Namespace.hpp b/SrcLib/core/fwData/include/fwData/location/Namespace.hpp
new file mode 100644
index 0000000..70be21b
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/location/Namespace.hpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATALOCATIONNAMESPACE_HPP_
+#define FWDATALOCATIONNAMESPACE_HPP_
+
+namespace fwData
+{
+/**
+ * @brief       This namespace fwData::location contains the representation of the data objects oriented to fileSystem locations (folder, file...).
+ * @namespace   fwData::location
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace location
+{
+}
+}
+#endif /* FWDATALOCATIONNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/location/SingleFile.hpp b/SrcLib/core/fwData/include/fwData/location/SingleFile.hpp
new file mode 100644
index 0000000..3f2c7be
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/location/SingleFile.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_LOCATION_SINGLEFILE_HPP_
+#define _FWDATA_LOCATION_SINGLEFILE_HPP_
+
+
+#include <boost/filesystem.hpp>
+
+#include "fwData/config.hpp"
+#include "fwData/location/ILocation.hpp"
+#include "fwData/factory/new.hpp"
+
+fwCampAutoDeclareDataMacro((fwData)(location)(SingleFile), FWDATA_API);
+
+
+namespace fwData
+{
+namespace location
+{
+/**
+ * @class SingleFile
+ * @brief This class defines a single file %location.
+ * 
+ * @date    2007-2009.
+ */
+class FWDATA_CLASS_API SingleFile  : public ILocation
+{
+public:
+    fwCoreClassDefinitionsWithNFactoriesMacro(
+            (SingleFile)(ILocation),
+            ((::fwData::factory::New< SingleFile > ,() ))
+            ((SingleFileFactory ,((::boost::filesystem::path)) ))
+    );
+
+
+    /// Constructor
+    FWDATA_API SingleFile( ::fwData::Object::Key key );
+
+    /// Destructor
+    FWDATA_API virtual ~SingleFile();
+
+
+    fwCampMakeFriendDataMacro((fwData)(location)(SingleFile));
+
+    /// Defines shallow copy
+    FWDATA_API void shallowCopy( const Object::csptr& _source );
+
+    /// Defines deep copy
+    FWDATA_API void cachedDeepCopy(const Object::csptr& _source, DeepCopyCacheType &cache);
+
+    /// Set file system path
+    FWDATA_API void setPath( PathType path);
+
+    /// Get file system path
+    FWDATA_API PathType getPath() const;
+
+protected :
+
+    FWDATA_API static sptr SingleFileFactory(PathType path);
+
+    /// file system path
+    PathType m_path;
+
+};
+
+/**
+ * @struct enableSingleFile
+ * @brief This class is derived by reader/writer.
+ *
+ * Reader/Writer classes should only need to implement get/setLocation
+ *
+ * 
+ * @date    2007-2009.
+ */
+template<typename RW> // reader or writer class should only need to implement get/setLocation
+struct enableSingleFile
+{
+    /**
+     * @brief constructor
+     * @param[in] rw reader or writer
+     */
+    enableSingleFile(RW *rw) : m_rw(rw)
+    {
+        SLM_ASSERT("m_rw not instanced", m_rw);
+    }
+
+    /// Set file system path
+    void setFile(ILocation::PathType path)
+    {
+        getLocation<SingleFile>(m_rw)->setPath(path);
+    }
+
+    /// Get file system path
+    ILocation::PathType getFile()
+    {
+        return (getLocation<SingleFile>(m_rw))->getPath();
+    }
+
+private :
+    /// Not implemented must use constructor with one parameter
+    enableSingleFile();
+    RW *m_rw;
+
+};
+
+}
+}
+
+#endif /* _FWDATA_LOCATION_SINGLEFILE_HPP_ */
diff --git a/SrcLib/core/fwData/include/fwData/macros.hpp b/SrcLib/core/fwData/include/fwData/macros.hpp
new file mode 100644
index 0000000..e3652df
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/macros.hpp
@@ -0,0 +1,237 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_MACROS_HPP__
+#define __FWDATA_MACROS_HPP__
+
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/or.hpp>
+#include <boost/preprocessor/cat.hpp>
+#include <boost/type_traits/is_class.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+
+#include <fwCore/macros.hpp>
+/**
+ * @file fwData/macros.hpp
+ * @brief fwData specific macros.
+ *
+ * 
+ */
+
+
+namespace fwData
+{
+template<typename T>
+struct is_smart_ptr : ::boost::mpl::false_ { };
+
+template<typename T>
+struct is_smart_ptr< SPTR(T) > : ::boost::mpl::true_ { };
+
+template<typename T>
+struct is_smart_ptr< WPTR(T) > : ::boost::mpl::true_ { };
+
+} //namespace fwData
+
+/*
+ * macros used for getters/setters
+ *
+ * funcName : name of the function ("Firstname" for getFirstname() function)
+ * var : name of the variable without "m_" ("firstname" for m_firstname variable)
+ * type : type of the variable (float, std::string, ...)
+ * text : comment used in doxygen
+ */
+//-----------------------------------
+// Getter/Setter macros
+//-----------------------------------
+#define __FWDATA_CLASS_ATTRIBUTE_PREFIX m_
+#define __FWDATA_GENERATED_ATTRIBUTE_PREFIX attr
+
+//-----------------------------------
+
+#define fwDataGetMacro(attrName, attrType)                                                    \
+attrType get##attrName () const                                                               \
+{                                                                                             \
+BOOST_MPL_ASSERT(                                                                             \
+        ( boost::mpl::or_< boost::is_fundamental< attrType > , boost::is_enum< attrType > > ) \
+        /* This macro is intended to be used with fundamental types. */                       \
+        );                                                                                    \
+    return BOOST_PP_CAT(                                                                      \
+                       __FWDATA_CLASS_ATTRIBUTE_PREFIX,                                       \
+                       BOOST_PP_CAT(__FWDATA_GENERATED_ATTRIBUTE_PREFIX,attrName)             \
+                       );                                                                     \
+}
+
+#define fwDataSetMacro(attrName, attrType)                                                    \
+void set##attrName (attrType val)                                                             \
+{                                                                                             \
+BOOST_MPL_ASSERT(                                                                             \
+        ( boost::mpl::or_< boost::is_fundamental< attrType > , boost::is_enum< attrType > > ) \
+        /* This macro is intended to be used with fundamental types. */                       \
+        );                                                                                    \
+    BOOST_PP_CAT(                                                                             \
+                __FWDATA_CLASS_ATTRIBUTE_PREFIX,                                              \
+                BOOST_PP_CAT(__FWDATA_GENERATED_ATTRIBUTE_PREFIX,attrName)                    \
+                ) = val;                                                                      \
+}
+
+#define fwDataGetSptrMacro(attrName, attrType)                                       \
+attrType get##attrName () const                                                      \
+{                                                                                    \
+BOOST_MPL_ASSERT(                                                                    \
+        ( ::fwData::is_smart_ptr< attrType > )                                       \
+        /* This macro is intended to be used with smart_ptr types. */                \
+        );                                                                           \
+    return BOOST_PP_CAT(                                                             \
+                        __FWDATA_CLASS_ATTRIBUTE_PREFIX,                             \
+                        BOOST_PP_CAT( __FWDATA_GENERATED_ATTRIBUTE_PREFIX, attrName) \
+                        );                                                           \
+}
+
+#define fwDataSetSptrMacro(attrName, attrType)                               \
+void set##attrName (attrType val)                                            \
+{                                                                            \
+BOOST_MPL_ASSERT(                                                            \
+        ( ::fwData::is_smart_ptr< attrType > )                               \
+        /* This macro is intended to be used with smart_ptr types. */        \
+        );                                                                   \
+    BOOST_PP_CAT(                                                            \
+                __FWDATA_CLASS_ATTRIBUTE_PREFIX,                             \
+                BOOST_PP_CAT( __FWDATA_GENERATED_ATTRIBUTE_PREFIX, attrName) \
+                ) = val;                                                     \
+}
+
+//-----------------------------------
+
+#define fwDataGetCRefMacro(attrName, attrType)                                                     \
+const attrType &get##attrName () const                                                             \
+{                                                                                                  \
+BOOST_MPL_ASSERT(                                                                                  \
+        ( boost::is_class< attrType > )                                                            \
+        /* This macro is intended to be used with non fundamental types and non smart-pointers. */ \
+        );                                                                                         \
+    return BOOST_PP_CAT(                                                                           \
+                        __FWDATA_CLASS_ATTRIBUTE_PREFIX,                                           \
+                        BOOST_PP_CAT(__FWDATA_GENERATED_ATTRIBUTE_PREFIX, attrName)                \
+                        );                                                                         \
+}
+
+#define fwDataSetCRefMacro(attrName, attrType)                                                     \
+void set##attrName (const attrType &val)                                                           \
+{                                                                                                  \
+BOOST_MPL_ASSERT(                                                                                  \
+        ( boost::is_class< attrType > )                                                            \
+        /* This macro is intended to be used with non fundamental types and non smart-pointers. */ \
+        );                                                                                         \
+    BOOST_PP_CAT(                                                                                  \
+                __FWDATA_CLASS_ATTRIBUTE_PREFIX,                                                   \
+                BOOST_PP_CAT(__FWDATA_GENERATED_ATTRIBUTE_PREFIX, attrName)                        \
+                ) = val;                                                                           \
+}
+
+//-----------------------------------
+
+#define fwDataGetSetMacro(attrName, attrType) \
+    /** @{ */                                 \
+    fwDataGetMacro(attrName, attrType)        \
+    fwDataSetMacro(attrName, attrType)        \
+    /** @}  */
+
+#define fwDataGetSetSptrMacro(attrName, attrType) \
+    /** @{ */                                     \
+    fwDataGetSptrMacro(attrName, attrType)        \
+    fwDataSetSptrMacro(attrName, attrType)        \
+    /** @}  */
+
+#define fwDataGetSetCRefMacro(attrName, attrType) \
+    /** @{ */                                     \
+    fwDataGetCRefMacro(attrName, attrType)        \
+    fwDataSetCRefMacro(attrName, attrType)        \
+    /** @}  */
+
+
+
+//-----------------------------------
+// Old Getter/Setter macros
+//-----------------------------------
+
+#define fwGettersSettersMacro(funcName, var, type) \
+    /** @name funcName accessor      */            \
+    /** @{                           */            \
+    fwGettersMacro(funcName, var, type);           \
+    fwSettersMacro(funcName, var, type);           \
+    /**@}                            */
+
+#define fwGettersSettersDocMacro(funcName, var, type, text ) \
+    /** text                         */                      \
+    /** @name funcName accessor      */                      \
+    /** Get/Set text                 */                      \
+    /** @{                           */                      \
+    fwGettersMacro(funcName, var, type);                     \
+    fwSettersMacro(funcName, var, type);                     \
+    /**@}                            */
+
+//-----------------------------------
+// Setter
+//-----------------------------------
+#define fwSettersMacro(funcName, var, type) \
+    fwSetMacro(funcName, var, type);        \
+    fwSetCRefMacro(funcName, var, type);
+
+//-----------------------------------
+//
+#define fwSetMacro(funcName, var, type)    \
+    void set##funcName (const type _##var) \
+    {                                      \
+        this->m_##var = _##var;            \
+    }
+
+//-----------------------------------
+//
+#define fwSetCRefMacro(funcName, var, type)      \
+    void setCRef##funcName (const type & _##var) \
+    {                                            \
+        this->m_##var = _##var;                  \
+    }
+
+//-----------------------------------
+
+
+//-----------------------------------
+// Getter
+//-----------------------------------
+#define fwGettersMacro(funcName, var, type) \
+    fwGetMacro(funcName, var, type);        \
+    fwGetRefMacro(funcName, var, type);     \
+    fwGetCRefMacro(funcName, var, type);
+
+
+//-----------------------------------
+//
+#define fwGetMacro(funcName, var, type) \
+    const type get##funcName () const   \
+    {                                   \
+        return m_##var;                 \
+    }
+
+//-----------------------------------
+//
+#define fwGetRefMacro(funcName, var, type) \
+    type & getRef##funcName ()             \
+    {                                      \
+        return this->m_##var;              \
+    }
+
+//-----------------------------------
+//
+#define fwGetCRefMacro(funcName, var, type) \
+    const type & getCRef##funcName () const \
+    {                                       \
+        return this->m_##var;               \
+    }
+
+#endif //__FWDATA_MACROS_HPP__
+
diff --git a/SrcLib/core/fwData/include/fwData/mt/Namespace.hpp b/SrcLib/core/fwData/include/fwData/mt/Namespace.hpp
new file mode 100644
index 0000000..5e523b3
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/mt/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_MT_NAMESPACE_HPP__
+#define __FWDATA_MT_NAMESPACE_HPP__
+
+
+namespace fwData
+{
+/**
+ * @brief       This namespace fwData::mt contains helper to lock object for multi-threading.
+ * @namespace   fwData::mt
+ * 
+ * @date        2012.
+ *
+ */
+namespace mt
+{
+
+}
+}
+#endif /* __FWDATA_MT_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwData/include/fwData/mt/ObjectReadLock.hpp b/SrcLib/core/fwData/include/fwData/mt/ObjectReadLock.hpp
new file mode 100644
index 0000000..51d8825
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/mt/ObjectReadLock.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_MT_OBJECTREADLOCK_HPP_
+#define _FWDATA_MT_OBJECTREADLOCK_HPP_
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwData/Object.hpp"
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+/**
+ * @class  ObjectReadLock
+ * @brief  A helper to lock object on read mode.
+ * 
+ * @date   2012.
+ */
+class FWDATA_CLASS_API ObjectReadLock
+{
+
+public :
+
+    /**
+     * @brief Constructor : owns an read lock on object mutex.
+     * If adopt_lock==false : the mutex is not locked (call lock() to lock mutex)
+     */
+    FWDATA_API ObjectReadLock( ::fwData::Object::sptr obj, bool lock=true );
+
+    /// Destructor. Does nothing
+    FWDATA_API ~ObjectReadLock();
+
+    /// Adds read lock on object mutex
+    FWDATA_API void lock();
+
+    /// Releases lock on object mutex
+    FWDATA_API void unlock();
+
+private :
+
+    /// lock on object mutex
+    ::fwCore::mt::ReadLock m_lock;
+};
+
+} // mt
+} // fwData
+
+#endif // _FWDATA_MT_OBJECTREADLOCK_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/mt/ObjectReadToWriteLock.hpp b/SrcLib/core/fwData/include/fwData/mt/ObjectReadToWriteLock.hpp
new file mode 100644
index 0000000..be096e8
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/mt/ObjectReadToWriteLock.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_MT_OBJECTREADTOWRITELOCK_HPP_
+#define _FWDATA_MT_OBJECTREADTOWRITELOCK_HPP_
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwData/Object.hpp"
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+/**
+ * @class  ObjectReadToWriteLock
+ * @brief  A helper to lock object on upgradable mode.
+ * 
+ * @date   2012.
+ */
+class FWDATA_CLASS_API ObjectReadToWriteLock
+{
+
+public :
+
+    /**
+     * @brief Constructor : owns an upgradable lock on object mutex.
+     * If adopt_lock==false : the mutex is not locked (call lock() to lock mutex)
+     */
+    FWDATA_API ObjectReadToWriteLock( ::fwData::Object::sptr obj, bool lock=true );
+
+    /// Destructor. Does nothing
+    FWDATA_API ~ObjectReadToWriteLock();
+
+    /// Adds upgradable lock on object mutex
+    FWDATA_API void lock();
+
+    /// Releases upgradable lock on object mutex
+    FWDATA_API void unlock();
+
+    /// Upgrade lock to exclusive
+    FWDATA_API void upgrade();
+
+    /// Downgrade exclusive lock to upgradable lock
+    FWDATA_API void downgrade();
+
+private :
+
+    /// lock on object mutex
+    ::fwCore::mt::ReadToWriteLock m_lock;
+    SPTR(::fwCore::mt::UpgradeToWriteLock) m_upgradedLock;
+};
+
+} // mt
+} // fwData
+
+#endif // _FWDATA_MT_OBJECTREADTOWRITELOCK_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/mt/ObjectWriteLock.hpp b/SrcLib/core/fwData/include/fwData/mt/ObjectWriteLock.hpp
new file mode 100644
index 0000000..a29067a
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/mt/ObjectWriteLock.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATA_MT_OBJECTWRITELOCK_HPP_
+#define _FWDATA_MT_OBJECTWRITELOCK_HPP_
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwData/Object.hpp"
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+/**
+ * @class  ObjectWriteLock
+ * @brief  A helper to lock object on exclusive mode.
+ * 
+ * @date   2012.
+ */
+class FWDATA_CLASS_API ObjectWriteLock
+{
+
+public :
+
+    /**
+     * @brief Constructor : owns an exclusive lock on object mutex.
+     * If adopt_lock==false : the mutex is not locked (call lock() to lock mutex)
+     */
+    FWDATA_API ObjectWriteLock( ::fwData::Object::sptr obj, bool adopt_lock=true );
+
+    /// Destructor. Does nothing
+    FWDATA_API ~ObjectWriteLock();
+
+    /// Adds exclusive lock on object mutex
+    FWDATA_API void lock();
+
+    /// Releases lock on object mutex
+    FWDATA_API void unlock();
+
+private :
+
+    /// lock on object mutex
+    ::fwCore::mt::WriteLock m_lock;
+};
+
+} // mt
+} // fwData
+
+#endif // _FWDATA_MT_OBJECTWRITELOCK_HPP_
diff --git a/SrcLib/core/fwData/include/fwData/registry/detail.hpp b/SrcLib/core/fwData/include/fwData/registry/detail.hpp
new file mode 100644
index 0000000..8d621fe
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/registry/detail.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_REGISTRY_DETAIL_HPP__
+#define __FWDATA_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwData/config.hpp"
+
+namespace fwData
+{
+
+class Object;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwData::Object) () , KeyType > Type;
+
+FWDATA_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace fwData
+
+#endif /* __FWDATA_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwData/include/fwData/registry/macros.hpp b/SrcLib/core/fwData/include/fwData/registry/macros.hpp
new file mode 100644
index 0000000..7dd3bfb
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/registry/macros.hpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_REGISTRY_MACRO_HPP__
+#define __FWDATA_REGISTRY_MACRO_HPP__
+
+#include "fwData/registry/detail.hpp"
+
+namespace fwData
+{
+namespace registry
+{
+
+#define fwDataRegisterMacro( classname )                                  \
+    static ::fwData::Object::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // end namespace registry
+} // end namespace fwData
+
+#endif /*__FWDATA_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwData/include/fwData/registry/namespace.hpp b/SrcLib/core/fwData/include/fwData/registry/namespace.hpp
new file mode 100644
index 0000000..b5b089a
--- /dev/null
+++ b/SrcLib/core/fwData/include/fwData/registry/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_REGISTRY_NAMESPACE_HPP__
+#define __FWDATA_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwData
+{
+
+/**
+ * @brief       Contains fwData::registry details
+ * @namespace   fwData::registry
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwData
+
+#endif /* __FWDATA_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwData/src/fwData/Array.cpp b/SrcLib/core/fwData/src/fwData/Array.cpp
new file mode 100644
index 0000000..cfe8ef2
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Array.cpp
@@ -0,0 +1,324 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <numeric>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Array.hpp"
+
+
+namespace fwData
+{
+
+fwDataRegisterMacro( ::fwData::Array );
+
+inline size_t computeSize(
+        size_t elementSize,
+        const ::fwData::Array::SizeType &size,
+        size_t nbOfComponents )
+{
+    size_t total = 0;
+    if (!size.empty())
+    {
+        total = elementSize;
+        total *= std::accumulate (size.begin(), size.end(), nbOfComponents, std::multiplies< ::fwData::Array::SizeType::value_type >() );
+    }
+    return total;
+}
+
+::fwData::Array::OffsetType Array::computeStrides( SizeType size, size_t nbOfComponents, size_t sizeOfType )
+{
+    ::fwData::Array::OffsetType strides;
+    strides.reserve(size.size());
+
+    size_t currentStride = sizeOfType*nbOfComponents;
+    BOOST_FOREACH(SizeType::value_type s, size)
+    {
+        strides.push_back(currentStride);
+        currentStride *= s;
+    }
+    return strides;
+}
+
+//------------------------------------------------------------------------------
+
+Array::Array( ::fwData::Object::Key key ):
+    m_strides(0),
+    m_type(),
+    m_attrBufferObject(::fwMemory::BufferObject::New()),
+    m_size(0),
+    m_nbOfComponents(0),
+    m_isBufferOwner(true)
+{
+}
+
+//------------------------------------------------------------------------------
+
+Array::~Array()
+{
+    this->clear();
+}
+
+//------------------------------------------------------------------------------
+
+void Array::swap( Array::sptr _source )
+{
+    m_fields.swap(_source->m_fields);
+    m_strides.swap(_source->m_strides);
+    m_size.swap(_source->m_size);
+    m_attrBufferObject->swap(_source->m_attrBufferObject);
+
+    std::swap(m_type, _source->m_type);
+    std::swap(m_nbOfComponents, _source->m_nbOfComponents);
+    std::swap(m_isBufferOwner, _source->m_isBufferOwner);
+}
+
+//------------------------------------------------------------------------------
+
+void Array::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Array::csptr other = Array::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    this->clear();
+
+    if( !other->m_attrBufferObject->isEmpty() )
+    {
+        ::fwMemory::BufferObject::Lock lockerDest(m_attrBufferObject);
+        this->resize(other->m_type, other->m_size, other->m_nbOfComponents, true);
+        char * buffDest = static_cast< char * >( lockerDest.getBuffer() );
+        ::fwMemory::BufferObject::Lock lockerSource(other->m_attrBufferObject);
+        char * buffSrc = static_cast< char * >( lockerSource.getBuffer() );
+        std::copy(buffSrc, buffSrc+other->getSizeInBytes(), buffDest );
+    }
+    else
+    {
+        m_strides        = other->m_strides;
+        m_type           = other->m_type;
+        m_size           = other->m_size;
+        m_nbOfComponents = other->m_nbOfComponents;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::resize(
+        const ::fwTools::Type &type,
+        const SizeType &size,
+        size_t nbOfComponents,
+        bool reallocate
+        ) throw(::fwData::Exception)
+{
+    nbOfComponents = (nbOfComponents == 0) ? 1 : nbOfComponents;
+    size_t bufSize = computeSize(type.sizeOf(), size, nbOfComponents);
+
+    if(reallocate && (m_isBufferOwner || m_attrBufferObject->isEmpty()))
+    {
+        if(m_attrBufferObject->isEmpty())
+        {
+            m_attrBufferObject->allocate(bufSize);
+        }
+        else
+        {
+            m_attrBufferObject->reallocate(bufSize);
+        }
+        m_isBufferOwner = true;
+    }
+    else if(reallocate && !m_isBufferOwner)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwData::Exception,
+                "Tried to reallocate a not-owned Buffer.");
+    }
+
+    m_strides = computeStrides(size, nbOfComponents, type.sizeOf());
+    m_type           = type;
+    m_size           = size;
+    m_nbOfComponents = nbOfComponents;
+
+    return bufSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::resize(const SizeType &size, size_t nbOfComponents, bool reallocate) throw(::fwData::Exception)
+{
+    return this->resize(m_type, size, nbOfComponents, reallocate);
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::resize(const SizeType &size, bool reallocate) throw(::fwData::Exception)
+{
+    return this->resize(m_type, size, m_nbOfComponents, reallocate);
+}
+//------------------------------------------------------------------------------
+
+size_t Array::resize(const std::string &type, const SizeType &size, size_t nbOfComponents, bool reallocate) throw(::fwData::Exception)
+{
+    ::fwTools::Type fwType = ::fwTools::Type::create(type);
+    return this->resize( fwType, size, nbOfComponents, reallocate);
+}
+
+//------------------------------------------------------------------------------
+
+void Array::clear()
+{
+    if ( ! this->m_attrBufferObject->isEmpty() )
+    {
+        if(m_isBufferOwner)
+        {
+            this->m_attrBufferObject->destroy();
+        }
+        m_strides.clear();
+        m_type = ::fwTools::Type();
+        m_size.clear();
+        m_nbOfComponents = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool Array::empty() const
+{
+    return m_size.empty();
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getElementSizeInBytes() const
+{
+    return m_type.sizeOf() * m_nbOfComponents;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getNumberOfElements() const
+{
+    return computeSize(1, m_size, m_nbOfComponents);
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getSizeInBytes() const
+{
+    return computeSize(m_type.sizeOf(), m_size, m_nbOfComponents);
+}
+
+//------------------------------------------------------------------------------
+
+
+const ::fwData::Array::SizeType &Array::getSize() const
+{
+    return m_size;
+}
+
+//------------------------------------------------------------------------------
+
+const ::fwData::Array::OffsetType &Array::getStrides() const
+{
+    return m_strides;
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setNumberOfComponents(size_t nb)
+{
+    m_nbOfComponents = (nb == 0) ? 1 : nb;
+    this->resize(
+            m_type,
+            m_size,
+            m_nbOfComponents,
+            (m_isBufferOwner && !m_attrBufferObject->isEmpty())
+            );
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getNumberOfComponents() const
+{
+    return m_nbOfComponents;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getNumberOfDimensions() const
+{
+    return m_size.size();
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setIsBufferOwner(const bool own)
+{
+    m_isBufferOwner = own;
+}
+
+//------------------------------------------------------------------------------
+
+bool Array::getIsBufferOwner() const
+{
+    return m_isBufferOwner;
+}
+
+//------------------------------------------------------------------------------
+
+void Array::setType(const std::string &type)
+{
+    ::fwTools::Type fwType = ::fwTools::Type::create(type);
+    this->setType(fwType);
+}
+
+void Array::setType(const ::fwTools::Type &type)
+{
+    m_type = type;
+    this->resize(
+            m_type,
+            m_size,
+            m_nbOfComponents,
+            (m_isBufferOwner && !m_attrBufferObject->isEmpty())
+            );
+}
+
+
+//------------------------------------------------------------------------------
+
+::fwTools::Type Array::getType() const
+{
+    return m_type;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Array::getBufferOffset( const ::fwData::Array::IndexType &id, size_t component, size_t sizeOfType ) const
+{
+    OSLM_ASSERT(
+            "Given index has " << id.size() << " dimensions, but Array has " << m_size.size() << "dimensions.",
+            id.size() == m_size.size()
+            );
+
+    OffsetType offsets(id.size());
+
+    std::transform(id.begin(), id.end(), m_strides.begin(), offsets.begin(), std::multiplies<OffsetType::value_type>() );
+
+    size_t offset;
+    offset = std::accumulate(offsets.begin(), offsets.end(), size_t(0));
+
+    offset += component*sizeOfType;
+
+    return offset;
+}
+
+//------------------------------------------------------------------------------
+
+}//namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Boolean.cpp b/SrcLib/core/fwData/src/fwData/Boolean.cpp
new file mode 100644
index 0000000..32f4381
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Boolean.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Object.hpp"
+#include "fwData/GenericField.hpp"
+#include "fwData/Boolean.hpp"
+
+fwDataRegisterMacro( ::fwData::Boolean );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Boolean::Boolean( ::fwData::Object::Key key  ) throw()
+:   GenericField< bool >( false )
+{}
+
+//------------------------------------------------------------------------------
+
+Boolean::~Boolean() throw()
+{}
+
+//------------------------------------------------------------------------------
+void Boolean::shallowCopy(const Object::csptr &_source )
+{
+    Boolean::csptr other = Boolean::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_value = other->m_value;
+}
+
+//------------------------------------------------------------------------------
+
+void Boolean::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Boolean::csptr other = Boolean::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_value = other->m_value;
+}
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Camera.cpp b/SrcLib/core/fwData/src/fwData/Camera.cpp
new file mode 100644
index 0000000..8700a3b
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Camera.cpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Video.hpp"
+#include "fwData/Camera.hpp"
+
+fwDataRegisterMacro(::fwData::Camera);
+
+namespace fwData
+{
+
+Camera::Camera( ::fwData::Object::Key key )
+    : m_attrSkew(0.0), m_dataAvailable(false)
+{
+    SLM_TRACE_FUNC();
+
+    m_extrinsicMatrix = ::fwData::TransformationMatrix3D::New();
+    m_intrinsicMatrix = ::fwData::TransformationMatrix3D::New();
+
+    uint32HL def = { 0, 0 };
+    m_cameraGUID = std::make_pair(false, def);
+}
+
+// -------------------------------------------------------------------------
+
+Camera::~Camera() throw()
+{ SLM_TRACE_FUNC(); }
+
+// -------------------------------------------------------------------------
+
+void Camera::setCameraGUID(uint32HL cameraGUID)
+{
+    m_cameraGUID.first = true;
+    m_cameraGUID.second = cameraGUID;
+}
+
+// -------------------------------------------------------------------------
+
+void Camera::setDistortionCoefficient(double k1, double k2,
+                                      double p1, double p2, double k3)
+{
+    m_attrDistortionCoefficient[0] = k1;
+    m_attrDistortionCoefficient[1] = k2;
+    m_attrDistortionCoefficient[2] = p1;
+    m_attrDistortionCoefficient[3] = p2;
+    m_attrDistortionCoefficient[4] = k3;
+}
+
+//------------------------------------------------------------------------------
+
+void Camera::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    Camera::csptr other = Camera::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+} // namespace fwData
+
diff --git a/SrcLib/core/fwData/src/fwData/Color.cpp b/SrcLib/core/fwData/src/fwData/Color.cpp
new file mode 100644
index 0000000..341b9df
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Color.cpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+
+
+#include "fwData/Color.hpp"
+
+fwDataRegisterMacro( ::fwData::Color );
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Color::Color ( ::fwData::Object::Key key )
+{
+    SLM_TRACE_FUNC();
+    m_vRGBA[0] = 1.0;
+    m_vRGBA[1] = 1.0;
+    m_vRGBA[2] = 1.0;
+    m_vRGBA[3] = 1.0;
+}
+
+//------------------------------------------------------------------------------
+Color::sptr Color::ColorFactory(Color::ColorType red, Color::ColorType green, Color::ColorType blue, Color::ColorType alpha)
+{
+    Color::sptr color = ::fwData::Color::New();
+    color->m_vRGBA[0] = red;
+    color->m_vRGBA[1] = green;
+    color->m_vRGBA[2] = blue;
+    color->m_vRGBA[3] = alpha;
+    return color;
+}
+
+//------------------------------------------------------------------------------
+
+Color::~Color ()
+{
+    SLM_TRACE_FUNC();
+}
+
+
+//------------------------------------------------------------------------------
+
+void Color::shallowCopy(const Object::csptr &_source )
+{
+    Color::csptr other = Color::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_vRGBA = other->m_vRGBA;
+}
+
+//------------------------------------------------------------------------------
+
+void Color::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Color::csptr other = Color::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_vRGBA = other->m_vRGBA;
+}
+
+//------------------------------------------------------------------------------
+
+void Color::setRGBA( const ColorType red, const ColorType green, const ColorType blue, const ColorType alpha )
+{
+    m_vRGBA[0] = red;
+    m_vRGBA[1] = green;
+    m_vRGBA[2] = blue;
+    m_vRGBA[3] = alpha;
+}
+
+//------------------------------------------------------------------------------
+
+void Color::setRGBA( std::string  hexaColor )
+{
+    OSLM_ASSERT(
+            "Color string should start with '#' and followed by 6 ou 8 "
+            "hexadecimal digits. Given color : " << hexaColor ,
+            hexaColor[0] == '#'
+                && ( hexaColor.length() == 7 || hexaColor.length() == 9)
+            );
+
+    std::string redString = hexaColor.substr(1, 2);
+    std::string greenString = hexaColor.substr(3, 2);
+    std::string blueString = hexaColor.substr(5, 2);
+    int r,g,b, a = 255;
+
+    std::istringstream iss;
+    iss.str (redString);
+    iss >> std::hex >> r;
+    iss.clear();
+    iss.str (greenString);
+    iss >> std::hex >> g;
+    iss.clear();
+    iss.str (blueString);
+    iss >> std::hex >> b;
+
+    if (hexaColor.length() == 9)
+    {
+        std::string alphaString = hexaColor.substr(7, 2);
+        iss.clear();
+        iss.str (alphaString);
+        iss >> std::hex >> a;
+    }
+
+    this->setRGBA(r/255.0f, g/255.0f, b/255.0f, a/255.0f);
+
+}
+
+//------------------------------------------------------------------------------
+
+Color::ColorType  &Color::red()
+{
+    return m_vRGBA[0];
+}
+Color::ColorType  &Color::green()
+{
+    return m_vRGBA[1];
+}
+Color::ColorType  &Color::blue()
+{
+    return m_vRGBA[2];
+}
+Color::ColorType  &Color::alpha()
+{
+    return m_vRGBA[3];
+}
+
+
+const Color::ColorType  &Color::red() const
+{
+    return m_vRGBA[0];
+}
+const Color::ColorType  &Color::green() const
+{
+    return m_vRGBA[1];
+}
+const Color::ColorType  &Color::blue() const
+{
+    return m_vRGBA[2];
+}
+const Color::ColorType  &Color::alpha() const
+{
+    return m_vRGBA[3];
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Composite.cpp b/SrcLib/core/fwData/src/fwData/Composite.cpp
new file mode 100644
index 0000000..ef261b4
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Composite.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <boost/foreach.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+
+#include "fwData/Composite.hpp"
+
+
+fwDataRegisterMacro( ::fwData::Composite );
+
+namespace fwData
+{
+
+
+Composite::Composite( ::fwData::Object::Key key )
+{
+    SLM_TRACE_FUNC();
+}
+
+
+Composite::~Composite()
+{
+    SLM_TRACE_FUNC();
+}
+
+
+//------------------------------------------------------------------------------
+
+void Composite::shallowCopy(const Object::csptr &_source )
+{
+    Composite::csptr other = Composite::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_attrContainer.clear();
+
+    m_attrContainer = other->m_attrContainer;
+}
+
+//------------------------------------------------------------------------------
+
+void Composite::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Composite::csptr other = Composite::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_attrContainer.clear();
+
+    BOOST_FOREACH(const ValueType &elem, *other)
+    {
+        m_attrContainer.insert( ValueType(elem.first, ::fwData::Object::copy(elem.second, cache) ) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwData/src/fwData/Edge.cpp b/SrcLib/core/fwData/src/fwData/Edge.cpp
new file mode 100644
index 0000000..bca17a4
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Edge.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Edge.hpp"
+
+fwDataRegisterMacro( ::fwData::Edge );
+namespace fwData {
+std::string Edge::NATURE_FLOW = "flow";
+std::string Edge::NATURE_DATA = "data";
+
+//------------------------------------------------------------------------------
+
+Edge::Edge( ::fwData::Object::Key key ) :
+    m_fromPortIdentifier("not defined"), m_toPortIdentifier("not defined"), m_nature("not defined")
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+Edge::~Edge()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Edge::setIdentifiers(const std::string & fromPortIndentifier, const std::string & toPortIndentifier)
+{
+    m_fromPortIdentifier = fromPortIndentifier;
+    m_toPortIdentifier = toPortIndentifier;
+}
+
+//------------------------------------------------------------------------------
+
+std::pair<std::string,std::string> Edge::getIdentifiers() const
+{
+    return make_pair(m_fromPortIdentifier , m_toPortIdentifier);
+}
+
+//------------------------------------------------------------------------------
+
+std::string Edge::getFromPortID() const
+{
+    return m_fromPortIdentifier;
+}
+
+//------------------------------------------------------------------------------
+
+std::string Edge::getToPortID() const
+{
+    return m_toPortIdentifier;
+}
+
+//------------------------------------------------------------------------------
+
+
+std::string Edge::getPortID(bool upStream) const
+{
+    return upStream?m_fromPortIdentifier:m_toPortIdentifier;
+}
+
+//------------------------------------------------------------------------------
+
+void Edge::setNature(std::string nature)
+{
+    m_nature =  nature;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string &Edge::getNature() const
+{
+    return m_nature;
+}
+
+//------------------------------------------------------------------------------
+void Edge::shallowCopy(const Object::csptr &_source )
+{
+    Edge::csptr other = Edge::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( _source );
+    m_fromPortIdentifier = other->m_fromPortIdentifier;
+    m_toPortIdentifier = other->m_toPortIdentifier;
+    m_nature = other->m_nature;
+}
+
+//------------------------------------------------------------------------------
+
+void Edge::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Edge::csptr other = Edge::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_fromPortIdentifier = other->m_fromPortIdentifier;
+    m_toPortIdentifier = other->m_toPortIdentifier;
+    m_nature = other->m_nature;
+
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Exception.cpp b/SrcLib/core/fwData/src/fwData/Exception.cpp
new file mode 100644
index 0000000..0f7eff6
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Exception.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/Exception.hpp"
+
+namespace fwData
+{
+
+Exception::Exception(const std::string &message) throw()
+: ::fwCore::Exception(message)
+{}
+
+
+Exception::~Exception() throw()
+{}
+
+
+    
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Float.cpp b/SrcLib/core/fwData/src/fwData/Float.cpp
new file mode 100644
index 0000000..5f2627e
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Float.cpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Object.hpp"
+#include "fwData/GenericField.hpp"
+#include "fwData/Float.hpp"
+
+fwDataRegisterMacro( ::fwData::Float );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Float::Float( ) throw()
+{}
+
+
+//------------------------------------------------------------------------------
+
+Float::Float( ::fwData::Object::Key key ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+Float::~Float() throw()
+{}
+
+//------------------------------------------------------------------------------
+void Float::shallowCopy(const Object::csptr &_source )
+{
+    Float::csptr other = Float::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_value = other->m_value;
+}
+
+//------------------------------------------------------------------------------
+
+void Float::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Float::csptr other = Float::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_value = other->m_value;
+}
+
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/GenericFieldBase.cpp b/SrcLib/core/fwData/src/fwData/GenericFieldBase.cpp
new file mode 100644
index 0000000..630a993
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/GenericFieldBase.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwData/GenericFieldBase.hpp"
+
+
+namespace fwData 
+{
+
+std::ostream& operator<<( std::ostream &_os, const ::fwData::GenericFieldBase &lf )
+{
+    return lf.toOStream(_os);
+}
+
+} //namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Graph.cpp b/SrcLib/core/fwData/src/fwData/Graph.cpp
new file mode 100644
index 0000000..c0bad03
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Graph.cpp
@@ -0,0 +1,384 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+#include <fwCom/Signals.hpp>
+
+
+#include <boost/foreach.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Edge.hpp"
+#include "fwData/Port.hpp"
+#include "fwData/Node.hpp"
+#include "fwData/Graph.hpp"
+
+fwDataRegisterMacro( ::fwData::Graph );
+
+namespace fwData
+{
+
+const bool Graph::UP_STREAM = true;
+const bool Graph::DOWN_STREAM = false;
+
+const ::fwCom::Signals::SignalKeyType Graph::s_UPDATED_SIG = "updated";
+
+//------------------------------------------------------------------------------
+
+Graph::Graph(::fwData::Object::Key key) :
+    m_sigUpdated(UpdatedSignalType::New())
+{
+    // Init
+
+    // Register
+    m_signals( s_UPDATED_SIG,  m_sigUpdated);
+
+#ifdef COM_LOG
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+
+}
+
+//------------------------------------------------------------------------------
+
+Graph::~Graph()
+{}
+
+//------------------------------------------------------------------------------
+
+bool Graph::addNode( Node::sptr node)
+{
+    return m_nodes.insert(node).second;
+}
+
+//------------------------------------------------------------------------------
+
+bool Graph::removeNode( Node::csptr node)
+{
+    // test if connected edge to it
+    if ( haveConnectedEdges(node) )
+    {
+        return false;
+    }
+    return (m_nodes.erase( Node::constCast(node) ) > 0 );
+}
+
+//------------------------------------------------------------------------------
+
+Graph::NodeContainer &Graph::getRefNodes()
+{
+    return m_nodes;
+}
+
+//------------------------------------------------------------------------------
+
+const Graph::NodeContainer &Graph::getCRefNodes() const
+{
+    return m_nodes;
+}
+
+//------------------------------------------------------------------------------
+
+bool Graph::haveConnectedEdges(Node::csptr node ) const
+{
+    for ( ConnectionContainer::const_iterator i=m_connections.begin() ; i !=  m_connections.end() ; ++i )
+    {
+        if ( i->second.first == node ||  i->second.second == node)
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+Edge::sptr Graph::makeConnection(
+        Node::csptr nodeSource,
+        std::string nodeSourceOutputPortID,
+        Node::csptr nodeDestination,
+        std::string nodeDestinationInputPortID,
+        std::string EdgeNature )
+{
+    ::fwData::Edge::sptr nEdge = ::fwData::Edge::New();
+    nEdge->setIdentifiers( nodeSourceOutputPortID, nodeDestinationInputPortID );
+    nEdge->setNature( EdgeNature );
+    if ( addEdge( nEdge, nodeSource, nodeDestination ) )
+    {
+          return nEdge;// success return new Edge
+    }
+    else
+    {
+        return ::fwData::Edge::sptr(); // failure
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool Graph::addEdge(Edge::sptr edge, Node::csptr nodeSource, Node::csptr nodeDestination)
+{
+    // edge not already recorded
+    if (m_connections.find( edge ) !=  m_connections.end() )
+    {
+        return false; // edge already stored
+    }
+    // node registred ?
+    if (m_nodes.find( Node::constCast(nodeSource) ) ==  m_nodes.end() )
+    {
+        return false; // node already stored
+    }
+    // node registred ?
+    if ( m_nodes.find( Node::constCast(nodeDestination) ) ==  m_nodes.end() )
+    {
+        return false; // node already stored
+    }
+
+    // test port existance
+    Port::sptr sourcePort = nodeSource->findPort( edge->getIdentifiers().first, DOWN_STREAM );
+    if ( !sourcePort )
+    {
+        return false; // port doesn't exist
+    }
+
+    // test port existance
+    Port::sptr sourceDest= nodeDestination->findPort( edge->getIdentifiers().second , UP_STREAM );
+    if ( !sourceDest )
+    {
+        return false; // port doesn't exist
+    }
+
+
+    // test port compatibility
+    if ( sourcePort->getType() !=  sourceDest->getType() )
+    {
+        return false; // incompatible type
+    }
+
+    m_connections[ edge ] = std::make_pair(  Node::constCast(nodeSource), Node::constCast(nodeDestination) );
+
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+bool Graph::removeEdge(Edge::sptr edge)
+{
+    return ( m_connections.erase(edge) != 0 );
+}
+
+//------------------------------------------------------------------------------
+
+Node::sptr Graph::getSourceNode(Edge::sptr edge)
+{
+    return getNode( edge, UP_STREAM );
+}
+
+//------------------------------------------------------------------------------
+
+Node::sptr Graph::getDestinationNode( Edge::sptr edge )
+{
+    return getNode( edge, DOWN_STREAM );
+}
+
+//------------------------------------------------------------------------------
+
+Node::sptr Graph::getNode( Edge::sptr edge, bool upStream )
+{
+    ConnectionContainer::iterator i;
+    i = m_connections.find( edge );
+
+    // check edge is valid ?
+    if ( i ==  m_connections.end() )
+    {
+        return Node::sptr();
+    }
+
+    if( upStream )
+    {
+        return (*i).second.first;
+    }
+    else
+    {
+        return (*i).second.second;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< Edge::sptr > Graph::getInputEdges( Node::csptr node )
+{
+    return getEdges( node, UP_STREAM );
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< Edge::sptr > Graph::getOutputEdges( Node::csptr node )
+{
+    return getEdges( node, DOWN_STREAM );
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< Edge::sptr > Graph::getEdges( const Node::csptr &node, bool upStream,
+                                           const std::string &nature,
+                                           const std::string &portID
+                                           )
+{
+    SLM_ASSERT("Node " + node->getID()  + " not found in graph", m_nodes.find( Node::constCast(node) ) != m_nodes.end());
+    SLM_ASSERT("Port " + portID  + " not found on node" + node->getID(),
+               portID.empty() || node->findPort(portID, upStream));
+
+    std::vector< Edge::sptr > result;
+    result.reserve(4);
+
+    ConnectionContainer::const_iterator end = m_connections.end();
+    for ( ConnectionContainer::const_iterator i=m_connections.begin(); i != end; ++i )
+    {
+        const Edge::sptr &edge = i->first;
+        const Node::sptr &nodeFrom = i->second.first;
+        const Node::sptr &nodeTo = i->second.second;
+
+        bool isConnectedEdge = ( upStream ? nodeTo : nodeFrom ) == node ;
+        if( !isConnectedEdge)
+        {
+            continue;
+        }
+
+        bool isCorrectPort = portID.empty() || portID == ( upStream ? edge->getToPortID() : edge->getFromPortID() );
+        if( !isCorrectPort)
+        {
+            continue;
+        }
+
+        bool isCorrectNature =  nature.empty() || edge->getNature() == nature;
+        if( !isCorrectNature)
+        {
+            continue;
+        }
+
+        result.push_back( edge );
+    }
+
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< ::fwData::Node::sptr >
+Graph::getNodes(
+        const ::fwData::Node::csptr &node,
+        bool upStream,
+        const std::string &nature,
+        const std::string &portID )
+{
+    std::vector< Edge::sptr > edges;
+    edges = getEdges( node, upStream, nature, portID);
+
+    std::vector< Node::sptr > nodes;
+    BOOST_FOREACH( Edge::sptr edge, edges )
+    {
+        Node::sptr distantNode;
+        distantNode = ( upStream ? m_connections[edge].first : m_connections[edge].second );
+
+        if( std::find( nodes.begin(), nodes.end(), distantNode ) == nodes.end() )
+        {
+            nodes.push_back(distantNode);
+        }
+    }
+
+    return nodes;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Graph::getNbNodes() const
+{
+    return m_nodes.size();
+}
+
+//------------------------------------------------------------------------------
+
+size_t Graph::getNbEdges() const
+{
+    return m_connections.size();
+}
+
+//------------------------------------------------------------------------------
+
+const Graph::ConnectionContainer &Graph::getCRefConnections() const
+{
+    return m_connections;
+}
+
+//------------------------------------------------------------------------------
+
+Graph::ConnectionContainer &Graph::getRefConnections()
+{
+    return m_connections;
+}
+
+//------------------------------------------------------------------------------
+
+void Graph::shallowCopy(const Object::csptr &_source )
+{
+    Graph::csptr other = Graph::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_nodes = other->m_nodes;
+    m_connections = other->m_connections;
+}
+
+//------------------------------------------------------------------------------
+
+void Graph::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Graph::csptr other = Graph::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    std::map< ::fwData::Node::sptr, ::fwData::Node::sptr > correspondenceBetweenNodes;
+    typedef std::pair< Edge::sptr,  std::pair<  Node::sptr,  Node::sptr > > ConnectionContainerElt;
+
+    m_nodes.clear();
+    BOOST_FOREACH(const ::fwData::Node::sptr &node, other->m_nodes)
+    {
+        ::fwData::Node::sptr newNode = ::fwData::Object::copy(node, cache);
+        bool addOK =this->addNode(newNode);
+        OSLM_ASSERT("Node "<<newNode->getID() <<" can't be added ", addOK );
+        FwCoreNotUsedMacro(addOK);
+        correspondenceBetweenNodes.insert(std::make_pair(node, newNode));
+    }
+
+    m_connections.clear();
+    BOOST_FOREACH(const ConnectionContainerElt &connection, other->m_connections)
+    {
+        // Edge deep copy .
+        ::fwData::Edge::sptr newEdge = ::fwData::Object::copy(connection.first, cache);
+        ::fwData::Node::sptr oldNode1 = (connection.second).first;
+        ::fwData::Node::sptr oldNode2 = (connection.second).second;
+        if ((correspondenceBetweenNodes.find(Node::constCast(oldNode1))!= correspondenceBetweenNodes.end())
+             && (correspondenceBetweenNodes.find(Node::constCast(oldNode2)) != correspondenceBetweenNodes.end()))
+        {
+            // Add new Edge
+            this->addEdge(newEdge, correspondenceBetweenNodes[oldNode1], correspondenceBetweenNodes[oldNode2]);
+        }
+    }
+    correspondenceBetweenNodes.clear();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Histogram.cpp b/SrcLib/core/fwData/src/fwData/Histogram.cpp
new file mode 100644
index 0000000..acd1f75
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Histogram.cpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include <fwData/Image.hpp>
+
+#include "fwData/Histogram.hpp"
+
+
+fwDataRegisterMacro( ::fwData::Histogram );
+
+
+namespace fwData
+{
+
+Histogram::Histogram(::fwData::Object::Key key) : m_binsWidth(1),
+                                                  m_minValue(0),
+                                                  m_maxValue(100)
+{
+}
+
+//------------------------------------------------------------------------------
+
+Histogram::~Histogram()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Histogram::shallowCopy(const Object::csptr &_source )
+{
+    Histogram::csptr other = Histogram::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_values = other->m_values;
+    m_minValue = other->m_minValue;
+    m_maxValue = other->m_maxValue;
+    m_binsWidth = other->m_binsWidth;
+}
+
+//------------------------------------------------------------------------------
+
+void Histogram::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Histogram::csptr other = Histogram::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_minValue = other->m_minValue;
+    m_maxValue = other->m_maxValue;
+    m_binsWidth = other->m_binsWidth;
+
+    m_values.clear();
+
+    BOOST_FOREACH( long value, other->m_values )
+    {
+        m_values.push_back( value );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Histogram::addPixel( float _pixel )
+{
+    if( this->isInRange( _pixel ) )
+    {
+        int index = static_cast<int>(( _pixel - m_minValue ) / m_binsWidth);
+        m_values[ index ]++;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Histogram::initialize( float _min, float _max, float _binsWidth )
+{
+    SLM_ASSERT("The minimum value can't be greater than the maximum value", _min <= _max);
+
+    m_minValue = _min;
+    m_maxValue = _max;
+    m_binsWidth = _binsWidth;
+
+    m_values.clear();
+
+    if( m_binsWidth != 0 )
+    {
+        int newSize = static_cast<int>(( m_maxValue - m_minValue ) / m_binsWidth);
+        m_values.resize( newSize + 1, 0 );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+long Histogram::getNbPixels( float _min, float _max )
+{
+    SLM_ASSERT("The minimum value can't be greater than the maximum value", _min < _max);
+
+    size_t indexMin = 0;
+    if( _min >= m_minValue )
+    {
+        indexMin = static_cast<size_t>(( _min - m_minValue ) / m_binsWidth);
+    }
+    size_t indexMax = m_values.size();
+    if( _max <= m_maxValue )
+    {
+        indexMax = static_cast<size_t>(( _max - m_minValue ) / m_binsWidth);
+    }
+    long nbPixels = 0;
+
+    while( indexMin < indexMax )
+    {
+        nbPixels += m_values.at( indexMin++ );
+    }
+
+    return nbPixels;
+}
+
+//------------------------------------------------------------------------------
+
+bool Histogram::isInRange( float _pixel )
+{
+    return ( _pixel >= m_minValue && _pixel <= m_maxValue );
+}
+
+} // namespace fwData
+
diff --git a/SrcLib/core/fwData/src/fwData/Image.cpp b/SrcLib/core/fwData/src/fwData/Image.cpp
new file mode 100644
index 0000000..59354a1
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Image.cpp
@@ -0,0 +1,297 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <numeric>
+#include <functional>
+#include <algorithm>
+#include <sstream>
+
+#include <fwCore/base.hpp>
+
+#include <boost/lexical_cast.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <climits>
+#include <fwTools/DynamicType.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+
+#include "fwData/registry/macros.hpp"
+
+#include "fwData/Image.hpp"
+
+//------------------------------------------------------------------------------
+
+fwDataRegisterMacro( ::fwData::Image );
+
+//------------------------------------------------------------------------------
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Image::Image(::fwData::Object::Key key) :
+        m_type(),
+        m_attrWindowCenter(0),
+        m_attrWindowWidth(0),
+        m_attrNumberOfComponents(1),
+        m_dataArray( ::fwData::Array::New() )
+{}
+
+//------------------------------------------------------------------------------
+
+Image::~Image() throw()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void Image::shallowCopy(const Object::csptr &_source )
+{
+    Image::csptr other = Image::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    // Assign
+    copyInformation( other );
+
+    m_dataArray  = other->m_dataArray;
+}
+
+//-----------------------------------------------------------------------------
+
+void Image::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Image::csptr other = Image::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    // Assign
+    copyInformation( other );
+
+    if( other->m_dataArray )
+    {
+        m_dataArray = ::fwData::Object::copy(other->m_dataArray, cache);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Image::getDataArray() const
+{
+    return m_dataArray;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::setDataArray(::fwData::Array::sptr array, bool copyArrayInfo)
+{
+    if( ! array )
+    {
+        array = ::fwData::Array::New();
+    }
+    m_dataArray = array;
+    if (copyArrayInfo)
+    {
+        m_size = array->getSize();
+        m_type = array->getType();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+size_t Image::allocate() throw(::fwData::Exception)
+{
+    if (!m_dataArray)
+    {
+        m_dataArray = ::fwData::Array::New();
+    }
+
+    OSLM_ASSERT( "NumberOfComponents must be > 0", m_attrNumberOfComponents > 0 );
+    return m_dataArray->resize(m_type, m_size, m_attrNumberOfComponents, true);
+}
+
+//------------------------------------------------------------------------------
+
+size_t Image::allocate(SizeType::value_type x, SizeType::value_type y,  SizeType::value_type z,
+                       const ::fwTools::Type &type, size_t numberOfComponents) throw(::fwData::Exception)
+{
+    m_size = boost::assign::list_of(x)(y)(z);
+    m_type = type;
+    m_attrNumberOfComponents = numberOfComponents;
+    return allocate();
+}
+
+//------------------------------------------------------------------------------
+
+size_t Image::allocate(const SizeType &size, const ::fwTools::Type &type, size_t numberOfComponents)
+    throw(::fwData::Exception)
+{
+    m_size = size;
+    m_type = type;
+    m_attrNumberOfComponents = numberOfComponents;
+    return allocate();
+}
+
+//------------------------------------------------------------------------------
+
+::fwTools::DynamicType Image::getPixelType() const
+{
+    typedef std::map<std::string, ::fwTools::DynamicType> DynamicTypeMapType;
+
+    static DynamicTypeMapType dynamicTypeMap = ::boost::assign::map_list_of
+        (::fwTools::Type().string() , ::fwTools::DynamicType() )
+        ("uint8" , ::fwTools::makeDynamicType<std::string>("unsigned char")  )
+        ("uint16", ::fwTools::makeDynamicType<std::string>("unsigned short") )
+        ("uint32", ::fwTools::makeDynamicType<std::string>("unsigned int")   )
+        ("int8" ,  ::fwTools::makeDynamicType<std::string>("signed char")    )
+        ("int16",  ::fwTools::makeDynamicType<std::string>("signed short")   )
+        ("int32",  ::fwTools::makeDynamicType<std::string>("signed int")     )
+        ("float",  ::fwTools::makeDynamicType<std::string>("float")          )
+        ("double", ::fwTools::makeDynamicType<std::string>("double")         )
+
+//special case for dynamic type : 64bits integers was not managed by dynamic type.
+#if ( INT_MAX < LONG_MAX )
+        ("uint64", ::fwTools::makeDynamicType<std::string>("unsigned long")  )
+        ("int64",  ::fwTools::makeDynamicType<std::string>("signed long")    )
+#else
+        ("uint32", ::fwTools::makeDynamicType<std::string>("unsigned long")  )
+        ("int32",  ::fwTools::makeDynamicType<std::string>("signed long")    )
+        ("uint64", ::fwTools::DynamicType() )
+        ("int64",  ::fwTools::DynamicType() )
+#endif
+        ;
+
+    ::fwTools::DynamicType dtype = dynamicTypeMap[getType().string()] ;
+    return dtype;
+}
+
+//------------------------------------------------------------------------------
+
+::fwTools::Type Image::getType() const
+{
+    return m_type;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::setType(::fwTools::Type type)
+{
+    m_type = type;
+}
+
+
+//------------------------------------------------------------------------------
+
+void Image::setType(const std::string &type)
+{
+    m_type = ::fwTools::Type(type);
+}
+
+//------------------------------------------------------------------------------
+
+void Image::copyInformation( Image::csptr _source )
+{
+    m_size                   = _source->m_size;
+    m_type                   = _source->m_type;
+    m_spacing                = _source->m_spacing;
+    m_origin                 = _source->m_origin;
+    m_attrWindowCenter       = _source->m_attrWindowCenter;
+    m_attrWindowWidth        = _source->m_attrWindowWidth;
+    m_attrNumberOfComponents = _source->m_attrNumberOfComponents;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Image::getNumberOfDimensions() const
+{
+    return m_size.size();
+}
+
+
+//------------------------------------------------------------------------------
+
+const Image::SpacingType & Image::getSpacing() const
+{
+    return m_spacing;
+}
+
+
+//------------------------------------------------------------------------------
+
+void Image::setSpacing(const SpacingType &spacing)
+{
+    m_spacing = spacing;
+}
+
+//------------------------------------------------------------------------------
+
+const Image::OriginType & Image::getOrigin() const
+{
+    return m_origin;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::setOrigin(const OriginType &origin)
+{
+    m_origin = origin;
+}
+
+//------------------------------------------------------------------------------
+
+const Image::SizeType & Image::getSize() const
+{
+    return m_size;
+}
+
+//------------------------------------------------------------------------------
+
+void Image::setSize(const SizeType &size)
+{
+    m_size = size;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Image::getSizeInBytes() const
+{
+    SLM_TRACE_FUNC();
+
+    size_t size = std::accumulate(
+                                  m_size.begin(), m_size.end(),
+                                  static_cast<size_t>(m_type.sizeOf()) * m_attrNumberOfComponents,
+                                  std::multiplies< size_t > () );
+    return size;
+}
+
+
+//------------------------------------------------------------------------------
+
+size_t Image::getAllocatedSizeInBytes() const
+{
+    SLM_TRACE_FUNC();
+    size_t size = 0;
+    if (m_dataArray)
+    {
+        size = m_dataArray->getSizeInBytes();
+    }
+    return size;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Integer.cpp b/SrcLib/core/fwData/src/fwData/Integer.cpp
new file mode 100644
index 0000000..f74b21d
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Integer.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Object.hpp"
+#include "fwData/GenericField.hpp"
+#include "fwData/Integer.hpp"
+
+
+fwDataRegisterMacro( ::fwData::Integer );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Integer::Integer(::fwData::Object::Key key ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+Integer::~Integer() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Integer::shallowCopy(const Object::csptr &_source )
+{
+    Integer::csptr other = Integer::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_value = other->m_value;
+}
+
+//------------------------------------------------------------------------------
+
+void Integer::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Integer::csptr other = Integer::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_value = other->m_value;
+}
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Line.cpp b/SrcLib/core/fwData/src/fwData/Line.cpp
new file mode 100644
index 0000000..d72df87
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Line.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+
+
+#include "fwData/Line.hpp"
+
+fwDataRegisterMacro( ::fwData::Line );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Line::Line (::fwData::Object::Key key)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+Line::~Line ()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Line::shallowCopy(const Object::csptr &_source )
+{
+    Line::csptr other = Line::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_position = other->m_position;
+    m_direction = other->m_direction;
+}
+
+//------------------------------------------------------------------------------
+
+void Line::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Line::csptr other = Line::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_position = ::fwData::Object::copy( other->m_position, cache );
+    m_direction = ::fwData::Object::copy( other->m_direction, cache );
+}
+
+//------------------------------------------------------------------------------
+
+void Line::setValue( ::fwData::Point::sptr _position, ::fwData::Point::sptr  _direction) {
+    m_position = _position;
+    m_direction = _direction;
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/List.cpp b/SrcLib/core/fwData/src/fwData/List.cpp
new file mode 100644
index 0000000..009abc7
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/List.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+
+#include "fwData/List.hpp"
+
+
+fwDataRegisterMacro( ::fwData::List );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+List::List(::fwData::Object::Key key)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+List::~List()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void List::shallowCopy(const Object::csptr &_source )
+{
+    List::csptr other = List::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_attrContainer = other->m_attrContainer;
+}
+
+//------------------------------------------------------------------------------
+
+void List::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    List::csptr other = List::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_attrContainer.clear();
+    BOOST_FOREACH(const ContainerType::value_type &obj, other->m_attrContainer)
+    {
+        m_attrContainer.push_back( ::fwData::Object::copy(obj, cache) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwData/src/fwData/Material.cpp b/SrcLib/core/fwData/src/fwData/Material.cpp
new file mode 100644
index 0000000..2bdf254
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Material.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Material.hpp"
+
+fwDataRegisterMacro( ::fwData::Material );
+
+namespace fwData
+{
+
+Material::Material(::fwData::Object::Key key) :
+    m_shadingMode(MODE_PHONG),
+    m_representationMode(MODE_SURFACE),
+    m_optionsMode(MODE_STANDARD),
+    m_ambient( Color::New() ),
+    m_diffuse( Color::New() )
+{
+}
+
+//------------------------------------------------------------------------------
+
+Material::~Material()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Material::shallowCopy(const Object::csptr &_source )
+{
+    Material::csptr other = Material::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_ambient = other->m_ambient;
+    m_diffuse = other->m_diffuse;
+
+    m_shadingMode = other->m_shadingMode;
+    m_representationMode = other->m_representationMode;
+    m_optionsMode = other->m_optionsMode;
+}
+
+//------------------------------------------------------------------------------
+
+void Material::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Material::csptr other = Material::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_ambient = ::fwData::Object::copy( other->m_ambient, cache );
+    m_diffuse = ::fwData::Object::copy( other->m_diffuse, cache );
+
+    m_shadingMode = other->m_shadingMode;
+    m_representationMode = other->m_representationMode;
+    m_optionsMode = other->m_optionsMode;
+}
+
+//------------------------------------------------------------------------------
+
+Color::sptr Material::ambient() const
+{
+    return m_ambient ;
+}
+
+//------------------------------------------------------------------------------
+
+Color::sptr Material::diffuse() const
+{
+    return m_diffuse ;
+}
+
+//------------------------------------------------------------------------------
+
+void Material::setAmbient(Color::sptr ambient)
+{
+    m_ambient = ambient;
+}
+
+//------------------------------------------------------------------------------
+
+void Material::setDiffuse(Color::sptr diffuse)
+{
+    m_diffuse = diffuse;
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwData/src/fwData/Mesh.cpp b/SrcLib/core/fwData/src/fwData/Mesh.cpp
new file mode 100644
index 0000000..7a663d7
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Mesh.cpp
@@ -0,0 +1,534 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <cstdlib>
+#include <functional>
+#include <numeric>
+
+#include <boost/bind.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Mesh.hpp"
+
+using namespace boost::assign;
+
+namespace fwData
+{
+
+#define POINT_REALLOC_STEP 1000
+#define CELL_REALLOC_STEP 1000
+#define CELLDATA_REALLOC_STEP 1000
+
+
+fwDataRegisterMacro( ::fwData::Mesh );
+
+//------------------------------------------------------------------------------
+
+Mesh::Mesh(::fwData::Object::Key key) : m_nbPoints(0), m_nbCells(0),  m_cellsDataSize(0)
+{
+    this->initArrays();
+}
+
+//------------------------------------------------------------------------------
+
+Mesh::~Mesh()
+{}
+
+//------------------------------------------------------------------------------
+
+void Mesh::initArrays()
+{
+    if (!m_points)
+    {
+        m_points          = ::fwData::Array::New();
+    }
+    if (!m_cellTypes)
+    {
+        m_cellTypes       = ::fwData::Array::New();
+    }
+    if (!m_cellData)
+    {
+        m_cellData        = ::fwData::Array::New();
+    }
+    if (!m_cellDataOffsets)
+    {
+        m_cellDataOffsets = ::fwData::Array::New();
+    }
+
+    m_points->setType(::fwTools::Type::create<PointValueType>());
+    m_points->setNumberOfComponents(3);
+
+    m_cellTypes->setType(::fwTools::Type::create<CellTypes>());
+    m_cellTypes->setNumberOfComponents(1);
+
+    m_cellData->setType(::fwTools::Type::create<CellValueType>());
+    m_cellData->setNumberOfComponents(1);
+
+    m_cellDataOffsets->setType(::fwTools::Type::create<CellDataOffsetType>());
+    m_cellDataOffsets->setNumberOfComponents(1);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::shallowCopy(const Object::csptr &_source )
+{
+    Mesh::csptr other = Mesh::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_nbPoints        = other->m_nbPoints;
+    m_nbCells         = other->m_nbCells;
+    m_cellsDataSize   = other->m_cellsDataSize;
+
+    m_points          = other->m_points;
+    m_cellTypes       = other->m_cellTypes;
+    m_cellData        = other->m_cellData;
+    m_cellDataOffsets = other->m_cellDataOffsets;
+
+    m_pointColors     = other->m_pointColors;
+    m_cellColors      = other->m_cellColors;
+    m_pointNormals    = other->m_pointNormals;
+    m_cellNormals     = other->m_cellNormals;
+
+    m_arrayMap        = other->m_arrayMap;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Mesh::csptr other = Mesh::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_nbPoints      = other->m_nbPoints;
+    m_nbCells       = other->m_nbCells;
+    m_cellsDataSize = other->m_cellsDataSize;
+
+    this->initArrays();
+
+    m_points          = ::fwData::Object::copy( other->m_points, cache );
+    m_cellTypes       = ::fwData::Object::copy( other->m_cellTypes, cache );
+    m_cellData        = ::fwData::Object::copy( other->m_cellData, cache );
+    m_cellDataOffsets = ::fwData::Object::copy( other->m_cellDataOffsets, cache );
+
+    //Object::copy returns a null object if source object is null
+    m_pointColors  = ::fwData::Object::copy( other->m_pointColors , cache );
+    m_cellColors   = ::fwData::Object::copy( other->m_cellColors  , cache );
+    m_pointNormals = ::fwData::Object::copy( other->m_pointNormals, cache );
+    m_cellNormals  = ::fwData::Object::copy( other->m_cellNormals , cache );
+
+    m_arrayMap.clear();
+    BOOST_FOREACH(ArrayMapType::value_type element, other->m_arrayMap)
+    {
+        m_arrayMap[element.first] = ::fwData::Object::copy(element.second, cache);
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::allocate(size_t nbPts, size_t nbCells, size_t nbCellsData) throw(::fwData::Exception)
+{
+    if (nbCellsData == 0)
+    {
+        nbCellsData = 3*nbCells;
+    }
+
+    size_t allocatedSize = 0;
+
+    allocatedSize += m_points->resize         ( list_of(nbPts)      , true);
+    allocatedSize += m_cellTypes->resize      ( list_of(nbCells)    , true);
+    allocatedSize += m_cellData->resize       ( list_of(nbCellsData), true);
+    allocatedSize += m_cellDataOffsets->resize( list_of(nbCells)    , true);
+
+    return allocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::allocatePointNormals() throw(::fwData::Exception)
+{
+    size_t allocatedSize = 0;
+    if (! m_pointNormals )
+    {
+        m_pointNormals  = ::fwData::Array::New();
+    }
+    allocatedSize += m_pointNormals->resize( ::fwTools::Type::create<NormalValueType>(), list_of(m_nbPoints), 3, true);
+    return allocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::allocatePointColors(ColorArrayTypes t) throw(::fwData::Exception)
+{
+    OSLM_ASSERT("Bad ColorArrayTypes : " << t, t == RGB || t == RGBA);
+    size_t allocatedSize = 0;
+    if (! m_pointColors )
+    {
+        m_pointColors  = ::fwData::Array::New();
+    }
+    allocatedSize += m_pointColors->resize( ::fwTools::Type::create<ColorValueType>(), list_of(m_nbPoints), t, true);
+    return allocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::allocateCellNormals() throw(::fwData::Exception)
+{
+    size_t allocatedSize = 0;
+    if (! m_cellNormals )
+    {
+        m_cellNormals  = ::fwData::Array::New();
+    }
+    allocatedSize += m_cellNormals->resize( ::fwTools::Type::create<NormalValueType>(), list_of(m_nbCells), 3, true);
+    return allocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::allocateCellColors(ColorArrayTypes t) throw(::fwData::Exception)
+{
+    OSLM_ASSERT("Bad ColorArrayTypes : " << t, t == RGB || t == RGBA);
+    size_t allocatedSize = 0;
+    if (! m_cellColors )
+    {
+        m_cellColors  = ::fwData::Array::New();
+    }
+    allocatedSize += m_cellColors->resize( ::fwTools::Type::create<ColorValueType>(), list_of(m_nbCells), t, true);
+    return allocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+bool Mesh::adjustAllocatedMemory() throw(::fwData::Exception)
+{
+    size_t oldAllocatedSize = this->getAllocatedSizeInBytes();
+
+    if(! m_points)
+    {
+        this->initArrays();
+    }
+
+    m_points->resize(list_of(m_nbPoints), true);
+    m_cellTypes->resize(list_of(m_nbCells), true);
+    m_cellData->resize(list_of(m_cellsDataSize), true);
+    m_cellDataOffsets->resize(list_of(m_nbCells), true);
+    m_pointColors  && (m_pointColors->resize(list_of(m_nbPoints), true));
+    m_cellColors   && (m_cellColors->resize(list_of(m_nbCells), true));
+    m_pointNormals && (m_pointNormals->resize(list_of(m_nbPoints), true));
+    m_cellNormals  && (m_cellNormals->resize(list_of(m_nbCells), true));
+
+
+    size_t newAllocatedSize = this->getAllocatedSizeInBytes();
+    SLM_ASSERT(
+            "Error adjusting memory : allocated size: " << newAllocatedSize
+            << " != data size : " << this->getDataSizeInBytes(),
+            newAllocatedSize == this->getDataSizeInBytes());
+    return oldAllocatedSize != newAllocatedSize;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPointsArray (::fwData::Array::sptr array)
+{
+    m_points = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellTypesArray (::fwData::Array::sptr array)
+{
+    m_cellTypes = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellDataArray (::fwData::Array::sptr array)
+{
+    m_cellData = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellDataOffsetsArray (::fwData::Array::sptr array)
+{
+    m_cellDataOffsets = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPointColorsArray (::fwData::Array::sptr array)
+{
+    m_pointColors = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellColorsArray (::fwData::Array::sptr array)
+{
+    m_cellColors = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setPointNormalsArray (::fwData::Array::sptr array)
+{
+    m_pointNormals = array;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellNormalsArray (::fwData::Array::sptr array)
+{
+    m_cellNormals = array;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getPointsArray () const
+{
+    return m_points;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getCellTypesArray () const
+{
+    return m_cellTypes;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getCellDataArray () const
+{
+    return m_cellData;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getCellDataOffsetsArray () const
+{
+    return m_cellDataOffsets;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getPointColorsArray () const
+{
+    return m_pointColors;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getCellColorsArray () const
+{
+    return m_cellColors;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getPointNormalsArray () const
+{
+    return m_pointNormals;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getCellNormalsArray () const
+{
+    return m_cellNormals;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearPoints()
+{
+    m_nbPoints = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearCells()
+{
+    m_nbCells = 0;
+    m_cellsDataSize = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clear()
+{
+    this->clearPointNormals();
+    this->clearPointColors();
+    this->clearCellNormals();
+    this->clearCellColors();
+
+    m_points->clear();
+    m_cellData->clear();
+    m_cellDataOffsets->clear();
+    m_cellTypes->clear();
+    this->initArrays();
+
+    this->clearPoints();
+    this->clearCells();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearPointNormals()
+{
+    m_pointNormals.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearPointColors()
+{
+    m_pointColors.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearCellNormals()
+{
+    m_cellNormals.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::clearCellColors()
+{
+    m_cellColors.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setNumberOfPoints(Mesh::Id nb)
+{
+    m_nbPoints = nb;
+}
+
+//------------------------------------------------------------------------------
+
+Mesh::Id Mesh::getNumberOfPoints() const
+{
+    return m_nbPoints;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::setNumberOfCells(Mesh::Id nb)
+{
+    m_nbCells = nb;
+}
+
+//------------------------------------------------------------------------------
+
+Mesh::Id Mesh::getNumberOfCells() const
+{
+    return m_nbCells;
+}
+
+
+//------------------------------------------------------------------------------
+
+void Mesh::setCellDataSize(Mesh::Id size)
+{
+    m_cellsDataSize = size;
+}
+
+//------------------------------------------------------------------------------
+
+Mesh::Id Mesh::getCellDataSize() const
+{
+    return m_cellsDataSize;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::getDataSizeInBytes() const
+{
+    size_t size = 0;
+
+    m_points          && (size += m_points->getElementSizeInBytes() * m_nbPoints);
+    m_cellTypes       && (size += m_cellTypes->getElementSizeInBytes() * m_nbCells );
+    m_cellData        && (size += m_cellData->getElementSizeInBytes() * m_cellsDataSize);
+    m_cellDataOffsets && (size += m_cellDataOffsets->getElementSizeInBytes() * m_nbCells);
+    m_pointColors     && (size += m_pointColors->getElementSizeInBytes() * m_nbPoints);
+    m_cellColors      && (size += m_cellColors->getElementSizeInBytes() * m_nbCells);
+    m_pointNormals    && (size += m_pointNormals->getElementSizeInBytes() * m_nbPoints);
+    m_cellNormals     && (size += m_cellNormals->getElementSizeInBytes() * m_nbCells);
+
+    return size;
+}
+
+//------------------------------------------------------------------------------
+
+size_t Mesh::getAllocatedSizeInBytes() const
+{
+    size_t size = 0;
+
+    m_points          && (size += m_points->getSizeInBytes());
+    m_cellTypes       && (size += m_cellTypes->getSizeInBytes() );
+    m_cellData        && (size += m_cellData->getSizeInBytes());
+    m_cellDataOffsets && (size += m_cellDataOffsets->getSizeInBytes());
+    m_pointColors     && (size += m_pointColors->getSizeInBytes());
+    m_cellColors      && (size += m_cellColors->getSizeInBytes());
+    m_pointNormals    && (size += m_pointNormals->getSizeInBytes());
+    m_cellNormals     && (size += m_cellNormals->getSizeInBytes());
+
+    return size;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::addDataArray(const std::string &name, ::fwData::Array::sptr array)
+{
+    m_arrayMap[name] = array;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Mesh::getDataArray(const std::string &name) const
+{
+    ::fwData::Array::sptr res;
+    ArrayMapType::const_iterator iter = m_arrayMap.find(name);
+    if( iter != m_arrayMap.end())
+    {
+        res = iter->second;
+    }
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector<std::string> Mesh::getDataArrayNames() const
+{
+    std::vector<std::string> vectNames;
+    std::transform( m_arrayMap.begin(), m_arrayMap.end(),
+            std::back_inserter(vectNames),
+            ::boost::bind(& ArrayMapType::value_type::first,_1) );
+    return vectNames;
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::removeDataArray(const std::string &name)
+{
+    m_arrayMap.erase(name);
+}
+
+//------------------------------------------------------------------------------
+
+}//namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Model.cpp b/SrcLib/core/fwData/src/fwData/Model.cpp
new file mode 100644
index 0000000..7fef7ae
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Model.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Model.hpp"
+
+fwDataRegisterMacro( ::fwData::Model );
+namespace fwData
+{
+Model::Model(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+Model::~Model() throw()
+{
+    m_map.clear();
+}
+
+//------------------------------------------------------------------------------
+
+Model::Container &Model::getRefMap()
+{
+    return m_map ;
+}
+
+//------------------------------------------------------------------------------
+
+const Model::Container &Model::getCRefMap() const
+{
+    return m_map ;
+}
+
+//------------------------------------------------------------------------------
+
+void Model::shallowCopy(const Object::csptr &_source )
+{
+    Model::csptr other = Model::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_map.clear();
+    m_map = other->m_map;
+}
+
+//------------------------------------------------------------------------------
+
+void Model::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Model::csptr other = Model::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_map.clear();
+    for(    Model::Container::const_iterator iter = other->getCRefMap().begin();
+            iter != other->getCRefMap().end();
+            ++iter )
+    {
+        ::fwData::TriangularMesh::sptr newTrian;
+        ::fwData::Material::sptr newMaterial;
+
+        newTrian = ::fwData::Object::copy(iter->first, cache);
+        newMaterial = ::fwData::Object::copy(iter->second, cache);
+        m_map[newTrian] = newMaterial;
+    }
+}
+
+} // namespace fwData
+
diff --git a/SrcLib/core/fwData/src/fwData/Node.cpp b/SrcLib/core/fwData/src/fwData/Node.cpp
new file mode 100644
index 0000000..36f540d
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Node.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Port.hpp"
+
+#include "fwData/Node.hpp"
+
+fwDataRegisterMacro( ::fwData::Node );
+
+namespace fwData
+{
+
+const ::fwCom::Signals::SignalKeyType Node::s_UPDATED_SIG = "updated";
+
+//------------------------------------------------------------------------------
+
+Node::Node(::fwData::Object::Key key):
+    m_sigUpdated(UpdatedSignalType::New())
+{
+    m_signals( s_UPDATED_SIG,  m_sigUpdated);
+
+#ifdef COM_LOG
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+
+}
+
+//------------------------------------------------------------------------------
+
+Node::~Node()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Node::addInputPort(::fwData::Port::sptr port)
+{
+    m_inputs.push_back(port);
+}
+
+//------------------------------------------------------------------------------
+
+void Node::addOutputPort(::fwData::Port::sptr port)
+{
+    m_outputs.push_back(port);
+}
+
+//------------------------------------------------------------------------------
+
+Node::PortContainer & Node::getInputPorts()
+{
+    return m_inputs;
+}
+
+//------------------------------------------------------------------------------
+
+Node::PortContainer & Node::getOutputPorts()
+{
+    return m_outputs;
+}
+
+//------------------------------------------------------------------------------
+
+void Node::setObject( ::fwData::Object::sptr object )
+{
+    m_object = object;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr Node::getObject() const
+{
+    return m_object;
+}
+
+//------------------------------------------------------------------------------
+
+Port::sptr Node::findPort(const std::string &identifier, /*const std::string &type,*/ bool modeInput) const
+{
+    if ( modeInput)
+    {
+        for ( PortContainer::const_iterator i = m_inputs.begin() ; i != m_inputs.end() ; ++i )
+        {
+            if ( (*i)->getIdentifier() == identifier)
+            {
+                return *i;
+            }
+        }
+    }
+    else
+    {
+        for ( PortContainer::const_iterator i = m_outputs.begin() ; i != m_outputs.end() ; ++i )
+        {
+            if ( (*i)->getIdentifier() == identifier)
+            {
+                return *i;
+            }
+        }
+    }
+    return Port::sptr();
+}
+
+//------------------------------------------------------------------------------
+
+void Node::shallowCopy(const Object::csptr &_source )
+{
+    Node::csptr other = Node::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_inputs.clear();
+    m_outputs.clear();
+
+    if( other->getObject())
+    {
+        ::fwTools::Object::sptr object = ::fwData::factory::New( other->getObject()->getClassname() );
+        OSLM_ASSERT("Sorry, instantiate "<<other->getObject()->getClassname()<< " failed", object );
+        m_object = ::fwData::Object::dynamicCast(object);
+        m_object->shallowCopy( other->m_object );
+    }
+    BOOST_FOREACH(::fwData::Port::sptr port, other->m_inputs)
+    {
+        this->addInputPort( ::fwData::Object::copy(port) );
+    }
+    BOOST_FOREACH(::fwData::Port::sptr port, other->m_outputs)
+    {
+        this->addOutputPort( ::fwData::Object::copy(port) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Node::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Node::csptr other = Node::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_inputs.clear();
+    m_outputs.clear();
+
+    m_object = ::fwData::Object::copy( other->m_object, cache );
+
+    BOOST_FOREACH(const ::fwData::Port::sptr &port, other->m_inputs)
+    {
+        ::fwData::Port::sptr newPort;
+        newPort = ::fwData::Object::copy(port, cache);
+        this->addInputPort(newPort);
+    }
+    BOOST_FOREACH(const ::fwData::Port::sptr &port, other->m_outputs)
+    {
+        ::fwData::Port::sptr newPort;
+        newPort = ::fwData::Object::copy(port, cache);
+        this->addOutputPort(newPort);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Object.cpp b/SrcLib/core/fwData/src/fwData/Object.cpp
new file mode 100644
index 0000000..2ad590e
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Object.cpp
@@ -0,0 +1,209 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+
+#include "fwData/factory/new.hpp"
+#include "fwData/Object.hpp"
+
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+const ::fwCom::Signals::SignalKeyType Object::s_OBJECT_MODIFIED_SIG = "objectModified";
+
+//------------------------------------------------------------------------------
+
+Object::Object()
+{
+    // Init
+    m_sigObjectModified = ObjectModifiedSignalType::New();
+
+    // Register
+    m_signals( s_OBJECT_MODIFIED_SIG,  m_sigObjectModified);
+
+#ifdef COM_LOG
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+Object::~Object()
+{}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr Object::getField( const FieldNameType & name, ::fwData::Object::sptr defaultValue ) const
+{
+    ::fwData::Object::sptr object = defaultValue;
+    FieldMapType::const_iterator iter = m_fields.find(name);
+    if(iter != m_fields.end())
+    {
+        object = iter->second;
+    }
+    return object;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::csptr Object::getConstField( const FieldNameType & name ) const
+{
+    return this->getField(name);
+}
+
+//------------------------------------------------------------------------------
+
+const Object::FieldMapType& Object::getFields() const
+{
+    return m_fields;
+}
+
+//------------------------------------------------------------------------------
+
+Object::FieldNameVectorType Object::getFieldNames() const
+{
+    FieldNameVectorType names;
+    std::transform( m_fields.begin(), m_fields.end(),
+            std::back_inserter(names),
+            ::boost::bind(& FieldMapType::value_type::first, _1) );
+    return names;
+}
+
+//------------------------------------------------------------------------------
+
+void Object::setField( const FieldNameType & name, ::fwData::Object::sptr obj)
+{
+    std::pair<FieldMapType::iterator, bool> res = m_fields.insert(FieldMapType::value_type(name, obj));
+    if( !res.second )
+    {
+        res.first->second = obj;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::setFields( const FieldMapType & fieldMap )
+{
+    m_fields = fieldMap;
+}
+
+//------------------------------------------------------------------------------
+
+void Object::removeField( const FieldNameType & name )
+{
+    FieldMapType::const_iterator iter = m_fields.find(name);
+    OSLM_ASSERT("Field "<<name<<" not found.", iter != m_fields.end());
+    if(iter != m_fields.end())
+    {
+        m_fields.erase(iter);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Object::updateFields( const FieldMapType & fieldMap )
+{
+    m_fields.insert(fieldMap.begin(), fieldMap.end());
+}
+
+
+//-----------------------------------------------------------------------------
+
+void Object::fieldShallowCopy(const ::fwData::Object::csptr &source)
+{
+    this->setFields(source->getFields());
+}
+
+//-----------------------------------------------------------------------------
+
+void Object::deepCopy(const ::fwData::Object::csptr &source)
+{
+    DeepCopyCacheType cache;
+    return this->cachedDeepCopy(source, cache);
+}
+//-----------------------------------------------------------------------------
+
+void Object::fieldDeepCopy(const ::fwData::Object::csptr &source)
+{
+    DeepCopyCacheType cache;
+    return this->fieldDeepCopy(source, cache);
+}
+
+//-----------------------------------------------------------------------------
+
+void Object::fieldDeepCopy(const ::fwData::Object::csptr &source, DeepCopyCacheType &cache)
+{
+    m_fields.clear();
+    const ::fwData::Object::FieldMapType &sourceFields = source->getFields();
+    BOOST_FOREACH(const ::fwData::Object::FieldMapType::value_type &elt, sourceFields)
+    {
+        this->setField(elt.first, ::fwData::Object::copy(elt.second, cache));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Object::shallowCopy(const ::fwData::Object::csptr &source )
+{
+    FwCoreNotUsedMacro(source);
+    OSLM_FATAL("shallowCopy not implemented for : " << this->getClassname() );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr Object::copy(const ::fwData::Object::csptr &source)
+{
+    DeepCopyCacheType cache;
+    return Object::copy(source, cache);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr Object::copy(const ::fwData::Object::csptr &source, Object::DeepCopyCacheType &cache)
+{
+    ::fwData::Object::sptr obj;
+
+    if( source )
+    {
+        DeepCopyCacheType::const_iterator cacheItem = cache.find(source);
+
+        if (cacheItem == cache.end())
+        {
+            obj = ::fwData::factory::New(source->className());
+            cache.insert( DeepCopyCacheType::value_type(source, obj) );
+            obj->cachedDeepCopy(source, cache);
+        }
+        else
+        {
+            obj = cacheItem->second;
+        }
+    }
+
+    return obj;
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef COM_LOG
+void Object::setID( ::fwTools::fwID::IDType newID )
+{
+    if( ! this->hasID() ||
+        this->getID( ::fwTools::fwID::MUST_EXIST ) != newID )
+    {
+        this->::fwTools::fwID::setID( newID );
+    }
+
+    std::string lightID = this->getLightID( ::fwTools::fwID::MUST_EXIST );
+
+    ::fwCom::HasSignals::m_signals.setID( lightID + "::" );
+}
+#endif
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/ObjectLock.cpp b/SrcLib/core/fwData/src/fwData/ObjectLock.cpp
new file mode 100644
index 0000000..9847a59
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/ObjectLock.cpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMemory/BufferObject.hpp>
+
+#include "fwData/ObjectLock.hpp"
+
+namespace fwData
+{
+
+//-----------------------------------------------------------------------------
+
+ObjectLock::~ObjectLock()
+{
+    m_locks.clear();
+    m_objects.clear();
+}
+
+
+//-----------------------------------------------------------------------------
+
+ObjectLock::ObjectLock(const ObjectLock & objectLock)
+{
+    m_objects = objectLock.m_objects;
+    m_locks = objectLock.m_locks;
+}
+
+//-----------------------------------------------------------------------------
+
+ObjectLock & ObjectLock::operator=(const ObjectLock & objectLock)
+{
+    m_locks.clear();
+    m_objects.clear();
+
+    m_objects = objectLock.m_objects;
+    m_locks = objectLock.m_locks;
+
+    return *this;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectLock::lock( ::fwData::Array::sptr array, LocksType & locks )
+{
+    if ( array )
+    {
+        locks.push_back( array->getBufferObject()->lock() ) ;
+        m_objects.push_back(array);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectLock::lock( ::fwData::Image::sptr image, LocksType & locks )
+{
+    if ( image )
+    {
+        this->lock( image->getDataArray(), locks ) ;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectLock::lock( ::fwData::Mesh::sptr mesh, LocksType & locks )
+{
+    if ( mesh )
+    {
+        this->lock( mesh->getPointsArray(), locks ) ;
+        this->lock( mesh->getCellDataArray(), locks ) ;
+        this->lock( mesh->getCellDataOffsetsArray(), locks ) ;
+        this->lock( mesh->getCellTypesArray(), locks ) ;
+
+        this->lock( mesh->getCellColorsArray(), locks ) ;
+        this->lock( mesh->getPointColorsArray(), locks ) ;
+        this->lock( mesh->getCellNormalsArray(), locks ) ;
+        this->lock( mesh->getPointNormalsArray(), locks ) ;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectLock::lock( ::fwData::Reconstruction::sptr rec, LocksType & locks )
+{
+    if ( rec )
+    {
+        this->lock( rec->getImage(), locks ) ;
+        this->lock( rec->getMesh(), locks ) ;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+ObjectLock::ObjectLock( ::fwData::Object::sptr obj )
+{
+    ::fwData::Image::sptr image = ::fwData::Image::dynamicCast( obj );
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::dynamicCast( obj );
+    ::fwData::Array::sptr array = ::fwData::Array::dynamicCast( obj );
+
+    if( image )
+    {
+        this->lock( image, m_locks ) ;
+    }
+    else if ( mesh )
+    {
+        this->lock( mesh, m_locks ) ;
+    }
+    else if ( array )
+    {
+        this->lock( array, m_locks ) ;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // fwData
diff --git a/SrcLib/core/fwData/src/fwData/Plane.cpp b/SrcLib/core/fwData/src/fwData/Plane.cpp
new file mode 100644
index 0000000..389e4e9
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Plane.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include <fwMath/PlaneFunctions.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Plane.hpp"
+
+#define EPSILON 0.00000001
+
+fwDataRegisterMacro( ::fwData::Plane );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Plane::Plane (::fwData::Object::Key key) : m_isIntersection(true)
+{
+    m_vPoints[0] = ::fwData::Point::New();
+    m_vPoints[1] = ::fwData::Point::New();
+    m_vPoints[2] = ::fwData::Point::New();
+}
+
+//------------------------------------------------------------------------------
+
+Plane::~Plane ()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plane::shallowCopy(const Object::csptr &_source )
+{
+    Plane::csptr other = Plane::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_vPoints = other->m_vPoints;
+    m_plane = other->m_plane;
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Plane::csptr other = Plane::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_vPoints[0] = ::fwData::Object::copy(other->m_vPoints[0], cache);
+    m_vPoints[1] = ::fwData::Object::copy(other->m_vPoints[1], cache);
+    m_vPoints[2] = ::fwData::Object::copy(other->m_vPoints[2], cache);
+    m_plane = other->m_plane;
+}
+
+//------------------------------------------------------------------------------
+
+bool Plane::operator==( const Plane & _plane )
+{
+    bool result = false;
+    float dx = float(m_plane[0] - _plane.getPlane()[0] );
+    float dy = float(m_plane[1] - _plane.getPlane()[1] );
+    float dz = float(m_plane[2] - _plane.getPlane()[2] );
+    float dd = float(m_plane[3] - _plane.getPlane()[3] );
+
+    if (fabs(dx) < EPSILON && fabs(dy) < EPSILON && fabs(dz) < EPSILON && fabs(dd) < EPSILON)
+    {
+        result = true;
+    }
+    return result;
+}
+//------------------------------------------------------------------------------
+
+void Plane::setValue(::fwData::Point::sptr _point1, ::fwData::Point::sptr _point2, ::fwData::Point::sptr _point3)
+{
+    m_vPoints[0] = _point1;
+    m_vPoints[1] = _point2;
+    m_vPoints[2] = _point3;
+    this->computePlaneFromPoints();
+}
+
+//------------------------------------------------------------------------------
+
+void Plane::computePlaneFromPoints()
+{
+    ::fwMath::setValues(m_plane, m_vPoints[0]->getCRefCoord(), m_vPoints[1]->getCRefCoord(), m_vPoints[2]->getCRefCoord());
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/PlaneList.cpp b/SrcLib/core/fwData/src/fwData/PlaneList.cpp
new file mode 100644
index 0000000..c07823c
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/PlaneList.cpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/PlaneList.hpp"
+
+fwDataRegisterMacro( ::fwData::PlaneList );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+PlaneList::PlaneList(::fwData::Object::Key key)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+PlaneList::~PlaneList()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::shallowCopy(const Object::csptr &_source )
+{
+    PlaneList::csptr other = PlaneList::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    this->m_vPlanes = other->m_vPlanes;
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    PlaneList::csptr other = PlaneList::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    this->m_vPlanes.clear();
+    for (   PlaneList::PlaneListContainer::const_iterator iter = other->m_vPlanes.begin();
+            iter != other->m_vPlanes.end();
+            ++iter )
+    {
+        Plane::sptr newPlane;
+        newPlane = ::fwData::Object::copy(*iter, cache);
+        this->m_vPlanes.push_back( newPlane );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PlaneList::deleteDuplicatedPlan(void)
+{
+    ::fwData::PlaneList::PlaneListContainer::iterator iter = this->m_vPlanes.begin();
+    ::fwData::PlaneList::PlaneListContainer::iterator iter2 ;
+    if(this->m_vPlanes.size() > 1)
+    {
+        for ( iter = this->m_vPlanes.begin(); iter != this->m_vPlanes.end(); ++iter )
+        {
+            PlaneList::PlaneListContainer::iterator iter2 =iter+1;
+            while(iter2 != this->m_vPlanes.end())
+            {
+                if(*(iter->get()) == *(iter2->get()))
+                    this->m_vPlanes.erase(iter2);
+                else
+                    ++iter2;
+            }
+        }
+    }
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Point.cpp b/SrcLib/core/fwData/src/fwData/Point.cpp
new file mode 100644
index 0000000..90503fb
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Point.cpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Point.hpp"
+
+fwDataRegisterMacro( ::fwData::Point );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Point::Point(::fwData::Object::Key key)
+{
+    m_vCoord[0] = 0.0;
+    m_vCoord[1] = 0.0;
+    m_vCoord[2] = 0.0;
+}
+
+//------------------------------------------------------------------------------
+
+Point::sptr Point::PointFactory(float x, float y, float z)
+{
+    Point::sptr point = ::fwData::Point::New();
+    point->m_vCoord[0] = x;
+    point->m_vCoord[1] = y;
+    point->m_vCoord[2] = z;
+    return point;
+}
+
+//------------------------------------------------------------------------------
+
+Point::sptr Point::PointFactory( Point::sptr p )
+{
+    Point::sptr point = ::fwData::Point::New();
+    point->m_vCoord[0] = p->m_vCoord[0];
+    point->m_vCoord[1] = p->m_vCoord[1];
+    point->m_vCoord[2] = p->m_vCoord[2];
+    return point;
+}
+
+//------------------------------------------------------------------------------
+
+Point::~Point ()
+{}
+
+//------------------------------------------------------------------------------
+
+void Point::shallowCopy(const Object::csptr &_source )
+{
+    Point::csptr other = Point::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_vCoord = other->m_vCoord;
+}
+
+//------------------------------------------------------------------------------
+
+void Point::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Point::csptr other = Point::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_vCoord = other->m_vCoord;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/PointList.cpp b/SrcLib/core/fwData/src/fwData/PointList.cpp
new file mode 100644
index 0000000..75d9d6c
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/PointList.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/PointList.hpp"
+
+fwDataRegisterMacro( ::fwData::PointList );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+PointList::PointList(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+PointList::~PointList()
+{}
+
+//------------------------------------------------------------------------------
+
+void PointList::shallowCopy(const Object::csptr &_source )
+{
+    PointList::csptr other = PointList::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_vPoints = other->m_vPoints;
+}
+
+//------------------------------------------------------------------------------
+
+void PointList::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    PointList::csptr other = PointList::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_vPoints.clear();
+    BOOST_FOREACH(PointListContainer::value_type point, other->m_vPoints )
+    {
+        Point::sptr newPoint = Point::New();
+        newPoint = ::fwData::Object::copy(point, cache);
+        m_vPoints.push_back( newPoint );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Port.cpp b/SrcLib/core/fwData/src/fwData/Port.cpp
new file mode 100644
index 0000000..265265e
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Port.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Port.hpp"
+
+fwDataRegisterMacro( ::fwData::Port );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Port::Port(::fwData::Object::Key key) : m_identifier("IDNOTdefined") , m_type("TypeNotDefined")
+{}
+
+//------------------------------------------------------------------------------
+
+Port::~Port()
+{}
+
+//------------------------------------------------------------------------------
+
+void Port::shallowCopy(const Object::csptr &_source )
+{
+    Port::csptr other = Port::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_identifier = other->m_identifier;
+    m_type = other->m_type;
+}
+
+//------------------------------------------------------------------------------
+
+void Port::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Port::csptr other = Port::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_identifier = other->m_identifier;
+    m_type = other->m_type;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/ProcessObject.cpp b/SrcLib/core/fwData/src/fwData/ProcessObject.cpp
new file mode 100644
index 0000000..d268295
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/ProcessObject.cpp
@@ -0,0 +1,171 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/ProcessObject.hpp"
+
+fwDataRegisterMacro( ::fwData::ProcessObject );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+ProcessObject::ProcessObject(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+ProcessObject::~ProcessObject()
+{}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr ProcessObject::getValue(const ParamNameType& name, const ProcessObjectMapType& params)
+{
+    ::fwData::Object::sptr object;
+    ProcessObjectMapType::const_iterator iter = params.find(name);
+    if(iter != params.end())
+    {
+        object = iter->second;
+    }
+    return object;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr ProcessObject::getInput(const ParamNameType& name)
+{
+    return this->getValue(name, m_attrInputs);
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr ProcessObject::getOutput(const ParamNameType& name)
+{
+    return this->getValue(name, m_attrOutputs);
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::setValue(const ParamNameType& name, ::fwData::Object::sptr object, ProcessObjectMapType& params)
+{
+    std::pair<ProcessObjectMapType::iterator, bool> res;
+    res = params.insert(ProcessObjectMapType::value_type(name, object));
+    if( !res.second )
+    {
+        res.first->second = object;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::setInputValue(const ParamNameType& name, ::fwData::Object::sptr object)
+{
+    this->setValue(name, object, m_attrInputs);
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::setOutputValue(const ParamNameType& name, ::fwData::Object::sptr object)
+{
+    this->setValue(name, object, m_attrOutputs);
+}
+
+//------------------------------------------------------------------------------
+
+ProcessObject::ParamNameVectorType ProcessObject::getParamNames(const ProcessObjectMapType& params) const
+{
+    ParamNameVectorType names;
+    std::transform( params.begin(), params.end(),
+            std::back_inserter(names),
+            ::boost::bind(& ProcessObjectMapType::value_type::first, _1) );
+    return names;
+}
+
+//------------------------------------------------------------------------------
+
+ProcessObject::ParamNameVectorType ProcessObject::getInputsParamNames() const
+{
+    return this->getParamNames(m_attrInputs);
+}
+
+//------------------------------------------------------------------------------
+
+ProcessObject::ParamNameVectorType ProcessObject::getOutputsParamNames() const
+{
+    return this->getParamNames(m_attrOutputs);
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::clearInputs()
+{
+    this->clearParams(m_attrOutputs);
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::clearOutputs()
+{
+    this->clearParams(m_attrInputs);
+}
+
+//------------------------------------------------------------------------------
+
+void ProcessObject::clearParams(ProcessObjectMapType& params)
+{
+    params.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void ProcessObject::shallowCopy(const Object::csptr &source )
+{
+    ProcessObject::csptr other = ProcessObject::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( source );
+
+    m_attrInputs = other->m_attrInputs;
+    m_attrOutputs = other->m_attrOutputs;
+}
+
+//-----------------------------------------------------------------------------
+
+void ProcessObject::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    ProcessObject::csptr other = ProcessObject::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    this->clearInputs();
+    this->clearOutputs();
+
+    BOOST_FOREACH(ProcessObjectMapType::value_type elt, other->m_attrInputs)
+    {
+        m_attrInputs[elt.first] = ::fwData::Object::copy(elt.second, cache);
+    }
+
+    BOOST_FOREACH(ProcessObjectMapType::value_type elt, other->m_attrOutputs)
+    {
+        m_attrOutputs[elt.first] = ::fwData::Object::copy(elt.second, cache);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
diff --git a/SrcLib/core/fwData/src/fwData/ROITraits.cpp b/SrcLib/core/fwData/src/fwData/ROITraits.cpp
new file mode 100644
index 0000000..6586daf
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/ROITraits.cpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/ROITraits.hpp"
+
+fwDataRegisterMacro( ::fwData::ROITraits );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+ROITraits::ROITraits(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+ROITraits::~ROITraits()
+{}
+
+//------------------------------------------------------------------------------
+
+void ROITraits::setMaskOpNode( ::fwData::Node::sptr maskOpNode )
+{
+    m_maskOpNode = maskOpNode;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Node::sptr ROITraits::getMaskOpNode()
+{
+    ::fwData::Node::sptr opNode;
+    if ( m_evaluatedExp != "W" ) // Thus mask op node must be assigned
+    {
+        opNode = m_maskOpNode;
+    }
+    return opNode;
+}
+
+//------------------------------------------------------------------------------
+
+void ROITraits::setStructureTraits( ::fwData::StructureTraits::sptr structureTraits )
+{
+    m_structureTraits = structureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::StructureTraits::sptr ROITraits::getStructureTraits()
+{
+    return m_structureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+void ROITraits::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    ROITraits::csptr other = ROITraits::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Reconstruction.cpp b/SrcLib/core/fwData/src/fwData/Reconstruction.cpp
new file mode 100644
index 0000000..65ec350
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Reconstruction.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Image.hpp"
+#include "fwData/Mesh.hpp"
+#include "fwData/Material.hpp"
+
+#include "fwData/Reconstruction.hpp"
+
+
+fwDataRegisterMacro( ::fwData::Reconstruction );
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Reconstruction::Reconstruction(::fwData::Object::Key key) :
+    m_bIsVisible(false),
+    m_sOrganName(""),
+    m_sStructureType(""),
+    m_attrMaterial( ::fwData::factory::New< ::fwData::Material>() )
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+Reconstruction::~Reconstruction()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::shallowCopy(const Object::csptr &_source )
+{
+    Reconstruction::csptr other = Reconstruction::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_bIsVisible            = other->m_bIsVisible;
+    m_sOrganName            = other->m_sOrganName;
+    m_sStructureType        = other->m_sStructureType;
+
+    m_attrMaterial = other->m_attrMaterial;
+    m_attrImage    = other->m_attrImage;
+    m_attrMesh     = other->m_attrMesh;
+}
+
+//------------------------------------------------------------------------------
+
+void Reconstruction::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Reconstruction::csptr other = Reconstruction::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_bIsVisible            = other->m_bIsVisible;
+    m_sOrganName            = other->m_sOrganName;
+    m_sStructureType        = other->m_sStructureType;
+
+    m_attrMaterial = ::fwData::Object::copy(other->m_attrMaterial, cache);
+    m_attrImage    = ::fwData::Object::copy(other->m_attrImage, cache);
+    m_attrMesh     = ::fwData::Object::copy(other->m_attrMesh, cache);
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/ReconstructionTraits.cpp b/SrcLib/core/fwData/src/fwData/ReconstructionTraits.cpp
new file mode 100644
index 0000000..83710c5
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/ReconstructionTraits.cpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/ReconstructionTraits.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/registry/macros.hpp"
+
+fwDataRegisterMacro( ::fwData::ReconstructionTraits );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTraits::setMaskOpNode( ::fwData::Node::sptr maskOpNode )
+{
+    m_maskOpNode = maskOpNode;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Node::sptr ReconstructionTraits::getMaskOpNode()
+{
+
+    return m_maskOpNode;
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTraits::setMeshOpNode( ::fwData::Node::sptr meshOpNode )
+{
+    m_meshOpNode =  meshOpNode;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Node::sptr ReconstructionTraits::getMeshOpNode()
+{
+
+    return m_meshOpNode;
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTraits::setStructureTraits( ::fwData::StructureTraits::sptr structureTraits )
+{
+    m_structureTraits = structureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::StructureTraits::sptr ReconstructionTraits::getStructureTraits()
+{
+    return m_structureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+ReconstructionTraits::ReconstructionTraits(::fwData::Object::Key key)
+{}
+
+
+//------------------------------------------------------------------------------
+
+ReconstructionTraits::~ReconstructionTraits()
+{}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTraits::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    ReconstructionTraits::csptr other = ReconstructionTraits::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Resection.cpp b/SrcLib/core/fwData/src/fwData/Resection.cpp
new file mode 100644
index 0000000..5924b40
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Resection.cpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Resection.hpp"
+
+fwDataRegisterMacro( ::fwData::Resection );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Resection::Resection (::fwData::Object::Key key)
+: m_isSafePart(true),
+  m_isValid(false),
+  m_isVisible(true)
+{
+    m_planeList = ::fwData::PlaneList::New();
+}
+
+//------------------------------------------------------------------------------
+
+Resection::~Resection ()
+{}
+
+//------------------------------------------------------------------------------
+
+void Resection::shallowCopy(const Object::csptr &_source )
+{
+    Resection::csptr other = Resection::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+
+    m_name = other->m_name;
+    m_isSafePart = other->m_isSafePart;
+    m_isValid = other->m_isValid;
+    m_isVisible = other->m_isVisible;
+    m_planeList = other->m_planeList;
+    m_vInputs = other->m_vInputs;
+    m_vOutputs = other->m_vOutputs;
+}
+
+//------------------------------------------------------------------------------
+
+void Resection::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Resection::csptr other = Resection::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+
+    m_name = other->m_name;
+    m_isSafePart = other->m_isSafePart;
+    m_isValid = other->m_isValid;
+    m_isVisible = other->m_isVisible;
+    m_planeList = ::fwData::Object::copy(other->m_planeList, cache);
+
+    this->m_vInputs.clear();
+    BOOST_FOREACH(const ResectionInputs::value_type &resec, other->m_vInputs)
+    {
+        m_vInputs.push_back( ::fwData::Object::copy(resec, cache) );
+    }
+
+    this->m_vOutputs.clear();
+    BOOST_FOREACH(const ResectionOutputs::value_type &resec, other->m_vOutputs)
+    {
+        m_vOutputs.push_back( ::fwData::Object::copy(resec, cache) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/ResectionDB.cpp b/SrcLib/core/fwData/src/fwData/ResectionDB.cpp
new file mode 100644
index 0000000..7cdb51b
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/ResectionDB.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/ResectionDB.hpp"
+
+fwDataRegisterMacro( ::fwData::ResectionDB );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+ResectionDB::ResectionDB(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+ResectionDB::~ResectionDB()
+{}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::shallowCopy(const Object::csptr &_source )
+{
+    ResectionDB::csptr other = ResectionDB::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    ResectionDB::csptr other = ResectionDB::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+}
+
+//------------------------------------------------------------------------------
+
+ResectionDB::ResectionContainerType::size_type ResectionDB::getNumberOfResections() const
+{
+    return m_attrResections.size();
+}
+
+//------------------------------------------------------------------------------
+
+void ResectionDB::addResection( ::fwData::Resection::sptr resection )
+{
+    m_attrResections.push_back( resection );
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Spline.cpp b/SrcLib/core/fwData/src/fwData/Spline.cpp
new file mode 100644
index 0000000..92ae88f
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Spline.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Spline.hpp"
+
+fwDataRegisterMacro( ::fwData::Spline );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Spline::Spline(::fwData::Object::Key key)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+Spline::~Spline()
+{
+    SLM_TRACE_FUNC();
+    m_points.clear();
+}
+
+//------------------------------------------------------------------------------
+
+Spline::Points &Spline::points()
+{
+    return m_points ;
+}
+
+//------------------------------------------------------------------------------
+
+void Spline::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    Spline::csptr other = Spline::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/String.cpp b/SrcLib/core/fwData/src/fwData/String.cpp
new file mode 100644
index 0000000..f235276
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/String.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/GenericField.hpp"
+#include "fwData/String.hpp"
+
+fwDataRegisterMacro( ::fwData::String );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+String::String(::fwData::Object::Key key ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+String::~String() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void String::shallowCopy(const Object::csptr &_source )
+{
+    String::csptr other = String::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_value = other->m_value;
+}
+
+//------------------------------------------------------------------------------
+
+void String::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    String::csptr other = String::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_value = other->m_value;
+}
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/StructureTraits.cpp b/SrcLib/core/fwData/src/fwData/StructureTraits.cpp
new file mode 100644
index 0000000..25b9420
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/StructureTraits.cpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/StructureTraits.hpp"
+
+fwDataRegisterMacro( ::fwData::StructureTraits );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+StructureTraits::StructureTraits(::fwData::Object::Key key) : m_anatomicRegion(""),
+                                                              m_propertyCategory(""),
+                                                              m_propertyType("")
+{
+    m_color = ::fwData::Color::New();
+}
+
+//------------------------------------------------------------------------------
+
+StructureTraits::~StructureTraits ()
+{}
+
+//------------------------------------------------------------------------------
+
+void StructureTraits::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    StructureTraits::csptr other = StructureTraits::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/StructureTraitsDictionary.cpp b/SrcLib/core/fwData/src/fwData/StructureTraitsDictionary.cpp
new file mode 100644
index 0000000..635f099
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/StructureTraitsDictionary.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/StructureTraitsDictionary.hpp"
+
+fwDataRegisterMacro( ::fwData::StructureTraitsDictionary );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+StructureTraitsDictionary::StructureTraitsDictionary (::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+StructureTraitsDictionary::~StructureTraitsDictionary ()
+{}
+
+//------------------------------------------------------------------------------
+
+StructureTraits::sptr StructureTraitsDictionary::getStructure(std::string type)
+{
+    OSLM_ASSERT("Structure of type '" << type << "' not found", m_structureTraitsMap.find(type) != m_structureTraitsMap.end());
+    return m_structureTraitsMap[type];
+}
+
+//------------------------------------------------------------------------------
+
+void StructureTraitsDictionary::addStructure(StructureTraits::sptr structureTraits)
+{
+    std::string type = structureTraits->getType();
+    StructureTraits::StructureClass structClass = structureTraits->getClass();
+    std::string attachment = structureTraits->getAttachmentType();
+    FW_RAISE_IF("Structure of type '" << type << "' already exist", m_structureTraitsMap.find(type) != m_structureTraitsMap.end());
+    FW_RAISE_IF("Structure of class '" << structClass << "' can not have attachment",
+            !(attachment.empty() || structClass == StructureTraits::LESION || structClass == StructureTraits::FUNCTIONAL) );
+    FW_RAISE_IF("Structure attachment '" << attachment << "' not found in dictionary",
+            !(attachment.empty() || m_structureTraitsMap.find(attachment) != m_structureTraitsMap.end() ) );
+    FW_RAISE_IF("Structure attachment '" << attachment << "' must be of class ORGAN",
+            !(attachment.empty() || m_structureTraitsMap[attachment]->getClass() == StructureTraits::ORGAN ) );
+    FW_RAISE_IF("Structure must have at least one category",
+            structureTraits->getCategories().empty());
+    FW_RAISE_IF("Wrong structure type '" << type<< "', a type cannot contain space" , structureTraits->getType().find(" ") != std::string::npos );
+
+    m_structureTraitsMap[type] = structureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+StructureTraitsDictionary::StructureTypeNameContainer StructureTraitsDictionary::getStructureTypeNames() const
+{
+    StructureTypeNameContainer vectNames;
+    std::transform( m_structureTraitsMap.begin(), m_structureTraitsMap.end(),
+            std::back_inserter(vectNames),
+            ::boost::bind(& StructureTraitsMapType::value_type::first,_1) );
+    return vectNames;
+}
+
+//------------------------------------------------------------------------------
+
+void StructureTraitsDictionary::shallowCopy(const Object::csptr &source )
+{
+    StructureTraitsDictionary::csptr other = StructureTraitsDictionary::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( source );
+    m_structureTraitsMap = other->m_structureTraitsMap;
+}
+
+//------------------------------------------------------------------------------
+
+void StructureTraitsDictionary::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    StructureTraitsDictionary::csptr other = StructureTraitsDictionary::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+    m_structureTraitsMap.clear();
+    BOOST_FOREACH(StructureTraitsMapType::value_type elt, other->m_structureTraitsMap)
+    {
+        m_structureTraitsMap[elt.first] = ::fwData::Object::copy(elt.second, cache);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/StructureTraitsHelper.cpp b/SrcLib/core/fwData/src/fwData/StructureTraitsHelper.cpp
new file mode 100644
index 0000000..e7af2f7
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/StructureTraitsHelper.cpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign.hpp>
+
+#include "fwData/StructureTraitsHelper.hpp"
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+const StructureTraitsHelper::CategoryTranslatorType StructureTraitsHelper::s_CATEGORYTRANSLATOR = ::boost::assign::list_of< StructureTraitsHelper::CategoryTranslatorType::relation >
+                                                           ( ::fwData::StructureTraits::BODY,               std::string("Body"))
+                                                           ( ::fwData::StructureTraits::HEAD,               std::string("Head"))
+                                                           ( ::fwData::StructureTraits::NECK,               std::string("Neck"))
+                                                           ( ::fwData::StructureTraits::THORAX,             std::string("Thorax"))
+                                                           ( ::fwData::StructureTraits::ABDOMEN,            std::string("Abdomen"))
+                                                           ( ::fwData::StructureTraits::PELVIS,             std::string("Pelvis"))
+                                                           ( ::fwData::StructureTraits::ARM,                std::string("Arm"))
+                                                           ( ::fwData::StructureTraits::LEG,                std::string("Leg"))
+                                                           ( ::fwData::StructureTraits::LIVER_SEGMENTS,     std::string("Liver_segments"))
+                                                           ( ::fwData::StructureTraits::OTHER,              std::string("Other"));
+
+//------------------------------------------------------------------------------
+
+const StructureTraitsHelper::ClassTranslatorType StructureTraitsHelper::s_CLASSTRANSLATOR = ::boost::assign::list_of< StructureTraitsHelper::ClassTranslatorType::relation >
+                                                           ( ::fwData::StructureTraits::TOOL,          std::string("Tool"))
+                                                           ( ::fwData::StructureTraits::ENVIRONMENT,   std::string("Environment"))
+                                                           ( ::fwData::StructureTraits::VESSEL,        std::string("Vessel"))
+                                                           ( ::fwData::StructureTraits::LESION,        std::string("Lesion"))
+                                                           ( ::fwData::StructureTraits::ORGAN,         std::string("Organ"))
+                                                           ( ::fwData::StructureTraits::FUNCTIONAL,    std::string("Functional"))
+                                                           ( ::fwData::StructureTraits::NO_CONSTRAINT, std::string("No_constraint"));
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/Tag.cpp b/SrcLib/core/fwData/src/fwData/Tag.cpp
new file mode 100644
index 0000000..a280dc9
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Tag.cpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Tag.hpp"
+
+fwDataRegisterMacro( ::fwData::Tag );
+
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Tag::Tag(::fwData::Object::Key key) : m_size(0.5)
+{}
+
+//------------------------------------------------------------------------------
+
+Tag::~Tag ()
+{
+    if(m_pointList)
+    {
+        m_pointList->getRefPoints().clear();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Tag::shallowCopy(const Object::csptr &source )
+{
+    Tag::csptr other = Tag::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( source );
+    m_sType = other->m_sType;
+    m_size = other->m_size;
+    m_pointList = other->m_pointList;
+
+}
+
+//------------------------------------------------------------------------------
+
+void Tag::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    Tag::csptr other = Tag::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+    m_sType = other->m_sType;
+    m_size = other->m_size;
+    m_pointList = ::fwData::Object::copy(other->m_pointList, cache);
+}
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/TransferFunction.cpp b/SrcLib/core/fwData/src/fwData/TransferFunction.cpp
new file mode 100644
index 0000000..57802bc
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/TransferFunction.cpp
@@ -0,0 +1,413 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Type.hpp>
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/TransferFunction.hpp"
+
+
+fwDataRegisterMacro( ::fwData::TransferFunction );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+const std::string TransferFunction::s_DEFAULT_TF_NAME = "CT-GreyLevel";
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TransferFunction(::fwData::Object::Key key)
+{
+    this->initTF();
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::initTF()
+{
+    m_attrLevel = 0;
+    m_attrWindow = 100;
+
+    m_attrName = "";
+
+    m_attrInterpolationMode = TransferFunction::LINEAR;
+    m_attrIsClamped = true;
+
+    m_tfData.clear();
+}
+
+//------------------------------------------------------------------------------
+
+fwData::TransferFunction::sptr TransferFunction::createDefaultTF()
+{
+    TransferFunction::sptr tf = TransferFunction::New();
+
+    tf->setName(TransferFunction::s_DEFAULT_TF_NAME);
+    tf->addTFColor(0.0, TFColor());
+    tf->addTFColor(1.0, TFColor(1.0,1.0,1.0,1.0));
+    tf->setIsClamped(false);
+    return tf;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::~TransferFunction()
+{}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFValueVectorType TransferFunction::getTFValues() const
+{
+    TFValueVectorType values;
+    values.reserve(m_tfData.size());
+    std::transform( m_tfData.begin(), m_tfData.end(),
+            std::back_inserter(values),
+            ::boost::bind(& TFDataType::value_type::first, _1) );
+    return values;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFValueVectorType TransferFunction::getScaledValues() const
+{
+    TFValueVectorType values;
+    values.reserve(m_tfData.size());
+    TFValuePairType minMax = this->getMinMaxTFValues();
+    TFValuePairType windowMinMax = this->getWLMinMax();
+
+    const double scale = m_attrWindow / (minMax.second - minMax.first);
+
+    BOOST_FOREACH(const TFDataType::value_type &data, m_tfData)
+    {
+        const double value = (data.first - minMax.first) * scale + windowMinMax.first;
+        values.push_back(value);
+    }
+
+    return values;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFValuePairType
+TransferFunction::getMinMaxTFValues() const
+{
+    OSLM_ASSERT("It must have at least one value.", m_tfData.size()>= 1);
+    TFValuePairType minMax;
+    minMax.first = m_tfData.begin()->first;
+    minMax.second = (m_tfData.rbegin())->first;
+    return minMax;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFValuePairType
+TransferFunction::getWLMinMax() const
+{
+    TFValuePairType minMax;
+    double halfWindow = m_attrWindow/2.f;
+    minMax.first = m_attrLevel - halfWindow;
+    minMax.second = m_attrLevel + halfWindow;;
+    return minMax;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::setWLMinMax(const TFValuePairType& minMax)
+{
+    m_attrWindow = minMax.second - minMax.first;
+    double halfWindow = m_attrWindow/2.f;
+    m_attrLevel = halfWindow + minMax.first;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFValueType TransferFunction::getNearestValue( TFValueType value ) const
+{
+    OSLM_ASSERT("It must have at least one value.", m_tfData.size()>= 1);
+    std::pair<double, double> minMax  = ::fwTools::Type::s_DOUBLE.minMax<double>();
+    double previousValue = minMax.first;
+    double nextValue = minMax.second;
+
+    TFValueType val;
+    BOOST_FOREACH(const TFDataType::value_type &data, m_tfData)
+    {
+        if(value < data.first )
+        {
+            nextValue = data.first;
+            break;
+        }
+        else
+        {
+            previousValue = data.first;
+        }
+    }
+    if(previousValue == minMax.first)
+    {
+        val = nextValue;
+    }
+    else if(nextValue == minMax.second)
+    {
+        val = previousValue;
+    }
+    else
+    {
+        if((value - previousValue) < (nextValue - value))
+        {
+            val = previousValue;
+        }
+        else
+        {
+            val = nextValue;
+        }
+    }
+    return val;
+}
+
+//------------------------------------------------------------------------------
+
+const TransferFunction::TFDataType& TransferFunction::getTFData() const
+{
+    return m_tfData;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::setTFData( const TFDataType & tfData )
+{
+    m_tfData = tfData;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::addTFColor( TFValueType value, const TFColor & color )
+{
+    m_tfData[value] = color;
+}
+
+//------------------------------------------------------------------------------
+void TransferFunction::eraseTFValue( TFValueType value)
+{
+    m_tfData.erase(value);
+}
+
+//------------------------------------------------------------------------------
+void TransferFunction::clear()
+{
+    m_tfData.clear();
+}
+//------------------------------------------------------------------------------
+
+TransferFunction::TFColorVectorType TransferFunction::getTFColors() const
+{
+    TFColorVectorType colors;
+    std::transform( m_tfData.begin(), m_tfData.end(),
+            std::back_inserter(colors),
+            ::boost::bind(& TFDataType::value_type::second, _1) );
+    return colors;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFColor TransferFunction::getNearestColor( TFValueType value ) const
+{
+    OSLM_ASSERT("It must have at least one value.", m_tfData.size()>= 1);
+    std::pair<double, double> minMax  = ::fwTools::Type::s_DOUBLE.minMax<double>();
+    double previousValue = minMax.first;
+    double nextValue = minMax.second;
+
+    TFColor blackColor(0.0, 0.0, 0.0, 0.0);
+    TFColor color;
+    TFColor previousColor = blackColor;
+    TFColor nextColor = blackColor;
+
+    BOOST_FOREACH(const TFDataType::value_type &data, m_tfData)
+    {
+        if(value < data.first )
+        {
+            nextValue = data.first;
+            nextColor = data.second;
+            break;
+        }
+        else
+        {
+            previousValue = data.first;
+            previousColor = data.second;
+        }
+    }
+    if(previousValue == minMax.first)
+    {
+        if(m_attrIsClamped)
+        {
+            color = blackColor;
+        }
+        else
+        {
+            color = nextColor;
+        }
+    }
+    else if(nextValue == minMax.second)
+    {
+        if(m_attrIsClamped && (value != previousValue))
+        {
+            color = blackColor;
+        }
+        else
+        {
+            color = previousColor;
+        }
+    }
+    else
+    {
+        if((value - previousValue) < (nextValue - value))
+        {
+            color = previousColor;
+        }
+        else
+        {
+            color = nextColor;
+        }
+    }
+
+    return color;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFColor TransferFunction::getLinearColor( TFValueType value ) const
+{
+    OSLM_ASSERT("It must have at least one value.", m_tfData.size()>= 1);
+    std::pair<double, double> minMax  = ::fwTools::Type::s_DOUBLE.minMax<double>();
+    double previousValue = minMax.first;
+    double nextValue = minMax.second;
+
+    TFColor blackColor(0.0, 0.0, 0.0, 0.0);
+    TFColor color;
+    TFColor previousColor = blackColor;
+    TFColor nextColor = blackColor;
+
+    BOOST_FOREACH(const TFDataType::value_type &data, m_tfData)
+    {
+        if(value < data.first )
+        {
+            nextValue = data.first;
+            nextColor = data.second;
+            break;
+        }
+        else
+        {
+            previousValue = data.first;
+            previousColor = data.second;
+        }
+    }
+    if(previousValue == minMax.first)
+    {
+        if(m_attrIsClamped)
+        {
+            color = blackColor;
+        }
+        else
+        {
+            color = nextColor;
+        }
+    }
+    else if(nextValue == minMax.second)
+    {
+        if(m_attrIsClamped && (value != previousValue))
+        {
+            color = blackColor;
+        }
+        else
+        {
+            color = previousColor;
+        }
+    }
+    else
+    {
+        // Interpolate the color.
+        double distanceToNextValue = nextValue - value;
+        double distanceToPreviousValue = value - previousValue;
+        double distance = nextValue - previousValue;
+        double coefPrevious = 1.0 - (distanceToPreviousValue/distance);
+        double coefNext = 1.0 - (distanceToNextValue/distance);
+
+        color.r =  coefPrevious*previousColor.r + coefNext*nextColor.r;
+        color.g =  coefPrevious*previousColor.g + coefNext*nextColor.g;
+        color.b =  coefPrevious*previousColor.b + coefNext*nextColor.b;
+        color.a =  coefPrevious*previousColor.a + coefNext*nextColor.a;
+    }
+    return color;
+}
+
+//------------------------------------------------------------------------------
+
+TransferFunction::TFColor TransferFunction::getInterpolatedColor( TFValueType value ) const
+{
+    TFColor color;
+
+    if(m_attrInterpolationMode == LINEAR)
+    {
+        color = this->getLinearColor(value);
+    }
+    else if(m_attrInterpolationMode == NEAREST)
+    {
+        color = this->getNearestColor(value);
+    }
+    return color;
+}
+
+//------------------------------------------------------------------------------
+
+const TransferFunction::TFColor& TransferFunction::getTFColor( TFValueType value ) const
+{
+    TFDataType::const_iterator itr = m_tfData.find(value);
+    SLM_ASSERT("Sorry not defined in the TF.", itr != m_tfData.end());
+    return itr->second;
+}
+//------------------------------------------------------------------------------
+
+void TransferFunction::shallowCopy(const Object::csptr &_source )
+{
+    TransferFunction::csptr other = TransferFunction::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    this->m_attrLevel = other->m_attrLevel;
+    this->m_attrWindow = other->m_attrWindow;
+    this->m_attrName =other->m_attrName;
+    this->m_attrBackgroundColor = other->m_attrBackgroundColor;
+    this->m_tfData = other->m_tfData;
+    this->m_attrInterpolationMode = other->m_attrInterpolationMode;
+    this->m_attrIsClamped = other->m_attrIsClamped;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    TransferFunction::csptr other = TransferFunction::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    this->m_attrLevel = other->m_attrLevel;
+    this->m_attrWindow = other->m_attrWindow;
+    this->m_attrName =other->m_attrName;
+    this->m_attrBackgroundColor = other->m_attrBackgroundColor;
+    this->m_tfData = other->m_tfData;
+    this->m_attrInterpolationMode = other->m_attrInterpolationMode;
+    this->m_attrIsClamped = other->m_attrIsClamped;
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/TransformationMatrix3D.cpp b/SrcLib/core/fwData/src/fwData/TransformationMatrix3D.cpp
new file mode 100644
index 0000000..bd16f0c
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/TransformationMatrix3D.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/TransformationMatrix3D.hpp"
+
+fwDataRegisterMacro( ::fwData::TransformationMatrix3D );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+TransformationMatrix3D::TransformationMatrix3D(::fwData::Object::Key key) :
+                        m_vCoefficients(16)
+{
+    //default init
+    for(int l = 0; l < 4; l++)
+        for(int c = 0; c < 4; c++){
+            if(l==c)
+                setCoefficient(l, c, 1);
+            else
+                setCoefficient(l, c, 0);
+        }
+}
+
+//------------------------------------------------------------------------------
+
+TransformationMatrix3D::~TransformationMatrix3D()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3D::shallowCopy(const Object::csptr &_source )
+{
+    TransformationMatrix3D::csptr other = TransformationMatrix3D::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_vCoefficients = other->m_vCoefficients;
+}
+
+//-----------------------------------------------------------------------------
+
+void TransformationMatrix3D::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    TransformationMatrix3D::csptr other = TransformationMatrix3D::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    m_vCoefficients = other->m_vCoefficients;
+}
+
+//------------------------------------------------------------------------------
+
+double TransformationMatrix3D::getCoefficient(int l, int c) const
+{
+    unsigned int pos = l * MATRIX_SIZE + c;
+    assert(pos < m_vCoefficients.size());
+    return m_vCoefficients.at(pos);
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3D::setCoefficient(int l, int c, TransformationMatrix3D::TM3DType val)
+{
+    unsigned int pos = l * MATRIX_SIZE + c;
+    assert(pos < m_vCoefficients.size());
+    m_vCoefficients.at(pos)= val ;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/TriangularMesh.cpp b/SrcLib/core/fwData/src/fwData/TriangularMesh.cpp
new file mode 100644
index 0000000..14d4521
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/TriangularMesh.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/TriangularMesh.hpp"
+
+
+fwDataRegisterMacro( ::fwData::TriangularMesh );
+namespace fwData
+{
+
+TriangularMesh::TriangularMesh(::fwData::Object::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TriangularMesh::~TriangularMesh()
+{
+    m_points.clear();
+    m_cells.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::shallowCopy(const Object::csptr &_source )
+{
+    TriangularMesh::csptr other = TriangularMesh::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    this->m_points = other->m_points;
+    this->m_cells = other->m_cells;
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    TriangularMesh::csptr other = TriangularMesh::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    this->m_points = other->m_points;
+    this->m_cells = other->m_cells;
+}
+
+//-----------------------------------------------------------------------------
+
+TriangularMesh::PointContainer &TriangularMesh::points()
+{
+    return m_points ;
+}
+
+//-----------------------------------------------------------------------------
+
+TriangularMesh::ConstPointContainer &TriangularMesh::points() const
+{
+    return m_points ;
+}
+
+//-----------------------------------------------------------------------------
+
+TriangularMesh::CellContainer &TriangularMesh::cells()
+{
+    return m_cells ;
+}
+
+//-----------------------------------------------------------------------------
+
+TriangularMesh::ConstCellContainer &TriangularMesh::cells() const
+{
+    return m_cells ;
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::setOneVectorInPointList(int _iIndex, float _fX, float _fY, float _fZ)
+{
+    assert( (0 <= _iIndex) );
+    if ( ((PointContainer::size_type)_iIndex) >= m_points.size() )// Resize if necessary
+        m_points.resize( _iIndex + 1 );
+    std::vector<float> v(3);
+    m_points[_iIndex] = v;
+    m_points[_iIndex][0] = _fX;
+    m_points[_iIndex][1] = _fY;
+    m_points[_iIndex][2] = _fZ;
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::setOneIndexInIndexList(int _iIndex, int _p1, int _p2, int _p3)
+{
+    assert( (0 <= _iIndex) );
+    if ( ((CellContainer::size_type)_iIndex) >= m_cells.size() )// Resize if necessary
+        m_cells.resize( _iIndex + 1 );
+    std::vector<int> v(3);
+    m_cells[_iIndex] = v;
+    m_cells[_iIndex][0] = _p1;
+    m_cells[_iIndex][1] = _p2;
+    m_cells[_iIndex][2] = _p3;
+}
+
+//-----------------------------------------------------------------------------
+
+double* TriangularMesh::getOneVectorFromPointList(int _pt) const
+{
+    double *vec  = new double[3];
+    vec[0] = (double) m_points[_pt][0];
+    vec[1] =  (double) m_points[_pt][1];
+    vec[2] =  (double) m_points[_pt][2];
+    return vec;
+}
+
+//-----------------------------------------------------------------------------
+
+int TriangularMesh::getOneIndexFromIndexList(void) const { return 0; } //FIXME
+
+void TriangularMesh::setOneVectorInNormalList(int x, float, float, float) { x = 0; } //FIXME
+
+int TriangularMesh::getOneIndexFromNormalList(void) const { return 1; } //FIXME
+
+//-----------------------------------------------------------------------------
+
+ size_t TriangularMesh::getNumPoints() const
+{
+    return m_points.size();
+}
+
+//-----------------------------------------------------------------------------
+
+size_t TriangularMesh::getNumCells() const
+{
+    return m_cells.size();
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::clearPoints()
+{
+    PointContainer emptyVector; // Size=0 and capacity=0
+    m_points.clear();
+    // The swap reinitialize the size value and capacity to 0
+    m_points.swap(emptyVector);
+}
+
+//-----------------------------------------------------------------------------
+
+void TriangularMesh::clearCells()
+{
+    CellContainer emptyVector; //Size=0 and capacity=0
+    m_cells.clear();
+    // The swap reinitialize the size value and capacity to 0
+    m_cells.swap(emptyVector);
+}
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/Vector.cpp b/SrcLib/core/fwData/src/fwData/Vector.cpp
new file mode 100644
index 0000000..904f507
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Vector.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+#include "fwData/Vector.hpp"
+
+fwDataRegisterMacro( ::fwData::Vector );
+
+namespace fwData
+{
+
+//------------------------------------------------------------------------------
+
+Vector::Vector(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+Vector::~Vector()
+{}
+
+//------------------------------------------------------------------------------
+
+void Vector::shallowCopy(const Object::csptr &_source )
+{
+    Vector::csptr other = Vector::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    m_attrContainer = other->m_attrContainer;
+}
+
+//------------------------------------------------------------------------------
+
+void Vector::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    Vector::csptr other = Vector::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+    m_attrContainer.clear();
+    m_attrContainer.reserve(other->m_attrContainer.size());
+    BOOST_FOREACH(const ContainerType::value_type &obj, other->m_attrContainer)
+    {
+        m_attrContainer.push_back( ::fwData::Object::copy(obj, cache) );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwData/src/fwData/Video.cpp b/SrcLib/core/fwData/src/fwData/Video.cpp
new file mode 100644
index 0000000..e0044c9
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/Video.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/Video.hpp"
+
+fwDataRegisterMacro( ::fwData::Video );
+namespace fwData
+{
+//------------------------------------------------------------------------------
+
+Video::Video(::fwData::Object::Key key) :
+        m_ui32XSize(0),
+        m_ui32YSize(0),
+        m_ui8BPP(1),
+        m_pImageBuffer(0),
+        m_dataAvailable(false),
+        m_lastModified(0)
+{
+    m_camera = ::fwData::Camera::New();
+}
+
+//------------------------------------------------------------------------------
+
+Video::~Video() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+bool &Video::dataAvailable()
+{
+    return m_dataAvailable;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::uint64_t Video::getLastModified()
+{
+    return m_lastModified;
+}
+
+//------------------------------------------------------------------------------
+
+void Video::Modified()
+{
+    m_lastModified++;
+}
+
+//------------------------------------------------------------------------------
+
+void Video::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    Video::csptr other = Video::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+
+} // namespace fwData
diff --git a/SrcLib/core/fwData/src/fwData/factory/new.cpp b/SrcLib/core/fwData/src/fwData/factory/new.cpp
new file mode 100644
index 0000000..adf5a6e
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/factory/new.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/Object.hpp"
+
+#include "fwData/factory/new.hpp"
+
+
+namespace fwData
+{
+
+namespace factory
+{
+
+::fwData::Object::sptr New( const ::fwData::registry::KeyType & classname )
+{
+    return ::fwData::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/src/fwData/location/Folder.cpp b/SrcLib/core/fwData/src/fwData/location/Folder.cpp
new file mode 100644
index 0000000..16261a6
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/location/Folder.cpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/location/Folder.hpp"
+
+fwDataRegisterMacro( ::fwData::location::Folder );
+
+namespace fwData
+{
+namespace location
+{
+
+//------------------------------------------------------------------------------
+
+Folder::Folder( ::fwData::Object::Key key )
+{}
+
+//------------------------------------------------------------------------------
+
+Folder::~Folder()
+{}
+
+//------------------------------------------------------------------------------
+
+Folder::sptr Folder::FolderFactory(PathType path, bool recursive )
+{
+    FwCoreNotUsedMacro(recursive);
+    Folder::sptr folder = Folder::New();
+    folder->setFolder(path);
+    return folder;
+}
+
+//------------------------------------------------------------------------------
+
+void Folder::shallowCopy(const Object::csptr &_source )
+{
+    Folder::csptr other = Folder::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    this->m_folder = other->m_folder;
+}
+
+//------------------------------------------------------------------------------
+
+void Folder::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Folder::csptr other = Folder::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    this->m_folder = other->m_folder;
+}
+
+//------------------------------------------------------------------------------
+
+void Folder::setFolder( PathType folder)
+{
+    m_folder = folder;
+}
+
+//------------------------------------------------------------------------------
+
+ILocation::PathType Folder::getFolder() const
+{
+    return m_folder;
+}
+
+//------------------------------------------------------------------------------
+
+void Folder::setRecursive( bool recursive)
+{
+    m_isRecursive = recursive;
+}
+
+//------------------------------------------------------------------------------
+
+bool Folder::getRecursive()
+{
+    return m_isRecursive;
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
diff --git a/SrcLib/core/fwData/src/fwData/location/ILocation.cpp b/SrcLib/core/fwData/src/fwData/location/ILocation.cpp
new file mode 100644
index 0000000..a706fcb
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/location/ILocation.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/location/ILocation.hpp"
+
+namespace fwData
+{
+namespace location
+{
+
+//------------------------------------------------------------------------------
+
+ILocation::ILocation()
+{}
+
+//------------------------------------------------------------------------------
+
+ILocation::~ILocation()
+{}
+
+//------------------------------------------------------------------------------
+
+}
+}
diff --git a/SrcLib/core/fwData/src/fwData/location/MultiFiles.cpp b/SrcLib/core/fwData/src/fwData/location/MultiFiles.cpp
new file mode 100644
index 0000000..aa2b0ed
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/location/MultiFiles.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/registry/macros.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/location/MultiFiles.hpp"
+
+fwDataRegisterMacro( ::fwData::location::MultiFiles );
+
+
+
+
+namespace fwData
+{
+namespace location
+{
+
+//------------------------------------------------------------------------------
+
+MultiFiles::MultiFiles( ::fwData::Object::Key key )
+{}
+
+//------------------------------------------------------------------------------
+
+MultiFiles::~MultiFiles()
+{}
+
+//------------------------------------------------------------------------------
+
+void MultiFiles::setPaths( VectPathType paths)
+{
+    m_paths = paths;
+}
+
+//------------------------------------------------------------------------------
+
+ILocation::VectPathType MultiFiles::getPaths()
+{
+    return m_paths;
+}
+
+//------------------------------------------------------------------------------
+
+void MultiFiles::cachedDeepCopy(const Object::csptr &source, DeepCopyCacheType &cache)
+{
+    MultiFiles::csptr other = MultiFiles::dynamicConstCast(source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (source?source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( source, cache );
+
+    OSLM_FATAL("Not implemented." );
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
diff --git a/SrcLib/core/fwData/src/fwData/location/SingleFile.cpp b/SrcLib/core/fwData/src/fwData/location/SingleFile.cpp
new file mode 100644
index 0000000..2860777
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/location/SingleFile.cpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwData/location/Folder.hpp"
+#include "fwData/Exception.hpp"
+
+#include "fwData/location/SingleFile.hpp"
+
+#include "fwData/registry/macros.hpp"
+
+
+fwDataRegisterMacro( ::fwData::location::SingleFile );
+
+
+
+namespace fwData
+{
+namespace location
+{
+
+//------------------------------------------------------------------------------
+
+SingleFile::SingleFile( ::fwData::Object::Key key )
+{}
+
+//------------------------------------------------------------------------------
+
+SingleFile::~SingleFile()
+{}
+
+//------------------------------------------------------------------------------
+
+void SingleFile::shallowCopy(const Object::csptr &_source )
+{
+    SingleFile::csptr other = SingleFile::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldShallowCopy( _source );
+    this->m_path = other->m_path;
+}
+
+//------------------------------------------------------------------------------
+
+void SingleFile::cachedDeepCopy(const Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    SingleFile::csptr other = SingleFile::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+    this->fieldDeepCopy( _source, cache );
+    this->m_path = other->m_path;
+}
+
+//------------------------------------------------------------------------------
+
+SingleFile::sptr SingleFile::SingleFileFactory(PathType path)
+{
+    SingleFile::sptr singlefile = SingleFile::New();
+    singlefile->setPath(path);
+    return singlefile;
+}
+
+//------------------------------------------------------------------------------
+
+void SingleFile::setPath( PathType path)
+{
+    m_path = path;
+}
+
+//------------------------------------------------------------------------------
+
+ILocation::PathType SingleFile::getPath() const
+{
+    return m_path;
+}
+
+//------------------------------------------------------------------------------
+
+}
+}
diff --git a/SrcLib/core/fwData/src/fwData/mt/ObjectReadLock.cpp b/SrcLib/core/fwData/src/fwData/mt/ObjectReadLock.cpp
new file mode 100644
index 0000000..14521ce
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/mt/ObjectReadLock.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/thread/locks.hpp>
+
+#include "fwData/mt/ObjectReadLock.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+//-----------------------------------------------------------------------------
+
+ObjectReadLock::ObjectReadLock(::fwData::Object::sptr obj, bool lock)
+{
+    if (lock)
+    {
+        m_lock = ::fwCore::mt::ReadLock(obj->getMutex());
+    }
+    else
+    {
+        m_lock = ::fwCore::mt::ReadLock(obj->getMutex(), ::boost::defer_lock_t());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+ObjectReadLock::~ObjectReadLock()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadLock::lock()
+{
+    m_lock.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadLock::unlock()
+{
+    m_lock.unlock();
+}
+
+//-----------------------------------------------------------------------------
+
+} // mt
+} // fwData
diff --git a/SrcLib/core/fwData/src/fwData/mt/ObjectReadToWriteLock.cpp b/SrcLib/core/fwData/src/fwData/mt/ObjectReadToWriteLock.cpp
new file mode 100644
index 0000000..7ce26f1
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/mt/ObjectReadToWriteLock.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/thread/locks.hpp>
+#include <boost/make_shared.hpp>
+
+#include "fwData/mt/ObjectReadToWriteLock.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+//-----------------------------------------------------------------------------
+
+ObjectReadToWriteLock::ObjectReadToWriteLock(::fwData::Object::sptr obj, bool lock)
+{
+    if (lock)
+    {
+        m_lock = ::fwCore::mt::ReadToWriteLock(obj->getMutex());
+    }
+    else
+    {
+        m_lock = ::fwCore::mt::ReadToWriteLock(obj->getMutex(), ::boost::defer_lock_t());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+ObjectReadToWriteLock::~ObjectReadToWriteLock()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadToWriteLock::lock()
+{
+    m_lock.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadToWriteLock::unlock()
+{
+    m_lock.unlock();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadToWriteLock::upgrade()
+{
+    m_upgradedLock = ::boost::make_shared< ::fwCore::mt::UpgradeToWriteLock >(::boost::ref(m_lock));
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectReadToWriteLock::downgrade()
+{
+    m_upgradedLock.reset();
+}
+
+//-----------------------------------------------------------------------------
+
+} // mt
+} // fwData
diff --git a/SrcLib/core/fwData/src/fwData/mt/ObjectWriteLock.cpp b/SrcLib/core/fwData/src/fwData/mt/ObjectWriteLock.cpp
new file mode 100644
index 0000000..022a49a
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/mt/ObjectWriteLock.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/thread/locks.hpp>
+
+#include "fwData/mt/ObjectWriteLock.hpp"
+
+namespace fwData
+{
+namespace mt
+{
+
+//-----------------------------------------------------------------------------
+
+ObjectWriteLock::ObjectWriteLock(::fwData::Object::sptr obj, bool adopt_lock)
+{
+    if (adopt_lock)
+    {
+        m_lock = ::fwCore::mt::WriteLock(obj->getMutex());
+    }
+    else
+    {
+        m_lock = ::fwCore::mt::WriteLock(obj->getMutex(), ::boost::defer_lock_t());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+ObjectWriteLock::~ObjectWriteLock()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ObjectWriteLock::lock()
+{
+    m_lock.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectWriteLock::unlock()
+{
+    m_lock.unlock();
+}
+
+//-----------------------------------------------------------------------------
+
+} // mt
+} // fwData
diff --git a/SrcLib/core/fwData/src/fwData/registry/detail.cpp b/SrcLib/core/fwData/src/fwData/registry/detail.cpp
new file mode 100644
index 0000000..0762319
--- /dev/null
+++ b/SrcLib/core/fwData/src/fwData/registry/detail.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwData/registry/detail.hpp"
+
+
+namespace fwData
+{
+
+namespace registry
+{
+
+struct FwDataRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwDataRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace fwData
+
+
diff --git a/SrcLib/core/fwData/test/CMakeLists.txt b/SrcLib/core/fwData/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwData/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwData/test/Properties.cmake b/SrcLib/core/fwData/test/Properties.cmake
new file mode 100644
index 0000000..b525f19
--- /dev/null
+++ b/SrcLib/core/fwData/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwComEd )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwData/test/cppunit.options b/SrcLib/core/fwData/test/cppunit.options
new file mode 100644
index 0000000..405d831
--- /dev/null
+++ b/SrcLib/core/fwData/test/cppunit.options
@@ -0,0 +1,34 @@
+
+CLASSTEST=[
+    'ArrayTest',
+    'BooleanTest',
+    'CameraTest',
+    'ColorTest',
+    'CompositeTest',
+    'CopyTest',
+    'EdgeTest',
+    'FloatTest',
+    'GraphTest',
+    'ImageTest',
+    'IntegerTest',
+    'IsTypeOfTest',
+    'MaterialTest',
+    'MacrosTest',
+    'MeshTest',
+    'ModelTest',
+    'ObjectTest',
+    'ProcessObjectTest',
+    'ReconstructionTest',
+    'ReconstructionTraitsTest',
+    'ROITraitsTest',
+    'StringTest',
+    'StructureTraitsDictionaryTest',
+    'TransferFunctionTest',
+    'TransformationMatrix3DTest',
+    'VideoTest',
+    'MTLockTest',
+]
+
+USE = ['boost','boostDateTime', 'boostRegex']
+LIB = ['fwData_0-1','fwTools_0-1','fwCore_0-1','fwComEd_0-1','fwTest_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwData/test/tu/include/ArrayTest.hpp b/SrcLib/core/fwData/test/tu/include/ArrayTest.hpp
new file mode 100644
index 0000000..910a2af
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ArrayTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_ARRAYTEST_HPP__
+#define __FWDATA_UT_ARRAYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ArrayTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ArrayTest );
+    CPPUNIT_TEST( allocation );
+    CPPUNIT_TEST( resize );
+    CPPUNIT_TEST( reallocate );
+    CPPUNIT_TEST( copy );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void allocation();
+    void resize();
+    void reallocate();
+    void copy();
+};
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_ARRAYTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/BooleanTest.hpp b/SrcLib/core/fwData/test/tu/include/BooleanTest.hpp
new file mode 100644
index 0000000..1f53ad4
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/BooleanTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_BOOLEANTEST_HPP__
+#define __FWDATA_UT_BOOLEANTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class BooleanTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( BooleanTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_BOOLEANTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/CameraTest.hpp b/SrcLib/core/fwData/test/tu/include/CameraTest.hpp
new file mode 100644
index 0000000..cd882d3
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/CameraTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_CAMERATEST_HPP__
+#define __FWDATA_UT_CAMERATEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class CameraTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CameraTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_CAMERATEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ColorTest.hpp b/SrcLib/core/fwData/test/tu/include/ColorTest.hpp
new file mode 100644
index 0000000..784d94d
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ColorTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_ColorTEST_HPP__
+#define __FWDATA_UT_ColorTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ColorTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ColorTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST( methode2 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+    void methode2();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_ColorTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/CompositeTest.hpp b/SrcLib/core/fwData/test/tu/include/CompositeTest.hpp
new file mode 100644
index 0000000..f57b8a6
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/CompositeTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_COMPOSITETEST_HPP__
+#define __FWDATA_UT_COMPOSITETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class CompositeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CompositeTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST( setGetContainerTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+    void setGetContainerTest();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_COMPOSITETEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/CopyTest.hpp b/SrcLib/core/fwData/test/tu/include/CopyTest.hpp
new file mode 100644
index 0000000..776da1a
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/CopyTest.hpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_COPYTEST_HPP__
+#define __FWDATA_UT_COPYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#define __FWDATA_UT_FIELD_DEEP_COPY_MACRO(ObjType)                                                                    \
+    {                                                                                                                 \
+    OSLM_WARN("Testing : " << #ObjType);                                                                              \
+    ObjType::sptr object = ObjType::New();                                                                            \
+    ObjType::sptr deepCopyObject;                                                                                     \
+                                                                                                                      \
+    ObjType::sptr field1 = ObjType::New();                                                                            \
+    ObjType::sptr field2 = ObjType::New();                                                                            \
+    ObjType::sptr field3 = ObjType::New();                                                                            \
+                                                                                                                      \
+    object->setField("F1", field1);                                                                                   \
+    object->setField("F2", field2);                                                                                   \
+    object->setField("F3", field3);                                                                                   \
+                                                                                                                      \
+    deepCopyObject = ::fwData::Object::copy(object);                                                                  \
+    CPPUNIT_ASSERT_EQUAL( object->getClassname(), deepCopyObject->getClassname() );                                   \
+    CPPUNIT_ASSERT_EQUAL( object->getFields().size(), deepCopyObject->getFields().size() );                           \
+    CPPUNIT_ASSERT( object->getField("F1") != deepCopyObject->getField("F1") );                                       \
+    CPPUNIT_ASSERT( object->getField("F2") != deepCopyObject->getField("F2") );                                       \
+    CPPUNIT_ASSERT( object->getField("F3") != deepCopyObject->getField("F3") );                                       \
+                                                                                                                      \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F1")->getClassname(), deepCopyObject->getField("F1")->getClassname() );   \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F2")->getClassname(), deepCopyObject->getField("F2")->getClassname() );   \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F3")->getClassname(), deepCopyObject->getField("F3")->getClassname() );   \
+    }
+
+#define __FWDATA_UT_FIELD_COPY_MACRO(ObjType)                                                                        \
+    {                                                                                                                \
+    OSLM_WARN("Testing : " << #ObjType);                                                                             \
+    ObjType::sptr object = ObjType::New();                                                                           \
+    ObjType::sptr deepCopyObject = ObjType::New();                                                                   \
+    ObjType::sptr shallowCopyObject = ObjType::New();                                                                \
+                                                                                                                     \
+    ObjType::sptr field1 = ObjType::New();                                                                           \
+    ObjType::sptr field2 = ObjType::New();                                                                           \
+    ObjType::sptr field3 = ObjType::New();                                                                           \
+                                                                                                                     \
+    object->setField("F1", field1);                                                                                  \
+    object->setField("F2", field2);                                                                                  \
+    object->setField("F3", field3);                                                                                  \
+                                                                                                                     \
+    deepCopyObject = ::fwData::Object::copy(object);                                                                 \
+    CPPUNIT_ASSERT_EQUAL( object->getClassname(), deepCopyObject->getClassname() );                                  \
+    CPPUNIT_ASSERT_EQUAL( object->getFields().size(), deepCopyObject->getFields().size() );                          \
+    CPPUNIT_ASSERT( object->getField("F1") != deepCopyObject->getField("F1") );                                      \
+    CPPUNIT_ASSERT( object->getField("F2") != deepCopyObject->getField("F2") );                                      \
+    CPPUNIT_ASSERT( object->getField("F3") != deepCopyObject->getField("F3") );                                      \
+                                                                                                                     \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F1")->getClassname(), deepCopyObject->getField("F1")->getClassname() );  \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F2")->getClassname(), deepCopyObject->getField("F2")->getClassname() );  \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F3")->getClassname(), deepCopyObject->getField("F3")->getClassname() );  \
+                                                                                                                     \
+    shallowCopyObject->shallowCopy(object);                                                                          \
+    CPPUNIT_ASSERT_EQUAL( object->getClassname(), shallowCopyObject->getClassname() );                               \
+    CPPUNIT_ASSERT_EQUAL( object->getFields().size(), shallowCopyObject->getFields().size() );                       \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F1"), shallowCopyObject->getField("F1") );                               \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F2"), shallowCopyObject->getField("F2") );                               \
+    CPPUNIT_ASSERT_EQUAL( object->getField("F3"), shallowCopyObject->getField("F3") );                               \
+    }
+
+
+namespace fwData
+{
+namespace ut
+{
+
+class CopyTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CopyTest );
+    CPPUNIT_TEST( fieldCopyTest );
+    CPPUNIT_TEST( severalReferencesCopyTest );
+    CPPUNIT_TEST( recursiveCopyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void fieldCopyTest();
+    void severalReferencesCopyTest();
+    void recursiveCopyTest();
+};
+
+} //namespace ut
+} //namespace fwData
+
+#endif //__FWDATA_UT_COPYTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/EdgeTest.hpp b/SrcLib/core/fwData/test/tu/include/EdgeTest.hpp
new file mode 100644
index 0000000..a15d549
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/EdgeTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_EDGETEST_HPP__
+#define __FWDATA_UT_EDGETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class EdgeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( EdgeTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_EDGETEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/FloatTest.hpp b/SrcLib/core/fwData/test/tu/include/FloatTest.hpp
new file mode 100644
index 0000000..a9e11c5
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/FloatTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_FLOATTEST_HPP__
+#define __FWDATA_UT_FLOATTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class FloatTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( FloatTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_FLOATTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/GraphTest.hpp b/SrcLib/core/fwData/test/tu/include/GraphTest.hpp
new file mode 100755
index 0000000..e914ae8
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/GraphTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_GRAPHTEST_HPP__
+#define __FWDATA_UT_GRAPHTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class GraphTest : public CPPUNIT_NS::TestFixture {
+
+    CPPUNIT_TEST_SUITE( GraphTest );
+    CPPUNIT_TEST( normalCase );
+    CPPUNIT_TEST( limitCase1 );
+    CPPUNIT_TEST( limitCase2 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void normalCase();
+    void limitCase1();
+    void limitCase2();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_GRAPHTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ImageTest.hpp b/SrcLib/core/fwData/test/tu/include/ImageTest.hpp
new file mode 100644
index 0000000..a655e17
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ImageTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_IMAGETEST_HPP__
+#define __FWDATA_UT_IMAGETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ImageTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageTest );
+    CPPUNIT_TEST( testGetterSetter );
+    CPPUNIT_TEST( testAllocation );
+    CPPUNIT_TEST( testReallocation );
+    CPPUNIT_TEST( testPixelType );
+    CPPUNIT_TEST( testSetGetPixel );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testGetterSetter();
+    void testAllocation();
+    void testReallocation();
+    void testPixelType();
+    void testSetGetPixel();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_IMAGETEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/IntegerTest.hpp b/SrcLib/core/fwData/test/tu/include/IntegerTest.hpp
new file mode 100644
index 0000000..b234847
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/IntegerTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_INTEGERTEST_HPP__
+#define __FWDATA_UT_INTEGERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class IntegerTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( IntegerTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_INTEGERTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/IsTypeOfTest.hpp b/SrcLib/core/fwData/test/tu/include/IsTypeOfTest.hpp
new file mode 100644
index 0000000..152986e
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/IsTypeOfTest.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_ISTYPEOFTEST_HPP__
+#define __FWDATA_UT_ISTYPEOFTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class IsTypeOfTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( IsTypeOfTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_ISTYPEOFTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/MTLockTest.hpp b/SrcLib/core/fwData/test/tu/include/MTLockTest.hpp
new file mode 100644
index 0000000..57b8b56
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/MTLockTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_MTLOCKTEST_HPP__
+#define __FWDATA_UT_MTLOCKTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/String.hpp>
+
+namespace fwData
+{
+namespace ut
+{
+
+class MTLockTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MTLockTest );
+    CPPUNIT_TEST( lockTest );
+    CPPUNIT_TEST( multipleLockTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void lockTest();
+    void multipleLockTest();
+
+private:
+    void runLock();
+    void runMultipleLock1();
+    void runMultipleLock2();
+
+    ::fwData::String::sptr m_string;
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_MTLOCKTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/MacrosTest.hpp b/SrcLib/core/fwData/test/tu/include/MacrosTest.hpp
new file mode 100644
index 0000000..37416f9
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/MacrosTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_MACROSTEST_HPP__
+#define __FWDATA_UT_MACROSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class MacrosTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MacrosTest );
+    CPPUNIT_TEST( getterSetterTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void getterSetterTest();
+};
+} //namespace ut
+} //namespace fwData
+
+#endif //__FWDATA_UT_MACROSTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/MaterialTest.hpp b/SrcLib/core/fwData/test/tu/include/MaterialTest.hpp
new file mode 100644
index 0000000..1e079b3
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/MaterialTest.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_MATERIALTEST_HPP__
+#define __FWDATA_UT_MATERIALTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class MaterialTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MaterialTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_MATERIALTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/MeshTest.hpp b/SrcLib/core/fwData/test/tu/include/MeshTest.hpp
new file mode 100644
index 0000000..6c41096
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/MeshTest.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_MESHTEST_HPP__
+#define __FWDATA_UT_MESHTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class MeshTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MeshTest );
+    CPPUNIT_TEST( allocation );
+    CPPUNIT_TEST( insertion );
+    CPPUNIT_TEST( colorsNormals );
+    CPPUNIT_TEST( addingArray );
+    CPPUNIT_TEST( copy );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void allocation();
+    void insertion();
+    void colorsNormals();
+    void addingArray();
+    void copy();
+};
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_MESHTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ModelTest.hpp b/SrcLib/core/fwData/test/tu/include/ModelTest.hpp
new file mode 100644
index 0000000..e7a462c
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ModelTest.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_MODELTEST_HPP__
+#define __FWDATA_UT_MODELTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ModelTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ModelTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_MODELTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ObjectTest.hpp b/SrcLib/core/fwData/test/tu/include/ObjectTest.hpp
new file mode 100644
index 0000000..75366bf
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ObjectTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_OBJECTTEST_HPP__
+#define __FWDATA_UT_OBJECTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ObjectTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ObjectTest );
+    CPPUNIT_TEST( fieldTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void fieldTest();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_OBJECTTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ProcessObjectTest.hpp b/SrcLib/core/fwData/test/tu/include/ProcessObjectTest.hpp
new file mode 100644
index 0000000..a782b9d
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ProcessObjectTest.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_PROCESSOBJECTTEST_HPP__
+#define __FWDATA_UT_PROCESSOBJECTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ProcessObjectTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ProcessObjectTest );
+    CPPUNIT_TEST( constructeur );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp(){};
+    void tearDown(){};
+
+    void constructeur();
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_PROCESSOBJECTTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ROITraitsTest.hpp b/SrcLib/core/fwData/test/tu/include/ROITraitsTest.hpp
new file mode 100644
index 0000000..5e7fb4f
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ROITraitsTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_ROITRAITSTEST_HPP__
+#define __FWDATA_UT_ROITRAITSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ROITraitsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ROITraitsTest );
+    CPPUNIT_TEST( creation );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void creation();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_ROITRAITSTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ReconstructionTest.hpp b/SrcLib/core/fwData/test/tu/include/ReconstructionTest.hpp
new file mode 100644
index 0000000..34f09a5
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ReconstructionTest.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_RECONSTRUCTIONTEST_HPP__
+#define __FWDATA_UT_RECONSTRUCTIONTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ReconstructionTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ReconstructionTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST( methode2 );
+    CPPUNIT_TEST( image );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+    void methode2();
+    void image();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_RECONSTRUCTIONTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/ReconstructionTraitsTest.hpp b/SrcLib/core/fwData/test/tu/include/ReconstructionTraitsTest.hpp
new file mode 100644
index 0000000..6e6477b
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/ReconstructionTraitsTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_RECONSTRUCTIONTRAITSTEST_HPP__
+#define __FWDATA_UT_RECONSTRUCTIONTRAITSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class ReconstructionTraitsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ReconstructionTraitsTest );
+    CPPUNIT_TEST( creation );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void creation();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_RECONSTRUCTIONTRAITSTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/StringTest.hpp b/SrcLib/core/fwData/test/tu/include/StringTest.hpp
new file mode 100644
index 0000000..d7a6c38
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/StringTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_STRINGTEST_HPP__
+#define __FWDATA_UT_STRINGTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class StringTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StringTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_STRINGTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/StructureTraitsDictionaryTest.hpp b/SrcLib/core/fwData/test/tu/include/StructureTraitsDictionaryTest.hpp
new file mode 100644
index 0000000..1d05605
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/StructureTraitsDictionaryTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_STRUCTURETRAITSDICTIONARYTEST_HPP__
+#define __FWDATA_UT_STRUCTURETRAITSDICTIONARYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class StructureTraitsDictionaryTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StructureTraitsDictionaryTest );
+    CPPUNIT_TEST( testAddingStructure );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testAddingStructure();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif // __FWDATA_UT_STRUCTURETRAITSDICTIONARYTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/TransferFunctionTest.hpp b/SrcLib/core/fwData/test/tu/include/TransferFunctionTest.hpp
new file mode 100644
index 0000000..583e9fc
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/TransferFunctionTest.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_TRANSFERFUNCTIONTEST_HPP__
+#define __FWDATA_UT_TRANSFERFUNCTIONTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/TransferFunction.hpp>
+
+namespace fwData
+{
+namespace ut
+{
+
+class TransferFunctionTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TransferFunctionTest );
+    CPPUNIT_TEST( constructorTest );
+    CPPUNIT_TEST( defaultTfTest );
+    CPPUNIT_TEST( classicGetSetTest );
+    CPPUNIT_TEST( usingTfTest );
+    CPPUNIT_TEST( setTFDataTest );
+    CPPUNIT_TEST( shallowAndDeepCopyTest );
+    CPPUNIT_TEST( linearColorTest );
+    CPPUNIT_TEST( nearestColorTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+    void constructorTest();
+    void defaultTfTest();
+    void classicGetSetTest();
+    void usingTfTest();
+    void setTFDataTest();
+    void shallowAndDeepCopyTest();
+    void linearColorTest();
+    void nearestColorTest();
+
+    ::fwData::TransferFunction::sptr createTFColor();
+    void checkTFColor( ::fwData::TransferFunction::sptr tf );
+};
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_TRANSFERFUNCTIONTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/TransformationMatrix3DTest.hpp b/SrcLib/core/fwData/test/tu/include/TransformationMatrix3DTest.hpp
new file mode 100644
index 0000000..82c1213
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/TransformationMatrix3DTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_TRANSFORMATION3DMATRIXTEST_HPP__
+#define __FWDATA_UT_TRANSFORMATION3DMATRIXTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class TransformationMatrix3DTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TransformationMatrix3DTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST( methode2 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+    void methode2();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_TRANSFORMATION3DMATRIXTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/include/VideoTest.hpp b/SrcLib/core/fwData/test/tu/include/VideoTest.hpp
new file mode 100644
index 0000000..886cc73
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/include/VideoTest.hpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_UT_VIDEOTEST_HPP__
+#define __FWDATA_UT_VIDEOTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwData
+{
+namespace ut
+{
+
+class VideoTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( VideoTest );
+    CPPUNIT_TEST( methode1 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void methode1();
+};
+
+} //namespace ut
+} //namespace fwData
+#endif //__FWDATA_UT_VIDEOTEST_HPP__
diff --git a/SrcLib/core/fwData/test/tu/src/ArrayTest.cpp b/SrcLib/core/fwData/test/tu/src/ArrayTest.cpp
new file mode 100644
index 0000000..d65804b
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ArrayTest.cpp
@@ -0,0 +1,376 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/Array.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "ArrayTest.hpp"
+
+
+using namespace boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ArrayTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::allocation()
+{
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    CPPUNIT_ASSERT(array->empty());
+    CPPUNIT_ASSERT(arrayHelper.getBuffer() == NULL);
+    CPPUNIT_ASSERT(array->getSize().empty());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), array->getSizeInBytes());
+
+    const size_t NB_COMPONENT = 2;
+    ::fwData::Array::SizeType size;
+    size += 10,100;
+
+    array->resize("uint32", size, NB_COMPONENT, true);
+    CPPUNIT_ASSERT(arrayHelper.getBuffer() != NULL);
+    CPPUNIT_ASSERT(!array->empty());
+
+    CPPUNIT_ASSERT_EQUAL(size.size(), array->getNumberOfDimensions());
+    CPPUNIT_ASSERT_EQUAL(size[0], array->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(size[1], array->getSize()[1]);
+    CPPUNIT_ASSERT_EQUAL(NB_COMPONENT, array->getNumberOfComponents());
+    CPPUNIT_ASSERT_EQUAL(true, array->getIsBufferOwner());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(8)(80));
+    CPPUNIT_ASSERT(array->getType().string() == "uint32");
+    CPPUNIT_ASSERT(array->getType().sizeOf() == 4);
+
+    array->clear();
+    CPPUNIT_ASSERT_EQUAL(  (size_t)0, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)0, array->getNumberOfComponents());
+    CPPUNIT_ASSERT(  array->empty() );
+    CPPUNIT_ASSERT(  arrayHelper.getBuffer() == NULL );
+
+    char *buffer = new char[1000];
+
+    for (int i=0 ; i<1000; i++)
+    {
+        buffer[i] = i;
+    }
+
+    // array->resize(::fwTools::Type::create("uint8"), size, 1);
+    // array->setBuffer(buffer);
+
+    arrayHelper.setBuffer(buffer, false, ::fwTools::Type::create("uint8"), size, 1);
+
+    CPPUNIT_ASSERT_EQUAL(  (size_t)1, array->getBufferOffset(list_of(1)(0), 0, 4));
+    CPPUNIT_ASSERT_EQUAL(  (size_t)1, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)1*10*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(1)(10));
+    CPPUNIT_ASSERT_EQUAL(  buffer[0], *(arrayHelper.getItem< char >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  buffer[10], *(arrayHelper.getItem< char >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  buffer[999], *(arrayHelper.getItem< char >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  buffer[326], *(arrayHelper.getItem< char >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  buffer[947], *(arrayHelper.getItem< char >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  buffer[238], *(arrayHelper.getItem< char >(list_of(8)(23))));
+    CPPUNIT_ASSERT_EQUAL(false, array->getIsBufferOwner());
+
+    array->clear();
+
+    delete[] buffer;
+}
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::resize()
+{
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    const size_t NB_COMPONENT = 1;
+    ::fwData::Array::SizeType size;
+    size += 10,100;
+
+    array->resize("uint32", size, NB_COMPONENT, true);
+
+    // CPPUNIT_ASSERT(array->getBuffer() != NULL);
+    // CPPUNIT_ASSERT(array->begin<unsigned int>() != NULL);
+
+    unsigned int count = 0;
+    unsigned int *iter = arrayHelper.begin<unsigned int>();
+
+    // CPPUNIT_ASSERT(iter != NULL);
+    for (; iter != arrayHelper.end<unsigned int>() ; ++iter)
+    {
+        *iter = count++;
+    }
+
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getBufferOffset(list_of(1)(0), 0, 4));
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*10*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(4)(40));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(8)(23))));
+
+    ::fwData::Array::SizeType newSize;
+    newSize += 100,10;
+
+    array->resize(newSize);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getBufferOffset(list_of(1)(0), 0, 4));
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(4)(400));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(10)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(99)(9))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(26)(3))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(47)(9))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(38)(2))));
+
+    newSize.clear();
+    newSize += 25,40;
+
+    array->resize(newSize);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(4)(100));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(10)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(24)(39))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(1)(13))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(22)(37))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(13)(9))));
+
+    newSize.clear();
+    newSize += 100;
+
+    const size_t nbComponant = 10;
+    array->resize(newSize, nbComponant, false);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)40, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(40));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0), 0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0), 10)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(99), 9)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(32), 6)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(94), 7)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(23), 8)));
+
+    newSize.clear();
+    newSize += 10, 100;
+
+    array->resize("uint16", newSize, 2, false);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)2*100*10*2, array->getSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == list_of(4)(40) );
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(8)(23))));
+}
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::reallocate()
+{
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    const size_t NB_COMPONENT = 1;
+    ::fwData::Array::SizeType size;
+    size += 10,100;
+
+    array->resize("uint32", size, NB_COMPONENT, true);
+    // CPPUNIT_ASSERT(array->getBuffer() != NULL);
+    // CPPUNIT_ASSERT(array->begin<unsigned int>() != NULL);
+
+    unsigned int count = 0;
+    unsigned int *iter = arrayHelper.begin<unsigned int>();
+    for (; iter != arrayHelper.end<unsigned int>() ; ++iter)
+    {
+        *iter = count++;
+    }
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*10*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(8)(23))));
+
+    ::fwData::Array::SizeType newSize;
+    newSize += 100,100;
+
+    array->resize(newSize, NB_COMPONENT, true);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*100*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(10)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(99)(9))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(26)(3))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(47)(9))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(38)(2))));
+
+    unsigned int value = 1859;
+    arrayHelper.setItem(list_of(50)(90), &value);
+    CPPUNIT_ASSERT_EQUAL(  value, *(arrayHelper.getItem< unsigned int >(list_of(50)(90))));
+
+    unsigned int value2 = 25464;
+    arrayHelper.setItem(list_of(99)(99), &value2);
+    CPPUNIT_ASSERT_EQUAL(  value2, *(arrayHelper.getItem< unsigned int >(list_of(99)(99))));
+
+    array->resize("uint32", newSize, 2, true);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*100*100*2, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0), 0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(5)(0), 0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(99)(4), 1)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(63)(1), 0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(73)(4), 1)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(19)(1), 0)));
+
+    CPPUNIT_ASSERT_EQUAL(  value, *(arrayHelper.getItem< unsigned int >(list_of(25)(45), 0)));
+
+    CPPUNIT_ASSERT_EQUAL(  value2, *(arrayHelper.getItem< unsigned int >(list_of(99)(49), 1)));
+
+    unsigned int value3 = 45643;
+    arrayHelper.setItem(list_of(35)(48), 0, &value3);
+    CPPUNIT_ASSERT_EQUAL(  value3, *(arrayHelper.getItem< unsigned int >(list_of(35)(48), 0)));
+
+    unsigned int value4 = 16165;
+    arrayHelper.setItem(list_of(99)(99), 1, &value4);
+    CPPUNIT_ASSERT_EQUAL(  value4, *(arrayHelper.getItem< unsigned int >(list_of(99)(99), 1)));
+
+
+    newSize.clear();
+    newSize += 10, 100;
+
+    array->resize(newSize, NB_COMPONENT, true);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*10*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(8)(23))));
+
+    array->setNumberOfComponents(2);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)8, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)4*10*100*2, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(5)(0),0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)999, *(arrayHelper.getItem< unsigned int >(list_of(9)(49), 1)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(3)(16), 0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)947, *(arrayHelper.getItem< unsigned int >(list_of(3)(47), 1)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(9)(11), 0)));
+
+    array->setType(::fwTools::Type::create("uint16"));
+    CPPUNIT_ASSERT_EQUAL(  (size_t)2*2, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)2*10*100*2, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)0, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)10, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)999, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)326, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)947, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)238, *(arrayHelper.getItem< ::boost::uint16_t >(list_of(8)(23))));
+
+    array->setNumberOfComponents(1);
+    CPPUNIT_ASSERT(newSize == array->getSize());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)2, array->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (size_t)2*10*100, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)0, *(arrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)10, *(arrayHelper.getItem< unsigned int >(list_of(0)(2),0)));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)326, *(arrayHelper.getItem< unsigned int >(list_of(2)(65))));
+    CPPUNIT_ASSERT_EQUAL(  (unsigned int)238, *(arrayHelper.getItem< unsigned int >(list_of(6)(47), 0)));
+
+    ::boost::uint16_t val;
+    arrayHelper.getItem(list_of(2)(65), &val);
+    CPPUNIT_ASSERT_EQUAL(  (::boost::uint16_t)326, val);
+
+    char * charValue = arrayHelper.getBufferPtr(list_of(6)(47), 0, array->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL( (unsigned int)238, *(reinterpret_cast<unsigned int*>(charValue)));
+
+    array->clear();
+    CPPUNIT_ASSERT_EQUAL(  (size_t)0, array->getSizeInBytes());
+}
+
+//-----------------------------------------------------------------------------
+
+void ArrayTest::copy()
+{
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    const size_t NB_COMPONENT = 1;
+    ::fwData::Array::SizeType size;
+    size += 10,100;
+
+    array->resize("uint32", size, NB_COMPONENT, true);
+    CPPUNIT_ASSERT(arrayHelper.getBuffer() != NULL);
+    CPPUNIT_ASSERT(arrayHelper.begin<unsigned int>() != NULL);
+
+    unsigned int count = 0;
+    unsigned int *iter = arrayHelper.begin<unsigned int>();
+    for (; iter != arrayHelper.end<unsigned int>() ; ++iter)
+    {
+        *iter = count++;
+    }
+
+
+    ::fwData::Array::sptr deepCopyArray;
+    deepCopyArray = ::fwData::Object::copy(array);
+
+    ::fwComEd::helper::Array deepCopyArrayHelper(deepCopyArray);
+
+    // check deepCopy
+    CPPUNIT_ASSERT_EQUAL(  array->getBufferOffset(list_of(1)(0), 0, 4), deepCopyArray->getBufferOffset(list_of(1)(0), 0, 4));
+    CPPUNIT_ASSERT_EQUAL(  array->getElementSizeInBytes(), deepCopyArray->getElementSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(  array->getSizeInBytes(), deepCopyArray->getSizeInBytes());
+    CPPUNIT_ASSERT(array->getStrides() == deepCopyArray->getStrides());
+    CPPUNIT_ASSERT(array->getSize() == deepCopyArray->getSize());
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(0)(0))) , *(deepCopyArrayHelper.getItem< unsigned int >(list_of(0)(0))));
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(0)(1))) , *(deepCopyArrayHelper.getItem< unsigned int >(list_of(0)(1))));
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(9)(99))), *(deepCopyArrayHelper.getItem< unsigned int >(list_of(9)(99))));
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(6)(32))), *(deepCopyArrayHelper.getItem< unsigned int >(list_of(6)(32))));
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(7)(94))), *(deepCopyArrayHelper.getItem< unsigned int >(list_of(7)(94))));
+    CPPUNIT_ASSERT_EQUAL( *(arrayHelper.getItem< unsigned int >(list_of(8)(23))), *(deepCopyArrayHelper.getItem< unsigned int >(list_of(8)(23))));
+    CPPUNIT_ASSERT_EQUAL( true , deepCopyArray->getIsBufferOwner());
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/BooleanTest.cpp b/SrcLib/core/fwData/test/tu/src/BooleanTest.cpp
new file mode 100644
index 0000000..22ffb74
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/BooleanTest.cpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Boolean.hpp>
+
+#include "BooleanTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::BooleanTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void BooleanTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void BooleanTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void BooleanTest::methode1()
+{
+    const bool TRUE_VALUE  = true ;
+    const bool FALSE_VALUE = ! TRUE_VALUE ;
+
+    ::fwData::Boolean::sptr p1 = ::fwData::Boolean::New( TRUE_VALUE );
+    ::fwData::Boolean::sptr p2 = ::fwData::Boolean::New( FALSE_VALUE );
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(TRUE_VALUE , ::fwData::Boolean::New( TRUE_VALUE )->value());
+    CPPUNIT_ASSERT_EQUAL(FALSE_VALUE, ::fwData::Boolean::New( FALSE_VALUE )->value());
+
+    CPPUNIT_ASSERT_EQUAL(TRUE_VALUE , p1->value());
+    CPPUNIT_ASSERT_EQUAL(FALSE_VALUE, p2->value());
+
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/CameraTest.cpp b/SrcLib/core/fwData/test/tu/src/CameraTest.cpp
new file mode 100644
index 0000000..b9324a8
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/CameraTest.cpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Camera.hpp>
+#include "CameraTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::CameraTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void CameraTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void CameraTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void CameraTest::methode1() //test des attributs
+{
+    //-----------test values
+    const double CX = 3.0;
+    const double CY = 2.0;
+    const double FX = 0.5;
+    const double FY = 1.3;
+
+    ::fwData::Camera::sptr camera = ::fwData::Camera::New();
+
+    camera->setCx(CX);
+    camera->setCy(CY);
+    camera->setFx(FX);
+    camera->setFy(FY);
+
+    CPPUNIT_ASSERT_EQUAL(camera->getCx(),  CX ) ;
+    CPPUNIT_ASSERT_EQUAL(camera->getCy(),  CY ) ;
+    CPPUNIT_ASSERT_EQUAL(camera->getFx(),  FX ) ;
+    CPPUNIT_ASSERT_EQUAL(camera->getFy(),  FY ) ;
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/ColorTest.cpp b/SrcLib/core/fwData/test/tu/src/ColorTest.cpp
new file mode 100644
index 0000000..18100dd
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ColorTest.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Color.hpp>
+#include "ColorTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ColorTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ColorTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void ColorTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ColorTest::methode1()
+{
+    //-----------test values
+    const float R = 0.2f;
+    const float G = 0.8f;
+    const float B = 0.5f;
+    const float A = 0.6f;
+
+    ::fwData::Color::sptr color = ::fwData::Color::New(R, G, B, A);
+
+    CPPUNIT_ASSERT_EQUAL(color->red(), R);
+    CPPUNIT_ASSERT_EQUAL(color->green(), G);
+    CPPUNIT_ASSERT_EQUAL(color->blue(), B);
+    CPPUNIT_ASSERT_EQUAL(color->alpha(), A);
+}
+
+void ColorTest::methode2()
+{
+    //-----------test values
+    const float R = 0.2f;
+    const float G = 0.8f;
+    const float B = 0.5f;
+    const float A = 0.6f;
+
+    ::fwData::Color::sptr color = ::fwData::Color::New();
+
+    ::fwData::Color::ColorArray array;
+    array[0] = R;
+    array[1] = G;
+    array[2] = B;
+    array[3] = A;
+
+    color->setCRefRGBA(array);
+
+    CPPUNIT_ASSERT_EQUAL(color->getRGBA()[0], R);
+    CPPUNIT_ASSERT_EQUAL(color->getRGBA()[1], G);
+    CPPUNIT_ASSERT_EQUAL(color->getRGBA()[2], B);
+    CPPUNIT_ASSERT_EQUAL(color->getRGBA()[3], A);
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/CompositeTest.cpp b/SrcLib/core/fwData/test/tu/src/CompositeTest.cpp
new file mode 100644
index 0000000..465a79a
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/CompositeTest.cpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+#include <boost/foreach.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+
+#include "CompositeTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::CompositeTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void CompositeTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void CompositeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void CompositeTest::methode1()
+{
+    typedef ::fwData::Composite::value_type pair_type;
+    const pair_type PAIRS[] = {
+        std::make_pair( "Composite"    , ::fwData::Composite::New()    ),
+        std::make_pair( "boolean true" , ::fwData::Boolean::New(true)  ),
+        std::make_pair( "boolean false", ::fwData::Boolean::New(false) ),
+        std::make_pair( "float"        , ::fwData::Float::New(3.14f)   ),
+        std::make_pair( "integer"      , ::fwData::Integer::New(404)   )
+    };
+
+    ::fwData::Composite::ContainerType stdmap;
+
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+
+    CPPUNIT_ASSERT( composite->size() == 0 );
+
+    BOOST_FOREACH( pair_type p, PAIRS)
+    {
+        composite->getContainer()[p.first] = p.second;
+    }
+
+    stdmap.insert(composite->begin(), composite->end());
+
+    CPPUNIT_ASSERT( composite->size() == stdmap.size() );
+
+    BOOST_FOREACH( pair_type p, *composite)
+    {
+        CPPUNIT_ASSERT( composite->getContainer()[p.first] == (*composite)[p.first] );
+        CPPUNIT_ASSERT(                 stdmap[p.first] == (*composite)[p.first] );
+    }
+
+
+    CPPUNIT_ASSERT_EQUAL( true ,  ::fwData::Boolean::dynamicCast((*composite)[ "boolean true" ])->value()  ) ;
+    CPPUNIT_ASSERT_EQUAL( false,  ::fwData::Boolean::dynamicCast((*composite)[ "boolean false" ])->value() ) ;
+    CPPUNIT_ASSERT_EQUAL( 3.14f ,   ::fwData::Float::dynamicCast((*composite)[ "float" ])->value()         ) ;
+    CPPUNIT_ASSERT_EQUAL( 404  ,  ::fwData::Integer::dynamicCast((*composite)[ "integer" ])->value()       ) ;
+
+    //-----------test values
+    const std::string STR = "toto";
+    ::fwData::Object::sptr obj = ::fwData::Float::New();
+
+    composite->getContainer()[STR] = obj;
+
+    CPPUNIT_ASSERT( composite->begin() != composite->end() );
+
+    CPPUNIT_ASSERT(composite->find(STR) != composite->end());
+    CPPUNIT_ASSERT_EQUAL(composite->getContainer()[STR], obj);
+}
+
+void CompositeTest::setGetContainerTest()
+{
+    std::map< std::string, ::fwData::String::sptr > myStdMap;
+    std::string key1 = "toto";
+    std::string key2 = "tutu";
+    myStdMap[ key1 ] = ::fwData::String::New("lolo");
+    myStdMap[ key2 ] = ::fwData::String::New("lulu");
+
+    ::fwData::Composite::sptr myDataMap = ::fwData::Composite::New();
+    myDataMap->setDataContainer( myStdMap );
+    CPPUNIT_ASSERT_EQUAL( static_cast< size_t >(2), myDataMap->size() );
+
+    std::map< std::string, ::fwData::String::sptr > myStdMap2;
+    myStdMap2 = myDataMap->getDataContainer< ::fwData::String >();
+    CPPUNIT_ASSERT( myStdMap2[key1] ==  myStdMap[key1] );
+    CPPUNIT_ASSERT( myStdMap2[key2] ==  myStdMap[key2] );
+}
+
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/CopyTest.cpp b/SrcLib/core/fwData/test/tu/src/CopyTest.cpp
new file mode 100644
index 0000000..ef98858
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/CopyTest.cpp
@@ -0,0 +1,377 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Camera.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Edge.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Graph.hpp>
+#include <fwData/Histogram.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Line.hpp>
+#include <fwData/List.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Model.hpp>
+#include <fwData/Node.hpp>
+#include <fwData/Object.hpp>
+#include <fwData/Plane.hpp>
+#include <fwData/PlaneList.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Port.hpp>
+#include <fwData/ProcessObject.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/ReconstructionTraits.hpp>
+#include <fwData/Resection.hpp>
+#include <fwData/ResectionDB.hpp>
+#include <fwData/ROITraits.hpp>
+#include <fwData/Spline.hpp>
+#include <fwData/String.hpp>
+#include <fwData/StructureTraits.hpp>
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/Tag.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/Video.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "CopyTest.hpp"
+
+
+using namespace boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::CopyTest);
+
+namespace fwData
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void CopyTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+
+//-----------------------------------------------------------------------------
+
+void CopyTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void CopyTest::fieldCopyTest()
+{
+    __FWDATA_UT_FIELD_DEEP_COPY_MACRO(::fwData::Array);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Boolean);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Color);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Composite);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Float);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Graph);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Histogram);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Image);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Integer);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Line);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::List);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::location::Folder);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::location::SingleFile);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Material);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Mesh);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Plane);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::PlaneList);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Point);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::PointList);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Reconstruction);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Resection);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::ResectionDB);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::String);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::TransferFunction);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::TransformationMatrix3D);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::TriangularMesh);
+    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Vector);
+
+//Not implemented !?
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Camera);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Edge);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Model);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Node);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Object);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Port);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::ProcessObject);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::ReconstructionTraits);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::ROITraits);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Spline);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::StructureTraits);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::StructureTraitsDictionary);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Tag);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::Video);
+//    __FWDATA_UT_FIELD_COPY_MACRO(::fwData::location::MultiFiles);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void CopyTest::severalReferencesCopyTest()
+{
+    ::fwData::Integer::sptr integer = ::fwData::Integer::New(42);
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+
+    (*composite)["A"] = integer;
+    (*composite)["B"] = integer;
+    composite->setField("F1", integer);
+    composite->setField("F2", integer);
+
+    ::fwData::Composite::sptr compositeCopy = ::fwData::Object::copy(composite);
+
+    CPPUNIT_ASSERT( integer != ::fwData::Integer::dynamicCast((*compositeCopy)["A"]) );
+    CPPUNIT_ASSERT_EQUAL(42, ::fwData::Integer::dynamicCast((*compositeCopy)["A"])->getValue());
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], compositeCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], compositeCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], (*compositeCopy)["B"]);
+
+
+    ::fwData::Vector::sptr vector = ::fwData::Vector::New();
+
+    vector->getContainer().push_back(composite);
+    vector->getContainer().push_back(composite);
+    vector->setField("F1", composite);
+    vector->setField("F2", composite);
+
+    ::fwData::Vector::sptr vectorCopy = ::fwData::Object::copy(vector);
+    CPPUNIT_ASSERT( composite != (*vectorCopy)[0] );
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], vectorCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], vectorCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], (*vectorCopy)[1]);
+
+
+
+    ::fwData::List::sptr list = ::fwData::List::New();
+
+    list->getContainer().push_back(vector);
+    list->getContainer().push_back(vector);
+    list->setField("F1", vector);
+    list->setField("F2", vector);
+
+    ::fwData::List::sptr listCopy = ::fwData::Object::copy(list);
+    CPPUNIT_ASSERT( vector != (*listCopy).front() );
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), listCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), listCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), (*listCopy).back());
+
+}
+
+//-----------------------------------------------------------------------------
+
+void CopyTest::recursiveCopyTest()
+{
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    ::fwData::Vector::sptr vector = ::fwData::Vector::New();
+    ::fwData::List::sptr list = ::fwData::List::New();
+
+    ::fwData::Composite::sptr compositeCopy;
+    ::fwData::Vector::sptr vectorCopy;
+    ::fwData::List::sptr listCopy;
+
+
+    (*composite)["A"] = composite;
+    (*composite)["B"] = composite;
+
+    composite->setField("F1", composite);
+    composite->setField("F2", composite);
+
+    compositeCopy = ::fwData::Object::copy(composite);
+
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], compositeCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], compositeCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], (*compositeCopy)["B"]);
+
+
+
+    vector->getContainer().push_back(vector);
+    vector->getContainer().push_back(vector);
+    vector->setField("F1", vector);
+    vector->setField("F2", vector);
+
+    vectorCopy = ::fwData::Object::copy(vector);
+    CPPUNIT_ASSERT( vector != (*vectorCopy)[0] );
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], vectorCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], vectorCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], (*vectorCopy)[1]);
+
+
+
+
+    list->getContainer().push_back(list);
+    list->getContainer().push_back(list);
+    list->setField("F1", list);
+    list->setField("F2", list);
+
+    listCopy = ::fwData::Object::copy(list);
+    CPPUNIT_ASSERT( list != (*listCopy).front() );
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), listCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), listCopy->getField("F2"));
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), (*listCopy).back());
+
+
+    ::fwData::Object::FieldMapType zeroFields;
+    composite->getContainer().clear();
+    vector->getContainer().clear();
+    list->getContainer().clear();
+    composite->setFields(zeroFields);
+    vector->setFields(zeroFields);
+    list->setFields(zeroFields);
+
+    (*composite)["A"] = list;
+    composite->setField("F1", list);
+
+    vector->getContainer().push_back(composite);
+    vector->setField("F1", composite);
+
+    list->getContainer().push_back(vector);
+    list->setField("F1", vector);
+
+
+    compositeCopy = ::fwData::Object::copy(composite);
+    vectorCopy = ::fwData::Object::copy(vector);
+    listCopy = ::fwData::Object::copy(list);
+
+
+
+    CPPUNIT_ASSERT( list != compositeCopy->getField("F1") );
+    CPPUNIT_ASSERT( list != (*compositeCopy)["A"] );
+    CPPUNIT_ASSERT( vector != listCopy->getField("F1") );
+    CPPUNIT_ASSERT( vector != (*listCopy).front() );
+    CPPUNIT_ASSERT( composite != vectorCopy->getField("F1") );
+    CPPUNIT_ASSERT( composite != (*vectorCopy)[0] );
+
+    CPPUNIT_ASSERT_EQUAL((*listCopy).front(), listCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*vectorCopy)[0], vectorCopy->getField("F1"));
+    CPPUNIT_ASSERT_EQUAL((*compositeCopy)["A"], compositeCopy->getField("F1"));
+
+
+    //ensures copy cache is not persistant
+    CPPUNIT_ASSERT( listCopy != compositeCopy->getField("F1") );
+    CPPUNIT_ASSERT( listCopy != (*composite)["A"] );
+    CPPUNIT_ASSERT( vectorCopy != listCopy->getField("F1") );
+    CPPUNIT_ASSERT( vectorCopy != (*listCopy).front() );
+    CPPUNIT_ASSERT( compositeCopy != vectorCopy->getField("F1") );
+    CPPUNIT_ASSERT( compositeCopy != (*vectorCopy)[0] );
+
+    #define C(obj) ::fwData::Composite::dynamicCast(obj)
+    #define L(obj) ::fwData::List::dynamicCast(obj)
+    #define V(obj) ::fwData::Vector::dynamicCast(obj)
+
+    //composite->list->vector->composite
+    {
+        ::fwData::List::sptr insideList = L((*compositeCopy)["A"]);
+        ::fwData::Vector::sptr insideVector = V(insideList->front());
+        ::fwData::Composite::sptr insideComposite = C(insideVector->front());
+
+        CPPUNIT_ASSERT_EQUAL(compositeCopy, insideComposite );
+        CPPUNIT_ASSERT_EQUAL(insideList, L((*insideComposite)["A"]) );
+        CPPUNIT_ASSERT_EQUAL(compositeCopy, C(compositeCopy->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideList, L(insideList->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideVector, V(insideVector->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideComposite, C(insideComposite->getField("F1")->getField("F1")->getField("F1")));
+    }
+
+
+    //list->vector->composite->list
+    {
+        ::fwData::Vector::sptr insideVector = V(listCopy->front());
+        ::fwData::Composite::sptr insideComposite = C(insideVector->front());
+        ::fwData::List::sptr insideList = L((*insideComposite)["A"]);
+
+        CPPUNIT_ASSERT_EQUAL(listCopy, insideList );
+        CPPUNIT_ASSERT_EQUAL(insideVector, V(insideList->front()) );
+        CPPUNIT_ASSERT_EQUAL(listCopy, L(listCopy->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideList, L(insideList->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideVector, V(insideVector->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideComposite, C(insideComposite->getField("F1")->getField("F1")->getField("F1")));
+    }
+
+    //vector->composite->list->vector
+    {
+        ::fwData::Composite::sptr insideComposite = C(vectorCopy->front());
+        ::fwData::List::sptr insideList = L((*insideComposite)["A"]);
+        ::fwData::Vector::sptr insideVector = V(insideList->front());
+
+        CPPUNIT_ASSERT_EQUAL(vectorCopy, insideVector );
+        CPPUNIT_ASSERT_EQUAL(insideComposite, C(insideVector->front()) );
+        CPPUNIT_ASSERT_EQUAL(vectorCopy, V(vectorCopy->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideList, L(insideList->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideVector, V(insideVector->getField("F1")->getField("F1")->getField("F1")));
+        CPPUNIT_ASSERT_EQUAL(insideComposite, C(insideComposite->getField("F1")->getField("F1")->getField("F1")));
+    }
+
+
+
+
+    composite->getContainer().clear();
+    vector->getContainer().clear();
+    list->getContainer().clear();
+    composite->setFields(zeroFields);
+    vector->setFields(zeroFields);
+    list->setFields(zeroFields);
+
+    (*composite)["A"] = list;
+    composite->setField("F1", vector);
+
+    vector->getContainer().push_back(composite);
+    vector->setField("F1", list);
+
+    list->getContainer().push_back(vector);
+    list->setField("F1", composite);
+
+
+    compositeCopy = ::fwData::Object::copy(composite);
+
+    {
+        ::fwData::List::sptr   insideList  = L((*compositeCopy)["A"]);
+        ::fwData::Vector::sptr fieldVector = V(compositeCopy->getField("F1"));
+
+        ::fwData::Composite::sptr insideComposite = C(fieldVector->front());
+        ::fwData::List::sptr fieldList = L(fieldVector->getField("F1"));
+
+        ::fwData::Vector::sptr insideVector = V(fieldList->front());
+        ::fwData::Composite::sptr fieldComposite = C(fieldList->getField("F1"));
+
+
+        CPPUNIT_ASSERT_EQUAL(compositeCopy, insideComposite );
+        CPPUNIT_ASSERT_EQUAL(insideComposite, fieldComposite );
+        CPPUNIT_ASSERT_EQUAL(fieldVector, insideVector );
+        CPPUNIT_ASSERT_EQUAL(fieldList, insideList );
+    }
+
+    //get rid of circular references
+    composite->getContainer().clear();
+    vector->getContainer().clear();
+    list->getContainer().clear();
+    composite->setFields(zeroFields);
+    vector->setFields(zeroFields);
+    list->setFields(zeroFields);
+
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/EdgeTest.cpp b/SrcLib/core/fwData/test/tu/src/EdgeTest.cpp
new file mode 100644
index 0000000..0c5d4e0
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/EdgeTest.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Edge.hpp>
+#include "EdgeTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::EdgeTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void EdgeTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void EdgeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void EdgeTest::methode1()
+{
+    //-----------test values
+    const std::string STR1 = "toto";
+    const std::string STR2 = "titi";
+    const std::string STR3 = ::fwData::Edge::NATURE_FLOW;
+    ::fwData::Edge::sptr edge = ::fwData::Edge::New();
+
+    edge->setIdentifiers(STR1, STR2);
+    edge->setNature(STR3);
+
+    CPPUNIT_ASSERT_EQUAL(edge->getFromPortID(), STR1);
+    CPPUNIT_ASSERT_EQUAL(edge->getToPortID(), STR2);
+    CPPUNIT_ASSERT_EQUAL(edge->getNature(), STR3);
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/FloatTest.cpp b/SrcLib/core/fwData/test/tu/src/FloatTest.cpp
new file mode 100644
index 0000000..45b021e
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/FloatTest.cpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/foreach.hpp>
+#include <limits>
+
+#include <fwData/Float.hpp>
+
+#include "FloatTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::FloatTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void FloatTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+
+void FloatTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void FloatTest::methode1()
+{
+    const float VALUES[]  = { -3.141592f, 0.f, 2.04f, 10, std::numeric_limits< float >::infinity() };
+    const float NAN_VALUES[]  = {
+        std::numeric_limits< float >::quiet_NaN(),
+        std::numeric_limits< float >::signaling_NaN()
+    } ;
+
+    BOOST_FOREACH ( float VALUE, VALUES )
+    {
+        ::fwData::Float::sptr f0 = ::fwData::Float::New();
+        f0->value() = VALUE;
+        ::fwData::Float::sptr f1 = ::fwData::Float::New( VALUE );
+
+        CPPUNIT_ASSERT_EQUAL( VALUE, f0->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE, f1->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE, ::fwData::Float::New( VALUE )->value() );
+    }
+
+    BOOST_FOREACH ( float VALUE, NAN_VALUES )
+    {
+        ::fwData::Float::sptr f0 = ::fwData::Float::New();
+        f0->value() = VALUE;
+        ::fwData::Float::sptr f1 = ::fwData::Float::New( VALUE );
+
+        CPPUNIT_ASSERT( !( VALUE == f0->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  < f0->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  > f0->value() ) );
+
+        CPPUNIT_ASSERT( !( VALUE == f1->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  < f1->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  > f1->value() ) );
+
+        CPPUNIT_ASSERT( !( VALUE == ::fwData::Float::New( VALUE )->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  < ::fwData::Float::New( VALUE )->value() ) );
+        CPPUNIT_ASSERT( !( VALUE  > ::fwData::Float::New( VALUE )->value() ) );
+    }
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/GraphTest.cpp b/SrcLib/core/fwData/test/tu/src/GraphTest.cpp
new file mode 100755
index 0000000..5f4d3ae
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/GraphTest.cpp
@@ -0,0 +1,255 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+
+#include <fwData/Graph.hpp>
+#include <fwData/Node.hpp>
+#include <fwData/Edge.hpp>
+#include <fwData/Port.hpp>
+#include "GraphTest.hpp"
+
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::GraphTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void GraphTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void GraphTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void GraphTest::normalCase()
+{
+    // G :
+    // n1 --e--> n2
+    ::fwData::Graph::sptr g( ::fwData::Graph::New() );
+
+    ::fwData::Node::sptr n1( ::fwData::Node::New() );
+    ::fwData::Port::sptr p1( ::fwData::Port::New() );
+    p1->setIdentifier("sizex");
+    p1->setType("float");
+    n1->addOutputPort( p1 );
+
+    ::fwData::Node::sptr n2( ::fwData::Node::New() );
+    ::fwData::Port::sptr p2( ::fwData::Port::New() );
+    p2->setIdentifier("threshold");
+    p2->setType("float");
+    n2->addInputPort( p2 );
+
+    ::fwData::Edge::sptr e( ::fwData::Edge::New() );
+    e->setIdentifiers("sizex","threshold");
+
+    g->addNode(n1);
+    g->addNode(n2);
+    g->addEdge(e,n1,n2);
+
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getInputEdges(n1).size() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getOutputEdges(n1).size() );
+    CPPUNIT_ASSERT_EQUAL( e, g->getOutputEdges(n1).at(0) );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getInputEdges(n2).size() );
+    CPPUNIT_ASSERT_EQUAL( e, g->getInputEdges(n2).at(0) );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getOutputEdges(n2).size() );
+
+    CPPUNIT_ASSERT_EQUAL( n1, g->getSourceNode(e) );
+    CPPUNIT_ASSERT_EQUAL( n2, g->getDestinationNode(e) );
+
+    // Remove to obtain empty graph
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+    g->removeEdge(e);
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+    g->removeNode(n1);
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+    g->removeNode(n2);
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+}
+
+//------------------------------------------------------------------------------
+
+void GraphTest::limitCase1()
+{
+    // G :
+    // n1 --e1--> n2
+    ::fwData::Graph::sptr g( ::fwData::Graph::New() );
+
+    ::fwData::Node::sptr n1( ::fwData::Node::New() );
+    ::fwData::Port::sptr p1( ::fwData::Port::New() );
+    p1->setIdentifier("sizex");
+    p1->setType("float");
+    n1->addOutputPort( p1 );
+
+    ::fwData::Node::sptr n2( ::fwData::Node::New() );
+    ::fwData::Port::sptr p2( ::fwData::Port::New() );
+    p2->setIdentifier("threshold");
+    p2->setType("float");
+    n2->addInputPort( p2 );
+
+    ::fwData::Edge::sptr e1( ::fwData::Edge::New() );
+    e1->setIdentifiers("sizex","threshold");
+
+    bool success;
+
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+
+    success = g->addNode(n1);
+    CPPUNIT_ASSERT_EQUAL( success ,  true );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+
+    success = g->addNode(n1);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+
+    success = g->addNode(n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  true );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)0, g->getNbEdges() );
+
+
+    success = g->addEdge(e1,n1,n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  true );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    success = g->addEdge(e1,n1,n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Node::sptr n3( ::fwData::Node::New() );
+    ::fwData::Port::sptr p3( ::fwData::Port::New() );
+    p3->setIdentifier("sizex");
+    p3->setType("float");
+    n3->addOutputPort( p3 );
+
+    success = g->addEdge(e1,n3,n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    success = g->addEdge(e1,n1,n3);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Edge::sptr e2( ::fwData::Edge::New() );
+    e2->setIdentifiers("sizex","BADID");
+
+    success = g->addEdge(e2,n1,n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Edge::sptr e3( ::fwData::Edge::New() );
+    e3->setIdentifiers("BADID","threshold");
+
+    success = g->addEdge(e3,n1,n2);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Node::sptr n4( ::fwData::Node::New() );
+    ::fwData::Port::sptr p4( ::fwData::Port::New() );
+    p4->setIdentifier("threshold");
+    p4->setType("BADTYPE");
+    n4->addInputPort( p4 );
+
+    success = g->addNode( n4 );
+    CPPUNIT_ASSERT_EQUAL( success ,  true );
+    CPPUNIT_ASSERT_EQUAL( (size_t)3, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    // G :
+    // n1, n2, n4
+    // e1 : n1 -> n2
+
+    ::fwData::Edge::sptr e4( ::fwData::Edge::New() );
+    e4->setIdentifiers("sizex","threshold");
+
+    success = g->addEdge(e4,n1,n4);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)3, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+}
+
+void GraphTest::limitCase2()
+{
+    // G :
+    // n1 --e1--> n2
+    using namespace fwData;
+    ::fwData::Graph::sptr g( ::fwData::Graph::New() );
+
+    ::fwData::Node::sptr n1( ::fwData::Node::New() );
+    ::fwData::Port::sptr p1( ::fwData::Port::New() );
+    p1->setIdentifier("sizex");
+    p1->setType("float");
+    n1->addOutputPort( p1 );
+    g->addNode(n1);
+
+    ::fwData::Node::sptr n2( ::fwData::Node::New() );
+    ::fwData::Port::sptr p2( ::fwData::Port::New() );
+    p2->setIdentifier("threshold");
+    p2->setType("float");
+    n2->addInputPort( p2 );
+    g->addNode(n2);
+
+    ::fwData::Edge::sptr e1( ::fwData::Edge::New() );
+    e1->setIdentifiers("sizex","threshold");
+    g->addEdge(e1,n1,n2);
+
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    bool success;
+    success = g->removeNode(n1);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Edge::sptr e2( ::fwData::Edge::New() );
+    e2->setIdentifiers("sizex","threshold");
+
+
+    success = g->removeEdge(e2);
+    CPPUNIT_ASSERT_EQUAL( success ,  false );
+    CPPUNIT_ASSERT_EQUAL( (size_t)2, g->getNbNodes() );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, g->getNbEdges() );
+
+    ::fwData::Node::sptr nullNode;
+    CPPUNIT_ASSERT_EQUAL( g->getSourceNode(e2), nullNode );
+    CPPUNIT_ASSERT_EQUAL( g->getDestinationNode(e2), nullNode );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/ImageTest.cpp b/SrcLib/core/fwData/test/tu/src/ImageTest.cpp
new file mode 100644
index 0000000..f2ca5c2
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ImageTest.cpp
@@ -0,0 +1,284 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+
+#include <fwData/Image.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+#include "ImageTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ImageTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testGetterSetter()
+{
+    const size_t DIMENSION = 2 ;
+    ::fwTools::Type TYPE = ::fwTools::Type::create("int16")  ;
+    double CREFSPACING = 2.5 ;
+    std::vector<double> VECTORSPACING(DIMENSION, CREFSPACING) ;
+    double CREFORIGIN = 2.7 ;
+    std::vector<double> VECTORORIGIN(DIMENSION, CREFORIGIN)     ;
+    ::boost::int32_t CREFSIZE = 42 ;
+    ::fwData::Image::SizeType VECTORSIZE(DIMENSION, CREFSIZE)  ;
+    const double WINDOWCENTER = 10.10 ;
+    const double WINDOWWIDTH = 11.34 ;
+
+    // process
+    ::fwData::Image::sptr img1 = ::fwData::Image::New();
+
+    img1->setType( TYPE);
+    img1->setSpacing(VECTORSPACING);
+    img1->setOrigin(VECTORORIGIN);
+    img1->setSize(VECTORSIZE);
+    img1->setWindowCenter(WINDOWCENTER);
+    img1->setWindowWidth( WINDOWWIDTH );
+
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(img1->getNumberOfDimensions(),DIMENSION);
+
+    CPPUNIT_ASSERT(img1->getType() == TYPE);
+
+    CPPUNIT_ASSERT(img1->getSpacing() == VECTORSPACING);
+
+    CPPUNIT_ASSERT(img1->getOrigin() == VECTORORIGIN);
+
+    CPPUNIT_ASSERT(img1->getSize() == VECTORSIZE);
+
+    CPPUNIT_ASSERT_EQUAL(img1->getWindowCenter(),WINDOWCENTER);
+
+    CPPUNIT_ASSERT_EQUAL(img1->getWindowWidth(),WINDOWWIDTH);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testAllocation()
+{
+    const ::boost::uint8_t DIMENSION = 3 ;
+    ::fwTools::Type TYPE = ::fwTools::Type::create("int16")  ;
+    ::fwData::Image::SizeType VECTORSIZE(DIMENSION)  ;
+    VECTORSIZE[0] = 14;
+    VECTORSIZE[1] = 15;
+    VECTORSIZE[2] = 26;
+    size_t SIZE = 14*15*26*TYPE.sizeOf();
+
+    // process
+    ::fwData::Image::sptr img1 = ::fwData::Image::New();
+
+    img1->setType(TYPE);
+    img1->setSize(VECTORSIZE);
+
+    img1->allocate();
+
+    ::fwData::Array::sptr array = img1->getDataArray();
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE);
+    CPPUNIT_ASSERT(array->getType() == TYPE);
+    CPPUNIT_ASSERT_EQUAL(SIZE, array->getSizeInBytes());
+    CPPUNIT_ASSERT_EQUAL(SIZE, img1->getSizeInBytes());
+
+    ::fwData::Image::sptr img2 = ::fwData::Image::New();
+    img2->allocate(VECTORSIZE[0], VECTORSIZE[1], VECTORSIZE[2], TYPE);
+
+    array = img2->getDataArray();
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE);
+    CPPUNIT_ASSERT(array->getType() == TYPE);
+    CPPUNIT_ASSERT(array->getSizeInBytes() == SIZE);
+    CPPUNIT_ASSERT(img2->getSizeInBytes() == SIZE);
+
+
+    ::fwData::Image::sptr img3 = ::fwData::Image::New();
+    img3->allocate(VECTORSIZE, TYPE);
+
+    array = img3->getDataArray();
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE);
+    CPPUNIT_ASSERT(array->getType() == TYPE);
+    CPPUNIT_ASSERT(array->getSizeInBytes() == SIZE);
+    CPPUNIT_ASSERT(img3->getSizeInBytes() == SIZE);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testReallocation()
+{
+    const ::boost::uint8_t DIMENSION = 3 ;
+    ::fwTools::Type TYPE1 = ::fwTools::Type::create("int16")  ;
+    ::fwTools::Type TYPE2 = ::fwTools::Type::create("int64")  ;
+    ::fwTools::Type TYPE3 = ::fwTools::Type::create("uint8")  ;
+    ::fwData::Image::SizeType VECTORSIZE1(DIMENSION, 10)  ;
+    ::fwData::Image::SizeType VECTORSIZE2(DIMENSION, 20)  ;
+    ::fwData::Image::SizeType VECTORSIZE3(DIMENSION, 5)  ;
+    size_t SIZE1 = 10*10*10*TYPE1.sizeOf();
+    size_t SIZE2 = 20*20*20*TYPE2.sizeOf();
+    size_t SIZE3 = 5*5*5*TYPE3.sizeOf();
+
+    // process
+    ::fwData::Image::sptr img1 = ::fwData::Image::New();
+
+    img1->allocate(VECTORSIZE1, TYPE1);
+    ::fwData::Array::sptr array = img1->getDataArray();
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE1);
+    CPPUNIT_ASSERT(array->getType() == TYPE1);
+    CPPUNIT_ASSERT(array->getSizeInBytes() == SIZE1);
+    CPPUNIT_ASSERT(img1->getSizeInBytes() == SIZE1);
+
+    img1->allocate(VECTORSIZE2, TYPE2);
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE2);
+    CPPUNIT_ASSERT(array->getType() == TYPE2);
+    CPPUNIT_ASSERT(array->getSizeInBytes() == SIZE2);
+    CPPUNIT_ASSERT(img1->getSizeInBytes() == SIZE2);
+
+    img1->allocate(VECTORSIZE3, TYPE3);
+    CPPUNIT_ASSERT(array->getSize() == VECTORSIZE3);
+    CPPUNIT_ASSERT(array->getType() == TYPE3);
+    CPPUNIT_ASSERT(array->getSizeInBytes() == SIZE3);
+    CPPUNIT_ASSERT(img1->getSizeInBytes() == SIZE3);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testPixelType()
+{
+    ::fwData::Image::sptr img1 = ::fwData::Image::New();
+    ::fwTools::DynamicType DT1;
+
+    img1->setType(::fwTools::Type::create("int8"));
+    DT1.setType< signed char >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("int16"));
+    DT1.setType< signed short >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("int32"));
+    DT1.setType< signed int >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("uint8"));
+    DT1.setType< unsigned char >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("uint16"));
+    DT1.setType< unsigned short >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("uint32"));
+    DT1.setType< unsigned int >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("float"));
+    DT1.setType< float >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+
+    img1->setType(::fwTools::Type::create("double"));
+    DT1.setType< double >();
+    CPPUNIT_ASSERT(DT1 == img1->getPixelType());
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testSetGetPixel()
+{
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    ::fwComEd::helper::Image imgHelper(img);
+
+    const ::boost::uint8_t DIMENSION = 3 ;
+    ::fwTools::Type TYPE = ::fwTools::Type::create("int16")  ;
+    ::fwData::Image::SizeType VECTORSIZE(DIMENSION)  ;
+    VECTORSIZE[0] = 10;
+    VECTORSIZE[1] = 20;
+    VECTORSIZE[2] = 30;
+
+    img->allocate(VECTORSIZE, TYPE);
+
+    ::fwData::Array::sptr array = img->getDataArray();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    // test 1 : use getPixelBuffer
+    short count = 0;
+    short *iter = arrayHelper.begin<short>();
+    for (; iter != arrayHelper.end<short>() ; ++iter)
+    {
+        *iter = count++;
+    }
+
+    for (unsigned int x=0 ; x<VECTORSIZE[0] ; ++x)
+    {
+        for (unsigned int y=0 ; y<VECTORSIZE[1] ; ++y)
+        {
+            for (unsigned int z=0 ; z<VECTORSIZE[2] ; ++z)
+            {
+                short val = static_cast<short>(x+y*VECTORSIZE[0]+z*VECTORSIZE[0]*VECTORSIZE[1]);
+                ::fwData::Image::IndexType index = val;
+                CPPUNIT_ASSERT_EQUAL(val, *reinterpret_cast<short*>(imgHelper.getPixelBuffer(x,y,z)));
+                CPPUNIT_ASSERT_EQUAL(val, *reinterpret_cast<short*>(imgHelper.getPixelBuffer(index)));
+                ::fwData::Image::BufferType* buffer = reinterpret_cast< ::fwData::Image::BufferType* >(imgHelper.getBuffer());
+                CPPUNIT_ASSERT_EQUAL(val, *reinterpret_cast<short*>(imgHelper.getPixelBuffer(index)));
+
+                std::stringstream ss;
+                ss << val;
+                CPPUNIT_ASSERT_EQUAL( ss.str(), imgHelper.getPixelAsString(x,y,z));
+            }
+        }
+    }
+
+    // test 2 : use setPixelBuffer
+    for (unsigned int x=0 ; x<VECTORSIZE[0] ; ++x)
+    {
+        for (unsigned int y=0 ; y<VECTORSIZE[1] ; ++y)
+        {
+            for (unsigned int z=0 ; z<VECTORSIZE[2] ; ++z)
+            {
+                ::fwData::Image::IndexType index = x+y*VECTORSIZE[0]+z*VECTORSIZE[0]*VECTORSIZE[1];
+                short val = static_cast<short>(index * 2);
+                imgHelper.setPixelBuffer(index, reinterpret_cast< ::fwData::Image::BufferType* >(&val));
+            }
+        }
+    }
+
+    count = 0;
+    iter = arrayHelper.begin<short>();
+    for (; iter != arrayHelper.end<short>() ; ++iter)
+    {
+        CPPUNIT_ASSERT_EQUAL(static_cast<short>(count++ *2), *iter);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/IntegerTest.cpp b/SrcLib/core/fwData/test/tu/src/IntegerTest.cpp
new file mode 100644
index 0000000..209ee10
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/IntegerTest.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <limits>
+
+#include <fwData/Integer.hpp>
+
+#include "IntegerTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::IntegerTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void IntegerTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void IntegerTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void IntegerTest::methode1()
+{
+    const int VALUES[]  = {
+        std::numeric_limits< int >::min(),
+        -1654, 0, 123456,
+        std::numeric_limits< int >::max()
+    };
+
+    BOOST_FOREACH ( int VALUE, VALUES )
+    {
+        ::fwData::Integer::sptr i0 = ::fwData::Integer::New();
+        i0->value() = VALUE;
+        ::fwData::Integer::sptr i1 = ::fwData::Integer::New( VALUE );
+
+        CPPUNIT_ASSERT_EQUAL( VALUE , i0->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE , i1->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE , ::fwData::Integer::New( VALUE )->value() );
+    }
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/IsTypeOfTest.cpp b/SrcLib/core/fwData/test/tu/src/IsTypeOfTest.cpp
new file mode 100644
index 0000000..b529dd6
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/IsTypeOfTest.cpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+#include <boost/foreach.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include "IsTypeOfTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::IsTypeOfTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void IsTypeOfTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void IsTypeOfTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void IsTypeOfTest::methode1()
+{
+    ::fwData::Composite::sptr dataComposite = ::fwData::Composite::New();
+    ::fwData::Boolean::sptr dataBoolean = ::fwData::Boolean::New();
+    ::fwData::Float::sptr dataFloat = ::fwData::Float::New();
+    ::fwData::Integer::sptr dataInteger = ::fwData::Integer::New();
+    ::fwData::Image::sptr dataImage = ::fwData::Image::New();
+    ::fwData::TransferFunction::sptr dataTransferFunction = ::fwData::TransferFunction::New();
+
+    ::fwData::Composite::isTypeOf         ( "::fwData::Object" );
+    ::fwData::Boolean::isTypeOf           ( "::fwData::Object" );
+    ::fwData::Float::isTypeOf             ( "::fwData::Object" );
+    ::fwData::Integer::isTypeOf           ( "::fwData::Object" );
+    ::fwData::Image::isTypeOf             ( "::fwData::Object" );
+    ::fwData::TransferFunction::isTypeOf  ( "::fwData::Object" );
+
+    ::fwData::Composite::isTypeOf         ( "::fwData::Composite"         );
+    ::fwData::Boolean::isTypeOf           ( "::fwData::Boolean"           );
+    ::fwData::Float::isTypeOf             ( "::fwData::Float"             );
+    ::fwData::Integer::isTypeOf           ( "::fwData::Integer"           );
+    ::fwData::Image::isTypeOf             ( "::fwData::Image"             );
+    ::fwData::TransferFunction::isTypeOf  ( "::fwData::TransferFunction"  );
+
+    CPPUNIT_ASSERT( dataComposite        ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( dataBoolean          ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( dataFloat            ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( dataInteger          ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( dataImage            ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( dataTransferFunction ->isA("::fwData::Object") );
+
+    CPPUNIT_ASSERT( dataComposite        ->isA("::fwData::Composite") );
+    CPPUNIT_ASSERT( dataBoolean          ->isA("::fwData::Boolean") );
+    CPPUNIT_ASSERT( dataFloat            ->isA("::fwData::Float") );
+    CPPUNIT_ASSERT( dataInteger          ->isA("::fwData::Integer") );
+    CPPUNIT_ASSERT( dataImage            ->isA("::fwData::Image") );
+    CPPUNIT_ASSERT( dataTransferFunction ->isA("::fwData::TransferFunction") );
+
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataComposite)        ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataBoolean)          ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataFloat)            ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataInteger)          ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataImage)            ->isA("::fwData::Object") );
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast(dataTransferFunction) ->isA("::fwData::Object") );
+
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataComposite         )->isA( "::fwData::Composite"         ) ) ;
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataBoolean           )->isA( "::fwData::Boolean"           ) ) ;
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataFloat             )->isA( "::fwData::Float"             ) ) ;
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataInteger           )->isA( "::fwData::Integer"           ) ) ;
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataImage             )->isA( "::fwData::Image"             ) ) ;
+    CPPUNIT_ASSERT( ::fwData::Object::dynamicCast( dataTransferFunction  )->isA( "::fwData::TransferFunction"  ) ) ;
+
+    CPPUNIT_ASSERT( ! dataComposite        ->isA("::fwData::Image") );
+    CPPUNIT_ASSERT( ! dataBoolean          ->isA("::fwData::Image") );
+    CPPUNIT_ASSERT( ! dataFloat            ->isA("::fwData::Image") );
+    CPPUNIT_ASSERT( ! dataInteger          ->isA("::fwData::Image") );
+    CPPUNIT_ASSERT( ! dataImage            ->isA("::fwData::Boolean") );
+    CPPUNIT_ASSERT( ! dataTransferFunction ->isA("::fwData::Image") );
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/MTLockTest.cpp b/SrcLib/core/fwData/test/tu/src/MTLockTest.cpp
new file mode 100644
index 0000000..f50c1ec
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/MTLockTest.cpp
@@ -0,0 +1,176 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/foreach.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <fwData/mt/ObjectReadLock.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+#include <fwData/mt/ObjectReadToWriteLock.hpp>
+
+#include <fwTest/helper/Thread.hpp>
+
+#include "MTLockTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::MTLockTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::setUp()
+{
+    // Set up context before running a test.
+    m_string = ::fwData::String::New();
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::lockTest()
+{
+
+    ::fwTest::helper::Thread thread(::boost::bind(&MTLockTest::runLock, this));
+
+    CPPUNIT_ASSERT(thread.timedJoin(2000));
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::runLock()
+{
+    {
+        ::fwData::mt::ObjectReadLock readLock(m_string);
+    }
+
+    {
+        ::fwData::mt::ObjectWriteLock writeLock(m_string);
+
+        writeLock.unlock();
+
+        ::fwData::mt::ObjectReadToWriteLock updrageLock(m_string);
+
+        updrageLock.unlock();
+
+        writeLock.lock();
+
+        writeLock.unlock();
+
+        updrageLock.lock();
+
+        updrageLock.upgrade();
+
+        updrageLock.downgrade();
+
+        ::fwData::mt::ObjectReadLock readLock(m_string);
+
+        readLock.unlock();
+
+        updrageLock.unlock();
+
+        writeLock.lock();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::multipleLockTest()
+{
+    ::fwTest::helper::Thread thread(::boost::bind(&MTLockTest::runMultipleLock1, this));
+    ::fwTest::helper::Thread thread2(::boost::bind(&MTLockTest::runMultipleLock2, this));
+
+    CPPUNIT_ASSERT(thread.timedJoin(2500));
+    CPPUNIT_ASSERT(thread2.timedJoin(2500));
+
+    CPPUNIT_ASSERT_MESSAGE(m_string->value(), m_string->value()=="lili" ||  m_string->value()=="toto");
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::runMultipleLock1()
+{
+    {
+        ::fwData::mt::ObjectWriteLock writeLock(m_string);
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "t";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "o";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "t";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "o";
+    }
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+
+    {
+        ::fwData::mt::ObjectReadLock readLock(m_string);
+        CPPUNIT_ASSERT(m_string->value().find("toto") != std::string::npos);
+    }
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+
+    {
+        ::fwData::mt::ObjectReadToWriteLock lock(m_string);
+        if (m_string->value() == "totolili")
+        {
+            ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+            lock.upgrade();
+            m_string->value() = "toto";
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MTLockTest::runMultipleLock2()
+{
+    {
+        ::fwData::mt::ObjectWriteLock writeLock(m_string);
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "l";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "i";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "l";
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+        m_string->value() += "i";
+    }
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+
+    {
+        ::fwData::mt::ObjectReadLock readLock(m_string);
+        CPPUNIT_ASSERT(m_string->value().find("lili") != std::string::npos);
+    }
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+
+    {
+        ::fwData::mt::ObjectReadToWriteLock lock(m_string);
+        if (m_string->value() == "lilitoto")
+        {
+            ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(100));
+            lock.upgrade();
+            m_string->value() = "lili";
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/MacrosTest.cpp b/SrcLib/core/fwData/test/tu/src/MacrosTest.cpp
new file mode 100644
index 0000000..16955c6
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/MacrosTest.cpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <sstream>
+#include <boost/foreach.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/function_types/result_type.hpp>
+#include <boost/function_types/function_type.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+
+#include <boost/typeof/typeof.hpp>
+
+#include <fwTools/random/Generator.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/macros.hpp>
+
+#include "MacrosTest.hpp"
+
+#define __FWDATA_UT_TEST_RETURN_TYPE(Func, ExpectedType)                                            \
+{                                                                                                   \
+    typedef BOOST_TYPEOF(&Func) F;                                                                  \
+    typedef ::boost::function_types::result_type< F >::type R;                                      \
+    typedef ::boost::is_same<ExpectedType, R >::type IsFuncOfExpectedType;                          \
+    std::stringstream ss;                                                                           \
+    ss << "Expected type : " << #ExpectedType << " (typeid: "                                       \
+            << typeid(ExpectedType).name() << "), got typeid: "                                     \
+            << ( ( ::boost::is_const< ::boost::remove_reference<R>::type >::value) ? " const " : "")\
+            << typeid(R).name()  << ( ( ::boost::is_reference<R>::value) ? " &" : "")               \
+            ;                                                                                       \
+    CPPUNIT_ASSERT_MESSAGE( ss.str(), IsFuncOfExpectedType::value );                                \
+}
+
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::MacrosTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+class MyObjectTest
+{
+public:
+
+    typedef std::vector< float > VectFloatType;
+
+    fwDataGetSetMacro(ValInt, int)
+
+    fwDataGetSetCRefMacro(VectFloat, VectFloatType)
+
+    fwDataGetSetSptrMacro(Object, ::fwData::Object::sptr)
+
+    int m_attrValInt;
+    VectFloatType m_attrVectFloat;
+    ::fwData::Object::sptr m_attrObject;
+};
+
+void MacrosTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void MacrosTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void MacrosTest::getterSetterTest()
+{
+    __FWDATA_UT_TEST_RETURN_TYPE(MyObjectTest::getValInt, int);
+    __FWDATA_UT_TEST_RETURN_TYPE(MyObjectTest::getVectFloat,  const MyObjectTest::VectFloatType &);
+    __FWDATA_UT_TEST_RETURN_TYPE(MyObjectTest::getObject, ::fwData::Object::sptr);
+
+    int valInt = ::fwTools::random::getValue(-100, 100);
+    MyObjectTest::VectFloatType vectFloat(100, 0);
+    ::fwTools::random::fillContainer(0.f, 100.f, vectFloat);
+    ::fwData::Object::sptr object = ::fwData::Float::New();
+
+    MyObjectTest objTest;
+    objTest.setValInt(valInt);
+    objTest.setVectFloat(vectFloat);
+    objTest.setObject(object);
+
+    CPPUNIT_ASSERT_EQUAL(valInt, objTest.getValInt() );
+    CPPUNIT_ASSERT(vectFloat == objTest.getVectFloat() );
+    CPPUNIT_ASSERT_EQUAL(object, objTest.getObject() );
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/MaterialTest.cpp b/SrcLib/core/fwData/test/tu/src/MaterialTest.cpp
new file mode 100644
index 0000000..9085fff
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/MaterialTest.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Material.hpp>
+#include <fwData/Color.hpp>
+#include "MaterialTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::MaterialTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void MaterialTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void MaterialTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void MaterialTest::methode1()
+{
+    //-----------test values
+    ::fwData::Color::sptr CAMBIENT = ::fwData::Color::New();
+    CAMBIENT->setRGBA(0.5f,0.5f,0.5f,0.5f);
+
+    ::fwData::Color::sptr CDIFF = ::fwData::Color::New();
+    CDIFF->setRGBA(0.8f,0.2f,0.5f,0.4f);
+
+    ::fwData::Material::sptr material = ::fwData::Material::New();
+
+    material->setAmbient(::fwData::Object::copy(CAMBIENT));
+    material->setDiffuse(::fwData::Object::copy(CDIFF));
+
+    CPPUNIT_ASSERT_EQUAL(material->ambient()->getRGBA()[0], CAMBIENT->getRGBA()[0]);
+    CPPUNIT_ASSERT_EQUAL(material->diffuse()->getRGBA()[0], CDIFF->getRGBA()[0]);
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/MeshTest.cpp b/SrcLib/core/fwData/test/tu/src/MeshTest.cpp
new file mode 100644
index 0000000..be15329
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/MeshTest.cpp
@@ -0,0 +1,469 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/assign/std/vector.hpp>
+#include <boost/cstdint.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/ObjectLock.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+#include "MeshTest.hpp"
+
+
+using namespace boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::MeshTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void MeshTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::allocation()
+{
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    size_t pointSize = 3000;
+    size_t cellSize = 2000;
+    size_t cellDataSize = 8000;
+    mesh->allocate(pointSize, cellSize, cellDataSize);
+    CPPUNIT_ASSERT_EQUAL(pointSize, mesh->getPointsArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(cellSize, mesh->getCellTypesArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(cellDataSize, mesh->getCellDataArray()->getSize()[0]);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(4), mesh->getPointsArray()->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), mesh->getPointsArray()->getNumberOfComponents());
+    size_t pointAllocatedSize = pointSize * mesh->getPointsArray()->getNumberOfComponents() * mesh->getPointsArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(pointAllocatedSize, mesh->getPointsArray()->getSizeInBytes());
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(1), mesh->getCellTypesArray()->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), mesh->getCellTypesArray()->getNumberOfComponents());
+    size_t cellTypeAllocatedSize = cellSize * mesh->getCellTypesArray()->getNumberOfComponents() * mesh->getCellTypesArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(cellTypeAllocatedSize, mesh->getCellTypesArray()->getSizeInBytes());
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(8), mesh->getCellDataOffsetsArray()->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), mesh->getCellDataOffsetsArray()->getNumberOfComponents());
+    size_t cellDataOffsetsAllocatedSize = cellSize * mesh->getCellDataOffsetsArray()->getNumberOfComponents() * mesh->getCellDataOffsetsArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(cellDataOffsetsAllocatedSize, mesh->getCellDataOffsetsArray()->getSizeInBytes());
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(8), mesh->getCellDataArray()->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), mesh->getCellDataArray()->getNumberOfComponents());
+    size_t cellDataAllocatedSize = cellDataSize * mesh->getCellDataArray()->getNumberOfComponents() * mesh->getCellDataArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(cellDataAllocatedSize, mesh->getCellDataArray()->getSizeInBytes());
+
+    CPPUNIT_ASSERT_EQUAL(pointAllocatedSize + cellSize + cellDataOffsetsAllocatedSize + cellDataAllocatedSize , mesh->getAllocatedSizeInBytes());
+
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id) 0, mesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id) 0, mesh->getNumberOfCells());
+
+    ::fwComEd::helper::Mesh helper(mesh);
+    helper.insertNextPoint(10, 20, 30);
+    helper.insertNextPoint(10, 10, 10);
+    helper.insertNextPoint(20, 20, 10);
+
+    helper.insertNextCell(1, 2, 3);
+    CPPUNIT_ASSERT_EQUAL((fwData::Mesh::Id)3, mesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL((fwData::Mesh::Id)1, mesh->getNumberOfCells());
+
+    mesh->allocatePointNormals();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfPoints()), mesh->getPointNormalsArray()->getSize()[0]);
+    mesh->allocatePointColors(::fwData::Mesh::RGB);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfPoints()), mesh->getPointColorsArray()->getSize()[0]);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(4), mesh->getPointNormalsArray()->getType().sizeOf());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), mesh->getPointNormalsArray()->getNumberOfComponents());
+    size_t pointNormalsAllocatedSize = mesh->getNumberOfPoints() * mesh->getPointNormalsArray()->getNumberOfComponents() * mesh->getPointNormalsArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(pointNormalsAllocatedSize, mesh->getPointNormalsArray()->getSizeInBytes());
+
+    size_t pointColorsAllocatedSize = mesh->getNumberOfPoints() * mesh->getPointColorsArray()->getNumberOfComponents() * mesh->getPointColorsArray()->getType().sizeOf();
+    CPPUNIT_ASSERT_EQUAL(pointAllocatedSize + cellSize + cellDataOffsetsAllocatedSize + cellDataAllocatedSize + pointNormalsAllocatedSize + pointColorsAllocatedSize, mesh->getAllocatedSizeInBytes());
+
+    mesh->allocateCellNormals();
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfCells()), mesh->getCellNormalsArray()->getSize()[0]);
+    mesh->allocateCellColors(::fwData::Mesh::RGBA);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfCells()), mesh->getCellColorsArray()->getSize()[0]);
+
+    size_t oldsize = mesh->getAllocatedSizeInBytes();
+    bool adjusted = mesh->adjustAllocatedMemory();
+    size_t newSize = mesh->getAllocatedSizeInBytes();
+    CPPUNIT_ASSERT_EQUAL(true, adjusted);
+    CPPUNIT_ASSERT(oldsize > newSize);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfPoints()), mesh->getPointsArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfPoints()), mesh->getPointsArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getNumberOfCells()) , mesh->getCellTypesArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(mesh->getCellDataSize()  ), mesh->getCellDataArray()->getSize()[0]);
+
+    mesh->clear();
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id) 0, mesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id) 0, mesh->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL((::fwData::Mesh::Id) 0, mesh->getCellDataSize());
+    CPPUNIT_ASSERT_EQUAL((size_t) 0, mesh->getDataSizeInBytes());
+
+    ::fwData::Mesh::Id nbPoints = 300;
+    ::fwData::Mesh::Id nbCells = 200;
+    ::fwData::Mesh::Id newCellDataSize = 500;
+    mesh->setNumberOfPoints(nbPoints);
+    mesh->setNumberOfCells(nbCells);
+    mesh->setCellDataSize(newCellDataSize);
+    oldsize = mesh->getAllocatedSizeInBytes();
+    adjusted = mesh->adjustAllocatedMemory();
+    newSize = mesh->getAllocatedSizeInBytes();
+    CPPUNIT_ASSERT_EQUAL(true, adjusted);
+    CPPUNIT_ASSERT(oldsize < newSize);
+
+    CPPUNIT_ASSERT_EQUAL(nbPoints, mesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL(nbCells, mesh->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL(newCellDataSize, mesh->getCellDataSize());
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(nbPoints), mesh->getPointsArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(nbCells), mesh->getCellTypesArray()->getSize()[0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(newCellDataSize), mesh->getCellDataArray()->getSize()[0]);
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::insertion()
+{
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    ::fwComEd::helper::Mesh helper(mesh);
+    helper.insertNextPoint(10, 20, 30);
+    helper.insertNextPoint(10, 10, 10);
+    helper.insertNextPoint(20, 20, 10);
+    helper.insertNextPoint(30, 30, 10);
+    helper.insertNextPoint(15, 20, 35);
+    helper.insertNextPoint(20, 20, 10);
+    helper.insertNextPoint(20, 63, 17);
+    helper.insertNextPoint(27, 83, 52);
+
+    helper.insertNextCell(1, 2);
+    helper.insertNextCell(1, 3, 4);
+    helper.insertNextCell(1, 2, 5, 4);
+
+    ::fwData::Mesh::CellValueType p[4] = {3, 6, 5, 1};
+    helper.insertNextCell(::fwData::Mesh::QUAD, p, 4);
+
+    ::fwData::Mesh::CellValueType p2[6] = {1, 3, 5, 7, 2, 6};
+    helper.insertNextCell(::fwData::Mesh::POLY, p2, 6);
+
+    ::fwData::Mesh::CellValueType p3[5] = {7, 2, 5, 4, 3};
+    helper.insertNextCell(::fwData::Mesh::POLY, p3, 5);
+
+    CPPUNIT_ASSERT_EQUAL((fwData::Mesh::Id)8, mesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL((fwData::Mesh::Id)6, mesh->getNumberOfCells());
+
+
+    ::fwData::Mesh::PointsMultiArrayType pointArray = helper.getPoints();
+    CPPUNIT_ASSERT_EQUAL((float) 10, pointArray[0][0]);
+    CPPUNIT_ASSERT_EQUAL((float) 20, pointArray[2][1]);
+    CPPUNIT_ASSERT_EQUAL((float) 52, pointArray[7][2]);
+
+    ::fwData::Mesh::CellDataOffsetsMultiArrayType cellDataOffsetArray = helper.getCellDataOffsets();
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)0, cellDataOffsetArray[0]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)2, cellDataOffsetArray[1]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)9, cellDataOffsetArray[3]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)13, cellDataOffsetArray[4]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)19, cellDataOffsetArray[5]);
+
+    ::fwData::Mesh::CellDataMultiArrayType cellDataArray = helper.getCellData();
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)1, cellDataArray[cellDataOffsetArray[0]]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)1, cellDataArray[cellDataOffsetArray[1]]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)3, cellDataArray[cellDataOffsetArray[3]]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)1, cellDataArray[cellDataOffsetArray[4]]);
+    CPPUNIT_ASSERT_EQUAL( (::boost::uint64_t)7, cellDataArray[cellDataOffsetArray[5]]);
+
+    ::fwData::Mesh::CellTypesMultiArrayType cellTypesArray = helper.getCellTypes();
+    CPPUNIT_ASSERT_EQUAL( ::fwData::Mesh::EDGE, static_cast< ::fwData::Mesh::CellTypesEnum >(cellTypesArray[0]));
+    CPPUNIT_ASSERT_EQUAL( ::fwData::Mesh::TRIANGLE, static_cast < ::fwData::Mesh::CellTypesEnum >(cellTypesArray[1]));
+    CPPUNIT_ASSERT_EQUAL( ::fwData::Mesh::QUAD, static_cast< ::fwData::Mesh::CellTypesEnum >(cellTypesArray[3]));
+    CPPUNIT_ASSERT_EQUAL( ::fwData::Mesh::POLY, static_cast< ::fwData::Mesh::CellTypesEnum >(cellTypesArray[4]));
+    CPPUNIT_ASSERT_EQUAL( ::fwData::Mesh::POLY, static_cast< ::fwData::Mesh::CellTypesEnum >(cellTypesArray[5]));
+
+    helper.setPoint(4, 45, 59, 45);
+    CPPUNIT_ASSERT_EQUAL((float) 45, pointArray[4][0]);
+    CPPUNIT_ASSERT_EQUAL((float) 59, pointArray[4][1]);
+    CPPUNIT_ASSERT_EQUAL((float) 45, pointArray[4][2]);
+
+
+    ::fwData::Array::sptr array = mesh->getPointsArray();
+    ::fwComEd::helper::Array arrayHelper(array);
+    CPPUNIT_ASSERT_EQUAL(*(arrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(4),0)), pointArray[4][0]);
+    CPPUNIT_ASSERT_EQUAL(*(arrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(4),1)), pointArray[4][1]);
+    CPPUNIT_ASSERT_EQUAL(*(arrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(4),2)), pointArray[4][2]);
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::colorsNormals()
+{
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    ::fwComEd::helper::Mesh helper(mesh);
+    helper.insertNextPoint(10, 20, 30);
+    helper.insertNextPoint(10, 10, 10);
+    helper.insertNextPoint(20, 20, 10);
+    helper.insertNextPoint(30, 30, 10);
+    helper.insertNextPoint(15, 20, 35);
+    helper.insertNextPoint(20, 20, 10);
+    helper.insertNextPoint(20, 63, 17);
+    helper.insertNextPoint(27, 83, 52);
+
+    helper.insertNextCell(1, 2);
+    helper.insertNextCell(1, 3, 4);
+    helper.insertNextCell(1, 2, 5, 4);
+
+    ::fwData::Mesh::CellValueType p[4] = {3, 6, 5, 1};
+    helper.insertNextCell(::fwData::Mesh::QUAD, p, 4);
+
+    ::fwData::Mesh::CellValueType p2[6] = {1, 3, 5, 7, 2, 6};
+    helper.insertNextCell(::fwData::Mesh::POLY, p2, 6);
+
+    ::fwData::Mesh::CellValueType p3[5] = {7, 2, 5, 4, 3};
+    helper.insertNextCell(::fwData::Mesh::POLY, p3, 5);
+
+    mesh->allocatePointColors(::fwData::Mesh::RGBA);
+    helper.updateLock();
+    ::fwData::Mesh::PointColorsMultiArrayType pointColorArray = helper.getPointColors();
+
+    ::fwData::Mesh::Id nbPoints = mesh->getNumberOfPoints();
+    for (int id=0 ; id< nbPoints ; id++)
+    {
+        for (int c=0 ; c < 4 ; c++)
+        {
+            pointColorArray[id][c] = id * 10 + c;
+        }
+    }
+    CPPUNIT_ASSERT_EQUAL(static_cast< ::fwData::Mesh::ColorValueType >( 0), pointColorArray[0][0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast< ::fwData::Mesh::ColorValueType >(21), pointColorArray[2][1]);
+    CPPUNIT_ASSERT_EQUAL(static_cast< ::fwData::Mesh::ColorValueType >(50), pointColorArray[5][0]);
+    CPPUNIT_ASSERT_EQUAL(static_cast< ::fwData::Mesh::ColorValueType >(73), pointColorArray[7][3]);
+
+    ::fwData::Mesh::ColorValueType color[4] = {5, 8, 6, 10};
+    helper.setPointColor(5, color);
+    CPPUNIT_ASSERT_EQUAL(static_cast< ::fwData::Mesh::ColorValueType >(8), pointColorArray[5][1]);
+
+    mesh->allocateCellNormals();
+    helper.updateLock();
+    ::fwData::Mesh::CellNormalsMultiArrayType cellNormalArray = helper.getCellNormals();
+
+    ::fwData::Mesh::Id nbCells = mesh->getNumberOfCells();
+    for (int id=0 ; id< nbCells ; id++)
+    {
+        for (int n=0 ; n < 3 ; n++)
+        {
+            cellNormalArray[id][n] = id + n/10.f;
+        }
+    }
+    CPPUNIT_ASSERT_EQUAL(0.0f, cellNormalArray[0][0]);
+    CPPUNIT_ASSERT_EQUAL(2.1f, cellNormalArray[2][1]);
+    CPPUNIT_ASSERT_EQUAL(4.2f, cellNormalArray[4][2]);
+    CPPUNIT_ASSERT_EQUAL(5.0f, cellNormalArray[5][0]);
+
+    ::fwData::Mesh::NormalValueType normal[3] = {0.9f, 0.4f, 0.2f};
+    helper.setCellNormal(4, normal);
+    CPPUNIT_ASSERT_EQUAL(0.2f, cellNormalArray[4][2]);
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::addingArray()
+{
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+
+    ::fwData::Mesh::Id nbPoints = 60;
+    ::fwData::Mesh::Id nbCells = 20;
+
+    // Add point array
+    ::fwData::Array::sptr pointArray = ::fwData::Array::New();
+
+    pointArray->resize(::fwTools::Type::create< ::fwData::Mesh::PointValueType >() , list_of(nbPoints), 3, true);
+    ::fwComEd::helper::Array pointArrayHelper(pointArray);
+
+    ::fwData::Mesh::PointValueType count = 0;
+    ::fwData::Mesh::PointValueType *iter = pointArrayHelper.begin< ::fwData::Mesh::PointValueType >();
+    for (; iter != pointArrayHelper.end< ::fwData::Mesh::PointValueType >() ; ++iter)
+    {
+        for (int i=0 ; i<3 ; i++)
+        {
+            *iter = count + i/10.0f;
+        }
+        count++;
+    }
+
+    mesh->setPointsArray(pointArray);
+    mesh->setNumberOfPoints(nbPoints);
+
+    CPPUNIT_ASSERT_EQUAL(nbPoints, mesh->getNumberOfPoints());
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+    ::fwData::Mesh::Id id = meshHelper.insertNextPoint(50, 50, 50);
+    CPPUNIT_ASSERT_EQUAL(nbPoints, id);
+    nbPoints++;
+    CPPUNIT_ASSERT_EQUAL(nbPoints, mesh->getNumberOfPoints());
+
+    ::fwData::Mesh::PointsMultiArrayType pointMultiArray = meshHelper.getPoints();
+    CPPUNIT_ASSERT_EQUAL(*(pointArrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(0),0)), pointMultiArray[0][0]);
+    CPPUNIT_ASSERT_EQUAL(*(pointArrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(12),2)), pointMultiArray[12][2]);
+    CPPUNIT_ASSERT_EQUAL(*(pointArrayHelper.getItem< ::fwData::Mesh::PointValueType >(list_of(45),1)), pointMultiArray[45][1]);
+
+
+    // add cells arrays
+    ::fwData::Array::sptr cellTypeArray = ::fwData::Array::New();
+    ::fwData::Array::sptr cellDataOffsetArray = ::fwData::Array::New();
+    ::fwData::Array::sptr cellDataArray = ::fwData::Array::New();
+
+
+    cellTypeArray->resize(::fwTools::Type::create< ::fwData::Mesh::CellTypes >() , list_of(nbCells), 1, true);
+    cellDataOffsetArray->resize(::fwTools::Type::create< ::fwData::Mesh::CellDataOffsetType >() , list_of(nbCells), 1, true);
+    cellDataArray->resize(::fwTools::Type::create< ::fwData::Mesh::CellValueType >() , list_of(nbCells*3), 1, true);
+
+    ::fwComEd::helper::Array cellTypeArrayHelper(cellTypeArray);
+    ::fwComEd::helper::Array cellDataOffsetArrayHelper(cellDataOffsetArray);
+    ::fwComEd::helper::Array cellDataArrayHelper(cellDataArray);
+
+    ::fwData::Mesh::CellValueType counter = 0;
+    for (int id = 0 ; id<nbCells ; id++)
+    {
+        ::fwData::Mesh::CellTypes type = static_cast< ::fwData::Mesh::CellTypes >(::fwData::Mesh::TRIANGLE);
+        cellTypeArrayHelper.setItem(list_of(id), &type);
+
+        ::fwData::Mesh::CellDataOffsetType offset = id*3;
+        cellDataOffsetArrayHelper.setItem(list_of(id), &offset);
+
+        ::fwData::Mesh::CellValueType cell[3] = { counter, counter+1, counter+2 };
+        counter += 3;
+        cellDataArrayHelper.setItem(list_of(offset), &cell);
+    }
+    mesh->setCellTypesArray(cellTypeArray);
+    mesh->setCellDataOffsetsArray(cellDataOffsetArray);
+    mesh->setCellDataArray(cellDataArray);
+    mesh->setNumberOfCells(nbCells);
+    mesh->setCellDataSize(nbCells*3);
+
+    meshHelper.updateLock();
+    meshHelper.insertNextCell(1, 6, 25, 12 );
+
+    nbCells++;
+    CPPUNIT_ASSERT_EQUAL(nbCells, mesh->getNumberOfCells());
+
+    ::fwData::Mesh::CellTypesMultiArrayType cellTypesMultiArray = meshHelper.getCellTypes();
+    CPPUNIT_ASSERT_EQUAL(*(cellTypeArrayHelper.getItem< ::fwData::Mesh::CellTypes >(list_of(0))) , cellTypesMultiArray[0]);
+    CPPUNIT_ASSERT_EQUAL(*(cellTypeArrayHelper.getItem< ::fwData::Mesh::CellTypes >(list_of(12))), cellTypesMultiArray[12]);
+    CPPUNIT_ASSERT_EQUAL(*(cellTypeArrayHelper.getItem< ::fwData::Mesh::CellTypes >(list_of(18))), cellTypesMultiArray[18]);
+
+    ::fwData::Mesh::CellDataOffsetsMultiArrayType cellDataOffsetsMultiArray = meshHelper.getCellDataOffsets();
+    CPPUNIT_ASSERT_EQUAL(*(cellDataOffsetArrayHelper.getItem< ::fwData::Mesh::CellDataOffsetType >(list_of(0))) , cellDataOffsetsMultiArray[0]);
+    CPPUNIT_ASSERT_EQUAL(*(cellDataOffsetArrayHelper.getItem< ::fwData::Mesh::CellDataOffsetType >(list_of(12))), cellDataOffsetsMultiArray[12]);
+    CPPUNIT_ASSERT_EQUAL(*(cellDataOffsetArrayHelper.getItem< ::fwData::Mesh::CellDataOffsetType >(list_of(18))), cellDataOffsetsMultiArray[18]);
+
+
+    ::fwData::Mesh::CellDataOffsetType offset0  = cellTypesMultiArray[0] ;
+    ::fwData::Mesh::CellDataOffsetType offset12 = cellTypesMultiArray[12];
+    ::fwData::Mesh::CellDataOffsetType offset18 = cellTypesMultiArray[18];
+
+    ::fwData::Mesh::CellDataMultiArrayType cellDataMultiArray = meshHelper.getCellData();
+    CPPUNIT_ASSERT_EQUAL(*(cellDataArrayHelper.getItem< ::fwData::Mesh::CellValueType >(list_of(offset0))) , cellDataMultiArray[offset0]);
+    CPPUNIT_ASSERT_EQUAL(*(cellDataArrayHelper.getItem< ::fwData::Mesh::CellValueType >(list_of(offset12))), cellDataMultiArray[offset12]);
+    CPPUNIT_ASSERT_EQUAL(*(cellDataArrayHelper.getItem< ::fwData::Mesh::CellValueType >(list_of(offset18))), cellDataMultiArray[offset18]);
+}
+
+//-----------------------------------------------------------------------------
+
+void MeshTest::copy()
+{
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    ::fwData::Mesh::sptr shallowCopyMesh = ::fwData::Mesh::New();
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    meshHelper.insertNextPoint(10, 20, 30);
+    meshHelper.insertNextPoint(10, 10, 10);
+    meshHelper.insertNextPoint(20, 20, 10);
+    meshHelper.insertNextPoint(30, 30, 10);
+    meshHelper.insertNextPoint(15, 20, 35);
+    meshHelper.insertNextPoint(20, 20, 10);
+    meshHelper.insertNextPoint(20, 63, 17);
+    meshHelper.insertNextPoint(27, 83, 52);
+
+    meshHelper.insertNextCell(1, 2);
+    meshHelper.insertNextCell(1, 3, 4);
+    meshHelper.insertNextCell(1, 2, 5, 4);
+
+    ::fwData::Mesh::CellValueType p[4] = {3, 6, 5, 1};
+    meshHelper.insertNextCell(::fwData::Mesh::QUAD, p, 4);
+
+    ::fwData::Mesh::CellValueType p2[6] = {1, 3, 5, 7, 2, 6};
+    meshHelper.insertNextCell(::fwData::Mesh::POLY, p2, 6);
+
+    ::fwData::Mesh::CellValueType p3[5] = {7, 2, 5, 4, 3};
+    meshHelper.insertNextCell(::fwData::Mesh::POLY, p3, 5);
+
+    mesh->allocatePointColors(::fwData::Mesh::RGBA);
+    meshHelper.updateLock();
+    ::fwData::Mesh::PointColorsMultiArrayType pointColorArray = meshHelper.getPointColors();
+
+    // check deep copy
+    ::fwData::Mesh::sptr deepCopyMesh;
+    deepCopyMesh = ::fwData::Object::copy(mesh);
+    ::fwComEd::helper::Mesh deepCopyMeshHelper(deepCopyMesh);
+
+    CPPUNIT_ASSERT_EQUAL(mesh->getNumberOfPoints(), deepCopyMesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL(mesh->getNumberOfCells() , deepCopyMesh->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellDataSize()  , deepCopyMesh->getCellDataSize());
+
+    CPPUNIT_ASSERT(mesh->getPointsArray()->getSize()          == deepCopyMesh->getPointsArray()->getSize());
+    CPPUNIT_ASSERT(mesh->getCellTypesArray()->getSize()       == deepCopyMesh->getCellTypesArray()->getSize());
+    CPPUNIT_ASSERT(mesh->getCellDataOffsetsArray()->getSize() == deepCopyMesh->getCellDataOffsetsArray()->getSize());
+    CPPUNIT_ASSERT(mesh->getCellDataArray()->getSize()        == deepCopyMesh->getCellDataArray()->getSize());
+    CPPUNIT_ASSERT(mesh->getPointColorsArray()->getSize()     == deepCopyMesh->getPointColorsArray()->getSize());
+
+    ::fwData::Mesh::PointsMultiArrayType meshPointArray = meshHelper.getPoints();
+    ::fwData::Mesh::PointsMultiArrayType deepCopyMeshPointArray = deepCopyMeshHelper.getPoints();
+
+    for (int i=0 ; i< mesh->getNumberOfPoints() ; i++)
+    {
+        for (int j=0 ; j < 3 ; j++)
+        {
+            CPPUNIT_ASSERT_EQUAL(meshPointArray[i][j], deepCopyMeshPointArray[i][j]);
+        }
+    }
+
+    //check shallow copy
+    shallowCopyMesh->shallowCopy(mesh);
+    CPPUNIT_ASSERT_EQUAL(mesh->getNumberOfPoints(), shallowCopyMesh->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL(mesh->getNumberOfCells() , shallowCopyMesh->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellDataSize()  , shallowCopyMesh->getCellDataSize());
+
+    CPPUNIT_ASSERT_EQUAL(mesh->getPointsArray()         , shallowCopyMesh->getPointsArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellTypesArray()      , shallowCopyMesh->getCellTypesArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellDataOffsetsArray(), shallowCopyMesh->getCellDataOffsetsArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellDataArray()       , shallowCopyMesh->getCellDataArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getPointColorsArray()    , shallowCopyMesh->getPointColorsArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getPointNormalsArray()   , shallowCopyMesh->getPointNormalsArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellColorsArray()     , shallowCopyMesh->getCellColorsArray());
+    CPPUNIT_ASSERT_EQUAL(mesh->getCellNormalsArray()    , shallowCopyMesh->getCellNormalsArray());
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/ModelTest.cpp b/SrcLib/core/fwData/test/tu/src/ModelTest.cpp
new file mode 100644
index 0000000..93c2154
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ModelTest.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Model.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Material.hpp>
+#include "ModelTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ModelTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ModelTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void ModelTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ModelTest::methode1()
+{
+    //-----------test values
+    ::fwData::TriangularMesh::sptr tri = ::fwData::TriangularMesh::New();
+    ::fwData::Material::sptr mat = ::fwData::Material::New();
+
+    ::fwData::Model::sptr model = ::fwData::Model::New();
+
+    model->getRefMap()[tri] = mat;
+
+    CPPUNIT_ASSERT(model->getRefMap().find(tri) != model->getRefMap().end());
+    CPPUNIT_ASSERT_EQUAL(model->getRefMap()[tri], mat);
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/ObjectTest.cpp b/SrcLib/core/fwData/test/tu/src/ObjectTest.cpp
new file mode 100644
index 0000000..b6bca1b
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ObjectTest.cpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+#include <fwData/Float.hpp>
+
+#include "ObjectTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ObjectTest );
+
+
+namespace fwData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ObjectTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectTest::fieldTest()
+{
+    const std::string FIELD_ID1 = "FIELD_ID1";
+    const std::string FIELD_ID2 = "FIELD_ID2";
+    const std::string FIELD_ID3 = "FIELD_ID3";
+
+    ::fwData::Object::sptr nullobj;
+    ::fwData::Object::sptr obj = ::fwData::Float::New();
+    ::fwData::Object::sptr fieldObj1 = ::fwData::Float::New();
+    ::fwData::Object::sptr fieldObj2 = ::fwData::Float::New();
+
+    CPPUNIT_ASSERT(obj->getFields().empty());
+
+    obj->setField(FIELD_ID1, fieldObj1);
+    CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID1), fieldObj1);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID2), nullobj);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID3), nullobj);
+
+    ::fwData::Object::FieldMapType localFields = obj->getFields();
+    ::fwData::Object::FieldMapType localFieldsBackup = obj->getFields();
+    localFields.insert( ::fwData::Object::FieldMapType::value_type(FIELD_ID2,fieldObj2));
+
+    CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID1), fieldObj1);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID2), nullobj);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID3), nullobj);
+
+    obj->updateFields(localFields);
+    CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(2));
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID1), fieldObj1);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID2), fieldObj2);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID3), nullobj);
+
+    ::fwData::Object::FieldNameVectorType refFieldNames;
+    refFieldNames.push_back(FIELD_ID1);
+    refFieldNames.push_back(FIELD_ID2);
+    ::fwData::Object::FieldNameVectorType fieldNames = obj->getFieldNames();
+    std::sort(fieldNames.begin(), fieldNames.end());
+    std::sort(refFieldNames.begin(), refFieldNames.end());
+    CPPUNIT_ASSERT(refFieldNames == fieldNames);
+
+    obj->setFields(localFieldsBackup);
+    CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID1), fieldObj1);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID2), nullobj);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID3), nullobj);
+
+    fieldNames = obj->getFieldNames();
+    refFieldNames.clear();
+    refFieldNames.push_back(FIELD_ID1);
+    CPPUNIT_ASSERT(refFieldNames == fieldNames);
+
+    obj->setField(FIELD_ID1, fieldObj2);
+    CPPUNIT_ASSERT_EQUAL(obj->getFields().size(), size_t(1));
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID1), fieldObj2);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID2), nullobj);
+    CPPUNIT_ASSERT_EQUAL(obj->getField(FIELD_ID3), nullobj);
+
+    obj->removeField(FIELD_ID1);
+    CPPUNIT_ASSERT(obj->getFields().empty());
+
+    ::fwData::Object::sptr defaultField = obj->setDefaultField(FIELD_ID1, fieldObj1);
+    CPPUNIT_ASSERT(defaultField == fieldObj1);
+
+    defaultField = obj->setDefaultField(FIELD_ID1, fieldObj2);
+    CPPUNIT_ASSERT(defaultField != fieldObj2);
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/ProcessObjectTest.cpp b/SrcLib/core/fwData/test/tu/src/ProcessObjectTest.cpp
new file mode 100644
index 0000000..ffd3bfe
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ProcessObjectTest.cpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/ProcessObject.hpp>
+#include "ProcessObjectTest.hpp"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ProcessObjectTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ProcessObjectTest::constructeur()
+{
+    const std::string IMAGEID1 = "myImage1";
+    const std::string IMAGEID2 = "myImage2";
+    const std::string FIELDID1 = "myField1";
+    const std::string FIELDID2 = "myField2";
+    ::fwData::Image::sptr image1 = ::fwData::Image::New();
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    ::fwData::Integer::sptr field1 = ::fwData::Integer::New(3);
+    ::fwData::Integer::sptr field2 = ::fwData::Integer::New(8);
+
+    // process
+    ::fwData::ProcessObject::sptr po = ::fwData::ProcessObject::New();
+    po->setInputValue(IMAGEID1, image1);
+    po->setInputValue(FIELDID1, field1);
+    po->setInputValue(FIELDID2, field2);
+    po->setOutputValue(IMAGEID2, image2);
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(image1, po->getInput< ::fwData::Image >(IMAGEID1));
+    CPPUNIT_ASSERT_EQUAL(field1, po->getInput< ::fwData::Integer >(FIELDID1));
+    CPPUNIT_ASSERT_EQUAL(field2, po->getInput< ::fwData::Integer >(FIELDID2));
+    CPPUNIT_ASSERT_EQUAL(image2, po->getOutput< ::fwData::Image >(IMAGEID2));
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/ROITraitsTest.cpp b/SrcLib/core/fwData/test/tu/src/ROITraitsTest.cpp
new file mode 100644
index 0000000..b0ae0cc
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ROITraitsTest.cpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/ROITraits.hpp>
+#include <fwData/StructureTraits.hpp>
+
+#include "ROITraitsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ROITraitsTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ROITraitsTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void ROITraitsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ROITraitsTest::creation()
+{
+    const std::string ID = "roiID";
+    const std::string EXP = "skin_0";
+    ::fwData::ROITraits::sptr roiTraits = ::fwData::ROITraits::New();
+    roiTraits->setIdentifier(ID);
+    ::fwData::StructureTraits::sptr structure = ::fwData::StructureTraits::New();
+    roiTraits->setStructureTraits(structure);
+    roiTraits->setEvaluatedExp(EXP);
+    ::fwData::Node::sptr opNode = ::fwData::Node::New();
+    roiTraits->setMaskOpNode(opNode);
+
+    CPPUNIT_ASSERT_EQUAL(ID, roiTraits->getRefIdentifier());
+    CPPUNIT_ASSERT_EQUAL(EXP, roiTraits->getEvaluatedExp());
+    CPPUNIT_ASSERT(structure == roiTraits->getStructureTraits() );
+    CPPUNIT_ASSERT(opNode == roiTraits->getMaskOpNode() );
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/ReconstructionTest.cpp b/SrcLib/core/fwData/test/tu/src/ReconstructionTest.cpp
new file mode 100644
index 0000000..80d7b87
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ReconstructionTest.cpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Reconstruction.hpp>
+#include "ReconstructionTest.hpp"
+
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ReconstructionTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ReconstructionTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTest::methode1() //test des setters et getters
+{
+    const bool ISVISIBLE        = true ;
+    const std::string CREFORGANNAME     = "OrganName" ;
+    const std::string CREFSTRUCTURETYPE     = "StructureType" ;
+
+    // process
+    ::fwData::Reconstruction::sptr p1 = ::fwData::Reconstruction::New();
+
+    p1->setIsVisible( ISVISIBLE );
+    p1->setCRefOrganName( CREFORGANNAME );
+    p1->setCRefStructureType( CREFSTRUCTURETYPE );
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(p1->getIsVisible(), ISVISIBLE);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefIsVisible(), ISVISIBLE);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefIsVisible(), ISVISIBLE);
+
+
+    CPPUNIT_ASSERT_EQUAL(p1->getOrganName(), CREFORGANNAME);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefOrganName(), CREFORGANNAME);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefOrganName(), CREFORGANNAME);
+
+    CPPUNIT_ASSERT_EQUAL(p1->getStructureType(), CREFSTRUCTURETYPE);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefStructureType(), CREFSTRUCTURETYPE);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefStructureType(), CREFSTRUCTURETYPE);
+
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTest::methode2()
+{
+    const bool ISVISIBLE        = true ;
+    const std::string CREFORGANNAME     = "OrganName" ;
+    const std::string CREFSTRUCTURETYPE     = "StructureType" ;
+
+    // process
+    ::fwData::Reconstruction::sptr p1 = ::fwData::Reconstruction::New();
+
+    p1->setCRefIsVisible( ISVISIBLE );
+    p1->setCRefOrganName( CREFORGANNAME );
+    p1->setCRefStructureType( CREFSTRUCTURETYPE );
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(p1->getIsVisible(), ISVISIBLE);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefIsVisible(), ISVISIBLE);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefIsVisible(), ISVISIBLE);
+
+
+    CPPUNIT_ASSERT_EQUAL(p1->getOrganName(), CREFORGANNAME);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefOrganName(), CREFORGANNAME);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefOrganName(), CREFORGANNAME);
+
+    CPPUNIT_ASSERT_EQUAL(p1->getStructureType(), CREFSTRUCTURETYPE);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefStructureType(), CREFSTRUCTURETYPE);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefStructureType(), CREFSTRUCTURETYPE);
+}
+
+//------------------------------------------------------------------------------
+
+void ReconstructionTest::image()
+{
+    ::fwData::Reconstruction::sptr p1 = ::fwData::Reconstruction::New();
+    ::fwData::Image::sptr i1(::fwData::Image::New()) ;
+
+    p1->setImage(i1) ;
+    CPPUNIT_ASSERT_EQUAL(p1->getImage(), i1 ) ;
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/ReconstructionTraitsTest.cpp b/SrcLib/core/fwData/test/tu/src/ReconstructionTraitsTest.cpp
new file mode 100644
index 0000000..d7a15c9
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/ReconstructionTraitsTest.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/ReconstructionTraits.hpp>
+#include <fwData/StructureTraits.hpp>
+
+#include "ReconstructionTraitsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::ReconstructionTraitsTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void ReconstructionTraitsTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void ReconstructionTraitsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ReconstructionTraitsTest::creation()
+{
+    const std::string ID = "roiID";
+    const std::string EXP = "skin_0";
+    ::fwData::ReconstructionTraits::sptr recTraits = ::fwData::ReconstructionTraits::New();
+    recTraits->setIdentifier(ID);
+    ::fwData::StructureTraits::sptr structure = ::fwData::StructureTraits::New();
+    recTraits->setStructureTraits(structure);
+
+    CPPUNIT_ASSERT(!recTraits->getMaskOpNode());
+    CPPUNIT_ASSERT(!recTraits->getMeshOpNode());
+
+    ::fwData::Node::sptr opMaskNode = ::fwData::Node::New();
+    recTraits->setMaskOpNode(opMaskNode);
+
+    ::fwData::Node::sptr opMeskNode = ::fwData::Node::New();
+    recTraits->setMeshOpNode(opMeskNode);
+
+    CPPUNIT_ASSERT_EQUAL(ID, recTraits->getRefIdentifier());
+    CPPUNIT_ASSERT(structure == recTraits->getStructureTraits() );
+    CPPUNIT_ASSERT(opMaskNode == recTraits->getMaskOpNode() );
+    CPPUNIT_ASSERT(opMeskNode == recTraits->getMeshOpNode() );
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/StringTest.cpp b/SrcLib/core/fwData/test/tu/src/StringTest.cpp
new file mode 100644
index 0000000..5365814
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/StringTest.cpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/String.hpp>
+#include "StringTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::StringTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void StringTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void StringTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void StringTest::methode1()
+{
+    const std::string VALUES[]  = { "", "chaine_caractere" };
+
+    BOOST_FOREACH ( std::string VALUE, VALUES )
+    {
+        ::fwData::String::sptr s0 = ::fwData::String::New();
+        s0->value() = VALUE;
+        ::fwData::String::sptr s1 = ::fwData::String::New( VALUE );
+
+        CPPUNIT_ASSERT_EQUAL( VALUE , s0->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE , s1->value() );
+        CPPUNIT_ASSERT_EQUAL( VALUE , ::fwData::String::New( VALUE )->value() );
+    }
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/StructureTraitsDictionaryTest.cpp b/SrcLib/core/fwData/test/tu/src/StructureTraitsDictionaryTest.cpp
new file mode 100644
index 0000000..b49495b
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/StructureTraitsDictionaryTest.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/StructureTraits.hpp>
+
+#include "StructureTraitsDictionaryTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::StructureTraitsDictionaryTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void StructureTraitsDictionaryTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void StructureTraitsDictionaryTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void StructureTraitsDictionaryTest::testAddingStructure()
+{
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    ::fwData::StructureTraits::sptr skin = ::fwData::StructureTraits::New();
+    std::string skinType = "Skin";
+    skin->setType(skinType);
+    skin->setClass(::fwData::StructureTraits::ENVIRONMENT);
+    ::fwData::Color::sptr skinColor = ::fwData::Color::New(255.0f/255.0f, 179.0f/255.0f, 140.0f/255.0f, 1.0f);
+    skin->setColor(skinColor);
+    ::fwData::StructureTraits::CategoryContainer skinCat(1);
+    skinCat[0] = ::fwData::StructureTraits::BODY;
+    skin->setCategories(skinCat);
+    CPPUNIT_ASSERT_EQUAL(skinType, skin->getType());
+    CPPUNIT_ASSERT_EQUAL(::fwData::StructureTraits::ENVIRONMENT, skin->getClass());
+    CPPUNIT_ASSERT(skinColor == skin->getColor());
+    CPPUNIT_ASSERT_NO_THROW(structDico->addStructure(skin));
+
+    ::fwData::StructureTraits::sptr liver = ::fwData::StructureTraits::New();
+    liver->setType("Liver");
+    liver->setClass(::fwData::StructureTraits::ORGAN);
+    liver->setColor(::fwData::Color::New(204.0f/255.0f, 51.0f/255.0f, 51.0f/255.0f, 1.0));
+    ::fwData::StructureTraits::CategoryContainer liverCat(1);
+    liverCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    liver->setCategories(liverCat);
+    std::string nativeExp = "inter(world(type(Skin)),not(class(Organ)))";
+    liver->setNativeExp(nativeExp);
+    CPPUNIT_ASSERT_EQUAL(nativeExp, liver->getNativeExp());
+    CPPUNIT_ASSERT_NO_THROW(structDico->addStructure(liver));
+
+    ::fwData::StructureTraits::sptr liverTumor = ::fwData::StructureTraits::New();
+    liverTumor->setType("Liver_Tumor");
+    liverTumor->setClass(::fwData::StructureTraits::LESION);
+    liverTumor->setColor(::fwData::Color::New(0.0f, 179.0f/255.0f, 0.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer liverTumorCat(1);
+    liverTumorCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    liverTumor->setCategories(liverTumorCat);
+    liverTumor->setAttachmentType("Liver");
+    CPPUNIT_ASSERT_NO_THROW(structDico->addStructure(liverTumor));
+
+    ::fwData::StructureTraits::sptr tumor = ::fwData::StructureTraits::New();
+    tumor->setType("Tumor");
+    tumor->setClass(::fwData::StructureTraits::LESION);
+    tumor->setColor(::fwData::Color::New(0.0f, 0.0f, 1.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer tumorCat(8);
+    tumorCat[0] = ::fwData::StructureTraits::BODY;
+    tumorCat[1] = ::fwData::StructureTraits::HEAD;
+    tumorCat[2] = ::fwData::StructureTraits::NECK;
+    tumorCat[3] = ::fwData::StructureTraits::THORAX;
+    tumorCat[4] = ::fwData::StructureTraits::ABDOMEN;
+    tumorCat[5] = ::fwData::StructureTraits::PELVIS;
+    tumorCat[6] = ::fwData::StructureTraits::ARM;
+    tumorCat[7] = ::fwData::StructureTraits::LEG;
+    tumor->setCategories(tumorCat);
+    CPPUNIT_ASSERT_NO_THROW(structDico->addStructure(tumor));
+
+
+    CPPUNIT_ASSERT(skin == structDico->getStructure("Skin"));
+    CPPUNIT_ASSERT(liver == structDico->getStructure("Liver"));
+    CPPUNIT_ASSERT(liverTumor == structDico->getStructure("Liver_Tumor"));
+
+    // check exception is raised if wrong structure
+    ::fwData::StructureTraits::sptr badClassStructure = ::fwData::StructureTraits::New();
+    badClassStructure->setType("my_structure");
+    badClassStructure->setClass(::fwData::StructureTraits::ORGAN);
+    badClassStructure->setColor(::fwData::Color::New(0.0f, 179.0f/255.0f, 0.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer structCat(1);
+    structCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    badClassStructure->setCategories(structCat);
+    badClassStructure->setAttachmentType("Liver");
+    CPPUNIT_ASSERT_THROW(structDico->addStructure(badClassStructure), ::fwCore::Exception);
+
+    ::fwData::StructureTraits::sptr badAttachmentStructure = ::fwData::StructureTraits::New();
+    badAttachmentStructure->setType("my_structure");
+    badAttachmentStructure->setClass(::fwData::StructureTraits::LESION);
+    badAttachmentStructure->setColor(::fwData::Color::New(0.0f, 179.0f/255.0f, 0.0f, 1.0f));
+    badAttachmentStructure->setCategories(structCat);
+    badAttachmentStructure->setAttachmentType("Unknown");
+    CPPUNIT_ASSERT_THROW(structDico->addStructure(badAttachmentStructure), ::fwCore::Exception);
+
+    // check exception is raised if structure already exist
+    ::fwData::StructureTraits::sptr liver2 = ::fwData::StructureTraits::New();
+    liver2->setType("Liver");
+    liver2->setClass(::fwData::StructureTraits::ORGAN);
+    liver2->setColor(::fwData::Color::New(204.0f/255.0f, 51.0f/255.0f, 51.0f/255.0f, 1.0));
+    ::fwData::StructureTraits::CategoryContainer liver2Cat(1);
+    liver2Cat[0] = ::fwData::StructureTraits::ABDOMEN;
+    liver2->setCategories(liver2Cat);
+    CPPUNIT_ASSERT_THROW(structDico->addStructure(liver2), ::fwCore::Exception);
+}
+
+} //namespace ut
+} //namespace fwData
diff --git a/SrcLib/core/fwData/test/tu/src/TransferFunctionTest.cpp b/SrcLib/core/fwData/test/tu/src/TransferFunctionTest.cpp
new file mode 100644
index 0000000..d5c9d63
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/TransferFunctionTest.cpp
@@ -0,0 +1,348 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwData/TransferFunction.hpp>
+#include <fwData/TransferFunction.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Color.hpp>
+
+#include "TransferFunctionTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::TransferFunctionTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void TransferFunctionTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void TransferFunctionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::constructorTest()
+{
+    // Expected value.
+    double expectedLevel = 0.0;
+    double expectedWindow = 100.0;
+    std::string expectedName = "";
+    TransferFunction::InterpolationMode expectedInterpolationMode = TransferFunction::LINEAR;
+    bool expectedIsClamped = true;
+    TransferFunction::TFColor expectedBackgroundColor = TransferFunction::TFColor();
+    size_t expectedSize = 0;
+
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong level ", expectedLevel, tf->getLevel(), 0.0);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong window", expectedWindow, tf->getWindow(), 0.0);
+
+    CPPUNIT_ASSERT_EQUAL(expectedName, tf->getName());
+    CPPUNIT_ASSERT_EQUAL(expectedInterpolationMode, tf->getInterpolationMode());
+    CPPUNIT_ASSERT_EQUAL(expectedIsClamped, tf->getIsClamped());
+    CPPUNIT_ASSERT(expectedBackgroundColor==tf->getBackgroundColor());
+    CPPUNIT_ASSERT_EQUAL(expectedSize, tf->getTFData().size());
+
+
+}
+
+//------------------------------------------------------------------------------
+void TransferFunctionTest::defaultTfTest()
+{
+    // Expected default value.
+    double expectedLevel = 0.0;
+    double expectedWindow = 100.0;
+
+    std::string expectedName = TransferFunction::s_DEFAULT_TF_NAME;
+    TransferFunction::InterpolationMode expectedInterpolationMode = TransferFunction::LINEAR;
+    bool expectedIsClamped = false;
+    TransferFunction::TFColor expectedBackgroundColor = TransferFunction::TFColor();
+    size_t expectedSize = 2;
+
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::createDefaultTF();
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong level ", expectedLevel, tf->getLevel(), 0.0);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong window", expectedWindow, tf->getWindow(), 0.0);
+
+    CPPUNIT_ASSERT_EQUAL(expectedName, tf->getName());
+    CPPUNIT_ASSERT_EQUAL(expectedInterpolationMode, tf->getInterpolationMode());
+    CPPUNIT_ASSERT_EQUAL(expectedIsClamped, tf->getIsClamped());
+    CPPUNIT_ASSERT(expectedBackgroundColor==tf->getBackgroundColor());
+    CPPUNIT_ASSERT_EQUAL(expectedSize, tf->getTFData().size());
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::classicGetSetTest()
+{
+    TransferFunction::TFColor expectedColor1(0.0, 0.0, 0.0, 0.0);
+    TransferFunction::TFColor expectedColor2(1.0, 1.0, 1.0, 1.0);
+    TransferFunction::TFValueType expectedKey1(0.0);
+    TransferFunction::TFValueType expectedKey2(1.0);
+
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::createDefaultTF();
+
+    // Test getTFData()
+    const TransferFunction::TFDataType& data = tf->getTFData();
+
+    TransferFunction::TFDataType::const_iterator itr = data.begin();
+    TransferFunction::TFValueType key1 =  itr->first;
+    TransferFunction::TFValueType key2 = (++itr)->first;
+
+    TransferFunction::TFDataType::const_iterator itrColor = data.begin();
+    TransferFunction::TFColor color1 = itrColor->second;
+    TransferFunction::TFColor color2 = (++itrColor)->second;
+
+    CPPUNIT_ASSERT(expectedKey1 == key1);
+    CPPUNIT_ASSERT(expectedKey2 == key2);
+
+    CPPUNIT_ASSERT(expectedColor1 == color1);
+    CPPUNIT_ASSERT(expectedColor2 == color2);
+
+    // Test getTFColor()
+    CPPUNIT_ASSERT(expectedColor1 == tf->getTFColor(key1));
+
+    // Test getTFValues()
+    TransferFunction::TFValueVectorType values = tf->getTFValues();
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong key value", expectedKey1 , values[0], 0.0);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong key value", expectedKey2 , values[1], 0.0);
+
+    // Test getTFColors()
+    TransferFunction::TFColorVectorType colors = tf->getTFColors();
+
+    CPPUNIT_ASSERT(expectedColor1 == colors[0]);
+    CPPUNIT_ASSERT(expectedColor2 ==  colors[1]);
+
+    // Test erase
+    tf->eraseTFValue( 1.0 );
+    CPPUNIT_ASSERT_EQUAL( (size_t)1, tf->getTFData().size() );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("Wrong key value", expectedKey1 , tf->getTFValues()[0], 0.0);
+
+    // Test clear()
+    tf->clear();
+    size_t expectedClearedSize = 0;
+    CPPUNIT_ASSERT_EQUAL(expectedClearedSize, tf->getTFData().size());
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::usingTfTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+
+    // -40.33 / -0.2 / 3 / 150
+    CPPUNIT_ASSERT_EQUAL( -40.33, tf->getNearestValue( -140.33 ) );
+    CPPUNIT_ASSERT_EQUAL( -40.33, tf->getNearestValue( -40.33 ) );
+    CPPUNIT_ASSERT_EQUAL( -40.33, tf->getNearestValue( -25 ) );
+    CPPUNIT_ASSERT_EQUAL( -0.2, tf->getNearestValue( -10.8 ) );
+    CPPUNIT_ASSERT_EQUAL( -0.2, tf->getNearestValue( -0.2 ) );
+    CPPUNIT_ASSERT_EQUAL( -0.2, tf->getNearestValue( 1.0 ) );
+    CPPUNIT_ASSERT_EQUAL( 3.0, tf->getNearestValue( 50 ) );
+    CPPUNIT_ASSERT_EQUAL( 3.0, tf->getNearestValue( 3 ) );
+    CPPUNIT_ASSERT_EQUAL( 150.0, tf->getNearestValue( 150 ) );
+    CPPUNIT_ASSERT_EQUAL( 150.0, tf->getNearestValue( 1000 ) );
+
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::shallowAndDeepCopyTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+    this->checkTFColor(tf);
+
+    ::fwData::TransferFunction::sptr deepCopyTf;
+    deepCopyTf = ::fwData::Object::copy( tf );
+    this->checkTFColor(deepCopyTf);
+
+    ::fwData::TransferFunction::sptr shallowCopyTf = ::fwData::TransferFunction::New();
+    shallowCopyTf->shallowCopy( tf );
+    this->checkTFColor(shallowCopyTf);
+}
+
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr TransferFunctionTest::createTFColor()
+{
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+
+    tf->setBackgroundColor( ::fwData::TransferFunction::TFColor( 1.0, 0.3, 0.6, 0.1) );
+    tf->setInterpolationMode( ::fwData::TransferFunction::NEAREST );
+    tf->setIsClamped( false );
+    tf->setLevel( 900.6 );
+    tf->setName( "TFColor" );
+    tf->setWindow( -200.02 );
+
+    tf->addTFColor( -40.33, ::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) );
+    tf->addTFColor( 3,      ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) ); // Invert point 3 <=> -0.2, for tests
+    tf->addTFColor( -0.2,   ::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) );
+    tf->addTFColor( 150,    ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) );
+
+    ::fwData::String::sptr myString = ::fwData::String::New("fieldStringValue");
+    tf->setField( "fieldStringKey", myString );
+
+    return tf;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::checkTFColor( ::fwData::TransferFunction::sptr tf )
+{
+
+    CPPUNIT_ASSERT( ::fwData::TransferFunction::TFColor( 1.0, 0.3, 0.6, 0.1) == tf->getBackgroundColor() );
+    CPPUNIT_ASSERT_EQUAL( ::fwData::TransferFunction::NEAREST, tf->getInterpolationMode() );
+    CPPUNIT_ASSERT_EQUAL( false, tf->getIsClamped() );
+    CPPUNIT_ASSERT_EQUAL( 900.6, tf->getLevel() );
+    CPPUNIT_ASSERT_EQUAL( std::string("TFColor"), tf->getName() );
+    CPPUNIT_ASSERT_EQUAL( -200.02, tf->getWindow() );
+
+    CPPUNIT_ASSERT_EQUAL( (size_t)4, tf->getTFData().size() );
+    CPPUNIT_ASSERT_EQUAL( -40.33, tf->getMinMaxTFValues().first );
+    CPPUNIT_ASSERT_EQUAL( 150.0, tf->getMinMaxTFValues().second );
+
+    const TransferFunction::TFValueVectorType & values = tf->getTFValues();
+    CPPUNIT_ASSERT_EQUAL( values[0] , -40.33  );
+    CPPUNIT_ASSERT_EQUAL( values[1] , -0.2    );
+    CPPUNIT_ASSERT_EQUAL( values[2] , 3.0      );
+    CPPUNIT_ASSERT_EQUAL( values[3] , 150.0     );
+
+    CPPUNIT_ASSERT( ::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getTFColor( -40.33 ) );
+    CPPUNIT_ASSERT( ::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getTFColor( -0.2   ) );
+    CPPUNIT_ASSERT( ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getTFColor( 3      ) );
+    CPPUNIT_ASSERT( ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getTFColor( 150    ) );
+
+
+
+    CPPUNIT_ASSERT_EQUAL( std::string("fieldStringValue"), ::fwData::String::dynamicCast( tf->getField( "fieldStringKey" ) )->value() );
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::setTFDataTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+
+    tf->clear();
+    ::fwData::TransferFunction::TFDataType tfData;
+    tfData[-40.33]  = ::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4 );
+    tfData[3]       = ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4 );
+    tfData[-0.2]    = ::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4 );
+    tfData[150]     = ::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9 );
+    tf->setTFData( tfData );
+
+    this->checkTFColor(tf);
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::linearColorTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+
+    // Value = -40.33 => color : {0.9, 0.2, 0.3, 0.4}
+    // Value = -0.2  => color : {0.1, 0.9, 0.3, 0.4}
+    // Value = 3     => color : {0.1, 0.2, 0.9, 0.4}
+    // Value = 150   => color : {0.1, 0.2, 0.3, 0.9}
+
+    tf->setIsClamped(true);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getLinearColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getLinearColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getLinearColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getLinearColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.6, 0.65) == tf->getLinearColor(((150.0-3.0)/2.0)+3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getLinearColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getLinearColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.75, 0.525) == tf->getLinearColor(((150.0-3.0)/4.0)+3) );
+
+    tf->setInterpolationMode(TransferFunction::LINEAR);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getInterpolatedColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getInterpolatedColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getInterpolatedColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getInterpolatedColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.6, 0.65) == tf->getInterpolatedColor(((150.0-3.0)/2.0)+3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getInterpolatedColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getInterpolatedColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.75, 0.525) == tf->getInterpolatedColor(((150.0-3.0)/4.0)+3) );
+
+    tf->setIsClamped(false);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getLinearColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getLinearColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getLinearColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getLinearColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.6, 0.65) == tf->getLinearColor(((150.0-3.0)/2.0)+3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getLinearColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getLinearColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.75, 0.525) == tf->getLinearColor(((150.0-3.0)/4.0)+3) );
+
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::nearestColorTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+
+    // Value = -40.33 => color : {0.9, 0.2, 0.3, 0.4}
+    // Value = -0.2  => color : {0.1, 0.9, 0.3, 0.4}
+    // Value = 3     => color : {0.1, 0.2, 0.9, 0.4}
+    // Value = 150   => color : {0.1, 0.2, 0.3, 0.9}
+
+    tf->setIsClamped(true);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getNearestColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getNearestColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getNearestColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getNearestColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getNearestColor(((150.0-3.0)/2.0)+3 + 0.1) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getNearestColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getNearestColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getNearestColor(((150.0-3.0)/4.0)+3) );
+
+    tf->setInterpolationMode(TransferFunction::NEAREST);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getInterpolatedColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.0, 0.0, 0.0, 0.0) == tf->getInterpolatedColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getInterpolatedColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getInterpolatedColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getInterpolatedColor(((150.0-3.0)/2.0)+3 + 0.1) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getInterpolatedColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getInterpolatedColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getInterpolatedColor(((150.0-3.0)/4.0)+3) );
+
+    tf->setIsClamped(false);
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getNearestColor(-120) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getNearestColor(200) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.9, 0.2, 0.3, 0.4) == tf->getNearestColor(-40.33) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getNearestColor(150) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.3, 0.9) == tf->getNearestColor(((150.0-3.0)/2.0)+3 + 0.1) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.9, 0.3, 0.4) == tf->getNearestColor(-0.2) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getNearestColor(3) );
+    CPPUNIT_ASSERT(::fwData::TransferFunction::TFColor( 0.1, 0.2, 0.9, 0.4) == tf->getNearestColor(((150.0-3.0)/4.0)+3) );
+
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/TransformationMatrix3DTest.cpp b/SrcLib/core/fwData/test/tu/src/TransformationMatrix3DTest.cpp
new file mode 100644
index 0000000..fc82d28
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/TransformationMatrix3DTest.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include "TransformationMatrix3DTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::TransformationMatrix3DTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void TransformationMatrix3DTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DTest::methode1()
+{
+    double COEFFICIENTS = 1 ;
+    // process
+    ::fwData::TransformationMatrix3D::sptr p1 = ::fwData::TransformationMatrix3D::New();
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(p1->getCoefficients().back(),  COEFFICIENTS);
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefCoefficients().back(),  COEFFICIENTS);
+    CPPUNIT_ASSERT_EQUAL(p1->getRefCoefficients().back(),   COEFFICIENTS);
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DTest::methode2()
+{
+    double COEFFICIENTS = 4 ;
+    std::vector<double> VECTORCOEFFICIENTS ;
+    VECTORCOEFFICIENTS.push_back( COEFFICIENTS ) ;
+
+    // process
+    ::fwData::TransformationMatrix3D::sptr p1 = ::fwData::TransformationMatrix3D::New();
+    p1->setCRefCoefficients(VECTORCOEFFICIENTS) ;
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(p1->getCoefficients().back(),  COEFFICIENTS) ;
+    CPPUNIT_ASSERT_EQUAL(p1->getCRefCoefficients().back(),  COEFFICIENTS) ;
+    CPPUNIT_ASSERT_EQUAL(p1->getRefCoefficients().back(),   COEFFICIENTS) ;
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwData/test/tu/src/VideoTest.cpp b/SrcLib/core/fwData/test/tu/src/VideoTest.cpp
new file mode 100644
index 0000000..fd00090
--- /dev/null
+++ b/SrcLib/core/fwData/test/tu/src/VideoTest.cpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Video.hpp>
+#include "VideoTest.hpp"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwData::ut::VideoTest );
+
+namespace fwData
+{
+namespace ut
+{
+
+void VideoTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void VideoTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void VideoTest::methode1()
+{
+    ::boost::uint32_t VALUE   = 0 ;
+    ::boost::uint8_t VALUE1   = 1 ;
+
+    // process
+    ::fwData::Video::sptr video = ::fwData::Video::New();
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(video->getXSize(), VALUE);
+    CPPUNIT_ASSERT_EQUAL(video->getYSize(), VALUE);
+    CPPUNIT_ASSERT_EQUAL(video->getBPP(),  VALUE1);
+}
+
+} //namespace ut
+} //namespace fwData
+
diff --git a/SrcLib/core/fwDataCamp/CMakeLists.txt b/SrcLib/core/fwDataCamp/CMakeLists.txt
new file mode 100644
index 0000000..e25dfaa
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwCamp
+    fwCore
+    fwData
+    fwMedData
+    fwMemory
+    )
+
+
diff --git a/SrcLib/core/fwDataCamp/Properties.cmake b/SrcLib/core/fwDataCamp/Properties.cmake
new file mode 100644
index 0000000..2f0e626
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataCamp )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCamp fwCore fwData fwMedData fwMemory )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataCamp/bin/build.options b/SrcLib/core/fwDataCamp/bin/build.options
new file mode 100644
index 0000000..23a7057
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/bin/build.options
@@ -0,0 +1,3 @@
+TYPE = 'shared'
+VERSION = '0.1'
+LIB = ['fwCamp_0-1', 'fwData_0-1', 'fwMedData_0-1','fwMemory_0-1']
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Array.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Array.hpp
new file mode 100644
index 0000000..e79468e
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Array.hpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_ARRAY_HPP__
+#define __FWDATACAMP_ARRAY_HPP__
+
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Array.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Array), (fwMemory)(BufferObject));
+
+#endif /* __FWDATACAMP_ARRAY_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Camera.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Camera.hpp
new file mode 100644
index 0000000..b6a1d61
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Camera.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_CAMERA_HPP__
+#define __FWDATACAMP_CAMERA_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Camera.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Camera), (fwData)(TransformationMatrix3D));
+
+#endif /* __FWDATACAMP_CAMERA_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Image.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Image.hpp
new file mode 100644
index 0000000..a519d04
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Image.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_IMAGE_HPP__
+#define __FWDATACAMP_IMAGE_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Image), (fwData)(Array));
+
+#endif /* __FWDATACAMP_IMAGE_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Line.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Line.hpp
new file mode 100644
index 0000000..dfa88d6
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Line.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_LINE_HPP__
+#define __FWDATACAMP_LINE_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Line.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Line), (fwData)(Point));
+
+#endif /* __FWDATACAMP_LINE_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Material.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Material.hpp
new file mode 100644
index 0000000..a825ff8
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Material.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_MATERIAL_HPP__
+#define __FWDATACAMP_MATERIAL_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Material.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampAutoDeclareEnumMacro((fwData)(Material)(SHADING_MODE));
+fwCampAutoDeclareEnumMacro((fwData)(Material)(REPRESENTATION_MODE));
+fwCampAutoDeclareEnumMacro((fwData)(Material)(OPTIONS_MODE));
+
+fwCampDeclareAccessor((fwData)(Material), (fwData)(Color));
+
+#endif /* __FWDATACAMP_MATERIAL_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Mesh.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Mesh.hpp
new file mode 100644
index 0000000..96db582
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Mesh.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_MESH_HPP__
+#define __FWDATACAMP_MESH_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Mesh.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Mesh), (fwData)(Array));
+
+#endif /* __FWDATACAMP_MESH_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Node.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Node.hpp
new file mode 100644
index 0000000..1604fe4
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Node.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_NODE_HPP__
+#define __FWDATACAMP_NODE_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Node.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Node), (fwData)(Object));
+
+#endif /* __FWDATACAMP_NODE_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/ROITraits.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/ROITraits.hpp
new file mode 100644
index 0000000..8db88b4
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/ROITraits.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_ROITRAITS_HPP__
+#define __FWDATACAMP_ROITRAITS_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/ROITraits.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(ROITraits),(fwData)(StructureTraits));
+fwCampDeclareAccessor((fwData)(ROITraits),(fwData)(Node));
+
+#endif /* __FWDATACAMP_ROITRAITS_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Reconstruction.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Reconstruction.hpp
new file mode 100644
index 0000000..2519436
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Reconstruction.hpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_RECONSTRUCTION_HPP__
+#define __FWDATACAMP_RECONSTRUCTION_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Reconstruction), (fwData)(Mesh));
+fwCampDeclareAccessor((fwData)(Reconstruction), (fwData)(Image));
+fwCampDeclareAccessor((fwData)(Reconstruction), (fwData)(Material));
+
+#endif /* __FWDATACAMP_RECONSTRUCTION_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/ReconstructionTraits.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/ReconstructionTraits.hpp
new file mode 100644
index 0000000..6635d93
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/ReconstructionTraits.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_RECONSTRUCTIONTRAITS_HPP__
+#define __FWDATACAMP_RECONSTRUCTIONTRAITS_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/ReconstructionTraits.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(ReconstructionTraits),(fwData)(StructureTraits));
+fwCampDeclareAccessor((fwData)(ReconstructionTraits),(fwData)(Node));
+
+#endif /* __FWDATACAMP_RECONSTRUCTIONTRAITS_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Resection.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Resection.hpp
new file mode 100644
index 0000000..e10d703
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Resection.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_RESECTION_HPP__
+#define __FWDATACAMP_RESECTION_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Resection.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Resection), (fwData)(PlaneList));
+
+#endif /* __FWDATACAMP_RESECTION_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/ResectionDB.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/ResectionDB.hpp
new file mode 100644
index 0000000..91b1977
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/ResectionDB.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_RESECTIONDB_HPP__
+#define __FWDATACAMP_RESECTIONDB_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/ResectionDB.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(ResectionDB), (fwData)(Resection));
+
+#endif /* __FWDATACAMP_RESECTIONDB_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/StructureTraits.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/StructureTraits.hpp
new file mode 100644
index 0000000..116644d
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/StructureTraits.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_STRUCTURETRAITS_HPP__
+#define __FWDATACAMP_STRUCTURETRAITS_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/StructureTraits.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampAutoDeclareEnumMacro((fwData)(StructureTraits)(Category));
+fwCampAutoDeclareEnumMacro((fwData)(StructureTraits)(StructureClass));
+
+fwCampDeclareAccessor((fwData)(StructureTraits), (fwData)(Color));
+
+#endif /* __FWDATACAMP_STRUCTURETRAITS_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Tag.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Tag.hpp
new file mode 100644
index 0000000..98e9ad9
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Tag.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_TAG_HPP__
+#define __FWDATACAMP_TAG_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Tag.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Tag), (fwData)(PointList));
+
+#endif /* __FWDATACAMP_TAG_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/TransferFunction.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/TransferFunction.hpp
new file mode 100644
index 0000000..608eb85
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/TransferFunction.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_TRANSFERFUNCTION_HPP__
+#define __FWDATACAMP_TRANSFERFUNCTION_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampAutoDeclareEnumMacro((fwData)(TransferFunction)(InterpolationMode));
+
+#endif /* __FWDATACAMP_TRANSFERFUNCTION_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Version.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Version.hpp
new file mode 100644
index 0000000..5d85e36
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Version.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_VERSION_HPP__
+#define __FWDATACAMP_VERSION_HPP__
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwDataCamp
+{
+/// Class to manage fwDataCamp version
+struct Version
+{
+    FWDATACAMP_API static const int s_CURRENT_VERSION;
+};
+}
+
+#endif // __FWDATACAMP_VERSION_HPP__
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/Video.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/Video.hpp
new file mode 100644
index 0000000..76ef0af
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/Video.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_VIDEO_HPP__
+#define __FWDATACAMP_VIDEO_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwData/Video.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwData)(Video), (fwData)(Camera));
+
+#endif /* __FWDATACAMP_VIDEO_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/autoload.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/autoload.hpp
new file mode 100644
index 0000000..6feea48
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/autoload.hpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_AUTOLOAD_HPP__
+#define __FWDATACAMP_AUTOLOAD_HPP__
+
+#include <fwCamp/macros.hpp>
+
+
+#include <fwData/Array.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/Camera.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Edge.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Graph.hpp>
+#include <fwData/Histogram.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Line.hpp>
+#include <fwData/List.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Model.hpp>
+#include <fwData/Plane.hpp>
+#include <fwData/PlaneList.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Port.hpp>
+#include <fwData/ProcessObject.hpp>
+#include <fwData/ROITraits.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/ReconstructionTraits.hpp>
+#include <fwData/Resection.hpp>
+#include <fwData/ResectionDB.hpp>
+#include <fwData/String.hpp>
+#include <fwData/StructureTraits.hpp>
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/Tag.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Vector.hpp>
+#include <fwData/Video.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataCamp/Material.hpp"
+#include "fwDataCamp/StructureTraits.hpp"
+#include "fwDataCamp/TransferFunction.hpp"
+
+
+namespace fwDataCamp
+{
+
+struct runner
+{
+    runner()
+    {
+        localDeclarefwDataObject();
+        localDeclarefwDataFloat();
+        localDeclarefwDataInteger();
+        localDeclarefwDataBoolean();
+        localDeclarefwDataString();
+        localDeclarefwDataVector();
+        localDeclarefwDataColor();
+        localDeclarefwDataArray();
+        localDeclarefwDataImage();
+        localDeclarefwDataMesh();
+        localDeclarefwDataMaterialOPTIONS_MODE();
+        localDeclarefwDataMaterialREPRESENTATION_MODE();
+        localDeclarefwDataMaterialSHADING_MODE();
+        localDeclarefwDataMaterial();
+        localDeclarefwDataReconstruction();
+        localDeclarefwDataComposite();
+        localDeclarefwDataPoint();
+        localDeclarefwDataPointList();
+        localDeclarefwDataTransformationMatrix3D();
+        localDeclarefwDataTransferFunctionInterpolationMode();
+        localDeclarefwDataTransferFunction();
+        localDeclarefwDataPort();
+        localDeclarefwDataEdge();
+        localDeclarefwDataNode();
+        localDeclarefwDataGraph();
+        localDeclarefwDataStructureTraitsCategory();
+        localDeclarefwDataStructureTraitsStructureClass();
+        localDeclarefwDataStructureTraits();
+        localDeclarefwDataStructureTraitsDictionary();
+        localDeclarefwDataReconstructionTraits();
+        localDeclarefwDataROITraits();
+        localDeclarefwDatalocationFolder();
+        localDeclarefwDataPlane();
+        localDeclarefwDataPlaneList();
+        localDeclarefwDataResection();
+        localDeclarefwDataResectionDB();
+        localDeclarefwDataCamera();
+        localDeclarefwDataHistogram();
+        localDeclarefwDataLine();
+        localDeclarefwDataList();
+        localDeclarefwDatalocationSingleFile();
+        localDeclarefwDataModel();
+        localDeclarefwDataProcessObject();
+        localDeclarefwDataTag();
+        localDeclarefwDataVideo();
+    }
+
+    static runner r;
+};
+} //end namespace fwDataCamp
+
+
+
+#endif //__FWDATACAMP_AUTOLOAD_HPP__
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/config.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/config.hpp
new file mode 100644
index 0000000..7d982c4
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/config.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATACAMP_CONFIG_HPP_
+#define _FWDATACAMP_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWDATACAMP_EXPORTS
+            #define FWDATACAMP_API __declspec(dllexport)
+             #define FWDATACAMP_TEMPLATE_API extern "C++"
+        #else
+            #define FWDATACAMP_API __declspec(dllimport)
+            #define FWDATACAMP_TEMPLATE_API extern "C++"
+        #endif
+
+        #define FWDATACAMP_CLASS_API
+        
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWDATACAMP_EXPORTS
+            #define FWDATACAMP_API __attribute__ ((visibility("default")))
+            #define FWDATACAMP_CLASS_API __attribute__ ((visibility("default")))
+            #define FWDATACAMP_TEMPLATE_API extern "C++"
+        #else
+            #define FWDATACAMP_API __attribute__ ((visibility("hidden")))
+            #define FWDATACAMP_CLASS_API __attribute__ ((visibility("hidden")))
+            #define FWDATACAMP_TEMPLATE_API extern "C++"
+        #endif
+
+    #else
+
+        #define FWDATACAMP_API
+        #define FWDATACAMP_CLASS_API
+        #define FWDATACAMP_TEMPLATE_API extern "C++"
+
+    #endif
+
+#endif //FWDATACAMP_API
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/NullPointer.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/NullPointer.hpp
new file mode 100644
index 0000000..bf4c469
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/NullPointer.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_EXCEPTION_NULLPOINTER_HPP__
+#define __FWDATACAMP_EXCEPTION_NULLPOINTER_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwDataCamp
+{
+
+namespace exception
+{
+
+/// Null pointer exception.
+struct NullPointer : ::fwCore::Exception
+{
+    FWDATACAMP_API NullPointer ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwDataCamp
+
+#endif /* __FWDATACAMP_EXCEPTION_NULLPOINTER_HPP__ */
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/ObjectNotFound.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/ObjectNotFound.hpp
new file mode 100644
index 0000000..f958b75
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/exception/ObjectNotFound.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_EXCEPTION_OBJECTNOTFOUND_HPP__
+#define __FWDATACAMP_EXCEPTION_OBJECTNOTFOUND_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwDataCamp
+{
+
+namespace exception
+{
+
+/// Object not found exception.
+struct ObjectNotFound : ::fwCore::Exception
+{
+    FWDATACAMP_API ObjectNotFound ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwDataCamp
+
+#endif /* __FWDATACAMP_EXCEPTION_OBJECTNOTFOUND_HPP__ */
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/getObject.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/getObject.hpp
new file mode 100644
index 0000000..e3668c1
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/getObject.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWDATACAMP_GETOBJECT_HPP__
+#define  __FWDATACAMP_GETOBJECT_HPP__
+
+#include <string>
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwDataCamp
+{
+
+/**
+ * @brief Returns the object designated by the given path within given object.
+ *
+ * @param object object to visit
+ * @param path path of desired object
+ * @param raiseException raise exceptions if set to true
+ *
+ * @throw ::fwDataCamp::exception::NullPointer
+ * @throw ::fwDataCamp::exception::ObjectNotFound
+ */
+FWDATACAMP_API SPTR(::fwData::Object) getObject( SPTR(::fwData::Object) object,
+                                                          const std::string & path,
+                                                          bool raiseException = false);
+
+/**
+ * @see fwDataCamp.getObject
+ */
+template< class DATATYPE >
+SPTR(DATATYPE) getObject( SPTR(::fwData::Object) object,
+                             const std::string & path,
+                             bool raiseException = false )
+{
+    SPTR(::fwData::Object) subObject = getObject( object, path, raiseException );
+    SPTR(DATATYPE) casteDdata = ::boost::dynamic_pointer_cast<DATATYPE>( subObject );
+    return casteDdata;
+}
+
+
+} // namespace fwDataCamp
+
+#endif // __FWDATACAMP_GETOBJECT_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/namespace.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/namespace.hpp
new file mode 100644
index 0000000..7bd4968
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/namespace.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef __FWDATACAMP_NAMESPACE_HPP__
+#define __FWDATACAMP_NAMESPACE_HPP__
+
+
+/**
+ * @brief This namespace contains data object descriptions used for introspection.
+ * @namespace fwDataCamp
+ * @date 2012-2013.
+ */
+namespace fwDataCamp
+{
+
+/**
+ * @brief This namespace contains exceptions related to data objects introspection.
+ */
+namespace exception
+{
+}
+
+/**
+ * @brief This namespace contains visitors used to perform various operations with data objects.
+ */
+namespace visitor
+{
+}
+
+}
+
+#endif /* __FWDATACAMP_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/CompareObjects.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/CompareObjects.hpp
new file mode 100644
index 0000000..2142d50
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/CompareObjects.hpp
@@ -0,0 +1,150 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWDATACAMP_VISITOR_COMPAREOBJECTS_HPP__
+#define  __FWDATACAMP_VISITOR_COMPAREOBJECTS_HPP__
+
+#include <fwCore/macros.hpp>
+#include <fwCore/Exception.hpp>
+
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+/**
+ * @class   CompareObjects
+ * @brief   Visitor used to compare two objects.
+ * @date    2013.
+ */
+class FWDATACAMP_CLASS_API CompareObjects : public ::camp::ExtendedClassVisitor
+{
+
+public:
+
+    /// Associates property path (within its parent object) to its value.
+    typedef std::map< std::string, std::string > PropsMapType;
+
+    /**
+     * @brief Constructor.
+     */
+    FWDATACAMP_API CompareObjects();
+
+    FWDATACAMP_API virtual ~CompareObjects();
+
+    /**
+     * @name Introspection methods implementation
+     * @{ */
+    FWDATACAMP_API void visit(const camp::SimpleProperty& property);
+    FWDATACAMP_API void visit(const camp::EnumProperty& property);
+    FWDATACAMP_API void visit(const camp::UserProperty& property);
+    FWDATACAMP_API void visit(const camp::ArrayProperty& property);
+    FWDATACAMP_API void visit(const camp::Function& function);
+    FWDATACAMP_API virtual void visit(const camp::MapProperty& property);
+    /**  @} */
+
+    /// Returns the reference object.
+    SPTR(::fwData::Object) getReferenceObject() const
+    { return m_objRef; }
+
+    /// Returns the compared object.
+    SPTR(::fwData::Object) getComparedObject() const
+    { return m_objComp; }
+
+    /// Returns reference object properties.
+    const PropsMapType& getReferenceProps() const
+    { return m_propsRef; }
+
+    /// Returns compared object properties.
+    const PropsMapType& getComparedProps() const
+    { return m_propsComp; }
+
+    /**
+     * @brief Returns the differences found between comparison of reference and compared objects.
+     *
+     * @return a map using property path within object as key, and associated value found in
+     * compared object as value.
+     */
+    SPTR(PropsMapType) getDifferences() const
+    { return m_props; }
+
+    /**
+     * @brief Process to the comparison between reference object and compared object.
+     * When the process completes, the differences found between the objects are accessible
+     * through ComparedObjects.getDifferences().
+     *
+     * @param objRef data object marked as reference object in comparison
+     * @param objComp data object marked as compared object to reference object
+     *
+     * @return a map containing the differences found between objects
+     *
+     * @throw ::fwCore::Exception if classnames of reference and compared objects are different
+     */
+    FWDATACAMP_API void compare(
+            SPTR(::fwData::Object) objRef, SPTR(::fwData::Object) objComp)
+        throw(::fwCore::Exception);
+
+    /// Property value for differences map meaning a missing property.
+    FWDATACAMP_API static const std::string s_MISSING_PROPERTY;
+
+private:
+
+    friend struct PropertyVisitor;
+
+    /**
+     * @brief Constructor used for child data objects introspection.
+     *
+     * @param obj child data object representation in Camp world
+     * @param prefix path within parent object where then child object is found
+     * @param props properties map of parent object to complete with child ones
+     */
+    CompareObjects(
+            const ::camp::UserObject& obj,
+            const std::string& prefix,
+            SPTR(PropsMapType) props = SPTR(PropsMapType)(new PropsMapType));
+
+    /// Returns the path of the given property within object.
+    std::string getPath(const std::string& property) const;
+
+    /// Reference object properties.
+    PropsMapType  m_propsRef;
+
+    /// Compared object properties.
+    PropsMapType  m_propsComp;
+
+    /// Reflection in camp world of currently introspected object
+    ::camp::UserObject m_campObj;
+
+    /// Prefix used to identify child objects.
+    std::string m_prefix;
+
+    /// Differences found between reference and compared object.
+    SPTR(PropsMapType) m_props;
+
+    /// Reference object.
+    SPTR(::fwData::Object) m_objRef;
+
+    /// Object to be compared with m_objRef.
+    SPTR(::fwData::Object) m_objComp;
+
+};
+
+} // namespace visitor
+
+} // namespace fwDataCamp
+
+#endif // __FWDATACAMP_VISITOR_COMPAREOBJECTS_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/GetObject.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/GetObject.hpp
new file mode 100644
index 0000000..c3af548
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/GetObject.hpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWDATACAMP_VISITOR_GETOBJECT_HPP__
+#define  __FWDATACAMP_VISITOR_GETOBJECT_HPP__
+
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+/**
+ * @brief Check if object introspection process mathes a given path. 
+ */
+struct PathVisitor
+{
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef ::boost::shared_ptr<PathVisitor> sptr;
+    typedef std::vector<std::string> ObjectsNamesType;
+    /**  @} */
+
+    /**
+     * @brief Constructor.
+     *
+     * @param path 
+     */
+    PathVisitor(const std::string& path)
+    {
+        ::boost::split( m_vectObj, path, ::boost::is_any_of("."));
+    }
+
+    /**
+     * @brief Appends the path elements of the given path visitor.
+     */
+    void merge(PathVisitor::sptr pathVisitor)
+    {
+        const ObjectsNamesType& vectObjFound =  pathVisitor->m_vectObjFound;
+        m_vectObjFound.reserve(m_vectObjFound.size() + vectObjFound.size());
+        m_vectObjFound.insert(m_vectObjFound.end(), vectObjFound.begin(), vectObjFound.end());
+    }
+
+    /// Appends a path element.
+    void addObject(const std::string& objPath)
+    {
+        m_vectObjFound.push_back(objPath);
+    }
+
+    /// Returns true if all path elements were found during an introspection process.
+    bool allObjectsFound() const
+    {
+        return m_vectObj == m_vectObjFound;
+    }
+
+private:
+
+    /// Path elements to introspect.
+    ObjectsNamesType m_vectObj;
+
+    /// Introspected path elements.
+    ObjectsNamesType m_vectObjFound;
+
+};
+
+/**
+ * @class   GetObject
+ * @brief   This class is an helper to introspect a data and find an object (contained into this data) from a normalized path.
+ *
+ * @date    2013.
+ */
+class FWDATACAMP_CLASS_API GetObject : public ::camp::ExtendedClassVisitor
+{
+
+public:
+
+    /**
+     * @brief Constructor.
+     *
+     * @param object data object containing child object to retrieve
+     * @param subObjPath normalized path targeting child object to retrieve
+     */
+    FWDATACAMP_API GetObject( ::fwData::Object::sptr object, const std::string & subObjPath );
+
+    FWDATACAMP_API virtual ~GetObject();
+
+    /**
+     * @name Introspection methods implementation
+     * @{ */
+    FWDATACAMP_API void visit(const camp::SimpleProperty& property);
+    FWDATACAMP_API void visit(const camp::EnumProperty& property);
+    FWDATACAMP_API void visit(const camp::UserProperty& property);
+    FWDATACAMP_API void visit(const camp::ArrayProperty& property);
+    FWDATACAMP_API void visit(const camp::Function& function);
+    FWDATACAMP_API virtual void visit(const camp::MapProperty& property);
+    /**  @} */
+
+    /// Launches visit process and returns the object designated by m_subObjPath
+    FWDATACAMP_API ::fwData::Object::sptr get();
+
+    /**
+     * @brief Returns true if introspection process matched child object path.
+     */
+    FWDATACAMP_API bool objectsFound() const;
+
+    /**
+     * @brief Returns pointer to associated path visitor.
+     */
+    PathVisitor::sptr getPathVisitor() const
+    {
+        return m_pathVisitor;
+    }
+
+private :
+
+    /*
+     * @brief Parses m_newSubObjPath, returns the substring until the first dot ( property name, key map or
+     * index array ) and updates m_newSubObjPath.
+     */
+    std::string getNextPropertyName();
+
+    /// Object given in constructor which will introspected
+    ::fwData::Object::sptr m_object;
+
+    /// Path of final object wanted from m_object
+    const std::string m_subObjPath;
+
+    /// Path of final object wanted from m_object without first property name
+    std::string m_newSubObjPath;
+
+    /// First m_object property wanted
+    std::string m_propertyName;
+
+    /// Reflection in camp world of m_object
+    ::camp::UserObject m_campObj;
+
+    /// Object retrieve after introspection
+    ::fwData::Object::sptr m_subObject;
+
+protected:
+
+    /// Path visitor.
+    PathVisitor::sptr m_pathVisitor;
+
+};
+
+} // namespace visitor
+
+} // namespace fwDataCamp
+
+#endif // __FWDATACAMP_VISITOR_GETOBJECT_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/RecursiveLock.hpp b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/RecursiveLock.hpp
new file mode 100644
index 0000000..1be5cf8
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwDataCamp/visitor/RecursiveLock.hpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  __FWDATACAMP_VISITOR_RECURSIVELOCK_HPP__
+#define  __FWDATACAMP_VISITOR_RECURSIVELOCK_HPP__
+
+#include <vector>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwCamp/camp/ExtendedClassVisitor.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+namespace fwData
+{
+    class Object;
+
+    namespace mt
+    {
+        class ObjectReadLock;
+    }
+}
+
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+/**
+ * @class   RecursiveLock
+ * @brief   This class is an helper to lock an object and all its children recursively.
+ *
+ * @date    2013.
+ */
+class FWDATACAMP_CLASS_API RecursiveLock : public ::camp::ExtendedClassVisitor
+{
+
+public:
+
+    /**
+     * @brief Container definition dedicated to object locks storage.
+     */
+    typedef std::vector< SPTR(::fwCore::mt::ReadLock) > LockVectType;
+
+    /**
+     * @brief Constructor.
+     * Creates a recursive lock onto the given object and recursively locks it.
+     * This recursive lock can be built using a given container of previously acquired locks.
+     *
+     * @param object data object (containing child data objects) to lock recursively
+     * @param locks container of previously acquired locks
+     */
+    FWDATACAMP_API RecursiveLock( SPTR(::fwData::Object) object,
+                                  SPTR(LockVectType) locks = SPTR(LockVectType)(new LockVectType()));
+
+    FWDATACAMP_API virtual ~RecursiveLock();
+
+    /**
+     * @name Introspection methods implementation
+     * @{ */
+    FWDATACAMP_API void visit(const camp::SimpleProperty& property);
+    FWDATACAMP_API void visit(const camp::EnumProperty& property);
+    FWDATACAMP_API void visit(const camp::UserProperty& property);
+    FWDATACAMP_API void visit(const camp::ArrayProperty& property);
+    FWDATACAMP_API void visit(const camp::Function& function);
+    FWDATACAMP_API virtual void visit(const camp::MapProperty& property);
+    /**  @} */
+
+private :
+
+    /// Locks associated object recursively (called by constructor).
+    void lock();
+
+    /// Object given in constructor which will introspected
+    SPTR(::fwData::Object) m_object;
+
+    /// Container of acquired locks.
+    SPTR(LockVectType) m_locks;
+
+    /// Reflection in camp world of m_object
+    ::camp::UserObject m_campObj;
+
+
+};
+
+} // namespace visitor
+
+} // namespace fwDataCamp
+
+#endif // __FWDATACAMP_VISITOR_RECURSIVELOCK_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ActivitySeries.hpp b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ActivitySeries.hpp
new file mode 100644
index 0000000..d4a98bb
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ActivitySeries.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_ACTIVITYSERIES_HPP__
+#define __FWMEDDATACAMP_ACTIVITYSERIES_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwMedData)(ActivitySeries), (fwData)(Composite));
+
+#endif /* __FWMEDDATACAMP_ACTIVITYSERIES_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ImageSeries.hpp b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ImageSeries.hpp
new file mode 100644
index 0000000..28bf7af
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/ImageSeries.hpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_IMAGESERIES_HPP__
+#define __FWMEDDATACAMP_IMAGESERIES_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwMedData)(ImageSeries), (fwData)(Image));
+
+#endif /* __FWMEDDATACAMP_IMAGESERIES_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwMedDataCamp/Series.hpp b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/Series.hpp
new file mode 100644
index 0000000..9ad9c41
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/Series.hpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_SERIES_HPP__
+#define __FWMEDDATACAMP_SERIES_HPP__
+
+#include <fwCamp/macros.hpp>
+#include <fwMedData/Series.hpp>
+
+#include "fwDataCamp/config.hpp"
+
+fwCampDeclareAccessor((fwMedData)(Series), (fwMedData)(Patient));
+fwCampDeclareAccessor((fwMedData)(Series), (fwMedData)(Study));
+fwCampDeclareAccessor((fwMedData)(Series), (fwMedData)(Equipment));
+
+#endif /* __FWMEDDATACAMP_SERIES_HPP__ */
diff --git a/SrcLib/core/fwDataCamp/include/fwMedDataCamp/autoload.hpp b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/autoload.hpp
new file mode 100644
index 0000000..9c46805
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/include/fwMedDataCamp/autoload.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_AUTOLOAD_HPP__
+#define __FWMEDDATACAMP_AUTOLOAD_HPP__
+
+#include <fwCamp/macros.hpp>
+
+
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Study.hpp>
+
+
+namespace fwMedDataCamp
+{
+
+struct runner
+{
+    runner()
+    {
+        localDeclarefwMedDataEquipment();
+        localDeclarefwMedDataStudy();
+        localDeclarefwMedDataPatient();
+        localDeclarefwMedDataSeries();
+        localDeclarefwMedDataSeriesDB();
+        localDeclarefwMedDataImageSeries();
+        localDeclarefwMedDataModelSeries();
+        localDeclarefwMedDataActivitySeries();
+    }
+
+    static runner r;
+};
+
+} //end namespace fwMedDataCamp
+
+#endif //__FWMEDDATACAMP_AUTOLOAD_HPP__
diff --git a/SrcLib/core/fwDataCamp/src/autoload.cpp b/SrcLib/core/fwDataCamp/src/autoload.cpp
new file mode 100644
index 0000000..d12b559
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/autoload.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwDataCamp/autoload.hpp"
+#include "fwMedDataCamp/autoload.hpp"
+
+
+namespace fwDataCamp
+{
+runner runner::r;
+}
+
+namespace fwMedDataCamp
+{
+runner runner::r;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Array.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Array.cpp
new file mode 100644
index 0000000..8d4b7a4
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Array.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMemory/camp/mapper.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwDataCamp/Array.hpp"
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwData)(Array))
+{
+    builder.base< ::fwData::Object>()
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("strides", &::fwData::Array::m_strides)
+        .property("size", &::fwData::Array::m_size)
+        .property("type", &::fwData::Array::m_type)
+        .property("nb_of_components", &::fwData::Array::m_nbOfComponents)
+        .property("buffer", &::fwData::Array::m_attrBufferObject)
+        .property("isOwner", &::fwData::Array::m_isBufferOwner)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Boolean.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Boolean.cpp
new file mode 100644
index 0000000..a0db2bf
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Boolean.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Boolean.hpp>
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Boolean))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("value",  (bool fwData::Boolean::*) &fwData::Boolean::m_value)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Camera.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Camera.cpp
new file mode 100644
index 0000000..6394ba9
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Camera.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Camera.hpp"
+
+fwCampImplementDataMacro((fwData)(Camera))
+{
+    builder.base< ::fwData::Object>()
+        .tag("object_version", "2")
+        .tag("lib_name", "fwData")
+        .property("extrinsic_matric",&::fwData::Camera::m_extrinsicMatrix)
+        .property("intrinsic_matrix",&::fwData::Camera::m_intrinsicMatrix)
+        .property("data_available",&::fwData::Camera::m_dataAvailable)
+        .property("skew",&::fwData::Camera::m_attrSkew)
+        .property("distortion_coefficient",&::fwData::Camera::m_attrDistortionCoefficient)
+        ;
+}
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Color.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Color.cpp
new file mode 100644
index 0000000..ba3bea5
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Color.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Color.hpp>
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Color))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("rgba", &::fwData::Color::m_vRGBA)
+        ;
+}
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Composite.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Composite.cpp
new file mode 100644
index 0000000..ca9153f
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Composite.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwData/camp/mapper.hpp>
+
+#include <fwCamp/UserObject.hpp>
+#include <fwCamp/Mapper/ValueMapper.hpp>
+
+fwCampImplementDataMacro((fwData)(Composite))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("values", &::fwData::Composite::m_attrContainer)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Edge.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Edge.cpp
new file mode 100644
index 0000000..a7c3ac6
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Edge.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Edge.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Edge))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("nature", &::fwData::Edge::m_nature)
+        .property("to_identifier", &::fwData::Edge::m_toPortIdentifier)
+        .property("from_identifier", &::fwData::Edge::m_fromPortIdentifier)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Float.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Float.cpp
new file mode 100644
index 0000000..28e73db
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Float.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Float.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Float))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("value", (float fwData::Float::*) &fwData::Float::m_value)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Graph.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Graph.cpp
new file mode 100644
index 0000000..9bd9a62
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Graph.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Graph.hpp>
+#include <fwData/camp/mapper.hpp>
+#include <fwCamp/Mapper/ArrayMapper.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Graph))
+{
+    builder.base< ::fwData::Object>()
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("nodes", &::fwData::Graph::m_nodes);
+        //.property("connections", &::fwData::Graph::m_connections);
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Histogram.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Histogram.cpp
new file mode 100644
index 0000000..7c24d1e
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Histogram.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Histogram.hpp>
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Histogram))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("value",&::fwData::Histogram::m_values)
+        .property("bins_width",&::fwData::Histogram::m_binsWidth)
+        .property("min_value",&::fwData::Histogram::m_minValue)
+        .property("max_value",&::fwData::Histogram::m_maxValue)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Image.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Image.cpp
new file mode 100644
index 0000000..0549ca8
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Image.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMemory/camp/mapper.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwDataCamp/Image.hpp"
+
+
+fwCampImplementDataMacro((fwData)(Image))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("size", &::fwData::Image::m_size)
+        .property("type", &::fwData::Image::m_type)
+        .property("spacing", &::fwData::Image::m_spacing)
+        .property("origin", &::fwData::Image::m_origin)
+        .property("array", &::fwData::Image::m_dataArray)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Integer.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Integer.cpp
new file mode 100644
index 0000000..84e0278
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Integer.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Integer.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Integer))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("value", (int fwData::Integer::*) &fwData::Integer::m_value)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Line.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Line.cpp
new file mode 100644
index 0000000..be60144
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Line.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Line.hpp"
+
+
+fwCampImplementDataMacro((fwData)(Line))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("position", &::fwData::Line::m_position)
+        .property("direction", &::fwData::Line::m_direction)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/List.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/List.cpp
new file mode 100644
index 0000000..90a4f72
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/List.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/List.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(List))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("values", &::fwData::List::m_attrContainer)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Material.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Material.cpp
new file mode 100644
index 0000000..789edb5
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Material.cpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Material.hpp"
+
+fwCampImplementDataMacro((fwData)(Material))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("shading_mode",&::fwData::Material::m_shadingMode)
+        .property("representation_mode",&::fwData::Material::m_representationMode)
+        .property("options_mode", &::fwData::Material::m_optionsMode)
+        .property("ambient",&::fwData::Material::m_ambient)
+        .property("diffuse",  &::fwData::Material::m_diffuse)
+        ;
+
+}
+
+fwCampImplementEnumMacro((fwData)(Material)(OPTIONS_MODE))
+{
+    builder
+        .value("STANDARD", ::fwData::Material::MODE_STANDARD)
+        .value("NORMALS", ::fwData::Material::MODE_NORMALS)
+        ;
+}
+
+fwCampImplementEnumMacro((fwData)(Material)(SHADING_MODE))
+{
+    builder
+        .value("FLAT", ::fwData::Material::MODE_FLAT)
+        .value("GOURAUD", ::fwData::Material::MODE_GOURAUD)
+        .value("PHONG", ::fwData::Material::MODE_PHONG)
+        ;
+}
+
+fwCampImplementEnumMacro((fwData)(Material)(REPRESENTATION_MODE))
+{
+    builder
+        .value("SURFACE",  ::fwData::Material::MODE_SURFACE)
+        .value("POINT",  ::fwData::Material::MODE_POINT )
+        .value("WIREFRAME",  ::fwData::Material::MODE_WIREFRAME)
+        .value("EDGE",  ::fwData::Material::MODE_EDGE)
+        ;
+}
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Mesh.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Mesh.cpp
new file mode 100644
index 0000000..dabb8de
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Mesh.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Mesh.hpp"
+
+fwCampImplementDataMacro((fwData)(Mesh))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("nb_points"        , &::fwData::Mesh::m_nbPoints)
+        .property("nb_cells"         , &::fwData::Mesh::m_nbCells)
+        .property("cells_data_size"   , &::fwData::Mesh::m_cellsDataSize)
+        .property("points"          , &::fwData::Mesh::m_points)
+        .property("cell_types"       , &::fwData::Mesh::m_cellTypes)
+        .property("cell_data"       , &::fwData::Mesh::m_cellData)
+        .property("cell_data_offsets" , &::fwData::Mesh::m_cellDataOffsets)
+        .property("point_colors"     , &::fwData::Mesh::m_pointColors)
+        .property("cell_colors"      , &::fwData::Mesh::m_cellColors)
+        .property("point_normals"    , &::fwData::Mesh::m_pointNormals)
+        .property("cell_normals"     , &::fwData::Mesh::m_cellNormals)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Model.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Model.cpp
new file mode 100644
index 0000000..0ba221e
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Model.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Model.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Model))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        // .property("map", &::fwData::Model::m_map)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Node.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Node.cpp
new file mode 100644
index 0000000..c522f0b
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Node.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Node.hpp"
+
+fwCampImplementDataMacro((fwData)(Node))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("object", &::fwData::Node::m_object)
+        .property("inputs", &::fwData::Node::m_inputs)
+        .property("outputs", &::fwData::Node::m_outputs)
+        ;
+}
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Object.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Object.cpp
new file mode 100644
index 0000000..92087aa
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Object.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Object))
+{
+    builder
+        .property("fields", &::fwData::Object::m_fields)
+        .function("classname", (std::string (fwData::Object::*)() const) &::fwData::Object::className)
+        .function("is_a", (bool (fwData::Object::*)(const std::string &) const) &::fwData::Object::isA)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Plane.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Plane.cpp
new file mode 100644
index 0000000..ab26f81
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Plane.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Plane.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Plane))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("plane", &::fwData::Plane::m_plane)
+        .property("points", &::fwData::Plane::m_vPoints)
+        .property("intersection", &::fwData::Plane::m_isIntersection)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/PlaneList.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/PlaneList.cpp
new file mode 100644
index 0000000..3f549d9
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/PlaneList.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/PlaneList.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(PlaneList))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("planes", &::fwData::PlaneList::m_vPlanes);
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/PointList.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/PointList.cpp
new file mode 100644
index 0000000..799ced6
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/PointList.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/PointList.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(PointList))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("points", &::fwData::PointList::m_vPoints)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Points.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Points.cpp
new file mode 100644
index 0000000..17684e7
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Points.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Point.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Point))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+    .base< ::fwData::Object>()
+    .property("coord", &::fwData::Point::m_vCoord);
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Port.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Port.cpp
new file mode 100644
index 0000000..c644488
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Port.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Port.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Port))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("identifier", &::fwData::Port::m_identifier)
+        .property("type", &::fwData::Port::m_type)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/ProcessObject.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/ProcessObject.cpp
new file mode 100644
index 0000000..8e47308
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/ProcessObject.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/ProcessObject.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(ProcessObject))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("inputs", &fwData::ProcessObject::m_attrInputs)
+        .property("outputs", &fwData::ProcessObject::m_attrOutputs)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/ROITraits.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/ROITraits.cpp
new file mode 100644
index 0000000..d33671e
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/ROITraits.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/ROITraits.hpp"
+
+fwCampImplementDataMacro((fwData)(ROITraits))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("name", &::fwData::ROITraits::m_identifier)
+        .property("firstname", &::fwData::ROITraits::m_evaluatedExp)
+        .property("node", &::fwData::ROITraits::m_structureTraits)
+        .property("traits", &::fwData::ROITraits::m_maskOpNode)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Reconstruction.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Reconstruction.cpp
new file mode 100644
index 0000000..b111b26
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Reconstruction.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Reconstruction.hpp"
+
+fwCampImplementDataMacro((fwData)(Reconstruction))
+{
+    builder
+        .tag("object_version", "2")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("is_visible", &::fwData::Reconstruction::m_bIsVisible)
+        .property("organ_name", &::fwData::Reconstruction::m_sOrganName)
+        .property("structure_type", &::fwData::Reconstruction::m_sStructureType)
+        .property("material", &::fwData::Reconstruction::m_attrMaterial)
+        .property("image", &::fwData::Reconstruction::m_attrImage)
+        .property("mesh", &::fwData::Reconstruction::m_attrMesh)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/ReconstructionTraits.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/ReconstructionTraits.cpp
new file mode 100644
index 0000000..5dcc4c1
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/ReconstructionTraits.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/ReconstructionTraits.hpp"
+
+fwCampImplementDataMacro((fwData)(ReconstructionTraits))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("name", &::fwData::ReconstructionTraits::m_identifier)
+        .property("mesh_node", &::fwData::ReconstructionTraits::m_meshOpNode)
+        .property("mask_node", &::fwData::ReconstructionTraits::m_maskOpNode)
+        .property("traits", &::fwData::ReconstructionTraits::m_structureTraits)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Resection.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Resection.cpp
new file mode 100644
index 0000000..d91d25f
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Resection.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Resection.hpp"
+
+fwCampImplementDataMacro((fwData)(Resection))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("name", &::fwData::Resection::m_name)
+        .property("plane_list", &::fwData::Resection::m_planeList)
+        .property("inputs", &::fwData::Resection::m_vInputs)
+        .property("outputs", &::fwData::Resection::m_vOutputs)
+        .property("is_safe_part", &::fwData::Resection::m_isSafePart)
+        .property("is_valid", &::fwData::Resection::m_isValid)
+        .property("is_visible", &::fwData::Resection::m_isVisible)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/ResectionDB.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/ResectionDB.cpp
new file mode 100644
index 0000000..5929fbc
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/ResectionDB.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/ResectionDB.hpp"
+
+fwCampImplementDataMacro((fwData)(ResectionDB))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("safe_resection", &::fwData::ResectionDB::m_safeResection)
+        .property("resections", &::fwData::ResectionDB::m_attrResections)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/String.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/String.cpp
new file mode 100644
index 0000000..e166cf9
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/String.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/String.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(String))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("value", (std::string fwData::String::*) &fwData::String::m_value)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraits.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraits.cpp
new file mode 100644
index 0000000..1651064
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraits.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/StructureTraits.hpp"
+
+fwCampImplementDataMacro((fwData)(StructureTraits))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("property_type", &::fwData::StructureTraits::m_propertyType)
+        .property("type", &::fwData::StructureTraits::m_type)
+        .property("categories", &::fwData::StructureTraits::m_categories)
+        .property("color", &::fwData::StructureTraits::m_color)
+        .property("class", &::fwData::StructureTraits::m_class)
+        .property("native_exp", &::fwData::StructureTraits::m_nativeExp)
+        .property("native_geomertic_exp", &::fwData::StructureTraits::m_nativeGeometricExp)
+        .property("attachment_type", &::fwData::StructureTraits::m_attachmentType)
+        .property("anatomic_region", &::fwData::StructureTraits::m_anatomicRegion)
+        .property("property_category", &::fwData::StructureTraits::m_propertyCategory)
+        ;
+}
+
+fwCampImplementEnumMacro((fwData)(StructureTraits)(Category))
+{
+    builder
+        .value("BODY",  ::fwData::StructureTraits::BODY)
+        .value("HEAD",  ::fwData::StructureTraits::HEAD )
+        .value("NECK",  ::fwData::StructureTraits::NECK)
+        .value("THORAX",  ::fwData::StructureTraits::THORAX)
+        .value("ABDOMEN",  ::fwData::StructureTraits::ABDOMEN)
+        .value("PELVIS",  ::fwData::StructureTraits::PELVIS)
+        .value("ARM",  ::fwData::StructureTraits::ARM)
+        .value("LEG",  ::fwData::StructureTraits::LEG)
+        .value("LIVER_SEGMENTS",  ::fwData::StructureTraits::LIVER_SEGMENTS)
+        .value("OTHER",  ::fwData::StructureTraits::OTHER)
+        ;
+}
+
+fwCampImplementEnumMacro((fwData)(StructureTraits)(StructureClass))
+{
+    builder
+        .value("TOOL",  ::fwData::StructureTraits::TOOL)
+        .value("ENVIRONMENT",  ::fwData::StructureTraits::ENVIRONMENT )
+        .value("VESSEL",  ::fwData::StructureTraits::VESSEL)
+        .value("LESION",  ::fwData::StructureTraits::LESION)
+        .value("ORGAN",  ::fwData::StructureTraits::ORGAN)
+        .value("FUNCTIONAL",  ::fwData::StructureTraits::FUNCTIONAL)
+        .value("NO_CONSTRAINT",  ::fwData::StructureTraits::NO_CONSTRAINT)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraitsDictionary.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraitsDictionary.cpp
new file mode 100644
index 0000000..3003c72
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/StructureTraitsDictionary.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/StructureTraitsDictionary.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(StructureTraitsDictionary))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("structureTraits", &::fwData::StructureTraitsDictionary::m_structureTraitsMap)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Tag.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Tag.cpp
new file mode 100644
index 0000000..9bd1482
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Tag.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Tag.hpp"
+
+fwCampImplementDataMacro((fwData)(Tag))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("point_list", &::fwData::Tag::m_pointList)
+        .property("type", &::fwData::Tag::m_sType)
+        .property("size", &::fwData::Tag::m_size)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/TransferFunction.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/TransferFunction.cpp
new file mode 100644
index 0000000..b56ac2c
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/TransferFunction.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/camp/mapper.hpp>
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/TransferFunction.hpp"
+
+fwCampImplementDataMacro((fwData)(TransferFunction))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("level", &::fwData::TransferFunction::m_attrLevel)
+        .property("window", &::fwData::TransferFunction::m_attrWindow)
+        .property("name", &::fwData::TransferFunction::m_attrName)
+        .property("background_color", &::fwData::TransferFunction::m_attrBackgroundColor)
+        .property("tf_data", &::fwData::TransferFunction::m_tfData)
+        .property("interpolation_mode", &::fwData::TransferFunction::m_attrInterpolationMode)
+        .property("is_clamped", &::fwData::TransferFunction::m_attrIsClamped)
+        ;
+}
+
+fwCampImplementEnumMacro((fwData)(TransferFunction)(InterpolationMode))
+{
+    builder
+        .value("LINEAR",  ::fwData::TransferFunction::LINEAR)
+        .value("NEAREST",  ::fwData::TransferFunction::NEAREST)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/TransformationMatrix3D.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/TransformationMatrix3D.cpp
new file mode 100644
index 0000000..c8c7496
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/TransformationMatrix3D.cpp
@@ -0,0 +1,19 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(TransformationMatrix3D))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("coefficient", &::fwData::TransformationMatrix3D::m_vCoefficients)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Vector.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Vector.cpp
new file mode 100644
index 0000000..2802c4c
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Vector.cpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Vector.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(Vector))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("values", &::fwData::Vector::m_attrContainer);
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Version.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Version.cpp
new file mode 100644
index 0000000..76ee82d
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Version.cpp
@@ -0,0 +1,12 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwDataCamp/Version.hpp"
+
+namespace fwDataCamp
+{
+    const int Version::s_CURRENT_VERSION = 1;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/Video.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/Video.cpp
new file mode 100644
index 0000000..215da6a
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/Video.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCamp/UserObject.hpp>
+#include "fwDataCamp/Video.hpp"
+
+fwCampImplementDataMacro((fwData)(Video))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object >()
+        .property("data_available",&fwData::Video::m_dataAvailable)
+        .property("last_modified",&fwData::Video::m_lastModified)
+        .property("camera",&fwData::Video::m_camera)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/NullPointer.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/NullPointer.cpp
new file mode 100644
index 0000000..547b887
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/NullPointer.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwDataCamp/config.hpp"
+#include "fwDataCamp/exception/NullPointer.hpp"
+
+namespace fwDataCamp
+{
+
+namespace exception
+{
+
+NullPointer::NullPointer ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/ObjectNotFound.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/ObjectNotFound.cpp
new file mode 100644
index 0000000..b7e6a85
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/exception/ObjectNotFound.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwDataCamp/config.hpp"
+#include "fwDataCamp/exception/ObjectNotFound.hpp"
+
+namespace fwDataCamp
+{
+
+namespace exception
+{
+
+ObjectNotFound::ObjectNotFound ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/getObject.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/getObject.cpp
new file mode 100644
index 0000000..e5033c6
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/getObject.cpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Object.hpp>
+
+#include "fwDataCamp/getObject.hpp"
+#include "fwDataCamp/visitor/GetObject.hpp"
+#include "fwDataCamp/exception/NullPointer.hpp"
+#include "fwDataCamp/exception/ObjectNotFound.hpp"
+
+namespace fwDataCamp
+{
+
+::fwData::Object::sptr getObject( ::fwData::Object::sptr object,
+                                     const std::string &path,
+                                     bool raiseException )
+{
+    SLM_FATAL_IF( "Path for desired object is empty.", path.empty() );
+    SLM_FATAL_IF( "Path for desired object doesn't start with '@'.", path[0] != '@' );
+    const std::string objectPath =  path.substr( 1 );
+    ::fwDataCamp::visitor::GetObject visitor( object, objectPath );
+    ::fwData::Object::sptr subObject;
+    try
+    {
+        subObject = visitor.get();
+    }
+    catch(const ::fwDataCamp::exception::NullPointer& np)
+    {
+        FW_FORWARD_EXCEPTION_IF(np, raiseException);
+    }
+
+    FW_RAISE_EXCEPTION_IF(
+            ::fwDataCamp::exception::ObjectNotFound("Object '" + path + "' not found."),
+            !visitor.objectsFound() && raiseException);
+
+    return subObject;
+}
+
+} // namespace fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/location/Folder.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/location/Folder.cpp
new file mode 100644
index 0000000..e7b4c57
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/location/Folder.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/camp/mapper.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(location)(Folder))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .base< ::fwData::Object>()
+        .property("folder", &::fwData::location::Folder::m_folder)
+        .property("recursive", &::fwData::location::Folder::m_isRecursive)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/location/SingleFile.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/location/SingleFile.cpp
new file mode 100644
index 0000000..4d2b520
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/location/SingleFile.cpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/location/SingleFile.hpp>
+#include <fwCamp/UserObject.hpp>
+
+fwCampImplementDataMacro((fwData)(location)(SingleFile))
+{
+    builder.base< ::fwData::Object>()
+        .tag("object_version", "1")
+        .tag("lib_name", "fwData")
+        .property("path", &::fwData::location::SingleFile::m_path)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/CompareObjects.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/CompareObjects.cpp
new file mode 100644
index 0000000..afdafe0
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/CompareObjects.cpp
@@ -0,0 +1,304 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <boost/foreach.hpp>
+#include <boost/functional/hash.hpp>
+
+#include <fwCore/Exception.hpp>
+
+#include <fwData/camp/mapper.hpp>
+
+#include <fwMemory/BufferObject.hpp>
+
+#include "fwDataCamp/visitor/CompareObjects.hpp"
+
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+const std::string CompareObjects::s_MISSING_PROPERTY("CompareObjects::s_MISSING_PROPERTY");
+
+typedef CompareObjects::PropsMapType::value_type PropType;
+
+struct PropertyVisitor : public camp::ValueVisitor< PropType >
+{
+    std::string m_prefix;
+    SPTR(CompareObjects::PropsMapType) m_props;
+
+    PropertyVisitor(std::string prefix) : m_prefix(prefix)
+    {}
+
+    PropertyVisitor(std::string prefix, SPTR(CompareObjects::PropsMapType) props)
+        : m_prefix(prefix), m_props(props)
+    {}
+
+    PropType operator()(camp::NoType value)
+    {
+        return std::make_pair("", "");
+    }
+
+    PropType operator()(bool value)
+    {
+        return std::make_pair(m_prefix, value ? "true" : "false");
+    }
+
+    PropType operator()(long value)
+    {
+        return std::make_pair(m_prefix, ::boost::lexical_cast<std::string>(value));
+    }
+
+    PropType operator()(double value)
+    {
+        return std::make_pair(m_prefix, ::boost::lexical_cast<std::string>(value));
+    }
+
+    PropType operator()(const std::string& value)
+    {
+        return std::make_pair(m_prefix, ::boost::lexical_cast<std::string>(value));
+    }
+
+    PropType operator()(const camp::EnumObject& value)
+    {
+        return std::make_pair(value.name(), value.name());
+    }
+
+    PropType operator()(const camp::UserObject& value)
+    {
+        const camp::Class& metaclass = value.getClass();
+        PropType prop;
+
+        if (value.pointer())
+        {
+            std::string classname = value.call("classname").to<std::string>();
+
+            if (metaclass.name() != classname)
+            {
+                const camp::Class& newMetaclass = ::camp::classByName(classname);
+                CompareObjects visitor(value, m_prefix, m_props);
+                newMetaclass.visit(visitor);
+            }
+            else if(classname == "::fwMemory::BufferObject")
+            {
+                ::fwMemory::BufferObject* bo = value.get< ::fwMemory::BufferObject* >();
+                if(bo)
+                {
+                    ::fwMemory::BufferObject::Lock lock = bo->lock();
+                    if(lock.getBuffer())
+                    {
+                        char* buffer = static_cast< char* >(lock.getBuffer());
+                        std::size_t seed = 0;
+                        const std::size_t buffsize = bo->getSize();
+                        for(size_t i = 0; i < buffsize; ++i)
+                        {
+                            ::boost::hash_combine(seed, buffer[i]);
+                        }
+                        return std::make_pair(m_prefix, ::boost::lexical_cast< std::string >(seed));
+                    }
+                }
+            }
+            else
+            {
+                CompareObjects visitor(value, m_prefix, m_props);
+                metaclass.visit(visitor);
+            }
+        }
+        else
+        {
+            OSLM_INFO("try visiting class= '" << metaclass.name() << " but a null pointer was found");
+        }
+        return prop;
+    }
+};
+
+//-----------------------------------------------------------------------------
+
+CompareObjects::CompareObjects()
+{
+    m_props = SPTR(PropsMapType)(new PropsMapType);
+}
+
+//-----------------------------------------------------------------------------
+
+CompareObjects::CompareObjects(
+        const ::camp::UserObject& obj, const std::string& prefix, SPTR(PropsMapType) props)
+    : m_campObj(obj), m_prefix(prefix), m_props(props)
+{}
+//-----------------------------------------------------------------------------
+
+CompareObjects::~CompareObjects()
+{}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::SimpleProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG("SimpleProperty name = " << name);
+    ::camp::Value elemValue = property.get(m_campObj);
+    PropertyVisitor visitor(getPath(name), m_props);
+    PropType pt = elemValue.visit(visitor);
+    if(!pt.first.empty())
+    {
+        m_props->insert(m_props->end(), pt);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::EnumProperty& property)
+{
+    SLM_TRACE_FUNC();
+    m_props->insert(m_props->end(),
+            std::make_pair(getPath(property.name()), ""));
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::MapProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name(property.name());
+    OSLM_DEBUG("MapProperty name = " << name);
+
+    OSLM_DEBUG( "Ok MapProperty name =" << name );
+
+    std::pair< ::camp::Value, ::camp::Value > value;
+    std::string mapKey;
+    for (unsigned int i = 0; i < property.getSize(m_campObj); ++i)
+    {
+        value = property.getElement(m_campObj, i);
+        mapKey = value.first.to< std::string >();
+        PropertyVisitor visitor(getPath(name + "." + mapKey), m_props);
+        PropType pt = value.second.visit(visitor);
+        if(!pt.first.empty())
+        {
+            m_props->insert(m_props->end(), pt);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::ArrayProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name(property.name());
+    OSLM_DEBUG( "ArrayProperty name =" << name );
+
+    for(unsigned int i = 0; i < property.size(m_campObj); ++i)
+    {
+        ::camp::Value elemValue = property.get(m_campObj, i);
+        std::stringstream ss;
+        ss << name << "." << i;
+        PropertyVisitor visitor(getPath(ss.str()), m_props);
+        PropType pt = elemValue.visit(visitor);
+        if(!pt.first.empty())
+        {
+            m_props->insert(m_props->end(), pt);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::UserProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG( "UserProperty name =" << name );
+    ::camp::Value elemValue = property.get( m_campObj );
+
+    if(m_campObj.call("is_a", ::camp::Args("::fwData::Object")).to<bool>())
+    {
+        PropertyVisitor visitor(getPath(name), m_props);
+        PropType pt = elemValue.visit(visitor);
+        if(!pt.first.empty())
+        {
+            m_props->insert(m_props->end(), pt);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::visit(const camp::Function& function)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+std::string CompareObjects::getPath(const std::string& property) const
+{
+    return m_prefix + (!m_prefix.empty() ? "." : "") + property;
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjects::compare(SPTR(::fwData::Object) objRef, SPTR(::fwData::Object) objComp)
+    throw (::fwCore::Exception)
+{
+    if(objRef->getClassname() != objComp->getClassname())
+    {
+        std::stringstream ss;
+        ss << "Classnames mismatch : '" << objRef->getClassname() << "' (reference object) vs. '"
+            << objComp->getClassname() << "' (compared object)";
+        throw ::fwCore::Exception(ss.str());
+    }
+
+    m_objRef = objRef;
+    m_objComp = objComp;
+
+    SLM_ASSERT("Reference object not defined", m_objRef);
+    m_campObj = ::camp::UserObject(m_objRef.get());
+    const ::camp::Class & classRef = ::camp::classByName(m_objRef->getClassname());
+    classRef.visit(*this);
+    m_propsRef = ::boost::move(*m_props);
+    m_props->clear();
+
+    SLM_ASSERT("Reference object not defined", m_objComp);
+    m_campObj = ::camp::UserObject(m_objComp.get());
+    const ::camp::Class & classComp = ::camp::classByName(m_objComp->getClassname());
+    classComp.visit(*this);
+    m_propsComp = ::boost::move(*m_props);
+    m_props->clear();
+
+    BOOST_FOREACH(PropsMapType::value_type prop, m_propsComp)
+    {
+        if(m_propsRef.find(prop.first) != m_propsRef.end())
+        {
+            if(m_propsRef[prop.first] != prop.second)
+            {
+                (*m_props)[prop.first] = prop.second;
+            }
+        }
+        else
+        {
+            (*m_props)[prop.first] = s_MISSING_PROPERTY;
+        }
+    }
+
+    BOOST_FOREACH(PropsMapType::value_type prop, m_propsRef)
+    {
+        if(m_propsComp.find(prop.first) == m_propsComp.end() && m_props->find(prop.first) == m_props->end())
+        {
+            (*m_props)[prop.first] = s_MISSING_PROPERTY;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // visitor
+
+} // fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/GetObject.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/GetObject.cpp
new file mode 100644
index 0000000..b885f7d
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/GetObject.cpp
@@ -0,0 +1,262 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/shared_ptr.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <fwData/camp/mapper.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Boolean.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Integer.hpp>
+
+#include "fwDataCamp/visitor/GetObject.hpp"
+
+#include "fwDataCamp/exception/NullPointer.hpp"
+#include "fwDataCamp/exception/ObjectNotFound.hpp"
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+struct GetCampValueVisitor : public camp::ValueVisitor< ::fwData::Object::sptr >
+{
+    std::string m_subObjPath;
+    PathVisitor::sptr m_pathVisitor;
+
+    GetCampValueVisitor( const std::string & subObjPath, PathVisitor::sptr pathVisitor) :
+        m_subObjPath(subObjPath), m_pathVisitor(pathVisitor)
+    {}
+
+    ::fwData::Object::sptr operator()(camp::NoType value)
+    {
+        SLM_FATAL("Enter in void GetCampValueVisitor()(camp::NoType value) : case not managed");
+        ::fwData::Object::sptr val;
+        return val;
+    }
+
+    ::fwData::Object::sptr operator()(bool value)
+    {
+        return ::fwData::Boolean::New(value);
+    }
+
+    ::fwData::Object::sptr operator()(long value)
+    {
+        return ::fwData::Integer::New(value);
+    }
+
+    ::fwData::Object::sptr operator()(double value)
+    {
+        return ::fwData::Float::New(value);
+    }
+
+    ::fwData::Object::sptr operator()(const std::string& value)
+    {
+        return ::fwData::String::New(value);
+    }
+
+    ::fwData::Object::sptr operator()(const camp::EnumObject& value)
+    {
+        SLM_FATAL("Enter in void GetCampValueVisitor()(camp::EnumObject value) : case not managed");
+        ::fwData::Object::sptr val;
+        return val;
+    }
+
+    ::fwData::Object::sptr operator()(const camp::UserObject& value)
+    {
+        ::fwData::Object::sptr val;
+        const camp::Class& metaclass = value.getClass();
+        if ( value.pointer() )
+        {
+            if ( ! m_subObjPath.empty() )
+            {
+                OSLM_DEBUG( "visit class= '" << metaclass.name() << "' ( classname = '"<< value.call("classname") <<"' )" );
+                ::fwData::Object * ptr = value.get< ::fwData::Object * >();
+                ::fwDataCamp::visitor::GetObject visitor( ptr->getSptr(), m_subObjPath );
+                val = visitor.get();
+                m_pathVisitor->merge(visitor.getPathVisitor());
+            }
+            else
+            {
+                ::fwData::Object * ptr = value.get< ::fwData::Object * >();
+                val = ptr->getSptr();
+            }
+        }
+        else
+        {
+            FW_RAISE_EXCEPTION( ::fwDataCamp::exception::NullPointer(
+                    "Object '" + metaclass.name() + "' not instanced.")
+            );
+        }
+
+        return val;
+    }
+ };
+
+//-----------------------------------------------------------------------------
+
+GetObject::GetObject( ::fwData::Object::sptr object, const std::string & subObjPath ) :
+        m_object(object), m_subObjPath(subObjPath),
+        m_newSubObjPath(subObjPath),
+        m_pathVisitor(::boost::make_shared<PathVisitor>(subObjPath))
+{
+    SLM_FATAL_IF("Cannot retrieve an object with an empty path.", subObjPath.empty());
+    m_campObj = camp::UserObject( object.get() );
+    m_propertyName = this->getNextPropertyName();
+}
+
+//-----------------------------------------------------------------------------
+
+GetObject::~GetObject()
+{}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::SimpleProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG( "SimpleProperty name =" << name );
+    if( name == m_propertyName )
+    {
+        m_pathVisitor->addObject(name);
+        OSLM_DEBUG( "Ok SimpleProperty name =" << name );
+        ::camp::Value elemValue = property.get( m_campObj );
+        GetCampValueVisitor visitor(m_newSubObjPath, m_pathVisitor);
+        m_subObject = elemValue.visit( visitor );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::EnumProperty& property)
+{
+    SLM_TRACE_FUNC();
+    OSLM_FATAL_IF( "EnumProperty is not still managed : name =" <<  property.name(),
+            property.name() == m_propertyName );
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::MapProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG( "MapProperty name =" << name);
+    if( name == m_propertyName )
+    {
+        m_pathVisitor->addObject(name);
+        OSLM_DEBUG( "Ok MapProperty name =" << name );
+        std::string key = this->getNextPropertyName();
+
+        std::pair< ::camp::Value, ::camp::Value > value;
+        std::string mapKey;
+        for (unsigned int var = 0; var < property.getSize(m_campObj); ++var)
+        {
+            value = property.getElement(m_campObj, var);
+            mapKey = value.first.to< std::string >();
+            if ( key == mapKey )
+            {
+                m_pathVisitor->addObject(key);
+                GetCampValueVisitor visitor( m_newSubObjPath, m_pathVisitor );
+                m_subObject = value.second.visit( visitor );
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::ArrayProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG( "ArrayProperty name =" << name );
+    if( name == m_propertyName )
+    {
+        m_pathVisitor->addObject(name);
+        OSLM_DEBUG( "Ok ArrayProperty name =" << name );
+        std::string key = this->getNextPropertyName();
+
+        size_t index = ::boost::lexical_cast< size_t >( key );
+
+        ::camp::Value elemValue = property.get( m_campObj, index );
+        GetCampValueVisitor visitor(m_newSubObjPath, m_pathVisitor);
+        m_subObject = elemValue.visit( visitor );
+        m_pathVisitor->addObject(key);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::UserProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+    OSLM_DEBUG( "UserProperty name =" << name );
+    if( name == m_propertyName )
+    {
+        m_pathVisitor->addObject(name);
+        OSLM_DEBUG( "Ok UserProperty name =" << name );
+        ::camp::Value elemValue = property.get( m_campObj );
+        GetCampValueVisitor visitor(m_newSubObjPath, m_pathVisitor);
+        m_subObject = elemValue.visit( visitor );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObject::visit(const camp::Function& function)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+std::string GetObject::getNextPropertyName()
+{
+    SLM_FATAL_IF( "Path is empty.", m_newSubObjPath.empty() );
+    size_t dotPos = m_newSubObjPath.find(".");
+    std::string nextItem;
+    if ( dotPos != std::string::npos )
+    {
+        nextItem = m_newSubObjPath.substr( 0, dotPos );
+        m_newSubObjPath = m_newSubObjPath.substr( dotPos+1 );
+    }
+    else
+    {
+        nextItem = m_newSubObjPath;
+        m_newSubObjPath = "";
+    }
+    OSLM_DEBUG( "nextItem = " << nextItem );
+    OSLM_DEBUG( "m_newSubObjPath = " << m_newSubObjPath );
+    return nextItem;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr GetObject::get()
+{
+    const camp::Class& camClass = ::camp::classByName( m_object->getClassname() );
+    camClass.visit( *this );
+    return m_subObject;
+}
+
+//-----------------------------------------------------------------------------
+
+bool GetObject::objectsFound() const
+{
+    return m_pathVisitor->allObjectsFound();
+}
+
+//-----------------------------------------------------------------------------
+
+} // visitor
+
+} // fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/RecursiveLock.cpp b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/RecursiveLock.cpp
new file mode 100644
index 0000000..a77fd23
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwDataCamp/visitor/RecursiveLock.cpp
@@ -0,0 +1,192 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/shared_ptr.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/camp/mapper.hpp>
+
+#include "fwDataCamp/exception/NullPointer.hpp"
+#include "fwDataCamp/exception/ObjectNotFound.hpp"
+
+#include "fwDataCamp/visitor/RecursiveLock.hpp"
+
+
+namespace fwDataCamp
+{
+
+namespace visitor
+{
+
+struct LockVisitor : public camp::ValueVisitor< void >
+{
+    SPTR(RecursiveLock::LockVectType) m_locks;
+
+    LockVisitor(SPTR(RecursiveLock::LockVectType) locks) : m_locks(locks)
+    {}
+
+    void operator()(camp::NoType value)
+    {}
+
+    void operator()(bool value)
+    {}
+
+    void operator()(long value)
+    {}
+
+    void operator()(double value)
+    {}
+
+    void operator()(const std::string& value)
+    {}
+
+    void operator()(const camp::EnumObject& value)
+    {}
+
+    void operator()(const camp::UserObject& value)
+    {
+        const camp::Class& metaclass = value.getClass();
+        if ( value.pointer() )
+        {
+            OSLM_DEBUG( "visit class= '" << metaclass.name() << "' ( classname = '"<< value.call("classname") <<"' )" );
+            if( metaclass.hasFunction("is_a") )
+            {
+                if( value.call("is_a", ::camp::Args("::fwData::Object")).to<bool>() )
+                {
+                    ::fwData::Object * ptr = value.get< ::fwData::Object * >();
+                    ::fwData::Object::sptr obj = ptr->getSptr();
+                    ::fwDataCamp::visitor::RecursiveLock visitor( obj, m_locks );
+                }
+                else if( value.call("is_a", ::camp::Args("::fwMemory::BufferObject")).to<bool>() )
+                {
+                    ::fwMemory::BufferObject * ptr = value.get< ::fwMemory::BufferObject * >();
+                    ::fwMemory::BufferObject::sptr bo = ptr->getSptr();
+                    SPTR(::fwCore::mt::ReadLock) lock
+                            = SPTR(::fwCore::mt::ReadLock)(new ::fwCore::mt::ReadLock(bo->getMutex()));
+                    m_locks->push_back(lock);
+                }
+            }
+        }
+    }
+ };
+
+//-----------------------------------------------------------------------------
+
+RecursiveLock::RecursiveLock( ::fwData::Object::sptr object, SPTR(LockVectType) locks ) :
+        m_object(object), m_locks(locks)
+{
+    SPTR(::fwCore::mt::ReadLock) lock
+            = SPTR(::fwCore::mt::ReadLock)(new ::fwCore::mt::ReadLock(m_object->getMutex()));
+    m_locks->push_back(lock);
+    m_campObj = camp::UserObject( object.get() );
+    this->lock();
+}
+
+//-----------------------------------------------------------------------------
+
+RecursiveLock::~RecursiveLock()
+{}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::SimpleProperty& property)
+{}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::EnumProperty& property)
+{}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::MapProperty& property)
+{
+    const std::string name ( property.name() );
+    const size_t size = property.getSize( m_campObj );
+
+    std::pair< ::camp::Value, ::camp::Value > value;
+    ::camp::Value first;
+    ::camp::Value second;
+
+    for (size_t var = 0; var < size; ++var)
+    {
+        value = property.getElement(m_campObj, var);
+
+        first = value.first;
+        second = value.second;
+
+        SLM_ASSERT("Not managed type for map key.",
+                first.type() == ::camp::stringType ||
+                first.type() == ::camp::intType ||
+                first.type() == ::camp::realType );
+
+        if ( second.type() == ::camp::userType )
+        {
+            LockVisitor visitor(m_locks);
+            second.visit( visitor );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::ArrayProperty& property)
+{
+    const std::string name ( property.name() );
+    const size_t size = property.size( m_campObj );
+
+    ::camp::Value value;
+
+    for (size_t var = 0; var < size; ++var)
+    {
+        value = property.get(m_campObj, var);
+
+        if ( value.type() == ::camp::userType )
+        {
+            LockVisitor visitor(m_locks);
+            value.visit( visitor );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::UserProperty& property)
+{
+    SLM_TRACE_FUNC();
+    const std::string name ( property.name() );
+
+    ::camp::Value elemValue = property.get( m_campObj );
+    LockVisitor visitor(m_locks);
+    elemValue.visit( visitor );
+}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::visit(const camp::Function& function)
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLock::lock()
+{
+    const camp::Class& camClass = ::camp::classByName( m_object->getClassname() );
+    camClass.visit( *this );
+}
+
+//-----------------------------------------------------------------------------
+
+} // visitor
+
+} // fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ActivitySeries.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ActivitySeries.cpp
new file mode 100644
index 0000000..133cf98
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ActivitySeries.cpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwMedDataCamp/ActivitySeries.hpp"
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(ActivitySeries))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwActivities")
+        .base< ::fwMedData::Series>()
+        .property("activity_config_id", &::fwMedData::ActivitySeries::m_attrActivityConfigId)
+        .property("data", &::fwMedData::ActivitySeries::m_attrData)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Equipment.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Equipment.cpp
new file mode 100644
index 0000000..2fb9300
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Equipment.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/Equipment.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(Equipment))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwData::Object>()
+        .property("institution_name", &::fwMedData::Equipment::m_attrInstitutionName)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ImageSeries.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ImageSeries.cpp
new file mode 100644
index 0000000..a8b56af
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ImageSeries.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwMedDataCamp/ImageSeries.hpp"
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(ImageSeries))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwMedData::Series>()
+        .property("image", &::fwMedData::ImageSeries::m_attrImage)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ModelSeries.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ModelSeries.cpp
new file mode 100644
index 0000000..d7e0602
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/ModelSeries.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Reconstruction.hpp>
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(ModelSeries))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwMedData::Series>()
+        .property("reconstruction_db", &::fwMedData::ModelSeries::m_attrReconstructionDB)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Patient.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Patient.cpp
new file mode 100644
index 0000000..9a88006
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Patient.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/Patient.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(Patient))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwData::Object>()
+        .property("name", &::fwMedData::Patient::m_attrName)
+        .property("patient_id", &::fwMedData::Patient::m_attrPatientId)
+        .property("birth_date", &::fwMedData::Patient::m_attrBirthdate)
+        .property("sex", &::fwMedData::Patient::m_attrSex)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Series.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Series.cpp
new file mode 100644
index 0000000..80cd28e
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Series.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+#include "fwMedDataCamp/Series.hpp"
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(Series))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwData::Object>()
+        .property("patient", &::fwMedData::Series::m_attrPatient)
+        .property("study", &::fwMedData::Series::m_attrStudy)
+        .property("equipment", &::fwMedData::Series::m_attrEquipment)
+        .property("instance_uid", &::fwMedData::Series::m_attrInstanceUID)
+        .property("modality", &::fwMedData::Series::m_attrModality)
+        .property("date", &::fwMedData::Series::m_attrDate)
+        .property("time", &::fwMedData::Series::m_attrTime)
+        .property("performing_physicians_name", &::fwMedData::Series::m_attrPerformingPhysiciansName)
+        .property("description", &::fwMedData::Series::m_attrDescription)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/SeriesDB.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/SeriesDB.cpp
new file mode 100644
index 0000000..535eae5
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/SeriesDB.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Series.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(SeriesDB))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwData::Object>()
+        .property("values", &::fwMedData::SeriesDB::m_attrContainer)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Study.cpp b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Study.cpp
new file mode 100644
index 0000000..dbbe407
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/src/fwMedDataCamp/Study.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/Study.hpp>
+
+#include <fwCamp/UserObject.hpp>
+
+//------------------------------------------------------------------------------
+
+fwCampImplementDataMacro((fwMedData)(Study))
+{
+    builder
+        .tag("object_version", "1")
+        .tag("lib_name", "fwMedData")
+        .base< ::fwData::Object>()
+        .property("instance_uid", &::fwMedData::Study::m_attrInstanceUID)
+        .property("date", &::fwMedData::Study::m_attrDate)
+        .property("time", &::fwMedData::Study::m_attrTime)
+        .property("referring_physician_name", &::fwMedData::Study::m_attrReferringPhysicianName)
+        .property("description", &::fwMedData::Study::m_attrDescription)
+        .property("patient_age", &::fwMedData::Study::m_attrPatientAge)
+        ;
+}
diff --git a/SrcLib/core/fwDataCamp/test/CMakeLists.txt b/SrcLib/core/fwDataCamp/test/CMakeLists.txt
new file mode 100644
index 0000000..c7bb8af
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwDataCamp/test/Properties.cmake b/SrcLib/core/fwDataCamp/test/Properties.cmake
new file mode 100644
index 0000000..4eb8ba7
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataCampTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwAtoms fwAtomConversion fwDataCamp )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataCamp/test/cppunit.options b/SrcLib/core/fwDataCamp/test/cppunit.options
new file mode 100644
index 0000000..f927969
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/cppunit.options
@@ -0,0 +1,15 @@
+
+CLASSTEST=[
+    'GetObjectTest',
+    'ObjectTest',
+    'RecursiveLockTest',
+    'CompareObjectsTest',
+]
+
+LIB = [
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwDataCamp_0-1',
+       'fwTest_0-1',
+       ]
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/CompareObjectsTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/CompareObjectsTest.hpp
new file mode 100644
index 0000000..9b0f851
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/CompareObjectsTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_UT_COMPAREOBJECTSTEST_HPP__
+#define __FWDATACAMP_UT_COMPAREOBJECTSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+class CompareObjectsTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CompareObjectsTest );
+    CPPUNIT_TEST( compareSeriesDBTest );
+    CPPUNIT_TEST( compareImageTest );
+    CPPUNIT_TEST( compareReconstructionTest );
+    CPPUNIT_TEST( compareBufferTest );
+    CPPUNIT_TEST( compareEmpty );
+    CPPUNIT_TEST( exceptionTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void compareSeriesDBTest();
+    void compareImageTest();
+    void compareReconstructionTest();
+    void compareBufferTest();
+    void compareEmpty();
+    void exceptionTest();
+};
+
+}  // namespace ut
+}  // namespace fwDataCamp
+
+#endif // __FWDATACAMP_UT_COMPAREOBJECTSTEST_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/DataCampHelper.hpp b/SrcLib/core/fwDataCamp/test/tu/include/DataCampHelper.hpp
new file mode 100644
index 0000000..19ff9fc
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/DataCampHelper.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __DATACAMPHELPER_HPP__
+#define __DATACAMPHELPER_HPP__
+
+#include <fwData/Object.hpp>
+
+namespace DataCampHelper
+{
+    typedef std::vector<std::string> PropertiesNameType;
+
+    void visitProperties(const std::string& className, const PropertiesNameType& vecProp);
+
+    void compareSimplePropertyValue(::fwData::Object::sptr obj,
+                                           const std::string& propertyPath,
+                                           const std::string& value);
+
+    void compareObjectPropertyValue(::fwData::Object::sptr obj,
+                                           const std::string& propertyPath,
+                                           ::fwData::Object::sptr value);
+}
+
+#endif // __DATACAMPHELPER_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/GetObjectTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/GetObjectTest.hpp
new file mode 100644
index 0000000..38c3df7
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/GetObjectTest.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_UT_GETOBJECTTEST_HPP__
+#define __FWDATACAMP_UT_GETOBJECTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+class GetObjectTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( GetObjectTest );
+    CPPUNIT_TEST( getTest );
+    CPPUNIT_TEST( invalidPathTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void getTest();
+    void invalidPathTest();
+
+};
+
+}  // namespace ut
+}  // namespace fwDataCamp
+
+#endif // __FWDATACAMP_UT_GETOBJECTTEST_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/ObjectTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/ObjectTest.hpp
new file mode 100644
index 0000000..390f1d7
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/ObjectTest.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_UT_OBJECTTEST_HPP__
+#define __FWDATACAMP_UT_OBJECTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+class ObjectTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ObjectTest );
+    CPPUNIT_TEST( callFunctionTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void callFunctionTest();
+
+};
+
+}  // namespace ut
+}  // namespace fwDataCamp
+
+#endif // __FWDATACAMP_UT_OBJECTTEST_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/RecursiveLockTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/RecursiveLockTest.hpp
new file mode 100644
index 0000000..119fb8f
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/RecursiveLockTest.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATACAMP_UT_RECURSIVELOCKTEST_HPP__
+#define __FWDATACAMP_UT_RECURSIVELOCKTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+class RecursiveLockTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( RecursiveLockTest );
+    CPPUNIT_TEST( lockTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    // interface
+    void setUp();
+    void tearDown();
+
+    void lockTest();
+
+};
+
+}  // namespace ut
+}  // namespace fwDataCamp
+
+#endif // __FWDATACAMP_UT_RECURSIVELOCKTEST_HPP__
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ActivitySeriesTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ActivitySeriesTest.hpp
new file mode 100644
index 0000000..cdd7bdd
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ActivitySeriesTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_ACTIVITYSERIESTEST_HPP__
+#define __FWMEDDATACAMP_UT_ACTIVITYSERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class ActivitySeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActivitySeriesTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_ACTIVITYSERIESTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/EquipmentTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/EquipmentTest.hpp
new file mode 100644
index 0000000..e4698ea
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/EquipmentTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_EQUIPMENTTEST_HPP__
+#define __FWMEDDATACAMP_UT_EQUIPMENTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class EquipmentTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( EquipmentTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_EQUIPMENTTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ImageSeriesTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ImageSeriesTest.hpp
new file mode 100644
index 0000000..e69dec2
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ImageSeriesTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_IMAGESERIESTEST_HPP__
+#define __FWMEDDATACAMP_UT_IMAGESERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class ImageSeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageSeriesTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_IMAGESERIESTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ModelSeriesTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ModelSeriesTest.hpp
new file mode 100644
index 0000000..6110963
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/ModelSeriesTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_MODELSERIESTEST_HPP__
+#define __FWMEDDATACAMP_UT_MODELSERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class ModelSeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ModelSeriesTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_MODELSERIESTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/PatientTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/PatientTest.hpp
new file mode 100644
index 0000000..5b7c54d
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/PatientTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_PATIENTTEST_HPP__
+#define __FWMEDDATACAMP_UT_PATIENTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class PatientTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( PatientTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_PATIENTTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/SeriesDBTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/SeriesDBTest.hpp
new file mode 100644
index 0000000..8eba020
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/SeriesDBTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_SERIESDBTEST_HPP__
+#define __FWMEDDATACAMP_UT_SERIESDBTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class SeriesDBTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_SERIESDBTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/StudyTest.hpp b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/StudyTest.hpp
new file mode 100644
index 0000000..9151705
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/include/fwMedDataCamp/StudyTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATACAMP_UT_STUDYTEST_HPP__
+#define __FWMEDDATACAMP_UT_STUDYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+class StudyTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StudyTest );
+    CPPUNIT_TEST( propertiesTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void propertiesTest();
+
+};
+
+} //namespace ut
+} //namespace fwMedDataCamp
+
+#endif // __FWMEDDATACAMP_UT_STUDYTEST_HPP__
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/CompareObjectsTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/CompareObjectsTest.cpp
new file mode 100644
index 0000000..e271a4a
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/CompareObjectsTest.cpp
@@ -0,0 +1,225 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/Exception.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/generator/SeriesDB.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTools/Type.hpp>
+
+#include "CompareObjectsTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataCamp::ut::CompareObjectsTest );
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+// Set up context before running a test.
+void CompareObjectsTest::setUp()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::compareSeriesDBTest()
+{
+    ::fwMedData::SeriesDB::sptr seriesDBRef = ::fwTest::generator::SeriesDB::createSeriesDB(1, 1, 1);
+    ::fwMedData::SeriesDB::sptr seriesDBComp = ::fwData::Object::copy< ::fwMedData::SeriesDB >(seriesDBRef);
+
+    {
+        visitor::CompareObjects visitor;
+        visitor.compare(seriesDBRef, seriesDBComp);
+
+        SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+        CPPUNIT_ASSERT_EQUAL(size_t(0), props->size());
+    }
+
+    {
+        CPPUNIT_ASSERT_EQUAL(size_t(3), seriesDBComp->getContainer().size());
+        ::fwMedData::Series::sptr series = seriesDBComp->getContainer()[0];
+        CPPUNIT_ASSERT(series);
+
+        ::fwMedData::Patient::sptr patient = series->getPatient();
+        const std::string name = patient->getName() + "X";
+
+        patient->setName(name);
+        patient->setSex("M");
+        patient->setPatientId("42");
+
+        visitor::CompareObjects visitor;
+        visitor.compare(seriesDBRef, seriesDBComp);
+
+        SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+        CPPUNIT_ASSERT_EQUAL(props->size(), (size_t)3);
+
+        CPPUNIT_ASSERT(props->find("values.0.patient.name") != props->end());
+        CPPUNIT_ASSERT_EQUAL(name, (*props)["values.0.patient.name"]);
+
+        CPPUNIT_ASSERT(props->find("values.0.patient.patient_id") != props->end());
+        CPPUNIT_ASSERT_EQUAL(std::string("42"), (*props)["values.0.patient.patient_id"]);
+
+        CPPUNIT_ASSERT(props->find("values.0.patient.sex") != props->end());
+        CPPUNIT_ASSERT_EQUAL(std::string("M"), (*props)["values.0.patient.sex"]);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::compareImageTest()
+{
+    ::fwTools::Type type = ::fwTools::Type::create< float >();
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(img, type);
+
+    ::fwData::Image::sptr imgComp = ::fwData::Object::copy(img);
+
+    ::fwData::Image::SpacingType spacing = imgComp->getSpacing();
+    spacing[0] = 42;
+    imgComp->setSpacing(spacing);
+
+    ::fwData::Image::OriginType origin = imgComp->getOrigin();
+    origin[2] = 1664;
+    imgComp->setOrigin(origin);
+
+    visitor::CompareObjects visitor;
+    visitor.compare(img, imgComp);
+
+    SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    CPPUNIT_ASSERT_EQUAL(size_t(2), props->size());
+
+    CPPUNIT_ASSERT(props->find("spacing.0") != props->end());
+    CPPUNIT_ASSERT_EQUAL(std::string("42"), (*props)["spacing.0"]);
+
+    CPPUNIT_ASSERT(props->find("origin.2") != props->end());
+    CPPUNIT_ASSERT_EQUAL(std::string("1664"), (*props)["origin.2"]);
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::compareReconstructionTest()
+{
+    ::fwData::Reconstruction::sptr rec = ::fwData::Reconstruction::New();
+    ::fwTest::generator::SeriesDB::generateReconstruction(rec);
+
+    ::fwData::Reconstruction::sptr recComp = ::fwData::Object::copy< ::fwData::Reconstruction >(rec);
+
+    recComp->setOrganName("Unknown organ name");
+    recComp->setIsVisible(!rec->getIsVisible());
+
+    visitor::CompareObjects visitor;
+    visitor.compare(rec, recComp);
+
+    SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    CPPUNIT_ASSERT_EQUAL((size_t)2, props->size());
+
+    CPPUNIT_ASSERT(props->find("organ_name") != props->end());
+    CPPUNIT_ASSERT_EQUAL(std::string("Unknown organ name"), (*props)["organ_name"]);
+
+    CPPUNIT_ASSERT(props->find("is_visible") != props->end());
+    CPPUNIT_ASSERT_EQUAL(std::string(recComp->getIsVisible() ? "true" : "false"), (*props)["is_visible"]);
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::compareBufferTest()
+{
+    ::fwData::Image::sptr imgRef = ::fwData::Image::New();
+    ::fwData::Image::sptr imgComp = ::fwData::Image::New();
+
+    ::fwTools::Type typeRef = ::fwTools::Type::create< float >();
+    ::fwTools::Type typeComp = ::fwTools::Type::create< double >();
+
+    {
+        ::fwTest::generator::Image::generateRandomImage(imgRef, typeRef);
+        ::fwTest::generator::Image::generateRandomImage(imgComp, typeComp);
+
+        visitor::CompareObjects visitor;
+        visitor.compare(imgRef, imgComp);
+
+        SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+        CPPUNIT_ASSERT(!props->empty());
+        CPPUNIT_ASSERT(props->find("array.buffer") != props->end());
+    }
+
+    {
+        imgComp = ::fwData::Object::copy(imgRef);
+        visitor::CompareObjects visitor;
+        visitor.compare(imgRef, imgComp);
+
+        SPTR(visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+        CPPUNIT_ASSERT_EQUAL(props->size(), (size_t)0);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::compareEmpty()
+{
+    ::fwData::Composite::sptr compRef = ::fwData::Composite::New();
+    ::fwData::Composite::sptr compComp = ::fwData::Composite::New();
+
+    (*compRef)["float"] = ::fwData::Float::New(0.0f);
+    (*compComp)["int"] = ::fwData::Integer::New(0);
+
+    visitor::CompareObjects visitor;
+    visitor.compare(compComp, compRef);
+
+    SPTR(visitor::CompareObjects::PropsMapType) diffs = visitor.getDifferences();
+    CPPUNIT_ASSERT_EQUAL(diffs->size(), (size_t)2);
+    CPPUNIT_ASSERT(diffs->find("values.float.value") != diffs->end());
+    CPPUNIT_ASSERT(diffs->find("values.int.value") != diffs->end());
+    CPPUNIT_ASSERT_EQUAL((*diffs)["values.float.value"], visitor::CompareObjects::s_MISSING_PROPERTY);
+    CPPUNIT_ASSERT_EQUAL((*diffs)["values.int.value"], visitor::CompareObjects::s_MISSING_PROPERTY);
+}
+
+//-----------------------------------------------------------------------------
+
+void CompareObjectsTest::exceptionTest()
+{
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    ::fwMedData::Study::sptr study = ::fwMedData::Study::New();
+
+    visitor::CompareObjects visitor;
+    CPPUNIT_ASSERT_THROW(visitor.compare(img, study), ::fwCore::Exception);
+
+    CPPUNIT_ASSERT_EQUAL(visitor.getReferenceProps().size(), (size_t)0);
+    CPPUNIT_ASSERT_EQUAL(visitor.getComparedProps().size(), (size_t)0);
+    CPPUNIT_ASSERT_EQUAL(visitor.getDifferences()->size(), (size_t)0);
+}
+
+//-----------------------------------------------------------------------------
+
+}  // namespace ut
+}  // namespace fwDataCamp
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/DataCampHelper.cpp b/SrcLib/core/fwDataCamp/test/tu/src/DataCampHelper.cpp
new file mode 100644
index 0000000..af246b2
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/DataCampHelper.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/GenericFieldBase.hpp>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include "DataCampHelper.hpp"
+
+namespace DataCampHelper
+{
+
+//------------------------------------------------------------------------------
+
+void visitProperties(const std::string& className, const PropertiesNameType& vecProp)
+{
+    const ::camp::Class& metaClass = ::camp::classByName(className);
+    CPPUNIT_ASSERT_EQUAL( vecProp.size(), metaClass.propertyCount());
+    BOOST_FOREACH(const std::string& property, vecProp)
+    {
+        CPPUNIT_ASSERT_MESSAGE("Missing property "+ property+" in "+className,
+                              metaClass.hasProperty(property));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void compareSimplePropertyValue(::fwData::Object::sptr obj,
+                                const std::string& propertyPath,
+                                const std::string& value)
+{
+    ::fwData::GenericFieldBase::sptr field;
+    field = ::fwDataCamp::getObject< ::fwData::GenericFieldBase >(obj, propertyPath);
+    CPPUNIT_ASSERT_MESSAGE("Retrieve failed for property "+propertyPath, field);
+    CPPUNIT_ASSERT_EQUAL( value, field->toString());
+}
+
+//------------------------------------------------------------------------------
+
+void compareObjectPropertyValue(::fwData::Object::sptr obj,
+                                const std::string& propertyPath,
+                                ::fwData::Object::sptr value)
+{
+    ::fwData::Object::sptr subObj;
+    subObj = ::fwDataCamp::getObject(obj, propertyPath);
+    CPPUNIT_ASSERT_MESSAGE("Retrieve failed for property "+propertyPath, subObj);
+    CPPUNIT_ASSERT_MESSAGE("Retrieve property "+propertyPath+" not equal with value", value == subObj);
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace DataCampHelper
+
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/GetObjectTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/GetObjectTest.cpp
new file mode 100644
index 0000000..8ff8438
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/GetObjectTest.cpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+#include <fwDataCamp/exception/NullPointer.hpp>
+#include <fwDataCamp/exception/ObjectNotFound.hpp>
+
+#include "GetObjectTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataCamp::ut::GetObjectTest );
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+// Set up context before running a test.
+void GetObjectTest::setUp()
+{};
+
+//-----------------------------------------------------------------------------
+
+void GetObjectTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObjectTest::getTest()
+{
+    // Visit 1
+    ::fwData::Image::sptr img1 = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(img1, ::fwTools::Type::create("int16"));
+    ::fwData::Image::sptr img2 = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(img2, ::fwTools::Type::create("uint8"));
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    composite->getContainer()["img1"] = img1;
+    composite->getContainer()["img2"] = img2;
+    ::fwData::Object::sptr subObj1 = ::fwDataCamp::getObject( composite, "@values.img2" );
+    CPPUNIT_ASSERT_MESSAGE("Image must be equal" , subObj1 == img2);
+
+    // Visit 2
+    ::fwData::Float::sptr zspacing = ::fwDataCamp::getObject< ::fwData::Float >( composite, "@values.img2.spacing.2" );
+    CPPUNIT_ASSERT_MESSAGE("spacing must be equal" , img2->getSpacing()[2] - 0.001 < zspacing->value() && zspacing->value() < img2->getSpacing()[2] + 0.001 );
+
+    // Visit 3
+    ::fwMedData::Patient::sptr patient1 = ::fwMedData::Patient::New();
+    patient1->setName( "toto" );
+    ::fwData::String::sptr str= ::fwDataCamp::getObject< ::fwData::String >( patient1, "@name" );
+    CPPUNIT_ASSERT_MESSAGE("Name must be equal" , patient1->getName() == str->value() );
+
+    // Visit 4
+    composite->setField("toto", img1);
+    img1->setField("titi", img2);
+    ::fwData::Object::sptr subObj2 = ::fwDataCamp::getObject( composite, "@fields.toto.fields.titi" );
+    CPPUNIT_ASSERT_MESSAGE("Image must be equal", subObj2 == img2 );
+}
+
+//-----------------------------------------------------------------------------
+
+void GetObjectTest::invalidPathTest()
+{
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+    ::fwData::String::sptr text = ::fwData::String::New("Text");
+    (*composite)["string"] = text;
+
+    ::fwData::Object::sptr obj = ::fwDataCamp::getObject( composite, "@values.string" );
+    CPPUNIT_ASSERT_MESSAGE("fwData::String must be equal" , obj ==  text );
+
+    // no exception version
+    ::fwData::Object::sptr invalidObj = ::fwDataCamp::getObject( composite, "@values.invalidPath", false );
+    CPPUNIT_ASSERT_MESSAGE("Object must not exist", !invalidObj );
+
+    // exception version : path is invalid
+    CPPUNIT_ASSERT_THROW(
+            ::fwDataCamp::getObject( composite, "@values.invalidPath", true ),
+             ::fwDataCamp::exception::ObjectNotFound
+    );
+    CPPUNIT_ASSERT_EQUAL(size_t(1), composite->size() );
+
+
+     ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::New();
+     // no exception version
+     invalidObj = ::fwDataCamp::getObject( imgSeries, "@image.type", false );
+     CPPUNIT_ASSERT_MESSAGE("Object must not exist", !invalidObj );
+
+     // exception version : path exist, but image object is null
+     CPPUNIT_ASSERT_THROW(
+             ::fwDataCamp::getObject( imgSeries, "@image.type", true ),
+              ::fwDataCamp::exception::NullPointer
+     );
+}
+
+//-----------------------------------------------------------------------------
+
+}  // namespace ut
+}  // namespace fwDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/ObjectTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/ObjectTest.cpp
new file mode 100644
index 0000000..9ae290a
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/ObjectTest.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+
+#include <fwDataCamp/getObject.hpp>
+
+#include "ObjectTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataCamp::ut::ObjectTest );
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+// Set up context before running a test.
+void ObjectTest::setUp()
+{};
+
+//-----------------------------------------------------------------------------
+
+void ObjectTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectTest::callFunctionTest()
+{
+    ::fwData::Image::sptr imgage = ::fwData::Image::New();
+    ::camp::UserObject campObj(imgage.get());
+    const ::camp::Class & metaClass = campObj.getClass();
+    CPPUNIT_ASSERT(metaClass.hasFunction("classname"));
+    CPPUNIT_ASSERT(metaClass.hasFunction("is_a"));
+
+    CPPUNIT_ASSERT(campObj.call("classname").to<std::string>() == "::fwData::Image");
+    CPPUNIT_ASSERT(campObj.call("is_a", ::camp::Args("::fwData::Object")).to<bool>());
+    CPPUNIT_ASSERT(campObj.call("is_a", ::camp::Args("::fwData::Image")).to<bool>());
+    CPPUNIT_ASSERT(!campObj.call("is_a", ::camp::Args("::fwData::Float")).to<bool>());
+
+}
+
+//-----------------------------------------------------------------------------
+
+}  // namespace ut
+}  // namespace fwDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/RecursiveLockTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/RecursiveLockTest.cpp
new file mode 100644
index 0000000..b360f8b
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/RecursiveLockTest.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+#include <fwData/Composite.hpp>
+
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataCamp/visitor/RecursiveLock.hpp>
+
+#include "RecursiveLockTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataCamp::ut::RecursiveLockTest );
+
+namespace fwDataCamp
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+// Set up context before running a test.
+void RecursiveLockTest::setUp()
+{};
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLockTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void RecursiveLockTest::lockTest()
+{
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+        ::fwData::Array::sptr array = image->getDataArray();
+        ::fwMemory::BufferObject::sptr bo = array->getBufferObject();
+
+        {
+            ::fwDataCamp::visitor::RecursiveLock visitor(image);
+
+            CPPUNIT_ASSERT(!image->getMutex().try_lock());
+            CPPUNIT_ASSERT(!array->getMutex().try_lock());
+            CPPUNIT_ASSERT(!bo->getMutex().try_lock());
+        }
+
+        CPPUNIT_ASSERT(image->getMutex().try_lock());
+        CPPUNIT_ASSERT(array->getMutex().try_lock());
+        CPPUNIT_ASSERT(bo->getMutex().try_lock());
+    }
+
+    {
+        ::fwData::Image::sptr img1 = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(img1, ::fwTools::Type::create("int16"));
+        ::fwData::Image::sptr img2 = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(img2, ::fwTools::Type::create("uint8"));
+        ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+        composite->getContainer()["img1"] = img1;
+        composite->getContainer()["img2"] = img2;
+
+        ::fwData::Array::sptr array1 = img1->getDataArray();
+        ::fwData::Array::sptr array2 = img2->getDataArray();
+        ::fwMemory::BufferObject::sptr bo1 = array1->getBufferObject();
+        ::fwMemory::BufferObject::sptr bo2 = array2->getBufferObject();
+
+        {
+            ::fwDataCamp::visitor::RecursiveLock visitor(composite);
+
+            CPPUNIT_ASSERT(!composite->getMutex().try_lock());
+            CPPUNIT_ASSERT(!img1->getMutex().try_lock());
+            CPPUNIT_ASSERT(!img2->getMutex().try_lock());
+            CPPUNIT_ASSERT(!array1->getMutex().try_lock());
+            CPPUNIT_ASSERT(!array2->getMutex().try_lock());
+            CPPUNIT_ASSERT(!bo1->getMutex().try_lock());
+            CPPUNIT_ASSERT(!bo2->getMutex().try_lock());
+        }
+
+        CPPUNIT_ASSERT(composite->getMutex().try_lock());
+        CPPUNIT_ASSERT(img1->getMutex().try_lock());
+        CPPUNIT_ASSERT(img2->getMutex().try_lock());
+        CPPUNIT_ASSERT(array1->getMutex().try_lock());
+        CPPUNIT_ASSERT(array2->getMutex().try_lock());
+        CPPUNIT_ASSERT(bo1->getMutex().try_lock());
+        CPPUNIT_ASSERT(bo2->getMutex().try_lock());
+
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}  // namespace ut
+}  // namespace fwDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ActivitySeriesTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ActivitySeriesTest.cpp
new file mode 100644
index 0000000..59f5f53
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ActivitySeriesTest.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwDataCamp/Version.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+
+#include "DataCampHelper.hpp"
+#include "fwMedDataCamp/ActivitySeriesTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::ActivitySeriesTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void ActivitySeriesTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void ActivitySeriesTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesTest::propertiesTest()
+{
+    const ::fwMedData::ActivitySeries::ConfigIdType activity_config_id = "Visu2D";
+
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                       ("patient")
+                                                                       ("study")
+                                                                       ("equipment")
+                                                                       ("instance_uid")
+                                                                       ("modality")
+                                                                       ("date")
+                                                                       ("time")
+                                                                       ("performing_physicians_name")
+                                                                       ("description")
+                                                                       ("activity_config_id")
+                                                                       ("data");
+
+    ::fwData::Composite::sptr data = ::fwData::Composite::New();
+
+    ::fwMedData::ActivitySeries::sptr obj = ::fwMedData::ActivitySeries::New();
+    obj->setActivityConfigId(activity_config_id);
+    obj->setData(data);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@activity_config_id", activity_config_id);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@data", obj->getData());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@data", data);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/EquipmentTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/EquipmentTest.cpp
new file mode 100644
index 0000000..54f4835
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/EquipmentTest.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include "fwMedDataCamp/EquipmentTest.hpp"
+#include "DataCampHelper.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::EquipmentTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void EquipmentTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void EquipmentTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void EquipmentTest::propertiesTest()
+{
+    const std::string institution_name = "IHU Strasbourg / IRCAD";
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                       ("institution_name");
+
+    ::fwMedData::Equipment::sptr obj = ::fwMedData::Equipment::New();
+    obj->setInstitutionName(institution_name);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@institution_name", institution_name);
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ImageSeriesTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ImageSeriesTest.cpp
new file mode 100644
index 0000000..6d8b6a9
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ImageSeriesTest.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwTest/generator/Image.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "DataCampHelper.hpp"
+#include "fwMedDataCamp/ImageSeriesTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::ImageSeriesTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void ImageSeriesTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void ImageSeriesTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesTest::propertiesTest()
+{
+    const std::string instance_uid = "123456789";
+    const std::string modality = "CT";
+    const std::string date = "20130214";
+    const std::string time = "143328";
+    const std::string performing_physicians_name = "John Doe";
+    const std::string description = "description";
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                        ("image")
+                                                                        ("patient")
+                                                                        ("study")
+                                                                        ("equipment")
+                                                                        ("instance_uid")
+                                                                        ("modality")
+                                                                        ("date")
+                                                                        ("time")
+                                                                        ("performing_physicians_name")
+                                                                        ("description");
+
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(img, ::fwTools::Type::create("uint8"));
+    ::fwMedData::DicomValuesType performing_physicians_names;
+    performing_physicians_names.push_back(performing_physicians_name);
+
+    ::fwMedData::ImageSeries::sptr obj = ::fwMedData::ImageSeries::New();
+    obj->setInstanceUID(instance_uid);
+    obj->setModality(modality);
+    obj->setDate(date);
+    obj->setTime(time);
+    obj->setPerformingPhysiciansName(performing_physicians_names);
+    obj->setDescription(description);
+    obj->setImage(img);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@instance_uid", instance_uid);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@modality", modality);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@date", date);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@time", time);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@performing_physicians_name.0", performing_physicians_names[0]);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@description", description);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@image", obj->getImage());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@patient", obj->getPatient());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@study", obj->getStudy());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@equipment", obj->getEquipment());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ModelSeriesTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ModelSeriesTest.cpp
new file mode 100644
index 0000000..c91034a
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/ModelSeriesTest.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwData/Reconstruction.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "DataCampHelper.hpp"
+#include "fwMedDataCamp/ModelSeriesTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::ModelSeriesTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void ModelSeriesTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void ModelSeriesTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesTest::propertiesTest()
+{
+    const std::string instance_uid = "123456789";
+    const std::string modality = "CT";
+    const std::string date = "20130214";
+    const std::string time = "143328";
+    const std::string performing_physicians_name = "John Doe";
+    const std::string description = "description";
+    ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                  ("reconstruction_db")
+                                                                  ("patient")
+                                                                  ("study")
+                                                                  ("equipment")
+                                                                  ("instance_uid")
+                                                                  ("modality")
+                                                                  ("date")
+                                                                  ("time")
+                                                                  ("performing_physicians_name")
+                                                                  ("description");
+
+    ::fwMedData::ModelSeries::ReconstructionVectorType recDB;
+    recDB.push_back(::fwData::Reconstruction::New());
+    recDB.push_back(::fwData::Reconstruction::New());
+    ::fwMedData::DicomValuesType performing_physicians_names;
+    performing_physicians_names.push_back(performing_physicians_name);
+    ::fwMedData::ModelSeries::sptr obj = ::fwMedData::ModelSeries::New();
+
+    obj->setInstanceUID(instance_uid);
+    obj->setModality(modality);
+    obj->setDate(date);
+    obj->setTime(time);
+    obj->setPerformingPhysiciansName(performing_physicians_names);
+    obj->setDescription(description);
+    obj->setReconstructionDB(recDB);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@instance_uid", instance_uid);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@modality", modality);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@date", date);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@time", time);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@performing_physicians_name.0", performing_physicians_names[0]);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@description", description);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@patient", obj->getPatient());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@study", obj->getStudy());
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@reconstruction_db.0", recDB[0]);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@reconstruction_db.1", recDB[1]);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/PatientTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/PatientTest.cpp
new file mode 100644
index 0000000..4611967
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/PatientTest.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/Patient.hpp>
+
+#include "DataCampHelper.hpp"
+#include "fwMedDataCamp/PatientTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::PatientTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void PatientTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void PatientTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::propertiesTest()
+{
+    const std::string name = "Patient Name";
+    const std::string patient_id = "42";
+    const std::string birth_date = "19830214";
+    const std::string sex = "M";
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                       ("name")
+                                                                       ("patient_id")
+                                                                       ("birth_date")
+                                                                       ("sex");
+
+    ::fwMedData::Patient::sptr obj = ::fwMedData::Patient::New();
+    obj->setName(name);
+    obj->setPatientId(patient_id);
+    obj->setBirthdate(birth_date);
+    obj->setSex(sex);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@name", name);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@patient_id", patient_id);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@birth_date", birth_date);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@sex", sex);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/SeriesDBTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/SeriesDBTest.cpp
new file mode 100644
index 0000000..4f23134
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/SeriesDBTest.cpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtomConversion/convert.hpp>
+#include <fwDataCamp/getObject.hpp>
+
+#include "fwMedDataCamp/SeriesDBTest.hpp"
+#include "DataCampHelper.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::SeriesDBTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void SeriesDBTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void SeriesDBTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::propertiesTest()
+{
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                       ("values");
+
+    ::fwMedData::SeriesDB::sptr obj = ::fwMedData::SeriesDB::New();
+    ::fwMedData::SeriesDB::ContainerType vectSeries;
+    vectSeries.push_back(::fwMedData::ImageSeries::New());
+    vectSeries.push_back(::fwMedData::ImageSeries::New());
+    vectSeries.push_back(::fwMedData::ModelSeries::New());
+    obj->setContainer(vectSeries);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@values.0", vectSeries[0]);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@values.1", vectSeries[1]);
+    ::DataCampHelper::compareObjectPropertyValue(obj, "@values.2", vectSeries[2]);
+
+    ::fwAtoms::Object::sptr metaObject = ::fwAtomConversion::convert(obj);
+    ::fwAtoms::Object::AttributesType attrs = metaObject->getAttributes();
+
+    CPPUNIT_ASSERT_MESSAGE("Attributes values not found in SeriesDB atom",
+                           attrs.find("values") != attrs.end());
+
+    ::fwAtoms::Base::sptr baseAtom = metaObject->getAttribute("values");
+    CPPUNIT_ASSERT_MESSAGE("Bad Atom SeriesDB conversion", baseAtom->isSequence());
+
+    ::fwAtoms::Sequence::sptr seqAtom = ::fwAtoms::Sequence::dynamicCast(baseAtom);
+    CPPUNIT_ASSERT_MESSAGE("Sequence dynamicCast failed", seqAtom);
+    CPPUNIT_ASSERT_EQUAL( vectSeries.size(), seqAtom->getValue().size());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/StudyTest.cpp b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/StudyTest.cpp
new file mode 100644
index 0000000..6bffd2c
--- /dev/null
+++ b/SrcLib/core/fwDataCamp/test/tu/src/fwMedDataCamp/StudyTest.cpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/std/vector.hpp>
+
+#include <fwDataCamp/Version.hpp>
+#include <fwMedData/Study.hpp>
+
+#include "DataCampHelper.hpp"
+#include "fwMedDataCamp/StudyTest.hpp"
+
+using namespace ::boost::assign;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataCamp::ut::StudyTest );
+
+namespace fwMedDataCamp
+{
+namespace ut
+{
+
+void StudyTest::setUp()
+{
+    // Set up context before running a test.
+    //Force link with fwDataCamp
+    const int version = ::fwDataCamp::Version::s_CURRENT_VERSION;
+}
+
+void StudyTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::propertiesTest()
+{
+    const std::string instance_uid = "123456789";
+    const std::string date = "20130214";
+    const std::string time = "143328";
+    const std::string referring_physician_name = "John Doe";
+    const std::string description = "description";
+    const std::string patient_age = "42";
+    const ::DataCampHelper::PropertiesNameType dataProperties = list_of("fields")
+                                                                       ("instance_uid")
+                                                                       ("date")
+                                                                       ("time")
+                                                                       ("referring_physician_name")
+                                                                       ("description")
+                                                                       ("patient_age");
+
+    ::fwMedData::Study::sptr obj = ::fwMedData::Study::New();
+    obj->setInstanceUID(instance_uid);
+    obj->setDate(date);
+    obj->setTime(time);
+    obj->setReferringPhysicianName(referring_physician_name);
+    obj->setDescription(description);
+    obj->setPatientAge(patient_age);
+
+    ::DataCampHelper::visitProperties(obj->getClassname(), dataProperties);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@instance_uid", instance_uid);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@date", date);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@time", time);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@referring_physician_name", referring_physician_name);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@description", description);
+    ::DataCampHelper::compareSimplePropertyValue(obj, "@patient_age", patient_age);
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace ut
+} //namespace fwMedDataCamp
diff --git a/SrcLib/core/fwDataIO/CMakeLists.txt b/SrcLib/core/fwDataIO/CMakeLists.txt
new file mode 100644
index 0000000..df27ddf
--- /dev/null
+++ b/SrcLib/core/fwDataIO/CMakeLists.txt
@@ -0,0 +1,15 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwData
+    fwTools
+)
+
+#racy compatibility
+add_definitions(-DPRJ_NAME=\"${NAME}\")
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package( ZLIB REQUIRED )
+fwInclude(${ZLIB_INCLUDE_DIRS})
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
diff --git a/SrcLib/core/fwDataIO/COPYING b/SrcLib/core/fwDataIO/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwDataIO/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwDataIO/COPYING.LESSER b/SrcLib/core/fwDataIO/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwDataIO/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwDataIO/Properties.cmake b/SrcLib/core/fwDataIO/Properties.cmake
new file mode 100644
index 0000000..5edc282
--- /dev/null
+++ b/SrcLib/core/fwDataIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataIO )
+set( VERSION 0.2 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwDataTools fwMath fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataIO/bin/build.options b/SrcLib/core/fwDataIO/bin/build.options
new file mode 100644
index 0000000..13dd635
--- /dev/null
+++ b/SrcLib/core/fwDataIO/bin/build.options
@@ -0,0 +1,15 @@
+TYPE = 'shared'
+
+LIB  = [
+        'fwRuntime_0-3',
+        'fwData_0-1',
+        'fwTools_0-1',
+        'fwCore_0-1',
+        'fwServices_0-1',
+        'fwMath_0-1',
+        'fwDataTools_0-1',
+        'fwComEd_0-1'
+        ]
+USE  = ['boost','boostFilesystem','libxml2','z']
+
+VERSION = '0-2'
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/Namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/Namespace.hpp
new file mode 100644
index 0000000..62b0544
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATAIONAMESPACE_HPP_
+#define FWDATAIONAMESPACE_HPP_
+
+/**
+ * @brief       This namespace fwDataIO contains reader and writer for severals data of the framework.
+ * @namespace   fwDataIO
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwDataIO
+{
+}
+#endif /* FWDATAIONAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/config.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/config.hpp
new file mode 100644
index 0000000..6cd48c8
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/config.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_CONFIG_HPP_
+#define _FWDATAIO_CONFIG_HPP_
+
+#include <assert.h>
+
+#ifdef _WIN32
+
+    #ifdef FWDATAIO_EXPORTS
+    #define FWDATAIO_API __declspec(dllexport)
+    #define FWDATAIO_TEMPLATE_API 
+    #else
+    #define FWDATAIO_API __declspec(dllimport)
+    #define FWDATAIO_TEMPLATE_API extern "C++"
+    #endif
+
+    #define FWDATAIO_CLASS_API
+
+    #pragma warning(disable: 4290)
+    #pragma warning(disable: 4267) // disable warning 'argument'�: conversion de 'size_t' en 'unsigned int', perte possible de donn�es
+    #pragma warning(disable: 4800) // disable warning C4800: 'const int'�: valeur forc�e � la valeur bool�enne 'true' ou 'false' (avertissement sur les performances)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWDATAIO_EXPORTS
+    #define FWDATAIO_API __attribute__ ((visibility("default")))
+    #define FWDATAIO_CLASS_API __attribute__ ((visibility("default")))
+    #define FWDATAIO_TEMPLATE_API extern "C++"
+    #else
+    #define FWDATAIO_API __attribute__ ((visibility("hidden")))
+    #define FWDATAIO_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWDATAIO_TEMPLATE_API extern "C++"
+    #endif
+
+#else
+
+    #define FWDATAIO_API
+    #define FWDATAIO_CLASS_API
+    #define FWDATAIO_TEMPLATE_API extern "C++"
+
+#endif
+
+#endif //_FWDATAIO_CONFIG_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/ArrayReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/ArrayReader.hpp
new file mode 100644
index 0000000..b201129
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/ArrayReader.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_ARRAYREADER_HPP_
+#define _FWDATAIO_READER_ARRAYREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+/**
+ * @brief   Array Reader. Read file format .raw
+ * @class   ArrayReader
+ * 
+ * @date    2011
+ *
+ * Ircad reader to read a ::fwData::Array on filesystem in a raw format.
+ */
+class FWDATAIO_CLASS_API ArrayReader :  public GenericObjectReader< ::fwData::Array >,
+                                                public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ArrayReader)(GenericObjectReader< ::fwData::Array>),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New<ArrayReader>
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API ArrayReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~ArrayReader();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void read();
+
+    /// Defines extension supported by this reader ".raw"
+    FWDATAIO_API std::string extension();
+
+};
+
+} // namespace reader
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_ARRAYREADER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/DictionaryReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/DictionaryReader.hpp
new file mode 100644
index 0000000..c7d1251
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/DictionaryReader.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_DICTIONARY_HPP_
+#define _FWDATAIO_READER_DICTIONARY_HPP_
+
+#include <boost/shared_ptr.hpp>
+#include <boost/filesystem.hpp>
+
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwData {
+    class StructureTraitsDictionary;
+}
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Dictionary reader. Read file with .dic extension.
+ * @class   DictionaryReader
+ * 
+ * @date    2011
+ *
+ * Ircad reader to read a ::fwData::StructureTraitsDictionary on filesystem which the file format
+ * is .dic. This is an ascii file the structure of each line is defined on the first line of this file.
+ */
+class FWDATAIO_CLASS_API DictionaryReader:
+   public GenericObjectReader< ::fwData::StructureTraitsDictionary>,
+   public ::fwData::location::enableSingleFile< IObjectReader >
+
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (DictionaryReader)(GenericObjectReader< ::fwData::StructureTraitsDictionary >),
+                                            (()),
+                                            ::fwDataIO::reader::factory::New< DictionaryReader >
+                                            );
+
+    /// Constructor. Do nothing .
+    FWDATAIO_API DictionaryReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~DictionaryReader();
+
+    /// Read the file with standard iostream API.
+    FWDATAIO_API virtual void read();
+
+    FWDATAIO_API std::string  extension();
+
+    /// Returns the default dictionary path ( file in rc directory path of fwDataIO library )
+    FWDATAIO_API static ::boost::filesystem::path  getDefaultDictionaryPath();
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_DICTIONARY_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/GenericObjectReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GenericObjectReader.hpp
new file mode 100644
index 0000000..9b89a8d
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GenericObjectReader.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_GENERICOBJECTREADER_HPP_
+#define _FWDATAIO_READER_GENERICOBJECTREADER_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/IObjectReader.hpp"
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   generic class for all object readers.
+ * @class   GenericObjectReader
+ * 
+ * @date    2009
+ *
+ * This class adds 2 methods to the API of IObjectReader. This
+ * generic reader test the object type given to the method setObject.
+ * And add a new get method getConcreteObject() that returns an object
+ * already cast.
+ */
+template<class DATATYPE>
+class  GenericObjectReader  : virtual public ::fwDataIO::reader::IObjectReader
+{
+
+public :
+
+    /// the object type related
+    typedef DATATYPE DataType;
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (GenericObjectReader<DATATYPE>)(::fwDataIO::reader::IObjectReader) );
+
+    /// Constructor. Do nothing.
+    GenericObjectReader(){};
+
+    virtual std::string extension() {return ("");}
+
+    /// Destructor. Do nothing.
+    virtual ~GenericObjectReader(){};
+
+    /**
+     * @brief m_object setter.
+     * @param[out] obj replace weakptr m_object of the instance reader
+     *
+     * This method overload setObject to ensure that given object correspond to DATATYPE
+     */
+    virtual void setObject( ::fwTools::Object::sptr obj )
+    {
+        assert ( ::boost::dynamic_pointer_cast< DataType >( obj ) );
+        m_object = obj;
+    }
+
+    /**
+     * @brief m_object getter.
+     * @return m_object
+     *
+     * This method automatic cast object in correct DataType.
+     */
+    virtual ::boost::shared_ptr< DataType > getConcreteObject()
+    {
+        return ::boost::dynamic_pointer_cast< DataType >( getObject() );
+    }
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_GENERICOBJECTREADER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzArrayReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzArrayReader.hpp
new file mode 100644
index 0000000..751a59d
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzArrayReader.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_GZARRAYREADER_HPP_
+#define _FWDATAIO_READER_GZARRAYREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+/**
+ * @brief   Array Reader. Read file format .raw.gz
+ * @class   GzArrayReader
+ * 
+ * @date    2011
+ *
+ * Ircad reader to read a ::fwData::Array on filesystem which the file format
+ * is .raw.gz. This format is basic. The buffer is writen in a file with zlib.
+ */
+class FWDATAIO_CLASS_API GzArrayReader :  public GenericObjectReader< ::fwData::Array >,
+                                                public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((GzArrayReader)(GenericObjectReader< ::fwData::Array>),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< GzArrayReader >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API GzArrayReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~GzArrayReader();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void read();
+
+    /// Defines extension supported by this reader ".raw.gz"
+    FWDATAIO_API std::string extension();
+
+};
+
+} // namespace reader
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_GZARRAYREADER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzBufferImageReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzBufferImageReader.hpp
new file mode 100644
index 0000000..17e4bde
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/GzBufferImageReader.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_GZBUFFER_HPP_
+#define _FWDATAIO_READER_GZBUFFER_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Image Reader. Read file format .raw.gz
+ * @class   GzBufferImageReader
+ * 
+ * @date    2009
+ *
+ * Ircad reader to read a ::fwData::Image on filesystem which the file format
+ * is .raw.gz. This format is basic. The buffer is writen in a file with zlib.
+ */
+class FWDATAIO_CLASS_API GzBufferImageReader :  public GenericObjectReader< ::fwData::Image >,
+                                                public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((GzBufferImageReader)(GenericObjectReader< ::fwData::Image>),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< GzBufferImageReader >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API GzBufferImageReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~GzBufferImageReader();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void read();
+
+    /// Defines extension supported by this reader ".raw.gz"
+    FWDATAIO_API std::string extension();
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_GZBUFFER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/IObjectReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/IObjectReader.hpp
new file mode 100644
index 0000000..4d884f6
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/IObjectReader.hpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_IOBJECTREADER_HPP_
+#define _FWDATAIO_READER_IOBJECTREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include <fwData/location/ILocation.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/factory/new.hpp"
+#include "fwDataIO/reader/registry/detail.hpp"
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Base class for all object readers.
+ * @class   IObjectReader
+ * 
+ * @date    2009
+ *
+ * This class defines the API to use basic object readers. This reader is not
+ * service. Their equivalent exist as services see ::io::IReader. To read an
+ * object with this class, use setLocation and setOject method before execute
+ * the method read. Reading modify the object given in parameter with the
+ * method setOject.
+ */
+class FWDATAIO_CLASS_API IObjectReader : public ::fwCore::BaseObject
+{
+
+public :
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IObjectReader) );
+
+    typedef ::fwDataIO::reader::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwDataIO::reader::registry::get()->addFactory(T::classname(), &::fwDataIO::reader::factory::New<T>);
+        }
+    };
+
+    /**
+     * @brief Defines an reader interface.
+     *
+     * This method (re)init the object given in parameter of setObject method.
+     */
+    FWDATAIO_API virtual void read() = 0;
+
+    /**
+     * @brief m_object setter.
+     * @param[out] _pObject replace weakptr m_object of the instance reader
+     * @note m_object is save in class with a weakptr
+     * @note This object can be get with the method getObject()
+     */
+    FWDATAIO_API virtual void setObject( ::fwTools::Object::sptr _pObject );
+
+    /**
+     * @brief m_object getter.
+     *
+     * @return m_object
+     * @note m_object is saved in reader with a weakptr
+     */
+    FWDATAIO_API virtual ::fwTools::Object::sptr getObject();
+
+    /**
+     * @brief m_location setter.
+     * @param[in] _location set location where object will be read
+     */
+    FWDATAIO_API virtual void setLocation( const ::fwData::location::ILocation::sptr _location );
+
+    /**
+     * @brief m_location getter.
+     *
+     * @return m_location
+     */
+    FWDATAIO_API virtual ::fwData::location::ILocation::sptr getLocation();
+
+    FWDATAIO_API virtual std::string  extension()=0;
+
+protected :
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API IObjectReader();
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~IObjectReader();
+
+    /**
+     * @brief Object result of reading process.
+     *
+     * This object is given in parameter of setObject method but it is conserved with a weakptr.
+     */
+    ::fwTools::Object::wptr m_object;
+
+    /// Object location ( file path, directory path, url, etc )
+    ::fwData::location::ILocation::sptr m_location;
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_IOBJECTREADER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/MeshReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/MeshReader.hpp
new file mode 100644
index 0000000..3010d5b
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/MeshReader.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_MESH_HPP_
+#define _FWDATAIO_READER_MESH_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwData {
+    class Mesh;
+}
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Mesh reader. Read file format .trian
+ * @class   MeshReader
+ * 
+ * @date    2011
+ *
+ * Load trian file into fwData::Mesh
+ */
+class FWDATAIO_CLASS_API MeshReader :
+    public GenericObjectReader< ::fwData::Mesh>,
+    public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MeshReader)(GenericObjectReader< ::fwData::Mesh >),
+                                            (()),
+                                            ::fwDataIO::reader::factory::New< MeshReader >
+                                            );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API MeshReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~MeshReader();
+
+    /// Read the file with standard iostream API.
+    FWDATAIO_API virtual void read();
+
+    FWDATAIO_API std::string  extension();
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_MESH_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/Namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/Namespace.hpp
new file mode 100644
index 0000000..d2fe952
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATAIOREADERNAMESPACE_HPP_
+#define FWDATAIOREADERNAMESPACE_HPP_
+
+namespace fwDataIO
+{
+/**
+ * @brief       This namespace fwDataIO::reader contains reader for several data of the framework.
+ * @namespace   fwDataIO::reader
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace reader
+{
+
+}
+}
+#endif /* FWDATAIOREADERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/TagReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TagReader.hpp
new file mode 100644
index 0000000..ae4b0b3
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TagReader.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_TAG_HPP_
+#define _FWDATAIO_READER_TAG_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwData {
+    class Tag;
+}
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Tag Reader. Read file format .tag
+ * @class   TagReader
+ * 
+ * @date    2009
+ *
+ * Ircad reader to read a ::fwData::Tag on filesystem which the file format
+ * is .tag.
+ */
+class FWDATAIO_CLASS_API TagReader :
+    public GenericObjectReader< ::fwData::Tag >,
+    public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+    fwCoreClassDefinitionsWithFactoryMacro( (TagReader)(GenericObjectReader< ::fwData::Tag >),
+                                            (()),
+                                            ::fwDataIO::reader::factory::New< TagReader >
+                                           );
+    /// Constructor. Do nothing.
+    FWDATAIO_API TagReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~TagReader();
+
+    /// Read the file .tag.
+    FWDATAIO_API virtual void read();
+
+    /// Defines extension supported by this reader ".tag"
+    FWDATAIO_API std::string  extension();
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+#endif // _FWDATAIO_READER_TAG_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/TransformationMatrix3DReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TransformationMatrix3DReader.hpp
new file mode 100644
index 0000000..7addd9a
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TransformationMatrix3DReader.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef  _DATAIO_READER_TRANSFORMATIONMATRIXREADER3D_HPP_
+#define  _DATAIO_READER_TRANSFORMATIONMATRIXREADER3D_HPP_
+
+#include <boost/shared_ptr.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwDataIO {
+
+namespace reader {
+
+/**
+ * @brief   Reader for transformation of 3D Matrix. Read file format .trf
+ * @class   TransformationMatrix3DReader
+ * 
+ * @date    2009
+ *
+ * Ircad reader to read a ::fwData::TransformationMatrix3D on filesystem which the file format
+ * is .trf. This format is basic. This is an ascii file which contains matrix 4x4 values
+ */
+class FWDATAIO_CLASS_API TransformationMatrix3DReader :
+    public GenericObjectReader< ::fwData::TransformationMatrix3D >,
+    public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((TransformationMatrix3DReader)(GenericObjectReader< ::fwData::TransformationMatrix3D >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< TransformationMatrix3DReader >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API TransformationMatrix3DReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~TransformationMatrix3DReader();
+
+    /// Read the file with standard iostream API.
+    FWDATAIO_API virtual void read();
+
+    /// Defines extension supported by this reader ".trf"
+    FWDATAIO_API virtual std::string extension();
+
+};
+
+}
+
+}
+
+#endif /*  _DATAIO_READER_TRANSFORMATIONMATRIXREADER3D_HPP_ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/TriangularMeshReader.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TriangularMeshReader.hpp
new file mode 100644
index 0000000..4374bda
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/TriangularMeshReader.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_READER_TRIANGULARMESH_HPP_
+#define _FWDATAIO_READER_TRIANGULARMESH_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/GenericObjectReader.hpp"
+
+namespace fwData {
+    class TriangularMesh;
+}
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+/**
+ * @brief   Mesh reader. Read file format .trian
+ * @class   TriangularMeshReader
+ * 
+ * @date    2009
+ *
+ * Ircad reader to read a ::fwData::TriangularMesh on filesystem which the file format
+ * is .trian. This format is basic. This is an ascii file which contains : 1) nb of points
+ * 2) list of points (x,y,z). Line numbers represent index of point in vector 3) nb of triangles
+ * 4) list of triangles with index of points and normals ( often set a -1 )
+ */
+class FWDATAIO_CLASS_API TriangularMeshReader :
+    public GenericObjectReader< ::fwData::TriangularMesh>,
+    public ::fwData::location::enableSingleFile< IObjectReader >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TriangularMeshReader)(GenericObjectReader< ::fwData::TriangularMesh >),
+                                            (()),
+                                            ::fwDataIO::reader::factory::New< TriangularMeshReader >
+                                            );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API TriangularMeshReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~TriangularMeshReader();
+
+    /// Read the file with standard iostream API.
+    FWDATAIO_API virtual void read();
+
+    FWDATAIO_API std::string  extension();
+
+};
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_READER_TRIANGULARMESH_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/namespace.hpp
new file mode 100644
index 0000000..daa62d0
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/namespace.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_READER_FACTORY_NAMESPACE_HPP__
+#define __FWDATAIO_READER_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+/**
+ * @brief       Contains fwDataIO::reader::factory utilities
+ * @namespace   fwDataIO::reader::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace reader
+} // namespace fwDataIO
+
+#endif /* __FWDATA_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/new.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/new.hpp
new file mode 100644
index 0000000..3488544
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/factory/new.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_READER_FACTORY_NEW_HPP__
+#define __FWDATAIO_READER_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+#include <fwTools/DynamicAttributes.hxx>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/reader/registry/detail.hpp"
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+class IObjectReader;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwDataIO::reader::factory::New();
+
+    Key(){};
+};
+
+
+FWDATAIO_API SPTR( ::fwDataIO::reader::IObjectReader ) New( const ::fwDataIO::reader::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_READER_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/detail.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/detail.hpp
new file mode 100644
index 0000000..86621d8
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/detail.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_READER_REGISTRY_DETAIL_HPP__
+#define __FWDATAIO_READER_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwDataIO/config.hpp"
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+class IObjectReader;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwDataIO::reader::IObjectReader) () , KeyType > Type;
+
+FWDATAIO_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_READER_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/macros.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/macros.hpp
new file mode 100644
index 0000000..167db49
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/macros.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_READER_REGISTRY_MACRO_HPP__
+#define __FWDATAIO_READER_REGISTRY_MACRO_HPP__
+
+#include "fwData/registry/detail.hpp"
+
+namespace fwDataIO
+{
+namespace reader
+{
+namespace registry
+{
+
+#define fwDataIOReaderRegisterMacro( classname )                                  \
+    static ::fwDataIO::reader::IObjectReader::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // end namespace registry
+} // end namespace reader
+} // end namespace fwDataIO
+
+#endif /*__FWDATAIO_READER_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/namespace.hpp
new file mode 100644
index 0000000..7d58be9
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/reader/registry/namespace.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_READER_REGISTRY_NAMESPACE_HPP__
+#define __FWDATAIO_READER_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+/**
+ * @brief       Contains fwDataIO::reader::registry details
+ * @namespace   fwDataIO::reader::registry
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace registry
+{
+} // namespace registry
+} // namespace reader
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_READER_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/ArrayWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/ArrayWriter.hpp
new file mode 100644
index 0000000..1cfaf62
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/ArrayWriter.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_ARRAYWRITER_HPP_
+#define _FWDATAIO_WRITER_ARRAYWRITER_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+/**
+ * @brief   Array Writer. Write file format .raw
+ * @class   ArrayWriter
+ * 
+ * @date    2011
+ *
+ * Ircad writer to write a ::fwData::Array on filesystem in a raw format
+ */
+class FWDATAIO_CLASS_API ArrayWriter :  public GenericObjectWriter< ::fwData::Array >,
+                                                public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ArrayWriter)(GenericObjectWriter< ::fwData::Array>),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< ArrayWriter >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API ArrayWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~ArrayWriter();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this writer ".raw"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+} // namespace writer
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_ARRAYWRITER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/GenericObjectWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GenericObjectWriter.hpp
new file mode 100644
index 0000000..c5dec5d
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GenericObjectWriter.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_GENERICOBJECTWRITER_HPP_
+#define _FWDATAIO_WRITER_GENERICOBJECTWRITER_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/IObjectWriter.hpp"
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+/**
+ * @brief   generic class for all object writers.
+ * @class   GenericObjectWriter
+ * 
+ * @date    2009
+ *
+ * This class adds 2 methods to the API of IObjectWriter. This
+ * generic reader test the object type given to the method setObject.
+ * And add a new get method getConcreteObject() that returns an object
+ * already cast.
+ */
+template<class DATATYPE>
+class GenericObjectWriter  : public ::fwDataIO::writer::IObjectWriter
+{
+
+public :
+
+    /// the object type related
+    typedef DATATYPE DataType;
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (GenericObjectWriter<DATATYPE>)(::fwDataIO::writer::IObjectWriter) );
+
+    /// Constructor. Do nothing.
+    GenericObjectWriter() {};
+
+    /// Destructor. Do nothing.
+    virtual ~GenericObjectWriter() {};
+
+    /**
+     * @brief m_object setter.
+     * @param[out] obj replace weakptr m_object of the instance reader
+     *
+     * This method overload setObject to ensure that given object correspond to DATATYPE
+     */
+    virtual void  setObject( ::fwTools::Object::sptr obj)
+    {
+        assert ( ::boost::dynamic_pointer_cast< DataType >( obj ) );
+        m_object = obj;
+    }
+
+    /**
+     * @brief m_object getter.
+     * @return m_object
+     *
+     * This method automatic cast object in correct DataType.
+     */
+    virtual ::boost::shared_ptr< DataType >  getConcreteObject()
+    {
+        return ::boost::dynamic_pointer_cast< DataType >( getObject() );
+    }
+
+};
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_GENERICOBJECTWRITER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzArrayWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzArrayWriter.hpp
new file mode 100644
index 0000000..80383c7
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzArrayWriter.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_GZARRAYWRITER_HPP_
+#define _FWDATAIO_WRITER_GZARRAYWRITER_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+/**
+ * @brief   Array Writer. Write file format .raw.gz
+ * @class   GzArrayWriter
+ * 
+ * @date    2011
+ *
+ * Ircad writer to write a ::fwData::Array on filesystem which the file format
+ * is .raw.gz. This format is basic. The buffer is written in a file with zlib.
+ */
+class FWDATAIO_CLASS_API GzArrayWriter :  public GenericObjectWriter< ::fwData::Array >,
+                                                public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((GzArrayWriter)(GenericObjectWriter< ::fwData::Array>),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< GzArrayWriter >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API GzArrayWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~GzArrayWriter();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this writer ".raw.gz"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+} // namespace writer
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_GZARRAYWRITER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzBufferImageWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzBufferImageWriter.hpp
new file mode 100644
index 0000000..e2c0cf1
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/GzBufferImageWriter.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_GZBUFFER_HPP_
+#define _FWDATAIO_WRITER_GZBUFFER_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+/**
+ * @brief   Image Writer. Write file format .raw.gz
+ * @class   GzBufferImageWriter
+ * 
+ * @date    2009
+ *
+ * Ircad writer to write a ::fwData::Image on filesystem which the file format
+ * is .raw.gz. This format is basic. The buffer is writen in a file with zlib.
+ */
+class FWDATAIO_CLASS_API GzBufferImageWriter :  public GenericObjectWriter< ::fwData::Image >,
+                                                public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((GzBufferImageWriter)(GenericObjectWriter< ::fwData::Image>),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< GzBufferImageWriter >
+                                           );
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API GzBufferImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~GzBufferImageWriter();
+
+    /// Read the file with zlib API.
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this writer ".raw.gz"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_GZBUFFER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/IObjectWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/IObjectWriter.hpp
new file mode 100644
index 0000000..6da900e
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/IObjectWriter.hpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_IOBJECTWRITER_HPP_
+#define _FWDATAIO_WRITER_IOBJECTWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include <fwData/location/ILocation.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/factory/new.hpp"
+#include "fwDataIO/writer/registry/detail.hpp"
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+/**
+ * @brief   Base class for all object writers.
+ * @class   IObjectWriter
+ * 
+ * @date    2009
+ *
+ * This class defines the API to use basic object writers. This writer is not
+ * a service. Their equivalent exist as services see ::io::IWriter. To write an
+ * object with this class, use setLocation and setOject method before execute
+ * the method write.
+ *
+ * @todo Remove m_extension of this class. It must be deprecated.
+ */
+class FWDATAIO_CLASS_API IObjectWriter : public ::fwCore::BaseObject
+{
+
+public :
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IObjectWriter) );
+
+
+    typedef ::fwDataIO::writer::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwDataIO::writer::registry::get()->addFactory(T::classname(), &::fwDataIO::writer::factory::New<T>);
+        }
+    };
+
+    /**
+     * @brief Defines an writer interface.
+     *
+     * This method write the object given in parameter of setObject method.
+     */
+    FWDATAIO_API virtual void write() = 0;
+
+    /**
+     * @brief m_location setter.
+     * @param[in] location set location where object will be saved
+     */
+    FWDATAIO_API virtual void setLocation( const ::fwData::location::ILocation::sptr location );
+
+    /**
+     * @brief m_location getter.
+     *
+     * @return m_location
+     */
+    FWDATAIO_API virtual ::fwData::location::ILocation::sptr getLocation();
+
+    /**
+     * @brief m_object setter.
+     * @param[in] _pObject replace m_object of the instance writer
+     * @note m_object is save in class with a weakptr
+     * @note This object can be get with the method getObject()
+     */
+    FWDATAIO_API virtual void setObject( ::fwTools::Object::sptr _pObject );
+
+    /**
+     * @brief m_object getter.
+     *
+     * @return m_object
+     */
+    FWDATAIO_API virtual ::fwTools::Object::sptr  getObject();
+
+    /**
+     * @brief Return the default filename extension can be dynamic.
+     * @return m_extension
+     *
+     * The extension can be empty (for a repository for example) or must return a string BEGINNING WITH A DOT
+     * by default be empty
+     */
+    FWDATAIO_API virtual std::string  extension()=0;
+
+protected :
+
+    /// Constructor. Do nothing.
+    FWDATAIO_API IObjectWriter();
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~IObjectWriter();
+
+    /**
+     * @brief Object write on filesystem by the process.
+     *
+     * This object is given in parameter of setObject method but it is conserved with a weakptr.
+     */
+    ::fwTools::Object::wptr m_object;
+
+    /// Object location ( file path, directory path, url, etc )
+    ::fwData::location::ILocation::sptr m_location;
+
+    /// Extension of file format
+    std::string m_extension;
+
+};
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_IOBJECTWRITER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/MeshWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/MeshWriter.hpp
new file mode 100644
index 0000000..df28a93
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/MeshWriter.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_MESHWRITER_HPP_
+#define _FWDATAIO_WRITER_MESHWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+/**
+ * @brief   Mesh writer. Write file format .trian
+ * @class   MeshWriter
+ * 
+ * @date    2011
+ *
+ * Ircad writer to write a ::fwData::Mesh (with only triangular cells) on filesystem which the file format
+ * is .trian. This format is basic. This is an ascii file which contains :
+ * 1) nb of points
+ * 2) list of points (x,y,z). Line numbers represent index of point in vector
+ * 3) nb of triangles
+ * 4) list of triangles with index of points and normals ( often set a -1 )
+ */
+class FWDATAIO_CLASS_API MeshWriter :
+    public GenericObjectWriter< ::fwData::Mesh>,
+    public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((MeshWriter)(GenericObjectWriter< ::fwData::Mesh >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< MeshWriter >
+                                           );
+    /// Constructor. Do nothing.
+    FWDATAIO_API MeshWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~MeshWriter();
+
+    /**
+     * Write the file with standard iostream API.
+     * @pre Mesh must contains only triangular cells.
+     */
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this reader ".trian"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_MESHWRITER_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/Namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/Namespace.hpp
new file mode 100644
index 0000000..5ddf488
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATAIOWRITERNAMESPACE_HPP_
+#define FWDATAIOWRITERNAMESPACE_HPP_
+
+namespace fwDataIO
+{
+/**
+ * @brief       This namespace fwDataIO::writer contains writer for severals data of the framework.
+ * @namespace   fwDataIO::writer
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace writer
+{
+
+}
+}
+#endif /* FWDATAIOWRITERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/TransformationMatrix3DWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/TransformationMatrix3DWriter.hpp
new file mode 100644
index 0000000..53d3c3a
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/TransformationMatrix3DWriter.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _DATAIO_READER_TRANSFORMATIONMATRIX3DWRITER_HPP_
+#define _DATAIO_READER_TRANSFORMATIONMATRIX3DWRITER_HPP_
+
+#include <boost/shared_ptr.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+
+namespace fwDataIO {
+
+namespace writer {
+
+/**
+ * @brief   Writer for transformation of 3D Matrix. Write file format .trf
+ * @class   TransformationMatrix3DWriter
+ * 
+ * @date    2009
+ *
+ * Ircad writer to write a ::fwData::TransformationMatrix3D on filesystem which the file format
+ * is .trf. This format is basic. This is an ascii file which contains matrix 4x4 values
+ */
+class FWDATAIO_CLASS_API TransformationMatrix3DWriter :
+    public GenericObjectWriter< ::fwData::TransformationMatrix3D>,
+    public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TransformationMatrix3DWriter)(GenericObjectWriter< ::fwData::TransformationMatrix3D >),
+                                            (()),
+                                            ::fwDataIO::writer::factory::New< TransformationMatrix3DWriter >
+                                           );
+    /// Constructor. Do nothing.
+    FWDATAIO_API TransformationMatrix3DWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~TransformationMatrix3DWriter();
+
+    /// Write the file with standard iostream API.
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this writer ".trf"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+}
+
+}
+
+#endif /* _DATAIO_READER_TRANSFORMATIONMATRIX3DWRITER_HPP_ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/TriangularMeshWriter.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/TriangularMeshWriter.hpp
new file mode 100644
index 0000000..44a77fa
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/TriangularMeshWriter.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_WRITER_TRIANGULARMESH_HPP_
+#define _FWDATAIO_WRITER_TRIANGULARMESH_HPP_
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/GenericObjectWriter.hpp"
+
+namespace fwData {
+    class TriangularMesh;
+}
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+/**
+ * @brief   Mesh writer. Write file format .trian
+ * @class   TriangularMeshWriter
+ * 
+ * @date    2009
+ *
+ * Ircad writer to write a ::fwData::TriangularMesh on filesystem which the file format
+ * is .trian. This format is basic. This is an ascii file which contains : 1) nb of points
+ * 2) list of points (x,y,z). Line numbers represent index of point in vector 3) nb of triangles
+ * 4) list of triangles with index of points and normals ( often set a -1 )
+ */
+class FWDATAIO_CLASS_API TriangularMeshWriter :
+    public GenericObjectWriter< ::fwData::TriangularMesh>,
+    public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((TriangularMeshWriter)(GenericObjectWriter< ::fwData::TriangularMesh >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< TriangularMeshWriter >
+                                           );
+    /// Constructor. Do nothing.
+    FWDATAIO_API TriangularMeshWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Destructor. Do nothing.
+    FWDATAIO_API virtual ~TriangularMeshWriter();
+
+    /// Write the file with standard iostream API.
+    FWDATAIO_API virtual void write();
+
+    /// Defines extension supported by this reader ".trian"
+    FWDATAIO_API virtual std::string  extension();
+
+};
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
+#endif // _FWDATAIO_WRITER_TRIANGULARMESH_HPP_
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/namespace.hpp
new file mode 100644
index 0000000..53144b1
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/namespace.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_WRITER_FACTORY_NAMESPACE_HPP__
+#define __FWDATAIO_WRITER_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+/**
+ * @brief       Contains fwDataIO::writer::factory utilities
+ * @namespace   fwDataIO::reader::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace writer
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_WRITER_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/new.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/new.hpp
new file mode 100644
index 0000000..5f95036
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/factory/new.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_WRITER_FACTORY_NEW_HPP__
+#define __FWDATAIO_WRITER_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+#include <fwTools/DynamicAttributes.hxx>
+
+#include "fwDataIO/config.hpp"
+#include "fwDataIO/writer/registry/detail.hpp"
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+class IObjectWriter;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwDataIO::writer::factory::New();
+
+    Key(){};
+};
+
+
+FWDATAIO_API SPTR( ::fwDataIO::writer::IObjectWriter ) New( const ::fwDataIO::writer::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_WRITER_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/detail.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/detail.hpp
new file mode 100644
index 0000000..dbc9a95
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/detail.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_WRITER_REGISTRY_DETAIL_HPP__
+#define __FWDATAIO_WRITER_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwDataIO/config.hpp"
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+class IObjectWriter;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwDataIO::writer::IObjectWriter) () , KeyType > Type;
+
+FWDATAIO_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_WRITER_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/macros.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/macros.hpp
new file mode 100644
index 0000000..71c80e3
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/macros.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_WRITER_REGISTRY_MACRO_HPP__
+#define __FWDATAIO_WRITER_REGISTRY_MACRO_HPP__
+
+#include "fwData/registry/detail.hpp"
+
+namespace fwDataIO
+{
+namespace writer
+{
+namespace registry
+{
+
+#define fwDataIOWriterRegisterMacro( classname )                                  \
+    static ::fwDataIO::writer::IObjectWriter::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // end namespace registry
+} // end namespace writer
+} // end namespace fwDataIO
+
+#endif /*__FWDATAIO_WRITER_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/namespace.hpp b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/namespace.hpp
new file mode 100644
index 0000000..60014d4
--- /dev/null
+++ b/SrcLib/core/fwDataIO/include/fwDataIO/writer/registry/namespace.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATAIO_WRITER_REGISTRY_NAMESPACE_HPP__
+#define __FWDATAIO_WRITER_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+/**
+ * @brief       Contains fwDataIO::writer::registry details
+ * @namespace   fwDataIO::reader::registry
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace registry
+{
+} // namespace registry
+} // namespace writer
+
+} // namespace fwDataIO
+
+#endif /* __FWDATAIO_WRITER_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwDataIO/rc/OrganDictionary.dic b/SrcLib/core/fwDataIO/rc/OrganDictionary.dic
new file mode 100644
index 0000000..137a933
--- /dev/null
+++ b/SrcLib/core/fwDataIO/rc/OrganDictionary.dic
@@ -0,0 +1,187 @@
+# Name;(R,G,B,A);Category(ies);Class;Attachement;NativeExp;NativeExpGeo;AnatomicRegion;PropertyCategory;PropertyType
+World;(0,0,0,100);Body;No_constraint;;;;;;
+Skin;(255,179,140,100);Body;Environment;;;;Entire_Body;Anat_Struct;Entire_Body
+Bones;(242,242,217,100);Body;Organ;;;;Bone;Anat_Struct;Bone
+Muscles;(63,0,0,100);Body;Organ;;;;Entire_Body;Anat_Struct;Entire_Body
+Arteries;(255,26,26,100);Body;Vessel;;;;Artery;Anat_Struct;Artery
+Veins;(51,102,255,100);Body;Vessel;;;;Vein;Anat_Struct;Vein
+Tumor;(0,179,0,100);Body;Lesion;;;;;Altered_Struct;
+Cyst;(204,255,140,100);Body;Lesion;;;;Cyst;Altered_Struct;T_Cyst
+Nerves;(255,255,255,100);Body;Vessel;;;;;Anat_Struct;
+Aera;(255,230,230,100);Head;Organ;;;;;Anat_Struct;
+Brain;(255,230,255,100);Head;Organ;;;;Brain;Anat_Struct;Brain
+Eyes;(255,255,255,100);Head;Organ;;;;;Anat_Struct;
+Mandible;(242,242,217,100);Head;Organ;;;;;Anat_Struct;
+Cranium;(242,242,217,100);Head;Organ;;;;;Anat_Struct;
+Right_Lobe;(255,179,128,100);Head;Functional;Brain;;;Brain;;Brain
+Left_Lobe;(255,179,128,100);Head;Functional;Brain;;;Brain;;Brain
+Thyroid;(255,179,128,100);Neck;Organ;;;;Thyroid;Anat_Struct;
+Thyroid_Tumor;(0,179,0,100);Neck;Lesion;Thyroid;;;Thyroid;Altered_Struct;
+Thyroid_Cyst;(204,255,140,100);Neck;Lesion;Thyroid;;;Thyroid;Altered_Struct;
+Parathyroid_P1;(255,179,128,100);Neck;Lesion;;;;Parathyroid;Anat_Struct;Parathyroid
+Parathyroid_P2;(255,179,128,100);Neck;Lesion;;;;Parathyroid;Anat_Struct;Parathyroid
+Parathyroid_P3;(255,179,128,100);Neck;Lesion;;;;Parathyroid;Anat_Struct;Parathyroid
+Parathyroid_P4;(255,179,128,100);Neck;Lesion;;;;Parathyroid;Anat_Struct;Parathyroid
+Trachea;(255,230,230,100);Neck, Thorax;Vessel;;;;Trachea;Anat_Struct;Trachea
+Oesophagus;(255,140,166,100);Neck,Thorax,Abdomen;Organ;;;;;Anat_Struct;
+Right_Lung;(255,204,230,100);Thorax;Organ;;;;Lung;Anat_Struct;Lung
+Right_Lung_Tumor;(0,179,0,100);Thorax;Lesion;Right_Lung;;;;Altered_Struct;
+Right_Lung_Cyst;(204,255,140,100);Thorax;Lesion;Right_Lung;;;;Altered_Struct;T_Cyst
+Left_Lung;(255,204,230,100);Thorax;Organ;;;;Lung;Anat_Struct;Lung
+Left_Lung_Tumor;(0,179,0,100);Thorax;Lesion;Left_Lung;;;;Altered_Struct;
+Left_Lung_Cyst;(204,255,140,100);Thorax;Lesion;Left_Lung;;;;Altered_Struct;T_Cyst
+Bronchus;(255,230,230,100);Thorax;Vessel;;;;Bronchus;Anat_Struct;Bronchus
+Heart;(179,0,0,100);Thorax;Organ;;;inter(shadow(world(type(Right_Lung)),X+,false),shadow(world(type(Left_Lung)),X-,false));Heart;Anat_Struct;Heart
+Right_Atrium;(128,0,255,100);Thorax;Functional;Heart;;;;;
+Right_Ventricle;(128,0,128,100);Thorax;Functional;Heart;;;;;
+Left_Atrium;(248,61,7,100);Thorax;Functional;Heart;;;;;
+Left_Ventricle;(255,128,128,100);Thorax;Functional;Heart;;;;;
+Pulmonary_Vein;(250,70,10,100);Thorax;Vessel;;;;Pulmonary_Vein;Anat_Struct;T_Pulmonary_Vein
+Pulmonary_Artery;(100,75,255,100);Thorax;Vessel;;;;Pulmonary_Artery;Anat_Struct;Pulmonary_Artery
+Thymus;(255,179,128,100);Thorax;Organ;;;;;Anat_Struct;
+Diaphragm;(63,0,0,100);Thorax;Organ;;;;Diaphragm;Anat_Struct;Diaphragm
+Aorta;(255,26,26,100);Thorax;Vessel;;;;;Anat_Struct;
+Superior_Vena_Cava;(51,102,255,100);Thorax;Vessel;;;;Superior_Vena_Cava;Anat_Struct;Superior_Vena_Cava
+Inferior_Vena_Cava;(51,102,255,100);Thorax;Vessel;;;;Inferior_Vena_Cava;Anat_Struct;Inferior_Vena_Cava
+Portal_Vein;(0,84,255,100);Abdomen;Vessel;;;;Portal_Vein;Anat_Struct;Portal_Vein
+Hepatic_Veins;(0,255,255,100);Abdomen;Vessel;;;;Hepatic_Vein;Anat_Struct;Hepatic_Vein
+Pancreas;(255,179,102,100);Abdomen;Organ;;;;Pancreas;Anat_Struct;Pancreas
+Pancreas_Tumor;(0,179,0,100);Abdomen;Lesion;Pancreas;;;;Altered_Struct;
+Pancreas_Cyst;(204,255,140,100);Abdomen;Lesion;Pancreas;;;;Altered_Struct;T_Cyst
+Wirsung;(153,255,153,100);Abdomen;Vessel;;;;;Anat_Struct;
+Spleen;(153,26,77,100);Abdomen;Organ;;;;Spleen;Anat_Struct;Spleen
+Spleen_Tumor;(0,179,0,100);Abdomen;Lesion;Spleen;;;;Altered_Struct;
+Spleen_Cyst;(204,255,140,100);Abdomen;Lesion;Spleen;;;;Altered_Struct;T_Cyst
+Right_Kidney;(128,51,26,100);Abdomen;Organ;;;;;Anat_Struct;
+Right_Kidney_Tumor;(0,179,0,100);Abdomen;Lesion;Right_Kidney;;;;Altered_Struct;
+Right_Kidney_Cyst;(204,255,140,100);Abdomen;Lesion;Right_Kidney;;;;Altered_Struct;T_Cyst
+Left_Kidney;(128,51,26,100);Abdomen;Organ;;;;;Anat_Struct;
+Left_Kidney_Tumor;(0,179,0,100);Abdomen;Lesion;Left_Kidney;;;;Altered_Struct;
+Left_Kidney_Cyst;(204,255,140,100);Abdomen;Lesion;Left_Kidney;;;;Altered_Struct;T_Cyst
+Right_Ureter;(255,191,38,100);Abdomen,Pelvis;Organ;;;;;Anat_Struct;
+Left_Ureter;(255,191,38,100);Abdomen,Pelvis;Organ;;;;;Anat_Struct;
+Right_Adrenal;(255,153,77,100);Abdomen;Organ;;;;;Anat_Struct;
+Right_Adrenal_Tumor;(0,179,0,100);Abdomen;Lesion;Right_Adrenal;;;;Altered_Struct;
+Left_Adrenal;(255,153,77,100);Abdomen;Organ;;;;;Anat_Struct;
+Left_Adrenal_Tumor;(0,179,0,100);Abdomen;Lesion;Left_Adrenal;;;;Altered_Struct;
+Digestive_Tract;(255,153,153,100);Abdomen;Organ;;;;;Anat_Struct;
+Stomach;(255,153,153,100);Abdomen;Organ;;;;Stomach;Anat_Struct;Stomach
+Duodenum;(255,166,153,100);Abdomen;Organ;;;;Duodenum;Anat_Struct;Duodenum
+Bowel;(255,166,140,100);Abdomen;Organ;;;;;Anat_Struct;
+Colon;(255,179,128,100);Abdomen;Organ;;;;Colon;Anat_Struct;Colon
+Right_Medulla;(255,128,0,100);Abdomen;Functional;Right_Kidney;;;;;
+Left_Medulla;(255,128,0,100);Abdomen;Functional;Left_Kidney;;;;;
+Right_Papilla;(255,150,0,100);Abdomen;Functional;Right_Kidney;;;;;
+Left_Papilla;(255,150,0,100);Abdomen;Functional;Left_Kidney;;;;;
+Right_Calyx;(255,170,0,100);Abdomen;Functional;Right_Kidney;;;;;
+Left_Calyx;(255,170,0,100);Abdomen;Functional;Left_Kidney;;;;;
+Right_Renal_Pelvis;(255,190,0,100);Abdomen;Organ;;;;;Anat_Struct;
+Liver;(204,51,51,100);Abdomen;Organ;;;;Liver;Anat_Struct;T_Liver
+Left_Renal_Pelvis;(255,190,0,100);Abdomen;Organ;;;;;Anat_Struct;
+Liver_Tumors;(0,179,0,100);Abdomen;Lesion;Liver;;;Liver;Anat_Struct;
+Liver_Cysts;(204,255,140,100);Abdomen;Lesion;Liver;;;Liver;Anat_Struct;T_Cyst
+Gallbladder;(153,255,153,100);Abdomen;Organ;;;;Gall_Bladder;Anat_Struct;Gall_Bladder
+Biliary_Tract;(153,255,153,100);Abdomen;Vessel;;;;;Anat_Struct;
+Segment_C;(255,0,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_R;(255,255,128,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_M;(255,128,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_L;(255,128,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_PS;(255,255,128,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_AS;(255,128,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_MS;(255,0,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_LS;(255,190,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_RL;(255,255,128,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_RP;(255,128,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_LP;(255,0,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_LL;(255,190,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_1;(255,0,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_2;(255,190,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_3;(255,90,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_4;(255,0,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_5;(255,128,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_6;(255,255,128,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_7;(188,255,188,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_8;(255,65,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_9;(128,0,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_4a;(255,0,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_4b;(180,0,180,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_4c;(203,97,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_4d;(125,60,158,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_5a;(255,128,255,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_5b;(255,194,39,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_5c;(203,161,34,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_5d;(235,255,8,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_8a;(255,65,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_8b;(255,115,69,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_8c;(173,43,0,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Segment_8d;(213,92,5,100);Liver_segments;Functional;Liver;;;Liver;;T_Liver
+Bladder;(255,255,150,100);Pelvis;Organ;;;;Bladder;Anat_Struct;Bladder
+Bladder_Tumor;(0,179,0,100);Pelvis;Lesion;Bladder;;;;Altered_Struct;
+Urethra;(255,255,190,100);Pelvis;Organ;;;;;Anat_Struct;
+Prostate;(255,102,102,100);Pelvis;Organ;;;;Prostate;Anat_Struct;T_Prostate
+Prostate_Tumor;(0,179,0,100);Pelvis;Lesion;Prostate;;;Prostate;Altered_Struct;
+Uterus;(233,150,150,100);Pelvis;Organ;;;;;Anat_Struct;
+Uterus_Tumor;(0,179,0,100);Pelvis;Lesion;Uterus;;;;Altered_Struct;
+Uterus_Cyst;(204,255,140,100);Pelvis;Lesion;Uterus;;;;Altered_Struct;T_Cyst
+Rectum;(255,179,128,100);Pelvis;Organ;;;;Rectum;Anat_Struct;Rectum
+Sigmoid;(255,179,128,100);Pelvis;Organ;;;;Sigmoid_Colon;Anat_Struct;Sigmoid_Colon
+Humerus;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Radius;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Ulna;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Lunate;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Scaphoid;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Triquetrum;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Pisiform;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Hamate;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Capitale;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Trapezium;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Trapezoid;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Metacarpal_1;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Metacarpal_2;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Metacarpal_3;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Metacarpal_4;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Metacarpal_5;(242,242,217,100);Arm;Organ;;;;;Anat_Struct;
+Femur;(242,242,217,100);Leg;Organ;;;;;Anat_Struct;
+Tibia;(242,242,217,100);Leg;Organ;;;;;Anat_Struct;
+Fibula;(242,242,217,100);Leg;Organ;;;;;Anat_Struct;
+Patella;(242,242,217,100);Leg;Organ;;;;;Anat_Struct;
+Tendon;(255,180,180,100);Arm, Leg;Organ;;;;;Anat_Struct;
+Ligament;(200,200,200,100);Arm, Leg;Organ;;;;;Anat_Struct;
+Cartilage;(255,255,128,100);Arm, Leg;Organ;;;;;Anat_Struct;
+Meniscus;(200,255,200,100);Arm, Leg;Organ;;;;;Anat_Struct;
+synovia;(200,200,255,100);Arm, Leg;Organ;;;;;Anat_Struct;
+Tool;(128,128,153,100);Other;Tool;;;;;Physic_Object;
+Peritoneum;(180,210,255,100);Abdomen;Functional;;;;;;
+Carotid;(255,26,26,100);Head;Vessel;;;;;Anat_Struct;
+Left_Femoral_Artery;(255,26,26,100);Leg;Vessel;;;;Femoral_Artery;Anat_Struct;Femoral_Artery
+Right_Femoral_Artery;(255,26,26,100);Leg;Vessel;;;;Femoral_Artery;Anat_Struct;Femoral_Artery
+Superior_Mesenteric_Artery;(255,26,26,100);Abdomen;Vessel;;;;Mesenteric_Artery;Anat_Struct;Mesenteric_Artery
+Inferior_Mesenteric_Artery;(255,26,26,100);Abdomen;Vessel;;;;Mesenteric_Artery;Anat_Struct;Mesenteric_Artery
+Mesenteric_Vein;(51,102,255,100);Abdomen;Vessel;;;;Mesenteric_Vein;Anat_Struct;Mesenteric_Vein
+Jugular_Veins;(51,102,255,100);Head,Neck;Vessel;;;;;Anat_Struct;
+Right_Renal_Artery;(255,26,26,100);Abdomen;Vessel;;;;Renal_Artery;Anat_Struct;Renal_Artery
+Left_Renal_Artery;(255,26,26,100);Abdomen;Vessel;;;;Renal_Artery;Anat_Struct;Renal_Artery
+Right_Renal_Vein;(51,102,255,100);Abdomen;Vessel;;;;Renal_Vein;Anat_Struct;Renal_Vein
+Left_Renal_Vein;(51,102,255,100);Abdomen;Vessel;;;;Renal_Vein;Anat_Struct;Renal_Vein
+Gastric_Ring;(255,179,128,100);Abdomen;Tool;;;;;Physic_Object;
+Needle;(255,255,255,100);Other;Tool;;;;;Physic_Object;T_Needle
+Canulla;(255,255,255,100);Other;Tool;;;;;Physic_Object;
+Catheter;(255,255,0,100);Other;Tool;;;;;Physic_Object;T_Catheter
+Clip;(128,128,153,100);Other;Tool;;;;;Physic_Object;
+Drain;(128,128,153,100);Other;Tool;;;;;Physic_Object;
+Stent;(128,128,153,100);Other;Tool;;;;;Physic_Object;
+Landmark;(128,128,153,100);Other;Tool;;;;;Physic_Object;
+Prohesis;(128,128,153,100);Arm,Leg;Organ;;;;;Anat_Struct;
+Plate;(0,179,128,100);Other;Tool;;;;;Physic_Object;
+Atheroma;(242,242,217,100);Body;Lesion;;;;;Altered_Struct;
+Stone;(255,255,255,100);Body;Lesion;;;;;Altered_Struct;
+Calcification;(255,255,255,100);Body;Lesion;;;;;Altered_Struct;
+Ileum;(255,179,128,100);Abdomen;Functional;Bowel;;;;;
+Jujenum;(255,179,128,100);Abdomen;Functional;Bowel;;;;;
+Caecum;(255,179,128,100);Abdomen;Functional;Colon;;;;;
+Right_Colon;(255,179,128,100);Abdomen;Functional;Colon;;;;;
+Transverse_Colon;(255,179,128,100);Abdomen;Functional;Colon;;;;;
+Left_Colon;(255,179,128,100);Abdomen;Functional;Colon;;;;;
+Table;(255,191,191,100);Other;Environment;;;;;Physic_Object;
+Clothes;(242,242,217,100);Other;Environment;;;;;Physic_Object;T_Clothing
+Lymph_Node;(250,100,255,100);Body;Organ;;;;;;
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/ArrayReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/ArrayReader.cpp
new file mode 100644
index 0000000..f4725a4
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/ArrayReader.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+#include <iostream>
+
+#include <boost/cstdint.hpp>
+
+#include <fwCore/Exception.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataIO/reader/ArrayReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::ArrayReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+ArrayReader::ArrayReader(::fwDataIO::reader::IObjectReader::Key key) : ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+ArrayReader::~ArrayReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void ArrayReader::read()
+{
+    assert( ::fwData::location::SingleFile::dynamicCast(m_location) );
+    ::boost::filesystem::path file = ::fwData::location::SingleFile::dynamicCast(m_location)->getPath();
+
+    ::fwData::Array::sptr array = this->getConcreteObject();
+    ::fwComEd::helper::Array arrayHelper(array);
+
+    size_t arraySizeInBytes = array->resize(array->getSize());
+    char* buff = arrayHelper.begin();
+
+    std::ifstream fs(file.string().c_str(), std::ios::in|std::ios::binary|std::ios::ate);
+
+    FW_RAISE_IF("Unable to read " << file, !fs.good());
+
+    std::streampos fileSize = fs.tellg();
+    fs.seekg(0, std::ios::beg);
+
+    FW_RAISE_IF(file << ": Bad file size, expected: " << arraySizeInBytes << ", was: " << fileSize,
+            arraySizeInBytes - fileSize != 0);
+
+    fs.read(buff, arraySizeInBytes);
+
+    fs.close();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  ArrayReader::extension()
+{
+    return (".raw");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/DictionaryReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/DictionaryReader.cpp
new file mode 100644
index 0000000..9962670
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/DictionaryReader.cpp
@@ -0,0 +1,372 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#define FUSION_MAX_VECTOR_SIZE 20
+
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <sstream>
+
+#ifdef DEBUG
+  static std::stringstream spiritDebugStream;
+  #define BOOST_SPIRIT_DEBUG_OUT spiritDebugStream
+  #define BOOST_SPIRIT_DEBUG
+#endif
+
+#include <boost/cstdint.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/detail/case_conv.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/qi_eol.hpp>
+#include <boost/spirit/include/phoenix.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/spirit/home/phoenix/statement/sequence.hpp>
+#include <boost/spirit/home/phoenix/container.hpp>
+#include <boost/spirit/include/phoenix_stl.hpp>
+
+#include <boost/fusion/include/adapt_struct.hpp>
+
+#include <boost/fusion/container.hpp>
+#include <boost/fusion/container/vector/vector.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+#include <fwCore/exceptionmacros.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/StructureTraits.hpp>
+#include <fwData/StructureTraitsHelper.hpp>
+
+#include "fwDataIO/reader/DictionaryReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+#include <string>
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::DictionaryReader );
+
+
+namespace fwDataIO
+{
+
+struct line
+{
+    std::string type;
+    double red;
+    double green;
+    double blue;
+    double alpha;
+    std::string catgegory;
+    std::string organClass;
+    std::string attachment;
+    std::string nativeExp;
+    std::string nativeExpGeo;
+    std::string anatomicRegion;
+    std::string propertyCategory;
+    std::string propertyType;
+};
+}
+
+BOOST_FUSION_ADAPT_STRUCT(
+    ::fwDataIO::line,
+    (std::string, type)
+    (double, red)
+    (double, green)
+    (double, blue)
+    (double, alpha)
+    (std::string, catgegory)
+    (std::string, organClass)
+    (std::string, attachment)
+    (std::string, nativeExp)
+    (std::string, nativeExpGeo)
+    (std::string, anatomicRegion)
+    (std::string, propertyCategory)
+    (std::string, propertyType)
+)
+
+//------------------------------------------------------------------------------
+
+inline std::string trim ( std::string &s )
+{
+    return ::boost::algorithm::trim_copy(s);
+}
+
+//------------------------------------------------------------------------------
+
+/// Reformat string in the following way :first letter is uppercase and the rest is lowercase).
+std::string  reformatString(std::string& expr)
+{
+    std::string trimStr = ::boost::algorithm::trim_copy(expr);
+    std::string result =  ::boost::algorithm::to_upper_copy(trimStr.substr(0,1))
+                          + ::boost::algorithm::to_lower_copy(trimStr.substr(1));
+    return (result);
+}
+
+//------------------------------------------------------------------------------
+/// Return the list of availabe value for the key of the map m.
+
+template< typename MapType >
+std::string getValues(const MapType & m)
+{
+    std::stringstream str;
+    typedef typename MapType::const_iterator const_iterator;
+    const_iterator iter  = m.begin();
+    str << "( " << iter->first;
+    for(; iter != m.end(); ++iter )
+    {
+        str << ", " << iter->first;
+    }
+    str << ") ";
+    return str.str();
+}
+//------------------------------------------------------------------------------
+
+namespace fwDataIO
+{
+
+namespace qi = boost::spirit::qi;
+namespace ascii = boost::spirit::ascii;
+
+
+template <typename Iterator>
+struct line_parser : qi::grammar<Iterator, std::vector <line>() >
+{
+    line_parser() : line_parser::base_type(lines)
+    {
+        using qi::int_;
+        using qi::lit;
+        using qi::_1;
+        using qi::double_;
+        using qi::blank;
+        using qi::alnum;
+        using qi::omit;
+        using ascii::char_;
+        using boost::spirit::qi::eol;
+        using boost::spirit::qi::eoi;
+        using boost::phoenix::construct;
+        namespace phx = boost::phoenix;
+
+        error.clear();
+
+        lines = +( line[phx::push_back(qi::_val, qi::_1)] | comment ) >> eoi  ;
+        comment =  *blank >> lit('#') >> *(char_- eol)>> +qi::eol;
+
+        line = trimmedString >> lit(';')
+                  >> omit[*blank]>> lit('(')
+                    >>  dbl   >> lit(',')
+                    >>  dbl   >> lit(',')
+                    >>  dbl   >> lit(',')
+                    >>  dbl
+                >> lit(')') >> omit[*blank]
+                >> lit(';')
+                >>  stringSet >> lit(';')
+                >>  trimmedString >> lit(';')
+                >>  trimmedString >> lit(';')
+                >>  trimmedStringExpr >> lit(';')
+                >>  trimmedStringExpr >> lit(';')
+                >>  trimmedString >> lit(';')
+                >>  trimmedString >> lit(';')
+                >>  trimmedString
+                >> +qi::eol;
+
+        trimmedString =   str[qi::_val = phx::bind(trim, qi::_1)] ;
+        str =   *( (alnum|char_("_"))[qi::_val += qi::_1] | blank[qi::_val += " "]) ;
+
+        trimmedStringExpr =   stringExpr[qi::_val = phx::bind(trim, qi::_1)] ;
+        stringExpr =   *( (alnum|char_("()_,.+-"))[qi::_val += qi::_1] | blank[qi::_val += " "] ) ;
+
+        stringSet =   stringWithComma[qi::_val = phx::bind(trim, qi::_1)] ;
+        stringWithComma =   *( (alnum| char_(",_"))[qi::_val += qi::_1] | blank[qi::_val += " "] ) ;
+
+
+        dbl = omit[*blank] >> double_ >> omit[*blank];
+
+    #ifdef BOOST_SPIRIT_DEBUG
+      BOOST_SPIRIT_DEBUG_NODE(comment);
+      BOOST_SPIRIT_DEBUG_NODE(trimmedString);
+      BOOST_SPIRIT_DEBUG_NODE(trimmedStringExpr);
+      BOOST_SPIRIT_DEBUG_NODE(stringSet);
+      BOOST_SPIRIT_DEBUG_NODE(dbl);
+      BOOST_SPIRIT_DEBUG_NODE(line);
+      BOOST_SPIRIT_DEBUG_NODE(lines);
+      SLM_DEBUG(spiritDebugStream.str());
+      spiritDebugStream.str( std::string() );
+    #endif
+
+      qi::on_error< qi::fail>
+      (
+              line
+              , phx::ref( (std::ostream &)error )
+                    << phx::val("Error! Expecting ")
+                    << qi::_4                      // what failed?
+                    << phx::val(" here: \"")
+                    << phx::construct<std::string>(qi::_3, qi::_2)   // iterators to error-pos, end
+                    << phx::val("\"")
+                    << std::endl
+        );
+
+    }
+
+    qi::rule<Iterator, double()> dbl;
+    qi::rule<Iterator, std::string()> str;
+    qi::rule<Iterator, std::string()> stringExpr;
+    qi::rule<Iterator, std::string()> stringWithComma;
+
+    qi::rule<Iterator, std::string()> comment;
+    qi::rule<Iterator, std::string()> trimmedStringExpr;
+    qi::rule<Iterator, std::string()> trimmedString;
+    qi::rule<Iterator, std::string()> stringSet;
+
+    qi::rule<Iterator, ::fwDataIO::line()> line;
+    qi::rule<Iterator, std::vector< ::fwDataIO::line >() > lines;
+    std::stringstream error;
+};
+
+namespace reader
+{
+template <typename Iterator>
+std::pair<bool,std::string> parse(Iterator first,  Iterator last, std::string& buf, std::vector<fwDataIO::line>& lines)
+{
+    using boost::spirit::ascii::space;
+    using boost::spirit::ascii::blank;
+    using boost::spirit::qi::eol;
+
+    using boost::spirit::qi::phrase_parse;
+
+    typedef std::string::const_iterator iterator_type;
+    typedef ::fwDataIO::line_parser<iterator_type> line_parser;
+
+    iterator_type iter = buf.begin();
+    iterator_type end = buf.end();
+
+    line_parser grammar; // Our grammar
+
+    bool result = phrase_parse(iter, end, grammar,  space - blank - eol, lines);
+    bool success =  result && (iter == end);
+    std::string msg = grammar.error.str();
+    return std::make_pair( success, msg );
+}
+
+//------------------------------------------------------------------------------
+
+DictionaryReader::DictionaryReader(::fwDataIO::reader::IObjectReader::Key key)
+    : ::fwData::location::enableSingleFile< IObjectReader >(this)
+{
+}
+
+//------------------------------------------------------------------------------
+
+DictionaryReader::~DictionaryReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReader::read()
+{
+    SLM_TRACE_FUNC();
+    assert( ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location) );
+    ::boost::filesystem::path path = ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location)->getPath();
+
+    OSLM_INFO( "[DictionaryReader::read] dictionary file: " << path.string());
+    SLM_ASSERT("Empty path for dictionary file", !path.empty());
+
+    // Reading of the file
+    size_t length;
+    std::string buf;
+    std::ifstream file;
+    file.open(path.string().c_str(), std::ios::binary );
+
+    std::string errorOpen  = "Unable to open " + path.string();
+    FW_RAISE_IF(errorOpen, !file.is_open());
+
+    file.seekg (0, std::ios::end);
+    length = file.tellg();
+    file.seekg (0, std::ios::beg);
+
+
+    buf.resize(length);
+    char *buffer = &buf[0];
+
+    file.read (buffer, length);
+    file.close();
+
+
+    std::vector < ::fwDataIO::line > dicolines;
+    std::pair<bool,std::string> result = parse(buffer, buffer+length, buf, dicolines);
+
+    std::string error = "Unable to parse " + path.string() + " : Bad file format.Error : " + result.second;
+    FW_RAISE_IF(error, !result.first);
+
+    // File the dictionary Structure
+    ::fwData::StructureTraitsDictionary::sptr structDico = getConcreteObject();
+
+    BOOST_FOREACH(::fwDataIO::line line, dicolines)
+    {
+        ::fwData::StructureTraits::sptr newOrgan = ::fwData::StructureTraits::New();
+        newOrgan->setType(line.type);
+
+        std::string classReformated = reformatString(line.organClass);
+        ::fwData::StructureTraitsHelper::ClassTranslatorType::right_const_iterator strClassIter = ::fwData::StructureTraitsHelper::s_CLASSTRANSLATOR.right.find(classReformated);
+        std::string availableValues = getValues(::fwData::StructureTraitsHelper::s_CLASSTRANSLATOR.right);
+        error = "Organ class " + classReformated + " isn't available. Authorized type are " + availableValues;
+        FW_RAISE_IF(error, !(strClassIter != ::fwData::StructureTraitsHelper::s_CLASSTRANSLATOR.right.end()));
+        newOrgan->setClass(strClassIter->second);
+
+        newOrgan->setColor(::fwData::Color::New(line.red/255.0f, line.green/255.0f, line.blue/255.0f, line.alpha/100.0f));
+        std::vector<std::string> categorylist;
+        ::boost::algorithm::split( categorylist, line.catgegory, ::boost::algorithm::is_any_of(",") );
+        ::fwData::StructureTraits::CategoryContainer categories;
+        BOOST_FOREACH(std::string category, categorylist)
+        {
+            std::string catReformated = reformatString(category);
+            ::fwData::StructureTraitsHelper::CategoryTranslatorType::right_const_iterator strCategoryIter = ::fwData::StructureTraitsHelper::s_CATEGORYTRANSLATOR.right.find(catReformated);
+            availableValues = getValues(::fwData::StructureTraitsHelper::s_CATEGORYTRANSLATOR.right);
+            error = "Category " + catReformated + " isn't available. Authorized type are " + availableValues;
+            FW_RAISE_IF(error, !(strCategoryIter != ::fwData::StructureTraitsHelper::s_CATEGORYTRANSLATOR.right.end()));
+            categories.push_back(strCategoryIter->second);
+        }
+        newOrgan->setCategories(categories);
+        newOrgan->setAttachmentType(line.attachment);
+        newOrgan->setNativeExp(line.nativeExp);
+        newOrgan->setNativeGeometricExp(line.nativeExpGeo);
+        newOrgan->setAnatomicRegion(line.anatomicRegion);
+        newOrgan->setPropertyCategory(line.propertyCategory);
+        newOrgan->setPropertyType(line.propertyType);
+        structDico->addStructure(newOrgan);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  DictionaryReader::extension()
+{
+    SLM_TRACE_FUNC();
+    return (".dic");
+}
+
+//------------------------------------------------------------------------------
+
+::boost::filesystem::path  DictionaryReader::getDefaultDictionaryPath()
+{
+#ifdef SPECIALINSTALL
+	std::string share_path = SHAREPATH;
+#else
+	std::string share_path = "./share/";
+#endif
+    std::string dicoPath = std::string(share_path) + PRJ_NAME +"_"+ FWDATAIO_VER + "/OrganDictionary.dic";
+    return dicoPath;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzArrayReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzArrayReader.cpp
new file mode 100644
index 0000000..72d1f5e
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzArrayReader.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/cstdint.hpp>
+
+#include <zlib.h>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataIO/reader/GzArrayReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::GzArrayReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+GzArrayReader::GzArrayReader(::fwDataIO::reader::IObjectReader::Key key) :
+        ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+GzArrayReader::~GzArrayReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void GzArrayReader::read()
+{
+    assert( ::fwData::location::SingleFile::dynamicCast(m_location) );
+    ::boost::filesystem::path file = ::fwData::location::SingleFile::dynamicCast(m_location)->getPath();
+
+    assert( file.empty() ==  false );
+
+    ::fwData::Array::sptr array = this->getConcreteObject();
+    size_t arraySizeInBytes = array->resize(array->getSize());
+    ::fwComEd::helper::Array helper(array);
+    void* buff = helper.getBuffer();
+
+    gzFile rawFile = gzopen(file.string().c_str(), "rb");
+    if ( rawFile == 0 )
+    {
+        gzclose(rawFile);
+        std::string str = "Unable to open ";
+        str+= file.string();
+        throw std::ios_base::failure(str);
+    }
+
+    unsigned int uncompressedBytesReaded = gzread(rawFile, buff, arraySizeInBytes);
+    gzclose(rawFile);
+    if ( uncompressedBytesReaded != arraySizeInBytes )
+    {
+        std::string str = "Unable to read ";
+        str+= file.string();
+        throw std::ios_base::failure(str);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  GzArrayReader::extension()
+{
+    return (".raw.gz");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzBufferImageReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzBufferImageReader.cpp
new file mode 100644
index 0000000..b974290
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/GzBufferImageReader.cpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/cstdint.hpp>
+
+#include <zlib.h>
+
+#include <fwData/Object.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include "fwDataIO/reader/GzBufferImageReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::GzBufferImageReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+GzBufferImageReader::GzBufferImageReader(::fwDataIO::reader::IObjectReader::Key key) : ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+GzBufferImageReader::~GzBufferImageReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void GzBufferImageReader::read()
+{
+    assert( ::fwData::location::SingleFile::dynamicCast(m_location) );
+    ::boost::filesystem::path file = ::fwData::location::SingleFile::dynamicCast(m_location)->getPath();
+
+    assert( file.empty() ==  false );
+
+    ::fwData::Image::sptr image = getConcreteObject();
+    size_t imageSizeInBytes = image->getSizeInBytes();
+
+    image->allocate();
+    ::fwComEd::helper::Image helper(image);
+    char *ptr = static_cast<char*>(helper.getBuffer());
+
+    gzFile rawFile = gzopen(file.string().c_str(), "rb");
+
+    SLM_ASSERT("rawFile not instanced", rawFile);
+    if ( rawFile == 0 )
+    {
+        std::string str = "Unable to open ";
+        str+= file.string();
+        throw std::ios_base::failure(str);
+    }
+
+    int uncompressedbytesreaded;
+    size_t readBytes = 0;
+
+    while ( (uncompressedbytesreaded = gzread(rawFile, ptr + readBytes, imageSizeInBytes - readBytes)) > 0 )
+    {
+        readBytes += uncompressedbytesreaded;
+    }
+
+    gzclose(rawFile);
+
+    if ( uncompressedbytesreaded == -1 )
+    {
+        std::string str = "Unable to read ";
+        str+= file.string();
+        throw std::ios_base::failure(str);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  GzBufferImageReader::extension()
+{
+    return (".raw.gz");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/IObjectReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/IObjectReader.cpp
new file mode 100644
index 0000000..67b7c8a
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/IObjectReader.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/location/ILocation.hpp>
+
+#include "fwDataIO/reader/IObjectReader.hpp"
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+IObjectReader::IObjectReader()
+{}
+
+//------------------------------------------------------------------------------
+
+IObjectReader::~IObjectReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void IObjectReader::setObject( ::fwTools::Object::sptr _pObject )
+{
+    m_object = _pObject;
+}
+
+//------------------------------------------------------------------------------
+
+::fwTools::Object::sptr IObjectReader::getObject()
+{
+    assert( !m_object.expired() );
+    return m_object.lock();
+}
+
+//------------------------------------------------------------------------------
+
+void IObjectReader::setLocation( const ::fwData::location::ILocation::sptr _location )
+{
+    m_location = _location;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::location::ILocation::sptr IObjectReader::getLocation()
+{
+    return m_location;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/MeshReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/MeshReader.cpp
new file mode 100644
index 0000000..3f25214
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/MeshReader.cpp
@@ -0,0 +1,265 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/cstdint.hpp>
+#include <boost/foreach.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/home/phoenix/statement/sequence.hpp>
+#include <boost/spirit/home/phoenix/container.hpp>
+#include <boost/spirit/home/phoenix/bind/bind_member_function.hpp>
+#include <boost/spirit/home/phoenix/core/argument.hpp>
+#include <boost/spirit/home/phoenix/operator/bitwise.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataIO/reader/MeshReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::MeshReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+struct cell_data_offset_generator {
+        ::fwData::Mesh::CellDataOffsetType current;
+        cell_data_offset_generator() {current=0;}
+        int operator()() {
+            ::fwData::Mesh::CellDataOffsetType res = current;
+            current += 3;
+            return res;
+        }
+} ;
+
+//------------------------------------------------------------------------------
+
+
+template <typename Iterator>
+bool parseTrian2(Iterator first, Iterator last, ::fwData::Mesh::sptr mesh)
+{
+    using boost::spirit::qi::ulong_long;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::float_;
+    using boost::spirit::qi::phrase_parse;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
+    using boost::spirit::qi::_3;
+    using boost::spirit::qi::_4;
+    using boost::spirit::qi::_5;
+    using boost::spirit::qi::_6;
+    using boost::spirit::qi::repeat;
+    using boost::spirit::ascii::space;
+    using boost::phoenix::push_back;
+    using boost::phoenix::ref;
+    namespace phx = boost::phoenix;
+
+    unsigned long long int nbPoints;
+    unsigned long long int nbCells;
+
+
+    mesh->allocateCellNormals();
+
+    ::fwData::Array::sptr pointArray           = mesh->getPointsArray();
+    ::fwData::Array::sptr cellDataArray        = mesh->getCellDataArray();
+    ::fwData::Array::sptr cellTypesArray       = mesh->getCellTypesArray();
+    ::fwData::Array::sptr cellDataOffsetsArray = mesh->getCellDataOffsetsArray();
+    ::fwData::Array::sptr cellNormalsArray     = mesh->getCellNormalsArray();
+
+    fwComEd::helper::Array pointHelper(pointArray);
+    fwComEd::helper::Array cellDataHelper(cellDataArray);
+    fwComEd::helper::Array cellNormalsHelper(cellNormalsArray);
+    fwComEd::helper::Array cellDataOffsetsHelper(cellDataOffsetsArray);
+    fwComEd::helper::Array cellTypesHelper(cellTypesArray);
+
+
+    ::fwData::Array::SizeType pointArraySize;
+    ::fwData::Array::SizeType cellArraySize;
+
+    ::fwData::Mesh::PointValueType  *pointArrayBuffer       = 0;
+    ::fwData::Mesh::CellValueType   *cellDataArrayBuffer    = 0;
+    ::fwData::Mesh::NormalValueType *cellNormalsArrayBuffer = 0;
+
+    bool r = phrase_parse(first, last,
+
+        //  Begin grammar
+        (
+            ulong_long
+            [
+                ref(nbPoints) = _1,
+                phx::bind(&::fwData::Mesh::setNumberOfPoints, *mesh, _1),
+                phx::push_back(phx::ref(pointArraySize),phx::ref(nbPoints)),
+                phx::bind(&::fwData::Array::resize, *pointArray, phx::ref(pointArraySize), true) ,
+                ref(pointArrayBuffer) = phx::bind(&::fwComEd::helper::Array::begin< ::fwData::Mesh::PointValueType >, pointHelper )
+            ]
+
+            >> repeat(ref(nbPoints))
+            [
+                (float_ >> float_ >> float_)
+                [
+                    *ref(pointArrayBuffer)++ = _1,
+                    *ref(pointArrayBuffer)++ = _2,
+                    *ref(pointArrayBuffer)++ = _3
+                ]
+            ]
+
+            >> ulong_long
+            [
+                ref(nbCells) = _1,
+                phx::bind(&::fwData::Mesh::setNumberOfCells, *mesh, _1),
+                phx::bind(&::fwData::Mesh::setCellDataSize, *mesh, _1*3),
+                phx::bind(&::fwData::Mesh::adjustAllocatedMemory, *mesh),
+                ref(cellDataArrayBuffer) = phx::bind(&::fwComEd::helper::Array::begin< ::fwData::Mesh::CellValueType >, cellDataHelper ),
+                ref(cellNormalsArrayBuffer) = phx::bind(&::fwComEd::helper::Array::begin< ::fwData::Mesh::NormalValueType >, cellNormalsHelper )
+            ]
+
+            >> repeat(ref(nbCells))
+            [
+                (int_ >> int_ >> int_ >> float_ >> float_ >> float_)
+                [
+                    *ref(cellDataArrayBuffer)++ = _1,
+                    *ref(cellDataArrayBuffer)++ = _2,
+                    *ref(cellDataArrayBuffer)++ = _3,
+                    *ref(cellNormalsArrayBuffer)++ = _4,
+                    *ref(cellNormalsArrayBuffer)++ = _5,
+                    *ref(cellNormalsArrayBuffer)++ = _6
+                ]
+            ]
+        ),
+        //  End grammar
+
+        space
+        );
+
+    std::fill(
+            cellTypesHelper.begin< ::fwData::Mesh::CellTypes >(),
+            cellTypesHelper.end< ::fwData::Mesh::CellTypes >(),
+            static_cast< ::fwData::Mesh::CellTypes >(::fwData::Mesh::TRIANGLE)
+            );
+
+
+    cell_data_offset_generator cellDataOffsetGenerator;
+
+    std::generate(
+            cellDataOffsetsHelper.begin< ::fwData::Mesh::CellDataOffsetType >(),
+            cellDataOffsetsHelper.end< ::fwData::Mesh::CellDataOffsetType >(),
+            cellDataOffsetGenerator
+            );
+
+
+
+    // Check if normals array is filled of -1. values
+    const float normalBadValue = -1.f;
+    float normal = normalBadValue;
+    int &n = *reinterpret_cast<int*>(&normal);
+
+    std::for_each(
+            cellNormalsHelper.begin< int >(),
+            cellNormalsHelper.end< int >(),
+            ref(n) &= boost::phoenix::arg_names::arg1
+            );
+
+    if (normal == -1)
+    {
+        mesh->clearCellNormals();
+        SLM_WARN("normals equals to (-1,-1,-1) : normals removed.");
+    }
+
+    if (first != last) // fail if we didn't get a full match
+        return false;
+    return r;
+
+}
+
+
+
+//------------------------------------------------------------------------------
+
+MeshReader::MeshReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+MeshReader::~MeshReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void MeshReader::read()
+{
+    assert( ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location) );
+    ::boost::filesystem::path path = ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location)->getPath();
+
+    OSLM_TRACE( "Trian file: " << path.string());
+    SLM_ASSERT("Empty path for TriangularMesh file", !path.empty() );
+
+
+    size_t length;
+    //char *buffer;
+    std::string buf;
+    std::ifstream file;
+    file.open(path.string().c_str(), std::ios::binary );
+
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Trian file loading error for " << path.string());
+        throw std::ios_base::failure("Unable to open " + path.string());
+    }
+
+
+    file.seekg (0, std::ios::end);
+    length = file.tellg();
+    file.seekg (0, std::ios::beg);
+
+    //buffer = new char [length];
+    buf.resize(length);
+    char *buffer = &buf[0];
+
+    file.read (buffer, length);
+    file.close();
+
+
+    ::fwData::Mesh::sptr mesh = getConcreteObject();
+
+    mesh->clear();
+
+    if (!parseTrian2(buffer, buffer+length, mesh))
+    {
+        OSLM_ERROR( "Bad file format : " << path.string());
+        throw std::ios_base::failure("Unable to open " + path.string() + " : Bad file format.");
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MeshReader::extension()
+{
+    return (".trian");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/TagReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TagReader.cpp
new file mode 100644
index 0000000..f8f4508
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TagReader.cpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/cstdint.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include <fwData/Tag.hpp>
+#include <fwData/PointList.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/Object.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/reader/TagReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::TagReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+//------------------------------------------------------------------------------
+
+TagReader::TagReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+TagReader::~TagReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void TagReader::read()
+{
+    assert( ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location) );
+    ::boost::filesystem::path path = ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location)->getPath();
+
+
+    OSLM_INFO( "[TagReader::read] Tag file: " << path);
+    assert( path.empty() ==  false );
+
+    ::boost::shared_ptr< ::fwData::Tag > tag = getConcreteObject();
+
+    std::fstream file;
+    file.open(path.string().c_str(), std::fstream::in);
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Tag file loading error for " << path.string());
+        std::string str = "Unable to open ";
+        str+= path.string();
+        throw std::ios_base::failure(str);
+    }
+
+    /// Read content and update tag data structure
+    std::string name, type;
+    int n;
+    file>>name;
+    file>>n;
+    if(n>=1)
+    {
+        file>>type;
+
+        if(type=="ARTAG" || type=="CHESSBOARD" || type=="ARToolKitPlus_MARKER_ID_BCH")
+        {
+            int nbPts;
+            double x,y,z;
+            double radius=0.0;
+            file>>x>>y>>z;
+            file>>nbPts;
+            tag->setType(type);
+            for(int i=0; i < nbPts; i++)
+            {
+                ::fwData::Point::sptr p;
+//              ::fwData::Point::PointCoordArray vPoint;
+                fwVec3d vPoint;
+                file>>vPoint[0]>>vPoint[1]>>vPoint[2]>>radius;
+                p->setCRefCoord(vPoint);
+                tag->getRefPointList()->getRefPoints().push_back(p);
+            }
+        }
+        else
+        {
+            OSLM_ERROR( "Tag file loading error for " << path.string() <<" with type "<<type);
+            std::string str = "Unable to open ";
+            str+= path.string();
+            throw std::ios_base::failure(str);
+        }
+    }
+
+    file.close();
+
+}
+
+//------------------------------------------------------------------------------
+
+std::string TagReader::extension()
+{
+    return (".tag");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/TransformationMatrix3DReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TransformationMatrix3DReader.cpp
new file mode 100644
index 0000000..9fa7853
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TransformationMatrix3DReader.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/reader/TransformationMatrix3DReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::TransformationMatrix3DReader );
+
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+TransformationMatrix3DReader::TransformationMatrix3DReader(::fwDataIO::reader::IObjectReader::Key key) :
+        ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+TransformationMatrix3DReader::~TransformationMatrix3DReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DReader::read()
+{
+    assert( ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location) );
+    ::boost::filesystem::path file = ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location)->getPath();
+
+    assert( ::boost::filesystem::exists(file) ) ;
+
+    std::ifstream inFile(file.string().c_str(), std::ifstream::in );
+    assert( inFile.good() );
+
+    char readedValue = 0;
+    double value;
+    this->getConcreteObject()->getRefCoefficients().clear();
+    this->getConcreteObject()->getRefCoefficients().reserve(16);
+
+    while ( !inFile.eof() && readedValue<16 )
+    {
+        inFile >> value;
+        this->getConcreteObject()->getRefCoefficients().push_back( value );
+        readedValue++;
+    }
+
+    assert(this->getConcreteObject()->getRefCoefficients().size()==16 );
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TransformationMatrix3DReader::extension()
+{
+    return (".trf");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/TriangularMeshReader.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TriangularMeshReader.cpp
new file mode 100644
index 0000000..3e2e400
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/TriangularMeshReader.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/cstdint.hpp>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/home/phoenix/statement/sequence.hpp>
+#include <boost/spirit/home/phoenix/container.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include "fwDataIO/reader/TriangularMeshReader.hpp"
+#include "fwDataIO/reader/registry/macros.hpp"
+
+
+fwDataIOReaderRegisterMacro( ::fwDataIO::reader::TriangularMeshReader );
+
+
+namespace fwDataIO
+{
+
+namespace reader
+{
+
+
+template <typename Iterator>
+bool parseTrian(Iterator first, Iterator last, ::fwData::TriangularMesh::PointContainer &points, ::fwData::TriangularMesh::CellContainer &cells)
+{
+    using boost::spirit::qi::ulong_long;
+    using boost::spirit::qi::int_;
+    using boost::spirit::qi::float_;
+    using boost::spirit::qi::phrase_parse;
+    using boost::spirit::qi::_1;
+    using boost::spirit::qi::_2;
+    using boost::spirit::qi::_3;
+    using boost::spirit::qi::repeat;
+    using boost::spirit::ascii::space;
+    using boost::phoenix::push_back;
+    using boost::phoenix::ref;
+    namespace phx = boost::phoenix;
+
+    unsigned long long int nbPoints;
+    unsigned long long int nbCells;
+
+    ::fwData::TriangularMesh::PointContainer::value_type point(3);
+    float &pa = point[0];
+    float &pb = point[1];
+    float &pc = point[2];
+    ::fwData::TriangularMesh::CellContainer::value_type cell(3);
+    int &ca = cell[0];
+    int &cb = cell[1];
+    int &cc = cell[2];
+
+    bool r = phrase_parse(first, last,
+
+        //  Begin grammar
+        (
+            ulong_long[ phx::ref(nbPoints) = _1, phx::reserve(phx::ref(points), phx::ref(nbPoints)) ] >>
+            repeat(phx::ref(nbPoints))[ (float_ >> float_ >> float_)[phx::ref(pa) = _1, phx::ref(pb) = _2, phx::ref(pc) = _3, phx::push_back(phx::ref(points),phx::ref(point))] ] >>
+            ulong_long[ phx::ref(nbCells) = _1, phx::reserve(phx::ref(cells), phx::ref(nbCells)) ] >>
+            repeat(phx::ref(nbCells))[ (int_ >> int_ >> int_ >> "-1 -1 -1")[phx::ref(ca) = _1, phx::ref(cb) = _2, phx::ref(cc) = _3, phx::push_back(phx::ref(cells),phx::ref(cell))]  ]
+            // An alternative for >> "-1 -1 -1" is: >> int_  >> int_  >> int_
+            // but this is a little bit less efficient, since every file should
+            // currently contain -1 -1 -1 as normal's values
+        ),
+        //  End grammar
+
+        space
+        );
+
+    if (first != last) // fail if we didn't get a full match
+        return false;
+    return r;
+
+}
+
+
+//------------------------------------------------------------------------------
+
+TriangularMeshReader::TriangularMeshReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< IObjectReader >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+TriangularMeshReader::~TriangularMeshReader()
+{}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReader::read()
+{
+    assert( ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location) );
+    ::boost::filesystem::path path = ::boost::dynamic_pointer_cast< ::fwData::location::SingleFile >(m_location)->getPath();
+
+    OSLM_INFO( "[TriangularMeshReader::read] Trian file: " << path.string());
+    SLM_ASSERT("Empty path for TriangularMesh file", !path.empty() );
+
+
+    size_t length;
+    //char *buffer;
+    std::string buf;
+    std::ifstream file;
+    file.open(path.string().c_str(), std::ios::binary );
+
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Trian file loading error for " << path.string());
+        throw std::ios_base::failure("Unable to open " + path.string());
+    }
+
+
+    file.seekg (0, std::ios::end);
+    length = file.tellg();
+    file.seekg (0, std::ios::beg);
+
+    //buffer = new char [length];
+    buf.resize(length);
+    char *buffer = &buf[0];
+
+    file.read (buffer, length);
+    file.close();
+
+
+    ::fwData::TriangularMesh::sptr triMesh = getConcreteObject();
+
+    ::fwData::TriangularMesh::PointContainer newPoints;
+    ::fwData::TriangularMesh::CellContainer  newCells;
+    ::fwData::TriangularMesh::PointContainer &points = triMesh->points();
+    ::fwData::TriangularMesh::CellContainer  &cells  = triMesh->cells();
+
+    //Free TriangularMesh memory
+    triMesh->clearCells();
+    triMesh->clearPoints();
+
+    if (!parseTrian(buffer, buffer+length, newPoints, newCells))
+    {
+        OSLM_ERROR( "Bad file format : " << path.string());
+        throw std::ios_base::failure("Unable to open " + path.string() + " : Bad file format.");
+    }
+
+    points.swap(newPoints);
+    cells.swap(newCells);
+
+
+    //delete buffer;
+
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TriangularMeshReader::extension()
+{
+    return (".trian");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace reader
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/factory/new.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/factory/new.cpp
new file mode 100644
index 0000000..5338d43
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/factory/new.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwDataIO/reader/IObjectReader.hpp"
+
+#include "fwDataIO/reader/factory/new.hpp"
+
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+namespace factory
+{
+
+::fwDataIO::reader::IObjectReader::sptr New( const ::fwDataIO::reader::registry::KeyType & classname )
+{
+    return ::fwDataIO::reader::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/reader/registry/detail.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/reader/registry/detail.cpp
new file mode 100644
index 0000000..8f20baa
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/reader/registry/detail.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwDataIO/reader/registry/detail.hpp"
+
+
+namespace fwDataIO
+{
+namespace reader
+{
+
+namespace registry
+{
+
+struct FwDataIOReaderRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwDataIOReaderRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace reader
+
+} // namespace fwDataIO
+
+
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/ArrayWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/ArrayWriter.cpp
new file mode 100644
index 0000000..b71a97c
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/ArrayWriter.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+#include <iostream>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/cstdint.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataIO/writer/ArrayWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::ArrayWriter);
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+ArrayWriter::ArrayWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+ArrayWriter::~ArrayWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void ArrayWriter::write()
+{
+    ::boost::filesystem::path file = getFile();
+
+
+    ::fwData::Array::sptr array = this->getConcreteObject();
+    size_t arraySizeInBytes = array->getSizeInBytes();
+    ::fwComEd::helper::Array arrayHelper(array);
+    char* buff = arrayHelper.begin();
+
+    std::ofstream fs(file.string().c_str(), std::ios::binary|std::ios::trunc);
+
+    FW_RAISE_IF("Unable to open " << file, !fs.good());
+
+    fs.write(buff, arraySizeInBytes);
+    fs.close();
+
+}
+
+//------------------------------------------------------------------------------
+
+std::string  ArrayWriter::extension()
+{
+    return ".raw";
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzArrayWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzArrayWriter.cpp
new file mode 100644
index 0000000..d61d76b
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzArrayWriter.cpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/filesystem/path.hpp>
+#include <boost/cstdint.hpp>
+
+#include <zlib.h>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataIO/writer/GzArrayWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::GzArrayWriter);
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+GzArrayWriter::GzArrayWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+GzArrayWriter::~GzArrayWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void GzArrayWriter::write()
+{
+    assert( getFile().empty() ==  false );
+
+    ::fwData::Array::sptr array = this->getConcreteObject();
+
+    /// test if can open archive
+    gzFile rawFile = gzopen( this->getFile().string().c_str(), "wb1");
+    if ( rawFile == 0 )
+    {
+        std::string str = "GzArrayWriter::write unable to open ";
+        str+= getFile().string();
+        gzclose(rawFile);
+        throw std::ios_base::failure(str);
+    }
+
+    ::fwComEd::helper::Array arrayHelper(array);
+    // file is OK : process now
+    size_t arraySizeInBytes = array->getSizeInBytes();
+
+    unsigned int uncompressedbyteswrited = gzwrite(rawFile, arrayHelper.getBuffer(), arraySizeInBytes);
+    gzclose(rawFile);
+    if ( uncompressedbyteswrited != arraySizeInBytes )
+    {
+        std::string str = "GzArrayWriter::write unable to write ";
+        str+=  getFile().string();
+        throw std::ios_base::failure(str);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  GzArrayWriter::extension()
+{
+    return ".raw.gz";
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzBufferImageWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzBufferImageWriter.cpp
new file mode 100644
index 0000000..d87e2a5
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/GzBufferImageWriter.cpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/cstdint.hpp>
+
+#include <zlib.h>
+#include <fwData/Object.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include "fwDataIO/writer/GzBufferImageWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::GzBufferImageWriter);
+
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+GzBufferImageWriter::GzBufferImageWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+GzBufferImageWriter::~GzBufferImageWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void GzBufferImageWriter::write()
+{
+    assert( getFile().empty() ==  false );
+
+    ::fwData::Image::sptr image = getConcreteObject();
+    OSLM_TRACE( "GzBufferImageWriter::write()" << image.get() << " " << image->className()) ;
+
+    /// test if can open archive
+    gzFile rawFile = gzopen( getFile().string().c_str(), "wb1");
+    SLM_ASSERT("rawFile not instanced", rawFile);
+    if ( rawFile == 0 )
+    {
+        std::string str = "GzBufferImageWriter::write unable to open ";
+        str+= getFile().string();
+        gzclose(rawFile);
+        throw std::ios_base::failure(str);
+    }
+
+    ::fwComEd::helper::Image imageHelper(image);
+
+    // file is OK : process now
+    size_t imageSizeInBytes = image->getSizeInBytes();
+
+    char *ptr = static_cast<char*>(imageHelper.getBuffer());
+    size_t writtenBytes = 0;
+
+    int uncompressedbyteswrited;
+
+    while ( writtenBytes < imageSizeInBytes
+           && (uncompressedbyteswrited = gzwrite(rawFile, ptr+writtenBytes, imageSizeInBytes-writtenBytes)) > 0 )
+    {
+        writtenBytes += uncompressedbyteswrited;
+    }
+
+    gzclose(rawFile);
+
+    assert( uncompressedbyteswrited != 0 && writtenBytes==imageSizeInBytes);
+
+    if ( uncompressedbyteswrited != 0 && writtenBytes==imageSizeInBytes)
+    {
+        std::string str = "GzBufferImageWriter::write unable to write ";
+        str+=  getFile().string();
+        throw std::ios_base::failure(str);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  GzBufferImageWriter::extension()
+{
+    return ".raw.gz";
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/IObjectWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/IObjectWriter.cpp
new file mode 100644
index 0000000..e08bf42
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/IObjectWriter.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwDataIO/writer/IObjectWriter.hpp"
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+IObjectWriter::IObjectWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+IObjectWriter::~IObjectWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void IObjectWriter::setObject( ::fwTools::Object::sptr _pObject )
+{
+    m_object = _pObject;
+}
+
+//------------------------------------------------------------------------------
+
+::fwTools::Object::sptr  IObjectWriter::getObject()
+{
+    assert( !m_object.expired() );
+    return m_object.lock();
+}
+
+//------------------------------------------------------------------------------
+
+void IObjectWriter::setLocation( const ::fwData::location::ILocation::sptr _location )
+{
+    m_location = _location;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::location::ILocation::sptr IObjectWriter::getLocation()
+{
+    return m_location;
+}
+
+//------------------------------------------------------------------------------
+
+std::string  IObjectWriter::extension()
+{
+    return std::string();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/MeshWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/MeshWriter.cpp
new file mode 100644
index 0000000..e633cb0
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/MeshWriter.cpp
@@ -0,0 +1,133 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/cstdint.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwDataTools/Mesh.hpp>
+
+#include "fwDataIO/writer/MeshWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::MeshWriter );
+
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+MeshWriter::MeshWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+MeshWriter::~MeshWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void MeshWriter::write()
+{
+    OSLM_INFO( "[MeshReader::read] Trian file: " << getFile());
+    assert( getFile().empty() ==  false );
+
+    ::fwData::Mesh::sptr mesh = this->getConcreteObject();
+    FW_RAISE_IF("Can't convert this Mesh to TriangularMesh", !::fwDataTools::Mesh::hasUniqueCellType(mesh, ::fwData::Mesh::TRIANGLE));
+
+    std::fstream file;
+    file.open(getFile().string().c_str(), std::fstream::out);
+    file.precision(std::numeric_limits< float >::digits10);
+
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Trian file writing error for " << getFile().string());
+        std::string str = "Unable to write ";
+        str+= getFile().string();
+        throw std::ios_base::failure(str);
+    }
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    size_t i, nbPts, nbCells;
+    nbPts = mesh->getNumberOfPoints();
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+    file<<nbPts<<std::endl;
+    for( i=0 ; i<nbPts ; ++i )
+    {
+        file << points[i][0] << " " << points[i][1] << " " << points[i][2] << std::endl;
+    }
+
+    nbCells = mesh->getNumberOfCells();
+    ::fwData::Array::sptr cells = mesh->getCellDataArray();
+
+    ::fwComEd::helper::Array cellsArrayHelper(cells);
+
+    FW_RAISE_IF("Not able to write " << cells->getType().string() << " cell type in trian file.",
+            cells->getType() != ::fwTools::Type::create< ::boost::uint64_t >());
+
+    ::boost::uint64_t *cellBuf = cellsArrayHelper.begin< ::boost::uint64_t >();
+    ::boost::uint64_t *cellBufEnd = cellBuf + 3*nbCells;
+
+    SLM_ASSERT("Wrong CellDataMultiArray size", cells->getNumberOfElements() >= nbCells*3);
+    file << nbCells << std::endl;
+
+    ::fwData::Array::sptr normals = mesh->getCellNormalsArray();
+
+    if(normals
+            && !normals->empty()
+            && normals->getType() == ::fwTools::Type::create<float>()
+            && normals->getNumberOfComponents() == 3
+            && normals->getNumberOfDimensions() == 1
+            && nbCells == normals->getSize().at(0)
+            )
+    {
+        ::fwComEd::helper::Array normalsArrayHelper(normals);
+        float *normalBuf = normalsArrayHelper.begin< float >();
+
+        while (cellBuf != cellBufEnd)
+        {
+            file << (*cellBuf++) << " " ;
+            file << (*cellBuf++) << " " ;
+            file << (*cellBuf++) << " " ;
+            file << (*normalBuf++) << " " ;
+            file << (*normalBuf++) << " " ;
+            file << (*normalBuf++) << std::endl;
+        }
+    }
+    else
+    {
+        while (cellBuf != cellBufEnd)
+        {
+            file << (*cellBuf++) << " ";
+            file << (*cellBuf++) << " ";
+            file << (*cellBuf++) << " -1 -1 -1" << std::endl;
+        }
+    }
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MeshWriter::extension()
+{
+    return ".trian";
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/TransformationMatrix3DWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/TransformationMatrix3DWriter.cpp
new file mode 100644
index 0000000..c461e40
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/TransformationMatrix3DWriter.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <vector>
+
+#include <boost/filesystem/convenience.hpp>
+
+#include "fwDataIO/writer/TransformationMatrix3DWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::TransformationMatrix3DWriter);
+
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+TransformationMatrix3DWriter::TransformationMatrix3DWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+TransformationMatrix3DWriter::~TransformationMatrix3DWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DWriter::write()
+{
+    std::fstream file;
+    file.open(getFile().string().c_str(), std::fstream::out);
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Trf file writing error for " << getFile());
+        return;
+    }
+    ::std::vector< double > mat = this->getConcreteObject()->getRefCoefficients();
+    ::std::vector< double >::iterator iter;
+    int i=0;
+    for (iter = mat.begin() ; iter!= mat.end() ; ++iter)
+    {
+        OSLM_TRACE("MATRIX : " << (*iter));
+        file << (*iter);
+        i++;
+        if (i%4 == 0 && i!=16)
+            file << std::endl;
+        else
+            file << " ";
+    }
+
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TransformationMatrix3DWriter::extension()
+{
+    static std::string ext(".trf");
+    return ext;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/TriangularMeshWriter.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/TriangularMeshWriter.cpp
new file mode 100644
index 0000000..0a62eed
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/TriangularMeshWriter.cpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/cstdint.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include "fwDataIO/writer/TriangularMeshWriter.hpp"
+#include "fwDataIO/writer/registry/macros.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwDataIO::writer::TriangularMeshWriter );
+
+
+namespace fwDataIO
+{
+
+namespace writer
+{
+
+//------------------------------------------------------------------------------
+
+TriangularMeshWriter::TriangularMeshWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{}
+
+//------------------------------------------------------------------------------
+
+TriangularMeshWriter::~TriangularMeshWriter()
+{}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriter::write()
+{
+    OSLM_INFO( "[TriangularMeshReader::read] Trian file: " << getFile());
+    assert( getFile().empty() ==  false );
+
+    ::fwData::TriangularMesh::sptr triMesh = getConcreteObject();
+
+    std::fstream file;
+    file.open(getFile().string().c_str(), std::fstream::out);
+    if (!file.is_open())
+    {
+        OSLM_ERROR( "Trian file writing error for " << getFile().string());
+        std::string str = "Unable to write ";
+        str+= getFile().string();
+        throw std::ios_base::failure(str);
+    }
+
+    unsigned int i, nbPts, nbCells;
+    nbPts = triMesh->points().size();
+    file<<nbPts<<std::endl;
+    for( i=0 ; i<nbPts ; ++i )
+    {
+        std::vector< float > point = triMesh->points().at(i);
+        file<<point[0]<<" "<<point[1]<<" "<<point[2]<<std::endl;
+    }
+
+    nbCells = triMesh->cells().size();
+    file<<nbCells<<std::endl;
+    for( i=0 ; i<nbCells ; ++i )
+    {
+        std::vector< int > cell = triMesh->cells().at(i);
+        file<<cell[0]<<" "<<cell[1]<<" "<<cell[2]<<" "<<-1<<" "<<-1<<" "<<-1<<std::endl;
+    }
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TriangularMeshWriter::extension()
+{
+    return ".trian";
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace writer
+
+} // namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/factory/new.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/factory/new.cpp
new file mode 100644
index 0000000..3c7dd58
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/factory/new.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwDataIO/writer/IObjectWriter.hpp"
+
+#include "fwDataIO/writer/factory/new.hpp"
+
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+namespace factory
+{
+
+::fwDataIO::writer::IObjectWriter::sptr New( const ::fwDataIO::writer::registry::KeyType & classname )
+{
+    return ::fwDataIO::writer::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
diff --git a/SrcLib/core/fwDataIO/src/fwDataIO/writer/registry/detail.cpp b/SrcLib/core/fwDataIO/src/fwDataIO/writer/registry/detail.cpp
new file mode 100644
index 0000000..9bf11e5
--- /dev/null
+++ b/SrcLib/core/fwDataIO/src/fwDataIO/writer/registry/detail.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwDataIO/writer/registry/detail.hpp"
+
+
+namespace fwDataIO
+{
+namespace writer
+{
+
+namespace registry
+{
+
+struct FwDataIOWriterRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwDataIOWriterRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace writer
+
+} // namespace fwDataIO
+
+
diff --git a/SrcLib/core/fwDataIO/test/CMakeLists.txt b/SrcLib/core/fwDataIO/test/CMakeLists.txt
new file mode 100644
index 0000000..3c42cc6
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS regex REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwDataIO/test/Properties.cmake b/SrcLib/core/fwDataIO/test/Properties.cmake
new file mode 100644
index 0000000..161399a
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataIOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataIO/test/cppunit.options b/SrcLib/core/fwDataIO/test/cppunit.options
new file mode 100644
index 0000000..2fc73b1
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/cppunit.options
@@ -0,0 +1,8 @@
+CLASSTEST=[
+          'TrianTest',
+          'MeshTrianTest',
+          'DictionaryReaderTest',
+          ]
+USE = ['boost', 'boostRegex']
+LIB = ['fwTools_0-1','fwCore_0-1','fwData_0-1','fwDataIO_0-2','fwTest_0-1']
+CONSOLE='yes'
diff --git a/SrcLib/core/fwDataIO/test/tu/include/DictionaryReaderTest.hpp b/SrcLib/core/fwDataIO/test/tu/include/DictionaryReaderTest.hpp
new file mode 100644
index 0000000..417c0b1
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/include/DictionaryReaderTest.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_TEST_TU_DICTIONARYREADERTEST_HPP_
+#define _FWDATAIO_TEST_TU_DICTIONARYREADERTEST_HPP_
+
+#include <boost/filesystem/operations.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to read/create fw4spl dictionary file.
+ */
+class DictionaryReaderTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( DictionaryReaderTest );
+    CPPUNIT_TEST( test_1 );
+    CPPUNIT_TEST( test_2 );
+    CPPUNIT_TEST( test_3 );
+    CPPUNIT_TEST( test_4 );
+    CPPUNIT_TEST( test_5 );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void test_1();
+    void test_2();
+    void test_3();
+    void test_4();
+    void test_5();
+
+protected:
+
+    void generateDictionaryFileWithMissingSemiColon(::boost::filesystem::path dictionaryFile);
+    void generateDictionaryFileWithWrongCategory(::boost::filesystem::path dictionaryFile);
+    void generateDictionaryFileWithWrongClass(::boost::filesystem::path dictionaryFile);
+    void generateDictionaryFile(::boost::filesystem::path dictionaryFile);
+    ::boost::filesystem::path m_tmpDictionaryFilePath;
+};
+
+} //namespace ut
+} //namespace fwDataIO
+
+#endif //_FWDATAIO_TEST_TU_DICTIONARYREADERTEST_HPP_
diff --git a/SrcLib/core/fwDataIO/test/tu/include/FileNameParser.hpp b/SrcLib/core/fwDataIO/test/tu/include/FileNameParser.hpp
new file mode 100644
index 0000000..c8b7b1f
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/include/FileNameParser.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_TEST_TU_FILENAMEPARSER_HPP_
+#define _FWDATAIO_TEST_TU_FILENAMEPARSER_HPP_
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_core.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/spirit/home/phoenix/statement/sequence.hpp>
+#include <boost/spirit/home/phoenix/container.hpp>
+
+
+
+template <typename T>
+bool parseMeshFileName(const std::string &name, T &points, T &cells)
+{
+    using boost::spirit::qi::ulong_long;
+    using boost::spirit::qi::phrase_parse;
+    using boost::spirit::qi::_2;
+    using boost::spirit::qi::_3;
+    using boost::spirit::ascii::space;
+
+    namespace phx = boost::phoenix;
+
+    std::string::const_iterator first = name.begin();
+    std::string::const_iterator last = name.end();
+
+    bool r = phrase_parse(first, last,
+            ("Mesh-" >> ulong_long >> "-" >> ulong_long >> "pts-" >> ulong_long >> "cells.trian")[ phx::ref(points) = _2, phx::ref(cells) = _3 ],
+            space);
+
+    if (first != last) // fail if we didn't get a full match
+    {
+            return false;
+    }
+
+    return r;
+}
+
+
+#endif //_FWDATAIO_TEST_TU_FILENAMEPARSER_HPP_
diff --git a/SrcLib/core/fwDataIO/test/tu/include/MeshTrianTest.hpp b/SrcLib/core/fwDataIO/test/tu/include/MeshTrianTest.hpp
new file mode 100644
index 0000000..12999d1
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/include/MeshTrianTest.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_TEST_TU_MESHTRIANTEST_HPP_
+#define _FWDATAIO_TEST_TU_MESHTRIANTEST_HPP_
+
+#include <boost/filesystem/operations.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to read/create fw4spl trian mesh file.
+ */
+class MeshTrianTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MeshTrianTest );
+    CPPUNIT_TEST( testSimpleMesh );
+    CPPUNIT_TEST( testMeshWithCellNormals );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testSimpleMesh();
+    void testMeshWithCellNormals();
+
+    void compareMesh(::fwData::Mesh::sptr mesh1, ::fwData::Mesh::sptr mesh2);
+
+
+};
+
+} //namespace ut
+} //namespace fwDataIO
+
+#endif //_FWDATAIO_TEST_TU_MESHTRIANTEST_HPP_
diff --git a/SrcLib/core/fwDataIO/test/tu/include/TrianTest.hpp b/SrcLib/core/fwDataIO/test/tu/include/TrianTest.hpp
new file mode 100644
index 0000000..9574163
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/include/TrianTest.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATAIO_TEST_TU_TRIANTEST_HPP_
+#define _FWDATAIO_TEST_TU_TRIANTEST_HPP_
+
+#include <boost/filesystem/operations.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to read/create fw4spl trian mesh file.
+ */
+class TrianTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TrianTest );
+    CPPUNIT_TEST( test_1 );
+    CPPUNIT_TEST( test_2 );
+    CPPUNIT_TEST( file_load_test );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void test_1();
+    void test_2();
+    void file_load_test();
+
+protected:
+
+    void generateTrian(::boost::filesystem::path trianFile);
+
+    ::boost::filesystem::path m_tmpTrianPath1;
+    ::boost::filesystem::path m_tmpTrianPath2;
+};
+
+} //namespace ut
+} //namespace fwDataIO
+
+#endif //_FWDATAIO_TEST_TU_TRIANTEST_HPP_
diff --git a/SrcLib/core/fwDataIO/test/tu/src/DictionaryReaderTest.cpp b/SrcLib/core/fwDataIO/test/tu/src/DictionaryReaderTest.cpp
new file mode 100644
index 0000000..4955806
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/src/DictionaryReaderTest.cpp
@@ -0,0 +1,212 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <fwTools/System.hpp>
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/StructureTraits.hpp>
+#include <fwData/StructureTraitsHelper.hpp>
+
+#include <fwDataIO/reader/DictionaryReader.hpp>
+#include <fwDataIO/reader/IObjectReader.hpp>
+
+#include "DictionaryReaderTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataIO::ut::DictionaryReaderTest );
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::setUp()
+{
+    // Set up context before running a test.
+    m_tmpDictionaryFilePath = ::fwTools::System::getTemporaryFolder() / "Dictionary.dic";
+
+    this->generateDictionaryFile(m_tmpDictionaryFilePath);
+
+    CPPUNIT_ASSERT(::boost::filesystem::exists(m_tmpDictionaryFilePath));
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::tearDown()
+{
+    // Clean up after the test run.
+    if( ::boost::filesystem::exists(m_tmpDictionaryFilePath))
+    {
+        bool suppr;
+        suppr = ::boost::filesystem::remove(m_tmpDictionaryFilePath);
+        CPPUNIT_ASSERT(suppr);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::test_1()
+{
+    // Expected data
+    ::fwData::StructureTraits::sptr expectedSkin = ::fwData::StructureTraits::New();
+    expectedSkin->setType("Skin");
+    expectedSkin->setClass(::fwData::StructureTraits::ENVIRONMENT);
+    expectedSkin->setColor(::fwData::Color::New(255.0f/255.0f, 179.0f/255.0f, 140.0f/255.0f, 100.0/100.0f));
+    ::fwData::StructureTraits::CategoryContainer skinCat(1);
+    skinCat[0] = ::fwData::StructureTraits::BODY;
+    expectedSkin->setCategories(skinCat);
+    expectedSkin->setAnatomicRegion("Entire_Body");
+    expectedSkin->setPropertyCategory("Anat_Struct");
+    expectedSkin->setPropertyType("Entire_Body");
+
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    // get data from file.
+    ::fwDataIO::reader::DictionaryReader::sptr dictionaryReader = ::fwDataIO::reader::DictionaryReader::New();
+    dictionaryReader->setObject(structDico);
+    dictionaryReader->setFile(m_tmpDictionaryFilePath);
+    dictionaryReader->read();
+
+    ::fwData::StructureTraits::sptr struct1 = structDico->getStructure("Skin");
+    CPPUNIT_ASSERT(struct1);
+    CPPUNIT_ASSERT_EQUAL(struct1->getType(), expectedSkin->getType());
+    CPPUNIT_ASSERT_EQUAL(struct1->getClass(), expectedSkin->getClass());
+
+    ::fwData::Color::sptr color1 = struct1->getColor();
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(color1->red(), expectedSkin->getColor()->red(),0.001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(color1->green(), expectedSkin->getColor()->green(),0.001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(color1->blue(), expectedSkin->getColor()->blue(), 0.001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(color1->alpha(), expectedSkin->getColor()->alpha(), 0.001);
+
+    CPPUNIT_ASSERT_EQUAL(struct1->getCategories().size(), expectedSkin->getCategories().size());
+    CPPUNIT_ASSERT_EQUAL(struct1->getNativeExp(), expectedSkin->getNativeExp());
+    CPPUNIT_ASSERT_EQUAL(struct1->getNativeGeometricExp(), expectedSkin->getNativeGeometricExp());
+    CPPUNIT_ASSERT_EQUAL(struct1->getAttachmentType(), expectedSkin->getAttachmentType());
+
+    CPPUNIT_ASSERT_EQUAL(struct1->getAnatomicRegion(), expectedSkin->getAnatomicRegion());
+    CPPUNIT_ASSERT_EQUAL(struct1->getPropertyCategory(), expectedSkin->getPropertyCategory());
+    CPPUNIT_ASSERT_EQUAL(struct1->getPropertyType(), expectedSkin->getPropertyType());
+
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::test_2()
+{
+    // Set up context before running a test.
+    m_tmpDictionaryFilePath = ::fwTools::System::getTemporaryFolder() / "WrongDictionary.dic";
+    this->generateDictionaryFileWithMissingSemiColon(m_tmpDictionaryFilePath);
+
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    // Get data from file.
+    ::fwDataIO::reader::DictionaryReader::sptr dictionaryReader = ::fwDataIO::reader::DictionaryReader::New();
+    dictionaryReader->setObject(structDico);
+    dictionaryReader->setFile(m_tmpDictionaryFilePath);
+
+    CPPUNIT_ASSERT_THROW(dictionaryReader->read(), ::fwCore::Exception);
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::test_3()
+{
+    m_tmpDictionaryFilePath = ::fwTools::System::getTemporaryFolder() / "NoDictionary.dic";
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    // Get data from file.
+    ::fwDataIO::reader::DictionaryReader::sptr dictionaryReader = ::fwDataIO::reader::DictionaryReader::New();
+    dictionaryReader->setObject(structDico);
+    dictionaryReader->setFile(m_tmpDictionaryFilePath);
+
+    CPPUNIT_ASSERT_THROW(dictionaryReader->read(), ::fwCore::Exception);
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::test_4()
+{
+    // Set up context before running a test.
+    m_tmpDictionaryFilePath = ::fwTools::System::getTemporaryFolder() / "WrongDictionary.dic";
+    this->generateDictionaryFileWithWrongCategory(m_tmpDictionaryFilePath);
+
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    // Get data from file.
+    ::fwDataIO::reader::DictionaryReader::sptr dictionaryReader = ::fwDataIO::reader::DictionaryReader::New();
+    dictionaryReader->setObject(structDico);
+    dictionaryReader->setFile(m_tmpDictionaryFilePath);
+
+    CPPUNIT_ASSERT_THROW(dictionaryReader->read(), ::fwCore::Exception);
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::test_5()
+{
+
+    // Set up context before running a test.
+    m_tmpDictionaryFilePath = ::fwTools::System::getTemporaryFolder() / "WrongDictionary.dic";
+    this->generateDictionaryFileWithWrongClass(m_tmpDictionaryFilePath);
+
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    // Get data from file.
+    ::fwDataIO::reader::DictionaryReader::sptr dictionaryReader = ::fwDataIO::reader::DictionaryReader::New();
+    dictionaryReader->setObject(structDico);
+    dictionaryReader->setFile(m_tmpDictionaryFilePath);
+
+    CPPUNIT_ASSERT_THROW(dictionaryReader->read(), ::fwCore::Exception);
+}
+//------------------------------------------------------------------------------
+void DictionaryReaderTest::generateDictionaryFile(::boost::filesystem::path dictionaryFile)
+{
+    std::fstream file;
+    file.open(dictionaryFile.string().c_str(), std::fstream::out);
+    CPPUNIT_ASSERT(file.is_open());
+
+    file<<"Skin;(255,179,140,100);Body;Environment;;;;Entire_Body;Anat_Struct;Entire_Body" << std::endl;
+
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::generateDictionaryFileWithMissingSemiColon(::boost::filesystem::path dictionaryFile)
+{
+    std::fstream file;
+    file.open(dictionaryFile.string().c_str(), std::fstream::out);
+    CPPUNIT_ASSERT(file.is_open());
+    // Missing ";" after the type Skin.
+    file<<"Skin(255,179,140,100);Body;Environment;;;;Entire_Body;Anat_Struct;Entire_Body" << std::endl;
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::generateDictionaryFileWithWrongCategory(::boost::filesystem::path dictionaryFile)
+{
+    std::fstream file;
+    file.open(dictionaryFile.string().c_str(), std::fstream::out);
+    CPPUNIT_ASSERT(file.is_open());
+    file<<"Skin;(255,179,140,100);Boy;Environment;;;;Entire_Body;Anat_Struct;Entire_Body" << std::endl;
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+void DictionaryReaderTest::generateDictionaryFileWithWrongClass(::boost::filesystem::path dictionaryFile)
+{
+    std::fstream file;
+    file.open(dictionaryFile.string().c_str(), std::fstream::out);
+    CPPUNIT_ASSERT(file.is_open());
+    file<<"Skin;(255,179,140,100);Body;Enironment;;;;Entire_Body;Anat_Struct;Entire_Body" << std::endl;
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/test/tu/src/MeshTrianTest.cpp b/SrcLib/core/fwDataIO/test/tu/src/MeshTrianTest.cpp
new file mode 100644
index 0000000..e6d6e7c
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/src/MeshTrianTest.cpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <iomanip>
+#include <fstream>
+
+#include <fwTools/System.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwTest/generator/Mesh.hpp>
+#include <fwDataTools/Mesh.hpp>
+
+#include <fwDataIO/reader/MeshReader.hpp>
+#include <fwDataIO/writer/MeshWriter.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "MeshTrianTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataIO::ut::MeshTrianTest );
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void MeshTrianTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTrianTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTrianTest::testSimpleMesh()
+{
+    ::boost::filesystem::path trianPath = ::fwTools::System::getTemporaryFolder() / "test.trian";
+
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    ::fwTest::generator::Mesh::generateTriangleMesh(mesh);
+    ::fwDataTools::Mesh::shakePoint(mesh);
+
+    mesh->adjustAllocatedMemory();
+
+    ::fwDataIO::writer::MeshWriter::sptr writer = ::fwDataIO::writer::MeshWriter::New();
+    writer->setObject(mesh);
+    writer->setFile(trianPath);
+    writer->write();
+
+    ::fwDataIO::reader::MeshReader::sptr reader = ::fwDataIO::reader::MeshReader::New();
+
+    reader->setObject(mesh2);
+    reader->setFile(trianPath);
+    reader->read();
+
+    bool suppr = ::boost::filesystem::remove(trianPath);
+    CPPUNIT_ASSERT(suppr);
+
+    this->compareMesh(mesh, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTrianTest::testMeshWithCellNormals()
+{
+    ::boost::filesystem::path trianPath = ::fwTools::System::getTemporaryFolder() / "test.trian";
+
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    ::fwTest::generator::Mesh::generateTriangleMesh(mesh);
+    ::fwDataTools::Mesh::shakePoint(mesh);
+    ::fwDataTools::Mesh::generateCellNormals(mesh);
+
+    mesh->adjustAllocatedMemory();
+
+    ::fwDataIO::writer::MeshWriter::sptr writer = ::fwDataIO::writer::MeshWriter::New();
+    writer->setObject(mesh);
+    writer->setFile(trianPath);
+    writer->write();
+
+    ::fwDataIO::reader::MeshReader::sptr reader = ::fwDataIO::reader::MeshReader::New();
+
+    reader->setObject(mesh2);
+    reader->setFile(trianPath);
+    reader->read();
+
+    bool suppr = ::boost::filesystem::remove(trianPath);
+    CPPUNIT_ASSERT(suppr);
+
+    this->compareMesh(mesh, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+#define COMPAREBUFFER(type, buff1, buff2)                             \
+{                                                                     \
+    CPPUNIT_ASSERT( (!buff1 && !buff2) || (buff1 && buff2));          \
+    if(buff1)                                                         \
+    {                                                                 \
+        CPPUNIT_ASSERT(buff1->getSize() == buff2->getSize());         \
+        ::fwComEd::helper::Array helper1(buff1);                      \
+        ::fwComEd::helper::Array helper2(buff2);                      \
+                                                                      \
+        type *iter1 = helper1.begin<type>();                          \
+        type *iter2 = helper2.begin<type>();                          \
+                                                                      \
+        for (; iter1 != helper1.end<type>() ; ++iter1, ++iter2)       \
+        {                                                             \
+            CPPUNIT_ASSERT_DOUBLES_EQUAL(*iter1, *iter2, 0.000001);   \
+        }                                                             \
+    }                                                                 \
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTrianTest::compareMesh(::fwData::Mesh::sptr mesh1, ::fwData::Mesh::sptr mesh2)
+{
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfPoints(), mesh2->getNumberOfPoints());
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfCells() , mesh2->getNumberOfCells());
+    CPPUNIT_ASSERT_EQUAL(mesh1->getCellDataSize()  , mesh2->getCellDataSize());
+
+    COMPAREBUFFER(::fwData::Mesh::PointValueType, mesh1->getPointsArray(), mesh2->getPointsArray());
+    COMPAREBUFFER(::fwData::Mesh::CellTypes, mesh1->getCellTypesArray(), mesh2->getCellTypesArray());
+    COMPAREBUFFER(::fwData::Mesh::CellDataOffsetType, mesh1->getCellDataOffsetsArray(), mesh2->getCellDataOffsetsArray());
+    COMPAREBUFFER(::fwData::Mesh::CellValueType, mesh1->getCellDataArray(), mesh2->getCellDataArray());
+    COMPAREBUFFER(::fwData::Mesh::ColorValueType, mesh1->getPointColorsArray(), mesh2->getPointColorsArray());
+    COMPAREBUFFER(::fwData::Mesh::ColorValueType, mesh1->getCellColorsArray(), mesh2->getCellColorsArray());
+    COMPAREBUFFER(::fwData::Mesh::NormalValueType, mesh1->getPointNormalsArray(), mesh2->getPointNormalsArray());
+    COMPAREBUFFER(::fwData::Mesh::NormalValueType, mesh1->getCellNormalsArray(), mesh2->getCellNormalsArray());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataIO
diff --git a/SrcLib/core/fwDataIO/test/tu/src/TrianTest.cpp b/SrcLib/core/fwDataIO/test/tu/src/TrianTest.cpp
new file mode 100644
index 0000000..26b22e8
--- /dev/null
+++ b/SrcLib/core/fwDataIO/test/tu/src/TrianTest.cpp
@@ -0,0 +1,196 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/regex.hpp>
+
+#include <fwTools/System.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwDataIO/reader/TriangularMeshReader.hpp>
+#include <fwDataIO/writer/TriangularMeshWriter.hpp>
+#include <fwDataIO/reader/IObjectReader.hpp>
+
+#include <fwTest/Data.hpp>
+
+#include "FileNameParser.hpp"
+#include "TrianTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataIO::ut::TrianTest );
+
+namespace fwDataIO
+{
+namespace ut
+{
+
+static const unsigned int NBPTS   = 100;
+static const unsigned int NBCELLS = 100;
+
+//------------------------------------------------------------------------------
+
+void TrianTest::setUp()
+{
+    // Set up context before running a test.
+    m_tmpTrianPath1 = ::fwTools::System::getTemporaryFolder() / "TrianTest1.trian";
+    m_tmpTrianPath2 = ::fwTools::System::getTemporaryFolder() / "TrianTest2.trian";
+
+    this->generateTrian(m_tmpTrianPath1);
+
+    CPPUNIT_ASSERT(::boost::filesystem::exists(m_tmpTrianPath1));
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::tearDown()
+{
+    // Clean up after the test run.
+    if( ::boost::filesystem::exists(m_tmpTrianPath1))
+    {
+        bool suppr = ::boost::filesystem::remove(m_tmpTrianPath1);
+        CPPUNIT_ASSERT(suppr);
+    }
+    if( ::boost::filesystem::exists(m_tmpTrianPath2))
+    {
+        bool suppr = ::boost::filesystem::remove(m_tmpTrianPath2);
+        CPPUNIT_ASSERT(suppr);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::test_1()
+{
+    ::fwData::TriangularMesh::sptr trianMesh = ::fwData::TriangularMesh::New();
+    ::fwDataIO::reader::TriangularMeshReader::sptr reader = ::fwDataIO::reader::TriangularMeshReader::New();
+
+    reader->setObject(trianMesh);
+    reader->setFile(m_tmpTrianPath1);
+    reader->read();
+
+    CPPUNIT_ASSERT_EQUAL((size_t)NBPTS, trianMesh->getNumPoints());
+    CPPUNIT_ASSERT_EQUAL((size_t)NBCELLS, trianMesh->getNumCells());
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::test_2()
+{
+    ::fwData::TriangularMesh::sptr trianMesh1 = ::fwData::TriangularMesh::New();
+    ::fwData::TriangularMesh::sptr trianMesh2 = ::fwData::TriangularMesh::New();
+
+    ::fwDataIO::reader::TriangularMeshReader::sptr reader = ::fwDataIO::reader::TriangularMeshReader::New();
+    ::fwDataIO::writer::TriangularMeshWriter::sptr writer = ::fwDataIO::writer::TriangularMeshWriter::New();
+
+    reader->setObject(trianMesh1);
+    reader->setFile(m_tmpTrianPath1);
+    reader->read();
+
+    writer->setObject(trianMesh1);
+    writer->setFile(m_tmpTrianPath2);
+    writer->write();
+
+    reader->setObject(trianMesh2);
+    reader->setFile(m_tmpTrianPath2);
+    reader->read();
+
+    CPPUNIT_ASSERT_EQUAL((size_t)NBPTS, trianMesh1->getNumPoints());
+    CPPUNIT_ASSERT_EQUAL((size_t)NBCELLS, trianMesh1->getNumCells());
+    CPPUNIT_ASSERT_EQUAL(trianMesh1->getNumCells(),  trianMesh2->getNumCells());
+    CPPUNIT_ASSERT_EQUAL(trianMesh1->getNumPoints(), trianMesh2->getNumPoints());
+    CPPUNIT_ASSERT(trianMesh1->points() == trianMesh2->points());
+    CPPUNIT_ASSERT(trianMesh1->cells()  == trianMesh2->cells());
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::file_load_test()
+{
+
+    // test parseMeshFileName
+    unsigned long long nbPts, nbCells;
+    std::string testFileName("Mesh-00-002502pts-005000cells.trian");
+    parseMeshFileName( testFileName, nbPts, nbCells );
+    CPPUNIT_ASSERT_EQUAL(2502ULL, nbPts);
+    CPPUNIT_ASSERT_EQUAL(5000ULL, nbCells);
+
+    const ::boost::filesystem::path trian_path( ::fwTest::Data::dir() / "fw4spl/trian/" );
+    const boost::regex fileNameFilter( "Mesh-\\d+-\\d+pts-\\d+cells\\.trian" );
+
+    typedef std::vector< ::boost::filesystem::path > FileVector;
+    FileVector files;
+
+    // find every files matching <fileNameFilter> pattern
+    boost::filesystem::directory_iterator iter( trian_path );
+    boost::filesystem::directory_iterator end_itr;
+    boost::smatch what;
+    for( ; iter != end_itr; ++iter )
+    {
+        if( !boost::filesystem::is_regular_file( iter->status() )
+                || !boost::regex_match( iter->path().filename().string(), what, fileNameFilter ) )
+        {
+            continue;
+        }
+        files.push_back( iter->path() );
+    }
+
+    CPPUNIT_ASSERT_MESSAGE("Missing trian files", !files.empty() );
+
+    FileVector::const_iterator fIter = files.begin();
+    FileVector::const_iterator fEndIter = files.end();
+
+    for (; fIter != fEndIter; ++fIter)
+    {
+        ::boost::filesystem::path trianFile = *fIter;
+        OSLM_TRACE("Testing: " << trianFile);
+
+        CPPUNIT_ASSERT_MESSAGE(
+                "Failed parsing mesh filename" + trianFile.filename().string(),
+                parseMeshFileName( trianFile.filename().string(), nbPts, nbCells )
+                );
+
+        ::fwData::TriangularMesh::sptr trianMesh = ::fwData::TriangularMesh::New();
+        ::fwDataIO::reader::TriangularMeshReader::sptr reader = ::fwDataIO::reader::TriangularMeshReader::New();
+
+        reader->setObject(trianMesh);
+        reader->setFile(trianFile);
+        reader->read();
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE(trianFile.string(), (size_t)nbPts, trianMesh->getNumPoints());
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("File : " +  trianFile.string(), (size_t)nbCells, trianMesh->getNumCells());
+    }
+}
+//------------------------------------------------------------------------------
+
+void TrianTest::generateTrian(::boost::filesystem::path trianFile)
+{
+    std::fstream file;
+    file.open(trianFile.string().c_str(), std::fstream::out);
+    CPPUNIT_ASSERT(file.is_open());
+
+    unsigned int i;
+    file<<NBPTS<<std::endl;
+    for( i=0 ; i<NBPTS ; ++i )
+    {
+        file<<i<<" "<<i+1<<" "<<i+2<<std::endl;
+    }
+
+    file<<NBCELLS<<std::endl;
+    for( i=0 ; i<NBCELLS ; ++i )
+    {
+        file<<i%NBPTS<<" "<<(i+1)%NBPTS<<" "<<(i+2)%NBPTS<<" "<<-1<<" "<<-1<<" "<<-1<<std::endl;
+    }
+
+    file.close();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataIO
diff --git a/SrcLib/core/fwDataTools/CMakeLists.txt b/SrcLib/core/fwDataTools/CMakeLists.txt
new file mode 100644
index 0000000..2f92937
--- /dev/null
+++ b/SrcLib/core/fwDataTools/CMakeLists.txt
@@ -0,0 +1,14 @@
+
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwCore
+    fwData
+    fwMath
+    fwTools
+)
+
+find_package (Boost COMPONENTS thread REQUIRED)
+fwForwardInclude(${fwCore_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
diff --git a/SrcLib/core/fwDataTools/Properties.cmake b/SrcLib/core/fwDataTools/Properties.cmake
new file mode 100644
index 0000000..7d603a1
--- /dev/null
+++ b/SrcLib/core/fwDataTools/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataTools )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwMath fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataTools/bin/build.options b/SrcLib/core/fwDataTools/bin/build.options
new file mode 100644
index 0000000..69f8ec7
--- /dev/null
+++ b/SrcLib/core/fwDataTools/bin/build.options
@@ -0,0 +1,9 @@
+TYPE    = 'shared'
+VERSION = '0-1'
+LIB = [
+      'fwCore_0-1',
+      'fwData_0-1',
+      'fwComEd_0-1'
+      ]
+USE = ['boost', 'boostThread']
+
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/AlgoMeshDeformation.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/AlgoMeshDeformation.hpp
new file mode 100644
index 0000000..3ce2dc2
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/AlgoMeshDeformation.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_ALGOMESHDEFORMATION_HPP_
+#define _FWDATATOOLS_ALGOMESHDEFORMATION_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+
+#include "fwDataTools/export.hpp"
+
+
+namespace fwDataTools
+{
+
+class FWDATATOOLS_CLASS_API AlgoMeshDeformation
+{
+
+public:
+
+    /**
+     * @brief   Constructor
+     */
+    FWDATATOOLS_API AlgoMeshDeformation() throw();
+
+    /**
+     * @brief   Destructor
+     */
+    FWDATATOOLS_API virtual ~AlgoMeshDeformation() throw();
+
+    /**
+     * @brief Initialize algorithm's parameters.
+     */
+    FWDATATOOLS_API void setParam( ::fwData::Mesh::sptr _mesh,
+            const unsigned int _step,
+            const unsigned int _amplitude);
+
+    /**
+     * @brief Initialize the simulated acquisition.
+     */
+    FWDATATOOLS_API void initSimu();
+
+    /**
+     * @brief Compute the simulated acquisition for the given step between inspiration and expiration.
+     */
+    FWDATATOOLS_API void computeSimu();
+
+    /// Compute deformation or init algo if necessary
+    FWDATATOOLS_API  void computeDeformation( ::fwData::Mesh::sptr _mesh,
+            const unsigned int _nbStep,
+            const unsigned int _amplitude );
+
+private:
+
+    ::fwData::Mesh::wptr m_mesh;
+    ::fwComEd::helper::Mesh::sptr m_meshHelper;
+    ::fwData::Array::sptr m_originPoints;
+
+    unsigned int m_amplitude;
+    unsigned int m_step;
+    int m_direction;
+    size_t m_nbPoints;
+    size_t m_nbCells;
+    float m_yCenter;
+
+    /**
+     * @brief Number of simulated acquisitions to compute between inspiration and expiration.
+     */
+    unsigned int m_nbStep;
+
+    /**
+     * @brief Number of the last computed step between 0 and m_step
+     */
+    unsigned int m_lastStep;
+
+};
+
+}   // namespace fwDataTools
+
+#endif  // _FWDATATOOLS_ALGOMESHDEFORMATION_HPP_
+
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/Image.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/Image.hpp
new file mode 100644
index 0000000..30d713c
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/Image.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_IMAGE_HPP_
+#define _FWDATATOOLS_IMAGE_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Type.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMath/Compare.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataTools/export.hpp"
+
+namespace fwDataTools
+{
+
+
+/**
+ * @brief   This class contains helper to generate and compare images.
+ * @class   Image
+ */
+class Image
+{
+
+public :
+
+    /**
+     * @brief Apply roi to image
+     *
+     * set input image voxel to zero where roi voxel value is zero
+     */
+    FWDATATOOLS_API static void applyRoi( ::fwData::Image::sptr image,
+                                          ::fwData::Image::sptr roi );
+
+    /**
+     * @brief Check if 'imgRoiApplyed' is the result of 'roi' applyed to 'image'
+     *
+     */
+    FWDATATOOLS_API static bool isRoiApplyed( ::fwData::Image::sptr image,
+                                              ::fwData::Image::sptr imgRoiApplyed,
+                                              ::fwData::Image::sptr roi );
+
+    /**
+     * @brief Merge mask in image imgDest: put value 'val' in imgDest when mask value != 0
+     */
+    template<typename IMG_DEST_TYPE, typename MASK_TYPE>
+    void mergeMask(::fwData::Image::sptr imgDest, ::fwData::Image::sptr mask, IMG_DEST_TYPE val );
+
+};
+
+
+//------------------------------------------------------------------------------
+
+template<typename IMG_DEST_TYPE, typename MASK_TYPE>
+void Image::mergeMask(::fwData::Image::sptr imgDest, ::fwData::Image::sptr mask, IMG_DEST_TYPE val )
+{
+    typedef IMG_DEST_TYPE  ImgDestType;
+    typedef MASK_TYPE MaskType;
+    SLM_ASSERT( "Image dest has not correct type", imgDest->getType().isOfType< ImgDestType >());
+    SLM_ASSERT( "Image mask has not correct type", mask->getType().isOfType< MaskType >());
+
+    SLM_ASSERT( "Images have not the same size", imgDest->getSize() == mask->getSize() );
+    SLM_ASSERT( "Images have not the same spacing",
+            ::fwMath::isContainerEqual(imgDest->getSpacing(), mask->getSpacing()) );
+    SLM_ASSERT( "Images have not the same origin",
+            ::fwMath::isContainerEqual(imgDest->getOrigin(), mask->getOrigin()) );
+
+    ::fwData::Array::sptr imgData;
+    ::fwData::Array::sptr maskData;
+    imgData = imgDest->getDataArray();
+    maskData = mask->getDataArray();
+
+    ::fwComEd::helper::Array imgHelper(imgData);
+    ::fwComEd::helper::Array maskHelper(maskData);
+
+    ImgDestType *imgIt = imgHelper.begin<ImgDestType>();
+    MaskType *maskIt = maskHelper.begin<MaskType>();
+
+    const ImgDestType *imgEnd = imgIt + maskData->getNumberOfElements();
+
+    for ( ; imgIt != imgEnd ; ++imgIt, ++maskIt)
+    {
+        if (*maskIt != 0)
+        {
+            *imgIt = val;
+        }
+    }
+}
+
+} // namespace fwDataTools
+
+#endif // _FWDATATOOLS_IMAGE_HPP_
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/Mesh.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/Mesh.hpp
new file mode 100644
index 0000000..378a5a4
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/Mesh.hpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATATOOLS_MESH_HPP__
+#define __FWDATATOOLS_MESH_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Mesh.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+
+#include "fwDataTools/Vector.hxx"
+#include "fwDataTools/export.hpp"
+
+namespace fwDataTools
+{
+
+
+/**
+ * @brief   This helper generates a mesh using specified structure (quad or triangle).
+ * @class   Mesh
+ */
+class Mesh
+{
+
+public :
+
+    typedef std::map<Point, ::fwData::Mesh::Id> PointsMapType;
+
+
+    /**
+     * @brief Initialize 'rand' seed
+     */
+    FWDATATOOLS_API static void initRand();
+
+    /**
+     * @brief Generate cell normals for the mesh.
+     *
+     * @param[out]  mesh fwData::Mesh structure to fill with cell normals.
+     */
+    FWDATATOOLS_API static void generateCellNormals(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Generate point normals for the mesh.
+     *
+     * @param[out]  mesh fwData::Mesh structure to fill with cell normals.
+     */
+    FWDATATOOLS_API static void generatePointNormals(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Shake Array of Normals.
+     *
+     * Array must have 3 float components, 1 dimension. Otherwise, shakeNormals
+     * will do nothing.
+     *
+     * @param[out]  array mesh's array containing normals.
+     */
+    FWDATATOOLS_API static void shakeNormals(::fwData::Array::sptr array);
+
+    /**
+     * @brief Shake point Normals.
+     *
+     * @param[out]  mesh fwData::Mesh structure to shake normals.
+     */
+    FWDATATOOLS_API static void shakePointNormals(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Shake cell Normals.
+     *
+     * @param[out]  mesh fwData::Mesh structure to shake normals.
+     */
+    FWDATATOOLS_API static void shakeCellNormals(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Shake points of the mesh.
+     *
+     * @param[out]  mesh fwData::Mesh structure to shake.
+     */
+    FWDATATOOLS_API static void shakePoint(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Colorize mesh (vertex point color).
+     *
+     * @param[in]  mesh fwData::Mesh mesh structure to colorize.
+     */
+    FWDATATOOLS_API static void colorizeMeshPoints(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Colorize mesh (cell color).
+     *
+     * @param[in]  mesh fwData::Mesh mesh structure to colorize.
+     */
+    FWDATATOOLS_API static void colorizeMeshCells(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Convert fwData::Mesh to fwData::TriangularMesh structure.
+     *
+     * @param[in]   mesh fwData::Mesh mesh to convert.
+     * @param[out]  trian fwData::TriangularMesh destination for the converted mesh.
+     *
+     * @pre Mesh must contains only triangular cells.
+     */
+    FWDATATOOLS_API static void toTriangularMesh(::fwData::Mesh::sptr mesh, ::fwData::TriangularMesh::sptr trian);
+
+    /**
+     * @brief Convert fwData::TriangularMesh to fwData::Mesh structure.
+     *
+     * @param[in]  trian fwData::TriangularMesh triangular mesh to convert.
+     * @param[out] mesh fwData::Mesh destination for the converted triangular mesh.
+     */
+    FWDATATOOLS_API static void fromTriangularMesh(::fwData::TriangularMesh::sptr trian, ::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief
+     *
+     * @param[in]  mesh fwData::Mesh mesh structure to find cell type.
+     * @param[in]  cell CellTypes to find in mesh.
+     */
+    FWDATATOOLS_API static bool hasUniqueCellType(::fwData::Mesh::sptr mesh, ::fwData::Mesh::CellTypes cell);
+
+    /// Applied a transformation 4x4 on mesh
+    FWDATATOOLS_API static void transform( ::fwData::Mesh::sptr mesh, ::fwData::TransformationMatrix3D::sptr t );
+
+};
+
+} // namespace fwDataTools
+
+#endif // __FWDATATOOLS_MESH_HPP__
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/Namespace.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/Namespace.hpp
new file mode 100644
index 0000000..5d8cfde
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWDATATOOLS_HPP_
+#define FWDATATOOLS_HPP_
+
+/**
+ * @brief       The namespace fwDataTools contains classes which provide helpers to manipulate fwData::Object.
+ * @namespace   fwDataTools
+ * 
+ * @date        2009-2011.
+ *
+ */
+namespace fwDataTools
+{
+}
+#endif /* FWDATATOOLS_HPP_ */
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/TransferFunction.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/TransferFunction.hpp
new file mode 100644
index 0000000..028dd27
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/TransferFunction.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_TRANSFERFUNCTION_HPP_
+#define _FWDATATOOLS_TRANSFERFUNCTION_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwData/TransferFunction.hpp>
+
+#include "fwDataTools/export.hpp"
+
+namespace fwDataTools
+{
+
+
+/**
+ * @brief   This class contains helper to generate and compare TransferFunction.
+ * @class   TransferFunction
+ */
+class TransferFunction
+{
+
+public :
+
+    /**
+     * @brief Generate a drawing tf with value between 0 and 255.
+     * @param tf  transferFunction to generate
+     */
+    FWDATATOOLS_API static void generateDrawingTF(::fwData::TransferFunction::sptr tf);
+
+protected:
+
+    /// Return a map <value, color> used to generate drawing TF
+    FWDATATOOLS_API static ::fwData::TransferFunction::TFDataType getDrawingTFColors();
+
+};
+
+
+} // namespace fwDataTools
+
+#endif // _FWDATATOOLS_TRANSFERFUNCTION_HPP_
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/TransformationMatrix3D.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/TransformationMatrix3D.hpp
new file mode 100644
index 0000000..2d5be8a
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/TransformationMatrix3D.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+#ifndef __FWDATATOOLS_TRANSFORMATIONMATRIX3D_HPP__
+#define __FWDATATOOLS_TRANSFORMATIONMATRIX3D_HPP__
+
+#include <fwCore/base.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+#include <fwData/Point.hpp>
+
+#include "fwDataTools/export.hpp"
+
+namespace fwDataTools
+{
+/**
+ * @brief   TransformationMatrix3D performs matrices computations.
+ * @class   TransformationMatrix3D
+ */
+class TransformationMatrix3D
+{
+public:
+
+    /**
+     * @brief Invert a matrix.
+     * @param[in] trf_input Input matrix
+     * @param[out] trf_output Inverted matrix.
+     */
+    FWDATATOOLS_API static bool invert(::fwData::TransformationMatrix3D::sptr trf_input,
+            ::fwData::TransformationMatrix3D::sptr trf_output);
+
+    /**
+     * @brief Multiply two matrices.
+     * @param[in] ftrf_A First matrix.
+     * @param[in] fTrf_B Second matrix.
+     * @param[out] fTrf_C Output matrix.
+     */
+    FWDATATOOLS_API static void multiply(::fwData::TransformationMatrix3D::sptr fTrf_A,
+            ::fwData::TransformationMatrix3D::sptr fTrf_B, ::fwData::TransformationMatrix3D::sptr fTrf_C);
+
+    /**
+     * @brief Set the matrix to identity.
+     * @param[in/out] trf Matrix we want to set to identity.
+     */
+    FWDATATOOLS_API static void identity(::fwData::TransformationMatrix3D::sptr trf);
+
+    /**
+     * @brief Multiply a point and a matrix.
+     * @param[in] trf Matrix.
+     * @param[in] input Input point.
+     * @param[out] output Output point.
+     */
+    FWDATATOOLS_API static void multiply(::fwData::TransformationMatrix3D::sptr trf,
+            ::fwData::Point::sptr input, ::fwData::Point::sptr output);
+
+};
+} // namespace fwDataTools
+
+#endif // __FWDATATOOLS_TRANSFORMATIONMATRIX3D_HPP__
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/Vector.hxx b/SrcLib/core/fwDataTools/include/fwDataTools/Vector.hxx
new file mode 100644
index 0000000..d766d31
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/Vector.hxx
@@ -0,0 +1,131 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_VECTOR_HPP_
+#define _FWDATATOOLS_VECTOR_HPP_
+
+#include <fwCore/base.hpp>
+
+
+namespace fwDataTools
+{
+
+class Point
+{
+public:
+
+    float x;
+    float y;
+    float z;
+
+    Point() : x(0.), y(0.), z(0.)
+    {}
+    Point(const float p[3]) : x(p[0]), y(p[1]), z(p[2])
+    {}
+
+    Point(float _x, float _y, float _z) : x(_x), y(_y), z(_z)
+    {}
+
+    bool operator<(const Point& pt) const
+    {
+        return (   this->x < pt.x
+                ||(this->x == pt.x && this->y < pt.y)
+                ||(this->x == pt.x && this->y == pt.y && this->z < pt.z) );
+    }
+};
+
+template <typename T>
+class Vector
+{
+public:
+
+    T x;
+    T y;
+    T z;
+
+    Vector() : x(0.), y(0.), z(0.)
+    {}
+
+    Vector(const Vector& v) : x(v.x), y(v.y), z(v.z)
+    {}
+    Vector(const Point& p1, const Point& p2) : x(p2.x-p1.x), y(p2.y-p1.y), z(p2.z-p1.z)
+    {}
+    Vector(T _x, T _y, T _z) : x(_x), y(_y), z(_z)
+    {}
+
+
+    bool operator<(const Vector& v) const
+    {
+        return (   x < v.x
+                ||(x == v.x && y < v.y)
+                ||(x == v.x && y == v.y && z < v.z) );
+    }
+
+    void operator=(const Vector& v)
+    { x = v.x; y = v.y; z = v.z; }
+
+    void operator-=(const Vector& v)
+    { x -= v.x; y -= v.y; z -= v.z; }
+
+    void operator+=(const Vector& v)
+    { x += v.x; y += v.y; z += v.z; }
+
+    void operator*=(const float val)
+    { x = val*x; y = val*y; z = val*z; }
+
+    void operator/=(const float val)
+    { x = x/val; y = y/val; z = z/val; }
+
+    T norm2()
+    {
+        return x*x + y*y + z*z;
+    }
+
+    T norm()
+    {
+        return std::sqrt(this->norm2());
+    }
+
+    void normalize()
+    {
+        T norm = this->norm();
+        *this /= (norm == 0) ? 1 : norm;
+    }
+
+    Vector normalized()
+    {
+        Vector v(*this);
+        v.normalize();
+        return v;
+    }
+
+    T dot(Vector &v)
+    {
+        return x*v.x + y*v.y + z*v.z;
+    }
+
+    void crossWith(const Vector &v)
+    {
+        T _x = y * v.z - z * v.y;
+        T _y = z * v.x - x * v.z;
+        T _z = x * v.y - y * v.x;
+        x = _x;
+        y = _y;
+        z = _z;
+    }
+
+    Vector cross(const Vector &v)
+    {
+        Vector res(*this);
+        res.crossWith(v);
+        return res;
+    }
+};
+
+} // namespace fwDataTools
+
+#endif // _FWDATATOOLS_VECTOR_HPP_
+
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/export.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/export.hpp
new file mode 100644
index 0000000..d46780f
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_CONFIG_HPP_
+#define _FWDATATOOLS_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWDATATOOLS_EXPORTS
+    #define FWDATATOOLS_API __declspec(dllexport)
+    #else
+    #define FWDATATOOLS_API __declspec(dllimport)
+    #endif
+    
+    #define FWDATATOOLS_CLASS_API
+
+    #pragma warning(disable: 4290)
+    
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWDATATOOLS_EXPORTS
+        #define FWDATATOOLS_API __attribute__ ((visibility("default")))
+        #define FWDATATOOLS_CLASS_API __attribute__ ((visibility("default")))
+        #else
+        #define FWDATATOOLS_API __attribute__ ((visibility("hidden")))
+        #define FWDATATOOLS_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+#else
+
+    #define FWDATATOOLS_API
+    #define FWDATATOOLS_CLASS_API
+
+#endif
+
+
+#endif //_FWDATATOOLS_CONFIG_HPP_
diff --git a/SrcLib/core/fwDataTools/include/fwDataTools/thread/RegionThreader.hpp b/SrcLib/core/fwDataTools/include/fwDataTools/thread/RegionThreader.hpp
new file mode 100644
index 0000000..c4ad892
--- /dev/null
+++ b/SrcLib/core/fwDataTools/include/fwDataTools/thread/RegionThreader.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_THREAD_REGIONTHREADER_HPP_
+#define _FWDATATOOLS_THREAD_REGIONTHREADER_HPP_
+
+#include <algorithm>
+#include <cstddef>
+#include <limits>
+
+#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/thread.hpp>
+
+namespace fwDataTools
+{
+
+namespace thread
+{
+
+
+class RegionThreader
+{
+
+public:
+
+    RegionThreader()
+        : m_nbThread( (::boost::thread::hardware_concurrency() > 1) ? ::boost::thread::hardware_concurrency() : 1 )
+    {}
+
+    RegionThreader(size_t nbThread, bool capped = true)
+        : m_nbThread( std::min( capped ? ::boost::thread::hardware_concurrency() : std::numeric_limits<size_t>::max() , (nbThread > 1) ? nbThread : 1) )
+    {}
+
+    template<typename T> void operator()(T func, const size_t dataSize)
+    {
+        std::vector< ::boost::thread* > threads;
+
+        const size_t step = (dataSize / m_nbThread) + 1;
+        size_t regionBegin = 0;
+        size_t threadId = 0;
+
+        if (m_nbThread > 1)
+        {
+            for (; regionBegin < dataSize; regionBegin += step, ++threadId)
+            {
+                threads.push_back(new ::boost::thread(func, regionBegin, std::min( dataSize,  regionBegin + step), threadId ));
+            }
+
+            BOOST_FOREACH( ::boost::thread *thread, threads)
+            {
+                thread->join();
+                delete thread;
+            }
+            threads.clear();
+        }
+        else
+        {
+            func(0, dataSize, 0);
+        }
+    }
+
+    size_t numberOfThread() { return m_nbThread; };
+
+protected:
+
+    const size_t m_nbThread;
+};
+
+}   // namespace thread
+
+}   // namespace fwDataTools
+
+
+#endif //_FWDATATOOLS_THREAD_REGIONTHREADER_HPP_
+
diff --git a/SrcLib/core/fwDataTools/src/fwDataTools/AlgoMeshDeformation.cpp b/SrcLib/core/fwDataTools/src/fwDataTools/AlgoMeshDeformation.cpp
new file mode 100644
index 0000000..2d0ad63
--- /dev/null
+++ b/SrcLib/core/fwDataTools/src/fwDataTools/AlgoMeshDeformation.cpp
@@ -0,0 +1,152 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/NumericRoundCast.hxx>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataTools/AlgoMeshDeformation.hpp"
+#include "fwDataTools/Mesh.hpp"
+
+namespace fwDataTools
+{
+
+//-----------------------------------------------------------------------------
+
+AlgoMeshDeformation::AlgoMeshDeformation() throw() :
+        m_amplitude(40),
+        m_step(0),
+        m_direction(1),
+        m_nbPoints(0),
+        m_nbCells(0),
+        m_yCenter(0),
+        m_nbStep(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+AlgoMeshDeformation::~AlgoMeshDeformation() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void AlgoMeshDeformation::setParam(
+            ::fwData::Mesh::sptr _mesh,
+            const unsigned int _nbStep,
+            const unsigned int _amplitude)
+{
+    SLM_TRACE_FUNC();
+    m_mesh = _mesh;
+    m_nbStep = _nbStep;
+    m_amplitude = _amplitude;
+    m_direction = 1;
+
+    m_nbPoints = _mesh->getNumberOfPoints();
+    m_nbCells = _mesh->getNumberOfCells();
+}
+
+//-----------------------------------------------------------------------------
+
+void AlgoMeshDeformation::computeDeformation( ::fwData::Mesh::sptr _mesh,
+        const unsigned int _nbStep,
+        const unsigned int _amplitude )
+{
+    if (    m_mesh.expired() ||
+            m_nbPoints != _mesh->getNumberOfPoints() ||
+            m_nbCells  != _mesh->getNumberOfCells()  ||
+            !_mesh->getPointColorsArray())
+    {
+        this->setParam( _mesh, 50, 50 );
+        this->initSimu();
+    }
+    else
+    {
+        this->computeSimu();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void AlgoMeshDeformation::initSimu()
+{
+    SLM_TRACE_FUNC();
+    m_originPoints = ::fwData::Object::copy( m_mesh.lock()->getPointsArray() );
+    m_step = 0;
+
+    if ( ! m_mesh.lock()->getPointColorsArray() )
+    {
+        ::fwDataTools::Mesh::colorizeMeshPoints( m_mesh.lock() );
+    }
+
+    m_meshHelper = ::fwComEd::helper::Mesh::New(m_mesh.lock());
+
+    float max = std::numeric_limits<float>::min();
+    float min = std::numeric_limits<float>::max();
+
+    ::fwData::Mesh::PointsMultiArrayType points = m_meshHelper->getPoints();
+    float coord;
+    for(unsigned int i = 0; i < m_nbPoints; ++i)
+    {
+        coord = points[i][1];
+        if ( coord < min ) { min = coord; }
+        if ( coord > max ) { max = coord; }
+    }
+
+    m_yCenter = (max - min) / 2 + min;
+}
+
+//-----------------------------------------------------------------------------
+
+void AlgoMeshDeformation::computeSimu()
+{
+    SLM_TRACE_FUNC();
+    m_step+=m_direction;
+    if ( m_step == m_nbStep )
+    {
+        m_direction = -1;
+    }
+    else if ( m_step == 0 )
+    {
+        m_direction = 1;
+    }
+
+    const float scale = m_step / (float) m_nbStep;
+
+    ::fwComEd::helper::Array originPointsHelper(m_originPoints);
+
+    ::fwData::Mesh::PointsMultiArrayType points = m_meshHelper->getPoints();
+    ::fwData::Mesh::PointColorsMultiArrayType colors = m_meshHelper->getPointColors();
+
+    ::fwData::Mesh::PointsMultiArrayType opoints =
+            ::fwData::Mesh::PointsMultiArrayType(
+            static_cast< ::fwData::Mesh::PointsMultiArrayType::element* >(originPointsHelper.getBuffer()),
+            boost::extents[m_nbPoints][3] );
+
+    for(unsigned int i = 0; i < m_nbPoints; ++i)
+    {
+        points[i][0] = opoints[i][0];
+        OSLM_TRACE("opoints[i][1] - m_yCenter = " <<  opoints[i][1] - m_yCenter);
+        if( opoints[i][1] - m_yCenter > 0 )
+        {
+            points[i][1] = opoints[i][1] + (opoints[i][1] - m_yCenter) * scale;
+            colors[i][0] = ::fwTools::numericRoundCast< ::fwData::Mesh::ColorValueType >(255 * scale);
+        }
+        else
+        {
+            colors[i][0] = 0;
+        }
+        points[i][2] = opoints[i][2];
+    }
+
+    ::fwDataTools::Mesh::generatePointNormals( m_mesh.lock() );
+}
+
+//-----------------------------------------------------------------------------
+
+}   // namespace fwBreathing
+
diff --git a/SrcLib/core/fwDataTools/src/fwDataTools/Image.cpp b/SrcLib/core/fwDataTools/src/fwDataTools/Image.cpp
new file mode 100644
index 0000000..dea8acb
--- /dev/null
+++ b/SrcLib/core/fwDataTools/src/fwDataTools/Image.cpp
@@ -0,0 +1,179 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/Combinatory.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/IntrinsicTypes.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwDataTools/Image.hpp"
+
+
+namespace fwDataTools
+{
+
+//------------------------------------------------------------------------------
+
+struct RoiApplyerParam
+{
+    ::fwData::Image::sptr img;
+    ::fwData::Image::sptr roi;
+};
+
+//------------------------------------------------------------------------------
+
+template<typename IMAGE_TYPE>
+struct RoiApplyer
+{
+    template<typename ROI_TYPE>
+    void operator()( RoiApplyerParam & p )
+    {
+        typedef IMAGE_TYPE ImgType;
+        typedef ROI_TYPE   RoiType;
+
+        SLM_ASSERT( "Null image pointer" , p.img && p.roi);
+
+        ::fwData::Array::sptr imgData;
+        ::fwData::Array::sptr roiData;
+        imgData = p.img->getDataArray();
+        roiData = p.roi->getDataArray();
+
+
+        ::fwComEd::helper::Array imgHelper(imgData);
+        ::fwComEd::helper::Array roiHelper(roiData);
+        SLM_ASSERT( "Null data array pointer" , imgData && roiData);
+        SLM_ASSERT( "Null data buffers" , imgHelper.getBuffer() && roiHelper.getBuffer());
+
+        ImgType *imIt = imgHelper.begin<ImgType>();
+        RoiType *roiIt = roiHelper.begin<RoiType>();
+
+        const ImgType *imEnd = imIt + imgData->getNumberOfElements();
+
+        for ( ; imIt != imEnd ; ++imIt, ++roiIt)
+        {
+            if (*roiIt == 0)
+            {
+                *imIt = 0;
+            }
+        }
+    }
+};
+
+//------------------------------------------------------------------------------
+
+struct RoiApplyerCaller
+{
+    template<typename IMAGE_TYPE>
+    void operator()( RoiApplyerParam & p )
+    {
+        ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , RoiApplyer<IMAGE_TYPE> >::invoke( p.roi->getPixelType() , p );
+    }
+};
+
+//------------------------------------------------------------------------------
+
+void Image::applyRoi( ::fwData::Image::sptr image, ::fwData::Image::sptr roi )
+{
+    SLM_ASSERT( "Null image pointers", image && roi);
+    SLM_ASSERT( "Images have different size", image->getSize() == roi->getSize());
+
+    using namespace boost;
+
+    RoiApplyerParam param;
+    param.img = image;
+    param.roi = roi;
+
+    // Due to link failure, we use two dispatcher calls instead of one with a cross-product type list
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes, RoiApplyerCaller >::invoke( image->getPixelType() , param );
+}
+
+
+//------------------------------------------------------------------------------
+
+struct RoiTesterParam
+{
+    ::fwData::Image::sptr img;
+    ::fwData::Image::sptr imgRoiApplyed;
+    ::fwData::Image::sptr roi;
+    bool result;
+};
+
+//------------------------------------------------------------------------------
+
+template<typename IMAGE_TYPE>
+struct RoiTester
+{
+
+    template<typename ROI_TYPE>
+    void operator()( RoiTesterParam & p )
+    {
+        bool &result = p.result;
+        result = true;
+
+        typedef IMAGE_TYPE ImgType;
+        typedef ROI_TYPE RoiType;
+
+        ::fwData::Array::sptr imgData;
+        ::fwData::Array::sptr imgRoiApplyedData;
+        ::fwData::Array::sptr roiData;
+
+        imgData = p.img->getDataArray();
+        imgRoiApplyedData = p.imgRoiApplyed->getDataArray();
+        roiData = p.roi->getDataArray();
+
+        ::fwComEd::helper::Array imgHelper(imgData);
+        ::fwComEd::helper::Array roiHelper(roiData);
+        ::fwComEd::helper::Array imgRoiApplyedHelper(imgRoiApplyedData);
+
+        SLM_ASSERT( "Null data array pointer", imgData && roiData && imgRoiApplyedData);
+        SLM_ASSERT( "Null data buffers", imgHelper.getBuffer() && roiHelper.getBuffer() && imgRoiApplyedHelper.getBuffer() );
+
+        ImgType *imIt     = imgHelper.begin<ImgType>();
+        ImgType *imRoiIt  = imgRoiApplyedHelper.begin<ImgType>();
+        RoiType *roiIt    = roiHelper.begin<RoiType>();
+
+        const ImgType *imEnd = imIt + imgData->getNumberOfElements();
+
+        for ( ; result && imIt != imEnd ; ++imIt, ++roiIt, ++imRoiIt)
+        {
+            result = result && ( (*roiIt == 0) ? (*imRoiIt == 0) : (*imIt == *imRoiIt) );
+        }
+    }
+};
+
+//------------------------------------------------------------------------------
+
+struct RoiTesterCaller
+{
+    template<typename IMAGE_TYPE>
+    void operator()( RoiTesterParam & p )
+    {
+        ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , RoiTester<IMAGE_TYPE> >::invoke( p.roi->getPixelType() , p );
+    }
+};
+
+//------------------------------------------------------------------------------
+
+bool Image::isRoiApplyed( ::fwData::Image::sptr image, ::fwData::Image::sptr roi, ::fwData::Image::sptr imgRoiApplyed )
+{
+    SLM_ASSERT( "Null image pointers", image && imgRoiApplyed && roi);
+    SLM_ASSERT( "Images have different size",
+            image->getSize() == imgRoiApplyed->getSize() && image->getSize() == roi->getSize());
+
+    RoiTesterParam param;
+    param.img = image;
+    param.imgRoiApplyed = imgRoiApplyed;
+    param.roi = roi;
+
+    // Due to link failure, we use two dispatcher calls instead of one with a cross-product type list
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes, RoiTesterCaller >::invoke( image->getPixelType() , param );
+
+    return param.result;
+}
+
+} // namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/src/fwDataTools/Mesh.cpp b/SrcLib/core/fwDataTools/src/fwDataTools/Mesh.cpp
new file mode 100644
index 0000000..e1585ae
--- /dev/null
+++ b/SrcLib/core/fwDataTools/src/fwDataTools/Mesh.cpp
@@ -0,0 +1,591 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/type_traits/make_unsigned.hpp>
+
+#include <map>
+
+#include <cstdlib>
+#include <ctime>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/NumericRoundCast.hxx>
+
+#include "fwDataTools/thread/RegionThreader.hpp"
+#include "fwDataTools/Mesh.hpp"
+
+
+namespace fwDataTools
+{
+
+struct RandFloat
+{
+    float operator()()
+    {
+        return ((rand() % 101 - 50.f)) / 500.f;
+    }
+};
+
+//------------------------------------------------------------------------------
+
+void Mesh::initRand()
+{
+    std::srand(::fwTools::numericRoundCast<unsigned int>(std::time(NULL)));
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::toTriangularMesh(::fwData::Mesh::sptr mesh, ::fwData::TriangularMesh::sptr trian)
+{
+    FW_RAISE_IF("Can't convert this Mesh to TriangularMesh", !Mesh::hasUniqueCellType(mesh, ::fwData::Mesh::TRIANGLE));
+
+    // Clear the container cells and set its capacity to 0
+    trian->clearCells();
+    // Clear the container points and set its capacity to 0
+    trian->clearPoints();
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    size_t numberOfPoints = mesh->getNumberOfPoints();
+    std::vector<float> vPoint(3, 0.0);
+    trian->points().resize(numberOfPoints, vPoint);
+
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+    typedef boost::make_unsigned< ::fwData::Mesh::PointsMultiArrayType::index >::type PointTypesIndex;
+    for (PointTypesIndex i = 0; i != numberOfPoints; ++i)
+    {
+        ::fwData::TriangularMesh::PointContainer::value_type &point = trian->points()[i];
+        for (PointTypesIndex j = 0; j != 3; ++j)
+        {
+            point[j] = points[i][j];
+        }
+    }
+
+    size_t numberOfCells = mesh->getNumberOfCells();
+    std::vector<int> vCell(3, 0);
+    trian->cells().resize(numberOfCells, vCell);
+
+    ::fwData::Mesh::CellDataMultiArrayType cells = meshHelper.getCellData();
+    typedef boost::make_unsigned< ::fwData::Mesh::CellDataMultiArrayType::index >::type CellTypesIndex;
+    size_t cellsSize = numberOfCells*3;
+    SLM_ASSERT("Wrong CellDataMultiArray size", cells.size() == cellsSize);
+    for (CellTypesIndex i = 0; i < cellsSize; i+=3)
+    {
+        ::fwData::TriangularMesh::CellContainer::value_type &vCells = trian->cells()[i/3];
+        vCells[0] = ::fwTools::numericRoundCast<int>(cells[i]);
+        vCells[1] = ::fwTools::numericRoundCast<int>(cells[i+1]);
+        vCells[2] = ::fwTools::numericRoundCast<int>(cells[i+2]);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::fromTriangularMesh(::fwData::TriangularMesh::sptr trian, ::fwData::Mesh::sptr mesh)
+{
+    ::fwData::TriangularMesh::PointContainer& vPoints = trian->points();
+    ::fwData::TriangularMesh::CellContainer& vCells = trian->cells();
+
+    mesh->clear();
+    mesh->allocate(vPoints.size(), vCells.size(), vCells.size()*3);
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    ::fwData::Array::sptr pointsArray = mesh->getPointsArray();
+    ::fwData::Array::sptr cellsArray = mesh->getCellDataArray();
+    ::fwData::Array::sptr cellDataOffsetArray = mesh->getCellDataOffsetsArray();
+    ::fwData::Array::sptr cellTypeArray = mesh->getCellTypesArray();
+
+    SLM_ASSERT("Wrong CellTypeArray dim", cellTypeArray->getSize().size()==1);
+    SLM_ASSERT("Wrong CellTypeArray size", cellTypeArray->getSize()[0]==vCells.size());
+    SLM_ASSERT("Wrong pointsArray dim", pointsArray->getSize().size()==1);
+    SLM_ASSERT("Wrong pointsArray size", pointsArray->getSize()[0]==vPoints.size());
+    SLM_ASSERT("Wrong cellsArray dim", cellsArray->getSize().size()==1);
+    SLM_ASSERT("Wrong cellsArray size", cellsArray->getSize()[0]==vCells.size()*3);
+    SLM_ASSERT("Wrong cellDataOffsetArray dim", cellDataOffsetArray->getSize().size()==1);
+    SLM_ASSERT("Wrong cellDataOffsetArray size", cellDataOffsetArray->getSize()[0]==vCells.size());
+
+    //Initialized pointsArray
+    for(size_t i=0; i<vPoints.size(); i++)
+    {
+        meshHelper.insertNextPoint(vPoints[i][0], vPoints[i][1], vPoints[i][2]);
+    }
+
+    //Initialized cellsArray
+    for(size_t i=0; i<vCells.size(); i++)
+    {
+        meshHelper.insertNextCell(vCells[i][0], vCells[i][1], vCells[i][2]);
+    }
+    mesh->adjustAllocatedMemory();
+}
+
+//------------------------------------------------------------------------------
+
+bool Mesh::hasUniqueCellType(::fwData::Mesh::sptr mesh, ::fwData::Mesh::CellTypes cell)
+{
+    bool res = true;
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+    ::fwData::Mesh::CellTypesMultiArrayType cellTypes = meshHelper.getCellTypes();
+
+    BOOST_FOREACH(::fwData::Mesh::CellTypes type, cellTypes)
+    {
+        if(type != cell)
+        {
+            return false;
+        }
+    }
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+typedef boost::multi_array_ref<Point, 1> PointsMultiArrayType;
+
+
+Vector<float> &computeTriangleNormal(const Point &p1, const Point &p2, const Point &p3, Vector<float> &n)
+{
+    n = Vector<float>(p1, p2);
+    Vector<float> v(p1, p3);
+    n.crossWith(v);
+    n.normalize();
+    return n;
+}
+
+//------------------------------------------------------------------------------
+
+Vector<float> &computeTriangleNormal( const PointsMultiArrayType &points, const ::fwData::Mesh::CellValueType *cell, Vector<float> &n)
+{
+    const Point &p1 = points[cell[0]];
+    const Point &p2 = points[cell[1]];
+    const Point &p3 = points[cell[2]];
+
+    computeTriangleNormal(p1, p2, p3, n);
+    return n;
+}
+
+//------------------------------------------------------------------------------
+
+Vector<float> &computeCellNormal( const PointsMultiArrayType &points, const ::fwData::Mesh::CellValueType *cell, size_t cellSize, Vector<float> &n)
+{
+    n = Vector<float>();
+    Vector<float> v;
+
+    for (size_t i=0; i< cellSize; ++i)
+    {
+        const Point &p1 = points[cell[i  ]];
+        const Point &p2 = points[cell[(i+1)% cellSize]];
+        const Point &p3 = points[cell[(i+2)% cellSize]];
+
+        computeTriangleNormal(p1, p2, p3, n);
+
+        n += v;
+    }
+
+    n /= ::fwTools::numericRoundCast<float>(cellSize);
+    n.normalize();
+    return n;
+}
+
+//------------------------------------------------------------------------------
+
+void generateRegionCellNormals(::fwComEd::helper::Mesh::sptr meshHelper, const ::fwData::Mesh::Id regionMin, const ::fwData::Mesh::Id regionMax)
+{
+    ::fwData::Mesh::csptr mesh = meshHelper->getMesh();
+    ::fwComEd::helper::Array pointArrayHelper(mesh->getPointsArray());
+    ::fwComEd::helper::Array cellNormalsArrayHelper(mesh->getCellNormalsArray());
+
+    PointsMultiArrayType point = PointsMultiArrayType(
+            static_cast<PointsMultiArrayType::element*>(pointArrayHelper.getBuffer()),
+            ::boost::extents[mesh->getNumberOfPoints()]
+            );
+
+
+    ::fwData::Mesh::CellTypesMultiArrayType       cellTypes       = meshHelper->getCellTypes();
+    ::fwData::Mesh::CellDataMultiArrayType        cellData        = meshHelper->getCellData();
+    ::fwData::Mesh::CellDataOffsetsMultiArrayType cellDataOffsets = meshHelper->getCellDataOffsets();
+
+    const Vector<float> vZero;
+    ::fwData::Mesh::CellTypes type;
+    ::fwData::Mesh::CellDataOffsetType offset;
+    ::fwData::Mesh::CellValueType *cell;
+    ::fwData::Mesh::Id cellLen = 0;
+
+    const ::fwData::Mesh::Id numberOfCells = mesh->getNumberOfCells();
+    const ::fwData::Mesh::Id cellDataSize = mesh->getCellDataSize();
+
+    Vector< ::fwData::Mesh::NormalValueType > *normals = cellNormalsArrayHelper.begin< Vector< ::fwData::Mesh::NormalValueType > >();
+
+    for(::fwData::Mesh::Id i = regionMin; i<regionMax; ++i)
+    {
+        Vector<float> &n = normals[i];
+
+        type = cellTypes[i];
+        offset = cellDataOffsets[i];
+        cell = &cellData[offset];
+        switch (type)
+        {
+            case 0:
+            case 1:
+            case 2:
+                n = vZero;
+                break;
+            case 3:
+                {
+                    computeTriangleNormal(point, cell, n);
+                }
+                break;
+            case 4:
+            case 5:
+                {
+                    const ::fwData::Mesh::Id i1 = i+1;
+                    cellLen = (( i1 < numberOfCells )? cellDataOffsets[i1]:cellDataSize) - cellDataOffsets[i];
+
+                    computeCellNormal(point, cell, cellLen, n);
+                }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+template <typename T>
+void vectorSum( std::vector< std::vector<T> > &vectors, size_t regionMin, size_t regionMax )
+{
+    if (vectors.empty())
+    {
+        return;
+    }
+
+    typename std::vector< std::vector<T> >::iterator vIter = vectors.begin();
+
+    std::vector<T> &res = vectors[0];
+
+    for (++vIter; vIter != vectors.end(); ++vIter)
+    {
+        for (size_t i = regionMin; i<regionMax; ++i)
+        {
+            res[i] += (*vIter)[i];
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::generateCellNormals(::fwData::Mesh::sptr mesh)
+{
+    const ::fwData::Mesh::Id numberOfCells = mesh->getNumberOfCells();
+    if(numberOfCells > 0)
+    {
+        mesh->allocateCellNormals();
+        ::fwComEd::helper::Mesh::sptr meshHelper;
+        meshHelper = ::fwComEd::helper::Mesh::New(mesh);
+
+        ::fwDataTools::thread::RegionThreader rt((numberOfCells >= 200000) ? 4 : 1);
+        rt( ::boost::bind(&generateRegionCellNormals, meshHelper, _1, _2), numberOfCells );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+typedef std::vector< std::vector< unsigned char > > CharVectors;
+typedef std::vector< std::vector< float > > FloatVectors;
+
+void generateRegionCellNormalsByPoints(FloatVectors &normalsData, CharVectors &normalCounts, size_t dataId,
+        ::fwComEd::helper::Mesh::sptr meshHelper, const ::fwData::Mesh::Id regionMin, const ::fwData::Mesh::Id regionMax)
+{
+    ::fwData::Mesh::csptr mesh = meshHelper->getMesh();
+    FloatVectors::value_type &normalsResults = normalsData[dataId];
+    CharVectors::value_type  &normalCount    = normalCounts[dataId];
+
+    const ::fwData::Mesh::Id nbOfPoints = mesh->getNumberOfPoints();
+    normalsResults.resize(3*nbOfPoints, 0.f);
+    normalCount.resize(nbOfPoints, 0);
+
+    ::fwData::Mesh::CellTypesMultiArrayType       cellTypes       = meshHelper->getCellTypes();
+    ::fwData::Mesh::CellDataMultiArrayType        cellData        = meshHelper->getCellData();
+    ::fwData::Mesh::CellDataOffsetsMultiArrayType cellDataOffsets = meshHelper->getCellDataOffsets();
+
+
+    ::fwData::Mesh::CellTypes type;
+    ::fwData::Mesh::CellDataOffsetType offset;
+    ::fwData::Mesh::CellValueType *cell;
+    ::fwData::Mesh::Id cellLen = 0;
+
+    const ::fwData::Mesh::Id numberOfCells = mesh->getNumberOfCells();
+    const ::fwData::Mesh::Id cellDataSize = mesh->getCellDataSize();
+
+    ::fwComEd::helper::Array arrayHelper(mesh->getCellNormalsArray());
+    Vector< ::fwData::Mesh::NormalValueType > *normals = arrayHelper.begin< Vector< ::fwData::Mesh::NormalValueType > >();
+    Vector< ::fwData::Mesh::NormalValueType > *normalResults = reinterpret_cast< Vector< ::fwData::Mesh::NormalValueType > * >( &(*normalsResults.begin()));
+
+
+    ::fwData::Mesh::CellValueType *pointId;
+    ::fwData::Mesh::CellValueType *cellEnd;
+
+    for(::fwData::Mesh::Id i = regionMin; i<regionMax; ++i)
+    {
+        type    = cellTypes[i];
+        offset  = cellDataOffsets[i];
+        cell    = &cellData[offset];
+        cellLen = type;
+
+        switch (type)
+        {
+            case 0:
+            case 1:
+            case 2:
+            case 3:
+            case 4:
+                cellLen = type;
+                break;
+            case 5:
+                {
+                    const ::fwData::Mesh::Id i1 = i+1;
+                    cellLen = (( i1 < numberOfCells )? cellDataOffsets[i1]:cellDataSize) - cellDataOffsets[i];
+                }
+        }
+
+        cellEnd = cell + cellLen;
+
+        for(pointId = cell; pointId != cellEnd; ++pointId)
+        {
+            Vector< ::fwData::Mesh::NormalValueType > &res = normalResults[*pointId];
+            res += normals[i];
+            normalCount[*pointId] += 1;
+        }
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void normalizeRegionCellNormalsByPoints(FloatVectors::value_type &normalsData, CharVectors::value_type &normalCount,
+        ::fwData::Mesh::sptr mesh, const ::fwData::Mesh::Id regionMin, const ::fwData::Mesh::Id regionMax)
+{
+    Vector< ::fwData::Mesh::NormalValueType > *normalSum = reinterpret_cast< Vector< ::fwData::Mesh::NormalValueType > * >( &(*normalsData.begin()) );
+
+    ::fwComEd::helper::Array arrayHelper(mesh->getPointNormalsArray());
+    Vector< ::fwData::Mesh::NormalValueType > *normals = arrayHelper.begin< Vector< ::fwData::Mesh::NormalValueType > >();
+
+    for ( ::fwData::Mesh::Id i = regionMin; i < regionMax; ++i)
+    {
+        CharVectors::value_type::value_type count = normalCount[i];
+        normals[i] = normalSum[i];
+
+        if(count>1)
+        {
+            normals[i] /= count;
+        }
+    }
+}
+
+
+//------------------------------------------------------------------------------
+
+void Mesh::generatePointNormals(::fwData::Mesh::sptr mesh)
+{
+    const ::fwData::Mesh::Id nbOfPoints = mesh->getNumberOfPoints();
+    if(nbOfPoints > 0)
+    {
+        const ::fwData::Mesh::Id numberOfCells = mesh->getNumberOfCells();
+        ::fwData::Array::sptr oldCellNormals = mesh->getCellNormalsArray();
+        mesh->clearCellNormals();
+
+        generateCellNormals(mesh);
+
+        mesh->allocatePointNormals();
+
+        ::fwComEd::helper::Mesh::sptr meshHelper;
+        meshHelper = ::fwComEd::helper::Mesh::New(mesh);
+
+        ::fwDataTools::thread::RegionThreader rt((nbOfPoints >= 100000) ? 4 : 1);
+
+
+        FloatVectors normalsData(rt.numberOfThread());
+        CharVectors  normalCounts(rt.numberOfThread());
+
+        rt( ::boost::bind(&generateRegionCellNormalsByPoints,
+                          ::boost::ref(normalsData),
+                          ::boost::ref(normalCounts),
+                          _3, meshHelper, _1, _2),
+                          numberOfCells);
+
+        rt( ::boost::bind(&vectorSum<FloatVectors::value_type::value_type>,
+                          ::boost::ref(normalsData),
+                          _1, _2),
+                          nbOfPoints*3);
+
+
+        rt( ::boost::bind(&vectorSum<CharVectors::value_type::value_type>,
+                          ::boost::ref(normalCounts),
+                          _1, _2),
+                          nbOfPoints);
+
+
+        rt( boost::bind( &normalizeRegionCellNormalsByPoints,
+                         ::boost::ref(normalsData[0]),
+                         ::boost::ref(normalCounts[0]),
+                          mesh, _1, _2),
+                         nbOfPoints);
+
+        meshHelper.reset();
+        mesh->setCellNormalsArray(oldCellNormals);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template <typename T>
+void regionShakeNormals(T normals, const ::fwData::Mesh::Id regionMin, const ::fwData::Mesh::Id regionMax)
+{
+    RandFloat randFloat;
+    for (::fwData::Mesh::Id i = regionMin; i < regionMax; ++i)
+    {
+        Vector<float> v(randFloat(), randFloat(), randFloat());
+        normals[i] += v;
+        normals[i].normalize();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::shakeNormals(::fwData::Array::sptr array)
+{
+
+    if(array
+            && array->getType() == ::fwTools::Type::create<float>()
+            && !array->empty()
+            && array->getNumberOfComponents() == 3
+            && array->getNumberOfDimensions() == 1
+            )
+    {
+        ::fwComEd::helper::Array arrayHelper(array);
+        void *buf;
+        buf = arrayHelper.getBuffer();
+                const ::fwData::Mesh::Id nbOfNormals = array->getSize().at(0);
+        typedef boost::multi_array_ref<Vector<float>, 1> NormalsMultiArrayType;
+        NormalsMultiArrayType normals = NormalsMultiArrayType(
+                static_cast<NormalsMultiArrayType::element*>(buf),
+                boost::extents[nbOfNormals]
+                );
+
+        ::fwDataTools::thread::RegionThreader rt((nbOfNormals >= 150000) ? 4 : 1);
+        rt( ::boost::bind(&regionShakeNormals<NormalsMultiArrayType>,
+                           boost::ref(normals),
+                           _1, _2),
+            nbOfNormals);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::shakePointNormals(::fwData::Mesh::sptr mesh)
+{
+    shakeNormals(mesh->getPointNormalsArray());
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::shakeCellNormals(::fwData::Mesh::sptr mesh)
+{
+    shakeNormals(mesh->getCellNormalsArray());
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::colorizeMeshPoints(::fwData::Mesh::sptr mesh)
+{
+    mesh->allocatePointColors(::fwData::Mesh::RGB);
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    ::fwData::Mesh::ColorValueType color[4];
+    size_t numberOfPoints = mesh->getNumberOfPoints();
+    for(size_t i = 0; i<numberOfPoints; ++i)
+    {
+        color[0] = rand()%256;
+        color[1] = 0;//rand()%256;
+        color[2] = rand()%256;
+        meshHelper.setPointColor(i, color);
+    }
+}
+//------------------------------------------------------------------------------
+
+void Mesh::colorizeMeshCells(::fwData::Mesh::sptr mesh)
+{
+    mesh->allocateCellColors(::fwData::Mesh::RGBA);
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    ::fwData::Mesh::ColorValueType color[4];
+    size_t numberOfCells = mesh->getNumberOfCells();
+    for(size_t i = 0; i<numberOfCells; ++i)
+    {
+        color[0] = rand()%256;
+        color[1] = rand()%256;
+        color[2] = 0;//rand()%256;
+        color[3] = rand()%256;
+        meshHelper.setCellColor(i, color);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::shakePoint(::fwData::Mesh::sptr mesh)
+{
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+
+    size_t nbPts = mesh->getNumberOfPoints();
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+    RandFloat randFloat;
+    for(size_t i=0 ; i<nbPts ; ++i )
+    {
+        points[i][0] += randFloat()*5;
+        points[i][1] += randFloat()*5;
+        points[i][2] += randFloat()*5;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::transform( ::fwData::Mesh::sptr mesh, ::fwData::TransformationMatrix3D::sptr t )
+ {
+    size_t nbPts = mesh->getNumberOfPoints();
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+    ::fwData::Mesh::PointValueType x, y, z, xp, yp, zp, factor;
+    for(size_t i=0 ; i<nbPts ; ++i )
+    {
+        x = points[i][0];
+        y = points[i][1];
+        z = points[i][2];
+        xp     = ::fwTools::numericRoundCast< ::fwData::Mesh::PointValueType >(t->getCoefficient(0,0) * x
+                                                                               + t->getCoefficient(0,1) * y
+                                                                               + t->getCoefficient(0,2) * z
+                                                                               + t->getCoefficient(0,3));
+        yp     = ::fwTools::numericRoundCast< ::fwData::Mesh::PointValueType >(t->getCoefficient(1,0) * x
+                                                                               + t->getCoefficient(1,1) * y
+                                                                               + t->getCoefficient(1,2) * z
+                                                                               + t->getCoefficient(1,3));
+        zp     = ::fwTools::numericRoundCast< ::fwData::Mesh::PointValueType >(t->getCoefficient(2,0) * x
+                                                                               + t->getCoefficient(2,1) * y
+                                                                               + t->getCoefficient(2,2) * z
+                                                                               + t->getCoefficient(2,3));
+        factor = ::fwTools::numericRoundCast< ::fwData::Mesh::PointValueType >(t->getCoefficient(3,0) * x
+                                                                               + t->getCoefficient(3,1) * y
+                                                                               + t->getCoefficient(3,2) * z
+                                                                               + t->getCoefficient(3,3));
+        points[i][0] = xp/factor;
+        points[i][1] = yp/factor;
+        points[i][2] = zp/factor;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/src/fwDataTools/TransferFunction.cpp b/SrcLib/core/fwDataTools/src/fwDataTools/TransferFunction.cpp
new file mode 100644
index 0000000..23e27f8
--- /dev/null
+++ b/SrcLib/core/fwDataTools/src/fwDataTools/TransferFunction.cpp
@@ -0,0 +1,294 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <map>
+
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include "fwDataTools/TransferFunction.hpp"
+
+
+namespace fwDataTools
+{
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::generateDrawingTF(::fwData::TransferFunction::sptr tf)
+{
+    tf->setTFData(TransferFunction::getDrawingTFColors());
+    tf->setWLMinMax(::fwData::TransferFunction::TFValuePairType(0, 255));
+    tf->setInterpolationMode(::fwData::TransferFunction::NEAREST);
+    tf->setName("Drawing");
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::TFDataType TransferFunction::getDrawingTFColors()
+{
+    typedef ::fwData::TransferFunction::TFColor TFColorType;
+    static const ::fwData::TransferFunction::TFDataType dataType =
+            ::boost::assign::map_list_of
+                    (0.0 , TFColorType(0/255.0f  , 0/255.0f  , 0/255.0f       , 0/255.0f))
+                    (1.0 , TFColorType(255/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (2.0 , TFColorType(0/255.0f  , 0/255.0f  , 150/255.0f     , 255/255.0f))
+                    (3.0 , TFColorType(255/255.0f, 100/255.0f, 0/255.0f       , 255/255.0f))
+                    (4.0 , TFColorType(0/255.0f  , 255/255.0f, 0/255.0f       , 255/255.0f))
+                    (5.0 , TFColorType(255/255.0f, 255/255.0f, 0/255.0f       , 255/255.0f))
+                    (6.0 , TFColorType(150/255.0f, 0/255.0f  , 150/255.0f     , 255/255.0f))
+                    (7.0 , TFColorType(0/255.0f  , 255/255.0f, 255/255.0f     , 255/255.0f))
+                    (8.0 , TFColorType(150/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (9.0 , TFColorType(0/255.0f  , 150/255.0f, 0/255.0f       , 255/255.0f))
+                    (10.0, TFColorType(255/255.0f, 177/255.0f, 177/255.0f     , 255/255.0f))
+                    (11.0, TFColorType(0/255.0f  , 150/255.0f, 150/255.0f     , 255/255.0f))
+                    (12.0, TFColorType(255/255.0f, 0/255.0f  , 255/255.0f     , 255/255.0f))
+                    (13.0, TFColorType(150/255.0f, 150/255.0f, 0/255.0f       , 255/255.0f))
+                    (14.0, TFColorType(135/255.0f, 135/255.0f, 81/255.0f      , 255/255.0f))
+                    (15.0, TFColorType(255/255.0f, 255/255.0f, 177/255.0f     , 255/255.0f))
+                    (16.0, TFColorType(177/255.0f, 177/255.0f, 255/255.0f     , 255/255.0f))
+                    (17.0, TFColorType(255/255.0f, 200/255.0f, 50/255.0f      , 255/255.0f))
+                    (18.0, TFColorType(255/255.0f, 177/255.0f, 255/255.0f     , 255/255.0f))
+                    (19.0, TFColorType(177/255.0f, 255/255.0f, 255/255.0f     , 255/255.0f))
+                    (20.0, TFColorType(255/255.0f, 50/255.0f , 50/255.0f      , 255/255.0f))
+                    (21.0, TFColorType(245/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (22.0, TFColorType(0/255.0f  , 0/255.0f  , 142/255.0f     , 255/255.0f))
+                    (23.0, TFColorType(245/255.0f, 95/255.0f , 0/255.0f       , 255/255.0f))
+                    (24.0, TFColorType(0/255.0f  , 245/255.0f, 0/255.0f       , 255/255.0f))
+                    (25.0, TFColorType(245/255.0f, 245/255.0f, 0/255.0f       , 255/255.0f))
+                    (26.0, TFColorType(142/255.0f, 0/255.0f  , 142/255.0f     , 255/255.0f))
+                    (27.0, TFColorType(0/255.0f  , 245/255.0f, 245/255.0f     , 255/255.0f))
+                    (28.0, TFColorType(142/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (29.0, TFColorType(0/255.0f  , 142/255.0f, 0/255.0f       , 255/255.0f))
+                    (30.0, TFColorType(245/255.0f, 169/255.0f, 169/255.0f     , 255/255.0f))
+                    (31.0, TFColorType(0/255.0f  , 142/255.0f, 142/255.0f     , 255/255.0f))
+                    (32.0, TFColorType(245/255.0f, 0/255.0f  , 245/255.0f     , 255/255.0f))
+                    (33.0, TFColorType(142/255.0f, 142/255.0f, 0/255.0f       , 255/255.0f))
+                    (34.0, TFColorType(169/255.0f, 245/255.0f, 169/255.0f     , 255/255.0f))
+                    (35.0, TFColorType(245/255.0f, 245/255.0f, 169/255.0f     , 255/255.0f))
+                    (36.0, TFColorType(169/255.0f, 169/255.0f, 245/255.0f     , 255/255.0f))
+                    (37.0, TFColorType(245/255.0f, 192/255.0f, 46/255.0f      , 255/255.0f))
+                    (38.0, TFColorType(245/255.0f, 169/255.0f, 245/255.0f     , 255/255.0f))
+                    (39.0, TFColorType(169/255.0f, 245/255.0f, 245/255.0f     , 255/255.0f))
+                    (40.0, TFColorType(245/255.0f, 46/255.0f , 46/255.0f      , 255/255.0f))
+                    (41.0, TFColorType(235/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (42.0, TFColorType(0/255.0f  , 0/255.0f  , 134/255.0f     , 255/255.0f))
+                    (43.0, TFColorType(235/255.0f, 90/255.0f , 0/255.0f       , 255/255.0f))
+                    (44.0, TFColorType(0/255.0f  , 235/255.0f, 0/255.0f       , 255/255.0f))
+                    (45.0, TFColorType(235/255.0f, 235/255.0f, 0/255.0f       , 255/255.0f))
+                    (46.0, TFColorType(134/255.0f, 0/255.0f  , 134/255.0f     , 255/255.0f))
+                    (47.0, TFColorType(0/255.0f  , 235/255.0f, 235/255.0f     , 255/255.0f))
+                    (48.0, TFColorType(134/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (49.0, TFColorType(0/255.0f  , 134/255.0f, 0/255.0f       , 255/255.0f))
+                    (50.0, TFColorType(235/255.0f, 161/255.0f, 161/255.0f     , 255/255.0f))
+                    (51.0, TFColorType(0/255.0f  , 134/255.0f, 134/255.0f     , 255/255.0f))
+                    (52.0, TFColorType(235/255.0f, 0/255.0f  , 235/255.0f     , 255/255.0f))
+                    (53.0, TFColorType(134/255.0f, 134/255.0f, 0/255.0f       , 255/255.0f))
+                    (54.0, TFColorType(161/255.0f, 235/255.0f, 161/255.0f     , 255/255.0f))
+                    (55.0, TFColorType(235/255.0f, 235/255.0f, 161/255.0f     , 255/255.0f))
+                    (56.0, TFColorType(161/255.0f, 161/255.0f, 235/255.0f     , 255/255.0f))
+                    (57.0, TFColorType(235/255.0f, 184/255.0f, 42/255.0f      , 255/255.0f))
+                    (58.0, TFColorType(235/255.0f, 161/255.0f, 235/255.0f     , 255/255.0f))
+                    (59.0, TFColorType(161/255.0f, 235/255.0f, 235/255.0f     , 255/255.0f))
+                    (60.0, TFColorType(235/255.0f, 42/255.0f , 42/255.0f      , 255/255.0f))
+                    (61.0, TFColorType(225/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (62.0, TFColorType(0/255.0f  , 0/255.0f  , 126/255.0f     , 255/255.0f))
+                    (63.0, TFColorType(225/255.0f, 85/255.0f , 0/255.0f       , 255/255.0f))
+                    (64.0, TFColorType(0/255.0f  , 225/255.0f, 0/255.0f       , 255/255.0f))
+                    (65.0, TFColorType(225/255.0f, 225/255.0f, 0/255.0f       , 255/255.0f))
+                    (66.0, TFColorType(126/255.0f, 0/255.0f  , 126/255.0f     , 255/255.0f))
+                    (67.0, TFColorType(0/255.0f  , 225/255.0f, 225/255.0f     , 255/255.0f))
+                    (68.0, TFColorType(126/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (69.0, TFColorType(0/255.0f  , 126/255.0f, 0/255.0f       , 255/255.0f))
+                    (70.0, TFColorType(225/255.0f, 153/255.0f, 153/255.0f     , 255/255.0f))
+                    (71.0, TFColorType(0/255.0f  , 126/255.0f, 126/255.0f     , 255/255.0f))
+                    (72.0, TFColorType(225/255.0f, 0/255.0f  , 225/255.0f     , 255/255.0f))
+                    (73.0, TFColorType(126/255.0f, 126/255.0f, 0/255.0f       , 255/255.0f))
+                    (74.0, TFColorType(153/255.0f, 225/255.0f, 153/255.0f     , 255/255.0f))
+                    (75.0, TFColorType(225/255.0f, 225/255.0f, 153/255.0f     , 255/255.0f))
+                    (76.0, TFColorType(153/255.0f, 153/255.0f, 225/255.0f     , 255/255.0f))
+                    (77.0, TFColorType(225/255.0f, 176/255.0f, 38/255.0f      , 255/255.0f))
+                    (78.0, TFColorType(225/255.0f, 153/255.0f, 225/255.0f     , 255/255.0f))
+                    (79.0, TFColorType(153/255.0f, 225/255.0f, 225/255.0f     , 255/255.0f))
+                    (80.0, TFColorType(225/255.0f, 38/255.0f , 38/255.0f      , 255/255.0f))
+                    (81.0, TFColorType(215/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (82.0, TFColorType(0/255.0f  , 0/255.0f  , 118/255.0f     , 255/255.0f))
+                    (83.0, TFColorType(215/255.0f, 80/255.0f , 0/255.0f       , 255/255.0f))
+                    (84.0, TFColorType(0/255.0f  , 215/255.0f, 0/255.0f       , 255/255.0f))
+                    (85.0, TFColorType(215/255.0f, 215/255.0f, 0/255.0f       , 255/255.0f))
+                    (86.0, TFColorType(118/255.0f, 0/255.0f  , 118/255.0f     , 255/255.0f))
+                    (87.0, TFColorType(0/255.0f  , 215/255.0f, 215/255.0f     , 255/255.0f))
+                    (88.0, TFColorType(118/255.0f, 0/255.0f  , 0/255.0f       , 255/255.0f))
+                    (89.0, TFColorType(0/255.0f  , 118/255.0f, 0/255.0f       , 255/255.0f))
+                    (90.0, TFColorType(215/255.0f, 145/255.0f, 145/255.0f     , 255/255.0f))
+                    (91.0, TFColorType(0/255.0f  , 118/255.0f, 118/255.0f     , 255/255.0f))
+                    (92.0, TFColorType(215/255.0f, 0/255.0f  , 215/255.0f     , 255/255.0f))
+                    (93.0, TFColorType(118/255.0f, 118/255.0f, 0/255.0f       , 255/255.0f))
+                    (94.0, TFColorType(145/255.0f, 215/255.0f, 145/255.0f     , 255/255.0f))
+                    (95.0, TFColorType(215/255.0f, 215/255.0f, 145/255.0f     , 255/255.0f))
+                    (96.0, TFColorType(145/255.0f, 145/255.0f, 215/255.0f     , 255/255.0f))
+                    (97.0, TFColorType(215/255.0f, 168/255.0f, 34/255.0f      , 255/255.0f))
+                    (98.0, TFColorType(215/255.0f, 145/255.0f, 215/255.0f     , 255/255.0f))
+                    (99.0, TFColorType(145/255.0f, 215/255.0f, 215/255.0f     , 255/255.0f))
+                    (100.0, TFColorType(215/255.0f, 34/255.0f , 34/255.0f     , 255/255.0f))
+                    (101.0, TFColorType(205/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (102.0, TFColorType(0/255.0f  , 0/255.0f  , 110/255.0f    , 255/255.0f))
+                    (103.0, TFColorType(205/255.0f, 75/255.0f , 0/255.0f      , 255/255.0f))
+                    (104.0, TFColorType(0/255.0f  , 205/255.0f, 0/255.0f      , 255/255.0f))
+                    (105.0, TFColorType(205/255.0f, 205/255.0f, 0/255.0f      , 255/255.0f))
+                    (106.0, TFColorType(110/255.0f, 0/255.0f  , 110/255.0f    , 255/255.0f))
+                    (107.0, TFColorType(0/255.0f  , 205/255.0f, 205/255.0f    , 255/255.0f))
+                    (108.0, TFColorType(110/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (109.0, TFColorType(0/255.0f  , 110/255.0f, 0/255.0f      , 255/255.0f))
+                    (110.0, TFColorType(205/255.0f, 137/255.0f, 137/255.0f    , 255/255.0f))
+                    (111.0, TFColorType(0/255.0f  , 110/255.0f, 110/255.0f    , 255/255.0f))
+                    (112.0, TFColorType(205/255.0f, 0/255.0f  , 205/255.0f    , 255/255.0f))
+                    (113.0, TFColorType(110/255.0f, 110/255.0f, 0/255.0f      , 255/255.0f))
+                    (114.0, TFColorType(137/255.0f, 205/255.0f, 137/255.0f    , 255/255.0f))
+                    (115.0, TFColorType(205/255.0f, 205/255.0f, 137/255.0f    , 255/255.0f))
+                    (116.0, TFColorType(137/255.0f, 137/255.0f, 205/255.0f    , 255/255.0f))
+                    (117.0, TFColorType(205/255.0f, 160/255.0f, 30/255.0f     , 255/255.0f))
+                    (118.0, TFColorType(205/255.0f, 137/255.0f, 205/255.0f    , 255/255.0f))
+                    (119.0, TFColorType(137/255.0f, 205/255.0f, 205/255.0f    , 255/255.0f))
+                    (120.0, TFColorType(205/255.0f, 30/255.0f , 30/255.0f     , 255/255.0f))
+                    (121.0, TFColorType(195/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (122.0, TFColorType(0/255.0f  , 0/255.0f  , 102/255.0f    , 255/255.0f))
+                    (123.0, TFColorType(195/255.0f, 70/255.0f , 0/255.0f      , 255/255.0f))
+                    (124.0, TFColorType(0/255.0f  , 195/255.0f, 0/255.0f      , 255/255.0f))
+                    (125.0, TFColorType(195/255.0f, 195/255.0f, 0/255.0f      , 255/255.0f))
+                    (126.0, TFColorType(102/255.0f, 0/255.0f  , 102/255.0f    , 255/255.0f))
+                    (127.0, TFColorType(0/255.0f  , 195/255.0f, 195/255.0f    , 255/255.0f))
+                    (128.0, TFColorType(102/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (129.0, TFColorType(0/255.0f  , 102/255.0f, 0/255.0f      , 255/255.0f))
+                    (130.0, TFColorType(195/255.0f, 129/255.0f, 129/255.0f    , 255/255.0f))
+                    (131.0, TFColorType(0/255.0f  , 102/255.0f, 102/255.0f    , 255/255.0f))
+                    (132.0, TFColorType(195/255.0f, 0/255.0f  , 195/255.0f    , 255/255.0f))
+                    (133.0, TFColorType(102/255.0f, 102/255.0f, 0/255.0f      , 255/255.0f))
+                    (134.0, TFColorType(129/255.0f, 195/255.0f, 129/255.0f    , 255/255.0f))
+                    (135.0, TFColorType(195/255.0f, 195/255.0f, 129/255.0f    , 255/255.0f))
+                    (136.0, TFColorType(129/255.0f, 129/255.0f, 195/255.0f    , 255/255.0f))
+                    (137.0, TFColorType(195/255.0f, 152/255.0f, 26/255.0f     , 255/255.0f))
+                    (138.0, TFColorType(195/255.0f, 129/255.0f, 195/255.0f    , 255/255.0f))
+                    (139.0, TFColorType(129/255.0f, 195/255.0f, 195/255.0f    , 255/255.0f))
+                    (140.0, TFColorType(195/255.0f, 26/255.0f , 26/255.0f     , 255/255.0f))
+                    (141.0, TFColorType(185/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (142.0, TFColorType(0/255.0f  , 0/255.0f  , 94/255.0f     , 255/255.0f))
+                    (143.0, TFColorType(185/255.0f, 65/255.0f , 0/255.0f      , 255/255.0f))
+                    (144.0, TFColorType(0/255.0f  , 185/255.0f, 0/255.0f      , 255/255.0f))
+                    (145.0, TFColorType(185/255.0f, 185/255.0f, 0/255.0f      , 255/255.0f))
+                    (146.0, TFColorType(94/255.0f , 0/255.0f  , 94/255.0f     , 255/255.0f))
+                    (147.0, TFColorType(0/255.0f  , 185/255.0f, 185/255.0f    , 255/255.0f))
+                    (148.0, TFColorType(94/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (149.0, TFColorType(0/255.0f  , 94/255.0f , 0/255.0f      , 255/255.0f))
+                    (150.0, TFColorType(185/255.0f, 121/255.0f, 121/255.0f    , 255/255.0f))
+                    (151.0, TFColorType(0/255.0f  , 94/255.0f , 94/255.0f     , 255/255.0f))
+                    (152.0, TFColorType(185/255.0f, 0/255.0f  , 185/255.0f    , 255/255.0f))
+                    (153.0, TFColorType(94/255.0f , 94/255.0f , 0/255.0f      , 255/255.0f))
+                    (154.0, TFColorType(121/255.0f, 185/255.0f, 121/255.0f    , 255/255.0f))
+                    (155.0, TFColorType(185/255.0f, 185/255.0f, 121/255.0f    , 255/255.0f))
+                    (156.0, TFColorType(121/255.0f, 121/255.0f, 185/255.0f    , 255/255.0f))
+                    (157.0, TFColorType(185/255.0f, 144/255.0f, 22/255.0f     , 255/255.0f))
+                    (158.0, TFColorType(185/255.0f, 121/255.0f, 185/255.0f    , 255/255.0f))
+                    (159.0, TFColorType(121/255.0f, 185/255.0f, 185/255.0f    , 255/255.0f))
+                    (160.0, TFColorType(185/255.0f, 22/255.0f , 22/255.0f     , 255/255.0f))
+                    (161.0, TFColorType(175/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (162.0, TFColorType(0/255.0f  , 0/255.0f  , 86/255.0f     , 255/255.0f))
+                    (163.0, TFColorType(175/255.0f, 60/255.0f , 0/255.0f      , 255/255.0f))
+                    (164.0, TFColorType(0/255.0f  , 175/255.0f, 0/255.0f      , 255/255.0f))
+                    (165.0, TFColorType(175/255.0f, 175/255.0f, 0/255.0f      , 255/255.0f))
+                    (166.0, TFColorType(86/255.0f , 0/255.0f  , 86/255.0f     , 255/255.0f))
+                    (167.0, TFColorType(0/255.0f  , 175/255.0f, 175/255.0f    , 255/255.0f))
+                    (168.0, TFColorType(86/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (169.0, TFColorType(0/255.0f  , 86/255.0f , 0/255.0f      , 255/255.0f))
+                    (170.0, TFColorType(175/255.0f, 113/255.0f, 113/255.0f    , 255/255.0f))
+                    (171.0, TFColorType(0/255.0f  , 86/255.0f , 86/255.0f     , 255/255.0f))
+                    (172.0, TFColorType(175/255.0f, 0/255.0f  , 175/255.0f    , 255/255.0f))
+                    (173.0, TFColorType(86/255.0f , 86/255.0f , 0/255.0f      , 255/255.0f))
+                    (174.0, TFColorType(113/255.0f, 175/255.0f, 113/255.0f    , 255/255.0f))
+                    (175.0, TFColorType(175/255.0f, 175/255.0f, 113/255.0f    , 255/255.0f))
+                    (176.0, TFColorType(113/255.0f, 113/255.0f, 175/255.0f    , 255/255.0f))
+                    (177.0, TFColorType(175/255.0f, 136/255.0f, 18/255.0f     , 255/255.0f))
+                    (178.0, TFColorType(175/255.0f, 113/255.0f, 175/255.0f    , 255/255.0f))
+                    (179.0, TFColorType(113/255.0f, 175/255.0f, 175/255.0f    , 255/255.0f))
+                    (180.0, TFColorType(175/255.0f, 18/255.0f , 18/255.0f     , 255/255.0f))
+                    (181.0, TFColorType(165/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (182.0, TFColorType(0/255.0f  , 0/255.0f  , 78/255.0f     , 255/255.0f))
+                    (183.0, TFColorType(165/255.0f, 55/255.0f , 0/255.0f      , 255/255.0f))
+                    (184.0, TFColorType(0/255.0f  , 165/255.0f, 0/255.0f      , 255/255.0f))
+                    (185.0, TFColorType(165/255.0f, 165/255.0f, 0/255.0f      , 255/255.0f))
+                    (186.0, TFColorType(78/255.0f , 0/255.0f  , 78/255.0f     , 255/255.0f))
+                    (187.0, TFColorType(0/255.0f  , 165/255.0f, 165/255.0f    , 255/255.0f))
+                    (188.0, TFColorType(78/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (189.0, TFColorType(0/255.0f  , 78/255.0f , 0/255.0f      , 255/255.0f))
+                    (190.0, TFColorType(165/255.0f, 105/255.0f, 105/255.0f    , 255/255.0f))
+                    (191.0, TFColorType(0/255.0f  , 78/255.0f , 78/255.0f     , 255/255.0f))
+                    (192.0, TFColorType(165/255.0f, 0/255.0f  , 165/255.0f    , 255/255.0f))
+                    (193.0, TFColorType(78/255.0f , 78/255.0f , 0/255.0f      , 255/255.0f))
+                    (194.0, TFColorType(105/255.0f, 165/255.0f, 105/255.0f    , 255/255.0f))
+                    (195.0, TFColorType(165/255.0f, 165/255.0f, 105/255.0f    , 255/255.0f))
+                    (196.0, TFColorType(105/255.0f, 105/255.0f, 165/255.0f    , 255/255.0f))
+                    (197.0, TFColorType(165/255.0f, 128/255.0f, 14/255.0f     , 255/255.0f))
+                    (198.0, TFColorType(165/255.0f, 105/255.0f, 165/255.0f    , 255/255.0f))
+                    (199.0, TFColorType(105/255.0f, 165/255.0f, 165/255.0f    , 255/255.0f))
+                    (200.0, TFColorType(165/255.0f, 14/255.0f , 14/255.0f     , 255/255.0f))
+                    (201.0, TFColorType(155/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (202.0, TFColorType(0/255.0f  , 0/255.0f  , 70/255.0f     , 255/255.0f))
+                    (203.0, TFColorType(155/255.0f, 50/255.0f , 0/255.0f      , 255/255.0f))
+                    (204.0, TFColorType(0/255.0f  , 155/255.0f, 0/255.0f      , 255/255.0f))
+                    (205.0, TFColorType(155/255.0f, 155/255.0f, 0/255.0f      , 255/255.0f))
+                    (206.0, TFColorType(70/255.0f , 0/255.0f  , 70/255.0f     , 255/255.0f))
+                    (207.0, TFColorType(0/255.0f  , 155/255.0f, 155/255.0f    , 255/255.0f))
+                    (208.0, TFColorType(70/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (209.0, TFColorType(0/255.0f  , 70/255.0f , 0/255.0f      , 255/255.0f))
+                    (210.0, TFColorType(155/255.0f, 97/255.0f , 97/255.0f     , 255/255.0f))
+                    (211.0, TFColorType(0/255.0f  , 70/255.0f , 70/255.0f     , 255/255.0f))
+                    (212.0, TFColorType(155/255.0f, 0/255.0f  , 155/255.0f    , 255/255.0f))
+                    (213.0, TFColorType(70/255.0f , 70/255.0f , 0/255.0f      , 255/255.0f))
+                    (214.0, TFColorType(97/255.0f , 155/255.0f, 97/255.0f     , 255/255.0f))
+                    (215.0, TFColorType(155/255.0f, 155/255.0f, 97/255.0f     , 255/255.0f))
+                    (216.0, TFColorType(97/255.0f , 97/255.0f , 155/255.0f    , 255/255.0f))
+                    (217.0, TFColorType(155/255.0f, 120/255.0f, 10/255.0f     , 255/255.0f))
+                    (218.0, TFColorType(155/255.0f, 97/255.0f , 155/255.0f    , 255/255.0f))
+                    (219.0, TFColorType(97/255.0f , 155/255.0f, 155/255.0f    , 255/255.0f))
+                    (220.0, TFColorType(155/255.0f, 10/255.0f , 10/255.0f     , 255/255.0f))
+                    (221.0, TFColorType(145/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (222.0, TFColorType(0/255.0f  , 0/255.0f  , 62/255.0f     , 255/255.0f))
+                    (223.0, TFColorType(145/255.0f, 45/255.0f , 0/255.0f      , 255/255.0f))
+                    (224.0, TFColorType(0/255.0f  , 145/255.0f, 0/255.0f      , 255/255.0f))
+                    (225.0, TFColorType(145/255.0f, 145/255.0f, 0/255.0f      , 255/255.0f))
+                    (226.0, TFColorType(62/255.0f , 0/255.0f  , 62/255.0f     , 255/255.0f))
+                    (227.0, TFColorType(0/255.0f  , 145/255.0f, 145/255.0f    , 255/255.0f))
+                    (228.0, TFColorType(62/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (229.0, TFColorType(0/255.0f  , 62/255.0f , 0/255.0f      , 255/255.0f))
+                    (230.0, TFColorType(145/255.0f, 89/255.0f , 89/255.0f     , 255/255.0f))
+                    (231.0, TFColorType(0/255.0f  , 62/255.0f , 62/255.0f     , 255/255.0f))
+                    (232.0, TFColorType(145/255.0f, 0/255.0f  , 145/255.0f    , 255/255.0f))
+                    (233.0, TFColorType(62/255.0f , 62/255.0f , 0/255.0f      , 255/255.0f))
+                    (234.0, TFColorType(89/255.0f , 145/255.0f, 89/255.0f     , 255/255.0f))
+                    (235.0, TFColorType(145/255.0f, 145/255.0f, 89/255.0f     , 255/255.0f))
+                    (236.0, TFColorType(89/255.0f , 89/255.0f , 145/255.0f    , 255/255.0f))
+                    (237.0, TFColorType(145/255.0f, 112/255.0f, 6/255.0f      , 255/255.0f))
+                    (238.0, TFColorType(145/255.0f, 89/255.0f , 145/255.0f    , 255/255.0f))
+                    (239.0, TFColorType(89/255.0f , 145/255.0f, 145/255.0f    , 255/255.0f))
+                    (240.0, TFColorType(145/255.0f, 6/255.0f  , 6/255.0f      , 255/255.0f))
+                    (241.0, TFColorType(135/255.0f, 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (242.0, TFColorType(0/255.0f  , 0/255.0f  , 54/255.0f     , 255/255.0f))
+                    (243.0, TFColorType(135/255.0f, 40/255.0f , 0/255.0f      , 255/255.0f))
+                    (244.0, TFColorType(0/255.0f  , 135/255.0f, 0/255.0f      , 255/255.0f))
+                    (245.0, TFColorType(135/255.0f, 135/255.0f, 0/255.0f      , 255/255.0f))
+                    (246.0, TFColorType(54/255.0f , 0/255.0f  , 54/255.0f     , 255/255.0f))
+                    (247.0, TFColorType(0/255.0f  , 135/255.0f, 135/255.0f    , 255/255.0f))
+                    (248.0, TFColorType(54/255.0f , 0/255.0f  , 0/255.0f      , 255/255.0f))
+                    (249.0, TFColorType(0/255.0f  , 54/255.0f , 0/255.0f      , 255/255.0f))
+                    (250.0, TFColorType(135/255.0f, 81/255.0f , 81/255.0f     , 255/255.0f))
+                    (251.0, TFColorType(0/255.0f  , 54/255.0f , 54/255.0f     , 255/255.0f))
+                    (252.0, TFColorType(135/255.0f, 0/255.0f  , 135/255.0f    , 255/255.0f))
+                    (253.0, TFColorType(54/255.0f , 54/255.0f , 0/255.0f      , 255/255.0f))
+                    (254.0, TFColorType(81/255.0f , 135/255.0f, 81/255.0f     , 255/255.0f))
+                    (255.0, TFColorType(177/255.0f, 255/255.0f, 177/255.0f    , 255/255.0f));
+    return dataType;
+}
+
+} // namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/src/fwDataTools/TransformationMatrix3D.cpp b/SrcLib/core/fwDataTools/src/fwDataTools/TransformationMatrix3D.cpp
new file mode 100644
index 0000000..cd8bb24
--- /dev/null
+++ b/SrcLib/core/fwDataTools/src/fwDataTools/TransformationMatrix3D.cpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+#include <boost/numeric/ublas/matrix.hpp>
+#include <boost/numeric/ublas/lu.hpp>
+#include <boost/numeric/ublas/io.hpp>
+
+#include "fwDataTools/TransformationMatrix3D.hpp"
+
+namespace fwDataTools
+{
+
+bool TransformationMatrix3D::invert(::fwData::TransformationMatrix3D::sptr trf_input,
+        ::fwData::TransformationMatrix3D::sptr trf_output)
+{
+    OSLM_INFO("Inverting matrix. Input:" << std::endl << *trf_input);
+    ::boost::numeric::ublas::matrix< ::fwData::TransformationMatrix3D::TM3DType, ::boost::numeric::ublas::row_major,
+            ::fwData::TransformationMatrix3D::TMCoefArray > mx_input(4, 4, trf_input->getCRefCoefficients()), mx_output(4,
+            4, trf_output->getCRefCoefficients());
+
+    // create a permutation matrix for the LU-factorization
+    ::boost::numeric::ublas::permutation_matrix< std::size_t > mx_perm(mx_input.size1());
+
+    // perform LU-factorization
+    int res = ::boost::numeric::ublas::lu_factorize(mx_input, mx_perm);
+    if (res != 0)
+    {
+        SLM_INFO("Cannot compute.");
+        return false;
+    }
+
+    // create identity matrix of "inverse"
+    mx_output.assign(
+            ::boost::numeric::ublas::identity_matrix< ::fwData::TransformationMatrix3D::TM3DType >(mx_input.size1()));
+
+    // backsubstitute to get the inverse
+    ::boost::numeric::ublas::lu_substitute(mx_input, mx_perm, mx_output);
+
+    for (int i = 0; i < 4; ++i)
+    {
+        for (int j = 0; j < 4; ++j)
+        {
+            trf_output->setCoefficient(i, j, mx_output(i, j));
+        }
+    }
+    OSLM_INFO("Output:" << std::endl << *trf_output);
+    return true;
+}
+
+// ----------------------------------------------------------------------------
+
+void TransformationMatrix3D::multiply(::fwData::TransformationMatrix3D::sptr fTrf_A,
+        ::fwData::TransformationMatrix3D::sptr fTrf_B, ::fwData::TransformationMatrix3D::sptr fTrf_C)
+{
+    ::boost::numeric::ublas::matrix< ::fwData::TransformationMatrix3D::TM3DType, ::boost::numeric::ublas::row_major,
+            ::fwData::TransformationMatrix3D::TMCoefArray > mx_a(4, 4, fTrf_A->getCRefCoefficients()), mx_b(4, 4,
+            fTrf_B->getCRefCoefficients()), mx_c(4, 4);
+
+    mx_c = ::boost::numeric::ublas::prod(mx_a, mx_b);
+
+    for (int i = 0; i < 4; ++i)
+    {
+        for (int j = 0; j < 4; ++j)
+        {
+            fTrf_C->setCoefficient(i, j, mx_c(i, j));
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void TransformationMatrix3D::identity(::fwData::TransformationMatrix3D::sptr trf)
+{
+    for (int i = 0; i < 4; ++i)
+    {
+        for (int j = 0; j < 4; ++j)
+        {
+            trf->setCoefficient(i, j, i == j ? 1 : 0);
+        }
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+void TransformationMatrix3D::multiply(::fwData::TransformationMatrix3D::sptr trf,
+            ::fwData::Point::sptr input, ::fwData::Point::sptr output)
+{
+    ::boost::numeric::ublas::matrix< ::fwData::TransformationMatrix3D::TM3DType, ::boost::numeric::ublas::row_major,
+            ::fwData::TransformationMatrix3D::TMCoefArray > mx(4, 4, trf->getCRefCoefficients());
+
+    ::boost::array<double, 3> inCoord = input->getCRefCoord();
+    ::boost::numeric::ublas::vector< double > in(4), out(4);
+    in[0] = inCoord[0];
+    in[1] = inCoord[1];
+    in[2] = inCoord[2];
+    in[3] = 1;
+
+    out = ::boost::numeric::ublas::prod(mx, in);
+    ::boost::array<double, 3> res = {{ out[0], out[1], out[2] }};
+    output->setCoord(res);
+}
+
+} // namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/test/CMakeLists.txt b/SrcLib/core/fwDataTools/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwDataTools/test/Properties.cmake b/SrcLib/core/fwDataTools/test/Properties.cmake
new file mode 100644
index 0000000..b19b0b2
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwDataToolsTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataCamp fwDataTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwDataTools/test/cppunit.options b/SrcLib/core/fwDataTools/test/cppunit.options
new file mode 100644
index 0000000..4075864
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/cppunit.options
@@ -0,0 +1,17 @@
+CLASSTEST=[
+          'MeshTest',
+          'ImageTest',
+          'TransformationMatrix3DTest',
+          ]
+
+USE = ['boost']
+LIB = [
+      'fwData_0-1',
+      'fwDataCamp_0-1',
+      'fwTools_0-1',
+      'fwCore_0-1',
+      'fwDataTools_0-1',
+      'fwTest_0-1',
+      ]
+CONSOLE = 'yes'
+LOGLEVEL='trace'
diff --git a/SrcLib/core/fwDataTools/test/tu/include/ImageTest.hpp b/SrcLib/core/fwDataTools/test/tu/include/ImageTest.hpp
new file mode 100644
index 0000000..bd4b226
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/include/ImageTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_TEST_TU_IMAGETEST_HPP_
+#define _FWDATATOOLS_TEST_TU_IMAGETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Image.hpp>
+
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create image.
+ */
+class ImageTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageTest );
+    CPPUNIT_TEST( roiApplyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void roiApplyTest();
+
+};
+
+} //namespace ut
+} //namespace fwDataTools
+
+#endif //_FWDATATOOLS_TEST_TU_IMAGETEST_HPP_
diff --git a/SrcLib/core/fwDataTools/test/tu/include/MeshTest.hpp b/SrcLib/core/fwDataTools/test/tu/include/MeshTest.hpp
new file mode 100644
index 0000000..d8db59d
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/include/MeshTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWDATATOOLS_TEST_TU_MESHTEST_HPP_
+#define _FWDATATOOLS_TEST_TU_MESHTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/Array.hpp>
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh.
+ */
+class MeshTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MeshTest );
+    CPPUNIT_TEST( testMeshToTriangularMesh );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testMeshToTriangularMesh();
+
+};
+
+} //namespace ut
+} //namespace fwDataTools
+
+#endif //_FWDATATOOLS_TEST_TU_MESHTEST_HPP_
diff --git a/SrcLib/core/fwDataTools/test/tu/include/TransformationMatrix3DTest.hpp b/SrcLib/core/fwDataTools/test/tu/include/TransformationMatrix3DTest.hpp
new file mode 100644
index 0000000..9d602cc
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/include/TransformationMatrix3DTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATATOOLS_TEST_TU_TRANSFORMATIONMATRIX3DTEST_HPP__
+#define __FWDATATOOLS_TEST_TU_TRANSFORMATIONMATRIX3DTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/TransformationMatrix3D.hpp>
+
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create image.
+ */
+class TransformationMatrix3DTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TransformationMatrix3DTest );
+    CPPUNIT_TEST( identityMatrixTest );
+    CPPUNIT_TEST( matrixTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void identityMatrixTest();
+    void matrixTest();
+
+};
+
+} //namespace ut
+} //namespace fwDataTools
+
+#endif //__FWDATATOOLS_TEST_TU_TRANSFORMATIONMATRIX3DTEST_HPP__
diff --git a/SrcLib/core/fwDataTools/test/tu/src/ImageTest.cpp b/SrcLib/core/fwDataTools/test/tu/src/ImageTest.cpp
new file mode 100644
index 0000000..49db930
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/src/ImageTest.cpp
@@ -0,0 +1,217 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+#include <fwTools/Type.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwDataTools/Image.hpp>
+
+#include "ImageTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataTools::ut::ImageTest );
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::roiApplyTest()
+{
+
+#define TestRoiApplyMacro(imageTypeName, roiTypeName)                                                   \
+    {                                                                                                   \
+        std::stringstream ss;                                                                           \
+        ss                                                                                              \
+            << "Test failed with types : img : " << imageTypeName                                       \
+            << ", roi : " << roiTypeName;                                                               \
+        std::string message = ss.str();                                                                 \
+        ::fwTools::Type imageType(imageTypeName);                                                       \
+        ::fwTools::Type roiType(roiTypeName);                                                           \
+        ::fwData::Image::sptr imageRef;                                                                 \
+        ::fwData::Image::sptr image = ::fwData::Image::New();                                                                 \
+        ::fwData::Image::sptr roi = ::fwData::Image::New();                                                                   \
+                                                                                                        \
+        ::fwTest::generator::Image::generateRandomImage(image, imageType);                                    \
+        ::fwData::Image::SizeType    size = image->getSize();                                           \
+        ::fwData::Image::SpacingType spacing = image->getSpacing();                                     \
+        ::fwData::Image::OriginType  origin = image->getOrigin();                                       \
+        ::fwTest::generator::Image::generateImage(roi, size, spacing, origin, roiType);                       \
+                                                                                                        \
+        imageRef = ::fwData::Object::copy(image);                                                       \
+                                                                                                        \
+        ::fwData::Array::sptr imgData;                                                                  \
+        ::fwData::Array::sptr roiData;                                                                  \
+        imgData = image->getDataArray();                                                                \
+        roiData = roi->getDataArray();                                                                  \
+                                                                                                        \
+        ::fwComEd::helper::Array roiDataHelper(roiData);                                                \
+                                                                                                        \
+        CPPUNIT_ASSERT(imgData);                                                                        \
+        CPPUNIT_ASSERT(imgData->getNumberOfElements());                                                 \
+                                                                                                        \
+        CPPUNIT_ASSERT(roiData);                                                                        \
+        CPPUNIT_ASSERT(roiData->getNumberOfElements());                                                 \
+                                                                                                        \
+        ::fwTest::generator::Image::randomizeArray(roi->getDataArray());                                      \
+                                                                                                        \
+        char *begin = roiDataHelper.begin();                                                            \
+        char *end   = roiDataHelper.end();                                                              \
+        size_t part = (end - begin)/3;                                                                  \
+                                                                                                        \
+        std::fill(begin, begin + part, 0);                                                              \
+        std::fill(end - part, end, 0);                                                                  \
+                                                                                                        \
+        ::fwDataTools::Image::applyRoi(image, roi);                                                     \
+        CPPUNIT_ASSERT_MESSAGE( message, ::fwDataTools::Image::isRoiApplyed(imageRef, roi, image));     \
+    }
+
+
+
+    TestRoiApplyMacro( "int8", "int8"  );
+    TestRoiApplyMacro( "int8", "int16" );
+    TestRoiApplyMacro( "int8", "int32" );
+    TestRoiApplyMacro( "int8", "uint8" );
+    TestRoiApplyMacro( "int8", "uint16");
+    TestRoiApplyMacro( "int8", "uint32");
+
+    TestRoiApplyMacro( "int16" , "int8"  );
+    TestRoiApplyMacro( "int16" , "int16" );
+    TestRoiApplyMacro( "int16" , "int32" );
+    TestRoiApplyMacro( "int16" , "uint8" );
+    TestRoiApplyMacro( "int16" , "uint16");
+    TestRoiApplyMacro( "int16" , "uint32");
+
+    TestRoiApplyMacro( "int32" , "int8"  );
+    TestRoiApplyMacro( "int32" , "int16" );
+    TestRoiApplyMacro( "int32" , "int32" );
+    TestRoiApplyMacro( "int32" , "uint8" );
+    TestRoiApplyMacro( "int32" , "uint16");
+    TestRoiApplyMacro( "int32" , "uint32");
+
+    TestRoiApplyMacro( "uint8" , "int8"  );
+    TestRoiApplyMacro( "uint8" , "int16" );
+    TestRoiApplyMacro( "uint8" , "int32" );
+    TestRoiApplyMacro( "uint8" , "uint8" );
+    TestRoiApplyMacro( "uint8" , "uint16");
+    TestRoiApplyMacro( "uint8" , "uint32");
+
+    TestRoiApplyMacro( "uint16", "int8"  );
+    TestRoiApplyMacro( "uint16", "int16" );
+    TestRoiApplyMacro( "uint16", "int32" );
+    TestRoiApplyMacro( "uint16", "uint8" );
+    TestRoiApplyMacro( "uint16", "uint16");
+    TestRoiApplyMacro( "uint16", "uint32");
+
+    TestRoiApplyMacro( "uint32", "int8"  );
+    TestRoiApplyMacro( "uint32", "int16" );
+    TestRoiApplyMacro( "uint32", "int32" );
+    TestRoiApplyMacro( "uint32", "uint8" );
+    TestRoiApplyMacro( "uint32", "uint16");
+    TestRoiApplyMacro( "uint32", "uint32");
+
+// float and double disabled : randomization generate some <nan>
+
+//    TestRoiApplyMacro( "int8", "float" );
+//    TestRoiApplyMacro( "int16" , "float" );
+//    TestRoiApplyMacro( "int32" , "float" );
+//    TestRoiApplyMacro( "uint8" , "float" );
+//    TestRoiApplyMacro( "uint16", "float" );
+//    TestRoiApplyMacro( "uint32", "float" );
+//    TestRoiApplyMacro( "float" , "int8"  );
+//    TestRoiApplyMacro( "float" , "int16" );
+//    TestRoiApplyMacro( "float" , "int32" );
+//    TestRoiApplyMacro( "float" , "uint8" );
+//    TestRoiApplyMacro( "float" , "uint16");
+//    TestRoiApplyMacro( "float" , "uint32");
+//    TestRoiApplyMacro( "float" , "float" );
+//
+//#ifndef DEBUG // double disabled from default dispatcher type list in debug mode
+//    TestRoiApplyMacro( "int8", "double");
+//    TestRoiApplyMacro( "int16" , "double");
+//    TestRoiApplyMacro( "int32" , "double");
+//    TestRoiApplyMacro( "uint8" , "double");
+//    TestRoiApplyMacro( "uint16", "double");
+//    TestRoiApplyMacro( "uint32", "double");
+//    TestRoiApplyMacro( "float" , "double");
+//    TestRoiApplyMacro( "double", "int8"  );
+//    TestRoiApplyMacro( "double", "int16" );
+//    TestRoiApplyMacro( "double", "int32" );
+//    TestRoiApplyMacro( "double", "uint8" );
+//    TestRoiApplyMacro( "double", "uint16");
+//    TestRoiApplyMacro( "double", "uint32");
+//    TestRoiApplyMacro( "double", "float" );
+//    TestRoiApplyMacro( "double", "double");
+//#endif
+
+
+    // 64 bit type not supported by DynamicType/Dispatcher
+
+    // TestRoiApplyMacro( "uint64", "double");
+    // TestRoiApplyMacro( "int64" , "double");
+    // TestRoiApplyMacro( "double", "int64" );
+    // TestRoiApplyMacro( "double", "uint64");
+    //
+    // TestRoiApplyMacro( "int64" , "float" );
+    // TestRoiApplyMacro( "uint64", "float" );
+    // TestRoiApplyMacro( "float" , "int64" );
+    // TestRoiApplyMacro( "float" , "uint64");
+    //
+    // TestRoiApplyMacro( "int8", "int64" );
+    // TestRoiApplyMacro( "int8", "uint64");
+    // TestRoiApplyMacro( "int16" , "int64" );
+    // TestRoiApplyMacro( "int16" , "uint64");
+    // TestRoiApplyMacro( "int32" , "int64" );
+    // TestRoiApplyMacro( "int32" , "uint64");
+    // TestRoiApplyMacro( "int64" , "int8"  );
+    // TestRoiApplyMacro( "int64" , "int16" );
+    // TestRoiApplyMacro( "int64" , "int32" );
+    // TestRoiApplyMacro( "int64" , "int64" );
+    // TestRoiApplyMacro( "int64" , "uint8" );
+    // TestRoiApplyMacro( "int64" , "uint16");
+    // TestRoiApplyMacro( "int64" , "uint32");
+    // TestRoiApplyMacro( "int64" , "uint64");
+    // TestRoiApplyMacro( "uint8" , "int64" );
+    // TestRoiApplyMacro( "uint8" , "uint64");
+    // TestRoiApplyMacro( "uint16", "int64" );
+    // TestRoiApplyMacro( "uint16", "uint64");
+    // TestRoiApplyMacro( "uint32", "int64" );
+    // TestRoiApplyMacro( "uint32", "uint64");
+    // TestRoiApplyMacro( "uint64", "int8"  );
+    // TestRoiApplyMacro( "uint64", "int16" );
+    // TestRoiApplyMacro( "uint64", "int32" );
+    // TestRoiApplyMacro( "uint64", "int64" );
+    // TestRoiApplyMacro( "uint64", "uint8" );
+    // TestRoiApplyMacro( "uint64", "uint16");
+    // TestRoiApplyMacro( "uint64", "uint32");
+    // TestRoiApplyMacro( "uint64", "uint64");
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/test/tu/src/MeshTest.cpp b/SrcLib/core/fwDataTools/test/tu/src/MeshTest.cpp
new file mode 100644
index 0000000..089f625
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/src/MeshTest.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTest/generator/Mesh.hpp>
+#include <fwDataTools/Mesh.hpp>
+
+#include "MeshTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataTools::ut::MeshTest );
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::testMeshToTriangularMesh()
+{
+    ::fwData::Mesh::sptr mesh1 = ::fwData::Mesh::New();
+    ::fwTest::generator::Mesh::generateTriangleMesh(mesh1);
+    ::fwDataTools::Mesh::shakePoint(mesh1);
+    mesh1->adjustAllocatedMemory();
+
+    ::fwData::TriangularMesh::sptr trian = ::fwData::TriangularMesh::New();
+    ::fwDataTools::Mesh::toTriangularMesh(mesh1, trian);
+
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    ::fwDataTools::Mesh::fromTriangularMesh(trian, mesh2);
+
+    compare(mesh1, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataTools
diff --git a/SrcLib/core/fwDataTools/test/tu/src/TransformationMatrix3DTest.cpp b/SrcLib/core/fwDataTools/test/tu/src/TransformationMatrix3DTest.cpp
new file mode 100644
index 0000000..303bbb1
--- /dev/null
+++ b/SrcLib/core/fwDataTools/test/tu/src/TransformationMatrix3DTest.cpp
@@ -0,0 +1,158 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+#include <cmath>
+#include <fwTools/Type.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwDataTools/TransformationMatrix3D.hpp>
+
+#include "TransformationMatrix3DTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwDataTools::ut::TransformationMatrix3DTest );
+
+namespace fwDataTools
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void TransformationMatrix3DTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+bool isIdentity(::fwData::TransformationMatrix3D::sptr tm)
+{
+    bool isIdentity = true;
+
+    for (int i=0 ; i<4 ; ++i)
+    {
+        for (int j=0 ; j<4 ; ++j)
+        {
+            isIdentity &= (i==j?1.:0.) == tm->getCoefficient(i,j);
+        }
+    }
+    return isIdentity;
+}
+
+void TransformationMatrix3DTest::identityMatrixTest()
+{
+    ::fwData::TransformationMatrix3D::sptr tm1 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm2 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm3 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm4 = ::fwData::TransformationMatrix3D::New();
+
+    ::fwData::Point::sptr p1 = ::fwData::Point::New(1.0f, 2.3f, 5.1f);
+    ::fwData::Point::sptr p2 = ::fwData::Point::New();
+
+    tm1->setCoefficient(0, 2, 3.4);
+    tm1->setCoefficient(1, 3, 18);
+    ::fwDataTools::TransformationMatrix3D::identity(tm1);
+    ::fwDataTools::TransformationMatrix3D::identity(tm2);
+    CPPUNIT_ASSERT(isIdentity(tm1));
+    CPPUNIT_ASSERT(isIdentity(tm2));
+
+    ::fwDataTools::TransformationMatrix3D::multiply(tm1, tm2, tm3);
+    CPPUNIT_ASSERT(isIdentity(tm3));
+
+    ::fwDataTools::TransformationMatrix3D::invert(tm1, tm4);
+    CPPUNIT_ASSERT(isIdentity(tm4));
+
+    ::fwDataTools::TransformationMatrix3D::multiply(tm1, p1, p2);
+    CPPUNIT_ASSERT_EQUAL(p1->getCoord()[0], p2->getCoord()[0]);
+    CPPUNIT_ASSERT_EQUAL(p1->getCoord()[1], p2->getCoord()[1]);
+    CPPUNIT_ASSERT_EQUAL(p1->getCoord()[2], p2->getCoord()[2]);
+}
+
+void TransformationMatrix3DTest::matrixTest()
+{
+    ::fwData::TransformationMatrix3D::sptr tm1 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm2 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm3 = ::fwData::TransformationMatrix3D::New();
+    ::fwData::TransformationMatrix3D::sptr tm4 = ::fwData::TransformationMatrix3D::New();
+
+    ::fwDataTools::TransformationMatrix3D::identity(tm2);
+
+    ::fwData::TransformationMatrix3D::TMCoefArray tm1Coefs(16);
+    for (int i=0 ; i<16 ; ++i)
+    {
+        tm1Coefs[i]=i+1;
+    }
+
+    for (int i=0 ; i<4 ; ++i)
+    {
+        for (int j=0 ; j<4 ; ++j)
+        {
+            tm2->setCoefficient(i,j, fabs(static_cast<double>(i-j)) + 1);
+        }
+    }
+    tm1->setCoefficients(tm1Coefs);
+    tm4->setCoefficients(tm1Coefs);
+
+    ::fwData::Point::sptr p1 = ::fwData::Point::New(1.0f, 2.3f, 5.1f);
+    ::fwData::Point::sptr p2 = ::fwData::Point::New();
+
+    ::fwDataTools::TransformationMatrix3D::multiply(tm1, tm2, tm3);
+    for (int i=0 ; i<4 ; ++i)
+    {
+        for (int j=0 ; j<4 ; ++j)
+        {
+            double val = 0;
+            for (int k=0 ; k<4 ; ++k)
+            {
+                val += tm1->getCoefficient(i,k)*tm2->getCoefficient(k,j);
+            }
+            CPPUNIT_ASSERT_EQUAL(val, tm3->getCoefficient(i,j));
+        }
+    }
+
+    ::fwDataTools::TransformationMatrix3D::invert(tm2, tm4);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.4, tm4->getCoefficient(0,0), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(0,1), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,   tm4->getCoefficient(0,2), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.1,  tm4->getCoefficient(0,3), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(1,0), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.,  tm4->getCoefficient(1,1), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(1,2), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,   tm4->getCoefficient(1,3), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,   tm4->getCoefficient(2,0), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(2,1), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.,  tm4->getCoefficient(2,2), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(2,3), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.1,  tm4->getCoefficient(3,0), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.,   tm4->getCoefficient(3,1), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.5,  tm4->getCoefficient(3,2), 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.4, tm4->getCoefficient(3,3), 0.00001);
+
+    ::fwDataTools::TransformationMatrix3D::multiply(tm1, p1, p2);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(24.9,  p2->getCoord()[0], 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(62.5,  p2->getCoord()[1], 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(100.1, p2->getCoord()[2], 0.00001);
+
+    ::fwDataTools::TransformationMatrix3D::identity(tm1);
+    ::fwDataTools::TransformationMatrix3D::identity(tm2);
+    CPPUNIT_ASSERT(isIdentity(tm1));
+    CPPUNIT_ASSERT(isIdentity(tm2));
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwDataTools
diff --git a/SrcLib/core/fwGui/CMakeLists.txt b/SrcLib/core/fwGui/CMakeLists.txt
new file mode 100644
index 0000000..ce623c4
--- /dev/null
+++ b/SrcLib/core/fwGui/CMakeLists.txt
@@ -0,0 +1,14 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwData
+    fwRuntime
+    fwServices
+    fwTools
+)
+
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+
diff --git a/SrcLib/core/fwGui/COPYING b/SrcLib/core/fwGui/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwGui/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwGui/COPYING.LESSER b/SrcLib/core/fwGui/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwGui/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwGui/Properties.cmake b/SrcLib/core/fwGui/Properties.cmake
new file mode 100644
index 0000000..6535809
--- /dev/null
+++ b/SrcLib/core/fwGui/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwGui )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwData fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwGui/bin/build.options b/SrcLib/core/fwGui/bin/build.options
new file mode 100644
index 0000000..4dd59b5
--- /dev/null
+++ b/SrcLib/core/fwGui/bin/build.options
@@ -0,0 +1,4 @@
+USE     = ['boost']
+LIB     = ['fwData_0-1', 'fwTools_0-1', 'fwCore_0-1','fwServices_0-1']
+TYPE    = 'shared'
+VERSION = '0-1'
diff --git a/SrcLib/core/fwGui/include/fwGui/ActionCallbackBase.hpp b/SrcLib/core/fwGui/include/fwGui/ActionCallbackBase.hpp
new file mode 100644
index 0000000..e77792f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/ActionCallbackBase.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_ACTIONCALLBACKBASE_HPP_
+#define _FWGUI_ACTIONCALLBACKBASE_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/IMenuItemCallback.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the menu item callback.
+ * @class   ActionCallbackBase
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ActionCallbackBase : public ::fwGui::IMenuItemCallback
+{
+
+public :
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (ActionCallbackBase)(::fwGui::IMenuItemCallback) )
+
+    typedef std::string RegistryKeyType;
+
+    /**
+     * @brief  Sets service ID updated in executed method.
+     */
+    FWGUI_API virtual void setSID(std::string sid);
+
+    /**
+     * @brief  Called method when callback is executed.
+     */
+    FWGUI_API virtual void execute();
+
+    /**
+     * @brief  Called method when callback is checked.
+     */
+    FWGUI_API virtual void check(bool checked);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+protected:
+
+    /**
+     * @brief   Constructor.
+     */
+    FWGUI_API ActionCallbackBase() ;
+
+    /**
+     * @brief   Destructor. Do nothing.
+     */
+    FWGUI_API virtual ~ActionCallbackBase() ;
+
+private:
+    std::string m_sid;
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_ACTIONCALLBACKBASE_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/Application.hpp b/SrcLib/core/fwGui/include/fwGui/Application.hpp
new file mode 100644
index 0000000..9ba77d3
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/Application.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_APPLICATION_HPP_
+#define _FWGUI_APPLICATION_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/IApplication.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Gives access to the underlayed application part
+ * @class   Application
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API Application : public ::fwGui::IApplication
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Application)(::fwGui::IApplication), (()), Application::factory);
+
+    FWGUI_API static Application::sptr getDefault();
+
+protected:
+
+    /// Application factory, returning the registered instance of Application. Manage a Singleton.
+    FWGUI_API static Application::sptr factory();
+
+    Application(){};
+    virtual ~Application(){};
+
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_APPLICATION_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/Cursor.hpp b/SrcLib/core/fwGui/include/fwGui/Cursor.hpp
new file mode 100644
index 0000000..4afceff
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/Cursor.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_CURSOR_HPP_
+#define _FWGUI_CURSOR_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/ICursor.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the generic cursor for IHM.
+ * Use the Delegate design pattern
+ * @class   Cursor
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API Cursor : public ::fwGui::ICursor
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Cursor)(::fwGui::ICursor), (()), new Cursor );
+
+    /// Constructor. Create the implementation of the specific cursor
+    FWGUI_API Cursor();
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~Cursor();
+
+    // TODO : update API to reflect the cursor stack
+    /// Set the cursor
+    FWGUI_API virtual void setCursor( ::fwGui::ICursor::CursorType cursor);
+
+    /// Set the default cursor
+    FWGUI_API virtual void setDefaultCursor();
+
+protected:
+
+    /// Implementation of a cursor in a specific IHM (wx/Qt)
+    ::fwGui::ICursor::sptr m_implementation;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_CURSOR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/GuiBaseObject.hpp b/SrcLib/core/fwGui/include/fwGui/GuiBaseObject.hpp
new file mode 100644
index 0000000..58682df
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/GuiBaseObject.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_GUIBASEOBJECT_HPP__
+#define __FWGUI_GUIBASEOBJECT_HPP__
+
+
+#include <boost/enable_shared_from_this.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/factory/new.hpp"
+#include "fwGui/registry/detail.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief Base class for all fwGui's classes
+ */
+class FWGUI_CLASS_API GuiBaseObject : public ::fwCore::BaseObject
+{
+
+public :
+
+    typedef ::fwGui::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwGui::registry::get()->addFactory(functorKey, &::fwGui::factory::New<T>);
+        }
+    };
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (GuiBaseObject)(::fwCore::BaseObject) );
+
+protected :
+    /**
+     * @name Constructor/Destructor
+     * @{ */
+
+    GuiBaseObject(){};
+    virtual ~GuiBaseObject(){};
+
+    /**  @} */
+
+};
+
+} // namespace fwGui
+
+#endif // __FWGUI_GUIBASEOBJECT_HPP__
+
diff --git a/SrcLib/core/fwGui/include/fwGui/GuiRegistry.hpp b/SrcLib/core/fwGui/include/fwGui/GuiRegistry.hpp
new file mode 100644
index 0000000..96ddffd
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/GuiRegistry.hpp
@@ -0,0 +1,227 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_GUIREGISTRY_HPP_
+#define _FWGUI_GUIREGISTRY_HPP_
+
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/container/fwMenuBar.hpp"
+#include "fwGui/container/fwToolBar.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   This class contains helpers to manage all fwContainer in the application.
+ * @class   GuiRegistry
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API GuiRegistry : public ::fwGui::GuiBaseObject
+{
+
+public :
+
+    typedef std::map< std::string , ::fwGui::container::fwContainer::sptr > ContainerMapType;
+    typedef std::map< std::string , ::fwGui::container::fwMenuBar::sptr >   MenuBarMapType;
+    typedef std::map< std::string , ::fwGui::container::fwToolBar::sptr >   ToolBarMapType;
+    typedef std::map< std::string , ::fwGui::container::fwMenu::sptr >      MenuMapType;
+    typedef std::vector< std::string >                           ParentSidsType;
+    typedef std::map< std::string , ParentSidsType > ActionToParentMapType;
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (GuiRegistry)(::fwGui::GuiBaseObject) )
+
+    /**
+     * @brief   Constructor.
+     */
+    FWGUI_API GuiRegistry() ;
+
+    /**
+     * @brief   Destructor. Do nothing.
+     */
+    FWGUI_API virtual ~GuiRegistry() ;
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper SID-container methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers container associate with service ID.
+     */
+    FWGUI_API static void registerSIDContainer(std::string sid, ::fwGui::container::fwContainer::sptr container);
+
+    /**
+     * @brief Unregisters container associate with service ID.
+     */
+    FWGUI_API static void unregisterSIDContainer(std::string sid);
+
+    /**
+     * @brief Returns fwContainer associate with service ID.
+     */
+    FWGUI_API static ::fwGui::container::fwContainer::sptr getSIDContainer(std::string sid);
+
+    ///@}
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper WID-container methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers container associate with window ID.
+     */
+    FWGUI_API static void registerWIDContainer(std::string wid, ::fwGui::container::fwContainer::sptr container);
+
+    /**
+     * @brief Unregisters container associate with window ID.
+     */
+    FWGUI_API static void unregisterWIDContainer(std::string wid);
+
+    /**
+     * @brief Returns fwContainer associate with window ID.
+     */
+    FWGUI_API static ::fwGui::container::fwContainer::sptr getWIDContainer(std::string wid);
+
+    ///@}
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper SID-MenuBar methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers fwMenuBar associate with service ID.
+     */
+    FWGUI_API static void registerSIDMenuBar(std::string sid, ::fwGui::container::fwMenuBar::sptr menuBar);
+
+    /**
+     * @brief Unregisters fwMenuBar associate with service ID.
+     */
+    FWGUI_API static void unregisterSIDMenuBar(std::string sid);
+    /**
+     * @brief Returns fwMenuBar associate with service ID.
+     */
+    FWGUI_API static ::fwGui::container::fwMenuBar::sptr getSIDMenuBar(std::string sid);
+    ///@}
+
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper SID-ToolBar methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers fwToolBar associate with service ID.
+     */
+    FWGUI_API static void registerSIDToolBar(std::string sid, ::fwGui::container::fwToolBar::sptr toolBar);
+
+    /**
+     * @brief Unregisters fwToolBar associate with service ID.
+     */
+    FWGUI_API static void unregisterSIDToolBar(std::string sid);
+    /**
+     * @brief Returns fwToolBar associate with service ID.
+     */
+    FWGUI_API static ::fwGui::container::fwToolBar::sptr getSIDToolBar(std::string sid);
+    ///@}
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper SID-Menu methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers fwMenu associate with service ID.
+     */
+    FWGUI_API static void registerSIDMenu(std::string sid, ::fwGui::container::fwMenu::sptr menu);
+
+    /**
+     * @brief Unregisters fwMenu associate with service ID.
+     */
+    FWGUI_API static void unregisterSIDMenu(std::string sid);
+    /**
+     * @brief Returns fwMenu associate with service ID.
+     */
+    FWGUI_API static ::fwGui::container::fwMenu::sptr getSIDMenu(std::string sid);
+    ///@}
+
+    //-----------------------------------------------------------------------------
+
+    /**
+     * @name    Helper Action-Menu methods
+     */
+    ///@{
+
+    /**
+     * @brief Registers action sid associted with a parent sid.
+     */
+    FWGUI_API static void registerActionSIDToParentSID(std::string actionSid, std::string parentSid);
+
+    /**
+     * @brief Unregisters action sid associted with a parent sid.
+     */
+    FWGUI_API static void unregisterActionSIDToParentSID(std::string actionSid, std::string parentSid);
+
+    /**
+     * @brief Method called when the action service is stopping.
+     * Call parent service actionServiceStopping() method
+     */
+    FWGUI_API static void actionServiceStopping(std::string actionSid);
+
+    /**
+     * @brief Method called when the action service is starting.
+     * Call parent service actionServiceStarting() method
+     */
+    FWGUI_API static void actionServiceStarting(std::string actionSid);
+
+    /**
+     * @brief Method called when the action service is activated or not.
+     * Call parent service actionServiceSetActive() method
+     */
+    FWGUI_API static void actionServiceSetActive(std::string actionSid, bool isActive);
+
+    /**
+     * @brief Method called when the action service is executable or not.
+     * Call parent service actionServiceSetExecutable() method
+     */
+    FWGUI_API static void actionServiceSetExecutable(std::string actionSid, bool isExecutable);
+    ///@}
+
+protected :
+
+    static ContainerMapType       m_globalSIDToFwContainer;
+    static ContainerMapType       m_globalWIDToFwContainer;
+    static MenuBarMapType         m_globalSIDToFwMenuBar;
+    static ToolBarMapType         m_globalSIDToFwToolBar;
+    static MenuMapType            m_globalSIDToFwMenu;
+
+    /// Parent sid can be Menu sid or ToolBar sid
+    static ActionToParentMapType  m_actionSIDToParentSID;
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_GUIREGISTRY_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IActionSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IActionSrv.hpp
new file mode 100644
index 0000000..4242d57
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IActionSrv.hpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IACTIONSRV_HPP_
+#define _FWGUI_IACTIONSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+
+#include "fwGui/registrar/ActionRegistrar.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing the menu items.
+ * @class   IActionSrv
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IActionSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IActionSrv)(::fwServices::IService) ) ;
+    fwCoreAllowSharedFromThis();
+
+    /// Method called when the action service is stopping
+    FWGUI_API void actionServiceStopping();
+
+    /// Method called when the action service is starting
+    FWGUI_API void actionServiceStarting();
+
+    /// Set the action service is active/inactive.
+    FWGUI_API virtual void setIsActive(bool isActive);
+
+    /// Return true if action service is active.
+    FWGUI_API bool getIsActive();
+
+    /// Return true if action 'check' feedback is inverted.
+    bool getActiveStateValue(){ return m_activeStateValue; };
+
+    /// Set the action service executable or not.
+    FWGUI_API void setIsExecutable(bool isExecutable);
+
+    /// Return action service is executable.
+    FWGUI_API bool getIsExecutable();
+
+    /**
+     * @brief Confirm that the action must be executed.
+     *
+     * If action is configured to be confirmed : show a dialog box to confirm execution.
+     * Else return true
+     *
+     * @return true if user click on 'yes' button.
+     */
+    FWGUI_API bool confirmAction();
+
+protected :
+
+    FWGUI_API IActionSrv() ;
+
+    FWGUI_API virtual ~IActionSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+     * @brief Initialize the action.
+     *
+     * Example of configuration
+     * @verbatim
+           <service uid="item" type="::fwGui::IActionSrv" impl="::gui::action::NothingActionSrv" autoConnect="no" >
+              <state active="false" executable="false" inverse="true" />
+              <confirmation value="yes" message="..." />
+           </service>
+       @endverbatim
+     * - \<state active="false" executable="false" /\> : fix the state of the action in the menu and Toolbar.
+     *   - \b executable not mandatory (Default value true ) : allows to enable/disable the execution of the action.
+     *     If the action appears in the interface it will be enable/disable.
+     *   - \b active not mandatory (Default value false ):
+     *     If the action appears in the interface it will be check/uncheck.
+     *   - \b inverse not mandatory (Default value true) : allow to invert the state of the action (if "check")
+     * - \<confirmation value="yes" message="..." /\> : configure if the action must be confirm by user before to execute it.
+     *   - \b value : if true the action will show a confirmation message before to be executed.
+     *   - \b message not mandatory : if not empty the message is shown in dialog box.
+     *   - \b defaultbutton not mandatory (default defined by underlying gui backend) :
+     *                      specify the dialog default button (yes or no)
+     */
+    FWGUI_API void initialize();
+
+
+private:
+
+    ::fwGui::registrar::ActionRegistrar::sptr    m_registrar;
+
+    /// Value for which the action will be considered 'active'
+    bool m_activeStateValue;
+    bool m_isActive;
+    bool m_isExecutable;
+    bool m_confirmAction;
+    std::string m_confirmMessage;
+    std::string m_defaultButton;
+};
+
+//-----------------------------------------------------------------------------
+
+class LockAction
+{
+public:
+    LockAction(IActionSrv::wptr action) : m_action(action)
+    {
+        m_action.lock()->setIsExecutable(false);
+    }
+    ~LockAction()
+    {
+        m_action.lock()->setIsExecutable(true);
+    }
+private:
+    IActionSrv::wptr m_action;
+};
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IACTIONSRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IApplication.hpp b/SrcLib/core/fwGui/include/fwGui/IApplication.hpp
new file mode 100644
index 0000000..b3fdd4f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IApplication.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IAPPLICATION_HPP_
+#define _FWGUI_IAPPLICATION_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the application manipulation API.
+ * @class   IApplication
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IApplication : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IApplication)(::fwGui::GuiBaseObject) )
+
+    /// Constructor. Do nothing.
+    FWGUI_API IApplication();
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IApplication();
+
+    /// Tells the application to exit with a returncode
+    FWGUI_API virtual void exit( int returncode ) = 0;
+
+    typedef std::string FactoryRegistryKeyType;
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IAPPLICATION_HPP_*/
+
diff --git a/SrcLib/core/fwGui/include/fwGui/ICursor.hpp b/SrcLib/core/fwGui/include/fwGui/ICursor.hpp
new file mode 100644
index 0000000..2b6a52a
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/ICursor.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_ICURSOR_HPP_
+#define _FWGUI_ICURSOR_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the generic cursor for IHM.
+ * @class   ICursor
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ICursor : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (ICursor)(::fwGui::GuiBaseObject) )
+
+    /// Cursor type
+    typedef enum {
+        DEFAULT,
+        BUSY,
+        WAIT,
+        CROSS
+    } CursorType;
+
+    /// Constructor. Do nothing.
+    FWGUI_API ICursor();
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~ICursor();
+
+
+    typedef std::string FactoryRegistryKeyType;
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    /// Set the cursor
+    FWGUI_API virtual void setCursor( CursorType cursor) = 0;
+
+    /// Set the default cursor
+    FWGUI_API virtual void setDefaultCursor() = 0;
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_ICURSOR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IFrameSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IFrameSrv.hpp
new file mode 100644
index 0000000..6a85a6a
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IFrameSrv.hpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IFRAMESRV_HPP_
+#define _FWGUI_IFRAMESRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/container/fwContainer.hpp"
+
+#include "fwGui/registrar/ViewRegistrar.hpp"
+#include "fwGui/layoutManager/IFrameLayoutManager.hpp"
+#include "fwGui/builder/IMenuBarBuilder.hpp"
+#include "fwGui/builder/IToolBarBuilder.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing a frame.
+ * @class   IFrameSrv
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IFrameSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IFrameSrv)(::fwServices::IService) ) ;
+
+    /// Get widget defined for progress bar
+    FWGUI_API static ::fwGui::container::fwContainer::sptr getProgressWidget();
+
+protected :
+
+    FWGUI_API IFrameSrv() ;
+
+    FWGUI_API virtual ~IFrameSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    /**
+     * @brief Initialize frame managers.
+     *
+     * Example of configuration
+     * @verbatim
+        <service uid="mainFrame" type="::fwGui::IFrameSrv" impl="::gui::frame::DefaultFrame" autoConnect="no">
+            <window onclose="notify" />
+            <gui>
+                <frame>
+                    <name>My App</name>
+                    <icon>Bundles/myApp_1-0/icon.ico</icon>
+                    <minSize width="800" height="600" />
+                </frame>
+                <toolBar />
+                <menuBar />
+            </gui>
+            <registry>
+                <toolBar sid="toolbar1" start="yes" />
+                <menuBar sid="menubar1" start="yes" />
+                <view sid="myView" start="yes" />
+            </registry>
+        </service>
+      @endverbatim
+     * - \<window onclose="notify" /\> : defines what to do when the frame is closed
+     *   - \b exit (by default) : the application is closed. Use it for the main frame.
+     *   - \b notify : notifies service's object with WINDOW_CLOSED event.
+     * - \<frame\> : defines the frame name, icon, size.
+     * - The toolBar section isn't mandatory.
+     * - The menuBar section isn't mandatory.
+     *
+     * @see ::fwGui::registrar::ViewRegistrar::initialize(), ::fwGui::layoutManager::IFrameLayoutManager::initialize(),
+     *      ::fwGui::builder::IToolBarBuilder::initialize(), ::fwGui::builder::IMenuBarBuilder::initialize()
+     */
+    FWGUI_API void initialize();
+
+    /// Creates frame, sub-view, menubar and toolbar containers. Manages sub-view, menubar and toobar services.
+    FWGUI_API void create();
+
+    /// Stops sub-view, menubar and toobar services. Destroys frame, sub-view, menubar and toolbar containers.
+    FWGUI_API void destroy();
+
+    FWGUI_API static const std::string CLOSE_POLICY_EXIT;
+    FWGUI_API static const std::string CLOSE_POLICY_NOTIFY;
+
+    /// Static reference on a widget defined for progress bar installation
+    FWGUI_API static ::fwGui::container::fwContainer::wptr m_progressWidget;
+
+private:
+
+    void onCloseExit();
+    void onCloseNotify();
+    void initializeLayoutManager( ::fwRuntime::ConfigurationElement::sptr layoutConfig );
+    void initializeMenuBarBuilder( ::fwRuntime::ConfigurationElement::sptr menuBarConfig );
+    void initializeToolBarBuilder( ::fwRuntime::ConfigurationElement::sptr toolBarConfig );
+
+    ::fwGui::layoutManager::IFrameLayoutManager::sptr m_frameLayoutManager;
+    ::fwGui::registrar::ViewRegistrar::sptr           m_viewRegistrar;
+    ::fwGui::builder::IMenuBarBuilder::sptr           m_menuBarBuilder;
+    ::fwGui::builder::IToolBarBuilder::sptr           m_toolBarBuilder;
+
+    ConfigurationType m_registrarConfig;
+    ConfigurationType m_frameConfig;
+    ConfigurationType m_menuBarConfig;
+    ConfigurationType m_toolBarConfig;
+
+    bool m_hasMenuBar;
+    bool m_hasToolBar;
+
+    std::string m_closePolicy;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IFRAMESRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IGuiContainerSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IGuiContainerSrv.hpp
new file mode 100644
index 0000000..3dcaa4e
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IGuiContainerSrv.hpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IGUICONTAINERSRV_HPP_
+#define _FWGUI_IGUICONTAINERSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/container/fwContainer.hpp"
+
+#include "fwGui/registrar/ViewRegistrar.hpp"
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+#include "fwGui/builder/IToolBarBuilder.hpp"
+#include "fwGui/builder/IContainerBuilder.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing the layout.
+ * @class   IGuiContainerSrv
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IGuiContainerSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IGuiContainerSrv)(::fwServices::IService) ) ;
+
+    FWGUI_API ::fwGui::container::fwContainer::sptr getContainer();
+
+    FWGUI_API void setParent(std::string wid);
+
+protected :
+
+    FWGUI_API IGuiContainerSrv() ;
+
+    FWGUI_API virtual ~IGuiContainerSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+     * @brief Initialize managers.
+     *
+     * Example of configuration
+     * @verbatim
+        <service uid="subView1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view caption="view3" />
+                    <view caption="view4" />
+                    <view caption="view5" />
+                </layout>
+                <toolBar />
+            </gui>
+            <registry>
+                <parent wid="myView" />
+                <toolBar sid="toolbar1" start="yes" />
+                <view sid="subView3" start="yes" />
+                <view wid="subView4" />
+                <view sid="subView5" />
+            </registry>
+        </service>
+      @endverbatim
+     *  - \<layout type="::fwGui::LineLayoutManager" \> : give the type of layout.
+     *    - \b type {::fwGui::LineLayoutManager |::fwGui::CardinalLayoutManager |::fwGui::TabLayoutManager |::fwGui::ToolboxLayoutManager} :
+     *     - \b ::fwGui::LineLayoutManager : all views will be on the same line or column (it depends of the orientation value attribute)
+     *           @see ::fwGui::layoutManager::LineLayoutManagerBase
+     *     - \b ::fwGui::CardinalLayoutManager : all views will be added around a central view define by the align attribute.
+     *           @see ::fwGui::layoutManager::CardinalLayoutManagerBase
+     *     - \b ::fwGui::TabLayoutManager : all views will be draw as tab.
+     *           @see ::fwGui::layoutManager::TabLayoutManagerBase
+     *     - \b ::fwGui::ToolboxLayoutManager : all views will be draw in toolbox.
+     *           @see ::fwGui::layoutManager::ToolboxLayoutManagerBase
+     *  - The toolBar section isn't mandatory.
+     *
+     * @note The layout and registry sections can be empty. In this case no subview will be created.
+     *
+     * @warning
+     * - The order of the view in each section (gui and registry) must be the same.\n
+     *   For example: the view caption "view3" will be connected with the service which have the sid = "subView3" and so one (it also could be a wid).
+     *
+     * @see ::fwGui::registrar::ViewRegistrar::initialize(), ::fwGui::layoutManager::IViewLayoutManager::initialize(), ::fwGui::builder::IToolBarBuilder::initialize()
+     */
+    FWGUI_API void initialize();
+
+    /**
+     * @brief Creates view, sub-views and toolbar containers. Manages sub-views and toobar services.
+     *
+     * @pre Parent container must be registered.
+     */
+    FWGUI_API void create();
+
+    /// Stops sub-views and toobar services. Destroys view, sub-views and toolbar containers.
+    FWGUI_API void destroy();
+
+private:
+
+    void initializeLayoutManager( ::fwRuntime::ConfigurationElement::sptr layoutConfig );
+    void initializeToolBarBuilder( ::fwRuntime::ConfigurationElement::sptr toolBarConfig );
+
+    bool m_viewLayoutManagerIsCreated;
+    ::fwGui::layoutManager::IViewLayoutManager::sptr m_viewLayoutManager;
+
+    ::fwGui::registrar::ViewRegistrar::sptr    m_viewRegistrar;
+    ::fwGui::builder::IToolBarBuilder::sptr    m_toolBarBuilder;
+    ::fwGui::builder::IContainerBuilder::sptr  m_containerBuilder;
+
+    ConfigurationType m_viewRegistrarConfig;
+    ConfigurationType m_viewLayoutConfig;
+    ConfigurationType m_toolBarConfig;
+
+    bool m_hasToolBar;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IGUICONTAINERSRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IMenuBarSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IMenuBarSrv.hpp
new file mode 100644
index 0000000..dbe4fff
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IMenuBarSrv.hpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IMENUBARSRV_HPP_
+#define _FWGUI_IMENUBARSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/container/fwContainer.hpp"
+
+#include "fwGui/registrar/MenuBarRegistrar.hpp"
+#include "fwGui/layoutManager/IMenuBarLayoutManager.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing the menu bar.
+ * @class   IMenuBarSrv
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuBarSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IMenuBarSrv)(::fwServices::IService) ) ;
+
+    /// Method called when a menu service is stopping
+    FWGUI_API void menuServiceStopping(std::string menuSrvSID);
+
+    /// Method called when a menu service is starting
+    FWGUI_API void menuServiceStarting(std::string menuSrvSID);
+
+protected :
+
+    FWGUI_API IMenuBarSrv() ;
+
+    FWGUI_API virtual ~IMenuBarSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+     * @brief Initialize the layout and registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+      <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+          <gui>
+              <layout>
+                  <menu name="My Menu"/>
+                  <menu name="My Menu 2"/>
+              </layout>
+          </gui>
+          <registry>
+              <menu sid="myMenu" start="yes" />
+              <menu sid="myMenu2" start="yes" />
+          </registry>
+      </service>
+       @endverbatim
+     *  - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
+     *  - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *
+     * @warning
+     * - The number of item in the gui section must be equal or greater than in the registry section.
+     * - The order of the menu in each section (gui and registry) must be the same.\n
+     *   For example: the menu named "My Menu" will be connected with the service which have the sid = "myMenu".
+     * - A menu bar can't have the same service connected on two different menu.
+     *
+     *  @see ::fwGui::registrar::MenuBarRegistrar::initialize(), ::fwGui::layoutManager::IMenuBarLayoutManager::initialize()
+     */
+    FWGUI_API void initialize();
+
+    /// Create the layout and start the managed services.
+    FWGUI_API void create();
+
+    /// Destroy the layout and stop the managed services.
+    FWGUI_API void destroy();
+
+private:
+
+    void initializeLayoutManager( ::fwRuntime::ConfigurationElement::sptr layoutConfig );
+
+    ::fwGui::layoutManager::IMenuBarLayoutManager::sptr m_layoutManager;
+    ::fwGui::registrar::MenuBarRegistrar::sptr    m_registrar;
+
+    ConfigurationType m_registrarConfig;
+    ConfigurationType m_layoutConfig;
+
+    /// Flag to hide or disable the menu if the service is stopped
+    bool m_hideMenus;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IMENUBARSRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IMenuItemCallback.hpp b/SrcLib/core/fwGui/include/fwGui/IMenuItemCallback.hpp
new file mode 100644
index 0000000..ece53bd
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IMenuItemCallback.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IMENUITEMCALLBACK_HPP_
+#define _FWGUI_IMENUITEMCALLBACK_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the menu item callback.
+ * @class   IMenuItemCallback
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuItemCallback : public ::fwGui::GuiBaseObject
+{
+
+public :
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (IMenuItemCallback)(::fwGui::GuiBaseObject) ) ;
+
+    /**
+     * @brief  Called method when callback is executed.
+     */
+    FWGUI_API virtual void execute() =0;
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IMENUITEMCALLBACK_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IMenuSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IMenuSrv.hpp
new file mode 100644
index 0000000..28dee2a
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IMenuSrv.hpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IMENUSRV_HPP_
+#define _FWGUI_IMENUSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+
+#include "fwGui/registrar/MenuRegistrar.hpp"
+#include "fwGui/layoutManager/IMenuLayoutManager.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing the menu.
+ * @class   IMenuSrv
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IMenuSrv)(::fwServices::IService) ) ;
+
+    /// Method called when an action service is stopping
+    FWGUI_API void actionServiceStopping(std::string actionSrvSID);
+
+    /// Method called when an action service is starting
+    FWGUI_API void actionServiceStarting(std::string actionSrvSID);
+
+    /// Method called when the action service is activated
+    FWGUI_API void actionServiceSetActive(std::string actionSrvSID, bool isActive);
+
+    /// Method called when the action service is executable
+    FWGUI_API void actionServiceSetExecutable(std::string actionSrvSID, bool isExecutable);
+
+protected :
+
+    FWGUI_API IMenuSrv() ;
+
+    FWGUI_API virtual ~IMenuSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+     * @brief Initialize the layout and registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+        <service uid="myMenu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="My item 1" shortcut="1" style="check" />
+                    <separator />
+                    <menuItem name="My item 2" shortcut="2" style="radio" />
+                    <menuItem name="My item 3" shortcut="3" style="radio" />
+                    <separator />
+                    <menu name="My menu" />
+                    <separator />
+                    <menuItem name="Quit" shortcut="Ctrl+Q" specialAction="QUIT" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="item1" start="yes" />
+                <menuItem sid="item2" start="no" />
+                <menuItem sid="item3" start="no" />
+                <menu sid="mymenu" start="yes" />
+                <menuItem sid="actionQuit" start="no" />
+            </registry>
+        </service>
+       @endverbatim
+     * - \<gui\> \</gui\> : (mandatory) describe the interface of the service. It must contain a layout section.
+     * - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *   - \<menuItem\> represents IActionSrv
+     *   - \<menu\> represents IMenuSrv
+     *
+     * @warning
+     * - The number of item in the gui section must be <b> EQUAL </b> to the registry section.
+     * - The order of the menu item in each section (gui and registry) must be the same.\n
+     *   For example: the menu item named "My item 1" will be connected with the service which have the sid = "item1".
+     * - A menu can't have the same service connected on two different menu items.
+     *
+     * @see ::fwGui::registrar::MenuRegistrar::initialize(), ::fwGui::layoutManager::IMenuLayoutManager::initialize()
+     */
+    FWGUI_API void initialize();
+
+    /// Create the layout and start the managed services.
+    FWGUI_API void create();
+
+    /// Destroy the layout and stop the managed services.
+    FWGUI_API void destroy();
+
+private:
+
+    void initializeLayoutManager( ::fwRuntime::ConfigurationElement::sptr layoutConfig );
+
+    ::fwGui::layoutManager::IMenuLayoutManager::sptr m_layoutManager;
+    ::fwGui::registrar::MenuRegistrar::sptr    m_registrar;
+
+    ConfigurationType m_registrarConfig;
+    ConfigurationType m_layoutConfig;
+
+    /// Flag to hide or disable the actions if the service is stopped
+    bool m_hideActions;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_IMENUSRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/IToolBarSrv.hpp b/SrcLib/core/fwGui/include/fwGui/IToolBarSrv.hpp
new file mode 100644
index 0000000..57fe22c
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/IToolBarSrv.hpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_ITOOLBARSRV_HPP_
+#define _FWGUI_ITOOLBARSRV_HPP_
+
+#include <fwServices/IService.hpp>
+
+#include "fwGui/config.hpp"
+
+#include "fwGui/registrar/ToolBarRegistrar.hpp"
+#include "fwGui/layoutManager/IToolBarLayoutManager.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the service interface managing the toolBar.
+ * @class   IToolBarSrv
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IToolBarSrv : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IToolBarSrv)(::fwServices::IService) ) ;
+
+    /// Method called when an action service is stopping
+    FWGUI_API void actionServiceStopping(std::string actionSrvSID);
+
+    /// Method called when an action service is starting
+    FWGUI_API void actionServiceStarting(std::string actionSrvSID);
+
+    /// Method called when the action service is activated
+    FWGUI_API void actionServiceSetActive(std::string actionSrvSID, bool isActive);
+
+    /// Method called when the action service is executable
+    FWGUI_API void actionServiceSetExecutable(std::string actionSrvSID, bool isExecutable);
+
+protected :
+
+    FWGUI_API IToolBarSrv() ;
+
+    FWGUI_API virtual ~IToolBarSrv() ;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /**
+     * @brief Initialize the layout and registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+       <service uid="toolbar2" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+           <gui>
+               <layout>
+                   <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <separator />
+                   <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <separator />
+                   <menu name="My menu" />
+                   <separator />
+                   <editor />
+               </layout>
+           </gui>
+           <registry>
+               <menuItem sid="item2" />
+               <menuItem sid="item3" />
+               <menuItem sid="item4" />
+               <menuItem sid="item5" />
+               <menu sid="menu" />
+               <editor sid="editor" />
+           </registry>
+       </service>
+       @endverbatim
+     *   - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
+     *   - \<registry\> \</registry\> : (mandatory) describe the service management.
+     *     - \<menuItem\> represents IActionSrv
+     *     - \<menu\> represents IMenuSrv
+     *     - \<editor\> represents container service (IEditor, IView, ...)
+     *
+     *   @warning
+     *   - The number of item in the gui section must be EQUAL to the registry section.
+     *   - The order of the item in each section (gui and registry) must be the same.\n
+     *  For example: the item named "My item 2" will be connected with the service which have the sid = "item2".
+     *   - A toolbar can't have the same service connected on two different buttons.
+     *  @see ::fwGui::registrar::ToolBarRegistrar::initialize(), ::fwGui::layoutManager::IToolBarLayoutManager::initialize()
+     */
+    FWGUI_API void initialize();
+
+    /// Create the layout and start the managed services.
+    FWGUI_API void create();
+
+    /// Destroy the layout and stop the managed services.
+    FWGUI_API void destroy();
+
+private:
+
+    void initializeLayoutManager( ::fwRuntime::ConfigurationElement::sptr layoutConfig );
+
+    ::fwGui::layoutManager::IToolBarLayoutManager::sptr m_layoutManager;
+    ::fwGui::registrar::ToolBarRegistrar::sptr    m_registrar;
+
+    ConfigurationType m_registrarConfig;
+    ConfigurationType m_layoutConfig;
+
+    /// Flag to hide or disable the actions if the service is stopped
+    bool m_hideActions;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUI_ITOOLBARSRV_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/Namespace.hpp
new file mode 100644
index 0000000..ec55f07
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUINAMESPACE_HPP_
+#define FWGUINAMESPACE_HPP_
+
+/**
+ * @brief      The namespace fwGui contains the base interface for IHM services.
+ * @namespace  fwGui
+ * 
+ * @date       2009-2010.
+ *
+ */
+namespace fwGui
+{
+}
+#endif /* FWGUINAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/builder/IContainerBuilder.hpp b/SrcLib/core/fwGui/include/fwGui/builder/IContainerBuilder.hpp
new file mode 100644
index 0000000..0028842
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/builder/IContainerBuilder.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_BUILDER_ICONTAINERBUILDER_HPP_
+#define _FWGUI_BUILDER_ICONTAINERBUILDER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the interface class  for the container builder.
+ * @class   IContainerBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IContainerBuilder : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IContainerBuilder)(::fwGui::GuiBaseObject) )
+
+    typedef std::string RegistryKeyType;
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IContainerBuilder();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IContainerBuilder();
+
+    /**
+     * @brief Returns the builded menu bar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwContainer::sptr getContainer();
+
+    /**
+     * @brief Configure the layout before creation. Does nothing.
+     */
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent container must be instanced.
+     */
+    FWGUI_API virtual void createContainer( ::fwGui::container::fwContainer::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUI_API virtual void destroyContainer() = 0;
+
+    /// Replace parent container
+    FWGUI_API virtual void setParent(::fwGui::container::fwContainer::sptr parent) = 0;
+
+protected:
+
+    /// Container.
+    ::fwGui::container::fwContainer::sptr m_container;
+
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUI_BUILDER_ICONTAINERBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/builder/IMenuBarBuilder.hpp b/SrcLib/core/fwGui/include/fwGui/builder/IMenuBarBuilder.hpp
new file mode 100644
index 0000000..3a516f7
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/builder/IMenuBarBuilder.hpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_BUILDER_IMENUBARBUILDER_HPP_
+#define _FWGUI_BUILDER_IMENUBARBUILDER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenuBar.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the interface class  for the menubar builder.
+ * @class   IMenuBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuBarBuilder : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IMenuBarBuilder)(::fwGui::GuiBaseObject) )
+
+    typedef std::string RegistryKeyType;
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IMenuBarBuilder();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IMenuBarBuilder();
+
+    /**
+     * @brief Returns the builded menu bar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwMenuBar::sptr getMenuBar();
+
+    /**
+     * @brief Configure the layout before creation.
+     */
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief Instantiate layout with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUI_API virtual void createMenuBar( ::fwGui::container::fwContainer::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUI_API virtual void destroyMenuBar() = 0;
+
+protected:
+
+    /// MenuBar.
+    ::fwGui::container::fwMenuBar::sptr m_menuBar;
+
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUI_BUILDER_IMENUBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/builder/IToolBarBuilder.hpp b/SrcLib/core/fwGui/include/fwGui/builder/IToolBarBuilder.hpp
new file mode 100644
index 0000000..5ddb7d8
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/builder/IToolBarBuilder.hpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_BUILDER_ITOOLBARBUILDER_HPP_
+#define _FWGUI_BUILDER_ITOOLBARBUILDER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwToolBar.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+namespace builder
+{
+
+/**
+ * @brief   Defines the interface class  for the toolbar builder.
+ * @class   IToolBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IToolBarBuilder : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IToolBarBuilder)(::fwGui::GuiBaseObject) )
+
+    typedef std::string RegistryKeyType;
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    typedef enum
+    {
+        TOP,
+        BOTTOM,
+        RIGHT,
+        LEFT
+    } Aligment;
+
+
+    /// Constructor. Do nothing.
+    FWGUI_API IToolBarBuilder();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IToolBarBuilder();
+
+    /**
+     * @brief Returns the builded tool bar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwToolBar::sptr getToolBar();
+
+    /**
+     * @brief Initialize the tool bar.
+     *
+     * Example of configuration
+     * @verbatim
+        <toolBar align="top">
+            <toolBitmapSize height= "50" width="50" />
+        </toolBar>
+       @endverbatim
+        - \b align : toolbar alignment (top, bottom, left, right)
+     *  - \<toolBitmapSize height= "50" width="50"/\> : give the size of the icon.
+     */
+
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief Instantiate layout with parent toolBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent toolBar must be instanced.
+     */
+    FWGUI_API virtual void createToolBar( ::fwGui::container::fwContainer::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUI_API virtual void destroyToolBar() = 0;
+
+protected:
+
+    /// ToolBar.
+    ::fwGui::container::fwToolBar::sptr m_toolBar;
+
+    std::pair< int, int > m_toolBitmapSize;
+
+    Aligment m_aligment;
+
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUI_BUILDER_ITOOLBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/builder/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/builder/Namespace.hpp
new file mode 100644
index 0000000..103adc7
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/builder/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIBUILDERNAMESPACE_HPP_
+#define FWGUIBUILDERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::builder contains the base interface for GUI elements builder.
+ * @namespace   fwGui::builder
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace builder
+{
+
+}
+}
+#endif /* FWGUIBUILDERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/config.hpp b/SrcLib/core/fwGui/include/fwGui/config.hpp
new file mode 100644
index 0000000..e807b8f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWGUI_CONFIG_HPP_
+#define _FWGUI_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWGUI_EXPORTS
+    #define FWGUI_API __declspec(dllexport)
+    #else
+    #define FWGUI_API __declspec(dllimport)
+    #endif
+
+    #define FWGUI_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWGUI_EXPORTS
+    #define FWGUI_API __attribute__ ((visibility("default")))
+    #define FWGUI_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWGUI_API __attribute__ ((visibility("hidden")))
+    //#define FWGUI_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWGUI_API 
+    #define FWGUI_CLASS_API 
+    #endif
+
+#else
+
+    #define FWGUI_API
+    #define FWGUI_CLASS_API
+
+#endif
+
+#endif //_FWGUI_CONFIG_HPP_
diff --git a/SrcLib/core/fwGui/include/fwGui/container/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/container/Namespace.hpp
new file mode 100644
index 0000000..9976bfc
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUICONTAINERNAMESPACE_HPP_
+#define FWGUICONTAINERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::container contains the base interface for GUI containers (toolbar, menu, menuBar...).
+ * @namespace   fwGui::container
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace container
+{
+
+}
+}
+#endif /* FWGUICONTAINERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/container/fwContainer.hpp b/SrcLib/core/fwGui/include/fwGui/container/fwContainer.hpp
new file mode 100644
index 0000000..92262fc
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/fwContainer.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_FWCONTAINER_HPP_
+#define _FWGUI_FWCONTAINER_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+/**
+ * @brief   Defines the generic container for IHM.
+ * @class   fwContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API fwContainer : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (fwContainer)(::fwGui::GuiBaseObject) ) ;
+
+    FWGUI_API virtual void clean() = 0;
+    FWGUI_API virtual void destroyContainer() = 0;
+    FWGUI_API virtual bool isShownOnScreen() = 0;
+
+    FWGUI_API virtual void setVisible(bool isVisible) = 0;
+
+};
+
+} // namespace container
+} // namespace fwGui
+
+#endif /*_FWGUI_FWCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/container/fwMenu.hpp b/SrcLib/core/fwGui/include/fwGui/container/fwMenu.hpp
new file mode 100644
index 0000000..75ae702
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/fwMenu.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_FWMENU_HPP_
+#define _FWGUI_FWMENU_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+/**
+ * @brief   Defines the menu for IHM.
+ * @class   fwMenuBar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API fwMenu : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (fwMenu)(::fwGui::GuiBaseObject) ) ;
+
+    FWGUI_API virtual void clean() = 0;
+    FWGUI_API virtual void destroyContainer() = 0;
+
+};
+} // namespace container
+} // namespace fwGui
+
+#endif /*_FWGUI_FWMENU_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/container/fwMenuBar.hpp b/SrcLib/core/fwGui/include/fwGui/container/fwMenuBar.hpp
new file mode 100644
index 0000000..df2ecbf
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/fwMenuBar.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_FWMENUBAR_HPP_
+#define _FWGUI_FWMENUBAR_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+/**
+ * @brief   Defines the menu bar for IHM.
+ * @class   fwMenuBar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API fwMenuBar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (fwMenuBar)(::fwGui::GuiBaseObject) ) ;
+
+    FWGUI_API virtual void clean() = 0;
+    FWGUI_API virtual void destroyContainer() = 0;
+
+};
+} // namespace container
+} // namespace fwGui
+
+#endif /*_FWGUI_FWMENUBAR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/container/fwMenuItem.hpp b/SrcLib/core/fwGui/include/fwGui/container/fwMenuItem.hpp
new file mode 100644
index 0000000..7b9e2f4
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/fwMenuItem.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_FWMENUITEM_HPP_
+#define _FWGUI_FWMENUITEM_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+/**
+ * @brief   Defines the menu item for IHM.
+ * @class   fwMenuItem
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API fwMenuItem : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (fwMenuItem)(::fwGui::GuiBaseObject) ) ;
+
+    FWGUI_API virtual void clean() = 0;
+    FWGUI_API virtual void destroyContainer() = 0;
+
+};
+} // namespace container
+} // namespace fwGui
+
+#endif /*_FWGUI_FWMENUITEM_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/container/fwToolBar.hpp b/SrcLib/core/fwGui/include/fwGui/container/fwToolBar.hpp
new file mode 100644
index 0000000..bafb696
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/container/fwToolBar.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_FWTOOLBAR_HPP_
+#define _FWGUI_FWTOOLBAR_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+/**
+ * @brief   Defines the tool bar for IHM.
+ * @class   fwToolBar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API fwToolBar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro ( (fwToolBar)(::fwGui::GuiBaseObject) ) ;
+
+    FWGUI_API virtual void clean() = 0;
+    FWGUI_API virtual void destroyContainer() = 0;
+
+};
+} // namespace container
+} // namespace fwGui
+
+#endif /*_FWGUI_FWTOOLBAR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/IInputDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/IInputDialog.hpp
new file mode 100644
index 0000000..af25ba3
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/IInputDialog.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IINPUTDIALOG_HPP_
+#define _FWGUI_IINPUTDIALOG_HPP_
+
+#include <string>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic input dialog box for IHM.
+ * @class   IInputDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IInputDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IInputDialog)(::fwGui::GuiBaseObject) )
+
+    /// Constructor. Do nothing.
+    FWGUI_API IInputDialog();
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IInputDialog();
+
+    typedef std::string FactoryRegistryKeyType;
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    /// Set the title of the input dialog
+    FWGUI_API virtual void setTitle(const std::string &title) = 0;
+
+    /// Set the input text in the input field
+    FWGUI_API virtual void setInput(const std::string &text) = 0;
+
+    /// Get the input text in the input field
+    FWGUI_API virtual std::string getInput() = 0;
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_IINPUTDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/ILocationDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/ILocationDialog.hpp
new file mode 100644
index 0000000..4cce4fc
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/ILocationDialog.hpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_ILOCATIONDIALOG_HPP_
+#define _FWGUI_ILOCATIONDIALOG_HPP_
+
+#include <boost/filesystem.hpp>
+
+#include <string>
+
+#include <fwData/location/ILocation.hpp>
+#include <fwData/Composite.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic file/folder selector dialog for IHM.
+ * @class   LocationDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ILocationDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (ILocationDialog)(::fwGui::GuiBaseObject) )
+
+    typedef enum {
+        NONE            = 0,
+        READ            = 1 << 1,
+        WRITE           = 1 << 2,
+        FILE_MUST_EXIST = 1 << 3,
+    } Options;
+
+    typedef enum {
+        SINGLE_FILE,
+        FOLDER,
+        MULTI_FILES
+    } Types;
+
+    typedef std::string FactoryRegistryKeyType;
+
+    /// this *unique* key should  be used *for all* factory for specific LocationDialog(qt,wx,...)
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    FWGUI_API static const std::string SOFTWARE_UI;
+    FWGUI_API static const std::string DLG_DEFAULT_LOCATION;
+
+    FWGUI_API virtual ~ILocationDialog();
+
+    FWGUI_API ILocationDialog();
+
+    /// set the title for the dialog
+    FWGUI_API virtual void setTitle(const std::string& title);
+
+    /// returns the title for the dialog
+    FWGUI_API virtual const std::string& getTitle();
+
+    /// set the initial location for the dialog
+    FWGUI_API virtual void setDefaultLocation( ::fwData::location::ILocation::sptr loc);
+
+    /// get the default location for the dialog (from preferences or specified by user)
+    FWGUI_API virtual const ::boost::filesystem::path getDefaultLocation();
+
+    /// save the specified default location for the dialog in preferences (if available)
+    FWGUI_API virtual void saveDefaultLocation(::fwData::location::ILocation::sptr loc);
+
+    /// set the type of location for the dialog (SINGLE_FILE, FORLDER, MULTI_FILES)
+    FWGUI_API virtual void setType( Types type ) =0;
+
+    /// allow to set option to the file dialog mode=READ/WRITE , check=FILE_MUST_EXIST
+    FWGUI_API virtual ILocationDialog& setOption( Options option) =0;
+
+    /**
+     * @brief specify some filtering when browsing files:
+     * @param[in] filterName a string that will be displayed as filter name
+     * @param[in] wildcardList a string of extension (glob syntax) separated by spaces
+     * example : addFilter("images","*.png *.jpg")
+     */
+    FWGUI_API virtual void addFilter(const std::string &filterName, const std::string &wildcardList )=0;
+
+    /**
+     * Display the dialog
+     * @return the ILocation selected or null sptr if user cancel the operation
+     */
+    FWGUI_API virtual ::fwData::location::ILocation::sptr show() = 0;
+
+protected:
+
+    FWGUI_API void readConfig();
+
+    FWGUI_API void writeConfig();
+
+    FWGUI_API ::fwData::Composite::sptr getPreferenceUI();
+
+private:
+
+    std::string m_title;
+    ::fwData::location::ILocation::sptr m_defaultLocaction;
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_ILOCATIONDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/IMessageDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/IMessageDialog.hpp
new file mode 100644
index 0000000..7e62e42
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/IMessageDialog.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IMESSAGEBOX_HPP_
+#define _FWGUI_IMESSAGEBOX_HPP_
+
+#include <string>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic message box for IHM.
+ * @class   IMessageDialog
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMessageDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IMessageDialog)(::fwGui::GuiBaseObject) )
+
+    /// Icon type
+    typedef enum {
+        CRITICAL,
+        WARNING,
+        INFO,
+        QUESTION,
+        NONE
+    } Icons;
+
+    /// Buttons type
+    typedef enum {
+        NOBUTTON = 0, // invalid
+
+        OK     = 1 << 1,
+        YES    = 1 << 2,
+        NO     = 1 << 3,
+        CANCEL = 1 << 4,
+
+        YES_NO = YES | NO
+    } Buttons;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IMessageDialog();
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IMessageDialog();
+
+
+    typedef std::string FactoryRegistryKeyType;
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    /// Set the title of the message box
+    FWGUI_API virtual void setTitle(const std::string &title) = 0;
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+
+    /// Set the icon (CRITICAL, WARNING, INFO or QUESTION)
+    FWGUI_API virtual void setIcon( Icons icon) =0;
+
+    /// Add a button (OK, YES_NO, YES, NO, CANCEL)
+    FWGUI_API virtual void addButton(Buttons button )=0;
+
+    /// Set the default button
+    FWGUI_API virtual void setDefaultButton(Buttons button) = 0;
+
+    /// Show the message box and return the clicked button.
+    FWGUI_API virtual Buttons show() = 0;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_IMESSAGEBOX_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/IMultiSelectorDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/IMultiSelectorDialog.hpp
new file mode 100644
index 0000000..612b31c
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/IMultiSelectorDialog.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUI_IMULTISELECTORDIALOG_HPP_
+#define FWGUI_IMULTISELECTORDIALOG_HPP_
+
+#include <map>
+#include <vector>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   IMultiSelectorDialog allows the choice of some elements among several (_selections)
+ * @class   IMultiSelectorDialog
+ * 
+ * @date    2009-2010.
+ */
+class FWGUI_CLASS_API IMultiSelectorDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IMultiSelectorDialog)(::fwGui::GuiBaseObject) )
+
+    typedef std::map< std::string, bool > Selections;
+    typedef std::string FactoryRegistryKeyType;
+
+    /// this *unique* key should  be used *for all* factory for specific Selector(qt,wx,...)
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    /**
+     * @brief Constructor builds a selector proposing a string list
+     */
+    FWGUI_API IMultiSelectorDialog() ;
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IMultiSelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUI_API virtual void setSelections(Selections _selections) = 0;
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUI_API virtual void setTitle(std::string _title) = 0;
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUI_API virtual Selections show() = 0;
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+};
+
+} //namespace dialog
+} //namespace fwGui
+
+#endif /*FWGUI_IMULTISELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/IProgressDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/IProgressDialog.hpp
new file mode 100644
index 0000000..1ce2786
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/IProgressDialog.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IPROGRESSDIALOG_HPP_
+#define _FWGUI_IPROGRESSDIALOG_HPP_
+
+#include <string>
+#include <boost/function.hpp>
+#include <boost/signals.hpp>
+
+#include <fwData/location/ILocation.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic Progress dialog for IHM.
+ * @todo    add methods for behavior like autoClose, flying window or in status bar
+ * @class   IProgressDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IProgressDialog : public ::fwGui::GuiBaseObject, public ::boost::signals::trackable // to autoDisconnect if handler is destroyed before the notifier
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (IProgressDialog)(::fwGui::GuiBaseObject), (()), progressDialogFactory);
+
+    typedef std::string FactoryRegistryKeyType;
+    typedef boost::function< void () >  CancelCallbackType;
+
+
+    /// this *unique* key should  be used *for all* factory for specific LocationDialog(qt,wx,...)
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    FWGUI_API virtual ~IProgressDialog();
+    FWGUI_API IProgressDialog();
+
+    ///set the title for the dialog
+    FWGUI_API virtual void setTitle(const std::string &title) = 0;
+
+    ///set the message for the dialog
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+
+    /// action called by ::fwTools::ProgressAdviser
+    FWGUI_API virtual void operator()(float percent,std::string msg) = 0;
+
+    FWGUI_API virtual void setCancelCallback(CancelCallbackType callback);
+
+    virtual void setCancelRaiseException(bool raise){m_raise = raise;};
+
+    virtual bool getCanceled(){return m_canceled;};
+
+    virtual void hideCancelButton() {};
+
+    virtual void setProcessUserEvents(bool process){m_processUserEvents = process;}
+
+protected :
+
+    FWGUI_API virtual void cancelPressed();
+
+    CancelCallbackType m_cancelCallback;
+    bool m_canceled;
+    bool m_raise;
+    ///progress bar's current value: [0-100]
+    int  m_value;
+    bool m_processUserEvents;
+
+protected :
+    static sptr progressDialogFactory()
+    {
+        ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(::fwGui::dialog::IProgressDialog::REGISTRY_KEY);
+        ::fwGui::dialog::IProgressDialog::sptr progressDlg = ::fwGui::dialog::IProgressDialog::dynamicCast(guiObj);
+        return progressDlg;
+    }
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_LOCATIONDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/IPulseProgressDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/IPulseProgressDialog.hpp
new file mode 100644
index 0000000..d9c44d1
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/IPulseProgressDialog.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_IPULSEPROGRESSDIALOG_HPP_
+#define _FWGUI_IPULSEPROGRESSDIALOG_HPP_
+
+#include <string>
+#include <boost/function.hpp>
+
+#include <fwData/location/ILocation.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic Progress dialog for IHM.
+ * @todo    add methods for behavior like autoClose, flying window or in status bar
+ * @class   IPulseProgressDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IPulseProgressDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IPulseProgressDialog)(::fwGui::GuiBaseObject) )
+
+    typedef std::string FactoryRegistryKeyType;
+
+    typedef ::boost::function0<void> Stuff;
+
+    typedef unsigned long MilliSecond;
+
+    /// this *unique* key should  be used *for all* factory for specific LocationDialog(qt,wx,...)
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    FWGUI_API virtual ~IPulseProgressDialog();
+    FWGUI_API IPulseProgressDialog();
+
+    ///set the title for the dialog
+    FWGUI_API virtual void setTitle(const std::string &title) = 0;
+
+    ///set the message for the dialog
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+
+    ///set the stuff
+    FWGUI_API virtual void setStuff(Stuff stuff);
+
+    ///set the frequence
+    FWGUI_API virtual void setFrequence(MilliSecond frequence);
+
+    ///show the pulse progress dialog
+    FWGUI_API virtual void show() = 0;
+
+protected:
+    Stuff m_stuff;
+    MilliSecond m_frequence;
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_IPULSEPROGRESSDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/ISelectorDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/ISelectorDialog.hpp
new file mode 100644
index 0000000..2c946b4
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/ISelectorDialog.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUI_ISELECTORDIALOG_HPP_
+#define FWGUI_ISELECTORDIALOG_HPP_
+
+#include <vector>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   ISelectorDialog allows the choice of an element among several (_selections)
+ * @class   ISelectorDialog
+ * 
+ * @date    2009-2010.
+ */
+class FWGUI_CLASS_API ISelectorDialog : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (ISelectorDialog)(::fwGui::GuiBaseObject) )
+
+    typedef std::string FactoryRegistryKeyType;
+
+    /// this *unique* key should  be used *for all* factory for specific Selector(qt,wx,...)
+    FWGUI_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    /**
+     * @brief Constructor builds a selector proposing a string list
+     */
+    FWGUI_API ISelectorDialog() ;
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~ISelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUI_API virtual void setSelections(std::vector< std::string > _selections) = 0;
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUI_API virtual void setTitle(std::string _title) = 0;
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUI_API virtual std::string show() = 0;
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg) = 0;
+};
+
+} //namespace dialog
+} //namespace fwGui
+
+#endif /*FWGUI_ISELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/InputDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/InputDialog.hpp
new file mode 100644
index 0000000..7347c6b
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/InputDialog.hpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_INPUTDIALOG_HPP_
+#define _FWGUI_INPUTDIALOG_HPP_
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/dialog/IInputDialog.hpp"
+#include "fwGui/config.hpp"
+
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic input dialog for IHM.
+ * Use the Delegate design pattern
+ * @class   InputDialog
+ * 
+ * @date    2009-2010.
+ *
+ * Example of use:
+ * @verbatim
+  ::fwGui::dialog::InputDialog inputDlg;
+  inputDlg.setTitle("Identification dialog");
+  inputDlg.setMessage("Enter Pin Code: ");
+  inputDlg.setInput ("<Enter your code here>");
+  std::string inputText = inputDlg.getInput();
+  @endverbatim
+ */
+class FWGUI_CLASS_API InputDialog : public ::fwGui::dialog::IInputDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (InputDialog)(::fwGui::dialog::IInputDialog), (()), new InputDialog );
+
+    /**
+     * Opens a default input box with the specified title and message.
+     *
+     * @param title Title of the input box
+     * @param message Message of the input box
+     * @param text the input text in the input field
+     * @return Returns text in the input field
+     */
+    FWGUI_API static std::string showInputDialog(const std::string& title, const std::string& message, const std::string &text = "");
+
+
+    /** @brief Constructor. Create the implementation of the specific input dialog box.
+     *
+     * Example of use:
+     * @verbatim
+      ::fwGui::dialog::InputDialog inputDlg;
+      inputDlg.setTitle("Identification dialog");
+      inputDlg.setMessage("Enter Pin Code: ");
+      inputDlg.setInput ("<Enter your code here>");
+      std::string inputText = inputDlg.getInput();
+     @endverbatim
+     */
+    FWGUI_API InputDialog();
+
+    /**
+     * Constructor. Creates a input box with the specified title and message.
+     *
+     * @param title Title of the input box
+     * @param message Message of the input box
+     * @param text the input text in the input field
+     */
+    FWGUI_API InputDialog(const std::string& title, const std::string& message, const std::string &text = "");
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~InputDialog();
+
+    /// Set the title of the input dialog
+    FWGUI_API virtual void setTitle(const std::string &title);
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg);
+
+    /// Set the input text in the input field
+    FWGUI_API virtual void setInput(const std::string &text);
+
+    /// Get the input text in the input field
+    FWGUI_API virtual std::string getInput();
+
+protected:
+
+    /// Implementation of an input dialog in a specific IHM (wx/Qt)
+    ::fwGui::dialog::IInputDialog::sptr m_implementation;
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_INPUTDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/LocationDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/LocationDialog.hpp
new file mode 100644
index 0000000..caec5ab
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/LocationDialog.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_LOCATIONDIALOG_HPP_
+#define _FWGUI_LOCATIONDIALOG_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/dialog/ILocationDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic file/folder selector dialog for IHM.
+ *
+ * Use the Delegate design pattern. The specific implementation selection is ensured by fwGuiRegisterMacro.
+ * The specific implementation are in fwWX and fwQT libraries.
+ *
+ * @class   LocationDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API LocationDialog : public ILocationDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (LocationDialog)(::fwGui::dialog::ILocationDialog), (()), new LocationDialog );
+
+    /// Will instantiate the concrete implementation
+    FWGUI_API LocationDialog();
+
+    FWGUI_API virtual ~LocationDialog();
+
+    /**
+     * @brief Display the dialog
+     * @return the ILocation selected or null sptr if user cancel the operation
+     */
+    FWGUI_API ::fwData::location::ILocation::sptr show();
+
+    /// allow to set option to the file dialog mode=READ/WRITE, check=FILE_MUST_EXIST
+    FWGUI_API ::fwGui::dialog::ILocationDialog& setOption( ::fwGui::dialog::ILocationDialog::Options option);
+
+    /// Set the type of location for the dialog (SINGLE_FILE, FORLDER, MULTI_FILES)
+    FWGUI_API void setType( ::fwGui::dialog::ILocationDialog::Types type);
+
+    /**
+     * @brief specify some filtering when browsing files:
+     * @param[in] filterName a string that will be displayed as filter name
+     * @param[in] wildcardList a string of extension (glob syntax) separated by spaces
+     * example : addFilter("images","*.png *.jpg")
+     */
+    FWGUI_API void addFilter(const std::string &filterName, const std::string &wildcardList );
+
+    /// Set the title for the dialog
+    FWGUI_API void setTitle(const std::string& title);
+
+    /// Returns the title for the dialog
+    FWGUI_API const std::string& getTitle();
+
+    /// Set the initial location for the dialog
+    FWGUI_API virtual void setDefaultLocation( ::fwData::location::ILocation::sptr loc);
+
+    /// Gets the default location for the dialog (from preferences or specified by user)
+    FWGUI_API const ::boost::filesystem::path getDefaultLocation();
+
+    /// Save the specified default location for the dialog in preferences (if available)
+    FWGUI_API void saveDefaultLocation(::fwData::location::ILocation::sptr loc);
+
+protected :
+
+    ::fwGui::dialog::ILocationDialog::sptr m_implementation;
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_LOCATIONDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/MessageDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/MessageDialog.hpp
new file mode 100644
index 0000000..57839fb
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/MessageDialog.hpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_MESSAGEBOX_HPP_
+#define _FWGUI_MESSAGEBOX_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/dialog/IMessageDialog.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic message box for IHM.
+ * Use the Delegate design pattern.
+ * @class   MessageDialog
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API MessageDialog : public ::fwGui::dialog::IMessageDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MessageDialog)(::fwGui::dialog::IMessageDialog), (()), new MessageDialog );
+
+    /**
+     * Opens a default message box with the specified title, text and icon.
+     *
+     * @param title Title of the message box
+     * @param message Message of the message box
+     * @param icon Icon of the message box (CRITICAL, WARNING, INFO or QUESTION)
+     * @return Returns the button enum value corresponding to the pressed button
+     */
+    FWGUI_API static IMessageDialog::Buttons showMessageDialog(const std::string& title, const std::string& message, ::fwGui::dialog::IMessageDialog::Icons icon = INFO);
+
+    /// Constructor. Create the implementation of the specific message box
+    FWGUI_API MessageDialog();
+
+    /**
+     * Constructor
+     * Creates a message box with the specified title text and icon.
+     *
+     * @param title Title of the message box
+     * @param message Message of the message box
+     * @param icon Icon of the message box (CRITICAL, WARNING, INFO or QUESTION)
+     */
+    FWGUI_API MessageDialog(const std::string& title, const std::string& message, ::fwGui::dialog::IMessageDialog::Icons icon = INFO);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~MessageDialog();
+
+    /// Set the title of the message box
+    FWGUI_API virtual void setTitle(const std::string &title);
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg);
+
+    /// Set the icon (CRITICAL, WARNING, INFO or QUESTION)
+    FWGUI_API virtual void setIcon( IMessageDialog::Icons icon);
+
+    /// Add a button (OK, YES_NO, YES, NO, CANCEL)
+    FWGUI_API virtual void addButton(IMessageDialog::Buttons button );
+
+    /// Set the default button
+    void setDefaultButton(IMessageDialog::Buttons button );
+
+    /// Show the message box and return the clicked button.
+    FWGUI_API virtual IMessageDialog::Buttons show();
+
+protected:
+
+    /// Implementation of a message box in a specific IHM (wx/Qt)
+    ::fwGui::dialog::IMessageDialog::sptr m_implementation;
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_MESSAGEBOX_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/MultiSelectorDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/MultiSelectorDialog.hpp
new file mode 100644
index 0000000..9ae43e7
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/MultiSelectorDialog.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_MULTISELECTORDIALOG_HPP_
+#define _FWGUI_MULTISELECTORDIALOG_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/dialog/IMultiSelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   MultiSelectorDialog allows the choice of some element among several (_selections)
+ *
+ * Use the Delegate design pattern. The specific implementation selection is ensured by fwGuiRegisterMacro
+ * The specific implementation are in fwWX and fwQT libraries
+ * @class   MultiSelectorDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API MultiSelectorDialog : public IMultiSelectorDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MultiSelectorDialog)(::fwGui::dialog::IMultiSelectorDialog), (()), new MultiSelectorDialog );
+
+    /// will instanciate the concrete implementation
+    FWGUI_API MultiSelectorDialog();
+
+    /// Sets the selector title.
+    FWGUI_API void setTitle(std::string title);
+
+    /// Set the string list that can be chosen by the selector.
+    FWGUI_API virtual void setSelections(Selections _selections);
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUI_API Selections show();
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg);
+
+protected :
+
+    ::fwGui::dialog::IMultiSelectorDialog::sptr m_implementation;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_MULTISELECTORDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/Namespace.hpp
new file mode 100644
index 0000000..ec5b22b
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIDIALOGNAMESPACE_HPP_
+#define FWGUIDIALOGNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::dialog contains the base interface for GUI dialog elements.
+ * @namespace   fwGui::dialog
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace dialog
+{
+
+}
+}
+#endif /* FWGUIDIALOGNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/ProgressDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/ProgressDialog.hpp
new file mode 100644
index 0000000..f5989ce
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/ProgressDialog.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_ProgressDialog_HPP_
+#define _FWGUI_ProgressDialog_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/dialog/IProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic progress dialog for IHM.
+ * Use the Delegate design pattern. The specific implementation selection is ensured by fwGuiRegisterMacro.
+ * The specific implementation are in fwWX and fwQT libraries
+ * @class   ProgressDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ProgressDialog : public IProgressDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ProgressDialog)(::fwGui::dialog::IProgressDialog), (()), new ProgressDialog );
+
+    /// will instanciate the concrete implementation
+    FWGUI_API ProgressDialog( const std::string &title = std::string() ,  const std::string &msg = std::string() );
+
+    ///set the title for the dialog
+    FWGUI_API void setTitle(const std::string &title);
+
+    ///set the message for the dialog
+    FWGUI_API void setMessage(const std::string &message);
+
+    /// action called by ::fwTools::ProgressAdviser
+    FWGUI_API void operator()(float percent,std::string msg);
+
+
+    FWGUI_API void setCancelCallback(CancelCallbackType callback);
+
+    FWGUI_API void hideCancelButton();
+
+protected :
+
+    FWGUI_API void cancelPressed();
+
+    ::fwGui::dialog::IProgressDialog::sptr m_implementation;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_ProgressDialog_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/PulseProgressDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/PulseProgressDialog.hpp
new file mode 100644
index 0000000..ef0f475
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/PulseProgressDialog.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_PULSEPROGRESSDIALOG_HPP_
+#define _FWGUI_PULSEPROGRESSDIALOG_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/dialog/IPulseProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic pulse progress dialog for IHM.
+ * Use the Delegate design pattern. The specific implementation selection is ensured by fwGuiRegisterMacro.
+ * The specific implementation are in fwWX and fwQT libraries
+ * @class   PulseProgressDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API PulseProgressDialog : public IPulseProgressDialog
+{
+
+public:
+
+
+    fwCoreClassDefinitionsWithFactoryMacro( (PulseProgressDialog)(::fwGui::dialog::IPulseProgressDialog), (((const std::string))((::fwGui::dialog::IPulseProgressDialog::Stuff))), new PulseProgressDialog );
+
+    /// will instantiate the concrete implementation
+    FWGUI_API PulseProgressDialog(
+            const std::string &title,
+            Stuff stuff,
+            const std::string &msg = std::string(),
+            ::fwGui::dialog::IPulseProgressDialog::MilliSecond frequenceRefresh = 100 );
+
+    ///set the title for the dialog
+    FWGUI_API void setTitle(const std::string &title);
+
+    ///set the message for the dialog
+    FWGUI_API void setMessage(const std::string &message);
+
+    ///show the pulse progress dialog
+    FWGUI_API virtual void show();
+
+protected :
+
+    ::fwGui::dialog::IPulseProgressDialog::sptr m_implementation;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_PULSEPROGRESSDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/dialog/SelectorDialog.hpp b/SrcLib/core/fwGui/include/fwGui/dialog/SelectorDialog.hpp
new file mode 100644
index 0000000..962d4fc
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/dialog/SelectorDialog.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_SELECTORDIALOG_HPP_
+#define _FWGUI_SELECTORDIALOG_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/dialog/ISelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+/**
+ * @brief   SelectorDialog allows the choice of an element among several (_selections)
+ * Use the Delegate design pattern. The specific implementation selection is ensured by fwGuiRegisterMacro.
+ * The specific implementation are in fwWX and fwQT libraries
+ * @class   SelectorDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API SelectorDialog : public ISelectorDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (SelectorDialog)(::fwGui::dialog::ISelectorDialog), (()), new SelectorDialog );
+
+    /**
+     * Opens a default selector with the specified title, message and choices.
+     *
+     * @param title Title of the selector
+     * @param message Message of the selector
+     * @param _selections list of choices in the selector
+     * @return Returns selected choice
+     */
+    FWGUI_API static std::string showSelectorDialog(const std::string& title, const std::string& message, std::vector< std::string > _selections);
+
+    /// will instanciate the concrete implementation
+    FWGUI_API SelectorDialog();
+
+    /**
+     * Constructor. Create a selector with the specified title, message and choices.
+     *
+     * @param title Title of the selector
+     * @param message Message of the selector
+     * @param _selections list of choices in the selector
+     */
+    FWGUI_API SelectorDialog(const std::string& title, const std::string& message, std::vector< std::string > _selections);
+
+    /// Sets the selector title.
+    FWGUI_API void setTitle(std::string title);
+
+    /// Set the string list that can be chosen by the selector.
+    FWGUI_API virtual void setSelections(std::vector< std::string > _selections);
+
+    /// Show the selector and return the selection.
+    FWGUI_API std::string show();
+
+    /// Set the message
+    FWGUI_API virtual void setMessage(const std::string &msg);
+
+protected :
+
+    ::fwGui::dialog::ISelectorDialog::sptr m_implementation;
+
+};
+
+} //namespace dialog
+} // namespace fwGui
+
+#endif /*_FWGUI_SELECTORDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/factory/namespace.hpp b/SrcLib/core/fwGui/include/fwGui/factory/namespace.hpp
new file mode 100644
index 0000000..f84987f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/factory/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_FACTORY_NAMESPACE_HPP__
+#define __FWGUI_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwGui
+{
+
+/**
+ * @brief       Contains fwGui::factory utilities
+ * @namespace   fwGui::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwGui
+
+#endif /* __FWGUI_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwGui/include/fwGui/factory/new.hpp b/SrcLib/core/fwGui/include/fwGui/factory/new.hpp
new file mode 100644
index 0000000..4846ba3
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/factory/new.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_FACTORY_NEW_HPP__
+#define __FWGUI_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwGui/config.hpp"
+#include "fwGui/registry/detail.hpp"
+
+namespace fwGui
+{
+
+class GuiBaseObject;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwGui::factory::New();
+
+    Key(){};
+};
+
+FWGUI_API SPTR( ::fwGui::GuiBaseObject ) New( const ::fwGui::registry::KeyType & classname );
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) guiObj = ::boost::make_shared< CLASSNAME >( Key() );
+    return guiObj;
+}
+
+} // namespace factory
+
+} // namespace fwGui
+
+#endif /* __FWGUI_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/CardinalLayoutManagerBase.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/CardinalLayoutManagerBase.hpp
new file mode 100644
index 0000000..ab8fde4
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/CardinalLayoutManagerBase.hpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/CardinalLayoutManagerBase.hpp
+ * @brief This file defines the interface class for managing a cardinal layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_CARDINALLAYOUTMANAGERBASE_HPP_
+#define _FWGUI_LAYOUTMANAGER_CARDINALLAYOUTMANAGERBASE_HPP_
+
+#include <list>
+#include <map>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the base for cardinal layout manager.
+ * @class   CardinalLayoutManagerBase
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API CardinalLayoutManagerBase : public IViewLayoutManager
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (CardinalLayoutManagerBase)(::fwGui::layoutManager::IViewLayoutManager) )
+
+    /// Defines all possible position for a CardinalLayout
+    typedef enum
+    {
+        CENTER,
+        RIGHT,
+        LEFT,
+        BOTTOM,
+        TOP
+     } Align;
+
+     typedef std::string RegistryKeyType;
+
+     class ViewInfo
+     {
+     public :
+
+         ViewInfo() :
+             m_align (CENTER),
+             m_minSize (std::make_pair(-1,-1)),
+             m_visible (true),
+             m_isResizable(true),
+             m_position(0),
+             m_layer(0),
+             m_row(0),
+             m_caption (std::make_pair(false,"")),
+             m_useScrollBar(false)
+         {}
+
+         Align                            m_align;
+         std::pair< int, int >            m_minSize;
+         bool                             m_visible;
+         bool                             m_isResizable;
+         int                              m_position;
+         int                              m_layer;
+         int                              m_row;
+         std::pair< bool, std::string >   m_caption;
+         bool                             m_useScrollBar;
+     };
+
+    /// Constructor. Do nothing.
+    FWGUI_API CardinalLayoutManagerBase();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~CardinalLayoutManagerBase();
+
+    /**
+     * @brief Initialize cardinal layout manager before the creation of layout.
+     *
+     * Example of configuration with cardinal layout.
+     * @verbatim
+       <service uid="subView2" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+           <gui>
+               <layout type="::fwGui::CardinalLayoutManager" >
+                   <view caption="CardinalView1" align="center" />
+                   <view caption="CardinalView2" align="right" minWidth="400" />
+                   <view caption="CardinalView3" align="bottom" minHeight="400" />
+               </layout>
+           </gui>
+           <registry>
+               <view sid="view1" start="yes" />
+               <view sid="view2" start="yes" />
+               <view sid="view3" start="yes" />
+           </registry>
+       </service>
+      @endverbatim
+    *  - \<layout type="::fwGui::CardinalLayoutManager" \> : define a cardinal layout.
+    *  - \<view caption="CardinalView1" align="center" /\> : define a new view with following attribute
+    *   - \b caption : name of the view (display on the screen).
+    *   - \b align  {center | bottom | top | right | left}: define the position of the view
+    *   - \b minWidth : minimal width of the view
+    *   - \b minHeight : minimal height of the view
+    *   - \b resizable  {yes | no}: define if the view can be resized.
+    *   - \b position : indicates the sequential position, starting with zero. It uses if more than one view as the same align value (available only with wxWidget see wxAuiManager in wxWidgets documenattion for more details).
+    *   - \b layer : available only with wxWidget. See wxAuiManager in wxWidgets documenattion for more details
+    *   - \b row : use to place several view next to each other (available only with wxWidget). See wxAuiManager in wxWidgets documenattion for more details
+    *   - \b visible  {true | yes | false | no} : define if the view is visible or not.
+    */
+
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+protected:
+
+    std::list< ViewInfo> getViewsInfo(){ return m_views;};
+
+private:
+
+    static const std::map<std::string, Align> STRING_TO_ALIGN;
+
+    /// Save layout configuration definition
+    std::list< ViewInfo>  m_views;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_CARDINALLAYOUTMANAGERBASE_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/IFrameLayoutManager.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/IFrameLayoutManager.hpp
new file mode 100644
index 0000000..c248e21
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/IFrameLayoutManager.hpp
@@ -0,0 +1,167 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IFrameLayoutManager.hpp
+ * @brief This file defines the interface of the base class for managing a frame.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_IFRAMELAYOUTMANAGERB_HPP_
+#define _FWGUI_LAYOUTMANAGER_IFRAMELAYOUTMANAGERB_HPP_
+
+#include <list>
+
+#include <boost/function.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the frame layout manager.
+ * @class   IFrameLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IFrameLayoutManager : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IFrameLayoutManager)(::fwGui::GuiBaseObject) )
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /// Defines all possible style for a frame
+    typedef enum
+    {
+        DEFAULT,
+        STAY_ON_TOP
+     } Style;
+
+     typedef std::string RegistryKeyType;
+
+     static const std::string SOFTWARE_UI;
+     static const std::string FRAME_STATE_UI;
+     static const std::string FRAME_SIZE_W_UI;
+     static const std::string FRAME_SIZE_H_UI;
+     static const std::string FRAME_POSITION_X_UI;
+     static const std::string FRAME_POSITION_Y_UI;
+
+     typedef enum
+     {
+         UNKNOWN,    ///< the unknown state
+         ICONIZED,   ///< the minimized state
+         MAXIMIZED,  ///< the maximied state
+         FULL_SCREEN ///< the full screen state
+     } FrameState;
+
+     class FrameInfo
+     {
+     public :
+
+         FrameInfo() :
+             m_name (""),
+             m_minSize (std::make_pair(-1,-1)),
+             m_style (DEFAULT),
+             m_size (std::make_pair(-1,-1)),
+             m_position (std::make_pair(-1,-1)),
+             m_state(UNKNOWN)
+         {}
+
+         /// Frame name.
+         std::string                      m_name ;
+         /// Frame icon.
+         ::boost::filesystem::path        m_iconPath;
+         /// Frame minimum size (min width and min height)
+         std::pair< int, int >            m_minSize;
+         /// Frame style
+         Style                            m_style;
+         /// Frame size
+         std::pair< int, int >            m_size;
+         /// Frame position
+         std::pair< int, int >            m_position;
+         /// Frame state (maximize, minized, full screen)
+         FrameState                       m_state;
+     };
+
+    /// Constructor. Do nothing.
+    FWGUI_API IFrameLayoutManager();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IFrameLayoutManager();
+
+    /**
+     * @brief Configure the layout before creation.
+     */
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+    /**
+     * @brief Instantiate frame.
+     */
+    FWGUI_API virtual void createFrame() = 0;
+
+    /**
+     * @brief Destroy frame.
+     */
+    FWGUI_API virtual void destroyFrame() = 0;
+
+    /// Return the frame container
+    virtual ::fwGui::container::fwContainer::sptr getFrame(){ return m_frame;};
+
+    /// Return the first container into the frame
+    virtual ::fwGui::container::fwContainer::sptr getContainer(){ return m_container;};
+
+
+    typedef ::boost::function0< void > CloseCallback;
+    FWGUI_API virtual void setCloseCallback(CloseCallback fct);
+
+protected:
+
+    fwGettersSettersDocMacro(FrameInfo, frameInfo, FrameInfo, configuration definition.);
+
+    ::fwGui::container::fwContainer::sptr m_frame;
+    ::fwGui::container::fwContainer::sptr m_container;
+    CloseCallback m_closeCallback;
+
+    FWGUI_API void readConfig();
+
+    FWGUI_API void writeConfig();
+
+    FWGUI_API ::fwData::Composite::sptr getPreferenceUI();
+
+private:
+
+
+    void defaultCloseCallback();
+
+    /// Save frame configuration definition
+    FrameInfo  m_frameInfo;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_IFRAMELAYOUTMANAGERB_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuBarLayoutManager.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuBarLayoutManager.hpp
new file mode 100644
index 0000000..365013b
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuBarLayoutManager.hpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IMenuBarLayoutManager.hpp
+ * @brief This file defines the interface of the base class for managing a menubar.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_IMENUBARLAYOUTMANAGER_HPP_
+#define _FWGUI_LAYOUTMANAGER_IMENUBARLAYOUTMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenuBar.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu bar layout manager for IHM.
+ * @class   IMenuBarLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuBarLayoutManager : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IMenuBarLayoutManager)(::fwGui::GuiBaseObject) )
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::string RegistryKeyType;
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IMenuBarLayoutManager();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IMenuBarLayoutManager();
+
+    /**
+     * @brief Returns the vector of fwMenu managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwMenu::sptr > getMenus();
+
+    /**
+     * @brief Initialize layout managers.
+     *
+     * Example of configuration
+     * @verbatim
+      <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+          <gui>
+              <layout>
+                  <menu name="My Menu"/>
+                  <menu name="My Menu 2"/>
+              </layout>
+          </gui>
+          <registry>
+              <menu sid="myMenu" start="yes" />
+              <menu sid="myMenu2" start="yes" />
+          </registry>
+      </service>
+       @endverbatim
+     * This method analyzes the gui section of the configuration.
+     *  - \<layout\> (mandatory) : give the list of the menu that will appear in the menu bar.
+     *  - \<menu name="My Menu"/\> :
+     *   - \b name (mandatory) : give the name of the menu that will appear in the interface.
+     */
+
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    /**
+     * @brief Instantiate menu with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUI_API virtual void createLayout( ::fwGui::container::fwMenuBar::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local menus.
+     * @pre services using this menus must be stopped before.
+     */
+    FWGUI_API virtual void destroyLayout() = 0;
+
+
+    /**
+     * @brief Set the menu visibility.
+     */
+    FWGUI_API virtual void menuIsVisible(::fwGui::container::fwMenu::sptr, bool isVisible) = 0;
+
+    /**
+     * @brief Set the menu enable or not.
+     */
+    FWGUI_API virtual void menuIsEnabled(::fwGui::container::fwMenu::sptr, bool isEnabled) = 0;
+
+
+protected:
+
+    /**
+     * @brief Helper to destroy local sub views.
+     */
+    FWGUI_API virtual void destroyMenus();
+
+    /// All sub containers managed by this layout.
+    std::vector< ::fwGui::container::fwMenu::sptr > m_menus;
+
+    /// Save menu name from configuration.
+    std::vector< std::string > m_menuNames;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_IMENUBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuLayoutManager.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuLayoutManager.hpp
new file mode 100644
index 0000000..eeebc0f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/IMenuLayoutManager.hpp
@@ -0,0 +1,196 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IMenuLayoutManager.hpp
+ * @brief This file defines the interface of the base class for managing a menu.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_IMENULAYOUTMANAGER_HPP_
+#define _FWGUI_LAYOUTMANAGER_IMENULAYOUTMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+#include "fwGui/IMenuItemCallback.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu layout manager for IHM.
+ * @class   IMenuLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IMenuLayoutManager : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IMenuLayoutManager)(::fwGui::GuiBaseObject) )
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::string RegistryKeyType;
+    typedef std::vector< ::fwGui::IMenuItemCallback::sptr > CallbacksType;
+
+    typedef enum {
+        DEFAULT,
+        QUIT,
+        ABOUT,
+        HELP,
+        NEW,
+        SEPARATOR
+    }ActionType;
+
+    class ActionInfo
+    {
+    public :
+
+        ActionInfo() :
+            m_name(""),
+            m_shortcut(""),
+            m_icon(""),
+            m_isCheckable (false),
+            m_isRadio(false),
+            m_type(DEFAULT),
+            m_isSeparator(false),
+            m_isMenu(false)
+        {}
+
+        std::string m_name;
+        std::string m_shortcut;
+        std::string m_icon;
+        bool        m_isCheckable;
+        bool        m_isRadio;
+        ActionType  m_type;
+        bool        m_isSeparator;
+        bool        m_isMenu;
+    };
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IMenuLayoutManager();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IMenuLayoutManager();
+
+    /**
+     * @brief Returns the vector of fwMenuItem managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwMenuItem::sptr > getMenuItems();
+
+    /**
+     * @brief Returns the vector of fwMenu managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwMenu::sptr > getMenus();
+
+    /**
+     * @brief Initialize layout managers.
+     *
+     * Example of configuration
+     * @verbatim
+       <service uid="myMenu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="My item 1" shortcut="1" style="check" />
+                    <separator />
+                    <menuItem name="My item 2" shortcut="2" style="radio" />
+                    <menuItem name="My item 3" shortcut="3" style="radio" />
+                    <separator />
+                    <menu name="My menu" />
+                    <separator />
+                    <menuItem name="Quit" shortcut="Ctrl+Q" specialAction="QUIT" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="item1" start="yes" />
+                <menuItem sid="item2" start="no" />
+                <menuItem sid="item3" start="no" />
+                <menu sid="mymenu" start="yes" />
+                <menuItem sid="actionQuit" start="no" />
+            </registry>
+       </service>
+       @endverbatim
+     * This method analyzes the gui section of the configuration.
+     * - \<layout\> (mandatory) : give the list of the menu item that will appear in the menu.
+     * - \<menuItem name="My item 1" shortcut="1" style="check" specialAction="NEW" /\> :
+     *  - \b name (mandatory) : give the name of the menu item that will appear in the interface.
+     *  - \b shortcut : give the shortcut for this menu item.
+     *  - \b style {check|radio} : give the style of the menu item.
+     *  - \b specialAction {DEFAULT | QUIT | NEW | ABOUT | HELP}: specify a pre define action. If it isn't define the value is DEFAULT.
+     * - \<menu name="My menu" /\> :
+     *  - \b name (mandatory) : give the name of the menu that will appear in the interface.
+     * - \<separator/\> : allow to divide the menu by part (draw a line).
+     */
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    /**
+     * @brief Instantiate actions with parent menu.
+     */
+    FWGUI_API virtual void createLayout( ::fwGui::container::fwMenu::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local actions.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUI_API virtual void destroyLayout() = 0;
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUI_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr, bool isVisible) = 0;
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUI_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr, bool isEnabled) = 0;
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUI_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked) = 0;
+
+    /**
+     * @brief Sets callbacks associate with menu items.
+     */
+    virtual void setCallbacks(CallbacksType callbacks) {m_callbacks = callbacks;};
+
+protected:
+
+    /**
+     * @brief Helper to destroy local actions.
+     */
+    FWGUI_API virtual void destroyActions();
+
+    /// All actions managed by this layout.
+    std::vector< ::fwGui::container::fwMenuItem::sptr > m_menuItems;
+
+    /// All menus managed by this layout.
+    std::vector< ::fwGui::container::fwMenu::sptr > m_menus;
+
+    /// Save action informations from configuration.
+    std::vector< ActionInfo > m_actionInfo;
+
+    /// Callbacks associate with menu items
+    CallbacksType m_callbacks;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_IMENULAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/IToolBarLayoutManager.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/IToolBarLayoutManager.hpp
new file mode 100644
index 0000000..7589386
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/IToolBarLayoutManager.hpp
@@ -0,0 +1,203 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IToolBarLayoutManager.hpp
+ * @brief This file defines the interface of the base class for managing a toolbar.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_ITOOLBARLAYOUTMANAGER_HPP_
+#define _FWGUI_LAYOUTMANAGER_ITOOLBARLAYOUTMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwToolBar.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/IMenuItemCallback.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the toolBar layout manager for IHM.
+ * @class   IToolBarLayoutManager
+ *
+ */
+class FWGUI_CLASS_API IToolBarLayoutManager : public ::fwGui::GuiBaseObject
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (IToolBarLayoutManager)(::fwGui::GuiBaseObject) )
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::string RegistryKeyType;
+    typedef std::vector< ::fwGui::IMenuItemCallback::sptr > CallbacksType;
+
+    class ActionInfo
+    {
+    public :
+
+        ActionInfo() :
+            m_name(""),
+            m_shortcut(""),
+            m_icon(""),
+            m_isCheckable (false),
+            m_isRadio(false),
+            m_isSeparator(false),
+            m_isSpacer(false),
+            m_isMenu(false),
+            m_isEditor(false),
+            m_size(0)
+        {}
+
+        std::string m_name;
+        std::string m_shortcut;
+        std::string m_icon;
+        bool        m_isCheckable;
+        bool        m_isRadio;
+        bool        m_isSeparator;
+        bool        m_isSpacer;
+        bool        m_isMenu;
+        bool        m_isEditor;
+        int         m_size;
+    };
+
+    FWGUI_API const static RegistryKeyType REGISTRY_KEY;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IToolBarLayoutManager();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IToolBarLayoutManager();
+
+    /**
+     * @brief Returns the vector of fwMenuItem managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwMenuItem::sptr > getMenuItems();
+
+    /**
+     * @brief Returns the vector of fwMenu managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwMenu::sptr > getMenus();
+
+    /**
+     * @brief Returns the vector of fwContainer managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwContainer::sptr > getContainers();
+
+    /**
+     * @brief Initialize layout managers.
+     *
+     * Example of configuration
+     * @verbatim
+       <service uid="toolbar2" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+           <gui>
+               <layout>
+                   <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                   <separator />
+                   <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                   <separator />
+                   <menu name="My menu" />
+                   <separator />
+                   <editor />
+               </layout>
+           </gui>
+           <registry>
+               <menuItem sid="item2" />
+               <menuItem sid="item3" />
+               <menuItem sid="item4" />
+               <menuItem sid="item5" />
+               <menu sid="menu" />
+               <editor sid="editor" />
+           </registry>
+       </service>
+       @endverbatim
+     * This method analyzes the gui section of the configuration.
+     *
+     *  - \<layout\> (mandatory) : give the list of the menu item that will appear in the toolbar.
+     *  - \<menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/\> :
+     *   - \b name (mandatory) : give the name of the menu item that will appear in the interface.
+     *   - \b style {check|radio} : give the style of the menu item.
+     *   - \b icon : give the path of the icon file
+     *  - \<menu name="My menu" /\> :
+     *   - \b name (mandatory) : give the name of the menu that will appear in the interface.
+     *   - \b icon : give the path of the icon file
+     *  - \<editor\> : to add an editor in the toolbar
+     *  - \<separator/\> : allow to divide the toolbar by part (draw a line).
+     */
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    /**
+     * @brief Instantiate actions with parent toolBar.
+     */
+    FWGUI_API virtual void createLayout( ::fwGui::container::fwToolBar::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local actions.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUI_API virtual void destroyLayout() = 0;
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUI_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr, bool isVisible) = 0;
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUI_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr, bool isEnabled) = 0;
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUI_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked) = 0;
+
+    /**
+     * @brief Sets callbacks associate with toolBar items.
+     */
+    virtual void setCallbacks(CallbacksType callbacks) {m_callbacks = callbacks;};
+
+protected:
+
+    /**
+     * @brief Helper to destroy local actions.
+     */
+    FWGUI_API virtual void destroyActions();
+
+    /// All actions managed by this layout.
+    std::vector< ::fwGui::container::fwMenuItem::sptr > m_menuItems;
+
+    /// All menus managed by this layout.
+    std::vector< ::fwGui::container::fwMenu::sptr > m_menus;
+
+    /// All editors managed by this layout.
+    std::vector< ::fwGui::container::fwContainer::sptr > m_containers;
+
+    /// Save action informations from configuration.
+    std::vector< ActionInfo > m_actionInfo;
+
+    /// Callbacks associate with toolBar items
+    CallbacksType m_callbacks;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_ITOOLBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/IViewLayoutManager.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/IViewLayoutManager.hpp
new file mode 100644
index 0000000..7241cea
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/IViewLayoutManager.hpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IViewLayoutManager.hpp
+ * @brief This file defines the interface of the base class for managing a layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_ILAYOUTMANAGER_HPP_
+#define _FWGUI_LAYOUTMANAGER_ILAYOUTMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   IViewLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API IViewLayoutManager : public ::fwGui::GuiBaseObject
+{
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IViewLayoutManager)(::fwGui::GuiBaseObject) )
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+
+    /// Constructor. Do nothing.
+    FWGUI_API IViewLayoutManager();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~IViewLayoutManager();
+
+    /**
+     * @brief Configure the layout before creation.
+     */
+    FWGUI_API virtual void initialize( ConfigurationType configuration) = 0;
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUI_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent ) = 0;
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUI_API virtual void destroyLayout() = 0;
+
+    /**
+     * @brief Returns all sub containers managed by this layout.
+     */
+    FWGUI_API virtual std::vector< ::fwGui::container::fwContainer::sptr > getSubViews();
+
+protected:
+
+    /**
+     * @brief Helper to destroy local sub views.
+     */
+    FWGUI_API virtual void destroySubViews();
+
+    /// All sub containers managed by this layout.
+    std::vector< ::fwGui::container::fwContainer::sptr > m_subViews;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_ILAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/LineLayoutManagerBase.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/LineLayoutManagerBase.hpp
new file mode 100644
index 0000000..c6f923d
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/LineLayoutManagerBase.hpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/LineLayoutManagerBase.hpp
+ * @brief This file defines the interface of the class for managing a line layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_LINELAYOUTMANAGERBASE_HPP_
+#define _FWGUI_LAYOUTMANAGER_LINELAYOUTMANAGERBASE_HPP_
+
+#include <list>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the base for line layout manager.
+ * @class   LineLayoutManagerBase
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API LineLayoutManagerBase : public IViewLayoutManager
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (LineLayoutManagerBase)(::fwGui::layoutManager::IViewLayoutManager) )
+
+    /// Defines all possible orientation for a LineLayout
+    typedef enum
+    {
+        VERTICAL,
+        HORIZONTAL
+     } Orientation;
+
+     typedef std::string RegistryKeyType;
+
+     class ViewInfo
+     {
+     public :
+
+         ViewInfo() :
+             m_proportion (1),
+             m_border(0),
+             m_minSize (std::make_pair(-1,-1)),
+             m_caption (std::make_pair(false,"")),
+             m_visible (true),
+             m_isSpacer(false),
+             m_useScrollBar(false)
+         {}
+
+         int                            m_proportion;
+         int                            m_border;
+         std::pair< int, int >          m_minSize;
+         std::pair< bool, std::string > m_caption;
+         bool                           m_visible;
+         bool                           m_isSpacer;
+         bool                           m_useScrollBar;
+     };
+
+    /// Constructor. Do nothing.
+    FWGUI_API LineLayoutManagerBase();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~LineLayoutManagerBase();
+
+    /**
+     * @brief Initialize Line layout manager before the creation of layout.
+     *
+     * Example of configuration with cardinal layout.
+     * @verbatim
+       <service uid="subView2" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+           <gui>
+              <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view proportion="0" minWidth="30" />
+                    <view proportion="0" minWidth="50" />
+               </layout>
+           </gui>
+           <registry>
+               <view sid="view1" start="yes" />
+               <view sid="view2" start="yes" />
+           </registry>
+       </service>
+      @endverbatim
+     *  - \<layout type="::fwGui::LineLayoutManager" \> : define a line layout.
+     *  - \<view proportion="0" minWidth="30" /\> : define a new view which can have the following attributes
+     *   - \b orientation {horizontal | vertical} : define if the layout is vertical or horizontal.
+     *   - \b proportion : define if the space allocate in proportion of the proportion factor (bigger it is, more space are used).
+     *   - \b border : define the size of the border in the layout
+     *   - \b caption : define the title to display.
+     *   - \b minWidth  : minimal width of the view.
+     *   - \b minHeight : minimal height of the view.
+     *   - \b visible  {true | yes | false | no} : define if the view is visible or not.
+     */
+
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+    Orientation getOrientation(){ return m_orientation;};
+
+protected:
+
+    std::list< ViewInfo> getViewsInfo(){ return m_views;};
+
+private:
+
+    /// Save layout configuration definition
+    std::list< ViewInfo>  m_views;
+
+    Orientation m_orientation;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_LINELAYOUTMANAGERBASE_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/Namespace.hpp
new file mode 100644
index 0000000..d002115
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUILAYOUTMANAGERNAMESPACE_HPP_
+#define FWGUILAYOUTMANAGERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::layoutManager contains the base interface of managers use to handle the GUI layout available in FW4SPL.
+ * @namespace   fwGui::layoutManager
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace layoutManager
+{
+
+}
+}
+#endif /* FWGUILAYOUTMANAGERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/TabLayoutManagerBase.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/TabLayoutManagerBase.hpp
new file mode 100644
index 0000000..ff0079e
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/TabLayoutManagerBase.hpp
@@ -0,0 +1,112 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/TabLayoutManagerBase.hpp
+ * @brief This file defines the interface of the class for managing a tab layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_TABLAYOUTMANAGERBASE_HPP_
+#define _FWGUI_LAYOUTMANAGER_TABLAYOUTMANAGERBASE_HPP_
+
+#include <list>
+#include <map>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the base for cardinal layout manager.
+ * @class   TabLayoutManagerBase
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API TabLayoutManagerBase : public IViewLayoutManager
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (TabLayoutManagerBase)(::fwGui::layoutManager::IViewLayoutManager) )
+
+     typedef std::string RegistryKeyType;
+
+     class ViewInfo
+     {
+     public :
+
+         ViewInfo() :
+             m_caption(""),
+             m_isSelect(false),
+             m_useScrollBar(false)
+         {}
+
+         std::string  m_caption;
+         bool         m_isSelect;
+         bool         m_useScrollBar;
+     };
+
+    /// Constructor. Do nothing.
+    FWGUI_API TabLayoutManagerBase();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~TabLayoutManagerBase();
+
+    /**
+     * @brief Initialize tab layout manager before the creation of layout.
+     *
+     * Example of configuration with Tab layout.
+     * @verbatim
+       <service uid="subView3" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+           <gui>
+               <layout type="::fwGui::TabLayoutManager" >
+                   <view caption="TabView1" />
+                   <view caption="TabView2" selected="yes" />
+                   <view caption="TabView3"  />
+               </layout>
+           </gui>
+           <registry>
+               <view sid="view1" start="yes" />
+               <view sid="view2" start="yes" />
+               <view sid="view3" start="yes" />
+           </registry>
+       </service>
+       @endverbatim
+     *  - \<layout type="::fwGui::TabLayoutManager" \> : define a tab layout.
+     *  - \<view caption="TabView1" selected="center" /\> : define a new view which can have the following attributes
+     *   - \b caption : name of the view (display on the screen).
+     *   - \b selected  {yes | no}: define if the tab is the current one.
+     */
+
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+    std::list< ViewInfo> getViewsInfo(){ return m_views;};
+
+private:
+
+    /// Save layout configuration definition
+    std::list< ViewInfo>  m_views;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_TABLAYOUTMANAGERBASE_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/layoutManager/ToolboxLayoutManagerBase.hpp b/SrcLib/core/fwGui/include/fwGui/layoutManager/ToolboxLayoutManagerBase.hpp
new file mode 100644
index 0000000..4249b8c
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/layoutManager/ToolboxLayoutManagerBase.hpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/ToolboxLayoutManagerBase.hpp
+ * @brief This file defines the interface of the class for managing a line layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#ifndef _FWGUI_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGERBASE_HPP_
+#define _FWGUI_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGERBASE_HPP_
+
+#include <list>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the base for line layout manager.
+ * @class   ToolboxLayoutManagerBase
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ToolboxLayoutManagerBase : public IViewLayoutManager
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (ToolboxLayoutManagerBase)(::fwGui::layoutManager::IViewLayoutManager) )
+
+     typedef std::string RegistryKeyType;
+
+     class ViewInfo
+     {
+     public :
+
+         ViewInfo() :
+             m_border(0),
+             m_minSize (std::make_pair(-1,-1)),
+             m_caption (""),
+             m_visible (true),
+             m_expanded(false),
+             m_useScrollBar(false)
+         {}
+
+         int                    m_border;
+         std::pair< int, int >  m_minSize;
+         std::string            m_caption;
+         bool                   m_visible;
+         bool                   m_expanded;
+         bool                   m_useScrollBar;
+     };
+
+    /// Constructor. Do nothing.
+    FWGUI_API ToolboxLayoutManagerBase();
+
+    /// Destructor. Do nothing.
+    FWGUI_API virtual ~ToolboxLayoutManagerBase();
+
+    /**
+     * @brief Initialize Line layout manager before the creation of layout.
+     *
+     * Example of configuration with cardinal layout.
+     * @verbatim
+       <service uid="subView2" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+           <gui>
+               <layout type="::fwGui::ToolboxLayoutManager">
+                   <view caption="My view 1" expanded="true" />
+                   <view caption="My view 2" expanded="true" />
+                   <view caption="My view 3" expanded="false" />
+                   <spacer />
+               </layout>
+           </gui>
+           <registry>
+               <view sid="view1" start="yes" />
+               <view sid="view2" start="no" />
+               <view wid="view3WID" />
+           </registry>
+       </service>
+      @endverbatim
+    *  - \<layout type="::fwGui::ToolboxLayoutManager" \> : define a toolbox layout.
+    *  - \<view caption="My view 1" expanded="true" minWidth="30" /\> : define a new view which can have the following attributes
+    *   - \b border : define the size of the border in the layout
+    *   - \b caption : define the title to display.
+    *   - \b minWidth  : minimal width of the view.
+    *   - \b minHeight : minimal height of the view.
+    *   - \b visible  {true | yes | false | no} : define if the view is visible or not.
+    *   - \b expanded  {true | yes | false | no} : define if the view is expanded or not.
+    *   - \b useScrollBar  {true | yes | false | no} : define if the view use scrollbar or not.
+    */
+    FWGUI_API virtual void initialize( ConfigurationType configuration);
+
+    FWGUI_API static const RegistryKeyType REGISTRY_KEY;
+
+protected:
+
+    std::list< ViewInfo> getViewsInfo(){ return m_views;};
+
+private:
+
+    /// Save layout configuration definition
+    std::list< ViewInfo>  m_views;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUI_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGERBASE_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/ActionRegistrar.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/ActionRegistrar.hpp
new file mode 100644
index 0000000..ae465e8
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/ActionRegistrar.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_REGISTRAR_ACTIONREGISTRYMANAGER_HPP_
+#define _FWGUI_REGISTRAR_ACTIONREGISTRYMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+/**
+ * @brief   Defines the action registrar for IHM.
+ * @class   ActionRegistrar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ActionRegistrar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ActionRegistrar)(::fwGui::GuiBaseObject), (( (const std::string&) )), new ActionRegistrar );
+
+    /// Constructor.
+    FWGUI_API ActionRegistrar( const std::string &sid);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~ActionRegistrar();
+
+    /// Method called when the action service is stopping
+    FWGUI_API void actionServiceStopping();
+
+    /// Method called when the action service is starting
+    FWGUI_API void actionServiceStarting();
+
+    /// Method called when the action service is activated or not
+    FWGUI_API void actionServiceSetActive(bool isActive);
+
+    /// Method called when the action service is executable or not
+    FWGUI_API void actionServiceSetExecutable(bool isExecutable);
+
+protected:
+
+    /// Main service ID associate with this ActionRegistrar
+    std::string m_sid;
+};
+
+} // namespace registrar
+} // namespace fwGui
+
+#endif /*_FWGUI_REGISTRAR_ACTIONREGISTRYMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/MenuBarRegistrar.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/MenuBarRegistrar.hpp
new file mode 100644
index 0000000..c95c940
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/MenuBarRegistrar.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_REGISTRAR_MENUBARREGISTRYMANAGER_HPP_
+#define _FWGUI_REGISTRAR_MENUBARREGISTRYMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenuBar.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+/**
+ * @brief   Defines the menuBar registrar for IHM.
+ * @class   MenuBarRegistrar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API MenuBarRegistrar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuBarRegistrar)(::fwGui::GuiBaseObject), (( (const std::string&) )), new MenuBarRegistrar );
+
+    /// Constructor.
+    FWGUI_API MenuBarRegistrar( const std::string &sid);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~MenuBarRegistrar();
+
+    /// Return the parent container
+    FWGUI_API virtual ::fwGui::container::fwMenuBar::sptr getParent();
+
+    /**
+     * @brief Return the fwMenu associated with the menuSid.
+     * @param menuSid sid of the menu service
+     * @param menus  vector containing the fwMenu manages by this registrar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwMenu::sptr getFwMenu(std::string menuSid, std::vector< ::fwGui::container::fwMenu::sptr > menus);
+
+    /**
+     * @brief Initialize registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+      <service uid="menuBar" type="::fwGui::IMenuBarSrv" impl="::gui::aspect::DefaultMenuBarSrv" autoConnect="no" >
+          <gui>
+              <layout>
+                  <menu name="My Menu"/>
+                  <menu name="My Menu 2"/>
+              </layout>
+          </gui>
+          <registry>
+              <menu sid="myMenu" start="yes" />
+              <menu sid="myMenu2" start="yes" />
+          </registry>
+      </service>
+       @endverbatim
+     * This method analyzes the registry section of the configuration.
+     *  - \<menu sid="myMenu" start="yes" /\> : define the service of the menu to add in the menu bar.
+     *   - \b sid  (mandatory): the service identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the service must be started by the menu bar service.
+     */
+
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief Starting menu bar registrar.
+     * All services managed in local menus
+     * and with start="yes" in configuration will be started.
+     * @pre MenuBarRegistrar must be initialized before.
+     * @pre sub menus must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwMenu::sptr > menus );
+
+    /**
+     * @brief Stopping view manager.
+     * All services managed in local menus will be stopped.
+     */
+    FWGUI_API virtual void unmanage();
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::map< std::string, std::pair<unsigned int, bool> > SIDMenuMapType;
+
+    /**
+     * @brief All menu services ID managed and associated with pair containing:
+     * menu's index vector and boolean describing if is started by the manager.
+     */
+    SIDMenuMapType m_menuSids;
+
+    /// Main service ID associate with this MenuBarRegistrar
+    std::string m_sid;
+};
+
+} // namespace registrar
+} // namespace fwGui
+
+#endif /*_FWGUI_REGISTRAR_MENUBARREGISTRYMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/MenuRegistrar.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/MenuRegistrar.hpp
new file mode 100644
index 0000000..aca2b2f
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/MenuRegistrar.hpp
@@ -0,0 +1,165 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_REGISTRAR_MENUREGISTRYMANAGER_HPP_
+#define _FWGUI_REGISTRAR_MENUREGISTRYMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+#include "fwGui/ActionCallbackBase.hpp"
+#include "fwGui/config.hpp"
+
+
+namespace fwGui
+{
+namespace registrar
+{
+
+/**
+ * @brief   Defines the menu registrar for IHM.
+ * @class   MenuRegistrar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API MenuRegistrar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuRegistrar)(::fwGui::GuiBaseObject), (( (const std::string&) )), new MenuRegistrar );
+    typedef std::vector< ::fwGui::IMenuItemCallback::sptr > CallbacksType;
+
+    /// Constructor.
+    FWGUI_API MenuRegistrar( const std::string &sid);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~MenuRegistrar();
+
+    /// Return the parent container
+    FWGUI_API virtual ::fwGui::container::fwMenu::sptr getParent();
+
+    /**
+     * @brief Return the fwMenuItem associated with the actionSid.
+     * @param actionSid sid of the action service
+     * @param menuItems  vector containing the fwMenuItem manages by this registrar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwMenuItem::sptr getFwMenuItem(std::string actionSid, std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems);
+
+    /**
+     * @brief Initialize registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+        <service uid="myMenu" type="::fwGui::IMenuSrv" impl="::gui::aspect::DefaultMenuSrv" autoConnect="no" >
+            <gui>
+                <layout>
+                    <menuItem name="My item 1" shortcut="1" style="check" />
+                    <separator />
+                    <menuItem name="My item 2" shortcut="2" style="radio" />
+                    <menuItem name="My item 3" shortcut="3" style="radio" />
+                    <separator />
+                    <menu name="My menu" />
+                    <separator />
+                    <menuItem name="Quit" shortcut="Ctrl+Q" specialAction="QUIT" />
+                </layout>
+            </gui>
+            <registry>
+                <menuItem sid="item1" start="yes" />
+                <menuItem sid="item2" start="no" />
+                <menuItem sid="item3" start="no" />
+                <menu sid="mymenu" start="yes" />
+                <menuItem sid="actionQuit" start="no" />
+            </registry>
+        </service>
+       @endverbatim
+     * This method analyzes the registry section of the configuration.
+     *  - \<menuItem sid="item1" start="no" /\> : define the service of the menuItem to add in the menu.
+     *   - \b sid  (mandatory): the service identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the service must be started by the menu service.
+     */
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief manages action service associated with menuItem of menu.
+     *
+     * Register the menuItem containers for the associated services. Start the services if start=yes.
+     *
+     * If a menuItem has attribut start="no", the associated action won't be started and the menuItem will be disabled.
+     * If a menuItem has attribut start="yes", two possibilities: \n
+     *  - the associated action has attribut executable="false" then the menuItem will be disabled.\n
+     *  - the associated action has attribut executable="true" then the menuItem will be enabled.\n
+     *
+     * If an action manages by menuItems in a toolbar and/or in the menuBar has its attribut executable="false",
+     * the associated menuItems will be disabled in toolbar and in menuBar.
+     *
+     * @warning If the action is present in different toolbars and menus it must be started only one time.
+     *
+     * @pre MenuRegistrar must be initialized before.
+     * @pre sub menu items must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems );
+
+    /**
+     * @brief manages menu service associated with fwMenu of menu.
+     *
+     * If a menuItem has attribut start="no", the associated menu won't be started.
+     * If a menuItem has attribut start="yes", the associated menu will be started
+     *
+     * @pre MenuRegistrar must be initialized before.
+     * @pre sub menu items must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwMenu::sptr > menus );
+
+    /**
+     * @brief Stopping menu items manager.
+     * All services managed in local menu items will be stopped.
+     */
+    FWGUI_API virtual void unmanage();
+
+    /**
+     * @brief This method is called when an action is clicked.
+     */
+    FWGUI_API virtual void onItemAction();
+
+    /**
+     * @brief Returns callbacks associate with menu items.
+     */
+    virtual CallbacksType getCallbacks(){ return m_callbacks;};
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::map< std::string, std::pair<unsigned int, bool> > SIDMenuMapType;
+
+    /**
+     * @brief All menu services ID (sid) managed is associated with pair containing:
+     * an action's position in the menu and boolean describing if is started by the manager.
+     */
+    SIDMenuMapType m_actionSids;
+
+    /**
+     * @brief All toolBar services ID managed and associated with pair containing:
+     * menu's index vector and boolean describing if is started by the manager.
+     */
+    SIDMenuMapType m_menuSids;
+
+    /// Main service ID associate with this MenuRegistrar
+    std::string m_sid;
+
+    /// Callback associate with menu items
+    CallbacksType m_callbacks;
+};
+
+} // namespace registrar
+} // namespace fwGui
+
+#endif /*_FWGUI_REGISTRAR_MENUREGISTRYMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/Namespace.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/Namespace.hpp
new file mode 100644
index 0000000..ede88fc
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIREGISTRARNAMESPACE_HPP_
+#define FWGUIREGISTRARNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::registrar contains the classes of service management for GUI elements (Menu, View, ToolBar).
+ * @namespace   fwGui::registrar
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace registrar
+{
+
+}
+}
+#endif /* FWGUIREGISTRARNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/ToolBarRegistrar.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/ToolBarRegistrar.hpp
new file mode 100644
index 0000000..8d77d67
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/ToolBarRegistrar.hpp
@@ -0,0 +1,183 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_REGISTRAR_TOOLBARREGISTRYMANAGER_HPP_
+#define _FWGUI_REGISTRAR_TOOLBARREGISTRYMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwToolBar.hpp"
+#include "fwGui/container/fwMenu.hpp"
+#include "fwGui/container/fwMenuItem.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/ActionCallbackBase.hpp"
+#include "fwGui/config.hpp"
+
+
+namespace fwGui
+{
+namespace registrar
+{
+
+/**
+ * @brief   Defines the toolBar registrar for IHM.
+ * @class   ToolBarRegistrar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ToolBarRegistrar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolBarRegistrar)(::fwGui::GuiBaseObject), (( (const std::string&) )), new ToolBarRegistrar );
+    typedef std::vector< ::fwGui::IMenuItemCallback::sptr > CallbacksType;
+
+    /// Constructor.
+    FWGUI_API ToolBarRegistrar( const std::string &sid);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~ToolBarRegistrar();
+
+    /// Return the parent container
+    FWGUI_API virtual ::fwGui::container::fwToolBar::sptr getParent();
+
+    /**
+     * @brief Return the fwMenuItem associated with the actionSid.
+     * @param actionSid sid of the action service
+     * @param menuItems  vector containing the fwMenuItem manages by this registrar.
+     */
+    FWGUI_API virtual ::fwGui::container::fwMenuItem::sptr getFwMenuItem(std::string actionSid, std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems);
+
+    /**
+     * @brief Initialize registry managers.
+     *
+     * Example of configuration
+     * @verbatim
+           <service uid="toolbar2" type="::fwGui::IToolBarSrv" impl="::gui::aspect::DefaultToolBarSrv" autoConnect="no" >
+               <gui>
+                   <layout>
+                       <menuItem name="My item 2" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                       <menuItem name="My item 3" style="radio" icon="Bundles/TutoGui_0-1/icons/system.png"/>
+                       <separator />
+                       <menuItem name="My item A" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                       <menuItem name="My item B" style="radio" icon="Bundles/TutoGui_0-1/icons/monkey.png"/>
+                       <separator />
+                       <menu name="My menu" />
+                       <separator />
+                       <editor />
+                   </layout>
+               </gui>
+               <registry>
+                   <menuItem sid="item2" />
+                   <menuItem sid="item3" />
+                   <menuItem sid="item4" />
+                   <menuItem sid="item5" />
+                   <menu sid="menu" />
+                   <editor sid="editor" />
+               </registry>
+           </service>
+       @endverbatim
+     * This method analyzes the registry section of the configuration.
+     *
+     *  - \<menuItem sid="item2" start="no" /\> : define the service of the menuItem to add in the toolbar.
+     *   - \b sid  (mandatory): the service identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the service must be started by the toolbar service.
+     */
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief manages action service associated with menuItem of toolbar.
+     *
+     * Register the menuItem containers for the associated services. Start the services if start=yes.
+     *
+     * If a menuItem has attribut start="no", the associated action won't be started and the menuItem will be disabled.
+     * If a menuItem has attribut start="yes", two possibilities: \n
+     *  - the associated action has attribut executable="false" then the menuItem will be disabled.\n
+     *  - the associated action has attribut executable="true" then the menuItem will be enabled.\n
+     *
+     * @warning If the action is present in a toolbar and a menu it must be started only one time.
+     * @see ::fwGui::registrar::MenuRegistrar for more information on interaction between menubar and toolbar.
+     *
+     * @pre ToolBarRegistrar must be initialized before.
+     * @pre sub toolBar items must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwMenuItem::sptr > toolBarItems );
+
+    /**
+     * @brief manages menu service associated with item of toolbar.
+     *
+     * Register the menu containers for the associated services. Start the services if start=yes.
+     *
+     * @pre ToolBarRegistrar must be initialized before.
+     * @pre sub toolBar items must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwMenu::sptr > toolBarItems );
+
+    /**
+     * @brief manages editor service associated with item of toolbar.
+     *
+     * Register the containers for the associated services. Start the services if start=yes.
+     *
+     * @pre ToolBarRegistrar must be initialized before.
+     * @pre sub toolBar items must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwContainer::sptr > toolBarItems );
+
+    /**
+     * @brief Stopping toolBar items manager.
+     * All services managed in local toolBar items will be stopped.
+     */
+    FWGUI_API virtual void unmanage();
+
+    /**
+     * @brief This method is called when an action is clicked.
+     */
+    FWGUI_API virtual void onItemAction();
+
+    /**
+     * @brief Returns callbacks associate with toolBar items.
+     */
+    virtual CallbacksType getCallbacks(){ return m_callbacks;};
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::map< std::string, std::pair<unsigned int, bool> > SIDToolBarMapType;
+
+    /**
+     * @brief All toolBar services ID managed and associated with pair containing:
+     * action's index vector and boolean describing if is started by the manager.
+     */
+    SIDToolBarMapType m_actionSids;
+
+    /**
+     * @brief All toolBar services ID managed and associated with pair containing:
+     * menus index vector and boolean describing if is started by the manager.
+     */
+    SIDToolBarMapType m_menuSids;
+
+    /**
+     * @brief All toolBar services ID managed and associated with pair containing:
+     * editors index vector and boolean describing if is started by the manager.
+     */
+    SIDToolBarMapType m_editorSids;
+
+    /// Main service ID associate with this ToolBarRegistrar
+    std::string m_sid;
+
+    /// Callback associate with toolBar items
+    CallbacksType m_callbacks;
+};
+
+} // namespace registrar
+} // namespace fwGui
+
+#endif /*_FWGUI_REGISTRAR_TOOLBARREGISTRYMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registrar/ViewRegistrar.hpp b/SrcLib/core/fwGui/include/fwGui/registrar/ViewRegistrar.hpp
new file mode 100644
index 0000000..537bfe0
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registrar/ViewRegistrar.hpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUI_REGISTRYMANAGER_VIEWREGISTRYMANAGER_HPP_
+#define _FWGUI_REGISTRYMANAGER_VIEWREGISTRYMANAGER_HPP_
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/container/fwToolBar.hpp"
+#include "fwGui/container/fwMenuBar.hpp"
+#include "fwGui/container/fwContainer.hpp"
+#include "fwGui/config.hpp"
+
+
+namespace fwGui
+{
+namespace registrar
+{
+
+/**
+ * @brief   Defines the generic view manager for IHM.
+ * @class   ViewRegistrar
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUI_CLASS_API ViewRegistrar : public ::fwGui::GuiBaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ViewRegistrar)(::fwGui::GuiBaseObject), (( (const std::string&) )), new ViewRegistrar );
+
+    /// Constructor.
+    FWGUI_API ViewRegistrar( const std::string &sid);
+
+    /// Destructor. Do nothing
+    FWGUI_API virtual ~ViewRegistrar();
+
+    FWGUI_API virtual ::fwGui::container::fwContainer::sptr getParent();
+
+    FWGUI_API virtual void setParent(std::string wid);
+
+    /**
+     * @brief Initialize managers.
+     *
+     * Example of configuration
+     * @verbatim
+        <service uid="subView1" type="::gui::view::IView" impl="::gui::view::DefaultView" autoConnect="no" >
+            <gui>
+                <layout type="::fwGui::LineLayoutManager" >
+                    <orientation value="horizontal" />
+                    <view caption="view3" />
+                    <view caption="view4" />
+                    <view caption="view5" />
+                </layout>
+                <toolBar />
+                <menuBar />
+            </gui>
+            <registry>
+                <parent wid="myView" />
+                <toolBar sid="toolbar" start="yes" />
+                <menuBar sid="menubar" start="yes" />
+                <view sid="subView3" start="yes" />
+                <view wid="subView4" />
+                <view wid="subView5" />
+            </registry>
+        </service>
+      @endverbatim
+     * - \<parent wid="myView" /\> : This section isn't mandatory. When the parent section is present, the wid attribute is used to find its parent container.
+     * Otherwise, the service uid is used to find its parent container.
+     * - \<toolBar sid="toolbar1" start="yes" /\> : This section isn't mandatory.
+     *   - \b sid  (mandatory): the tool bar identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the tool bar service must be started by the service.
+     * - \<menuBar sid="menubar1" start="yes" /\> : This section isn't mandatory.
+     *   - \b sid  (mandatory): the menu bar identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the menu bar service must be started by the service.
+     * - \<view sid="subView3" start="yes" /\> : define the service of the view to add in the container.
+     *   - \b sid  (mandatory): the service identifier.
+     *   - \b start = {yes| no} (default value no): indicate if the view service must be started by the service.
+     * - \<view wid="subView4" /\> : reserve a sub container for the view in the parent container with the name "subView4". The service which want to use this sub container
+     *   will have define a parent with \<parent wid="subView4" /\>.
+     *   - \b wid  (mandatory): the window identifier.
+     *
+     * @warning
+     * - The number of view item in the gui section must be equal or greater than in the registry section.
+     * - The order of the view in each section (gui and registry) must be the same.\n
+     *   For example: the view caption "view3" will be connected with the service which have the sid = "subView3" (It could also be a wid).
+     *
+     */
+    FWGUI_API virtual void initialize( ::fwRuntime::ConfigurationElement::sptr configuration);
+
+    /**
+     * @brief Starting view manager.
+     * All services managed in local subViews
+     * and with start="yes" in configuration will be started.
+     * @pre ViewRegistrar must be initialized before.
+     * @pre sub containers must be instanced before.
+     */
+    FWGUI_API virtual void manage(std::vector< ::fwGui::container::fwContainer::sptr > subViews );
+
+    /**
+     * @brief Register menu bar.
+     * If start="yes" in configuration the menu bar services will be started.
+     */
+    FWGUI_API virtual void manageMenuBar(::fwGui::container::fwMenuBar::sptr menuBar );
+
+    /**
+     * @brief Register tool bar.
+     * If start="yes" in configuration the tool bar services will be started.
+     */
+    FWGUI_API virtual void manageToolBar(::fwGui::container::fwToolBar::sptr toolBar );
+
+    /**
+     * @brief Stopping view manager.
+     * All services managed in local subViews will be stopped.
+     */
+    FWGUI_API virtual void unmanage();
+
+    /**
+     * @brief Stopping view manager.
+     * ToolBar service will be stopped.
+     */
+    FWGUI_API virtual void unmanageToolBar();
+
+    /**
+     * @brief Stopping view manager.
+     * MenuBar service will be stopped.
+     */
+    FWGUI_API virtual void unmanageMenuBar();
+
+
+
+protected:
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef std::map< std::string, std::pair<unsigned int, bool> > SIDContainerMapType;
+    typedef std::map< std::string, unsigned int > WIDContainerMapType;
+    typedef std::pair< std::string, bool > SIDMenuBarPairType;
+    typedef std::pair< std::string, bool > SIDToolBarPairType;
+
+    /**
+     * @brief All services ID managed and associated with pair containing:
+     * subViews index vector and boolean describing if is started by the manager.
+     */
+    SIDContainerMapType m_sids;
+
+    /// All windows containers ID managed (and associated with subViews index vector).
+    WIDContainerMapType m_wids;
+
+    /// Menu bar service ID associate with this ViewRegistrar
+    SIDMenuBarPairType m_menuBarSid;
+
+    /// Tool bar service ID associate with this ViewRegistrar
+    SIDToolBarPairType m_toolBarSid;
+
+    std::string m_parentWid;
+    ::fwGui::container::fwContainer::sptr m_parentContainer;
+
+    /// Main service ID associate with this ViewRegistrar
+    std::string m_sid;
+};
+
+} // namespace registrar
+} // namespace fwGui
+
+#endif /*_FWGUI_REGISTRYMANAGER_VIEWREGISTRYMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registry/detail.hpp b/SrcLib/core/fwGui/include/fwGui/registry/detail.hpp
new file mode 100644
index 0000000..1c01fe9
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registry/detail.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_REGISTRY_DETAIL_HPP__
+#define __FWGUI_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwGui/config.hpp"
+
+namespace fwGui
+{
+
+class GuiBaseObject;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwGui::GuiBaseObject) () , KeyType > Type;
+
+FWGUI_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace fwGui
+
+#endif /* __FWGUI_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwGui/include/fwGui/registry/macros.hpp b/SrcLib/core/fwGui/include/fwGui/registry/macros.hpp
new file mode 100644
index 0000000..04f67d2
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registry/macros.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_REGISTRY_MACRO_HPP__
+#define __FWGUI_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/registry/detail.hpp"
+
+namespace fwGui
+{
+namespace registry
+{
+
+#define fwGuiRegisterMacro( GuiClassname, GuiFunctorKey )             \
+    static ::fwGui::GuiBaseObject::Registrar< GuiClassname >          \
+    BOOST_PP_CAT( s__factory__record__, __LINE__) ( GuiFunctorKey );
+
+} // end namespace registry
+} // end namespace fwGui
+
+#endif /*__FWGUI_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/core/fwGui/include/fwGui/registry/namespace.hpp b/SrcLib/core/fwGui/include/fwGui/registry/namespace.hpp
new file mode 100644
index 0000000..96eed52
--- /dev/null
+++ b/SrcLib/core/fwGui/include/fwGui/registry/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUI_REGISTRY_NAMESPACE_HPP__
+#define __FWGUI_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwGui
+{
+
+/**
+ * @brief       Contains fwGui::registry details
+ * @namespace   fwGui::registry
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwGui
+
+#endif /* __FWGUI_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwGui/src/fwGui/ActionCallbackBase.cpp b/SrcLib/core/fwGui/src/fwGui/ActionCallbackBase.cpp
new file mode 100644
index 0000000..12ee48f
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/ActionCallbackBase.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IActionSrv.hpp"
+#include "fwGui/ActionCallbackBase.hpp"
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+const ActionCallbackBase::RegistryKeyType ActionCallbackBase::REGISTRY_KEY =  "::fwGui::ActionCallback";
+
+//-----------------------------------------------------------------------------
+
+ActionCallbackBase::ActionCallbackBase(): m_sid("")
+{}
+
+//-----------------------------------------------------------------------------
+
+ActionCallbackBase::~ActionCallbackBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ActionCallbackBase::setSID(std::string sid)
+{
+    this->m_sid = sid;
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionCallbackBase::execute()
+{
+    OSLM_ASSERT("Service "<<m_sid<<" doesn't exist.", ::fwTools::fwID::exist(m_sid ));
+    ::fwServices::IService::sptr service = ::fwServices::get( m_sid ) ;
+    OSLM_ASSERT("Service "<<m_sid<<" not instanced.", service);
+    service->update();
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionCallbackBase::check(bool checked)
+{
+    OSLM_ASSERT("Service "<<m_sid<<" doesn't exist.", ::fwTools::fwID::exist(m_sid ));
+    ::fwServices::IService::sptr service = ::fwServices::get( m_sid ) ;
+    OSLM_ASSERT("Service "<<m_sid<<" not instanced.", service);
+    ::fwGui::IActionSrv::sptr action = ::fwGui::IActionSrv::dynamicCast(service);
+    OSLM_ASSERT("Service "<<m_sid<<" is not an action.", action);
+    checked = (checked == action->getActiveStateValue());
+    if (action->getIsActive() != checked)
+    {
+        action->setIsActive(checked);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace fwGui
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/Application.cpp b/SrcLib/core/fwGui/src/fwGui/Application.cpp
new file mode 100644
index 0000000..0f4b47e
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/Application.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/Application.hpp"
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+Application::sptr Application::factory()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IApplication::REGISTRY_KEY);
+    static Application::sptr app = ::fwGui::Application::dynamicCast(guiObj);
+    SLM_ASSERT("no implementation of " << ::fwGui::IApplication::REGISTRY_KEY, app );
+    return app;
+}
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/Cursor.cpp b/SrcLib/core/fwGui/src/fwGui/Cursor.cpp
new file mode 100644
index 0000000..cffa8bd
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/Cursor.cpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/Cursor.hpp"
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+Cursor::Cursor()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ICursor::REGISTRY_KEY);
+    m_implementation = ::fwGui::ICursor::dynamicCast(guiObj);
+}
+
+//-----------------------------------------------------------------------------
+
+Cursor::~Cursor()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setCursor( ::fwGui::ICursor::CursorType cursor)
+{
+    if(m_implementation)
+    {
+        m_implementation->setCursor(cursor);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setDefaultCursor()
+{
+    if(m_implementation)
+    {
+        m_implementation->setDefaultCursor();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/GuiRegistry.cpp b/SrcLib/core/fwGui/src/fwGui/GuiRegistry.cpp
new file mode 100644
index 0000000..2b37a17
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/GuiRegistry.cpp
@@ -0,0 +1,415 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IMenuSrv.hpp"
+#include "fwGui/IToolBarSrv.hpp"
+#include "fwGui/GuiRegistry.hpp"
+
+namespace fwGui
+{
+
+GuiRegistry::ContainerMapType       GuiRegistry::m_globalSIDToFwContainer;
+GuiRegistry::ContainerMapType       GuiRegistry::m_globalWIDToFwContainer;
+GuiRegistry::MenuBarMapType         GuiRegistry::m_globalSIDToFwMenuBar;
+GuiRegistry::ToolBarMapType         GuiRegistry::m_globalSIDToFwToolBar;
+GuiRegistry::MenuMapType            GuiRegistry::m_globalSIDToFwMenu;
+GuiRegistry::ActionToParentMapType  GuiRegistry::m_actionSIDToParentSID;
+
+GuiRegistry::GuiRegistry()
+{}
+
+//-----------------------------------------------------------------------------
+
+GuiRegistry::~GuiRegistry()
+{}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerSIDContainer(std::string sid , ::fwGui::container::fwContainer::sptr container)
+{
+    OSLM_ASSERT("Sorry, fwContainer for "<<sid<<" already exists in SID container map.",
+            m_globalSIDToFwContainer.find(sid) == m_globalSIDToFwContainer.end());
+    m_globalSIDToFwContainer[sid] = container;
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterSIDContainer(std::string sid)
+{
+    bool service_exists = ::fwTools::fwID::exist(sid );
+    OSLM_INFO_IF("Service "<<sid <<" not exists.",!service_exists );
+    if(service_exists)
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( sid ) ;
+        OSLM_ASSERT("Service "<<sid<<" must be stopped before unregister container.",service->isStopped());
+    }
+
+    OSLM_ASSERT("Sorry, fwContainer for "<<sid<<" not exists in SID container map.",
+            m_globalSIDToFwContainer.find(sid) != m_globalSIDToFwContainer.end());
+
+    // Removes container in SID container map
+    m_globalSIDToFwContainer.erase(sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr GuiRegistry::getSIDContainer(std::string sid)
+{
+    OSLM_ASSERT("Sorry, fwContainer for "<<sid<<" not exists in SID container map.",
+            m_globalSIDToFwContainer.find(sid) != m_globalSIDToFwContainer.end());
+    // returns container in SID container map
+    return  m_globalSIDToFwContainer[sid];
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerWIDContainer(std::string wid , ::fwGui::container::fwContainer::sptr container)
+{
+    OSLM_ASSERT("Sorry, fwContainer for "<<wid<<" already exists in WID container map.",
+            m_globalWIDToFwContainer.find(wid) == m_globalWIDToFwContainer.end());
+    m_globalWIDToFwContainer[wid] = container;
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterWIDContainer(std::string wid)
+{
+    OSLM_ASSERT("Sorry, fwContainer with wid "<<wid<<" not exists in WID container map.",
+            m_globalWIDToFwContainer.find(wid) != m_globalWIDToFwContainer.end());
+
+    // Removes container in WID container map
+    m_globalWIDToFwContainer.erase(wid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr GuiRegistry::getWIDContainer(std::string wid)
+{
+    OSLM_ASSERT("Sorry, fwContainer for "<<wid<<" not exists in WID container map.",
+            m_globalWIDToFwContainer.find(wid) != m_globalWIDToFwContainer.end());
+    // returns container in WID container map
+    return  m_globalWIDToFwContainer[wid];
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerSIDMenuBar(std::string sid , ::fwGui::container::fwMenuBar::sptr menuBar)
+{
+    OSLM_ASSERT("Sorry, fwMenuBar for "<<sid<<" already exists in SID menuBar map.",
+            m_globalSIDToFwMenuBar.find(sid) == m_globalSIDToFwMenuBar.end());
+    m_globalSIDToFwMenuBar[sid] = menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterSIDMenuBar(std::string sid)
+{
+    bool service_exists = ::fwTools::fwID::exist(sid );
+    OSLM_INFO_IF("Service "<<sid <<" not exists.",!service_exists );
+    if(service_exists)
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( sid ) ;
+        OSLM_ASSERT("Service "<<sid<<" must be stopped before unregister menuBar.",service->isStopped());
+    }
+
+    OSLM_ASSERT("Sorry, fwMenuBar for "<<sid<<" not exists in SID menuBar map.",
+                m_globalSIDToFwMenuBar.find(sid) != m_globalSIDToFwMenuBar.end());
+
+    // Removes container in SID container map
+    m_globalSIDToFwMenuBar.erase(sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenuBar::sptr GuiRegistry::getSIDMenuBar(std::string sid)
+{
+    OSLM_ASSERT("Sorry, fwMenuBar for "<<sid<<" not exists in SID menuBar map.",
+                m_globalSIDToFwMenuBar.find(sid) != m_globalSIDToFwMenuBar.end());
+    // returns container in SID container map
+    return  m_globalSIDToFwMenuBar[sid];
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerSIDToolBar(std::string sid , ::fwGui::container::fwToolBar::sptr toolBar)
+{
+    OSLM_ASSERT("Sorry, fwToolBar for "<<sid<<" already exists in SID toolBar map.",
+            m_globalSIDToFwToolBar.find(sid) == m_globalSIDToFwToolBar.end());
+    m_globalSIDToFwToolBar[sid] = toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterSIDToolBar(std::string sid)
+{
+    bool service_exists = ::fwTools::fwID::exist(sid );
+    OSLM_INFO_IF("Service "<<sid <<" not exists.",!service_exists );
+    if(service_exists)
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( sid ) ;
+        OSLM_ASSERT("Service "<<sid<<" must be stopped before unregister toolBar.",service->isStopped());
+    }
+
+    OSLM_ASSERT("Sorry, fwToolBar for "<<sid<<" not exists in SID toolBar map.",
+                m_globalSIDToFwToolBar.find(sid) != m_globalSIDToFwToolBar.end());
+
+    // Removes container in SID container map
+    m_globalSIDToFwToolBar.erase(sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwToolBar::sptr GuiRegistry::getSIDToolBar(std::string sid)
+{
+    OSLM_ASSERT("Sorry, fwToolBar for "<<sid<<" not exists in SID toolBar map.",
+                m_globalSIDToFwToolBar.find(sid) != m_globalSIDToFwToolBar.end());
+    // returns container in SID container map
+    return  m_globalSIDToFwToolBar[sid];
+}
+
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerSIDMenu(std::string sid , ::fwGui::container::fwMenu::sptr menu)
+{
+    OSLM_ASSERT("Sorry, fwMenu for "<<sid<<" already exists in SID menu map.",
+            m_globalSIDToFwMenu.find(sid) == m_globalSIDToFwMenu.end());
+    m_globalSIDToFwMenu[sid] = menu;
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterSIDMenu(std::string sid)
+{
+    bool service_exists = ::fwTools::fwID::exist(sid );
+    OSLM_INFO_IF("Service "<<sid <<" not exists.",!service_exists );
+    if(service_exists)
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( sid ) ;
+        OSLM_ASSERT("Service "<<sid<<" must be stopped before unregister menu.",service->isStopped());
+    }
+
+    OSLM_ASSERT("Sorry, fwMenu for "<<sid<<" not exists in SID menu map.",
+                m_globalSIDToFwMenu.find(sid) != m_globalSIDToFwMenu.end());
+
+    // Removes container in SID container map
+    m_globalSIDToFwMenu.erase(sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenu::sptr GuiRegistry::getSIDMenu(std::string sid)
+{
+    OSLM_ASSERT("Sorry, fwMenu for "<<sid<<" not exists in SID menu map.",
+                m_globalSIDToFwMenu.find(sid) != m_globalSIDToFwMenu.end());
+    // returns container in SID container map
+    return  m_globalSIDToFwMenu[sid];
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::registerActionSIDToParentSID(std::string actionSid , std::string parentSid)
+{
+    if ( m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end())
+    {
+        // Action already exist in map
+        OSLM_ASSERT("Sorry, action " << actionSid << " already exists for parent " << parentSid,
+                    std::find(m_actionSIDToParentSID[actionSid].begin(), m_actionSIDToParentSID[actionSid].end(), parentSid) == m_actionSIDToParentSID[actionSid].end());
+    }
+    m_actionSIDToParentSID[actionSid].push_back(parentSid);
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::unregisterActionSIDToParentSID(std::string actionSid, std::string parentSid)
+{
+
+    OSLM_ASSERT("Sorry, action for "<<actionSid<<" not exists in SID action map.",
+                    m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end());
+
+    if (m_actionSIDToParentSID[actionSid].size() == 1)
+    {
+        // Action has one parent
+        bool service_exists = ::fwTools::fwID::exist(actionSid );
+        OSLM_INFO_IF("Service "<<actionSid <<" not exists.",!service_exists );
+        if(service_exists)
+        {
+            ::fwServices::IService::sptr service = ::fwServices::get( actionSid ) ;
+            OSLM_WARN_IF("Service "<<actionSid<<" must be stopped before unregister action.",!service->isStopped());
+        }
+        m_actionSIDToParentSID.erase(actionSid);
+    }
+    else
+    {
+        // Action has several parents
+        ParentSidsType::iterator iter = std::find(m_actionSIDToParentSID[actionSid].begin(), m_actionSIDToParentSID[actionSid].end(), parentSid);
+        OSLM_ASSERT("Sorry, action for "<<actionSid<<" has no parent "<< parentSid, iter != m_actionSIDToParentSID[actionSid].end());
+        m_actionSIDToParentSID[actionSid].erase(iter);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::actionServiceStopping(std::string actionSid)
+{
+    //OSLM_ASSERT("Sorry, action for "<<actionSid<<" not exists in SID action map.",
+    //                m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end());
+
+    if( m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end() )
+    {
+        ParentSidsType parentSids = m_actionSIDToParentSID[actionSid];
+
+        BOOST_FOREACH(std::string parentSid, parentSids)
+        {
+            bool service_exists = ::fwTools::fwID::exist(parentSid );
+            OSLM_INFO_IF("Service "<<parentSid <<" not exists.",!service_exists );
+            if(service_exists)
+            {
+                ::fwServices::IService::sptr service = ::fwServices::get( parentSid ) ;
+                ::fwGui::IMenuSrv::sptr menuSrv = ::fwGui::IMenuSrv::dynamicCast(service);
+                ::fwGui::IToolBarSrv::sptr toolbarSrv = ::fwGui::IToolBarSrv::dynamicCast(service);
+                if (menuSrv)
+                {
+                    menuSrv->actionServiceStopping(actionSid);
+                }
+                else if (toolbarSrv)
+                {
+                    toolbarSrv->actionServiceStopping(actionSid);
+                }
+                else
+                {
+                    SLM_FATAL("Unknown service");
+                }
+            }
+        }
+
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::actionServiceStarting(std::string actionSid)
+{
+    //OSLM_ASSERT("Sorry, action for "<<actionSid<<" not exists in SID action map.",
+    //        m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end());
+
+    if( m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end() )
+    {
+        ParentSidsType parentSids = m_actionSIDToParentSID[actionSid];
+
+
+        BOOST_FOREACH(std::string parentSid, parentSids)
+        {
+            bool service_exists = ::fwTools::fwID::exist(parentSid );
+            OSLM_INFO_IF("Service "<<parentSid <<" not exists.",!service_exists );
+            if(service_exists)
+            {
+                ::fwServices::IService::sptr service = ::fwServices::get( parentSid ) ;
+                ::fwGui::IMenuSrv::sptr menuSrv = ::fwGui::IMenuSrv::dynamicCast(service);
+                ::fwGui::IToolBarSrv::sptr toolbarSrv = ::fwGui::IToolBarSrv::dynamicCast(service);
+                if (menuSrv)
+                {
+                    menuSrv->actionServiceStarting(actionSid);
+                }
+                else if (toolbarSrv)
+                {
+                    toolbarSrv->actionServiceStarting(actionSid);
+                }
+                else
+                {
+                    SLM_FATAL("Unknown service");
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::actionServiceSetActive(std::string actionSid, bool isActive)
+{
+    //OSLM_ASSERT("Sorry, action for "<<actionSid<<" not exists in SID action map.",
+    //            m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end());
+
+    if( m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end() )
+    {
+
+
+        ParentSidsType parentSids = m_actionSIDToParentSID[actionSid];
+
+
+        BOOST_FOREACH(std::string parentSid, parentSids)
+        {
+            bool service_exists = ::fwTools::fwID::exist(parentSid );
+            OSLM_INFO_IF("Service "<<parentSid <<" not exists.",!service_exists );
+            if(service_exists)
+            {
+                ::fwServices::IService::sptr service = ::fwServices::get( parentSid ) ;
+                ::fwGui::IMenuSrv::sptr menuSrv = ::fwGui::IMenuSrv::dynamicCast(service);
+                ::fwGui::IToolBarSrv::sptr toolbarSrv = ::fwGui::IToolBarSrv::dynamicCast(service);
+                if (menuSrv)
+                {
+                    menuSrv->actionServiceSetActive(actionSid, isActive);
+                }
+                else if (toolbarSrv)
+                {
+                    toolbarSrv->actionServiceSetActive(actionSid, isActive);
+                }
+                else
+                {
+                    SLM_FATAL("Unknown service");
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void GuiRegistry::actionServiceSetExecutable(std::string actionSid, bool isExecutable)
+{
+    //OSLM_ASSERT("Sorry, action for "<<actionSid<<" not exists in SID action map.",
+    //            m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end());
+
+    if( m_actionSIDToParentSID.find(actionSid) != m_actionSIDToParentSID.end() )
+    {
+
+        ParentSidsType parentSids = m_actionSIDToParentSID[actionSid];
+
+
+        BOOST_FOREACH(std::string parentSid, parentSids)
+        {
+            bool service_exists = ::fwTools::fwID::exist(parentSid );
+            OSLM_INFO_IF("Service "<<parentSid <<" not exists.",!service_exists );
+            if(service_exists)
+            {
+                ::fwServices::IService::sptr service = ::fwServices::get( parentSid ) ;
+                ::fwGui::IMenuSrv::sptr menuSrv = ::fwGui::IMenuSrv::dynamicCast(service);
+                ::fwGui::IToolBarSrv::sptr toolbarSrv = ::fwGui::IToolBarSrv::dynamicCast(service);
+                if (menuSrv)
+                {
+                    menuSrv->actionServiceSetExecutable(actionSid, isExecutable);
+                }
+                else if (toolbarSrv)
+                {
+                    toolbarSrv->actionServiceSetExecutable(actionSid, isExecutable);
+                }
+                else
+                {
+                    SLM_FATAL("Unknown service");
+                }
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IActionSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IActionSrv.cpp
new file mode 100644
index 0000000..4904a28
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IActionSrv.cpp
@@ -0,0 +1,184 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IActionSrv.hpp"
+#include "fwGui/dialog/IMessageDialog.hpp"
+#include "fwGui/dialog/MessageDialog.hpp"
+
+namespace fwGui
+{
+
+IActionSrv::IActionSrv() :
+        m_activeStateValue(true),
+        m_isActive(false),
+        m_isExecutable(true),
+        m_confirmAction(false)
+{}
+
+//-----------------------------------------------------------------------------
+
+IActionSrv::~IActionSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IActionSrv::initialize()
+{
+    m_registrar = ::fwGui::registrar::ActionRegistrar::New(this->getID());
+
+    OSLM_ASSERT("Depreciated tag <name> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("name"));
+    OSLM_ASSERT("Depreciated tag <shortcut> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("shortcut"));
+    OSLM_ASSERT("Depreciated tag <enable> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("enable"));
+    OSLM_ASSERT("Depreciated tag <specialAction> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("specialAction"));
+    OSLM_ASSERT("Depreciated tag <style> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("style"));
+    OSLM_ASSERT("Depreciated tag <state> in "<< this->getID() << " configuration.", ! m_configuration->hasAttribute("state"));
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter ;
+    for( iter = m_configuration->begin() ; iter != m_configuration->end() ; ++iter )
+    {
+        if( (*iter)->getName() == "state" )
+        {
+            ConfigurationType stateCfg = *iter;
+
+            if( stateCfg->hasAttribute("inverse") )
+            {
+                std::string invertState = stateCfg->getExistingAttributeValue("inverse");
+                SLM_ASSERT("Wrong attribute value : must be 'true' or 'false'", (invertState == "true") || (invertState == "false"));
+                m_activeStateValue = !(invertState == "true") ;
+            }
+
+            if( stateCfg->hasAttribute("active") )
+            {
+                std::string isActive = stateCfg->getExistingAttributeValue("active");
+                SLM_ASSERT("Wrong attribute value : must be 'true' or 'false'", (isActive == "true") || (isActive == "false"));
+                m_isActive = (isActive == "true") ;
+            }
+
+            if( stateCfg->hasAttribute("executable") )
+            {
+                std::string isExecutable = stateCfg->getExistingAttributeValue("executable");
+                SLM_ASSERT("Wrong attribute value : must be 'true' or 'false'", (isExecutable == "true") || (isExecutable == "false"));
+                m_isExecutable = (isExecutable == "true") ;
+            }
+        }
+
+        if( (*iter)->getName() == "confirmation" )
+        {
+            ConfigurationType cfg = *iter;
+
+            SLM_ASSERT("Missing attribute 'value'", cfg->hasAttribute("value"));
+            std::string confirm = cfg->getExistingAttributeValue("value");
+            SLM_ASSERT("Wrong attribute value : must be 'true' or 'false'", (confirm == "true") || (confirm == "false"));
+            m_confirmAction = (confirm == "true") ;
+
+            if( cfg->hasAttribute("message") )
+            {
+                m_confirmMessage = cfg->getExistingAttributeValue("message");
+            }
+
+            if( cfg->hasAttribute("defaultbutton") )
+            {
+                m_defaultButton = cfg->getExistingAttributeValue("defaultbutton");
+            }
+
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IActionSrv::actionServiceStopping()
+{
+    this->m_registrar->actionServiceStopping();
+}
+
+//-----------------------------------------------------------------------------
+
+void IActionSrv::actionServiceStarting()
+{
+    this->m_registrar->actionServiceStarting();
+    this->setIsActive(m_isActive);
+}
+
+//-----------------------------------------------------------------------------
+
+void IActionSrv::setIsActive(bool isActive)
+{
+    m_isActive = isActive;
+    this->m_registrar->actionServiceSetActive(m_activeStateValue == isActive);
+}
+
+//-----------------------------------------------------------------------------
+
+bool IActionSrv::getIsActive()
+{
+    return m_isActive;
+}
+
+//-----------------------------------------------------------------------------
+
+void IActionSrv::setIsExecutable(bool isExecutable)
+{
+    m_isExecutable = isExecutable;
+    this->m_registrar->actionServiceSetExecutable(isExecutable);
+}
+
+//-----------------------------------------------------------------------------
+
+bool IActionSrv::getIsExecutable()
+{
+    return m_isExecutable;
+}
+
+//-----------------------------------------------------------------------------
+
+bool IActionSrv::confirmAction()
+{
+    bool actionIsConfirmed = true;
+
+    if (m_confirmAction)
+    {
+        ::fwGui::dialog::MessageDialog dialog;
+        dialog.setTitle("Confirmation");
+        std::stringstream ss;
+        ss << "Do you really want to execute this action ? ";
+        if (!m_confirmMessage.empty())
+        {
+            ss << std::endl << m_confirmMessage;
+        }
+        dialog.setMessage( ss.str() );
+
+        if(m_defaultButton == "yes")
+        {
+            dialog.setDefaultButton( ::fwGui::dialog::IMessageDialog::YES );
+        }
+        else if(m_defaultButton == "no")
+        {
+            dialog.setDefaultButton( ::fwGui::dialog::IMessageDialog::NO );
+        }
+        else if(!m_defaultButton.empty())
+        {
+            SLM_WARN("unknown button: " + m_defaultButton);
+        }
+
+        dialog.setIcon( ::fwGui::dialog::IMessageDialog::QUESTION );
+        dialog.addButton( ::fwGui::dialog::IMessageDialog::YES_NO );
+        ::fwGui::dialog::IMessageDialog::Buttons button = dialog.show();
+
+        actionIsConfirmed = (button == ::fwGui::dialog::IMessageDialog::YES);
+    }
+
+    return actionIsConfirmed;
+}
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IApplication.cpp b/SrcLib/core/fwGui/src/fwGui/IApplication.cpp
new file mode 100644
index 0000000..81d8b6d
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IApplication.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/IApplication.hpp"
+
+namespace fwGui
+{
+
+const IApplication::FactoryRegistryKeyType IApplication::REGISTRY_KEY =  "::fwGui::Application";
+
+//-----------------------------------------------------------------------------
+
+IApplication::IApplication()
+{}
+
+//-----------------------------------------------------------------------------
+
+IApplication::~IApplication()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/ICursor.cpp b/SrcLib/core/fwGui/src/fwGui/ICursor.cpp
new file mode 100644
index 0000000..80749e8
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/ICursor.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/ICursor.hpp"
+
+namespace fwGui
+{
+
+const ICursor::FactoryRegistryKeyType ICursor::REGISTRY_KEY =  "::fwGui::Cursor";
+
+//-----------------------------------------------------------------------------
+
+ICursor::ICursor()
+{}
+
+//-----------------------------------------------------------------------------
+
+ICursor::~ICursor()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/IFrameSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IFrameSrv.cpp
new file mode 100644
index 0000000..ab81c25
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IFrameSrv.cpp
@@ -0,0 +1,239 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "fwGui/Application.hpp"
+#include "fwGui/IFrameSrv.hpp"
+
+namespace fwGui
+{
+
+const std::string IFrameSrv::CLOSE_POLICY_EXIT   = "exit";
+const std::string IFrameSrv::CLOSE_POLICY_NOTIFY = "notify";
+
+::fwGui::container::fwContainer::wptr  IFrameSrv::m_progressWidget = ::boost::weak_ptr< ::fwGui::container::fwContainer >();
+
+IFrameSrv::IFrameSrv() :
+        m_hasMenuBar(false),
+        m_hasToolBar(false),
+        m_closePolicy("exit")
+{}
+
+//-----------------------------------------------------------------------------
+
+IFrameSrv::~IFrameSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::initialize()
+{
+    // find gui configuration
+    std::vector < ConfigurationType > vectGui = m_configuration->find("gui");
+    std::vector < ConfigurationType > vectWindow = m_configuration->find("window");
+
+    if(!vectGui.empty())
+    {
+        // find LayoutManager configuration
+        std::vector < ConfigurationType > vectLayoutMng = vectGui.at(0)->find("frame");
+        SLM_ASSERT("<frame> xml element must exist", !vectLayoutMng.empty());
+        m_frameConfig = vectLayoutMng.at(0);
+        this->initializeLayoutManager(m_frameConfig);
+
+        // find menuBarBuilder configuration
+        std::vector < ConfigurationType > vectMBBuilder = vectGui.at(0)->find("menuBar");
+        if(!vectMBBuilder.empty())
+        {
+            m_menuBarConfig = vectMBBuilder.at(0);
+            this->initializeMenuBarBuilder(m_menuBarConfig);
+
+            m_hasMenuBar = true;
+        }
+
+        // find toolBarBuilder configuration
+        std::vector < ConfigurationType > vectTBBuilder = vectGui.at(0)->find("toolBar");
+        if(!vectTBBuilder.empty())
+        {
+            m_toolBarConfig = vectTBBuilder.at(0);
+            this->initializeToolBarBuilder(m_toolBarConfig);
+
+            m_hasToolBar = true;
+        }
+    }
+
+    if(!vectWindow.empty())
+    {
+        ConfigurationType window = vectWindow.at(0);
+        std::string onclose = window->getAttributeValue("onclose");
+        if ( !onclose.empty() )
+        {
+            m_closePolicy = onclose;
+        }
+        SLM_ASSERT("Invalid onclose value : " << m_closePolicy << ". Should be 'exit' or 'notify'", m_closePolicy == CLOSE_POLICY_NOTIFY || m_closePolicy == CLOSE_POLICY_EXIT);
+    }
+
+    m_viewRegistrar = ::fwGui::registrar::ViewRegistrar::New(this->getID());
+    // find ViewRegistryManager configuration
+    std::vector < ConfigurationType > vectRegistrar = m_configuration->find("registry");
+    if(!vectRegistrar.empty())
+    {
+        m_registrarConfig = vectRegistrar.at(0);
+        m_viewRegistrar->initialize(m_registrarConfig);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::create()
+{
+    SLM_ASSERT("FrameLayoutManager must be initialized.",m_frameLayoutManager);
+    m_frameLayoutManager->createFrame();
+    ::fwGui::container::fwContainer::sptr frame = m_frameLayoutManager->getFrame();
+    if ( m_progressWidget.expired() )
+    {
+        m_progressWidget = frame;
+    }
+
+    ::fwGui::container::fwContainer::sptr container = m_frameLayoutManager->getContainer();
+    std::vector< ::fwGui::container::fwContainer::sptr > subViews;
+    subViews.push_back(container);
+    m_viewRegistrar->manage(subViews);
+
+    ::fwGui::layoutManager::IFrameLayoutManager::CloseCallback fct;
+
+     if (m_closePolicy == CLOSE_POLICY_EXIT)
+    {
+         fct = ::boost::bind( &::fwGui::IFrameSrv::onCloseExit, this);
+    }
+    else if (m_closePolicy == CLOSE_POLICY_NOTIFY)
+    {
+        fct = ::boost::bind( &::fwGui::IFrameSrv::onCloseNotify, this);
+    }
+
+    m_frameLayoutManager->setCloseCallback(fct);
+
+    if (m_hasMenuBar)
+    {
+        m_menuBarBuilder->createMenuBar(frame);
+        m_viewRegistrar->manageMenuBar(m_menuBarBuilder->getMenuBar());
+    }
+
+    if (m_hasToolBar)
+    {
+        m_toolBarBuilder->createToolBar(frame);
+        m_viewRegistrar->manageToolBar(m_toolBarBuilder->getToolBar());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::destroy()
+{
+    SLM_ASSERT("ViewRegistrar must be initialized.",m_viewRegistrar);
+
+    if (m_hasToolBar)
+    {
+        m_viewRegistrar->unmanageToolBar();
+        SLM_ASSERT("ToolBarBuilder must be initialized.",m_toolBarBuilder);
+        m_toolBarBuilder->destroyToolBar();
+    }
+
+    if (m_hasMenuBar)
+    {
+        m_viewRegistrar->unmanageMenuBar();
+        SLM_ASSERT("MenuBarBuilder must be initialized.",m_menuBarBuilder);
+        m_menuBarBuilder->destroyMenuBar();
+    }
+
+    m_viewRegistrar->unmanage();
+    SLM_ASSERT("FrameLayoutManager must be initialized.",m_frameLayoutManager);
+    m_frameLayoutManager->destroyFrame();
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::initializeLayoutManager(ConfigurationType frameConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<frameConfig->getName()<< ", must be frame",
+            frameConfig->getName() == "frame");
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(
+                                                 ::fwGui::layoutManager::IFrameLayoutManager::REGISTRY_KEY);
+    m_frameLayoutManager = ::fwGui::layoutManager::IFrameLayoutManager::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::layoutManager::IFrameLayoutManager::REGISTRY_KEY,
+                m_frameLayoutManager);
+
+    m_frameLayoutManager->initialize(frameConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::initializeMenuBarBuilder(ConfigurationType menuBarConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<menuBarConfig->getName()<< ", must be menuBar",
+                menuBarConfig->getName() == "menuBar");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(::fwGui::builder::IMenuBarBuilder::REGISTRY_KEY);
+    m_menuBarBuilder = ::fwGui::builder::IMenuBarBuilder::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::builder::IMenuBarBuilder::REGISTRY_KEY,
+                m_menuBarBuilder);
+
+    m_menuBarBuilder->initialize(menuBarConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::initializeToolBarBuilder(ConfigurationType toolBarConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<toolBarConfig->getName()<< ", must be toolBar",
+                toolBarConfig->getName() == "toolBar");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(::fwGui::builder::IToolBarBuilder::REGISTRY_KEY);
+    m_toolBarBuilder = ::fwGui::builder::IToolBarBuilder::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::builder::IToolBarBuilder::REGISTRY_KEY,
+                m_toolBarBuilder);
+
+    m_toolBarBuilder->initialize(toolBarConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::onCloseExit()
+{
+    SLM_TRACE_FUNC();
+    ::fwGui::Application::New()->exit(0);
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameSrv::onCloseNotify()
+{
+    SLM_TRACE_FUNC();
+    ::fwServices::ObjectMsg::sptr objectMsg = ::fwServices::ObjectMsg::New();
+    ::fwData::Object::sptr srvObj = this->getObject();
+    objectMsg->addEvent( "WINDOW_CLOSED" );
+    ::fwServices::IEditionService::notify(this->getSptr(), srvObj, objectMsg);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr IFrameSrv::getProgressWidget()
+{
+    return m_progressWidget.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IGuiContainerSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IGuiContainerSrv.cpp
new file mode 100644
index 0000000..efc63b5
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IGuiContainerSrv.cpp
@@ -0,0 +1,175 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IGuiContainerSrv.hpp"
+
+namespace fwGui
+{
+
+IGuiContainerSrv::IGuiContainerSrv()
+    : m_viewLayoutManagerIsCreated (false),
+      m_hasToolBar(false)
+{}
+
+//-----------------------------------------------------------------------------
+
+IGuiContainerSrv::~IGuiContainerSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::initialize()
+{
+    SLM_ASSERT("Service hasn't configuration", m_configuration);
+
+    // Create view registrar
+    m_viewRegistrar = ::fwGui::registrar::ViewRegistrar::New( this->getID() );
+    // find ViewRegistrar configuration
+    std::vector < ConfigurationType > vectViewMng = m_configuration->find("registry");
+    if ( ! vectViewMng.empty() )
+    {
+        m_viewRegistrarConfig = vectViewMng.at(0);
+        m_viewRegistrar->initialize(m_viewRegistrarConfig);
+    }
+
+    // Create initializeLayoutManager
+    // find gui configuration
+    std::vector < ConfigurationType > vectGui = m_configuration->find("gui");
+    if( ! vectGui.empty() )
+    {
+        SLM_ASSERT("Sorry, no <registry> tag is allowed in <gui> section", vectGui.at(0)->find("registry").empty());
+
+        // find view LayoutManager configuration
+        std::vector < ConfigurationType > vectLayoutMng = vectGui.at(0)->find("layout");
+        if( ! vectLayoutMng.empty() )
+        {
+            m_viewLayoutConfig = vectLayoutMng.at(0);
+            this->initializeLayoutManager( m_viewLayoutConfig );
+            m_viewLayoutManagerIsCreated = true;
+        }
+
+        // find toolBarBuilder configuration
+        std::vector < ConfigurationType > vectTBBuilder = vectGui.at(0)->find("toolBar");
+        if(!vectTBBuilder.empty())
+        {
+            m_toolBarConfig = vectTBBuilder.at(0);
+            this->initializeToolBarBuilder(m_toolBarConfig);
+
+            m_hasToolBar = true;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::create()
+{
+    SLM_ASSERT("ViewRegistrar must be initialized.", m_viewRegistrar);
+    ::fwGui::container::fwContainer::sptr parent = m_viewRegistrar->getParent();
+    SLM_ASSERT("Parent container is unknown.", parent);
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(::fwGui::builder::IContainerBuilder::REGISTRY_KEY);
+    m_containerBuilder = ::fwGui::builder::IContainerBuilder::dynamicCast(guiObj);
+
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::builder::IContainerBuilder::REGISTRY_KEY,
+                m_containerBuilder);
+    m_containerBuilder->createContainer(parent);
+
+    ::fwGui::container::fwContainer::sptr container = m_containerBuilder->getContainer();
+
+    if ( m_viewLayoutManagerIsCreated )
+    {
+        if (m_hasToolBar)
+        {
+            m_toolBarBuilder->createToolBar(parent);
+            m_viewRegistrar->manageToolBar(m_toolBarBuilder->getToolBar());
+        }
+
+        m_viewLayoutManager->createLayout(container);
+        m_viewRegistrar->manage(m_viewLayoutManager->getSubViews());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::destroy()
+{
+    SLM_ASSERT("ViewRegistrar must be initialized.", m_viewRegistrar);
+
+    if ( m_viewLayoutManagerIsCreated )
+    {
+        if (m_hasToolBar)
+        {
+            m_viewRegistrar->unmanageToolBar();
+            SLM_ASSERT("ToolBarBuilder must be initialized.", m_toolBarBuilder);
+            m_toolBarBuilder->destroyToolBar();
+        }
+
+        m_viewRegistrar->unmanage();
+        SLM_ASSERT("ViewLayoutManager must be initialized.", m_viewLayoutManager);
+        m_viewLayoutManager->destroyLayout();
+    }
+
+    m_containerBuilder->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::initializeLayoutManager(ConfigurationType layoutConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<layoutConfig->getName()<< ", must be layout",
+            layoutConfig->getName() == "layout");
+    SLM_ASSERT("<layout> tag must have type attribute", layoutConfig->hasAttribute("type"));
+    const std::string layoutManagerClassName = layoutConfig->getAttributeValue("type");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(layoutManagerClassName);
+    m_viewLayoutManager = ::fwGui::layoutManager::IViewLayoutManager::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< layoutManagerClassName, m_viewLayoutManager);
+
+    m_viewLayoutManager->initialize(layoutConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::initializeToolBarBuilder(ConfigurationType toolBarConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<toolBarConfig->getName()<< ", must be toolBar",
+                toolBarConfig->getName() == "toolBar");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(::fwGui::builder::IToolBarBuilder::REGISTRY_KEY);
+    m_toolBarBuilder = ::fwGui::builder::IToolBarBuilder::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::builder::IToolBarBuilder::REGISTRY_KEY,
+                m_toolBarBuilder);
+
+    m_toolBarBuilder->initialize(toolBarConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr IGuiContainerSrv::getContainer()
+{
+    return m_containerBuilder->getContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+void IGuiContainerSrv::setParent(std::string wid)
+{
+    m_viewRegistrar->setParent(wid);
+    ::fwGui::container::fwContainer::sptr parent = m_viewRegistrar->getParent();
+    SLM_ASSERT("Parent container is unknown.", parent);
+    m_containerBuilder->setParent(parent);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IMenuBarSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IMenuBarSrv.cpp
new file mode 100644
index 0000000..47ef7e1
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IMenuBarSrv.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IMenuBarSrv.hpp"
+
+namespace fwGui
+{
+
+IMenuBarSrv::IMenuBarSrv() : m_hideMenus(false)
+{}
+
+//-----------------------------------------------------------------------------
+
+IMenuBarSrv::~IMenuBarSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::initialize()
+{
+
+        m_registrar = ::fwGui::registrar::MenuBarRegistrar::New(this->getID());
+        // find ViewRegistryManager configuration
+        std::vector < ConfigurationType > vectRegistrar = m_configuration->find("registry");
+        SLM_ASSERT("Registry section is mandatory.", !vectRegistrar.empty() );
+
+        if(!vectRegistrar.empty())
+        {
+            m_registrarConfig = vectRegistrar.at(0);
+            m_registrar->initialize(m_registrarConfig);
+        }
+
+        // find gui configuration
+        std::vector < ConfigurationType > vectGui = m_configuration->find("gui");
+        SLM_ASSERT("Gui section is mandatory.", !vectGui.empty() );
+
+        if(!vectGui.empty())
+        {
+            // find LayoutManager configuration
+            std::vector < ConfigurationType > vectLayoutMng = vectGui.at(0)->find("layout");
+            SLM_ASSERT("layout section is mandatory.", !vectLayoutMng.empty() );
+            if(!vectLayoutMng.empty())
+            {
+                m_layoutConfig = vectLayoutMng.at(0);
+                this->initializeLayoutManager(m_layoutConfig);
+            }
+        }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::create()
+{
+    ::fwGui::container::fwMenuBar::sptr menuBar = m_registrar->getParent();
+    SLM_ASSERT("Parent menuBar is unknown.", menuBar);
+    m_layoutManager->createLayout(menuBar);
+
+    m_registrar->manage(m_layoutManager->getMenus());
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::destroy()
+{
+    m_registrar->unmanage();
+    m_layoutManager->destroyLayout();
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::menuServiceStopping(std::string menuSrvSID)
+{
+    ::fwGui::container::fwMenu::sptr menu = m_registrar->getFwMenu(menuSrvSID, m_layoutManager->getMenus());
+
+    if (m_hideMenus)
+    {
+        m_layoutManager->menuIsVisible(menu, false);
+    }
+    else
+    {
+        m_layoutManager->menuIsEnabled(menu, false);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::menuServiceStarting(std::string menuSrvSID)
+{
+    ::fwGui::container::fwMenu::sptr menu = m_registrar->getFwMenu(menuSrvSID, m_layoutManager->getMenus());
+
+    if (m_hideMenus)
+    {
+        m_layoutManager->menuIsVisible(menu, true);
+    }
+    else
+    {
+        m_layoutManager->menuIsEnabled(menu, true);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarSrv::initializeLayoutManager(ConfigurationType layoutConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<layoutConfig->getName()<< ", must be layout",
+            layoutConfig->getName() == "layout");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(
+                                                 ::fwGui::layoutManager::IMenuBarLayoutManager::REGISTRY_KEY);
+    m_layoutManager = ::fwGui::layoutManager::IMenuBarLayoutManager::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::layoutManager::IMenuBarLayoutManager::REGISTRY_KEY, m_layoutManager);
+
+    m_layoutManager->initialize(layoutConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IMenuSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IMenuSrv.cpp
new file mode 100644
index 0000000..15a3d9c
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IMenuSrv.cpp
@@ -0,0 +1,155 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IMenuItemCallback.hpp"
+#include "fwGui/IActionSrv.hpp"
+#include "fwGui/IMenuSrv.hpp"
+
+namespace fwGui
+{
+
+IMenuSrv::IMenuSrv() : m_hideActions (false)
+{}
+
+//-----------------------------------------------------------------------------
+
+IMenuSrv::~IMenuSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::initialize()
+{
+    m_registrar = ::fwGui::registrar::MenuRegistrar::New(this->getID());
+    // find ViewRegistryManager configuration
+    std::vector < ConfigurationType > vectRegistrar = m_configuration->find("registry");
+    SLM_ASSERT("Registry section is mandatory.", !vectRegistrar.empty() );
+
+    if(!vectRegistrar.empty())
+    {
+        m_registrarConfig = vectRegistrar.at(0);
+        m_registrar->initialize(m_registrarConfig);
+    }
+
+    // find gui configuration
+    std::vector < ConfigurationType > vectGui = m_configuration->find("gui");
+    SLM_ASSERT("Gui section is mandatory.", !vectGui.empty() );
+    if(!vectGui.empty())
+    {
+        // find LayoutManager configuration
+        std::vector < ConfigurationType > vectLayoutMng = vectGui.at(0)->find("layout");
+        SLM_ASSERT("Layout section is mandatory.", !vectLayoutMng.empty() );
+        if(!vectLayoutMng.empty())
+        {
+            m_layoutConfig = vectLayoutMng.at(0);
+            this->initializeLayoutManager(m_layoutConfig);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::create()
+{
+    ::fwGui::container::fwMenu::sptr menu = m_registrar->getParent();
+    std::vector< ::fwGui::IMenuItemCallback::sptr > callbacks = m_registrar->getCallbacks();
+
+    SLM_ASSERT("Parent menu is unknown.", menu);
+    m_layoutManager->setCallbacks(callbacks);
+    m_layoutManager->createLayout(menu);
+
+    m_registrar->manage(m_layoutManager->getMenuItems());
+    m_registrar->manage(m_layoutManager->getMenus());
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::destroy()
+{
+    m_registrar->unmanage();
+    m_layoutManager->destroyLayout();
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::actionServiceStopping(std::string actionSrvSID)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    if (m_hideActions)
+    {
+        m_layoutManager->menuItemSetVisible(menuItem, false);
+    }
+    else
+    {
+        m_layoutManager->menuItemSetEnabled(menuItem, false);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::actionServiceStarting(std::string actionSrvSID)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    if (m_hideActions)
+    {
+        m_layoutManager->menuItemSetVisible(menuItem, true);
+    }
+    else
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( actionSrvSID ) ;
+        ::fwGui::IActionSrv::sptr actionSrv = ::fwGui::IActionSrv::dynamicCast(service);
+        m_layoutManager->menuItemSetEnabled(menuItem, actionSrv->getIsExecutable());
+        m_layoutManager->menuItemSetChecked(menuItem, actionSrv->getIsActive());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::actionServiceSetActive(std::string actionSrvSID, bool isActive)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    m_layoutManager->menuItemSetChecked(menuItem, isActive);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::actionServiceSetExecutable(std::string actionSrvSID, bool isExecutable)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    m_layoutManager->menuItemSetEnabled(menuItem, isExecutable);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuSrv::initializeLayoutManager(ConfigurationType layoutConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<layoutConfig->getName()<< ", must be layout",
+            layoutConfig->getName() == "layout");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(
+                                                 ::fwGui::layoutManager::IMenuLayoutManager::REGISTRY_KEY);
+    m_layoutManager = ::fwGui::layoutManager::IMenuLayoutManager::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::layoutManager::IMenuLayoutManager::REGISTRY_KEY,
+                m_layoutManager);
+
+    m_layoutManager->initialize(layoutConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/IToolBarSrv.cpp b/SrcLib/core/fwGui/src/fwGui/IToolBarSrv.cpp
new file mode 100644
index 0000000..f1f0f62
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/IToolBarSrv.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/IMenuItemCallback.hpp"
+#include "fwGui/IToolBarSrv.hpp"
+#include "fwGui/IActionSrv.hpp"
+
+namespace fwGui
+{
+
+IToolBarSrv::IToolBarSrv() : m_hideActions (false)
+{}
+
+//-----------------------------------------------------------------------------
+
+IToolBarSrv::~IToolBarSrv()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::initialize()
+{
+    m_registrar = ::fwGui::registrar::ToolBarRegistrar::New(this->getID());
+    // find ViewRegistryManager configuration
+    std::vector < ConfigurationType > vectRegistrar = m_configuration->find("registry");
+    SLM_ASSERT("Registry section is mandatory.", !vectRegistrar.empty() );
+
+    if(!vectRegistrar.empty())
+    {
+        m_registrarConfig = vectRegistrar.at(0);
+        m_registrar->initialize(m_registrarConfig);
+    }
+
+    // find gui configuration
+    std::vector < ConfigurationType > vectGui = m_configuration->find("gui");
+    SLM_ASSERT("Gui section is mandatory.", !vectGui.empty() );
+
+    if(!vectGui.empty())
+    {
+        // find LayoutManager configuration
+        std::vector < ConfigurationType > vectLayoutMng = vectGui.at(0)->find("layout");
+        SLM_ASSERT("layout section is mandatory.", !vectLayoutMng.empty() );
+
+        if(!vectLayoutMng.empty())
+        {
+            m_layoutConfig = vectLayoutMng.at(0);
+            this->initializeLayoutManager(m_layoutConfig);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::create()
+{
+    ::fwGui::container::fwToolBar::sptr toolBar = m_registrar->getParent();
+    std::vector< ::fwGui::IMenuItemCallback::sptr > callbacks = m_registrar->getCallbacks();
+
+    SLM_ASSERT("Parent toolBar is unknown.", toolBar);
+    m_layoutManager->setCallbacks(callbacks);
+    m_layoutManager->createLayout(toolBar);
+
+    m_registrar->manage(m_layoutManager->getMenuItems());
+    m_registrar->manage(m_layoutManager->getMenus());
+    m_registrar->manage(m_layoutManager->getContainers());
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::destroy()
+{
+    m_registrar->unmanage();
+    m_layoutManager->destroyLayout();
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::actionServiceStopping(std::string actionSrvSID)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    if (m_hideActions)
+    {
+        m_layoutManager->menuItemSetVisible(menuItem, false);
+    }
+    else
+    {
+        m_layoutManager->menuItemSetEnabled(menuItem, false);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::actionServiceStarting(std::string actionSrvSID)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    if (m_hideActions)
+    {
+        m_layoutManager->menuItemSetVisible(menuItem, true);
+    }
+    else
+    {
+        ::fwServices::IService::sptr service = ::fwServices::get( actionSrvSID ) ;
+        ::fwGui::IActionSrv::sptr actionSrv = ::fwGui::IActionSrv::dynamicCast(service);
+        m_layoutManager->menuItemSetEnabled(menuItem, actionSrv->getIsExecutable());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::actionServiceSetActive(std::string actionSrvSID, bool isActive)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    m_layoutManager->menuItemSetChecked(menuItem, isActive);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::actionServiceSetExecutable(std::string actionSrvSID, bool isExecutable)
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem = m_registrar->getFwMenuItem(actionSrvSID, m_layoutManager->getMenuItems());
+
+    m_layoutManager->menuItemSetEnabled(menuItem, isExecutable);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarSrv::initializeLayoutManager(ConfigurationType layoutConfig)
+{
+    OSLM_ASSERT("Bad configuration name "<<layoutConfig->getName()<< ", must be layout",
+            layoutConfig->getName() == "layout");
+
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(
+                                                 ::fwGui::layoutManager::IToolBarLayoutManager::REGISTRY_KEY);
+    m_layoutManager = ::fwGui::layoutManager::IToolBarLayoutManager::dynamicCast(guiObj);
+    OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::layoutManager::IToolBarLayoutManager::REGISTRY_KEY, m_layoutManager);
+
+    m_layoutManager->initialize(layoutConfig);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/builder/IContainerBuilder.cpp b/SrcLib/core/fwGui/src/fwGui/builder/IContainerBuilder.cpp
new file mode 100644
index 0000000..478053e
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/builder/IContainerBuilder.cpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/builder/IContainerBuilder.cpp
+ * @brief This file defines the implementation of the interface class  for the menubar builder.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+
+#include "fwGui/builder/IContainerBuilder.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+const IContainerBuilder::RegistryKeyType IContainerBuilder::REGISTRY_KEY = "::fwGui::ContainerBuilder";
+
+//-----------------------------------------------------------------------------
+
+IContainerBuilder::IContainerBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+IContainerBuilder::~IContainerBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IContainerBuilder::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr IContainerBuilder::getContainer()
+{
+    return this->m_container;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/builder/IMenuBarBuilder.cpp b/SrcLib/core/fwGui/src/fwGui/builder/IMenuBarBuilder.cpp
new file mode 100644
index 0000000..ba032fd
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/builder/IMenuBarBuilder.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/builder/IMenuBarBuilder.cpp
+ * @brief This file defines the implementation of the interface class  for the menubar builder.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+
+#include "fwGui/builder/IMenuBarBuilder.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+const IMenuBarBuilder::RegistryKeyType IMenuBarBuilder::REGISTRY_KEY = "::fwGui::MenuBarBuilder";
+
+//-----------------------------------------------------------------------------
+
+IMenuBarBuilder::IMenuBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+IMenuBarBuilder::~IMenuBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarBuilder::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenuBar::sptr IMenuBarBuilder::getMenuBar()
+{
+    return this->m_menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/builder/IToolBarBuilder.cpp b/SrcLib/core/fwGui/src/fwGui/builder/IToolBarBuilder.cpp
new file mode 100644
index 0000000..b76bf55
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/builder/IToolBarBuilder.cpp
@@ -0,0 +1,102 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/builder/IToolBarBuilder.cpp
+ * @brief This file defines the implementation of the interface class  for the toolbar builder.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "fwGui/builder/IToolBarBuilder.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+const IToolBarBuilder::RegistryKeyType IToolBarBuilder::REGISTRY_KEY = "::fwGui::ToolBarBuilder";
+
+//-----------------------------------------------------------------------------
+
+IToolBarBuilder::IToolBarBuilder(): m_aligment(TOP)
+{
+    m_toolBitmapSize = std::make_pair(32, 32);
+}
+
+//-----------------------------------------------------------------------------
+
+IToolBarBuilder::~IToolBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarBuilder::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be toolBar",
+                configuration->getName() == "toolBar");
+
+
+    if (configuration->hasAttribute("align"))
+    {
+        std::string aligment = configuration->getExistingAttributeValue("align");
+        if (aligment == "top")
+        {
+            m_aligment = TOP;
+        }
+        else  if (aligment == "bottom")
+        {
+            m_aligment = BOTTOM;
+        }
+        else  if (aligment == "right")
+        {
+            m_aligment = RIGHT;
+        }
+        else  if (aligment == "left")
+        {
+            m_aligment = LEFT;
+        }
+        else
+        {
+            OSLM_FATAL("Wrong value '"<< aligment <<"' for 'align' attribute (require top, bottom, right or left)");
+        }
+    }
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter ;
+    for( iter = configuration->begin() ; iter != configuration->end() ; ++iter )
+    {
+        if( (*iter)->getName() == "toolBitmapSize" )
+        {
+            if((*iter)->hasAttribute("height"))
+            {
+                m_toolBitmapSize.second = ::boost::lexical_cast< int > ((*iter)->getExistingAttributeValue("height"));
+            }
+            if((*iter)->hasAttribute("width"))
+            {
+                m_toolBitmapSize.first = ::boost::lexical_cast< int > ((*iter)->getExistingAttributeValue("width"));
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwToolBar::sptr IToolBarBuilder::getToolBar()
+{
+    return this->m_toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/container/fwContainer.cpp b/SrcLib/core/fwGui/src/fwGui/container/fwContainer.cpp
new file mode 100644
index 0000000..6e16b53
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/container/fwContainer.cpp
@@ -0,0 +1,16 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/container/fwContainer.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+
+}
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/container/fwMenu.cpp b/SrcLib/core/fwGui/src/fwGui/container/fwMenu.cpp
new file mode 100644
index 0000000..5e237bc
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/container/fwMenu.cpp
@@ -0,0 +1,16 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/container/fwMenu.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+
+}
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/container/fwMenuBar.cpp b/SrcLib/core/fwGui/src/fwGui/container/fwMenuBar.cpp
new file mode 100644
index 0000000..32eeaf9
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/container/fwMenuBar.cpp
@@ -0,0 +1,16 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/container/fwMenuBar.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+
+}
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/container/fwMenuItem.cpp b/SrcLib/core/fwGui/src/fwGui/container/fwMenuItem.cpp
new file mode 100644
index 0000000..054a5a7
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/container/fwMenuItem.cpp
@@ -0,0 +1,16 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/container/fwMenuItem.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+
+}
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/container/fwToolBar.cpp b/SrcLib/core/fwGui/src/fwGui/container/fwToolBar.cpp
new file mode 100644
index 0000000..7e0d363
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/container/fwToolBar.cpp
@@ -0,0 +1,16 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/container/fwToolBar.hpp"
+
+namespace fwGui
+{
+namespace container
+{
+
+}
+}
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/IInputDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/IInputDialog.cpp
new file mode 100644
index 0000000..9e64737
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/IInputDialog.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/IInputDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+const IInputDialog::FactoryRegistryKeyType IInputDialog::REGISTRY_KEY =  "::fwGui::dialog::InputDialog";
+
+IInputDialog::IInputDialog()
+{}
+
+
+IInputDialog::~IInputDialog()
+{}
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/ILocationDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/ILocationDialog.cpp
new file mode 100644
index 0000000..4296dc1
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/ILocationDialog.cpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/IService.hpp>
+
+#include "fwGui/dialog/ILocationDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+
+const ILocationDialog::FactoryRegistryKeyType ILocationDialog::REGISTRY_KEY =  "::fwGui::dialog::LocationDialog";
+
+const std::string ILocationDialog::SOFTWARE_UI           = "SOFTWARE_UI";
+const std::string ILocationDialog::DLG_DEFAULT_LOCATION  = "DLG_DEFAULT_LOCATION" ;
+
+//-----------------------------------------------------------------------------
+
+ILocationDialog::ILocationDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+ILocationDialog::~ILocationDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void ILocationDialog::setTitle(const std::string& title)
+{
+    m_title = title;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string& ILocationDialog::getTitle()
+{
+    return m_title;
+}
+
+//------------------------------------------------------------------------------
+
+void ILocationDialog::setDefaultLocation( ::fwData::location::ILocation::sptr loc)
+{
+    ::fwData::location::SingleFile::csptr singleFile = ::fwData::location::SingleFile::dynamicConstCast(loc);
+    ::fwData::location::Folder::csptr folder = ::fwData::location::Folder::dynamicConstCast(loc);
+    SLM_FATAL_IF( "Unsupported location",  !singleFile && !folder );
+    m_defaultLocaction = loc;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path ILocationDialog::getDefaultLocation()
+{
+    ::boost::filesystem::path defaultPath;
+    ::fwData::Composite::sptr prefUI = this->getPreferenceUI();
+    ::fwData::location::ILocation::sptr location;
+    if(prefUI)
+    {
+        if ( prefUI->find( ILocationDialog::DLG_DEFAULT_LOCATION ) != prefUI->end() )
+        {
+            location = ::fwData::location::ILocation::dynamicCast( (*prefUI)[ ILocationDialog::DLG_DEFAULT_LOCATION ] );
+            SLM_ASSERT("LOCATION not correct", location);
+        }
+    }
+
+    if(!location)
+    {
+        location = m_defaultLocaction;
+    }
+
+    ::fwData::location::SingleFile::csptr singleFile = ::fwData::location::SingleFile::dynamicConstCast(location);
+    ::fwData::location::Folder::csptr folder = ::fwData::location::Folder::dynamicConstCast(location);
+    if (singleFile)
+    {
+        defaultPath = singleFile->getPath();
+    }
+    else if (folder)
+    {
+        defaultPath = folder->getFolder();
+    }
+
+    return defaultPath;
+}
+
+//-----------------------------------------------------------------------------
+
+void ILocationDialog::saveDefaultLocation(::fwData::location::ILocation::sptr loc)
+{
+    ::fwData::Composite::sptr prefUI = this->getPreferenceUI();
+    if(prefUI && loc)
+    {
+        (*prefUI)[ ILocationDialog::DLG_DEFAULT_LOCATION ] = loc;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr ILocationDialog::getPreferenceUI()
+{
+    ::fwData::Composite::sptr prefUI;
+
+    // Get preferences
+    std::vector< ::fwServices::IService::sptr > preferencesServicesList = ::fwServices::OSR::getServices("::preferences::IPreferencesService");
+    if(!preferencesServicesList.empty())
+    {
+        ::fwServices::IService::sptr prefService = preferencesServicesList[0];
+        ::fwData::Composite::sptr prefs = prefService->getObject< ::fwData::Composite >();
+
+        ::fwData::Composite::sptr framesUI;
+        // Retrieves software UI pref
+        if ( prefs->find( ILocationDialog::SOFTWARE_UI ) != prefs->end() )
+        {
+            framesUI = ::fwData::Composite::dynamicCast( (*prefs)[ ILocationDialog::SOFTWARE_UI ]);
+        }
+        else
+        {
+            framesUI = ::fwData::Composite::New();
+            (*prefs)[ ILocationDialog::SOFTWARE_UI ] = framesUI;
+        }
+        // Retrieves associated dialog UI pref
+        if ( framesUI->find( this->getTitle() ) != framesUI->end() )
+        {
+            prefUI = ::fwData::Composite::dynamicCast( (*framesUI)[ this->getTitle() ] );
+        }
+        else
+        {
+            prefUI = ::fwData::Composite::New();
+            (*framesUI)[ this->getTitle() ] = prefUI;
+        }
+    }
+    return prefUI;
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/IMessageDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/IMessageDialog.cpp
new file mode 100644
index 0000000..d8cd085
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/IMessageDialog.cpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/IMessageDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+const IMessageDialog::FactoryRegistryKeyType IMessageDialog::REGISTRY_KEY =  "::fwGui::dialog::MessageDialog";
+
+IMessageDialog::IMessageDialog()
+{}
+
+
+IMessageDialog::~IMessageDialog()
+{}
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/IMultiSelectorDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/IMultiSelectorDialog.cpp
new file mode 100644
index 0000000..e6780f8
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/IMultiSelectorDialog.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/IMultiSelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+
+const IMultiSelectorDialog::FactoryRegistryKeyType IMultiSelectorDialog::REGISTRY_KEY =  "::fwGui::dialog::MultiSelectorDialog";
+
+IMultiSelectorDialog::IMultiSelectorDialog()
+{}
+
+IMultiSelectorDialog::~IMultiSelectorDialog()
+{}
+
+} // namespace dialog
+} // namespace fwGui
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/IProgressDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/IProgressDialog.cpp
new file mode 100644
index 0000000..d627540
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/IProgressDialog.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwCore/base.hpp>
+#include "fwGui/dialog/IProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+const IProgressDialog::FactoryRegistryKeyType IProgressDialog::REGISTRY_KEY =  "::fwGui::dialog::ProgressDialog";
+
+IProgressDialog::IProgressDialog() 
+    : m_canceled(false),
+    m_raise(true),
+    m_value(0),
+    m_processUserEvents(true)
+{}
+
+//-----------------------------------------------------------------------------
+
+IProgressDialog::~IProgressDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IProgressDialog::setCancelCallback(CancelCallbackType callback)
+{
+    m_cancelCallback = callback;
+}
+
+//-----------------------------------------------------------------------------
+
+void IProgressDialog::cancelPressed()
+{
+    m_canceled = true;
+    if(m_cancelCallback)
+    {
+        m_cancelCallback();
+    }
+    else if (m_raise)
+    {
+        FW_RAISE("Operation canceled");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/IPulseProgressDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/IPulseProgressDialog.cpp
new file mode 100644
index 0000000..72d6108
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/IPulseProgressDialog.cpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/IPulseProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+
+const IPulseProgressDialog::FactoryRegistryKeyType IPulseProgressDialog::REGISTRY_KEY =  "::fwGui::dialog::PulseProgressDialog";
+
+IPulseProgressDialog::IPulseProgressDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+IPulseProgressDialog::~IPulseProgressDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IPulseProgressDialog::setStuff(Stuff stuff)
+{
+    m_stuff = stuff;
+}
+
+//-----------------------------------------------------------------------------
+
+void IPulseProgressDialog::setFrequence(MilliSecond frequence)
+{
+    m_frequence = frequence;
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/ISelectorDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/ISelectorDialog.cpp
new file mode 100644
index 0000000..1f85b99
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/ISelectorDialog.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/ISelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+
+const ISelectorDialog::FactoryRegistryKeyType ISelectorDialog::REGISTRY_KEY =  "::fwGui::dialog::SelectorDialog";
+
+ISelectorDialog::ISelectorDialog()
+{}
+
+ISelectorDialog::~ISelectorDialog()
+{}
+
+} //namespace dialog
+} // namespace fwGui
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/InputDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/InputDialog.cpp
new file mode 100644
index 0000000..5c5bd9e
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/InputDialog.cpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/InputDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+std::string InputDialog::showInputDialog(const std::string& title, const std::string& message, const std::string &text)
+{
+    ::fwGui::dialog::InputDialog  inputBox(title, message, text);
+    return inputBox.getInput();
+}
+
+//-----------------------------------------------------------------------------
+
+InputDialog::InputDialog()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IInputDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IInputDialog::dynamicCast(guiObj);
+}
+
+//-----------------------------------------------------------------------------
+
+InputDialog::InputDialog(const std::string& title, const std::string& message, const std::string &text)
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IInputDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IInputDialog::dynamicCast(guiObj);
+    m_implementation->setTitle(title);
+    m_implementation->setMessage(message);
+    m_implementation->setInput(text);
+}
+
+//-----------------------------------------------------------------------------
+
+InputDialog::~InputDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+void InputDialog::setTitle( const std::string &title )
+{
+    m_implementation->setTitle(title);
+}
+
+//-----------------------------------------------------------------------------
+
+void InputDialog::setMessage( const std::string &msg )
+{
+    m_implementation->setMessage(msg);
+}
+
+//-----------------------------------------------------------------------------
+
+void InputDialog::setInput(const std::string &text)
+{
+    m_implementation->setInput(text);
+}
+
+//-----------------------------------------------------------------------------
+
+std::string InputDialog::getInput()
+{
+    return m_implementation->getInput();
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/LocationDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/LocationDialog.cpp
new file mode 100644
index 0000000..51fc075
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/LocationDialog.cpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#include "fwGui/dialog/LocationDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+LocationDialog::LocationDialog()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ILocationDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::ILocationDialog::dynamicCast(guiObj);
+}
+
+//------------------------------------------------------------------------------
+
+LocationDialog::~LocationDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwData::location::ILocation::sptr LocationDialog::show()
+{
+    return m_implementation->show();
+}
+
+//-----------------------------------------------------------------------------
+
+void LocationDialog::setType( ::fwGui::dialog::ILocationDialog::Types type)
+{
+    m_implementation->setType( type );
+}
+
+//-----------------------------------------------------------------------------
+
+void LocationDialog::addFilter(const std::string &filterName, const std::string &wildcardList )
+{
+    m_implementation->addFilter(filterName,wildcardList);
+}
+
+//-----------------------------------------------------------------------------
+
+ILocationDialog& LocationDialog::setOption( ::fwGui::dialog::ILocationDialog::Options option)
+{
+    return m_implementation->setOption(option);
+}
+
+//-----------------------------------------------------------------------------
+
+void LocationDialog::setTitle(const std::string& title)
+{
+    m_implementation->setTitle(title);
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string& LocationDialog::getTitle()
+{
+    return m_implementation->getTitle();
+}
+
+//-----------------------------------------------------------------------------
+
+void LocationDialog::setDefaultLocation(::fwData::location::ILocation::sptr loc)
+{
+    m_implementation->setDefaultLocation(loc);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path LocationDialog::getDefaultLocation()
+{
+    return m_implementation->getDefaultLocation();
+}
+
+//-----------------------------------------------------------------------------
+
+void LocationDialog::saveDefaultLocation(::fwData::location::ILocation::sptr loc)
+{
+    m_implementation->saveDefaultLocation(loc);
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/MessageDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/MessageDialog.cpp
new file mode 100644
index 0000000..9b3a006
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/MessageDialog.cpp
@@ -0,0 +1,121 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/MessageDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+
+//-----------------------------------------------------------------------------
+
+IMessageDialog::Buttons MessageDialog::showMessageDialog(const std::string& title, const std::string& message, ::fwGui::dialog::IMessageDialog::Icons icon)
+{
+    ::fwGui::dialog::MessageDialog  messageBox(title, message, icon);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+    return messageBox.show();
+}
+
+//-----------------------------------------------------------------------------
+
+MessageDialog::MessageDialog()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IMessageDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IMessageDialog::dynamicCast(guiObj);
+}
+
+//-----------------------------------------------------------------------------
+
+MessageDialog::MessageDialog(const std::string& title, const std::string& message, ::fwGui::dialog::IMessageDialog::Icons icon)
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IMessageDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IMessageDialog::dynamicCast(guiObj);
+    if(m_implementation)
+    {
+        m_implementation->setTitle(title);
+        m_implementation->setMessage(message);
+        m_implementation->setIcon(icon);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+MessageDialog::~MessageDialog()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::setTitle( const std::string &title )
+{
+    if(m_implementation)
+    {
+        m_implementation->setTitle(title);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::setMessage( const std::string &msg )
+{
+    if(m_implementation)
+    {
+        m_implementation->setMessage(msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::setIcon( ::fwGui::dialog::IMessageDialog::Icons icon )
+{
+    if(m_implementation)
+    {
+        m_implementation->setIcon(icon);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::addButton( ::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    if(m_implementation)
+    {
+        m_implementation->addButton(button);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::setDefaultButton( ::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    if(m_implementation)
+    {
+        m_implementation->setDefaultButton(button);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::dialog::IMessageDialog::Buttons MessageDialog::show()
+{
+    if(m_implementation)
+    {
+        return m_implementation->show();
+    }
+    else
+    {
+        return ::fwGui::dialog::IMessageDialog::NOBUTTON;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/MultiSelectorDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/MultiSelectorDialog.cpp
new file mode 100644
index 0000000..3fda8fa
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/MultiSelectorDialog.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/MultiSelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+MultiSelectorDialog::MultiSelectorDialog()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IMultiSelectorDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IMultiSelectorDialog::dynamicCast(guiObj);
+}
+
+//-----------------------------------------------------------------------------
+
+void MultiSelectorDialog::setTitle(std::string title)
+{
+    m_implementation->setTitle(title);
+}
+
+//-----------------------------------------------------------------------------
+
+IMultiSelectorDialog::Selections MultiSelectorDialog::show()
+{
+    return m_implementation->show();
+}
+
+//-----------------------------------------------------------------------------
+
+void MultiSelectorDialog::setSelections(Selections _selections)
+{
+    m_implementation->setSelections( _selections );
+}
+
+//-----------------------------------------------------------------------------
+
+void MultiSelectorDialog::setMessage(const std::string &msg)
+{
+    m_implementation->setMessage( msg );
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/ProgressDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/ProgressDialog.cpp
new file mode 100644
index 0000000..77fff05
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/ProgressDialog.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/ProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+ProgressDialog::ProgressDialog(const std::string &title,const std::string &message)
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IProgressDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IProgressDialog::dynamicCast(guiObj);
+    if(m_implementation)
+    {
+        m_implementation->setTitle(title);
+        m_implementation->setMessage(message);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::setTitle(const std::string &title)
+{
+    if(m_implementation)
+    {
+        m_implementation->setTitle(title);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::setMessage(const std::string &msg)
+{
+    if(m_implementation)
+    {
+        m_implementation->setMessage(msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::operator()(float percent,std::string msg)
+{
+    if(m_implementation)
+    {
+
+        (*m_implementation)(percent,msg);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::setCancelCallback(CancelCallbackType callback)
+{
+    if(m_implementation)
+    {
+
+        m_implementation->setCancelCallback(callback);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::cancelPressed()
+{
+    assert(0);
+}
+
+//-----------------------------------------------------------------------------
+
+void ProgressDialog::hideCancelButton()
+{
+    m_implementation->hideCancelButton();
+}
+
+} //namespace dialog
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/PulseProgressDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/PulseProgressDialog.cpp
new file mode 100644
index 0000000..aa8afc5
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/PulseProgressDialog.cpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/PulseProgressDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+PulseProgressDialog::PulseProgressDialog( const std::string &title, ::fwGui::dialog::IPulseProgressDialog::Stuff stuff, const std::string &msg, ::fwGui::dialog::IPulseProgressDialog::MilliSecond frequenceRefresh )
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(IPulseProgressDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::IPulseProgressDialog::dynamicCast(guiObj);
+    if (m_implementation)
+    {
+        m_implementation->setStuff(stuff);
+        m_implementation->setTitle(title);
+        m_implementation->setMessage(msg);
+        m_implementation->setFrequence(frequenceRefresh);
+    }
+    else
+    {
+        this->setStuff(stuff);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void PulseProgressDialog::setTitle(const std::string &title)
+{
+    if (m_implementation)
+    {
+        m_implementation->setTitle(title);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void PulseProgressDialog::setMessage(const std::string &msg)
+{
+    if (m_implementation)
+    {
+        m_implementation->setMessage(msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void PulseProgressDialog::show()
+{
+    if (m_implementation)
+    {
+        m_implementation->show();
+    }
+    else
+    {
+        m_stuff();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/dialog/SelectorDialog.cpp b/SrcLib/core/fwGui/src/fwGui/dialog/SelectorDialog.cpp
new file mode 100644
index 0000000..d674b89
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/dialog/SelectorDialog.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwGui/dialog/SelectorDialog.hpp"
+
+namespace fwGui
+{
+namespace dialog
+{
+//-----------------------------------------------------------------------------
+
+std::string SelectorDialog::showSelectorDialog(const std::string& title, const std::string& message, std::vector< std::string > _selections)
+{
+    ::fwGui::dialog::SelectorDialog  selector(title, message, _selections);
+    return selector.show();
+}
+
+//-----------------------------------------------------------------------------
+
+SelectorDialog::SelectorDialog(const std::string& title, const std::string& message, std::vector< std::string > _selections)
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ISelectorDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::ISelectorDialog::dynamicCast(guiObj);
+    m_implementation->setTitle(title);
+    m_implementation->setMessage( message );
+    m_implementation->setSelections( _selections );
+}
+
+//-----------------------------------------------------------------------------
+
+SelectorDialog::SelectorDialog()
+{
+    ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ISelectorDialog::REGISTRY_KEY);
+    m_implementation = ::fwGui::dialog::ISelectorDialog::dynamicCast(guiObj);
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorDialog::setTitle(std::string title)
+{
+    m_implementation->setTitle(title);
+}
+
+//-----------------------------------------------------------------------------
+
+std::string SelectorDialog::show()
+{
+    return m_implementation->show();
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorDialog::setSelections(std::vector< std::string > _selections)
+{
+    m_implementation->setSelections( _selections );
+}
+
+//-----------------------------------------------------------------------------
+
+void SelectorDialog::setMessage(const std::string &msg)
+{
+    m_implementation->setMessage( msg );
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace dialog
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/factory/new.cpp b/SrcLib/core/fwGui/src/fwGui/factory/new.cpp
new file mode 100644
index 0000000..e550e3f
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/factory/new.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwGui/GuiBaseObject.hpp"
+#include "fwGui/factory/new.hpp"
+
+
+namespace fwGui
+{
+
+namespace factory
+{
+
+::fwGui::GuiBaseObject::sptr New( const ::fwGui::registry::KeyType & classname )
+{
+    return ::fwGui::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace fwGui
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/CardinalLayoutManagerBase.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/CardinalLayoutManagerBase.cpp
new file mode 100644
index 0000000..db232b6
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/CardinalLayoutManagerBase.cpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/CardinalLayoutManagerBase.cpp
+ * @brief This file defines the implementation of the class for managing a cardinal layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/CardinalLayoutManagerBase.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+//-----------------------------------------------------------------------------
+
+const CardinalLayoutManagerBase::RegistryKeyType CardinalLayoutManagerBase::REGISTRY_KEY =  "::fwGui::CardinalLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+const std::map<std::string, CardinalLayoutManagerBase::Align> CardinalLayoutManagerBase::STRING_TO_ALIGN =
+                                                ::boost::assign::map_list_of("center",CENTER)
+                                                                            ("right",RIGHT)
+                                                                            ("left",LEFT)
+                                                                            ("bottom",BOTTOM)
+                                                                            ("top",TOP);
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManagerBase::CardinalLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManagerBase::~CardinalLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+void CardinalLayoutManagerBase::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+            configuration->getName() == "layout");
+
+    std::vector < ConfigurationType > vectViews = configuration->find("view");
+    SLM_TRACE_IF("No view define.", vectViews.empty() );
+    m_views.clear();
+    BOOST_FOREACH (ConfigurationType view, vectViews)
+    {
+        ViewInfo vi;
+        if( view->hasAttribute("align") )
+        {
+            std::string align = view->getExistingAttributeValue("align");
+            OSLM_ASSERT("Align "<<align<<" unknown", STRING_TO_ALIGN.find(align) != STRING_TO_ALIGN.end() );
+            vi.m_align = STRING_TO_ALIGN.find(align)->second;
+        }
+
+        if( view->hasAttribute("minWidth") )
+        {
+            std::string width = view->getExistingAttributeValue("minWidth") ;
+            vi.m_minSize.first = ::boost::lexical_cast< int >(width) ;
+        }
+
+        if( view->hasAttribute("minHeight") )
+        {
+            std::string height = view->getExistingAttributeValue("minHeight") ;
+            vi.m_minSize.second = ::boost::lexical_cast< int >(height) ;
+        }
+
+        if( view->hasAttribute("resizable") )
+        {
+            std::string resizable = view->getExistingAttributeValue("resizable") ;
+            OSLM_ASSERT("Incorrect value for \"resizable\" attribute "<<resizable,
+                    (resizable == "yes") || (resizable == "no"));
+            vi.m_isResizable = (resizable=="yes") ;
+        }
+
+        if( view->hasAttribute("position") )
+        {
+            std::string position = view->getExistingAttributeValue("position") ;
+            vi.m_position = ::boost::lexical_cast< int >(position);
+        }
+
+        if( view->hasAttribute("layer") )
+        {
+            std::string layer = view->getExistingAttributeValue("layer") ;
+            vi.m_layer = ::boost::lexical_cast< int >(layer);
+        }
+
+        if( view->hasAttribute("row") )
+        {
+            std::string row = view->getExistingAttributeValue("row") ;
+            vi.m_row = ::boost::lexical_cast< int >(row);
+        }
+
+        if( view->hasAttribute("visible") )
+        {
+            std::string visible = view->getExistingAttributeValue("visible") ;
+            OSLM_ASSERT("Incorrect value for \"visible\" attribute "<<visible,
+                    (visible == "true") || (visible == "false") ||
+                    (visible == "yes") || (visible == "no"));
+            vi.m_visible = ((visible == "true") || (visible == "yes"));
+        }
+
+        if( view->hasAttribute("caption") )
+        {
+            vi.m_caption.first = true;
+            vi.m_caption.second = view->getExistingAttributeValue("caption") ;
+        }
+
+        if( view->hasAttribute("useScrollBar") )
+        {
+            std::string useScrollBar = view->getExistingAttributeValue("useScrollBar") ;
+            OSLM_ASSERT("Incorrect value for \"useScrollBar\" attribute "<<useScrollBar,
+                    (useScrollBar == "yes") || (useScrollBar == "no"));
+            vi.m_useScrollBar = (useScrollBar=="yes") ;
+        }
+
+        m_views.push_back(vi);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/IFrameLayoutManager.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/IFrameLayoutManager.cpp
new file mode 100644
index 0000000..990a7d0
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/IFrameLayoutManager.cpp
@@ -0,0 +1,241 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IFrameLayoutManager.cpp
+ * @brief This file defines the implementation of the base class for managing a frame.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+
+#include <fwServices/Base.hpp>
+
+#include "fwGui/layoutManager/IFrameLayoutManager.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+//-----------------------------------------------------------------------------
+
+const IFrameLayoutManager::RegistryKeyType IFrameLayoutManager::REGISTRY_KEY =  "::fwGui::FrameLayoutManager";
+
+const std::string IFrameLayoutManager::SOFTWARE_UI         = "SOFTWARE_UI";
+const std::string IFrameLayoutManager::FRAME_STATE_UI      = "FRAME_STATE_UI" ;
+const std::string IFrameLayoutManager::FRAME_SIZE_W_UI     = "FRAME_SIZE_W_UI" ;
+const std::string IFrameLayoutManager::FRAME_SIZE_H_UI     = "FRAME_SIZE_H_UI" ;
+const std::string IFrameLayoutManager::FRAME_POSITION_X_UI = "FRAME_POSITION_X_UI" ;
+const std::string IFrameLayoutManager::FRAME_POSITION_Y_UI = "FRAME_POSITION_Y_UI" ;
+
+//-----------------------------------------------------------------------------
+
+IFrameLayoutManager::IFrameLayoutManager()
+{
+    CloseCallback fct = ::boost::bind( &::fwGui::layoutManager::IFrameLayoutManager::defaultCloseCallback, this);
+    this->setCloseCallback(fct);
+}
+
+//-----------------------------------------------------------------------------
+
+IFrameLayoutManager::~IFrameLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IFrameLayoutManager::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be frame",
+            configuration->getName() == "frame");
+
+    std::vector < ConfigurationType > name    = configuration->find("name");
+    std::vector < ConfigurationType > icon    = configuration->find("icon");
+    std::vector < ConfigurationType > minSize = configuration->find("minSize");
+    std::vector < ConfigurationType > styles = configuration->find("style");
+
+    if(!name.empty())
+    {
+        m_frameInfo.m_name = name.at(0)->getValue();
+    }
+
+
+    if(!icon.empty())
+    {
+
+        m_frameInfo.m_iconPath = ::boost::filesystem::path(SHAREPATH+icon.at(0)->getValue().substr(8));
+        OSLM_ASSERT("Sorry, icon "<< m_frameInfo.m_iconPath << " doesn't exist", ::boost::filesystem::exists(m_frameInfo.m_iconPath));
+    }
+
+    if(!minSize.empty())
+    {
+        if(minSize.at(0)->hasAttribute("width"))
+        {
+            m_frameInfo.m_minSize.first = ::boost::lexical_cast<int >(minSize.at(0)->getExistingAttributeValue("width")) ;
+        }
+        if(minSize.at(0)->hasAttribute("height"))
+        {
+            m_frameInfo.m_minSize.second = ::boost::lexical_cast<int >(minSize.at(0)->getExistingAttributeValue("height")) ;
+        }
+    }
+
+    if(!styles.empty())
+    {
+        ::fwRuntime::ConfigurationElement::sptr stylesCfgElt = styles.at(0);
+        SLM_FATAL_IF("<style> node must contain mode attribute", !stylesCfgElt->hasAttribute("mode") );
+        const std::string style = stylesCfgElt->getExistingAttributeValue("mode");
+
+        if (style == "DEFAULT")
+        {
+            m_frameInfo.m_style = DEFAULT;
+        }
+        else if (style == "STAY_ON_TOP")
+        {
+            m_frameInfo.m_style = STAY_ON_TOP;
+        }
+        else
+        {
+            OSLM_FATAL("Sorry, style "<<style<< " is unknown.");
+        }
+    }
+    this->readConfig();
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameLayoutManager::setCloseCallback(CloseCallback fct)
+{
+    this->m_closeCallback = fct;
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameLayoutManager::defaultCloseCallback()
+{
+    SLM_WARN("No specific close callback defined");
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameLayoutManager::readConfig()
+{
+    ::fwData::Composite::sptr prefUI = this->getPreferenceUI();
+    if(prefUI)
+    {
+        if ( prefUI->find( IFrameLayoutManager::FRAME_STATE_UI ) != prefUI->end() )
+        {
+            ::fwData::Integer::sptr state = ::fwData::Integer::dynamicCast( (*prefUI)[ IFrameLayoutManager::FRAME_STATE_UI ] );
+            SLM_ASSERT("UI state not correct", state);
+            m_frameInfo.m_state = (FrameState) state->value();
+        }
+        if ( prefUI->find( IFrameLayoutManager::FRAME_SIZE_W_UI ) != prefUI->end() )
+        {
+            ::fwData::Integer::sptr sizew = ::fwData::Integer::dynamicCast( (*prefUI)[ IFrameLayoutManager::FRAME_SIZE_W_UI ] );
+            SLM_ASSERT("UI sizeW not correct", sizew);
+            m_frameInfo.m_size.first = *sizew;
+        }
+        if ( prefUI->find( IFrameLayoutManager::FRAME_SIZE_H_UI ) != prefUI->end() )
+        {
+            ::fwData::Integer::sptr sizeh = ::fwData::Integer::dynamicCast( (*prefUI)[ IFrameLayoutManager::FRAME_SIZE_H_UI ] );
+            SLM_ASSERT("UI sizeH not correct", sizeh);
+            m_frameInfo.m_size.second = *sizeh;
+        }
+        if ( prefUI->find( IFrameLayoutManager::FRAME_POSITION_X_UI ) != prefUI->end() )
+        {
+            ::fwData::Integer::sptr posx = ::fwData::Integer::dynamicCast( (*prefUI)[ IFrameLayoutManager::FRAME_POSITION_X_UI ] );
+            SLM_ASSERT("UI posX not correct", posx);
+            m_frameInfo.m_position.first = *posx;
+        }
+        if ( prefUI->find( IFrameLayoutManager::FRAME_POSITION_Y_UI ) != prefUI->end() )
+        {
+            ::fwData::Integer::sptr posy = ::fwData::Integer::dynamicCast( (*prefUI)[ IFrameLayoutManager::FRAME_POSITION_Y_UI ] );
+            SLM_ASSERT("UI posY not correct", posy);
+            m_frameInfo.m_position.second = *posy;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IFrameLayoutManager::writeConfig()
+{
+    ::fwData::Composite::sptr prefUI = this->getPreferenceUI();
+    if(prefUI)
+    {
+        if(m_frameInfo.m_state != ICONIZED)
+        {
+            ::fwData::Integer::sptr state = ::fwData::Integer::New(m_frameInfo.m_state);
+            (*prefUI)[ IFrameLayoutManager::FRAME_STATE_UI ] = state;
+        }
+
+        ::fwData::Integer::sptr sizew = ::fwData::Integer::New(m_frameInfo.m_size.first);
+        (*prefUI)[ IFrameLayoutManager::FRAME_SIZE_W_UI ] = sizew;
+
+        ::fwData::Integer::sptr sizeh = ::fwData::Integer::New(m_frameInfo.m_size.second);
+        (*prefUI)[ IFrameLayoutManager::FRAME_SIZE_H_UI ] = sizeh;
+
+        ::fwData::Integer::sptr posx = ::fwData::Integer::New(m_frameInfo.m_position.first);
+        (*prefUI)[ IFrameLayoutManager::FRAME_POSITION_X_UI ] = posx;
+
+        ::fwData::Integer::sptr posy = ::fwData::Integer::New(m_frameInfo.m_position.second);
+        (*prefUI)[ IFrameLayoutManager::FRAME_POSITION_Y_UI ] = posy;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Composite::sptr IFrameLayoutManager::getPreferenceUI()
+{
+    ::fwData::Composite::sptr prefUI;
+
+    // Get preferences
+    std::vector< ::fwServices::IService::sptr > preferencesServicesList = ::fwServices::OSR::getServices("::preferences::IPreferencesService");
+    if(!preferencesServicesList.empty())
+    {
+        ::fwServices::IService::sptr prefService = preferencesServicesList[0];
+        ::fwData::Composite::sptr prefs = prefService->getObject< ::fwData::Composite >();
+
+        ::fwData::Composite::sptr framesUI;
+        // Retreives software UI pref
+        if ( prefs->find( IFrameLayoutManager::SOFTWARE_UI ) == prefs->end() )
+        {
+            framesUI = ::fwData::Composite::New();
+            (*prefs)[ IFrameLayoutManager::SOFTWARE_UI ] = framesUI;
+        }
+        else
+        {
+            framesUI = ::fwData::Composite::dynamicCast( (*prefs)[ IFrameLayoutManager::SOFTWARE_UI ]);
+        }
+        // Retreives frame UI pref
+        if ( framesUI->find( this->m_frameInfo.m_name ) != framesUI->end() )
+        {
+            prefUI = ::fwData::Composite::dynamicCast( (*framesUI)[ this->m_frameInfo.m_name ] );
+        }
+        else
+        {
+            prefUI = ::fwData::Composite::New();
+            (*framesUI)[ this->m_frameInfo.m_name  ] = prefUI;
+        }
+    }
+    return prefUI;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuBarLayoutManager.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuBarLayoutManager.cpp
new file mode 100644
index 0000000..92759e8
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuBarLayoutManager.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IMenuBarLayoutManager.cpp
+ * @brief This file defines the implementation of the base class for managing a menubar.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+
+#include "fwGui/layoutManager/IMenuBarLayoutManager.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+const IMenuBarLayoutManager::RegistryKeyType IMenuBarLayoutManager::REGISTRY_KEY = "::fwGui::MenuBarLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+IMenuBarLayoutManager::IMenuBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+IMenuBarLayoutManager::~IMenuBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarLayoutManager::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+                configuration->getName() == "layout");
+
+    std::vector < ConfigurationType > vectMenus = configuration->find("menu");
+    SLM_TRACE_IF("No menu define.", vectMenus.empty() );
+    m_menus.clear();
+    BOOST_FOREACH (ConfigurationType menu, vectMenus)
+    {
+        SLM_ASSERT("missing <name> attribute", menu->hasAttribute("name"));
+        if( menu->hasAttribute("name") )
+        {
+            std::string name = menu->getExistingAttributeValue("name") ;
+            m_menuNames.push_back(name);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuBarLayoutManager::destroyMenus()
+{
+    BOOST_FOREACH( ::fwGui::container::fwMenu::sptr menu, m_menus)
+    {
+        menu->destroyContainer();
+    }
+    m_menus.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwMenu::sptr > IMenuBarLayoutManager::getMenus()
+{
+    return this->m_menus;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuLayoutManager.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuLayoutManager.cpp
new file mode 100644
index 0000000..79de167
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/IMenuLayoutManager.cpp
@@ -0,0 +1,166 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IMenuLayoutManager.cpp
+ * @brief This file defines the implementation of the base class for managing a menu.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+
+#include "fwGui/layoutManager/IMenuLayoutManager.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+const IMenuLayoutManager::RegistryKeyType IMenuLayoutManager::REGISTRY_KEY = "::fwGui::MenuLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+IMenuLayoutManager::IMenuLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+IMenuLayoutManager::~IMenuLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IMenuLayoutManager::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+                configuration->getName() == "layout");
+
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter ;
+    for( iter = configuration->begin() ; iter != configuration->end() ; ++iter )
+    {
+        if( (*iter)->getName() == "menuItem" )
+        {
+            ConfigurationType menuItem = *iter;
+            ActionInfo info;
+
+            SLM_ASSERT("Depreciated tag <state>", ! menuItem->hasAttribute("state"));
+            SLM_ASSERT("Depreciated tag <enable>", ! menuItem->hasAttribute("enable"));
+
+            SLM_ASSERT("missing <name> attribute", menuItem->hasAttribute("name"));
+            if( menuItem->hasAttribute("name") )
+            {
+                info.m_name = menuItem->getExistingAttributeValue("name") ;
+            }
+
+            if( menuItem->hasAttribute("shortcut") )
+            {
+                info.m_shortcut = menuItem->getExistingAttributeValue("shortcut") ;
+            }
+
+            if( menuItem->hasAttribute("icon") )
+            {
+                info.m_icon = SHAREPATH+menuItem->getExistingAttributeValue("icon").substr(8) ;
+            }
+
+            if( menuItem->hasAttribute("style") )
+            {
+                std::string style = menuItem->getExistingAttributeValue("style") ;
+                info.m_isCheckable = (style == "check");
+                info.m_isRadio = (style == "radio");
+            }
+
+            if( menuItem->hasAttribute("specialAction") )
+            {
+                std::string specialActionName = menuItem->getExistingAttributeValue("specialAction") ;
+                if (specialActionName == "DEFAULT")
+                {
+                    info.m_type = DEFAULT;
+                }
+                else if (specialActionName == "QUIT")
+                {
+                    info.m_type = QUIT;
+                }
+                else if (specialActionName == "ABOUT")
+                {
+                    info.m_type = ABOUT;
+                }
+                else if (specialActionName == "HELP")
+                {
+                    info.m_type = HELP;
+                }
+                else if (specialActionName == "NEW")
+                {
+                    info.m_type = NEW;
+                }
+                else
+                {
+                    OSLM_FATAL("specialAction " << specialActionName << " is unknown." );
+                }
+            }
+
+            m_actionInfo.push_back(info);
+        }
+        if( (*iter)->getName() == "separator" )
+        {
+            ActionInfo info;
+            info.m_isSeparator = true;
+            info.m_type = SEPARATOR;
+            m_actionInfo.push_back( info ) ;
+        }
+
+        if( (*iter)->getName() == "menu" )
+        {
+            ActionInfo info;
+            info.m_isMenu = true;
+            if( (*iter)->hasAttribute("name") )
+            {
+                info.m_name = (*iter)->getExistingAttributeValue("name") ;
+            }
+            m_actionInfo.push_back( info ) ;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IMenuLayoutManager::destroyActions()
+{
+    BOOST_FOREACH( ::fwGui::container::fwMenuItem::sptr menuItem, m_menuItems)
+    {
+        menuItem->destroyContainer();
+    }
+    m_menuItems.clear();
+    BOOST_FOREACH( ::fwGui::container::fwMenu::sptr menu, m_menus)
+    {
+        menu->destroyContainer();
+    }
+    m_menus.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwMenuItem::sptr > IMenuLayoutManager::getMenuItems()
+{
+    return this->m_menuItems;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwMenu::sptr > IMenuLayoutManager::getMenus()
+{
+    return this->m_menus;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/IToolBarLayoutManager.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/IToolBarLayoutManager.cpp
new file mode 100644
index 0000000..7c1b3aa
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/IToolBarLayoutManager.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IToolBarLayoutManager.cpp
+ * @brief This file defines the implementation of the base class for managing a toolbar.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include "fwGui/layoutManager/IToolBarLayoutManager.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+const IToolBarLayoutManager::RegistryKeyType IToolBarLayoutManager::REGISTRY_KEY = "::fwGui::ToolBarLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+IToolBarLayoutManager::IToolBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+IToolBarLayoutManager::~IToolBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarLayoutManager::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+                configuration->getName() == "layout");
+
+
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter ;
+    for( iter = configuration->begin() ; iter != configuration->end() ; ++iter )
+    {
+        if( (*iter)->getName() == "menuItem" )
+        {
+            ConfigurationType toolBarItem = *iter;
+            ActionInfo info;
+            SLM_ASSERT("Depreciated tag <state>", ! toolBarItem->hasAttribute("state"));
+            SLM_ASSERT("Depreciated tag <enable>", ! toolBarItem->hasAttribute("enable"));
+
+            SLM_ASSERT("missing <name> attribute", toolBarItem->hasAttribute("name"));
+            if( toolBarItem->hasAttribute("name") )
+            {
+                info.m_name = toolBarItem->getExistingAttributeValue("name") ;
+            }
+
+            if( toolBarItem->hasAttribute("icon") )
+            {
+                info.m_icon = SHAREPATH+toolBarItem->getExistingAttributeValue("icon").substr(8) ;
+            }
+
+            if( toolBarItem->hasAttribute("style") )
+            {
+                std::string style = toolBarItem->getExistingAttributeValue("style") ;
+                info.m_isCheckable = (style == "check");
+                info.m_isRadio = (style == "radio");
+            }
+
+            if( toolBarItem->hasAttribute("shortcut") )
+            {
+                info.m_shortcut = toolBarItem->getExistingAttributeValue("shortcut") ;
+            }
+            m_actionInfo.push_back(info);
+        }
+        else if( (*iter)->getName() == "separator" )
+        {
+            ActionInfo info;
+            info.m_isSeparator = true;
+
+            if( (*iter)->hasAttribute("size") )
+            {
+                info.m_size = ::boost::lexical_cast< int > ((*iter)->getExistingAttributeValue("size")) ;
+            }
+
+            m_actionInfo.push_back( info ) ;
+        }
+        else if( (*iter)->getName() == "spacer" )
+        {
+            ActionInfo info;
+            info.m_isSpacer = true;
+            m_actionInfo.push_back( info ) ;
+        }
+        else if( (*iter)->getName() == "menu" )
+        {
+            ActionInfo info;
+            info.m_isMenu = true;
+            if( (*iter)->hasAttribute("name") )
+            {
+                info.m_name = (*iter)->getExistingAttributeValue("name") ;
+            }
+
+            if( (*iter)->hasAttribute("icon") )
+            {
+                info.m_icon = (*iter)->getExistingAttributeValue("icon") ;
+            }
+            m_actionInfo.push_back( info ) ;
+        }
+        else if( (*iter)->getName() == "editor" )
+        {
+            ActionInfo info;
+            info.m_isEditor = true;
+
+            m_actionInfo.push_back( info ) ;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IToolBarLayoutManager::destroyActions()
+{
+    BOOST_FOREACH( ::fwGui::container::fwMenuItem::sptr menuItem, m_menuItems)
+    {
+        menuItem->destroyContainer();
+    }
+    m_menuItems.clear();
+    BOOST_FOREACH( ::fwGui::container::fwMenu::sptr menu, m_menus)
+    {
+        menu->destroyContainer();
+    }
+    m_menus.clear();
+    BOOST_FOREACH( ::fwGui::container::fwContainer::sptr container, m_containers)
+    {
+        container->destroyContainer();
+    }
+    m_containers.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwMenuItem::sptr > IToolBarLayoutManager::getMenuItems()
+{
+    return this->m_menuItems;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwMenu::sptr > IToolBarLayoutManager::getMenus()
+{
+    return this->m_menus;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwContainer::sptr > IToolBarLayoutManager::getContainers()
+{
+    return this->m_containers;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/IViewLayoutManager.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/IViewLayoutManager.cpp
new file mode 100644
index 0000000..8203769
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/IViewLayoutManager.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/IViewLayoutManager.cpp
+ * @brief This file defines the implementation of the base class for managing a layout geometry.
+ *
+ *
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+
+#include "fwGui/layoutManager/IViewLayoutManager.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+IViewLayoutManager::IViewLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+IViewLayoutManager::~IViewLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IViewLayoutManager::destroySubViews()
+{
+    BOOST_FOREACH( ::fwGui::container::fwContainer::sptr container, m_subViews)
+    {
+        container->clean();
+        container->destroyContainer();
+    }
+    m_subViews.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< ::fwGui::container::fwContainer::sptr > IViewLayoutManager::getSubViews()
+{
+    return this->m_subViews;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/LineLayoutManagerBase.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/LineLayoutManagerBase.cpp
new file mode 100644
index 0000000..e109d6d
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/LineLayoutManagerBase.cpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/LineLayoutManagerBase.cpp
+ * @brief This file defines the implementation of the class for managing a line layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/LineLayoutManagerBase.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+//-----------------------------------------------------------------------------
+
+const LineLayoutManagerBase::RegistryKeyType LineLayoutManagerBase::REGISTRY_KEY =  "::fwGui::LineLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManagerBase::LineLayoutManagerBase() : m_orientation(VERTICAL)
+{}
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManagerBase::~LineLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+void LineLayoutManagerBase::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+            configuration->getName() == "layout");
+
+    std::vector < ConfigurationType > vectOrientation = configuration->find("orientation");
+
+    SLM_FATAL_IF( "missing orientation configuration" , vectOrientation.empty() );
+    SLM_ASSERT("<orientation> tag must have value attribute", vectOrientation.at(0)->hasAttribute("value"));
+    std::string orientation = vectOrientation.at(0)->getExistingAttributeValue("value") ;
+    SLM_ASSERT("Wrong value '"<< orientation <<"' for 'orientation' attribute (require vertical or horizontal)",
+            orientation == "vertical" || orientation == "horizontal");
+    m_orientation = (orientation == "vertical")? VERTICAL:HORIZONTAL ;
+
+    m_views.clear();
+    BOOST_FOREACH (ConfigurationType view, configuration->getElements())
+    {
+        if( view->getName() == "spacer" )
+        {
+            ViewInfo vi;
+            vi.m_isSpacer = true;
+            m_views.push_back(vi);
+        }
+        else if( view->getName() == "view" )
+        {
+            ViewInfo vi;
+            if( view->hasAttribute("proportion") )
+            {
+                std::string proportion = view->getExistingAttributeValue("proportion") ;
+                vi.m_proportion = ::boost::lexical_cast< int >(proportion) ;
+            }
+            if( view->hasAttribute("border") )
+            {
+                std::string border = view->getExistingAttributeValue("border") ;
+                vi.m_border = ::boost::lexical_cast< int >(border) ;
+            }
+            if( view->hasAttribute("caption") )
+            {
+                vi.m_caption.first = true;
+                vi.m_caption.second = view->getExistingAttributeValue("caption") ;
+            }
+            if( view->hasAttribute("minWidth") )
+            {
+                std::string width = view->getExistingAttributeValue("minWidth") ;
+                vi.m_minSize.first = ::boost::lexical_cast< int >(width) ;
+            }
+            if( view->hasAttribute("minHeight") )
+            {
+                std::string height = view->getExistingAttributeValue("minHeight") ;
+                vi.m_minSize.second = ::boost::lexical_cast< int >(height) ;
+            }
+            if( view->hasAttribute("visible") )
+            {
+                std::string visible = view->getExistingAttributeValue("visible") ;
+                OSLM_ASSERT("Incorrect value for \"visible\" attribute "<<visible,
+                        (visible == "true") || (visible == "false") ||
+                        (visible == "yes") || (visible == "no"));
+                vi.m_visible = ((visible == "true") || (visible == "yes"));
+            }
+            if( view->hasAttribute("useScrollBar") )
+            {
+                std::string useScrollBar = view->getExistingAttributeValue("useScrollBar") ;
+                OSLM_ASSERT("Incorrect value for \"useScrollBar\" attribute "<<useScrollBar,
+                        (useScrollBar == "yes") || (useScrollBar == "no"));
+                vi.m_useScrollBar = (useScrollBar=="yes") ;
+            }
+            m_views.push_back(vi);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/TabLayoutManagerBase.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/TabLayoutManagerBase.cpp
new file mode 100644
index 0000000..a39458c
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/TabLayoutManagerBase.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/TabLayoutManagerBase.cpp
+ * @brief This file defines the interface of the class for managing a tab layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/TabLayoutManagerBase.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+//-----------------------------------------------------------------------------
+
+const TabLayoutManagerBase::RegistryKeyType TabLayoutManagerBase::REGISTRY_KEY =  "::fwGui::TabLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManagerBase::TabLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManagerBase::~TabLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TabLayoutManagerBase::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+            configuration->getName() == "layout");
+
+    std::vector < ConfigurationType > vectViews = configuration->find("view");
+    SLM_TRACE_IF("No view define.", vectViews.empty() );
+    m_views.clear();
+    BOOST_FOREACH (ConfigurationType view, vectViews)
+    {
+        ViewInfo vi;
+        if( view->hasAttribute("caption") )
+        {
+            vi.m_caption = view->getExistingAttributeValue("caption") ;
+        }
+        if( view->hasAttribute("selected") )
+        {
+            std::string isSelected = view->getExistingAttributeValue("selected");
+            OSLM_ASSERT("Sorry, value "<<isSelected<<" is not correct for attribute isSelected.",
+                    isSelected == "yes" || isSelected == "no");
+            vi.m_isSelect = (isSelected == "yes");
+        }
+
+        if( view->hasAttribute("useScrollBar") )
+        {
+            std::string useScrollBar = view->getExistingAttributeValue("useScrollBar") ;
+            OSLM_ASSERT("Incorrect value for \"useScrollBar\" attribute "<<useScrollBar,
+                    (useScrollBar == "yes") || (useScrollBar == "no"));
+            vi.m_useScrollBar = (useScrollBar=="yes") ;
+        }
+
+        m_views.push_back(vi);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/layoutManager/ToolboxLayoutManagerBase.cpp b/SrcLib/core/fwGui/src/fwGui/layoutManager/ToolboxLayoutManagerBase.cpp
new file mode 100644
index 0000000..3b1e87b
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/layoutManager/ToolboxLayoutManagerBase.cpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwGui/layoutManager/ToolboxLayoutManagerBase.cpp
+ * @brief This file defines the implementation of the class for managing a line layout geometry.
+ *
+ * 
+ * @date 2009-2010
+ */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGui/layoutManager/ToolboxLayoutManagerBase.hpp"
+
+namespace fwGui
+{
+
+namespace layoutManager
+{
+//-----------------------------------------------------------------------------
+
+const ToolboxLayoutManagerBase::RegistryKeyType ToolboxLayoutManagerBase::REGISTRY_KEY =  "::fwGui::ToolboxLayoutManager";
+
+//-----------------------------------------------------------------------------
+
+ToolboxLayoutManagerBase::ToolboxLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolboxLayoutManagerBase::~ToolboxLayoutManagerBase()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolboxLayoutManagerBase::initialize( ConfigurationType configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be layout",
+            configuration->getName() == "layout");
+    m_views.clear();
+    BOOST_FOREACH (ConfigurationType view, configuration->getElements())
+    {
+        if( view->getName() == "view" )
+        {
+            ViewInfo vi;
+            if( view->hasAttribute("border") )
+            {
+                std::string border = view->getExistingAttributeValue("border") ;
+                vi.m_border = ::boost::lexical_cast< int >(border) ;
+            }
+            if( view->hasAttribute("caption") )
+            {
+                vi.m_caption = view->getExistingAttributeValue("caption") ;
+            }
+            if( view->hasAttribute("minWidth") )
+            {
+                std::string width = view->getExistingAttributeValue("minWidth") ;
+                vi.m_minSize.first = ::boost::lexical_cast< int >(width) ;
+            }
+            if( view->hasAttribute("minHeight") )
+            {
+                std::string height = view->getExistingAttributeValue("minHeight") ;
+                vi.m_minSize.second = ::boost::lexical_cast< int >(height) ;
+            }
+            if( view->hasAttribute("visible") )
+            {
+                std::string visible = view->getExistingAttributeValue("visible") ;
+                OSLM_ASSERT("Incorrect value for \"visible\" attribute "<<visible,
+                        (visible == "true") || (visible == "false") ||
+                        (visible == "yes") || (visible == "no"));
+                vi.m_visible = ((visible == "true") || (visible == "yes"));
+            }
+            if( view->hasAttribute("expanded") )
+            {
+                std::string expanded = view->getExistingAttributeValue("expanded") ;
+                OSLM_ASSERT("Incorrect value for \"expanded\" attribute "<<expanded,
+                        (expanded == "true") || (expanded == "false") ||
+                        (expanded == "yes") || (expanded == "no"));
+                vi.m_expanded = ((expanded == "true") || (expanded == "yes"));
+            }
+            if( view->hasAttribute("useScrollBar") )
+            {
+                std::string useScrollBar = view->getExistingAttributeValue("useScrollBar") ;
+                OSLM_ASSERT("Incorrect value for \"useScrollBar\" attribute "<<useScrollBar,
+                        (useScrollBar == "yes") || (useScrollBar == "no"));
+                vi.m_useScrollBar = (useScrollBar=="yes") ;
+            }
+            m_views.push_back(vi);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGui/src/fwGui/registrar/ActionRegistrar.cpp b/SrcLib/core/fwGui/src/fwGui/registrar/ActionRegistrar.cpp
new file mode 100644
index 0000000..a6b2678
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registrar/ActionRegistrar.cpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/GuiRegistry.hpp"
+#include "fwGui/registrar/ActionRegistrar.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+//-----------------------------------------------------------------------------
+
+ActionRegistrar::ActionRegistrar(const std::string &sid) : m_sid(sid)
+{}
+
+//-----------------------------------------------------------------------------
+
+ActionRegistrar::~ActionRegistrar()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ActionRegistrar::actionServiceStopping()
+{
+    ::fwGui::GuiRegistry::actionServiceStopping(m_sid);
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionRegistrar::actionServiceStarting()
+{
+    ::fwGui::GuiRegistry::actionServiceStarting(m_sid);
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionRegistrar::actionServiceSetActive(bool isActive)
+{
+    ::fwGui::GuiRegistry::actionServiceSetActive(m_sid, isActive);
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionRegistrar::actionServiceSetExecutable(bool isExecutable)
+{
+    ::fwGui::GuiRegistry::actionServiceSetExecutable(m_sid, isExecutable);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registrar
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/registrar/MenuBarRegistrar.cpp b/SrcLib/core/fwGui/src/fwGui/registrar/MenuBarRegistrar.cpp
new file mode 100644
index 0000000..c4a577f
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registrar/MenuBarRegistrar.cpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/GuiRegistry.hpp"
+#include "fwGui/registrar/MenuBarRegistrar.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+//-----------------------------------------------------------------------------
+
+MenuBarRegistrar::MenuBarRegistrar(const std::string &sid) : m_sid(sid)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuBarRegistrar::~MenuBarRegistrar()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenuBar::sptr MenuBarRegistrar::getParent()
+{
+    return ::fwGui::GuiRegistry::getSIDMenuBar(m_sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenu::sptr MenuBarRegistrar::getFwMenu(std::string menuSid, std::vector< ::fwGui::container::fwMenu::sptr > menus)
+{
+    SLM_ASSERT("menu not found", m_menuSids.find(menuSid) != m_menuSids.end());
+    ::fwGui::container::fwMenu::sptr menu = menus.at( m_menuSids[menuSid].first );
+    return menu;
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarRegistrar::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be registry",
+            configuration->getName() == "registry");
+
+    // index represents associated menu with position in menus vector
+    unsigned int index = 0;
+    // initialize m_menuSids map with configuration
+    std::vector < ConfigurationType > vectMenus = configuration->find("menu");
+    BOOST_FOREACH( ConfigurationType menu, vectMenus)
+    {
+        SLM_ASSERT("<menu> tag must have sid attribute", menu->hasAttribute("sid"));
+
+        if(menu->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(menu->hasAttribute("start"))
+            {
+                std::string startValue = menu->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menu->getAttributeValue("sid");
+            m_menuSids[sid] = SIDMenuMapType::mapped_type(index, start);
+        }
+        index++;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarRegistrar::manage(std::vector< ::fwGui::container::fwMenu::sptr > menus )
+{
+    ::fwGui::container::fwMenu::sptr menu;
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_menuSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < menus.size());
+        menu = menus.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerSIDMenu(sid.first, menu);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->start();
+        }
+        else
+        {
+            bool service_exists = ::fwTools::fwID::exist(sid.first );
+            if (!service_exists || ::fwServices::get( sid.first )->isStopped())
+            {
+                ::fwGui::GuiRegistry::actionServiceStopping(sid.first);
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarRegistrar::unmanage()
+{
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_menuSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDMenu(sid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registrar
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/registrar/MenuRegistrar.cpp b/SrcLib/core/fwGui/src/fwGui/registrar/MenuRegistrar.cpp
new file mode 100644
index 0000000..b0ac194
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registrar/MenuRegistrar.cpp
@@ -0,0 +1,202 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/GuiRegistry.hpp"
+#include "fwGui/IActionSrv.hpp"
+#include "fwGui/registrar/MenuRegistrar.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+//-----------------------------------------------------------------------------
+
+MenuRegistrar::MenuRegistrar(const std::string &sid) : m_sid(sid)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuRegistrar::~MenuRegistrar()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenu::sptr MenuRegistrar::getParent()
+{
+    return ::fwGui::GuiRegistry::getSIDMenu(m_sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenuItem::sptr MenuRegistrar::getFwMenuItem(std::string actionSid, std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems)
+{
+    SLM_ASSERT("menuItem not found", m_actionSids.find(actionSid) != m_actionSids.end());
+    ::fwGui::container::fwMenuItem::sptr menuItem = menuItems.at( m_actionSids[actionSid].first );
+    return menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuRegistrar::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be registry",
+            configuration->getName() == "registry");
+
+    // index represents associated menu with position in menus vector
+    unsigned int index = 0;
+    m_callbacks.clear();
+    // initialize m_actionSids map with configuration
+    std::vector < ConfigurationType > vectMenuItems = configuration->find("menuItem");
+    BOOST_FOREACH( ConfigurationType menuItem, vectMenuItems)
+    {
+        SLM_ASSERT("<menuItem> tag must have sid attribute", menuItem->hasAttribute("sid"));
+        if(menuItem->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(menuItem->hasAttribute("start"))
+            {
+                std::string startValue = menuItem->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menuItem->getAttributeValue("sid");
+            OSLM_ASSERT("Action " << sid << " already exists for this menu", m_actionSids.find(sid) == m_actionSids.end());
+            m_actionSids[sid] = SIDMenuMapType::mapped_type(index, start);
+
+            ::fwGui::ActionCallbackBase::sptr callback ;
+            ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ActionCallbackBase::REGISTRY_KEY);
+            callback = ::fwGui::ActionCallbackBase::dynamicCast(guiObj);
+            OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::ActionCallbackBase::REGISTRY_KEY, callback);
+
+            callback->setSID(sid);
+            m_callbacks.push_back(callback);
+        }
+        index++;
+    }
+
+    index = 0;
+    // initialize m_actionSids map with configuration
+    std::vector < ConfigurationType > vectMenus = configuration->find("menu");
+    BOOST_FOREACH( ConfigurationType menu, vectMenus)
+    {
+        SLM_ASSERT("<menu> tag must have sid attribute", menu->hasAttribute("sid"));
+        if(menu->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(menu->hasAttribute("start"))
+            {
+                std::string startValue = menu->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menu->getAttributeValue("sid");
+            std::pair<int, bool> indexStart =  std::make_pair( index, start);
+            OSLM_ASSERT("Action " << sid << " already exists for this toolBar", m_actionSids.find(sid) == m_actionSids.end());
+            m_menuSids[sid] = indexStart;
+        }
+        index++;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuRegistrar::manage(std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems )
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem;
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_actionSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < menuItems.size());
+        menuItem = menuItems.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerActionSIDToParentSID(sid.first, m_sid);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            service->start();
+        }
+        else
+        {
+            bool service_exists = ::fwTools::fwID::exist(sid.first );
+            if (!service_exists || ::fwServices::get( sid.first )->isStopped())
+            {
+                ::fwGui::GuiRegistry::actionServiceStopping(sid.first);
+            }
+            else
+            {
+                ::fwGui::GuiRegistry::actionServiceStarting(sid.first);
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuRegistrar::manage(std::vector< ::fwGui::container::fwMenu::sptr > menus )
+{
+    ::fwGui::container::fwMenu::sptr menu;
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_menuSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < menus.size());
+        menu = menus.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerSIDMenu(sid.first, menu);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            service->start();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuRegistrar::unmanage()
+{
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_actionSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterActionSIDToParentSID(sid.first, m_sid);
+    }
+    BOOST_FOREACH( SIDMenuMapType::value_type sid, m_menuSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDMenu(sid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuRegistrar::onItemAction()
+{
+    SLM_WARN("TODO: MenuRegistrar::onItemAction not yet implemented");
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registrar
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/registrar/ToolBarRegistrar.cpp b/SrcLib/core/fwGui/src/fwGui/registrar/ToolBarRegistrar.cpp
new file mode 100644
index 0000000..0ae5841
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registrar/ToolBarRegistrar.cpp
@@ -0,0 +1,253 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/GuiRegistry.hpp"
+#include "fwGui/IActionSrv.hpp"
+#include "fwGui/registrar/ToolBarRegistrar.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+//-----------------------------------------------------------------------------
+
+ToolBarRegistrar::ToolBarRegistrar(const std::string &sid) : m_sid(sid)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolBarRegistrar::~ToolBarRegistrar()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwToolBar::sptr ToolBarRegistrar::getParent()
+{
+    return ::fwGui::GuiRegistry::getSIDToolBar(m_sid);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwMenuItem::sptr ToolBarRegistrar::getFwMenuItem(std::string actionSid, std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems)
+{
+    SLM_ASSERT("menuItem not found", m_actionSids.find(actionSid) != m_actionSids.end());
+    ::fwGui::container::fwMenuItem::sptr menuItem = menuItems.at( m_actionSids[actionSid].first );
+    return menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be registry",
+            configuration->getName() == "registry");
+
+    // index represents associated toolBar with position in toolBars vector
+    unsigned int index = 0;
+    m_callbacks.clear();
+    // initialize m_actionSids map with configuration
+    std::vector < ConfigurationType > vectMenuItems = configuration->find("menuItem");
+    BOOST_FOREACH( ConfigurationType menuItem, vectMenuItems)
+    {
+        SLM_ASSERT("<menuItem> tag must have sid attribute", menuItem->hasAttribute("sid"));
+        if(menuItem->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(menuItem->hasAttribute("start"))
+            {
+                std::string startValue = menuItem->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menuItem->getAttributeValue("sid");
+            OSLM_ASSERT("Action " << sid << " already exists for this toolBar", m_actionSids.find(sid) == m_actionSids.end());
+            m_actionSids[sid] = SIDToolBarMapType::mapped_type(index, start);
+
+            ::fwGui::ActionCallbackBase::sptr callback ;
+            ::fwGui::GuiBaseObject::sptr guiObj = ::fwGui::factory::New(ActionCallbackBase::REGISTRY_KEY);
+            callback = ::fwGui::ActionCallbackBase::dynamicCast(guiObj);
+            OSLM_ASSERT("ClassFactoryRegistry failed for class "<< ::fwGui::ActionCallbackBase::REGISTRY_KEY, callback);
+
+            callback->setSID(sid);
+            m_callbacks.push_back(callback);
+        }
+        index++;
+    }
+    index = 0;
+    // initialize m_menuSids map with configuration
+    std::vector < ConfigurationType > vectMenus = configuration->find("menu");
+    BOOST_FOREACH( ConfigurationType menu, vectMenus)
+    {
+        SLM_ASSERT("<menu> tag must have sid attribute", menu->hasAttribute("sid"));
+        if(menu->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(menu->hasAttribute("start"))
+            {
+                std::string startValue = menu->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menu->getAttributeValue("sid");
+            OSLM_ASSERT("Action " << sid << " already exists for this toolBar", m_menuSids.find(sid) == m_menuSids.end());
+            m_menuSids[sid] = SIDToolBarMapType::mapped_type(index, start);
+        }
+        index++;
+    }
+
+    index = 0;
+    // initialize m_menuSids map with configuration
+    std::vector < ConfigurationType > vectEditors = configuration->find("editor");
+    BOOST_FOREACH( ConfigurationType editor, vectEditors)
+    {
+        SLM_ASSERT("<editor> tag must have sid attribute", editor->hasAttribute("sid"));
+        if(editor->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(editor->hasAttribute("start"))
+            {
+                std::string startValue = editor->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = editor->getAttributeValue("sid");
+            OSLM_ASSERT("Action " << sid << " already exists for this toolBar", m_editorSids.find(sid) == m_editorSids.end());
+            m_editorSids[sid] = SIDToolBarMapType::mapped_type(index, start);
+        }
+        index++;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::manage(std::vector< ::fwGui::container::fwMenuItem::sptr > menuItems )
+{
+    ::fwGui::container::fwMenuItem::sptr menuItem;
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_actionSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < menuItems.size());
+        menuItem = menuItems.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerActionSIDToParentSID(sid.first, m_sid);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            service->start();
+        }
+        else
+        {
+            bool service_exists = ::fwTools::fwID::exist(sid.first );
+            if (!service_exists || ::fwServices::get( sid.first )->isStopped())
+            {
+                ::fwGui::GuiRegistry::actionServiceStopping(sid.first);
+            }
+            else
+            {
+                ::fwGui::GuiRegistry::actionServiceStarting(sid.first);
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::manage(std::vector< ::fwGui::container::fwMenu::sptr > menus )
+{
+    ::fwGui::container::fwMenu::sptr menu;
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_menuSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < menus.size());
+        menu = menus.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerSIDMenu(sid.first, menu);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            service->start();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::manage(std::vector< ::fwGui::container::fwContainer::sptr > containers )
+{
+    ::fwGui::container::fwContainer::sptr container;
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_editorSids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < containers.size());
+        container = containers.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerSIDContainer(sid.first, container);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            service->start();
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::unmanage()
+{
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_actionSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterActionSIDToParentSID(sid.first, m_sid);
+    }
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_menuSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDMenu(sid.first);
+    }
+    BOOST_FOREACH( SIDToolBarMapType::value_type sid, m_editorSids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDContainer(sid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarRegistrar::onItemAction()
+{
+    SLM_WARN("TODO: ToolBarRegistrar::onItemAction not yet implemented");
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registrar
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/registrar/ViewRegistrar.cpp b/SrcLib/core/fwGui/src/fwGui/registrar/ViewRegistrar.cpp
new file mode 100644
index 0000000..5ed77af
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registrar/ViewRegistrar.cpp
@@ -0,0 +1,255 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <utility>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwServices/Base.hpp>
+
+#include "fwGui/GuiRegistry.hpp"
+#include "fwGui/registrar/ViewRegistrar.hpp"
+
+namespace fwGui
+{
+namespace registrar
+{
+
+//-----------------------------------------------------------------------------
+
+ViewRegistrar::ViewRegistrar(const std::string &sid)
+    : m_parentWid(""),
+      m_sid(sid)
+{}
+
+//-----------------------------------------------------------------------------
+
+ViewRegistrar::~ViewRegistrar()
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::container::fwContainer::sptr ViewRegistrar::getParent()
+{
+    ::fwGui::container::fwContainer::sptr parentContainer;
+    if(!m_parentWid.empty())
+    {
+        parentContainer = ::fwGui::GuiRegistry::getWIDContainer(m_parentWid);
+    }
+    else
+    {
+        parentContainer = ::fwGui::GuiRegistry::getSIDContainer(m_sid);
+    }
+    return parentContainer;
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::setParent(std::string wid)
+{
+    OSLM_ASSERT("This method is available only if this container has a WID parent container", !m_parentWid.empty());
+    m_parentWid = wid;
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::initialize( ::fwRuntime::ConfigurationElement::sptr configuration)
+{
+    OSLM_ASSERT("Bad configuration name "<<configuration->getName()<< ", must be viewRegistrar",
+            configuration->getName() == "registry");
+
+    // find parent container
+    std::vector < ConfigurationType > vectParent = configuration->find("parent");
+    if(!vectParent.empty())
+    {
+        ConfigurationType parent = vectParent.at(0);
+        SLM_ASSERT("<parent> tag must have wid attribute", parent->hasAttribute("wid"));
+        m_parentWid = parent->getAttributeValue("wid");
+    }
+
+    // index represents associated container with position in subViews vector
+    unsigned int index = 0;
+    // initialize m_sids and m_wids map with configuration
+    std::vector < ConfigurationType > vectViews = configuration->find("view");
+    BOOST_FOREACH( ConfigurationType view, vectViews)
+    {
+        SLM_ASSERT("<view> tag must have sid or wid attribute",
+                view->hasAttribute("sid") || view->hasAttribute("wid"));
+        if(view->hasAttribute("sid"))
+        {
+            bool start = false;
+            if(view->hasAttribute("start"))
+            {
+                std::string startValue = view->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                        startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = view->getAttributeValue("sid");
+            m_sids[sid] = SIDContainerMapType::mapped_type(index, start);
+        }
+        else if(view->hasAttribute("wid"))
+        {
+            std::string wid = view->getAttributeValue("wid");
+            m_wids[wid] = index;
+        }
+        index++;
+    }
+
+    // find menuBar
+    std::vector < ConfigurationType > vectmenuBar = configuration->find("menuBar");
+    if(!vectmenuBar.empty())
+    {
+        ConfigurationType menuBarCfg = vectmenuBar.at(0);
+        if (menuBarCfg->hasAttribute("sid"))
+        {
+            bool start = false;
+            if (menuBarCfg->hasAttribute("start"))
+            {
+                std::string startValue = menuBarCfg->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                           startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = menuBarCfg->getAttributeValue("sid");
+            m_menuBarSid =  std::make_pair( sid, start);
+        }
+    }
+
+    // find toolBar
+    std::vector < ConfigurationType > vectToolBar = configuration->find("toolBar");
+    if(!vectToolBar.empty())
+    {
+        ConfigurationType toolBarCfg = vectToolBar.at(0);
+        if (toolBarCfg->hasAttribute("sid"))
+        {
+            bool start = false;
+            if (toolBarCfg->hasAttribute("start"))
+            {
+                std::string startValue = toolBarCfg->getAttributeValue("start");
+                SLM_ASSERT("Wrong value '"<< startValue <<"' for 'start' attribute (require yes or no)",
+                           startValue == "yes" || startValue == "no");
+                start = (startValue=="yes");
+            }
+            std::string sid = toolBarCfg->getAttributeValue("sid");
+            m_toolBarSid =  std::make_pair( sid, start);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::manage(std::vector< ::fwGui::container::fwContainer::sptr > subViews )
+{
+    ::fwGui::container::fwContainer::sptr container;
+    BOOST_FOREACH( SIDContainerMapType::value_type sid, m_sids)
+    {
+        OSLM_ASSERT("Container index "<< sid.second.first <<" is bigger than subViews size!", sid.second.first < subViews.size());
+        container = subViews.at( sid.second.first );
+        ::fwGui::GuiRegistry::registerSIDContainer(sid.first, container);
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            OSLM_ASSERT("Service "<<sid.first <<" must be stopped.", service->isStopped() );
+            SLM_TRACE("Starting " + sid.first);
+            service->start();
+        }
+    }
+
+    BOOST_FOREACH( WIDContainerMapType::value_type wid, m_wids)
+    {
+        OSLM_ASSERT("Container index "<< wid.second <<" is bigger than subViews size!", wid.second < subViews.size());
+        container = subViews.at( wid.second );
+        ::fwGui::GuiRegistry::registerWIDContainer(wid.first, container);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::manageMenuBar(::fwGui::container::fwMenuBar::sptr menuBar )
+{
+    ::fwGui::GuiRegistry::registerSIDMenuBar(m_menuBarSid.first, menuBar);
+    if(m_menuBarSid.second) //service is auto started?
+    {
+        OSLM_ASSERT("Service "<<m_menuBarSid.first <<" not exists.", ::fwTools::fwID::exist(m_menuBarSid.first ) );
+        ::fwServices::IService::sptr service = ::fwServices::get( m_menuBarSid.first ) ;
+        service->start();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::manageToolBar(::fwGui::container::fwToolBar::sptr toolBar )
+{
+    ::fwGui::GuiRegistry::registerSIDToolBar(m_toolBarSid.first, toolBar);
+    if(m_toolBarSid.second) //service is auto started?
+    {
+        OSLM_ASSERT("Service "<<m_toolBarSid.first <<" not exists.", ::fwTools::fwID::exist(m_toolBarSid.first ) );
+        ::fwServices::IService::sptr service = ::fwServices::get( m_toolBarSid.first ) ;
+        service->start();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::unmanage()
+{
+    BOOST_FOREACH( SIDContainerMapType::value_type sid, m_sids)
+    {
+        if(sid.second.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<sid.first <<" not exists.", ::fwTools::fwID::exist(sid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( sid.first ) ;
+            SLM_TRACE("Stopping " + sid.first);
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDContainer(sid.first);
+    }
+
+    BOOST_FOREACH( WIDContainerMapType::value_type wid, m_wids)
+    {
+        ::fwGui::GuiRegistry::unregisterWIDContainer(wid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::unmanageToolBar()
+{
+    if ( !m_toolBarSid.first.empty() )
+    {
+        if(m_toolBarSid.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<m_toolBarSid.first <<" not exists.", ::fwTools::fwID::exist(m_toolBarSid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( m_toolBarSid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDToolBar(m_toolBarSid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ViewRegistrar::unmanageMenuBar()
+{
+    if ( !m_menuBarSid.first.empty() )
+    {
+        if(m_menuBarSid.second) //service is auto started?
+        {
+            OSLM_ASSERT("Service "<<m_menuBarSid.first <<" not exists.", ::fwTools::fwID::exist(m_menuBarSid.first ) );
+            ::fwServices::IService::sptr service = ::fwServices::get( m_menuBarSid.first ) ;
+            service->stop();
+        }
+        ::fwGui::GuiRegistry::unregisterSIDMenuBar(m_menuBarSid.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registrar
+} //namespace fwGui
diff --git a/SrcLib/core/fwGui/src/fwGui/registry/detail.cpp b/SrcLib/core/fwGui/src/fwGui/registry/detail.cpp
new file mode 100644
index 0000000..95904da
--- /dev/null
+++ b/SrcLib/core/fwGui/src/fwGui/registry/detail.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwGui/registry/detail.hpp"
+
+
+namespace fwGui
+{
+
+namespace registry
+{
+
+struct FwGuiRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwGuiRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace fwGui
+
+
diff --git a/SrcLib/core/fwGuiQt/CMakeLists.txt b/SrcLib/core/fwGuiQt/CMakeLists.txt
new file mode 100644
index 0000000..0b3246b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/CMakeLists.txt
@@ -0,0 +1,34 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwGui
+    fwRuntime
+    fwTools
+)
+
+if(CLASSIC_INSTALL)
+	configure_file("${CMAKE_CURRENT_LIST_DIR}/bin/qt.conf" "${CMAKE_BINARY_DIR}/bin/qt.conf")
+else()
+	configure_file("${CMAKE_CURRENT_LIST_DIR}/bin/qt.conf" "${BINFW4SPL}/qt.conf")
+endif()
+
+if(${FWPROJECT_NAME}_INSTALL)
+	if(CLASSIC_INSTALL)
+    	install(DIRECTORY "${QT_DIR}/plugins/" DESTINATION qtplugins)
+    else()
+    	install(DIRECTORY "${QT_DIR}/plugins/" DESTINATION "/usr/lib/qtplugins")
+    endif()
+endif()
+
+add_definitions("-DQT_NO_KEYWORDS")
+
+
+find_package(Boost REQUIRED)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+
+
+fwForwardInclude(${Boost_INCLUDE_DIRS} ${QT_INCLUDE_DIR})
+fwLink(${QT_LIBRARIES})
+
+set_target_properties(${FWPROJECT_NAME} PROPERTIES AUTOMOC TRUE)
diff --git a/SrcLib/core/fwGuiQt/COPYING b/SrcLib/core/fwGuiQt/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwGuiQt/COPYING.LESSER b/SrcLib/core/fwGuiQt/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwGuiQt/Properties.cmake b/SrcLib/core/fwGuiQt/Properties.cmake
new file mode 100644
index 0000000..f0ed5e9
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwGuiQt )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwData fwGui fwRuntime fwServices fwThread fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwGuiQt/bin/build.options b/SrcLib/core/fwGuiQt/bin/build.options
new file mode 100644
index 0000000..d6a00bf
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/bin/build.options
@@ -0,0 +1,19 @@
+USE        = [
+        'boost',
+        'qtGui',
+        'qtIconenginesPlugins',
+        'qtImageformatsPlugins',
+    ]
+
+LIB        = [
+    'fwGui_0-1',
+    'fwData_0-1',
+    'fwTools_0-1',
+    'fwCore_0-1',
+    'fwServices_0-1',
+    'fwThread_0-1',
+    ]
+
+TYPE       = 'shared'
+GLOBAL_DEF = ['QT_NO_KEYWORDS']
+VERSION    = '0-1'
diff --git a/SrcLib/core/fwGuiQt/bin/qt.conf b/SrcLib/core/fwGuiQt/bin/qt.conf
new file mode 100644
index 0000000..78301c0
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/bin/qt.conf
@@ -0,0 +1,3 @@
+[Paths]
+Prefix = ${QT_DIR}
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/ActionCallback.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/ActionCallback.hpp
new file mode 100644
index 0000000..f7e0a61
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/ActionCallback.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_ACTIONCALLBACK_HPP_
+#define _FWGUIQT_ACTIONCALLBACK_HPP_
+
+
+#include <QObject>
+
+#include <fwGui/ActionCallbackBase.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief   Defines the menu item callback.
+ * @class   ActionCallback
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API ActionCallback :  public QObject, public ::fwGui::ActionCallbackBase
+{
+
+    Q_OBJECT
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ActionCallback)(::fwGui::ActionCallbackBase),
+                                            (()),
+                                            ::fwGui::factory::New< ActionCallback > );
+
+    FWGUIQT_API ActionCallback(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIQT_API virtual ~ActionCallback() ;
+
+    /**
+     * @brief  Qt slot.
+     */
+public Q_SLOTS:
+    void executeQt(bool checked = false);
+    void checkQt(bool checked);
+
+};
+
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_ACTIONCALLBACK_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/App.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/App.hpp
new file mode 100644
index 0000000..47a00b7
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/App.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQT_APP_HPP_
+#define FWGUIQT_APP_HPP_
+
+#include <QApplication>
+
+#include <fwRuntime/profile/Profile.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief   Defines the Qt application.
+ * @class   App
+ * 
+ * @date    2009.
+ */
+
+class FWGUIQT_CLASS_API App : public QApplication
+{
+    Q_OBJECT
+
+public:
+    FWGUIQT_API App(int & argc, char ** argv);
+
+public Q_SLOTS :
+  void aboutToQuit();
+  void onExit();
+
+};
+
+
+
+} // namespace fwGuiQt
+
+
+#endif /*FWGUIQT_APP_HPP_*/
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/Application.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/Application.hpp
new file mode 100644
index 0000000..4a5ba56
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/Application.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_APPLICATION_HPP_
+#define _FWGUIQT_APPLICATION_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/Application.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief   Gives access to the qt application part
+ * @class   Application
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API Application : public ::fwGui::Application
+{
+
+public:
+
+    Application(::fwGui::GuiBaseObject::Key key){};
+
+    virtual ~Application(){};
+
+    /// Tells the application to exit with a returncode
+    FWGUIQT_API virtual void exit( int returncode = 0);
+
+};
+
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_APPLICATION_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/Cursor.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/Cursor.hpp
new file mode 100644
index 0000000..9cd9741
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/Cursor.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CURSOR_HPP_
+#define _FWGUIQT_CURSOR_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/ICursor.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief   Defines the generic cursor for IHM.
+ * @class   Cursor
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API Cursor : public ::fwGui::ICursor
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Cursor)(::fwGui::ICursor),
+                                            (()),
+                                            ::fwGui::factory::New< Cursor > );
+
+    FWGUIQT_API Cursor(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~Cursor();
+
+    /// Set the cursor
+    FWGUIQT_API virtual void setCursor( ::fwGui::ICursor::CursorType cursor);
+
+    /// Set the default cursor
+    FWGUIQT_API virtual void setDefaultCursor();
+
+};
+
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CURSOR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/Namespace.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/Namespace.hpp
new file mode 100644
index 0000000..8af6083
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQTNAMESPACE_HPP_
+#define FWGUIQTNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwGuiQt contains classes which provide the implementation of the Gui using Qt library.
+ * @namespace   fwGuiQt
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace fwGuiQt
+{
+}
+#endif /* FWGUIQTNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/QtMainFrame.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/QtMainFrame.hpp
new file mode 100644
index 0000000..2b90138
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/QtMainFrame.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_MAINFRAME_HPP_
+#define _FWGUIQT_MAINFRAME_HPP_
+
+
+#include <QPointer>
+#include <QMainWindow>
+
+#include <boost/function.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief A qt panel used to control a VTK 2D Negatoscope view.
+ * 
+ */
+class QtMainFrame : public QMainWindow
+{
+
+    Q_OBJECT
+
+public:
+    /**
+     * @brief Constructor.
+     */
+    FWGUIQT_API QtMainFrame() throw();
+
+
+    /// @brief Destructor.
+    FWGUIQT_API virtual ~QtMainFrame() throw();
+
+    typedef ::boost::function0<void> CloseCallback;
+    FWGUIQT_API void setCloseCallback(CloseCallback fct);
+
+
+protected:
+    void closeEvent(QCloseEvent *event);
+
+private:
+    CloseCallback m_fctCloseCallback;
+};
+
+} // fwGuiQt
+
+#endif // _FWGUIQT_MAINFRAME_HPP_
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/SliceSelector.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/SliceSelector.hpp
new file mode 100644
index 0000000..c7e89b1
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/SliceSelector.hpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_SLICESELECTOR_HPP_
+#define _FWGUIQT_SLICESELECTOR_HPP_
+
+
+#include <QObject>
+#include <QPointer>
+#include <QWidget>
+
+#include <boost/function.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+// Qt
+class QSlider;
+class QLineEdit;
+class QComboBox;
+class QStringList;
+
+namespace fwGuiQt
+{
+
+/**
+ * @brief A qt panel used to control a VTK 2D Negatoscope view.
+ * 
+ */
+class SliceSelector : public QWidget
+{
+
+    Q_OBJECT
+
+public:
+    /**
+     * @brief Constructor.
+     * @param parent The parent widget.
+     */
+    FWGUIQT_API SliceSelector( QWidget* const parent) throw();
+
+
+    /// @brief Destructor.
+    FWGUIQT_API virtual ~SliceSelector() throw();
+
+    FWGUIQT_API void setSliceRange( int min, int max );
+
+    FWGUIQT_API void setSliceValue( int index );
+
+    FWGUIQT_API void setTypeSelection( int type );
+
+    FWGUIQT_API void setEnable(bool enable);
+
+    typedef ::boost::function1<void, int > ChangeIndexCallback;
+    FWGUIQT_API void setChangeIndexCallback(ChangeIndexCallback fct);
+
+    typedef ::boost::function1<void, int > ChangeTypeCallback;
+    FWGUIQT_API void setChangeTypeCallback(ChangeTypeCallback fct);
+
+protected Q_SLOTS:
+
+    /**
+     * @brief Event handler for a slice type change.
+     * @param index index of the selected type item.
+     */
+    FWGUIQT_API void onSliceTypeChange( int index );
+
+    /**
+     * @brief Event handler for a slice index change.
+     * @param value current value of the slice index slider.
+     */
+    FWGUIQT_API void onSliceIndexChange( int value ) throw();
+
+private:
+
+    QPointer< QComboBox > m_sliceType;
+
+    /// @brief Slice type names as a qt string array.
+    static const QStringList m_sliceTypesArray;
+
+    /// @brief The slice index slider widget.
+    QPointer< QSlider > m_sliceIndex;
+    QPointer< QLineEdit > m_pSliceIndexText;
+
+    void printIndex(int index);
+    void printType(int type);
+
+    ChangeIndexCallback m_fctChangeIndexCallback;
+    ChangeTypeCallback m_fctChangeTypeCallback;
+};
+
+} // fwGuiQt
+
+#endif // _FWGUIQT_SLICESELECTOR_HPP_
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/WorkerQt.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/WorkerQt.hpp
new file mode 100644
index 0000000..a4025fe
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/WorkerQt.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQT_WORKERQT_HPP_
+#define FWGUIQT_WORKERQT_HPP_
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwThread
+{
+    class Worker;
+} //namespace fwThread
+
+
+
+namespace fwGuiQt
+{
+
+FWGUIQT_API SPTR(::fwThread::Worker) getQtWorker( int &argc, char **argv );
+
+} //namespace fwGui
+
+#endif /*FWGUIQT_WORKERQT_HPP_*/
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ContainerBuilder.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ContainerBuilder.hpp
new file mode 100644
index 0000000..5c2b88b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ContainerBuilder.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_BUILDER_CONTAINERBUILDER_HPP_
+#define _FWGUIQT_BUILDER_CONTAINERBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IContainerBuilder.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   ContainerBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API ContainerBuilder : public ::fwGui::builder::IContainerBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ContainerBuilder)(::fwGui::builder::IContainerBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< ContainerBuilder > );
+
+    FWGUIQT_API ContainerBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~ContainerBuilder();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent container must be instanced.
+     */
+    FWGUIQT_API virtual void createContainer( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setParent(::fwGui::container::fwContainer::sptr parent);
+
+protected:
+    ::fwGuiQt::container::QtContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIQT_BUILDER_CONTAINERBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/MenuBarBuilder.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/MenuBarBuilder.hpp
new file mode 100644
index 0000000..4b5627c
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/MenuBarBuilder.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_BUILDER_MENUBARBUILDER_HPP_
+#define _FWGUIQT_BUILDER_MENUBARBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IMenuBarBuilder.hpp>
+#include <fwGui/container/fwMenuBar.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   MenuBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API MenuBarBuilder : public ::fwGui::builder::IMenuBarBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuBarBuilder)(::fwGui::builder::IMenuBarBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< MenuBarBuilder > );
+
+    FWGUIQT_API MenuBarBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~MenuBarBuilder();
+
+    /**
+     * @brief Instantiate layout with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUIQT_API virtual void createMenuBar( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyMenuBar();
+
+protected:
+    ::fwGuiQt::container::QtContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIQT_BUILDER_MENUBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/Namespace.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/Namespace.hpp
new file mode 100644
index 0000000..dce5935
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQTBUILDERNAMESPACE_HPP_
+#define FWGUIQTBUILDERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::builder contains the classes for GUI elements builder implementation with the Qt library.
+ * @namespace   fwGui::builder
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace builder
+{
+
+}
+}
+#endif /* FWGUIQTBUILDERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ToolBarBuilder.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ToolBarBuilder.hpp
new file mode 100644
index 0000000..e2f5924
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/builder/ToolBarBuilder.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_BUILDER_TOOLBARBUILDER_HPP_
+#define _FWGUIQT_BUILDER_TOOLBARBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IToolBarBuilder.hpp>
+#include <fwGui/container/fwToolBar.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   ToolBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API ToolBarBuilder : public ::fwGui::builder::IToolBarBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolBarBuilder)(::fwGui::builder::IToolBarBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< ToolBarBuilder >);
+
+    FWGUIQT_API ToolBarBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~ToolBarBuilder();
+
+    /**
+     * @brief Instantiate layout with parent toolBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent toolBar must be instanced.
+     */
+    FWGUIQT_API virtual void createToolBar( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyToolBar();
+
+protected:
+    ::fwGuiQt::container::QtContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIQT_BUILDER_TOOLBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/config.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/config.hpp
new file mode 100644
index 0000000..20917ee
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWGUIQT_CONFIG_HPP_
+#define _FWGUIQT_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWGUIQT_EXPORTS
+    #define FWGUIQT_API __declspec(dllexport)
+    #else
+    #define FWGUIQT_API __declspec(dllimport)
+    #endif
+
+    #define FWGUIQT_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWGUIQT_EXPORTS
+    #define FWGUIQT_API __attribute__ ((visibility("default")))
+    #define FWGUIQT_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWGUIQT_API __attribute__ ((visibility("hidden")))
+    //#define FWGUIQT_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWGUIQT_API
+    #define FWGUIQT_CLASS_API
+    #endif
+
+#else
+
+    #define FWGUIQT_API
+    #define FWGUIQT_CLASS_API
+
+#endif
+
+#endif //_FWGUIQT_CONFIG_HPP_
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/Namespace.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/Namespace.hpp
new file mode 100644
index 0000000..f842a3b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQTCONTAINERNAMESPACE_HPP_
+#define FWGUIQTCONTAINERNAMESPACE_HPP_
+
+namespace fwGuiQt
+{
+/**
+ * @brief       The namespace fwGuiQt::container contains the classes used for container implementation with Qt Library.
+ * @namespace   fwGuiQt::container
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace container
+{
+
+}
+}
+#endif /* FWGUIQTCONTAINERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtContainer.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtContainer.hpp
new file mode 100644
index 0000000..05b73c4
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtContainer.hpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CONTAINER_QTCONTAINER_HPP_
+#define _FWGUIQT_CONTAINER_QTCONTAINER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QWidget;
+QT_END_NAMESPACE
+
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the QWidget container for IHM.
+ * @class   QtContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API QtContainer : public ::fwGui::container::fwContainer
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (QtContainer)(::fwGui::container::fwContainer),
+                                            (()),
+                                            ::fwGui::factory::New< QtContainer > );
+
+    FWGUIQT_API QtContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIQT_API virtual ~QtContainer() throw() ;
+
+
+    FWGUIQT_API virtual void clean();
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setQtContainer(QWidget *container);
+    FWGUIQT_API virtual QWidget* getQtContainer();
+    FWGUIQT_API virtual bool isShownOnScreen();
+
+    FWGUIQT_API virtual void setVisible(bool isVisible);
+
+private :
+
+    QPointer<QWidget> m_container;
+};
+
+} // namespace container
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CONTAINER_QTCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuBarContainer.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuBarContainer.hpp
new file mode 100644
index 0000000..48d03ff
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuBarContainer.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CONTAINER_QTMENUBARCONTAINER_HPP_
+#define _FWGUIQT_CONTAINER_QTMENUBARCONTAINER_HPP_
+
+#include <QPointer>
+
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenuBar.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+QT_BEGIN_NAMESPACE
+class QMenuBar;
+QT_END_NAMESPACE
+
+
+namespace fwGuiQt
+{
+
+namespace container
+{
+
+/**
+ * @brief   Defines the Qt menu bar container for GUI.
+ * @class   QtMenuBarContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API QtMenuBarContainer : public ::fwGui::container::fwMenuBar
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (QtMenuBarContainer)(::fwGui::container::fwMenuBar),
+                                            (()),
+                                            ::fwGui::factory::New< QtMenuBarContainer > );
+
+    FWGUIQT_API QtMenuBarContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIQT_API virtual ~QtMenuBarContainer() throw() ;
+
+
+    FWGUIQT_API virtual void clean();
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setQtMenuBar(QMenuBar *menuBar);
+    FWGUIQT_API virtual QMenuBar* getQtMenuBar();
+
+private :
+
+    QPointer<QMenuBar> m_menuBar;
+};
+
+} // namespace container
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CONTAINER_QTMENUBARCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuContainer.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuContainer.hpp
new file mode 100644
index 0000000..43cfccf
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuContainer.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CONTAINER_QTMENUCONTAINER_HPP_
+#define _FWGUIQT_CONTAINER_QTMENUCONTAINER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenu.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QMenu;
+QT_END_NAMESPACE
+
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the Qt menu bar container for IHM.
+ * @class   QtMenuContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API QtMenuContainer : public ::fwGui::container::fwMenu
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (QtMenuContainer)(::fwGui::container::fwMenu),
+                                            (()),
+                                            ::fwGui::factory::New< QtMenuContainer > );
+
+    FWGUIQT_API QtMenuContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIQT_API virtual ~QtMenuContainer() throw() ;
+
+
+    FWGUIQT_API virtual void clean();
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setQtMenu(QMenu *menu);
+    FWGUIQT_API virtual QMenu* getQtMenu();
+
+private :
+
+    QPointer<QMenu> m_menu;
+};
+
+} // namespace container
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CONTAINER_QTMENUCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuItemContainer.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuItemContainer.hpp
new file mode 100644
index 0000000..8ee3c32
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtMenuItemContainer.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CONTAINER_QTMENUITEMCONTAINER_HPP_
+#define _FWGUIQT_CONTAINER_QTMENUITEMCONTAINER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenuItem.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+QT_BEGIN_NAMESPACE
+class QAction;
+QT_END_NAMESPACE
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the Qt menuItem bar container for IHM.
+ * @class   QtMenuItemContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API QtMenuItemContainer : public ::fwGui::container::fwMenuItem
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (QtMenuItemContainer)(::fwGui::container::fwMenuItem),
+                                            (()),
+                                            ::fwGui::factory::New< QtMenuItemContainer > );
+
+    FWGUIQT_API QtMenuItemContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIQT_API virtual ~QtMenuItemContainer() throw() ;
+
+
+    FWGUIQT_API virtual void clean();
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setQtMenuItem(QAction* menuItem);
+    FWGUIQT_API virtual QAction* getQtMenuItem();
+
+private :
+
+    QPointer<QAction> m_menuItem;
+};
+
+} // namespace container
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CONTAINER_QTMENUITEMCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtToolBarContainer.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtToolBarContainer.hpp
new file mode 100644
index 0000000..47a6648
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/container/QtToolBarContainer.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_CONTAINER_QTTOOLBARCONTAINER_HPP_
+#define _FWGUIQT_CONTAINER_QTTOOLBARCONTAINER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwToolBar.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QToolBar;
+QT_END_NAMESPACE
+
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the Qt toolBar bar container for IHM.
+ * @class   QtToolBarContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API QtToolBarContainer : public ::fwGui::container::fwToolBar
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (QtToolBarContainer)(::fwGui::container::fwToolBar),
+                                            (()),
+                                            ::fwGui::factory::New< QtToolBarContainer > );
+
+    FWGUIQT_API QtToolBarContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIQT_API virtual ~QtToolBarContainer() throw() ;
+
+
+    FWGUIQT_API virtual void clean();
+    FWGUIQT_API virtual void destroyContainer();
+
+    FWGUIQT_API virtual void setQtToolBar(QToolBar *toolBar);
+    FWGUIQT_API virtual QToolBar* getQtToolBar();
+
+private :
+
+    QPointer<QToolBar> m_toolBar;
+};
+
+} // namespace container
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_CONTAINER_QTTOOLBARCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/InputDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/InputDialog.hpp
new file mode 100644
index 0000000..347f90c
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/InputDialog.hpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_INPUTDIALOG_HPP_
+#define _FWGUIQT_INPUTDIALOG_HPP_
+
+#include <string>
+#include <fwCore/base.hpp>
+
+#include <fwGui/dialog/IInputDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+/**
+ * @brief   Defines an Input dialog.
+ * @class   InputDialog
+ * 
+ * @date    2009-2010.
+ *
+ * Example of use:
+ * @verbatim
+  ::fwGui::dialog::InputDialog inputDlg;
+  inputDlg.setTitle("Identification dialog");
+  inputDlg.setMessage("Enter Pin Code: ");
+  inputDlg.setInput ("<Enter your code here>");
+  std::string inputText = inputDlg.getInput();
+  @endverbatim
+ */
+class FWGUIQT_CLASS_API InputDialog : public ::fwGui::dialog::IInputDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (InputDialog)(::fwGui::dialog::IInputDialog),
+                                            (()),
+                                            ::fwGui::factory::New< InputDialog > );
+
+    FWGUIQT_API InputDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~InputDialog();
+
+    /// Set the title of the message box
+    FWGUIQT_API virtual void setTitle( const std::string &title );
+
+    /// Set the message
+    FWGUIQT_API virtual void setMessage( const std::string &msg );
+
+    /// Set the input text in the input field
+    FWGUIQT_API virtual void setInput(const std::string &text);
+
+    /// Get the input text in the input field
+    FWGUIQT_API virtual std::string getInput();
+
+protected:
+    /// Dialog title
+    std::string m_title;
+    /// Dialog box message
+    std::string m_message;
+    /// Text inputed
+    std::string m_input;
+
+};
+} // namespace dialog
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_INPUTDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/LocationDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/LocationDialog.hpp
new file mode 100644
index 0000000..d40ba5a
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/LocationDialog.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LOCATIONDIALOG_HPP_
+#define _FWGUIQT_LOCATIONDIALOG_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/dialog/ILocationDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+class QString;
+
+
+/**
+ * @brief       The namespace fwGuiQt contains classes which provide the implementation of the Gui using Qt library.
+ * @namespace   fwGuiQt
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwGuiQt
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic file/folder dialog for IHM.
+ * @class   LocationDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API LocationDialog : public ::fwGui::dialog::ILocationDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (LocationDialog)(::fwGui::dialog::ILocationDialog),
+                                            (()),
+                                            ::fwGui::factory::New< LocationDialog > );
+
+    FWGUIQT_API LocationDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API ::fwData::location::ILocation::sptr show();
+
+    FWGUIQT_API void setType( ::fwGui::dialog::ILocationDialog::Types type );
+
+    FWGUIQT_API ::fwGui::dialog::ILocationDialog& setOption( ::fwGui::dialog::ILocationDialog::Options option);
+
+    // Example ( addFilter("images","*.png *.jpg");
+    FWGUIQT_API void addFilter(const std::string &filterName, const std::string &wildcardList );
+
+protected:
+
+    ::fwGui::dialog::ILocationDialog::Options m_style;
+    ::fwGui::dialog::ILocationDialog::Types m_type;
+    std::vector< std::pair< std::string, std::string > > m_filters;
+
+    /// helper to transform m_filters into qt encoding ("BMP and GIF files (*.bmp *.gif);;PNG files (*.png)"
+    QString fileFilters();
+
+};
+} // namespace dialog
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_LOCATIONDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MessageDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MessageDialog.hpp
new file mode 100644
index 0000000..30f510c
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MessageDialog.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_MESSAGEBOX_HPP_
+#define _FWGUIQT_MESSAGEBOX_HPP_
+
+#include <string>
+#include <fwCore/base.hpp>
+
+#include <fwGui/dialog/IMessageDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic message box for IHM.
+ * @class   MessageDialog
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API MessageDialog : public ::fwGui::dialog::IMessageDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MessageDialog)(::fwGui::dialog::IMessageDialog),
+                                            (()),
+                                            ::fwGui::factory::New< MessageDialog > );
+
+    FWGUIQT_API MessageDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~MessageDialog();
+
+    /// Set the title of the message box
+    FWGUIQT_API virtual void setTitle( const std::string &title );
+
+    /// Set the message
+    FWGUIQT_API virtual void setMessage( const std::string &msg );
+
+    /// Set the icon (CRITICAL, WARNING, INFO or QUESTION)
+    FWGUIQT_API virtual void setIcon( IMessageDialog::Icons icon);
+
+    /// Add a button (OK, YES_NO, CANCEL)
+    FWGUIQT_API virtual void addButton( IMessageDialog::Buttons button );
+
+    /// Set the default buttons
+    FWGUIQT_API virtual void setDefaultButton( IMessageDialog::Buttons button );
+
+    /// Show the message box and return the clicked button.
+    FWGUIQT_API virtual Buttons show();
+
+protected:
+    /// Dialog title
+    std::string m_title;
+    /// Dialog box message
+    std::string m_message;
+    /// List of the button
+    ::fwGui::dialog::IMessageDialog::Buttons m_buttons;
+    /// default buttons
+    ::fwGui::dialog::IMessageDialog::Buttons m_defaultButton;
+    /// Icon
+    ::fwGui::dialog::IMessageDialog::Icons m_icon;
+};
+} // namespace dialog
+} // namespace fwGuiQt
+
+#endif /*_FWGUIQT_MESSAGEBOX_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MultiSelectorDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MultiSelectorDialog.hpp
new file mode 100644
index 0000000..9658bbe
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/MultiSelectorDialog.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQT_MULTISELECTORDIALOG_HPP_
+#define FWGUIQT_MULTISELECTORDIALOG_HPP_
+
+#include <vector>
+
+#include <QDialog>
+#include <QString>
+#include <QWidget>
+
+#include <fwGui/dialog/IMultiSelectorDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   MultiSelectorDialog allowing the choice of an element among severals (_selections)
+ * @class   MultiSelectorDialog
+ * 
+ * @date    2009.
+ */
+
+class FWGUIQT_CLASS_API MultiSelectorDialog : public ::fwGui::dialog::IMultiSelectorDialog,  public QDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MultiSelectorDialog)(::fwGui::dialog::IMultiSelectorDialog),
+                                            (()),
+                                            ::fwGui::factory::New< MultiSelectorDialog > );
+
+    FWGUIQT_API MultiSelectorDialog(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIQT_API virtual ~MultiSelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUIQT_API virtual void setSelections(Selections _selections);
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUIQT_API virtual void setTitle(std::string _title);
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUIQT_API virtual Selections show();
+
+    FWGUIQT_API virtual void setMessage(const std::string &msg);
+
+private :
+
+    Selections m_selections;
+    /// Dialog box message
+    std::string m_message;
+    std::string m_title;
+};
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+#endif /*FWGUIQT_MULTISELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/Namespace.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/Namespace.hpp
new file mode 100644
index 0000000..9cfd5f4
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQTDIALOGNAMESPACE_HPP_
+#define FWGUIQTDIALOGNAMESPACE_HPP_
+
+namespace fwGuiQt
+{
+/**
+ * @brief       The namespace fwGuiQt::dialog contains the classes used for container implementation with Qt Library.
+ * @namespace   fwGuiQt::dialog
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace dialog
+{
+
+}
+}
+#endif /* FWGUIQTDIALOGNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/ProgressDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/ProgressDialog.hpp
new file mode 100644
index 0000000..9da2739
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/ProgressDialog.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_PROGRESSDIALOG_HPP
+#define _FWGUIQT_PROGRESSDIALOG_HPP
+
+
+#include <string>
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QPointer>
+#include <QProgressBar>
+#include <QProgressDialog>
+#include <QPushButton>
+#include <QStatusBar>
+#include <QString>
+
+#include <fwGui/dialog/IProgressDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+#include "fwGuiQt/container/QtContainer.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QProgressDialog;
+QT_END_NAMESPACE
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+/**
+ * @brief   This class allows us to select an acquisition in a patient data base.
+ * @class   ProgressDialog
+ * 
+ * @date    2009.
+ * @note Do not inherit from fwProgressDialog but embed a fwProgressDialog because this lasted is not copiable.
+ * @todo ProgressDialog is not commented.
+ */
+class FWGUIQT_CLASS_API ProgressDialog : public QObject, public ::fwGui::dialog::IProgressDialog
+{
+    Q_OBJECT
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ProgressDialog)(::fwGui::dialog::IProgressDialog),
+                                            (()),
+                                            ::fwGui::factory::New< ProgressDialog > );
+
+    FWGUIQT_API ProgressDialog( ::fwGui::GuiBaseObject::Key key,
+                                const std::string &title="Progression",
+                                const std::string &message= std::string(86,' ') );
+
+    FWGUIQT_API virtual ~ProgressDialog();
+
+    FWGUIQT_API void operator()(float percent,std::string msg);
+
+    /// override
+    FWGUIQT_API void setTitle(const std::string &title);
+
+    /// override
+    FWGUIQT_API void setMessage(const std::string &message);
+
+    FWGUIQT_API void hideCancelButton();
+
+protected Q_SLOTS:
+    void cancelPressed();
+
+protected :
+
+    QString m_title;
+
+    QPointer< QProgressDialog >  m_pdialog;
+    QPointer< QProgressBar >     m_pprogressbar;
+    QPointer< QPushButton >      m_pcancelButton;
+    QPointer< QMainWindow >      m_pmainWindow;
+
+};
+} // namespace dialog
+} // namespace fwGuiQt
+
+
+#endif /* _FWGUIQT_PROGRESSDIALOG_HPP */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/PulseProgressDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/PulseProgressDialog.hpp
new file mode 100644
index 0000000..c1ba39d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/PulseProgressDialog.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_PULSEPROGRESSDIALOG_HPP
+#define _FWGUIQT_PULSEPROGRESSDIALOG_HPP
+
+
+#include <string>
+
+
+#include <QProgressDialog>
+#include <QPointer>
+
+#include <fwGui/dialog/IPulseProgressDialog.hpp>
+
+#include "fwGuiQt/config.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QProgressDialog;
+QT_END_NAMESPACE
+
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+/**
+ * @brief   This class allows us to show a pulse progress bar.
+ * @class   PulseProgressDialog
+ * 
+ * @date    2009.
+ */
+class FWGUIQT_CLASS_API PulseProgressDialog : public ::fwGui::dialog::IPulseProgressDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (PulseProgressDialog)(::fwGui::dialog::IPulseProgressDialog),
+                                            (()),
+                                            ::fwGui::factory::New< PulseProgressDialog > );
+
+    FWGUIQT_API PulseProgressDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~PulseProgressDialog();
+
+    /// override
+    FWGUIQT_API void setTitle(const std::string &title);
+
+    /// override
+    FWGUIQT_API void setMessage(const std::string &message);
+
+    FWGUIQT_API void show();
+
+protected :
+
+    QPointer< QProgressDialog >  m_pdialog;
+
+};
+} // namespace dialog
+} // namespace fwGuiQt
+
+
+#endif /* _FWGUIQT_PULSEPROGRESSDIALOG_HPP */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/SelectorDialog.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/SelectorDialog.hpp
new file mode 100644
index 0000000..339d0a6
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/dialog/SelectorDialog.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQT_SELECTORDIALOG_HPP_
+#define FWGUIQT_SELECTORDIALOG_HPP_
+
+#include <vector>
+
+#include <QDialog>
+#include <QString>
+#include <QWidget>
+
+#include <fwGui/dialog/ISelectorDialog.hpp>
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   SelectorDialog allowing the choice of an element among severals (_selections)
+ * @class   SelectorDialog
+ * 
+ * @date    2009.
+ */
+
+class FWGUIQT_CLASS_API SelectorDialog : public ::fwGui::dialog::ISelectorDialog,  public QDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (SelectorDialog)(::fwGui::dialog::ISelectorDialog),
+                                            (()),
+                                            ::fwGui::factory::New< SelectorDialog > );
+
+    FWGUIQT_API SelectorDialog(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIQT_API virtual ~SelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUIQT_API virtual void setSelections(std::vector< std::string > _selections);
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUIQT_API virtual void setTitle(std::string _title);
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUIQT_API virtual std::string show();
+
+    /// Set the message
+    FWGUIQT_API virtual void setMessage(const std::string &msg);
+
+private :
+
+    std::vector< std::string > m_selections;
+    /// Dialog box message
+    std::string m_message;
+    std::string m_title;
+};
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+#endif /*FWGUIQT_SELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/CppHighlighter.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/CppHighlighter.hpp
new file mode 100644
index 0000000..3096d9d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/CppHighlighter.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_HIGHLIGHTER_CPPHIGHLIGHTER_HPP
+#define _FWGUIQT_HIGHLIGHTER_CPPHIGHLIGHTER_HPP
+
+#include <QSyntaxHighlighter>
+
+#include <QHash>
+#include <QTextCharFormat>
+
+#include "fwGuiQt/config.hpp"
+
+class QTextDocument;
+
+namespace fwGuiQt
+{
+namespace highlighter
+{
+
+class FWGUIQT_CLASS_API CppHighlighter : public QSyntaxHighlighter
+{
+    Q_OBJECT
+
+public:
+    FWGUIQT_API CppHighlighter(QTextDocument *parent = 0);
+
+protected:
+    FWGUIQT_API void highlightBlock(const QString &text);
+
+private:
+    struct HighlightingRule
+    {
+        QRegExp pattern;
+        QTextCharFormat format;
+    };
+    QVector<HighlightingRule> highlightingRules;
+
+    QRegExp commentStartExpression;
+    QRegExp commentEndExpression;
+    QTextCharFormat multiLineCommentFormat;
+
+};
+
+} //namespace fwGuiQt
+} //namespace highlighter
+
+#endif // _FWGUIQT_HIGHLIGHTER_CPPHIGHLIGHTER_HPP
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/PythonHighlighter.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/PythonHighlighter.hpp
new file mode 100644
index 0000000..3c9c45b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/highlighter/PythonHighlighter.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_HIGHLIGHTER_PYTHONHIGHLIGHTER_HPP
+#define _FWGUIQT_HIGHLIGHTER_PYTHONHIGHLIGHTER_HPP
+
+#include <QSyntaxHighlighter>
+
+#include <QHash>
+#include <QTextCharFormat>
+
+#include "fwGuiQt/config.hpp"
+
+class QTextDocument;
+
+namespace fwGuiQt
+{
+namespace highlighter
+{
+
+class FWGUIQT_CLASS_API PythonHighlighter : public QSyntaxHighlighter
+{
+    Q_OBJECT
+
+public:
+    FWGUIQT_API PythonHighlighter(QTextDocument *parent = 0);
+
+protected:
+
+    FWGUIQT_API void highlightBlock(const QString &text);
+
+private:
+
+    class HighlightingRule
+    {
+    public:
+        HighlightingRule() : nth(0)
+        {}
+        int nth;
+        QRegExp pattern;
+        QTextCharFormat format;
+    };
+
+    QVector<HighlightingRule> highlightingRules;
+
+    QRegExp commentStartExpression;
+    QRegExp commentEndExpression;
+    QTextCharFormat multiLineCommentFormat;
+
+};
+
+} //namespace fwGuiQt
+} //namespace highlighter
+
+#endif // _FWGUIQT_HIGHLIGHTER_PYTHONHIGHLIGHTER_HPP
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/CardinalLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/CardinalLayoutManager.hpp
new file mode 100644
index 0000000..5ec5e19
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/CardinalLayoutManager.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/CardinalLayoutManagerBase.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+QT_BEGIN_NAMESPACE
+class QMainWindow;
+QT_END_NAMESPACE
+
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the cardinal layout manager.
+ * @class   CardinalLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API CardinalLayoutManager : public ::fwGui::layoutManager::CardinalLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (CardinalLayoutManager)(::fwGui::layoutManager::CardinalLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< CardinalLayoutManager > );
+
+    FWGUIQT_API CardinalLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~CardinalLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+private:
+
+    ::fwGuiQt::container::QtContainer::sptr m_parentContainer;
+
+    /// Layout manager of this view
+    QPointer<QMainWindow> m_qtWindow;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/FrameLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/FrameLayoutManager.hpp
new file mode 100644
index 0000000..e0dda26
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/FrameLayoutManager.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_
+
+#include <QPointer>
+#include <QObject>
+#include <QPoint>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/IFrameLayoutManager.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+QT_BEGIN_NAMESPACE
+class QMainWindow;
+QT_END_NAMESPACE
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the frame manager.
+ * @class   FrameLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API FrameLayoutManager : public QObject, public ::fwGui::layoutManager::IFrameLayoutManager
+{
+    Q_OBJECT
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (FrameLayoutManager)(::fwGui::layoutManager::IFrameLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< FrameLayoutManager > );
+
+    FWGUIQT_API FrameLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~FrameLayoutManager();
+
+    /**
+     * @brief Instantiate frame.
+     */
+    FWGUIQT_API virtual void createFrame();
+
+    /**
+     * @brief Destroy local frame with sub containers.
+     */
+    FWGUIQT_API virtual void destroyFrame();
+
+private Q_SLOTS:
+    void onCloseFrame();
+
+private:
+
+    void setState(FrameState state);
+    FrameState getState();
+    bool isOnScreen(const QPoint& pos);
+
+    QPointer<QMainWindow> m_qtWindow;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/LineLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/LineLayoutManager.hpp
new file mode 100644
index 0000000..c932e6f
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/LineLayoutManager.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/LineLayoutManagerBase.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the line layout manager.
+ * @class   LineLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API LineLayoutManager : public ::fwGui::layoutManager::LineLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (LineLayoutManager)(::fwGui::layoutManager::LineLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< LineLayoutManager > );
+
+    FWGUIQT_API LineLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~LineLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+private:
+    ::fwGuiQt::container::QtContainer::sptr m_parentContainer;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuBarLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuBarLayoutManager.hpp
new file mode 100644
index 0000000..0ea4f60
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuBarLayoutManager.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwMenuBar.hpp>
+#include <fwGui/container/fwMenu.hpp>
+#include <fwGui/layoutManager/IMenuBarLayoutManager.hpp>
+
+#include "fwGuiQt/container/QtMenuBarContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu bar layout manager for IHM.
+ * @class   MenuBarLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API MenuBarLayoutManager : public ::fwGui::layoutManager::IMenuBarLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuBarLayoutManager)(::fwGui::layoutManager::IMenuBarLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< MenuBarLayoutManager > );
+
+    FWGUIQT_API MenuBarLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~MenuBarLayoutManager();
+
+    /**
+     * @brief Instantiate menu with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwMenuBar::sptr parent );
+
+    /**
+     * @brief Destroy local menus.
+     * @pre services using this menus must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the menu visibility.
+     */
+    FWGUIQT_API virtual void menuIsVisible(::fwGui::container::fwMenu::sptr fwMenu, bool isVisible);
+
+    /**
+     * @brief Set the menu enable or not.
+     */
+    FWGUIQT_API virtual void menuIsEnabled(::fwGui::container::fwMenu::sptr fwMenu, bool isEnabled);
+
+protected:
+    ::fwGuiQt::container::QtMenuBarContainer::sptr m_parent;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuLayoutManager.hpp
new file mode 100644
index 0000000..6d01a70
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/MenuLayoutManager.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwMenu.hpp>
+#include <fwGui/layoutManager/IMenuLayoutManager.hpp>
+
+#include "fwGuiQt/container/QtMenuContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu layout manager for IHM.
+ * @class   MenuLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API MenuLayoutManager : public ::fwGui::layoutManager::IMenuLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuLayoutManager)(::fwGui::layoutManager::IMenuLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< MenuLayoutManager > );
+
+    FWGUIQT_API MenuLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~MenuLayoutManager();
+
+    /**
+     * @brief Instantiate actions with parent menu.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menu must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwMenu::sptr parent );
+
+    /**
+     * @brief Destroy local menus.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUIQT_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr menuItem, bool isVisible);
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUIQT_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr menuItem, bool isEnabled);
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUIQT_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked);
+
+protected:
+    ::fwGuiQt::container::QtMenuContainer::sptr m_parent;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/Namespace.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/Namespace.hpp
new file mode 100644
index 0000000..031d57a
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIQTLAYOUTMANAGERNAMESPACE_HPP_
+#define FWGUIQTLAYOUTMANAGERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+* @brief       The namespace fwGui::layoutManager contains the implementation of managers use to handle the GUI layout available in FW4SPL. The Qt library is used.
+  * @namespace   fwGui::layoutManager
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace layoutManager
+{
+
+}
+}
+#endif /* FWGUIQTLAYOUTMANAGERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/TabLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/TabLayoutManager.hpp
new file mode 100644
index 0000000..d619fa2
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/TabLayoutManager.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_
+
+#include <QPointer>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/TabLayoutManagerBase.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+
+QT_BEGIN_NAMESPACE
+class QTabWidget;
+QT_END_NAMESPACE
+
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the tab layout manager.
+ * @class   TabLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API TabLayoutManager : public ::fwGui::layoutManager::TabLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TabLayoutManager)(::fwGui::layoutManager::TabLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< TabLayoutManager > );
+
+    FWGUIQT_API TabLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~TabLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+private:
+
+    ::fwGuiQt::container::QtContainer::sptr m_parentContainer;
+
+    // Layout manager of this view
+    QPointer<QTabWidget> m_tabWidget;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolBarLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolBarLayoutManager.hpp
new file mode 100644
index 0000000..55261fd
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolBarLayoutManager.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwToolBar.hpp>
+#include <fwGui/layoutManager/IToolBarLayoutManager.hpp>
+
+#include "fwGuiQt/container/QtToolBarContainer.hpp"
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the toolBar layout manager for IHM.
+ * @class   ToolBarLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API ToolBarLayoutManager : public ::fwGui::layoutManager::IToolBarLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolBarLayoutManager)(::fwGui::layoutManager::IToolBarLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< ToolBarLayoutManager > );
+
+    FWGUIQT_API ToolBarLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~ToolBarLayoutManager();
+
+    /**
+     * @brief Instantiate actions with parent toolBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent toolBar must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwToolBar::sptr parent );
+
+    /**
+     * @brief Destroy local toolBars.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUIQT_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr menuItem, bool isVisible);
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUIQT_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr menuItem, bool isEnabled);
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUIQT_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked);
+
+protected:
+    ::fwGuiQt::container::QtToolBarContainer::sptr m_parent;
+
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolboxLayoutManager.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolboxLayoutManager.hpp
new file mode 100644
index 0000000..726a435
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/layoutManager/ToolboxLayoutManager.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGER_HPP_
+#define _FWGUIQT_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/ToolboxLayoutManagerBase.hpp>
+
+#include "fwGuiQt/widget/QfwToolbox.hpp"
+#include "fwGuiQt/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the toolbox layout manager.
+ * @class   ToolboxLayoutManager
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUIQT_CLASS_API ToolboxLayoutManager : public ::fwGui::layoutManager::ToolboxLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolboxLayoutManager)(::fwGui::layoutManager::ToolboxLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< ToolboxLayoutManager > );
+
+    FWGUIQT_API ToolboxLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIQT_API virtual ~ToolboxLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIQT_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIQT_API virtual void destroyLayout();
+
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIQT_LAYOUTMANAGER_TOOLBOXLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/util/FuncSlot.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/util/FuncSlot.hpp
new file mode 100644
index 0000000..3d23468
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/util/FuncSlot.hpp
@@ -0,0 +1,47 @@
+#ifndef __FWGUIQT_UTIL_FUNCSLOT_HPP__
+#define __FWGUIQT_UTIL_FUNCSLOT_HPP__
+
+#include <boost/function.hpp>
+
+#include <QObject>
+
+#include <fwGuiQt/config.hpp>
+
+namespace fwGuiQt
+{
+
+namespace util
+{
+
+
+class FWGUIQT_CLASS_API FuncSlot : public QObject
+{
+    Q_OBJECT
+
+public:
+    FWGUIQT_API FuncSlot();
+
+    template< typename CALLABLE >
+    FuncSlot(CALLABLE c) : m_func(c)
+    {
+    }
+
+    template< typename CALLABLE >
+    void setFunction(CALLABLE c)
+    {
+        m_func = c;
+    }
+
+public Q_SLOTS:
+    void trigger();
+
+protected:
+    ::boost::function< void() > m_func;
+};
+
+} // namespace util
+
+} // namespace fwGuiQt
+
+#endif
+
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QRangeSlider.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QRangeSlider.hpp
new file mode 100644
index 0000000..d63ead3
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QRangeSlider.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIQT_QRANGESLIDER_HPP_
+#define _FWGUIQT_QRANGESLIDER_HPP_
+
+#include <QWidget>
+#include <QPainter>
+#include <QPointer>
+#include <QDebug>
+
+#include "fwGuiQt/config.hpp"
+
+
+namespace fwGuiQt
+{
+
+namespace widget
+{
+
+class FWGUIQT_CLASS_API QRangeSlider : public QWidget
+{
+    Q_OBJECT
+
+public:
+    class Paintable
+    {
+    public:
+        Paintable(QWidget *w)
+        {
+            m_widget = w;
+        }
+        virtual ~Paintable(){}
+
+        virtual void draw(QPainter &, bool enabled = true) = 0;
+        virtual bool pick(const QPoint&) const = 0;
+
+    protected:
+        QSize drawingArea() const {return m_widget->size();}
+        QPointer<QWidget> m_widget;
+    };
+
+
+
+    FWGUIQT_API QRangeSlider(QWidget *parent = NULL);
+    FWGUIQT_API virtual ~QRangeSlider();
+
+    QSize sizeHint() const {return QSize(100,20);};
+
+    void setMinimumMinMaxDelta(double d){ m_minimumMinMaxDelta = d;}
+
+public Q_SLOTS:
+    FWGUIQT_API void setPos(double _min, double _max);
+
+Q_SIGNALS:
+    void sliderRangeChanged ( double min, double max);
+    void sliderRangeEdited ( double min, double max);
+
+protected:
+
+
+    void move(int delta);
+    bool movedTo(double _min, double _max);
+
+    virtual void paintEvent ( QPaintEvent * event );
+    virtual void mouseMoveEvent ( QMouseEvent * event );
+    virtual void mousePressEvent ( QMouseEvent * event );
+    virtual void mouseReleaseEvent ( QMouseEvent * event );
+    virtual void wheelEvent ( QWheelEvent * event );
+    virtual void resizeEvent ( QResizeEvent * event );
+
+    Paintable *m_minHandle;
+    Paintable *m_maxHandle;
+    Paintable *m_window;
+
+    Paintable *m_current;
+
+    int m_handleSize;
+
+    QPoint m_pressPos;
+    int m_pressMin;
+    int m_pressMax;
+
+    double m_minValue;
+    double m_maxValue;
+
+    double m_minimumMinMaxDelta;
+    bool m_allowMinGreaterThanMax;
+    bool m_emitRangeChanged;
+
+};
+
+
+} // namespace widget
+} // namespace fwGuiQt
+
+#endif // _FWGUIQT_QRANGESLIDER_HPP_
diff --git a/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QfwToolbox.hpp b/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QfwToolbox.hpp
new file mode 100644
index 0000000..7fc6c67
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/include/fwGuiQt/widget/QfwToolbox.hpp
@@ -0,0 +1,102 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*
+ * Based on (and also inspired by) QToolbox: http://doc.qt.nokia.com/4.7/qtoolbox.html
+ */
+
+#ifndef _FWGUIQT_WIDGET_QFWTOOLBOX_HPP
+#define _FWGUIQT_WIDGET_QFWTOOLBOX_HPP
+
+#include <QObject>
+#include <QScrollArea>
+#include <QString>
+#include <QFormLayout>
+#include <QPushButton>
+
+#include "fwGuiQt/config.hpp"
+
+namespace fwGuiQt
+{
+namespace widget
+{
+
+
+class Page
+{
+public:
+    void setText(const QString &text) { button->setText(text); }
+    void setIcon(const QIcon &is) { button->setIcon(is); }
+    void setToolTip(const QString &tip) { button->setToolTip(tip); }
+    QString toolTip() const { return button->toolTip(); }
+    QString text() const { return button->text(); }
+    QIcon icon() const { return button->icon(); }
+
+    inline bool operator==(const Page& other) const
+    {
+        return widget == other.widget;
+     }
+
+    QPushButton *button;
+    QFrame* sv;
+    QWidget *widget;
+};
+
+class FWGUIQT_CLASS_API QfwToolBox : public QFrame
+{
+    Q_OBJECT
+
+public:
+    FWGUIQT_API QfwToolBox(QWidget *parent = 0, Qt::WindowFlags f = 0);
+    FWGUIQT_API virtual ~QfwToolBox();
+
+    FWGUIQT_API int addItem(QWidget *widget, const QString &text);
+    FWGUIQT_API int insertItem(int index, QWidget *widget, const QString &text);
+
+    FWGUIQT_API void removeItem(int index);
+
+    FWGUIQT_API void setItemEnabled(int index, bool enabled);
+    FWGUIQT_API bool isItemEnabled(int index) const;
+
+    FWGUIQT_API void setItemText(int index, const QString &text);
+    FWGUIQT_API QString itemText(int index) const;
+
+    FWGUIQT_API void setItemToolTip(int index, const QString &toolTip);
+    FWGUIQT_API QString itemToolTip(int index) const;
+
+    FWGUIQT_API QWidget *widget(int index) const;
+
+    FWGUIQT_API int indexOf(QWidget *widget) const;
+    FWGUIQT_API int count() const;
+
+    FWGUIQT_API void collapseItem(int index);
+    FWGUIQT_API void expandItem(int index);
+
+protected:
+
+    typedef QList< ::fwGuiQt::widget::Page > PageList;
+
+private Q_SLOTS:
+    void buttonToggled(bool checked);
+    void widgetDestroyed(QObject*);
+
+private:
+
+    ::fwGuiQt::widget::Page* page(QWidget *widget) const;
+    const ::fwGuiQt::widget::Page* page(int index) const;
+    ::fwGuiQt::widget::Page* page(int index);
+
+    void relayout();
+
+    PageList pageList;
+    QFormLayout* layout;
+};
+
+
+} // namespace widget
+} // namespace fwGuiQt
+
+#endif // _FWGUIQT_WIDGET_QFWTOOLBOX_HPP
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/ActionCallback.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/ActionCallback.cpp
new file mode 100644
index 0000000..e6ea7aa
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/ActionCallback.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/ActionCallback.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiQt::ActionCallback, ::fwGui::ActionCallbackBase::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+
+//-----------------------------------------------------------------------------
+
+ActionCallback::ActionCallback(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ActionCallback::~ActionCallback()
+{}
+
+//-----------------------------------------------------------------------------
+
+// if action is checkable, executeQt is executed after checkQt
+void ActionCallback::executeQt(bool checked)
+{
+    this->execute();
+}
+
+//-----------------------------------------------------------------------------
+
+void ActionCallback::checkQt(bool checked)
+{
+    this->check(checked);
+}
+
+} // namespace fwGuiQt
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/App.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/App.cpp
new file mode 100644
index 0000000..44ba092
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/App.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <assert.h>
+#include <iostream>
+#include <sstream>
+#include <locale.h>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <fwTools/Os.hpp>
+
+#include <fwRuntime/profile/Profile.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "fwGuiQt/App.hpp"
+
+namespace fwGuiQt
+{
+
+//-----------------------------------------------------------------------------
+
+App::App(int & argc, char ** argv)
+    : QApplication (argc, argv)
+{
+    SLM_TRACE_FUNC();
+
+    setlocale(LC_ALL,"C"); // needed for mfo save process
+
+    std::string appName = "No name";
+
+    ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::profile::getCurrentProfile();
+
+    if (profile)
+    {
+        appName = profile->getName();
+    }
+
+    this->setApplicationName( QString::fromStdString(appName) );
+
+    QObject::connect(this, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()));
+}
+
+//-----------------------------------------------------------------------------
+
+void App::aboutToQuit()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void App::onExit()
+{
+    SLM_TRACE_FUNC();
+
+    QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
+    QApplication::restoreOverrideCursor();
+
+    qApp->flush();
+    qApp->exit(0);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGuiQt
+
+//-----------------------------------------------------------------------------
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/Application.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/Application.cpp
new file mode 100644
index 0000000..ebca8c9
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/Application.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/Application.hpp"
+
+
+fwGuiRegisterMacro(::fwGuiQt::Application, ::fwGui::IApplication::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+//-----------------------------------------------------------------------------
+
+void Application::exit(int returncode)
+{
+    qApp->exit(returncode);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGuiQt
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/Cursor.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/Cursor.cpp
new file mode 100644
index 0000000..e107060
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/Cursor.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/Cursor.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiQt::Cursor, ::fwGui::ICursor::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+//-----------------------------------------------------------------------------
+
+Cursor::Cursor(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+Cursor::~Cursor()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setCursor( ::fwGui::ICursor::CursorType cursor)
+{
+
+    QCursor qtCursor(Qt::ArrowCursor);
+    switch (cursor)
+    {
+        case ICursor::BUSY:
+            qtCursor.setShape(Qt::BusyCursor);
+            break;
+        case ICursor::WAIT:
+            qtCursor.setShape(Qt::WaitCursor);
+            break;
+        case ICursor::CROSS:
+            qtCursor.setShape(Qt::CrossCursor);
+            break;
+        case ICursor::DEFAULT:
+            qtCursor.setShape(Qt::BusyCursor);
+            break;
+    }
+
+    qApp->setOverrideCursor(qtCursor);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setDefaultCursor()
+{
+    qApp->restoreOverrideCursor();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGuiQt
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/QtMainFrame.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/QtMainFrame.cpp
new file mode 100644
index 0000000..7179a78
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/QtMainFrame.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QCloseEvent>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGuiQt/QtMainFrame.hpp"
+
+namespace fwGuiQt
+{
+
+
+//------------------------------------------------------------------------------
+
+QtMainFrame::QtMainFrame() throw(): QMainWindow()
+{}
+
+//------------------------------------------------------------------------------
+
+QtMainFrame::~QtMainFrame() throw()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void QtMainFrame::setCloseCallback(CloseCallback fct)
+{
+    m_fctCloseCallback = fct;
+}
+
+//------------------------------------------------------------------------------
+
+void QtMainFrame::closeEvent(QCloseEvent *event)
+{
+    SLM_TRACE_FUNC();
+//    event->ignore();
+    m_fctCloseCallback();
+}
+
+
+//------------------------------------------------------------------------------
+
+} // fwGuiQt
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/SliceSelector.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/SliceSelector.cpp
new file mode 100644
index 0000000..ef12dcb
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/SliceSelector.cpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QComboBox>
+#include <QStringList>
+#include <QSlider>
+#include <QLineEdit>
+#include <QHBoxLayout>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwGuiQt/SliceSelector.hpp"
+
+namespace fwGuiQt
+{
+
+//------------------------------------------------------------------------------
+
+const QStringList SliceSelector::m_sliceTypesArray = (QStringList() << tr("Sagittal") << tr("Frontal") << tr("Axial"));
+
+//------------------------------------------------------------------------------
+
+SliceSelector::SliceSelector(QWidget* const parent ) throw(): QWidget( parent )
+{
+    m_fctChangeIndexCallback = ::boost::bind( &::fwGuiQt::SliceSelector::printIndex, this, _1);
+    m_fctChangeTypeCallback = ::boost::bind( &::fwGuiQt::SliceSelector::printType, this, _1);
+
+    m_sliceType = new QComboBox( this );
+    m_sliceType->addItems(m_sliceTypesArray);
+
+    m_sliceIndex = new QSlider(Qt::Horizontal, this);
+
+    m_pSliceIndexText = new QLineEdit(this);
+    m_pSliceIndexText->setReadOnly(true);
+    m_pSliceIndexText->setMaximumWidth(80);
+
+    QHBoxLayout *layout = new QHBoxLayout(this);
+    layout->addWidget(m_sliceType, 0);
+    layout->addWidget(m_sliceIndex, 1);
+    layout->addWidget(m_pSliceIndexText, 0);
+    layout->setContentsMargins(0,0,0,0);
+
+    QObject::connect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+    QObject::connect(m_sliceType, SIGNAL(currentIndexChanged(int)), this, SLOT(onSliceTypeChange(int)));
+
+    this->setLayout( layout );
+}
+
+//------------------------------------------------------------------------------
+
+SliceSelector::~SliceSelector() throw()
+{
+    QObject::disconnect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+    QObject::disconnect(m_sliceType, SIGNAL(currentIndexChanged(int)), this, SLOT(onSliceTypeChange(int)));
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setSliceRange( int min, int max )
+{
+    QObject::disconnect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+    this->m_sliceIndex->setRange(min, max);
+    QObject::connect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setSliceValue( int index )
+{
+    QObject::disconnect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+    this->m_sliceIndex->setValue(index);
+    QObject::connect(m_sliceIndex, SIGNAL(valueChanged(int)), this, SLOT(onSliceIndexChange(int)));
+
+    std::stringstream ss;
+    ss << index << " / " << this->m_sliceIndex->maximum();
+    this->m_pSliceIndexText->setText( QString::fromStdString(ss.str()));
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setTypeSelection( int type )
+{
+    this->m_sliceType->setCurrentIndex(type);
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::onSliceIndexChange( int value ) throw()
+{
+    SLM_TRACE_FUNC();
+    m_fctChangeIndexCallback( value );
+    this->setSliceValue( value );
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setChangeIndexCallback(ChangeIndexCallback fct)
+{
+    m_fctChangeIndexCallback = fct;
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setChangeTypeCallback(ChangeTypeCallback fct)
+{
+    m_fctChangeTypeCallback = fct;
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::printIndex(int index)
+{
+    OSLM_TRACE("index= "<<index);
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::printType(int type)
+{
+    OSLM_TRACE("type= "<<type);
+}
+
+//------------------------------------------------------------------------------
+
+void SliceSelector::setEnable(bool enable)
+{
+    m_sliceType->setEnabled(enable);
+    m_sliceIndex->setEnabled(enable);
+    m_pSliceIndexText->setEnabled(enable);
+}
+
+//------------------------------------------------------------------------------
+void SliceSelector::onSliceTypeChange( int index )
+{
+    m_fctChangeTypeCallback(index);
+    this->setSliceValue( this->m_sliceIndex->value());
+}
+
+
+//------------------------------------------------------------------------------
+
+} // fwGuiQt
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/WorkerQt.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/WorkerQt.cpp
new file mode 100644
index 0000000..cd1223d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/WorkerQt.cpp
@@ -0,0 +1,382 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+#include <boost/thread.hpp>
+
+#include <QEvent>
+#include <QDir>
+#include <QPointer>
+#include <QTimer>
+#include <QStringList>
+#include <QSharedPointer>
+#include <QFont>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/Timer.hpp>
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include "fwGuiQt/App.hpp"
+#include "fwGuiQt/util/FuncSlot.hpp"
+
+#include "fwGuiQt/WorkerQt.hpp"
+
+namespace fwGuiQt
+{
+
+
+class WorkerQtTask : public QEvent
+{
+public:
+    WorkerQtTask( const ::fwThread::Worker::TaskType &handler )
+        : QEvent( static_cast< QEvent::Type >(s_WORKER_QT_TASK_EVENT_TYPE) ),
+        m_handler( handler )
+    {
+        SLM_ASSERT( "QApplication should be instantiated", qApp );
+    }
+
+    ~WorkerQtTask()
+    {
+        m_handler();
+    }
+
+    static const int s_WORKER_QT_TASK_EVENT_TYPE;
+
+protected:
+
+    ::fwThread::Worker::TaskType m_handler;
+};
+
+const int WorkerQtTask::s_WORKER_QT_TASK_EVENT_TYPE = QEvent::registerEventType();
+
+
+
+/**
+ * @brief Private implementation of fwThread::Worker using boost::asio.
+ */
+class WorkerQt : public ::fwThread::Worker
+{
+public:
+    typedef ::boost::thread ThreadType;
+
+    WorkerQt();
+
+    void init( int &argc, char **argv );
+
+    virtual ~WorkerQt();
+
+    void stop();
+
+    void post(TaskType handler);
+
+    ::fwThread::Worker::FutureType getFuture();
+
+    virtual ::fwThread::ThreadIdType getThreadId() const;
+
+    virtual void processTasks();
+
+    virtual void processTasks(PeriodType maxtime);
+
+protected:
+
+    QSharedPointer< QApplication > m_app;
+
+    SPTR(::fwThread::Timer) createTimer();
+
+    /// Copy constructor forbidden
+    WorkerQt( const WorkerQt& );
+
+    /// Copy operator forbidden
+    WorkerQt& operator=( const WorkerQt& );
+
+    ::fwThread::ThreadIdType m_threadId;
+
+};
+
+
+
+struct FWGUIQT_CLASS_API WorkerQtInstanciator
+{
+
+    FWGUIQT_API WorkerQtInstanciator(bool reg = true) ;
+
+    FWGUIQT_API SPTR(::fwThread::Worker) getWorker();
+
+    SPTR(WorkerQt) m_qtWorker;
+
+    FWGUIQT_API static int    s_argc;
+    FWGUIQT_API static char **s_argv;
+};
+
+int WorkerQtInstanciator::s_argc = 0 ;
+char** WorkerQtInstanciator::s_argv = NULL;
+
+FWGUIQT_API WorkerQtInstanciator::WorkerQtInstanciator(bool reg ) :
+    m_qtWorker(::boost::make_shared< WorkerQt >())
+{
+    m_qtWorker->init( boost::ref(s_argc), s_argv);
+
+    if(reg)
+    {
+        ::fwServices::registry::ActiveWorkers::getDefault()
+            ->addWorker(::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER, m_qtWorker);
+    }
+}
+
+
+SPTR(::fwThread::Worker) WorkerQtInstanciator::getWorker()
+{
+    return m_qtWorker;
+}
+
+::fwThread::Worker::sptr getQtWorker( int &argc, char **argv )
+{
+
+    WorkerQtInstanciator::s_argc = argc;
+    WorkerQtInstanciator::s_argv = argv;
+
+    typedef ::fwCore::util::LazyInstantiator< WorkerQtInstanciator, WorkerQtInstanciator > InstantiatorType;
+
+    SPTR(WorkerQtInstanciator) instanciator = InstantiatorType::getInstance();
+
+#ifdef _DEBUG
+    {
+        static ::boost::mutex mutex;
+        ::boost::mutex::scoped_lock scoped_lock(mutex);
+        static bool initialized = false;
+        SLM_ASSERT("getQtWorker(argc, argv) shall be called only once", !initialized);
+        initialized = true;
+    }
+#endif
+
+
+    return instanciator->m_qtWorker;
+}
+
+
+
+//------------------------------------------------------------------------------
+
+
+/**
+ * @class TimerQt
+ * @brief Private Timer implementation using Qt.
+ *
+ *
+ * @date   2012.
+ */
+class TimerQt : public ::fwThread::Timer
+{
+public:
+    /**
+     * @brief Constructs a TimerQt from given io_service.
+     */
+    TimerQt();
+
+    ~TimerQt();
+
+    /// Starts or restarts the timer.
+    void start();
+
+    /// Stops the timer and cancel all pending operations.
+    void stop();
+
+    /// Sets time duration.
+    void setDuration(TimeDurationType duration);
+
+    /// Returns if the timer mode is 'one shot'.
+    bool isOneShot() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_timerQt->isSingleShot();
+    }
+
+    /// Sets timer mode.
+    void setOneShot(bool oneShot)
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        m_timerQt->setSingleShot(oneShot);
+    }
+
+    /// Returns true if the timer is currently running.
+    bool isRunning() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_timerQt->isActive();
+    }
+
+protected Q_SLOTS:
+
+    void call();
+
+protected:
+
+    /// Copy constructor forbidden.
+    TimerQt( const TimerQt& );
+
+    /// Copy operator forbidden.
+    TimerQt& operator=( const TimerQt& );
+
+    void updatedFunction();
+
+    QPointer< QTimer > m_timerQt;
+
+    QPointer< ::fwGuiQt::util::FuncSlot > m_qtFunc;
+};
+
+//------------------------------------------------------------------------------
+
+
+// ---------- WorkerQt private implementation ----------
+
+WorkerQt::WorkerQt() :
+    m_app(NULL),
+    m_threadId( ::fwThread::getCurrentThreadId() )
+{
+}
+
+void WorkerQt::init( int &argc, char **argv )
+{
+#ifdef __MACOSX__
+    if ( QSysInfo::MacintoshVersion > QSysInfo::MV_10_8 )
+    {
+        // https://bugreports.qt-project.org/browse/QTBUG-32789 #fix for Mac OS X 10.9
+        QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
+    }
+#endif
+    m_app = QSharedPointer< QApplication > ( new ::fwGuiQt::App( argc, argv ) );
+
+    OSLM_TRACE("Init Qt" << ::fwThread::getCurrentThreadId() <<" Start");
+
+    // QStringList libraryPaths;
+    // libraryPaths = m_app->libraryPaths();
+    // libraryPaths.removeFirst();
+    // m_app->setLibraryPaths(libraryPaths);
+
+#ifdef SPECIALINSTALL
+    QDir pluginDir("/usr/lib/qtplugins");
+#else
+    QDir pluginDir("./qtplugins");
+#endif
+    if (pluginDir.exists())
+    {
+        m_app->addLibraryPath(pluginDir.absolutePath());
+    }
+
+    OSLM_TRACE("Init Qt" << ::fwThread::getCurrentThreadId() <<" Finish");
+
+}
+
+WorkerQt::~WorkerQt()
+{
+    this->stop();
+}
+
+
+::fwThread::Worker::FutureType WorkerQt::getFuture()
+{
+    if (! m_future.valid() )
+    {
+        SLM_ASSERT("WorkerQt loop shall be created and ran from main thread ",
+            ! m_future.valid() && ::fwThread::getCurrentThreadId() == this->getThreadId() );
+
+        ::boost::packaged_task< ExitReturnType > task( ::boost::bind(&QApplication::exec) );
+
+        ::boost::future< ExitReturnType > ufuture = task.get_future();
+
+        m_future = ::boost::move(ufuture);
+
+        task();
+    }
+
+    return m_future;
+}
+
+
+::fwThread::ThreadIdType WorkerQt::getThreadId() const
+{
+    return m_threadId;
+}
+
+
+void WorkerQt::stop()
+{
+    this->postTask<void>(&QApplication::quit).wait();
+}
+
+SPTR(::fwThread::Timer) WorkerQt::createTimer()
+{
+    return ::boost::make_shared< TimerQt >();
+}
+
+void WorkerQt::post(TaskType handler)
+{
+    QApplication::postEvent( qApp, new WorkerQtTask(handler) );
+}
+
+void WorkerQt::processTasks()
+{
+    QApplication::sendPostedEvents(0, ::fwGuiQt::WorkerQtTask::s_WORKER_QT_TASK_EVENT_TYPE);
+}
+
+void WorkerQt::processTasks(PeriodType maxtime)
+{
+    QCoreApplication::processEvents(QEventLoop::AllEvents, maxtime);
+}
+
+// ---------- Timer private implementation ----------
+
+TimerQt::TimerQt() :
+    m_timerQt( new QTimer(qApp) )
+{
+    m_qtFunc = new ::fwGuiQt::util::FuncSlot();
+    QObject::connect(m_timerQt, SIGNAL(timeout()), m_qtFunc, SLOT(trigger()));
+}
+
+TimerQt::~TimerQt()
+{
+    QObject::disconnect(m_timerQt, SIGNAL(timeout()), m_qtFunc, SLOT(trigger()));
+    delete m_qtFunc;
+    m_timerQt->stop();
+    delete m_timerQt;
+}
+
+void TimerQt::setDuration(TimeDurationType duration)
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_timerQt->setInterval( ::boost::chrono::duration_cast< ::boost::chrono::milliseconds >(duration).count() );
+}
+
+void TimerQt::start()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_timerQt->start();
+}
+
+void TimerQt::stop()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_timerQt->stop();
+}
+
+
+void TimerQt::call()
+{
+    m_function();
+}
+
+
+void TimerQt::updatedFunction()
+{
+    m_qtFunc->setFunction(m_function);
+}
+
+
+} //namespace fwGuiQt
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ContainerBuilder.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ContainerBuilder.cpp
new file mode 100644
index 0000000..572db83
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ContainerBuilder.cpp
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QMainWindow>
+#include <QWidget>
+#include <QVBoxLayout>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/builder/ContainerBuilder.hpp"
+
+
+fwGuiRegisterMacro(::fwGui::builder::ContainerBuilder, ::fwGui::builder::IContainerBuilder::REGISTRY_KEY);
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+ContainerBuilder::ContainerBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ContainerBuilder::~ContainerBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::createContainer( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+
+    ::fwGuiQt::container::QtContainer::sptr qtContainer = ::fwGuiQt::container::QtContainer::New();
+    QWidget *qtParent = m_parent->getQtContainer();
+    QWidget *widget = new QWidget();
+    qtContainer->setQtContainer(widget);
+
+    QVBoxLayout *layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+    SLM_ASSERT("Sorry, the parent container has already a layout", !qtParent->layout());
+    qtParent->setLayout(layout);
+    layout->addWidget(widget);
+
+    m_container = qtContainer;
+}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::destroyContainer()
+{
+    SLM_ASSERT("Sorry, Container not initialized", m_container);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+
+    m_container->destroyContainer();
+    m_parent->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::setParent(::fwGui::container::fwContainer::sptr parent)
+{
+    SLM_ASSERT("Sorry, QtContainer not yet initialized, cleaning impossible", m_container);
+    ::fwGuiQt::container::QtContainer::sptr parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", parentContainer);
+    ::fwGuiQt::container::QtContainer::sptr container = ::fwGuiQt::container::QtContainer::dynamicCast(m_container);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", container);
+
+    QWidget *qtContainer = container->getQtContainer();
+    SLM_ASSERT("Sorry, QtContainer not yet initialized", qtContainer);
+    QWidget *qtParent = parentContainer->getQtContainer();
+    SLM_ASSERT("Sorry, parent QtContainer not yet initialized", qtParent);
+
+    if(qtParent != m_parent->getQtContainer() )
+    {
+        if(!qtParent->layout())
+        {
+            SLM_TRACE("New parent container hasn't layout");
+            QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom);
+            layout->setContentsMargins(0, 0, 0, 0);
+            qtParent->setLayout(layout);
+        }
+        qtParent->layout()->addWidget(qtContainer);
+        qtContainer->update();
+
+        m_parent = parentContainer;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/MenuBarBuilder.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/MenuBarBuilder.cpp
new file mode 100644
index 0000000..2589248
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/MenuBarBuilder.cpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QMainWindow>
+#include <QMenuBar>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/container/QtMenuBarContainer.hpp"
+#include "fwGuiQt/builder/MenuBarBuilder.hpp"
+
+
+
+fwGuiRegisterMacro(::fwGui::builder::MenuBarBuilder, ::fwGui::builder::IMenuBarBuilder::REGISTRY_KEY);
+
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+MenuBarBuilder::MenuBarBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuBarBuilder::~MenuBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarBuilder::createMenuBar( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+    QMainWindow *window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer() ) ;
+    if ( !window )
+    {
+        window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer()->parent() ) ;
+    }
+    SLM_ASSERT("Sorry, the parent container must be a QMainWindow", window ) ;
+    if (window)
+    {
+        ::fwGuiQt::container::QtMenuBarContainer::sptr menuBarContainer = ::fwGuiQt::container::QtMenuBarContainer::New();
+        QMenuBar *menuBar = new QMenuBar(0);
+        menuBarContainer->setQtMenuBar(menuBar);
+        window->setMenuBar( menuBar );
+        m_menuBar = menuBarContainer;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarBuilder::destroyMenuBar()
+{
+    SLM_ASSERT("Sorry, Menu not initialized", m_menuBar);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+    QMainWindow *window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer() ) ;
+    if ( !window )
+    {
+        window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer()->parent() ) ;
+    }
+    SLM_ASSERT("Sorry, the parent container must be a QMainWindow", window ) ;
+    if (window)
+    {
+        window->setMenuBar( NULL );
+    }
+    m_menuBar->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ToolBarBuilder.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ToolBarBuilder.cpp
new file mode 100644
index 0000000..8126732
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/builder/ToolBarBuilder.cpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QMainWindow>
+#include <QToolBar>
+#include <QHBoxLayout>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/container/QtToolBarContainer.hpp"
+#include "fwGuiQt/builder/ToolBarBuilder.hpp"
+
+
+
+fwGuiRegisterMacro( ::fwGui::builder::ToolBarBuilder, ::fwGui::builder::IToolBarBuilder::REGISTRY_KEY);
+
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+ToolBarBuilder::ToolBarBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolBarBuilder::~ToolBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarBuilder::createToolBar( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+    QMainWindow *window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer() ) ;
+
+    QToolBar *toolBar = new QToolBar(QObject::tr("ToolBar"));
+    toolBar->setIconSize( QSize(m_toolBitmapSize.first, m_toolBitmapSize.second) );
+    toolBar->setFloatable(false);
+
+    ::fwGuiQt::container::QtToolBarContainer::sptr toolBarContainer = ::fwGuiQt::container::QtToolBarContainer::New();
+    if (window)
+    {
+        bool visible = window->isVisible();
+
+        Qt::ToolBarArea area;
+        switch (m_aligment)
+        {
+        case TOP:
+            area = Qt::TopToolBarArea;
+            break;
+        case BOTTOM:
+            area = Qt::BottomToolBarArea;
+            break;
+        case RIGHT:
+            area = Qt::RightToolBarArea;
+            break;
+        case LEFT:
+            area = Qt::LeftToolBarArea;
+            break;
+        }
+        window->addToolBar( area, toolBar );
+
+        //on Os X, the window is hidden (???)
+        window->setVisible(visible);
+    }
+    else // parent is not a QMainWindow
+    {
+        QWidget * widget = m_parent->getQtContainer();
+        SLM_ASSERT("Parent container must have a layout", widget->layout());
+        QBoxLayout * layout = qobject_cast<QBoxLayout*> ( widget->layout() );
+        switch (m_aligment)
+        {
+        case TOP:
+            layout->setDirection(QBoxLayout::TopToBottom);
+            toolBar->setOrientation(Qt::Horizontal);
+            break;
+        case BOTTOM:
+            layout->setDirection(QBoxLayout::BottomToTop);
+            toolBar->setOrientation(Qt::Horizontal);
+            break;
+        case RIGHT:
+            layout->setDirection(QBoxLayout::RightToLeft);
+            toolBar->setOrientation(Qt::Vertical);
+            break;
+        case LEFT:
+            layout->setDirection(QBoxLayout::LeftToRight);
+            toolBar->setOrientation(Qt::Vertical);
+            break;
+        }
+        SLM_ASSERT("Parent container layout must have be a QVBoxLayout", layout);
+        layout->insertWidget(0, toolBar, 0);
+    }
+
+    toolBarContainer->setQtToolBar(toolBar);
+    m_toolBar = toolBarContainer;
+
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarBuilder::destroyToolBar()
+{
+    SLM_ASSERT("Sorry, ToolBar not initialized", m_toolBar);
+    SLM_ASSERT("Sorry, the parent container is not a QtContainer", m_parent);
+    QMainWindow *window = qobject_cast<QMainWindow*> ( m_parent->getQtContainer() ) ;
+
+    if (window)
+    {
+        ::fwGuiQt::container::QtToolBarContainer::sptr qtToolBar = ::fwGuiQt::container::QtToolBarContainer::dynamicCast(m_toolBar);
+        QToolBar * toolbar = qtToolBar->getQtToolBar();
+        window->removeToolBar( toolbar );
+    }
+    m_toolBar->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtContainer.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtContainer.cpp
new file mode 100644
index 0000000..4bd1e3e
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtContainer.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QDockWidget>
+#include <QWidget>
+#include <QList>
+#include <QLayout>
+#include <QMetaObject>
+
+#include "fwGuiQt/container/QtContainer.hpp"
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+QtContainer::QtContainer(::fwGui::GuiBaseObject::Key key) throw() : m_container(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+QtContainer::~QtContainer() throw()
+{
+   SLM_ASSERT( "Error during destruction : The qt container included in this class is still allocated, please call destroyContainer() before.", m_container == 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void QtContainer::clean()
+{
+    SLM_ASSERT("Sorry, QWidget not yet initialized, cleaning impossible", m_container);
+
+    m_container->adjustSize();
+    if (m_container->layout())
+    {
+        QWidget().setLayout(m_container->layout());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void QtContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, QWidget not yet initialized", m_container);
+    if(m_container)
+    {
+        delete m_container;
+        m_container = NULL;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void QtContainer::setQtContainer(QWidget *container)
+{
+    m_container = container;
+}
+
+//-----------------------------------------------------------------------------
+
+QWidget* QtContainer::getQtContainer()
+{
+    return m_container;
+}
+
+//-----------------------------------------------------------------------------
+
+bool QtContainer::isShownOnScreen()
+{
+    SLM_ASSERT("Sorry, QtContainer not yet initialized, cleaning impossible", m_container);
+    return m_container->isVisible();
+}
+
+//-----------------------------------------------------------------------------
+
+void QtContainer::setVisible(bool isVisible)
+{
+    SLM_ASSERT("Sorry, QtContainer not yet initialized, cleaning impossible", m_container);
+    QWidget* parent = m_container->parentWidget();
+    QDockWidget* dock = qobject_cast<QDockWidget*>(parent);
+    if(dock)
+    {
+        dock->setVisible(isVisible);
+    }
+    m_container->setVisible(isVisible);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuBarContainer.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuBarContainer.cpp
new file mode 100644
index 0000000..bdbecea
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuBarContainer.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QMenuBar>
+
+#include "fwGuiQt/container/QtMenuBarContainer.hpp"
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+QtMenuBarContainer::QtMenuBarContainer(::fwGui::GuiBaseObject::Key key) throw() : m_menuBar(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+QtMenuBarContainer::~QtMenuBarContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuBarContainer::clean()
+{
+    SLM_ASSERT("Sorry, Qt MenuBar not yet initialized, cleaning impossible", m_menuBar);
+
+    m_menuBar->clear();
+
+    QList<QMenu *> list = m_menuBar->findChildren<QMenu *>();
+    Q_FOREACH (QMenu *m, list)
+    {
+        m->hide();
+        delete m;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuBarContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, Qt MenuBar not yet initialized", m_menuBar);
+
+    QList<QMenu *> allMenu = m_menuBar->findChildren<QMenu *>();
+    OSLM_ASSERT("MenuBar container must be empty ( " << allMenu.count() << " menus).", allMenu.empty());
+
+    m_menuBar->hide();
+    delete m_menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuBarContainer::setQtMenuBar(QMenuBar *menuBar)
+{
+    this->m_menuBar = menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+QMenuBar* QtMenuBarContainer::getQtMenuBar()
+{
+    return this->m_menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuContainer.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuContainer.cpp
new file mode 100644
index 0000000..667a5fe
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuContainer.cpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QMenu>
+#include "fwGuiQt/container/QtMenuContainer.hpp"
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+QtMenuContainer::QtMenuContainer(::fwGui::GuiBaseObject::Key key) throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+QtMenuContainer::~QtMenuContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuContainer::clean()
+{
+    SLM_ASSERT("Sorry, Qt menu not yet initialized, cleaning impossible", m_menu);
+    m_menu->clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, Qt menu not yet initialized, cleaning impossible", m_menu);
+    delete m_menu;
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuContainer::setQtMenu(QMenu *menu)
+{
+    this->m_menu = menu;
+}
+
+//-----------------------------------------------------------------------------
+
+QMenu* QtMenuContainer::getQtMenu()
+{
+    return this->m_menu;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuItemContainer.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuItemContainer.cpp
new file mode 100644
index 0000000..727ced9
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtMenuItemContainer.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QAction>
+#include "fwGuiQt/container/QtMenuItemContainer.hpp"
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+QtMenuItemContainer::QtMenuItemContainer(::fwGui::GuiBaseObject::Key key) throw() : m_menuItem(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+QtMenuItemContainer::~QtMenuItemContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuItemContainer::clean()
+{
+    SLM_ASSERT("Sorry, qtMenuItem not yet initialized, cleaning impossible", m_menuItem);
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuItemContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, qtMenuItem not yet initialized, cleaning impossible", m_menuItem);
+}
+
+//-----------------------------------------------------------------------------
+
+void QtMenuItemContainer::setQtMenuItem(QAction* menuItem)
+{
+    this->m_menuItem = menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+QAction* QtMenuItemContainer::getQtMenuItem()
+{
+    return this->m_menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtToolBarContainer.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtToolBarContainer.cpp
new file mode 100644
index 0000000..0931f9c
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/container/QtToolBarContainer.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QToolBar>
+#include <QAction>
+#include <QMenu>
+#include "fwGuiQt/container/QtToolBarContainer.hpp"
+
+namespace fwGuiQt
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+QtToolBarContainer::QtToolBarContainer(::fwGui::GuiBaseObject::Key key) throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+QtToolBarContainer::~QtToolBarContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void QtToolBarContainer::clean()
+{
+    SLM_ASSERT("Sorry, Qt toolBar not yet initialized, cleaning impossible", m_toolBar);
+
+    m_toolBar->clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void QtToolBarContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, Qt toolBar not yet initialized, cleaning impossible", m_toolBar);
+
+    delete m_toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+void QtToolBarContainer::setQtToolBar(QToolBar *toolBar)
+{
+    this->m_toolBar = toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+QToolBar* QtToolBarContainer::getQtToolBar()
+{
+    return this->m_toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/InputDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/InputDialog.cpp
new file mode 100644
index 0000000..cc43a61
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/InputDialog.cpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QInputDialog>
+#include <QObject>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/dialog/InputDialog.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::InputDialog, ::fwGui::dialog::IInputDialog::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+InputDialog::InputDialog(::fwGui::GuiBaseObject::Key key) : m_input("")
+{}
+
+//------------------------------------------------------------------------------
+
+InputDialog::~InputDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void InputDialog::setTitle( const std::string &title )
+{
+    m_title = title;
+}
+
+//------------------------------------------------------------------------------
+
+void InputDialog::setMessage( const std::string &msg )
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+/// Set the input text in the input field
+void InputDialog::setInput(const std::string &text)
+{
+    m_input = text;
+}
+
+//------------------------------------------------------------------------------
+
+/// Get the input text in the input field
+std::string InputDialog::getInput()
+{
+    QString title = QObject::tr(m_title.c_str());
+    QString text = QObject::tr(m_message.c_str());
+
+    bool IsOkClicked;
+    QString outputText = QInputDialog::getText(qApp->activeWindow(), title, text, QLineEdit::Normal,QString::fromStdString(m_input),&IsOkClicked);
+
+    if ( IsOkClicked)
+    {
+        m_input = outputText.toStdString();
+    }
+    else
+    {
+        m_input = "";
+    }
+    return m_input;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/LocationDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/LocationDialog.cpp
new file mode 100644
index 0000000..7014a38
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/LocationDialog.cpp
@@ -0,0 +1,160 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <QFileDialog>
+#include <QString>
+#include <QApplication>
+
+#include <fwGui/registry/macros.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+
+#include <fwGui/dialog/ILocationDialog.hpp>
+
+#include "fwGuiQt/dialog/LocationDialog.hpp"
+
+
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::LocationDialog, ::fwGui::dialog::ILocationDialog::REGISTRY_KEY );
+
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+LocationDialog::LocationDialog(::fwGui::GuiBaseObject::Key key) :
+        m_style(::fwGui::dialog::ILocationDialog::NONE),
+        m_type(::fwGui::dialog::ILocationDialog::SINGLE_FILE)
+{}
+
+//------------------------------------------------------------------------------
+
+::fwData::location::ILocation::sptr LocationDialog::show()
+{
+    QWidget *parent = qApp->activeWindow();
+    QString caption = QString::fromStdString(this->getTitle());
+    const ::boost::filesystem::path defaultPath = this->getDefaultLocation();
+    QString path = QString::fromStdString(defaultPath.string());
+    QString filter = this->fileFilters();
+    ::fwData::location::ILocation::sptr location;
+
+    if (m_type == ::fwGui::dialog::ILocationDialog::MULTI_FILES)
+    {
+        SLM_ASSERT("MULTI_FILES type must have a READ style", m_style & ::fwGui::dialog::ILocationDialog::READ);
+
+        QStringList files = QFileDialog::getOpenFileNames( parent, caption, path, filter);
+        if(!files.isEmpty())
+        {
+            ::fwData::location::MultiFiles::sptr multifiles = ::fwData::location::MultiFiles::New();
+            std::vector< ::boost::filesystem::path > paths;
+            BOOST_FOREACH (QString filename, files)
+            {
+                ::boost::filesystem::path bpath( filename.toStdString() );
+                paths.push_back(bpath);
+            }
+            multifiles->setPaths(paths);
+            location = multifiles;
+        }
+    }
+    else if (m_type == ::fwGui::dialog::ILocationDialog::SINGLE_FILE)
+    {
+        QString fileName;
+        if ( (m_style & ::fwGui::dialog::ILocationDialog::READ) || (m_style & ::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST) )
+        {
+            fileName = QFileDialog::getOpenFileName(parent, caption, path, filter);
+
+        }
+        else if ( m_style & ::fwGui::dialog::ILocationDialog::WRITE )
+        {
+            fileName = QFileDialog::getSaveFileName(parent, caption,  path,  filter);
+
+        }
+        if(!fileName.isNull())
+        {
+            ::boost::filesystem::path bpath( fileName.toStdString());
+            location = ::fwData::location::SingleFile::New(bpath);
+        }
+    }
+    else if (m_type == ::fwGui::dialog::ILocationDialog::FOLDER)
+    {
+        QString dir = QFileDialog::getExistingDirectory(parent, caption, path, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+        if(!dir.isNull())
+        {
+            ::boost::filesystem::path bpath( dir.toStdString()  );
+            location = ::fwData::location::Folder::New(bpath);
+        }
+    }
+    return location;
+}
+
+//------------------------------------------------------------------------------
+
+void LocationDialog::setType( ::fwGui::dialog::ILocationDialog::Types type )
+{
+    m_type = type;
+}
+
+//------------------------------------------------------------------------------
+
+::fwGui::dialog::ILocationDialog&  LocationDialog::setOption( ::fwGui::dialog::ILocationDialog::Options option)
+{
+    if ( option == ::fwGui::dialog::ILocationDialog::WRITE )
+    {
+        m_style = (::fwGui::dialog::ILocationDialog::Options) (m_style & ~ ::fwGui::dialog::ILocationDialog::READ) ;
+        m_style = (::fwGui::dialog::ILocationDialog::Options) (m_style | ::fwGui::dialog::ILocationDialog::WRITE);
+    }
+    else if ( option == ::fwGui::dialog::ILocationDialog::READ )
+    {
+        m_style = (::fwGui::dialog::ILocationDialog::Options) (m_style & ~::fwGui::dialog::ILocationDialog::WRITE) ;
+        m_style = (::fwGui::dialog::ILocationDialog::Options) (m_style | ::fwGui::dialog::ILocationDialog::READ) ;
+    }
+    else if ( option == ::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST )
+    {
+        m_style = (::fwGui::dialog::ILocationDialog::Options) (m_style | ::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST)  ;
+    }
+
+    return *this;
+}
+
+//------------------------------------------------------------------------------
+
+// exemple ( addFilter("images","*.png *.jpg");
+void LocationDialog::addFilter(const std::string &filterName, const std::string &wildcardList )
+{
+    m_filters.push_back( std::make_pair( filterName, wildcardList ));
+}
+
+//------------------------------------------------------------------------------
+
+// "BMP and GIF files (*.bmp *.gif)|*.bmp *.gif|PNG files (*.png)|*.png"
+QString LocationDialog::fileFilters()
+{
+    std::string result;
+    std::vector< std::pair < std::string, std::string > >::const_iterator iter;
+    for ( iter = m_filters.begin(); iter!= m_filters.end(); ++iter)
+    {
+        std::string filterName = iter->first;
+        std::string rawWildcards = iter->second;
+
+        if (iter!=m_filters.begin() )
+        {
+            result += ";;";
+        }
+        result += filterName +" (" +  rawWildcards +")" ;
+    }
+    return QString::fromStdString(result);
+}
+
+//------------------------------------------------------------------------------
+} // namespace dialog
+} //namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MessageDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MessageDialog.cpp
new file mode 100644
index 0000000..ad4d0e1
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MessageDialog.cpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
+
+#include <QApplication>
+#include <QMessageBox>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/dialog/MessageDialog.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::MessageDialog, ::fwGui::dialog::IMessageDialog::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+typedef const std::map< ::fwGui::dialog::IMessageDialog::Icons, QMessageBox::Icon> MessageDialogQtIconsType;
+MessageDialogQtIconsType messageDialogQtIcons =
+                        ::boost::assign::map_list_of(::fwGui::dialog::IMessageDialog::NONE     , QMessageBox::NoIcon     )
+                                                    (::fwGui::dialog::IMessageDialog::QUESTION , QMessageBox::Question   )
+                                                    (::fwGui::dialog::IMessageDialog::INFO     , QMessageBox::Information)
+                                                    (::fwGui::dialog::IMessageDialog::WARNING  , QMessageBox::Warning    )
+                                                    (::fwGui::dialog::IMessageDialog::CRITICAL , QMessageBox::Critical   );
+
+typedef const std::map< ::fwGui::dialog::IMessageDialog::Buttons, QMessageBox::StandardButtons> MessageDialogQtButtonType;
+MessageDialogQtButtonType messageDialogQtButton =
+                        ::boost::assign::map_list_of(::fwGui::dialog::IMessageDialog::OK     , QMessageBox::Ok   )
+                                                    (::fwGui::dialog::IMessageDialog::CANCEL , QMessageBox::Cancel)
+                                                    (::fwGui::dialog::IMessageDialog::YES    , QMessageBox::Yes    )
+                                                    (::fwGui::dialog::IMessageDialog::NO     , QMessageBox::No   );
+
+//------------------------------------------------------------------------------
+
+MessageDialog::MessageDialog(::fwGui::GuiBaseObject::Key key) :
+    m_buttons(::fwGui::dialog::IMessageDialog::NOBUTTON),
+    m_defaultButton(::fwGui::dialog::IMessageDialog::NOBUTTON),
+    m_icon(::fwGui::dialog::IMessageDialog::NONE)
+{}
+
+//------------------------------------------------------------------------------
+
+MessageDialog::~MessageDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void MessageDialog::setTitle( const std::string &title )
+{
+    m_title = title;
+}
+
+//------------------------------------------------------------------------------
+
+void MessageDialog::setMessage( const std::string &msg )
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+void MessageDialog::setIcon( ::fwGui::dialog::IMessageDialog::Icons icon )
+{
+    m_icon = icon;
+}
+
+//------------------------------------------------------------------------------
+
+void MessageDialog::addButton( ::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    m_buttons = (::fwGui::dialog::IMessageDialog::Buttons) ( m_buttons | button );
+}
+
+//-----------------------------------------------------------------------------
+
+void MessageDialog::setDefaultButton(::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    m_defaultButton = button;
+}
+
+//------------------------------------------------------------------------------
+
+::fwGui::dialog::IMessageDialog::Buttons MessageDialog::show()
+{
+    MessageDialogQtIconsType::const_iterator iterIcon = messageDialogQtIcons.find(m_icon);
+    SLM_ASSERT("Unknown Icon", iterIcon != messageDialogQtIcons.end());
+
+    QMessageBox::Icon icon = iterIcon->second;
+    QString title = QString::fromStdString(m_title);
+    QString text = QString::fromStdString(m_message);
+    QMessageBox::StandardButtons buttons = QMessageBox::NoButton;
+
+    BOOST_FOREACH(MessageDialogQtButtonType::value_type button, messageDialogQtButton)
+    {
+        if ( m_buttons & button.first)
+        {
+            buttons |= button.second;
+        }
+    }
+
+    QMessageBox box(icon, title, text, buttons, qApp->activeWindow());
+
+    MessageDialogQtButtonType::const_iterator iter = messageDialogQtButton.find(m_defaultButton);
+    if(iter != messageDialogQtButton.end())
+    {
+        box.setDefaultButton(QMessageBox::StandardButton(static_cast<int>(iter->second)));
+    }
+
+    ::fwGui::dialog::IMessageDialog::Buttons result;
+
+    box.exec();
+
+    BOOST_FOREACH(MessageDialogQtButtonType::value_type button, messageDialogQtButton)
+    {
+        if ( box.standardButton( box.clickedButton() ) == button.second)
+        {
+            result = button.first;
+            break;
+        }
+    }
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MultiSelectorDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MultiSelectorDialog.cpp
new file mode 100644
index 0000000..1e5a508
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/MultiSelectorDialog.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <QApplication>
+#include <QPushButton>
+#include <QListWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QLabel>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/dialog/MultiSelectorDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::MultiSelectorDialog, ::fwGui::dialog::IMultiSelectorDialog::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+MultiSelectorDialog::MultiSelectorDialog(::fwGui::GuiBaseObject::Key key)
+    : m_message(""),
+    m_title("")
+{}
+
+//------------------------------------------------------------------------------
+
+MultiSelectorDialog::~MultiSelectorDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setSelections(Selections _selections)
+{
+    this->m_selections = _selections;
+}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setTitle(std::string _title)
+{
+    this->m_title = _title;
+}
+
+//------------------------------------------------------------------------------
+
+::fwGui::dialog::IMultiSelectorDialog::Selections MultiSelectorDialog::show()
+{
+    QWidget *parent = qApp->activeWindow();
+
+    QDialog* dialog = new QDialog(parent);
+    dialog->setWindowTitle(QString::fromStdString(m_title));
+
+    QListWidget *selectionList = new QListWidget(dialog);
+    BOOST_FOREACH( Selections::value_type selection, m_selections)
+    {
+        QListWidgetItem* item = new QListWidgetItem(QString::fromStdString(selection.first), selectionList);
+        item->setCheckState( (selection.second ? Qt::Checked : Qt::Unchecked) );
+        selectionList->addItem(item);
+    }
+
+    QListWidgetItem* firstItem = selectionList->item(0);
+    selectionList->setCurrentItem(firstItem);
+
+    QPushButton* okButton = new QPushButton(tr("Ok"));
+    QPushButton* cancelButton = new QPushButton(tr("Cancel"));
+
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addWidget(okButton);
+    hLayout->addWidget(cancelButton);
+
+    QVBoxLayout *vLayout = new QVBoxLayout();
+    if(!m_message.empty())
+    {
+        QLabel* msgText = new QLabel(QString::fromStdString(m_message), dialog);
+        vLayout->addWidget( msgText);
+    }
+    vLayout->addWidget(selectionList);
+    vLayout->addLayout(hLayout);
+
+    dialog->setLayout(vLayout);
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    QObject::connect(cancelButton, SIGNAL(clicked()), dialog, SLOT(reject()));
+    QObject::connect(selectionList, SIGNAL(itemDoubleClicked( QListWidgetItem * )), dialog, SLOT(accept()));
+
+    Selections selections;
+    if(dialog->exec())
+    {
+        int indexItem=0;
+        BOOST_FOREACH( Selections::value_type selection, m_selections)
+        {
+            selections[selection.first] = (selectionList->item(indexItem)->checkState() == Qt::Checked);
+            indexItem++;
+         }
+    }
+    return selections;
+}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setMessage(const std::string &msg)
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/ProgressDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/ProgressDialog.cpp
new file mode 100644
index 0000000..72918f4
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/ProgressDialog.cpp
@@ -0,0 +1,197 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QPaintEvent>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/registry/macros.hpp>
+#include <fwGui/container/fwContainer.hpp>
+#include <fwGui/IFrameSrv.hpp>
+
+#include "fwGuiQt/dialog/ProgressDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::ProgressDialog, ::fwGui::dialog::IProgressDialog::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+ProgressDialog::ProgressDialog( ::fwGui::GuiBaseObject::Key key, const std::string &title, const std::string &message)
+:   m_title (""),
+    m_pdialog ( NULL ),
+    m_pprogressbar ( NULL ),
+    m_pcancelButton ( NULL ),
+    m_pmainWindow ( NULL )
+{
+
+    // Use progress widget defined by IFrameSrv
+    ::fwGui::container::fwContainer::sptr progressWidget = ::fwGui::IFrameSrv::getProgressWidget();
+    QWidget *activeWindow = ::fwGuiQt::container::QtContainer::dynamicCast( progressWidget )->getQtContainer();
+    m_pmainWindow = qobject_cast< QMainWindow * >( activeWindow );
+
+//    QWidget *activeWindow = NULL;
+//
+//    BOOST_FOREACH (QWidget *widget, QApplication::topLevelWidgets())
+//    {
+//        activeWindow = qobject_cast< QMainWindow * >(widget);
+//        // activeWindow must also have a layout to use statusBar()
+//        if ( activeWindow && activeWindow->layout())
+//        {
+//            m_pmainWindow = qobject_cast< QMainWindow * >(activeWindow);
+//            break;
+//        }
+//    }
+
+    m_pcancelButton = new QPushButton("Cancel");
+    QObject::connect( m_pcancelButton, SIGNAL(clicked()), this, SLOT(cancelPressed()) );
+
+    if ( m_pmainWindow )
+    {
+        m_pprogressbar = new QProgressBar();
+        m_pprogressbar->setRange(0,100);
+        m_pprogressbar->setValue(0);
+        m_pmainWindow->statusBar()->addPermanentWidget(m_pprogressbar,0);
+        m_pmainWindow->statusBar()->addPermanentWidget(m_pcancelButton,0);
+        m_pmainWindow->statusBar()->setMinimumHeight(25);
+        m_pmainWindow->statusBar()->setMaximumHeight(25);
+    }
+    else
+    {
+        m_pdialog = new QProgressDialog( 0, Qt::WindowStaysOnTopHint );
+       //m_pdialog = new QProgressDialog( activeWindow, Qt::WindowStaysOnTopHint );
+
+        // FIXME modal dialog has conflict with MessageHandler
+        //m_pdialog->setWindowModality(Qt::WindowModal);
+        m_pdialog->setWindowModality(Qt::NonModal);
+        m_pdialog->setMinimum(0);
+        m_pdialog->setMaximum(100);
+        m_pdialog->setValue(0);
+        m_pdialog->setCancelButton(m_pcancelButton);
+
+        this->setTitle(title);
+        this->setMessage(message);
+
+        m_pdialog->show();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+ProgressDialog::~ProgressDialog()
+{
+    QObject::disconnect( m_pcancelButton, SIGNAL(clicked()), this, SLOT(cancelPressed()) );
+
+    this->setTitle("");
+    this->setMessage("");
+
+    if (m_pdialog)
+    {
+        m_pdialog->hide();
+        delete m_pdialog;
+    }
+    else if ( m_pprogressbar )
+    {
+        m_pmainWindow->statusBar()->removeWidget( m_pprogressbar );
+        m_pmainWindow->statusBar()->removeWidget( m_pcancelButton );
+        m_pcancelButton->hide();
+        delete m_pcancelButton;
+        m_pprogressbar->hide();
+        delete m_pprogressbar;
+
+    }
+
+    m_pmainWindow = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::operator()(float percent, std::string msg)
+{
+    SLM_ASSERT("m_pdialog or m_pprogressbar not instanced", m_pprogressbar || m_pdialog);
+    int value = (int)(percent*100);
+    if(value != this->m_value)
+    {
+        OSLM_TRACE( "ProgressDialog msg" << msg << " : " << value <<"%");
+        this->setMessage(msg);
+
+        if ( m_pprogressbar )
+        {
+            m_pprogressbar->setValue(value);
+        }
+        else if ( m_pdialog )
+        {
+            m_pdialog->setValue(value);
+        }
+
+        if ( m_processUserEvents )
+        {
+            QCoreApplication::processEvents(QEventLoop::AllEvents);
+        }
+        else
+        {
+            QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
+        }
+        this->m_value = value;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+void ProgressDialog::setTitle(const std::string &title)
+{
+    m_title = QString::fromStdString(title);
+    if ( m_pprogressbar )
+    {
+        m_pmainWindow->statusBar()->showMessage(m_title);
+    }
+    else if ( m_pdialog )
+    {
+        m_pdialog->setWindowTitle(m_title);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::setMessage(const std::string &msg)
+{
+    QString message("");
+    if (!m_title.isEmpty())
+    {
+        message += m_title;
+        message += " - ";
+    }
+
+    message += QString::fromStdString(msg);
+    if ( m_pprogressbar )
+    {
+        m_pmainWindow->statusBar()->showMessage(message);
+    }
+    else if ( m_pdialog )
+    {
+        m_pdialog->setLabelText(message);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::cancelPressed()
+{
+    IProgressDialog::cancelPressed();
+}
+
+//------------------------------------------------------------------------------
+void ProgressDialog::hideCancelButton()
+{
+    m_pcancelButton->hide();
+}
+
+} // namespace dialog
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/PulseProgressDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/PulseProgressDialog.cpp
new file mode 100644
index 0000000..1d62a3e
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/PulseProgressDialog.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QtCore>
+#include <QString>
+#include <QFutureWatcher>
+#include <QApplication>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+
+#include "fwGuiQt/dialog/PulseProgressDialog.hpp"
+
+
+fwGuiRegisterMacro(::fwGuiQt::dialog::PulseProgressDialog, ::fwGui::dialog::IPulseProgressDialog::REGISTRY_KEY );
+
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+PulseProgressDialog::PulseProgressDialog(::fwGui::GuiBaseObject::Key key)
+{
+    m_pdialog = new QProgressDialog(qApp->activeWindow());
+}
+
+//------------------------------------------------------------------------------
+
+PulseProgressDialog::~PulseProgressDialog()
+{
+    if (m_pdialog)
+    {
+        m_pdialog->hide();
+        delete m_pdialog;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::setTitle(const std::string &title)
+{
+    m_pdialog->setWindowTitle(QString::fromStdString(title));
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::setMessage(const std::string &msg)
+{
+    m_pdialog->setLabelText(QString::fromStdString(msg));
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::show()
+{
+    // Create a QFutureWatcher and connect signals and slots.
+    QFutureWatcher<void> futureWatcher;
+    QObject::connect(&futureWatcher, SIGNAL(finished()), m_pdialog, SLOT(reset()));
+    QObject::connect(m_pdialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
+    QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int,int)), m_pdialog, SLOT(setRange(int,int)));
+    QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), m_pdialog, SLOT(setValue(int)));
+
+    // Start the computation.
+    futureWatcher.setFuture(QtConcurrent::run(m_stuff));
+
+    m_pdialog->exec();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/SelectorDialog.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/SelectorDialog.cpp
new file mode 100644
index 0000000..39d9e8a
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/dialog/SelectorDialog.cpp
@@ -0,0 +1,114 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <QApplication>
+#include <QPushButton>
+#include <QListWidget>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QPushButton>
+#include <QLabel>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/dialog/SelectorDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiQt::dialog::SelectorDialog, ::fwGui::dialog::ISelectorDialog::REGISTRY_KEY );
+
+namespace fwGuiQt
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+SelectorDialog::SelectorDialog(::fwGui::GuiBaseObject::Key key) : m_message(""),  m_title("")
+{}
+
+//------------------------------------------------------------------------------
+
+SelectorDialog::~SelectorDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setSelections(std::vector< std::string > _selections)
+{
+    this->m_selections = _selections;
+}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setTitle(std::string _title)
+{
+    this->m_title = _title;
+}
+
+//------------------------------------------------------------------------------
+
+std::string SelectorDialog::show()
+{
+    QWidget *parent = qApp->activeWindow();
+
+    QDialog* dialog = new QDialog(parent);
+    dialog->setWindowTitle(QString::fromStdString(m_title));
+
+    QListWidget *selectionList = new QListWidget(dialog);
+    BOOST_FOREACH( std::string selection, m_selections)
+    {
+        selectionList->addItem(QString::fromStdString ( selection ));
+    }
+
+    QListWidgetItem* firstItem = selectionList->item(0);
+    selectionList->setCurrentItem(firstItem);
+
+    QPushButton* okButton = new QPushButton(tr("Ok"));
+    QPushButton* cancelButton = new QPushButton(tr("Cancel"));
+
+    QHBoxLayout *hLayout = new QHBoxLayout();
+    hLayout->addWidget(okButton);
+    hLayout->addWidget(cancelButton);
+
+    QVBoxLayout *vLayout = new QVBoxLayout();
+    if(!m_message.empty())
+    {
+        QLabel* msgText = new QLabel(QString::fromStdString(m_message), dialog);
+        vLayout->addWidget( msgText);
+    }
+    vLayout->addWidget(selectionList);
+    vLayout->addLayout(hLayout);
+
+    dialog->setLayout(vLayout);
+    QObject::connect(okButton, SIGNAL(clicked()), dialog, SLOT(accept()));
+    QObject::connect(cancelButton, SIGNAL(clicked()), dialog, SLOT(reject()));
+    QObject::connect(selectionList, SIGNAL(itemDoubleClicked( QListWidgetItem * )), dialog, SLOT(accept()));
+
+    std::string selection = "";
+    if(dialog->exec())
+    {
+        selection = selectionList->currentItem()->text().toStdString();
+    }
+
+    return selection;
+}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setMessage(const std::string &msg)
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiQt
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/CppHighlighter.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/CppHighlighter.cpp
new file mode 100644
index 0000000..bf8989b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/CppHighlighter.cpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <QtGui>
+
+#include "fwGuiQt/highlighter/CppHighlighter.hpp"
+
+namespace fwGuiQt
+{
+namespace highlighter
+{
+
+CppHighlighter::CppHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
+{
+    HighlightingRule rule;
+
+    QTextCharFormat keywordFormat;
+    keywordFormat.setForeground(Qt::darkBlue);
+    keywordFormat.setFontWeight(QFont::Bold);
+    QStringList keywordPatterns;
+    keywordPatterns << "char" << "class" << "const"
+                    << "double" << "enum" << "explicit"
+                    << "friend" << "inline" << "int"
+                    << "long" << "namespace" << "operator"
+                    << "private" << "protected" << "public"
+                    << "short" << "signals" << "signed"
+                    << "slots" << "static" << "struct"
+                    << "template" << "typedef" << "typename"
+                    << "union" << "unsigned" << "virtual"
+                    << "void" << "volatile";
+    BOOST_FOREACH(const QString &pattern, keywordPatterns)
+    {
+        rule.pattern = QRegExp("\\b" + pattern + "\\b");
+        rule.format = keywordFormat;
+        highlightingRules.append(rule);
+    }
+
+    QTextCharFormat classFormat;
+    classFormat.setFontWeight(QFont::Bold);
+    classFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b");
+    rule.format = classFormat;
+    highlightingRules.append(rule);
+
+    QTextCharFormat singleLineCommentFormat;
+    singleLineCommentFormat.setForeground(Qt::red);
+    rule.pattern = QRegExp("//[^\n]*");
+    rule.format = singleLineCommentFormat;
+    highlightingRules.append(rule);
+
+    multiLineCommentFormat.setForeground(Qt::red);
+
+    QTextCharFormat quotationFormat;
+    quotationFormat.setForeground(Qt::darkGreen);
+    rule.pattern = QRegExp("\".*\"");
+    rule.format = quotationFormat;
+    highlightingRules.append(rule);
+
+    QTextCharFormat functionFormat;
+    functionFormat.setFontItalic(true);
+    functionFormat.setForeground(Qt::blue);
+    rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
+    rule.format = functionFormat;
+    highlightingRules.append(rule);
+
+    commentStartExpression = QRegExp("/\\*");
+    commentEndExpression = QRegExp("\\*/");
+}
+
+//------------------------------------------------------------------------------
+
+void CppHighlighter::highlightBlock(const QString &text)
+{
+    BOOST_FOREACH(const HighlightingRule &rule, highlightingRules)
+    {
+        QRegExp expression(rule.pattern);
+        int index = expression.indexIn(text);
+        while (index >= 0)
+        {
+            int length = expression.matchedLength();
+            setFormat(index, length, rule.format);
+            index = expression.indexIn(text, index + length);
+        }
+    }
+    setCurrentBlockState(0);
+
+    int startIndex = 0;
+    if (previousBlockState() != 1)
+        startIndex = commentStartExpression.indexIn(text);
+
+    while (startIndex >= 0)
+    {
+        int endIndex = commentEndExpression.indexIn(text, startIndex);
+        int commentLength;
+        if (endIndex == -1)
+        {
+            setCurrentBlockState(1);
+            commentLength = text.length() - startIndex;
+        } else
+        {
+            commentLength = endIndex - startIndex
+                    + commentEndExpression.matchedLength();
+        }
+        setFormat(startIndex, commentLength, multiLineCommentFormat);
+        startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwGuiQt
+} //namespace highlighter
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/PythonHighlighter.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/PythonHighlighter.cpp
new file mode 100644
index 0000000..f05cb49
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/highlighter/PythonHighlighter.cpp
@@ -0,0 +1,159 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <QtGui>
+
+#include "fwGuiQt/highlighter/PythonHighlighter.hpp"
+
+namespace fwGuiQt
+{
+namespace highlighter
+{
+
+PythonHighlighter::PythonHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent)
+{
+    // http://diotavelli.net/PyQtWiki/Python%20syntax%20highlighting
+    HighlightingRule rule;
+
+    // Python keywords
+    QTextCharFormat keywordFormat;
+    keywordFormat.setForeground(Qt::darkBlue);
+    keywordFormat.setFontWeight(QFont::Bold);
+    QStringList keywordPatterns;
+    keywordPatterns << "and" << "assert" << "break" << "class" << "continue" << "def"
+                    << "del" << "elif" << "else" << "except" << "exec" << "finally"
+                    << "for" << "from" << "global" << "if" << "import" << "in"
+                    << "is" << "lambda" << "not" << "or" << "pass" << "print"
+                    << "raise" << "return" << "try" << "while" << "yield"
+                    << "None" << "True" << "False";
+    rule.nth = 0;
+    BOOST_FOREACH(const QString &pattern, keywordPatterns)
+    {
+        rule.pattern = QRegExp( "\\b" + pattern + "\\b");
+        rule.format = keywordFormat;
+        highlightingRules.append(rule);
+    }
+
+    // Python operators
+    QTextCharFormat operatorsFormat;
+    operatorsFormat.setForeground(Qt::red);
+    QStringList operatorsPatterns;
+    operatorsPatterns << "="
+                    // Comparison
+                    << "==" << "!=" << "<" << "<=" << ">" << ">="
+                    // Arithmetic
+                    << "\\+" << "-" << "\\*" << "/" << "//" << "\\%" << "\\*\\*"
+                    // In-place
+                    << "\\+=" << "-=" << "\\*=" << "/=" << "\\%="
+                    // Bitwise
+                    << "\\^" << "\\|" << "\\&" << "\\~" << ">>" << "<<";
+    rule.nth = 0;
+    BOOST_FOREACH(const QString &pattern, operatorsPatterns)
+    {
+        rule.pattern = QRegExp( pattern );
+        rule.format = operatorsFormat;
+        highlightingRules.append(rule);
+    }
+
+    // Python braces
+    QTextCharFormat bracesFormat;
+    bracesFormat.setForeground(Qt::darkGray);
+    QStringList bracesPatterns;
+    bracesPatterns << "\\{" << "\\}" << "\\(" << "\\)" << "\\[" << "\\]";
+    rule.nth = 0;
+    BOOST_FOREACH(const QString &pattern, bracesPatterns)
+    {
+        rule.pattern = QRegExp( pattern );
+        rule.format = bracesFormat;
+        highlightingRules.append(rule);
+    }
+
+    // 'class' followed by an identifier
+    QTextCharFormat classFormat;
+    classFormat.setFontWeight(QFont::Bold);
+    classFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("\\bclass\\b\\s*(\\w+)");
+    rule.format = classFormat;
+    rule.nth = 1;
+    highlightingRules.append(rule);
+
+    // 'def' followed by an identifier
+    QTextCharFormat defFormat;
+    defFormat.setFontWeight(QFont::Bold);
+    defFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("\\bdef\\b\\s*(\\w+)");
+    rule.format = defFormat;
+    rule.nth = 1;
+    highlightingRules.append(rule);
+
+    // Python self
+    QTextCharFormat selfFormat;
+    selfFormat.setFontItalic(true);
+    selfFormat.setForeground(Qt::black);
+    rule.pattern = QRegExp("\\bself\\b");
+    rule.format = selfFormat;
+    rule.nth = 0;
+    highlightingRules.append(rule);
+
+    // Double-quoted string, possibly containing escape sequences : "[^"\\]*(\\.[^"\\]*)*"
+    QTextCharFormat stringFormat;
+    stringFormat.setForeground(Qt::darkMagenta);
+    rule.pattern = QRegExp("\".*\"");
+    rule.format = stringFormat;
+    rule.nth = 0;
+    highlightingRules.append(rule);
+    // Single-quoted string, possibly containing escape sequences : '[^'\\]*(\\.[^'\\]*)*'
+    rule.pattern = QRegExp("'.*'");
+    highlightingRules.append(rule);
+
+    // Python comment (single line)
+    QTextCharFormat singleLineCommentFormat;
+    singleLineCommentFormat.setFontItalic(true);
+    singleLineCommentFormat.setForeground(Qt::darkGreen);
+    rule.pattern = QRegExp("#[^\\n]*");
+    rule.format = singleLineCommentFormat;
+    rule.nth = 0;
+    highlightingRules.append(rule);
+
+    // Numeric literals
+    QTextCharFormat numericFormat;
+    QColor col;
+    col.setNamedColor("brown");
+    numericFormat.setForeground(col);
+    rule.format = numericFormat;
+    rule.nth = 0;
+    rule.pattern = QRegExp("\\b[+-]?[0-9]+[lL]?\\b");
+    highlightingRules.append(rule);
+    rule.pattern = QRegExp("\\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\\b");
+    highlightingRules.append(rule);
+    rule.pattern = QRegExp("\\b[+-]?[0-9]+(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b");
+    highlightingRules.append(rule);
+}
+
+//------------------------------------------------------------------------------
+
+void PythonHighlighter::highlightBlock(const QString &text)
+{
+    BOOST_FOREACH(const HighlightingRule &rule, highlightingRules)
+    {
+        QRegExp expression(rule.pattern);
+        int index = expression.indexIn(text, 0);
+        while (index >= 0)
+        {
+            index = expression.pos(rule.nth);
+            int length = expression.cap(rule.nth).length();
+            setFormat(index, length, rule.format);
+            index = expression.indexIn(text, index + length);
+        }
+    }
+    setCurrentBlockState(0);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwGuiQt
+} //namespace highlighter
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/CardinalLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/CardinalLayoutManager.cpp
new file mode 100644
index 0000000..4254289
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/CardinalLayoutManager.cpp
@@ -0,0 +1,185 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QMainWindow>
+#include <QDockWidget>
+#include <QBoxLayout>
+#include <QGroupBox>
+#include <QScrollArea>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/layoutManager/CardinalLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::CardinalLayoutManager,
+                    ::fwGui::layoutManager::CardinalLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManager::CardinalLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManager::~CardinalLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void CardinalLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", m_parentContainer);
+
+    QWidget *qtContainer = m_parentContainer->getQtContainer();
+    m_qtWindow = new QMainWindow(  );
+
+    QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight);
+    if (qtContainer->layout())
+    {
+        QWidget().setLayout(qtContainer->layout());
+    }
+    layout->setContentsMargins(0,0,0,0);
+    qtContainer->setLayout(layout);
+    layout->addWidget( m_qtWindow );
+
+    const std::list< ViewInfo> &views = this->getViewsInfo();
+
+    bool hasCentral = false;
+
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        QWidget *insideWidget;
+        QScrollArea *scrollArea;
+
+        if(viewInfo.m_align==CENTER)
+        {
+            if(viewInfo.m_caption.first)
+            {
+                QGroupBox *groupbox = new QGroupBox(m_qtWindow);
+                groupbox->setTitle(QString::fromStdString(viewInfo.m_caption.second));
+                insideWidget = groupbox;
+            }
+            else
+            {
+                insideWidget = new QWidget(m_qtWindow);
+            }
+
+            QWidget *widget = insideWidget;
+            SLM_ASSERT("multiple center views are not managed in Qt version of CardinalLayoutManager",
+                    !hasCentral);
+
+            if (viewInfo.m_useScrollBar)
+            {
+                scrollArea = new QScrollArea(m_qtWindow);
+                scrollArea->setWidget(widget);
+                scrollArea->setWidgetResizable ( true );
+                m_qtWindow->setCentralWidget(scrollArea);
+            }
+            else
+            {
+                m_qtWindow->setCentralWidget(widget);
+            }
+
+            insideWidget->setVisible(viewInfo.m_visible);
+            hasCentral = true;
+        }
+        else
+        {
+            QDockWidget *dockWidget= new QDockWidget(m_qtWindow);
+            insideWidget = new QWidget(dockWidget);
+            QDockWidget::DockWidgetFeatures features;
+
+            features = QDockWidget::DockWidgetMovable ;
+
+            Qt::DockWidgetArea area;
+
+            if(viewInfo.m_align==RIGHT)       { area = Qt::RightDockWidgetArea;}
+            else if(viewInfo.m_align==LEFT)   { area = Qt::LeftDockWidgetArea;}
+            else if(viewInfo.m_align==BOTTOM) { area = Qt::BottomDockWidgetArea;}
+            else if(viewInfo.m_align==TOP)    { area = Qt::TopDockWidgetArea;}
+
+            m_qtWindow->addDockWidget(area, dockWidget);
+            dockWidget->setFeatures(features);
+
+            if(viewInfo.m_caption.first)
+            {
+                dockWidget->setWindowTitle( QString::fromStdString(viewInfo.m_caption.second) );
+            }
+            else
+            {
+                // Remove title bar
+                QWidget *widget = new QWidget(dockWidget);
+                dockWidget->setTitleBarWidget(widget);
+            }
+
+            if (viewInfo.m_useScrollBar)
+            {
+                scrollArea = new QScrollArea(dockWidget);
+                scrollArea->setWidget(insideWidget);
+                scrollArea->setWidgetResizable ( true );
+                dockWidget->setWidget(scrollArea);
+            }
+            else
+            {
+                dockWidget->setWidget(insideWidget);
+            }
+            dockWidget->setVisible(viewInfo.m_visible);
+        }
+
+        if(!viewInfo.m_isResizable)
+        {
+            //TODO
+        }
+
+        if (viewInfo.m_useScrollBar)
+        {
+            scrollArea->setMinimumSize(std::max(viewInfo.m_minSize.first,0), std::max(viewInfo.m_minSize.second,0));
+        }
+        else
+        {
+            insideWidget->setMinimumSize(std::max(viewInfo.m_minSize.first,0), std::max(viewInfo.m_minSize.second,0));
+        }
+
+        //TODO
+        // - viewInfo.m_position
+        // - viewInfo.m_layer
+        // - viewInfo.m_row
+        // - viewInfo.m_visible
+
+        ::fwGuiQt::container::QtContainer::sptr subContainer = ::fwGuiQt::container::QtContainer::New();
+        subContainer->setQtContainer(insideWidget);
+        m_subViews.push_back(subContainer);
+    }
+
+    m_qtWindow->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
+}
+
+//-----------------------------------------------------------------------------
+
+void CardinalLayoutManager::destroyLayout()
+{
+    this->destroySubViews();
+
+    m_parentContainer->clean();
+
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/FrameLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/FrameLayoutManager.cpp
new file mode 100644
index 0000000..e1db1d7
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/FrameLayoutManager.cpp
@@ -0,0 +1,202 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QApplication>
+#include <QMainWindow>
+#include <QIcon>
+#include <QLayout>
+#include <QDesktopWidget>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include "fwGuiQt/QtMainFrame.hpp"
+#include "fwGuiQt/layoutManager/FrameLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::FrameLayoutManager, ::fwGui::layoutManager::IFrameLayoutManager::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+FrameLayoutManager::FrameLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+FrameLayoutManager::~FrameLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::createFrame()
+{
+    SLM_TRACE_FUNC();
+    FrameInfo frameInfo = this->getFrameInfo();
+
+    ::fwGuiQt::QtMainFrame *mainframe = new ::fwGuiQt::QtMainFrame();
+    m_qtWindow = mainframe;
+
+
+    ::fwGuiQt::QtMainFrame::CloseCallback fct = ::boost::bind( &::fwGui::FrameLayoutManager::onCloseFrame, this);
+    mainframe->setCloseCallback(fct);
+
+    m_qtWindow->setWindowTitle(QString::fromStdString(frameInfo.m_name));
+    m_qtWindow->setMinimumSize(std::max(frameInfo.m_minSize.first,0), std::max(frameInfo.m_minSize.second,0));
+
+
+
+    if(!frameInfo.m_iconPath.empty())
+    {
+        QIcon icon(QString::fromStdString(frameInfo.m_iconPath.string()));
+        OSLM_ASSERT("Sorry, unable to create an icon instance from " << frameInfo.m_iconPath.string(), !icon.isNull());
+        m_qtWindow->setWindowIcon(icon);
+    }
+    if(!qApp->activeWindow())
+    {
+        qApp->setActiveWindow(m_qtWindow);
+    }
+    if (frameInfo.m_style == ::fwGui::layoutManager::IFrameLayoutManager::STAY_ON_TOP)
+    {
+        m_qtWindow->setWindowFlags(Qt::WindowStaysOnTopHint);
+    }
+
+    int sizeX = (frameInfo.m_size.first  > 0)?frameInfo.m_size.first:m_qtWindow->size().width();
+    int sizeY = (frameInfo.m_size.second > 0)?frameInfo.m_size.second:m_qtWindow->size().height();
+
+    int posX = frameInfo.m_position.first;
+    int posY = frameInfo.m_position.second;
+    QPoint pos(posX, posY);
+    if(!this->isOnScreen(pos))
+    {
+        QRect frect(0,0,sizeX,sizeY);
+        frect.moveCenter(QDesktopWidget().screenGeometry().center());
+        pos = frect.topLeft();
+    }
+    m_qtWindow->setGeometry(pos.x(), pos.y(), sizeX, sizeY);
+
+    this->setState(frameInfo.m_state);
+
+
+    QWidget *qwidget = new QWidget(m_qtWindow);
+    m_qtWindow->setCentralWidget(qwidget);
+
+    QObject::connect(m_qtWindow, SIGNAL(destroyed(QObject*)), this, SLOT(onCloseFrame()));
+
+    ::fwGuiQt::container::QtContainer::sptr container = ::fwGuiQt::container::QtContainer::New();
+    container->setQtContainer(qwidget);
+    m_container = container;
+
+    ::fwGuiQt::container::QtContainer::sptr frameContainer = ::fwGuiQt::container::QtContainer::New();
+    frameContainer->setQtContainer(m_qtWindow);
+    m_frame = frameContainer;
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::destroyFrame()
+{
+
+    this->getRefFrameInfo().m_state = this->getState();
+    this->getRefFrameInfo().m_size.first = m_qtWindow->size().width();
+    this->getRefFrameInfo().m_size.second = m_qtWindow->size().height();
+    this->getRefFrameInfo().m_position.first = m_qtWindow->geometry().x();
+    this->getRefFrameInfo().m_position.second = m_qtWindow->geometry().y();
+    this->writeConfig();
+    m_qtWindow->close();
+    QObject::disconnect(m_qtWindow, SIGNAL(destroyed(QObject*)), this, SLOT(onCloseFrame()));
+
+    if (m_qtWindow->layout())
+    {
+        QWidget().setLayout(m_qtWindow->layout());
+    }
+
+    m_container->clean();
+    m_container->destroyContainer();
+
+    // m_qtWindow is cleaned/destroyed by m_frame
+    m_frame->clean();
+    m_frame->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::onCloseFrame()
+{
+    SLM_TRACE_FUNC();
+    this->m_closeCallback();
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::setState( FrameState state )
+{
+    // Updates the window state.
+    switch( state )
+    {
+    case ICONIZED:
+        m_qtWindow->showMinimized();
+        break;
+
+    case MAXIMIZED:
+        m_qtWindow->showMaximized();
+        break;
+
+    case FULL_SCREEN:
+        m_qtWindow->showFullScreen();
+        break;
+    default:
+        m_qtWindow->showNormal();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::layoutManager::IFrameLayoutManager::FrameState FrameLayoutManager::getState()
+{
+    FrameState state( UNKNOWN );
+
+    if( m_qtWindow->isMinimized() )
+    {
+        state = ICONIZED;
+    }
+    else if( m_qtWindow->isMaximized() )
+    {
+        state = MAXIMIZED;
+    }
+    else if( m_qtWindow->isFullScreen() )
+    {
+        state = FULL_SCREEN;
+    }
+    return state;
+}
+
+//-----------------------------------------------------------------------------
+
+bool FrameLayoutManager::isOnScreen(const QPoint& pos)
+{
+    bool isVisible = false;
+    for(int i=0; i < QDesktopWidget().screenCount() && !isVisible; ++i)
+    {
+        isVisible = QDesktopWidget().screenGeometry(i).contains(pos, false);
+    }
+    return isVisible;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/LineLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/LineLayoutManager.cpp
new file mode 100644
index 0000000..fca170d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/LineLayoutManager.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QBoxLayout>
+#include <QGroupBox>
+#include <QStyle>
+#include <QScrollArea>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/layoutManager/LineLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::LineLayoutManager, ::fwGui::layoutManager::LineLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManager::LineLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManager::~LineLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void LineLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", m_parentContainer);
+
+    QBoxLayout *layout = new QBoxLayout(QBoxLayout::LeftToRight);
+    layout->setContentsMargins(0, 0, 0, 0);
+
+    QWidget *qtContainer = m_parentContainer->getQtContainer();
+    Orientation orientation = this->getOrientation();
+
+    if( orientation == VERTICAL )
+    {
+        layout->setDirection(QBoxLayout::TopToBottom);
+    }
+
+    if (qtContainer->layout())
+    {
+        QWidget().setLayout(qtContainer->layout());
+    }
+    qtContainer->setLayout(layout);
+
+    const std::list< ViewInfo> &views = this->getViewsInfo();
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        if(viewInfo.m_isSpacer)
+        {
+            layout->addStretch();
+        }
+        else
+        {
+            QWidget *panel;
+            int border = viewInfo.m_border;
+            if(viewInfo.m_caption.first)
+            {
+                QGroupBox *groupbox = new QGroupBox(qtContainer);
+                groupbox->setTitle(QString::fromStdString(viewInfo.m_caption.second));
+                panel = groupbox;
+                border += groupbox->style()->pixelMetric(QStyle::PM_LayoutTopMargin);
+            }
+            else
+            {
+                panel = new QWidget(qtContainer);
+            }
+            panel->setMinimumSize(std::max(viewInfo.m_minSize.first,0), std::max(viewInfo.m_minSize.second,0));
+            panel->setContentsMargins(border, border,border, border);
+
+            ::fwGuiQt::container::QtContainer::sptr subContainer = ::fwGuiQt::container::QtContainer::New();
+            subContainer->setQtContainer(panel);
+            m_subViews.push_back(subContainer);
+
+            if(viewInfo.m_useScrollBar)
+            {
+                QScrollArea *scrollArea = new QScrollArea(qtContainer);
+                scrollArea->setWidget(panel);
+                scrollArea->setWidgetResizable ( true );
+
+                layout->addWidget( scrollArea );
+                layout->setStretchFactor(scrollArea, viewInfo.m_proportion);
+            }
+            else
+            {
+                layout->addWidget( panel );
+                layout->setStretchFactor(panel, viewInfo.m_proportion);
+            }
+
+            subContainer->setVisible( viewInfo.m_visible );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void LineLayoutManager::destroyLayout()
+{
+    this->destroySubViews();
+    QWidget *qtContainer = m_parentContainer->getQtContainer();
+    m_parentContainer->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuBarLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuBarLayoutManager.cpp
new file mode 100644
index 0000000..e963d60
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuBarLayoutManager.cpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QMenu>
+#include <QMenuBar>
+#include <QString>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/container/QtMenuContainer.hpp"
+#include "fwGuiQt/layoutManager/MenuBarLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::layoutManager::MenuBarLayoutManager,
+                    ::fwGui::layoutManager::IMenuBarLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+MenuBarLayoutManager::MenuBarLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuBarLayoutManager::~MenuBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::createLayout( ::fwGui::container::fwMenuBar::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiQt::container::QtMenuBarContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwMenuBar to QtMenuBarContainer failed", m_parent);
+
+    QMenuBar* menuBar = m_parent->getQtMenuBar();
+
+    BOOST_FOREACH ( std::string name, m_menuNames)
+    {
+        ::fwGuiQt::container::QtMenuContainer::sptr menu = ::fwGuiQt::container::QtMenuContainer::New();
+        QMenu *qtMenu = menuBar->addMenu(QString::fromStdString( name ));
+        menu->setQtMenu(qtMenu);
+        m_menus.push_back(menu);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::destroyLayout()
+{
+    this->destroyMenus();
+    m_menus.clear();
+    m_parent->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void MenuBarLayoutManager::menuIsVisible(::fwGui::container::fwMenu::sptr fwMenu, bool isVisible)
+{
+    ::fwGuiQt::container::QtMenuContainer::sptr menuContainer = ::fwGuiQt::container::QtMenuContainer::dynamicCast(fwMenu);
+    QMenu *menu = menuContainer->getQtMenu();
+    menu->setVisible(isVisible);
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::menuIsEnabled(::fwGui::container::fwMenu::sptr fwMenu, bool isEnabled)
+{
+    ::fwGuiQt::container::QtMenuContainer::sptr menuContainer = ::fwGuiQt::container::QtMenuContainer::dynamicCast(fwMenu);
+    QMenu *menu = menuContainer->getQtMenu();
+    menu->setEnabled(isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuLayoutManager.cpp
new file mode 100644
index 0000000..d8cf3cb
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/MenuLayoutManager.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QAction>
+#include <QActionGroup>
+#include <QMenu>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/function.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/ActionCallback.hpp"
+#include "fwGuiQt/container/QtMenuContainer.hpp"
+#include "fwGuiQt/container/QtMenuItemContainer.hpp"
+#include "fwGuiQt/layoutManager/MenuLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::layoutManager::MenuLayoutManager,
+                    ::fwGui::layoutManager::IMenuLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+MenuLayoutManager::MenuLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuLayoutManager::~MenuLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::createLayout( ::fwGui::container::fwMenu::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiQt::container::QtMenuContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwMenu to QtMenuContainer failed", m_parent);
+
+    QMenu* menu = m_parent->getQtMenu();
+
+    QActionGroup * actionGroup = 0;
+    unsigned int menuItemIndex = 0;
+    BOOST_FOREACH ( ::fwGui::layoutManager::IMenuLayoutManager::ActionInfo actionInfo, m_actionInfo)
+    {
+        ::fwGuiQt::container::QtMenuItemContainer::sptr menuItem = ::fwGuiQt::container::QtMenuItemContainer::New();
+
+        QAction *action = menu->addAction( QString::fromStdString(actionInfo.m_name) );
+
+        action->setSeparator(actionInfo.m_isSeparator);
+
+        if (!actionInfo.m_icon.empty())
+        {
+            QIcon icon(QString::fromStdString(actionInfo.m_icon));
+            action->setIcon(icon);
+        }
+        if (actionInfo.m_type == ::fwGui::layoutManager::IMenuLayoutManager::QUIT)
+        {
+            action->setMenuRole(QAction::QuitRole);
+        }
+        else if (actionInfo.m_type == ::fwGui::layoutManager::IMenuLayoutManager::ABOUT)
+        {
+            action->setMenuRole(QAction::AboutRole);
+        }
+        else
+        {
+            action->setMenuRole(QAction::NoRole);
+        }
+
+        action->setCheckable(actionInfo.m_isCheckable || actionInfo.m_isRadio);
+
+        if (actionInfo.m_isRadio)
+        {
+            if (!actionGroup)
+            {
+                actionGroup = new QActionGroup(menu);
+            }
+            actionGroup->addAction(action);
+        }
+
+        // create shortcut
+        if( !actionInfo.m_shortcut.empty() )
+        {
+            action->setShortcut(QKeySequence(QString::fromStdString(actionInfo.m_shortcut)));
+        }
+
+        if (actionInfo.m_isMenu)
+        {
+            ::fwGuiQt::container::QtMenuContainer::sptr menu = ::fwGuiQt::container::QtMenuContainer::New();
+            QMenu* qtMenu = new QMenu();
+            menu->setQtMenu(qtMenu);
+            action->setMenu(qtMenu);
+            m_menus.push_back(menu);
+        }
+
+        menuItem->setQtMenuItem(action);
+
+        if(!actionInfo.m_isSeparator && !actionInfo.m_isMenu )
+        {
+            m_menuItems.push_back(menuItem);
+            OSLM_ASSERT("No callback found for menu" << actionInfo.m_name, menuItemIndex < m_callbacks.size());
+            ::fwGui::IMenuItemCallback::sptr callback = m_callbacks.at(menuItemIndex);
+
+            ::fwGuiQt::ActionCallback::sptr qtCallback = ::fwGuiQt::ActionCallback::dynamicCast(callback);
+            SLM_ASSERT("dynamicCast IMenuItemCallback to ActionCallback failed", qtCallback);
+
+            QObject::connect( action, SIGNAL(triggered(bool)), qtCallback.get(), SLOT(executeQt(bool)));
+            QObject::connect( action, SIGNAL(toggled(bool)), qtCallback.get(), SLOT(checkQt(bool)));
+            menuItemIndex++;
+        }
+        else
+        {
+            actionGroup = 0;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::destroyLayout()
+{
+    this->destroyActions();
+    m_menuItems.clear();
+    m_parent->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void MenuLayoutManager::menuItemSetVisible(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isVisible)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setVisible(isVisible);
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isEnabled)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setEnabled(isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::menuItemSetChecked(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isChecked)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setChecked(isChecked);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/TabLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/TabLayoutManager.cpp
new file mode 100644
index 0000000..c1834a6
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/TabLayoutManager.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QTabWidget>
+#include <QBoxLayout>
+#include <QScrollArea>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/layoutManager/TabLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::TabLayoutManager, ::fwGui::layoutManager::TabLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManager::TabLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManager::~TabLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TabLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", m_parentContainer);
+
+    QWidget* qtContainer = m_parentContainer->getQtContainer();
+    m_tabWidget = new QTabWidget(qtContainer);
+
+    QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom);
+    if (qtContainer->layout())
+    {
+        QWidget().setLayout(qtContainer->layout());
+    }
+    qtContainer->setLayout(layout);
+
+    layout->addWidget( m_tabWidget );
+
+    const std::list< ViewInfo> &views = this->getViewsInfo();
+
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        QWidget *widget = new QWidget(m_tabWidget);
+
+        ::fwGuiQt::container::QtContainer::sptr subContainer = ::fwGuiQt::container::QtContainer::New();
+        subContainer->setQtContainer(widget);
+        m_subViews.push_back(subContainer);
+
+        int idx = 0;
+        if(viewInfo.m_useScrollBar)
+        {
+            QScrollArea *scrollArea = new QScrollArea(m_tabWidget);
+            scrollArea->setWidget(widget);
+            scrollArea->setWidgetResizable ( true );
+            idx = m_tabWidget->addTab( scrollArea, QString::fromStdString(viewInfo.m_caption));
+        }
+        else
+        {
+            idx = m_tabWidget->addTab( widget, QString::fromStdString(viewInfo.m_caption));
+        }
+        if (viewInfo.m_isSelect )
+        {
+            m_tabWidget->setCurrentIndex(idx);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void TabLayoutManager::destroyLayout()
+{
+    this->destroySubViews();
+    m_tabWidget->clear();
+    m_parentContainer->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolBarLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolBarLayoutManager.cpp
new file mode 100644
index 0000000..190315b
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolBarLayoutManager.cpp
@@ -0,0 +1,220 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QAction>
+#include <QActionGroup>
+#include <QToolBar>
+#include <QMenu>
+#include <QToolButton>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/function.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiQt/ActionCallback.hpp"
+#include "fwGuiQt/container/QtToolBarContainer.hpp"
+#include "fwGuiQt/container/QtMenuContainer.hpp"
+#include "fwGuiQt/container/QtMenuItemContainer.hpp"
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/layoutManager/ToolBarLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::layoutManager::ToolBarLayoutManager,
+                    ::fwGui::layoutManager::IToolBarLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+ToolBarLayoutManager::ToolBarLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolBarLayoutManager::~ToolBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::createLayout( ::fwGui::container::fwToolBar::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiQt::container::QtToolBarContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwToolBar to QtToolBarContainer failed", m_parent);
+
+    QToolBar* toolBar = m_parent->getQtToolBar();
+
+    QActionGroup * actionGroup = 0;
+    unsigned int menuItemIndex = 0;
+    BOOST_FOREACH ( ::fwGui::layoutManager::IToolBarLayoutManager::ActionInfo actionInfo, m_actionInfo)
+    {
+        if (actionInfo.m_isSeparator)
+        {
+            if (actionInfo.m_size > 0)
+            {
+                QWidget * widget = new QWidget(toolBar);
+                widget->setMinimumWidth(actionInfo.m_size);
+                toolBar->addWidget(widget);
+            }
+            else
+            {
+                toolBar->addSeparator();
+            }
+            actionGroup = 0;
+        }
+        else if (actionInfo.m_isSpacer)
+        {
+            QWidget* spacer = new QWidget(toolBar);
+            spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+            toolBar->addWidget(spacer);
+            actionGroup = 0;
+        }
+        else if (actionInfo.m_isMenu)
+        {
+            ::fwGuiQt::container::QtMenuContainer::sptr menu = ::fwGuiQt::container::QtMenuContainer::New();
+            QMenu* qtMenu = new QMenu(toolBar);
+            menu->setQtMenu(qtMenu);
+
+            QToolButton * toolButton = new QToolButton(toolBar);
+            if (toolBar->orientation() == Qt::Horizontal)
+            {
+                toolButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+            }
+            else
+            {
+                toolButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            }
+            toolButton->setMenu(qtMenu);
+            toolButton->setPopupMode(QToolButton::InstantPopup);
+            toolButton->setText(QString::fromStdString(actionInfo.m_name));
+            if (!actionInfo.m_icon.empty())
+            {
+                QIcon icon(QString::fromStdString(actionInfo.m_icon));
+                toolButton->setIcon(icon);
+                toolButton->setToolTip(QString::fromStdString(actionInfo.m_name));
+                toolButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+            }
+            toolBar->addWidget(toolButton);
+            m_menus.push_back(menu);
+        }
+        else if (actionInfo.m_isEditor)
+        {
+            ::fwGuiQt::container::QtContainer::sptr container = ::fwGuiQt::container::QtContainer::New();
+            QWidget* widget = new QWidget(toolBar);
+            container->setQtContainer(widget);
+
+            if (toolBar->orientation() == Qt::Horizontal)
+            {
+                widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+            }
+            else
+            {
+                widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            }
+            widget->adjustSize();
+            toolBar->addWidget(widget);
+
+            m_containers.push_back(container);
+        }
+        else
+        {
+            ::fwGuiQt::container::QtMenuItemContainer::sptr menuItem = ::fwGuiQt::container::QtMenuItemContainer::New();
+            QAction *action;
+            if (!actionInfo.m_icon.empty())
+            {
+                QIcon icon(QString::fromStdString(actionInfo.m_icon));
+                action = toolBar->addAction( icon, QString::fromStdString(actionInfo.m_name) );
+            }
+            else
+            {
+                action = toolBar->addAction( QString::fromStdString(actionInfo.m_name) );
+            }
+
+            action->setCheckable(actionInfo.m_isCheckable || actionInfo.m_isRadio);
+
+            if (actionInfo.m_isRadio)
+            {
+                if (!actionGroup)
+                {
+                    actionGroup = new QActionGroup(toolBar);
+                }
+                actionGroup->addAction(action);
+            }
+
+            // create shortcut
+            if( !actionInfo.m_shortcut.empty() )
+            {
+                action->setShortcut(QKeySequence(QString::fromStdString(actionInfo.m_shortcut)));
+            }
+
+            menuItem->setQtMenuItem(action);
+
+            m_menuItems.push_back(menuItem);
+            OSLM_ASSERT("No callback found for menu" << actionInfo.m_name, menuItemIndex < m_callbacks.size());
+            ::fwGui::IMenuItemCallback::sptr callback = m_callbacks.at(menuItemIndex);
+
+            ::fwGuiQt::ActionCallback::sptr qtCallback = ::fwGuiQt::ActionCallback::dynamicCast(callback);
+            SLM_ASSERT("dynamicCast IMenuItemCallback to ActionCallback failed", qtCallback);
+
+            QObject::connect( action, SIGNAL(triggered(bool)), qtCallback.get(), SLOT(executeQt(bool)));
+            QObject::connect( action, SIGNAL(toggled(bool)), qtCallback.get(), SLOT(checkQt(bool)));
+            menuItemIndex++;
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::destroyLayout()
+{
+    this->destroyActions();
+    m_parent->clean();
+    m_menuItems.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void ToolBarLayoutManager::menuItemSetVisible(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isVisible)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setVisible(isVisible);
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isEnabled)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setEnabled(isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::menuItemSetChecked(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isChecked)
+{
+    ::fwGuiQt::container::QtMenuItemContainer::sptr menuItemContainer = ::fwGuiQt::container::QtMenuItemContainer::dynamicCast(fwMenuItem);
+    QAction *action = menuItemContainer->getQtMenuItem();
+    action->setChecked(isChecked);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolboxLayoutManager.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolboxLayoutManager.cpp
new file mode 100644
index 0000000..f3990c6
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/layoutManager/ToolboxLayoutManager.cpp
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <QScrollArea>
+#include <QVBoxLayout>
+#include <QStyle>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+
+#include "fwGuiQt/container/QtContainer.hpp"
+#include "fwGuiQt/layoutManager/ToolboxLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::ToolboxLayoutManager, ::fwGui::layoutManager::ToolboxLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+ToolboxLayoutManager::ToolboxLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolboxLayoutManager::~ToolboxLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolboxLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    ::fwGuiQt::container::QtContainer::sptr parentContainer;
+    parentContainer = ::fwGuiQt::container::QtContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to QtContainer failed", parentContainer);
+
+    QVBoxLayout* layout = new QVBoxLayout();
+    layout->setContentsMargins(0, 0, 0, 0);
+
+    QWidget *qtContainer = parentContainer->getQtContainer();
+    if (qtContainer->layout())
+    {
+        QWidget().setLayout(qtContainer->layout());
+    }
+    qtContainer->setLayout(layout);
+
+    QScrollArea* sv = new QScrollArea(qtContainer);
+    ::fwGuiQt::widget::QfwToolBox* toolbox = new ::fwGuiQt::widget::QfwToolBox(sv);
+    sv->setWidget(toolbox);
+    sv->setWidgetResizable(true);
+
+    const std::list< ViewInfo> &views = this->getViewsInfo();
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        int border = viewInfo.m_border;
+        QWidget* panel = new QWidget();
+        panel->setMinimumSize(std::max(viewInfo.m_minSize.first,0), std::max(viewInfo.m_minSize.second,0));
+        panel->setContentsMargins(border, border,border, border);
+
+        ::fwGuiQt::container::QtContainer::sptr subContainer = ::fwGuiQt::container::QtContainer::New();
+        subContainer->setQtContainer(panel);
+        m_subViews.push_back(subContainer);
+
+        int index = 0;
+        if(viewInfo.m_useScrollBar)
+        {
+            QScrollArea *scrollArea = new QScrollArea(toolbox);
+            scrollArea->setWidget(panel);
+            scrollArea->setWidgetResizable ( true );
+            index = toolbox->addItem(scrollArea, QString::fromStdString(viewInfo.m_caption));
+        }
+        else
+        {
+            index = toolbox->addItem(panel, QString::fromStdString(viewInfo.m_caption));
+        }
+
+        if(viewInfo.m_expanded)
+        {
+            toolbox->expandItem(index);
+        }
+        subContainer->setVisible( viewInfo.m_visible );
+    }
+    layout->addWidget(sv);
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolboxLayoutManager::destroyLayout()
+{
+    this->destroySubViews();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/util/FuncSlot.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/util/FuncSlot.cpp
new file mode 100644
index 0000000..59a6b7c
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/util/FuncSlot.cpp
@@ -0,0 +1,24 @@
+#include <fwGuiQt/util/FuncSlot.hpp>
+
+namespace fwGuiQt
+{
+
+namespace util
+{
+
+void doNothing()
+{}
+
+FuncSlot::FuncSlot() : m_func( doNothing )
+{
+}
+
+void FuncSlot::trigger()
+{
+    m_func();
+}
+
+} // namespace util
+
+} // namespace fwGuiQt
+
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QRangeSlider.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QRangeSlider.cpp
new file mode 100644
index 0000000..1cf6353
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QRangeSlider.cpp
@@ -0,0 +1,469 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <cassert>
+#include <QPainter>
+#include <QApplication>
+#include <QMouseEvent>
+
+
+#include "fwGuiQt/widget/QRangeSlider.hpp"
+
+
+namespace fwGuiQt
+{
+
+namespace widget
+{
+
+template <typename T>
+struct Castable
+{
+    template <typename U>
+    static T* safeCast(U *p)
+    {
+        T* casted = dynamic_cast<T*>(p);
+        return casted;
+    }
+};
+
+
+
+class Handle: public QRangeSlider::Paintable, public Castable<Handle>
+{
+public:
+    Handle(QWidget *w)
+        : Paintable(w),
+          m_pen(Qt::gray),
+          m_brush(Qt::lightGray)
+    {
+        m_pos = 0;
+        m_width = 13;
+        m_verticalPadding = 0.2;
+        m_tolerance = std::max(0, 10 - m_width);
+    }
+
+    virtual void draw(QPainter &painter, bool /*enabled*/)
+    {
+        int height = drawingArea().height()-1;
+        int top = height * m_verticalPadding;
+        int handleHeight = height - 2*top;
+        painter.setRenderHint(QPainter::Antialiasing);
+        painter.setPen(m_pen);
+        painter.setBrush(m_brush);
+        painter.drawRect(m_pos - halfWidth(), top, m_width, handleHeight);
+    }
+
+    virtual bool pick(const QPoint &point) const
+    {
+        bool picked = false;
+
+        int height = drawingArea().height()-1;
+        int top = height * m_verticalPadding;
+        int handleHeight = height - 2*top;
+
+        if ( abs(point.x() - m_pos) <= (halfWidth() + m_tolerance)
+            && (top+handleHeight) >= point.y() && point.y() >= top )
+        {
+            picked = true;
+        }
+        return picked;
+    }
+
+    int setHandleSize(int size)
+    {
+        //handle size should be odd
+        m_width = size + ((size+1)%2);
+        return m_width;
+    }
+
+    int halfWidth() const
+    {
+        return m_width/2;
+    }
+
+    int setPos(const int &pos)
+    {
+        int p = pos;
+
+        p = std::max(p, xPosMin());
+        p = std::min(p, xPosMax());
+
+        m_pos = p;
+
+        return p;
+    }
+
+    int pos()
+    {
+        return m_pos;
+    }
+
+    int xPosMin()
+    {
+        return halfWidth();
+    }
+
+    int xPosMax()
+    {
+        return drawingArea().width() - halfWidth() - 1;
+    }
+
+    double toFloatingPos(int p)
+    {
+        int posMin = xPosMin();
+        int posMax = xPosMax();
+        return ( (double) (p - posMin) / (double)(posMax - posMin) );
+    }
+
+    int fromFloatingPos(double p)
+    {
+        assert( 0. <= p && p <= 1.);
+        int posMin = xPosMin();
+        int extend = (xPosMax()) - posMin;
+
+        return posMin + (int) (p*extend);
+    }
+
+
+    double floatingPos()
+    {
+        return toFloatingPos( pos() );
+    }
+
+    void setFloatingPos(double pos)
+    {
+        setPos(fromFloatingPos(pos));
+    }
+
+protected:
+    int m_pos;
+    int m_tolerance;
+    int m_width;
+    double m_verticalPadding;
+
+    QPen   m_pen;
+    QBrush m_brush;
+};
+
+
+class Window: public QRangeSlider::Paintable, public Castable<Window>
+{
+public:
+    Window(QWidget *w)
+        : Paintable(w),
+        m_pen(Qt::darkBlue),
+        m_brush(Qt::cyan),
+        m_reversePen(Qt::darkYellow),
+        m_reverseBrush(Qt::yellow)
+    {
+        m_left = 0;
+        m_right = 0;
+    }
+
+    int width() const
+    {
+        return m_right-m_left;
+    }
+
+    virtual void draw(QPainter &painter, bool enabled)
+    {
+        int w = this->width();
+        QPen   pen;
+        QBrush brush;
+
+        if(enabled)
+        {
+            if ( w < 0 )
+            {
+                pen = m_reversePen;
+                brush = m_reverseBrush;
+            }
+            else
+            {
+                pen = m_pen;
+                brush = m_brush;
+            }
+        }
+        else
+        {
+                pen = QPen(Qt::lightGray);
+                brush = QBrush(Qt::lightGray);
+        }
+
+        painter.setPen(pen);
+        painter.setBrush(brush);
+        painter.setRenderHint(QPainter::Antialiasing);
+        painter.drawRect(m_left, 0, w, drawingArea().height()-1);
+    }
+
+    virtual bool pick(const QPoint &point) const
+    {
+        bool picked = false;
+        int min = std::min(m_left, m_right);
+        int max = std::max(m_left, m_right);
+        picked = min <= point.x() && point.x() <= max ;
+        return picked;
+    }
+
+    void setPos(const int &left, const int &right)
+    {
+        m_left = left;
+        m_right = right;
+    }
+
+protected:
+    int m_left;
+    int m_right;
+
+    QPen   m_pen;
+    QBrush m_brush;
+    QPen   m_reversePen;
+    QBrush m_reverseBrush;
+
+};
+
+
+
+//-----------------------------------------------------------------------------
+
+QRangeSlider::QRangeSlider(QWidget *parent)
+    : QWidget(parent)
+{
+    m_minValue = 0.;
+    m_maxValue = 1.;
+    m_allowMinGreaterThanMax = true;
+    m_minimumMinMaxDelta = 0.;
+    m_handleSize = 11;
+
+    m_current = NULL;
+
+    Handle *minh = new Handle(this);
+    Handle *maxh = new Handle(this);
+    minh->setHandleSize(m_handleSize);
+    maxh->setHandleSize(m_handleSize);
+
+    m_minHandle = minh;
+    m_maxHandle = maxh;
+    m_window    = new Window(this);
+
+    this->setPos(m_minValue, m_maxValue);
+    this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
+}
+
+
+QRangeSlider::~QRangeSlider()
+{
+     delete m_minHandle;
+     delete m_maxHandle;
+     delete m_window;
+}
+
+void QRangeSlider::setPos(double _min, double _max)
+{
+    Handle *minHandle = Handle::safeCast(m_minHandle);
+    Handle *maxHandle = Handle::safeCast(m_maxHandle);
+    Window *window    = Window::safeCast(m_window);
+
+    assert(minHandle && maxHandle && window);
+
+    minHandle->setFloatingPos(_min);
+    maxHandle->setFloatingPos(_max);
+
+    int min, max;
+    min = minHandle->pos();
+    max = maxHandle->pos();
+    window->setPos(min, max);
+
+    this->movedTo(_min, _max);
+    this->update();
+}
+
+void QRangeSlider::move(int delta)
+{
+    Handle *minHandle = Handle::safeCast(m_minHandle);
+    Handle *maxHandle = Handle::safeCast(m_maxHandle);
+    Window *window    = Window::safeCast(m_window);
+
+    assert(minHandle && maxHandle && window);
+
+    int low, high, width, dir;
+    dir = ((minHandle->pos() < maxHandle->pos()) ? 1 : -1);
+    bool movingRight =  (delta < 0) ;
+
+    low  = minHandle->pos();
+    high = maxHandle->pos();
+    width = high - low;
+
+    if(  (movingRight  && dir < 0)
+        || (!movingRight && dir > 0 ) )
+    {
+        low  = minHandle->setPos(low-delta);
+        high = low + width;
+        maxHandle->setPos(high);
+    }
+    else
+    {
+        high = maxHandle->setPos(high-delta);
+        low  = high - width;
+        minHandle->setPos(low);
+    }
+
+    window->setPos(low, high);
+}
+
+bool QRangeSlider::movedTo(double _min, double _max)
+{
+    bool changed = m_minValue != _min || m_maxValue != _max ;
+    if (changed)
+    {
+        m_minValue = _min;
+        m_maxValue = _max;
+        Q_EMIT sliderRangeChanged( m_minValue, m_maxValue );
+    }
+    return changed;
+}
+
+void QRangeSlider::paintEvent ( QPaintEvent * /*event*/ )
+{
+    bool enabled = this->isEnabled();
+    QPainter painter(this);
+    painter.setRenderHint(QPainter::Antialiasing);
+
+    QRect rect = this->rect();
+    rect.setLeft(rect.left() + m_handleSize/2);
+    rect.setRight(rect.right() - m_handleSize/2);
+    painter.fillRect(rect, QApplication::palette().base());
+
+    painter.setBrush(Qt::cyan);
+    m_window->draw(painter, enabled);
+
+    painter.setBrush(Qt::gray);
+    painter.setPen(Qt::darkGreen);
+    m_minHandle->draw(painter, enabled);
+
+    painter.setPen(Qt::darkRed);
+    m_maxHandle->draw(painter, enabled);
+
+}
+
+void QRangeSlider::mouseMoveEvent ( QMouseEvent * event )
+{
+    if (m_current)
+    {
+
+        Handle *minHandle = Handle::safeCast(m_minHandle);
+        Handle *maxHandle = Handle::safeCast(m_maxHandle);
+        Window *window    = Window::safeCast(m_window);
+        Handle *currentHandle;
+
+
+        if( (currentHandle = Handle::safeCast(m_current)) )
+        {
+            int oldPos = currentHandle->pos();
+            int newPos = event->pos().x();
+            currentHandle->setPos(newPos);
+
+            if(!m_allowMinGreaterThanMax && minHandle->floatingPos() + m_minimumMinMaxDelta >= maxHandle->floatingPos() )
+            {
+                currentHandle->setPos(oldPos);
+            }
+            window->setPos(minHandle->pos(), maxHandle->pos());
+        }
+        else if( Window::safeCast(m_current) )
+        {
+            QPoint delta = m_pressPos - event->pos();
+
+            minHandle->setPos(m_pressMin);
+            maxHandle->setPos(m_pressMax);
+            window->setPos(minHandle->pos(), maxHandle->pos());
+            this->move(delta.x());
+        }
+
+        double min = minHandle->floatingPos();
+        double max = maxHandle->floatingPos();
+        if( this->movedTo(min, max) )
+        {
+            Q_EMIT sliderRangeEdited ( min, max );
+        }
+        this->update();
+    }
+}
+
+void QRangeSlider::mousePressEvent ( QMouseEvent * event )
+{
+    Handle *minHandle  = Handle::safeCast(m_minHandle);
+    Handle *maxHandle = Handle::safeCast(m_maxHandle);
+//    Window *window     = Window::safeCast(m_window);
+
+    m_pressPos  = event->pos();
+    m_pressMin  = minHandle->pos();
+    m_pressMax = maxHandle->pos();
+
+    if(m_maxHandle->pick(m_pressPos))
+    {
+        m_current = m_maxHandle;
+    }
+    else if(m_minHandle->pick(m_pressPos))
+    {
+        m_current = m_minHandle;
+    }
+    else if(m_window->pick(m_pressPos))
+    {
+        m_current = m_window;
+    }
+}
+
+void QRangeSlider::mouseReleaseEvent ( QMouseEvent * /*event*/)
+{
+    m_current = NULL;
+}
+
+
+void QRangeSlider::wheelEvent ( QWheelEvent * event )
+{
+    Handle *minHandle  = Handle::safeCast(m_minHandle);
+    Handle *maxHandle = Handle::safeCast(m_maxHandle);
+    Window *window     = Window::safeCast(m_window);
+
+    int delta = this->size().width()/( ((double) event->delta())/4. );
+    int low  = minHandle->pos();
+    int high = maxHandle->pos();
+
+    if(event->orientation() == Qt::Vertical)
+    {
+        if(!m_allowMinGreaterThanMax)
+        {
+            int diff = (high - low);
+            int minDiff = minHandle->fromFloatingPos(m_minimumMinMaxDelta);
+            delta = std::max(delta,  - (diff - minDiff)/2);
+        }
+
+        low  = minHandle->setPos(low -  delta);
+        high = maxHandle->setPos(high + delta);
+        window->setPos(low, high);
+    }
+    else
+    {
+        this->move(delta);
+    }
+
+    double min = minHandle->floatingPos();
+    double max = maxHandle->floatingPos();
+    if( this->movedTo(min, max) )
+    {
+        Q_EMIT sliderRangeEdited ( min, max );
+    }
+    this->update();
+}
+
+void QRangeSlider::resizeEvent ( QResizeEvent * event )
+{
+    this->setPos(m_minValue, m_maxValue);
+}
+
+} // namespace widget
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QfwToolbox.cpp b/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QfwToolbox.cpp
new file mode 100644
index 0000000..78f044d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/src/fwGuiQt/widget/QfwToolbox.cpp
@@ -0,0 +1,337 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <QFrame>
+#include <QPixmap>
+#include <QIcon>
+#include <QVBoxLayout>
+
+#include "fwGuiQt/widget/QfwToolbox.hpp"
+
+namespace fwGuiQt
+{
+namespace widget
+{
+
+static const char *branch_closed[] = {
+"8 17 2 1",
+/* colors */
+"- c #000000",
+"a c None",
+/* pixels */
+"aaaaaaaa",
+"-aaaaaaa",
+"--aaaaaa",
+"---aaaaa",
+"----aaaa",
+"-----aaa",
+"------aa",
+"-------a",
+"--------",
+"-------a",
+"------aa",
+"-----aaa",
+"----aaaa",
+"---aaaaa",
+"--aaaaaa",
+"-aaaaaaa",
+"aaaaaaaa"
+};
+
+static const char *branch_open[] = {
+"11 6 2 1",
+/* colors */
+"- c #000000",
+"a c None",
+/* pixels */
+"-----------",
+"a---------a",
+"aa-------aa",
+"aaa-----aaa",
+"aaaa---aaaa",
+"aaaaa-aaaaa"
+};
+
+QfwToolBox::~QfwToolBox()
+{}
+
+//-----------------------------------------------------------------------------
+
+QfwToolBox::QfwToolBox(QWidget *parent, Qt::WindowFlags f) :  QFrame(parent, f)
+{
+    this->layout = new QFormLayout(this);
+    this->layout->setMargin(0);
+    layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
+    layout->setHorizontalSpacing(0);
+    layout->setVerticalSpacing(1);
+    setBackgroundRole(QPalette::Button);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGuiQt::widget::Page *QfwToolBox::page(QWidget *widget) const
+{
+    if (!widget)
+        return 0;
+
+    for (PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i)
+        if ((*i).widget == widget)
+            return (Page*) &(*i);
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGuiQt::widget::Page *QfwToolBox::page(int index)
+{
+    if (index >= 0 && index < pageList.size())
+        return &pageList[index];
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+const ::fwGuiQt::widget::Page *QfwToolBox::page(int index) const
+{
+    if (index >= 0 && index < pageList.size())
+        return &pageList.at(index);
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::collapseItem(int index)
+{
+    Page *page = this->page(index);
+    if(page)
+    {
+        page->sv->setVisible(false);
+        page->button->setChecked(false);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::expandItem(int index)
+{
+    Page *page = this->page(index);
+    if(page)
+    {
+        page->sv->setVisible(true);
+        page->button->setChecked(true);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+int QfwToolBox::addItem(QWidget *item, const QString &text)
+{
+    return insertItem(-1, item, text);
+}
+
+//-----------------------------------------------------------------------------
+
+int QfwToolBox::insertItem(int index, QWidget *widget, const QString &text)
+{
+    if (!widget)
+        return -1;
+
+    connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*)));
+
+    Page c;
+    c.widget = widget;
+    c.button = new QPushButton(this);
+    c.button->setBackgroundRole(QPalette::Window);
+    c.button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    c.button->setFocusPolicy(Qt::NoFocus);
+    c.button->setCheckable(true);
+    QString style(
+            "text-align: left;"
+            "background-color: lightgray;"
+            "border-style: solid;"
+            "border-width: 1px;"
+            "border-color: darkgray;"
+            "height: 20px;"
+            );
+    QPixmap pixOpen(branch_open);
+    QPixmap pixClose(branch_closed);
+    QIcon bIcon;
+    bIcon.addPixmap( pixClose, QIcon::Normal, QIcon::Off );
+    bIcon.addPixmap( pixOpen, QIcon::Active, QIcon::On );
+    c.setIcon(bIcon);
+    c.button->setStyleSheet(style);
+    connect(c.button, SIGNAL(toggled(bool)), this, SLOT(buttonToggled(bool)));
+
+    c.sv = new QFrame(this);
+    QVBoxLayout* verticalLayout = new QVBoxLayout(c.sv);
+    verticalLayout->setMargin(0);
+    verticalLayout->addWidget(widget);
+    c.sv->hide();
+    c.sv->setFrameStyle(QFrame::NoFrame);
+
+    c.setText(text);
+
+    if (index < 0 || index >= (int)this->pageList.count())
+    {
+        index = this->pageList.count();
+        this->pageList.append(c);
+        this->layout->addWidget(c.button);
+        this->layout->addWidget(c.sv);
+    }
+    else
+    {
+        this->pageList.insert(index, c);
+        this->relayout();
+    }
+    c.button->show();
+    return index;
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::buttonToggled(bool checked)
+{
+    QPushButton *tb = qobject_cast<QPushButton*>(this->sender());
+    QWidget* item = 0;
+    for (PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i)
+    {
+        if ((*i).button == tb)
+        {
+            item = (*i).widget;
+            break;
+        }
+    }
+    int index = this->indexOf(item);
+    Page *page = this->page(index);
+    page->sv->setVisible(checked);
+}
+
+//-----------------------------------------------------------------------------
+
+int QfwToolBox::count() const
+{
+    return this->pageList.count();
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::relayout()
+{
+    delete layout;
+    layout = new QFormLayout(this);
+    layout->setMargin(0);
+    layout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow);
+    layout->setHorizontalSpacing(0);
+    layout->setVerticalSpacing(1);
+    for (PageList::ConstIterator i = pageList.constBegin(); i != pageList.constEnd(); ++i)
+    {
+        layout->addWidget((*i).button);
+        layout->addWidget((*i).sv);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::widgetDestroyed(QObject *object)
+{
+    QWidget *p = (QWidget*)object;
+    Page *c = page(p);
+    if (!p || !c)
+        return;
+
+    layout->removeWidget(c->sv);
+    layout->removeWidget(c->button);
+    c->sv->deleteLater();
+    delete c->button;
+    pageList.removeAll(*c);
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::removeItem(int index)
+{
+    if (QWidget *w = widget(index))
+    {
+        disconnect(w, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*)));
+        w->setParent(this);
+        this->widgetDestroyed(w);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+QWidget *QfwToolBox::widget(int index) const
+{
+    if (index < 0 || index >= (int) this->pageList.size())
+        return 0;
+    return this->pageList.at(index).widget;
+}
+
+//-----------------------------------------------------------------------------
+
+int QfwToolBox::indexOf(QWidget *widget) const
+{
+    Page *c = (widget ? this->page(widget) : 0);
+    return c ? this->pageList.indexOf(*c) : -1;
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::setItemEnabled(int index, bool enabled)
+{
+    Page *c = this->page(index);
+    if (!c)
+        return;
+
+    c->button->setEnabled(enabled);
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::setItemText(int index, const QString &text)
+{
+    Page *c = this->page(index);
+    if (c)
+        c->setText(text);
+}
+
+//-----------------------------------------------------------------------------
+
+void QfwToolBox::setItemToolTip(int index, const QString &toolTip)
+{
+    Page *c = this->page(index);
+    if (c)
+        c->setToolTip(toolTip);
+}
+
+//-----------------------------------------------------------------------------
+
+bool QfwToolBox::isItemEnabled(int index) const
+{
+    const Page *c = this->page(index);
+    return c && c->button->isEnabled();
+}
+
+//-----------------------------------------------------------------------------
+
+QString QfwToolBox::itemText(int index) const
+{
+    const Page *c = this->page(index);
+    return (c ? c->text() : QString());
+}
+
+//-----------------------------------------------------------------------------
+
+QString QfwToolBox::itemToolTip(int index) const
+{
+    const Page *c = this->page(index);
+    return (c ? c->toolTip() : QString());
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace widget
+} // namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiQt/test/CMakeLists.txt b/SrcLib/core/fwGuiQt/test/CMakeLists.txt
new file mode 100644
index 0000000..fd72c3d
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/test/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread date_time REQUIRED)
+find_package(CppUnit)
+find_package(Qt4 COMPONENTS QtCore QtGui REQUIRED)
+include(${QT_USE_FILE})
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwGuiQt/test/Properties.cmake b/SrcLib/core/fwGuiQt/test/Properties.cmake
new file mode 100644
index 0000000..f09be00
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwGuiQtTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwThread fwGuiQt )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwGuiQt/test/cppunit.options b/SrcLib/core/fwGuiQt/test/cppunit.options
new file mode 100644
index 0000000..b8f68f9
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/test/cppunit.options
@@ -0,0 +1,18 @@
+CLASSTEST=[
+    'WorkerQtTest',
+]
+
+USE = [
+    'qtCore',
+    'qtGui',
+    'boost',
+    'boostThread',
+    'boostDateTime',
+    ]
+LIB = [
+    'fwTest_0-1',
+    'fwThread_0-1',
+    'fwGuiQt_0-1',
+    ]
+
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwGuiQt/test/tu/include/WorkerQtTest.hpp b/SrcLib/core/fwGuiQt/test/tu/include/WorkerQtTest.hpp
new file mode 100644
index 0000000..600065f
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/test/tu/include/WorkerQtTest.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUIQT_UT_WORKERQTTEST_HPP__
+#define __FWGUIQT_UT_WORKERQTTEST_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwGuiQt
+{
+
+struct WorkerQtInstanciator;
+
+namespace ut
+{
+
+class WorkerQtTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( WorkerQtTest );
+
+    CPPUNIT_TEST(initTest);
+    CPPUNIT_TEST(twiceInitTest);
+    CPPUNIT_TEST(basicTest);
+    CPPUNIT_TEST(postFromInsideTest);
+    CPPUNIT_TEST(postFromOutsideTest);
+
+    CPPUNIT_TEST(basicTimerTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void initTest();
+    void twiceInitTest();
+    void basicTest();
+
+    void postFromInsideTest();
+    void postFromOutsideTest();
+
+    void basicTimerTest();
+
+protected:
+
+    SPTR(::fwThread::Worker) m_worker;
+};
+
+} //namespace ut
+} //namespace fwGuiQt
+
+#endif //__FWGUIQT_UT_WORKERQTTEST_HPP__
+
diff --git a/SrcLib/core/fwGuiQt/test/tu/src/WorkerQtTest.cpp b/SrcLib/core/fwGuiQt/test/tu/src/WorkerQtTest.cpp
new file mode 100644
index 0000000..1816f5a
--- /dev/null
+++ b/SrcLib/core/fwGuiQt/test/tu/src/WorkerQtTest.cpp
@@ -0,0 +1,298 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <cppunit/Exception.h>
+
+#include <QApplication>
+#include <QTimer>
+
+#include <fwThread/Timer.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/Worker.hxx>
+
+#include "fwGuiQt/util/FuncSlot.hpp"
+
+#include "WorkerQtTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwGuiQt::ut::WorkerQtTest );
+
+namespace fwGuiQt
+{
+
+// Defined in WorkerQt.cpp
+class WorkerQt;
+struct WorkerQtInstanciator
+{
+    WorkerQtInstanciator(bool reg);
+    SPTR(::fwThread::Worker) getWorker();
+    SPTR(WorkerQt) m_qtWorker;
+
+    FWGUIQT_API static int    s_argc;
+    FWGUIQT_API static char **s_argv;
+};
+
+namespace ut
+{
+
+struct TestHandler
+{
+    TestHandler() : m_step(0), m_threadCheckOk(true)
+    {
+    }
+
+    void nextStep()
+    {
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(50));
+        this->nextStepNoSleep();
+    }
+
+    void nextStepNoSleep()
+    {
+        m_threadCheckOk &= (m_workerThreadId == ::fwThread::getCurrentThreadId());
+        ++m_step;
+    }
+
+    void setWorkerId(::fwThread::ThreadIdType id)
+    {
+        m_workerThreadId = id;
+    }
+
+    int m_step;
+    bool m_threadCheckOk;
+    ::fwThread::ThreadIdType m_workerThreadId;
+};
+
+//-----------------------------------------------------------------------------
+
+void WorkerQtTest::setUp()
+{
+    // Set up context before running a test.
+    static char* arg = "fwGuiQtTest";
+    WorkerQtInstanciator::s_argc = 1;
+    WorkerQtInstanciator::s_argv = &arg;
+    CPPUNIT_ASSERT(qApp == NULL);
+    WorkerQtInstanciator instanciator(false);
+    m_worker = instanciator.getWorker();
+
+}
+void WorkerQtTest::tearDown()
+{
+    // Clean up after the test run.
+    m_worker.reset();
+    CPPUNIT_ASSERT(qApp == NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerQtTest::initTest()
+{
+    CPPUNIT_ASSERT(qApp != NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerQtTest::twiceInitTest()
+{
+    CPPUNIT_ASSERT(qApp != NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void runBasicTest(TestHandler &handler, ::fwThread::Worker::sptr worker)
+{
+
+    handler.setWorkerId(worker->getThreadId());
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+
+    worker->post( ::boost::bind( &QApplication::quit ) );
+
+}
+
+
+#define RUN_BASIC_TEST_CHECKS(handler) \
+    CPPUNIT_ASSERT_EQUAL(3, handler.m_step); \
+    CPPUNIT_ASSERT_EQUAL(true, handler.m_threadCheckOk)
+
+
+
+void WorkerQtTest::basicTest()
+{
+    TestHandler handler;
+
+    runBasicTest(handler, m_worker);
+
+    m_worker->getFuture().wait();
+
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerQtTest::postFromInsideTest()
+{
+    TestHandler handler;
+
+    m_worker->post( boost::bind(&runBasicTest, boost::ref(handler), m_worker) );
+
+    m_worker->getFuture().wait();
+
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+void doNothing()
+{ }
+
+void runFromOutsideTest(TestHandler &handler, ::fwThread::Worker::sptr worker)
+{
+    //waiting for WorkerQt to start
+    worker->postTask<void>( ::boost::bind( &doNothing ) ).wait();
+
+    runBasicTest(handler, worker);
+}
+
+void WorkerQtTest::postFromOutsideTest()
+{
+    TestHandler handler;
+
+    ::boost::thread testThread(
+            boost::bind(&runFromOutsideTest, boost::ref(handler), m_worker)
+            );
+
+    m_worker->getFuture().wait();
+
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+
+#define QT_TEST_START \
+    try
+
+
+#define QT_TEST_END \
+    catch(CppUnit::Exception &e) \
+    { \
+        std::cerr << e.what() << std::endl; \
+        exception = e; \
+        QApplication::exit(1); \
+        return; \
+    }
+
+static CppUnit::Exception exception;
+
+void echo()
+{
+}
+
+
+
+void runBasicTimerTest(
+        TestHandler &handler,
+        const ::fwThread::Timer::sptr &timer,
+        ::fwThread::Timer::TimeDurationType duration
+        )
+{
+    timer->start();
+
+    QT_TEST_START
+    {
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+    }
+    QT_TEST_END
+}
+
+
+void oneShotBasicTimerTest(
+        int &i,
+        TestHandler &handler,
+        const ::fwThread::Timer::sptr &timer,
+        ::fwThread::Timer::TimeDurationType duration,
+        const ::fwThread::Worker::sptr &worker
+        )
+{
+
+    handler.nextStepNoSleep();
+
+    QT_TEST_START
+    {
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+    }
+    QT_TEST_END;
+
+
+    if(++i == 50)
+    {
+        timer->stop();
+
+        QT_TEST_START
+        {
+            CPPUNIT_ASSERT(!timer->isRunning());
+            CPPUNIT_ASSERT(handler.m_threadCheckOk);
+            CPPUNIT_ASSERT_EQUAL(49, handler.m_step);
+        }
+        QT_TEST_END;
+        worker->post( ::boost::bind( &QApplication::quit ) );
+    }
+}
+
+void WorkerQtTest::basicTimerTest()
+{
+    {
+
+        TestHandler handler;
+        handler.setWorkerId(m_worker->getThreadId());
+
+        ::fwThread::Timer::sptr timer = m_worker->createTimer();
+
+        ::fwThread::Timer::TimeDurationType duration = ::boost::chrono::milliseconds(10) ;
+
+        int i = 1;
+        timer->setFunction(
+                ::boost::bind(
+                    &oneShotBasicTimerTest,
+                    boost::ref(i), handler, ::boost::ref(timer), duration, ::boost::ref(m_worker) )
+                );
+        timer->setDuration(duration);
+
+        CPPUNIT_ASSERT(!timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+        m_worker->post( boost::bind(&runBasicTimerTest, ::boost::ref(handler), ::boost::ref(timer), duration) );
+
+
+        ::fwThread::Worker::FutureType future = m_worker->getFuture();
+        future.wait();
+
+        CPPUNIT_ASSERT( future.has_value() );
+        CPPUNIT_ASSERT_EQUAL( 0, boost::any_cast<int>( future.get() ) );
+    }
+
+
+}
+
+//-----------------------------------------------------------------------------
+
+
+
+} //namespace ut
+} //namespace fwGuiQt
diff --git a/SrcLib/core/fwGuiWx/CMakeLists.txt b/SrcLib/core/fwGuiWx/CMakeLists.txt
new file mode 100644
index 0000000..f661bc2
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/CMakeLists.txt
@@ -0,0 +1,19 @@
+find_package(wxWidgets COMPONENTS base core adv aui)
+if(wxWidgets_FOUND)
+    fwLoadProperties()
+    
+    fwUseForwardInclude(
+        fwCore
+        fwGui
+        fwRuntime
+        fwTools
+    )
+
+    find_package(Boost REQUIRED)
+    include(${wxWidgets_USE_FILE})
+
+    fwForwardInclude(${Boost_INCLUDE_DIRS} ${wxWidgets_INCLUDE_DIRS})
+    fwLink(${wxWidgets_LIBRARIES})
+else(wxWidgets_FOUND)
+    message(WARNING "Required package wxWidgets not found, lib 'fwGuiWx' disabled.")
+endif(wxWidgets_FOUND)
diff --git a/SrcLib/core/fwGuiWx/COPYING b/SrcLib/core/fwGuiWx/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwGuiWx/COPYING.LESSER b/SrcLib/core/fwGuiWx/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwGuiWx/Properties.cmake b/SrcLib/core/fwGuiWx/Properties.cmake
new file mode 100644
index 0000000..be026fb
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwGuiWx )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwData fwGui fwRuntime fwServices fwThread fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwGuiWx/bin/build.options b/SrcLib/core/fwGuiWx/bin/build.options
new file mode 100644
index 0000000..ca19ce6
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/bin/build.options
@@ -0,0 +1,10 @@
+USE     = ['boost','wxCore','wxAui']
+LIB     = [
+          'fwGui_0-1',
+          'fwData_0-1',
+          'fwTools_0-1',
+          'fwCore_0-1',
+          'fwServices_0-1',
+          ]
+TYPE    = 'shared'
+VERSION = '0-1'
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/ActionCallback.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/ActionCallback.hpp
new file mode 100644
index 0000000..2cf2bf9
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/ActionCallback.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_ACTIONCALLBACK_HPP_
+#define _FWGUIWX_ACTIONCALLBACK_HPP_
+
+#include <wx/event.h>
+
+#include <fwGui/ActionCallbackBase.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+/**
+ * @brief   Defines the menu item callback.
+ * @class   ActionCallback
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API ActionCallback : public ::fwGui::ActionCallbackBase
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ActionCallback)(::fwGui::ActionCallbackBase),
+                                            (()),
+                                            ::fwGui::factory::New< ActionCallback > );
+
+    FWGUIWX_API ActionCallback(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIWX_API virtual ~ActionCallback() ;
+
+    /**
+     * @brief  wxWidget called method when callback is executed.
+     */
+    FWGUIWX_API virtual void executeWx(wxCommandEvent& event);
+
+};
+
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_ACTIONCALLBACK_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/App.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/App.hpp
new file mode 100644
index 0000000..b46e3d6
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/App.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_APP_HPP_
+#define FWGUIWX_APP_HPP_
+
+#include <wx/app.h>
+#include <wx/intl.h>
+
+#include <fwRuntime/profile/Profile.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+class WXDLLEXPORT wxLocale;
+class wxSingleInstanceChecker;
+
+static void SaveUILanguage(wxLanguage lang);
+wxLanguage GetUILanguage();
+wxLanguage ChooseLanguage();
+void ChangeUILanguage();
+
+namespace fwGuiWx
+{
+
+/**
+ * @brief   Defines the wx application.
+ * @class   App
+ * 
+ * @date    2009.
+ */
+
+class FWGUIWX_CLASS_API App : public wxApp
+{
+public:
+
+    /**
+     * @brief   Constructor
+     */
+    FWGUIWX_API App();
+
+    /**
+     * @name    Overrides
+     */
+    /// @{
+
+    FWGUIWX_API bool OnInit();
+
+    FWGUIWX_API int OnExit();
+
+    FWGUIWX_API void usage(const std::string & mes) const;
+
+    FWGUIWX_API void OnInitCmdLine(wxCmdLineParser & parser);
+
+    FWGUIWX_API void OnUnhandledException();
+
+#ifdef __WXMAC__
+    FWGUIWX_API virtual void MacOpenFile (  const wxString & fileName);
+
+    FWGUIWX_API virtual void MacReopenApp (  const wxString & fileName);
+
+    FWGUIWX_API virtual void MacNewFile (  const wxString & fileName);
+
+    FWGUIWX_API void eventMac(const wxString & fileName);
+#endif
+
+    /// @}
+
+
+private:
+
+    /**
+     * @brief   locale (internationalization) for app
+     */
+    wxLocale * m_locale;
+
+    wxSingleInstanceChecker * m_checker;
+};
+
+
+} // namespace fwGuiWx
+
+
+#endif /*FWGUIWX_APP_HPP_*/
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/Application.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/Application.hpp
new file mode 100644
index 0000000..9ed61d8
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/Application.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_APPLICATION_HPP_
+#define _FWGUIWX_APPLICATION_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/Application.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+/**
+ * @brief   Gives access to the wx application part
+ * @class   Application
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API Application : public ::fwGui::Application
+{
+
+public:
+
+    Application(::fwGui::GuiBaseObject::Key key){};
+
+    virtual ~Application(){};
+
+    /// Tells the application to exit with a returncode
+    FWGUIWX_API virtual void exit( int returncode = 0);
+
+};
+
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_APPLICATION_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/Cursor.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/Cursor.hpp
new file mode 100644
index 0000000..9cbc287
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/Cursor.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CURSOR_HPP_
+#define _FWGUIWX_CURSOR_HPP_
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/ICursor.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+/**
+ * @brief   Defines the generic message box for IHM.
+ * @class   Cursor
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API Cursor : public ::fwGui::ICursor
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Cursor)(::fwGui::ICursor),
+                                            (()),
+                                            ::fwGui::factory::New< Cursor > );
+
+    FWGUIWX_API Cursor(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~Cursor();
+
+    /// Set the cursor
+    FWGUIWX_API virtual void setCursor( ::fwGui::ICursor::CursorType cursor);
+
+    /// Set the default cursor
+    FWGUIWX_API virtual void setDefaultCursor();
+
+};
+
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CURSOR_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/LoggerInitializer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/LoggerInitializer.hpp
new file mode 100644
index 0000000..1544829
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/LoggerInitializer.hpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LOGGERINITIALIZER_HPP_
+#define _FWGUIWX_LOGGERINITIALIZER_HPP_
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+class FWGUIWX_CLASS_API LoggerInitializer
+{
+
+public:
+
+    FWGUIWX_API LoggerInitializer();
+
+    FWGUIWX_API static void initialize();
+};
+
+
+} // namespace fwGuiWx
+
+#endif //_FWGUIWX_LOGGERINITIALIZER_HPP_
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/MessageEvent.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/MessageEvent.hpp
new file mode 100644
index 0000000..3c75cf1
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/MessageEvent.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_MESSAGEEVENT_HPP_
+#define FWGUIWX_MESSAGEEVENT_HPP_
+
+#include <wx/wx.h>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   This class define a message event, used to manage fwServices
+ * notification in wx's events loop.
+ * 
+ * @date    2010.
+ * @todo Comment.
+ */
+class MessageEvent: public ::wxEvent
+{
+public:
+    MessageEvent(wxEventType eventType)
+        : wxEvent(0, eventType)
+    {}
+
+    // implement the base class pure virtual
+    virtual wxEvent *Clone() const { return new MessageEvent(*this); }
+
+};
+
+wxDEFINE_EVENT(MESSAGE_EVENT, MessageEvent);
+
+
+} // end namespace fwGui
+
+
+#endif /* FWGUIWX_MESSAGEEVENT_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/Namespace.hpp
new file mode 100644
index 0000000..9402627
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXNAMESPACE_HPP_
+#define FWGUIWXNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwGuiWx contains classes which provide the implementation of the Gui using wxwidgets library.
+ * @namespace   fwGuiWx
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace fwGuiWx
+{
+}
+#endif /* FWGUIQTNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/Shortcut.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/Shortcut.hpp
new file mode 100644
index 0000000..8b91d58
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/Shortcut.hpp
@@ -0,0 +1,184 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_SHORTCUT_HPP_
+#define _FWGUIWX_SHORTCUT_HPP_
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+/**
+ * @brief   Implements a shortcut definition class.
+ *
+ * @todo    Explain the syntax of a shortcut definition.
+ * @todo    References the shortcut definition syntax explanations in member method documentation.
+ *
+ * 
+ */
+class FWGUIWX_CLASS_API Shortcut : public ::fwCore::BaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Shortcut)(::fwCore::BaseObject),
+            ( ((const int))((const int ))  ) ( ((const std::string )) ),
+            new Shortcut) ;
+
+    /**
+     * @name    Constructors
+     */
+    //@{
+
+    /**
+     * @brief   Constructor
+     *
+     * @param   modifiers   an integer specifying modifiers
+     * @param   keyCode     an integer specifying the key code
+     */
+    FWGUIWX_API Shortcut( const int modifiers, const int keyCode );
+
+    /**
+     * @brief   Constructor
+     *
+     * @param   definition  a string containing the shortcur definition that will be parsed to retrieve the modifier part and the key code part
+     */
+    FWGUIWX_API Shortcut( const std::string & definition );
+
+    //@}
+
+
+    /**
+     * @name    Accessors
+     */
+    //@{
+
+    /**
+     * @brief   Retrieves the modifiers.
+     *
+     * @return  an integer containing the modifiers
+     */
+    FWGUIWX_API const int getModifiers() const;
+
+    /**
+     * @brief   Retrieves the key code.
+     *
+     * @return  an integer containing the key code
+     */
+    FWGUIWX_API const int getKeyCode() const;
+
+    /**
+     * @brief   Reassignes the shortcut definition.
+     *
+     * @param[in]   definition  a string containing the definition
+     */
+    FWGUIWX_API void set( const std::string & definition );
+
+    /**
+     * @brief   Assignes a new definition to the shortcut.
+     *
+     * @param[in]   definition  a definition string
+     *
+     * @return  a reference to the modified shortcut
+     */
+    FWGUIWX_API Shortcut & operator= ( const std::string & definition );
+
+    /**
+     * @brief   Retrieves the shortcut as a definition string
+     *
+     * @return  a string containing the shortcut definition
+     */
+    FWGUIWX_API const std::string toString() const;
+
+    /**
+     * @brief   Retrieves the shortcut as a definition string
+     *
+     * @return  a string containing the shortcut definition
+     */
+    FWGUIWX_API operator std::string () const;
+
+    //@}
+
+
+    /**
+     * @name    Utilities
+     */
+    //@{
+
+    /**
+     * @brief   Retrieves the modifiers from the given shortcut definition string.
+     *
+     * @param[in]   shortcut    a string containing a shortcut definition
+     *
+     * @return  an integer containing the modifiers part
+     */
+    FWGUIWX_API static const int getModifiersFromString( const std::string & shortcut );
+
+    /**
+     * @brief   Retrieves the key code from the given shortcut definition string.
+     *
+     * @param[in] shortcut    a string containing the shortcut definition
+     *
+     * @return  an integer containing the key code
+     *
+     * @todo    Add support all none ascii keys!
+     */
+    FWGUIWX_API static const int getKeyCodeFromString( const std::string & shortcut );
+
+    /**
+     * @brief   Retrieves the string representation for the given modifiers and key code.
+     *
+     * @param[in]   modifiers   an integer containing a combination of modifiers
+     * @param[in]   keyCode     an integer containing a key code
+     *
+     * @return  a string containing the modifier combination and key code representation
+     */
+    FWGUIWX_API static const std::string getString( const int modifiers, const int keyCode );
+
+    /**
+     * @brief   Retrieves the string representation of the given modifiers.
+     *
+     * @param[in]   modifiers   an integer containing a combination of modifiers
+     *
+     * @return  a string containing the modifier combination representation
+     */
+    FWGUIWX_API static const std::string getStringFromModifiers( const int modifiers );
+
+    /**
+     * @brief   Retrieves the string representation of the given key code.
+     *
+     * @param[in]   keyCode an integer containing a key code
+     *
+     * @return  a string containing the key code representation
+     */
+    FWGUIWX_API static const std::string getStringFromKeyCode( const int keyCode );
+
+    //@}
+
+private:
+
+    /**
+     * @brief   an integer representing the modifiers in the shortcut definition
+     *
+     * @remark  This any bitwise combination of wxACCEL_ALT, wxACCEL_SHIFT, wxACCEL_CTRL and wxACCEL_NORMAL.
+     */
+    int         m_modifiers;
+
+    /**
+     * @brief   an integer representing the key code part of the shortcut
+     */
+    int         m_keyCode;
+};
+
+} // namespace fwGuiWx
+
+
+#endif /*_FWGUIWX_SHORTCUT_HPP_*/
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/WorkerWx.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/WorkerWx.hpp
new file mode 100644
index 0000000..80dbd30
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/WorkerWx.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_WORKERWX_HPP_
+#define FWGUIWX_WORKERWX_HPP_
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwThread
+{
+    class Worker;
+} //namespace fwThread
+
+
+
+namespace fwGuiWx
+{
+
+FWGUIWX_API SPTR(::fwThread::Worker) getWxWorker( int &argc, char **argv );
+
+} //namespace fwGui
+
+#endif /*FWGUIWX_WORKERWX_HPP_*/
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ContainerBuilder.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ContainerBuilder.hpp
new file mode 100644
index 0000000..6412e3a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ContainerBuilder.hpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_BUILDER_CONTAINERBUILDER_HPP_
+#define _FWGUIWX_BUILDER_CONTAINERBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IContainerBuilder.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   ContainerBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API ContainerBuilder : public ::fwGui::builder::IContainerBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ContainerBuilder)(::fwGui::builder::IContainerBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< ContainerBuilder > );
+
+    FWGUIWX_API ContainerBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~ContainerBuilder();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent container must be instanced.
+     */
+    FWGUIWX_API virtual void createContainer( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setParent(::fwGui::container::fwContainer::sptr parent);
+
+protected:
+    ::fwGuiWx::container::WxContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIWX_BUILDER_CONTAINERBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/MenuBarBuilder.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/MenuBarBuilder.hpp
new file mode 100644
index 0000000..c48a4fe
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/MenuBarBuilder.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_BUILDER_MENUBARBUILDER_HPP_
+#define _FWGUIWX_BUILDER_MENUBARBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IMenuBarBuilder.hpp>
+#include <fwGui/container/fwMenuBar.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   MenuBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API MenuBarBuilder : public ::fwGui::builder::IMenuBarBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuBarBuilder)(::fwGui::builder::IMenuBarBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< MenuBarBuilder > );
+
+    FWGUIWX_API MenuBarBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~MenuBarBuilder();
+
+    /**
+     * @brief Instantiate layout with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUIWX_API virtual void createMenuBar( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyMenuBar();
+
+protected:
+    ::fwGuiWx::container::WxContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIWX_BUILDER_MENUBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/Namespace.hpp
new file mode 100644
index 0000000..fab028c
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXBUILDERNAMESPACE_HPP_
+#define FWGUIWXBUILDERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::builder contains the classes for GUI elements builder implementation with the WxWidget library.
+ * @namespace   fwGui::builder
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace builder
+{
+
+}
+}
+#endif /* FWGUIWXBUILDERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ToolBarBuilder.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ToolBarBuilder.hpp
new file mode 100644
index 0000000..ffcb639
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/builder/ToolBarBuilder.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_BUILDER_TOOLBARBUILDER_HPP_
+#define _FWGUIWX_BUILDER_TOOLBARBUILDER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/builder/IToolBarBuilder.hpp>
+#include <fwGui/container/fwToolBar.hpp>
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace builder
+{
+
+/**
+ * @brief   Defines the generic layout manager for IHM.
+ * @class   ToolBarBuilder
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API ToolBarBuilder : public ::fwGui::builder::IToolBarBuilder
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolBarBuilder)(::fwGui::builder::IToolBarBuilder),
+                                            (()),
+                                            ::fwGui::factory::New< ToolBarBuilder >);
+
+    FWGUIWX_API ToolBarBuilder(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~ToolBarBuilder();
+
+    /**
+     * @brief Instantiate layout with parent toolBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent toolBar must be instanced.
+     */
+    FWGUIWX_API virtual void createToolBar( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyToolBar();
+
+protected:
+    ::fwGuiWx::container::WxContainer::sptr m_parent;
+};
+
+} // namespace builder
+} // namespace fwGui
+
+#endif /*_FWGUIWX_BUILDER_TOOLBARBUILDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/config.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/config.hpp
new file mode 100644
index 0000000..bf4ee11
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWGUIWX_CONFIG_HPP_
+#define _FWGUIWX_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWGUIWX_EXPORTS
+    #define FWGUIWX_API __declspec(dllexport)
+    #else
+    #define FWGUIWX_API __declspec(dllimport)
+    #endif
+
+    #define FWGUIWX_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWGUIWX_EXPORTS
+    #define FWGUIWX_API __attribute__ ((visibility("default")))
+    #define FWGUIWX_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWGUIWX_API __attribute__ ((visibility("hidden")))
+    //#define FWGUIWX_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWGUIWX_API
+    #define FWGUIWX_CLASS_API
+    #endif
+
+#else
+
+    #define FWGUIWX_API
+    #define FWGUIWX_CLASS_API
+
+#endif
+
+#endif //_FWGUIWX_CONFIG_HPP_
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/Namespace.hpp
new file mode 100644
index 0000000..6bdbd3e
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXCONTAINERNAMESPACE_HPP_
+#define FWGUIWXCONTAINERNAMESPACE_HPP_
+
+namespace fwGuiWx
+{
+/**
+ * @brief       The namespace fwGuiWx::container contains the classes used for container implementation with WxWidgets Library.
+ * @namespace   fwGuiWx::container
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace container
+{
+
+}
+}
+#endif /* FWGUIWXCONTAINERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxContainer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxContainer.hpp
new file mode 100644
index 0000000..d3f67ae
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxContainer.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CONTAINER_WXCONTAINER_HPP_
+#define _FWGUIWX_CONTAINER_WXCONTAINER_HPP_
+
+#include <wx/window.h>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the wxWidgets container for IHM.
+ * @class   WxContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API WxContainer : public ::fwGui::container::fwContainer
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (WxContainer)(::fwGui::container::fwContainer),
+                                            (()),
+                                            ::fwGui::factory::New< WxContainer >  );
+
+    FWGUIWX_API WxContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIWX_API virtual ~WxContainer() throw() ;
+
+
+    FWGUIWX_API virtual void clean();
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setWxContainer(wxWindow* container);
+    FWGUIWX_API virtual wxWindow* getWxContainer();
+    FWGUIWX_API virtual bool isShownOnScreen();
+
+    FWGUIWX_API virtual void setVisible(bool isVisible);
+
+private :
+
+    wxWindow* m_container;
+};
+
+} // namespace container
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CONTAINER_WXCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuBarContainer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuBarContainer.hpp
new file mode 100644
index 0000000..9413b0a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuBarContainer.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CONTAINER_WXMENUBARCONTAINER_HPP_
+#define _FWGUIWX_CONTAINER_WXMENUBARCONTAINER_HPP_
+
+#include <wx/menu.h>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenuBar.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the wxWidgets menu bar container for IHM.
+ * @class   WxMenuBarContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API WxMenuBarContainer : public ::fwGui::container::fwMenuBar
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (WxMenuBarContainer)(::fwGui::container::fwMenuBar),
+                                            (()),
+                                            ::fwGui::factory::New< WxMenuBarContainer > );
+
+    FWGUIWX_API WxMenuBarContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIWX_API virtual ~WxMenuBarContainer() throw() ;
+
+
+    FWGUIWX_API virtual void clean();
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setWxMenuBar(wxMenuBar* menuBar);
+    FWGUIWX_API virtual wxMenuBar* getWxMenuBar();
+
+private :
+
+    wxMenuBar* m_menuBar;
+};
+
+} // namespace container
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CONTAINER_WXMENUBARCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuContainer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuContainer.hpp
new file mode 100644
index 0000000..1fa4fca
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuContainer.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CONTAINER_WXMENUCONTAINER_HPP_
+#define _FWGUIWX_CONTAINER_WXMENUCONTAINER_HPP_
+
+#include <wx/menu.h>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenu.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the wxWidgets menu bar container for IHM.
+ * @class   WxMenuContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API WxMenuContainer : public ::fwGui::container::fwMenu
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (WxMenuContainer)(::fwGui::container::fwMenu),
+                                            (()),
+                                            ::fwGui::factory::New< WxMenuContainer >  );
+
+    FWGUIWX_API WxMenuContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIWX_API virtual ~WxMenuContainer() throw() ;
+
+
+    FWGUIWX_API virtual void clean();
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setWxMenu(wxMenu* menu);
+    FWGUIWX_API virtual wxMenu* getWxMenu();
+
+private :
+
+    wxMenu* m_menu;
+};
+
+} // namespace container
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CONTAINER_WXMENUCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuItemContainer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuItemContainer.hpp
new file mode 100644
index 0000000..a16ac65
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxMenuItemContainer.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CONTAINER_WXMENUITEMCONTAINER_HPP_
+#define _FWGUIWX_CONTAINER_WXMENUITEMCONTAINER_HPP_
+
+#include <wx/menu.h>
+#include <wx/toolbar.h>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwMenuItem.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the wxWidgets menuItem bar container for IHM.
+ * @class   WxMenuItemContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API WxMenuItemContainer : public ::fwGui::container::fwMenuItem
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (WxMenuItemContainer)(::fwGui::container::fwMenuItem),
+                                            (()),
+                                            ::fwGui::factory::New< WxMenuItemContainer > );
+
+    FWGUIWX_API WxMenuItemContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIWX_API virtual ~WxMenuItemContainer() throw() ;
+
+
+    FWGUIWX_API virtual void clean();
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setWxMenuItem(wxMenuItem* menuItem);
+    FWGUIWX_API virtual wxMenuItem* getWxMenuItem();
+
+    FWGUIWX_API virtual void setWxToolItem(wxToolBarToolBase* menuItem);
+    FWGUIWX_API virtual wxToolBarToolBase* getWxToolItem();
+
+private :
+
+    wxMenuItem* m_menuItem;
+    wxToolBarToolBase* m_toolBarToolBase;
+};
+
+} // namespace container
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CONTAINER_WXMENUITEMCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxToolBarContainer.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxToolBarContainer.hpp
new file mode 100644
index 0000000..bc6c3c5
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/container/WxToolBarContainer.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_CONTAINER_WXTOOLBARCONTAINER_HPP_
+#define _FWGUIWX_CONTAINER_WXTOOLBARCONTAINER_HPP_
+
+#include <wx/toolbar.h>
+
+#include <fwCore/base.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwGui/container/fwToolBar.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+/**
+ * @brief   Defines the wxWidgets toolBar bar container for IHM.
+ * @class   WxToolBarContainer
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API WxToolBarContainer : public ::fwGui::container::fwToolBar
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (WxToolBarContainer)(::fwGui::container::fwToolBar),
+                                            (()),
+                                            ::fwGui::factory::New< WxToolBarContainer > );
+
+    FWGUIWX_API WxToolBarContainer(::fwGui::GuiBaseObject::Key key) throw() ;
+
+    FWGUIWX_API virtual ~WxToolBarContainer() throw() ;
+
+
+    FWGUIWX_API virtual void clean();
+    FWGUIWX_API virtual void destroyContainer();
+
+    FWGUIWX_API virtual void setWxToolBar(wxToolBar* toolBar);
+    FWGUIWX_API virtual wxToolBar* getWxToolBar();
+
+private :
+
+    wxToolBar* m_toolBar;
+};
+
+} // namespace container
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_CONTAINER_WXTOOLBARCONTAINER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/convert.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/convert.hpp
new file mode 100644
index 0000000..d6c0b7a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/convert.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWGUIWX_CONVERT_HPP_
+#define _FWGUIWX_CONVERT_HPP_
+
+#include <string>
+
+#ifdef __WXMSW__
+#   include <wx/msw/winundef.h>
+#endif
+#include <wx/string.h>
+
+#include "fwGuiWx/config.hpp"
+
+#ifdef __WXMAC__
+#include <wx/event.h>
+wxDECLARE_EVENT(wxEventFwOpen, wxCommandEvent);
+#define wxIDEventFwOpen 27001
+#endif
+
+namespace fwGuiWx
+{
+    FWGUIWX_API wxString std2wx( const std::string & value );
+    FWGUIWX_API std::string wx2std( const wxString & value );
+}
+#endif
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/InputDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/InputDialog.hpp
new file mode 100644
index 0000000..449d3c6
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/InputDialog.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_INPUTDIALOG_HPP_
+#define _FWGUIWX_INPUTDIALOG_HPP_
+
+#include <string>
+#include <fwCore/base.hpp>
+
+#include <fwGui/dialog/IInputDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+/**
+ * @brief   Defines an input dialog for IHM on WxWidget.
+ * @class   InputDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API InputDialog : public ::fwGui::dialog::IInputDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (InputDialog)(::fwGui::dialog::IInputDialog),
+                                            (()),
+                                            ::fwGui::factory::New< InputDialog > );
+
+    /** @brief Constructor. Do nothing.\n
+     * Example of use: \n
+     * @verbatim
+          ::fwGui::dialog::InputDialog inputDlg;
+          inputDlg.setTitle("Identification dialog");
+          inputDlg.setMessage("Enter Pin Code: ");
+          inputDlg.setInput ("<Enter your code here>");
+          std::string inputText = inputDlg.getInput();
+     @endverbatim
+     */
+
+    FWGUIWX_API InputDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~InputDialog();
+
+    /// Set the title of the message box.
+    FWGUIWX_API virtual void setTitle( const std::string &title );
+
+    /// Set the message
+    FWGUIWX_API virtual void setMessage( const std::string &msg );
+
+    /// Set the input text in the input field.
+    FWGUIWX_API virtual void setInput(const std::string &text);
+
+    /// Get the input text in the input field
+    FWGUIWX_API virtual std::string getInput();
+
+
+protected:
+    /// Dialog title
+    std::string m_title;
+    /// Dialog box message
+    std::string m_message;
+    /// Text inputed
+    std::string m_input;
+
+};
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_INPUTDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/LocationDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/LocationDialog.hpp
new file mode 100644
index 0000000..e1b2ec4
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/LocationDialog.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LOCATIONDIALOG_HPP_
+#define _FWGUIWX_LOCATIONDIALOG_HPP_
+
+#include <map>
+
+#include <wx/filedlg.h>
+
+#include <fwCore/base.hpp>
+#include <fwGui/dialog/ILocationDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic file/folder dialog for IHM.
+ * @class   LocationDialog
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API LocationDialog : public ::fwGui::dialog::ILocationDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (LocationDialog)(::fwGui::dialog::ILocationDialog),
+                                            (()),
+                                            ::fwGui::factory::New< LocationDialog > );
+
+    FWGUIWX_API LocationDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API ::fwData::location::ILocation::sptr show();
+
+    FWGUIWX_API ::fwGui::dialog::ILocationDialog& setOption( ::fwGui::dialog::ILocationDialog::Options option);
+
+    /// set the style of location for the dialog
+    FWGUIWX_API void setType( ::fwGui::dialog::ILocationDialog::Types type );
+
+    // exemple ( addFilter("images","*.png *.jpg");
+    FWGUIWX_API void addFilter(const std::string &filterName, const std::string &wildcardList );
+
+protected:
+    unsigned long m_style;
+    std::multimap< std::string, std::string > m_filters;
+    ::fwGui::dialog::ILocationDialog::Types m_type;
+
+    /// helper to transform m_filters into wx encoding ("BMP and GIF files (*.bmp;*.gif)|*.bmp;*.gif|PNG files (*.png)|*.png"
+    wxString fileFilters();
+
+};
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_LOCATIONDIALOG_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MessageDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MessageDialog.hpp
new file mode 100644
index 0000000..7cd5521
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MessageDialog.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_MESSAGEBOX_HPP_
+#define _FWGUIWX_MESSAGEBOX_HPP_
+
+#include <string>
+#include <fwCore/base.hpp>
+
+
+
+#include <fwGui/dialog/IMessageDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+/**
+ * @brief   Defines the generic message box for IHM.
+ * @class   MessageDialog
+ *
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API MessageDialog : public ::fwGui::dialog::IMessageDialog
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MessageDialog)(::fwGui::dialog::IMessageDialog),
+                                            (()),
+                                            ::fwGui::factory::New< MessageDialog > );
+
+    FWGUIWX_API MessageDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~MessageDialog();
+
+    /// Set the title of the message box
+    FWGUIWX_API virtual void setTitle( const std::string &title );
+
+    /// Set the message
+    FWGUIWX_API virtual void setMessage( const std::string &msg );
+
+    /// Set the icon (CRITICAL, WARNING, INFO or QUESTION)
+    FWGUIWX_API virtual void setIcon( IMessageDialog::Icons icon);
+
+    /// Add a button (OK, YES_NO, CANCEL)
+    FWGUIWX_API virtual void addButton( IMessageDialog::Buttons button );
+
+    /// Set the default buttons
+    FWGUIWX_API virtual void setDefaultButton( IMessageDialog::Buttons button );
+
+    /// Show the message box and return the clicked button.
+    FWGUIWX_API virtual Buttons show();
+
+protected:
+    /// Dialog title
+    std::string m_title;
+    /// Dialog box message
+    std::string m_message;
+    /// List of the button in wx style (wxOK, wxCANCEL, wxYES_NO)
+    unsigned long m_buttons;
+    /// Icon in wx style (wxICON_ERROR, wxICON_INFORMATION, ...)
+    unsigned long m_icon;
+};
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /*_FWGUIWX_MESSAGEBOX_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MultiSelectorDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MultiSelectorDialog.hpp
new file mode 100644
index 0000000..8e69cb3
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/MultiSelectorDialog.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_SELECTORDIALOG_HPP_
+#define FWGUIWX_SELECTORDIALOG_HPP_
+
+#include <vector>
+
+#include <fwGui/dialog/IMultiSelectorDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   MultiSelectorDialog allowing the choice of an element among severals (_selections)
+ * @class   MultiSelectorDialog
+ * 
+ * @date    2009.
+ */
+
+class FWGUIWX_CLASS_API MultiSelectorDialog : public ::fwGui::dialog::IMultiSelectorDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (MultiSelectorDialog)(::fwGui::dialog::IMultiSelectorDialog),
+                                            (()),
+                                            ::fwGui::factory::New< MultiSelectorDialog > );
+
+    FWGUIWX_API MultiSelectorDialog(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIWX_API virtual ~MultiSelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUIWX_API virtual void setSelections(Selections _selections);
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUIWX_API virtual void setTitle(std::string _title);
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUIWX_API virtual Selections show();
+
+    FWGUIWX_API virtual void setMessage(const std::string &msg);
+
+private :
+
+    Selections m_selections;
+    /// Dialog box message
+    std::string m_message;
+    std::string m_title;
+};
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /*FWGUIWX_SELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/Namespace.hpp
new file mode 100644
index 0000000..743b10d
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXDIALOGNAMESPACE_HPP_
+#define FWGUIWXDIALOGNAMESPACE_HPP_
+
+namespace fwGuiWx
+{
+/**
+ * @brief       The namespace fwGuiWx::dialog contains the classes used for container implementation with wxWidgets Library.
+ * @namespace   fwGuiWx::dialog
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace dialog
+{
+
+}
+}
+#endif /* FWGUIWXDIALOGNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/ProgressDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/ProgressDialog.hpp
new file mode 100644
index 0000000..998d349
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/ProgressDialog.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_PROGRESSDIALOG
+#define FWGUIWX_PROGRESSDIALOG
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+
+#include <fwGui/dialog/ProgressDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+
+class fwProgressDialog;
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+/**
+ * @brief   This class allows us to select an acquisition in a patient data base.
+ * @class   ProgressDialog
+ * 
+ * @date    2009.
+ * @note Do not inherit from fwProgressDialog but embed a fwProgressDialog because this lasted is not copiable.
+ * @todo ProgressDialog is not commented.
+ */
+class FWGUIWX_CLASS_API ProgressDialog : public ::fwGui::dialog::IProgressDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ProgressDialog)(::fwGui::dialog::IProgressDialog),
+                                            (()),
+                                            ::fwGui::factory::New< ProgressDialog > );
+
+    FWGUIWX_API ProgressDialog( ::fwGui::GuiBaseObject::Key key,
+                                const std::string &title="Progression",
+                                const std::string &message= std::string(86,' '));
+
+    FWGUIWX_API virtual ~ProgressDialog();
+
+    FWGUIWX_API void operator()(float percent,std::string msg);
+
+    /// override
+    FWGUIWX_API void setTitle(const std::string &title);
+
+    /// override
+    FWGUIWX_API void setMessage(const std::string &message);
+
+protected :
+
+    ::boost::shared_ptr< fwProgressDialog >  m_pdialog;
+
+};
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /* FWGUIWX_PROGRESSDIALOG */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/PulseProgressDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/PulseProgressDialog.hpp
new file mode 100644
index 0000000..1ffcb14
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/PulseProgressDialog.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_PULSEPROGRESSDIALOG
+#define FWGUIWX_PULSEPROGRESSDIALOG
+
+#include <wx/thread.h>
+#include <wx/event.h>
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+
+#include <fwGui/dialog/IPulseProgressDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+/**
+ * @brief   This class allows us to show a pulse progress dialog.
+ * @class   PulseProgressDialog
+ * 
+ * @date    2009.
+ * @todo PulseProgressDialog is not commented.
+ */
+class FWGUIWX_CLASS_API PulseProgressDialog : public ::fwGui::dialog::IPulseProgressDialog, public wxEvtHandler
+{
+public:
+
+
+    class LocalThread : public wxThread
+    {
+    public :
+        LocalThread( Stuff &stuff );
+        ~LocalThread();
+        virtual wxThread::ExitCode  Entry ();
+        bool isFinished() const;
+        std::string getErrorMessage() const;
+
+    protected :
+        Stuff &m_stuff;
+        bool m_isFinished;
+        /** @brief
+         * empty if no error else contain .what() value of exception
+         * catched during execution of stuff
+         */
+        std::string m_errorMessage;
+    };
+
+
+    fwCoreClassDefinitionsWithFactoryMacro( (PulseProgressDialog)(::fwGui::dialog::IPulseProgressDialog),
+                                            (()),
+                                            ::fwGui::factory::New< PulseProgressDialog > );
+
+    FWGUIWX_API PulseProgressDialog(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~PulseProgressDialog();
+
+    /// override
+    FWGUIWX_API void setTitle(const std::string &title);
+
+    /// override
+    FWGUIWX_API void setMessage(const std::string &message);
+
+    FWGUIWX_API void show();
+
+protected :
+
+    std::string m_title;
+    std::string m_message;
+    // how to react on a finished thread event
+    FWGUIWX_API void onComplete( wxThreadEvent &event);
+
+    // the thread and management
+    LocalThread *m_thread;
+    wxCriticalSection    m_threadCS;
+
+    // the progress
+    wxProgressDialog    *m_wxpd;
+
+};
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /* FWGUIWX_PULSEPROGRESSDIALOG */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/SelectorDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/SelectorDialog.hpp
new file mode 100644
index 0000000..55ffb8d
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/dialog/SelectorDialog.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_SELECTORDIALOG_HPP_
+#define FWGUIWX_SELECTORDIALOG_HPP_
+
+#include <vector>
+
+#include <fwGui/dialog/ISelectorDialog.hpp>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   SelectorDialog allowing the choice of an element among severals (_selections)
+ * @class   SelectorDialog
+ * 
+ * @date    2009.
+ */
+
+class FWGUIWX_CLASS_API SelectorDialog : public ::fwGui::dialog::ISelectorDialog
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (SelectorDialog)(::fwGui::dialog::ISelectorDialog),
+                                            (()),
+                                            ::fwGui::factory::New< SelectorDialog > );
+
+    FWGUIWX_API SelectorDialog(::fwGui::GuiBaseObject::Key key) ;
+
+    FWGUIWX_API virtual ~SelectorDialog();
+
+    /**
+     * @brief The string list that can be chosen by the selector.
+     */
+    FWGUIWX_API virtual void setSelections(std::vector< std::string > _selections);
+
+    /**
+     * @brief Sets the selector title.
+     */
+    FWGUIWX_API virtual void setTitle(std::string _title);
+
+    /**
+     * @brief Show the selector and return the selection.
+     */
+    FWGUIWX_API virtual std::string show();
+
+    FWGUIWX_API virtual void setMessage(const std::string &msg);
+
+private :
+
+    std::vector< std::string > m_selections;
+    /// Dialog box message
+    std::string m_message;
+    std::string m_title;
+};
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+#endif /*FWGUIWX_SELECTORDIALOG_HPP_*/
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/CardinalLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/CardinalLayoutManager.hpp
new file mode 100644
index 0000000..d069159
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/CardinalLayoutManager.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_
+
+#include <wx/aui/aui.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/CardinalLayoutManagerBase.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the line layout manager.
+ * @class   CardinalLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API CardinalLayoutManager : public ::fwGui::layoutManager::CardinalLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (CardinalLayoutManager)(::fwGui::layoutManager::CardinalLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< CardinalLayoutManager > );
+
+    FWGUIWX_API CardinalLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~CardinalLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+private:
+
+    ::fwGuiWx::container::WxContainer::sptr m_parentContainer;
+
+    /// Layout manager of this view
+    wxAuiManager * m_manager;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_CARDINALLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/FrameLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/FrameLayoutManager.hpp
new file mode 100644
index 0000000..578fe35
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/FrameLayoutManager.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_
+
+#include <wx/aui/aui.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/IFrameLayoutManager.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the frame manager.
+ * @class   FrameLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API FrameLayoutManager : public ::fwGui::layoutManager::IFrameLayoutManager
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (FrameLayoutManager)(::fwGui::layoutManager::IFrameLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< FrameLayoutManager > );
+
+    FWGUIWX_API FrameLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~FrameLayoutManager();
+
+    /**
+     * @brief Instantiate frame.
+     */
+    FWGUIWX_API virtual void createFrame();
+
+    /**
+     * @brief Destroy local frame with sub containers.
+     */
+    FWGUIWX_API virtual void destroyFrame();
+
+private:
+
+    static const std::map< ::fwGui::layoutManager::IFrameLayoutManager::Style, long> FWSTYLE_TO_WXSTYLE;
+
+    void onCloseFrame(wxCloseEvent& event);
+
+    void setState(FrameState state);
+    FrameState getState();
+
+    wxFrame* m_wxFrame;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_FRAMELAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/LineLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/LineLayoutManager.hpp
new file mode 100644
index 0000000..43c927e
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/LineLayoutManager.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/LineLayoutManagerBase.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the line layout manager.
+ * @class   LineLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API LineLayoutManager : public ::fwGui::layoutManager::LineLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (LineLayoutManager)(::fwGui::layoutManager::LineLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< LineLayoutManager > );
+
+    FWGUIWX_API LineLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~LineLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+private:
+    ::fwGuiWx::container::WxContainer::sptr m_parentContainer;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_LINELAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuBarLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuBarLayoutManager.hpp
new file mode 100644
index 0000000..0a72364
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuBarLayoutManager.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwMenuBar.hpp>
+#include <fwGui/container/fwMenu.hpp>
+#include <fwGui/layoutManager/IMenuBarLayoutManager.hpp>
+
+#include "fwGuiWx/container/WxMenuBarContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu bar layout manager for IHM.
+ * @class   MenuBarLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API MenuBarLayoutManager : public ::fwGui::layoutManager::IMenuBarLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuBarLayoutManager)(::fwGui::layoutManager::IMenuBarLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< MenuBarLayoutManager > );
+
+    FWGUIWX_API MenuBarLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~MenuBarLayoutManager();
+
+    /**
+     * @brief Instantiate menu with parent menuBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menuBar must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwMenuBar::sptr parent );
+
+    /**
+     * @brief Destroy local menus.
+     * @pre services using this menus must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the menu visibility.
+     */
+    FWGUIWX_API virtual void menuIsVisible(::fwGui::container::fwMenu::sptr fwMenu, bool isVisible);
+
+    /**
+     * @brief Set the menu enable or not.
+     */
+    FWGUIWX_API virtual void menuIsEnabled(::fwGui::container::fwMenu::sptr fwMenu, bool isEnabled);
+
+protected:
+
+    /// Return the position of the menu in the menuBar
+    int getMenuPosition(::fwGui::container::fwMenu::sptr fwMenu);
+
+    ::fwGuiWx::container::WxMenuBarContainer::sptr m_parent;
+};
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_MENUBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuLayoutManager.hpp
new file mode 100644
index 0000000..eed9292
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/MenuLayoutManager.hpp
@@ -0,0 +1,87 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwMenu.hpp>
+#include <fwGui/layoutManager/IMenuLayoutManager.hpp>
+
+#include "fwGuiWx/container/WxMenuContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the menu layout manager for IHM.
+ * @class   MenuLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API MenuLayoutManager : public ::fwGui::layoutManager::IMenuLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (MenuLayoutManager)(::fwGui::layoutManager::IMenuLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< MenuLayoutManager > );
+
+    FWGUIWX_API MenuLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~MenuLayoutManager();
+
+    /**
+     * @brief Instantiate actions with parent menu.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent menu must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwMenu::sptr parent );
+
+    /**
+     * @brief Destroy local menus.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUIWX_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr menuItem, bool isVisible);
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUIWX_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr menuItem, bool isEnabled);
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUIWX_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked);
+
+protected:
+
+    ::fwGuiWx::container::WxMenuContainer::sptr m_parent;
+
+    /// Vector of separators
+    std::vector< ::fwGui::container::fwMenuItem::sptr > m_separators;
+
+    static const std::map< ::fwGui::layoutManager::IMenuLayoutManager::ActionType, int> SPECIAL_ACTION_TO_WXID;
+};
+
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_MENULAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/Namespace.hpp
new file mode 100644
index 0000000..35b78b8
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXLAYOUTMANAGERNAMESPACE_HPP_
+#define FWGUIWXLAYOUTMANAGERNAMESPACE_HPP_
+
+namespace fwGui
+{
+/**
+ * @brief       The namespace fwGui::layoutManager contains the implementation of managers use to handle the GUI layout available in FW4SPL. The wxWidget library is used.
+ * @namespace   fwGui::registrar
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace layoutManager
+{
+
+}
+}
+#endif /* FWGUIWXLAYOUTMANAGERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/TabLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/TabLayoutManager.hpp
new file mode 100644
index 0000000..b16fd27
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/TabLayoutManager.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_
+
+#include <wx/notebook.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/layoutManager/TabLayoutManagerBase.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+
+/**
+ * @brief   Defines the tab layout manager.
+ * @class   TabLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API TabLayoutManager : public ::fwGui::layoutManager::TabLayoutManagerBase
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (TabLayoutManager)(::fwGui::layoutManager::TabLayoutManagerBase),
+                                            (()),
+                                            ::fwGui::factory::New< TabLayoutManager > );
+
+    FWGUIWX_API TabLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~TabLayoutManager();
+
+    /**
+     * @brief Instantiate layout with parent container.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent containers must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwContainer::sptr parent );
+
+    /**
+     * @brief Destroy local layout with sub containers.
+     * @pre services using this sub containers must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+private:
+
+    ::fwGuiWx::container::WxContainer::sptr m_parentContainer;
+
+    // Layout manager of this view
+    wxNotebook * m_notebook;
+};
+
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_TABLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/ToolBarLayoutManager.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/ToolBarLayoutManager.hpp
new file mode 100644
index 0000000..0fa8c4e
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/layoutManager/ToolBarLayoutManager.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWGUIWX_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_
+#define _FWGUIWX_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_
+
+#include <fwCore/base.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwGui/container/fwToolBar.hpp>
+#include <fwGui/layoutManager/IToolBarLayoutManager.hpp>
+
+#include "fwGuiWx/container/WxToolBarContainer.hpp"
+#include "fwGuiWx/config.hpp"
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+/**
+ * @brief   Defines the tool bar layout manager for IHM.
+ * @class   ToolBarLayoutManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWGUIWX_CLASS_API ToolBarLayoutManager : public ::fwGui::layoutManager::IToolBarLayoutManager
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ToolBarLayoutManager)(::fwGui::layoutManager::IToolBarLayoutManager),
+                                            (()),
+                                            ::fwGui::factory::New< ToolBarLayoutManager > );
+
+    FWGUIWX_API ToolBarLayoutManager(::fwGui::GuiBaseObject::Key key);
+
+    FWGUIWX_API virtual ~ToolBarLayoutManager();
+
+    /**
+     * @brief Instantiate actions with parent toolBar.
+     * @pre LayoutManager must be initialized before.
+     * @pre parent toolBar must be instanced.
+     */
+    FWGUIWX_API virtual void createLayout( ::fwGui::container::fwToolBar::sptr parent );
+
+    /**
+     * @brief Destroy local toolbar.
+     * @pre services using this actions must be stopped before.
+     */
+    FWGUIWX_API virtual void destroyLayout();
+
+
+    /**
+     * @brief Set the action visibility.
+     */
+    FWGUIWX_API virtual void menuItemSetVisible(::fwGui::container::fwMenuItem::sptr menuItem, bool isVisible);
+
+    /**
+     * @brief Set the action enable or not.
+     */
+    FWGUIWX_API virtual void menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr menuItem, bool isEnabled);
+
+    /**
+     * @brief Set the action checked or not.
+     */
+    FWGUIWX_API virtual void menuItemSetChecked(::fwGui::container::fwMenuItem::sptr, bool isChecked);
+
+protected:
+
+    ::fwGuiWx::container::WxToolBarContainer::sptr m_parent;
+
+};
+
+
+} // namespace layoutManager
+} // namespace fwGui
+
+#endif /*_FWGUIWX_LAYOUTMANAGER_TOOLBARLAYOUTMANAGER_HPP_*/
+
+
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/ImageURLPanel.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/ImageURLPanel.hpp
new file mode 100644
index 0000000..90445a6
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/ImageURLPanel.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IMAGEURLPANEL_HPP_
+#define IMAGEURLPANEL_HPP_
+
+#include <wx/wx.h>
+
+#include "fwGuiWx/config.hpp"
+
+namespace fwGuiWx
+{
+
+namespace widgets
+{
+
+/**
+ * @brief   This class is used to show an image file or image url
+ * @class   ImageURLPanel
+ * 
+ * @date    2009.
+ * @note    This class is not commented, because it is not used in the open framework tutorial.
+ * @todo    ImageURLPanel is not commented.
+ */
+class FWGUIWX_CLASS_API ImageURLPanel : public wxPanel
+{
+
+public:
+
+    FWGUIWX_API ImageURLPanel(wxWindow *parent, const wxBitmap& bitmap);
+    FWGUIWX_API void OnPaint(wxPaintEvent& WXUNUSED(event));
+    FWGUIWX_API void OnWeb(wxMouseEvent& WXUNUSED(event));
+    FWGUIWX_API void OnFocus(wxMouseEvent& WXUNUSED(event));
+    FWGUIWX_API void OnEnter(wxMouseEvent& WXUNUSED(event));
+    FWGUIWX_API void OnLeave(wxMouseEvent& WXUNUSED(event));
+
+private:
+
+    wxBitmap m_bitmap;
+
+    DECLARE_EVENT_TABLE()
+};
+}
+}
+#endif /*IMAGEURLPANEL_HPP_*/
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/Namespace.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/Namespace.hpp
new file mode 100644
index 0000000..e78ecee
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWXWIDGETSNAMESPACE_HPP_
+#define FWGUIWXWIDGETSNAMESPACE_HPP_
+
+namespace fwGuiWx
+{
+/*
+ * @brief       The namespace fwGuiWx::widgets provides a list of widgets based on WxWidgets .
+ * @namespace   fwGuiWx::widgets
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace widgets
+{
+
+}
+}
+#endif /* FWGUIWXWIDGETSNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/colourpicker.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/colourpicker.hpp
new file mode 100644
index 0000000..c489a86
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/colourpicker.hpp
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/////////////////////////////////////////////////////////////////////////////
+// Name:        colourpicker.h
+// Purpose:     wxColourPicker header
+// Author:      Juan Antonio Ortega
+// Created:     2006/06/17
+// RCS-ID:      $Id: colourpicker.h,v 1.1 2006/06/27 18:10:54 ja_ortega Exp $
+// Copyright:   (c) 2006 Juan Antonio Ortega
+// Licence:     wxWidgets licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _COLOURPICKER_H_
+#define _COLOURPICKER_H_
+
+#include <wx/wxprec.h>
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+#ifndef WX_PRECOMP
+    #include <wx/wx.h>
+#endif
+
+#include <wx/popupwin.h>
+
+#include "fwGuiWx/config.hpp"
+
+#define SQUARE_WIDTH    12
+#define SQUARE_SEPARATION   6
+#define ROWS    5
+#define COLUMNS 8
+
+class wxColourPanel;
+
+
+/**
+ * @brief   This class provides a widgets which allows the user to pick a colour from a palette.
+ * @class   WindowingParameterEditor
+ * @note    This class is not commented, because it is not used in the open framework tutorial.
+ * @todo This class has to be removed, because it is available in the new wxWidgets release.
+ *
+ * This class provides a widgets which allows
+ * the user to pick a colour from a palette. You can customize several
+ * parameters of the palette: thw width of the square colours, the separation
+ * between them, the number of rows and the number of columns. In order to
+ * change this settings, open wx/colourpicker.h and change the defines that
+ * are at the top of the file.
+ */
+class FWGUIWX_CLASS_API wxColourPicker : public wxBitmapButton {
+
+    wxColourPanel *m_cp;
+
+    wxColour m_colour;
+
+    wxBitmap CreateColourBitmap(const wxColour& c, const wxSize& size, bool enabled);
+
+public:
+
+    /**
+     * wxColourPicker Constructor
+     * @param parent The parent window
+     * @param id The widget's id
+     */
+    FWGUIWX_API wxColourPicker(wxWindow *parent, int id);
+
+    // Get-Set methods
+    /**
+     * Sets the colour that is being displayed as selected colour in
+     * the picker button. This method sends an event whenever it is called.
+     * @param colour The colour to show in the picker
+     */
+    FWGUIWX_API void SetColour(wxColour& colour);
+
+    /**
+     * Return the selected colour
+     * @return The selected colour
+     */
+    FWGUIWX_API wxColour GetColour();
+
+    // Overriden methods
+    FWGUIWX_API virtual void DoSetSize(int x, int y,
+                           int width, int height,
+                           int sizeFlags = wxSIZE_AUTO);
+
+    // Events
+    FWGUIWX_API void OnPopup(wxCommandEvent& WXUNUSED(e));
+
+    DECLARE_EVENT_TABLE()
+};
+
+/**
+ * wxColourPickerEvent class. This event is fired each time the user changes
+ * the selected colour in the control. If the user chooses the same colour,
+ * then no event is sent. In order to catch the event, you can use the
+ * EVT_COLOUR_CHANGED(id, func) macro. This event is also fired when you
+ * programatically change the selected colour.
+ */
+class FWGUIWX_CLASS_API wxColourPickerEvent : public wxCommandEvent {
+    wxColour m_colour;
+public:
+    FWGUIWX_API wxColourPickerEvent(int id, wxColour& colur);
+
+    /**
+     * Returns the new selected colour
+     * @return The selected colour
+     */
+    FWGUIWX_API wxColour GetColour();
+    FWGUIWX_API wxEvent* Clone() const;
+};
+
+//----------------------------------------------------
+//  Internal classes
+//----------------------------------------------------
+
+class wxColourElement{
+public:
+    wxColour m_colour;
+    wxString m_name;
+};
+
+class wxColourPanel : public wxPopupTransientWindow{
+    wxBitmap m_back;
+    wxColour m_selectedColour;
+    wxColour m_overColour;
+    wxColourPicker *m_picker;
+    bool m_overMore;
+    bool m_isFlat, m_osHasDropShadow;
+    static const wxColourElement ms_colorTable[ROWS][COLUMNS];
+
+    void GetColourFromPoint(int x, int y, wxColour& colour, bool& more, wxString& name);
+    void PaintSquare(wxImage& image, wxImage& maskImage, int x, int y, wxColour col);
+public:
+    wxColourPanel(wxWindow *parent);
+
+    // Get-Set methods
+    void SetColour(wxColour& colour);
+    wxColour GetColour();
+
+    // Overriden methods
+    virtual void Popup(wxWindow *focus, wxColourPicker *picker);
+    virtual void Dismiss();
+
+    // Events
+    void OnMouseMotion(wxMouseEvent& e);
+    void OnMouseDown(wxMouseEvent& e);
+    void OnMouseLeave(wxMouseEvent& e);
+    void OnPaint(wxPaintEvent& e);
+
+    DECLARE_EVENT_TABLE()
+};
+
+DECLARE_EVENT_TYPE(wxEVT_COMMAND_COLOUR_CHANGED, -1)
+
+typedef void (wxEvtHandler::*wxColourPickerEventFunction)(wxColourPickerEvent&);
+#define EVT_COLOUR_CHANGED(id,func)    \
+wx__DECLARE_EVT1(wxEVT_COMMAND_COLOUR_CHANGED, id, (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxColourPickerEventFunction, &func))
+
+#endif
diff --git a/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/fwProgressDialog.hpp b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/fwProgressDialog.hpp
new file mode 100644
index 0000000..0207337
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/include/fwGuiWx/widgets/fwProgressDialog.hpp
@@ -0,0 +1,177 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWGUIWX_FWPROGRESSDIALOG
+#define FWGUIWX_FWPROGRESSDIALOG
+
+#include <string>
+
+
+#include <wx/defs.h>
+#include <wx/progdlg.h>
+
+#if wxUSE_PROGRESSDLG
+
+#include <wx/dialog.h>
+
+#include "fwGuiWx/config.hpp"
+
+class wxButton;
+class wxGauge;
+class wxStaticText;
+
+/* Progress dialog without YieldFor. Copied and modifed from wxWidget2.9 */
+
+class  FWGUIWX_CLASS_API fwProgressDialog : public wxDialog
+{
+DECLARE_DYNAMIC_CLASS(fwProgressDialog)
+public:
+    /* Creates and displays dialog, disables event handling for other
+       frames or parent frame to avoid recursion problems.
+       @param title title for window
+       @param message message to display in window
+       @param maximum value for status bar, if <= 0, no bar is shown
+       @param parent window or NULL
+       @param style is the bit mask of wxPD_XXX constants from wx/defs.h
+    */
+    FWGUIWX_API fwProgressDialog(const wxString& title, const wxString& message,
+                     int maximum = 100,
+                     wxWindow *parent = NULL,
+                     int style = wxPD_APP_MODAL | wxPD_AUTO_HIDE);
+    /* Destructor.
+        Re-enables event handling for other windows.
+    */
+    FWGUIWX_API virtual ~fwProgressDialog();
+
+    /* Update the status bar to the new value.
+       @param value new value
+       @param newmsg if used, new message to display
+       @return true if ABORT button has not been pressed
+    */
+    FWGUIWX_API virtual bool Update(int value, const wxString& newmsg = wxEmptyString, bool *skip = NULL);
+
+    /* Switches the dialog to use a gauge in indeterminate mode and calls
+       wxGauge::Pulse() to show to the user a bit of progress */
+    FWGUIWX_API virtual bool Pulse(const wxString& newmsg = wxEmptyString, bool *skip = NULL);
+
+    // Must provide overload to avoid hiding it (and warnings about it)
+    FWGUIWX_API virtual void Update() { wxDialog::Update(); }
+
+    FWGUIWX_API virtual bool Show( bool show = true );
+
+    /* Can be called to continue after the cancel button has been pressed, but
+       the program decided to continue the operation (e.g., user didn't
+       confirm it)
+    */
+    FWGUIWX_API void Resume();
+
+    FWGUIWX_API int GetValue() const;
+    FWGUIWX_API int GetRange() const;
+    FWGUIWX_API wxString GetMessage() const;
+
+    // updates the label message
+    FWGUIWX_API void UpdateMessage(const wxString &newmsg);
+
+protected:
+    // callback for optional abort button
+    void OnCancel(wxCommandEvent&);
+
+    // callback for optional skip button
+    void OnSkip(wxCommandEvent&);
+
+    // callback to disable "hard" window closing
+    void OnClose(wxCloseEvent&);
+
+    // must be called to reenable the other windows temporarily disabled while
+    // the dialog was shown
+    void ReenableOtherWindows();
+
+private:
+    // create the label with given text and another one to show the time nearby
+    // as the next windows in the sizer, returns the created control
+    wxStaticText *CreateLabel(const wxString& text, wxSizer *sizer);
+
+
+
+    // common part of Update() and Pulse(), returns true if not cancelled
+    bool DoAfterUpdate(bool *skip);
+
+    // shortcuts for enabling buttons
+    void EnableClose();
+    void EnableSkip(bool enable = true);
+    void EnableAbort(bool enable = true);
+    void DisableSkip() { EnableSkip(false); }
+    void DisableAbort() { EnableAbort(false); }
+
+    // the widget displaying current status (may be NULL)
+    wxGauge *m_gauge;
+    // the message displayed
+    wxStaticText *m_msg;
+    // displayed elapsed, estimated, remaining time
+    wxStaticText *m_elapsed,
+                 *m_estimated,
+                 *m_remaining;
+    // time when the dialog was created
+    unsigned long m_timeStart;
+    // time when the dialog was closed or cancelled
+    unsigned long m_timeStop;
+    // time between the moment the dialog was closed/cancelled and resume
+    unsigned long m_break;
+
+    // parent top level window (may be NULL)
+    wxWindow *m_parentTop;
+
+    // continue processing or not (return value for Update())
+    enum
+    {
+        Uncancelable = -1,   // dialog can't be canceled
+        Canceled,            // can be cancelled and, in fact, was
+        Continue,            // can be cancelled but wasn't
+        Finished             // finished, waiting to be removed from screen
+    } m_state;
+
+    // skip some portion
+    bool m_skip;
+
+#if !defined(__SMARTPHONE__)
+    // the abort and skip buttons (or NULL if none)
+    wxButton *m_btnAbort;
+    wxButton *m_btnSkip;
+#endif
+
+    // the maximum value
+    int m_maximum;
+
+    // saves the time when elapsed time was updated so there is only one
+    // update per second
+    unsigned long m_last_timeupdate;
+    // tells how often a change of the estimated time has to be confirmed
+    // before it is actually displayed - this reduces the frequence of updates
+    // of estimated and remaining time
+    const int m_delay;
+    // counts the confirmations
+    int m_ctdelay;
+    unsigned long m_display_estimated;
+
+    bool m_hasAbortButton,
+         m_hasSkipButton;
+
+#if defined(__WXMSW__ ) || defined(__WXPM__)
+    // the factor we use to always keep the value in 16 bit range as the native
+    // control only supports ranges from 0 to 65,535
+    size_t m_factor;
+#endif // __WXMSW__
+
+    // for wxPD_APP_MODAL case
+    class WXDLLIMPEXP_FWD_CORE wxWindowDisabler *m_winDisabler;
+
+    DECLARE_EVENT_TABLE()
+    wxDECLARE_NO_COPY_CLASS(fwProgressDialog);
+};
+
+#endif // wxUSE_PROGRESSDLG
+
+#endif // FWGUIWX_FWPROGRESSDIALOG
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/ActionCallback.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/ActionCallback.cpp
new file mode 100644
index 0000000..9dc7464
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/ActionCallback.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiWx/ActionCallback.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::ActionCallback, ::fwGui::ActionCallbackBase::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+
+//-----------------------------------------------------------------------------
+
+ActionCallback::ActionCallback(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ActionCallback::~ActionCallback()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ActionCallback::executeWx(wxCommandEvent& event)
+{
+    this->check(event.IsChecked());
+    this->execute();
+}
+
+} // namespace fwGuiWx
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/App.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/App.cpp
new file mode 100644
index 0000000..69f5ad2
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/App.cpp
@@ -0,0 +1,315 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <assert.h>
+#include <iostream>
+#include <sstream>
+#include <locale.h>
+
+#include <wx/wx.h>
+#include <wx/cmdline.h>
+#include <wx/msgdlg.h>
+#include <wx/wxprec.h>
+#include <wx/filename.h>
+#include <wx/stdpaths.h>
+#include <wx/config.h>
+#include <wx/filefn.h>
+#include <wx/snglinst.h>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/tokenizer.hpp>
+
+#ifdef __MACOSX__
+#include <ApplicationServices/ApplicationServices.h>
+#endif
+
+#include <fwTools/Os.hpp>
+
+#include <fwRuntime/RuntimeException.hpp>
+
+#include <fwGuiWx/convert.hpp>
+#include <fwGuiWx/LoggerInitializer.hpp>
+
+#include <fwGui/dialog/MessageDialog.hpp>
+
+#include "fwGuiWx/App.hpp"
+
+namespace fwGuiWx
+{
+
+//-----------------------------------------------------------------------------
+
+App::App() : m_locale(0), m_checker(0)
+{
+    SetAppName( wxGetTranslation("launcher") );
+#ifdef __MACOSX__
+    ProcessSerialNumber PSN;
+    GetCurrentProcess(&PSN);
+    TransformProcessType(&PSN,kProcessTransformToForegroundApplication);
+#endif
+}
+
+//-----------------------------------------------------------------------------
+
+void App::usage( const std::string & mes ) const
+{
+    ::fwGui::dialog::MessageDialog messageBox;
+    messageBox.setTitle("Exception Caught");
+    messageBox.setMessage( mes );
+    messageBox.setIcon(::fwGui::dialog::IMessageDialog::CRITICAL);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+    messageBox.show();
+}
+
+//-----------------------------------------------------------------------------
+
+bool App::OnInit()
+{
+    ::fwGuiWx::LoggerInitializer::initialize();
+
+    setlocale(LC_ALL,"C"); // needed for mfo save process
+    std::string appName = "No name";
+    ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::profile::getCurrentProfile();
+    if (profile)
+    {
+        appName = profile->getName();
+    }
+
+#ifndef TDVPM_COMPLIANT
+    m_locale = new wxLocale();
+    ::boost::filesystem::path pathLauncher;
+	#ifdef SPECIALINSTALL
+		pathLauncher = SHAREPATH / "launcher_0-1" / "locale" ;
+	#else
+		pathLauncher = ::boost::filesystem::current_path() / "share" / "launcher_0-1" / "locale" ;
+	#endif
+
+    wxLocale::AddCatalogLookupPathPrefix( ::fwGuiWx::std2wx( pathLauncher.string() ));
+    m_locale->Init(GetUILanguage());
+    m_locale->AddCatalog(_T("launcher"));
+    m_locale->AddCatalog(_T("runtime"));
+    // Set the locale to C for all number of all application
+    setlocale(LC_NUMERIC,"C");
+#else
+    setlocale(LC_ALL,"C");
+#endif
+
+    wxApp::OnInit();
+
+#ifndef TDVPM_COMPLIANT
+    m_locale->AddCatalog(::fwGuiWx::std2wx(appName), wxLANGUAGE_FRENCH, _T("utf-8"));
+#endif
+    SetAppName( ::fwGuiWx::std2wx(appName) );
+
+    std::string checkerPath = ::fwTools::os::getUserDataDir("IRCAD", appName, true);
+
+    if (checkerPath.empty())
+    {
+        checkerPath = ::fwTools::os::getUserDataDir("IRCAD", "", true);
+    }
+    if (checkerPath.empty())
+    {
+        checkerPath = ::fwTools::os::getUserDataDir("", "", true);
+    }
+    SLM_ASSERT("Unable to find user's data dir.", !checkerPath.empty());
+
+    m_checker = new wxSingleInstanceChecker();
+    if (profile && profile->getCheckSingleInstance())
+    {
+        m_checker->Create( ::fwGuiWx::std2wx(appName) + wxGetTranslation(".pid"), ::fwGuiWx::std2wx(checkerPath));
+        if ( m_checker->IsAnotherRunning() )
+        {
+            wxLogError(wxGetTranslation("Another " + ::fwGuiWx::std2wx(appName) + wxGetTranslation(" instance is already running, aborting.")));
+            return false;
+        }
+    }
+
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+
+int App::OnExit()
+{
+    SLM_TRACE_FUNC();
+    delete m_checker;
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+static const wxCmdLineEntryDesc cmdLineDesc[] =
+{
+        { wxCMD_LINE_OPTION, "p", "profile", "path to the profile to launch",wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
+        { wxCMD_LINE_OPTION, "s", "substitute", "substitute parameters : name1 at value1@name2 at value2...", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL },
+        { wxCMD_LINE_PARAM, NULL, NULL, "old style parameters", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL },
+        { wxCMD_LINE_NONE }
+};
+
+//-----------------------------------------------------------------------------
+
+void App::OnInitCmdLine(wxCmdLineParser & parser)
+{
+    wxApp::OnInitCmdLine(parser);
+    parser.SetDesc(cmdLineDesc);
+}
+
+//-----------------------------------------------------------------------------
+
+void App::OnUnhandledException()
+{
+    // we're called from an exception handler so we can re-throw the exception
+    // to recover its type
+    std::string what;
+    try
+    {
+        throw;
+    }
+    catch ( std::exception& e )
+    {
+        what = e.what();
+    }
+    catch ( ... )
+    {
+        what = "unknown exception";
+    }
+
+    ::fwGui::dialog::MessageDialog messageBox;
+    messageBox.setTitle("Exception Caught");
+    messageBox.setMessage( what );
+    messageBox.setIcon(::fwGui::dialog::IMessageDialog::CRITICAL);
+    messageBox.addButton(::fwGui::dialog::IMessageDialog::OK);
+    messageBox.show();
+
+    throw ::fwRuntime::RuntimeException( what );
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef __WXMAC__
+void App::MacOpenFile (  const wxString & fileName)
+{
+    SLM_TRACE("MacOpenFile");
+    eventMac(fileName);
+}
+
+//-----------------------------------------------------------------------------
+
+void App::MacNewFile (  const wxString & fileName)
+{
+    SLM_TRACE("MacNewFile");
+    eventMac(fileName);
+}
+
+//-----------------------------------------------------------------------------
+
+void App::MacReopenApp (  const wxString & fileName)
+{
+    SLM_TRACE("MacReopenApp");
+    eventMac(fileName);
+}
+
+//-----------------------------------------------------------------------------
+
+void App::eventMac(const wxString & fileName)
+{
+    wxCommandEvent tEvent(wxEventFwOpen, wxIDEventFwOpen);
+    tEvent.SetString( fileName );
+    tEvent.SetEventObject( this );
+    wxFrame *frame = wxDynamicCast( wxTheApp->GetTopWindow() , wxFrame ) ;
+    if (frame != NULL)
+        frame->GetEventHandler()->ProcessEvent( tEvent );
+    else
+        SLM_FATAL ("Window not found !");
+}
+
+#endif
+
+} // namespace fwGuiWx
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+
+#if NEED_CHOOSELANG_UI
+static void SaveUILanguage(wxLanguage lang)
+{
+    if (lang == wxLANGUAGE_UNKNOWN)
+        return;
+    if (lang == wxLANGUAGE_DEFAULT)
+        wxConfig::Get()->Write(_T("ui_language"), _T("default"));
+    else
+        wxConfig::Get()->Write(_T("ui_language"),
+                wxLocale::GetLanguageInfo(lang)->CanonicalName);
+}
+#endif // NEED_CHOOSELANG_UI
+
+//-----------------------------------------------------------------------------
+
+wxLanguage GetUILanguage()
+{
+#if !NEED_CHOOSELANG_UI
+    return wxLANGUAGE_DEFAULT;
+#else
+    wxLanguage lang(wxLANGUAGE_DEFAULT);
+    wxString lng = wxConfig::Get()->Read(_T("ui_language"));
+    if (lng.empty())
+    {
+        lang = ChooseLanguage();
+        if (lang != wxLANGUAGE_UNKNOWN)
+            SaveUILanguage(lang);
+        else
+            lang = wxLANGUAGE_DEFAULT;
+    }
+    else if (lng != _T("default"))
+    {
+        const wxLanguageInfo *info = wxLocale::FindLanguageInfo(lng);
+        if (info != NULL)
+            lang = (wxLanguage)info->Language;
+        else
+            wxLogError(wxGetTranslation("Uknown locale code '%s' in registry."), lng.c_str());
+    }
+    return lang;
+#endif // NEED_CHOOSELANG_UI
+}
+
+//-----------------------------------------------------------------------------
+
+#if NEED_CHOOSELANG_UI
+wxLanguage ChooseLanguage()
+{
+    struct LangInfo
+    {
+        const wxChar *name;
+        wxLanguage code;
+    };
+
+    LangInfo langs[] =
+    {
+            { wxGetTranslation("(Use default language)"), wxLANGUAGE_DEFAULT },
+
+            { _T("English"), wxLANGUAGE_ENGLISH },
+            { _T("French"), wxLANGUAGE_FRENCH },
+
+            { NULL, wxLANGUAGE_UNKNOWN }
+    };
+
+    wxArrayString arr;
+    for (int i = 0; langs[i].name; i++)
+        arr.Add(langs[i].name);
+
+    int choice = wxGetSingleChoiceIndex(
+            wxGetTranslation("Select your prefered language"),
+            wxGetTranslation("Language selection"),
+            arr);
+    if (choice == -1)
+        return wxLANGUAGE_UNKNOWN;
+    else
+        return langs[choice].code;
+}
+#endif // NEED_CHOOSELANG_UI
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/Application.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/Application.cpp
new file mode 100644
index 0000000..b8621dd
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/Application.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiWx/Application.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::Application, ::fwGui::IApplication::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+//-----------------------------------------------------------------------------
+
+void Application::exit(int returncode)
+{
+    SLM_WARN_IF("returncode is actually ignored in fwGuiWx", returncode != 0);
+    wxExit();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGuiWx
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/Cursor.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/Cursor.cpp
new file mode 100644
index 0000000..fe7f5d7
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/Cursor.cpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/utils.h>
+#include <wx/cursor.h>
+
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/Cursor.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::Cursor, ::fwGui::ICursor::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+//-----------------------------------------------------------------------------
+
+Cursor::Cursor(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+Cursor::~Cursor()
+{}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setCursor( ::fwGui::ICursor::CursorType cursor)
+{
+    if (cursor == ICursor::DEFAULT)
+    {
+        this->setDefaultCursor();
+    }
+    else if (cursor == ICursor::BUSY)
+    {
+        wxBeginBusyCursor(wxHOURGLASS_CURSOR);
+    }
+    else if (cursor == ICursor::WAIT)
+    {
+        wxBeginBusyCursor(new wxCursor(wxCURSOR_WAIT));
+    }
+    else if (cursor == ICursor::CROSS)
+    {
+        wxBeginBusyCursor(new wxCursor(wxCURSOR_CROSS));
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Cursor::setDefaultCursor()
+{
+    wxEndBusyCursor();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGuiWx
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/LoggerInitializer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/LoggerInitializer.cpp
new file mode 100644
index 0000000..85596ce
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/LoggerInitializer.cpp
@@ -0,0 +1,128 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/log.h>
+#include <wx/version.h>
+
+#include <fwCore/base.hpp>
+
+#include "fwGuiWx/LoggerInitializer.hpp"
+#include "fwGuiWx/convert.hpp"
+
+//------------------------------------------------------------------------------
+
+namespace fwGuiWx
+{
+
+class fwGuiWxLog : public wxLog
+{
+public:
+    fwGuiWxLog(){};
+    virtual ~fwGuiWxLog(){};
+
+protected:
+#if wxCHECK_VERSION(2, 9, 1)
+    virtual void DoLogRecord(wxLogLevel level, const wxString & msg, const wxLogRecordInfo & info);
+#else
+    virtual void DoLog(wxLogLevel level, const wxString& szString, time_t t);
+#endif
+
+};
+
+//------------------------------------------------------------------------------
+
+#if wxCHECK_VERSION(2, 9, 1)
+void fwGuiWxLog::DoLogRecord(wxLogLevel level, const wxString& szString, const wxLogRecordInfo & info)
+#else
+void fwGuiWxLog::DoLog(wxLogLevel level, const wxString& szString, time_t t)
+#endif
+{
+    wxString logLevel;
+
+    switch ( level )
+    {
+        case wxLOG_FatalError:
+            logLevel = wxT("FatalError: ");
+            break;
+        case wxLOG_Error:
+            logLevel = wxT("Error: ");
+            break;
+        case wxLOG_Status:
+            logLevel = wxT("Status: ");
+            break;
+        case wxLOG_Warning:
+            logLevel = wxT("Warning: ");
+            break;
+        case wxLOG_Info:
+            logLevel = wxT("Info: ");
+            break;
+        case wxLOG_Message:
+            logLevel = wxT("Message: ");
+            break;
+
+        default:
+            logLevel = wxT("Unknown log level: ");
+            break;
+#if wxUSE_LOG_TRACE
+        case wxLOG_Trace:
+            logLevel = wxT("Trace: ");
+            break;
+#endif
+#if wxUSE_LOG_DEBUG
+        case wxLOG_Debug:
+            logLevel = wxT("Debug: ");
+            break;
+#endif
+    }
+
+    wxString timestamp;
+    this->TimeStamp(&timestamp);
+    std::string msg = "[WX]: " + wx2std(timestamp +": "+ logLevel + szString);
+    SLM_WARN(msg);
+
+    switch ( level )
+    {
+#if wxCHECK_VERSION(2, 9, 1)
+        case wxLOG_FatalError:
+            wxLog::DoLogRecord(level, szString, info);
+            break;
+        case wxLOG_Error:
+            wxLog::DoLogRecord(level, szString, info);
+            break;
+        case wxLOG_Status:
+            wxLog::DoLogRecord(level, szString, info);
+            break;
+#else
+        case wxLOG_FatalError:
+            wxLog::DoLog(level, szString, t);
+            break;
+        case wxLOG_Error:
+            wxLog::DoLog(level, szString, t);
+            break;
+        case wxLOG_Status:
+            wxLog::DoLog(level, szString, t);
+            break;
+#endif
+    }
+}
+
+//------------------------------------------------------------------------------
+
+LoggerInitializer::LoggerInitializer()
+{
+    delete wxLog::SetActiveTarget(new fwGuiWxLog);
+}
+
+//------------------------------------------------------------------------------
+
+void LoggerInitializer::initialize()
+{
+    WPTR(LoggerInitializer) reg = SPTR(LoggerInitializer)(new LoggerInitializer) ;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/Shortcut.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/Shortcut.cpp
new file mode 100644
index 0000000..4629ac1
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/Shortcut.cpp
@@ -0,0 +1,358 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <cassert>
+#include <iostream>
+#include <sstream>
+
+#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <wx/wx.h>
+#include <wx/version.h>
+#include <wx/accel.h>
+
+#include "fwGuiWx/Shortcut.hpp"
+
+namespace fwGuiWx
+{
+
+namespace
+{
+    /**
+     * @brief   Defines the character separator type for the shortcut definition string tokenizer.
+     */
+    typedef ::boost::char_separator< char >         char_separator;
+
+    /**
+     * @brief   Defines the tokenizer that will be used to split a shortcut definition string.
+     */
+    typedef ::boost::tokenizer< char_separator >    tokenizer;
+
+
+    /**
+     * @name    Modifier & Key Lexial Values
+     */
+    //@{
+
+    const std::string ALT       ( "Alt"     );  ///< alt modifier
+    const std::string CTRL      ( "Ctrl"    );  ///< control modifier
+    const std::string SHIFT     ( "Shift"   );  ///< shift modifier
+
+    const std::string UP        ( "Up"      );  ///< up arrow
+    const std::string RIGHT     ( "Right"   );  ///< right arrow
+    const std::string DOWN      ( "Down"    );  ///< down arrow
+    const std::string LEFT      ( "Left"    );  ///< left arrow
+
+    const std::string INSERT    ( "Insert"  );  ///< insert key
+    const std::string DEL       ( "Delete"  );  ///< delete key (VC cl7.1 does not support a variable named DELETE, so using DEL instead).
+    const std::string HOME      ( "Home"    );  ///< home key
+    const std::string END       ( "End"     );  ///< end key
+    const std::string RETURN    ( "Return"  );  ///< return key
+    const std::string PAGEUP    ( "Pageup"  );  ///< pageup key
+    const std::string PAGEDOWN  ( "Pagedown");  ///< page down key
+
+    const std::string F1        ( "F1"      );  ///< F1  key
+    const std::string F2        ( "F2"      );  ///< F2  key
+    const std::string F3        ( "F3"      );  ///< F3  key
+    const std::string F4        ( "F4"      );  ///< F4  key
+    const std::string F5        ( "F5"      );  ///< F5  key
+    const std::string F6        ( "F6"      );  ///< F6  key
+    const std::string F7        ( "F7"      );  ///< F7  key
+    const std::string F8        ( "F8"      );  ///< F8  key
+    const std::string F9        ( "F9"      );  ///< F9  key
+    const std::string F10       ( "F10"     );  ///< F10 key
+    const std::string F11       ( "F11"     );  ///< F11 key
+    const std::string F12       ( "F12"     );  ///< F12 key
+
+    //@}
+
+
+    /**
+     * @brief   Updates the case of the given string so it conforms to internal
+     *          specifications.
+     *
+     * The case updates consist in having the first character in upper case
+     * and all others in lower case.
+     *
+     * @param   source  a string to transform
+     *
+     * @return  the string with updated case
+     */
+    std::string adaptCase( const std::string &source )
+    {
+        typedef std::pair< std::string::iterator, std::string::iterator > ItPair;
+
+        std::string result( source );
+
+        if( result.length() >= 1 )
+        {
+            std::string::iterator   begin   ( result.begin()    );
+            std::string::iterator   end     ( begin + 1         );
+            ItPair                  range   ( begin, end        );
+
+            ::boost::algorithm::to_upper( range );
+        }
+
+        if( result.length() >= 2 )
+        {
+
+            std::string::iterator   begin   ( result.begin() + 1    );
+            std::string::iterator   end     ( result.end()          );
+            ItPair                  range   ( begin, end            );
+
+            ::boost::algorithm::to_lower( range );
+        }
+
+        return result;
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+Shortcut::Shortcut( const int modifiers, const int keyCode )
+:   m_modifiers ( modifiers     ),
+    m_keyCode   ( keyCode       )
+{}
+
+//-----------------------------------------------------------------------------
+
+Shortcut::Shortcut( const std::string & definition )
+:   m_modifiers ( getModifiersFromString(definition)    ),
+    m_keyCode   ( getKeyCodeFromString(definition)      )
+{}
+
+//-----------------------------------------------------------------------------
+
+const int Shortcut::getModifiers() const
+{
+    return m_modifiers;
+}
+
+//-----------------------------------------------------------------------------
+
+const int Shortcut::getKeyCode() const
+{
+    return m_keyCode;
+}
+
+//-----------------------------------------------------------------------------
+
+const int Shortcut::getModifiersFromString( const std::string & shortcut )
+{
+    int modifiers = 0;
+
+    // Walks trough the tokens of the shortcut definition.
+    tokenizer   tokens( shortcut, char_separator("+ ") );
+    for( tokenizer::iterator i = tokens.begin(); i != tokens.end(); ++i )
+    {
+        // Retrieves the current token.
+        std::string token( adaptCase(*i) );
+
+        // Determines the current token's matching modifier.
+        if( token == ALT )
+        {
+            modifiers |= wxACCEL_ALT;
+        }
+        else if( token == CTRL )
+        {
+            modifiers |= wxACCEL_CTRL;
+        }
+        else if( token == SHIFT )
+        {
+            modifiers |= wxACCEL_SHIFT;
+        }
+    }
+
+    return modifiers;
+}
+
+//-----------------------------------------------------------------------------
+
+const int Shortcut::getKeyCodeFromString( const std::string & shortcut )
+{
+    int keyCode = 0;
+
+    // Walks trough the tokens of the shortcut definition.
+    tokenizer   tokens( shortcut, char_separator("+ ") );
+    for( tokenizer::iterator i = tokens.begin(); i != tokens.end() && keyCode == 0; ++i )
+    {
+        // Retrieves the current token.
+        std::string token( adaptCase(*i) );
+
+        // If the current token is not a modifier, than get its key code.
+        if( token != ALT && token != CTRL && token != SHIFT )
+        {
+            // @todo missing non-ascii key code to be added
+            if      ( token == INSERT   )   keyCode = WXK_INSERT;
+            else if ( token == DEL      )   keyCode = WXK_DELETE;
+            else if ( token == HOME     )   keyCode = WXK_HOME;
+            else if ( token == END      )   keyCode = WXK_END;
+            else if ( token == RETURN   )   keyCode = WXK_RETURN;
+#if wxCHECK_VERSION(2, 9, 0)
+            else if ( token == PAGEUP   )   keyCode = WXK_PAGEUP;
+            else if ( token == PAGEDOWN )   keyCode = WXK_PAGEDOWN;
+#else
+            else if ( token == PAGEUP   )   keyCode = WXK_PRIOR;
+            else if ( token == PAGEDOWN )   keyCode = WXK_NEXT;
+#endif
+            else if ( token == UP       )   keyCode = WXK_UP;
+            else if ( token == RIGHT    )   keyCode = WXK_RIGHT;
+            else if ( token == DOWN     )   keyCode = WXK_DOWN;
+            else if ( token == LEFT     )   keyCode = WXK_LEFT;
+            else if ( token == F1       )   keyCode = WXK_F1;
+            else if ( token == F2       )   keyCode = WXK_F2;
+            else if ( token == F3       )   keyCode = WXK_F3;
+            else if ( token == F4       )   keyCode = WXK_F4;
+            else if ( token == F5       )   keyCode = WXK_F5;
+            else if ( token == F6       )   keyCode = WXK_F6;
+            else if ( token == F7       )   keyCode = WXK_F7;
+            else if ( token == F8       )   keyCode = WXK_F8;
+            else if ( token == F9       )   keyCode = WXK_F9;
+            else if ( token == F10      )   keyCode = WXK_F10;
+            else if ( token == F11      )   keyCode = WXK_F11;
+            else if ( token == F12      )   keyCode = WXK_F12;
+            else                            keyCode = (int) token[0];
+        }
+    }
+
+    return keyCode;
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string Shortcut::getString( const int modifiers, const int keyCode )
+{
+    const std::string   modifiersString ( getStringFromModifiers( modifiers )   );
+    const std::string   keyCodeString   ( getStringFromKeyCode( keyCode )       );
+
+    if( modifiersString.empty() == false && keyCodeString.empty() == false )
+    {
+        return modifiersString + "+" + keyCodeString;
+    }
+    else
+    {
+        return modifiersString + keyCodeString;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string Shortcut::getStringFromModifiers( const int modifiers )
+{
+    std::ostringstream  buffer;
+    bool                putDelimiter( false );
+
+    if( modifiers & wxACCEL_CTRL )
+    {
+        buffer << CTRL;
+        putDelimiter = true;
+    }
+    if( modifiers & wxACCEL_ALT )
+    {
+        if( putDelimiter )
+        {
+            buffer << std::string("+");
+        }
+        buffer << ALT;
+        putDelimiter = true;
+    }
+    if( modifiers & wxACCEL_SHIFT )
+    {
+        if( putDelimiter )
+        {
+            buffer << std::string("+");
+        }
+        buffer << SHIFT;
+    }
+
+    return buffer.str();
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string Shortcut::getStringFromKeyCode( const int keyCode )
+{
+    std::string result;
+
+    switch( keyCode )
+    {
+    // @todo missing non-ascii key code to be added
+    case WXK_INSERT:    result = INSERT;    break;
+    case WXK_DELETE:    result = DEL;       break;
+    case WXK_HOME:      result = HOME;      break;
+    case WXK_END:       result = END;       break;
+    case WXK_RETURN:    result = RETURN;    break;
+#if wxCHECK_VERSION(2, 9, 0)
+    case WXK_PAGEUP:        result = PAGEUP;    break;
+    case WXK_PAGEDOWN:      result = PAGEDOWN;  break;
+#else
+    case WXK_PRIOR:     result = PAGEUP;    break;
+    case WXK_NEXT:      result = PAGEDOWN;  break;
+#endif
+    case WXK_UP:        result = UP;        break;
+    case WXK_RIGHT:     result = RIGHT;     break;
+    case WXK_DOWN:      result = DOWN;      break;
+    case WXK_LEFT:      result = LEFT;      break;
+    case WXK_F1:        result = F1;        break;
+    case WXK_F2:        result = F2;        break;
+    case WXK_F3:        result = F3;        break;
+    case WXK_F4:        result = F4;        break;
+    case WXK_F5:        result = F5;        break;
+    case WXK_F6:        result = F6;        break;
+    case WXK_F7:        result = F7;        break;
+    case WXK_F8:        result = F8;        break;
+    case WXK_F9:        result = F9;        break;
+    case WXK_F10:       result = F10;       break;
+    case WXK_F11:       result = F11;       break;
+    case WXK_F12:       result = F12;       break;
+    default:            result = keyCode;   break;
+    }
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+void Shortcut::set( const std::string & definition )
+{
+    m_modifiers = getModifiersFromString( definition );
+    m_keyCode   = getKeyCodeFromString( definition );
+}
+
+//-----------------------------------------------------------------------------
+
+Shortcut & Shortcut::operator= ( const std::string & definition )
+{
+    set( definition );
+    return *this;
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string Shortcut::toString() const
+{
+    const std::string   modifiers   ( getStringFromModifiers( m_modifiers ) );
+    const std::string   keyCode     ( getStringFromKeyCode(m_keyCode )      );
+
+    if( modifiers.empty() == false && keyCode.empty() == false )
+    {
+        return modifiers + "+" + keyCode;
+    }
+    else
+    {
+        return modifiers + keyCode;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+Shortcut::operator std::string () const
+{
+    return toString();
+}
+
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/WorkerWx.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/WorkerWx.cpp
new file mode 100644
index 0000000..2b92476
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/WorkerWx.cpp
@@ -0,0 +1,370 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+#include <boost/thread.hpp>
+#include <boost/thread/once.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <wx/wx.h>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/Timer.hpp>
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include "fwGuiWx/App.hpp"
+#include "fwGuiWx/WorkerWx.hpp"
+
+namespace fwGuiWx
+{
+class WorkerWxTask;
+
+wxDEFINE_EVENT(MESSAGE_EVENT, WorkerWxTask);
+
+// Create a new application object
+IMPLEMENT_APP_NO_MAIN(::fwGuiWx::App);
+
+class WorkerWxTask : public wxEvent
+{
+public:
+
+    WorkerWxTask( const ::fwThread::Worker::TaskType &handler ) :
+        wxEvent( 0, MESSAGE_EVENT ),
+        m_handler(handler)
+    {
+        SLM_ASSERT( "wxApplication should be instantiated", wxTheApp );
+    }
+
+    /// Copy constructor.
+    WorkerWxTask(const WorkerWxTask& workerTask) :
+        wxEvent( 0, MESSAGE_EVENT ),
+        m_handler(workerTask.m_handler)
+    {}
+
+    ~WorkerWxTask()
+    {}
+
+    void process()
+    {
+        m_handler();
+    }
+
+    // implement the base class pure virtual
+    virtual wxEvent *Clone() const
+    {
+        return new WorkerWxTask(*this);
+    }
+
+protected:
+    ::fwThread::Worker::TaskType m_handler;
+};
+
+
+/**
+ * @brief Private implementation of fwThread::Worker using boost::asio.
+ */
+class WorkerWx : public ::fwThread::Worker
+{
+public:
+    typedef ::boost::thread ThreadType;
+
+    WorkerWx();
+
+    void init( int &argc, char **argv );
+
+    void onExit();
+
+    virtual ~WorkerWx();
+
+    void stop();
+
+    void post(TaskType handler);
+
+    ::fwThread::Worker::FutureType getFuture();
+
+    virtual ::fwThread::ThreadIdType getThreadId() const;
+
+    void onMessage(WorkerWxTask &event);
+
+    virtual void processTasks();
+
+    virtual void processTasks(PeriodType maxtime);
+
+protected:
+
+    SPTR(::fwThread::Timer) createTimer();
+
+    /// Copy constructor forbidden
+    WorkerWx( const WorkerWx& );
+
+    /// Copy operator forbidden
+    WorkerWx& operator=( const WorkerWx& );
+
+    ::fwThread::ThreadIdType m_threadId;
+
+    ::boost::function1< void, WorkerWxTask& > m_onMessageHandler;
+};
+
+
+struct FWGUIWX_CLASS_API WorkerWxInstanciator
+{
+    FWGUIWX_API WorkerWxInstanciator(bool reg = true) :
+        m_wxWorker(::boost::make_shared< WorkerWx >())
+    {
+        m_wxWorker->init( ::boost::ref(s_argc), s_argv);
+
+        if(reg)
+        {
+            ::fwServices::registry::ActiveWorkers::getDefault()
+                ->addWorker(::fwServices::registry::ActiveWorkers::s_DEFAULT_WORKER, m_wxWorker);
+        }
+    }
+
+    FWGUIWX_API SPTR(::fwThread::Worker) getWorker();
+
+    SPTR(WorkerWx) m_wxWorker;
+
+    FWGUIWX_API static int    s_argc;
+    FWGUIWX_API static char **s_argv;
+};
+
+int WorkerWxInstanciator::s_argc = 0 ;
+char** WorkerWxInstanciator::s_argv = NULL;
+
+
+SPTR(::fwThread::Worker) WorkerWxInstanciator::getWorker()
+{
+    return m_wxWorker;
+}
+
+::fwThread::Worker::sptr getWxWorker( int &argc, char **argv )
+{
+
+    WorkerWxInstanciator::s_argc = argc;
+    WorkerWxInstanciator::s_argv = argv;
+
+    typedef ::fwCore::util::LazyInstantiator< WorkerWxInstanciator, WorkerWxInstanciator > InstantiatorType;
+
+    SPTR(WorkerWxInstanciator) instanciator = InstantiatorType::getInstance();
+
+#ifdef _DEBUG
+    {
+        static ::boost::mutex mutex;
+        ::boost::mutex::scoped_lock scoped_lock(mutex);
+        static bool initialized = false;
+        SLM_ASSERT("getWxWorker(argc, argv) shall be called only once", !initialized);
+        initialized = true;
+    }
+#endif
+
+
+    return instanciator->m_wxWorker;
+}
+
+
+//------------------------------------------------------------------------------
+
+
+/**
+ * @class TimerWx
+ * @brief Private Timer implementation using Wx.
+ *
+ * 
+ * @date   2012.
+ */
+class TimerWx : public ::fwThread::Timer
+{
+public:
+    /**
+     * @brief Constructs a TimerWx from given io_service.
+     */
+    TimerWx();
+
+    ~TimerWx();
+
+    /// Starts or restarts the timer.
+    void start();
+
+    /// Stops the timer and cancel all pending operations.
+    void stop();
+
+    /// Sets time duration.
+    void setDuration(TimeDurationType duration);
+
+    /// Returns if the timer mode is 'one shot'.
+    bool isOneShot() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_timerWx->IsOneShot();
+    }
+
+    /// Sets timer mode.
+    void setOneShot(bool oneShot)
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        m_isOneShot = oneShot;
+    }
+
+    /// Returns true if the timer is currently running.
+    bool isRunning() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_timerWx->IsRunning();
+    }
+
+protected:
+
+    void call(wxTimerEvent& event);
+
+    /// Copy constructor forbidden.
+    TimerWx( const TimerWx& );
+
+    /// Copy operator forbidden.
+    TimerWx& operator=( const TimerWx& );
+
+    SPTR(wxTimer) m_timerWx;
+    bool m_isOneShot;
+    TimeDurationType m_duration;
+};
+
+//------------------------------------------------------------------------------
+
+
+// ---------- WorkerWx private implementation ----------
+
+WorkerWx::WorkerWx() :
+    m_threadId( ::fwThread::getCurrentThreadId() )
+{
+}
+
+void WorkerWx::init( int &argc, char **argv )
+{
+    OSLM_TRACE("Init Wx" << ::fwThread::getCurrentThreadId() <<" Start");
+    wxEntryStart( argc, argv ) ;
+    wxTheApp->OnInit();
+    m_onMessageHandler = ::boost::bind( &WorkerWx::onMessage, this, _1 );
+    wxTheApp->Bind( MESSAGE_EVENT, m_onMessageHandler );
+    OSLM_TRACE("Init Wx" << ::fwThread::getCurrentThreadId() <<" Finish");
+}
+
+WorkerWx::~WorkerWx()
+{
+    this->stop();
+    wxEntryCleanup();
+}
+
+int onRun()
+{
+    SLM_ASSERT("wxTheApp not initialized", wxTheApp);
+    return wxTheApp->OnRun();
+}
+
+::fwThread::Worker::FutureType WorkerWx::getFuture()
+{
+    if (! m_future.valid() )
+    {
+        SLM_ASSERT("WorkerWx loop shall be created and ran from main thread ",
+            ! m_future.valid() && ::fwThread::getCurrentThreadId() == this->getThreadId() );
+
+        ::boost::packaged_task< ExitReturnType > task( ::boost::bind(&onRun) );
+        ::boost::future< ExitReturnType > ufuture = task.get_future();
+        m_future = ::boost::move(ufuture);
+        task();
+    }
+    return m_future;
+}
+
+::fwThread::ThreadIdType WorkerWx::getThreadId() const
+{
+    return m_threadId;
+}
+
+void WorkerWx::onExit()
+{
+    wxTheApp->Unbind( MESSAGE_EVENT, m_onMessageHandler );
+    wxTheApp->ExitMainLoop();
+    wxTheApp->OnExit();
+}
+
+void WorkerWx::stop()
+{
+    this->postTask<void>(::boost::bind( &WorkerWx::onExit, this)).wait();
+}
+
+SPTR(::fwThread::Timer) WorkerWx::createTimer()
+{
+    return ::boost::make_shared< TimerWx >();
+}
+
+void WorkerWx::post(TaskType handler)
+{
+    wxTheApp->AddPendingEvent( WorkerWxTask(handler) );
+}
+
+void WorkerWx::onMessage(WorkerWxTask &event)
+{
+    event.process();
+    event.Skip(true);
+    event.StopPropagation();
+}
+
+void WorkerWx::processTasks()
+{
+    SLM_FATAL("ProcessTasks not yet implemented in WorkerWx");
+}
+
+void WorkerWx::processTasks(PeriodType maxtime)
+{
+    FwCoreNotUsedMacro(maxtime);
+    SLM_FATAL("ProcessTasks not yet implemented in WorkerWx");
+}
+
+// ---------- Timer private implementation ----------
+
+TimerWx::TimerWx() :
+    m_timerWx( new wxTimer(wxTheApp) ), m_isOneShot(false)
+{
+    wxTheApp->Bind(wxEVT_TIMER, &TimerWx::call, this, m_timerWx->GetId());
+}
+
+TimerWx::~TimerWx()
+{
+    wxTheApp->Unbind(wxEVT_TIMER, &TimerWx::call, this, m_timerWx->GetId());
+    m_timerWx->Stop();
+}
+
+void TimerWx::setDuration(TimeDurationType duration)
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_duration = duration;
+}
+
+void TimerWx::start()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_timerWx->Start( 
+                ::boost::chrono::duration_cast< ::boost::chrono::milliseconds >(m_duration).count(), 
+                m_isOneShot);
+}
+
+void TimerWx::stop()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_timerWx->Stop();
+}
+
+void TimerWx::call(wxTimerEvent& event)
+{
+    m_function();
+}
+
+
+} //namespace fwGuiWx
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ContainerBuilder.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ContainerBuilder.cpp
new file mode 100644
index 0000000..6a98993
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ContainerBuilder.cpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/sizer.h>
+#include <wx/panel.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/builder/ContainerBuilder.hpp"
+
+
+
+fwGuiRegisterMacro( ::fwGui::builder::ContainerBuilder, ::fwGui::builder::IContainerBuilder::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+ContainerBuilder::ContainerBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ContainerBuilder::~ContainerBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::createContainer( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+
+    ::fwGuiWx::container::WxContainer::sptr wxContainer = ::fwGuiWx::container::WxContainer::New();
+    wxWindow *wxParent = m_parent->getWxContainer();
+    wxPanel *panel = new wxPanel(wxParent, wxNewId());
+    wxContainer->setWxContainer(panel);
+
+    wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
+
+    SLM_ASSERT("Sorry, the parent container has already a layout", !wxParent->GetSizer());
+    wxParent->SetSizer(boxSizer);
+    boxSizer->Add(panel, 1, wxALL|wxEXPAND);
+    wxParent->Layout();
+
+    m_container = wxContainer;
+}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::destroyContainer()
+{
+    SLM_ASSERT("Sorry, Container not initialized", m_container);
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+
+    m_container->destroyContainer();
+    m_parent->clean();
+}
+
+//-----------------------------------------------------------------------------
+
+void ContainerBuilder::setParent(::fwGui::container::fwContainer::sptr parent)
+{
+    SLM_ASSERT("Sorry, WxContainer not yet initialized, cleaning impossible", m_container);
+    ::fwGuiWx::container::WxContainer::sptr parentContainer = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to WxContainer failed", parentContainer);
+    ::fwGuiWx::container::WxContainer::sptr container = ::fwGuiWx::container::WxContainer::dynamicCast(m_container);
+    SLM_ASSERT("dynamicCast fwContainer to WxContainer failed", container);
+
+    wxWindow *wxContainer = container->getWxContainer();
+    SLM_ASSERT("Sorry, WxContainer not yet initialized", wxContainer);
+    wxWindow *wxParent = parentContainer->getWxContainer();
+    SLM_ASSERT("Sorry, parent WxContainer not yet initialized", wxParent);
+
+    if(wxParent != m_parent->getWxContainer() )
+    {
+        if(!wxParent->GetSizer())
+        {
+            SLM_TRACE("New parent container hasn't layout");
+
+            wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
+            wxParent->SetSizer(boxSizer);
+        }
+        wxContainer->Reparent(wxParent);
+        wxWindow *oldWxParent = m_parent->getWxContainer() ;
+
+        oldWxParent->GetSizer()->Detach(wxContainer);
+        wxParent->GetSizer()->Add(wxContainer, 1, wxALL|wxEXPAND);
+
+        wxParent->Layout();
+        wxContainer->Layout();
+
+        m_parent = parentContainer;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/MenuBarBuilder.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/MenuBarBuilder.cpp
new file mode 100644
index 0000000..1992b92
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/MenuBarBuilder.cpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/frame.h>
+#include <wx/menu.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/container/WxMenuBarContainer.hpp"
+#include "fwGuiWx/builder/MenuBarBuilder.hpp"
+
+fwGuiRegisterMacro( ::fwGui::builder::MenuBarBuilder, ::fwGui::builder::IMenuBarBuilder::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+MenuBarBuilder::MenuBarBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuBarBuilder::~MenuBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarBuilder::createMenuBar( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+    wxFrame *frame = wxDynamicCast( m_parent->getWxContainer() , wxFrame ) ;
+    SLM_ASSERT("Sorry, the parent container must be a wxFrame", frame ) ;
+    if (frame)
+    {
+        ::fwGuiWx::container::WxMenuBarContainer::sptr menuBarContainer = ::fwGuiWx::container::WxMenuBarContainer::New();
+        wxMenuBar *menuBar = new wxMenuBar();
+        menuBarContainer->setWxMenuBar(menuBar);
+        frame->SetMenuBar( menuBar );
+        this->m_menuBar = menuBarContainer;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarBuilder::destroyMenuBar()
+{
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+    wxFrame *frame = wxDynamicCast( m_parent->getWxContainer() , wxFrame ) ;
+    SLM_ASSERT("Sorry, the parent container must be a wxFrame", frame ) ;
+    if (frame)
+    {
+        frame->SetMenuBar( NULL );
+    }
+    this->m_menuBar->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ToolBarBuilder.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ToolBarBuilder.cpp
new file mode 100644
index 0000000..69b94e8
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/builder/ToolBarBuilder.cpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/frame.h>
+#include <wx/toolbar.h>
+#include <wx/sizer.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+#include "fwGuiWx/container/WxToolBarContainer.hpp"
+#include "fwGuiWx/builder/ToolBarBuilder.hpp"
+
+fwGuiRegisterMacro( ::fwGui::builder::ToolBarBuilder, ::fwGui::builder::IToolBarBuilder::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace builder
+{
+
+//-----------------------------------------------------------------------------
+
+ToolBarBuilder::ToolBarBuilder(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolBarBuilder::~ToolBarBuilder()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarBuilder::createToolBar( ::fwGui::container::fwContainer::sptr parent )
+{
+    m_parent = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+    wxFrame *frame = wxDynamicCast( m_parent->getWxContainer() , wxFrame ) ;
+    ::fwGuiWx::container::WxToolBarContainer::sptr toolBarContainer = ::fwGuiWx::container::WxToolBarContainer::New();
+
+    if (frame)
+    {
+        frame->CreateToolBar(wxNO_BORDER|wxHORIZONTAL|wxTB_FLAT, -1);
+        frame->GetToolBar()->SetMargins( 2, 2 );
+        frame->GetToolBar()->SetToolBitmapSize( wxSize(m_toolBitmapSize.first, m_toolBitmapSize.second) );
+        toolBarContainer->setWxToolBar(frame->GetToolBar());
+        this->m_toolBar = toolBarContainer;
+    }
+    else // parent is not a wxFrame
+    {
+        wxToolBar * toolbar = new wxToolBar(m_parent->getWxContainer(), wxNewId(), wxDefaultPosition, wxDefaultSize, wxNO_BORDER|wxHORIZONTAL|wxTB_FLAT);
+        toolbar->SetMargins( 2, 2 );
+        toolbar->SetToolBitmapSize( wxSize(m_toolBitmapSize.first, m_toolBitmapSize.second) );
+        toolBarContainer->setWxToolBar(toolbar);
+
+        SLM_ASSERT("Parent container must have a sizer", m_parent->getWxContainer()->GetSizer());
+        wxSizer * sizer = m_parent->getWxContainer()->GetSizer();
+        sizer->Insert(0, toolbar, 0, wxEXPAND);
+        this->m_toolBar = toolBarContainer;
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarBuilder::destroyToolBar()
+{
+    SLM_ASSERT("Sorry, the parent container is not a WxContainer", m_parent);
+    wxFrame *frame = wxDynamicCast( m_parent->getWxContainer() , wxFrame ) ;
+    if (frame)
+    {
+        frame->SetToolBar( NULL );
+    }
+    this->m_toolBar->destroyContainer();
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace builder
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxContainer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxContainer.cpp
new file mode 100644
index 0000000..050d72a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxContainer.cpp
@@ -0,0 +1,109 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <wx/sizer.h>
+#include <wx/aui/aui.h>
+
+#include "fwGuiWx/container/WxContainer.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+WxContainer::WxContainer(::fwGui::GuiBaseObject::Key key) throw() : m_container(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+WxContainer::~WxContainer() throw()
+{
+    SLM_ASSERT( "Error during destruction : The wx container included in this class is still allocated, please call destroyContainer() before.", m_container == 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void WxContainer::clean()
+{
+    SLM_ASSERT("Sorry, wxWindows not yet initialized, cleaning impossible", m_container);
+
+    m_container->SetSizer(NULL);
+    m_container->DestroyChildren();
+}
+
+//-----------------------------------------------------------------------------
+
+void WxContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, wxWindows not yet initialized", m_container);
+    OSLM_ASSERT("Container must be empty ( " << m_container->GetChildren().GetCount() << " children).", m_container->GetChildren().IsEmpty());
+    m_container->Destroy();
+    m_container = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void WxContainer::setWxContainer(wxWindow* container)
+{
+    this->m_container = container;
+}
+
+//-----------------------------------------------------------------------------
+
+wxWindow* WxContainer::getWxContainer()
+{
+    return this->m_container;
+}
+
+//-----------------------------------------------------------------------------
+
+bool WxContainer::isShownOnScreen()
+{
+    SLM_ASSERT("Sorry, wxWindow not yet initialized, cleaning impossible", m_container);
+    return m_container->IsShownOnScreen();
+}
+
+//-----------------------------------------------------------------------------
+
+void WxContainer::setVisible(bool isVisible)
+{
+    SLM_ASSERT("Sorry, WxContainer not yet initialized, cleaning impossible", m_container);
+    wxWindow* parent   = m_container->GetParent();
+
+    if (parent && parent->GetSizer() )
+    {
+        wxAuiManager* aui = wxAuiManager::GetManager(parent);
+        if(aui && aui->GetManagedWindow() == parent )
+        {
+            wxAuiPaneInfo& pane = aui->GetPane(m_container);
+            SLM_ASSERT("Sorry, wxAuiPaneInfo not found", pane.IsOk());
+            pane.Show(isVisible);
+            aui->Update();
+        }
+        else
+        {
+            wxSizer* sizer1 = parent->GetSizer();
+            sizer1->Show(m_container, isVisible, true);
+            if(m_container->GetContainingSizer() && m_container->GetContainingSizer() != sizer1)
+            {
+                wxSizer* sizer2 = m_container->GetContainingSizer();
+                sizer1->Show(sizer2, isVisible, true);
+            }
+        }
+        parent->Layout();
+    }
+
+    m_container->Show(isVisible);
+    m_container->Layout();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuBarContainer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuBarContainer.cpp
new file mode 100644
index 0000000..5e237d2
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuBarContainer.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwGuiWx/container/WxMenuBarContainer.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+WxMenuBarContainer::WxMenuBarContainer(::fwGui::GuiBaseObject::Key key) throw() : m_menuBar(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+WxMenuBarContainer::~WxMenuBarContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuBarContainer::clean()
+{
+    SLM_ASSERT("Sorry, wxMenuBar not yet initialized, cleaning impossible", m_menuBar);
+    while( m_menuBar->GetMenuCount() )
+    {
+        wxMenu* menu = m_menuBar->Remove(0);
+        SLM_ASSERT("Menu must be empty", menu->GetMenuItemCount() == 0);
+        delete menu;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuBarContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, wxMenuBar not yet initialized", m_menuBar);
+    OSLM_ASSERT("MenuBar container must be empty ( " << m_menuBar->GetMenuCount() << " menu(s)).", m_menuBar->GetMenuCount() == 0);
+    m_menuBar->Destroy();
+    m_menuBar = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuBarContainer::setWxMenuBar(wxMenuBar* menuBar)
+{
+    this->m_menuBar = menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+wxMenuBar* WxMenuBarContainer::getWxMenuBar()
+{
+    return this->m_menuBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuContainer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuContainer.cpp
new file mode 100644
index 0000000..c487b3a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuContainer.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwGuiWx/container/WxMenuContainer.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+WxMenuContainer::WxMenuContainer(::fwGui::GuiBaseObject::Key key) throw() : m_menu(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+WxMenuContainer::~WxMenuContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuContainer::clean()
+{
+    SLM_ASSERT("Sorry, wxMenu not yet initialized, cleaning impossible", m_menu);
+    while( m_menu->GetMenuItemCount() )
+    {
+        m_menu->Remove(0);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, wxMenu not yet initialized, cleaning impossible", m_menu);
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuContainer::setWxMenu(wxMenu* menu)
+{
+    this->m_menu = menu;
+}
+
+//-----------------------------------------------------------------------------
+
+wxMenu* WxMenuContainer::getWxMenu()
+{
+    return this->m_menu;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuItemContainer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuItemContainer.cpp
new file mode 100644
index 0000000..3c3d9b7
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxMenuItemContainer.cpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwGuiWx/container/WxMenuItemContainer.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+WxMenuItemContainer::WxMenuItemContainer(::fwGui::GuiBaseObject::Key key) throw() : m_menuItem(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+WxMenuItemContainer::~WxMenuItemContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuItemContainer::clean()
+{
+    SLM_ASSERT("Sorry, wxMenuItem not yet initialized, cleaning impossible", m_menuItem || m_toolBarToolBase);
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuItemContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, wxMenuItem not yet initialized, cleaning impossible", m_menuItem || m_toolBarToolBase);
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuItemContainer::setWxMenuItem(wxMenuItem* menuItem)
+{
+    this->m_menuItem = menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+wxMenuItem* WxMenuItemContainer::getWxMenuItem()
+{
+    return this->m_menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+void WxMenuItemContainer::setWxToolItem(wxToolBarToolBase* menuItem)
+{
+    this->m_toolBarToolBase = menuItem;
+}
+
+//-----------------------------------------------------------------------------
+
+wxToolBarToolBase* WxMenuItemContainer::getWxToolItem()
+{
+    return this->m_toolBarToolBase;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxToolBarContainer.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxToolBarContainer.cpp
new file mode 100644
index 0000000..6a5bb54
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/container/WxToolBarContainer.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwGuiWx/container/WxToolBarContainer.hpp"
+
+namespace fwGuiWx
+{
+namespace container
+{
+
+//-----------------------------------------------------------------------------
+
+WxToolBarContainer::WxToolBarContainer(::fwGui::GuiBaseObject::Key key) throw() : m_toolBar(0)
+{}
+
+//-----------------------------------------------------------------------------
+
+WxToolBarContainer::~WxToolBarContainer() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void WxToolBarContainer::clean()
+{
+    SLM_ASSERT("Sorry, wxToolBar not yet initialized, cleaning impossible", m_toolBar);
+    m_toolBar->ClearTools();
+}
+
+//-----------------------------------------------------------------------------
+
+void WxToolBarContainer::destroyContainer()
+{
+    SLM_ASSERT("Sorry, wxToolBar not yet initialized, cleaning impossible", m_toolBar);
+    OSLM_ASSERT("ToolBar container must be empty ( " << m_toolBar->GetToolsCount() << " children).", m_toolBar->GetToolsCount() == 0);
+    m_toolBar->Destroy();
+    m_toolBar = 0;
+}
+
+//-----------------------------------------------------------------------------
+
+void WxToolBarContainer::setWxToolBar(wxToolBar* toolBar)
+{
+    this->m_toolBar = toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+wxToolBar* WxToolBarContainer::getWxToolBar()
+{
+    return this->m_toolBar;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace container
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/convert.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/convert.cpp
new file mode 100644
index 0000000..8da2284
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/convert.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2010.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#include "fwGuiWx/convert.hpp"
+
+#ifdef __WXMAC__
+wxDEFINE_EVENT(wxEventFwOpen, wxCommandEvent);
+#endif
+
+namespace fwGuiWx
+{
+wxString std2wx( const std::string & value )
+{
+    return wxString( value.c_str() , wxConvUTF8 );
+}
+
+std::string wx2std( const wxString & value )
+{
+    return (const char*)value.mb_str(wxConvUTF8);
+}
+}
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/InputDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/InputDialog.cpp
new file mode 100644
index 0000000..2a3ea6c
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/InputDialog.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/intl.h>
+#include <wx/textdlg.h>
+
+#include <fwGui/registry/macros.hpp>
+#include <fwData/String.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/dialog/InputDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::InputDialog, ::fwGui::dialog::IInputDialog::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+InputDialog::InputDialog(::fwGui::GuiBaseObject::Key key) : m_input(""), m_title(""), m_message("")
+{}
+
+
+InputDialog::~InputDialog()
+{}
+
+void InputDialog::setTitle( const std::string &title )
+{
+    m_title = title;
+}
+
+void InputDialog::setMessage( const std::string &msg )
+{
+    m_message = msg;
+}
+void InputDialog::setInput(const std::string &text)
+{
+    m_input = text;
+}
+
+/// Get the input text in the input field
+std::string InputDialog::getInput()
+{
+    wxString title = ::fwGuiWx::std2wx(m_title);
+    wxString message = ::fwGuiWx::std2wx(m_message);
+    wxString inputText = ::fwGuiWx::std2wx(m_input);
+    ::fwData::String::sptr url = ::fwData::String::New();
+    wxString text =  wxGetTextFromUser( wxGetTranslation(message), wxGetTranslation(title), wxGetTranslation(inputText));
+    return (::fwGuiWx::wx2std(text));
+}
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/LocationDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/LocationDialog.cpp
new file mode 100644
index 0000000..c586e32
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/LocationDialog.cpp
@@ -0,0 +1,177 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/dirdlg.h>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <fwGui/registry/macros.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+
+#include <fwGui/dialog/ILocationDialog.hpp>
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/dialog/LocationDialog.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::LocationDialog, ::fwGui::dialog::ILocationDialog::REGISTRY_KEY );
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+LocationDialog::LocationDialog(::fwGui::GuiBaseObject::Key key) :
+        m_style(wxFD_DEFAULT_STYLE),
+        m_type(::fwGui::dialog::ILocationDialog::SINGLE_FILE)
+{}
+
+//------------------------------------------------------------------------------
+
+::fwData::location::ILocation::sptr LocationDialog::show()
+{
+    ::fwData::location::ILocation::sptr location;
+    const ::boost::filesystem::path defaultPath = this->getDefaultLocation();
+    wxString path = ::fwGuiWx::std2wx( defaultPath.parent_path().string() );
+    wxString title = ::fwGuiWx::std2wx(this->getTitle());
+
+    if (m_type == ::fwGui::dialog::ILocationDialog::SINGLE_FILE)
+    {
+        wxString file = wxFileSelector(
+                title,
+                path,
+                wxT(""),
+                wxT(""),
+                fileFilters(),
+                m_style,
+                wxTheApp->GetTopWindow() );
+
+        if( file.IsEmpty() == false )
+        {
+            ::boost::filesystem::path bpath( ::fwGuiWx::wx2std(file) );
+            location = ::fwData::location::SingleFile::New(bpath);
+        }
+    }
+    else if (m_type == ::fwGui::dialog::ILocationDialog::FOLDER)
+    {
+        wxString file = wxDirSelector(
+                title,
+                path,
+                m_style,
+                wxDefaultPosition,
+                wxTheApp->GetTopWindow() );
+
+        if( file.IsEmpty() == false )
+        {
+            ::boost::filesystem::path bpath( ::fwGuiWx::wx2std(file) );
+            location = ::fwData::location::Folder::New(bpath);
+        }
+    }
+    else if (m_type == ::fwGui::dialog::ILocationDialog::MULTI_FILES)
+    {
+        wxFileDialog *fileDialog = new wxFileDialog(wxTheApp->GetTopWindow(),
+                title,
+                path,
+                "",
+                fileFilters(),
+                m_style | wxFD_MULTIPLE);
+
+        if (fileDialog->ShowModal() != wxID_CANCEL)
+        {
+            wxArrayString paths;
+            fileDialog->GetPaths(paths);
+            std::vector < ::boost::filesystem::path > vPaths;
+            for (unsigned int i=0 ; i< paths.GetCount() ; i++)
+            {
+                ::boost::filesystem::path bpath( ::fwGuiWx::wx2std(paths[i]) );
+                vPaths.push_back(bpath);
+            }
+            ::fwData::location::MultiFiles::sptr multiFiles = ::fwData::location::MultiFiles::New();
+            multiFiles->setPaths(vPaths);
+            location = multiFiles;
+        }
+    }
+    return location;
+}
+
+//------------------------------------------------------------------------------
+
+::fwGui::dialog::ILocationDialog&  LocationDialog::setOption( ::fwGui::dialog::ILocationDialog::Options option)
+{
+    if ( option == ::fwGui::dialog::ILocationDialog::WRITE )
+    {
+        m_style &= ~wxFD_OPEN ;
+        m_style |= wxFD_SAVE ;
+    }
+    else if ( option == ::fwGui::dialog::ILocationDialog::READ )
+    {
+        m_style &= ~wxFD_SAVE ;
+        m_style |= wxFD_OPEN ;
+    }
+    else if ( option == ::fwGui::dialog::ILocationDialog::FILE_MUST_EXIST )
+    {
+        m_style |= wxFD_FILE_MUST_EXIST ;
+    }
+
+return *this;
+}
+
+//------------------------------------------------------------------------------
+
+void LocationDialog::setType( ::fwGui::dialog::ILocationDialog::Types type )
+{
+    m_type = type;
+}
+
+//------------------------------------------------------------------------------
+
+// exemple ( addFilter("images","*.png *.jpg");
+void LocationDialog::addFilter(const std::string &filterName, const std::string &wildcardList )
+{
+    m_filters.insert( std::make_pair( filterName, wildcardList ));
+}
+
+//------------------------------------------------------------------------------
+
+// "BMP and GIF files (*.bmp;*.gif)|*.bmp;*.gif|PNG files (*.png)|*.png"
+wxString LocationDialog::fileFilters()
+{
+    std::string result;
+    std::multimap< std::string, std::string >::const_iterator iter;
+    for ( iter = m_filters.begin(); iter!= m_filters.end(); ++iter)
+    {
+        std::string filterName = iter->first;
+        std::string rawWildcards = iter->second;
+        // set rawWildcards in correct format
+        std::string wildcards;
+        typedef ::boost::tokenizer< boost::char_separator<char> > Tokenizer;
+        Tokenizer tok(rawWildcards, boost::char_separator<char>(" "));
+        for( Tokenizer::iterator beg=tok.begin(); beg!=tok.end();++beg)
+        {
+             if  (beg!=tok.begin())
+             {
+                 wildcards += ";";
+             }
+             wildcards += *beg;
+        }
+
+        if (iter!=m_filters.begin() )
+        {
+            result += "|";
+        }
+        result += filterName +" (" +  wildcards +")|" + wildcards;
+    }
+    return ::fwGuiWx::std2wx(result);
+}
+
+} // namespace dialog
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MessageDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MessageDialog.cpp
new file mode 100644
index 0000000..b58576a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MessageDialog.cpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/msgdlg.h>
+
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+#include "fwGuiWx/dialog/MessageDialog.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::MessageDialog, ::fwGui::dialog::IMessageDialog::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+
+MessageDialog::MessageDialog(::fwGui::GuiBaseObject::Key key) : m_title(""), m_message(""), m_buttons(0)
+{}
+
+
+MessageDialog::~MessageDialog()
+{}
+
+void MessageDialog::setTitle( const std::string &title )
+{
+    m_title = title;
+}
+
+void MessageDialog::setMessage( const std::string &msg )
+{
+    m_message = msg;
+}
+
+void MessageDialog::setIcon( ::fwGui::dialog::IMessageDialog::Icons icon )
+{
+    if (icon == IMessageDialog::CRITICAL)
+    {
+        m_icon = wxICON_ERROR;
+    }
+    else if (icon == IMessageDialog::WARNING)
+    {
+        m_icon = wxICON_EXCLAMATION;
+    }
+    else if (icon == IMessageDialog::INFO)
+    {
+        m_icon = wxICON_INFORMATION;
+    }
+    else if (icon == IMessageDialog::QUESTION)
+    {
+        m_icon = wxICON_QUESTION;
+    }
+}
+
+void MessageDialog::addButton( ::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    if (button == IMessageDialog::OK)
+    {
+        m_buttons |= wxOK;
+    }
+    else if (button == IMessageDialog::CANCEL)
+    {
+        m_buttons |= wxCANCEL;
+    }
+    else if (button == IMessageDialog::YES_NO)
+    {
+        m_buttons |= wxYES_NO;
+    }
+}
+
+void MessageDialog::setDefaultButton( ::fwGui::dialog::IMessageDialog::Buttons button )
+{
+    if (button == IMessageDialog::OK)
+    {
+        m_buttons |= wxOK_DEFAULT;
+    }
+    else if (button == IMessageDialog::CANCEL)
+    {
+        m_buttons |= wxCANCEL_DEFAULT;
+    }
+    else if (button == IMessageDialog::YES)
+    {
+        m_buttons |= wxYES_DEFAULT;
+    }
+    else if (button == IMessageDialog::NO)
+    {
+        m_buttons |= wxNO_DEFAULT;
+    }
+}
+
+::fwGui::dialog::IMessageDialog::Buttons MessageDialog::show()
+{
+    ::fwGui::dialog::IMessageDialog::Buttons result;
+    int wxResult = wxMessageBox( ::fwGuiWx::std2wx(m_message), ::fwGuiWx::std2wx(m_title), m_buttons|m_icon );
+
+    if (wxResult == wxOK)
+    {
+        result = ::fwGui::dialog::IMessageDialog::OK;
+    }
+    else if (wxResult == wxYES)
+    {
+        result = ::fwGui::dialog::IMessageDialog::YES;
+    }
+    else if (wxResult == wxNO)
+    {
+        result = ::fwGui::dialog::IMessageDialog::NO;
+    }
+    else if (wxResult == wxCANCEL)
+    {
+        result = ::fwGui::dialog::IMessageDialog::CANCEL;
+    }
+    return result;
+}
+} // namespace dialog
+} // namespace fwGuiWx
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MultiSelectorDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MultiSelectorDialog.cpp
new file mode 100644
index 0000000..bf8d90d
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/MultiSelectorDialog.cpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/checklst.h>
+#include <wx/window.h>
+#include <wx/dialog.h>
+#include <wx/choice.h>
+#include <wx/arrstr.h>
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/button.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/dialog/MultiSelectorDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::MultiSelectorDialog, ::fwGui::dialog::IMultiSelectorDialog::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+MultiSelectorDialog::MultiSelectorDialog(::fwGui::GuiBaseObject::Key key) : m_title(""), m_message("")
+{}
+
+//------------------------------------------------------------------------------
+
+MultiSelectorDialog::~MultiSelectorDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setSelections(Selections _selections)
+{
+    this->m_selections = _selections;
+}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setTitle(std::string _title)
+{
+    this->m_title = _title;
+}
+
+//------------------------------------------------------------------------------
+
+::fwGui::dialog::IMultiSelectorDialog::Selections MultiSelectorDialog::show()
+{
+    wxDialog* dialog = new wxDialog( wxTheApp->GetTopWindow(), wxNewId(), ::fwGuiWx::std2wx(this->m_title),
+            wxDefaultPosition, wxDefaultSize,
+            wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX );
+
+    wxArrayString items;
+    BOOST_FOREACH( Selections::value_type selection, m_selections)
+    {
+        items.Add( ::fwGuiWx::std2wx(selection.first) );
+    }
+
+    wxCheckListBox* typeCtrl = new wxCheckListBox(dialog, wxNewId(), wxDefaultPosition, wxDefaultSize, items) ;
+    typeCtrl->SetSelection(0);
+
+    int item=0;
+    BOOST_FOREACH( Selections::value_type selection, m_selections)
+    {
+        typeCtrl->Check( item, selection.second  );
+        item++;
+    }
+
+    // Creates the default buttons.
+    wxSizer  * defaultButtonSizer = new wxBoxSizer( wxHORIZONTAL );
+    wxButton * okButton = new wxButton( dialog, wxID_OK, wxGetTranslation("OK") );
+    wxButton * cancelButton = new wxButton( dialog, wxID_CANCEL, wxGetTranslation("Cancel") );
+
+    okButton->SetDefault();
+    defaultButtonSizer->Add( okButton, 0, 0 );
+    defaultButtonSizer->Add( 5, 5 );
+    defaultButtonSizer->Add( cancelButton, 0, 0 );
+
+    // Creates the root sizer.
+    wxSizer * rootSizer = new wxBoxSizer( wxVERTICAL );
+    if(!m_message.empty())
+    {
+        wxStaticText* msgText = new wxStaticText(dialog, wxNewId(), ::fwGuiWx::std2wx(m_message));
+        rootSizer->Add( msgText, 0, wxGROW|wxALL, 10 );
+    }
+    rootSizer->Add( typeCtrl, 1, wxALL|wxEXPAND, 10 );
+    rootSizer->Add( defaultButtonSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 );
+    dialog->SetSizerAndFit( rootSizer );
+
+
+    int choice = dialog->ShowModal();
+    Selections selections;
+    if( choice == wxID_OK )
+    {
+        int item=0;
+        BOOST_FOREACH( Selections::value_type selection, m_selections)
+        {
+            selections[selection.first] = typeCtrl->IsChecked(item);
+            item++;
+         }
+    }
+    dialog->Destroy();
+    return selections;
+}
+
+//------------------------------------------------------------------------------
+
+void MultiSelectorDialog::setMessage(const std::string &msg)
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/ProgressDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/ProgressDialog.cpp
new file mode 100644
index 0000000..190072b
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/ProgressDialog.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+#include <fwGuiWx/widgets/fwProgressDialog.hpp>
+
+#include "fwGuiWx/dialog/ProgressDialog.hpp"
+
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::ProgressDialog, ::fwGui::dialog::IProgressDialog::REGISTRY_KEY );
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+ProgressDialog::ProgressDialog(::fwGui::GuiBaseObject::Key key, const std::string &title, const std::string &message)
+{
+    fwProgressDialog *wxpd = new fwProgressDialog(
+                                    ::fwGuiWx::std2wx(title),
+                                    ::fwGuiWx::std2wx(message),
+                                    100 /*percent*/,
+                                    NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL //| wxPD_REMAINING_TIME
+                            );
+    m_pdialog = ::boost::shared_ptr<fwProgressDialog>(wxpd);
+    m_pdialog->Show();
+    m_pdialog->Update();
+}
+
+//------------------------------------------------------------------------------
+
+ProgressDialog::~ProgressDialog()
+{
+    // auto clean dialog
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::operator()(float percent,std::string msg)
+{
+    SLM_ASSERT("m_pdialog not instanced", m_pdialog);
+    int value = (int)(percent*100);
+    OSLM_TRACE( "ProgressDialog msg" << msg << " : " << value <<"%");
+    m_pdialog->Show(true); // can be hidden if previous load as finished
+    m_pdialog->Update(value, ::fwGuiWx::std2wx(msg) );
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::setTitle(const std::string &title)
+{
+    m_pdialog->SetTitle(::fwGuiWx::std2wx(title));
+}
+
+//------------------------------------------------------------------------------
+
+void ProgressDialog::setMessage(const std::string &msg)
+{
+    m_pdialog->UpdateMessage( ::fwGuiWx::std2wx(msg) );
+}
+
+
+} // namespace dialog
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/PulseProgressDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/PulseProgressDialog.cpp
new file mode 100644
index 0000000..ba87831
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/PulseProgressDialog.cpp
@@ -0,0 +1,201 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/log.h>
+#include <wx/progdlg.h>
+#include <wx/utils.h>
+#include <wx/evtloop.h>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+#include <fwGuiWx/widgets/fwProgressDialog.hpp>
+
+#include "fwGuiWx/dialog/PulseProgressDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::PulseProgressDialog, ::fwGui::dialog::IPulseProgressDialog::REGISTRY_KEY );
+
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+//------------------------------------------------------------------------------
+
+wxDEFINE_EVENT(wxEVT_LOCALTHREAD_COMPLETED, wxThreadEvent);
+
+//------------------------------------------------------------------------------
+
+
+PulseProgressDialog::LocalThread::LocalThread( Stuff &stuff)
+:   wxThread(wxTHREAD_JOINABLE),
+    m_stuff(stuff),
+    m_isFinished(false),
+    m_errorMessage()
+{}
+
+//------------------------------------------------------------------------------
+
+bool PulseProgressDialog::LocalThread::isFinished() const
+{
+    return m_isFinished;
+}
+
+//------------------------------------------------------------------------------
+
+std::string PulseProgressDialog::LocalThread::getErrorMessage() const
+{
+    return m_errorMessage;
+}
+
+//------------------------------------------------------------------------------
+
+PulseProgressDialog::LocalThread::~LocalThread()
+{}
+
+//------------------------------------------------------------------------------
+
+wxThread::ExitCode PulseProgressDialog::LocalThread::Entry()
+{
+        try
+        {
+            m_stuff();
+        }
+        catch ( std::exception &e)
+        {
+            m_errorMessage = e.what();
+        }
+        m_isFinished=true;
+        // TODO meilleur arret
+        // Don't Poll a wxThread
+        // A common problem users experience with wxThread is that in their main thread they will check the thread every now
+        //and then to see if it has ended through IsRunning(), only to find that their application has run into problems because
+        //the thread is using the default behavior (i.e. it's detached) and has already deleted itself. Naturally, they instead
+        // attempt to use joinable threads in place of the previous behavior. However, polling a wxThread for when it has ended is
+        // in general a bad idea - in fact calling a routine on any running wxThread should be avoided if possible. Instead, find a
+        // way to notify yourself when the thread has ended.
+        // wxQueueEvent(m_client, new wxThreadEvent(wxEVT_LOCALTHREAD_COMPLETED)); avec m_client un addr sur PulseProgressDialog qui a lanc� le thread
+        OSLM_TRACE("UUU PulseProgressDialog::LocalThread::Entry() FINI !!!!");
+
+    return (wxThread::ExitCode)0;     // success
+}
+
+
+//------------------------------------------------------------------------------
+
+PulseProgressDialog::PulseProgressDialog(::fwGui::GuiBaseObject::Key key)
+{
+    m_wxpd = NULL;
+}
+
+//------------------------------------------------------------------------------
+
+PulseProgressDialog::~PulseProgressDialog()
+{
+    if ( m_thread )
+    {
+        if (m_thread->Delete() != wxTHREAD_NO_ERROR )
+            wxLogError("Can't delete the thread!");
+        // Delete attend le destruction de m_thread
+        m_thread = NULL;
+    }
+    if (m_wxpd)
+    {
+        m_wxpd->Destroy();
+        m_wxpd = NULL;
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::setTitle(const std::string &title)
+{
+    m_title = title;
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::setMessage(const std::string &msg)
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::show()
+{
+#ifdef PULSEPROGRESS_USE_THREAD
+
+    this->Bind( wxEVT_LOCALTHREAD_COMPLETED , &PulseProgressDialog::onComplete , this);
+
+    m_wxpd = new wxProgressDialog(
+                                    ::fwGuiWx::std2wx(m_title),
+                                    "                                             ", // sinon pas de place pour ecrire definit espace initial
+                                    100 /*percent*/,
+                                    NULL, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_SMOOTH);
+
+    m_wxpd->Pulse( m_message );
+    m_wxpd->Fit();
+    m_wxpd->Show();
+    m_wxpd->Update();
+    m_thread = new LocalThread( m_stuff);
+
+    if ( m_thread->Create() != wxTHREAD_NO_ERROR )
+    {
+        wxLogError("Can't create the thread!");
+        delete m_thread;
+        m_thread = NULL;
+    }
+    else
+    {
+        if (m_thread->Run() != wxTHREAD_NO_ERROR )
+        {
+            wxLogError("Can't create the thread!");
+            delete m_thread;
+            m_thread = NULL;
+        }
+    }
+
+    int i=0;
+
+    while( m_thread->isFinished()== false ) // moins couteux que wxThread::isRunning
+    {
+        OSLM_TRACE("PulseProgressDialog  in Loop m_thread->isRunning" << m_thread->IsRunning() << " " << ++i );
+        m_wxpd->Pulse();
+        m_wxpd->Update();
+        wxYield();
+        wxMilliSleep(m_frequence);
+    }
+    OSLM_TRACE("PulseProgressDialog AFTER Loop m_thread->isRunning " << m_thread->IsRunning() << " " << ++i );
+
+    if ( m_thread->getErrorMessage().size() )
+    {
+        m_wxpd->Update(100,"Failed !!!");
+
+        OSLM_WARN( "PulseProgressDialog::m_stuff an exception has occured " << m_thread->getErrorMessage() );
+        throw ::fwTools::Failed( m_thread->getErrorMessage() );
+    }
+    m_wxpd->Update(100,"Done");
+#else
+    m_thread = NULL;
+    m_stuff();
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+void PulseProgressDialog::onComplete( wxThreadEvent &event )
+{
+    // TODO faire un arret plus propre
+    SLM_TRACE_FUNC();
+
+}
+
+} // namespace dialog
+} // namespace fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/SelectorDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/SelectorDialog.cpp
new file mode 100644
index 0000000..26aa0ce
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/dialog/SelectorDialog.cpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/window.h>
+#include <wx/dialog.h>
+#include <wx/choice.h>
+#include <wx/arrstr.h>
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/button.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/dialog/SelectorDialog.hpp"
+
+fwGuiRegisterMacro( ::fwGuiWx::dialog::SelectorDialog, ::fwGui::dialog::ISelectorDialog::REGISTRY_KEY );
+
+namespace fwGuiWx
+{
+namespace dialog
+{
+
+//------------------------------------------------------------------------------
+
+SelectorDialog::SelectorDialog(::fwGui::GuiBaseObject::Key key) : m_title(""), m_message("")
+{}
+
+//------------------------------------------------------------------------------
+
+SelectorDialog::~SelectorDialog()
+{}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setSelections(std::vector< std::string > _selections)
+{
+    this->m_selections = _selections;
+}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setTitle(std::string _title)
+{
+    this->m_title = _title;
+}
+
+//------------------------------------------------------------------------------
+
+std::string SelectorDialog::show()
+{
+    wxDialog* dialog = new wxDialog( wxTheApp->GetTopWindow(), wxNewId(), ::fwGuiWx::std2wx(this->m_title),
+            wxDefaultPosition, wxDefaultSize,
+            wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER|wxMAXIMIZE_BOX );
+
+    wxArrayString items;
+    BOOST_FOREACH( std::string selection, m_selections)
+    {
+        items.Add( ::fwGuiWx::std2wx(selection) );
+    }
+
+    // Creates the static fields.
+    wxChoice* typeCtrl = new wxChoice(dialog, wxNewId(), wxDefaultPosition, wxDefaultSize, items) ;
+    typeCtrl->SetSelection(0);
+
+
+    // Creates the default buttons.
+    wxSizer  * defaultButtonSizer = new wxBoxSizer( wxHORIZONTAL );
+    wxButton * okButton = new wxButton( dialog, wxID_OK, wxGetTranslation("OK") );
+    wxButton * cancelButton = new wxButton( dialog, wxID_CANCEL, wxGetTranslation("Cancel") );
+
+    okButton->SetDefault();
+    defaultButtonSizer->Add( okButton, 0, 0 );
+    defaultButtonSizer->Add( 5, 5 );
+    defaultButtonSizer->Add( cancelButton, 0, 0 );
+
+    // Creates the root sizer.
+    wxSizer * rootSizer = new wxBoxSizer( wxVERTICAL );
+    if(!m_message.empty())
+    {
+        wxStaticText* msgText = new wxStaticText(dialog, wxNewId(), ::fwGuiWx::std2wx(m_message));
+        rootSizer->Add( msgText, 0, wxGROW|wxALL, 10 );
+    }
+    rootSizer->Add( typeCtrl, 0, wxGROW|wxALL, 10 );
+    rootSizer->Add( defaultButtonSizer, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 10 );
+    dialog->SetSizerAndFit( rootSizer );
+
+
+    int choice = dialog->ShowModal();
+    std::string selection = "";
+    if( choice == wxID_OK )
+    {
+        selection = typeCtrl->GetStringSelection();
+    }
+    dialog->Destroy();
+    return selection;
+}
+
+//------------------------------------------------------------------------------
+
+void SelectorDialog::setMessage(const std::string &msg)
+{
+    m_message = msg;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dialog
+} // namespace fwGuiWx
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/CardinalLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/CardinalLayoutManager.cpp
new file mode 100644
index 0000000..68e4eee
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/CardinalLayoutManager.cpp
@@ -0,0 +1,107 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/panel.h>
+#include <wx/sizer.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/layoutManager/CardinalLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::CardinalLayoutManager, ::fwGui::layoutManager::CardinalLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManager::CardinalLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+CardinalLayoutManager::~CardinalLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void CardinalLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to WxContainer failed", m_parentContainer);
+
+    wxWindow* wxContainer = m_parentContainer->getWxContainer();
+
+    // Set no flags on wxAuiManager constructor to disable m_hint_wind internal frame construction
+    // this frame is not correctly destroyed
+    m_manager = new wxAuiManager(  wxContainer, 0 /* no flag */);
+    std::list< ViewInfo> views = this->getViewsInfo();
+
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        wxPanel * viewPanel = new wxPanel(  wxContainer, wxNewId() , wxDefaultPosition, wxDefaultSize, wxNO_BORDER | wxTAB_TRAVERSAL );
+        ::fwGuiWx::container::WxContainer::sptr subContainer = ::fwGuiWx::container::WxContainer::New();
+        subContainer->setWxContainer(viewPanel);
+        m_subViews.push_back(subContainer);
+
+        // Pane info configuration
+        ::wxAuiPaneInfo paneInfo;
+        if(viewInfo.m_align==CENTER)        { paneInfo.Center(); }
+        else if(viewInfo.m_align==RIGHT)    { paneInfo.Right(); }
+        else if(viewInfo.m_align==LEFT)     { paneInfo.Left(); }
+        else if(viewInfo.m_align==BOTTOM)   { paneInfo.Bottom();}
+        else if(viewInfo.m_align==TOP)      { paneInfo.Top(); }
+
+        if(!viewInfo.m_isResizable)
+        {
+            paneInfo.Fixed();
+        }
+        paneInfo.CloseButton( false );
+        paneInfo.Floatable( false );
+        paneInfo.MaximizeButton( true );
+        if(viewInfo.m_caption.first)
+        {
+            paneInfo.CaptionVisible( true );
+            paneInfo.Caption( ::fwGuiWx::std2wx(viewInfo.m_caption.second) );
+        }
+        else
+        {
+            paneInfo.CaptionVisible( false );
+        }
+        paneInfo.PaneBorder( false );
+        paneInfo.MinSize( wxSize( viewInfo.m_minSize.first, viewInfo.m_minSize.second ) );
+        paneInfo.Position(viewInfo.m_position);
+        paneInfo.Layer(viewInfo.m_layer);
+        paneInfo.Row(viewInfo.m_row);
+        paneInfo.Show(viewInfo.m_visible);
+        m_manager->AddPane( viewPanel, paneInfo);
+    }
+    m_manager->Update();
+}
+
+//-----------------------------------------------------------------------------
+
+void CardinalLayoutManager::destroyLayout()
+{
+    m_manager->UnInit() ;
+    this->destroySubViews();
+    delete m_manager;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/FrameLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/FrameLayoutManager.cpp
new file mode 100644
index 0000000..25e358b
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/FrameLayoutManager.cpp
@@ -0,0 +1,185 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/evtloop.h>
+#include <wx/image.h>
+
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/layoutManager/FrameLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::FrameLayoutManager, ::fwGui::layoutManager::IFrameLayoutManager::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+const std::map< ::fwGui::layoutManager::IFrameLayoutManager::Style, long> FrameLayoutManager::FWSTYLE_TO_WXSTYLE =
+        ::boost::assign::map_list_of(::fwGui::layoutManager::IFrameLayoutManager::DEFAULT,wxDEFAULT_FRAME_STYLE)
+                                    (::fwGui::layoutManager::IFrameLayoutManager::STAY_ON_TOP, wxDEFAULT_FRAME_STYLE | wxSTAY_ON_TOP);
+
+//-----------------------------------------------------------------------------
+
+FrameLayoutManager::FrameLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+FrameLayoutManager::~FrameLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::createFrame()
+{
+    SLM_TRACE_FUNC();
+    FrameInfo frameInfo = this->getFrameInfo();
+
+    wxEventLoopBase* eventLoop = wxEventLoop::GetActive();
+    if (!eventLoop)
+    {
+        wxEventLoop::SetActive(new wxEventLoop() );
+    }
+    // wxWidget initialization
+    wxInitAllImageHandlers();
+
+    m_wxFrame = new wxFrame(wxTheApp->GetTopWindow(),
+            wxNewId(),
+            ::fwGuiWx::std2wx(frameInfo.m_name),
+             wxDefaultPosition,
+             wxSize(frameInfo.m_minSize.first, frameInfo.m_minSize.second),
+             FWSTYLE_TO_WXSTYLE.find(frameInfo.m_style)->second );
+
+    if(!wxTheApp->GetTopWindow())
+    {
+        wxTheApp->SetTopWindow( m_wxFrame ) ;
+    }
+    m_wxFrame->SetMinSize(wxSize(frameInfo.m_minSize.first, frameInfo.m_minSize.second));
+
+    if(!frameInfo.m_iconPath.empty())
+    {
+        wxIcon icon( ::fwGuiWx::std2wx(frameInfo.m_iconPath.string()), wxBITMAP_TYPE_ICO );
+        OSLM_ASSERT("Sorry, unable to create an icon instance from " << frameInfo.m_iconPath.string(), icon.Ok());
+        m_wxFrame->SetIcon( icon );
+    }
+    m_wxFrame->Move( wxPoint(frameInfo.m_position.first, frameInfo.m_position.second) );
+    m_wxFrame->SetSize( wxSize( frameInfo.m_size.first, frameInfo.m_size.second) );
+    this->setState(frameInfo.m_state);
+
+    m_wxFrame->Bind( wxEVT_CLOSE_WINDOW, &FrameLayoutManager::onCloseFrame, this,  m_wxFrame->GetId());
+    m_wxFrame->Show();
+    m_wxFrame->Refresh();
+
+    ::fwGuiWx::container::WxContainer::sptr frameContainer = ::fwGuiWx::container::WxContainer::New();
+    frameContainer->setWxContainer(m_wxFrame);
+    m_frame = frameContainer;
+
+
+    wxPanel *panel = new wxPanel(m_wxFrame, wxNewId());
+    wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
+    m_wxFrame->SetSizer(boxSizer);
+    boxSizer->Add(panel, 1, wxALL|wxEXPAND);
+    m_wxFrame->Layout();
+
+    ::fwGuiWx::container::WxContainer::sptr container = ::fwGuiWx::container::WxContainer::New();
+    container->setWxContainer(panel);
+    m_container = container;
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::destroyFrame()
+{
+    this->getRefFrameInfo().m_state = this->getState();
+    this->getRefFrameInfo().m_size.first = m_wxFrame->GetSize().GetWidth();
+    this->getRefFrameInfo().m_size.second = m_wxFrame->GetSize().GetHeight();
+    this->getRefFrameInfo().m_position.first = m_wxFrame->GetPosition().x;
+    this->getRefFrameInfo().m_position.second = m_wxFrame->GetPosition().y;
+    this->writeConfig();
+
+    m_wxFrame->Show(false);
+    m_wxFrame->Unbind( wxEVT_CLOSE_WINDOW, &FrameLayoutManager::onCloseFrame, this,  m_wxFrame->GetId());
+
+    if ( wxTheApp->GetTopWindow() != m_wxFrame )
+    {
+        m_wxFrame->Reparent(NULL);
+    }
+
+    m_container->destroyContainer();
+    m_frame->clean();
+    m_frame->destroyContainer();
+
+    m_frame.reset();
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::onCloseFrame(wxCloseEvent& event)
+{
+    SLM_TRACE_FUNC();
+    this->m_closeCallback();
+}
+
+//-----------------------------------------------------------------------------
+
+void FrameLayoutManager::setState( FrameState state )
+{
+    // Updates the window state.
+    switch( state )
+    {
+    case ICONIZED:
+        m_wxFrame->Iconize();
+        break;
+
+    case MAXIMIZED:
+        m_wxFrame->Maximize();
+        break;
+
+    case FULL_SCREEN:
+        m_wxFrame->ShowFullScreen( true );
+        break;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::fwGui::layoutManager::IFrameLayoutManager::FrameState FrameLayoutManager::getState()
+{
+    FrameState state( UNKNOWN );
+
+    if( m_wxFrame->IsIconized() )
+    {
+        state = ICONIZED;
+    }
+    else if( m_wxFrame->IsMaximized() )
+    {
+        state = MAXIMIZED;
+    }
+    else if( m_wxFrame->IsFullScreen() )
+    {
+        state = FULL_SCREEN;
+    }
+    return state;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/LineLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/LineLayoutManager.cpp
new file mode 100644
index 0000000..b6038e6
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/LineLayoutManager.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/panel.h>
+#include <wx/sizer.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/layoutManager/LineLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::LineLayoutManager, ::fwGui::layoutManager::LineLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManager::LineLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+LineLayoutManager::~LineLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void LineLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to WxContainer failed", m_parentContainer);
+
+    wxWindow* wxContainer = m_parentContainer->getWxContainer();
+    Orientation orientation = this->getOrientation();
+    int wxOrientation = ( (orientation==VERTICAL) ? wxVERTICAL : wxHORIZONTAL);
+    wxBoxSizer* boxSizer = new wxBoxSizer( wxOrientation );
+
+    wxContainer->SetSizer( boxSizer );
+
+    std::list< ViewInfo> views = this->getViewsInfo();
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        if(viewInfo.m_isSpacer)
+        {
+            boxSizer->Add( 0, 0, 1, wxEXPAND );
+        }
+        else
+        {
+            wxPanel * viewPanel = new wxPanel(  wxContainer, wxNewId() , wxDefaultPosition, wxSize( viewInfo.m_minSize.first, viewInfo.m_minSize.second ), wxNO_BORDER | wxTAB_TRAVERSAL );
+            ::fwGuiWx::container::WxContainer::sptr subContainer = ::fwGuiWx::container::WxContainer::New();
+            subContainer->setWxContainer(viewPanel);
+            m_subViews.push_back(subContainer);
+#ifndef __MACOSX__
+            if(viewInfo.m_caption.first)
+            {
+                wxStaticBoxSizer* sizer = new wxStaticBoxSizer( wxOrientation, wxContainer, ::fwGuiWx::std2wx(viewInfo.m_caption.second));
+                sizer->Add( viewPanel, 1, wxALL|wxEXPAND, viewInfo.m_border);
+                boxSizer->Add(sizer, viewInfo.m_proportion, wxALL|wxEXPAND);
+            }
+            else
+            {
+                boxSizer->Add( viewPanel, viewInfo.m_proportion, wxALL|wxEXPAND, viewInfo.m_border);
+            }
+#else
+            boxSizer->Add( viewPanel, viewInfo.m_proportion, wxALL|wxEXPAND, viewInfo.m_border);
+#endif
+            subContainer->setVisible( viewInfo.m_visible );
+        }
+    }
+
+    wxContainer->Layout();
+}
+
+//-----------------------------------------------------------------------------
+
+void LineLayoutManager::destroyLayout()
+{
+    this->destroySubViews();
+    SLM_ASSERT("Parent container is not available.", m_parentContainer);
+    wxWindow* wxContainer = m_parentContainer->getWxContainer();
+    wxContainer->SetSizer(NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuBarLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuBarLayoutManager.cpp
new file mode 100644
index 0000000..f09480f
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuBarLayoutManager.cpp
@@ -0,0 +1,106 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/menu.h>
+#include <boost/foreach.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/container/WxMenuContainer.hpp"
+#include "fwGuiWx/layoutManager/MenuBarLayoutManager.hpp"
+
+
+fwGuiRegisterMacro(::fwGui::layoutManager::MenuBarLayoutManager, ::fwGui::layoutManager::IMenuBarLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+MenuBarLayoutManager::MenuBarLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuBarLayoutManager::~MenuBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::createLayout( ::fwGui::container::fwMenuBar::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiWx::container::WxMenuBarContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwMenuBar to WxMenuBarContainer failed", m_parent);
+
+    wxMenuBar* menuBar = m_parent->getWxMenuBar();
+
+    BOOST_FOREACH ( std::string name, m_menuNames)
+    {
+        ::fwGuiWx::container::WxMenuContainer::sptr menu = ::fwGuiWx::container::WxMenuContainer::New();
+        wxMenu *menuWx = new wxMenu();
+        menu->setWxMenu(menuWx);
+        menuBar->Append( menuWx , ::fwGuiWx::std2wx( name ));
+        m_menus.push_back(menu);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::destroyLayout()
+{
+    this->destroyMenus();
+    m_parent->clean();
+    m_menus.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void MenuBarLayoutManager::menuIsVisible(::fwGui::container::fwMenu::sptr fwMenu, bool isVisible)
+{
+    SLM_FATAL("TODO : MenuBarLayoutManager::menuIsVisible not yet implemented.");
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuBarLayoutManager::menuIsEnabled(::fwGui::container::fwMenu::sptr fwMenu, bool isEnabled)
+{
+    wxMenuBar* menuBar = m_parent->getWxMenuBar();
+    std::string name = m_menuNames[this->getMenuPosition(fwMenu)];
+    int index = menuBar->FindMenu(::fwGuiWx::std2wx(name));
+    SLM_ASSERT("Menu " << name << " not found", index != wxNOT_FOUND);
+    menuBar->EnableTop(index, isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+int MenuBarLayoutManager::getMenuPosition(::fwGui::container::fwMenu::sptr fwMenu)
+{
+    int index = 0;
+    BOOST_FOREACH(::fwGui::container::fwMenu::sptr menu, m_menus)
+    {
+        if (menu == fwMenu)
+        {
+            break;
+        }
+        index++;
+    }
+    return index;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuLayoutManager.cpp
new file mode 100644
index 0000000..eaeabe8
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/MenuLayoutManager.cpp
@@ -0,0 +1,183 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/menu.h>
+#include <wx/frame.h>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/function.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/ActionCallback.hpp"
+#include "fwGuiWx/container/WxMenuContainer.hpp"
+#include "fwGuiWx/container/WxMenuItemContainer.hpp"
+#include "fwGuiWx/layoutManager/MenuLayoutManager.hpp"
+#include "fwGuiWx/Shortcut.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::layoutManager::MenuLayoutManager, ::fwGui::layoutManager::IMenuLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+const std::map< ::fwGui::layoutManager::IMenuLayoutManager::ActionType, int> MenuLayoutManager::SPECIAL_ACTION_TO_WXID =
+                                                ::boost::assign::map_list_of(::fwGui::layoutManager::IMenuLayoutManager::QUIT,wxID_EXIT)
+                                                                            (::fwGui::layoutManager::IMenuLayoutManager::ABOUT,wxID_ABOUT)
+                                                                            (::fwGui::layoutManager::IMenuLayoutManager::HELP,wxID_HELP)
+                                                                            (::fwGui::layoutManager::IMenuLayoutManager::NEW,wxID_NEW)
+                                                                            (::fwGui::layoutManager::IMenuLayoutManager::SEPARATOR,wxID_SEPARATOR);
+
+//-----------------------------------------------------------------------------
+
+MenuLayoutManager::MenuLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+MenuLayoutManager::~MenuLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::createLayout( ::fwGui::container::fwMenu::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiWx::container::WxMenuContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwMenu to WxMenuContainer failed", m_parent);
+
+    wxMenu* menu = m_parent->getWxMenu();
+    unsigned int menuItemIndex = 0;
+    BOOST_FOREACH ( ::fwGui::layoutManager::IMenuLayoutManager::ActionInfo actionInfo, m_actionInfo)
+    {
+        ::fwGuiWx::container::WxMenuItemContainer::sptr menuItem = ::fwGuiWx::container::WxMenuItemContainer::New();
+
+        int actionIdInMenu;
+        if (actionInfo.m_type == ::fwGui::layoutManager::IMenuLayoutManager::DEFAULT)
+        {
+            actionIdInMenu = wxNewId();
+        }
+        else
+        {
+            OSLM_ASSERT("Action type "<<actionInfo.m_type<< " is unknown.",
+                           SPECIAL_ACTION_TO_WXID.find(actionInfo.m_type) != SPECIAL_ACTION_TO_WXID.end());
+            actionIdInMenu = SPECIAL_ACTION_TO_WXID.find(actionInfo.m_type)->second;
+        }
+
+        wxMenuItem *menuItemWx;
+        wxItemKind kind = wxITEM_NORMAL;
+        if(actionInfo.m_isCheckable || actionInfo.m_isRadio)
+        {
+            kind = actionInfo.m_isRadio ? wxITEM_RADIO : wxITEM_CHECK;
+
+        }
+
+        std::string actionNameInMenu = actionInfo.m_name;
+        // create shortcut
+        if( !actionInfo.m_shortcut.empty() )
+        {
+            ::fwGuiWx::Shortcut::sptr shortcut =  ::fwGuiWx::Shortcut::New( actionInfo.m_shortcut );
+            actionNameInMenu += "\t" + shortcut->toString();
+        }
+        menuItemWx = new wxMenuItem(menu, actionIdInMenu , ::fwGuiWx::std2wx( actionNameInMenu ),wxGetTranslation(""), kind ) ;
+        menu->Append( menuItemWx );
+        menuItem->setWxMenuItem(menuItemWx);
+
+        if(!actionInfo.m_isSeparator)
+        {
+            m_menuItems.push_back(menuItem);
+            OSLM_ASSERT("No callback found for menu" << actionInfo.m_name, menuItemIndex < m_callbacks.size());
+            ::fwGui::IMenuItemCallback::sptr callback = m_callbacks.at(menuItemIndex);
+
+            ::fwGuiWx::ActionCallback::sptr wxCallback = ::fwGuiWx::ActionCallback::dynamicCast(callback);
+            SLM_ASSERT("dynamicCast IMenuItemCallback to ActionCallback failed", wxCallback);
+
+            // get MainFrame for binding
+            wxFrame *frame = wxDynamicCast( wxTheApp->GetTopWindow() , wxFrame ) ;
+            SLM_ASSERT( "No wxFrame", frame ) ;
+
+            typedef ::boost::function1< void, wxCommandEvent& > MenuItemCallback;
+            MenuItemCallback call = ::boost::bind( &::fwGuiWx::ActionCallback::executeWx, wxCallback, _1 );
+            frame->Bind( wxEVT_COMMAND_MENU_SELECTED, call, actionIdInMenu);
+
+            menuItemIndex++;
+        }
+        else
+        {
+            m_separators.push_back(menuItem);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::destroyLayout()
+{
+    wxMenu* menu = m_parent->getWxMenu();
+
+    BOOST_FOREACH(::fwGui::container::fwMenuItem::sptr menuItem, m_menuItems)
+    {
+        ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(menuItem);
+        wxMenuItem *item = menuItemContainer->getWxMenuItem();
+        menu->Destroy(item);
+    }
+
+    BOOST_FOREACH(::fwGui::container::fwMenuItem::sptr menuItem, m_separators)
+    {
+        ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(menuItem);
+        wxMenuItem *item = menuItemContainer->getWxMenuItem();
+        menu->Destroy(item);
+    }
+    this->destroyActions();
+    m_menuItems.clear();
+    m_separators.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void MenuLayoutManager::menuItemSetVisible(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isVisible)
+{
+    SLM_FATAL("TODO : MenuLayoutManager::actionIsVisible not yet implemented.");
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isEnabled)
+{
+    ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(fwMenuItem);
+    wxMenuItem *menuItem = menuItemContainer->getWxMenuItem();
+    menuItem->Enable(isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+void MenuLayoutManager::menuItemSetChecked(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isChecked)
+{
+    ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(fwMenuItem);
+    wxMenuItem *menuItem = menuItemContainer->getWxMenuItem();
+    if (menuItem->GetKind() == wxITEM_RADIO || menuItem->GetKind() == wxITEM_CHECK)
+    {
+        menuItem->Check(isChecked);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/TabLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/TabLayoutManager.cpp
new file mode 100644
index 0000000..d0563d7
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/TabLayoutManager.cpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/panel.h>
+#include <wx/sizer.h>
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/layoutManager/TabLayoutManager.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::TabLayoutManager, ::fwGui::layoutManager::TabLayoutManagerBase::REGISTRY_KEY );
+
+
+namespace fwGui
+{
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManager::TabLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+TabLayoutManager::~TabLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void TabLayoutManager::createLayout( ::fwGui::container::fwContainer::sptr parent )
+{
+    SLM_TRACE_FUNC();
+    m_parentContainer = ::fwGuiWx::container::WxContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwContainer to WxContainer failed", m_parentContainer);
+
+    wxWindow* wxContainer = m_parentContainer->getWxContainer();
+    wxBoxSizer* boxSizer = new wxBoxSizer( wxVERTICAL );
+
+    wxContainer->SetSizer( boxSizer );
+
+    m_notebook = new wxNotebook( wxContainer, wxNewId() );
+    boxSizer->Add( m_notebook, 1, wxALL|wxEXPAND, 0);
+
+    std::list< ViewInfo> views = this->getViewsInfo();
+
+    BOOST_FOREACH ( ViewInfo viewInfo, views)
+    {
+        wxPanel * viewPanel = new wxPanel(  m_notebook, wxNewId());
+        ::fwGuiWx::container::WxContainer::sptr subContainer = ::fwGuiWx::container::WxContainer::New();
+        subContainer->setWxContainer(viewPanel);
+        m_subViews.push_back(subContainer);
+
+        m_notebook->AddPage( viewPanel, ::fwGuiWx::std2wx(viewInfo.m_caption), viewInfo.m_isSelect );
+    }
+    wxContainer->Layout();
+}
+
+//-----------------------------------------------------------------------------
+
+void TabLayoutManager::destroyLayout()
+{
+    // Remove pages without removing wxPanel created for this pages
+    // BE CARREFULL => not use m_notebook->DeleteAllPages() because
+    // this method remove wxPanel insides pages but unregisterAllWxContainer
+    // remove this panel also.
+    for ( int pageNumber = m_notebook->GetPageCount()-1;
+            pageNumber >= 0;
+            pageNumber-- )
+    {
+        m_notebook->RemovePage( pageNumber );
+    }
+    this->destroySubViews();
+    m_notebook->Destroy();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/ToolBarLayoutManager.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/ToolBarLayoutManager.cpp
new file mode 100644
index 0000000..46b19e4
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/layoutManager/ToolBarLayoutManager.cpp
@@ -0,0 +1,155 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/app.h>
+#include <wx/menu.h>
+#include <wx/image.h>
+#include <wx/log.h>
+#include <wx/frame.h>
+
+#include <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/function.hpp>
+#include <boost/foreach.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <fwGui/registry/macros.hpp>
+
+#include <fwGuiWx/convert.hpp>
+
+#include "fwGuiWx/ActionCallback.hpp"
+#include "fwGuiWx/container/WxToolBarContainer.hpp"
+#include "fwGuiWx/container/WxMenuItemContainer.hpp"
+#include "fwGuiWx/layoutManager/ToolBarLayoutManager.hpp"
+#include "fwGuiWx/Shortcut.hpp"
+
+
+fwGuiRegisterMacro( ::fwGui::layoutManager::ToolBarLayoutManager,
+                    ::fwGui::layoutManager::IToolBarLayoutManager::REGISTRY_KEY );
+
+namespace fwGui
+{
+namespace layoutManager
+{
+
+//-----------------------------------------------------------------------------
+
+ToolBarLayoutManager::ToolBarLayoutManager(::fwGui::GuiBaseObject::Key key)
+{}
+
+//-----------------------------------------------------------------------------
+
+ToolBarLayoutManager::~ToolBarLayoutManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::createLayout( ::fwGui::container::fwToolBar::sptr parent )
+{
+    SLM_TRACE_FUNC();
+
+    m_parent = ::fwGuiWx::container::WxToolBarContainer::dynamicCast(parent);
+    SLM_ASSERT("dynamicCast fwToolBar to WxToolBarContainer failed", m_parent);
+
+    wxToolBar* toolBar = m_parent->getWxToolBar();
+    unsigned int menuItemIndex = 0;
+    BOOST_FOREACH ( ::fwGui::layoutManager::IToolBarLayoutManager::ActionInfo actionInfo, m_actionInfo)
+    {
+        ::fwGuiWx::container::WxMenuItemContainer::sptr menuItem = ::fwGuiWx::container::WxMenuItemContainer::New();
+
+        int actionIdInMenu = wxNewId();
+        wxItemKind kind = wxITEM_NORMAL;
+        if(actionInfo.m_isCheckable || actionInfo.m_isRadio)
+        {
+            kind = actionInfo.m_isRadio ? wxITEM_RADIO : wxITEM_CHECK;
+        }
+
+        wxImage image = wxNullImage ;
+        if(!actionInfo.m_icon.empty())
+        {
+            if ( !image.LoadFile(::fwGuiWx::std2wx( actionInfo.m_icon )))
+            {
+                wxLogError(wxGetTranslation("Couldn't load image from '%s'."), ::fwGuiWx::std2wx( actionInfo.m_icon ));
+            }
+        }
+
+        if(!actionInfo.m_isSeparator)
+        {
+            wxToolBarToolBase * toolBarToolBase = toolBar->AddTool(actionIdInMenu, ::fwGuiWx::std2wx(actionInfo.m_name), wxBitmap(image),  wxBitmap(image.ConvertToGreyscale()), kind, ::fwGuiWx::std2wx( actionInfo.m_name));
+
+            menuItem->setWxToolItem(toolBarToolBase);
+            m_menuItems.push_back(menuItem);
+            OSLM_ASSERT("No callback found for menu" << actionInfo.m_name, menuItemIndex < m_callbacks.size());
+            ::fwGui::IMenuItemCallback::sptr callback = m_callbacks.at(menuItemIndex);
+
+            ::fwGuiWx::ActionCallback::sptr wxCallback = ::fwGuiWx::ActionCallback::dynamicCast(callback);
+            SLM_ASSERT("dynamicCast IMenuItemCallback to ActionCallback failed", wxCallback);
+
+            // get MainFrame for binding
+            wxFrame *frame = wxDynamicCast( wxTheApp->GetTopWindow() , wxFrame ) ;
+            SLM_ASSERT( "No wxFrame", frame ) ;
+
+            typedef ::boost::function1< void, wxCommandEvent& > MenuItemCallback;
+            MenuItemCallback call = ::boost::bind( &::fwGuiWx::ActionCallback::executeWx, wxCallback, _1 );
+            frame->Bind( wxEVT_COMMAND_TOOL_CLICKED, call, actionIdInMenu);
+
+            menuItemIndex++;
+        }
+        else
+        {
+            toolBar->AddSeparator();
+        }
+    }
+    toolBar->Realize();
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::destroyLayout()
+{
+    this->destroyActions();
+    m_parent->clean();
+    m_menuItems.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+
+void ToolBarLayoutManager::menuItemSetVisible(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isVisible)
+{
+    SLM_FATAL("TODO : ToolBarLayoutManager::actionIsVisible not yet implemented.");
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::menuItemSetEnabled(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isEnabled)
+{
+    wxToolBar* toolBar = m_parent->getWxToolBar();
+    ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(fwMenuItem);
+    wxToolBarToolBase *menuItem = menuItemContainer->getWxToolItem();
+    toolBar->EnableTool(menuItem->GetId(), isEnabled);
+}
+
+//-----------------------------------------------------------------------------
+
+void ToolBarLayoutManager::menuItemSetChecked(::fwGui::container::fwMenuItem::sptr fwMenuItem, bool isChecked)
+{
+    wxToolBar* toolBar = m_parent->getWxToolBar();
+    ::fwGuiWx::container::WxMenuItemContainer::sptr menuItemContainer = ::fwGuiWx::container::WxMenuItemContainer::dynamicCast(fwMenuItem);
+    wxToolBarToolBase *menuItem = menuItemContainer->getWxToolItem();
+    if (menuItem->GetKind() == wxITEM_RADIO || menuItem->GetKind() == wxITEM_CHECK)
+    {
+        toolBar->ToggleTool(menuItem->GetId(), isChecked);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace layoutManager
+} // namespace fwGui
+
+
+
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/ImageURLPanel.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/ImageURLPanel.cpp
new file mode 100644
index 0000000..60e71eb
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/ImageURLPanel.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <wx/wxhtml.h>
+
+#include <fwCore/base.hpp>
+
+#include "fwGuiWx/widgets/ImageURLPanel.hpp"
+
+namespace fwGuiWx
+{
+
+namespace widgets
+{
+
+//------------------------------------------------------------------------------
+
+ImageURLPanel::ImageURLPanel(wxWindow *parent, const wxBitmap& bitmap) : wxPanel(parent, wxID_ANY), m_bitmap(bitmap)
+{
+    SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
+    //this->SetBackgroundColour(*wxRED);
+}
+
+void ImageURLPanel::OnPaint(wxPaintEvent& WXUNUSED(event))
+{
+    wxPaintDC dc( this );
+    dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
+}
+
+void ImageURLPanel::OnWeb(wxMouseEvent& WXUNUSED(event))
+{
+    wxLaunchDefaultBrowser(_T("http://www.ircad.fr/"));
+}
+
+void ImageURLPanel::OnFocus(wxMouseEvent& WXUNUSED(event))
+{
+    wxLaunchDefaultBrowser(_T("http://www.ircad.fr/"));
+}
+
+void ImageURLPanel::OnEnter(wxMouseEvent& WXUNUSED(event))
+{
+    SLM_TRACE("ImageURLPanel::OnEnter");
+    SetCursor(wxCURSOR_HAND);
+}
+
+void ImageURLPanel::OnLeave(wxMouseEvent& WXUNUSED(event))
+{
+    SLM_TRACE("ImageURLPanel::OnLeave");
+    SetCursor(wxCURSOR_ARROW);
+}
+
+//------------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(ImageURLPanel, wxPanel)
+    EVT_PAINT(ImageURLPanel::OnPaint)
+    EVT_LEFT_DCLICK(ImageURLPanel::OnWeb)
+    EVT_ENTER_WINDOW(ImageURLPanel::OnEnter)
+    EVT_LEAVE_WINDOW(ImageURLPanel::OnLeave)
+END_EVENT_TABLE()
+
+//------------------------------------------------------------------------------
+
+} // widgets
+} // fwGuiWx
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/colourpicker.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/colourpicker.cpp
new file mode 100644
index 0000000..86b63c8
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/colourpicker.cpp
@@ -0,0 +1,432 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/////////////////////////////////////////////////////////////////////////////
+// Name:        colourpicker.cpp
+// Purpose:     wxColourPicker source
+// Author:      Juan Antonio Ortega
+// Created:     2006/06/17
+// RCS-ID:      $Id: colourpicker.cpp,v 1.1 2006/06/27 18:10:54 ja_ortega Exp $
+// Copyright:   (c) 2006 Juan Antonio Ortega
+// Licence:     wxWidgets licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include <wx/image.h>
+#include <wx/dcbuffer.h>
+#include <wx/colordlg.h>
+
+#include <fwGuiWx/widgets/colourpicker.hpp>
+
+#ifdef __WXMSW__
+    #include <wx/msw/wrapwin.h>
+    #ifndef SPI_GETFLATMENU
+        #define SPI_GETFLATMENU 0x1022
+    #endif
+    #ifndef CS_DROPSHADOW
+        #define CS_DROPSHADOW   0x00020000
+    #endif
+    #ifndef SPI_GETDROPSHADOW
+        #define SPI_GETDROPSHADOW   0x1024
+    #endif
+#endif
+
+DEFINE_EVENT_TYPE(wxEVT_COMMAND_COLOUR_CHANGED)
+
+const wxColourElement wxColourPanel::ms_colorTable[ROWS][COLUMNS] = {
+    {{wxColour(0, 0, 0), wxGetTranslation("Black")},
+     {wxColour(153, 51, 0), wxGetTranslation("Brown")},
+     {wxColour(51, 51, 0), wxGetTranslation("Olive drab")},
+     {wxColour(0, 51, 0), wxGetTranslation("Dark green")},
+     {wxColour(0, 51, 102), wxGetTranslation("Dark teal")},
+     {wxColour(0, 0, 128), wxGetTranslation("Dark blue")},
+     {wxColour(51, 51, 153), wxGetTranslation("Indigo")},
+     {wxColour(51, 51, 51), wxGetTranslation("Grey 80%")}},
+
+    {{wxColour(128, 0, 0), wxGetTranslation("Dark red")},
+     {wxColour(255, 102, 0), wxGetTranslation("Orange")},
+     {wxColour(128, 128, 0), wxGetTranslation("Dark yellow")},
+     {wxColour(0, 128, 0), wxGetTranslation("Green")},
+     {wxColour(0, 128, 128), wxGetTranslation("Teal")},
+     {wxColour(0, 0, 255), wxGetTranslation("Blue")},
+     {wxColour(102, 102, 153), wxGetTranslation("Blue-gray")},
+     {wxColour(128, 128, 128), wxGetTranslation("Grey 50%")}},
+
+    {{wxColour(255, 0, 0), wxGetTranslation("Red")},
+     {wxColour(255, 153, 0), wxGetTranslation("Light orange")},
+     {wxColour(153, 204, 0), wxGetTranslation("Lime green")},
+     {wxColour(51, 153, 102), wxGetTranslation("Sea green")},
+     {wxColour(51, 204, 204), wxGetTranslation("Aqua")},
+     {wxColour(51, 102, 255), wxGetTranslation("Light blue")},
+     {wxColour(128, 0, 128), wxGetTranslation("Violet")},
+     {wxColour(152, 153, 153), wxGetTranslation("Grey 40%")}},
+
+    {{wxColour(255, 0, 255), wxGetTranslation("Magenta")},
+     {wxColour(255, 204, 0), wxGetTranslation("Gold")},
+     {wxColour(255, 255, 0), wxGetTranslation("Yellow")},
+     {wxColour(0, 255, 0), wxGetTranslation("Bright green")},
+     {wxColour(0, 255, 255), wxGetTranslation("Turquoise")},
+     {wxColour(0, 204, 255), wxGetTranslation("Sky blue")},
+     {wxColour(153, 51, 102), wxGetTranslation("Plum")},
+     {wxColour(192, 192, 192), wxGetTranslation("Grey 25%")}},
+
+    {{wxColour(255, 153, 204), wxGetTranslation("Light pink")},
+     {wxColour(255, 205, 153), wxGetTranslation("Sand")},
+     {wxColour(255, 255, 153), wxGetTranslation("Light yellow")},
+     {wxColour(204, 255, 204), wxGetTranslation("Light green")},
+     {wxColour(204, 255, 255), wxGetTranslation("Light turquoise")},
+     {wxColour(153, 204, 255), wxGetTranslation("Powder blue")},
+     {wxColour(204, 153, 255), wxGetTranslation("Lavender")},
+     {wxColour(255, 255, 255), wxGetTranslation("White")}}
+};
+
+//----------------------------------------------------------------
+// Class wxColourPicker
+//----------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxColourPicker, wxBitmapButton)
+    EVT_BUTTON(-1, wxColourPicker::OnPopup)
+END_EVENT_TABLE()
+
+wxColourPicker::wxColourPicker(wxWindow *parent, int id) : wxBitmapButton(parent, id, CreateColourBitmap(*wxBLACK, wxSize(20, 20), true)){
+    m_colour = *wxWHITE;
+    m_cp = new wxColourPanel(parent);
+    int width = (SQUARE_SEPARATION + SQUARE_WIDTH) * COLUMNS - SQUARE_SEPARATION;
+    int height = (SQUARE_SEPARATION + SQUARE_WIDTH) * ROWS + SQUARE_SEPARATION;
+    m_cp->SetClientSize(width + SQUARE_SEPARATION * 2, height + 23 + 6);
+}
+
+// Get-Set methods
+
+void wxColourPicker::SetColour(wxColour& colour){
+    if (m_colour != colour){
+        m_colour = colour;
+        SetBitmapLabel(CreateColourBitmap(m_colour, GetSize(), true));
+
+        wxColourPickerEvent event(GetId(), m_colour);
+        event.SetEventObject(this);
+        GetEventHandler()->ProcessEvent(event);
+    }
+}
+
+wxColour wxColourPicker::GetColour(){
+    return m_colour;
+}
+
+// Overriden methods
+
+void wxColourPicker::DoSetSize(int x, int y, int width, int height, int sizeFlags){
+    wxBitmapButton::DoSetSize(x, y, width, height, sizeFlags);
+    SetBitmapLabel(CreateColourBitmap(m_colour, GetSize(), true));
+    SetBitmapDisabled(CreateColourBitmap(m_colour, GetSize(), false));
+}
+
+// Events
+
+void wxColourPicker::OnPopup(wxCommandEvent& WXUNUSED(e)){
+#ifdef __WXMSW__
+//    ::PostMessage((HWND) GetHandle(), BM_SETSTATE, TRUE, 0);
+#endif
+    int x = 0;
+    int y = GetSize().y;
+    ClientToScreen(&x, &y);
+    m_cp->SetColour(m_colour);
+    m_cp->SetSize(x, y, -1, -1, wxSIZE_USE_EXISTING);
+    m_cp->Popup(::wxGetTopLevelParent(this), this);
+}
+
+// Private methods
+
+wxBitmap wxColourPicker::CreateColourBitmap(const wxColour& c, const wxSize& size, bool enabled){
+    int x, y, i;
+    wxImage image;
+    wxColour dark = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+    wxColour light = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT);
+
+    image.Create(size.x - 10, size.y - 10);
+
+    wxColour maskColour = wxColour(255, 0, 255);
+    if (c == maskColour) maskColour = wxColour(192, 192, 192);
+
+    for (x = 0; x < size.x - 10; x++)
+        for (y = 0; y < size.y - 10; y++)
+            image.SetRGB(x, y, maskColour.Red(), maskColour.Green(), maskColour.Blue());
+
+    if (enabled)
+        for (x = 0; x < size.x - 10 - 12; x++)
+            for (y = 0; y < size.y - 10; y++){
+                wxColour pixcol = c;
+                if (x == 0 || x == size.x - 23 || y == 0 || y == size.y - 11)
+                    pixcol = *wxBLACK;
+                image.SetRGB(x, y, pixcol.Red(), pixcol.Green(), pixcol.Blue());
+            }
+
+    if (size.x - 19 >= 0){
+        for (y = 0; y < size.y - 10; y++){
+            if (enabled) image.SetRGB(size.x - 18, y, light.Red(), light.Green(), light.Blue());
+            image.SetRGB(size.x - 19, y, dark.Red(), dark.Green(), dark.Blue());
+        }
+    }
+
+    if (size.x - 16 >= 0){
+        wxColour arrowColour = enabled ? *wxBLACK : wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
+        int width = 5;
+        int x = size.x - 16;
+        int y = (size.y - 10 - 4) / 2;
+        while (width > 0){
+            for (i = 0; i < width; i++)
+                image.SetRGB(x + i, y, arrowColour.Red(), arrowColour.Green(), arrowColour.Blue());
+            width -= 2;
+            x++;
+            y++;
+        }
+    }
+
+    wxBitmap res = wxBitmap(image);
+    res.SetMask(new wxMask(res, maskColour));
+    return res;
+}
+
+//----------------------------------------------------------------
+// Class wxColourPanel
+//----------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxColourPanel, wxPopupTransientWindow)
+    EVT_PAINT(wxColourPanel::OnPaint)
+    EVT_MOTION(wxColourPanel::OnMouseMotion)
+    EVT_LEAVE_WINDOW(wxColourPanel::OnMouseLeave)
+    EVT_LEFT_UP(wxColourPanel::OnMouseDown)
+END_EVENT_TABLE()
+
+wxColourPanel::wxColourPanel(wxWindow *parent) : wxPopupTransientWindow(parent){
+    SetBackgroundStyle(wxBG_STYLE_CUSTOM);
+    int x, y;
+    wxImage maskImage;
+    wxImage image;
+    int width = (SQUARE_SEPARATION + SQUARE_WIDTH) * COLUMNS - SQUARE_SEPARATION;
+    int height = (SQUARE_SEPARATION + SQUARE_WIDTH) * ROWS - SQUARE_SEPARATION;
+    image.Create(width, height);
+    maskImage.Create(width, height);
+
+    for (x = 0; x < width; x++)
+        for (y = 0; y < height; y++)
+            image.SetRGB(x, y, 255, 255, 255);
+
+    int squareStart = SQUARE_WIDTH + SQUARE_SEPARATION;
+    for (x = 0; x < COLUMNS; x++)
+        for (y = 0; y < ROWS; y++){
+            PaintSquare(image, maskImage, x * squareStart, y * squareStart, ms_colorTable[y][x].m_colour);
+        }
+    m_back = wxBitmap(image);
+    m_back.SetMask(new wxMask(wxBitmap(maskImage, 1)));
+
+    m_isFlat = false;
+    m_osHasDropShadow = false;
+#ifdef __WXMSW__
+    int majorVersion, minorVersion;
+    int osVersion = ::wxGetOsVersion(&majorVersion, &minorVersion);
+    bool isXp = osVersion == wxOS_WINDOWS_NT && (majorVersion > 5 || (majorVersion == 5 && minorVersion >= 1));
+    if (isXp){
+//        BOOL flatMenu;
+//        ::SystemParametersInfo(SPI_GETFLATMENU, 0, &flatMenu, FALSE);
+//        m_isFlat = flatMenu != 0;
+//        BOOL dropShadow;
+//        ::SystemParametersInfo(SPI_GETDROPSHADOW, 0, &dropShadow, FALSE);
+//        m_osHasDropShadow = dropShadow != 0;
+    }
+#endif
+    if (!m_isFlat) SetWindowStyle(wxDOUBLE_BORDER);
+}
+
+// Get-Set methods
+
+void wxColourPanel::SetColour(wxColour& colour){
+    m_selectedColour = colour;
+}
+
+wxColour wxColourPanel::GetColour(){
+    return m_selectedColour;
+}
+
+// Overriden methods
+
+void wxColourPanel::Popup(wxWindow *focus, wxColourPicker *picker){
+#ifdef __WXMSW__
+    if (m_osHasDropShadow){
+//        DWORD style = GetClassLong((HWND) GetHandle(), GCL_STYLE);
+//        SetClassLong((HWND) GetHandle(), GCL_STYLE, style | CS_DROPSHADOW);
+    }
+#endif
+    m_picker = picker;
+    wxPopupTransientWindow::Popup(focus);
+}
+
+void wxColourPanel::Dismiss(){
+    SetToolTip(_T(""));
+    wxPopupTransientWindow::Dismiss();
+#ifdef __WXMSW__
+    if (m_osHasDropShadow){
+//        DWORD style = GetClassLong((HWND) GetHandle(), GCL_STYLE);
+//        SetClassLong((HWND) GetHandle(), GCL_STYLE, style & ~CS_DROPSHADOW);
+    }
+//    ::PostMessage((HWND) m_picker->GetHandle(), BM_SETSTATE, FALSE, 0);
+#endif
+}
+
+// Events
+
+void wxColourPanel::OnMouseMotion(wxMouseEvent& e){
+    wxColour prevOver = m_overColour;
+    bool prevOverMore = m_overMore;
+    wxString colourName;
+    GetColourFromPoint(e.GetX(), e.GetY(), m_overColour, m_overMore, colourName);
+
+    if (prevOver != m_overColour || m_overMore != prevOverMore){
+        SetToolTip(colourName);
+        Refresh();
+    }
+}
+
+void wxColourPanel::OnMouseDown(wxMouseEvent& e){
+    bool moreColours;
+    wxColour colour;
+    wxString colourName;
+
+    GetColourFromPoint(e.GetX(), e.GetY(), colour, moreColours, colourName);
+    Dismiss();
+    if (moreColours){
+        wxColourDialog cd(::wxGetTopLevelParent(m_picker));
+        if (cd.ShowModal() == wxID_OK)
+            m_selectedColour = cd.GetColourData().GetColour();
+    }else if (colour != wxNullColour)
+        m_selectedColour = colour;
+
+    m_picker->SetColour(m_selectedColour);
+}
+
+void wxColourPanel::OnMouseLeave(wxMouseEvent& WXUNUSED(e)){
+    m_overMore = false;
+    m_overColour = wxNullColour;
+    Refresh();
+}
+
+void wxColourPanel::OnPaint(wxPaintEvent& WXUNUSED(e)){
+    wxPaintDC dc(this);
+    int x, y;
+    wxSize size = GetClientSize();
+    wxColour colourMenu = wxSystemSettings::GetColour(wxSYS_COLOUR_MENU);
+    wxBufferedDC bdc(&dc, size);
+
+    if (m_isFlat)
+        bdc.SetPen(wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)));
+    else
+        bdc.SetPen(wxPen(colourMenu));
+
+    bdc.SetBrush(wxBrush(colourMenu, wxSOLID));
+    bdc.Clear();
+    bdc.DrawRectangle(0, 0, size.x, size.y);
+
+    int alpha = 48;
+    wxColour selection = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
+    wxColour lighterSelection = wxColour(
+        (colourMenu.Red() * (255 - alpha) + selection.Red() * alpha) >> 8,
+        (colourMenu.Green() * (255 - alpha) + selection.Green() * alpha) >> 8,
+        (colourMenu.Blue() * (255 - alpha) + selection.Blue() * alpha) >> 8);
+
+    bool found = false;
+    int squareStart = SQUARE_WIDTH + SQUARE_SEPARATION;
+    for (x = 0; x < COLUMNS; x++)
+        for (y = 0; y < ROWS; y++){
+            if (ms_colorTable[y][x].m_colour == m_selectedColour){
+                found = true;
+                bdc.SetBrush(wxBrush(lighterSelection, wxSOLID));
+                bdc.SetPen(wxPen(selection));
+                bdc.DrawRectangle(SQUARE_SEPARATION + x * squareStart - SQUARE_SEPARATION / 2,
+                                  SQUARE_SEPARATION + y * squareStart - SQUARE_SEPARATION / 2,
+                                  squareStart, squareStart);
+            }
+            if (m_overColour != wxNullColour && ms_colorTable[y][x].m_colour == m_overColour){
+                bdc.SetBrush(wxBrush(selection, wxSOLID));
+                bdc.SetPen(wxPen(selection));
+                bdc.DrawRectangle(SQUARE_SEPARATION + x * squareStart - SQUARE_SEPARATION / 2,
+                                  SQUARE_SEPARATION + y * squareStart - SQUARE_SEPARATION / 2,
+                                  squareStart, squareStart);
+            }
+        }
+
+    int paletteHeight = squareStart * ROWS + SQUARE_SEPARATION;
+    if (m_overMore || !found){
+        if (m_overMore){
+            bdc.SetBrush(wxBrush(selection, wxSOLID));
+            bdc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
+        }else{
+            bdc.SetBrush(wxBrush(lighterSelection, wxSOLID));
+            bdc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT));
+        }
+        bdc.SetPen(wxPen(selection));
+        bdc.DrawRectangle(6, paletteHeight, size.x - 12, size.y - paletteHeight - 6);
+    }else
+        bdc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUTEXT));
+
+    bdc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+    wxString msgMoreColours = wxGetTranslation("More Colours...");
+    int w, h;
+    bdc.GetTextExtent(msgMoreColours, &w, &h);
+    bdc.DrawText(msgMoreColours, (size.x - w) / 2, paletteHeight + (size.y - paletteHeight - 6 - h) / 2);
+
+    bdc.DrawBitmap(m_back, SQUARE_SEPARATION, SQUARE_SEPARATION, true);
+}
+
+// Private methods
+
+void wxColourPanel::GetColourFromPoint(int x, int y, wxColour& colour, bool& more, wxString& name){
+    int selX = (x - SQUARE_SEPARATION / 2) / (SQUARE_WIDTH + SQUARE_SEPARATION);
+    int selY = (y - SQUARE_SEPARATION / 2) / (SQUARE_WIDTH + SQUARE_SEPARATION);
+    wxSize size = GetClientSize();
+
+    colour = wxNullColour;
+    more = false;
+    name = _T("");
+    int paletteHeight = (SQUARE_WIDTH + SQUARE_SEPARATION) * ROWS + SQUARE_SEPARATION;
+    if (selX >= 0 && selX < COLUMNS && y >= 0 && selY < ROWS){
+        name = ms_colorTable[selY][selX].m_name;
+        colour = ms_colorTable[selY][selX].m_colour;
+    }else if (x >= 6 && x < size.x - 6 && y >= paletteHeight && y < size.y - 6){
+        more = true;
+        name = wxGetTranslation("More colours");
+    }
+}
+
+void wxColourPanel::PaintSquare(wxImage& image, wxImage& maskImage, int x, int y, wxColour col){
+    wxColour dark = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+    for (int xx = x; xx < x + SQUARE_WIDTH; xx++)
+        for (int yy = y; yy < y + SQUARE_WIDTH; yy++){
+            wxColour color = col;
+            if (x == xx || xx == x + SQUARE_WIDTH - 1) color = dark;
+            if (y == yy || yy == y + SQUARE_WIDTH - 1) color = dark;
+            image.SetRGB(xx, yy, color.Red(), color.Green(), color.Blue());
+            maskImage.SetRGB(xx, yy, 255, 255, 255);
+        }
+}
+
+//----------------------------------------------------------------
+// Class wxColourPickerEvent
+//----------------------------------------------------------------
+
+wxColourPickerEvent::wxColourPickerEvent(int id, wxColour& colour) :
+    wxCommandEvent(wxEVT_COMMAND_COLOUR_CHANGED, id)
+{
+    m_colour = colour;
+}
+
+wxColour wxColourPickerEvent::GetColour(){
+    return m_colour;
+}
+
+wxEvent* wxColourPickerEvent::Clone() const{
+    wxColourPickerEvent *event = new wxColourPickerEvent(*this);
+    event->m_colour = m_colour;
+    return event;
+}
diff --git a/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/fwProgressDialog.cpp b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/fwProgressDialog.cpp
new file mode 100644
index 0000000..10c749b
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/src/fwGuiWx/widgets/fwProgressDialog.cpp
@@ -0,0 +1,696 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <wx/wxprec.h>
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+#if wxUSE_PROGRESSDLG
+
+#ifndef WX_PRECOMP
+    #include <wx/utils.h>
+    #include <wx/frame.h>
+    #include <wx/button.h>
+    #include <wx/stattext.h>
+    #include <wx/sizer.h>
+    #include <wx/event.h>
+    #include <wx/gauge.h>
+    #include <wx/intl.h>
+    #include <wx/dcclient.h>
+    #include <wx/timer.h>
+    #include <wx/settings.h>
+    #include <wx/app.h>
+#endif
+
+//#include "wx/progdlg.h"
+#include "wx/evtloop.h"
+
+
+
+#include "fwGuiWx/widgets/fwProgressDialog.hpp"
+
+
+// ---------------------------------------------------------------------------
+// macros
+// ---------------------------------------------------------------------------
+
+/* Macro for avoiding #ifdefs when value have to be different depending on size of
+   device we display on - take it from something like wxDesktopPolicy in the future
+ */
+
+#if defined(__SMARTPHONE__)
+    #define wxLARGESMALL(large,small) small
+#else
+    #define wxLARGESMALL(large,small) large
+#endif
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+#define LAYOUT_MARGIN wxLARGESMALL(8,2)
+
+static const int wxID_SKIP = 32000;  // whatever
+
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+// update the label to show the given time (in seconds)
+static void SetTimeLabel(unsigned long val, wxStaticText *label);
+
+// ----------------------------------------------------------------------------
+// event tables
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(fwProgressDialog, wxDialog)
+    EVT_BUTTON(wxID_CANCEL, fwProgressDialog::OnCancel)
+    EVT_BUTTON(wxID_SKIP, fwProgressDialog::OnSkip)
+
+    EVT_CLOSE(fwProgressDialog::OnClose)
+END_EVENT_TABLE()
+
+IMPLEMENT_CLASS(fwProgressDialog, wxDialog)
+
+// ============================================================================
+// fwProgressDialog implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// fwProgressDialog creation
+// ----------------------------------------------------------------------------
+
+fwProgressDialog::fwProgressDialog(const wxString& title,
+                                   const wxString& message,
+                                   int maximum,
+                                   wxWindow *parent,
+                                   int style):
+#if wxCHECK_VERSION(2, 9, 1)
+                  wxDialog(GetParentForModalDialog(parent, style), wxID_ANY, title),
+#else
+                  wxDialog(GetParentForModalDialog(parent), wxID_ANY, title),
+#endif
+                  m_skip(false),
+                  m_delay(3),
+                  m_hasAbortButton(false),
+                  m_hasSkipButton(false)
+{
+    // we may disappear at any moment, let the others know about it
+    SetExtraStyle(GetExtraStyle() | wxWS_EX_TRANSIENT);
+    m_windowStyle |= style;
+
+    m_hasAbortButton = (style & wxPD_CAN_ABORT) != 0;
+    m_hasSkipButton = (style & wxPD_CAN_SKIP) != 0;
+
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+    // we have to remove the "Close" button from the title bar then as it is
+    // confusing to have it - it doesn't work anyhow
+    //
+    // FIXME: should probably have a (extended?) window style for this
+    if ( !m_hasAbortButton )
+    {
+        EnableCloseButton(false);
+    }
+#endif // wxMSW
+
+#if defined(__SMARTPHONE__)
+    SetLeftMenu();
+#endif
+
+    m_state = m_hasAbortButton ? Continue : Uncancelable;
+    m_maximum = maximum;
+
+#if defined(__WXMSW__) || defined(__WXPM__)
+    // we can't have values > 65,536 in the progress control under Windows, so
+    // scale everything down
+    m_factor = m_maximum / 65536 + 1;
+    m_maximum /= m_factor;
+#endif // __WXMSW__
+
+    m_parentTop = wxGetTopLevelParent(parent);
+
+    wxClientDC dc(this);
+    dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+    wxCoord widthText = 0;
+    dc.GetTextExtent(message, &widthText, NULL, NULL, NULL, NULL);
+
+    // top-level sizerTop
+    wxSizer * const sizerTop = new wxBoxSizer(wxVERTICAL);
+
+    m_msg = new wxStaticText(this, wxID_ANY, message);
+    sizerTop->Add(m_msg, 0, wxLEFT | wxTOP, 2*LAYOUT_MARGIN);
+
+    if ( maximum > 0 )
+    {
+        int gauge_style = wxGA_HORIZONTAL;
+        if ( style & wxPD_SMOOTH )
+            gauge_style |= wxGA_SMOOTH;
+        m_gauge = new wxGauge
+                      (
+                        this,
+                        wxID_ANY,
+                        m_maximum,
+                        wxDefaultPosition,
+                        // make the progress bar sufficiently long
+                        wxSize(wxMin(wxGetClientDisplayRect().width/3, 300), -1),
+                        gauge_style
+                      );
+
+        sizerTop->Add(m_gauge, 0, wxLEFT | wxRIGHT | wxTOP | wxEXPAND, 2*LAYOUT_MARGIN);
+        m_gauge->SetValue(0);
+    }
+    else
+    {
+        m_gauge = NULL;
+    }
+
+    // create the estimated/remaining/total time zones if requested
+    m_elapsed =
+    m_estimated =
+    m_remaining = NULL;
+    m_display_estimated =
+    m_last_timeupdate =
+    m_break = 0;
+    m_ctdelay = 0;
+
+    // also count how many labels we really have
+    size_t nTimeLabels = 0;
+
+    wxSizer * const sizerLabels = new wxFlexGridSizer(2);
+
+    if ( style & wxPD_ELAPSED_TIME )
+    {
+        nTimeLabels++;
+
+        m_elapsed = CreateLabel(wxGetTranslation("Elapsed time:"), sizerLabels);
+    }
+
+    if ( style & wxPD_ESTIMATED_TIME )
+    {
+        nTimeLabels++;
+
+        m_estimated = CreateLabel(wxGetTranslation("Estimated time:"), sizerLabels);
+    }
+
+    if ( style & wxPD_REMAINING_TIME )
+    {
+        nTimeLabels++;
+
+        m_remaining = CreateLabel(wxGetTranslation("Remaining time:"), sizerLabels);
+    }
+    sizerTop->Add(sizerLabels, 0, wxALIGN_CENTER_HORIZONTAL | wxTOP, LAYOUT_MARGIN);
+
+    if ( nTimeLabels > 0 )
+    {
+        // set it to the current time
+        m_timeStart = wxGetCurrentTime();
+    }
+
+#if defined(__SMARTPHONE__)
+    if ( m_hasSkipButton )
+        SetRightMenu(wxID_SKIP, wxGetTranslation("Skip"));
+    if ( m_hasAbortButton )
+        SetLeftMenu(wxID_CANCEL);
+#else
+    m_btnAbort =
+    m_btnSkip = NULL;
+
+    wxBoxSizer *buttonSizer = new wxBoxSizer(wxHORIZONTAL);
+
+    // Windows dialogs usually have buttons in the lower right corner
+    const int sizerFlags =
+#if defined(__WXMSW__) || defined(__WXPM__)
+                           wxALIGN_RIGHT | wxALL
+#else // !MSW
+                           wxALIGN_CENTER_HORIZONTAL | wxBOTTOM | wxTOP
+#endif // MSW/!MSW
+                           ;
+
+    if ( m_hasSkipButton )
+    {
+        m_btnSkip = new wxButton(this, wxID_SKIP, wxGetTranslation("&Skip"));
+
+        buttonSizer->Add(m_btnSkip, 0, sizerFlags, LAYOUT_MARGIN);
+    }
+
+    if ( m_hasAbortButton )
+    {
+        m_btnAbort = new wxButton(this, wxID_CANCEL);
+
+        buttonSizer->Add(m_btnAbort, 0, sizerFlags, LAYOUT_MARGIN);
+    }
+
+    sizerTop->Add(buttonSizer, 0, sizerFlags, LAYOUT_MARGIN );
+#endif // __SMARTPHONE__/!__SMARTPHONE__
+
+    SetSizerAndFit(sizerTop);
+
+    Centre(wxCENTER_FRAME | wxBOTH);
+
+    if ( style & wxPD_APP_MODAL )
+    {
+        m_winDisabler = new wxWindowDisabler(this);
+    }
+    else
+    {
+        if ( m_parentTop )
+            m_parentTop->Disable();
+        m_winDisabler = NULL;
+    }
+
+    Show();
+    Enable();
+
+    // this one can be initialized even if the others are unknown for now
+    //
+    // NB: do it after calling Layout() to keep the labels correctly aligned
+    if ( m_elapsed )
+    {
+        SetTimeLabel(0, m_elapsed);
+    }
+
+    Update();
+}
+
+wxStaticText *
+fwProgressDialog::CreateLabel(const wxString& text, wxSizer *sizer)
+{
+    wxStaticText *label = new wxStaticText(this, wxID_ANY, text);
+    wxStaticText *value = new wxStaticText(this, wxID_ANY, wxGetTranslation("unknown"));
+
+    // select placement most native or nice on target GUI
+#if defined(__SMARTPHONE__)
+    // value and time to the left in two rows
+    sizer->Add(label, 1, wxALIGN_LEFT);
+    sizer->Add(value, 1, wxALIGN_LEFT);
+#elif defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMAC__) || defined(__WXGTK20__)
+    // value and time centered in one row
+    sizer->Add(label, 1, wxLARGESMALL(wxALIGN_RIGHT,wxALIGN_LEFT) | wxTOP | wxRIGHT, LAYOUT_MARGIN);
+    sizer->Add(value, 1, wxALIGN_LEFT | wxTOP, LAYOUT_MARGIN);
+#else
+    // value and time to the right in one row
+    sizer->Add(label);
+    sizer->Add(value, 0, wxLEFT, LAYOUT_MARGIN);
+#endif
+
+    return value;
+}
+
+// ----------------------------------------------------------------------------
+// fwProgressDialog operations
+// ----------------------------------------------------------------------------
+
+bool
+fwProgressDialog::Update(int value, const wxString& newmsg, bool *skip)
+{
+    wxASSERT_MSG( value == -1 || m_gauge, wxT("cannot update non existent dialog") );
+
+#ifdef __WXMSW__
+    value /= m_factor;
+#endif // __WXMSW__
+
+    wxASSERT_MSG( value <= m_maximum, wxT("invalid progress value") );
+
+    if ( m_gauge )
+        m_gauge->SetValue(value);
+
+    UpdateMessage(newmsg);
+
+    if ( (m_elapsed || m_remaining || m_estimated) && (value != 0) )
+    {
+        unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+        if (    m_last_timeupdate < elapsed
+             || value == m_maximum
+           )
+        {
+            m_last_timeupdate = elapsed;
+            unsigned long estimated = m_break +
+                  (unsigned long)(( (double) (elapsed-m_break) * m_maximum ) / ((double)value)) ;
+            if (    estimated > m_display_estimated
+                 && m_ctdelay >= 0
+               )
+            {
+                ++m_ctdelay;
+            }
+            else if (    estimated < m_display_estimated
+                      && m_ctdelay <= 0
+                    )
+            {
+                --m_ctdelay;
+            }
+            else
+            {
+                m_ctdelay = 0;
+            }
+            if (    m_ctdelay >= m_delay          // enough confirmations for a higher value
+                 || m_ctdelay <= (m_delay*-1)     // enough confirmations for a lower value
+                 || value == m_maximum            // to stay consistent
+                 || elapsed > m_display_estimated // to stay consistent
+                 || ( elapsed > 0 && elapsed < 4 ) // additional updates in the beginning
+               )
+            {
+                m_display_estimated = estimated;
+                m_ctdelay = 0;
+            }
+        }
+
+        long display_remaining = m_display_estimated - elapsed;
+        if ( display_remaining < 0 )
+        {
+            display_remaining = 0;
+        }
+
+        SetTimeLabel(elapsed, m_elapsed);
+        SetTimeLabel(m_display_estimated, m_estimated);
+        SetTimeLabel(display_remaining, m_remaining);
+    }
+
+    if ( value == m_maximum )
+    {
+        if ( m_state == Finished )
+        {
+            // ignore multiple calls to Update(m_maximum): it may sometimes be
+            // troublesome to ensure that Update() is not called twice with the
+            // same value (e.g. because of the rounding errors) and if we don't
+            // return now we're going to generate asserts below
+            return true;
+        }
+
+        // so that we return true below and that out [Cancel] handler knew what
+        // to do
+        m_state = Finished;
+        if( !HasFlag(wxPD_AUTO_HIDE) )
+        {
+            EnableClose();
+            DisableSkip();
+#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
+            EnableCloseButton();
+#endif // __WXMSW__
+
+            if ( newmsg.empty() )
+            {
+                // also provide the finishing message if the application didn't
+                m_msg->SetLabel(wxGetTranslation("Done."));
+            }
+
+            wxCHECK_MSG(wxEventLoopBase::GetActive(), false,
+                        "fwProgressDialog::Update needs a running event loop");
+
+            // allow the window to repaint:
+            // NOTE: since we yield only for UI events with this call, there
+            //       should be no side-effects
+            //wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
+            Update();
+
+            // NOTE: this call results in a new event loop being created
+            //       and to a call to ProcessPendingEvents() (which may generate
+            //       unwanted re-entrancies).
+            (void)ShowModal();
+        }
+        else // auto hide
+        {
+            // reenable other windows before hiding this one because otherwise
+            // Windows wouldn't give the focus back to the window which had
+            // been previously focused because it would still be disabled
+            ReenableOtherWindows();
+
+            Hide();
+        }
+    }
+    else // not at maximum yet
+    {
+        return DoAfterUpdate(skip);
+    }
+
+    // update the display in case yielding above didn't do it
+    Update();
+
+    return m_state != Canceled;
+}
+
+bool fwProgressDialog::Pulse(const wxString& newmsg, bool *skip)
+{
+    wxASSERT_MSG( m_gauge, wxT("cannot update non existent dialog") );
+
+    // show a bit of progress
+    m_gauge->Pulse();
+
+    UpdateMessage(newmsg);
+
+    if (m_elapsed || m_remaining || m_estimated)
+    {
+        unsigned long elapsed = wxGetCurrentTime() - m_timeStart;
+
+        SetTimeLabel(elapsed, m_elapsed);
+        SetTimeLabel((unsigned long)-1, m_estimated);
+        SetTimeLabel((unsigned long)-1, m_remaining);
+    }
+
+    return DoAfterUpdate(skip);
+}
+
+bool fwProgressDialog::DoAfterUpdate(bool *skip)
+{
+    wxCHECK_MSG(wxEventLoopBase::GetActive(), false,
+                "fwProgressDialog::DoAfterUpdate needs a running event loop");
+
+    // we have to yield because not only we want to update the display but
+    // also to process the clicks on the cancel and skip buttons
+    // NOTE: using YieldFor() this call shouldn't give re-entrancy problems
+    //       for event handlers not interested to UI/user-input events.
+    //wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI|wxEVT_CATEGORY_USER_INPUT);
+
+    Update();
+
+    if ( m_skip && skip && !*skip )
+    {
+        *skip = true;
+        m_skip = false;
+        EnableSkip();
+    }
+
+    return m_state != Canceled;
+}
+
+void fwProgressDialog::Resume()
+{
+    m_state = Continue;
+    m_ctdelay = m_delay; // force an update of the elapsed/estimated/remaining time
+    m_break += wxGetCurrentTime()-m_timeStop;
+
+    EnableAbort();
+    EnableSkip();
+    m_skip = false;
+}
+
+bool fwProgressDialog::Show( bool show )
+{
+    // reenable other windows before hiding this one because otherwise
+    // Windows wouldn't give the focus back to the window which had
+    // been previously focused because it would still be disabled
+    if(!show)
+        ReenableOtherWindows();
+
+    return wxDialog::Show(show);
+}
+
+int fwProgressDialog::GetValue() const
+{
+    if (m_gauge)
+        return m_gauge->GetValue();
+    return wxNOT_FOUND;
+}
+
+int fwProgressDialog::GetRange() const
+{
+    if (m_gauge)
+        return m_gauge->GetRange();
+    return wxNOT_FOUND;
+}
+
+wxString fwProgressDialog::GetMessage() const
+{
+    return m_msg->GetLabel();
+}
+
+// ----------------------------------------------------------------------------
+// event handlers
+// ----------------------------------------------------------------------------
+
+void fwProgressDialog::OnCancel(wxCommandEvent& event)
+{
+    if ( m_state == Finished )
+    {
+        // this means that the count down is already finished and we're being
+        // shown as a modal dialog - so just let the default handler do the job
+        event.Skip();
+    }
+    else
+    {
+        // request to cancel was received, the next time Update() is called we
+        // will handle it
+        m_state = Canceled;
+
+        // update the buttons state immediately so that the user knows that the
+        // request has been noticed
+        DisableAbort();
+        DisableSkip();
+
+        // save the time when the dialog was stopped
+        m_timeStop = wxGetCurrentTime();
+    }
+}
+
+void fwProgressDialog::OnSkip(wxCommandEvent& WXUNUSED(event))
+{
+    DisableSkip();
+    m_skip = true;
+}
+
+void fwProgressDialog::OnClose(wxCloseEvent& event)
+{
+    if ( m_state == Uncancelable )
+    {
+        // can't close this dialog
+        event.Veto();
+    }
+    else if ( m_state == Finished )
+    {
+        // let the default handler close the window as we already terminated
+        event.Skip();
+    }
+    else
+    {
+        // next Update() will notice it
+        m_state = Canceled;
+        DisableAbort();
+        DisableSkip();
+
+        m_timeStop = wxGetCurrentTime();
+    }
+}
+
+// ----------------------------------------------------------------------------
+// destruction
+// ----------------------------------------------------------------------------
+
+fwProgressDialog::~fwProgressDialog()
+{
+    // normally this should have been already done, but just in case
+    ReenableOtherWindows();
+}
+
+void fwProgressDialog::ReenableOtherWindows()
+{
+    if ( HasFlag(wxPD_APP_MODAL) )
+    {
+        delete m_winDisabler;
+        m_winDisabler = NULL;
+    }
+    else
+    {
+        if ( m_parentTop )
+            m_parentTop->Enable();
+    }
+}
+
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static void SetTimeLabel(unsigned long val, wxStaticText *label)
+{
+    if ( label )
+    {
+        wxString s;
+
+        if (val != (unsigned long)-1)
+        {
+            unsigned long hours = val / 3600;
+            unsigned long minutes = (val % 3600) / 60;
+            unsigned long seconds = val % 60;
+            s.Printf(wxT("%lu:%02lu:%02lu"), hours, minutes, seconds);
+        }
+        else
+        {
+            s = wxGetTranslation("Unknown");
+        }
+
+        if ( s != label->GetLabel() )
+            label->SetLabel(s);
+    }
+}
+
+void fwProgressDialog::EnableSkip(bool enable)
+{
+    if(m_hasSkipButton)
+    {
+#ifdef __SMARTPHONE__
+        if(enable)
+            SetRightMenu(wxID_SKIP, wxGetTranslation("Skip"));
+        else
+            SetRightMenu();
+#else
+        if(m_btnSkip)
+            m_btnSkip->Enable(enable);
+#endif
+    }
+}
+
+void fwProgressDialog::EnableAbort(bool enable)
+{
+    if(m_hasAbortButton)
+    {
+#ifdef __SMARTPHONE__
+        if(enable)
+            SetLeftMenu(wxID_CANCEL); // stock buttons makes Cancel label
+        else
+            SetLeftMenu();
+#else
+        if(m_btnAbort)
+            m_btnAbort->Enable(enable);
+#endif
+    }
+}
+
+void fwProgressDialog::EnableClose()
+{
+    if(m_hasAbortButton)
+    {
+#ifdef __SMARTPHONE__
+        SetLeftMenu(wxID_CANCEL, wxGetTranslation("Close"));
+#else
+        if(m_btnAbort)
+        {
+            m_btnAbort->Enable();
+            m_btnAbort->SetLabel(wxGetTranslation("Close"));
+        }
+#endif
+    }
+}
+
+void fwProgressDialog::UpdateMessage(const wxString &newmsg)
+{
+    wxCHECK_RET(wxEventLoopBase::GetActive(),
+                "fwProgressDialog::UpdateMessage needs a running event loop");
+
+    if ( !newmsg.empty() && newmsg != m_msg->GetLabel() )
+    {
+        m_msg->SetLabel(newmsg);
+
+        // allow the window to repaint:
+        // NOTE: since we yield only for UI events with this call, there
+        //       should be no side-effects
+        //wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI);
+        Update();
+    }
+}
+
+#endif // wxUSE_PROGRESSDLG
+
diff --git a/SrcLib/core/fwGuiWx/test/CMakeLists.txt b/SrcLib/core/fwGuiWx/test/CMakeLists.txt
new file mode 100644
index 0000000..3d7f4da
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/test/CMakeLists.txt
@@ -0,0 +1,12 @@
+find_package(wxWidgets COMPONENTS base core adv aui)
+if(wxWidgets_FOUND)
+    fwLoadProperties()
+
+    find_package (Boost COMPONENTS thread date_time REQUIRED)
+    find_package(CppUnit)
+    fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+    fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+else(wxWidgets_FOUND)
+    message(WARNING "Required package wxWidgets not found, lib 'fwGuiWxTest' disabled.")
+endif(wxWidgets_FOUND)
diff --git a/SrcLib/core/fwGuiWx/test/Properties.cmake b/SrcLib/core/fwGuiWx/test/Properties.cmake
new file mode 100644
index 0000000..b9116aa
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwGuiWxTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwThread fwGuiWx )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwGuiWx/test/cppunit.options b/SrcLib/core/fwGuiWx/test/cppunit.options
new file mode 100644
index 0000000..1efb4ad
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/test/cppunit.options
@@ -0,0 +1,17 @@
+CLASSTEST=[
+    'WorkerWxTest',
+]
+
+USE = [
+    'wxCore',
+    'boost',
+    'boostThread',
+    'boostDateTime',
+    ]
+LIB = [
+    'fwTest_0-1',
+    'fwThread_0-1',
+    'fwGuiWx_0-1',
+    ]
+
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwGuiWx/test/tu/include/WorkerWxTest.hpp b/SrcLib/core/fwGuiWx/test/tu/include/WorkerWxTest.hpp
new file mode 100644
index 0000000..bc4e619
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/test/tu/include/WorkerWxTest.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWGUIWX_UT_WORKERWXTEST_HPP__
+#define __FWGUIWX_UT_WORKERWXTEST_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwGuiWx
+{
+
+struct WorkerWxInstanciator;
+
+namespace ut
+{
+
+class WorkerWxTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( WorkerWxTest );
+
+    CPPUNIT_TEST(initTest);
+    CPPUNIT_TEST(twiceInitTest);
+    CPPUNIT_TEST(basicTest);
+    CPPUNIT_TEST(postFromInsideTest);
+    CPPUNIT_TEST(postFromOutsideTest);
+
+    CPPUNIT_TEST(basicTimerTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void initTest();
+    void twiceInitTest();
+    void basicTest();
+
+    void postFromInsideTest();
+    void postFromOutsideTest();
+
+    void basicTimerTest();
+
+protected:
+
+    SPTR(::fwThread::Worker) m_worker;
+};
+
+} //namespace ut
+} //namespace fwGuiWx
+
+#endif //__FWGUIWX_UT_WORKERWXTEST_HPP__
+
diff --git a/SrcLib/core/fwGuiWx/test/tu/src/WorkerWxTest.cpp b/SrcLib/core/fwGuiWx/test/tu/src/WorkerWxTest.cpp
new file mode 100644
index 0000000..7e6b06a
--- /dev/null
+++ b/SrcLib/core/fwGuiWx/test/tu/src/WorkerWxTest.cpp
@@ -0,0 +1,298 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/type_traits/is_same.hpp>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <boost/typeof/typeof.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <cppunit/Exception.h>
+
+#include <wx/wx.h>
+
+#include <fwThread/Timer.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/Worker.hxx>
+
+#include <fwGuiWx/config.hpp>
+
+#include "WorkerWxTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwGuiWx::ut::WorkerWxTest );
+
+namespace fwGuiWx
+{
+
+// Defined in WorkerWx.cpp
+class WorkerWx;
+struct FWGUIWX_CLASS_API WorkerWxInstanciator
+{
+    FWGUIWX_API WorkerWxInstanciator(bool reg);
+    FWGUIWX_API SPTR(::fwThread::Worker) getWorker();
+    SPTR(WorkerWx) m_wxWorker;
+
+    FWGUIWX_API static int    s_argc;
+    FWGUIWX_API static char **s_argv;
+};
+
+namespace ut
+{
+
+struct TestHandler
+{
+    TestHandler() : m_step(0), m_threadCheckOk(true)
+    {
+    }
+
+    void nextStep()
+    {
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(50));
+        this->nextStepNoSleep();
+    }
+
+    void nextStepNoSleep()
+    {
+        m_threadCheckOk &= (m_workerThreadId == ::fwThread::getCurrentThreadId());
+        ++m_step;
+    }
+
+    void setWorkerId(::fwThread::ThreadIdType id)
+    {
+        m_workerThreadId = id;
+    }
+
+    int m_step;
+    bool m_threadCheckOk;
+    ::fwThread::ThreadIdType m_workerThreadId;
+};
+
+void onExit()
+{
+    wxTheApp->ExitMainLoop();
+    //wxTheApp->OnExit();
+    //wxEntryCleanup();
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerWxTest::setUp()
+{
+    // Set up context before running a test.
+    static char* arg = "fwGuiWxTest";
+    WorkerWxInstanciator::s_argc = 1;
+    WorkerWxInstanciator::s_argv = &arg;
+    CPPUNIT_ASSERT(wxTheApp == NULL);
+    WorkerWxInstanciator instanciator(false);
+    m_worker = instanciator.getWorker();
+}
+
+void WorkerWxTest::tearDown()
+{
+    // Clean up after the test run.
+    m_worker.reset();
+    CPPUNIT_ASSERT(wxTheApp == NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerWxTest::initTest()
+{
+    CPPUNIT_ASSERT(wxTheApp != NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerWxTest::twiceInitTest()
+{
+    CPPUNIT_ASSERT(wxTheApp != NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void runBasicTest(TestHandler &handler, ::fwThread::Worker::sptr worker)
+{
+
+    handler.setWorkerId(worker->getThreadId());
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+    worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+
+    worker->post( ::boost::bind( &onExit ) );
+}
+
+
+#define RUN_BASIC_TEST_CHECKS(handler) \
+    CPPUNIT_ASSERT_EQUAL(3, handler.m_step); \
+    CPPUNIT_ASSERT_EQUAL(true, handler.m_threadCheckOk)
+
+
+
+void WorkerWxTest::basicTest()
+{
+    TestHandler handler;
+    runBasicTest(handler, m_worker);
+    m_worker->getFuture().wait();
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+
+void WorkerWxTest::postFromInsideTest()
+{
+    TestHandler handler;
+
+    m_worker->post( ::boost::bind(&runBasicTest, ::boost::ref(handler), m_worker) );
+
+    m_worker->getFuture().wait();
+
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+void doNothing()
+{}
+
+void runFromOutsideTest(TestHandler &handler, ::fwThread::Worker::sptr worker)
+{
+    //waiting for WorkerWx to start
+    worker->postTask<void>( ::boost::bind( &doNothing ) ).wait();
+
+    runBasicTest(handler, worker);
+}
+
+void WorkerWxTest::postFromOutsideTest()
+{
+    TestHandler handler;
+
+    ::boost::thread testThread(
+            ::boost::bind(&runFromOutsideTest, ::boost::ref(handler), m_worker)
+            );
+
+    m_worker->getFuture().wait();
+
+    RUN_BASIC_TEST_CHECKS(handler);
+}
+
+//-----------------------------------------------------------------------------
+
+#define WX_TEST_START \
+    try
+
+
+#define WX_TEST_END \
+    catch(CppUnit::Exception &e) \
+    { \
+        std::cerr << e.what() << std::endl; \
+        exception = e; \
+        ::wxExit(); \
+        return; \
+    }
+
+static CppUnit::Exception exception;
+
+void echo()
+{
+}
+
+
+
+void runBasicTimerTest(
+        TestHandler &handler,
+        const ::fwThread::Timer::sptr &timer,
+        ::fwThread::Timer::TimeDurationType duration
+        )
+{
+    timer->start();
+
+    WX_TEST_START
+    {
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+    }
+    WX_TEST_END
+}
+
+
+void oneShotBasicTimerTest(
+        int &i,
+        TestHandler &handler,
+        const ::fwThread::Timer::sptr &timer,
+        ::fwThread::Timer::TimeDurationType duration,
+        const ::fwThread::Worker::sptr &worker
+        )
+{
+
+    handler.nextStepNoSleep();
+
+    WX_TEST_START
+    {
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+    }
+    WX_TEST_END;
+
+
+    if(++i == 50)
+    {
+        timer->stop();
+
+        WX_TEST_START
+        {
+            CPPUNIT_ASSERT(!timer->isRunning());
+            CPPUNIT_ASSERT(handler.m_threadCheckOk);
+            CPPUNIT_ASSERT_EQUAL(49, handler.m_step);
+        }
+        WX_TEST_END;
+        worker->post( ::boost::bind( &onExit ) );
+    }
+}
+
+void WorkerWxTest::basicTimerTest()
+{
+    {
+
+        TestHandler handler;
+        handler.setWorkerId(m_worker->getThreadId());
+
+        ::fwThread::Timer::sptr timer = m_worker->createTimer();
+
+        ::fwThread::Timer::TimeDurationType duration = ::boost::chrono::milliseconds(10) ;
+
+        int i = 1;
+        timer->setFunction(
+                ::boost::bind(
+                    &oneShotBasicTimerTest,
+                    boost::ref(i), handler, ::boost::ref(timer), duration, ::boost::ref(m_worker) )
+                );
+        timer->setDuration(duration);
+
+        CPPUNIT_ASSERT(!timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+        m_worker->post( boost::bind(&runBasicTimerTest, ::boost::ref(handler), ::boost::ref(timer), duration) );
+
+
+        ::fwThread::Worker::FutureType future = m_worker->getFuture();
+        future.wait();
+
+        CPPUNIT_ASSERT( future.has_value() );
+        CPPUNIT_ASSERT_EQUAL( 0, boost::any_cast<int>( future.get() ) );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+
+} //namespace ut
+} //namespace fwGuiWx
diff --git a/SrcLib/core/fwMath/CMakeLists.txt b/SrcLib/core/fwMath/CMakeLists.txt
new file mode 100644
index 0000000..faee142
--- /dev/null
+++ b/SrcLib/core/fwMath/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/SrcLib/core/fwMath/Properties.cmake b/SrcLib/core/fwMath/Properties.cmake
new file mode 100644
index 0000000..99fcf3f
--- /dev/null
+++ b/SrcLib/core/fwMath/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMath )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMath/bin/build.options b/SrcLib/core/fwMath/bin/build.options
new file mode 100644
index 0000000..d357cf1
--- /dev/null
+++ b/SrcLib/core/fwMath/bin/build.options
@@ -0,0 +1,6 @@
+TYPE    = 'shared'
+VERSION = '0-1'
+USE     = ['boost']
+LIB = ['fwCore_0-1']
+
+
diff --git a/SrcLib/core/fwMath/include/fwMath/Compare.hpp b/SrcLib/core/fwMath/include/fwMath/Compare.hpp
new file mode 100644
index 0000000..3b3bc47
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/Compare.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMATH_COMPARE_HPP__
+#define __FWMATH_COMPARE_HPP__
+
+#include <cmath>
+
+namespace fwMath
+{
+
+/**
+ * @brief Returns true iff a and b are equal with 'epsilon' error margin
+ * @param a value to compare
+ * @param b value to compare
+ * @param epsilon : error margin
+ * @return true iff a and b are equal with 'epsilon' error margin
+ */
+template < typename TYPE >
+bool isEqual(TYPE a, TYPE b, const float epsilon = 0.00001)
+{
+    return fabs(a - b) < epsilon;
+}
+
+/**
+ * @brief Returns true iff container a and b are equal with 'epsilon' error margin
+ * @param containerA container to compare
+ * @param containerB container to compare
+ * @param epsilon : error margin
+ * @return true iff container a and b are equal with 'epsilon' error margin
+ */
+template < typename CONTAINER >
+bool isContainerEqual(CONTAINER&  containerA, CONTAINER& containerB, const float epsilon = 0.00001)
+{
+    bool isEqual = true;
+    if(containerA.size() != containerB.size())
+    {
+        return false;
+    }
+
+    typename CONTAINER::const_iterator iterA = containerA.begin();
+    typename CONTAINER::const_iterator iterB = containerB.begin();
+
+    while(isEqual && iterA != containerA.end())
+    {
+        isEqual = ::fwMath::isEqual(*iterA, *iterB, epsilon);
+        ++iterA;
+        ++iterB;
+    }
+
+    return isEqual;
+}
+
+} // namespace fwMath
+
+#endif /* __FWMATH_COMPARE_HPP__ */
diff --git a/SrcLib/core/fwMath/include/fwMath/IntrasecTypes.hpp b/SrcLib/core/fwMath/include/fwMath/IntrasecTypes.hpp
new file mode 100644
index 0000000..aa351d8
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/IntrasecTypes.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/array.hpp>
+#include <vector>
+
+/**
+ * @brief Definition of a type for a vector of tree double.
+ */
+typedef ::boost::array<double, 3> fwVec3d;
+
+/**
+ * @brief Definition of a type for a line defined by a position and a direction
+ */
+typedef std::pair<fwVec3d, fwVec3d> fwLine;
+
+/**
+ * @brief Definition of type for a plane defined by a normal and a distance
+ */
+typedef ::boost::array<double, 4> fwPlane;
+
+/**
+ * @brief Definition of a type for a matrix 4*4
+ */
+typedef ::boost::array< ::boost::array< double,4 >, 4> fwMatrix4x4;
+
+/**
+ * @brief Definition of a type for vertex positions
+ */
+typedef std::vector < std::vector <float> > fwVertexPosition;
+
+/**
+ * @brief Definition of a type for vertex index
+ */
+typedef std::vector < std::vector <int> > fwVertexIndex;
+
diff --git a/SrcLib/core/fwMath/include/fwMath/LineFunctions.hpp b/SrcLib/core/fwMath/include/fwMath/LineFunctions.hpp
new file mode 100644
index 0000000..8a3b6b6
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/LineFunctions.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_LINEFUNCTIONS_HPP_
+#define _FWMATH_LINEFUNCTIONS_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwMath/IntrasecTypes.hpp"
+#include "fwMath/export.hpp"
+
+namespace fwMath {
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief Compute the closest points between two lines.
+ * Return FALSE if the lines are parallel, TRUE otherwise.
+ * @verbatim
+  p1 + t1 * d1
+  p2 + t2 * d2
+  (p2 - p1 + t2 * d2 - t1 * d1) * d1 = 0
+  (p2 - p1 + t2 * d2 - t1 * d1) * d2 = 0
+  t2 * (d2.d1) - t1 = (p1 - p2).d1
+  t2 - t1 * (d1.d2) = (p1 - p2).d2
+
+  delta = 1 - (d1.d2)**2
+
+  t2 = [ d2.(p1-p2) - d1.(p1-p2) * (d1.d2)]/delta
+  t1 = [-d1.(p1-p2) + d2.(p1-p2) * (d1.d2)]/delta
+ @endverbatim
+ */
+FWMATH_API bool getClosestPoints( const fwLine& _line1, const fwLine& _line2, fwVec3d& _pointOnThis, fwVec3d& _pointOnfwLine);
+
+/**
+ * @brief
+ */
+FWMATH_API fwVec3d getClosestPoint( const fwLine& _line, fwVec3d& _point);
+
+/**
+ * @brief
+ */
+FWMATH_API bool intersect(const fwLine& _line, double _radius, fwVec3d _point) ;
+
+/**
+ * @brief
+ */
+FWMATH_API bool intersect(const fwLine& _line, double _radius,fwVec3d _vec0, fwVec3d _vec1, fwVec3d _point);
+
+/**
+ * @brief
+ */
+FWMATH_API bool intersect( const fwLine& _line, const fwVec3d &_v1,  const fwVec3d &_v2, const fwVec3d &_v3, fwVec3d &_point, fwVec3d &_barycentric, bool& _front);
+
+}
+
+#endif /* _FWMATH_LINEFUNCTIONS_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/MatrixFunctions.hpp b/SrcLib/core/fwMath/include/fwMath/MatrixFunctions.hpp
new file mode 100644
index 0000000..baa7428
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/MatrixFunctions.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_MATRIXFUNCTIONS_HPP_
+#define _FWMATH_MATRIXFUNCTIONS_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwMath/IntrasecTypes.hpp"
+#include "fwMath/export.hpp"
+
+namespace fwMath {
+
+/**
+ * @brief Multiply a matrix by a vector
+ *  @param [in]  _matrix
+ *  @param [in]  _source
+ *  @param [out] _dest
+ *
+ */
+FWMATH_API void multVecMatrix(const fwMatrix4x4 & _matrix, const fwVec3d& _source ,fwVec3d& _dest);
+/**
+ * @brief Compute a matrix rotation
+ *  @param [in]  _vecNorm
+ *  @return rotation matrix
+ *
+ */
+
+FWMATH_API fwMatrix4x4  getRotationMatrix( const fwVec3d &_vecNorm );
+}
+#endif /* _FWMATH_MATRIXFUNCTIONS_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/MeshFunctions.hpp b/SrcLib/core/fwMath/include/fwMath/MeshFunctions.hpp
new file mode 100644
index 0000000..0ed5dbd
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/MeshFunctions.hpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_MESHFUNCTIONS_HPP_
+#define _FWMATH_MESHFUNCTIONS_HPP_
+
+#include <cmath>
+#include <vector>
+#include <utility>
+
+#include <boost/unordered_map.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include "fwMath/IntrasecTypes.hpp"
+#include "fwMath/export.hpp"
+
+
+namespace fwMath
+{
+
+/**
+ * @brief
+ */
+FWMATH_API bool IsInclosedVolume(const fwVertexPosition &_vertex, const fwVertexIndex &_vertexIndex, const fwVec3d &_P );
+
+/**
+ * @brief Compute the intersection between triangle(define by threes vertex vert1, vert2, vert3) and the Oz parallel line and cross by the point P.
+ * The function return true if intersection is found (false otherwise).
+ * t is the oriented distance of P to the intersection point.
+ * u and v is the coordinate of the intersection point in the (O, u, v) triangle coordinate system with :
+ * O = vert1. u =  vert2 - O. v =  vert3 - O.
+ * "Fast, Minimum Storage Ray/Triangle Intersection", Tomas Muller, Ben Trumbore.
+ *
+ */
+FWMATH_API bool intersect_triangle(fwVec3d _orig, fwVec3d _dir, fwVec3d _vert0, fwVec3d _vert1, fwVec3d _vert2, double &_t, double &_u, double &_v);
+
+/// test whatever a vertex is duplicated or not
+FWMATH_API bool isBorderlessSurface( const fwVertexIndex &_vertexIndex);
+
+FWMATH_API void findBorderEdges( const fwVertexIndex &_vertexIndex , std::vector< std::vector<  std::pair< int, int  > > > &contours);
+
+/**
+ *  @brief Closes the surface if necessary
+ * @return True if container mesh is changed
+ */
+FWMATH_API bool closeSurface( fwVertexPosition &_vertex, fwVertexIndex &_vertexIndex );
+
+/**
+ * remove orphan vertices (i.e not used in _vertexIndex), _vertexIndex is reordered according to vertex suppressions
+ */
+FWMATH_API bool removeOrphanVertices( fwVertexPosition &_vertex, fwVertexIndex &_vertexIndex );
+
+//-----------------------------------------------------------------------------
+template <typename T, typename U>
+std::pair< T, U > makeOrderedPair(const T first, const U second)
+{
+    if (first < second)
+    {
+        return std::pair< T, U >(first, second);
+    }
+    else
+    {
+        return std::pair< T, U >(second, first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+template <typename T, typename U, typename V>
+bool isBorderlessSurface(T* cellDataBegin, T* cellDataEnd, U* cellDataOffsetsBegin, U* cellDataOffsetsEnd, V* cellTypesBegin)
+{
+    typedef std::pair< T, T >  Edge; // always Edge.first < Edge.second !!
+    typedef boost::unordered_map< Edge, int >  EdgeHistogram;
+    EdgeHistogram edgesHistogram;
+    bool isBorderless = true;
+
+    size_t dataLen = 0;
+    U* iter = cellDataOffsetsBegin;
+    U* iter2 = cellDataOffsetsBegin + 1;
+    const U* iterEnd = cellDataOffsetsEnd - 1;
+    V* iterTypes = cellTypesBegin;
+
+    dataLen = *iter2 - *iter;
+    for (
+            ;
+            iter < iterEnd || ( iter < cellDataOffsetsEnd && (dataLen = (cellDataEnd - cellDataBegin) - *iter) ) ;
+            dataLen = *++iter2 - *++iter, ++iterTypes
+        )
+    {
+        if(*iterTypes == 0)
+        {
+            continue;
+        }
+        T* iterCell = cellDataBegin + *iter;
+        T* iterCell2 = iterCell + 1;
+        T* beginCell = iterCell;
+        const T* iterCellEnd = beginCell + dataLen - 1;
+        for (
+                ;
+                iterCell < iterCellEnd || ( iterCell < (beginCell + dataLen) && (iterCell2 = beginCell) ) ;
+                ++iterCell, ++iterCell2
+            )
+        {
+            ++edgesHistogram[makeOrderedPair(*iterCell, *(iterCell2))];
+        }
+    }
+
+    BOOST_FOREACH(const typename EdgeHistogram::value_type &histo, edgesHistogram)
+    {
+        if (histo.second != 2)
+        {
+            isBorderless = false;
+            break;
+        }
+    }
+
+    return isBorderless;
+}
+
+}
+
+#endif /* _FWMATH_MESHFUNCTIONS_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/Namespace.hpp b/SrcLib/core/fwMath/include/fwMath/Namespace.hpp
new file mode 100644
index 0000000..acd0940
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/Namespace.hpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMATHNAMESPACE_HPP_
+#define FWMATHNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwMath contains classes which provide the implementation of several mathematic functions and objects (plane, line, point).
+ * @namespace   fwMath
+ * 
+ * @date        2009-2010.
+ *
+ */
+
+namespace fwMath
+{
+}
+#endif /* FWMATHNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/PlaneFunctions.hpp b/SrcLib/core/fwMath/include/fwMath/PlaneFunctions.hpp
new file mode 100644
index 0000000..9d69b3a
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/PlaneFunctions.hpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_PLANEFUNCTIONS_HPP_
+#define _FWMATH_PLANEFUNCTIONS_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwMath/IntrasecTypes.hpp"
+#include "fwMath/VectorFunctions.hpp"
+#include "fwMath/LineFunctions.hpp"
+#include "fwMath/export.hpp"
+#include "fwMath/MatrixFunctions.hpp"
+
+namespace fwMath {
+
+static const double EPSILON = 0.001;
+
+/**
+ * @brief
+ */
+FWMATH_API fwPlane getPlane(const fwVec3d & _point1, const fwVec3d & _point2, const fwVec3d & _point3);
+/**
+ * @brief compute a plane from a normal and a point which must be in the plane.
+ * @param [in] _point a point of the plan/
+ * @param [in] _normal the normal of the new plane.
+ * @return the new plane.
+ */
+FWMATH_API fwPlane getPlane(const fwVec3d&  _normal,const fwVec3d& _point);
+
+/**
+ * @brief Initialize a plane _plane with three points (_point1, _point2, _point3).
+ * It computes the plane's normal and the distance from the origin.
+ * @param [out] _plane the new plane.
+ * @param [in] _point1 a point of the plan.
+ * @param [in] _point2 a point of the plan.
+ * @param [in] _point3 a point of the plan.
+ */
+FWMATH_API void setValues(fwPlane& _plane, const fwVec3d & _point1, const fwVec3d & _point2, const fwVec3d & _point3);
+
+/**
+ * @brief Return the normal of the given plane _plane.
+ * @param [in] _plane
+ * @return the normalize normal of the plane.
+ */
+FWMATH_API fwVec3d getNormal(const fwPlane& _plane);
+/**
+ * @brief Set the normal of the given plane _plane.
+ *  @param [in] _plane
+ *  @param [in] _normal
+ */
+FWMATH_API void  setNormal(fwPlane& _plane, const fwVec3d& _normal);
+/**
+ * @brief Get the distance from origin for the given plan (_plane).
+ *  @param [in] _plane
+ *  @return the distance of origin of the plane.
+ */
+FWMATH_API double getDistance(const fwPlane& _plane);
+/**
+ * @brief Set the distance from origin (_distance) for the given plan (_plane).
+ *  @param [in]  _distance
+ *  @param [in] _plane
+ *  @return [out] _plane
+ */
+FWMATH_API void  setDistance(fwPlane& _plane, const double _distance);
+/**
+ *  @brief Give the intersection between a plane and a line. The result is returned in a point (_point)
+ *  @param [in]  _fwPlane
+ *  @param [in]  _line
+ *  @param [out] _point intersection point.
+ *  @return true if an intersection is found.
+ */
+FWMATH_API bool intersect( const fwPlane& _fwPlane, const fwLine & _line, fwVec3d & _point);
+
+/**
+ *  @brief Compute if a point is in a half plane.
+ *  @param [in]  _plane
+ *  @param [in]  _point
+ *  @return true if point is in a half plane.
+ */
+FWMATH_API bool isInHalfSpace(const fwPlane& _plane, const fwVec3d& _point);
+
+/**
+ *  @brief Apply a transformation to a plane. The transformation is defined by a matrix 4x4.
+ *  @param [in]  _plane
+ *  @param [in]  _matrix
+ *  @param [out] _plane
+ */
+FWMATH_API void transform(fwPlane& _plane, const fwMatrix4x4& _matrix);
+
+/**
+ *  @brief Add an offset at the distance of origin which define the plane (_plane).
+ *  @param [in]  _plane
+ *  @param [in]  _offset
+ *  @param [out] _plane
+ */
+FWMATH_API void offset(fwPlane& _plane, double _offset);
+
+}
+#endif /* _FWMATH_PLANEFUNCTIONS_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/VectorFunctions.hpp b/SrcLib/core/fwMath/include/fwMath/VectorFunctions.hpp
new file mode 100644
index 0000000..0c92191
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/VectorFunctions.hpp
@@ -0,0 +1,147 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_VECTORFUNCTIONS_HPP_
+#define _FWMATH_VECTORFUNCTIONS_HPP_
+
+#include <cmath>
+
+#include <fwCore/base.hpp>
+
+#include "fwMath/IntrasecTypes.hpp"
+#include "fwMath/export.hpp"
+
+namespace fwMath {
+
+/**
+ *  @brief Normalize a vector
+ */
+FWMATH_API double normalize(fwVec3d & vec);
+
+/**
+ *  @brief Retrun a normalized vector
+ *  @param [in] vec vector to normalize
+ *  @return normalized vector
+ */
+FWMATH_API fwVec3d normalized(fwVec3d & vec);
+
+/**
+ *  @brief Compute the Dot product between two vectors.
+ *  @param [in] v1
+ *  @param [in] v2
+ *  @return the dot product.
+ */
+FWMATH_API double dot(const fwVec3d& v1, const fwVec3d& v2);
+/**
+ *  @brief Compute the Cross product between two vectors.
+ *  @param [in] v1
+ *  @param [in] v2
+ *  @return the cross product.
+ */
+FWMATH_API fwVec3d cross(const fwVec3d& v1, const fwVec3d& v2);
+
+/**
+ *  @brief Compute the length of the vector
+ *  @param [in] _vec
+ *  @return the vector's length
+ */
+FWMATH_API double vecLength(fwVec3d &_vec);
+
+/**
+ *  @brief Compute of the vector.
+ *  @param [in] _vec
+ */
+//FWMATH_API void setPosition(fwVec3d &_vec);
+
+/**
+ *  @brief Compute the negate of the vector.
+ *  @param [in] _vec
+ *  @param [out] _vec
+ */
+FWMATH_API void negate(fwVec3d &_vec);
+
+}
+
+/**
+ *  @brief operator *= for fwVec3d
+ *  @param [in] vec1 vector to multiply
+ *  @param [in] val value to multiply with vector
+ *  @return vec1[0]*=vec2[0], vec1[1]*=vec2[1], vec1[2]*=vec2[2]
+ */
+FWMATH_API fwVec3d& operator*=(fwVec3d& vec1, double val);
+
+/**
+ *  @brief operator /= for fwVec3d
+ *  @param [in] vec
+ *  @param [in] val
+ *  @return vec[0]/=val, vec[1]/=val, vec[2]/=val
+ */
+FWMATH_API fwVec3d& operator/=(fwVec3d& vec,  double val );
+/**
+ *  @brief operator += for fwVec3d
+ *  @param [in] vec1
+ *  @param [in] vec2
+ *  @return  vec1 => vec1[0]+=vec2[0], vec1[1]+=vec2[1], vec1[2]+=vec2[2]
+ */
+FWMATH_API fwVec3d& operator+=(fwVec3d& vec1, fwVec3d& vec2);
+/**
+ *  @brief
+ *  @param [in] vec1
+ *  @param [in] vec2
+ *  @return vec1[0]-=vec2[0], vec1[1]-=vec2[1], vec1[2]-=vec2[2]
+ */
+FWMATH_API fwVec3d& operator-=(fwVec3d& vec1, fwVec3d& vec2);
+/**
+ *  @brief operator * between fwVec3d and value.
+ *  @param [in] _vec
+ *  @param [in] _val
+ *  @return the result of the operation _vec*val
+ */
+FWMATH_API fwVec3d operator*(const fwVec3d& _vec, const double _val);
+/**
+ *  @brief operator * between value and fwVec3d.
+ *  @param [in] _val
+ *  @param [in] _vec
+ *  @return the resut of the operation _vec*val
+ */
+FWMATH_API fwVec3d operator*(const double _val, const fwVec3d& _vec);
+/**
+ *  @brief operator / between fwVec3d and value.
+ *  @param [in] _vec
+ *  @param [in] val
+ *  @return the resut of the operation _vec/val
+ */
+FWMATH_API fwVec3d operator/(const fwVec3d& _vec, double val);
+/**
+ *  @brief operator + between two fwVec3d.
+ *  @param [in] _vec1
+ *  @param [in] _vec2
+ *  @return the result of the operation _vec1 + _vec2
+ */
+FWMATH_API fwVec3d operator+(const fwVec3d& _vec1, const fwVec3d& _vec2);
+/**
+ *  @brief operator - between two fwVec3d datas.
+ *  @param [in] _vec1
+ *  @param [in] _vec2
+ *  @return the difference between two value.
+ */
+FWMATH_API fwVec3d operator-(const fwVec3d& _vec1, const fwVec3d& _vec2);
+/**
+ *  @brief Compare two fwVec3d datas.
+ *  @param [in] _vec1
+ *  @param [in] _vec2
+ *  @return return 1 if equal 0 otherwise.
+ */
+FWMATH_API int operator==(const fwVec3d& _vec1, const fwVec3d& _vec2);
+/**
+ *  @brief Compare two fwVec3d data.
+ *  @param [in] _vec1
+ *  @param [in] _vec2
+ *  @return 1 if different.
+ */
+FWMATH_API int operator!=(const fwVec3d& _vec1, const fwVec3d& _vec2);
+
+#endif /* _FWMATH_VECTORFUNCTIONS_HPP_ */
diff --git a/SrcLib/core/fwMath/include/fwMath/export.hpp b/SrcLib/core/fwMath/include/fwMath/export.hpp
new file mode 100644
index 0000000..befd29f
--- /dev/null
+++ b/SrcLib/core/fwMath/include/fwMath/export.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMATH_CONFIG_HPP_
+#define _FWMATH_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWMATH_EXPORTS
+    #define FWMATH_API __declspec(dllexport)
+    #else
+    #define FWMATH_API __declspec(dllimport)
+    #endif
+    
+    #define FWMATH_CLASS_API
+
+    #pragma warning(disable: 4290)
+    
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWMATH_EXPORTS
+        #define FWMATH_API __attribute__ ((visibility("default")))
+        #define FWMATH_CLASS_API __attribute__ ((visibility("default")))
+        #else
+        #define FWMATH_API __attribute__ ((visibility("hidden")))
+        #define FWMATH_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+#else
+
+    #define FWMATH_API
+    #define FWMATH_CLASS_API
+
+#endif
+
+
+#endif //_FWMATH_CONFIG_HPP_
diff --git a/SrcLib/core/fwMath/src/fwMath/LineFunctions.cpp b/SrcLib/core/fwMath/src/fwMath/LineFunctions.cpp
new file mode 100644
index 0000000..373c09b
--- /dev/null
+++ b/SrcLib/core/fwMath/src/fwMath/LineFunctions.cpp
@@ -0,0 +1,103 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMath/LineFunctions.hpp"
+#include "fwMath/VectorFunctions.hpp"
+#include "fwMath/PlaneFunctions.hpp"
+
+namespace fwMath {
+
+//------------------------------------------------------------------------------
+
+bool getClosestPoints( const fwLine& _line1, const fwLine& _line2, fwVec3d& _pointOnThis, fwVec3d& _pointOnfwLine)
+{
+    SLM_TRACE_FUNC();
+    const fwVec3d& pos1 = _line1.first;
+    const fwVec3d& dir1 = _line1.second;
+
+    const fwVec3d& pos2 = _line2.first;
+    const fwVec3d& dir2 = _line2.second;
+
+    double dd = dot(dir1, dir2);
+    double delta = 1.0F - dd * dd;
+
+    if((float)delta==0.0F) return false;
+
+    double t2 = ( dot(dir2, pos1 - pos2) -  dot(dir1, pos1-pos2) * dd)/delta;
+    double t1  = ( -dot(dir1, pos1 - pos2) + dot(dir2, pos1-pos2) * dd)/delta;
+
+    _pointOnThis = pos1 + t1 * dir1;
+    _pointOnfwLine = pos2 + t2 * dir2;
+
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d getClosestPoint( const fwLine& _line, fwVec3d& _point)
+{
+    SLM_TRACE_FUNC();
+    const fwVec3d& pos = _line.first;
+    const fwVec3d& dir = _line.second;
+
+    double t = dot(_point - pos,dir);
+    return (pos + t * dir);
+}
+
+//------------------------------------------------------------------------------
+
+bool intersect(const fwLine& _line, double _radius, fwVec3d _point)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d point = getClosestPoint(_line, _point);
+    fwVec3d tmp = _point-point;
+    double length = vecLength(tmp);
+    if(length>_radius) return false;
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+bool intersect(const fwLine& _line, double _radius,fwVec3d _vec0, fwVec3d _vec1, fwVec3d _point)
+{
+    SLM_TRACE_FUNC();
+    fwLine line = std::pair<fwVec3d, fwVec3d>(_vec0, _vec1);
+    fwVec3d pThis;
+    if(getClosestPoints(_line, line,pThis,_point) == false) return false;
+    fwVec3d tmp = _point-pThis;
+    double length = vecLength(tmp);
+    if(length>_radius) return false;
+    return true;
+
+}
+
+//------------------------------------------------------------------------------
+
+bool intersect( const fwLine& _line, const fwVec3d &_v1,  const fwVec3d &_v2, const fwVec3d &_v3, fwVec3d &_point, fwVec3d &_barycentric, bool& _front) {
+
+    SLM_TRACE_FUNC();
+    _barycentric = (_v1 + _v2 + _v3)/3.;
+    fwVec3d v01 = _v2 - _v1;
+    fwVec3d v12 = _v3 - _v2;
+    fwVec3d v20 = _v1 - _v3;
+
+    fwPlane plane = getPlane(_v1, _v2, _v3);
+
+    fwVec3d v;
+    v[0] = 0.0F;
+    v[1] = 0.0F;
+    v[2] = 1.0F;
+
+    const fwVec3d& normal = getNormal(plane);
+    _front = (float)(dot(normal,v ))>=0.0F ? true : false;
+    if(intersect(plane, _line, _point)==false) return false;
+
+    if((float)(dot(normal, cross(v01, _point-_v1)))<0.0F) return false;
+    if((float)(dot(normal, cross(v12, _point-_v2)))<0.0F) return false;
+    if((float)(dot(normal, cross(v20, _point-_v3)))<0.0F) return false;
+    return true;
+}
+}
diff --git a/SrcLib/core/fwMath/src/fwMath/MatrixFunctions.cpp b/SrcLib/core/fwMath/src/fwMath/MatrixFunctions.cpp
new file mode 100644
index 0000000..5113eb2
--- /dev/null
+++ b/SrcLib/core/fwMath/src/fwMath/MatrixFunctions.cpp
@@ -0,0 +1,70 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMath/MatrixFunctions.hpp"
+#include "fwMath/VectorFunctions.hpp"
+
+namespace fwMath {
+
+void multVecMatrix(const fwMatrix4x4 & _matrix, const fwVec3d& _source ,fwVec3d& _dest)
+{
+    SLM_TRACE_FUNC();
+    double x,y,z;
+    x = _source[0];
+    y = _source[1];
+    z = _source[2];
+
+    _dest[0] = _matrix[0][0] * x + _matrix[1][0] * y + _matrix[2][0] * z + _matrix[3][0];
+    _dest[1] = _matrix[0][1] * x + _matrix[1][1] * y + _matrix[2][1] * z + _matrix[3][1];
+    _dest[2] = _matrix[0][2] * x + _matrix[1][2] * y + _matrix[2][2] * z + _matrix[3][2];
+}
+
+//------------------------------------------------------------------------------
+
+fwMatrix4x4  getRotationMatrix( const fwVec3d &_vecNorm )
+{
+    fwMatrix4x4 R;
+
+    const double FV0 = _vecNorm[0];
+    const double FV1 = _vecNorm[1];
+    const double YP  = sqrt( FV0 * FV0 + FV1 * FV1 );
+    const double RZ  = - atan2(FV0, FV1);
+    const double RX  = - atan2(YP, _vecNorm[2]);
+
+
+//     Rotation Matrix
+//     [     cos(z)           sin(z)         0     0 ]
+//     [                                             ]
+//     [ - cos(x) sin(z)   cos(x) cos(z)   sin(x)  0 ]
+//     [                                             ]
+//     [  sin(x) sin(z)   - sin(x) cos(z)  cos(x)  0 ]
+//     [                                             ]
+//     [        0                0           0     1 ]
+
+    R[0][0] =  cos(RZ);
+    R[0][1] =  sin(RZ);
+    R[0][2] =  0;
+    R[0][3] =  0.;
+
+    R[1][0] = -cos(RX) * sin(RZ);
+    R[1][1] =  cos(RX) * cos(RZ);
+    R[1][2] =  sin(RX);
+    R[1][3] =  0.;
+
+    R[2][0] =  sin(RX) * sin(RZ);
+    R[2][1] = -sin(RX) * cos(RZ);
+    R[2][2] =  cos(RX);
+    R[2][3] =  0.;
+
+    R[3][2] =  0.;
+    R[3][3] =  1.;
+    R[3][0] =  0.;
+    R[3][1] =  0.;
+
+    return R;
+}
+
+}
diff --git a/SrcLib/core/fwMath/src/fwMath/MeshFunctions.cpp b/SrcLib/core/fwMath/src/fwMath/MeshFunctions.cpp
new file mode 100644
index 0000000..476258a
--- /dev/null
+++ b/SrcLib/core/fwMath/src/fwMath/MeshFunctions.cpp
@@ -0,0 +1,296 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <map>
+#include <list>
+#include <set>
+#include <boost/foreach.hpp>
+#include <boost/unordered_map.hpp>
+
+#include "fwMath/MeshFunctions.hpp"
+#include "fwMath/VectorFunctions.hpp"
+
+
+namespace fwMath
+{
+
+//-----------------------------------------------------------------------------
+
+bool intersect_triangle(fwVec3d _orig, fwVec3d _dir, fwVec3d _vert0, fwVec3d _vert1, fwVec3d _vert2, double &_t, double &_u, double &_v)
+{
+    const double Epsilon = 0.000001;
+
+    fwVec3d edge1, edge2, tvec, pvec, qvec;
+
+    /* find vectors for two edges sharing vert0 */
+    edge1 = _vert1 - _vert0;
+    edge2 = _vert2 - _vert0;
+
+    /* begin calculating determinant - also used to calculate U parameter */
+    pvec = ::fwMath::cross(_dir, edge2);
+
+    /* if determinant is near zero, ray lies in plane of triangle */
+    const double Det = ::fwMath::dot(edge1, pvec);
+
+    if (Det > -Epsilon && Det < Epsilon) return false;
+    const double Inv_det = 1.0 / Det;
+
+    /* calculate distance from vert0 to ray origin */
+    tvec = _orig - _vert0;
+
+    /* calculate U parameter and test bounds */
+    _u = Inv_det * ::fwMath::dot(tvec, pvec);
+    if (_u < 0.0 || _u > 1.0) return false;
+
+    /* prepare to test V parameter */
+    qvec = ::fwMath::cross(tvec, edge1);
+
+    /* calculate V parameter and test bounds */
+    _v =  Inv_det * ::fwMath::dot(_dir, qvec);
+    if (_v < 0.0 || _u + _v > 1.0) return false;
+
+    /* calculate t, ray intersects triangle */
+    _t = Inv_det * ::fwMath::dot(edge2, qvec);
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+bool IsInclosedVolume(const fwVertexPosition &_vertex, const fwVertexIndex &_vertexIndex, const fwVec3d &_P)
+{
+    const unsigned int X=0, Y=1, Z=2;
+    const size_t ElementNbr  = _vertexIndex.size();
+    if ( ElementNbr == 0 )
+        return false;
+
+    // on regarde tous les triangles du maillage
+    unsigned int IntersectionNbr = 0;
+    for ( size_t i = 0 ; i < ElementNbr ; ++i )
+    {
+        //recuperation des trois sommets du triangle
+        const fwVec3d P1 = {{_vertex[ _vertexIndex[i][0] ][0], _vertex[ _vertexIndex[i][0] ][1], _vertex[ _vertexIndex[i][0] ][2]}};
+        const fwVec3d P2 = {{_vertex[ _vertexIndex[i][1] ][0], _vertex[ _vertexIndex[i][1] ][1], _vertex[ _vertexIndex[i][1] ][2]}};
+        const fwVec3d P3 = {{_vertex[ _vertexIndex[i][2] ][0], _vertex[ _vertexIndex[i][2] ][1], _vertex[ _vertexIndex[i][2] ][2]}};
+
+        //on enleve les triangles s'ils sont situes au dessus du point
+        OSLM_TRACE("Trg : " << i << " with Z = [" << P1[Z]  << "][" << P2[Z]  << "][" << P3[Z]  << "] compare with " << _P[Z] );
+
+        if ( !(P1[Z] > _P[Z] && P2[Z] > _P[Z] && P3[Z] > _P[Z] ) ) //trianglePotentiallyWellPositionned
+        {
+            //on teste la presence des vertex de part et d'autre des 3 axes.
+            //Si P1[X] > P[X] alors il faut necessairement P2[X] < P[X] ou P3[X] < P[X], idem pour les 2 autres axes
+            //En outre cela permet d'exclure les points qui sont situes sur les axes
+            bool stop = false;
+            for ( unsigned int axe = X ; axe <= Y && !stop ; ++axe )
+            {
+                const double Delta1 = P1[axe] - _P[axe];
+                const double Delta2 = P2[axe] - _P[axe];
+                const double Delta3 = P3[axe] - _P[axe];
+
+                OSLM_TRACE("d1 : " << Delta1 << "d2 : " << Delta2 << "d3 : " << Delta3 );
+
+                if ( Delta1 >= 0.f && Delta2 >= 0.f && Delta3 >= 0.f ) { stop = true; break;}
+                if ( Delta1 < 0.f && Delta2 < 0.f && Delta3 < 0.f ) { stop = true; break;}
+            }
+            if ( !stop )
+            {
+                OSLM_TRACE("The face(" << i << ") is interesting to find a point in volume");
+
+                fwVec3d orig = {{_P[0], _P[1], _P[2]}};
+
+                fwVec3d dir = {{ 0.f, 0.f, 1.f}};
+                fwVec3d vert0 = {{ P1[0], P1[1], P1[2]}};
+                fwVec3d vert1 = {{ P2[0], P2[1], P2[2]}};
+                fwVec3d vert2 = {{ P3[0], P3[1], P3[2]}};
+                double t, u, v;
+                if ( intersect_triangle (orig, dir, vert0, vert1, vert2, t, u, v) )
+                {
+                    //on ne garde que les points situes en dessous du point _P selon l'axe (Oz)
+                    if (t < 0.f)
+                    {
+                        OSLM_TRACE(" t = " << t << " u = " << u << " v = " << v);
+                        ++IntersectionNbr;
+                    }
+                }
+            }
+        }
+    }
+    OSLM_TRACE("Nb intersection : " << IntersectionNbr);
+    return ( IntersectionNbr%2 == 1 );
+}
+
+//-----------------------------------------------------------------------------
+
+bool isBorderlessSurface(const fwVertexIndex &_vertexIndex)
+{
+    typedef std::pair< int, int >  Edge; // always Edge.first < Edge.second !!
+    typedef boost::unordered_map< Edge, int >  EdgeHistogram;
+    EdgeHistogram edgesHistogram;
+    bool isBorderless = true;
+
+    BOOST_FOREACH(const fwVertexIndex::value_type &vertex, _vertexIndex)
+    {
+        OSLM_ASSERT("Invalid vertex size: "<< vertex.size(), vertex.size() > 2 );
+        ++edgesHistogram[std::make_pair(std::min(vertex[0],vertex[1]), std::max(vertex[0],vertex[1]) )];
+        ++edgesHistogram[std::make_pair(std::min(vertex[0],vertex[2]), std::max(vertex[0],vertex[2]) )];
+        ++edgesHistogram[std::make_pair(std::min(vertex[2],vertex[1]), std::max(vertex[2],vertex[1]) )];
+    }
+
+    BOOST_FOREACH(EdgeHistogram::value_type &histo, edgesHistogram)
+    {
+        if (histo.second<2)
+        {
+            isBorderless = false;
+            break;
+        }
+    }
+
+    return isBorderless;
+}
+
+//-----------------------------------------------------------------------------
+
+// container of connected component
+void findBorderEdges( const fwVertexIndex &_vertexIndex , std::vector< std::vector<  std::pair< int, int  > > > &contours)
+{
+    typedef std::pair< int, int  >  Edge;
+    typedef std::vector< Edge > Contour; // at Border
+    typedef std::vector< Contour> Contours;
+
+    std::map< Edge  , int > edgesHistogram;
+    for ( fwVertexIndex::const_iterator iter=_vertexIndex.begin(); iter!= _vertexIndex.end(); ++iter )
+    {
+        assert (iter->size()>2 );
+        int i1=  (*iter)[0];
+        int i2 = (*iter)[1];
+        int i3 = (*iter)[2];
+        edgesHistogram[std::make_pair(std::min(i1,i2),std::max(i1,i2) )]++;
+        edgesHistogram[std::make_pair(std::min(i1,i3),std::max(i1,i3) )]++;
+        edgesHistogram[std::make_pair(std::min(i3,i2),std::max(i3,i2) )]++;
+    }
+
+    for ( std::map< Edge  , int >::const_iterator iter=edgesHistogram.begin(); iter!=edgesHistogram.end(); ++iter )
+    {
+        if (iter->second<2) // an orphan found
+        {
+            Contour contour;
+            contour.reserve(1000);
+            std::list< Edge > fifo;
+            Edge orphan = iter->first;
+
+            fifo.push_back(orphan);
+            while( !fifo.empty() )
+            {
+                Edge current = fifo.front();
+                contour.push_back( current );
+                fifo.pop_front();
+                edgesHistogram[current]=2; // to mark it processed;
+                // search neighboor at border and insert in fifo
+                for ( std::map< Edge  , int >::const_iterator iterL=edgesHistogram.begin(); iterL!=edgesHistogram.end(); ++iterL )
+                {
+                    Edge candidate= iterL->first;
+                    if ( iterL->second < 2 ) // at border
+                    {
+                        if ( candidate.first == current.first ||  candidate.second == current.second || // neighboor
+                             candidate.first == current.second ||  candidate.second == current.first
+                           )
+                        {
+                            edgesHistogram[candidate]=2; // mark processed;
+                            fifo.push_back( candidate );
+                        }
+                    }
+                }
+            }
+            // all neighboor processed
+            contours.push_back( contour );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool closeSurface(  fwVertexPosition &_vertex, fwVertexIndex &_vertexIndex )
+{
+    typedef std::pair< int, int  >  Edge;
+    typedef std::vector< Edge > Contour; // at Border
+    typedef std::vector< Contour> Contours;
+
+    Contours contours;
+    findBorderEdges( _vertexIndex , contours);
+    bool closurePerformed = !contours.empty() ;
+    // close each hole
+    for ( Contours::iterator contour=contours.begin();  contour != contours.end(); ++contour )
+    {
+        int newVertexIndex = _vertex.size() ;
+        // create gravity point & insert new triangle
+        std::vector< float > massCenter(3,0);
+        for ( Contour::iterator edge =contour->begin();  edge != contour->end(); ++edge )
+        {
+            for (int i=0; i<3; ++i )
+            {
+                massCenter[i]  += _vertex[edge->first][i];
+                massCenter[i]  += _vertex[edge->second][i];
+            }
+            // create new Triangle
+            std::vector< int > triangleIndex(3);
+            triangleIndex[0] =  edge->first;
+            triangleIndex[1] =  edge->second;
+            triangleIndex[2] =  newVertexIndex;
+            _vertexIndex.push_back( triangleIndex ); // TEST
+        }
+        for (int i=0; i<3; ++i )
+        {
+            massCenter[i] /= contour->size()*2;
+        }
+        _vertex.push_back( massCenter ); // normalize barycenter
+    }
+    return closurePerformed;
+}
+
+//-----------------------------------------------------------------------------
+
+bool removeOrphanVertices( fwVertexPosition &_vertex, fwVertexIndex &_vertexIndex )
+{
+    fwVertexPosition newVertex;
+    newVertex.reserve(  _vertex.size() );
+
+    std::set< int > indexPointToKeep;
+
+    for ( fwVertexIndex::const_iterator iter=_vertexIndex.begin(); iter!= _vertexIndex.end(); ++iter )
+    {
+        indexPointToKeep.insert( (*iter)[0] );
+        indexPointToKeep.insert( (*iter)[1] );
+        indexPointToKeep.insert( (*iter)[2] );
+    }
+
+    bool orphanFound = indexPointToKeep.size() != _vertex.size();
+
+    if (orphanFound)
+    {
+        // rebuild index table according to element suppression
+        int idx=0;
+        std::map< int, int > translate; // map oldIndex -> newIndex (to take into account removal
+        std::set< int >::iterator idxIter;
+        for ( idxIter =  indexPointToKeep.begin() ; idxIter !=  indexPointToKeep.end() ; ++idxIter )
+        {
+            translate[ *idxIter ] = idx++;
+            newVertex.push_back(  _vertex[ *idxIter  ] );
+        }
+
+        for ( fwVertexIndex::iterator iter=_vertexIndex.begin(); iter!= _vertexIndex.end(); ++iter )
+        {
+            (*iter)[0] = translate[ (*iter)[0]  ];
+            (*iter)[1] = translate[ (*iter)[1]  ];
+            (*iter)[2] = translate[ (*iter)[2]  ];
+        }
+
+//        _vertex = newVertex;
+        _vertex.swap(newVertex);
+    }
+    return orphanFound;
+}
+
+} // namespace fwMath
diff --git a/SrcLib/core/fwMath/src/fwMath/PlaneFunctions.cpp b/SrcLib/core/fwMath/src/fwMath/PlaneFunctions.cpp
new file mode 100644
index 0000000..3e8f3f0
--- /dev/null
+++ b/SrcLib/core/fwMath/src/fwMath/PlaneFunctions.cpp
@@ -0,0 +1,141 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMath/PlaneFunctions.hpp"
+
+namespace fwMath {
+
+//------------------------------------------------------------------------------
+
+fwPlane getPlane(const fwVec3d & _point1, const fwVec3d & _point2, const fwVec3d & _point3) {
+    SLM_TRACE_FUNC();
+    fwPlane plane;
+    setValues(plane, _point1, _point2, _point3);
+
+    return plane;
+}
+
+//------------------------------------------------------------------------------
+
+void setValues(fwPlane& _plane, const fwVec3d & _point1, const fwVec3d & _point2, const fwVec3d & _point3)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d  normalVec= cross(_point2 - _point1, _point3 -_point1);
+    if((float)(vecLength(normalVec)) <= 0.0F) {
+        normalVec[0] =0.0F;
+        normalVec[1] =0.0F;
+        normalVec[2] =1.0F;
+    }
+    normalize(normalVec);
+    // Normal
+    setNormal(_plane, normalVec);
+    // Distance
+    double distance = normalVec[0]*_point1[0] + normalVec[1]*_point1[1] + normalVec[2]*_point1[2];
+    setDistance(_plane, distance);
+}
+
+//------------------------------------------------------------------------------
+fwVec3d getNormal(const fwPlane& _plane) {
+    SLM_TRACE_FUNC();
+    fwVec3d normalVec;
+    normalVec[0] = _plane[0];
+    normalVec[1] = _plane[1];
+    normalVec[2] = _plane[2];
+
+    return normalVec;
+}
+
+//------------------------------------------------------------------------------
+void  setNormal(fwPlane& _plane, const fwVec3d& _normal) {
+    SLM_TRACE_FUNC();
+    fwVec3d normalNormalized(_normal);
+    normalize(normalNormalized);
+    _plane[0] = normalNormalized[0];
+    _plane[1] = normalNormalized[1];
+    _plane[2] = normalNormalized[2];
+    ;
+}
+//------------------------------------------------------------------------------
+
+double getDistance(const fwPlane& _plane) {
+    SLM_TRACE_FUNC();
+    return _plane[3];
+}
+
+//------------------------------------------------------------------------------
+
+void  setDistance(fwPlane& _plane, const double _distance) {
+    SLM_TRACE_FUNC();
+    _plane[3] = _distance;
+}
+
+//------------------------------------------------------------------------------
+bool intersect( const fwPlane& _plane, const fwLine & _line,  fwVec3d & _point) {
+    SLM_TRACE_FUNC();
+
+    const fwVec3d pos = _line.first;
+    fwVec3d dirNormaliser = _line.second - _line.first;
+    ::fwMath::normalize(dirNormaliser);
+
+    fwVec3d normalVec = getNormal(_plane);
+    double d = dot(normalVec, dirNormaliser);
+    if(abs((float)d) < 0.0F) return false;
+    double distance = getDistance(_plane);
+    double t = (distance - dot(normalVec, pos))/d;
+    _point = pos + (t * dirNormaliser);
+
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+bool isInHalfSpace(const fwPlane& _plane, const fwVec3d& _point)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d normalVec = getNormal(_plane);
+    fwVec3d pos = normalVec * getDistance(_plane);
+    return ((float)(dot(normalVec, _point-pos)) >= 0.0F ? true : false);
+}
+
+//------------------------------------------------------------------------------
+
+void transform(fwPlane& _plane, const fwMatrix4x4& _matrix)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d normalVec = getNormal(_plane);
+    fwVec3d beg = normalVec * getDistance(_plane);
+    fwVec3d end = beg + normalVec;
+    multVecMatrix(_matrix,beg,beg);
+    multVecMatrix(_matrix,end,end);
+    normalVec = end - beg;
+    normalize(normalVec);
+    setNormal(_plane, normalVec);
+    setDistance(_plane, dot(normalVec, beg));
+
+}
+
+//------------------------------------------------------------------------------
+
+void offset(fwPlane& _plane, double _offset)
+{
+    SLM_TRACE_FUNC();
+    double distance = getDistance(_plane);
+    distance += _offset;
+    setDistance(_plane, distance);
+
+}
+
+fwPlane getPlane(const fwVec3d&  _normal,const fwVec3d& _point)
+{
+    SLM_TRACE_FUNC();
+    fwPlane plane;
+    fwVec3d normalVec = _normal;
+    normalize(normalVec);
+    setNormal(plane, normalVec);
+    setDistance(plane, normalVec[0]*_point[0] +normalVec[1]*_point[1] + normalVec[2]*_point[2]);
+    return plane;
+}
+}
diff --git a/SrcLib/core/fwMath/src/fwMath/VectorFunctions.cpp b/SrcLib/core/fwMath/src/fwMath/VectorFunctions.cpp
new file mode 100644
index 0000000..e3a8162
--- /dev/null
+++ b/SrcLib/core/fwMath/src/fwMath/VectorFunctions.cpp
@@ -0,0 +1,181 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMath/VectorFunctions.hpp"
+
+namespace fwMath {
+
+double normalize(fwVec3d & vec) 
+{
+    SLM_TRACE_FUNC();
+    double norme = sqrt (vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
+    if((float)(norme)==0.0F) return 0.0F;
+    vec /= norme;
+    return norme;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d normalized(fwVec3d & vec) 
+{
+    SLM_TRACE_FUNC();
+    fwVec3d normalized = vec;
+    normalize(normalized);
+    return normalized;
+}
+
+//------------------------------------------------------------------------------
+
+double dot(const fwVec3d& v1, const fwVec3d& v2) 
+{
+    SLM_TRACE_FUNC();
+    return (v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2]);
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d cross(const fwVec3d& v1, const fwVec3d& v2) 
+{
+    SLM_TRACE_FUNC();
+    fwVec3d v;
+    v[0] = v1[1] * v2[2] - v1[2] * v2[1];
+    v[1] = v1[2] * v2[0] - v1[0] * v2[2];
+    v[2] = v1[0] * v2[1] - v1[1] * v2[0];
+
+    return v;
+}
+
+//------------------------------------------------------------------------------
+
+double vecLength(fwVec3d &_vec) 
+{
+    SLM_TRACE_FUNC();
+    return sqrt(_vec[0] * _vec[0] + _vec[1] * _vec[1] + _vec[2] * _vec[2]);
+}
+
+void negate(fwVec3d &_vec)
+{
+    SLM_TRACE_FUNC();
+    _vec[0]=-_vec[0];
+    _vec[1]=-_vec[1];
+    _vec[2]=-_vec[2];
+}
+
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d& operator*=(fwVec3d& vec1, double val) {
+    SLM_TRACE_FUNC();
+    vec1[0] *= val;
+    vec1[1] *= val;
+    vec1[2] *= val;
+    return vec1;
+
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d& operator/=(fwVec3d& vec,  double val ) {
+    if((double)(val)!=0.0F) {
+        vec[0] /= val;
+        vec[1] /= val;
+        vec[2] /= val;
+    }
+    return vec;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d& operator+=(fwVec3d& vec1, fwVec3d& vec2) {
+    vec1[0] += vec2[0];
+    vec1[1] += vec2[1];
+    vec1[2] += vec2[2];
+    return vec1;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d& operator-=(fwVec3d& vec1, fwVec3d& vec2) {
+    vec1[0] -= vec2[0];
+    vec1[1] -= vec2[1];
+    vec1[2] -= vec2[2];
+    return vec1;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d operator*(const fwVec3d& _vec, const double _val)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d v;
+    v[0] = _vec[0] * _val;
+    v[1] = _vec[1] * _val;
+    v[2] = _vec[2] * _val;
+    return v;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d operator*(const double _val, const fwVec3d& _vec)
+{
+    SLM_TRACE_FUNC();
+    return _vec * _val;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d operator/(const fwVec3d& _vec, double _val)
+{
+    fwVec3d v;
+    v[0] = _vec[0] / _val;
+    v[1] = _vec[1] / _val;
+    v[2] = _vec[2] / _val;
+
+    return v;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d operator+(const fwVec3d& _vec1, const fwVec3d& _vec2)
+{
+    SLM_TRACE_FUNC();
+    fwVec3d v;
+    v[0] = _vec1[0] + _vec2[0];
+    v[1] = _vec1[1] + _vec2[1];
+    v[2] = _vec1[2] + _vec2[2];
+
+    return v;
+}
+
+//------------------------------------------------------------------------------
+
+fwVec3d operator-(const fwVec3d& _vec1, const fwVec3d& _vec2)
+{
+    fwVec3d v;
+    v[0] = _vec1[0] - _vec2[0];
+    v[1] = _vec1[1] - _vec2[1];
+    v[2] = _vec1[2] - _vec2[2];
+
+    return v;
+}
+
+//------------------------------------------------------------------------------
+
+int operator==(const fwVec3d& _vec1, const fwVec3d& _vec2)
+{
+    return (((float)(_vec1[0]) == (float)(_vec2[0])) && 
+            ((float)(_vec1[1]) == (float)(_vec2[1])) && 
+            ((float)(_vec1[2]) == (float)(_vec2[2]))
+            ) ;
+}
+
+//------------------------------------------------------------------------------
+
+int operator!=(const fwVec3d& _vec1, const fwVec3d& _vec2)
+{
+    return !(_vec1 == _vec2);
+}
diff --git a/SrcLib/core/fwMath/test/CMakeLists.txt b/SrcLib/core/fwMath/test/CMakeLists.txt
new file mode 100644
index 0000000..207087b
--- /dev/null
+++ b/SrcLib/core/fwMath/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwMath/test/Properties.cmake b/SrcLib/core/fwMath/test/Properties.cmake
new file mode 100644
index 0000000..6a235e1
--- /dev/null
+++ b/SrcLib/core/fwMath/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMathTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwMath )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMath/test/cppunit.options b/SrcLib/core/fwMath/test/cppunit.options
new file mode 100644
index 0000000..7c1b97f
--- /dev/null
+++ b/SrcLib/core/fwMath/test/cppunit.options
@@ -0,0 +1,12 @@
+
+CLASSTEST=[
+    'MatrixFunctionsTest',
+    'PlaneFunctionsTest',
+    'VectorFunctionsTest',
+    'CompareTest',
+]
+
+USE = ['boost']
+LIB = ['fwData_0-1','fwTools_0-1', 'fwMath_0-1', 'fwCore_0-1']
+CONSOLE = 'yes'
+LOGLEVEL='trace'
diff --git a/SrcLib/core/fwMath/test/tu/include/CompareTest.hpp b/SrcLib/core/fwMath/test/tu/include/CompareTest.hpp
new file mode 100644
index 0000000..9bd00af
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/include/CompareTest.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMATH_TU_COMPARETEST_HPP__
+#define __FWMATH_TU_COMPARETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMath
+{
+namespace ut
+{
+
+class CompareTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( CompareTest );
+    CPPUNIT_TEST( checkEquality);
+    CPPUNIT_TEST( checkContainerEquality);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+    void checkEquality();
+    void checkContainerEquality();
+};
+
+} //namespace ut
+} //namespace fwMath
+
+#endif //__FWMATH_TU_COMPARETEST_HPP__
diff --git a/SrcLib/core/fwMath/test/tu/include/MatrixFunctionsTest.hpp b/SrcLib/core/fwMath/test/tu/include/MatrixFunctionsTest.hpp
new file mode 100644
index 0000000..57567e0
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/include/MatrixFunctionsTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMATH_TU_MATRIXFUNCTIONSTEST_HPP__
+#define __FWMATH_TU_MATRIXFUNCTIONSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMath
+{
+namespace ut
+{
+
+class MatrixFunctionsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MatrixFunctionsTest );
+    CPPUNIT_TEST( checkMultVecMatrix);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+    void checkMultVecMatrix();
+    void checkRotationMatrix();
+};
+
+} //namespace ut
+} //namespace fwMath
+
+#endif //__FWMATH_TU_MATRIXFUNCTIONSTEST_HPP__
diff --git a/SrcLib/core/fwMath/test/tu/include/PlaneFunctionsTest.hpp b/SrcLib/core/fwMath/test/tu/include/PlaneFunctionsTest.hpp
new file mode 100644
index 0000000..6a4bb8c
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/include/PlaneFunctionsTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMATH_TU_PLANEFUNCTIONSTEST_HPP__
+#define __FWMATH_TU_PLANEFUNCTIONSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMath
+{
+namespace ut
+{
+
+class PlaneFunctionsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( PlaneFunctionsTest );
+    CPPUNIT_TEST( checkDistance );
+    CPPUNIT_TEST( checkNormal );
+//  CPPUNIT_TEST( checkIntersect );
+    CPPUNIT_TEST( checkIsInHalfSpace_fwMath_SoLib );
+    CPPUNIT_TEST( checkOffset );
+    CPPUNIT_TEST( checkTransform );
+    CPPUNIT_TEST( checkIntersect_fwMath_SoLib);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+    void checkDistance();
+    void checkNormal();
+    void checkIntersect();
+    void checkIsInHalfSpace_fwMath_SoLib();
+    void checkOffset();
+    void checkTransform();
+    void checkIntersect_fwMath_SoLib();
+};
+
+} //namespace ut
+} //namespace fwMath
+
+#endif //__FWMATH_TU_PLANEFUNCTIONSTEST_HPP__
diff --git a/SrcLib/core/fwMath/test/tu/include/VectorFunctionsTest.hpp b/SrcLib/core/fwMath/test/tu/include/VectorFunctionsTest.hpp
new file mode 100644
index 0000000..2c7a89b
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/include/VectorFunctionsTest.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMATH_TU_VECTORFUNCTIONSTEST_HPP__
+#define __FWMATH_TU_VECTORFUNCTIONSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwMath
+{
+namespace ut
+{
+
+class VectorFunctionsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( VectorFunctionsTest );
+    CPPUNIT_TEST( checkNormalize);
+    CPPUNIT_TEST( checkDot );
+    CPPUNIT_TEST( checkDot_fwMath_Solib );
+    CPPUNIT_TEST( checkCross );
+    CPPUNIT_TEST( checkCross_fwMath_SoLib );
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+    void checkDot();
+    void checkDot_fwMath_Solib();
+    void checkCross();
+    void checkCross_fwMath_SoLib();
+    void checkNormalize();
+};
+
+} //namespace ut
+} //namespace fwMath
+
+#endif //__FWMATH_TU_VECTORFUNCTIONSTEST_HPP__
diff --git a/SrcLib/core/fwMath/test/tu/src/CompareTest.cpp b/SrcLib/core/fwMath/test/tu/src/CompareTest.cpp
new file mode 100644
index 0000000..1c72698
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/src/CompareTest.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMath/Compare.hpp>
+#include <fwTools/random/Generator.hpp>
+
+#include "CompareTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMath::ut::CompareTest );
+
+namespace fwMath
+{
+namespace ut
+{
+
+void CompareTest::setUp()
+{
+    // Set up context before running a test.
+
+
+}
+void CompareTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void CompareTest::checkEquality()
+{
+    const double x1 = 0.000001;
+    const double x2 = 0.000002;
+
+    bool isEqual = ::fwMath::isEqual(x1, x2);
+    CPPUNIT_ASSERT_EQUAL(true, isEqual);
+
+    isEqual = ::fwMath::isEqual(x1, x2, 0.0000001f);
+    CPPUNIT_ASSERT_EQUAL(false, isEqual);
+}
+
+void CompareTest::checkContainerEquality()
+{
+    std::vector< double > vect1(20);
+    std::vector< double > vect2(20);
+
+    ::fwTools::random::fillContainer(0.0001, 10., vect1);
+    vect2 = vect1;
+
+    bool isEqual = ::fwMath::isContainerEqual(vect1, vect2);
+    CPPUNIT_ASSERT_EQUAL(true, isEqual);
+
+    ::boost::uint32_t seedVal = std::time(NULL);
+    ::fwTools::random::fillContainer(0.000001, 0.000009, vect1, seedVal);
+    ::fwTools::random::fillContainer(0.000001, 0.000009, vect2, ++seedVal);
+
+    isEqual = ::fwMath::isContainerEqual(vect1, vect2);
+    CPPUNIT_ASSERT_EQUAL(true, isEqual);
+
+    isEqual = ::fwMath::isContainerEqual(vect1, vect2, 0.0000001f);
+    CPPUNIT_ASSERT_EQUAL(false, isEqual);
+}
+
+
+} //namespace ut
+} //namespace fwMath
diff --git a/SrcLib/core/fwMath/test/tu/src/MatrixFunctionsTest.cpp b/SrcLib/core/fwMath/test/tu/src/MatrixFunctionsTest.cpp
new file mode 100644
index 0000000..32e84dc
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/src/MatrixFunctionsTest.cpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMath/MatrixFunctions.hpp>
+#include <fwMath/IntrasecTypes.hpp>
+#include <fwMath/VectorFunctions.hpp>
+#include <fwMath/LineFunctions.hpp>
+#include <fwMath/MatrixFunctions.hpp>
+
+#include "MatrixFunctionsTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMath::ut::MatrixFunctionsTest );
+
+namespace fwMath
+{
+namespace ut
+{
+
+void MatrixFunctionsTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void MatrixFunctionsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void MatrixFunctionsTest::checkMultVecMatrix()
+{
+    // Produit scalaire.
+    const double X = rand()%1 + 0.9;
+    const double Y = rand()%10 + 0.8;
+    const double Z = rand()%70 + 0.2;
+
+    const double c1 = rand()%40+0.8;
+    const double c2 = rand()%1+0.1;
+    const double c3 = rand()%29+0.5;
+    const double c4 = rand()%50+0.6;
+
+    const fwVec3d source = {X, Y, Z};
+    fwVec3d result;
+    const fwMatrix4x4 matrice = {1,c1,1,c2, 1,2,c3,c4, 1,1,5,c2, c3,1,c1,1};
+    ::fwMath::multVecMatrix(matrice, source, result);
+
+//  SbVec3f src(X, Y, Z);
+//  SbVec3f sbResult;
+//  SbMatrix sbmatrix(1,c1,1,c2, 1,2,c3,c4, 1,1,5,c2, c3,1,c1,1);
+//  sbmatrix.multVecMatrix(src, sbResult);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0], sbResult[0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1], sbResult[1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2], sbResult[2], 0.00001);
+}
+
+void MatrixFunctionsTest::checkRotationMatrix()
+{
+//    const double X = 7.8;
+//    const double Y = 0.6;
+//    const double Z = 2.6;
+//
+//    const fwVec3d vec = {X, Y, Z};
+//
+//    fwMatrix4x4 result = ::fwMath::getRotationMatrix(vec);
+//
+//
+//  SbVec3f src(X, Y, Z);
+//  SbRotation sbRotation;
+//  SbMatrix sbResult = sbRotation.getRotationMatrix(src);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0][0], sbResult[0][0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0][1], sbResult[0][1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0][2], sbResult[0][2], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0][3], sbResult[0][3], 0.00001);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1][0], sbResult[1][0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1][1], sbResult[1][1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1][2], sbResult[1][2], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1][3], sbResult[1][3], 0.00001);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2][0], sbResult[2][0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2][1], sbResult[2][1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2][2], sbResult[2][2], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2][3], sbResult[2][3], 0.00001);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[3][0], sbResult[3][0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[3][1], sbResult[3][1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[3][2], sbResult[3][2], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[3][3], sbResult[3][3], 0.00001);
+}
+
+} //namespace ut
+} //namespace fwMath
diff --git a/SrcLib/core/fwMath/test/tu/src/PlaneFunctionsTest.cpp b/SrcLib/core/fwMath/test/tu/src/PlaneFunctionsTest.cpp
new file mode 100644
index 0000000..d7f3789
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/src/PlaneFunctionsTest.cpp
@@ -0,0 +1,267 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMath/PlaneFunctions.hpp>
+
+#include "PlaneFunctionsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMath::ut::PlaneFunctionsTest );
+
+namespace fwMath
+{
+namespace ut
+{
+
+void PlaneFunctionsTest::setUp()
+{
+    // Set up context before running a test.
+}
+void PlaneFunctionsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void PlaneFunctionsTest::checkDistance()
+{
+    const double DISTANCE = 10.25;
+
+    fwPlane plane;
+    ::fwMath::setDistance(plane, DISTANCE);
+    CPPUNIT_ASSERT_EQUAL(::fwMath::getDistance(plane), DISTANCE);
+}
+
+void PlaneFunctionsTest::checkNormal()
+{
+    const double PlanP1_X = 1.0;
+    const double PlanP1_Y = 0.0;
+    const double PlanP1_Z = 0.0;
+
+    const double PlanP2_X = 0.0;
+    const double PlanP2_Y = 0.0;
+    const double PlanP2_Z = 1.0;
+
+    const double PlanP3_X = 0.0;
+    const double PlanP3_Y = 2.0;
+    const double PlanP3_Z = 1.0;
+
+    const fwVec3d planPt1 = {{PlanP1_X, PlanP1_Y, PlanP1_Z}};
+    const fwVec3d planPt2 = {{PlanP2_X, PlanP2_Y, PlanP2_Z}};
+    const fwVec3d planPt3 = {{PlanP3_X, PlanP3_Y, PlanP3_Z}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+    fwVec3d normal = ::fwMath::getNormal(plane);
+
+
+//  SbPlane soPlane(SbVec3f(PlanP1_X, PlanP1_Y, PlanP1_Z), SbVec3f(PlanP2_X, PlanP2_Y, PlanP2_Z), SbVec3f(PlanP3_X, PlanP3_Y, PlanP3_Z));
+//  SbVec3f sbNormal= soPlane.getNormal();
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(normal[0], (double)sbNormal[0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(normal[1], (double)sbNormal[1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(normal[2], (double)sbNormal[2], 0.00001);
+}
+
+void PlaneFunctionsTest::checkIntersect()
+{
+    const bool INTERSECT = true;
+
+    fwVec3d  point;
+    fwLine  line;
+    const fwVec3d linePos = {{1.0, 2.0, 4.0}};
+//  const fwVec3d lineDirection = {{1.0, 0.0, 0.0}};  // ==> pas d'intercestion
+//  const fwVec3d lineDirection = {{3.0, 0.0, 4.0}};  // ==> intercestion
+    const fwVec3d lineDirection = {{0.0, 0.0, 4.0}};  // ==> intersection en (0.0, 0.0, 0.0)
+
+    line = std::make_pair < fwVec3d, fwVec3d >(linePos, lineDirection);
+
+    const fwVec3d planPt1 = {{0.0,0.0,0.0}};
+    const fwVec3d planPt2 = {{2.0,0.0, 0.0}};
+    const fwVec3d planPt3 = {{0.0, 2.0, 0.0}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+    bool intersect =  ::fwMath::intersect( plane, line,  point);
+
+    CPPUNIT_ASSERT_EQUAL(point[0], 1.0);
+    CPPUNIT_ASSERT_EQUAL(point[1], 2.0);
+    CPPUNIT_ASSERT_EQUAL(point[2], 0.0);
+
+    CPPUNIT_ASSERT_EQUAL(intersect, INTERSECT);
+}
+
+void PlaneFunctionsTest::checkIntersect_fwMath_SoLib( )
+{
+
+//  for(int i= 0; i<100; i++) {
+    const double LineP1_X = 1.0;
+    const double LineP1_Y = rand()%100 +0.5;
+    const double LineP1_Z = 1.0;
+
+    const double LineP2_X = rand()%100 +0.1;
+    const double LineP2_Y = 0.0;
+    const double LineP2_Z = rand()%100 +0.6;
+
+    const double PlanP1_X = 1.0;
+    const double PlanP1_Y = rand()%100 +0.5;
+    const double PlanP1_Z = 98.0;
+
+    const double PlanP2_X = 0.0;
+    const double PlanP2_Y = 7.0;
+    const double PlanP2_Z = rand()%100 + 0.1;
+
+    const double PlanP3_X = rand() % 200 +0.7;
+    const double PlanP3_Y = 23.0;
+    const double PlanP3_Z = rand()%50 + 0.8;
+
+    // New version
+    // fwVec3d  point;
+    fwLine  line;
+    const fwVec3d linePos = {{LineP1_X, LineP1_Y, LineP1_Z}};
+//  const fwVec3d lineDirection = {{1.0, 0.0, 0.0}};  // ==> pas d'intercestion
+//  const fwVec3d lineDirection = {{3.0, 0.0, 4.0}};  // ==> intercestion
+    fwVec3d lineDirection = {{LineP2_X, LineP2_Y, LineP2_Z}};  // ==> intersection en (0.0, 0.0, 0.0)
+    line = std::make_pair < fwVec3d, fwVec3d >(linePos, lineDirection);
+    const fwVec3d planPt1 = {{PlanP1_X, PlanP1_Y, PlanP1_Z}};
+    const fwVec3d planPt2 = {{PlanP2_X, PlanP2_Y, PlanP2_Z}};
+    const fwVec3d planPt3 = {{PlanP3_X, PlanP3_Y, PlanP3_Z}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+    // int intersect =  ::fwMath::intersect( plane, line,  point);
+
+    // Old version
+//  SbLine aLine(SbVec3f(LineP1_X, LineP1_Y, LineP1_Z), SbVec3f(LineP2_X, LineP2_Y, LineP2_Z));
+//  SbVec3f aIntersection;
+//  SbPlane soPlane(SbVec3f(PlanP1_X, PlanP1_Y, PlanP1_Z), SbVec3f(PlanP2_X, PlanP2_Y, PlanP2_Z), SbVec3f(PlanP3_X, PlanP3_Y, PlanP3_Z));
+//  SbBool soIntersect = soPlane.intersect(aLine,aIntersection);
+
+//      OSLM_TRACE( "X :" <<  point[0] << ", " << aIntersection[0]);
+//      OSLM_TRACE( "Y :" <<  point[1] << ", " << aIntersection[1]);
+//      OSLM_TRACE( "Z :" <<  point[2] << ", " << aIntersection[2]);
+
+//  CPPUNIT_ASSERT_EQUAL(intersect, soIntersect);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(point[0], (double)aIntersection[0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(point[1], (double)aIntersection[1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(point[2], (double)aIntersection[2], 0.00001);
+
+//}
+
+//  CPPUNIT_ASSERT_EQUAL(intersect, INTERSECT);
+}
+
+void PlaneFunctionsTest::checkIsInHalfSpace_fwMath_SoLib()
+{
+    // const double P1_X = 1.0;
+    // const double P1_Y = 0.0;
+    // const double P1_Z = 1.0;
+
+    const double PlanP1_X = 1.0;
+    const double PlanP1_Y = 0.0;
+    const double PlanP1_Z = 0.0;
+
+    const double PlanP2_X = 0.0;
+    const double PlanP2_Y = 0.0;
+    const double PlanP2_Z = 1.0;
+
+    const double PlanP3_X = 0.0;
+    const double PlanP3_Y = 2.0;
+    const double PlanP3_Z = 1.0;
+
+    // const fwVec3d point1 = {{P1_X, P1_Y, P1_Z}};
+
+    const fwVec3d planPt1 = {{PlanP1_X, PlanP1_Y, PlanP1_Z}};
+    const fwVec3d planPt2 = {{PlanP2_X, PlanP2_Y, PlanP2_Z}};
+    const fwVec3d planPt3 = {{PlanP3_X, PlanP3_Y, PlanP3_Z}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+
+    // bool result = ::fwMath::isInHalfSpace(plane, point1);
+
+
+//  SbPlane sbPlane(SbVec3f(PlanP1_X, PlanP1_Y, PlanP1_Z), SbVec3f(PlanP2_X, PlanP2_Y, PlanP2_Z), SbVec3f(PlanP3_X, PlanP3_Y, PlanP3_Z));
+//  SbVec3f sbPoint1(P1_X, P1_Y, P1_Z);
+//
+//  SbBool sbResult = sbPlane.isInHalfSpace(sbPoint1);
+//  CPPUNIT_ASSERT_EQUAL(result, (bool)sbResult);
+
+}
+
+void PlaneFunctionsTest::checkOffset()
+{
+    const double OFFSET = 0.3;
+
+    const double PlanP1_X = 1.0;
+    const double PlanP1_Y = 0.0;
+    const double PlanP1_Z = 0.0;
+
+    const double PlanP2_X = 0.0;
+    const double PlanP2_Y = 0.0;
+    const double PlanP2_Z = 1.0;
+
+    const double PlanP3_X = 0.0;
+    const double PlanP3_Y = 2.0;
+    const double PlanP3_Z = 1.0;
+
+    const fwVec3d planPt1 = {{PlanP1_X, PlanP1_Y, PlanP1_Z}};
+    const fwVec3d planPt2 = {{PlanP2_X, PlanP2_Y, PlanP2_Z}};
+    const fwVec3d planPt3 = {{PlanP3_X, PlanP3_Y, PlanP3_Z}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+
+    ::fwMath::offset(plane,OFFSET );
+    // double result = ::fwMath::getDistance(plane);
+
+//  SbPlane sbPlane(SbVec3f(PlanP1_X, PlanP1_Y, PlanP1_Z), SbVec3f(PlanP2_X, PlanP2_Y, PlanP2_Z), SbVec3f(PlanP3_X, PlanP3_Y, PlanP3_Z));
+//  sbPlane.offset(OFFSET);
+//  float sbResult = sbPlane.getDistanceFromOrigin();
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result, sbResult, 0.00001);
+}
+
+void PlaneFunctionsTest::checkTransform()
+{
+    // const fwVec3d normal = {{0.2, 0.6, 0.8}};
+    // const double distance = 0.28;
+
+    const double c1 = rand()%40+0.8;
+    const double c2 = rand()%1+0.1;
+    const double c3 = rand()%29+0.5;
+    const double c4 = rand()%50+0.6;
+    const double c5 = rand()%20+0.5;
+
+    const double PlanP1_X = 1.0;
+    const double PlanP1_Y = rand()%100 +0.5;
+    const double PlanP1_Z = 98.0;
+
+    const double PlanP2_X = 0.0;
+    const double PlanP2_Y = 7.0;
+    const double PlanP2_Z = rand()%100 + 0.1;
+
+    const double PlanP3_X = rand() % 200 +0.7;
+    const double PlanP3_Y = 23.0;
+    const double PlanP3_Z = rand()%50 + 0.8;
+
+
+    const fwVec3d planPt1 = {{PlanP1_X, PlanP1_Y, PlanP1_Z}};
+    const fwVec3d planPt2 = {{PlanP2_X, PlanP2_Y, PlanP2_Z}};
+    const fwVec3d planPt3 = {{PlanP3_X, PlanP3_Y, PlanP3_Z}};
+    fwPlane plane;
+    ::fwMath::setValues(plane, planPt1, planPt2, planPt3);
+    const fwMatrix4x4 matrice = {{{{1,c1,0,c2}}, {{c3,1,c1,0}}, {{c4,0,1,c5}}, {{0,c1,c2,c4 }}}};
+    ::fwMath::transform(plane, matrice);
+
+//  SbPlane soPlane(SbVec3f(PlanP1_X, PlanP1_Y, PlanP1_Z), SbVec3f(PlanP2_X, PlanP2_Y, PlanP2_Z), SbVec3f(PlanP3_X, PlanP3_Y, PlanP3_Z));
+//  SbMatrix aMatrix (1,c1,0,c2, c3,1,c1,0, c4,0,1,c5, 0,c1,c2,c4);
+//  soPlane.transform(aMatrix);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(plane[0], (soPlane.getNormal())[0], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(plane[1], (soPlane.getNormal())[1], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(plane[2], (soPlane.getNormal())[2], 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(plane[3], soPlane.getDistanceFromOrigin(), 0.00001);
+}
+
+} //namespace ut
+} //namespace fwMath
+
diff --git a/SrcLib/core/fwMath/test/tu/src/VectorFunctionsTest.cpp b/SrcLib/core/fwMath/test/tu/src/VectorFunctionsTest.cpp
new file mode 100644
index 0000000..0d20174
--- /dev/null
+++ b/SrcLib/core/fwMath/test/tu/src/VectorFunctionsTest.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMath/VectorFunctions.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "VectorFunctionsTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMath::ut::VectorFunctionsTest );
+
+namespace fwMath
+{
+namespace ut
+{
+
+void VectorFunctionsTest::setUp()
+{
+    // Set up context before running a test.
+
+}
+void VectorFunctionsTest::tearDown()
+{
+    // Clean up after the test run.
+
+}
+
+void VectorFunctionsTest::checkDot()
+{
+    // Produit scalaire.
+    const double V1_X = 0.1;
+    const double V1_Y =rand()%30+0.1;
+    const double V1_Z =rand()%20+0.4;
+
+    const double V2_X = rand()%50+0.4;
+    const double V2_Y =0.5;
+    const double V2_Z =rand()%10+0.8;
+
+    const fwVec3d V1 = {V1_X, V1_Y, V1_Z};
+    const fwVec3d V2 = {V2_X, V2_Y, V2_Z};
+    double result;
+    result = ::fwMath::dot(V1, V2);
+
+    double dotResult = V1_X*V2_X + V1_Y*V2_Y + V1_Z*V2_Z;
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(result, dotResult, 0.00001);
+}
+
+void VectorFunctionsTest::checkDot_fwMath_Solib()
+{
+
+    const double V1_X = 0.1;
+    const double V1_Y =rand()%30+0.1;
+    const double V1_Z =rand()%20+0.4;
+
+    const double V2_X = rand()%50+0.4;
+    const double V2_Y =0.5;
+    const double V2_Z =rand()%10+0.8;
+
+    // Produit scalaire.
+    const fwVec3d V1 = {V1_X, V1_Y, V1_Z};
+    const fwVec3d V2 = {V2_X, V2_Y, V2_Z};
+    double result;
+    result = ::fwMath::dot(V1, V2);
+
+    // Old version
+//  SbVec3f soV1(V1_X, V1_Y, V1_Z);
+//  SbVec3f soV2(V2_X, V2_Y, V2_Z);
+//  float soResult = soV1.dot(soV2);
+//
+//  OSLM_TRACE( "V1_X :" <<  V1[0] << ", " << soV1[0]);
+//  OSLM_TRACE( "V1_Y :" <<  V1[1] << ", " << soV1[1]);
+//  OSLM_TRACE( "V1_Z :" <<  V1[2] << ", " << soV1[2]);
+//  OSLM_TRACE( "V2_X :" <<  V2[0] << ", " << soV2[0]);
+//  OSLM_TRACE( "V2_Y :" <<  V2[1] << ", " << soV2[1]);
+//  OSLM_TRACE( "V2_Z :" <<  V2[2] << ", " << soV2[2]);
+//  OSLM_TRACE( "DOT RESULT :" <<  result << ", " << soResult);
+
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result, double(soResult), 0.00001);
+}
+
+void VectorFunctionsTest::checkCross()
+{
+    // Produit vectoriel.
+    const double DISTANCE = 10.25;
+
+    // New version
+    const double CROOS_X = -0.03;
+    const double CROSS_Y = 0.06;
+    const double CROSS_Z = -0.03;
+    const fwVec3d V1 = {0.1, 0.2, 0.3};
+    const fwVec3d V2 = {0.4, 0.5, 0.6};
+
+    fwVec3d result;
+    result = ::fwMath::cross(V1, V2);
+
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0], CROOS_X , 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1], CROSS_Y , 0.00001);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2], CROSS_Z , 0.00001);
+}
+
+void VectorFunctionsTest::checkCross_fwMath_SoLib()
+{
+    // Produit vectoriel.
+
+    const double V1_X = 0.1;
+    const double V1_Y =rand()%30+0.1;
+    const double V1_Z =rand()%10+0.4;
+
+    const double V2_X = rand()%50+0.4;
+    const double V2_Y =0.5;
+    const double V2_Z =rand()%20+0.8;
+
+    // New version
+    const fwVec3d V1 = {V1_X, V1_Y, V1_Z};
+    const fwVec3d V2 = {V2_X, V2_Y, V2_Z};
+
+    fwVec3d result;
+    result = ::fwMath::cross(V1, V2);
+
+    // Old version
+//  SbVec3f soV1(V1_X, V1_Y, V1_Z);
+//  SbVec3f soV2(V2_X, V2_Y, V2_Z);
+//  SbVec3f soResult = soV1.cross(soV2);
+//
+//  OSLM_TRACE( "V1_X :" <<  V1[0] << ", " << soV1[0]);
+//  OSLM_TRACE( "V1_Y :" <<  V1[1] << ", " << soV1[1]);
+//  OSLM_TRACE( "V1_Z :" <<  V1[2] << ", " << soV1[2]);
+//  OSLM_TRACE( "V2_X :" <<  V2[0] << ", " << soV2[0]);
+//  OSLM_TRACE( "V2_Y :" <<  V2[1] << ", " << soV2[1]);
+//  OSLM_TRACE( "V2_Z :" <<  V2[2] << ", " << soV2[2]);
+//  OSLM_TRACE( "CROSS RESULT_X :" <<  result[0] << ", " << soResult[0]);
+//  OSLM_TRACE( "CROSS RESULT_Y :" <<  result[1] << ", " << soResult[1]);
+//  OSLM_TRACE( "CROSS RESULT_Z :" <<  result[2] << ", " << soResult[2]);
+//
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[0], (double)soResult[0] , 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[1], (double)soResult[1] , 0.00001);
+//  CPPUNIT_ASSERT_DOUBLES_EQUAL(result[2], (double)soResult[2] , 0.00001);
+
+}
+
+void VectorFunctionsTest::checkNormalize()
+{
+    const double NORME = 0.87749;
+    fwVec3d V = {0.4, 0.5, 0.6};
+    double norme = ::fwMath::normalize(V);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(norme,  NORME, 0.00001);
+}
+
+} //namespace ut
+} //namespace fwMath
diff --git a/SrcLib/core/fwMedData/CMakeLists.txt b/SrcLib/core/fwMedData/CMakeLists.txt
new file mode 100644
index 0000000..7170c11
--- /dev/null
+++ b/SrcLib/core/fwMedData/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+fwUseForwardInclude(fwData)
+
+find_package (Boost REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+fwLink(${Boost_LIBRARIES})
+
diff --git a/SrcLib/core/fwMedData/COPYING b/SrcLib/core/fwMedData/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwMedData/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwMedData/COPYING.LESSER b/SrcLib/core/fwMedData/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwMedData/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwMedData/Properties.cmake b/SrcLib/core/fwMedData/Properties.cmake
new file mode 100644
index 0000000..e1128ac
--- /dev/null
+++ b/SrcLib/core/fwMedData/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMedData )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwData )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMedData/bin/build.options b/SrcLib/core/fwMedData/bin/build.options
new file mode 100644
index 0000000..09e9167
--- /dev/null
+++ b/SrcLib/core/fwMedData/bin/build.options
@@ -0,0 +1,4 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = ['boost']
+LIB = ['fwData_0-1']
diff --git a/SrcLib/core/fwMedData/include/fwMedData/ActivitySeries.hpp b/SrcLib/core/fwMedData/include/fwMedData/ActivitySeries.hpp
new file mode 100644
index 0000000..9101a18
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/ActivitySeries.hpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_ACTIVITYSERIES_HPP__
+#define __FWMEDDATA_ACTIVITYSERIES_HPP__
+
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include <fwMedData/Series.hpp>
+
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(ActivitySeries), FWMEDDATA_API);
+
+namespace fwData
+{
+    class Composite;
+}
+
+namespace fwMedData
+{
+
+class Series;
+
+/**
+ * @class ActivitySeries
+ * Holds activity information
+ *
+ */
+class FWMEDDATA_CLASS_API ActivitySeries : public ::fwMedData::Series
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ActivitySeries)(::fwMedData::Series),
+                                            (()),
+                                            ::fwData::factory::New< ActivitySeries >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(ActivitySeries));
+
+    typedef std::string ConfigIdType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API ActivitySeries(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~ActivitySeries();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Data container
+     * @{ */
+    fwDataGetSetSptrMacro(Data, SPTR(::fwData::Composite));
+    /**  @} */
+
+    /**
+     * @brief Activity configuration identifier
+     * @{ */
+    fwDataGetSetCRefMacro(ActivityConfigId, ConfigIdType);
+    /**  @} */
+
+    /**  @} */
+protected:
+
+    /// Activity configuration identifier
+    ConfigIdType m_attrActivityConfigId;
+
+    /// ... container
+    SPTR(::fwData::Composite) m_attrData;
+
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_ACTIVITYSERIES_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/Equipment.hpp b/SrcLib/core/fwMedData/include/fwMedData/Equipment.hpp
new file mode 100644
index 0000000..bf596b4
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/Equipment.hpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_EQUIPMENT_HPP__
+#define __FWMEDDATA_EQUIPMENT_HPP__
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/macros.hpp"
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(Equipment), FWMEDDATA_API);
+
+namespace fwMedData
+{
+
+/**
+ * @class Equipment
+ * Holds equipment information
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API Equipment : public ::fwData::Object
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Equipment)(::fwData::Object), (()), ::fwData::factory::New< Equipment >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(Equipment));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API Equipment(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~Equipment();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Institution where the equipment that produced the composite instances is located (0008,0080)
+     * @{ */
+    fwDataGetSetCRefMacro(InstitutionName, DicomValueType);
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Institution name
+    DicomValueType m_attrInstitutionName;
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_EQUIPMENT_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/ImageSeries.hpp b/SrcLib/core/fwMedData/include/fwMedData/ImageSeries.hpp
new file mode 100644
index 0000000..a7b602f
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/ImageSeries.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_IMAGESERIES_HPP__
+#define __FWMEDDATA_IMAGESERIES_HPP__
+
+#include <fwData/Object.hpp>
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/Series.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(ImageSeries), FWMEDDATA_API);
+
+namespace fwData
+{
+    class Image;
+}
+
+namespace fwMedData
+{
+
+
+/**
+ * @class ImageSeries
+ * Holds images data
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API ImageSeries : public ::fwMedData::Series
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (ImageSeries)(::fwData::Object), (()), ::fwData::factory::New< ImageSeries >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(ImageSeries));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API ImageSeries(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~ImageSeries();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Image container
+     * @{ */
+    fwDataGetSetSptrMacro(Image, SPTR(::fwData::Image));
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Image container
+    SPTR(::fwData::Image) m_attrImage;
+
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_IMAGESERIES_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/ModelSeries.hpp b/SrcLib/core/fwMedData/include/fwMedData/ModelSeries.hpp
new file mode 100644
index 0000000..ff3bbdf
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/ModelSeries.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_MODELSERIES_HPP__
+#define __FWMEDDATA_MODELSERIES_HPP__
+
+#include <vector>
+
+#include <fwData/Object.hpp>
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/Series.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(ModelSeries), FWMEDDATA_API);
+
+namespace fwData
+{
+    class Reconstruction;
+}
+
+namespace fwMedData
+{
+
+
+/**
+ * @class ModelSeries
+ * Holds models data
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API ModelSeries : public ::fwMedData::Series
+{
+
+public:
+    typedef std::vector< SPTR(::fwData::Reconstruction) > ReconstructionVectorType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ModelSeries)(::fwData::Object), (()), ::fwData::factory::New< ModelSeries >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(ModelSeries));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API ModelSeries(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~ModelSeries();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Model container
+     * @{ */
+    fwDataGetSetCRefMacro(ReconstructionDB, ReconstructionVectorType);
+    /**  @} */
+
+    /**  @} */
+
+
+protected:
+
+    /// Model container
+    ReconstructionVectorType m_attrReconstructionDB;
+
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_MODELSERIES_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/Patient.hpp b/SrcLib/core/fwMedData/include/fwMedData/Patient.hpp
new file mode 100644
index 0000000..26b22b0
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/Patient.hpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_PATIENT_HPP__
+#define __FWMEDDATA_PATIENT_HPP__
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/macros.hpp"
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(Patient), FWMEDDATA_API);
+
+namespace fwMedData
+{
+
+/**
+ * @class Patient
+ * Holds patient information
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API Patient : public ::fwData::Object
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Patient)(::fwData::Object), (()), ::fwData::factory::New< Patient >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(Patient));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API Patient(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~Patient();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters/Setters
+     * @{ */
+
+    /**
+     * @brief Patient's full name (0010,0010)
+     * @{ */
+    fwDataGetSetCRefMacro(Name, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Primary hospital identification number or code for the patient (0010,0020)
+     * @{ */
+    fwDataGetSetCRefMacro(PatientId, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Birthdate of the patient (0010,0030)
+     * @{ */
+    fwDataGetSetCRefMacro(Birthdate, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Sex of the named patient (0010,0040)
+     * Enumerated Values: M = male, F = female, O = other
+     * @{ */
+    fwDataGetSetCRefMacro(Sex, DicomValueType);
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Full name
+    DicomValueType m_attrName;
+
+    /// Primary hospital identification
+    DicomValueType m_attrPatientId;
+
+    /// Birthdate
+    DicomValueType m_attrBirthdate;
+
+    /// Patient's sex
+    DicomValueType m_attrSex;
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_PATIENT_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/Series.hpp b/SrcLib/core/fwMedData/include/fwMedData/Series.hpp
new file mode 100644
index 0000000..8e3f9a2
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/Series.hpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_SERIES_HPP__
+#define __FWMEDDATA_SERIES_HPP__
+
+#include <fwData/Object.hpp>
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(Series), FWMEDDATA_API);
+
+namespace fwMedData
+{
+
+class Patient;
+class Study;
+class Equipment;
+
+/**
+ * @class Series
+ * Holds series information.
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API Series : public ::fwData::Object
+{
+
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (Series)(::fwData::Object) );
+
+    fwCampMakeFriendDataMacro((fwMedData)(Series));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API Series(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~Series();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Referring Patient
+     * @{ */
+    fwDataGetSetSptrMacro(Patient, SPTR(::fwMedData::Patient));
+    /**  @} */
+
+    /**
+     * @brief Referring Study
+     * @{ */
+    fwDataGetSetSptrMacro(Study, SPTR(::fwMedData::Study));
+    /**  @} */
+
+    /**
+     * @brief Related Equipment
+     * @{ */
+    fwDataGetSetSptrMacro(Equipment, SPTR(::fwMedData::Equipment));
+    /**  @} */
+
+    /**
+     * @brief Unique identifier of the Series (0020,000E)
+     * @{ */
+    fwDataGetSetCRefMacro(InstanceUID, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Type of equipment that originally acquired the data used to create this Series (0008,0060)
+     * @{ */
+    fwDataGetSetCRefMacro(Modality, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Date the Series started (0008,0021)
+     * @{ */
+    fwDataGetSetCRefMacro(Date, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Time the Series started (0008,0031)
+     * @{ */
+    fwDataGetSetCRefMacro(Time, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Description of the Series (0008,103E)
+     * @{ */
+    fwDataGetSetCRefMacro(Description, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Name of the physician(s) administering the Series (0008,1050)
+     * @{ */
+    fwDataGetSetCRefMacro(PerformingPhysiciansName, DicomValuesType);
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Referring Patient
+    SPTR(Patient) m_attrPatient;
+
+    /// Referring Study
+    SPTR(Study) m_attrStudy;
+
+    /// Related Equipment
+    SPTR(Equipment) m_attrEquipment;
+
+    /// Series unique identifier
+    DicomValueType m_attrInstanceUID;
+
+    /// Modality
+    DicomValueType m_attrModality;
+
+    /// Date
+    DicomValueType m_attrDate;
+
+    /// Time
+    DicomValueType m_attrTime;
+
+    /// Description
+    DicomValueType m_attrDescription;
+
+    /// Performing physicians name
+    DicomValuesType m_attrPerformingPhysiciansName;
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_SERIES_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/SeriesDB.hpp b/SrcLib/core/fwMedData/include/fwMedData/SeriesDB.hpp
new file mode 100644
index 0000000..c7b1a8c
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/SeriesDB.hpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_SERIESDB_HPP__
+#define __FWMEDDATA_SERIESDB_HPP__
+
+#include <vector>
+
+#include <fwData/Object.hpp>
+#include <fwData/factory/new.hpp>
+#include <fwData/macros.hpp>
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(SeriesDB), FWMEDDATA_API);
+
+namespace fwMedData
+{
+
+class Series;
+
+/**
+ * @class SeriesDB
+ * Holds series data
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API SeriesDB : public ::fwData::Object
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (SeriesDB)(::fwData::Object), (()), ::fwData::factory::New< SeriesDB >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(SeriesDB));
+
+
+    typedef std::vector< SPTR(Series) > ContainerType;
+
+    typedef ContainerType::value_type ValueType;
+    typedef ContainerType::reference ReferenceType;
+    typedef ContainerType::const_reference ConstReferenceType;
+    typedef ContainerType::iterator IteratorType;
+    typedef ContainerType::const_iterator ConstIteratorType;
+    typedef ContainerType::reverse_iterator ReverseIteratorType;
+    typedef ContainerType::const_reverse_iterator ConstReverseIteratorType;
+    typedef ContainerType::size_type SizeType;
+
+    /// boost_foreach/stl compatibility
+    /// @{
+    typedef ContainerType::value_type value_type;
+    typedef ContainerType::iterator iterator;
+    typedef ContainerType::const_iterator const_iterator;
+    typedef ContainerType::reverse_iterator reverse_iterator;
+    typedef ContainerType::const_reverse_iterator const_reverse_iterator;
+    typedef ContainerType::size_type size_type;
+
+
+    IteratorType begin() { return m_attrContainer.begin(); }
+    IteratorType end()   { return m_attrContainer.end(); }
+    ConstIteratorType begin() const { return m_attrContainer.begin(); }
+    ConstIteratorType end()   const { return m_attrContainer.end(); }
+
+    ReverseIteratorType rbegin() { return m_attrContainer.rbegin(); }
+    ReverseIteratorType rend()   { return m_attrContainer.rend(); }
+    ConstReverseIteratorType rbegin() const { return m_attrContainer.rbegin(); }
+    ConstReverseIteratorType rend()   const { return m_attrContainer.rend(); }
+
+    bool empty() const { return m_attrContainer.empty(); }
+    SizeType size() const { return m_attrContainer.size(); }
+
+    ValueType front(){ return m_attrContainer.front(); }
+    ValueType back(){ return m_attrContainer.back(); }
+
+    ReferenceType operator[] ( size_type n ) {return this->m_attrContainer[n];}
+    ConstReferenceType operator[] ( size_type n ) const {return this->m_attrContainer[n];}
+
+    ReferenceType at ( SizeType n ) {return m_attrContainer.at(n);}
+    ConstReferenceType at ( SizeType n ) const {return m_attrContainer.at(n);}
+    /// @}
+
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API SeriesDB(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~SeriesDB();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+
+    /**
+     * @name Getters / Setters
+     * @{ */
+
+    /**
+     * @brief Series container
+     * @{ */
+    ContainerType &getContainer(){ return m_attrContainer; };
+    fwDataGetSetCRefMacro(Container, ContainerType);
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Series container
+    ContainerType m_attrContainer;
+
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_SERIESDB_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/Study.hpp b/SrcLib/core/fwMedData/include/fwMedData/Study.hpp
new file mode 100644
index 0000000..4d04bb8
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/Study.hpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_STUDY_HPP__
+#define __FWMEDDATA_STUDY_HPP__
+
+#include "fwData/Object.hpp"
+#include "fwData/factory/new.hpp"
+#include "fwData/macros.hpp"
+
+#include "fwMedData/types.hpp"
+#include "fwMedData/config.hpp"
+
+fwCampAutoDeclareDataMacro((fwMedData)(Study), FWMEDDATA_API);
+
+namespace fwMedData
+{
+
+/**
+ * @class Study
+ * Holds study information
+ *
+ * 
+ */
+class FWMEDDATA_CLASS_API Study : public ::fwData::Object
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Study)(::fwData::Object), (()), ::fwData::factory::New< Study >) ;
+
+    fwCampMakeFriendDataMacro((fwMedData)(Study));
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWMEDDATA_API Study(::fwData::Object::Key key);
+
+    /// Destructor
+    FWMEDDATA_API virtual ~Study();
+
+    /// Defines shallow copy
+    FWMEDDATA_API void shallowCopy( const ::fwData::Object::csptr &_source );
+
+    /// Defines deep copy
+    FWMEDDATA_API void cachedDeepCopy( const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache );
+
+    /**
+     * @name Getters/Setters
+     * @{ */
+
+    /**
+     * @brief Unique identifier of the Study (0020,000D)
+     * @{ */
+    fwDataGetSetCRefMacro(InstanceUID, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Date the Study started (0008,0020)
+     * @{ */
+    fwDataGetSetCRefMacro(Date, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Time the Study started (0008,0030)
+     * @{ */
+    fwDataGetSetCRefMacro(Time, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Name of the patient's referring physician (0008,0090)
+     * @{ */
+    fwDataGetSetCRefMacro(ReferringPhysicianName, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Institution-generated description or classification of the Study (component) performed (0008,1030)
+     * @{ */
+    fwDataGetSetCRefMacro(Description, DicomValueType);
+    /**  @} */
+
+    /**
+     * @brief Age of the Patient (0010,1010)
+     * @{ */
+    fwDataGetSetCRefMacro(PatientAge, DicomValueType);
+    /**  @} */
+
+    /**  @} */
+
+protected:
+
+    /// Study unique identifier
+    DicomValueType m_attrInstanceUID;
+
+    /// Date
+    DicomValueType m_attrDate;
+
+    /// Time
+    DicomValueType m_attrTime;
+
+    /// Referring physician name
+    DicomValueType m_attrReferringPhysicianName;
+
+    /// Description
+    DicomValueType m_attrDescription;
+
+    /// Patient age
+    DicomValueType m_attrPatientAge;
+};
+
+}   //end namespace fwMedData
+
+#endif // __FWMEDDATA_STUDY_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/config.hpp b/SrcLib/core/fwMedData/include/fwMedData/config.hpp
new file mode 100644
index 0000000..8771911
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWMEDDATA_CONFIG_HPP_
+#define _FWMEDDATA_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWMEDDATA_EXPORTS
+            #define FWMEDDATA_API __declspec(dllexport)
+        #else
+            #define FWMEDDATA_API __declspec(dllimport)
+        #endif
+
+        #define FWMEDDATA_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWMEDDATA_EXPORTS
+            #define FWMEDDATA_API __attribute__ ((visibility("default")))
+            #define FWMEDDATA_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWMEDDATA_API __attribute__ ((visibility("hidden")))
+            #define FWMEDDATA_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWMEDDATA_API
+        #define FWMEDDATA_CLASS_API
+
+    #endif
+
+#endif //FWMEDDATA_API
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/namespace.hpp b/SrcLib/core/fwMedData/include/fwMedData/namespace.hpp
new file mode 100644
index 0000000..b13b7ff
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/namespace.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#ifndef __FWMEDDATA_NAMESPACE_HPP__
+#define __FWMEDDATA_NAMESPACE_HPP__
+
+/**
+ * @brief Namespace containing medical data
+ */
+namespace fwMedData
+{
+
+} // namespace fwMedData
+
+#endif /* __FWMEDDATA_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwMedData/include/fwMedData/types.hpp b/SrcLib/core/fwMedData/include/fwMedData/types.hpp
new file mode 100644
index 0000000..86f3839
--- /dev/null
+++ b/SrcLib/core/fwMedData/include/fwMedData/types.hpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_TYPES_HPP__
+#define __FWMEDDATA_TYPES_HPP__
+
+#include <string>
+#include <vector>
+
+namespace fwMedData
+{
+    typedef std::string DicomValueType;
+    typedef std::vector<DicomValueType> DicomValuesType;
+
+}//end namespace fwMedData
+
+#endif // __FWMEDDATA_TYPES_HPP__
+
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/ActivitySeries.cpp b/SrcLib/core/fwMedData/src/fwMedData/ActivitySeries.cpp
new file mode 100644
index 0000000..89105c5
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/ActivitySeries.cpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/registry/macros.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/ActivitySeries.hpp"
+
+fwDataRegisterMacro( ::fwMedData::ActivitySeries );
+
+namespace fwMedData
+{
+
+ActivitySeries::ActivitySeries(::fwData::Object::Key key) : Series(key),
+        m_attrData(::fwData::Composite::New())
+{}
+
+//------------------------------------------------------------------------------
+
+ActivitySeries::~ActivitySeries()
+{}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    ActivitySeries::csptr other = ActivitySeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::shallowCopy(_source);
+    m_attrActivityConfigId = other->m_attrActivityConfigId;
+    m_attrData = other->m_attrData;
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    ActivitySeries::csptr other = ActivitySeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::cachedDeepCopy(_source, cache);
+
+    m_attrActivityConfigId = other->m_attrActivityConfigId;
+    m_attrData = ::fwData::Object::copy(other->m_attrData, cache);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/Equipment.cpp b/SrcLib/core/fwMedData/src/fwMedData/Equipment.cpp
new file mode 100644
index 0000000..f2f4477
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/Equipment.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/Equipment.hpp"
+
+fwDataRegisterMacro( ::fwMedData::Equipment );
+
+namespace fwMedData
+{
+
+Equipment::Equipment(::fwData::Object::Key key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+Equipment::~Equipment()
+{}
+
+//------------------------------------------------------------------------------
+
+void Equipment::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    Equipment::csptr other = Equipment::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( _source );
+    m_attrInstitutionName = other->m_attrInstitutionName;
+}
+
+//------------------------------------------------------------------------------
+
+void Equipment::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Equipment::csptr other = Equipment::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldDeepCopy( _source, cache );
+    m_attrInstitutionName = other->m_attrInstitutionName;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/ImageSeries.cpp b/SrcLib/core/fwMedData/src/fwMedData/ImageSeries.cpp
new file mode 100644
index 0000000..1576831
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/ImageSeries.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/Image.hpp>
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/ImageSeries.hpp"
+
+fwDataRegisterMacro( ::fwMedData::ImageSeries );
+
+namespace fwMedData
+{
+
+ImageSeries::ImageSeries(::fwData::Object::Key key): Series(key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+ImageSeries::~ImageSeries()
+{}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    ImageSeries::csptr other = ImageSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::shallowCopy(_source);
+
+    m_attrImage = other->m_attrImage;
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    ImageSeries::csptr other = ImageSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::cachedDeepCopy(_source, cache);
+
+    m_attrImage = ::fwData::Object::copy(other->m_attrImage);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/ModelSeries.cpp b/SrcLib/core/fwMedData/src/fwMedData/ModelSeries.cpp
new file mode 100644
index 0000000..300c9f6
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/ModelSeries.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/Image.hpp>
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/ModelSeries.hpp"
+
+fwDataRegisterMacro( ::fwMedData::ModelSeries );
+
+namespace fwMedData
+{
+
+ModelSeries::ModelSeries(::fwData::Object::Key key): Series(key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+ModelSeries::~ModelSeries()
+{}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    ModelSeries::csptr other = ModelSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::shallowCopy(_source);
+
+    m_attrReconstructionDB = other->m_attrReconstructionDB;
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    ModelSeries::csptr other = ModelSeries::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->::fwMedData::Series::cachedDeepCopy(_source, cache);
+
+    m_attrReconstructionDB = other->m_attrReconstructionDB;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/Patient.cpp b/SrcLib/core/fwMedData/src/fwMedData/Patient.cpp
new file mode 100644
index 0000000..dbe6c45
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/Patient.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/Patient.hpp"
+
+fwDataRegisterMacro( ::fwMedData::Patient );
+
+namespace fwMedData
+{
+
+Patient::Patient(::fwData::Object::Key key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+Patient::~Patient()
+{}
+
+//------------------------------------------------------------------------------
+
+void Patient::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    Patient::csptr other = Patient::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( other );
+    m_attrName = other->m_attrName;
+    m_attrBirthdate = other->m_attrBirthdate;
+    m_attrPatientId = other->m_attrPatientId;
+    m_attrSex = other->m_attrSex;
+}
+
+//------------------------------------------------------------------------------
+
+void Patient::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Patient::csptr other = Patient::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldDeepCopy( other, cache );
+    m_attrName = other->m_attrName;
+    m_attrBirthdate = other->m_attrBirthdate;
+    m_attrPatientId = other->m_attrPatientId;
+    m_attrSex = other->m_attrSex;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/Series.cpp b/SrcLib/core/fwMedData/src/fwMedData/Series.cpp
new file mode 100644
index 0000000..45007a0
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/Series.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/Patient.hpp"
+#include "fwMedData/Study.hpp"
+#include "fwMedData/Equipment.hpp"
+#include "fwMedData/Series.hpp"
+
+
+namespace fwMedData
+{
+
+Series::Series(::fwData::Object::Key key) :
+        m_attrPatient(::fwMedData::Patient::New()),
+        m_attrStudy(::fwMedData::Study::New()),
+        m_attrEquipment(::fwMedData::Equipment::New())
+{
+}
+
+//------------------------------------------------------------------------------
+
+Series::~Series()
+{}
+
+//------------------------------------------------------------------------------
+
+void Series::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    Series::csptr other = Series::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( other );
+
+    m_attrPatient = other->m_attrPatient;
+    m_attrStudy = other->m_attrStudy;
+    m_attrEquipment = other->m_attrEquipment;
+
+    m_attrInstanceUID = other->m_attrInstanceUID;
+    m_attrModality = other->m_attrModality;
+    m_attrDate = other->m_attrDate;
+    m_attrTime = other->m_attrTime;
+    m_attrPerformingPhysiciansName = other->m_attrPerformingPhysiciansName;
+    m_attrDescription = other->m_attrDescription;
+}
+
+//------------------------------------------------------------------------------
+
+void Series::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Series::csptr other = Series::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldDeepCopy( other, cache );
+
+    m_attrPatient = ::fwData::Object::copy(other->m_attrPatient, cache);
+    m_attrStudy = ::fwData::Object::copy(other->m_attrStudy, cache);
+    m_attrEquipment = ::fwData::Object::copy(other->m_attrEquipment, cache);
+
+    m_attrInstanceUID = other->m_attrInstanceUID;
+    m_attrModality = other->m_attrModality;
+    m_attrDate = other->m_attrDate;
+    m_attrTime = other->m_attrTime;
+    m_attrPerformingPhysiciansName = other->m_attrPerformingPhysiciansName;
+    m_attrDescription = other->m_attrDescription;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/SeriesDB.cpp b/SrcLib/core/fwMedData/src/fwMedData/SeriesDB.cpp
new file mode 100644
index 0000000..a9793f4
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/SeriesDB.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/Series.hpp"
+#include "fwMedData/SeriesDB.hpp"
+
+fwDataRegisterMacro( ::fwMedData::SeriesDB );
+
+namespace fwMedData
+{
+
+SeriesDB::SeriesDB(::fwData::Object::Key key)
+{}
+
+//------------------------------------------------------------------------------
+
+SeriesDB::~SeriesDB()
+{}
+
+//------------------------------------------------------------------------------
+
+void SeriesDB::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    SeriesDB::csptr other = SeriesDB::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( other );
+
+    m_attrContainer= other->m_attrContainer;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDB::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    SeriesDB::csptr other = SeriesDB::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldDeepCopy( other, cache );
+    m_attrContainer.clear();
+    m_attrContainer.reserve(other->m_attrContainer.size());
+    BOOST_FOREACH(const ValueType &series, other->m_attrContainer)
+    {
+        m_attrContainer.push_back(::fwData::Object::copy(series, cache));
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/src/fwMedData/Study.cpp b/SrcLib/core/fwMedData/src/fwMedData/Study.cpp
new file mode 100644
index 0000000..6a93abd
--- /dev/null
+++ b/SrcLib/core/fwMedData/src/fwMedData/Study.cpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/Exception.hpp>
+
+#include "fwMedData/Study.hpp"
+
+fwDataRegisterMacro( ::fwMedData::Study );
+
+namespace fwMedData
+{
+
+Study::Study(::fwData::Object::Key key)
+{
+}
+
+//------------------------------------------------------------------------------
+
+Study::~Study()
+{}
+
+//------------------------------------------------------------------------------
+
+void Study::shallowCopy(const ::fwData::Object::csptr &_source)
+{
+    Study::csptr other = Study::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldShallowCopy( other );
+    m_attrInstanceUID = other->m_attrInstanceUID;
+    m_attrDate = other->m_attrDate;
+    m_attrTime = other->m_attrTime;
+    m_attrReferringPhysicianName = other->m_attrReferringPhysicianName;
+    m_attrDescription = other->m_attrDescription;
+    m_attrPatientAge = other->m_attrPatientAge;
+}
+
+//------------------------------------------------------------------------------
+
+void Study::cachedDeepCopy(const ::fwData::Object::csptr &_source, DeepCopyCacheType &cache)
+{
+    Study::csptr other = Study::dynamicConstCast(_source);
+    FW_RAISE_EXCEPTION_IF( ::fwData::Exception(
+            "Unable to copy" + (_source?_source->getClassname():std::string("<NULL>"))
+            + " to " + this->getClassname()), !bool(other) );
+
+    this->fieldDeepCopy( other, cache );
+    m_attrInstanceUID = other->m_attrInstanceUID;
+    m_attrDate = other->m_attrDate;
+    m_attrTime = other->m_attrTime;
+    m_attrReferringPhysicianName = other->m_attrReferringPhysicianName;
+    m_attrDescription = other->m_attrDescription;
+    m_attrPatientAge = other->m_attrPatientAge;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwMedData
+
diff --git a/SrcLib/core/fwMedData/test/CMakeLists.txt b/SrcLib/core/fwMedData/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwMedData/test/Properties.cmake b/SrcLib/core/fwMedData/test/Properties.cmake
new file mode 100644
index 0000000..43cf4ea
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMedDataTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwData fwMedData )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMedData/test/cppunit.options b/SrcLib/core/fwMedData/test/cppunit.options
new file mode 100644
index 0000000..8d1b554
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/cppunit.options
@@ -0,0 +1,20 @@
+
+CLASSTEST=[
+    'PatientTest',
+    'StudyTest',
+    'EquipmentTest',
+    'ImageSeriesTest',
+    'ModelSeriesTest',
+    'SeriesTest',
+    'SeriesDBTest',
+    'ActivitySeriesTest',
+]
+
+USE = ['boost', 'cppunit']
+LIB = [
+      'fwData_0-1',
+      'fwMedData_0-1',
+      'fwTools_0-1',
+      'fwTest_0-1',
+      ]
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwMedData/test/tu/include/ActivitySeriesTest.hpp b/SrcLib/core/fwMedData/test/tu/include/ActivitySeriesTest.hpp
new file mode 100644
index 0000000..8772f4e
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/ActivitySeriesTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_ACTIVITYSERIESTEST_HPP__
+#define __FWMEDDATA_UT_ACTIVITYSERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+    class ActivitySeries;
+
+namespace ut
+{
+
+class ActivitySeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActivitySeriesTest );
+
+    CPPUNIT_TEST(activityConfigIdTest);
+    CPPUNIT_TEST(dataTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void activityConfigIdTest();
+    void dataTest();
+
+protected:
+
+    SPTR(::fwMedData::ActivitySeries) m_series;
+
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_ACTIVITYSERIESTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/EquipmentTest.hpp b/SrcLib/core/fwMedData/test/tu/include/EquipmentTest.hpp
new file mode 100755
index 0000000..e2aec65
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/EquipmentTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_EQUIPMENTTEST_HPP__
+#define __FWMEDDATA_UT_EQUIPMENTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+namespace ut
+{
+
+class EquipmentTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( EquipmentTest );
+    CPPUNIT_TEST(institutionNameTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void institutionNameTest();
+
+private:
+    Equipment::sptr m_equipment;
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_EQUIPMENTTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/ImageSeriesTest.hpp b/SrcLib/core/fwMedData/test/tu/include/ImageSeriesTest.hpp
new file mode 100755
index 0000000..33865f0
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/ImageSeriesTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_IMAGESERIESTEST_HPP__
+#define __FWMEDDATA_UT_IMAGESERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+namespace ut
+{
+
+class ImageSeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageSeriesTest );
+    CPPUNIT_TEST(imageTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void imageTest();
+
+private:
+    ImageSeries::sptr m_series;
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_IMAGESERIESTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/ModelSeriesTest.hpp b/SrcLib/core/fwMedData/test/tu/include/ModelSeriesTest.hpp
new file mode 100755
index 0000000..d178ec0
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/ModelSeriesTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_MODELSERIESTEST_HPP__
+#define __FWMEDDATA_UT_MODELSERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+namespace ut
+{
+
+class ModelSeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ModelSeriesTest );
+    CPPUNIT_TEST(modelTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void modelTest();
+
+private:
+    ModelSeries::sptr m_series;
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_MODELSERIESTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/PatientTest.hpp b/SrcLib/core/fwMedData/test/tu/include/PatientTest.hpp
new file mode 100755
index 0000000..11c22f3
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/PatientTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_PATIENTTEST_HPP__
+#define __FWMEDDATA_UT_PATIENTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+namespace ut
+{
+
+class PatientTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( PatientTest );
+    CPPUNIT_TEST( nameTest );
+    CPPUNIT_TEST( idTest );
+    CPPUNIT_TEST( birthdateTest );
+    CPPUNIT_TEST( sexTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void nameTest();
+    void idTest();
+    void birthdateTest();
+    void sexTest();
+
+private:
+    Patient::sptr m_patient;
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_PATIENTTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/SeriesDBTest.hpp b/SrcLib/core/fwMedData/test/tu/include/SeriesDBTest.hpp
new file mode 100755
index 0000000..1e7dacb
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/SeriesDBTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_SERIESDBTEST_HPP__
+#define __FWMEDDATA_UT_SERIESDBTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+    class SeriesDB;
+
+namespace ut
+{
+
+class SeriesDBTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBTest );
+
+    CPPUNIT_TEST(containerTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void containerTest();
+
+protected:
+
+    SPTR(::fwMedData::SeriesDB) m_series;
+
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_SERIESDBTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/SeriesTest.hpp b/SrcLib/core/fwMedData/test/tu/include/SeriesTest.hpp
new file mode 100755
index 0000000..0c4f155
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/SeriesTest.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_SERIESTEST_HPP__
+#define __FWMEDDATA_UT_SERIESTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+    class Series;
+
+namespace ut
+{
+
+class SeriesTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesTest );
+
+    CPPUNIT_TEST(attrPatientTest);
+    CPPUNIT_TEST(attrStudyTest);
+    CPPUNIT_TEST(attrEquipmentTest);
+    CPPUNIT_TEST(attrInstanceUIDTest);
+    CPPUNIT_TEST(attrModalityTest);
+    CPPUNIT_TEST(attrDateTest);
+    CPPUNIT_TEST(attrTimeTest);
+    CPPUNIT_TEST(attrPerformingPhysiciansNameTest);
+    CPPUNIT_TEST(attrDescriptionTest);
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void attrPatientTest();
+    void attrStudyTest();
+    void attrEquipmentTest();
+    void attrInstanceUIDTest();
+    void attrModalityTest();
+    void attrDateTest();
+    void attrTimeTest();
+    void attrPerformingPhysiciansNameTest();
+    void attrDescriptionTest();
+
+protected:
+    typedef std::vector < SPTR(::fwMedData::Series) > SeriesVectorType;
+
+    SeriesVectorType m_series;
+
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_SERIESTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/include/StudyTest.hpp b/SrcLib/core/fwMedData/test/tu/include/StudyTest.hpp
new file mode 100755
index 0000000..d9835ec
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/include/StudyTest.hpp
@@ -0,0 +1,48 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATA_UT_STUDYTEST_HPP__
+#define __FWMEDDATA_UT_STUDYTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedData
+{
+namespace ut
+{
+
+class StudyTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StudyTest );
+    CPPUNIT_TEST(instanceUIDTest);
+    CPPUNIT_TEST(dateTest);
+    CPPUNIT_TEST(timeTest);
+    CPPUNIT_TEST(referringPhysicianNameTest);
+    CPPUNIT_TEST(descriptionTest);
+    CPPUNIT_TEST(patientAgeTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void instanceUIDTest();
+    void dateTest();
+    void timeTest();
+    void referringPhysicianNameTest();
+    void descriptionTest();
+    void patientAgeTest();
+
+private:
+    Study::sptr m_study;
+};
+
+} //namespace ut
+} //namespace fwMedData
+
+#endif //__FWMEDDATA_UT_STUDYTEST_HPP__
+
diff --git a/SrcLib/core/fwMedData/test/tu/src/ActivitySeriesTest.cpp b/SrcLib/core/fwMedData/test/tu/src/ActivitySeriesTest.cpp
new file mode 100644
index 0000000..501a474
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/ActivitySeriesTest.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+
+#include "ActivitySeriesTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::ActivitySeriesTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesTest::setUp()
+{
+    // Set up context before running a test.
+    m_series = ::fwMedData::ActivitySeries::New();
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesTest::tearDown()
+{
+    // Clean up after the test run.
+    m_series.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesTest::activityConfigIdTest()
+{
+    const ::fwMedData::ActivitySeries::ConfigIdType activityConfigId = "Visu2D";
+    CPPUNIT_ASSERT(m_series);
+    m_series->setActivityConfigId(activityConfigId);
+    CPPUNIT_ASSERT_EQUAL(activityConfigId, m_series->getActivityConfigId());
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeriesTest::dataTest()
+{
+    ::fwData::Composite::sptr data = ::fwData::Composite::New();
+    CPPUNIT_ASSERT(m_series);
+    CPPUNIT_ASSERT(data);
+    m_series->setData(data);
+    CPPUNIT_ASSERT_EQUAL(data, m_series->getData());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/EquipmentTest.cpp b/SrcLib/core/fwMedData/test/tu/src/EquipmentTest.cpp
new file mode 100755
index 0000000..0ae3115
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/EquipmentTest.cpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMedData/Equipment.hpp"
+
+#include "EquipmentTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::EquipmentTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void EquipmentTest::setUp()
+{
+    // Set up context before running a test.
+    m_equipment = ::fwMedData::Equipment::New();
+}
+
+//------------------------------------------------------------------------------
+
+void EquipmentTest::tearDown()
+{
+    // Clean up after the test run.
+    m_equipment.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void EquipmentTest::institutionNameTest()
+{
+    const std::string institutionName = "Ircad / IHU";
+    CPPUNIT_ASSERT(m_equipment);
+    m_equipment->setInstitutionName(institutionName);
+    CPPUNIT_ASSERT_EQUAL(institutionName, m_equipment->getInstitutionName());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/ImageSeriesTest.cpp b/SrcLib/core/fwMedData/test/tu/src/ImageSeriesTest.cpp
new file mode 100755
index 0000000..88e586c
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/ImageSeriesTest.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTools/Type.hpp>
+
+#include "fwMedData/ImageSeries.hpp"
+
+#include "ImageSeriesTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::ImageSeriesTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesTest::setUp()
+{
+    // Set up context before running a test.
+    m_series = ::fwMedData::ImageSeries::New();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesTest::tearDown()
+{
+    // Clean up after the test run.
+    m_series.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesTest::imageTest()
+{
+    CPPUNIT_ASSERT(m_series);
+
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(img, ::fwTools::Type("float"));
+    CPPUNIT_ASSERT(img);
+
+    m_series->setImage(img);
+    CPPUNIT_ASSERT_EQUAL(img, m_series->getImage());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/ModelSeriesTest.cpp b/SrcLib/core/fwMedData/test/tu/src/ModelSeriesTest.cpp
new file mode 100755
index 0000000..707ac9a
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/ModelSeriesTest.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwTools/Type.hpp>
+
+#include <fwTest/generator/Mesh.hpp>
+
+#include "fwMedData/ModelSeries.hpp"
+
+#include "ModelSeriesTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::ModelSeriesTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesTest::setUp()
+{
+    // Set up context before running a test.
+    m_series = ::fwMedData::ModelSeries::New();
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesTest::tearDown()
+{
+    // Clean up after the test run.
+    m_series.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesTest::modelTest()
+{
+    CPPUNIT_ASSERT(m_series);
+
+    ::fwData::Reconstruction::sptr rec1 = ::fwData::Reconstruction::New();
+    CPPUNIT_ASSERT(rec1);
+    ::fwData::Reconstruction::sptr rec2 = ::fwData::Reconstruction::New();
+    CPPUNIT_ASSERT(rec2);
+
+    ::fwData::Mesh::sptr mesh1 = ::fwData::Mesh::New();
+    CPPUNIT_ASSERT(mesh1);
+    ::fwTest::generator::Mesh::generateQuadMesh(mesh1);
+
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    CPPUNIT_ASSERT(mesh2);
+    ::fwTest::generator::Mesh::generateQuadMesh(mesh2);
+
+    rec1->setMesh(mesh1);
+    rec2->setMesh(mesh2);
+
+    ModelSeries::ReconstructionVectorType recs;
+    recs.push_back(rec1);
+    recs.push_back(rec2);
+
+    m_series->setReconstructionDB(recs);
+    CPPUNIT_ASSERT_EQUAL(2, (int)m_series->getReconstructionDB().size());
+    CPPUNIT_ASSERT_EQUAL(rec1, m_series->getReconstructionDB()[0]);
+    CPPUNIT_ASSERT_EQUAL(rec2, m_series->getReconstructionDB()[1]);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/PatientTest.cpp b/SrcLib/core/fwMedData/test/tu/src/PatientTest.cpp
new file mode 100755
index 0000000..13cc8cc
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/PatientTest.cpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMedData/Patient.hpp"
+
+#include "PatientTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::PatientTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void PatientTest::setUp()
+{
+    // Set up context before running a test.
+    m_patient = ::fwMedData::Patient::New();
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::tearDown()
+{
+    // Clean up after the test run.
+    m_patient.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::nameTest()
+{
+    const std::string name = "John DOE";
+    CPPUNIT_ASSERT(m_patient);
+    m_patient->setName(name);
+    CPPUNIT_ASSERT_EQUAL(name, m_patient->getName());
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::idTest()
+{
+    const std::string patientId = "42";
+    CPPUNIT_ASSERT(m_patient);
+    m_patient->setPatientId(patientId);
+    CPPUNIT_ASSERT_EQUAL(patientId, m_patient->getPatientId());
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::birthdateTest()
+{
+    const std::string birthdate = "02-14-2013 11:28";
+    CPPUNIT_ASSERT(m_patient);
+    m_patient->setBirthdate(birthdate);
+    CPPUNIT_ASSERT_EQUAL(birthdate, m_patient->getBirthdate());
+}
+
+//------------------------------------------------------------------------------
+
+void PatientTest::sexTest()
+{
+    const std::string sex = "M";
+    CPPUNIT_ASSERT(m_patient);
+    m_patient->setSex(sex);
+    CPPUNIT_ASSERT_EQUAL(sex, m_patient->getSex());
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/SeriesDBTest.cpp b/SrcLib/core/fwMedData/test/tu/src/SeriesDBTest.cpp
new file mode 100755
index 0000000..6bb1ef5
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/SeriesDBTest.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMedData/SeriesDB.hpp"
+#include "fwMedData/ModelSeries.hpp"
+
+#include "SeriesDBTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::SeriesDBTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::setUp()
+{
+    // Set up context before running a test.
+    m_series = ::fwMedData::SeriesDB::New();
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::tearDown()
+{
+    // Clean up after the test run.
+    m_series->getContainer().clear();
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::containerTest()
+{
+    fwMedData::Series::sptr series1 = fwMedData::ModelSeries::New();
+    fwMedData::Series::sptr series2 = fwMedData::ModelSeries::New();
+    fwMedData::Series::sptr series3 = fwMedData::ModelSeries::New();
+
+    CPPUNIT_ASSERT( m_series->empty() );
+
+    m_series->getContainer().push_back(series1);
+    m_series->getContainer().push_back(series2);
+    m_series->getContainer().push_back(series3);
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<size_t> (3), m_series->size() );
+    CPPUNIT_ASSERT_EQUAL( series1, (*m_series)[0] );
+    CPPUNIT_ASSERT_EQUAL( series2, (*m_series)[1] );
+    CPPUNIT_ASSERT_EQUAL( series3, (*m_series)[2] );
+
+    m_series->getContainer().clear();
+    CPPUNIT_ASSERT_EQUAL( static_cast<size_t> (0), m_series->size() );
+    CPPUNIT_ASSERT( m_series->empty() );
+
+
+
+
+    ::fwMedData::SeriesDB::ContainerType series;
+
+    series.push_back(series1);
+    series.push_back(series2);
+    series.push_back(series3);
+
+    m_series->setContainer(series);
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<size_t> (3), m_series->size() );
+    CPPUNIT_ASSERT_EQUAL( series1, (*m_series)[0] );
+    CPPUNIT_ASSERT_EQUAL( series2, (*m_series)[1] );
+    CPPUNIT_ASSERT_EQUAL( series3, (*m_series)[2] );
+
+    m_series->getContainer().clear();
+    CPPUNIT_ASSERT_EQUAL( static_cast<size_t> (0), m_series->size() );
+    CPPUNIT_ASSERT( m_series->empty() );
+
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<size_t> (3), series.size() );
+    CPPUNIT_ASSERT_EQUAL( series1, series[0] );
+    CPPUNIT_ASSERT_EQUAL( series2, series[1] );
+    CPPUNIT_ASSERT_EQUAL( series3, series[2] );
+
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/SeriesTest.cpp b/SrcLib/core/fwMedData/test/tu/src/SeriesTest.cpp
new file mode 100755
index 0000000..f055891
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/SeriesTest.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMedData/ImageSeries.hpp"
+#include "fwMedData/ModelSeries.hpp"
+
+#include "SeriesTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::SeriesTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::setUp()
+{
+    // Set up context before running a test.
+    m_series.push_back( ::fwMedData::ImageSeries::New() );
+    m_series.push_back( ::fwMedData::ModelSeries::New() );
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::tearDown()
+{
+    // Clean up after the test run.
+    m_series.clear();
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrPatientTest()
+{
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        CPPUNIT_ASSERT(series->getPatient());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrStudyTest()
+{
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        CPPUNIT_ASSERT(series->getStudy());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrEquipmentTest()
+{
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        CPPUNIT_ASSERT(series->getEquipment());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrInstanceUIDTest()
+{
+    const std::string instanceUID = "1337.1664.42";
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setInstanceUID( instanceUID ); 
+
+        CPPUNIT_ASSERT_EQUAL( instanceUID , series->getInstanceUID() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrModalityTest()
+{
+    const std::string modality = "MR";
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setModality( modality ); 
+
+        CPPUNIT_ASSERT_EQUAL( modality , series->getModality() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrDateTest()
+{
+    const std::string date = "02-14-2013";
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setDate( date ); 
+
+        CPPUNIT_ASSERT_EQUAL( date , series->getDate() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrTimeTest()
+{
+    const std::string time = "14:02";
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setTime( time ); 
+
+        CPPUNIT_ASSERT_EQUAL( time , series->getTime() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrPerformingPhysiciansNameTest()
+{
+    fwMedData::DicomValuesType performingPhysiciansName;
+
+    performingPhysiciansName.push_back("Dr Jekyl");
+    performingPhysiciansName.push_back("Dr House");
+    performingPhysiciansName.push_back("Dr Einstein");
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setPerformingPhysiciansName( performingPhysiciansName ); 
+
+        CPPUNIT_ASSERT( performingPhysiciansName == series->getPerformingPhysiciansName() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesTest::attrDescriptionTest()
+{
+    const std::string description = "Series";
+
+    for (SeriesVectorType::iterator iter = m_series.begin(); iter != m_series.end(); ++iter)
+    {
+        ::fwMedData::Series::sptr series = *iter;
+        series->setDescription( description ); 
+
+        CPPUNIT_ASSERT_EQUAL( description , series->getDescription() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedData/test/tu/src/StudyTest.cpp b/SrcLib/core/fwMedData/test/tu/src/StudyTest.cpp
new file mode 100755
index 0000000..5df03e5
--- /dev/null
+++ b/SrcLib/core/fwMedData/test/tu/src/StudyTest.cpp
@@ -0,0 +1,102 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMedData/Study.hpp"
+
+#include "StudyTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedData::ut::StudyTest );
+
+namespace fwMedData
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void StudyTest::setUp()
+{
+    // Set up context before running a test.
+    m_study = ::fwMedData::Study::New();
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::tearDown()
+{
+    // Clean up after the test run.
+    m_study.reset();
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::instanceUIDTest()
+{
+    const std::string instanceUID = "1346357.1664.643101.421337.4123403";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setInstanceUID(instanceUID);
+    CPPUNIT_ASSERT_EQUAL(instanceUID, m_study->getInstanceUID());
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::dateTest()
+{
+    const std::string date = "02-14-2013";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setDate(date);
+    CPPUNIT_ASSERT_EQUAL(date, m_study->getDate());
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::timeTest()
+{
+    const std::string time = "11:59";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setTime(time);
+    CPPUNIT_ASSERT_EQUAL(time, m_study->getTime());
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::referringPhysicianNameTest()
+{
+    const std::string rpn = "Dr Jekyl";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setReferringPhysicianName(rpn);
+    CPPUNIT_ASSERT_EQUAL(rpn, m_study->getReferringPhysicianName());
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::descriptionTest()
+{
+    const std::string desc = "Say 33.";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setDescription(desc);
+    CPPUNIT_ASSERT_EQUAL(desc, m_study->getDescription());
+}
+
+//------------------------------------------------------------------------------
+
+void StudyTest::patientAgeTest()
+{
+    const std::string age = "42";
+    CPPUNIT_ASSERT(m_study);
+    m_study->setPatientAge(age);
+    CPPUNIT_ASSERT_EQUAL(age, m_study->getPatientAge());
+}
+
+//------------------------------------------------------------------------------
+
+
+
+
+} //namespace ut
+} //namespace fwMedData
diff --git a/SrcLib/core/fwMedDataTools/CMakeLists.txt b/SrcLib/core/fwMedDataTools/CMakeLists.txt
new file mode 100644
index 0000000..6741f12
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS date_time REQUIRED)
+fwInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+
+find_package(GDCM REQUIRED)
+include(${GDCM_USE_FILE})
+fwInclude(${GDCM_INCLUDE_DIRS})
+fwLink(${GDCM_LIBRARIES} gdcmMSFF)
+
diff --git a/SrcLib/core/fwMedDataTools/Properties.cmake b/SrcLib/core/fwMedDataTools/Properties.cmake
new file mode 100644
index 0000000..b353c90
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMedDataTools )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMedDataTools/bin/build.options b/SrcLib/core/fwMedDataTools/bin/build.options
new file mode 100644
index 0000000..a03ce2c
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/bin/build.options
@@ -0,0 +1,6 @@
+TYPE    = 'shared'
+VERSION = '0-1'
+LIB = [
+      ]
+USE = ['boostDateTime', 'gdcmMSFF']
+
diff --git a/SrcLib/core/fwMedDataTools/include/fwMedDataTools/config.hpp b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/config.hpp
new file mode 100644
index 0000000..ffb4b24
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/config.hpp
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEDDATATOOLS_CONFIG_HPP__
+#define __FWMEDDATATOOLS_CONFIG_HPP__
+
+    #ifdef _WIN32
+
+        #ifdef FWMEDDATATOOLS_EXPORTS
+            #define FWMEDDATATOOLS_API __declspec(dllexport)
+        #else
+            #define FWMEDDATATOOLS_API __declspec(dllimport)
+        #endif
+
+        #define FWMEDDATATOOLS_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWMEDDATATOOLS_EXPORTS
+            #define FWMEDDATATOOLS_API __attribute__ ((visibility("default")))
+            #define FWMEDDATATOOLS_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWMEDDATATOOLS_API __attribute__ ((visibility("hidden")))
+            #define FWMEDDATATOOLS_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWMEDDATATOOLS_API
+        #define FWMEDDATATOOLS_CLASS_API
+
+    #endif
+
+#endif // __FWMEDDATATOOLS_CONFIG_HPP__
+
diff --git a/SrcLib/core/fwMedDataTools/include/fwMedDataTools/functions.hpp b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/functions.hpp
new file mode 100644
index 0000000..5d5810e
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/functions.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include "fwMedDataTools/config.hpp"
+
+namespace fwMedDataTools
+{
+
+    /**
+     * @brief Generates a random Dicom Patient ID using GDCM.
+     * It must be at most 64 char long and non null.
+     */
+    FWMEDDATATOOLS_API std::string generatePatientId();
+
+    /**
+     * @brief Generates a random Dicom Study Instance UID using current time.
+     * It must be 16 char long and may be null.
+     *
+     * FIXME : According to Dicom, the Study Instance UID must identify a study from time and location.
+     */
+    FWMEDDATATOOLS_API std::string generateStudyInstanceUid();
+
+} // namespace fwMedDataTools
+
diff --git a/SrcLib/core/fwMedDataTools/include/fwMedDataTools/namespace.hpp b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/namespace.hpp
new file mode 100644
index 0000000..e913509
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/include/fwMedDataTools/namespace.hpp
@@ -0,0 +1,14 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @brief Contains utilities dedicated to fwMedData.
+ */
+namespace fwMedDataTools
+{
+} // namespace fwMedDataTools
+
+
diff --git a/SrcLib/core/fwMedDataTools/src/fwMedDataTools/functions.cpp b/SrcLib/core/fwMedDataTools/src/fwMedDataTools/functions.cpp
new file mode 100644
index 0000000..ea6259f
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/src/fwMedDataTools/functions.cpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+#include <sstream>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <gdcmUIDGenerator.h>
+
+#include "fwMedDataTools/functions.hpp"
+
+namespace fwMedDataTools
+{
+
+std::string generatePatientId()
+{
+    ::gdcm::UIDGenerator uid;
+    const char* id = uid.Generate();
+    return std::string(id);
+}
+
+std::string generateStudyInstanceUid()
+{
+    using namespace ::boost::posix_time;
+
+    ptime now = microsec_clock::local_time();
+    time_facet* facet = new time_facet("%f%S%M%H%d%m");
+
+    std::stringstream ss;
+    ss.imbue(std::locale(ss.getloc(), facet));
+    ss << now;
+
+    return ss.str();
+}
+
+} // namespace fwMedDataTools
+
diff --git a/SrcLib/core/fwMedDataTools/test/cppunit.options b/SrcLib/core/fwMedDataTools/test/cppunit.options
new file mode 100644
index 0000000..e41f851
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/test/cppunit.options
@@ -0,0 +1,9 @@
+CLASSTEST = [
+        'FunctionsTest',
+]
+
+USE = ['cppunit']
+LIB = ['fwMedDataTools_0-1']
+
+CONSOLE = 'yes'
+
diff --git a/SrcLib/core/fwMedDataTools/test/tu/include/FunctionsTest.hpp b/SrcLib/core/fwMedDataTools/test/tu/include/FunctionsTest.hpp
new file mode 100644
index 0000000..9768ac8
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/test/tu/include/FunctionsTest.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * */
+
+#ifndef __FWMEDDATATOOLS_FUNCTIONSTEST_HPP__
+#define __FWMEDDATATOOLS_FUNCTIONSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMedDataTools
+{
+namespace ut
+{
+
+class FunctionsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( FunctionsTest );
+    CPPUNIT_TEST(generatePatientIdTest);
+    CPPUNIT_TEST(generateStudyInstanceUidTest);
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    /**
+     * @name Override
+     * @{ */
+    void setUp();
+    void tearDown();
+    /**  @} */
+
+    /**
+     * @name Tests UID generation methods by checking length and content.
+     * @{ */
+    void generatePatientIdTest();
+    void generateStudyInstanceUidTest();
+    /**  @} */
+};
+
+} // namespace ut
+
+} // namespace fwMedDataTools
+
+#endif // __FWMEDDATATOOLS_FUNCTIONSTEST_HPP__
+
diff --git a/SrcLib/core/fwMedDataTools/test/tu/src/FunctionsTest.cpp b/SrcLib/core/fwMedDataTools/test/tu/src/FunctionsTest.cpp
new file mode 100644
index 0000000..02a331a
--- /dev/null
+++ b/SrcLib/core/fwMedDataTools/test/tu/src/FunctionsTest.cpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include "fwMedDataTools/functions.hpp"
+
+#include "FunctionsTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMedDataTools::ut::FunctionsTest );
+
+namespace fwMedDataTools
+{
+
+namespace ut
+{
+
+void FunctionsTest::setUp()
+{
+}
+
+void FunctionsTest::tearDown()
+{
+}
+
+void FunctionsTest::generatePatientIdTest()
+{
+    const std::string id = ::fwMedDataTools::generatePatientId();
+    CPPUNIT_ASSERT(64 >= id.length());
+    CPPUNIT_ASSERT(0 < id.length());
+}
+
+void FunctionsTest::generateStudyInstanceUidTest()
+{
+    const std::string id = ::fwMedDataTools::generateStudyInstanceUid();
+    CPPUNIT_ASSERT(16 == id.length());
+}
+
+} // namespace ut
+
+} // namespace fwMedDataTools
+
diff --git a/SrcLib/core/fwMemory/CMakeLists.txt b/SrcLib/core/fwMemory/CMakeLists.txt
new file mode 100644
index 0000000..dcc62e3
--- /dev/null
+++ b/SrcLib/core/fwMemory/CMakeLists.txt
@@ -0,0 +1,16 @@
+
+fwLoadProperties()
+fwUseForwardInclude(fwCore fwCamp fwTools fwCom)
+
+find_package (Boost COMPONENTS system regex filesystem signals iostreams REQUIRED)
+find_package (CAMP)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
+fwLink(${Boost_LIBRARIES} ${CAMP_LIBRARIES})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+    #TODO write FindPsAPI ...
+    target_link_libraries(${FWPROJECT_NAME} psapi)
+endif()
+
diff --git a/SrcLib/core/fwMemory/COPYING b/SrcLib/core/fwMemory/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwMemory/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwMemory/COPYING.LESSER b/SrcLib/core/fwMemory/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwMemory/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwMemory/Properties.cmake b/SrcLib/core/fwMemory/Properties.cmake
new file mode 100644
index 0000000..1358bce
--- /dev/null
+++ b/SrcLib/core/fwMemory/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMemory )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwCamp fwTools fwCom fwThread )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMemory/bin/build.options b/SrcLib/core/fwMemory/bin/build.options
new file mode 100644
index 0000000..b1e4bae
--- /dev/null
+++ b/SrcLib/core/fwMemory/bin/build.options
@@ -0,0 +1,22 @@
+TYPE    = 'shared'
+USE     = [
+          'boost',
+          'boostFilesystem',
+          'boostRegex',
+          'boostSignals',
+          'boostIostreams',
+          ]
+
+LIB     = [
+          'fwCore_0-1',
+          'fwCamp_0-1',
+          'fwTools_0-1',
+          'fwCom_0-1',
+          'fwThread_0-1',
+          ]
+VERSION = '0-1'
+
+import os;
+
+if os.name == 'nt':
+    STDLIB  += ['psapi']
diff --git a/SrcLib/core/fwMemory/include/fwMemory/BufferAllocationPolicy.hpp b/SrcLib/core/fwMemory/include/fwMemory/BufferAllocationPolicy.hpp
new file mode 100644
index 0000000..dba0354
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/BufferAllocationPolicy.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_BUFFERALLOCATIONPOLICY_HPP_
+#define _FWMEMORY_BUFFERALLOCATIONPOLICY_HPP_
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/exception/Memory.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+class FWMEMORY_CLASS_API BufferAllocationPolicy
+{
+public:
+    typedef SPTR(BufferAllocationPolicy) sptr;
+    typedef size_t SizeType;
+    typedef void* BufferType;
+
+    FWMEMORY_API virtual void allocate(BufferType &buffer, SizeType size) throw( ::fwMemory::exception::Memory ) = 0;
+    FWMEMORY_API virtual void reallocate(BufferType &buffer, SizeType size) throw( ::fwMemory::exception::Memory ) = 0;
+    FWMEMORY_API virtual void destroy(BufferType &buffer) = 0;
+
+    FWMEMORY_API virtual ~BufferAllocationPolicy(){};
+};
+
+
+class FWMEMORY_CLASS_API BufferMallocPolicy : public BufferAllocationPolicy
+{
+public:
+    FWMEMORY_API void allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void destroy(BufferType &buffer);
+
+    FWMEMORY_API static BufferAllocationPolicy::sptr New();
+};
+
+
+class FWMEMORY_CLASS_API BufferNewPolicy : public BufferAllocationPolicy
+{
+public:
+    FWMEMORY_API void allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void destroy(BufferType &buffer);
+
+    FWMEMORY_API static BufferAllocationPolicy::sptr New();
+};
+
+class FWMEMORY_CLASS_API BufferNoAllocPolicy : public BufferAllocationPolicy
+{
+public:
+    FWMEMORY_API void allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory );
+    FWMEMORY_API void destroy(BufferType &buffer);
+
+    FWMEMORY_API static BufferAllocationPolicy::sptr New();
+};
+
+
+}
+
+#endif /* _FWMEMORY_BUFFERALLOCATIONPOLICY_HPP_ */
diff --git a/SrcLib/core/fwMemory/include/fwMemory/BufferInfo.hpp b/SrcLib/core/fwMemory/include/fwMemory/BufferInfo.hpp
new file mode 100644
index 0000000..b0f8d3e
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/BufferInfo.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_BUFFERINFO_HPP__
+#define __FWMEMORY_BUFFERINFO_HPP__
+
+#include <boost/filesystem/path.hpp>
+#include <boost/function.hpp>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/LogicStamp.hpp>
+
+#include "fwMemory/BufferAllocationPolicy.hpp"
+#include "fwMemory/FileFormat.hpp"
+#include "fwMemory/FileHolder.hpp"
+#include "fwMemory/stream/in/IFactory.hpp"
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+
+struct FWMEMORY_CLASS_API BufferInfo
+{
+
+    typedef size_t SizeType;
+    typedef WPTR( void ) CounterType;
+
+    FWMEMORY_API BufferInfo();
+
+    FWMEMORY_API void clear();
+    long lockCount() const {return lockCounter.use_count();};
+
+
+
+    SizeType size;
+    /// true if 'buffer' is loaded
+    bool     loaded;
+    bool     userStreamFactory;
+
+    FileHolder fsFile;
+    FileFormatType fileFormat;
+
+    CounterType lockCounter;
+
+    ::fwCore::LogicStamp lastAccess;
+    ::fwMemory::BufferAllocationPolicy::sptr bufferPolicy;
+
+    SPTR( ::fwMemory::stream::in::IFactory ) istreamFactory;
+
+
+};
+
+
+
+
+} // namespace fwMemory
+
+#endif // __FWMEMORY_BUFFERINFO_HPP__
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/BufferManager.hpp b/SrcLib/core/fwMemory/include/fwMemory/BufferManager.hpp
new file mode 100644
index 0000000..a1eafcf
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/BufferManager.hpp
@@ -0,0 +1,334 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_BUFFERMANAGER_HPP__
+#define __FWMEMORY_BUFFERMANAGER_HPP__
+
+#include <boost/filesystem/path.hpp>
+#include <boost/thread/future.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+#include <fwCore/BaseObject.hpp>
+
+#include <fwCom/Signal.hpp>
+
+#include "fwMemory/FileHolder.hpp"
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwThread
+{
+    class Worker;
+}
+
+namespace fwMemory
+{
+
+class IPolicy;
+
+namespace stream {
+namespace in {
+class IFactory ;
+}}
+
+class BufferManager;
+
+class Key
+{
+    friend SPTR(BufferManager) getDefault();
+
+    Key(){};
+};
+
+/**
+ * @brief BufferManager implementation
+ *
+ * This implementation purpose is to manage memory load, freeing memory and
+ * restoring freed buffers as needed.
+ *
+ * A dump policy is used to trigger memory freeing process. The restore process
+ * is always triggers when a lock is requested on a dumped buffer.
+ */
+class FWMEMORY_CLASS_API BufferManager : public ::fwCore::BaseObject
+{
+public:
+
+    typedef void* BufferType;
+    typedef const void* ConstBufferType;
+    typedef BufferType* BufferPtrType;
+    typedef void const * const * ConstBufferPtrType;
+
+    typedef BufferInfo::SizeType SizeType;
+
+    typedef ::fwCom::Signal< void () > UpdatedSignalType;
+
+    typedef std::map< ConstBufferPtrType, BufferInfo > BufferInfoMapType;
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (BufferManager)(::fwCore::BaseObject) );
+    fwCoreAllowSharedFromThis();
+
+    BufferManager();
+    virtual ~BufferManager();
+
+    typedef enum {
+        DIRECT,
+        LAZY
+    } LoadingModeType;
+
+    struct BufferStats
+    {
+        SizeType totalDumped;
+        SizeType totalManaged;
+    };
+
+    struct StreamInfo
+    {
+        SizeType size;
+        SPTR(std::istream) stream;
+        /// path of the file containing the dumped buffer
+        ::fwMemory::FileHolder fsFile;
+        /// format of the dumped file
+        ::fwMemory::FileFormatType format;
+        /// true if stream has been set by the user
+        bool userStream;
+    };
+
+    /**
+     * @brief Hook called when a new BufferObject is created
+     *
+     * @param bufferPtr BufferObject's buffer pointer.
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> registerBuffer(BufferPtrType bufferPtr);
+
+
+    /**
+     * @brief Hook called when a BufferObject is destroyed
+     *
+     * @param bufferPtr BufferObject's buffer pointer.
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> unregisterBuffer(BufferPtrType bufferPtr);
+
+    /**
+     * @brief Hook called when an allocation is requested from a BufferObject
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     * @param size requested size for allocation
+     * @param policy BufferObject's allocation policy
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> allocateBuffer(BufferPtrType bufferPtr, SizeType size,
+                                             const ::fwMemory::BufferAllocationPolicy::sptr &policy) ;
+
+    /**
+     * @brief Hook called when a request is made to set BufferObject's buffer from an external buffer
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     * @param buffer new buffer
+     * @param size requested size for allocation
+     * @param policy BufferObject's allocation policy
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> setBuffer(BufferPtrType bufferPtr,
+                                        ::fwMemory::BufferManager::BufferType buffer,
+                                        SizeType size, const ::fwMemory::BufferAllocationPolicy::sptr &policy) ;
+
+    /**
+     * @brief Hook called when a reallocation is requested from a BufferObject
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     * @param newSize requested size for reallocation
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> reallocateBuffer(BufferPtrType bufferPtr, SizeType newSize) ;
+
+
+    /**
+     * @brief Hook called when a destruction is requested from a BufferObject
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> destroyBuffer(BufferPtrType bufferPtr) ;
+
+
+    /**
+     * @brief Hook called when a request to swap two BufferObject contents is made
+     *
+     * @param bufA First BufferObject's buffer
+     * @param bufB Second BufferObject's buffer
+     */
+    FWMEMORY_API virtual ::boost::shared_future<void> swapBuffer(BufferPtrType bufA, BufferPtrType bufB) ;
+
+
+    /**
+     * @brief Hook called when a BufferObject is locked
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     *
+     * @return false if the BufferManager supported the action
+     */
+    FWMEMORY_API virtual ::boost::shared_future<SPTR(void)> lockBuffer(ConstBufferPtrType bufferPtr) ;
+
+
+    /**
+     * @brief Hook called when a BufferObject lock is released
+     *
+     * @param bufferPtr BufferObject's buffer pointer
+     *
+     * @return false if the BufferManager supported the action
+     */
+    FWMEMORY_API virtual ::boost::shared_future<bool> unlockBuffer(ConstBufferPtrType bufferPtr) ;
+
+
+    /**
+     * @brief returns BufferManager status string
+     */
+    FWMEMORY_API virtual ::boost::shared_future<std::string> toString() const;
+
+
+    /**
+     * @brief Dump/restore a buffer
+     *
+     * Keeps up to date buffer's information
+     *
+     * @param bufferPtr Buffer to dump/restore
+     *
+     * @return true on success
+     * @{ */
+    FWMEMORY_API ::boost::shared_future<bool> dumpBuffer(ConstBufferPtrType  bufferPtr);
+    FWMEMORY_API ::boost::shared_future<bool> restoreBuffer(ConstBufferPtrType  bufferPtr);
+    /**  @} */
+
+    /**
+     * @brief Write/read a buffer
+     *
+     * The buffer is written/read in a raw format
+     *
+     * @param buffer Buffer to write/read
+     * @param size Buffer's size
+     * @param path file to  write/read
+     *
+     * @return true on success
+     * @{ */
+    FWMEMORY_API ::boost::shared_future<bool> writeBuffer(ConstBufferType buffer, SizeType size, ::boost::filesystem::path &path);
+    FWMEMORY_API ::boost::shared_future<bool> readBuffer(BufferType buffer, SizeType size, ::boost::filesystem::path &path);
+    /**  @} */
+
+
+    /**
+     * @brief Returns a boost::signal emitted when an action has been hooked
+     *
+     * @return
+     */
+    SPTR(UpdatedSignalType) getUpdatedSignal(){return m_updatedSig;};
+
+
+    /**
+     * @brief Returns the Buffer info map
+     *
+     * @return
+     */
+    FWMEMORY_API ::boost::shared_future<BufferInfoMapType> getBufferInfos() const;
+
+    /**
+     * @brief Returns managed buffers statistics
+     */
+    FWMEMORY_API ::boost::shared_future<BufferStats> getBufferStats() const;
+    FWMEMORY_API static BufferStats computeBufferStats(const BufferInfoMapType& bufferInfo);
+
+    /**
+     * @brief Sets the dump policy
+     */
+    FWMEMORY_API void setDumpPolicy( const SPTR(::fwMemory::IPolicy) &policy );
+
+    /**
+     * @brief Returns the dump policy
+     */
+    FWMEMORY_API SPTR(::fwMemory::IPolicy) getDumpPolicy() const;
+
+    /**
+     * @brief Returns stream info
+     */
+    FWMEMORY_API ::boost::shared_future<StreamInfo> getStreamInfo(const ConstBufferPtrType bufferPtr) const;
+
+    FWMEMORY_API ::boost::shared_future<void> setIStreamFactory(BufferPtrType bufferPtr,
+                                                                const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                                                                SizeType size,
+                                                                ::fwMemory::FileHolder fsFile,
+                                                                ::fwMemory::FileFormatType format,
+                                                                const ::fwMemory::BufferAllocationPolicy::sptr &policy
+                                                               );
+
+    FWMEMORY_API LoadingModeType getLoadingMode() const;
+    FWMEMORY_API void setLoadingMode(LoadingModeType mode);
+
+
+    /**
+     * @brief Returns the current BufferManager instance
+     * @note This method is thread-safe.
+     */
+    FWMEMORY_API static BufferManager::sptr getDefault();
+
+    ::fwCore::mt::ReadWriteMutex& getMutex() const
+    {
+        return m_mutex;
+    }
+protected:
+
+    /**
+     * @brief BufferManager'a Implementation
+     * @{ */
+    virtual void registerBufferImpl(BufferPtrType bufferPtr);
+    virtual void unregisterBufferImpl(BufferPtrType bufferPtr);
+    virtual void allocateBufferImpl(BufferPtrType bufferPtr, SizeType size, const ::fwMemory::BufferAllocationPolicy::sptr &policy) ;
+    virtual void setBufferImpl(BufferPtrType bufferPtr, ::fwMemory::BufferManager::BufferType buffer, SizeType size, const ::fwMemory::BufferAllocationPolicy::sptr &policy) ;
+    virtual void reallocateBufferImpl(BufferPtrType bufferPtr, SizeType newSize) ;
+    virtual void destroyBufferImpl(BufferPtrType bufferPtr) ;
+    virtual void swapBufferImpl(BufferPtrType bufA, BufferPtrType bufB) ;
+    virtual SPTR(void) lockBufferImpl(ConstBufferPtrType bufferPtr) ;
+    virtual bool unlockBufferImpl(ConstBufferPtrType bufferPtr) ;
+    virtual std::string toStringImpl() const;
+    bool dumpBufferImpl(ConstBufferPtrType  buffer);
+    bool restoreBufferImpl(ConstBufferPtrType  buffer);
+    bool writeBufferImpl(ConstBufferType buffer, SizeType size, ::boost::filesystem::path &path);
+    bool readBufferImpl(BufferType buffer, SizeType size, ::boost::filesystem::path &path);
+    BufferInfoMapType getBufferInfosImpl() const;
+    StreamInfo getStreamInfoImpl(const ConstBufferPtrType bufferPtr) const;
+    void setIStreamFactoryImpl(BufferPtrType bufferPtr,
+                                const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                                SizeType size,
+                                ::fwMemory::FileHolder fsFile,
+                                ::fwMemory::FileFormatType format,
+                                const ::fwMemory::BufferAllocationPolicy::sptr &policy
+                               );
+    /**  @} */
+
+    /**
+     * @brief Dump/restore a buffer
+     *
+     * Used by public dump/restoreBuffer methods
+     * @{ */
+    FWMEMORY_API bool dumpBuffer(BufferInfo & info, BufferPtrType bufferPtr);
+    FWMEMORY_API bool restoreBuffer(BufferInfo & info, BufferPtrType bufferPtr, SizeType size = 0);
+    /**  @} */
+
+
+    SPTR(UpdatedSignalType) m_updatedSig;
+
+    ::fwCore::LogicStamp m_lastAccess;
+    BufferInfoMapType m_bufferInfos;
+
+    SPTR(::fwMemory::IPolicy) m_dumpPolicy;
+
+    LoadingModeType m_loadingMode;
+
+    SPTR(fwThread::Worker) m_worker;
+
+    /// Mutex to protect concurrent access in BufferManager
+    mutable ::fwCore::mt::ReadWriteMutex m_mutex;
+};
+
+
+}
+
+#endif /* __FWMEMORY_BUFFERMANAGER_HPP__ */
diff --git a/SrcLib/core/fwMemory/include/fwMemory/BufferObject.hpp b/SrcLib/core/fwMemory/include/fwMemory/BufferObject.hpp
new file mode 100644
index 0000000..69ea64b
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/BufferObject.hpp
@@ -0,0 +1,302 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_BUFFEROBJECT_HPP_
+#define _FWMEMORY_BUFFEROBJECT_HPP_
+
+#include <istream>
+
+#include <boost/type_traits/conditional.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/mt/types.hpp>
+#include <fwCore/base.hpp>
+#include <fwCamp/macros.hpp>
+
+#include "fwMemory/BufferAllocationPolicy.hpp"
+#include "fwMemory/BufferManager.hpp"
+#include "fwMemory/config.hpp"
+
+fwCampAutoDeclareMacro((fwMemory)(BufferObject), FWMEMORY_API);
+
+namespace fwMemory
+{
+
+namespace stream {
+namespace in {
+class IFactory ;
+}}
+
+/**
+ * @brief   Define Base class for FW4SPL buffers
+ * @class   BufferObject
+ * 
+ * @date    2007-2009.
+ *
+ * Keep a pointer to a buffer and it's allocation policy (new malloc) without
+ * any cleverness about allocating/destroying the buffer. Users of this class
+ * needs to take care about allocation and destruction by themselves.
+ *
+ * BufferObject class has a BufferManager and Locks mechanism, Allowing to
+ * trigger special treatments on various events on BufferObjects (allocation,
+ * reallocation, destruction, swapping, locking, unlocking) and allowing to
+ * give some guarantees.
+ *
+ * Users of buffer have to keep a lock on a BufferObject when dealing with the
+ * buffers content. Keeping a lock on a BufferObject guarantees that the buffer
+ * will not be changed or modified by the BufferManager mechanism. A lock *DO
+ * NOT GARANTEE* that an other user of this buffer object are not
+ * changing/modifying the buffer.
+ */
+class FWMEMORY_CLASS_API BufferObject : public ::fwCore::BaseObject
+{
+
+public:
+
+    typedef ::boost::shared_ptr< void > CounterType;
+    typedef ::boost::weak_ptr< void > WeakCounterType;
+
+    typedef size_t SizeType;
+
+    fwCoreClassDefinitionsWithFactoryMacro((BufferObject), (()), new BufferObject );
+    fwCoreAllowSharedFromThis();
+
+    /// return the sub class classname : an alias of this->getClassname
+    std::string className() const { return this->getClassname(); };
+
+    virtual ::fwMemory::BufferManager::BufferType getBuffer() { return m_buffer;};
+
+    /**
+     * @brief base class for BufferObject Lock
+     *
+     * This class purpose is to provide a way to count buffer uses, to prevent
+     * BufferManager changes on buffer if nb uses > 0
+     *
+     * The count is shared with the associated BufferObject. Be aware that this
+     * mechanism is actually not thread-safe.
+     *
+     */
+    template <typename T>
+    class LockBase
+    {
+    public:
+
+        typedef typename ::boost::conditional< ::boost::is_const< T >::value, const void*, void* >::type BufferType;
+
+        /**
+         * @brief Build an empty lock.
+         */
+        LockBase()
+        {
+        }
+
+        /**
+         * @brief Build a lock on object 'bo'
+         *
+         * Increments BufferObject's lock counts.
+         *
+         * @param bo BufferObject to lock
+         */
+        LockBase( const SPTR(T) &bo ) :
+            m_bufferObject(bo)
+        {
+            SLM_ASSERT("Can't lock NULL object", bo);
+
+            ::fwCore::mt::ScopedLock lock(bo->m_lockDumpMutex);
+            m_count = bo->m_count.lock();
+            if ( ! m_count )
+            {
+                m_count = bo->m_bufferManager->lockBuffer(&(bo->m_buffer)).get();
+                bo->m_count = m_count;
+            }
+
+        }
+
+        /**
+         * @brief Returns BufferObject's buffer pointer
+         */
+        typename LockBase<T>::BufferType getBuffer() const
+        {
+            SPTR(T) bufferObject = m_bufferObject.lock();
+            BufferType buffer = bufferObject->m_buffer;
+            return buffer;
+        };
+
+        /**
+         * @brief Release any count on any Buffer the lock may have.
+         */
+        void reset()
+        {
+            m_count.reset();
+            m_bufferObject.reset();
+        }
+
+    protected:
+
+        BufferObject::CounterType m_count;
+        WPTR(T) m_bufferObject;
+    };
+
+
+    /**
+     * @name Locks
+     * @brief Locks types
+     * @{
+     */
+    typedef LockBase<BufferObject> Lock;
+    typedef LockBase<const BufferObject> ConstLock;
+    /**  @} */
+
+
+    /**
+     * @brief BufferObject constructor
+     *
+     * Register the buffer to an existing buffer manager.
+     */
+    FWMEMORY_API BufferObject();
+
+    /**
+     * @brief BufferObject destructor
+     *
+     * unregister the buffer from the buffer manager.
+     */
+    FWMEMORY_API virtual ~BufferObject();
+
+
+    /**
+     * @brief Buffer allocation
+     *
+     * Allocate a buffer using given policy.
+     * The allocation may have been hooked by the buffer manager.
+     *
+     * @param size number of bytes to allocate
+     * @param policy Buffer allocation policy, default is Malloc policy
+     *
+     */
+    FWMEMORY_API virtual void allocate(SizeType size,
+            const ::fwMemory::BufferAllocationPolicy::sptr &policy = ::fwMemory::BufferMallocPolicy::New());
+
+    /**
+     * @brief Buffer reallocation
+     *
+     * Reallocate the buffer using the associated policy. A policy may not
+     * handle reallocation.
+     * The reallocation may have been hooked by the buffer manager.
+     *
+     * @param size New buffer size
+     *
+     */
+    FWMEMORY_API virtual void reallocate(SizeType size);
+
+    /**
+     * @brief Buffer deallocation
+     *
+     * Destroy the buffer using the associated policy.
+     * The destruction may have been hooked by the buffer manager.
+     *
+     */
+    FWMEMORY_API virtual void destroy();
+
+
+    /**
+     * @brief Buffer setter
+     *
+     * Set the buffer from an existing one.
+     *
+     * @param buffer External Buffer
+     * @param size Buffer's size
+     * @param policy External buffer allocation policy, default is Malloc policy
+     *
+     */
+    FWMEMORY_API virtual void setBuffer(::fwMemory::BufferManager::BufferType buffer, SizeType size,
+            const ::fwMemory::BufferAllocationPolicy::sptr &policy = ::fwMemory::BufferMallocPolicy::New());
+
+
+    /**
+     * @brief Return a lock on the BufferObject
+     *
+     * @return Lock on the BufferObject
+     */
+    FWMEMORY_API virtual Lock lock();
+
+    /**
+     * @brief Return a const lock on the BufferObject
+     *
+     * @return ConstLock on the BufferObject
+     */
+    FWMEMORY_API virtual ConstLock lock() const;
+
+    /**
+     * @brief Returns the buffer's size
+     */
+    SizeType getSize() const { return m_size; };
+
+    /**
+     * @brief Returns true if the buffer is empty
+     */
+    bool isEmpty() const { return m_size == 0; };
+
+    /**
+     * @brief Returns the number of locks on the BufferObject
+     */
+    long lockCount() const { return m_count.use_count(); };
+
+    /**
+     * @brief Returns true if the buffer has any lock
+     */
+    long isLocked() const { return lockCount() != 0; };
+
+    /**
+     * @brief Returns pointer on BufferObject's buffer
+     */
+    const ::fwMemory::BufferManager::ConstBufferPtrType getBufferPointer() const {return &m_buffer;};
+
+    ::fwCore::mt::ReadWriteMutex &getMutex() { return m_mutex; }
+
+    /// Exchanges the content of the BufferObject with the content of _source.
+    FWMEMORY_API void swap( const BufferObject::sptr &_source );
+
+    FWMEMORY_API BufferManager::StreamInfo getStreamInfo() const;
+
+    /**
+     * @brief Set a stream factory for the buffer manager
+     * The factory will be used to load data on demand by the buffer manager.
+     *
+     * @param factory ::fwMemory::stream::in::IFactory stream factory
+     * @param size size of data provided by the stream
+     * @param sourceFile Filesystem path of the source file, if applicable
+     * @param format file format (RAW,RAWZ,OTHER), if sourceFile is provided
+     * @param policy Buffer allocation policy
+     */
+    FWMEMORY_API void setIStreamFactory(const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                           SizeType size,
+                           const ::boost::filesystem::path &sourceFile = "",
+                           ::fwMemory::FileFormatType format = ::fwMemory::OTHER,
+                           const ::fwMemory::BufferAllocationPolicy::sptr &policy = ::fwMemory::BufferMallocPolicy::New()
+                          );
+
+
+protected :
+
+    ::fwMemory::BufferManager::BufferType m_buffer;
+
+    SizeType m_size;
+
+    mutable WeakCounterType m_count;
+    mutable ::fwCore::mt::Mutex m_lockDumpMutex;
+    ::fwCore::mt::ReadWriteMutex m_mutex;
+
+    ::fwMemory::BufferManager::sptr m_bufferManager;
+
+    ::fwMemory::BufferAllocationPolicy::sptr m_allocPolicy;
+};
+
+}
+
+
+#endif // _FWMEMORY_BUFFEROBJECT_HPP_
diff --git a/SrcLib/core/fwMemory/include/fwMemory/ByteSize.hpp b/SrcLib/core/fwMemory/include/fwMemory/ByteSize.hpp
new file mode 100644
index 0000000..7e8b930
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/ByteSize.hpp
@@ -0,0 +1,150 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_BYTESIZE_HPP_
+#define _FWMEMORY_BYTESIZE_HPP_
+
+#include <string>
+
+#include <boost/cstdint.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+/**
+ * @brief Conversion helper for size in bytes
+ * Converts string to number of bytes and vice-versa. This class is also able to
+ * manage conversions between units standards (IEC, SI)
+ */
+class FWMEMORY_CLASS_API ByteSize
+{
+public:
+
+    typedef enum {
+        SI, IEC
+    } StandardType ;
+
+    FWMEMORY_API static const boost::uint64_t Bytes;
+
+    // SI units
+    FWMEMORY_API static const boost::uint64_t KB;
+    FWMEMORY_API static const boost::uint64_t MB;
+    FWMEMORY_API static const boost::uint64_t GB;
+    FWMEMORY_API static const boost::uint64_t TB;
+    FWMEMORY_API static const boost::uint64_t PB;
+
+    // IEC units
+    FWMEMORY_API static const boost::uint64_t KiB;
+    FWMEMORY_API static const boost::uint64_t MiB;
+    FWMEMORY_API static const boost::uint64_t GiB;
+    FWMEMORY_API static const boost::uint64_t TiB;
+    FWMEMORY_API static const boost::uint64_t PiB;
+
+    typedef ::boost::uint64_t SizeType;
+    typedef ::boost::uint64_t UnitType;
+
+    /**
+     * @brief Default constructor
+     */
+    FWMEMORY_API ByteSize ();
+
+    /**
+     * @brief Build a ByteSize object from given size and unit
+     * @{
+     */
+    FWMEMORY_API ByteSize ( SizeType size, UnitType unit = Bytes );
+    template <typename T>
+    ByteSize ( T size, UnitType unit = Bytes ) : m_size(0)
+    {
+        this->setSize( SizeType(size), unit);
+    }
+    ///@}
+
+
+    /**
+     * @brief Build a ByteSize object from given size and unit
+     */
+    FWMEMORY_API ByteSize ( double size, UnitType unit = Bytes );
+
+    /**
+     * @brief Build a ByteSize object from given string
+     */
+    FWMEMORY_API ByteSize ( const std::string &size );
+
+    /**
+     * @brief Convert this size to a string with specified unit
+     *
+     * @param unit Unit to convert this size to.
+     *
+     * @return std::string representing the size
+     */
+    FWMEMORY_API std::string getSizeAsString( UnitType unit = Bytes );
+    /**
+     * @brief Convert this size to a human readable string in the required
+     * Convert this size to a human readable string in the required standard.
+     * The unit will be chosen to make the numeric value fit in [0; 1024[ when
+     * possible.
+     *
+     * @param standard Wanted set of unit
+     *
+     * @return std::string representing the size
+     */
+    FWMEMORY_API std::string getHumanReadableSize( StandardType standard = IEC );
+
+    /**
+     * @brief Returns size in bytes.
+     */
+    SizeType getSize(){ return m_size; }
+
+    /**
+     * @brief Build a ByteSize object from given size and unit
+     * @{
+     */
+    FWMEMORY_API void setSize( SizeType size, UnitType unit = Bytes );
+    template <typename T>
+    void setSize( T size, UnitType unit = Bytes )
+    {
+        this->setSize(SizeType(size), unit);
+    }
+    ///@}
+
+    /**
+     * @brief Build a ByteSize object from given size and unit
+     */
+    FWMEMORY_API void setSize( double size, UnitType unit = Bytes );
+    /**
+     * @brief Build a ByteSize object from given string
+     */
+    FWMEMORY_API void setSize( const std::string& size );
+
+    FWMEMORY_API ByteSize& operator= ( SizeType size );
+    FWMEMORY_API ByteSize& operator= ( double size );
+    FWMEMORY_API ByteSize& operator= ( const std::string &size );
+    template <typename T>
+    ByteSize& operator= ( T size )
+    {
+        return this->operator=( SizeType(size) );
+    }
+
+    operator SizeType () { return m_size; }
+    operator std::string () { return getHumanReadableSize(); }
+
+    FWMEMORY_API static bool parseSize(const std::string &s, boost::uint64_t& size);
+    FWMEMORY_API static std::string unitToString( UnitType unit );
+
+protected:
+    SizeType m_size;
+
+};
+
+
+} //namespace fwMemory
+
+#endif /* _FWMEMORY_BYTESIZE_HPP_ */
diff --git a/SrcLib/core/fwMemory/include/fwMemory/FileFormat.hpp b/SrcLib/core/fwMemory/include/fwMemory/FileFormat.hpp
new file mode 100644
index 0000000..a1baa7f
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/FileFormat.hpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_FILEFORMATS_HPP__
+#define __FWMEMORY_FILEFORMATS_HPP__
+
+namespace fwMemory
+{
+
+typedef enum {
+    OTHER = 0,
+    RAW   = 1,
+    RAWZ  = 1 << 2
+} FileFormatType;
+
+} // namespace fwMemory
+
+#endif // __FWMEMORY_FILEFORMATS_HPP__
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/FileHolder.hpp b/SrcLib/core/fwMemory/include/fwMemory/FileHolder.hpp
new file mode 100644
index 0000000..3e349db
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/FileHolder.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_FILEHOLDER_HPP__
+#define __FWMEMORY_FILEHOLDER_HPP__
+
+#include <fwCore/macros.hpp>
+
+#include <boost/filesystem/path.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+struct FileAutoDelete;
+
+class FWMEMORY_CLASS_API FileHolder
+{
+public:
+    FileHolder(){};
+    FWMEMORY_API FileHolder(const ::boost::filesystem::path &file, bool autodelete = false);
+
+    operator ::boost::filesystem::path () const
+    {
+        return m_path;
+    }
+
+    bool empty() const
+    {
+        return m_path.empty();
+    }
+
+    void clear()
+    {
+        m_path.clear();
+        m_autoDelete.reset();
+    }
+
+    std::string string()
+    {
+        return m_path.string();
+    }
+
+protected:
+    ::boost::filesystem::path m_path;
+    SPTR(FileAutoDelete) m_autoDelete;
+};
+
+
+} // namespace fwMemory
+
+#endif // __FWMEMORY_FILEHOLDER_HPP__
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/IPolicy.hpp b/SrcLib/core/fwMemory/include/fwMemory/IPolicy.hpp
new file mode 100644
index 0000000..f22a1f7
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/IPolicy.hpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORY_IPOLICY_HPP_
+#define FWMEMORY_IPOLICY_HPP_
+
+#include <boost/shared_ptr.hpp>
+#include <boost/function.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/BufferManager.hpp"
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+/**
+ * @brief Defines the memory dump policy interface
+ */
+class FWMEMORY_CLASS_API IPolicy : public fwCore::BaseObject
+{
+public :
+
+    typedef SPTR(IPolicy) sptr;
+    typedef std::vector<std::string> ParamNamesType;
+
+    virtual void allocationRequest(BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) = 0 ;
+
+    virtual void setRequest(BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer,  BufferInfo::SizeType size ) = 0 ;
+
+    virtual void reallocateRequest(BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType newSize ) = 0 ;
+
+    virtual void destroyRequest(BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) = 0 ;
+
+    virtual void lockRequest(BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) = 0 ;
+    virtual void unlockRequest(BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) = 0 ;
+
+    virtual void dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) = 0 ;
+    virtual void restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) = 0 ;
+
+    virtual void refresh() = 0;
+
+    virtual bool setParam(const std::string &name, const std::string &value) = 0;
+    virtual std::string getParam(const std::string &name, bool *ok = NULL ) const = 0;
+    virtual const ParamNamesType &getParamNames() const = 0;
+
+
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwMemory::policy::registry::get()->addFactory(T::leafClassname(), &::fwMemory::policy::factory::New<T>);
+        }
+    };
+
+};
+
+} // namespace fwMemory
+
+#endif // FWMEMORY_IPOLICY_HPP_
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/Namespace.hpp b/SrcLib/core/fwMemory/include/fwMemory/Namespace.hpp
new file mode 100644
index 0000000..1450618
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORYNAMESPACE_HPP_
+#define FWMEMORYNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwMemory contains tools to manage memory. Use for dump.
+ * @namespace   fwMemory
+ * 
+ * @date        2009-2011.
+ *
+ */
+namespace fwMemory
+{
+}
+#endif /* FWMEMORYNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwMemory/include/fwMemory/camp/declare.hpp b/SrcLib/core/fwMemory/include/fwMemory/camp/declare.hpp
new file mode 100644
index 0000000..66b534d
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/camp/declare.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_CAMP_DECLARE_HPP__
+#define __FWMEMORY_CAMP_DECLARE_HPP__
+
+#include <fwCamp/macros.hpp>
+
+#include "fwMemory/BufferObject.hpp"
+
+namespace fwMemory
+{
+namespace camp
+{
+
+struct runner
+{
+    runner()
+    {
+        localDeclarefwMemoryBufferObject();
+    }
+
+    static runner r;
+};
+
+} // namespace camp
+} // namespace fwMemory
+
+#endif //__FWMEMORY_CAMP_DECLARE_HPP__
diff --git a/SrcLib/core/fwMemory/include/fwMemory/camp/mapper.hpp b/SrcLib/core/fwMemory/include/fwMemory/camp/mapper.hpp
new file mode 100644
index 0000000..c9ce692
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/camp/mapper.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_CAMP_MAPPER_HPP__
+#define __FWMEMORY_CAMP_MAPPER_HPP__
+
+#include <camp/valuemapper.hpp>
+
+#include <fwTools/Type.hpp>
+
+namespace camp_ext
+{
+
+
+template <>
+struct ValueMapper< ::fwTools::Type >
+{
+    typedef ::fwTools::Type ReturnType;
+    static const int type = camp::stringType;
+    static const std::string to(const ReturnType& source) {return source.string();}
+
+    static ReturnType from(bool source)                    {CAMP_ERROR(camp::BadType(camp::boolType, camp::mapType<ReturnType>()));}
+    static ReturnType from(long source)                    {CAMP_ERROR(camp::BadType(camp::intType, camp::mapType<ReturnType>()));}
+    static ReturnType from(double source)                  {CAMP_ERROR(camp::BadType(camp::realType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const std::string& source)      {return ::fwTools::Type::create(source);}
+    static ReturnType from(const camp::EnumObject& source) {CAMP_ERROR(camp::BadType(camp::enumType, camp::mapType<ReturnType>()));}
+    static ReturnType from(const camp::UserObject& source)
+    {
+        CAMP_ERROR(camp::BadType(camp::userType, camp::mapType<ReturnType>()));
+    }
+};
+
+
+}  // namespace camp_ext
+
+#endif //__FWMEMORY_CAMP_MAPPER_HPP__
diff --git a/SrcLib/core/fwMemory/include/fwMemory/config.hpp b/SrcLib/core/fwMemory/include/fwMemory/config.hpp
new file mode 100644
index 0000000..a3d04e4
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_CONFIG_HPP_
+#define _FWMEMORY_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWMEMORY_EXPORTS
+    #define FWMEMORY_API __declspec(dllexport)
+    #else
+    #define FWMEMORY_API __declspec(dllimport)
+    #endif
+
+    #define FWMEMORY_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWMEMORY_EXPORTS
+    #define FWMEMORY_API __attribute__ ((visibility("default")))
+    #define FWMEMORY_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define FWMEMORY_API __attribute__ ((visibility("hidden")))
+    #define FWMEMORY_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define FWMEMORY_API
+    #define FWMEMORY_CLASS_API
+
+#endif
+
+#endif // _FWMEMORY_CONFIG_HPP_
diff --git a/SrcLib/core/fwMemory/include/fwMemory/exception/BadCast.hpp b/SrcLib/core/fwMemory/include/fwMemory/exception/BadCast.hpp
new file mode 100644
index 0000000..e10665f
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/exception/BadCast.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_EXCEPTION_BADCAST_HPP__
+#define __FWMEMORY_EXCEPTION_BADCAST_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace exception
+{
+
+/**
+ * @brief   Implements an exception class for bad cast
+ * @class   BadCast
+ */
+struct FWMEMORY_CLASS_API BadCast : ::fwCore::Exception
+{
+    BadCast( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwMemory
+
+#endif // __FWMEMORY_EXCEPTION_BADCAST_HPP__
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/exception/Memory.hpp b/SrcLib/core/fwMemory/include/fwMemory/exception/Memory.hpp
new file mode 100644
index 0000000..1e5992f
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/exception/Memory.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_EXCEPTION_BYTESIZE_HPP__
+#define __FWMEMORY_EXCEPTION_BYTESIZE_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace exception
+{
+
+/**
+ * @brief   Implements an exception class for fwMemory
+ * @class   Memory
+ */
+struct FWMEMORY_CLASS_API Memory : ::fwCore::Exception
+{
+    Memory( const std::string &err ) : ::fwCore::Exception(err) {}
+};
+
+} // namespace exception
+} // namespace fwMemory
+
+#endif // __FWMEMORY_EXCEPTION_BYTESIZE_HPP__
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/AlwaysDump.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/AlwaysDump.hpp
new file mode 100644
index 0000000..96679ea
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/AlwaysDump.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORY_ALWAYSDUMP_HPP_
+#define FWMEMORY_ALWAYSDUMP_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace policy
+{
+
+/**
+ * @brief Always dump policy
+ *
+ * This policy will dump buffers as often as possible. As soon as a buffer is
+ * released (ie the lock count become zero), it will be dumped.
+ */
+class FWMEMORY_CLASS_API AlwaysDump : public fwMemory::IPolicy
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((AlwaysDump)(fwMemory::IPolicy),
+                                           (()),
+                                           ::fwMemory::policy::factory::New< AlwaysDump >) ;
+
+    FWMEMORY_API virtual void allocationRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size );
+
+    FWMEMORY_API virtual void setRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size );
+
+    FWMEMORY_API virtual void reallocateRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType newSize );
+
+    FWMEMORY_API virtual void destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void refresh();
+
+    bool setParam(const std::string &name, const std::string &value)
+    {
+        FwCoreNotUsedMacro(name);
+        FwCoreNotUsedMacro(value);
+        return false;
+    }
+
+    FWMEMORY_API virtual std::string getParam(const std::string &name, bool *ok = NULL ) const;
+
+    const ::fwMemory::IPolicy::ParamNamesType &getParamNames() const
+    {
+        static ::fwMemory::IPolicy::ParamNamesType names;
+        return names;
+    }
+
+protected:
+
+    FWMEMORY_API size_t dump();
+    FWMEMORY_API void apply();
+};
+
+
+} // namespace policy
+
+} // namespace fwMemory
+
+#endif // FWMEMORY_ALWAYSDUMP_HPP_
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/BarrierDump.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/BarrierDump.hpp
new file mode 100644
index 0000000..10c9008
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/BarrierDump.hpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORY_BARRIERDUMP_HPP_
+#define FWMEMORY_BARRIERDUMP_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/BufferManager.hpp"
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+/**
+ * @brief Barrier dump policy
+ *
+ * This policy defines a memory usage barrier and will try to keep the managed
+ * buffers memory usage under this barrier.
+ */
+class FWMEMORY_CLASS_API BarrierDump : public ::fwMemory::IPolicy
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((BarrierDump)(fwMemory::IPolicy),
+                                           (()),
+                                           ::fwMemory::policy::factory::New< BarrierDump >) ;
+    FWMEMORY_API BarrierDump();
+
+    FWMEMORY_API virtual void allocationRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+
+    FWMEMORY_API virtual void setRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+
+    FWMEMORY_API virtual void reallocateRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType newSize ) ;
+
+    FWMEMORY_API virtual void destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void refresh();
+
+    void setBarrier( size_t barrier )
+    {
+        m_barrier = barrier;
+    }
+    size_t getBarrier() const
+    {
+        return m_barrier;
+    }
+
+    FWMEMORY_API virtual std::string getParam(const std::string &name, bool *ok = NULL ) const;
+    FWMEMORY_API bool setParam(const std::string &name, const std::string &value);
+    FWMEMORY_API const fwMemory::IPolicy::ParamNamesType &getParamNames() const;
+
+protected :
+
+    FWMEMORY_API size_t getTotalAlive() const;
+    FWMEMORY_API bool isBarrierCrossed() const;
+
+    FWMEMORY_API size_t dump(size_t nbOfBytes);
+
+    FWMEMORY_API void apply();
+
+    size_t m_totalAllocated;
+    size_t m_totalDumped;
+    size_t m_barrier;
+};
+
+
+} // namespace policy
+
+} // namespace fwMemory
+
+#endif // FWMEMORY_BARRIERDUMP_HPP_
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/NeverDump.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/NeverDump.hpp
new file mode 100644
index 0000000..125055b
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/NeverDump.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORY_NEVERDUMP_HPP_
+#define FWMEMORY_NEVERDUMP_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+/**
+ * @brief Never dump policy
+ *
+ * This policy will never take the initiative to free memory. This is the policy
+ * used when no automatic memory management is wanted. Memory will be dumped on
+ * demand.
+ */
+class FWMEMORY_CLASS_API NeverDump : public fwMemory::IPolicy
+{
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((NeverDump)(fwMemory::IPolicy),
+                                           (()),
+                                           ::fwMemory::policy::factory::New< NeverDump >) ;
+
+    FWMEMORY_API virtual void allocationRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+
+    FWMEMORY_API virtual void setRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+
+    FWMEMORY_API virtual void reallocateRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType newSize ) ;
+
+    FWMEMORY_API virtual void destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) ;
+
+    FWMEMORY_API virtual void dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void refresh();
+
+    bool setParam(const std::string &name, const std::string &value)
+    {
+        FwCoreNotUsedMacro(name);
+        FwCoreNotUsedMacro(value);
+        return false;
+    }
+
+    FWMEMORY_API virtual std::string getParam(const std::string &name, bool *ok = NULL ) const;
+
+    const fwMemory::IPolicy::ParamNamesType &getParamNames() const
+    {
+        static fwMemory::IPolicy::ParamNamesType names;
+        return names;
+    }
+};
+
+
+} // namespace policy
+
+} // namespace fwMemory
+
+#endif // FWMEMORY_NEVERDUMP_HPP_
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/ValveDump.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/ValveDump.hpp
new file mode 100644
index 0000000..5a419a8
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/ValveDump.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWMEMORY_DUMP_HPP_
+#define FWMEMORY_DUMP_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/BufferInfo.hpp"
+#include "fwMemory/BufferManager.hpp"
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+/**
+ * @brief Valve dump policy
+ *
+ * This policy is monitoring system memory usage and will trigger memory dump
+ * when the amount of system free memory is lower than the minFreeMem parameter.
+ *
+ * An hysteresis parameter exists to free more memory when the process is
+ * triggered. If the free system memory amount is lower than the minFreeMem,
+ * this policy will try to reach minFreeMem + hysteresisOffset bytes of free
+ * memory.
+ */
+class FWMEMORY_CLASS_API ValveDump : public fwMemory::IPolicy
+{
+public :
+    fwCoreClassDefinitionsWithFactoryMacro((ValveDump)(fwMemory::IPolicy),
+                                           (()),
+                                           ::fwMemory::policy::factory::New< ValveDump >) ;
+
+    FWMEMORY_API ValveDump();
+
+    FWMEMORY_API virtual void allocationRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+    FWMEMORY_API virtual void setRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType size ) ;
+    FWMEMORY_API virtual void reallocateRequest( BufferInfo &info,
+            ::fwMemory::BufferManager::ConstBufferPtrType buffer, BufferInfo::SizeType newSize ) ;
+
+    FWMEMORY_API virtual void destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) ;
+
+    FWMEMORY_API virtual void lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) ;
+    FWMEMORY_API virtual void unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer ) ;
+
+    FWMEMORY_API virtual void dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+    FWMEMORY_API virtual void restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer );
+
+    FWMEMORY_API virtual void refresh();
+
+    FWMEMORY_API bool setParam(const std::string &name, const std::string &value);
+    FWMEMORY_API virtual std::string getParam(const std::string &name, bool *ok = NULL ) const;
+    FWMEMORY_API const ::fwMemory::IPolicy::ParamNamesType &getParamNames() const;
+
+protected :
+
+    FWMEMORY_API bool needDump(size_t supplement) const;
+
+    FWMEMORY_API size_t dump(size_t nbOfBytes);
+
+    FWMEMORY_API void apply(size_t supplement = 0);
+
+    size_t m_minFreeMem;
+    size_t m_hysteresisOffset;
+};
+
+
+} // namespace policy
+
+} // namespace fwMemory
+
+#endif // FWMEMORY_DUMP_HPP_
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/factory/new.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/factory/new.hpp
new file mode 100644
index 0000000..d3e3416
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/factory/new.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_POLICY_FACTORY_NEW_HPP__
+#define __FWMEMORY_POLICY_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwMemory/config.hpp"
+#include "fwMemory/policy/registry/detail.hpp"
+
+namespace fwMemory
+{
+
+class GuiBaseObject;
+
+namespace policy
+{
+namespace factory
+{
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+
+FWMEMORY_API SPTR( ::fwMemory::IPolicy ) New( const ::fwMemory::policy::registry::KeyType & classname );
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) policy = ::boost::make_shared< CLASSNAME >();
+    return policy;
+}
+
+} // namespace factory
+} // namespace policy
+} // namespace fwMemory
+
+#endif /* __FWMEMORY_POLICY_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/registry/detail.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/registry/detail.hpp
new file mode 100644
index 0000000..ad7a4fa
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/registry/detail.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_POLICY_REGISTRY_DETAIL_HPP__
+#define __FWMEMORY_POLICY_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+
+class IPolicy;
+
+namespace policy
+{
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwMemory::IPolicy) () , KeyType > Type;
+
+FWMEMORY_API SPTR(Type) get();
+
+} // namespace registry
+} // namespace policy
+} // namespace fwMemory
+
+#endif /* __FWMEMORY_POLICY_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/policy/registry/macros.hpp b/SrcLib/core/fwMemory/include/fwMemory/policy/registry/macros.hpp
new file mode 100644
index 0000000..22d3bd2
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/policy/registry/macros.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_POLICY_REGISTRY_MACROS_HPP__
+#define __FWMEMORY_POLICY_REGISTRY_MACROS_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/registry/detail.hpp"
+
+namespace fwMemory
+{
+namespace policy
+{
+namespace registry
+{
+
+#define fwMemoryPolicyRegisterMacro( classname )                                  \
+    static ::fwMemory::IPolicy::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // namespace registry
+} // namespace policy
+} // namespace fwMemory
+
+#endif /*__FWMEMORY_POLICY_REGISTRY_MACROS_HPP__*/
diff --git a/SrcLib/core/fwMemory/include/fwMemory/stream/in/Buffer.hpp b/SrcLib/core/fwMemory/include/fwMemory/stream/in/Buffer.hpp
new file mode 100644
index 0000000..e3b6cf8
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/stream/in/Buffer.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_STREAM_IN_BUFFER_HPP__
+#define __FWMEMORY_STREAM_IN_BUFFER_HPP__
+
+#include <boost/function.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwMemory/stream/in/IFactory.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+class FWMEMORY_CLASS_API Buffer : public IFactory
+{
+public:
+    typedef SPTR(void) LockType;
+    typedef ::boost::function< LockType () > CounterFactoryType;
+
+    Buffer(void* buf, size_t size);
+    Buffer(void* buf, size_t size, CounterFactoryType counterFactory);
+
+protected:
+
+    FWMEMORY_API SPTR(std::istream) get();
+
+    void* m_buf;
+    size_t m_size;
+    CounterFactoryType m_counterFactory;
+};
+
+
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
+#endif // __FWMEMORY_STREAM_IN_BUFFER_HPP__
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/stream/in/IFactory.hpp b/SrcLib/core/fwMemory/include/fwMemory/stream/in/IFactory.hpp
new file mode 100644
index 0000000..42ec50b
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/stream/in/IFactory.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_STREAM_IN_IFACTORY_HPP__
+#define __FWMEMORY_STREAM_IN_IFACTORY_HPP__
+
+#include <istream>
+#include <fwCore/macros.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+class FWMEMORY_CLASS_API IFactory
+{
+public:
+    virtual ~IFactory(){};
+
+    SPTR(std::istream) operator()(){ return this->get(); }
+
+protected:
+
+    virtual SPTR(std::istream) get() = 0;
+
+};
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
+#endif // __FWMEMORY_STREAM_IN_IFACTORY_HPP__
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/stream/in/Raw.hpp b/SrcLib/core/fwMemory/include/fwMemory/stream/in/Raw.hpp
new file mode 100644
index 0000000..08b447e
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/stream/in/Raw.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_STREAM_IN_RAW_HPP__
+#define __FWMEMORY_STREAM_IN_RAW_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwMemory/stream/in/IFactory.hpp"
+#include "fwMemory/FileHolder.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+class FWMEMORY_CLASS_API Raw : public IFactory
+{
+public:
+    Raw(const ::boost::filesystem::path &path):
+        m_path(path)
+    {};
+
+    Raw(const ::fwMemory::FileHolder &path):
+        m_path(path)
+    {};
+
+protected:
+
+    FWMEMORY_API SPTR(std::istream) get();
+
+    ::fwMemory::FileHolder m_path;
+};
+
+
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
+#endif // __FWMEMORY_STREAM_IN_RAW_HPP__
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/stream/in/RawZ.hpp b/SrcLib/core/fwMemory/include/fwMemory/stream/in/RawZ.hpp
new file mode 100644
index 0000000..642ff63
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/stream/in/RawZ.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_STREAM_IN_RAWZ_HPP__
+#define __FWMEMORY_STREAM_IN_RAWZ_HPP__
+
+#include <boost/filesystem/path.hpp>
+#include <fwCore/macros.hpp>
+
+#include "fwMemory/stream/in/IFactory.hpp"
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+class FWMEMORY_CLASS_API RawZ : public IFactory
+{
+public:
+    RawZ(const boost::filesystem::path &path):
+        m_path(path)
+    {};
+
+protected:
+
+    FWMEMORY_API SPTR(std::istream) get();
+
+    boost::filesystem::path m_path;
+};
+
+
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
+#endif // __FWMEMORY_STREAM_IN_RAWZ_HPP__
+
+
diff --git a/SrcLib/core/fwMemory/include/fwMemory/tools/DarwinMemoryMonitorTools.hpp b/SrcLib/core/fwMemory/include/fwMemory/tools/DarwinMemoryMonitorTools.hpp
new file mode 100644
index 0000000..8b321f4
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/tools/DarwinMemoryMonitorTools.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_DARWINMEMORYMONITORTOOLS_HPP_
+#define _FWMEMORY_DARWINMEMORYMONITORTOOLS_HPP_
+
+#ifdef __MACOSX__
+
+#include <boost/cstdint.hpp>
+#include <string>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace tools
+{
+//------------------------------------------------------------------------------
+
+class FWMEMORY_CLASS_API DarwinMemoryMonitorTools
+{
+
+public:
+
+    FWMEMORY_API DarwinMemoryMonitorTools();
+
+    FWMEMORY_API ~DarwinMemoryMonitorTools();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t estimateFreeMem();
+
+
+
+    FWMEMORY_API static void printProcessMemoryInformation();
+
+    FWMEMORY_API static void printSystemMemoryInformation();
+
+    FWMEMORY_API static void printMemoryInformation();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getTotalSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getUsedSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getFreeSystemMemory();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getUsedProcessMemory();
+
+};
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
+
+#endif // _FWMEMORY_DARWINMEMORYMONITORTOOLS_HPP_
diff --git a/SrcLib/core/fwMemory/include/fwMemory/tools/MemoryMonitorTools.hpp b/SrcLib/core/fwMemory/include/fwMemory/tools/MemoryMonitorTools.hpp
new file mode 100644
index 0000000..2aed77e
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/tools/MemoryMonitorTools.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_MEMORYMONITORTOOLS_HPP_
+#define _FWMEMORY_MEMORYMONITORTOOLS_HPP_
+
+#include <boost/cstdint.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace tools
+{
+
+class FWMEMORY_CLASS_API MemoryMonitorTools
+{
+
+public:
+
+    FWMEMORY_API MemoryMonitorTools() ;
+
+    FWMEMORY_API ~MemoryMonitorTools() ;
+
+
+    FWMEMORY_API static ::boost::uint64_t estimateFreeMem();
+
+
+    FWMEMORY_API static void printProcessMemoryInformation();
+
+    FWMEMORY_API static void printSystemMemoryInformation();
+
+    FWMEMORY_API static void printMemoryInformation();
+
+
+    FWMEMORY_API static ::boost::uint64_t getTotalSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getUsedSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getFreeSystemMemory();
+
+
+    FWMEMORY_API static ::boost::uint64_t getUsedProcessMemory();
+
+
+};
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif // _FWMEMORY_MEMORYMONITORTOOLS_HPP_
diff --git a/SrcLib/core/fwMemory/include/fwMemory/tools/PosixMemoryMonitorTools.hpp b/SrcLib/core/fwMemory/include/fwMemory/tools/PosixMemoryMonitorTools.hpp
new file mode 100644
index 0000000..1350b4f
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/tools/PosixMemoryMonitorTools.hpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_POSIXMEMORYMONITORTOOLS_HPP_
+#define _FWMEMORY_POSIXMEMORYMONITORTOOLS_HPP_
+
+#ifdef linux
+
+#include <boost/cstdint.hpp>
+#include <string>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace tools
+{
+
+//------------------------------------------------------------------------------
+
+struct MemInfo {
+
+    ::boost::uint64_t total;
+    ::boost::uint64_t free;
+    ::boost::uint64_t buffered;
+    ::boost::uint64_t cached;
+    ::boost::uint64_t swapcached;
+    ::boost::uint64_t swaptotal;
+    ::boost::uint64_t swapfree;
+
+    MemInfo()
+    {
+        total = 0;
+        free = 0;
+        buffered = 0;
+        cached = 0;
+        swapcached = 0;
+        swaptotal = 0;
+        swapfree = 0;
+    };
+
+};
+
+//------------------------------------------------------------------------------
+
+struct Status {
+
+    ::boost::uint64_t VmPeak;
+    ::boost::uint64_t VmSize;
+    ::boost::uint64_t VmLck;
+    ::boost::uint64_t VmHWM;
+    ::boost::uint64_t VmRSS;
+    ::boost::uint64_t VmData;
+    ::boost::uint64_t VmStk;
+    ::boost::uint64_t VmExe;
+    ::boost::uint64_t VmLib;
+    ::boost::uint64_t VmPTE;
+
+    Status()
+    {
+        VmPeak = 0;
+        VmSize = 0;
+        VmLck = 0;
+        VmHWM = 0;
+        VmRSS = 0;
+        VmData = 0;
+        VmStk = 0;
+        VmExe = 0;
+        VmLib = 0;
+        VmPTE = 0;
+    };
+
+};
+
+//------------------------------------------------------------------------------
+
+class FWMEMORY_CLASS_API PosixMemoryMonitorTools
+{
+
+public:
+
+    FWMEMORY_API PosixMemoryMonitorTools() ;
+
+    FWMEMORY_API ~PosixMemoryMonitorTools() ;
+
+
+
+    FWMEMORY_API static ::boost::uint64_t estimateFreeMem();
+
+
+
+    FWMEMORY_API static void printProcessMemoryInformation();
+
+    FWMEMORY_API static void printSystemMemoryInformation();
+
+    FWMEMORY_API static void printMemoryInformation();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getTotalSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getUsedSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getFreeSystemMemory();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getUsedProcessMemory();
+
+private :
+
+    static ::boost::uint64_t s_pageSize;
+    static ::boost::uint64_t s_totalMemory;
+
+    /* Extract numbers from a string between the start and end indices */
+    static ::boost::uint64_t extract_number( char *str, int start, int end );
+
+    /* Parse the contents of /proc/meminfo file into the meminfo structure */
+    static void get_memory_stats( MemInfo & meminfo );
+
+    static void printStatus( Status & stat );
+
+    static void analyseMemInfo( std::string & line, MemInfo & meminfo );
+
+    static void analyseStatusLine( std::string & line, Status & stat );
+
+    static void getStatusOfPid( int pid, Status & stat);
+
+    static void getAllStatus(Status & allStat);
+
+    static void printAllStatus();
+};
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
+
+#endif // _FWMEMORY_POSIXMEMORYMONITORTOOLS_HPP_
diff --git a/SrcLib/core/fwMemory/include/fwMemory/tools/Win32MemoryMonitorTools.hpp b/SrcLib/core/fwMemory/include/fwMemory/tools/Win32MemoryMonitorTools.hpp
new file mode 100644
index 0000000..c903aeb
--- /dev/null
+++ b/SrcLib/core/fwMemory/include/fwMemory/tools/Win32MemoryMonitorTools.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMEMORY_WIN32MEMORYMONITORTOOLS_HPP_
+#define _FWMEMORY_WIN32MEMORYMONITORTOOLS_HPP_
+
+#ifdef _WIN32
+
+#include <boost/cstdint.hpp>
+
+#include "fwMemory/config.hpp"
+
+namespace fwMemory
+{
+namespace tools
+{
+
+class FWMEMORY_CLASS_API Win32MemoryMonitorTools
+{
+
+public:
+
+    FWMEMORY_API Win32MemoryMonitorTools() ;
+
+    FWMEMORY_API ~Win32MemoryMonitorTools() ;
+
+
+
+    FWMEMORY_API static ::boost::uint64_t estimateFreeMem();
+
+
+
+    FWMEMORY_API static void printProcessMemoryInformation();
+
+    FWMEMORY_API static void printSystemMemoryInformation();
+
+    FWMEMORY_API static void printMemoryInformation();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getTotalSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getUsedSystemMemory();
+
+    FWMEMORY_API static ::boost::uint64_t getFreeSystemMemory();
+
+
+
+    FWMEMORY_API static ::boost::uint64_t getUsedProcessMemory();
+
+
+};
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
+
+#endif // _FWMEMORY_WIN32MEMORYMONITORTOOLS_HPP_
diff --git a/SrcLib/core/fwMemory/src/fwMemory/BufferAllocationPolicy.cpp b/SrcLib/core/fwMemory/src/fwMemory/BufferAllocationPolicy.cpp
new file mode 100644
index 0000000..02b79c9
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/BufferAllocationPolicy.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/exception/Memory.hpp"
+#include "fwMemory/ByteSize.hpp"
+#include "fwMemory/BufferAllocationPolicy.hpp"
+
+namespace fwMemory
+{
+
+
+void BufferMallocPolicy::allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    if (size > 0)
+    {
+        buffer = malloc( size );
+    }
+    if (buffer == NULL && size > 0)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                                "Cannot allocate memory ("
+                                << ::fwMemory::ByteSize(::fwMemory::ByteSize::SizeType(size)) <<").");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void BufferMallocPolicy::reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    BufferType newBuffer;
+    if (size > 0)
+    {
+        newBuffer = realloc( buffer, size );
+    }
+    else
+    {
+        free ( buffer );
+        newBuffer = NULL;
+    }
+    if (newBuffer == NULL && size > 0)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                                "Cannot allocate memory ("
+                                << ::fwMemory::ByteSize(::fwMemory::ByteSize::SizeType(size)) <<").");
+    }
+    buffer = newBuffer;
+}
+
+//------------------------------------------------------------------------------
+
+void BufferMallocPolicy::destroy(BufferType &buffer)
+{
+    free( buffer );
+    buffer = 0;
+}
+
+//------------------------------------------------------------------------------
+
+
+BufferAllocationPolicy::sptr BufferMallocPolicy::New()
+{
+    return BufferAllocationPolicy::sptr(new BufferMallocPolicy);
+}
+
+//------------------------------------------------------------------------------
+
+
+
+
+
+void BufferNewPolicy::allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    try
+    {
+        if (size > 0)
+        {
+            buffer = new char[size];
+        }
+    }
+    catch (std::bad_alloc& ba)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                                "bad_alloc caught: " << ba.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void BufferNewPolicy::reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                            "Reallocation not managed for buffer allocated with 'new' operator.");
+}
+
+//------------------------------------------------------------------------------
+
+void BufferNewPolicy::destroy(BufferType &buffer)
+{
+    delete[] static_cast<char*>(buffer);
+    buffer = 0;
+}
+
+//------------------------------------------------------------------------------
+
+
+BufferAllocationPolicy::sptr BufferNewPolicy::New()
+{
+    return BufferAllocationPolicy::sptr(new BufferNewPolicy);
+}
+
+//------------------------------------------------------------------------------
+
+
+
+
+
+void BufferNoAllocPolicy::allocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                            "No Allocation Policy should not be called.");
+}
+
+//------------------------------------------------------------------------------
+
+void BufferNoAllocPolicy::reallocate(BufferType &buffer, BufferAllocationPolicy::SizeType size) throw( ::fwMemory::exception::Memory )
+{
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::Memory,
+                            "No Allocation Policy should not be called.");
+}
+
+//------------------------------------------------------------------------------
+
+void BufferNoAllocPolicy::destroy(BufferType &buffer)
+{
+    FwCoreNotUsedMacro(buffer);
+    SLM_ASSERT("No Alloc Policy should not be called", 0);
+}
+
+//------------------------------------------------------------------------------
+
+
+BufferAllocationPolicy::sptr BufferNoAllocPolicy::New()
+{
+    return BufferAllocationPolicy::sptr(new BufferNoAllocPolicy);
+}
+
+//------------------------------------------------------------------------------
+
+
+
+
+} //namespace fwMemory
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/BufferInfo.cpp b/SrcLib/core/fwMemory/src/fwMemory/BufferInfo.cpp
new file mode 100644
index 0000000..e0ab113
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/BufferInfo.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/BufferInfo.hpp"
+
+namespace fwMemory
+{
+
+BufferInfo::BufferInfo() :
+    size(0),
+    loaded(true),
+    userStreamFactory(false),
+    fileFormat(::fwMemory::OTHER)
+{
+    this->lastAccess.modified();
+}
+
+
+//-----------------------------------------------------------------------------
+
+void BufferInfo::clear()
+{
+    size = 0;
+    loaded = true;
+    userStreamFactory = false;
+    fsFile.clear();
+    fileFormat = ::fwMemory::OTHER;
+    lockCounter.reset();
+    lastAccess = ::fwCore::LogicStamp();
+    bufferPolicy.reset();
+    istreamFactory.reset();
+}
+
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/BufferManager.cpp b/SrcLib/core/fwMemory/src/fwMemory/BufferManager.cpp
new file mode 100644
index 0000000..bf257c4
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/BufferManager.cpp
@@ -0,0 +1,673 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iosfwd> // #include <strstream>
+#include <iomanip>
+#include <algorithm>
+
+#include <boost/bind.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/foreach.hpp>
+#include <boost/make_shared.hpp>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include <fwTools/System.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+
+#include "fwMemory/stream/in/Raw.hpp"
+#include "fwMemory/stream/in/Buffer.hpp"
+#include "fwMemory/policy/NeverDump.hpp"
+#include "fwMemory/BufferManager.hpp"
+
+namespace fwMemory
+{
+
+SPTR(void) getLock( const BufferManager::sptr &manager, BufferManager::ConstBufferPtrType bufferPtr )
+{
+    return manager->lockBuffer(bufferPtr).get();
+}
+
+
+//-----------------------------------------------------------------------------
+
+BufferManager::sptr BufferManager::getDefault()
+{
+    return ::fwCore::util::LazyInstantiator< BufferManager >::getInstance();
+}
+
+//-----------------------------------------------------------------------------
+
+BufferManager::BufferManager() :
+    m_updatedSig(UpdatedSignalType::New()),
+    m_dumpPolicy(::fwMemory::policy::NeverDump::New()),
+    m_loadingMode(BufferManager::DIRECT),
+    m_worker( ::fwThread::Worker::New() )
+{
+}
+
+//-----------------------------------------------------------------------------
+
+BufferManager::~BufferManager()
+{
+    m_worker->stop();
+    // TODO restore dumped buffers
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::registerBuffer(BufferManager::BufferPtrType bufferPtr)
+{
+    return m_worker->postTask<void>( ::boost::bind(&BufferManager::registerBufferImpl, this, bufferPtr) );
+}
+
+void BufferManager::registerBufferImpl(BufferManager::BufferPtrType bufferPtr)
+{
+    m_bufferInfos.insert( BufferInfoMapType::value_type( bufferPtr, BufferInfo() ) );
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::unregisterBuffer(BufferManager::BufferPtrType bufferPtr)
+{
+    return m_worker->postTask<void>( ::boost::bind(&BufferManager::unregisterBufferImpl, this, bufferPtr) );
+}
+
+void BufferManager::unregisterBufferImpl(BufferManager::BufferPtrType bufferPtr)
+{
+
+    m_bufferInfos.erase(bufferPtr);
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::allocateBuffer(BufferManager::BufferPtrType bufferPtr, SizeType size,
+                                   const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    return m_worker->postTask<void>(::boost::bind(&BufferManager::allocateBufferImpl, this, bufferPtr, size, policy));
+}
+
+void BufferManager::allocateBufferImpl(BufferManager::BufferPtrType bufferPtr, SizeType size,
+                                   const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    BufferInfo & info = m_bufferInfos[bufferPtr];
+    SLM_ASSERT("Buffer has already been allocated", info.loaded && (*bufferPtr == NULL));
+
+    if(!info.loaded)
+    {
+        info.clear();
+    }
+
+    m_dumpPolicy->allocationRequest( info, bufferPtr, size );
+
+    try
+    {
+        policy->allocate(*bufferPtr, size);
+    }
+    catch( ::fwMemory::exception::Memory & )
+    {
+        info.clear();
+        throw;
+    }
+
+
+    info.istreamFactory =
+        ::boost::make_shared< ::fwMemory::stream::in::Buffer >(*bufferPtr, size,
+                                                               ::boost::bind(&getLock, this->getSptr(), bufferPtr));
+
+    info.lastAccess.modified();
+    info.size = size;
+    info.bufferPolicy = policy;
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::setBuffer(BufferManager::BufferPtrType bufferPtr,
+                                                      ::fwMemory::BufferManager::BufferType buffer,
+                                                      SizeType size,
+                                                      const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    return m_worker->postTask<void>(
+                        ::boost::bind(&BufferManager::setBufferImpl, this, bufferPtr, buffer, size, policy));
+}
+
+void BufferManager::setBufferImpl(BufferManager::BufferPtrType bufferPtr, ::fwMemory::BufferManager::BufferType buffer,
+                              SizeType size, const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    BufferInfo & info = m_bufferInfos[bufferPtr];
+
+    SLM_ASSERT("Buffer is already set", *bufferPtr == NULL && info.loaded);
+
+    m_dumpPolicy->setRequest( info, bufferPtr, size );
+
+    if(!info.loaded)
+    {
+        info.clear();
+    }
+
+    *bufferPtr = buffer;
+
+    info.lastAccess.modified();
+    info.size = size;
+    info.bufferPolicy = policy;
+    info.fileFormat = ::fwMemory::OTHER;
+    info.fsFile.clear();
+    info.istreamFactory =
+        ::boost::make_shared< ::fwMemory::stream::in::Buffer >(*bufferPtr, size,
+                                                               ::boost::bind(&getLock, this->getSptr(), bufferPtr));
+    info.userStreamFactory = false;
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::reallocateBuffer(BufferManager::BufferPtrType bufferPtr, SizeType newSize)
+{
+    return m_worker->postTask<void>( ::boost::bind(&BufferManager::reallocateBufferImpl, this, bufferPtr, newSize) );
+}
+
+void BufferManager::reallocateBufferImpl(BufferManager::BufferPtrType bufferPtr, SizeType newSize)
+{
+    BufferInfo & info = m_bufferInfos[bufferPtr];
+    SLM_ASSERT("Buffer must be allocated or dumped", (*bufferPtr != NULL) || !info.loaded);
+
+    m_dumpPolicy->reallocateRequest( info, bufferPtr, newSize );
+
+    try
+    {
+        if(info.loaded)
+        {
+            info.bufferPolicy->reallocate(*bufferPtr, newSize);
+        }
+        else
+        {
+            this->restoreBuffer( info, bufferPtr, newSize );
+        }
+    }
+    catch( ::fwMemory::exception::Memory & )
+    {
+        m_updatedSig->asyncEmit();
+        throw;
+    }
+
+    info.istreamFactory =
+        ::boost::make_shared< ::fwMemory::stream::in::Buffer>(*bufferPtr, newSize,
+                                                              ::boost::bind(&getLock, this->getSptr(), bufferPtr));
+
+    info.lastAccess.modified();
+    info.size = newSize;
+
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::destroyBuffer(BufferManager::BufferPtrType bufferPtr)
+{
+    return m_worker->postTask<void>( ::boost::bind(&BufferManager::destroyBufferImpl, this, bufferPtr) );
+}
+
+void BufferManager::destroyBufferImpl(BufferManager::BufferPtrType bufferPtr)
+{
+    BufferInfo & info = m_bufferInfos[bufferPtr];
+    SLM_ASSERT("Buffer must be allocated or dumped", (*bufferPtr != NULL) || !info.loaded);
+
+    m_dumpPolicy->destroyRequest( info, bufferPtr );
+
+    if(info.loaded)
+    {
+        info.bufferPolicy->destroy(*bufferPtr);
+    }
+
+    info.clear();
+    info.lastAccess.modified();
+    m_updatedSig->asyncEmit();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::swapBuffer(BufferManager::BufferPtrType bufA,
+                                                       BufferManager::BufferPtrType bufB)
+{
+    return m_worker->postTask<void>( ::boost::bind(&BufferManager::swapBufferImpl, this, bufA, bufB) );
+}
+
+void BufferManager::swapBufferImpl(BufferManager::BufferPtrType bufA, BufferManager::BufferPtrType bufB)
+{
+    BufferInfo & infoA = m_bufferInfos[bufA];
+    BufferInfo & infoB = m_bufferInfos[bufB];
+
+    std::swap(*bufA, *bufB);
+    std::swap(infoA.size, infoB.size);
+    std::swap(infoA.loaded, infoB.loaded);
+    std::swap(infoA.fsFile, infoB.fsFile);
+    std::swap(infoA.bufferPolicy, infoB.bufferPolicy);
+    std::swap(infoA.istreamFactory, infoB.istreamFactory);
+    std::swap(infoA.userStreamFactory, infoB.userStreamFactory);
+    infoA.lastAccess.modified();
+    infoB.lastAccess.modified();
+}
+
+//-----------------------------------------------------------------------------
+
+struct AutoUnlock
+{
+    AutoUnlock(const BufferManager::sptr &manager, BufferManager::ConstBufferPtrType bufferPtr, const BufferInfo &info):
+        m_manager(manager), m_bufferPtr(bufferPtr)
+    {
+        if ( !info.loaded )
+        {
+            bool restored = manager->restoreBuffer( bufferPtr ).get();
+            OSLM_ASSERT( "restore not OK ( "<< restored << " && " << *bufferPtr <<" != 0 ).",
+                         restored && *bufferPtr != 0 );
+            FwCoreNotUsedMacro(restored);
+        }
+    }
+
+    ~AutoUnlock()
+    {
+        try
+        {
+            m_manager->unlockBuffer(m_bufferPtr);
+        }
+        catch(std::exception& e)
+        {
+            OSLM_ASSERT( "Unlock Failed" << e.what(), 0 );
+        }
+        catch(...)
+        {
+            OSLM_ASSERT( "Unlock Failed", 0 );
+        }
+    }
+
+    BufferManager::sptr m_manager;
+    BufferManager::ConstBufferPtrType m_bufferPtr;
+};
+
+::boost::shared_future<SPTR(void)> BufferManager::lockBuffer(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    return m_worker->postTask<SPTR(void)>( ::boost::bind(&BufferManager::lockBufferImpl, this, bufferPtr) );
+}
+
+SPTR(void) BufferManager::lockBufferImpl(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    BufferManager::BufferPtrType castedBuffer = const_cast< BufferManager::BufferPtrType >(bufferPtr);
+    BufferInfo & info = m_bufferInfos[castedBuffer];
+
+    m_dumpPolicy->lockRequest( info, castedBuffer );
+
+    SPTR(void) counter = info.lockCounter.lock();
+    if ( !counter )
+    {
+        counter = ::boost::make_shared< AutoUnlock >( this->getSptr(), bufferPtr, info);
+        info.lockCounter = counter;
+    }
+
+    m_lastAccess.modified();
+
+    m_updatedSig->asyncEmit();
+
+    return counter;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<bool> BufferManager::unlockBuffer(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    return m_worker->postTask<bool>( ::boost::bind(&BufferManager::unlockBufferImpl, this, bufferPtr) );
+}
+
+bool BufferManager::unlockBufferImpl(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    BufferInfo & info = m_bufferInfos[bufferPtr];
+    m_dumpPolicy->unlockRequest( info, bufferPtr );
+
+    m_updatedSig->asyncEmit();
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<bool> BufferManager::dumpBuffer(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    return m_worker->postTask<bool>( ::boost::bind(&BufferManager::dumpBufferImpl, this, bufferPtr) );
+}
+
+bool BufferManager::dumpBufferImpl(BufferManager::ConstBufferPtrType bufferPtr)
+{
+    BufferManager::BufferPtrType castedBuffer = const_cast< BufferManager::BufferPtrType >(bufferPtr);
+    BufferInfo & info = m_bufferInfos[castedBuffer];
+    return this->dumpBuffer(info, castedBuffer);
+}
+
+//-----------------------------------------------------------------------------
+
+bool BufferManager::dumpBuffer(BufferInfo & info, BufferManager::BufferPtrType bufferPtr)
+{
+    if ( !info.loaded || info.lockCount() > 0 || info.size == 0 )
+    {
+        return false;
+    }
+
+    ::boost::filesystem::path tmp = ::fwTools::System::getTemporaryFolder();
+    ::boost::filesystem::path dumpedFile = ::boost::filesystem::unique_path( tmp/"fwMemory-%%%%-%%%%-%%%%-%%%%.raw" );
+
+    OSLM_TRACE("dumping " << bufferPtr << " " << dumpedFile);
+    info.lockCounter.reset();
+
+    if ( this->writeBufferImpl(*bufferPtr, info.size, dumpedFile) )
+    {
+        info.fsFile = ::fwMemory::FileHolder(dumpedFile, true);
+        info.fileFormat = ::fwMemory::RAW;
+        info.istreamFactory = ::boost::make_shared< ::fwMemory::stream::in::Raw >(info.fsFile);
+        info.userStreamFactory = false;
+        info.bufferPolicy->destroy(*bufferPtr);
+        *bufferPtr = NULL;
+        info.loaded = false;
+
+        m_dumpPolicy->dumpSuccess( info, bufferPtr );
+
+        m_updatedSig->asyncEmit();
+    }
+
+    return !info.loaded;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<bool> BufferManager::restoreBuffer(BufferManager::ConstBufferPtrType  bufferPtr)
+{
+    return m_worker->postTask<bool>( ::boost::bind(&BufferManager::restoreBufferImpl, this, bufferPtr) );
+}
+
+bool BufferManager::restoreBufferImpl(BufferManager::ConstBufferPtrType  bufferPtr)
+{
+    BufferManager::BufferPtrType castedBuffer = const_cast< BufferManager::BufferPtrType >(bufferPtr);
+    BufferInfo & info = m_bufferInfos[castedBuffer];
+    return this->restoreBuffer(info, castedBuffer);
+}
+
+
+//-----------------------------------------------------------------------------
+
+bool BufferManager::restoreBuffer(BufferInfo & info,
+                                  BufferManager::BufferPtrType bufferPtr, BufferManager::SizeType allocSize)
+{
+
+    allocSize = ((allocSize) ? allocSize : info.size);
+    if ( !info.loaded )
+    {
+        OSLM_TRACE("Restoring " << bufferPtr);
+
+        info.bufferPolicy->allocate(*bufferPtr, allocSize);
+
+        char * charBuf = static_cast< char * >(*bufferPtr);
+        SizeType size = std::min(allocSize, info.size);
+        bool notFailed = false;
+        {
+            SPTR(std::istream) isptr = (*info.istreamFactory)();
+            std::istream &is = *isptr;
+            SizeType read = is.read(charBuf, size).gcount();
+
+            FW_RAISE_IF(" Bad file size, expected: " << size << ", was: " << read, size - read != 0);
+            notFailed = !is.fail();
+        }
+
+        if ( notFailed )
+        {
+            info.loaded = true;
+            info.fsFile.clear();
+            info.lastAccess.modified();
+
+            m_dumpPolicy->restoreSuccess( info, bufferPtr );
+
+            info.fileFormat = ::fwMemory::OTHER;
+            info.istreamFactory
+                = ::boost::make_shared< ::fwMemory::stream::in::Buffer >(*bufferPtr,
+                                                                allocSize,
+                                                                ::boost::bind(&getLock, this->getSptr(), bufferPtr));
+            info.userStreamFactory = false;
+            m_updatedSig->asyncEmit();
+            return true;
+        }
+
+    }
+    return false;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<bool> BufferManager::writeBuffer(BufferManager::ConstBufferType buffer,
+        SizeType size, ::boost::filesystem::path &path)
+{
+    return m_worker->postTask<bool>( ::boost::bind(&BufferManager::writeBufferImpl, this, buffer, size, path) );
+}
+
+bool BufferManager::writeBufferImpl(BufferManager::ConstBufferType buffer,
+        SizeType size, ::boost::filesystem::path &path)
+{
+    ::boost::filesystem::ofstream fs(path, std::ios::binary|std::ios::trunc);
+    FW_RAISE_IF("Memory management : Unable to open " << path, !fs.good());
+    const char * charBuf = static_cast< const char * >(buffer);
+    OSLM_TRACE("writing " << path);
+    fs.write(charBuf, size);
+    fs.close();
+    return !fs.bad();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<bool> BufferManager::readBuffer(BufferManager::BufferType buffer, SizeType size,
+        ::boost::filesystem::path &path)
+{
+    return m_worker->postTask<bool>( ::boost::bind(&BufferManager::readBufferImpl, this, buffer, size, path) );
+}
+
+bool BufferManager::readBufferImpl(BufferManager::BufferType buffer, SizeType size, ::boost::filesystem::path &path)
+{
+    ::boost::filesystem::ifstream fs(path, std::ios::in|std::ios::binary|std::ios::ate);
+    FW_RAISE_IF("Unable to read " << path, !fs.good());
+
+    std::streampos fileSize = fs.tellg();
+    fs.seekg(0, std::ios::beg);
+
+    FW_RAISE_IF(path << ": Bad file size, expected: " << size << ", was: " << fileSize,
+            size - fileSize != 0);
+
+    OSLM_TRACE("reading " << path);
+    char * charBuf = static_cast< char * >(buffer);
+    fs.read(charBuf, size);
+
+    fs.close();
+    return !fs.bad();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<std::string> BufferManager::toString() const
+{
+    return m_worker->postTask<std::string>( ::boost::bind(&BufferManager::toStringImpl, this ) );
+}
+
+std::string BufferManager::toStringImpl() const
+{
+    std::stringstream sstr ("");
+    sstr << "nb Elem = " << m_bufferInfos.size() << std::endl;
+    sstr    << std::setw(18) << "Buffer" << "->" << std::setw(18) << "Address" << " "
+            << std::setw(10) << "Size" << " "
+            << std::setw(18) << "Policy" << " "
+            << std::setw(6) << "Access" << " "
+            << std::setw(4) << "Lock" << " "
+            << "DumpStatus" << " "
+            << "File" << " "
+            << std::endl;
+    BOOST_FOREACH( BufferInfoMapType::value_type item, m_bufferInfos )
+    {
+        BufferInfo & info = item.second;
+        sstr    << std::setw(18) << item.first << "->" << std::setw(18) << *(item.first) << " "
+                << std::setw(10) << info.size << " "
+                << std::setw(18) << info.bufferPolicy << " "
+                << std::setw(6) << info.lastAccess << " "
+                << std::setw(4) << info.lockCount() << " "
+                << ((info.loaded)?"   ":"not") << " loaded "
+                << ::boost::filesystem::path(info.fsFile) << " "
+                << std::endl;
+    }
+    return sstr.str();
+}
+
+//-----------------------------------------------------------------------------
+
+void BufferManager::setDumpPolicy( const ::fwMemory::IPolicy::sptr &policy )
+{
+    m_dumpPolicy = policy;
+    policy->refresh();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwMemory::IPolicy::sptr BufferManager::getDumpPolicy() const
+{
+    return m_dumpPolicy;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<BufferManager::BufferInfoMapType> BufferManager::getBufferInfos() const
+{
+    return m_worker->postTask<BufferInfoMapType>( ::boost::bind(&BufferManager::getBufferInfosImpl, this) );
+}
+
+BufferManager::BufferInfoMapType BufferManager::getBufferInfosImpl() const
+{
+    return m_bufferInfos;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<BufferManager::BufferStats> BufferManager::getBufferStats() const
+{
+    return m_worker->postTask<BufferManager::BufferStats>(
+            ::boost::bind(&BufferManager::computeBufferStats, m_bufferInfos) );
+}
+
+BufferManager::BufferStats BufferManager::computeBufferStats(const BufferInfoMapType& bufferInfo)
+{
+    BufferStats stats = {0,0};
+    BOOST_FOREACH( const BufferInfoMapType::value_type &item, bufferInfo )
+    {
+        const BufferInfo & info = item.second;
+        if ( !info.loaded )
+        {
+            stats.totalDumped += info.size;
+        }
+        stats.totalManaged += info.size;
+    }
+    return stats;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<void> BufferManager::setIStreamFactory(BufferPtrType bufferPtr,
+                                      const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                                      SizeType size,
+                                      ::fwMemory::FileHolder fsFile,
+                                      ::fwMemory::FileFormatType format,
+                                      const ::fwMemory::BufferAllocationPolicy::sptr &policy
+                                     )
+{
+    return m_worker->postTask<void>(
+        ::boost::bind(&BufferManager::setIStreamFactoryImpl, this, bufferPtr, factory, size, fsFile, format, policy) );
+}
+
+void BufferManager::setIStreamFactoryImpl(BufferPtrType bufferPtr,
+                                      const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                                      SizeType size,
+                                      ::fwMemory::FileHolder fsFile,
+                                      ::fwMemory::FileFormatType format,
+                                      const ::fwMemory::BufferAllocationPolicy::sptr &policy
+                                     )
+{
+    BufferInfoMapType::iterator iterInfo = m_bufferInfos.find(bufferPtr);
+    FW_RAISE_IF("Buffer is not managed by fwMemory::BufferManager.", iterInfo == m_bufferInfos.end() );
+    BufferInfo & info = iterInfo->second;
+
+    SLM_ASSERT("Buffer is already set", *bufferPtr == NULL && info.loaded);
+
+    info.istreamFactory = factory;
+    info.userStreamFactory = true;
+    info.size = size;
+    info.fsFile = fsFile;
+    info.fileFormat = format;
+    info.bufferPolicy = policy;
+    info.loaded = false;
+
+    switch(m_loadingMode)
+    {
+    case BufferManager::DIRECT:
+        this->restoreBuffer(bufferPtr);
+        break;
+    case BufferManager::LAZY :
+        m_dumpPolicy->dumpSuccess( info, bufferPtr );
+        m_updatedSig->asyncEmit();
+        break;
+    default:
+        SLM_ASSERT("You shall not pass", 0);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_future<BufferManager::StreamInfo>
+    BufferManager::getStreamInfo(const BufferManager::ConstBufferPtrType bufferPtr) const
+{
+    return m_worker->postTask<BufferManager::StreamInfo>(
+            ::boost::bind(&BufferManager::getStreamInfoImpl, this, bufferPtr) );
+}
+
+BufferManager::StreamInfo BufferManager::getStreamInfoImpl(const BufferManager::ConstBufferPtrType bufferPtr) const
+{
+    StreamInfo streamInfo;
+    BufferInfoMapType::const_iterator iterInfo = m_bufferInfos.find(bufferPtr);
+    FW_RAISE_IF("Buffer is not managed by fwMemory::BufferManager.", iterInfo == m_bufferInfos.end() );
+    const BufferInfo & info = iterInfo->second;
+    streamInfo.size = info.size;
+    streamInfo.fsFile = info.fsFile;
+    streamInfo.format = info.fileFormat;
+    streamInfo.userStream = info.userStreamFactory;
+
+    if(info.istreamFactory)
+    {
+        streamInfo.stream = (*info.istreamFactory)();
+    }
+
+    return streamInfo;
+}
+
+//-----------------------------------------------------------------------------
+
+BufferManager::LoadingModeType BufferManager::getLoadingMode() const
+{
+    return m_loadingMode;
+}
+
+void BufferManager::setLoadingMode(LoadingModeType mode)
+{
+    m_loadingMode = mode;
+}
+
+} //namespace fwMemory
+
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/BufferObject.cpp b/SrcLib/core/fwMemory/src/fwMemory/BufferObject.cpp
new file mode 100644
index 0000000..bdce408
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/BufferObject.cpp
@@ -0,0 +1,124 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/BufferObject.hpp"
+
+fwCampImplementMacro((fwMemory)(BufferObject))
+{
+    builder.tag("buffer")
+           .function("classname", &::fwMemory::BufferObject::className)
+           .function("is_a", (bool (::fwMemory::BufferObject::*)(const std::string &) const) &::fwMemory::BufferObject::isA);
+}
+
+namespace fwMemory
+{
+
+
+
+BufferObject::BufferObject():
+    m_buffer(0),
+    m_size(0),
+    m_bufferManager(::fwMemory::BufferManager::getDefault()),
+    m_allocPolicy(::fwMemory::BufferNoAllocPolicy::New())
+{
+    m_bufferManager->registerBuffer(&m_buffer).get();
+}
+
+//------------------------------------------------------------------------------
+
+BufferObject::~BufferObject()
+{
+    OSLM_ASSERT("There is still " << m_count.use_count() << " locks on this BufferObject (" << this << ")",
+                m_count.expired());
+    m_bufferManager->unregisterBuffer(&m_buffer).get();
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::allocate(SizeType size, const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    m_bufferManager->allocateBuffer(&m_buffer, size, policy).get();
+    m_allocPolicy = policy;
+    m_size = size;
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::reallocate(SizeType size)
+{
+    m_bufferManager->reallocateBuffer(&m_buffer, size).get();
+    m_size = size;
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::destroy()
+{
+    m_bufferManager->destroyBuffer(&m_buffer).get();
+    m_allocPolicy = ::fwMemory::BufferNoAllocPolicy::New();
+    m_size = 0;
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::setBuffer(::fwMemory::BufferManager::BufferType buffer, SizeType size,
+                             const ::fwMemory::BufferAllocationPolicy::sptr &policy)
+{
+    m_bufferManager->setBuffer(&m_buffer, buffer, size, policy).get();
+    m_allocPolicy = policy;
+    m_size   = size;
+}
+
+//------------------------------------------------------------------------------
+
+BufferObject::Lock BufferObject::lock()
+{
+    return BufferObject::Lock(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+BufferObject::ConstLock BufferObject::lock() const
+{
+    return BufferObject::ConstLock(this->getConstSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::swap( const BufferObject::sptr &_source )
+{
+    m_bufferManager->swapBuffer(&m_buffer, &(_source->m_buffer)).get();
+
+    std::swap(m_size, _source->m_size);
+    m_bufferManager.swap(_source->m_bufferManager);
+    m_allocPolicy.swap(_source->m_allocPolicy);
+}
+
+//------------------------------------------------------------------------------
+
+BufferManager::StreamInfo BufferObject::getStreamInfo() const
+{
+    return m_bufferManager->getStreamInfo(&m_buffer).get();
+}
+
+//------------------------------------------------------------------------------
+
+void BufferObject::setIStreamFactory(const SPTR(::fwMemory::stream::in::IFactory) &factory,
+                        SizeType size,
+                        const ::boost::filesystem::path &sourceFile,
+                        ::fwMemory::FileFormatType format,
+                        const ::fwMemory::BufferAllocationPolicy::sptr &policy
+                        )
+{
+    m_size = size;
+    m_allocPolicy = policy;
+    m_bufferManager->setIStreamFactory(&m_buffer, factory, size, sourceFile, format, policy).get();
+}
+
+
+} //namespace fwMemory
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/ByteSize.cpp b/SrcLib/core/fwMemory/src/fwMemory/ByteSize.cpp
new file mode 100644
index 0000000..f29cef1
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/ByteSize.cpp
@@ -0,0 +1,311 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <boost/spirit/include/qi.hpp>
+#include <boost/spirit/include/phoenix_operator.hpp>
+
+#include "fwMemory/exception/BadCast.hpp"
+#include "fwMemory/ByteSize.hpp"
+
+namespace fwMemory
+{
+
+
+const ::boost::uint64_t ByteSize::Bytes = 1 ;
+
+// SI units
+const ::boost::uint64_t ByteSize::KB = 1000LL ;
+const ::boost::uint64_t ByteSize::MB = 1000000LL;
+const ::boost::uint64_t ByteSize::GB = 1000000000LL;
+const ::boost::uint64_t ByteSize::TB = 1000000000000LL;
+const ::boost::uint64_t ByteSize::PB = 1000000000000000LL;
+
+// IEC units
+const ::boost::uint64_t ByteSize::KiB = 1LL << 10;
+const ::boost::uint64_t ByteSize::MiB = 1LL << 20;
+const ::boost::uint64_t ByteSize::GiB = 1LL << 30;
+const ::boost::uint64_t ByteSize::TiB = 1LL << 40;
+const ::boost::uint64_t ByteSize::PiB = 1LL << 50;
+
+
+
+ByteSize::ByteSize () : m_size(0)
+{
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize::ByteSize ( SizeType size, UnitType unit ) : m_size(0)
+{
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    this->setSize(size, unit);
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize::ByteSize ( double size, UnitType unit ) : m_size(0)
+{
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    if(size < 0)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::BadCast , "Bad size : " << size << " < 0");
+    }
+    this->setSize(size, unit);
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize::ByteSize ( const std::string &size )
+{
+    this->setSize(size);
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize& ByteSize::operator= ( SizeType size )
+{
+    this->setSize(size);
+    return *this;
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize& ByteSize::operator= ( double size )
+{
+    if(size < 0)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::BadCast , "Bad size : " << size << " < 0");
+    }
+
+    this->setSize(size);
+    return *this;
+}
+
+//------------------------------------------------------------------------------
+
+ByteSize& ByteSize::operator= ( const std::string &size )
+{
+    this->setSize(size);
+    return *this;
+}
+
+//------------------------------------------------------------------------------
+
+void ByteSize::setSize ( SizeType size, UnitType unit )
+{
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    m_size = size*unit;
+}
+
+//------------------------------------------------------------------------------
+
+void ByteSize::setSize ( double size, UnitType unit )
+{
+    if(size < 0)
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::BadCast , "Bad size : " << size << " < 0");
+    }
+
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    m_size = static_cast<SizeType>(size*unit);
+}
+
+//------------------------------------------------------------------------------
+
+void ByteSize::setSize ( const std::string &size )
+{
+    SizeType newSize = 0;
+    bool r = parseSize(size, newSize);
+    if(r)
+    {
+        m_size = newSize;
+    }
+    else
+    {
+        FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::BadCast , "Bad size : " << size );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string ByteSize::unitToString(ByteSize::UnitType unit)
+{
+    switch ( unit )
+    {
+        case Bytes :
+            return "Bytes";
+        case KB :
+            return "KB";
+        case GB :
+            return "GB";
+        case MB :
+            return "MB";
+        case TB :
+            return "TB";
+        case KiB :
+            return "KiB";
+        case GiB :
+            return "GiB";
+        case MiB :
+            return "MiB";
+        case TiB :
+            return "TiB";
+    }
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    return "?";
+}
+
+//------------------------------------------------------------------------------
+
+
+bool ByteSize::parseSize(const std::string &s, SizeType& size)
+{
+    using ::boost::phoenix::ref;
+    using ::boost::spirit::ascii::no_case;
+    using ::boost::spirit::ascii::space;
+    using ::boost::spirit::qi::as;
+    using ::boost::spirit::qi::_1;
+    using ::boost::spirit::qi::double_;
+    using ::boost::spirit::qi::eoi;
+    using ::boost::spirit::qi::phrase_parse;
+    using ::boost::spirit::qi::symbols;
+    using ::boost::spirit::qi::ulong_long;
+
+    std::string::const_iterator first = s.begin();
+    std::string::const_iterator last  = s.end();
+
+    ByteSize::SizeType intSize = 0;
+    double floatSize = 0;
+    ByteSize::SizeType multiplier = ByteSize::Bytes;
+
+    symbols<char, ByteSize::SizeType> unit;
+
+    unit.add
+        ( "b"    , ByteSize::Bytes ) ( "byte", ByteSize::Bytes ) ( "bytes", ByteSize::Bytes )
+        ( "kb"   , ByteSize::KB  )
+        ( "mb"   , ByteSize::MB  )
+        ( "gb"   , ByteSize::GB  )
+        ( "tb"   , ByteSize::TB  )
+        ( "pb"   , ByteSize::PB  )
+        ( "k"  , ByteSize::KiB ) ( "kib"  , ByteSize::KiB )
+        ( "m"  , ByteSize::MiB ) ( "mib"  , ByteSize::MiB )
+        ( "g"  , ByteSize::GiB ) ( "gib"  , ByteSize::GiB )
+        ( "t"  , ByteSize::TiB ) ( "tib"  , ByteSize::TiB )
+        ( "p"  , ByteSize::PiB ) ( "pib"  , ByteSize::PiB )
+        ;
+
+
+    bool r = false;
+    r = phrase_parse(first, last,
+                     //  Begin grammar
+                     (
+                      ( *space >>
+                       ( &((double_) >> no_case[-unit] >> *space >> eoi)
+                         >> double_[ ref(floatSize) = _1 ] >> no_case[-unit[ ref(multiplier) = _1 ]] )
+                       | ( &((ulong_long) >> no_case[-unit]  >> *space >> eoi)
+                           >> ulong_long[ ref(intSize) = _1 ] >> no_case[-unit[ ref(multiplier) = _1 ]] )
+                      )
+                      >> *space >> eoi
+                     ),
+                     //  End grammar
+
+                     space);
+
+
+    if (!r || first != last) // fail if we did not get a full match
+    {
+        return false;
+    }
+
+    if (intSize != 0)
+    {
+        size = intSize * multiplier;
+    }
+    else if (floatSize != 0)
+    {
+        if(floatSize < 0)
+        {
+            FW_RAISE_EXCEPTION_MSG( ::fwMemory::exception::BadCast , "Bad size : " << floatSize << " < 0");
+        }
+
+        size = static_cast< ByteSize::SizeType >(floatSize * multiplier);
+    }
+    else
+    {
+        return false;
+    }
+    return r;
+}
+
+//------------------------------------------------------------------------------
+
+std::string ByteSize::getSizeAsString( UnitType unit )
+{
+    SLM_ASSERT("Bad Unit",
+               (unit == Bytes) || (unit == KB) || (unit == MB) || (unit == GB) || (unit == TB)  || (unit == PB)
+               || (unit == KiB) || (unit == MiB) || (unit == GiB) || (unit == TiB) || (unit == PiB));
+    std::stringstream sstr;
+    sstr << std::noshowpoint ;
+
+    if(unit == Bytes)
+    {
+        sstr << m_size;
+    }
+    else
+    {
+        sstr << (static_cast<double>(m_size) / unit);
+    }
+    sstr << " " << unitToString(unit);
+
+    return sstr.str();
+}
+
+//------------------------------------------------------------------------------
+
+std::string ByteSize::getHumanReadableSize( StandardType standard )
+{
+    static UnitType si []  = {Bytes, KB,  MB,  GB,  TB,  PB};
+    static UnitType iec [] = {Bytes, KiB, MiB, GiB, TiB, PiB};
+    const size_t sizeOfStandardSet = 5;
+
+    UnitType *unitSet = iec;
+    if( standard == SI)
+    {
+        unitSet = si;
+    }
+
+    size_t i ;
+    for ( i = 1 ; i < sizeOfStandardSet ; ++i )
+    {
+        if (m_size < unitSet[i])
+        {
+            break;
+        }
+    }
+
+    return getSizeAsString(unitSet[i-1]);
+
+}
+//------------------------------------------------------------------------------
+
+
+
+
+} //namespace fwMemory
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/FileHolder.cpp b/SrcLib/core/fwMemory/src/fwMemory/FileHolder.cpp
new file mode 100644
index 0000000..4720729
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/FileHolder.cpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/spyLog.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include "fwMemory/FileHolder.hpp"
+
+namespace fwMemory
+{
+
+struct FileAutoDelete
+{
+    FileAutoDelete(const ::boost::filesystem::path &file) : m_path(file)
+    { }
+
+    ~FileAutoDelete()
+    {
+        if(!m_path.empty() && ::boost::filesystem::is_regular_file(m_path))
+        {
+            ::boost::system::error_code ec;
+            ::boost::filesystem::remove(m_path, ec);
+            OSLM_ERROR_IF("file remove failed : " << ec.message(), ec.value()!=0);
+        }
+    }
+
+    ::boost::filesystem::path m_path;
+};
+
+
+//-----------------------------------------------------------------------------
+
+FileHolder::FileHolder(const ::boost::filesystem::path &file, bool autodelete):
+    m_path(file)
+{
+    if (autodelete)
+    {
+        m_autoDelete = ::boost::make_shared< FileAutoDelete >( file );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/camp/declare.cpp b/SrcLib/core/fwMemory/src/fwMemory/camp/declare.cpp
new file mode 100644
index 0000000..9b20a6e
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/camp/declare.cpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/camp/declare.hpp"
+
+
+namespace fwMemory
+{
+namespace camp
+{
+
+runner runner::r;
+}
+}
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/AlwaysDump.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/AlwaysDump.cpp
new file mode 100644
index 0000000..f0ffb07
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/AlwaysDump.cpp
@@ -0,0 +1,156 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include "fwMemory/policy/registry/macros.hpp"
+#include "fwMemory/policy/BarrierDump.hpp"
+#include "fwMemory/policy/AlwaysDump.hpp"
+
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+fwMemoryPolicyRegisterMacro(::fwMemory::policy::AlwaysDump);
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::allocationRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::setRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::reallocateRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType newSize )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(newSize);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+size_t AlwaysDump::dump()
+{
+    size_t dumped = 0;
+
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    if(manager)
+    {
+        const ::fwMemory::BufferManager::BufferInfoMapType bufferInfos = manager->getBufferInfos().get();
+
+        BOOST_FOREACH(const ::fwMemory::BufferManager::BufferInfoMapType::value_type &elt, bufferInfos)
+        {
+            const ::fwMemory::BufferInfo &info = elt.second;
+            if( ! ( info.size == 0 || info.lockCount() > 0 || !info.loaded )  )
+            {
+                if( manager->dumpBuffer(elt.first).get() )
+                {
+                    dumped += elt.second.size;
+                }
+            }
+        }
+    }
+
+    return dumped;
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::apply()
+{
+    this->dump();
+}
+
+//------------------------------------------------------------------------------
+
+void AlwaysDump::refresh()
+{
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+std::string AlwaysDump::getParam(const std::string &name, bool *ok  ) const
+{
+    FwCoreNotUsedMacro(name);
+    if (ok)
+    {
+        *ok = false;
+    }
+    return "";
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace policy
+
+} //namespace fwMemory
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/BarrierDump.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/BarrierDump.cpp
new file mode 100644
index 0000000..963f7c4
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/BarrierDump.cpp
@@ -0,0 +1,258 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign.hpp>
+#include <boost/foreach.hpp>
+
+#include "fwMemory/exception/BadCast.hpp"
+#include "fwMemory/ByteSize.hpp"
+#include "fwMemory/policy/registry/macros.hpp"
+#include "fwMemory/policy/BarrierDump.hpp"
+
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+fwMemoryPolicyRegisterMacro(::fwMemory::policy::BarrierDump);
+
+//------------------------------------------------------------------------------
+
+BarrierDump::BarrierDump() :
+    m_totalAllocated(0),
+    m_totalDumped(0),
+    m_barrier(1024*1024*500)
+{
+
+}
+
+//------------------------------------------------------------------------------
+
+void BarrierDump::allocationRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    m_totalAllocated -= info.size;
+    m_totalAllocated += size;
+    if(!info.loaded)
+    {
+        m_totalDumped -= info.size;
+    }
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+
+void BarrierDump::setRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    m_totalAllocated -= info.size;
+    m_totalAllocated += size;
+    if(!info.loaded)
+    {
+        m_totalDumped -= info.size;
+    }
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+
+void BarrierDump::reallocateRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType newSize )
+{
+    m_totalAllocated -= info.size;
+    m_totalAllocated += newSize;
+    if(!info.loaded)
+    {
+        m_totalDumped -= info.size;
+    }
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+
+void BarrierDump::destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    if(!info.loaded)
+    {
+        m_totalDumped -= info.size;
+    }
+    m_totalAllocated -= info.size;
+}
+
+//------------------------------------------------------------------------------
+
+
+void BarrierDump::lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+}
+
+//------------------------------------------------------------------------------
+
+
+void BarrierDump::unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void BarrierDump::dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    m_totalDumped += info.size;
+}
+
+//------------------------------------------------------------------------------
+
+void BarrierDump::restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    m_totalDumped -= info.size;
+}
+
+//------------------------------------------------------------------------------
+
+size_t BarrierDump::getTotalAlive() const
+{
+    SLM_ASSERT("More dumped data than allocated data." , m_totalAllocated >= m_totalDumped);
+    size_t totalAlive = m_totalAllocated - m_totalDumped;
+    return totalAlive;
+}
+
+//------------------------------------------------------------------------------
+
+bool BarrierDump::isBarrierCrossed() const
+{
+    return m_barrier < getTotalAlive();
+}
+
+//------------------------------------------------------------------------------
+
+size_t BarrierDump::dump(size_t nbOfBytes)
+{
+    size_t dumped = 0;
+
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    if(manager)
+    {
+        const ::fwMemory::BufferManager::BufferInfoMapType bufferInfos = manager->getBufferInfos().get();
+
+        typedef std::pair<
+            ::fwMemory::BufferManager::BufferInfoMapType::key_type,
+            ::fwMemory::BufferManager::BufferInfoMapType::mapped_type
+                > BufferInfosPairType;
+        typedef std::vector< BufferInfosPairType > BufferVectorType;
+
+        BufferVectorType buffers;
+
+        BOOST_FOREACH(const ::fwMemory::BufferManager::BufferInfoMapType::value_type &elt, bufferInfos)
+        {
+            const ::fwMemory::BufferInfo &info = elt.second;
+            if( ! ( info.size == 0 || info.lockCount() > 0 || !info.loaded )  )
+            {
+                buffers.push_back(elt);
+            }
+        }
+
+
+        BOOST_FOREACH(const BufferVectorType::value_type &pair, bufferInfos)
+        {
+            if(dumped < nbOfBytes)
+            {
+                if( manager->dumpBuffer(pair.first).get() )
+                {
+                    dumped += pair.second.size;
+                }
+            }
+            else
+            {
+                break;
+            }
+        }
+    }
+
+    return dumped;
+}
+
+//------------------------------------------------------------------------------
+
+void BarrierDump::apply()
+{
+    if(this->isBarrierCrossed())
+    {
+        this->dump(this->getTotalAlive() - m_barrier);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void BarrierDump::refresh()
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    ::fwMemory::BufferManager::BufferStats stats = manager->getBufferStats().get();
+    m_totalAllocated = stats.totalManaged;
+    m_totalDumped = stats.totalDumped;
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+bool BarrierDump::setParam(const std::string &name, const std::string &value)
+{
+    try
+    {
+        if(name == "barrier")
+        {
+            m_barrier = ::fwMemory::ByteSize(value).getSize();
+            return true;
+        }
+    }
+    catch( ::fwMemory::exception::BadCast const& )
+    {
+        OSLM_ERROR("Bad value for " << name << " : " << value);
+        return false;
+    }
+
+    OSLM_ERROR("Bad parameter name " << name );
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+const ::fwMemory::IPolicy::ParamNamesType &BarrierDump::getParamNames() const
+{
+    static const ::fwMemory::IPolicy::ParamNamesType params = ::boost::assign::list_of("barrier");
+    return params;
+}
+
+//------------------------------------------------------------------------------
+
+std::string BarrierDump::getParam(const std::string &name, bool *ok ) const
+{
+    bool isOk = false;
+    std::string value;
+    if(name == "barrier")
+    {
+        value = std::string(::fwMemory::ByteSize( ::fwMemory::ByteSize::SizeType(m_barrier) ));
+        isOk = true;
+    }
+    if (ok)
+    {
+        *ok = isOk;
+    }
+    return value;
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} // namespace policy
+
+} //namespace fwMemory
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/NeverDump.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/NeverDump.cpp
new file mode 100644
index 0000000..14e3802
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/NeverDump.cpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwMemory/policy/registry/macros.hpp"
+#include "fwMemory/policy/NeverDump.hpp"
+
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+fwMemoryPolicyRegisterMacro(::fwMemory::policy::NeverDump);
+
+//------------------------------------------------------------------------------
+
+void NeverDump::allocationRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+}
+
+//------------------------------------------------------------------------------
+
+
+void NeverDump::setRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+}
+
+//------------------------------------------------------------------------------
+
+
+void NeverDump::reallocateRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType newSize )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(newSize);
+}
+
+//------------------------------------------------------------------------------
+
+
+void NeverDump::destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+
+void NeverDump::lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+
+void NeverDump::unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void NeverDump::dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void NeverDump::restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void NeverDump::refresh()
+{}
+
+//------------------------------------------------------------------------------
+
+std::string NeverDump::getParam(const std::string &name, bool *ok) const
+{
+    FwCoreNotUsedMacro(name);
+    if (ok)
+    {
+        *ok = false;
+    }
+    return "";
+}
+
+//------------------------------------------------------------------------------
+
+
+
+} // namespace policy
+
+} //namespace fwMemory
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/ValveDump.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/ValveDump.cpp
new file mode 100644
index 0000000..0288935
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/ValveDump.cpp
@@ -0,0 +1,253 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/assign.hpp>
+#include <boost/foreach.hpp>
+
+
+#ifdef _WIN32
+#define MEMORYTOOLIMPL Win32MemoryMonitorTools
+#include "fwMemory/tools/Win32MemoryMonitorTools.hpp"
+#elif defined(__MACOSX__)
+#define MEMORYTOOLIMPL DarwinMemoryMonitorTools
+#include "fwMemory/tools/DarwinMemoryMonitorTools.hpp"
+#else
+#define MEMORYTOOLIMPL PosixMemoryMonitorTools
+#include "fwMemory/tools/PosixMemoryMonitorTools.hpp"
+#endif
+
+#include "fwMemory/exception/BadCast.hpp"
+#include "fwMemory/ByteSize.hpp"
+#include "fwMemory/policy/registry/macros.hpp"
+#include "fwMemory/policy/ValveDump.hpp"
+
+
+namespace fwMemory
+{
+
+namespace policy
+{
+
+fwMemoryPolicyRegisterMacro(::fwMemory::policy::ValveDump);
+
+//------------------------------------------------------------------------------
+
+ValveDump::ValveDump() :
+    m_minFreeMem(1024*1024*500LL),
+    m_hysteresisOffset(0)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::allocationRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(buffer);
+    this->apply((size > info.size) ? size - info.size : 0);
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::setRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType size )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    FwCoreNotUsedMacro(size);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::reallocateRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer,
+        BufferInfo::SizeType newSize )
+{
+    FwCoreNotUsedMacro(buffer);
+    this->apply((newSize > info.size) ? newSize - info.size : 0);
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::destroyRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::lockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::unlockRequest( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::dumpSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::restoreSuccess( BufferInfo &info, ::fwMemory::BufferManager::ConstBufferPtrType buffer )
+{
+    FwCoreNotUsedMacro(info);
+    FwCoreNotUsedMacro(buffer);
+}
+
+//------------------------------------------------------------------------------
+
+bool ValveDump::needDump(size_t supplement) const
+{
+    return ::fwMemory::tools::MEMORYTOOLIMPL::getFreeSystemMemory() <= (m_minFreeMem + supplement);
+}
+
+//------------------------------------------------------------------------------
+
+size_t ValveDump::dump(size_t nbOfBytes)
+{
+    size_t dumped = 0;
+
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    if(manager)
+    {
+        const ::fwMemory::BufferManager::BufferInfoMapType bufferInfos = manager->getBufferInfos().get();
+
+        typedef std::pair<
+            fwMemory::BufferManager::BufferInfoMapType::key_type,
+            fwMemory::BufferManager::BufferInfoMapType::mapped_type
+                > BufferInfosPairType;
+        typedef std::vector< BufferInfosPairType > BufferVectorType;
+
+        BufferVectorType buffers;
+
+        BOOST_FOREACH(const ::fwMemory::BufferManager::BufferInfoMapType::value_type &elt, bufferInfos)
+        {
+            const ::fwMemory::BufferInfo &info = elt.second;
+            if( ! ( info.size == 0 || info.lockCount() > 0 || !info.loaded )  )
+            {
+                buffers.push_back(elt);
+            }
+        }
+
+
+        BOOST_FOREACH(const BufferVectorType::value_type &pair, bufferInfos)
+        {
+            if(dumped < nbOfBytes)
+            {
+                if( manager->dumpBuffer(pair.first).get() )
+                {
+                    dumped += pair.second.size;
+                }
+            }
+            else
+            {
+                break;
+            }
+        }
+    }
+
+    return dumped;
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::apply(size_t supplement)
+{
+    if(this->needDump(supplement))
+    {
+        this->dump( (m_minFreeMem + m_hysteresisOffset + supplement) - ::fwMemory::tools::MEMORYTOOLIMPL::getFreeSystemMemory() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ValveDump::refresh()
+{
+    this->apply();
+}
+
+//------------------------------------------------------------------------------
+
+bool ValveDump::setParam(const std::string &name, const std::string &value)
+{
+    OSLM_INFO("Set " << name << " to " << value);
+    try
+    {
+        if(name == "min_free_mem")
+        {
+            m_minFreeMem = ::fwMemory::ByteSize(value).getSize();
+            return true;
+
+        }
+        else if(name == "hysteresis_offet")
+        {
+            m_hysteresisOffset = ::fwMemory::ByteSize(value).getSize();
+            return true;
+        }
+    }
+    catch( ::fwMemory::exception::BadCast const& )
+    {
+        OSLM_ERROR("Bad value for " << name << " : " << value);
+        return false;
+    }
+    OSLM_ERROR("Bad parameter name " << name );
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+const fwMemory::IPolicy::ParamNamesType &ValveDump::getParamNames() const
+{
+    static const fwMemory::IPolicy::ParamNamesType params
+        = ::boost::assign::list_of ("min_free_mem")
+                                   ("hysteresis_offet");
+    return params;
+}
+
+//------------------------------------------------------------------------------
+
+std::string ValveDump::getParam(const std::string &name, bool *ok ) const
+{
+    bool isOk = false;
+    std::string value;
+    if(name == "min_free_mem")
+    {
+        value = std::string(::fwMemory::ByteSize( ::fwMemory::ByteSize::SizeType(m_minFreeMem) ));
+        isOk = true;
+    }
+    else if(name == "hysteresis_offet")
+    {
+        value = std::string(::fwMemory::ByteSize( ::fwMemory::ByteSize::SizeType(m_hysteresisOffset) ));
+        isOk = true;
+    }
+    if (ok)
+    {
+        *ok = isOk;
+    }
+    return value;
+}
+
+//------------------------------------------------------------------------------
+
+
+} // namespace policy
+
+} //namespace fwMemory
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/factory/new.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/factory/new.cpp
new file mode 100644
index 0000000..8ddafa0
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/factory/new.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/IPolicy.hpp"
+#include "fwMemory/policy/factory/new.hpp"
+#include "fwMemory/policy/registry/detail.hpp"
+
+
+namespace fwMemory
+{
+namespace policy
+{
+namespace factory
+{
+
+::fwMemory::IPolicy::sptr New( const ::fwMemory::policy::registry::KeyType & classname )
+{
+    return ::fwMemory::policy::registry::get()->create(classname);
+}
+
+} // namespace factory
+} // namespace policy
+} // namespace fwMemory
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/policy/registry/detail.cpp b/SrcLib/core/fwMemory/src/fwMemory/policy/registry/detail.cpp
new file mode 100644
index 0000000..dd2447e
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/policy/registry/detail.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwMemory/policy/registry/detail.hpp"
+
+
+namespace fwMemory
+{
+namespace policy
+{
+namespace registry
+{
+
+struct FwMemoryPolicyRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwMemoryPolicyRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+} // namespace policy
+} // namespace fwMemory
+
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/stream/in/Buffer.cpp b/SrcLib/core/fwMemory/src/fwMemory/stream/in/Buffer.cpp
new file mode 100644
index 0000000..a388195
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/stream/in/Buffer.cpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+#include <boost/iostreams/device/array.hpp>
+#include <boost/iostreams/stream.hpp>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/spyLog.hpp>
+
+#include "fwMemory/stream/in/Buffer.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+struct HoldCounterStream : ::boost::iostreams::stream< ::boost::iostreams::array_source >
+{
+    HoldCounterStream(char *buf, size_t size, const Buffer::LockType &lock) :
+        ::boost::iostreams::stream< ::boost::iostreams::array_source >(buf, size),
+        m_counter(lock)
+    {
+    }
+
+    Buffer::LockType m_counter;
+};
+
+Buffer::LockType noFactory()
+{
+    return Buffer::LockType();
+}
+
+Buffer::Buffer(void* buf, size_t size) :
+    m_buf(buf), m_size(size), m_counterFactory(&noFactory)
+{
+    OSLM_ASSERT("Buffer is null.", m_buf || size == 0);
+}
+
+Buffer::Buffer(void* buf, size_t size, CounterFactoryType counterFactory) :
+    m_buf(buf), m_size(size), m_counterFactory(counterFactory)
+{
+    OSLM_ASSERT("Buffer is null.", m_buf || size == 0);
+}
+
+SPTR(std::istream) Buffer::get()
+{
+    namespace io = boost::iostreams;
+
+    typedef HoldCounterStream ArrayStreamType;
+    SPTR( ArrayStreamType ) arrayInStream
+        = ::boost::make_shared< ArrayStreamType > ( static_cast<char *>(m_buf), m_size, m_counterFactory() );
+
+    return arrayInStream;
+}
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/stream/in/Raw.cpp b/SrcLib/core/fwMemory/src/fwMemory/stream/in/Raw.cpp
new file mode 100644
index 0000000..0d1e05c
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/stream/in/Raw.cpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/exceptionmacros.hpp>
+
+#include "fwMemory/stream/in/Raw.hpp"
+
+namespace fwMemory
+{
+namespace stream
+{
+namespace in
+{
+
+SPTR(std::istream) Raw::get()
+{
+    FW_RAISE_IF("file "<< m_path.string() << " does not exist anymore or has been moved.",
+                !boost::filesystem::exists(m_path));
+
+    SPTR(::boost::filesystem::ifstream) fs
+        = ::boost::make_shared< ::boost::filesystem::ifstream>(m_path, std::ios::in|std::ios::binary);
+    return fs;
+}
+
+} // namespace in
+} // namespace stream
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/stream/in/RawZ.cpp b/SrcLib/core/fwMemory/src/fwMemory/stream/in/RawZ.cpp
new file mode 100644
index 0000000..4f0173e
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/stream/in/RawZ.cpp
@@ -0,0 +1,54 @@
+// /* ***** BEGIN LICENSE BLOCK *****
+//  * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+//  * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+//  * published by the Free Software Foundation.
+//  * ****** END LICENSE BLOCK ****** */
+//
+// #include <boost/filesystem/path.hpp>
+// #include <boost/filesystem/fstream.hpp>
+// #include <boost/iostreams/filtering_stream.hpp>
+// #include <boost/iostreams/filter/gzip.hpp>
+//
+// #include <boost/make_shared.hpp>
+//
+// #include <fwCore/macros.hpp>
+//
+// #include "fwMemory/stream/in/RawZ.hpp"
+//
+// namespace fwMemory
+// {
+// namespace stream
+// {
+// namespace in
+// {
+//
+// struct FilteringStream : ::boost::iostreams::filtering_istream
+// {
+//
+//     ~FilteringStream()
+//     {
+//         try { this->reset(); } catch (...) { }
+//     }
+//
+//     SPTR(void) heldStream;
+// };
+//
+// SPTR(std::istream) RawZ::get()
+// {
+//     SPTR(::boost::filesystem::ifstream) fs
+//         = ::boost::make_shared< ::boost::filesystem::ifstream>(m_path, std::ios::in|std::ios::binary);
+//
+//     SPTR(FilteringStream) filter = ::boost::make_shared< FilteringStream >();
+//
+//     filter->heldStream = fs;
+//
+//     filter->push(::boost::iostreams::gzip_decompressor());
+//     filter->push(*fs);
+//
+//     return filter;
+// }
+//
+// } // namespace in
+// } // namespace stream
+// } // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/src/fwMemory/tools/DarwinMemoryMonitorTools.cpp b/SrcLib/core/fwMemory/src/fwMemory/tools/DarwinMemoryMonitorTools.cpp
new file mode 100644
index 0000000..b1e57ea
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/tools/DarwinMemoryMonitorTools.cpp
@@ -0,0 +1,190 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef __MACOSX__
+
+#include <assert.h>
+#include <iomanip>
+#include <iostream>
+
+#include <boost/regex.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/tools/DarwinMemoryMonitorTools.hpp"
+
+
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <mach/mach_init.h>
+#include <mach/mach_types.h>
+#include <mach/vm_statistics.h>
+
+namespace fwMemory
+{
+namespace tools
+{
+
+//-----------------------------------------------------------------------------
+
+DarwinMemoryMonitorTools::DarwinMemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+DarwinMemoryMonitorTools::~DarwinMemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t DarwinMemoryMonitorTools::estimateFreeMem()
+{
+    ::boost::uint64_t freeMemory = 0;
+
+    freeMemory = getFreeSystemMemory();
+
+#ifndef __LP64__
+    struct task_basic_info t_info;
+    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+
+    if (KERN_SUCCESS != task_info(mach_task_self(),
+                TASK_BASIC_INFO, (task_info_t)&t_info,
+                &t_info_count))
+    {
+        SLM_ASSERT("Failed to retrieve used process memory information", 0);
+        return 0;
+    }
+
+    // Hard coded 3Gb limit for 32bit process
+    const ::boost::uint64_t maxMemory = 3221225472LL; // 3 Go
+    const ::boost::uint64_t usedProcessMemory = getUsedProcessMemory();
+    freeMemory = std::min( maxMemory - usedProcessMemory, freeMemory);
+    const ::boost::uint64_t maxVMemory = 4294967296LL; // 4 Go
+    freeMemory = std::min( maxVMemory - t_info.virtual_size, freeMemory);
+#endif
+
+    return freeMemory;
+}
+
+//-----------------------------------------------------------------------------
+
+void DarwinMemoryMonitorTools::printProcessMemoryInformation()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DarwinMemoryMonitorTools::printSystemMemoryInformation()
+{}
+
+//-----------------------------------------------------------------------------
+
+void DarwinMemoryMonitorTools::printMemoryInformation()
+{
+    printSystemMemoryInformation();
+    printProcessMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t DarwinMemoryMonitorTools::getTotalSystemMemory()
+{
+    static int64_t physical_memory = 0;
+
+    if (physical_memory == 0)
+    {
+        int mib[2];
+        mib[0] = CTL_HW;
+        mib[1] = HW_MEMSIZE;
+        size_t length = sizeof(int64_t);
+        sysctl(mib, 2, &physical_memory, &length, NULL, 0);
+    }
+
+    return physical_memory;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t DarwinMemoryMonitorTools::getUsedSystemMemory()
+{
+    vm_size_t page_size;
+    mach_port_t mach_port;
+    mach_msg_type_number_t count;
+    vm_statistics_data_t vm_stats;
+
+    mach_port = mach_host_self();
+    count = sizeof(vm_stats) / sizeof(natural_t);
+    if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
+            KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO,
+                (host_info_t)&vm_stats, &count))
+    {
+        uint64_t used_memory = (
+                (int64_t)vm_stats.active_count +
+                (int64_t)vm_stats.wire_count
+                ) *  (int64_t)page_size;
+
+        return used_memory;
+    }
+    SLM_ASSERT("Failed to retrieve used system memory information", 0);
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t DarwinMemoryMonitorTools::getFreeSystemMemory()
+{
+    vm_size_t page_size;
+    mach_port_t mach_port;
+    mach_msg_type_number_t count;
+    vm_statistics_data_t vm_stats;
+
+    mach_port = mach_host_self();
+    count = sizeof(vm_stats) / sizeof(natural_t);
+    if (KERN_SUCCESS == host_page_size(mach_port, &page_size) &&
+            KERN_SUCCESS == host_statistics(mach_port, HOST_VM_INFO,
+                (host_info_t)&vm_stats, &count))
+    {
+        uint64_t freeMemory = (
+                (int64_t)vm_stats.free_count +
+                (int64_t)vm_stats.inactive_count
+                ) * (int64_t)page_size;
+        return freeMemory;
+    }
+    SLM_ASSERT("Failed to retrieve free system memory information", 0);
+    return 0;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t DarwinMemoryMonitorTools::getUsedProcessMemory()
+{
+    struct task_basic_info t_info;
+    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
+
+    if (KERN_SUCCESS != task_info(mach_task_self(),
+                TASK_BASIC_INFO, (task_info_t)&t_info,
+                &t_info_count))
+    {
+        SLM_ASSERT("Failed to retrieve used process memory information", 0);
+        return 0;
+    }
+
+    return t_info.resident_size;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
diff --git a/SrcLib/core/fwMemory/src/fwMemory/tools/MemoryMonitorTools.cpp b/SrcLib/core/fwMemory/src/fwMemory/tools/MemoryMonitorTools.cpp
new file mode 100644
index 0000000..c686456
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/tools/MemoryMonitorTools.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwMemory/tools/MemoryMonitorTools.hpp"
+
+
+#ifdef _WIN32
+#define MEMORYTOOLIMPL Win32MemoryMonitorTools
+#include "fwMemory/tools/Win32MemoryMonitorTools.hpp"
+#elif defined(__MACOSX__)
+#define MEMORYTOOLIMPL DarwinMemoryMonitorTools
+#include "fwMemory/tools/DarwinMemoryMonitorTools.hpp"
+#else
+#define MEMORYTOOLIMPL PosixMemoryMonitorTools
+#include "fwMemory/tools/PosixMemoryMonitorTools.hpp"
+#endif
+
+namespace fwMemory
+{
+namespace tools
+{
+
+//-----------------------------------------------------------------------------
+
+MemoryMonitorTools::MemoryMonitorTools()
+{}
+
+//-----------------------------------------------------------------------------
+
+MemoryMonitorTools::~MemoryMonitorTools()
+{}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t MemoryMonitorTools::estimateFreeMem()
+{
+    return MEMORYTOOLIMPL::estimateFreeMem();
+}
+
+//-----------------------------------------------------------------------------
+
+void MemoryMonitorTools::printProcessMemoryInformation()
+{
+    MEMORYTOOLIMPL::printProcessMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+void MemoryMonitorTools::printSystemMemoryInformation()
+{
+    MEMORYTOOLIMPL::printSystemMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+void MemoryMonitorTools::printMemoryInformation()
+{
+    MEMORYTOOLIMPL::printMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t MemoryMonitorTools::getTotalSystemMemory()
+{
+    return MEMORYTOOLIMPL::getTotalSystemMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t MemoryMonitorTools::getUsedSystemMemory()
+{
+    return MEMORYTOOLIMPL::getUsedSystemMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t MemoryMonitorTools::getFreeSystemMemory()
+{
+    return MEMORYTOOLIMPL::getFreeSystemMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t MemoryMonitorTools::getUsedProcessMemory()
+{
+    return MEMORYTOOLIMPL::getUsedProcessMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace tools
+} // namespace fwMemory
diff --git a/SrcLib/core/fwMemory/src/fwMemory/tools/PosixMemoryMonitorTools.cpp b/SrcLib/core/fwMemory/src/fwMemory/tools/PosixMemoryMonitorTools.cpp
new file mode 100644
index 0000000..61771f8
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/tools/PosixMemoryMonitorTools.cpp
@@ -0,0 +1,488 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef linux
+
+#include <assert.h>
+#include <iomanip>
+#include <iostream>
+
+#include <boost/regex.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/convenience.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/tools/PosixMemoryMonitorTools.hpp"
+
+
+#include <cstdlib>
+#include <cstdio>
+#include <cerrno>
+#include <cctype>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <string>
+#include <fstream>
+#include <sstream>
+
+
+namespace fwMemory
+{
+namespace tools
+{
+
+::boost::uint64_t PosixMemoryMonitorTools::s_pageSize    = sysconf(_SC_PAGE_SIZE);
+::boost::uint64_t PosixMemoryMonitorTools::s_totalMemory = sysconf(_SC_PHYS_PAGES) * s_pageSize;
+
+//-----------------------------------------------------------------------------
+
+PosixMemoryMonitorTools::PosixMemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+PosixMemoryMonitorTools::~PosixMemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::estimateFreeMem()
+{
+    ::boost::uint64_t freeMemory = 0;
+
+//  ::boost::uint64_t systemMemoryAverageInNormalCase = 500 * 1024 * 1024; // 500 Mo
+//  ::boost::uint64_t memoryUsedByProcess = MemoryMonitor::getDefault()->totalUsedSizeInBytes()
+//                                          + 50 * 1024 * 1024; // + 50 Mo of librairies;
+//  freeMemory = ( getTotalSystemMemory() < systemMemoryAverageInNormalCase + memoryUsedByProcess?
+//                 0:
+//                 getTotalSystemMemory() - systemMemoryAverageInNormalCase - memoryUsedByProcess
+//               );
+
+
+    freeMemory = getFreeSystemMemory();
+
+    return freeMemory;
+}
+
+//-----------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::printProcessMemoryInformation()
+{
+    Status stat;
+    getStatusOfPid( getpid(), stat );
+    printStatus(stat);
+}
+
+//-----------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::printSystemMemoryInformation()
+{
+    MemInfo memory;
+    get_memory_stats(memory);
+    ::boost::uint64_t oToKMo = 1024*1024;
+
+    OSLM_INFO("Total memory: " << memory.total/oToKMo<< " Mo");
+    OSLM_INFO("Free memory:  " << memory.free/oToKMo << " Mo");
+    OSLM_INFO("Buffered:     " << memory.buffered/oToKMo << " Mo");
+    OSLM_INFO("Cached:       " << memory.cached/oToKMo << " Mo");
+    OSLM_INFO("Swap Cached:  " << memory.swapcached/oToKMo << " Mo");
+    OSLM_INFO("Swap Total:   " << memory.swaptotal/oToKMo << " Mo");
+    OSLM_INFO("Swap Free:    " << memory.swapfree/oToKMo << " Mo");
+
+    Status allStat;
+    getAllStatus( allStat );
+    printStatus( allStat );
+
+    ::boost::uint64_t computedFree = ( memory.total - allStat.VmRSS ) / oToKMo;
+    ::boost::uint64_t free = memory.free / oToKMo;
+    OSLM_INFO(  "(ComputedFree, Free, Diff) - ( "
+                << std::setw(5) << computedFree
+                << std::setw(5) << free
+                << std::setw(5) << computedFree -free
+                << " )" );
+    (void)computedFree;         // Fixes "unused variable" warnings
+    (void)free;
+}
+
+//-----------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::printMemoryInformation()
+{
+    printSystemMemoryInformation();
+    printProcessMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::getTotalSystemMemory()
+{
+    return s_totalMemory;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::getUsedSystemMemory()
+{
+    return getTotalSystemMemory() - getFreeSystemMemory();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::getFreeSystemMemory()
+{
+    //Status allStat;
+    //getAllStatus( allStat );
+    MemInfo memory;
+    get_memory_stats(memory);
+    return sysconf(_SC_AVPHYS_PAGES) * s_pageSize + memory.cached;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::getUsedProcessMemory()
+{
+    Status stat;
+    getStatusOfPid( getpid(), stat );
+    return stat.VmSize;
+}
+
+//-----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+
+::boost::uint64_t PosixMemoryMonitorTools::extract_number(char *str, int start, int end)
+{
+    int i, j;
+    char buf[end-start];
+
+    for (i=start, j=0; i<end; i++)
+        isdigit(str[i]) && (buf[j++] = str[i]);
+    buf[j] = '\0';
+
+    return strtoul(buf, NULL, 0) * 1024;
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::get_memory_stats( MemInfo & meminfo )
+{
+/*
+    // We are bothered about only the first 338 bytes of the /proc/meminfo file
+    char buf[338];
+    int in;
+
+    in = open("/proc/meminfo", O_RDONLY);
+
+    read(in, buf, sizeof(buf));
+
+    close(in);
+
+    meminfo.total = extract_number(buf, 9, 22);
+    meminfo.free = extract_number(buf, 35, 49);
+    meminfo.buffered = extract_number(buf, 61, 75);
+    meminfo.cached = extract_number(buf, 86, 101);
+    meminfo.swapcached = extract_number(buf, 116, 127);
+    meminfo.swaptotal = extract_number(buf, 297, 309);
+    meminfo.swapfree = extract_number(buf, 322, 335);
+*/
+
+    std::ifstream input ( "/proc/meminfo" );
+
+    std::string line;
+    if ( input.is_open() )
+    {
+        while ( ! input.eof() )
+        {
+            getline( input, line );
+            analyseMemInfo( line, meminfo );
+        }
+        input.close();
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::analyseMemInfo( std::string & line, MemInfo & meminfo )
+{
+    ::boost::regex e ("([A-Za-z:]+)([ \t]+)([0-9]+)([ \t]+)kB(.*)");
+    std::string machine_format = "\\3";
+    if ( line.find("MemTotal") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.total = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("MemFree") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.free = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("Buffers") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.buffered = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("SwapCached") != std::string::npos ) // Test before => line.find("Cached")
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.swapcached = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("Cached") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.cached = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("SwapTotal") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.swaptotal = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("SwapFree") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        meminfo.swapfree = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+}
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::printStatus( Status & stat )
+{
+    int oToMo = 1024 * 1024;
+    OSLM_DEBUG("VmPeak = " << stat.VmPeak / oToMo << " Mo" );
+    OSLM_DEBUG("VmSize = " << stat.VmSize / oToMo << " Mo" );
+    OSLM_DEBUG("VmLck = " << stat.VmLck / oToMo << " Mo" );
+    OSLM_DEBUG("VmHWM = " << stat.VmHWM / oToMo << " Mo" );
+    OSLM_DEBUG("VmRSS = " << stat.VmRSS / oToMo << " Mo" );
+    OSLM_DEBUG("VmData = " << stat.VmData / oToMo << " Mo" );
+    OSLM_DEBUG("VmStk = " << stat.VmStk / oToMo << " Mo" );
+    OSLM_DEBUG("VmExe = " << stat.VmExe / oToMo << " Mo" );
+    OSLM_DEBUG("VmLib = " << stat.VmLib / oToMo << " Mo" );
+    OSLM_DEBUG("VmPTE = " << stat.VmPTE / oToMo << " Mo" );
+    (void)oToMo;                // Fixes "unused variable" warnings
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::analyseStatusLine( std::string & line, Status & stat )
+{
+    ::boost::regex e ("([A-Za-z:]+)([ \t]+)([0-9]+)([ \t]+)kB(.*)");
+    std::string machine_format = "\\3";
+    if ( line.find("VmPeak") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmPeak = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmSize") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmSize = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmLck") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmLck = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmHWM") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmHWM = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmRSS") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmRSS = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmData") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmData = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmStk") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmStk = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmExe") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmExe = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmLib") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmLib = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+    else if ( line.find("VmPTE") != std::string::npos )
+    {
+        std::string size = regex_replace(line, e, machine_format, ::boost::match_default | ::boost::format_sed);
+        stat.VmPTE = ::boost::lexical_cast< ::boost::uint64_t >(size) * 1024;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::getStatusOfPid( int pid, Status & stat)
+{
+    std::stringstream file;
+    file << "/proc/" << pid << "/status";
+    std::ifstream input ( file.str().c_str() );
+
+    std::string line;
+    if ( input.is_open() )
+    {
+        while ( ! input.eof() )
+        {
+            getline( input, line );
+            analyseStatusLine(line,stat);
+        }
+        input.close();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::getAllStatus( Status & allStat )
+{
+    ::boost::filesystem::path path ("/proc");
+    ::boost::regex e ("[0-9]+");
+
+    allStat.VmPeak = 0;
+    allStat.VmSize = 0;
+    allStat.VmLck = 0;
+    allStat.VmHWM = 0;
+    allStat.VmRSS = 0;
+    allStat.VmData = 0;
+    allStat.VmStk = 0;
+    allStat.VmExe = 0;
+    allStat.VmLib = 0;
+    allStat.VmPTE = 0;
+
+    for(    ::boost::filesystem::directory_iterator it (path);
+    it != ::boost::filesystem::directory_iterator();
+    ++it )
+    {
+
+        if( ::boost::filesystem::is_directory(*it) )
+        {
+            ::boost::filesystem::path tmpPath = (*it);
+#if BOOST_FILESYSTEM_VERSION > 2
+            std::string dirName = tmpPath.filename().string();
+#else
+            std::string dirName = tmpPath.leaf();
+#endif
+            if ( regex_match(dirName, e) )
+            {
+                int pid = strtoul(dirName.c_str(), NULL, 0);
+                Status stat;
+                getStatusOfPid( pid, stat);
+                allStat.VmPeak += stat.VmPeak;
+                allStat.VmSize += stat.VmSize;
+                allStat.VmLck += stat.VmLck;
+                allStat.VmHWM += stat.VmHWM;
+                allStat.VmRSS += stat.VmRSS;
+                allStat.VmData += stat.VmData;
+                allStat.VmStk += stat.VmStk;
+                allStat.VmExe += stat.VmExe;
+                allStat.VmLib += stat.VmLib;
+                allStat.VmPTE += stat.VmPTE;
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void PosixMemoryMonitorTools::printAllStatus()
+{
+    ::boost::filesystem::path path ("/proc");
+    ::boost::regex e ("[0-9]+");
+    int oToMo = 1024 * 1024;
+
+    ::boost::uint64_t totalVmPeak = 0;
+    ::boost::uint64_t totalVmSize = 0;
+    ::boost::uint64_t totalVmLck = 0;
+    ::boost::uint64_t totalVmHWM = 0;
+    ::boost::uint64_t totalVmRSS = 0;
+    ::boost::uint64_t totalVmData = 0;
+    ::boost::uint64_t totalVmStk = 0;
+    ::boost::uint64_t totalVmExe = 0;
+    ::boost::uint64_t totalVmLib = 0;
+    ::boost::uint64_t totalVmPTE = 0;
+
+    for(    ::boost::filesystem::directory_iterator it (path);
+            it != ::boost::filesystem::directory_iterator();
+            ++it )
+    {
+
+        if( ::boost::filesystem::is_directory(*it) )
+        {
+            ::boost::filesystem::path tmpPath = (*it);
+#if BOOST_FILESYSTEM_VERSION > 2
+            std::string dirName = tmpPath.filename().string();
+#else
+            std::string dirName = tmpPath.leaf();
+#endif
+            if ( regex_match(dirName, e) )
+            {
+                int pid = strtoul(dirName.c_str(), NULL, 0);
+                Status stat;
+                getStatusOfPid( pid, stat);
+                totalVmPeak += stat.VmPeak;
+                totalVmSize += stat.VmSize;
+                totalVmLck += stat.VmLck;
+                totalVmHWM += stat.VmHWM;
+                totalVmRSS += stat.VmRSS;
+                totalVmData += stat.VmData;
+                totalVmStk += stat.VmStk;
+                totalVmExe += stat.VmExe;
+                totalVmLib += stat.VmLib;
+                totalVmPTE += stat.VmPTE;
+            }
+        }
+    }
+    totalVmPeak /= oToMo;
+    totalVmSize /= oToMo;
+    totalVmLck /= oToMo;
+    totalVmHWM /= oToMo;
+    totalVmRSS /= oToMo;
+    totalVmData /= oToMo;
+    totalVmStk /= oToMo;
+    totalVmExe /= oToMo;
+    totalVmLib /= oToMo;
+    totalVmPTE /= oToMo;
+
+    OSLM_DEBUG("( " << totalVmPeak << std::setw(5) << totalVmSize << std::setw(5) << totalVmLck << std::setw(5) << totalVmHWM << std::setw(5) << totalVmRSS << std::setw(5) << totalVmData << std::setw(5) << totalVmStk << std::setw(5) << totalVmExe << std::setw(5) << totalVmLib << std::setw(5) << totalVmPTE << " )");
+
+    /*
+    OSLM_DEBUG("totalVmPeak = " << totalVmPeak / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmSize = " << totalVmSize / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmLck = " << totalVmLck / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmHWM = " << totalVmHWM / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmRSS = " << totalVmRSS / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmData = " << totalVmData / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmStk = " << totalVmStk / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmExe = " << totalVmExe / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmLib = " << totalVmLib / oToMo << " Mo" );
+    OSLM_DEBUG("totalVmPTE = " << totalVmPTE / oToMo << " Mo" );
+    */
+}
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
diff --git a/SrcLib/core/fwMemory/src/fwMemory/tools/Win32MemoryMonitorTools.cpp b/SrcLib/core/fwMemory/src/fwMemory/tools/Win32MemoryMonitorTools.cpp
new file mode 100644
index 0000000..d3e9549
--- /dev/null
+++ b/SrcLib/core/fwMemory/src/fwMemory/tools/Win32MemoryMonitorTools.cpp
@@ -0,0 +1,204 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef _WIN32
+
+#include <assert.h>
+#include <iomanip>
+#include <iostream>
+
+#include <boost/regex.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwMemory/tools/Win32MemoryMonitorTools.hpp"
+
+
+#include <windows.h>
+#include <stdio.h>
+#include <psapi.h>
+#include <tchar.h>
+
+
+namespace fwMemory
+{
+namespace tools
+{
+
+//-----------------------------------------------------------------------------
+
+Win32MemoryMonitorTools::Win32MemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+Win32MemoryMonitorTools::~Win32MemoryMonitorTools()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t Win32MemoryMonitorTools::estimateFreeMem()
+{
+    ::boost::uint64_t freeMemory = 0;
+#ifdef _M_X64
+    freeMemory = getFreeSystemMemory();
+#else
+    ::boost::uint64_t windowsLimitForAProcess = 1.2 * 1024 * 1024 * 1024; // 1.5 Go
+    ::boost::uint64_t freeMem = std::min(getFreeSystemMemory(), windowsLimitForAProcess - getUsedProcessMemory());
+    freeMemory = std::max((::boost::uint64_t) 0, freeMem );
+#endif
+    return freeMemory;
+}
+
+//-----------------------------------------------------------------------------
+
+void Win32MemoryMonitorTools::printProcessMemoryInformation()
+{
+    DWORD processID = GetCurrentProcessId();
+    HANDLE hProcess;
+
+
+    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,
+                            FALSE,
+                            processID );
+
+    if ( NULL != hProcess )
+    {
+        // Get the process name.
+        int nameSize = 100;
+        char * name = new char[nameSize];
+
+        HMODULE hMod;
+        DWORD cbNeeded;
+
+        SLM_INFO( "-- Process memory information --" );
+        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
+        {
+            GetModuleBaseNameW( hProcess, hMod, (LPWSTR)name, nameSize );
+            OSLM_INFO( "    Name : " << name << "  ( PID : " << processID << " )");
+        }
+        else
+        {
+            OSLM_INFO( "    Name : not found ( PID : " << processID << " )");
+        }
+
+        PROCESS_MEMORY_COUNTERS_EX pmc;
+        if ( GetProcessMemoryInfo( hProcess, reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmc), sizeof(pmc)) )
+        {
+            OSLM_INFO("    PageFaultCount : "               << (int)pmc.PageFaultCount );
+            OSLM_INFO("    PeakWorkingSetSize : "           << (int)pmc.PeakWorkingSetSize );
+            OSLM_INFO("    WorkingSetSize : "               << (int)pmc.WorkingSetSize );
+            OSLM_INFO("    QuotaPeakPagedPoolUsage : "      << (int)pmc.QuotaPeakPagedPoolUsage );
+            OSLM_INFO("    QuotaPagedPoolUsage : "          << (int)pmc.QuotaPagedPoolUsage );
+            OSLM_INFO("    QuotaPeakNonPagedPoolUsage : "   << (int)pmc.QuotaPeakNonPagedPoolUsage );
+            OSLM_INFO("    QuotaNonPagedPoolUsage : "       << (int)pmc.QuotaNonPagedPoolUsage );
+            OSLM_INFO("    PagefileUsage : "                << (int)pmc.PagefileUsage );
+            OSLM_INFO("    PeakPagefileUsage : "            << (int)pmc.PeakPagefileUsage );
+            OSLM_INFO("    PrivateUsage : "                 << (int)pmc.PrivateUsage );
+        }
+        else
+        {
+            SLM_WARN("GetProcessMemoryInfo failed !");
+        }
+
+        delete[] name;
+        CloseHandle( hProcess );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Win32MemoryMonitorTools::printSystemMemoryInformation()
+{
+    ::boost::uint64_t oToKo = 1024;
+
+    MEMORYSTATUSEX statex;
+
+    statex.dwLength = sizeof (statex);
+    GlobalMemoryStatusEx (&statex);
+
+    SLM_INFO( "-- System memory information --" );
+    OSLM_INFO( "    There is " << statex.dwMemoryLoad               <<  " percent of memory in use." );
+    OSLM_INFO( "    There are " << statex.ullTotalPhys/oToKo        <<  " total Ko of physical memory." );
+    OSLM_INFO( "    There are " << statex.ullAvailPhys/oToKo        <<  " free Ko of physical memory." );
+    OSLM_INFO( "    There are " << statex.ullTotalPageFile/oToKo    <<  " total Ko of paging file." );
+    OSLM_INFO( "    There are " << statex.ullAvailPageFile/oToKo    <<  " free Ko of paging file." );
+    OSLM_INFO( "    There are " << statex.ullTotalVirtual/oToKo     <<  " total Ko of virtual memory." );
+    OSLM_INFO( "    There are " << statex.ullAvailVirtual/oToKo     <<  " free Ko of virtual memory." );
+}
+
+//-----------------------------------------------------------------------------
+
+void Win32MemoryMonitorTools::printMemoryInformation()
+{
+    printSystemMemoryInformation();
+    printProcessMemoryInformation();
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t Win32MemoryMonitorTools::getTotalSystemMemory()
+{
+    MEMORYSTATUSEX statex;
+
+    statex.dwLength = sizeof (statex);
+    GlobalMemoryStatusEx (&statex);
+
+    return statex.ullTotalPhys;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t Win32MemoryMonitorTools::getUsedSystemMemory()
+{
+    MEMORYSTATUSEX statex;
+
+    statex.dwLength = sizeof (statex);
+    GlobalMemoryStatusEx (&statex);
+
+    return statex.ullTotalPhys - statex.ullAvailPhys;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t Win32MemoryMonitorTools::getFreeSystemMemory()
+{
+    MEMORYSTATUSEX statex;
+
+    statex.dwLength = sizeof (statex);
+    GlobalMemoryStatusEx (&statex);
+
+    return statex.ullAvailPhys;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::uint64_t Win32MemoryMonitorTools::getUsedProcessMemory()
+{
+    ::boost::uint64_t memory = 0;
+
+    BOOL result;
+    PROCESS_MEMORY_COUNTERS_EX pmc;
+    if ( result = GetProcessMemoryInfo( GetCurrentProcess(), reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmc), sizeof(pmc)) )
+    {
+        memory = pmc.WorkingSetSize;
+    }
+    SLM_WARN_IF("GetProcessMemoryInfo failed !", !result);
+
+    return memory;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace tools
+} // namespace fwMemory
+
+#endif
diff --git a/SrcLib/core/fwMemory/test/CMakeLists.txt b/SrcLib/core/fwMemory/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwMemory/test/Properties.cmake b/SrcLib/core/fwMemory/test/Properties.cmake
new file mode 100644
index 0000000..229d8b4
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMemoryTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwMemory )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwMemory/test/cppunit.options b/SrcLib/core/fwMemory/test/cppunit.options
new file mode 100644
index 0000000..a660ba8
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/cppunit.options
@@ -0,0 +1,10 @@
+
+CLASSTEST=[
+    'BufferManagerTest',
+    'BufferObjectTest' ,
+    'ByteSizeTest'     ,
+    ]
+
+USE = ['boost']
+LIB = ['fwTools_0-1', 'fwCore_0-1', 'fwMemory_0-1']
+CONSOLE='yes'
diff --git a/SrcLib/core/fwMemory/test/tu/include/BufferManagerTest.hpp b/SrcLib/core/fwMemory/test/tu/include/BufferManagerTest.hpp
new file mode 100644
index 0000000..7363650
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/include/BufferManagerTest.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_UT_BUFFERMANAGER_HPP__
+#define __FWMEMORY_UT_BUFFERMANAGER_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMemory
+{
+namespace ut
+{
+
+class BufferManagerTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( BufferManagerTest );
+    CPPUNIT_TEST( allocateTest );
+    CPPUNIT_TEST( memoryInfoTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void allocateTest();
+    void memoryInfoTest();
+};
+
+} // namespace ut
+} // namespace fwMemory
+
+#endif //__FWMEMORY_UT_BUFFERMANAGER_HPP__
diff --git a/SrcLib/core/fwMemory/test/tu/include/BufferObjectTest.hpp b/SrcLib/core/fwMemory/test/tu/include/BufferObjectTest.hpp
new file mode 100644
index 0000000..1185cdd
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/include/BufferObjectTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_UT_BUFFEROBJECT_HPP__
+#define __FWMEMORY_UT_BUFFEROBJECT_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMemory
+{
+namespace ut
+{
+
+class BufferObjectTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( BufferObjectTest );
+    CPPUNIT_TEST( allocateTest );
+    CPPUNIT_TEST( allocateZeroTest );
+    CPPUNIT_TEST( lockThreadedStressTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void allocateTest();
+    void allocateZeroTest();
+    void lockThreadedStressTest();
+};
+
+} // namespace ut
+} // namespace fwMemory
+
+#endif //__FWMEMORY_UT_BUFFEROBJECT_HPP__
diff --git a/SrcLib/core/fwMemory/test/tu/include/ByteSizeTest.hpp b/SrcLib/core/fwMemory/test/tu/include/ByteSizeTest.hpp
new file mode 100644
index 0000000..8e46127
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/include/ByteSizeTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMEMORY_UT_BYTESIZE_HPP__
+#define __FWMEMORY_UT_BYTESIZE_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwMemory
+{
+namespace ut
+{
+
+class ByteSizeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ByteSizeTest );
+    CPPUNIT_TEST( byteSizeTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void byteSizeTest();
+};
+
+} // namespace ut
+} // namespace fwMemory
+
+#endif //__FWMEMORY_UT_BYTESIZE_HPP__
+
diff --git a/SrcLib/core/fwMemory/test/tu/src/BufferManagerTest.cpp b/SrcLib/core/fwMemory/test/tu/src/BufferManagerTest.cpp
new file mode 100644
index 0000000..acdf3a3
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/src/BufferManagerTest.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+
+#include "BufferManagerTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMemory::ut::BufferManagerTest );
+
+namespace fwMemory
+{
+namespace ut
+{
+
+void BufferManagerTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void BufferManagerTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void BufferManagerTest::allocateTest()
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+
+    const int SIZE = 100000;
+    ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(SIZE);
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(1), bo->lockCount() );
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            buf[i] = (i%256);
+        }
+    }
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL(static_cast<char>(i%256), buf[i]);
+        }
+    }
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(1), bo->lockCount() );
+        ::fwMemory::BufferObject::Lock lock2(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(2), bo->lockCount() );
+        ::fwMemory::BufferObject::csptr cbo = bo;
+        ::fwMemory::BufferObject::ConstLock clock(cbo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(3), bo->lockCount() );
+    }
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    bo->destroy();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(SIZE, ::fwMemory::BufferNewPolicy::New());
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            buf[i] = (i%256);
+        }
+    }
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL(static_cast<char>(i%256), buf[i]);
+        }
+    }
+
+
+
+    bo->destroy();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+}
+
+void BufferManagerTest::memoryInfoTest()
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+
+    {
+        SLM_INFO(manager->toString().get());
+        ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+        const int SIZE = 100000;
+        bo->allocate(SIZE);
+        SLM_INFO(manager->toString().get());
+        ::fwMemory::BufferObject::sptr bo1 = ::fwMemory::BufferObject::New();
+        SLM_INFO(manager->toString().get());
+        {
+            ::fwMemory::BufferObject::Lock lock1(bo1->lock());
+            SLM_INFO(manager->toString().get());
+        }
+        ::fwMemory::BufferObject::sptr bo2 = ::fwMemory::BufferObject::New();
+        SLM_INFO(manager->toString().get());
+        bo->reallocate(SIZE*2);
+        {
+            ::fwMemory::BufferObject::Lock lock(bo->lock());
+            SLM_INFO(manager->toString().get());
+        }
+        bo->destroy();
+        SLM_INFO(manager->toString().get());
+        bo1->allocate(SIZE);
+        bo2->allocate(SIZE);
+        char * buff = new char[SIZE];
+        bo->setBuffer( buff, SIZE, ::fwMemory::BufferNewPolicy::New() );
+        SLM_INFO(manager->toString().get());
+
+        { ::fwMemory::BufferObject::Lock lock(bo->lock()); }
+        { ::fwMemory::BufferObject::Lock lock(bo1->lock()); }
+        { ::fwMemory::BufferObject::Lock lock(bo2->lock()); }
+    }
+    SLM_INFO(manager->toString().get());
+}
+
+} // namespace ut
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/test/tu/src/BufferObjectTest.cpp b/SrcLib/core/fwMemory/test/tu/src/BufferObjectTest.cpp
new file mode 100644
index 0000000..c0662bb
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/src/BufferObjectTest.cpp
@@ -0,0 +1,239 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/type_traits/is_const.hpp>
+#include <boost/type_traits/remove_pointer.hpp>
+
+#include <limits>
+
+#include <boost/thread.hpp>
+#include <boost/bind.hpp>
+
+#include <fwMemory/BufferObject.hpp>
+#include <fwMemory/BufferAllocationPolicy.hpp>
+#include <fwMemory/exception/Memory.hpp>
+
+#include "BufferObjectTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMemory::ut::BufferObjectTest );
+
+namespace fwMemory
+{
+namespace ut
+{
+
+void BufferObjectTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void BufferObjectTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+template <typename T> bool isPointedValueConst( T )
+{
+    return ::boost::is_const< typename boost::remove_pointer< T >::type >::value;
+}
+
+void BufferObjectTest::allocateTest()
+{
+    const size_t SIZE = 100000;
+    ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(SIZE);
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(1), bo->lockCount() );
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            buf[i] = (i%256);
+        }
+    }
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL(static_cast<char>(i%256), buf[i]);
+        }
+    }
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(1), bo->lockCount() );
+        ::fwMemory::BufferObject::Lock lock2(bo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(2), bo->lockCount() );
+        ::fwMemory::BufferObject::csptr cbo = bo;
+        ::fwMemory::BufferObject::ConstLock clock(cbo->lock());
+        CPPUNIT_ASSERT_EQUAL( static_cast<long>(3), bo->lockCount() );
+        CPPUNIT_ASSERT( isPointedValueConst( clock.getBuffer() ) );
+        CPPUNIT_ASSERT( isPointedValueConst( cbo->lock().getBuffer() ) );
+    }
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+    bo->destroy();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+
+
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(SIZE, ::fwMemory::BufferNewPolicy::New());
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            buf[i] = (i%256);
+        }
+    }
+
+    {
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        char *buf = static_cast<char*>(lock.getBuffer());
+
+        for (int i = 0; i<SIZE; ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL(static_cast<char>(i%256), buf[i]);
+        }
+    }
+
+    bo->destroy();
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    CPPUNIT_ASSERT_THROW( bo->allocate(std::numeric_limits<size_t>::max()/2), ::fwMemory::exception::Memory);
+
+    bo->allocate(SIZE);
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    CPPUNIT_ASSERT_THROW( bo->reallocate(std::numeric_limits<size_t>::max()/2), ::fwMemory::exception::Memory);
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    const size_t SMALLER_REALLOC_SIZE = 1024;
+    const size_t BIGGER_REALLOC_SIZE = SIZE+1024;
+
+    bo->reallocate(SMALLER_REALLOC_SIZE);
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SMALLER_REALLOC_SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    bo->reallocate(BIGGER_REALLOC_SIZE);
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(BIGGER_REALLOC_SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+    bo->destroy();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+
+    CPPUNIT_ASSERT_THROW( bo->allocate(150, ::fwMemory::BufferNoAllocPolicy::New()), ::fwMemory::exception::Memory);
+    // CPPUNIT_ASSERT_THROW( bo->reallocate(150), ::fwMemory::exception::Memory);
+}
+
+void BufferObjectTest::allocateZeroTest()
+{
+    const size_t SIZE = 100000;
+    ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(0);
+
+    CPPUNIT_ASSERT( bo->isEmpty() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() == NULL );
+
+    bo->allocate(SIZE);
+
+    CPPUNIT_ASSERT( !bo->isEmpty() );
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwMemory::BufferObject::SizeType>(SIZE), bo->getSize() );
+    CPPUNIT_ASSERT( bo->lock().getBuffer() != NULL );
+
+
+}
+
+
+void stressLock(::fwMemory::BufferObject::sptr bo, int nbLocks, int nbTest)
+{
+    std::vector< ::fwMemory::BufferObject::Lock > m_locks;
+
+    for( int t = 0; t < nbTest ; ++t)
+    {
+        for( int i = 0; i < nbLocks ; ++i)
+        {
+            m_locks.push_back(bo->lock());
+        }
+
+        CPPUNIT_ASSERT( bo->lockCount() >= static_cast<long>(3) );
+
+        m_locks.clear();
+    }
+
+}
+
+void BufferObjectTest::lockThreadedStressTest()
+{
+    ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+
+    boost::thread_group group;
+
+    group.create_thread( boost::bind( &stressLock, bo, 800, 600 ) );
+    group.create_thread( boost::bind( &stressLock, bo, 600, 800 ) );
+    group.create_thread( boost::bind( &stressLock, bo, 452, 692 ) );
+    group.create_thread( boost::bind( &stressLock, bo, 253, 345 ) );
+
+    group.join_all();
+
+    CPPUNIT_ASSERT_EQUAL( static_cast<long>(0), bo->lockCount() );
+
+}
+
+
+
+} // namespace ut
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwMemory/test/tu/src/ByteSizeTest.cpp b/SrcLib/core/fwMemory/test/tu/src/ByteSizeTest.cpp
new file mode 100644
index 0000000..09eed59
--- /dev/null
+++ b/SrcLib/core/fwMemory/test/tu/src/ByteSizeTest.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <limits>
+
+#include <fwMemory/ByteSize.hpp>
+
+#include "ByteSizeTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwMemory::ut::ByteSizeTest );
+
+namespace fwMemory
+{
+namespace ut
+{
+
+void ByteSizeTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void ByteSizeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ByteSizeTest::byteSizeTest()
+{
+    {
+        ::fwMemory::ByteSize bsize;
+        std::string refIEC("0 Bytes");
+        std::string refSI("0 Bytes");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+
+    {
+        ::fwMemory::ByteSize::SizeType size = 1;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::KB);
+        std::string refIEC("1000 Bytes");
+        std::string refSI("1 KB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        ::fwMemory::ByteSize::SizeType size = 1;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::KiB);
+        std::string refIEC("1 KiB");
+        std::string refSI("1.024 KB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        ::fwMemory::ByteSize::SizeType size = 1;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::GB);
+        std::string refIEC("953.674 MiB");
+        std::string refSI("1 GB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        ::fwMemory::ByteSize::SizeType size = 1;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::GiB);
+        std::string refIEC("1 GiB");
+        std::string refSI("1.07374 GB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+
+
+
+    {
+        double size = 1.5;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::GiB);
+        std::string refIEC("1.5 GiB");
+        std::string refSI("1.61061 GB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }    {
+        double size = 1.5;
+        ::fwMemory::ByteSize bsize(size, ::fwMemory::ByteSize::TB);
+        std::string refIEC("1.36424 TiB");
+        std::string refSI("1.5 TB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+
+
+
+
+
+    {
+        std::string size("1.42 MiB");
+        ::fwMemory::ByteSize bsize(size);
+        std::string refIEC("1.42 MiB");
+        std::string refSI("1.48898 MB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        std::string size("1.32 GB");
+        ::fwMemory::ByteSize bsize(size);
+        std::string refIEC("1.22935 GiB");
+        std::string refSI("1.32 GB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        std::string size("1.123GB");
+        ::fwMemory::ByteSize bsize(size);
+        std::string refIEC("1.04588 GiB");
+        std::string refSI("1.123 GB");
+        std::string resultIEC(bsize);
+        std::string resultSI(bsize.getHumanReadableSize(::fwMemory::ByteSize::SI));
+        CPPUNIT_ASSERT_EQUAL(refIEC, resultIEC);
+        CPPUNIT_ASSERT_EQUAL(refSI, resultSI);
+    }
+    {
+        std::string size("  1.42   MiB ");
+        ::fwMemory::ByteSize bsize(size);
+        ::fwMemory::ByteSize::SizeType refSize = 1488977 ;
+        ::fwMemory::ByteSize::SizeType resultSize = bsize.getSize();
+        CPPUNIT_ASSERT_EQUAL(refSize, resultSize);
+    }
+    {
+        std::string size("1.42 TB  ");
+        ::fwMemory::ByteSize bsize(size);
+        ::fwMemory::ByteSize::SizeType refSize = 1420000000000LL ;
+        ::fwMemory::ByteSize::SizeType resultSize = bsize.getSize();
+        CPPUNIT_ASSERT_EQUAL(refSize, resultSize);
+    }
+    {
+        std::string size("  1.42 PiB");
+        ::fwMemory::ByteSize bsize(size);
+        ::fwMemory::ByteSize::SizeType refSize = 1598777867716526LL ;
+        ::fwMemory::ByteSize::SizeType resultSize = bsize.getSize();
+        CPPUNIT_ASSERT_EQUAL(refSize, resultSize);
+    }
+
+    {
+        std::string size("1.66MiB");
+        ::fwMemory::ByteSize bsize(size);
+        ::fwMemory::ByteSize::SizeType refSize = 1740636 ;
+        ::fwMemory::ByteSize::SizeType resultSize = bsize.getSize();
+        CPPUNIT_ASSERT_EQUAL(refSize, resultSize);
+    }
+}
+
+} // namespace ut
+} // namespace fwMemory
+
diff --git a/SrcLib/core/fwPython/CMakeLists.txt b/SrcLib/core/fwPython/CMakeLists.txt
new file mode 100644
index 0000000..1a6d0d6
--- /dev/null
+++ b/SrcLib/core/fwPython/CMakeLists.txt
@@ -0,0 +1,28 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwTools
+)
+
+
+find_package(Boost COMPONENTS python REQUIRED)
+find_package(PythonLibs 2.7 REQUIRED )
+get_filename_component(PYTHON_DIR_NAME "${PYTHON_INCLUDE_DIR}" NAME)
+get_filename_component(PYTHON_DIR "${PYTHON_INCLUDE_DIR}" PATH)
+get_filename_component(PYTHON_DIR "${PYTHON_DIR}" PATH)
+
+if (WIN32)
+    string(REGEX REPLACE "2.7$" "27" PYTHON_DIR_NAME "${PYTHON_DIR_NAME}")
+ endif()
+
+file(COPY "${PYTHON_INCLUDE_DIR}/" DESTINATION "${CMAKE_BINARY_DIR}/PythonHome/include/")
+file(COPY "${PYTHON_DIR}/lib/${PYTHON_DIR_NAME}/" DESTINATION "${CMAKE_BINARY_DIR}/PythonHome/lib/")
+
+if(${NAME}_INSTALL)
+    install(DIRECTORY "${PYTHON_INCLUDE_DIR}/" DESTINATION PythonHome/include/ COMPONENT Python)
+    install(DIRECTORY "${PYTHON_DIR}/lib/${PYTHON_DIR_NAME}/" DESTINATION PythonHome/lib/ COMPONENT Python)
+endif()
+
+
+fwForwardInclude(${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
+
diff --git a/SrcLib/core/fwPython/Properties.cmake b/SrcLib/core/fwPython/Properties.cmake
new file mode 100644
index 0000000..290a545
--- /dev/null
+++ b/SrcLib/core/fwPython/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwPython )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwPython/bin/build.options b/SrcLib/core/fwPython/bin/build.options
new file mode 100644
index 0000000..79e3485
--- /dev/null
+++ b/SrcLib/core/fwPython/bin/build.options
@@ -0,0 +1,5 @@
+TYPE    = "shared"
+USE     = [ 'boostPython' ]
+LIB     = [ 'fwData_0-1', 'fwServices_0-1', 'fwComEd_0-1']
+VERSION = '0-1'
+
diff --git a/SrcLib/core/fwPython/include/fwPython/Interpreter.hpp b/SrcLib/core/fwPython/include/fwPython/Interpreter.hpp
new file mode 100644
index 0000000..531bff3
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/Interpreter.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_INTERPRETER_HPP_
+#define _FWPYTHON_INTERPRETER_HPP_
+
+#include <boost/python.hpp>
+#undef tolower //defined by python, conflicting with std::lower
+
+#include <string>
+
+#include <fwTools/Object.hpp>
+
+#include "fwPython/config.hpp"
+
+namespace fwPython
+{
+
+class FWPYTHON_CLASS_API Interpreter
+{
+
+public :
+
+   // create a python interpretor
+   FWPYTHON_API Interpreter();
+
+
+   // a destroy the  python interpretor
+   FWPYTHON_API ~Interpreter();
+
+   // insert an object inside the python global dictionnay with the specified key
+   FWPYTHON_API void addObject(std::string key, ::fwTools::Object::sptr object);
+
+
+   //execute the python code sequence
+   FWPYTHON_API int execute(std::string code);
+
+   /**
+    * @brief Return the value of the given sys module attribute value.
+    *
+    * @param moduleName Python module name
+    * @param attrName   attribute name of the specified Python module
+    *
+    * @return attribute value
+    */
+   FWPYTHON_API std::string getAttrValue(const std::string &moduleName, const std::string &attrName);
+
+   protected :
+
+   void importBindings();
+
+   //direct accesor to global dict
+   boost::python::object m_globals;
+   //direct accesor to local dict
+   boost::python::dict m_locals;
+
+};
+
+
+
+} // namespace fwPython
+
+
+
+#endif //_FWPYTHON_INTERPRETER_HPP_
+
diff --git a/SrcLib/core/fwPython/include/fwPython/bindings/Image.hpp b/SrcLib/core/fwPython/include/fwPython/bindings/Image.hpp
new file mode 100644
index 0000000..9892236
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/bindings/Image.hpp
@@ -0,0 +1,18 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_BINDINGS_IMAGE_HPP_
+#define _FWPYTHON_BINDINGS_IMAGE_HPP_
+
+namespace fwPython {
+namespace bindings {
+
+void export_image();
+
+} //namespace bindings
+} //namespace fwPython
+
+#endif // _FWPYTHON_BINDINGS_IMAGE_HPP_
diff --git a/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hpp b/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hpp
new file mode 100644
index 0000000..d4b1e0a
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_BINDINGS_STLCONTAINERS_HPP_
+#define _FWPYTHON_BINDINGS_STLCONTAINERS_HPP_
+
+namespace fwPython {
+namespace bindings {
+
+void export_STLContainers();
+
+/// an helper to convert std container to python list
+template< typename STDCONTAINER>
+::boost::python::list make_pylist( STDCONTAINER &cont);
+
+} //namespace bindings
+} //namespace fwPython
+
+#include "fwPython/bindings/STLContainers.hxx"
+
+#endif // _FWPYTHON_BINDINGS_STLCONTAINERS_HPP_
diff --git a/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hxx b/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hxx
new file mode 100644
index 0000000..530f4c8
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/bindings/STLContainers.hxx
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/python.hpp>
+#include <boost/python/tuple.hpp>
+
+#undef tolower //defined by python, conflicting with std::lower
+
+namespace fwPython {
+namespace bindings {
+
+
+
+template< typename STDCONTAINER>
+::boost::python::list make_pylist( STDCONTAINER &cont)
+{
+    ::boost::python::list list;
+     typename STDCONTAINER::const_iterator iter;
+    for ( iter=cont.begin(); iter != cont.end(); ++iter )
+    {
+        list.append(  ::boost::python::object(*iter) );
+    }
+    return list;
+}
+
+
+} //namespace bindings
+} //namespace fwPython
+
diff --git a/SrcLib/core/fwPython/include/fwPython/bindings/base.hpp b/SrcLib/core/fwPython/include/fwPython/bindings/base.hpp
new file mode 100644
index 0000000..58f0d84
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/bindings/base.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_BINDINGS_HPP_
+#define _FWPYTHON_BINDINGS_HPP_
+
+
+#include <string>
+#include "fwPython/config.hpp"
+
+namespace fwPython
+{
+namespace bindings
+{
+
+FWPYTHON_API void initialize();
+
+
+} //namespace bindings
+} //namespace fwPython
+
+
+#endif //_FWPYTHON_BINDINGS_HPP_
diff --git a/SrcLib/core/fwPython/include/fwPython/bindings/namespace.hpp b/SrcLib/core/fwPython/include/fwPython/bindings/namespace.hpp
new file mode 100644
index 0000000..9d3b0f1
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/bindings/namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_BINDINGS_NAMESPACE_HPP_
+#define _FWPYTHON_BINDINGS_NAMESPACE_HPP_
+
+namespace fwPython
+{
+
+/**
+ * @brief       fwPython provides common foundations for python in fw4spl.
+ * @namespace   fwPython::binding
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace bindings
+{
+} //namespace bindings
+
+} //namespace fwPython
+
+#endif /* _FWPYTHON_NAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwPython/include/fwPython/config.hpp b/SrcLib/core/fwPython/include/fwPython/config.hpp
new file mode 100644
index 0000000..2c0bb62
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_CONFIG_HPP_
+#define _FWPYTHON_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWPYTHON_EXPORTS
+    #define FWPYTHON_API __declspec(dllexport)
+    #else
+    #define FWPYTHON_API __declspec(dllimport)
+    #endif
+
+    #define FWPYTHON_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWPYTHON_EXPORTS
+    #define FWPYTHON_API __attribute__ ((visibility("default")))
+    #define FWPYTHON_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define FWPYTHON_API __attribute__ ((visibility("hidden")))
+    #define FWPYTHON_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define FWPYTHON_API
+    #define FWPYTHON_CLASS_API
+
+#endif
+
+#endif //FWPYTHON_CONFIG_API
diff --git a/SrcLib/core/fwPython/include/fwPython/namespace.hpp b/SrcLib/core/fwPython/include/fwPython/namespace.hpp
new file mode 100644
index 0000000..44fe19c
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_NAMESPACE_HPP_
+#define _FWPYTHON_NAMESPACE_HPP_
+
+/**
+ * @brief       fwPython provides common foundations for python in fw4spl.
+ * @namespace   fwPython
+ * 
+ * @date        2009-2010.
+ */
+namespace fwPython
+{
+} //namespace fwPython
+
+#endif /* _FWPYTHON_NAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwPython/include/fwPython/python.hpp b/SrcLib/core/fwPython/include/fwPython/python.hpp
new file mode 100644
index 0000000..03b4fb2
--- /dev/null
+++ b/SrcLib/core/fwPython/include/fwPython/python.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWPYTHON_PYTHON_HPP_
+#define _FWPYTHON_PYTHON_HPP_
+
+
+#include <string>
+#include <vector>
+
+#include "fwPython/config.hpp"
+
+
+namespace fwPython
+{
+
+FWPYTHON_API void initialize();
+FWPYTHON_API bool isInitialized();
+FWPYTHON_API void finalize();
+
+FWPYTHON_API void setHome(std::string path);
+FWPYTHON_API void addPath(std::string path);
+
+FWPYTHON_API char* getHome();
+FWPYTHON_API std::vector<std::string> getPath();
+
+} //namespace fwPython
+
+#endif //_FWPYTHON_PYTHON_HPP_
diff --git a/SrcLib/core/fwPython/src/fwPython/Interpreter.cpp b/SrcLib/core/fwPython/src/fwPython/Interpreter.cpp
new file mode 100644
index 0000000..ad1ead6
--- /dev/null
+++ b/SrcLib/core/fwPython/src/fwPython/Interpreter.cpp
@@ -0,0 +1,147 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/python.hpp>
+#include <fwCore/base.hpp>
+
+#include "fwPython/python.hpp"
+#include "fwPython/bindings/base.hpp"
+
+#include "fwPython/Interpreter.hpp"
+
+namespace fwPython
+{
+
+//------------------------------------------------------------------------------
+
+::boost::python::dict GetNamespace( char const* mod )
+{
+    using namespace boost::python;
+    dict moduleNamespace( import( mod ).attr( "__dict__" ) );
+    return moduleNamespace;
+}
+
+//------------------------------------------------------------------------------
+
+Interpreter::Interpreter()
+{
+    ::fwPython::initialize();
+    //SLM_ASSERT( "python is not initialized", ::fwPython::isInitialized() );
+
+    namespace bp = ::boost::python;
+
+    try
+    {
+        // Retrieve the main module.
+        bp::object main = bp::import("__main__");
+        // Retrieve the main module's namespace
+        m_globals= main.attr("__dict__");
+
+        bp::exec("import sys\n"
+                 "\n"
+                 "class fwPyIOHandler:\n"
+                 "    def __init__(self):\n"
+                 "        import cStringIO\n"
+                 "        self.listHook = []\n"
+                 "        self.__stringIO = cStringIO.StringIO()\n"
+                 "\n"
+                 "    def write(self, msg):\n"
+                 "        self.__stringIO.write(msg)\n"
+                 "        for hook in self.listHook:\n"
+                 "            hook.write(msg)\n"
+                 "\n"
+                 "    def read(self, msg):\n"
+                 "        self.__stringIO.read(msg)\n"
+                 "        for hook in self.listHook:\n"
+                 "            hook.read(msg)\n"
+                 "\n"
+                 "    def close(self):\n"
+                 "        self.__stringIO.close()\n"
+                 "        for hook in self.listHook:\n"
+                 "            hook.close()\n"
+                 "\n"
+                 "    def getvalue(self):\n"
+                 "        return self.__stringIO.getvalue()\n"
+                 "\n"
+                 "sys.stderr = fwPyIOHandler()\n"
+                 "sys.stdout = fwPyIOHandler()\n",
+                 m_globals,
+                 bp::dict());
+    }
+    catch( boost::python::error_already_set const &)
+    {
+        PyErr_Print();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+Interpreter::~Interpreter()
+{
+   ::fwPython::finalize();
+}
+
+//------------------------------------------------------------------------------
+
+void Interpreter::addObject( std::string key, ::fwTools::Object::sptr object)
+{
+   namespace bp = ::boost::python;
+    try
+    {
+        ::boost::python::object pyObject = ::boost::python::object( object );
+        m_globals[key] = pyObject;
+    }
+   catch( boost::python::error_already_set const &)
+    {
+        PyErr_Print();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+int Interpreter::execute(std::string code)
+{
+    namespace bp = ::boost::python;
+    int succes=0;
+
+    try
+    {
+        bp::object ignored = bp::exec( code.c_str(), m_globals, m_locals );
+    }
+    catch( bp::error_already_set const &)
+    {
+        PyErr_Print();
+        succes = -1;
+    }
+    return succes;
+}
+
+//------------------------------------------------------------------------------
+
+std::string Interpreter::getAttrValue(const std::string &moduleName, const std::string &attrName)
+{
+    namespace bp = ::boost::python;
+
+    try
+    {
+        bp::object mod(bp::handle<>(PyImport_ImportModule(moduleName.c_str())));
+        bp::object attr = mod.attr(attrName.c_str());
+        return bp::extract<std::string>(attr.attr("getvalue")());
+    }
+    catch( bp::error_already_set const &)
+    {
+        PyErr_Print();
+
+        bp::object sys(bp::handle<>(PyImport_ImportModule("sys")));
+        bp::object out = sys.attr("stderr");
+        return bp::extract<std::string>(out.attr("getvalue")());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwPython/src/fwPython/bindings/Image.cpp b/SrcLib/core/fwPython/src/fwPython/bindings/Image.cpp
new file mode 100644
index 0000000..2553ecb
--- /dev/null
+++ b/SrcLib/core/fwPython/src/fwPython/bindings/Image.cpp
@@ -0,0 +1,157 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/python.hpp>
+#include <boost/python/stl_iterator.hpp>
+#include <boost/preprocessor/cat.hpp>
+
+#include <boost/assign/list_of.hpp>
+
+#include <map>
+#include <fwTools/DynamicType.hpp>
+#include <fwTools/StringKeyTypeMapping.hpp> // for makedynamicType
+
+#include <fwData/Image.hpp>
+#include <fwCore/base.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include "fwPython/bindings/Image.hpp"
+
+#include "fwPython/bindings/STLContainers.hpp"
+
+
+// transform CPP type description in python buffer-info.format
+// format described : http://docs.python.org/library/struct.html#module-struct section 7.3.2.2. Format Characters TODO to complete
+static std::map< ::fwTools::Type, const char * > typeCPP2Python =
+        ::boost::assign::map_list_of
+                                   ( ::fwTools::Type("int8"), "c" )
+                                   ( ::fwTools::Type("uint8"), "B" )
+                                   ( ::fwTools::Type("int16"), "h" )
+                                   ( ::fwTools::Type("uint16"), "H" )
+                                   ( ::fwTools::Type("int32"), "i" )
+                                   ( ::fwTools::Type("uint32"), "I" )
+                                   ( ::fwTools::Type("float"), "f" )
+                                   ( ::fwTools::Type("double"), "d" )
+                                   ;
+
+
+namespace fwPython
+{
+namespace bindings
+{
+
+//------------------------------------------------------------------------------
+
+::boost::python::object getImageBuffer (::fwData::Image::sptr image)
+{
+    using namespace ::boost::python;
+
+    ::fwComEd::helper::Image imageHelper(image);
+    if ( imageHelper.getBuffer() )
+    {
+        Py_buffer *pybuf = new Py_buffer;
+        pybuf->obj = NULL;
+        pybuf->buf = imageHelper.getBuffer();
+        pybuf->readonly= 0;
+        pybuf->len = image->getSizeInBytes();
+        pybuf->format =  (char *)typeCPP2Python[ image->getType() ];
+        pybuf->itemsize =  image->getType().sizeOf() ;
+        pybuf->ndim = image->getNumberOfDimensions();
+        pybuf->shape =  new Py_ssize_t[image->getNumberOfDimensions()];
+        pybuf->strides =  new Py_ssize_t[image->getNumberOfDimensions()];
+        pybuf->suboffsets =  new Py_ssize_t[image->getNumberOfDimensions()];
+        pybuf->internal = NULL;
+
+        std::copy(  image->getSize().begin(), image->getSize().end(), pybuf->shape);
+        std::fill(pybuf->suboffsets, pybuf->suboffsets+3, -1);
+
+        PyBuffer_FillContiguousStrides(   pybuf->ndim , pybuf->shape, pybuf->strides, pybuf->itemsize, 'F');
+
+        handle<> bufHandle( PyMemoryView_FromBuffer( pybuf ) );
+        delete pybuf;
+
+        return object( bufHandle );
+    }
+
+    return object();
+}
+
+//------------------------------------------------------------------------------
+
+std::string getPixelTypeAsString( ::fwData::Image::sptr image )
+{
+    return image->getType().string();
+}
+
+//------------------------------------------------------------------------------
+
+void setPixelTypeFromString( ::fwData::Image::sptr image, std::string type)
+{
+    ::fwTools::Type fwtype = ::fwTools::Type( type );
+    if ( fwtype ==  ::fwTools::Type::s_UNSPECIFIED_TYPE )
+    {
+        FW_RAISE("Incorrect PixelType : supported : int8, uint8, .. 16, ... 32 ... 64 , float,double");
+    }
+    else
+    {
+        image->setType(  fwtype );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+
+#define __FWPYTHON_pygGetSetter( ATTRIB )                                                                       \
+        ::boost::python::list get##ATTRIB(fwData::Image::sptr image)                                 \
+        {                                                                                            \
+            return make_pylist (image->get##ATTRIB() );                                              \
+        }                                                                                            \
+                                                                                                     \
+        void set##ATTRIB( fwData::Image::sptr image, ::boost::python::object ob)                     \
+        {                                                                                            \
+            ::boost::python::stl_input_iterator<fwData::Image::BOOST_PP_CAT(ATTRIB,Type)::value_type> begin(ob), end; \
+            fwData::Image::BOOST_PP_CAT(ATTRIB,Type)  value(begin, end);                                          \
+            image->set##ATTRIB( value );                                                             \
+        }
+
+
+
+__FWPYTHON_pygGetSetter(Size)
+__FWPYTHON_pygGetSetter(Spacing)
+__FWPYTHON_pygGetSetter(Origin)
+
+#undef __FWPYTHON_pygGetSetter
+
+
+// use a wrapper because deepCopy is a virtual function
+void deepCopyImageWrapper( fwData::Image::sptr imageSelf, fwData::Image::sptr imageSrc)
+{
+    imageSelf->deepCopy(imageSrc);
+}
+
+//------------------------------------------------------------------------------
+
+void export_image()
+{
+    using namespace ::boost::python;
+    size_t (::fwData::Image::*SIMPLEIMAGEALLOCATE)(void) =  &::fwData::Image::allocate;
+    class_< ::fwData::Image, bases< ::fwData::Object >, ::fwData::Image::sptr, boost::noncopyable >("Image", no_init)
+       .add_property("buffer",  &getImageBuffer )
+       .add_property("type",  &getPixelTypeAsString, & setPixelTypeFromString )
+       .add_property("spacing", &getSpacing,  &setSpacing )
+       .add_property("size", &getSize,  &setSize )
+       .add_property("origin", &getOrigin,  &setOrigin )
+       .add_property("number_of_dimentions", &::fwData::Image::getNumberOfDimensions )
+       .def("allocate", SIMPLEIMAGEALLOCATE )
+       .def("deepCopy",  deepCopyImageWrapper )
+       ;
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace bindings
+} // end namespace fwPython
diff --git a/SrcLib/core/fwPython/src/fwPython/bindings/STLContainers.cpp b/SrcLib/core/fwPython/src/fwPython/bindings/STLContainers.cpp
new file mode 100644
index 0000000..50a3106
--- /dev/null
+++ b/SrcLib/core/fwPython/src/fwPython/bindings/STLContainers.cpp
@@ -0,0 +1,89 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/python.hpp>
+#include <boost/cstdint.hpp>
+
+#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
+#include <boost/python/make_constructor.hpp>
+
+#include <boost/algorithm/string/replace.hpp>
+
+#include <vector>
+
+#include <fwTools/Stringizer.hpp>
+#include <fwCore/Demangler.hpp>
+#include "fwPython/bindings/STLContainers.hpp"
+
+namespace fwPython
+{
+namespace bindings
+{
+
+template <class T>
+std::string getString(std::vector<T> &v)
+{
+    std::string res;
+    res +=  fwTools::getString(v.begin(),v.end());
+    return res;
+}
+
+
+template< typename VECTOR >
+VECTOR *vectorFromList( ::boost::python::list  &ns )
+{
+    unsigned long  len = ::boost::python::len(ns);
+    VECTOR *vect = new VECTOR( len );
+    for (unsigned long i=0; i<len; ++i )
+        (*vect)[i] = ::boost::python::extract<typename VECTOR::value_type> (ns[i]);
+    return vect;
+}
+
+
+
+
+template< typename T >
+void wrap_vector()
+{
+    using namespace boost::python;
+    std::string className = ::fwCore::Demangler(typeid(typename T::value_type)).getLeafClassname();
+    ::boost::algorithm::replace_all( className, " ", "");
+    className += "Container";
+    std::string docString = std::string( "binding of " ) + ::fwCore::Demangler(typeid(T)).getClassname();
+    class_< T  >( className.c_str(), docString.c_str(), init< typename T::size_type > () )
+        .def("__init__", make_constructor( vectorFromList< T > ))
+        // install wrapper to __len__, __getitem__, __setitem__, __delitem__, __iter__ and __contains.
+        .def(vector_indexing_suite< T >())
+
+        // allow a pretty print
+        .def("__str__", getString< typename T::value_type >)
+        ;
+}
+//------------------------------------------------------------------------------
+
+void export_STLContainers()
+{
+    using namespace boost::python;
+    wrap_vector< std::vector<boost::int8_t> >();
+    wrap_vector< std::vector<boost::int16_t> >();
+    wrap_vector< std::vector<boost::int32_t> >();
+    wrap_vector< std::vector<boost::int64_t> >();
+
+    wrap_vector< std::vector<boost::uint8_t> >();
+    wrap_vector< std::vector<boost::uint16_t> >();
+    wrap_vector< std::vector<boost::uint32_t> >();
+    wrap_vector< std::vector<boost::uint64_t> >();
+
+    wrap_vector< std::vector<float> >();
+    wrap_vector< std::vector<double> >();
+
+#ifdef __MACOSX__
+    wrap_vector< std::vector<size_t> >();
+#endif
+}
+
+} // end namespace bindings
+} // end namespace fwPython
diff --git a/SrcLib/core/fwPython/src/fwPython/bindings/base.cpp b/SrcLib/core/fwPython/src/fwPython/bindings/base.cpp
new file mode 100644
index 0000000..94a4c0a
--- /dev/null
+++ b/SrcLib/core/fwPython/src/fwPython/bindings/base.cpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/python.hpp>
+#include <iostream>
+
+#include <fwTools/Object.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwServices/IService.hpp>
+
+#include "fwPython/python.hpp"
+#include "fwPython/bindings/base.hpp"
+#include "fwPython/bindings/Image.hpp"
+#include "fwPython/bindings/STLContainers.hpp"
+
+
+// HACK -- CRIME SCENE -- DOT NOT CROSS {
+struct IServiceProxy
+{
+    typedef SPTR(IServiceProxy) sptr ;
+
+    IServiceProxy(const ::fwTools::Object::sptr obj)
+    {
+        ::fwServices::IService::sptr service;
+        service = ::fwServices::IService::dynamicCast(obj);
+        SLM_ASSERT("Cast to service failed", service);
+        this->m_service = service;
+    };
+
+    void start() { m_service->start();  };
+    void update(){ m_service->update();   };
+    void stop()  { m_service->stop(); };
+
+    ::fwServices::IService::sptr m_service;
+
+};
+// }
+
+
+
+IServiceProxy getSrv(std::string o)
+{
+    ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject( o );
+    IServiceProxy proxy(obj);
+    return proxy;
+}
+
+BOOST_PYTHON_MODULE(fwData) // create a void initimage() function
+{                         // install  Py_InitModule with name + methods/class/function
+    using namespace ::boost::python;
+
+    // fwTools::Object binding
+    class_< ::fwTools::Object , ::fwTools::Object::sptr, boost::noncopyable >("Object",no_init)
+                .def("getClassname", &::fwTools::Object::className );
+
+    def( "getObject", &::fwTools::fwID::getObject );
+    def( "getSrv", &getSrv );
+
+    // fwData::Object binding
+    class_<
+        ::fwData::Object,
+        bases< ::fwTools::Object >,
+        ::fwData::Object::sptr,
+        boost::noncopyable
+            >("Object",no_init);
+
+    // fwServices::IService binding
+
+    class_< IServiceProxy >("IService",no_init)
+        .def("update", &IServiceProxy::update)
+        .def("start", &IServiceProxy::start)
+        .def("stop", &IServiceProxy::stop)
+        ;
+
+    // fwData:: generic fields bindings
+    class_<
+        ::fwData::Boolean,
+        bases< ::fwData::Object >,
+        ::fwData::Boolean::sptr,
+        boost::noncopyable
+            >("Boolean", no_init)
+            .add_property("value",  &::fwData::Boolean::getValue  ,  &::fwData::Boolean::setValue );
+
+    class_< ::fwData::Float, bases< ::fwData::Object >, ::fwData::Float::sptr, boost::noncopyable >("Float", no_init)
+              .add_property("value",  &::fwData::Float::getValue  ,  &::fwData::Float::setValue );
+
+    class_<
+        ::fwData::Integer,
+        bases< ::fwData::Object >,
+        ::fwData::Integer::sptr,
+        boost::noncopyable
+            >("Integer", no_init)
+              .add_property("value",  &::fwData::Integer::getValue  ,  &::fwData::Integer::setValue );
+
+    class_<
+        ::fwData::String,
+        bases< ::fwData::Object >,
+        ::fwData::String::sptr,
+        boost::noncopyable
+            >("String", no_init)
+              .add_property("value",  &::fwData::String::getValue  ,  &::fwData::String::setValue );
+
+    ::fwPython::bindings::export_STLContainers();
+    ::fwPython::bindings::export_image();
+
+}
+
+
+namespace fwPython
+{
+namespace bindings
+{
+
+void initialize()
+{
+    static bool initialized = false;
+    if (initialized)
+    {
+        return;
+    }
+
+    SLM_ASSERT(
+            "Python interpreter have to be initialzed before bindings.",
+            ::fwPython::isInitialized()
+            );
+
+    initfwData();
+    initialized = true;
+}
+
+} //namespace bindings
+} //namespace fwPython
+
diff --git a/SrcLib/core/fwPython/src/fwPython/python.cpp b/SrcLib/core/fwPython/src/fwPython/python.cpp
new file mode 100644
index 0000000..4610c1e
--- /dev/null
+++ b/SrcLib/core/fwPython/src/fwPython/python.cpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/python.hpp>
+#undef tolower  //defined by python, conflicting with std::lower
+
+#include <fwTools/Object.hpp>
+
+#include <fwData/Boolean.hpp>
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwPython/python.hpp"
+
+namespace fwPython
+{
+
+class Config
+{
+public:
+    static char *home;
+
+};
+
+char *Config::home = NULL;
+
+//------------------------------------------------------------------------------
+
+char * charFromString(std::string str)
+{
+    char *dest = new char[str.size() + 1];
+    std::copy(str.begin(), str.end(), dest);
+    dest[str.size()] = '\0';
+    return dest;
+}
+
+//------------------------------------------------------------------------------
+
+void initialize()
+{
+    if(!Py_IsInitialized())
+    {
+        Py_InitializeEx(0); // 0 -> do not handle signals
+        SLM_ASSERT( "python initialization failed ", isInitialized() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool isInitialized()
+{
+    return Py_IsInitialized();
+}
+
+//------------------------------------------------------------------------------
+
+void finalize()
+{
+    //Currently, boost recommends to *not* finalize python
+    //Py_Finalize();
+    return;
+}
+
+//------------------------------------------------------------------------------
+
+void setHome(std::string dir)
+{
+    if(!Py_IsInitialized())
+    {
+        if (::fwPython::Config::home)
+        {
+            delete [] ::fwPython::Config::home;
+        }
+
+        ::fwPython::Config::home = charFromString(dir);
+
+        Py_SetPythonHome( ::fwPython::Config::home );
+        OSLM_INFO("Python Home set to " << dir);
+    }
+    SLM_ERROR_IF("Python home must be set before python initialisation", Py_IsInitialized());
+}
+
+//------------------------------------------------------------------------------
+
+void addPath(std::string dir)
+{
+    namespace bp = ::boost::python;
+    SLM_ERROR_IF("Python must be initialized before adding a new dir", Py_IsInitialized());
+
+    bp::object sys = bp::import("sys");
+    sys.attr("path").attr("insert")(0, dir);
+
+    OSLM_INFO(dir << " appended to Python Path");
+}
+
+//------------------------------------------------------------------------------
+
+char* getHome()
+{
+    return ::fwPython::Config::home;
+}
+
+
+
+} // namespace fwPython
diff --git a/SrcLib/core/fwPython/test/CMakeLists.txt b/SrcLib/core/fwPython/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/core/fwPython/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwPython/test/Properties.cmake b/SrcLib/core/fwPython/test/Properties.cmake
new file mode 100644
index 0000000..6a542d4
--- /dev/null
+++ b/SrcLib/core/fwPython/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwPythonTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwData fwPython )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwPython/test/cppunit.options b/SrcLib/core/fwPython/test/cppunit.options
new file mode 100644
index 0000000..0649b30
--- /dev/null
+++ b/SrcLib/core/fwPython/test/cppunit.options
@@ -0,0 +1,8 @@
+
+CLASSTEST=[
+    'InterpreterTest',
+]
+
+USE = ['boost','python']
+LIB = ['fwData_0-1','fwPython_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwPython/test/tu/include/InterpreterTest.hpp b/SrcLib/core/fwPython/test/tu/include/InterpreterTest.hpp
new file mode 100644
index 0000000..86629b0
--- /dev/null
+++ b/SrcLib/core/fwPython/test/tu/include/InterpreterTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWPYTHON_INTERPRETERTEST_HPP__
+#define __FWPYTHON_INTERPRETERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwPython
+{
+namespace ut
+{
+
+class InterpreterTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( InterpreterTest );
+    CPPUNIT_TEST( helloWorld );
+    CPPUNIT_TEST( fail );
+    CPPUNIT_TEST( import );
+    CPPUNIT_TEST( importFwDataBindings );
+    CPPUNIT_TEST( testFwDataBindings );
+    CPPUNIT_TEST( changeValue );
+    CPPUNIT_TEST_SUITE_END();
+protected:
+
+public:
+    InterpreterTest();
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+    void helloWorld();
+    void fail();
+    void import();
+    void importFwDataBindings();
+    void testFwDataBindings();
+    void changeValue();
+};
+
+} // namespace ut
+} // namespace fwPython
+
+#endif //__FWPYTHON_INTERPRETERTEST_HPP__
diff --git a/SrcLib/core/fwPython/test/tu/src/InterpreterTest.cpp b/SrcLib/core/fwPython/test/tu/src/InterpreterTest.cpp
new file mode 100644
index 0000000..efd53df
--- /dev/null
+++ b/SrcLib/core/fwPython/test/tu/src/InterpreterTest.cpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+#include <vector>
+#include <ostream>
+#include <map>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/assign/std/vector.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwData/String.hpp>
+#include <fwData/factory/new.hpp>
+
+#include "fwPython/python.hpp"
+#include "fwPython/bindings/base.hpp"
+#include "fwPython/Interpreter.hpp"
+#include "InterpreterTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwPython::ut::InterpreterTest );
+
+namespace fwPython
+{
+namespace ut
+{
+
+InterpreterTest::InterpreterTest()
+{
+    ::fwPython::setHome("./PythonHome");
+    ::fwPython::initialize();
+    ::fwPython::bindings::initialize();
+}
+
+void InterpreterTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void InterpreterTest::tearDown()
+{
+    ::fwPython::finalize();
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::helloWorld()
+{
+    fwPython::Interpreter interpreter;
+
+    int succes;
+
+    succes = interpreter.execute(
+            "a = 'hello world'\n"
+            );
+
+    CPPUNIT_ASSERT_EQUAL( succes , 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::fail()
+{
+    fwPython::Interpreter interpreter;
+
+    int succes;
+
+    succes = interpreter.execute(
+            "assert 0\n"
+            );
+
+    CPPUNIT_ASSERT_EQUAL( succes , -1 );
+}
+
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::import()
+{
+    fwPython::Interpreter interpreter;
+
+    int succes;
+
+    succes = interpreter.execute(
+            "import os\n"
+            "assert os\n"
+            );
+
+    CPPUNIT_ASSERT_EQUAL( succes , 0 );
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::importFwDataBindings()
+{
+    fwPython::Interpreter interpreter;
+
+    int succes;
+    succes = interpreter.execute(
+            "import fwData\n"
+            );
+
+    CPPUNIT_ASSERT_EQUAL( succes , 0 );
+}
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::testFwDataBindings()
+{
+    fwPython::Interpreter interpreter;
+    int succes;
+
+
+    //::fwData::Object::sptr dataObj   =  ::fwData::String::New("fwData::String as Data::Object");
+    //::fwTools::Object::sptr toolsObj =  ::fwData::String::New("fwData::String as fwTools::Object");
+
+    //::fwData::String::sptr str =  ::fwData::String::New("a string in fwData");
+
+    using namespace boost::assign;
+    std::vector<std::string> classes;
+    classes += "String", "Float", "Integer", "Boolean";
+
+
+    std::string base = "::fwData::";
+    BOOST_FOREACH(std::string name, classes)
+    {
+        std::string klass = base + name;
+        interpreter.addObject(name, ::fwData::factory::New(klass) );
+
+        std::string code = std::string();
+        code += "assert " + name + "\n";
+        code += "assert repr(" + name + ").startswith('<fwData." + name + " object at ')\n";
+        code += "assert " + name + ".getClassname() == '" + klass + "'\n";
+
+        succes = interpreter.execute( code );
+        CPPUNIT_ASSERT_EQUAL( succes , 0 );
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void InterpreterTest::changeValue()
+{
+    fwPython::Interpreter interpreter;
+
+    int succes;
+
+    ::fwData::String::sptr str =  ::fwData::String::New("a string in fwData");
+    interpreter.addObject("myStr", str );
+
+    succes = interpreter.execute(
+            "assert myStr.value == 'a string in fwData'\n"
+            "myStr.value = 'changed value in python'\n"
+            );
+
+    CPPUNIT_ASSERT_EQUAL( succes , 0 );
+    CPPUNIT_ASSERT_EQUAL( str->value() , std::string("changed value in python") );
+}
+
+} // namespace ut
+} // namespace fwPython
diff --git a/SrcLib/core/fwRender/CMakeLists.txt b/SrcLib/core/fwRender/CMakeLists.txt
new file mode 100644
index 0000000..2d6007d
--- /dev/null
+++ b/SrcLib/core/fwRender/CMakeLists.txt
@@ -0,0 +1,10 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwGui
+    fwServices
+    fwTools
+)
+
+
+
+
diff --git a/SrcLib/core/fwRender/COPYING b/SrcLib/core/fwRender/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwRender/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwRender/COPYING.LESSER b/SrcLib/core/fwRender/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwRender/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwRender/Properties.cmake b/SrcLib/core/fwRender/Properties.cmake
new file mode 100644
index 0000000..bc7dcb0
--- /dev/null
+++ b/SrcLib/core/fwRender/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwRender )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwGui fwRuntime fwServices fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwRender/bin/build.options b/SrcLib/core/fwRender/bin/build.options
new file mode 100644
index 0000000..f57c018
--- /dev/null
+++ b/SrcLib/core/fwRender/bin/build.options
@@ -0,0 +1,7 @@
+USE     = ['boost']
+LIB     = ['fwRuntime_0-3','fwServices_0-1','fwTools_0-1','fwCore_0-1','fwGui_0-1']
+
+TYPE    = 'shared'
+VERSION = '0-1'
+
+
diff --git a/SrcLib/core/fwRender/include/fwRender/IRender.hpp b/SrcLib/core/fwRender/include/fwRender/IRender.hpp
new file mode 100644
index 0000000..114a29a
--- /dev/null
+++ b/SrcLib/core/fwRender/include/fwRender/IRender.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDER_IRENDER_HPP_
+#define _FWRENDER_IRENDER_HPP_
+
+#include <fwTools/Failed.hpp>
+#include <fwServices/IService.hpp>
+
+#include <fwGui/IGuiContainerSrv.hpp>
+
+#include "fwRender/config.hpp"
+
+class wxWindow;
+
+namespace fwRender
+{
+
+/**
+ * @brief   Defines the service interface managing the rendering service for object.
+ * @class   IRender
+ * 
+ * @date    2007-2009.
+ *
+ * Use the base service methods :
+ * @li The service is configured with methods setConfiguration(cfg) and configure()
+ * @li The method start() initialize the service
+ * @li Use update() method to update data
+ * @li To react on modifications use update(msg)
+ * @li Finally we must call stop() before deleting the service
+ *
+ */
+class FWRENDER_CLASS_API IRender : public ::fwGui::IGuiContainerSrv
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IRender)(::fwGui::IGuiContainerSrv) ) ;
+
+protected :
+
+    /**
+     * @brief   Constructor. Initialize default values.
+     */
+    FWRENDER_API IRender() throw() ;
+
+    /**
+     * @brief   Destructor. Do nothing.
+     */
+    FWRENDER_API virtual ~IRender() throw() ;
+
+};
+
+} // namespace fwRenderVTK
+
+#endif /*_FWRENDER_IRENDER_HPP_*/
+
+
diff --git a/SrcLib/core/fwRender/include/fwRender/Namespace.hpp b/SrcLib/core/fwRender/include/fwRender/Namespace.hpp
new file mode 100644
index 0000000..fc86d67
--- /dev/null
+++ b/SrcLib/core/fwRender/include/fwRender/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRENDERNAMESPACE_HPP_
+#define FWRENDERNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwRender contains the base interface for rendering services.
+ * @namespace   fwRender
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwRender
+{
+}
+#endif /* FWRENDERNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRender/include/fwRender/config.hpp b/SrcLib/core/fwRender/include/fwRender/config.hpp
new file mode 100644
index 0000000..17e89a4
--- /dev/null
+++ b/SrcLib/core/fwRender/include/fwRender/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDER_CONFIG_HPP_
+#define _FWRENDER_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWRENDER_EXPORTS
+    #define FWRENDER_API __declspec(dllexport)
+    #else
+    #define FWRENDER_API __declspec(dllimport)
+    #endif
+
+    #define FWRENDER_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWRENDER_EXPORTS
+    #define FWRENDER_API __attribute__ ((visibility("default")))
+    #define FWRENDER_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define FWRENDER_API __attribute__ ((visibility("hidden")))
+    #define FWRENDER_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define FWRENDER_API
+    #define FWRENDER_CLASS_API
+
+#endif
+
+#endif //FWRENDER_API
diff --git a/SrcLib/core/fwRender/src/fwRender/IRender.cpp b/SrcLib/core/fwRender/src/fwRender/IRender.cpp
new file mode 100644
index 0000000..e30a9bf
--- /dev/null
+++ b/SrcLib/core/fwRender/src/fwRender/IRender.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+
+#include <fwCore/base.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/operations.hpp>
+
+#include <fwServices/Base.hpp>
+
+
+#include "fwRender/IRender.hpp"
+
+namespace fwRender
+{
+
+//-----------------------------------------------------------------------------
+
+IRender::IRender() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+IRender::~IRender() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwRuntime/CHANGES b/SrcLib/core/fwRuntime/CHANGES
new file mode 100644
index 0000000..d4fe0af
--- /dev/null
+++ b/SrcLib/core/fwRuntime/CHANGES
@@ -0,0 +1,102 @@
+* 24-05-2005 *
+
+	+ Added a new runtime::getBundleResourcePath function.
+	
+
+* 20-05-2005 *
+
+	+ When defining an extension, use "implements" instead of "point" to
+	  declare the extension point to connect to.
+	  
+	- Bug fixed. When starting a bundle, and exception is raised to notify
+	  when no matching bundle has been found.
+	  
+	  
+* 18-05-2005 *
+
+	+ Added a new "requirement" declaration in the plugin descriptor.
+	  This allows to declare which bundles must start their dynamic
+	  libraries before one can load its libraries too. This has been
+	  designed to avoid the system to load automatically dynamic libraries
+	  before a bundle tries, avoiding some conflicts during C++
+	  initializations.
+	  
+
+* 03-05-2005 *
+
+	+ Added a new global operation to retrieve configuration elements
+	  contributed by extensions directly.
+	  See runtime::getAllConfigurationElementsForPoint for details.
+	
+	~ The runtime::Shp class hase been removed. Now boost::shared_ptr
+	  is directly used instead. The migration will be as simple as
+	  replacing every "Shp" by "shared_ptr" in your code.
+
+
+* 28-04-2005 *
+
+	+ runtime::loadBundles now normalizes the directory path before
+	  trying to explore this path for bundles. This asserts that the
+	  specified path form is valid.
+
+
+* 26-04-2005 *
+
+	+ Added method for creating an executable instance from a configuration
+	  element instance.
+
+	~ Changes in ExtensionPoint class.
+	  Added pointer to the bundle.
+	  Added support for XML schema path attribute.
+	  Added method to enumerate all contributed extensions.
+	  
+	~ Code clean-up.
+	
+	- In class Runtime, getExtensionForPoint has been removed.
+	  
+
+* 22-04-2005 *
+
+	- Bug fixed.
+	  The runtime rejected several extensions that didn't have an
+      identifier (actually, identifier on extensions are optionnal).
+    
+    ~ ConfigurationElement interface changed.
+      The old "getAttributeValue" is now "getSafeAttributeValue". A new
+      "getAttributeValue" has been added. See releated documentation
+      for futher information.
+
+* 20-04-2005 *
+
+	- Bug fixed.
+	  While loading bundles, the runtime crashed due to a miss handled
+	  pointer.
+	  
+
+* 14-04-2005 *
+
+	+ Added iterator for configuration element's children.
+	
+	
+* 13-04-2005 *
+
+	+ Creation of a change log file located at the root directory of the project.
+	
+	+ Generalisation of the use of shared pointers. This may need a deep
+	  update of your code. See "include/runtime/Shp.hpp" to see how does
+	  the shared pointer type look like.
+	
+	+ Generalisation of the iterator use to access nested collection of
+	  objects. This involves a deep update of your code too. You should
+	  have a look at "include/runtime/iterators.hpp" as a start point to
+	  understand the new iterator architecture. This architecture provides
+	  the acces to native stl iterators.
+	  
+	~ "loadBundles" has been removed from runtime::Runtime class. Now you
+	  must use "runtime::io::loadBundles" instead. You will find theis function's
+	  declaration in "include/runtime/io/operations.hpp".
+	  
+	- When exploring a bundle repository for "plugin.xml" files, a exception
+	  was raised when a supposed bundle directory did not containt a
+	  "plugin.xml" file. Now a warning message is sent to std::cerr. This
+	  could be improved by the use of a logging architecture.
\ No newline at end of file
diff --git a/SrcLib/core/fwRuntime/CMakeLists.txt b/SrcLib/core/fwRuntime/CMakeLists.txt
new file mode 100644
index 0000000..b77cec7
--- /dev/null
+++ b/SrcLib/core/fwRuntime/CMakeLists.txt
@@ -0,0 +1,19 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(fwCore)
+
+
+find_package (Boost COMPONENTS regex filesystem system date_time REQUIRED)
+find_package (LibXml2)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS} 
+    ${LIBXML2_INCLUDE_DIR}
+    )
+
+fwLink(
+    ${LIBXML2_LIBRARIES} 
+    ${Boost_LIBRARIES}
+    )
+
diff --git a/SrcLib/core/fwRuntime/COPYING b/SrcLib/core/fwRuntime/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwRuntime/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwRuntime/COPYING.LESSER b/SrcLib/core/fwRuntime/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwRuntime/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwRuntime/Properties.cmake b/SrcLib/core/fwRuntime/Properties.cmake
new file mode 100644
index 0000000..50b7acf
--- /dev/null
+++ b/SrcLib/core/fwRuntime/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwRuntime )
+set( VERSION 0.3 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwRuntime/bin/build.options b/SrcLib/core/fwRuntime/bin/build.options
new file mode 100644
index 0000000..463bf27
--- /dev/null
+++ b/SrcLib/core/fwRuntime/bin/build.options
@@ -0,0 +1,10 @@
+TYPE    = 'shared'
+USE     = ['boost', 'boostFilesystem', 'boostRegex', 'libxml2']
+LIB     = ['fwCore_0-1']
+VERSION = '0-3'
+
+# Special glitch under linux.
+import os
+import sys
+if os.name == 'posix' and sys.platform == 'darwin' :
+    STDLIB = ['dl']
diff --git a/SrcLib/core/fwRuntime/doc/doxygen/doxyfile b/SrcLib/core/fwRuntime/doc/doxygen/doxyfile
new file mode 100644
index 0000000..3c66bb8
--- /dev/null
+++ b/SrcLib/core/fwRuntime/doc/doxygen/doxyfile
@@ -0,0 +1,214 @@
+# Doxyfile 1.3.9.1
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = runtime
+PROJECT_NUMBER = 
+OUTPUT_DIRECTORY = 
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" "The $name widget" "The $name file" is provides specifies contains represents a an the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = ../bin/
+STRIP_FROM_INC_PATH = 
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 4
+ALIASES = 
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST = YES
+ENABLED_SECTIONS = 
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = ../../include/ ../../src/ 
+FILE_PATTERNS = *.cxx *.cpp *.h *.hxx *.hpp *.txx
+RECURSIVE = YES
+EXCLUDE = 
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS = 
+EXAMPLE_PATH = 
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH = 
+INPUT_FILTER = 
+FILTER_PATTERNS = 
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER = 
+HTML_FOOTER = 
+HTML_STYLESHEET = 
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE = 
+HHC_LOCATION = 
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES = 
+LATEX_HEADER = 
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE = 
+RTF_EXTENSIONS_FILE = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA = 
+XML_DTD = 
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH = 
+INCLUDE_FILE_PATTERNS = 
+PREDEFINED = 
+EXPAND_AS_DEFINED = 
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES = 
+GENERATE_TAGFILE = 
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH = 
+DOTFILE_DIRS = 
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 1000
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
diff --git a/SrcLib/core/fwRuntime/header.txt b/SrcLib/core/fwRuntime/header.txt
new file mode 100644
index 0000000..281b7fb
--- /dev/null
+++ b/SrcLib/core/fwRuntime/header.txt
@@ -0,0 +1,3 @@
+// runtime - copyright (C) 2004-2005 IRCAD.
+// 
+// author	Guillaume Brocker
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Bundle.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Bundle.hpp
new file mode 100644
index 0000000..402c1d2
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Bundle.hpp
@@ -0,0 +1,475 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_BUNDLE_HPP
+#define _FWRUNTIME_BUNDLE_HPP
+
+#include <map>
+#include <set>
+#include <string>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "fwCore/base.hpp"
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/Version.hpp"
+#include "fwRuntime/dl/Library.hpp"
+
+namespace fwRuntime
+{
+    struct Extension;
+    struct ExtensionPoint;
+    struct ExtensionRegistry;
+    struct IExecutable;
+    struct ExecutableFactory;
+    struct IPlugin;
+    struct Runtime;
+
+    namespace io
+    {
+        struct BundleDescriptorReader;
+    }
+}
+
+
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Defines the bundle class.
+ * @struct  Bundle
+ * @date    2004-2009
+ * 
+ */
+struct Bundle : public ::boost::enable_shared_from_this< Bundle >
+{
+    friend struct ::fwRuntime::io::BundleDescriptorReader;
+
+
+    /**
+     * @name    Type definitions
+     */
+    //@{
+    typedef std::set< SPTR( ExecutableFactory ) >      ExecutableFactoryContainer;     ///< Defines the executable factory container type.
+    typedef ExecutableFactoryContainer::const_iterator ExecutableFactoryConstIterator; ///< Defines the executable factory container constant iterator type.
+
+    typedef std::set< SPTR( Extension ) >      ExtensionContainer;             ///< Defines the extension container type.
+    typedef ExtensionContainer::const_iterator ExtensionConstIterator;         ///< Defines the extension container constant iterator type.
+
+    typedef std::set< SPTR( ExtensionPoint ) >      ExtensionPointContainer;        ///< Defines the extension point container type.
+    typedef ExtensionPointContainer::const_iterator ExtensionPointConstIterator;    ///< Defines the extension point container constant iterator type.
+
+    typedef std::set< SPTR(dl::Library) >     LibraryContainer;               ///< Defines the dynamic library container type.
+    typedef LibraryContainer::const_iterator  LibraryConstIterator;           ///< Defines the dynamic library container constant iterator type.
+    //@}
+
+
+    /**
+     * @brief   Retrieves the pointer to the bundle that is currently loading its dynamic libraries
+     */
+    static SPTR( Bundle ) getLoadingBundle();
+
+
+    /**
+     * @name    Dynamic Libraries
+     */
+    //@{
+    /**
+     * @brief       Adds the specified library to the bundle.
+     *
+     * @param[in]   library a shared pointer to the library to add
+     */
+    FWRUNTIME_API void addLibrary( SPTR( dl::Library ) library );
+
+    /**
+     * @brief   Retrieves the iterator on the first item
+     *          in the managed dynamic library collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API LibraryConstIterator librariesBegin() const;
+
+    /**
+     * @brief   Retrieves the iterator on the ending item
+     *          in the managed dynamic library collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API LibraryConstIterator librariesEnd() const;
+    //@}
+
+
+    /**
+     * @name    Executable Factories & Dynamic Objects Instantiation
+     */
+    //@{
+    /**
+     * @brief       Adds an executable factory instance to the bundle.
+     *
+     * @param[in]   factory a shared pointer to the executable factory instance to add
+     */
+    FWRUNTIME_API void addExecutableFactory( SPTR( ExecutableFactory ) factory );
+
+    /**
+     * @brief   Create an instance of the given executable object type.
+     *
+     * @param   type    a string containing an executable type
+     *
+     * @return  a pointer to the created executable instance
+     *
+     * @todo    not implemented and not used !!!!!!!
+     */
+    FWRUNTIME_API IExecutable * createExecutableInstance( const std::string & type ) throw( RuntimeException );
+
+    /**
+     * @brief   Retrieves the iterator on the first item
+     *          in the managed executable factory collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExecutableFactoryConstIterator executableFactoriesBegin() const;
+
+    /**
+     * @brief   Retrieves the iterator on the ending item
+     *          in the managed executable factory collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExecutableFactoryConstIterator executableFactoriesEnd() const;
+
+    /**
+     * @brief       Retrieves the executable factory instance for the specified type name.
+     *
+     * @param[in]   type    a string containing a type name
+     *
+     * @return      a shared pointer to the found executable factory instance or null if none
+     */
+    FWRUNTIME_API SPTR( ExecutableFactory ) findExecutableFactory( const std::string & type ) const;
+    //@}
+
+
+    /**
+     * @name    Extensions
+     */
+    //@{
+    /**
+     * @brief       Adds the specified extension to the bundle.
+     *
+     * @param[in]   extension   a shared pointer to the extension to add
+     */
+    void addExtension( SPTR( Extension ) extension );
+
+    /**
+     * @brief       Tells if an specific extension exists.
+     *
+     * @param[in]   identifier  the extension identifier
+     *
+     * @return      true or false
+     */
+    FWRUNTIME_API bool hasExtension(const std::string & identifier) const;
+
+    /**
+     * @brief       Search a specific extension in the bundle to enable or
+     *              disable it
+     *
+     * @remark      if the extension is not found, the method do nothing.
+     *
+     * @param[in]   identifier  the extension identifier
+     * @param[in]   enable      enable or disable this extension
+     */
+    FWRUNTIME_API void setEnableExtension(const std::string & identifier, const bool enable);
+
+    /**
+     * @brief   Retrieves the iterator on the first item
+     *          in the managed extension collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionConstIterator extensionsBegin() const;
+
+    /**
+     * @brief   Retrieves the iterator on the ending item
+     *          in the managed extension collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionConstIterator extensionsEnd() const;
+    //@}
+
+
+    /**
+     * @name    Extension Points
+     */
+    //@{
+    /**
+     * @brief       Adds the specified extension point to the bundle.
+     *
+     * @param[in]   extension   a shared pointer to the extension point to add
+     */
+    void addExtensionPoint( SPTR( ExtensionPoint ) extension );
+
+    /**
+     * @brief       Retrieves the extension point for the given identifier.
+     *
+     * @param[in]   identifier  a string containing the extension point identifier
+     *
+     * @return      a shared pointer to the found extensoin point, may be empty if none
+     */
+    FWRUNTIME_API SPTR( ExtensionPoint ) findExtensionPoint( const std::string & identifier ) const;
+
+    /**
+     * @brief       Tells if a specific extension point exists.
+     *
+     * @param[in]   identifier  the extension point identifier
+     *
+     * @return      true or false
+     */
+    FWRUNTIME_API bool hasExtensionPoint(const std::string & identifier) const;
+
+    /**
+     * @brief       Search a specific extension point in the bundle to enable or
+     *              disable it
+     *
+     * @remark      if the extension point is not found, the method do nothing.
+     *
+     * @param[in]   identifier  the extension point identifier
+     * @param[in]   enable      enable or disable this extension point
+     */
+    FWRUNTIME_API void setEnableExtensionPoint(const std::string & identifier, const bool enable);
+
+    /**
+     * @brief   Retrieves the iterator on the first item
+     *          in the managed extension point collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionPointConstIterator extensionPointsBegin() const;
+
+    /**
+     * @brief   Retrieves the iterator on the ending item
+     *          in the managed extension point collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionPointConstIterator extensionPointsEnd() const;
+    //@}
+
+
+    /**
+     * @name    Misc
+     */
+    //@{
+    /**
+     * @brief       Adds a requirement to the bundle.
+     *
+     * @param[in]   requirement a string containing a bundle identifier that is required
+     */
+    FWRUNTIME_API void addRequirement( const std::string & requirement );
+
+    /**
+     * @brief   Retrieves the bundle identifier.
+     *
+     * @return  a string containing the bundle identifier
+     */
+    FWRUNTIME_API const std::string & getIdentifier() const;
+
+    /**
+     * @brief   Retrieves the bundle location.
+     *
+     * @return  a path representing the bundle location
+     */
+    FWRUNTIME_API const boost::filesystem::path & getLocation() const;
+
+    /**
+     * @brief   Retrieves the class representing the bundle executable part.
+     *
+     * @return  a string containing the bundle's plugin class
+     */
+    FWRUNTIME_API const std::string getClass() const;
+
+    /**
+     * @brief   Retrieves the version of the bundle.
+     *
+     * @return  the bundle version
+     */
+    FWRUNTIME_API const Version & getVersion() const;
+
+    /**
+     * @brief   Retrieves the plugin instance for the specified bundle identifier.
+     *
+     * @return  a shared pointer to a plugin instance or null if the bundle has not been started.
+     */
+    FWRUNTIME_API SPTR( IPlugin ) getPlugin() const;
+    //@}
+
+
+    /**
+     * @name        State Management
+     */
+    //@{
+    /**
+     * @brief   Tells if the bundle is enable.
+     */
+    FWRUNTIME_API bool isEnable() const;
+
+    /**
+     * @brief   Changes the enable state of the bundle.
+     *
+     * @remark  It is possible to disable a started bundle but this
+     *          will have no effect.
+     */
+    FWRUNTIME_API void setEnable( const bool state );
+
+    /**
+     * @brief   Starts the bundle.
+     *
+     * @remark  The bundle must be enabled to be able to start.
+     */
+    FWRUNTIME_API void start() throw(RuntimeException);
+
+    FWRUNTIME_API void stop() throw(RuntimeException);
+    //@}
+
+
+    /**
+     * @brief   Initialize the bundle.
+     *
+     * @remark  The bundle and it's own dependencies must be started to be able to be initialized.
+     */
+    FWRUNTIME_API void initialize() throw(RuntimeException);
+
+    FWRUNTIME_API void uninitialize() throw(RuntimeException);
+    //@}
+
+
+    /**
+     * @name    Parameters Management
+     */
+    //@{
+    /**
+     * @brief       Adds a parameter to the bundle.
+     *
+     * @param[in]   identifier  a string containing the parameter identifier
+     * @param[in]   value       a string containing the parameter value
+     */
+    FWRUNTIME_API void addParameter( const std::string & identifier, const std::string & value );
+
+    /**
+     * @brief       Retrieves the value of the given parameter
+     *
+     * @remark      When no such parameter has been found, an empty string is returned.
+     *
+     * @see         hasParameter
+     *
+     * @param[in]   identifier  a string containing a parameter identifier
+     *
+     * @return      a string containing the parameter value
+     */
+    FWRUNTIME_API const std::string getParameterValue( const std::string & identifier ) const;
+
+    /**
+     * @brief   Tells if a parameter exists.
+     *
+     * @return  true or false
+     */
+    FWRUNTIME_API bool hasParameter( const std::string & name ) const;
+    //@}
+
+
+    bool isStarted()     {return m_started;};
+    bool isInitialized() {return m_initialized;};
+
+protected:
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   location    a path to the directory containing the bundle
+     * @param[in]   id          a string containing the bundle identifier
+     * @param[in]   version     a string containing the bundle version
+     *
+     * @todo        test parameters validity
+     *
+     */
+    Bundle( const boost::filesystem::path   & location,
+            const std::string               & id,
+            const std::string               & version );
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   location        a path to the directory containing the bundle
+     * @param[in]   id              a string containing the bundle identifier
+     * @param[in]   version         a string containing the bundler version
+     * @param[in]   pluginClass     a string containing the bundle's pugin class name
+     *
+     * @todo        test parameters validity
+     *
+     */
+    Bundle( const boost::filesystem::path   & location,
+            const std::string               & id,
+            const std::string               & version,
+            const std::string               & pluginClass );
+
+
+private:
+
+    typedef std::set< std::string >                 RequirementContainer;   ///< Defines the requirement container type.
+    typedef std::map< std::string, std::string >    ParameterContainer;     ///< defines the parameter container type
+
+    static SPTR( Bundle )           m_loadingBundle;        ///< a pointer to the bundle that is currently loading its dynamic libaries
+
+    const boost::filesystem::path   m_location;             ///< the path to the bundle location
+    const std::string               m_identifier;           ///< a string containing the bundle identifier
+    const Version                   m_version;              ///< defines the version of the bundle
+    const std::string               m_class;                ///< a string containing the bundle's plugin class name
+    bool                            m_enable;               ///< a boolean telling if the bundle is enabled or not
+    ExtensionContainer              m_extensions;           ///< all extensions
+    ExtensionPointContainer         m_extensionPoints;      ///< all extension points
+    ExecutableFactoryContainer      m_executableFactories;  ///< all executable factories
+    LibraryContainer                m_libraries;            ///< all libaries that are part of the bundle
+    RequirementContainer            m_requirements;         ///< all requirements of the bundle
+    SPTR( IPlugin )                 m_plugin;               ///< a shared pointer to the plugin instance
+    ParameterContainer              m_parameters;           ///< all parameters
+
+    bool m_started;
+    bool m_initialized;
+
+    /**
+     * @brief   Assignement operator.
+     *
+     * @remark  Assignement is forbidden for this class.
+     */
+    void operator= (const Bundle & );
+
+    /**
+     * @brief   Load bundle's library in the current process.
+     */
+    void loadLibraries() throw(RuntimeException);
+
+    /**
+     * @brief   load all requirement needed by the bundle to work
+     */
+    void loadRequirements() throw(RuntimeException);
+
+    /**
+     * @brief   Starts the plugin associated to the bundle.
+     */
+    void startPlugin() throw(RuntimeException);
+
+};
+
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_BUNDLE_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/BundleElement.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/BundleElement.hpp
new file mode 100644
index 0000000..819b6ea
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/BundleElement.hpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_BUNDLEELEMENT_HPP_
+#define _FWRUNTIME_BUNDLEELEMENT_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+
+namespace fwRuntime
+{
+    struct Bundle;
+}
+
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Implements the base class for all element managed by a bundle.
+ * @struct  BundleElement
+ * @date    2006-2009
+ * 
+ */
+struct BundleElement
+{
+
+    /**
+     * @brief   Retrieves the bundle that owns the extension.
+     *
+     * @return  a pointer to a bundle instance
+     */
+    FWRUNTIME_API ::boost::shared_ptr<Bundle> getBundle() const;
+
+    /**
+     * @brief   Tells if the element is enabled or not.
+     *
+     * @remark  The element will asks its bundle enable state. if the bundle
+     *          element is enabled then the program verifies if the bundle
+     *          element is enabled too.
+     *
+     * @pre     The bundle must not be null.
+     *
+     * @return  true or false
+     */
+    FWRUNTIME_API bool isEnable() const;
+
+    /**
+     * @brief       Set if the element is enabled or not.
+     *
+     * @see         isEnable
+     *
+     * @param[in]   enable To know if bundle element is enabled
+     */
+    FWRUNTIME_API void setEnable(const bool enable);
+
+protected:
+
+    /**
+     * @brief   Constructor
+     *
+     * @remark  The instance will try to guess the bundle that is being loaded and
+     *          consider that bundle as its owning bundle
+     *
+     * @post    The bundle isn't null.
+     * @see     ::fwRuntime::Bundle::getLoadingBundle
+     */
+    BundleElement();
+
+    /**
+     * @brief       Constructor
+     *
+     * @post        The bundle isn't null.
+     * @param[in]   bundle  a shared pointer to the managing bundle
+     */
+    BundleElement( ::boost::shared_ptr< Bundle > bundle );
+
+
+private:
+
+     ::boost::shared_ptr< Bundle >  m_bundle;   ///< a shared pointer to the bundle managing the element
+    bool                            m_enable;   ///< to know if bundle element is enabled
+
+};
+
+
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_BUNDLEELEMENT_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElement.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElement.hpp
new file mode 100644
index 0000000..9ead273
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElement.hpp
@@ -0,0 +1,254 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_CONFIGURATIONELEMENT_HPP
+#define _FWRUNTIME_CONFIGURATIONELEMENT_HPP
+
+#include <map>
+#include <string>
+#include <utility>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/ConfigurationElementContainer.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+namespace fwRuntime
+{
+    struct Bundle;
+    struct Executable;
+
+    namespace io
+    {
+        struct BundleDescriptorReader;
+    }
+}
+
+
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief   Defines the configuration element class.
+ * @struct  ConfigurationElement
+ * @date    2004-2009
+ * 
+
+ */
+struct FWRUNTIME_CLASS_API ConfigurationElement :   public ConfigurationElementContainer,
+                                public boost::enable_shared_from_this< ConfigurationElement >
+{
+
+    friend struct ::fwRuntime::io::BundleDescriptorReader;
+
+    fwCoreClassDefinitionsWithFactoryMacro((ConfigurationElement), ((( const ::boost::shared_ptr< Bundle > ))(( const std::string ))), new ConfigurationElement);
+
+    /**
+     * @brief   Defines the attribute pair type.
+     */
+    typedef std::pair< bool, std::string > AttributePair;
+
+
+    /**
+     * @brief   Defines the a class for attributes exceptions.
+     */
+    struct NoSuchAttribute : public ::fwCore::Exception
+    {
+        NoSuchAttribute(const std::string &attr) : ::fwCore::Exception(std::string("No such attribute: ") + attr) {}
+    };
+
+
+    /**
+     * @brief   Retrieves the bundle the configuration element is attached to.
+     *
+     * @return  a shared pointer to a bundle instance
+     */
+    FWRUNTIME_API const ::boost::shared_ptr< Bundle > getBundle() const throw();
+
+    /**
+     * @brief       Retrieves the value of an attribute for the specified name.
+     *
+     * This method will search for an attribute having the specified name and
+     * return it's value. When no matching attribute is found, an empty string
+     * is returned.
+     *
+     * @param[in]   name    a string containing an attribute value
+     *
+     * @return      a string containing the attribute value or nothing when none has
+     *              been found
+     *
+     * @see     getExistingAttributeValue
+     * @see     getSafeAttributeValue
+     */
+    FWRUNTIME_API const std::string getAttributeValue(const std::string& name) const throw();
+
+    /**
+     * @brief       Retrieves the value of an attribute for the specified name.
+     *
+     * This method will search for an attribute having the specified name and
+     * return it's value. When no matching attribute is found, an object of
+     * type NoSuchAttribute is thrown.
+     *
+     * @param[in]   name    a string containing an attribute name
+     *
+     * @return      a string containing an attribute value
+     *
+     * @exception   NoSuchAttribute no attribute with the specified name has been found
+     *
+     * @see         getAttributeValue
+     * @see         getSafeAttributeValue
+     */
+    FWRUNTIME_API const std::string getExistingAttributeValue(const std::string& name) const throw(NoSuchAttribute);
+
+    /**
+     * @brief       Retrieves the value of an existing attribute for the specified name.
+     *
+     * The returned value is a pair where the first element is a boolean telling
+     * if the attribute really exists and the second element is the attribute value.
+     *
+     * @param[in]   name    a string containing an attribute name
+     *
+     * @return      a pair where the first element is a boolean telling if the attribute
+     *              really exists and the second element is the attribute value
+     *
+     * @see         getAttributeValue
+     * @see         getExistingAttributeValue
+     */
+    FWRUNTIME_API const AttributePair getSafeAttributeValue(const std::string& name) const throw();
+
+    /**
+     * @brief   Retrieves the name of the configuration element.
+     *
+     * @return  a string containing the configuration element name
+     */
+    FWRUNTIME_API const std::string getName() const throw();
+
+    /**
+     * @brief   Retrieves the configuration element value.
+     *
+     * @return  a string containing the configuration element value
+     */
+    FWRUNTIME_API const std::string getValue() const throw();
+
+    /**
+     * @brief       Tells if the specified attributes exists.
+     *
+     * @param[in]   name    a string containing an attribute name
+     *
+     * @return      true or false
+     */
+    FWRUNTIME_API bool hasAttribute(const std::string& name) const throw();
+
+    /**
+     * @brief   Return the map with attributes
+     */
+    FWRUNTIME_API const std::map<std::string, std::string> getAttributes() const throw() ;
+
+    /**
+     * @brief   Print contents
+     */
+    FWRUNTIME_API friend std::ostream & operator<<(std::ostream & _sstream, ConfigurationElement& _configurationElement) ;
+
+    /**
+     * @brief       Find recursively all the corresponding configuration elements.
+     *
+     * @param[in]   name            name of the configuration element (if name is empty, find all name)
+     * @param[in]   attribute       attribute which must be contained by the configuration element
+     *                              ( if attribute is empty, this doesn't check the attribute)
+     * @param[in]   attributeValue  value of the attribute which must be contained by the configuration element
+     *                              ( if value is empty, this doesn't check the value )
+     * @param[in]   depth           depth of the recursion
+     */
+    FWRUNTIME_API std::vector < ConfigurationElement::sptr > find(
+            std::string name = "",
+            std::string attribute = "",
+            std::string attributeValue = "",
+            int depth = 1
+            );
+
+    /**
+     * @brief       Used only because this class inherit from enable_shared_from_this
+     */
+    FWRUNTIME_API virtual ~ConfigurationElement();
+
+protected:
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   bundle  a shared pointer to the bundle to the configuration element is attached to
+     * @param[in]   name    a string containing the configuration element name
+     *
+     * @todo        test parameters validity
+     */
+    FWRUNTIME_API ConfigurationElement(const ::boost::shared_ptr<Bundle> bundle, const std::string& name);
+
+
+    /**
+     * @brief       Sets an attribute with the specified name and value.
+     *
+     * Setting a value for an existing attribute will override the old value.
+     *
+     * @param[in]   name    a string containing the attribute name
+     * @param[in]   value   a string containing the attribute value
+     */
+    FWRUNTIME_API void setAttributeValue(const std::string& name, const std::string& value) throw();
+
+    /**
+     * @brief       Sets the value of the configuration element it-self.
+     *
+     * @param[in]   value   a string containing the new configuration element value
+     */
+    FWRUNTIME_API void setValue(const std::string& value) throw();
+
+
+private:
+
+    /**
+     * @brief   Defines the attributes container type.
+     */
+    typedef std::map<std::string, std::string> AttributeContainer;
+
+
+    /**
+     * @brief   A pointer to the bundle the configuration element is attached to.
+     */
+    const ::boost::shared_ptr<Bundle> m_bundle;
+
+    /**
+     * @brief   A string containing the configuration element name.
+     */
+    const std::string m_name;
+
+    /**
+     * @brief   A string containing the configuration element value.
+     */
+    std::string m_value;
+
+    /**
+     * @brief   All attributes of the configuration element.
+     */
+    AttributeContainer m_attributes;
+
+
+    /**
+     * @brief   Assignemet operator.
+     *
+     * @remark  Assignement is forbidden for this class.
+     */
+    void operator=(const ConfigurationElement&) throw();
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #define  _FWRUNTIME_CONFIGURATIONELEMENT_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElementContainer.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElementContainer.hpp
new file mode 100644
index 0000000..0460658
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/ConfigurationElementContainer.hpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_CONFIGURATIONELEMENTCONTAINER_HPP_
+#define _FWRUNTIME_CONFIGURATIONELEMENTCONTAINER_HPP_
+
+#include <iterator>
+#include <vector>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace io
+{
+    struct BundleDescriptorReader;
+} // namespace io
+
+
+struct ConfigurationElement;
+
+
+/**
+ * @brief   Defines the generic configuration element container class.
+ * @struct  ConfigurationElementContainer
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API ConfigurationElementContainer
+{
+    friend struct BundleDescriptorReader;
+
+
+    /**
+     * @name    Type Definitions
+     *
+     * @{
+     */
+
+    typedef std::vector< ::boost::shared_ptr<ConfigurationElement> >    Container;  ///< Defines the configuration element container type.
+    typedef Container::iterator                                         Iterator;   ///< Defines the configuration element container iterator type.
+
+    //@}
+
+
+    /**
+     * @brief   Retrieves the iterator on the first managed configuration
+     *          element.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API Iterator begin();
+
+    /**
+     * @brief   Retrieves the iterator on the end of the configuration element container
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API Iterator end();
+
+    /**
+    * @brief   Returns the configuration element container
+    *
+    * @return  an configuration element container
+    */
+    FWRUNTIME_API const Container & getElements() const;
+
+    /**
+     * @brief       Retrieves the first configuration corresponding to the specified name.
+     *
+     * @param[in]   name    a string containing a configuration element name
+     *
+     * @return      a pointer to a configuration element instance or null if none
+     */
+    FWRUNTIME_API const ::boost::shared_ptr< ConfigurationElement > findConfigurationElement( const std::string & name ) const;
+
+    /**
+     * @brief       Test if has an configuration corresponding to the specified name.
+     *
+     * @param[in]   name    a string containing a configuration element name
+     *
+     * @return      true if the method find at least one configuration
+     */
+    FWRUNTIME_API bool hasConfigurationElement( const std::string & name ) const;
+
+
+    /**
+     * @brief       Retrieves the configurations corresponding to the specified name.
+     *
+     * @param[in]   name    a string containing a configuration element name
+     *
+     * @return      a configuration element container that contains configuration element instances
+     */
+    FWRUNTIME_API ConfigurationElementContainer findAllConfigurationElement( const std::string & name ) const;
+
+    /**
+     * @brief       Return the number of configurations
+     * @return      Return the number of configurations
+     */
+    FWRUNTIME_API size_t size() const;
+
+protected:
+
+    /**
+     * @brief       Adds a new configuration element to the extension.
+     *
+     * @param[in]   element a shared pointer to the configuration element to add
+     */
+    FWRUNTIME_API void addConfigurationElement( ::boost::shared_ptr< ConfigurationElement > element );
+
+
+private:
+
+    Container m_elements;   ///< all configuration elements
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_CONFIGURATIONELEMENTCONTAINER_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Convert.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Convert.hpp
new file mode 100644
index 0000000..0d029a7
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Convert.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_CONVERT_HPP_
+#define _FWRUNTIME_CONVERT_HPP_
+
+#include <boost/shared_ptr.hpp>
+#include <boost/property_tree/ptree.hpp>
+
+
+#include <libxml/tree.h>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+
+namespace fwRuntime
+{
+
+/**
+ * @brief   Defines the convert class.
+ * @class   Convert
+ * @date    2004-2009
+ * 
+ */
+class FWRUNTIME_CLASS_API Convert
+{
+public:
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWRUNTIME_API virtual  ~Convert();
+
+    /**
+     * @brief   Build an xmlNodePtr from a ConfigurationElement
+     */
+    FWRUNTIME_API static xmlNodePtr toXml( ::boost::shared_ptr< ::fwRuntime::ConfigurationElement > _cfgElement) ;
+
+    /**
+     * @brief   Build an std::string from a ConfigurationElement
+     */
+    FWRUNTIME_API std::string static toXmlString( ::fwRuntime::ConfigurationElement::sptr _cfgElement);
+
+    /**
+     * @brief   Build an xmlNodePtr with all running Bundles
+     */
+    FWRUNTIME_API static xmlNodePtr runningBundlesToXml( ) ;
+
+
+    FWRUNTIME_API static ::boost::property_tree::ptree toPropertyTree( ::fwRuntime::ConfigurationElement::sptr _cfgElement );
+
+    FWRUNTIME_API static ::fwRuntime::ConfigurationElement::sptr fromPropertyTree( ::boost::property_tree::ptree pt );
+
+private :
+
+    FWRUNTIME_API static void fromConfigurationElementToXml( ::boost::shared_ptr< ::fwRuntime::ConfigurationElement > _cfgElement, xmlNodePtr _node) ; //_node is modified
+
+    /**
+     * @brief   Constructor : does nothing.
+     */
+    Convert();
+
+};
+
+} // namespace fwRuntime
+
+
+#endif // _FWRUNTIME_CONVERT_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/EConfigurationElement.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/EConfigurationElement.hpp
new file mode 100644
index 0000000..15f51c8
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/EConfigurationElement.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_ECONFIGURATIONELEMENT_HPP
+#define _FWRUNTIME_ECONFIGURATIONELEMENT_HPP
+
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/config.hpp"
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief   Editable configuration element : allow the self configuration element building, which reading XML structure provided by bundle descriptions
+ * @class   EConfigurationElement
+ * @date    2006-2009
+ * 
+ */
+class FWRUNTIME_CLASS_API EConfigurationElement : public ::fwRuntime::ConfigurationElement
+{
+    public :
+        fwCoreClassDefinitionsWithFactoryMacro( (EConfigurationElement)(ConfigurationElement),
+                                                ((( const std::string& ))),
+                                                new EConfigurationElement
+                                                );
+
+        /**
+         * @brief       Constructor.
+         * @param[in]   name name of the configuration element
+         */
+        FWRUNTIME_API       EConfigurationElement(const std::string& name) ;
+
+        /**
+         * @brief   Destructor : does nothing.
+         */
+        FWRUNTIME_API       virtual ~EConfigurationElement() ;
+
+        /**
+         * @brief       Create and add a configuration element.
+         * @param[in]   name name of the configuration element
+         * @return      the created configuration element
+         */
+        FWRUNTIME_API        EConfigurationElement::sptr addConfigurationElement( const std::string& name ) ;
+
+        /**
+         * @brief       Adds a new configuration element to the extension.
+         * @param[in]   element     a shared pointer to the configuration element to add
+         */
+        FWRUNTIME_API       void addConfigurationElement( EConfigurationElement::sptr element ) ;
+
+        FWRUNTIME_API       void setAttributeValue(const std::string& name, const std::string& value) throw() ;
+
+        FWRUNTIME_API       void setValue(const std::string& value) throw();
+};
+
+}
+
+#endif /*_FWRUNTIME_ECONFIGURATIONELEMENT_HPP*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/EmptyPlugin.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/EmptyPlugin.hpp
new file mode 100644
index 0000000..961f477
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/EmptyPlugin.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EMPTYPLUGIN_HPP_
+#define _FWRUNTIME_EMPTYPLUGIN_HPP_
+
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/Plugin.hpp"
+
+
+namespace fwRuntime
+{
+
+
+/**
+ * @struct  EmptyPlugin
+ * @brief   Implements a default plugin for bundles that don't provide a
+ *          ::fwRuntime::IPlugin interface implementation. This plugin does nothing
+ *          by default. It has not been design to be subclassed, but subclassing
+ *          is neither forbidden.
+ *
+ * @remark  The factory for this executable structure is registered by the runtime
+ *          it-self.
+ *
+ * @date    2004-2005
+ * 
+ */
+struct EmptyPlugin : public Plugin
+{
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~EmptyPlugin() throw() {}
+
+
+    // Overrides
+    virtual void start() throw(::fwRuntime::RuntimeException);
+
+    // Overrides
+    virtual void stop() throw();
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif //_FWRUNTIME_EMPTYPLUGIN_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Executable.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Executable.hpp
new file mode 100644
index 0000000..8fbb821
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Executable.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXECUTABLE_HPP_
+#define _FWRUNTIME_EXECUTABLE_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/IExecutable.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Provides a default ::fwRuntime::IExecutable interface implementation.
+ * @struct  Executable
+ *
+ * This class provides a default implementation of the ::fwRuntime::IExecutable
+ * interface and is intended to be used as base class for user defined executable
+ * classes being exported by bundles.
+ *
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API Executable : public IExecutable
+{
+
+    /**
+     * @brief   Retrieves the executable's initialization data.
+     *
+     * @return  a shared pointer to the configuration element being the initialization data of the executable
+     *          or null when none
+     */
+    FWRUNTIME_API const ::boost::shared_ptr< ConfigurationElement > getInitializationData() const throw();
+
+
+    /**
+     * @name    Overrides.
+     */
+    /// @{
+
+    FWRUNTIME_API virtual ::boost::shared_ptr<Bundle> getBundle() const throw();
+
+    FWRUNTIME_API virtual void setInitializationData( const ::boost::shared_ptr< ConfigurationElement > configuration ) throw();
+
+    /// @}
+
+
+protected:
+
+    // Overrides
+    FWRUNTIME_API virtual void setBundle( ::boost::shared_ptr< Bundle > bundle );
+
+
+private:
+
+    /**
+     * @brief   a pointer to the bundle that owns the executable instance
+     */
+     ::boost::shared_ptr< Bundle > m_bundle;
+
+    /**
+     * @brief   the initialization data of the executable instance
+     */
+     ::boost::shared_ptr< ConfigurationElement > m_initializationData;
+
+};
+
+
+
+} // namespace fwRuntime
+
+
+
+#endif //_FWRUNTIME_EXECUTABLE_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactory.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactory.hpp
new file mode 100644
index 0000000..45d2dcc
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactory.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXECUTABLEFACTORY_HPP
+#define _FWRUNTIME_EXECUTABLEFACTORY_HPP
+
+#include <string>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/BundleElement.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+namespace fwRuntime
+{
+    struct IExecutable;
+}
+
+
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief   Defines the abstract executable factory class.
+ * @struct  ExecutableFactory
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API ExecutableFactory : public BundleElement
+{
+
+    /**
+     * @name    Construction & Destruction
+     *
+     * @{
+     */
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   type    a string containing a type identifier
+     */
+    FWRUNTIME_API ExecutableFactory( const std::string & type );
+
+    /**
+     * @brief   Destructor : does nothing
+     */
+    FWRUNTIME_API virtual ~ExecutableFactory();
+    ///@}
+
+    /**
+     * @brief   Creates an executable object instance.
+     *
+     * @return  a pointer to an executable instance
+     */
+    virtual IExecutable* createExecutable() const throw(RuntimeException) = 0;
+
+
+    /**
+     * @brief   Retrieves the type of executable the factory is able to create.
+     *
+     * @return  a string containing an executable type
+     */
+    FWRUNTIME_API const std::string getType() const;
+
+
+private:
+
+
+    std::string m_type; ///< a string containing the type identifier managed by the factory
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_EXECUTABLEFACTORY_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactoryRegistrar.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactoryRegistrar.hpp
new file mode 100644
index 0000000..7abb546
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/ExecutableFactoryRegistrar.hpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXECUTABLEFACTORYREGISTRAR_HPP_
+#define _FWRUNTIME_EXECUTABLEFACTORYREGISTRAR_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+
+struct ExecutableFactory;
+
+
+
+/**
+ * @brief   Defines an executable factory registrar class.
+ * @struct  ExecutableFactoryRegistrar
+ *
+ * An instance of this class is responsible for the registration of an
+ * executable factory instance in the runtime environment. The factory instace
+ * gets registered as soon as a registrar instance gets created.
+ * That's why this class is design to be instanciated as static object.
+ *
+ * @date    2004-2009
+ * 
+ */
+struct ExecutableFactoryRegistrar
+{
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   factory a shared pointer to an executable factory instance to manage
+     * @pre         Loading bundle exists.
+     */
+    FWRUNTIME_API ExecutableFactoryRegistrar( ::boost::shared_ptr< ExecutableFactory > factory );
+
+};
+
+
+} // namespace fwRuntime
+
+
+
+#endif //_FWRUNTIME_EXECUTABLEFACTORYREGISTRAR_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Extension.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Extension.hpp
new file mode 100644
index 0000000..b1f6545
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Extension.hpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXTENSION_HPP
+#define _FWRUNTIME_EXTENSION_HPP
+
+#include <string>
+#include <libxml/tree.h>
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/BundleElement.hpp"
+#include "fwRuntime/ConfigurationElementContainer.hpp"
+
+
+namespace fwRuntime
+{
+
+
+struct Bundle;
+
+
+namespace io
+{
+    struct BundleDescriptorReader;
+} // namespace io
+
+
+/**
+ * @brief   Defines the extension class.
+ * @struct  Extension
+ * @date    2004-2009
+ * 
+ */
+struct Extension : public BundleElement, public ConfigurationElementContainer
+{
+    friend struct ::fwRuntime::io::BundleDescriptorReader;
+
+    /**
+     * @brief   Defines the validity states of an extension
+     */
+    typedef enum
+    {
+        UnknownValidity,    ///< The extension has not been validated.
+        Valid,              ///< The extension passed the validation.
+        Invalid             ///< The extension failed the validation.
+    } Validity;
+
+    /**
+     * @brief   Destructor
+     */
+    ~Extension();
+
+    /**
+     * @brief   Retrieves the extension identifier.
+     *
+     * @return  a string containing the extension identifier (may be empty)
+     */
+    FWRUNTIME_API const std::string& getIdentifier() const;
+
+    /**
+     * @brief   Retrieves the extension point identifier.
+     *
+     * @return  a string containing the extension point identifier
+     */
+    FWRUNTIME_API const std::string& getPoint() const;
+
+    /**
+     * @brief   Retrieves the validity of the extension.
+     *
+     * The validity is computed using the xml node representing the extension and
+     * the xml schema of the extension's related extension point. When the extension
+     * point does not provide a schema, the extension is assumed to be valid.
+     *
+     * @return  the validity
+     */
+    FWRUNTIME_API Validity getValidity() const;
+
+    /**
+     * @brief   Retrieves the xml node that represents the extension
+     *
+     * @return  a pointer to an xml node
+     */
+    FWRUNTIME_API xmlNodePtr getXmlNode() const;
+
+    /**
+     * @brief   Validates the extension.
+     *
+     * Calling this method more than one time will only cause
+     * the current validity to be returned.
+     *
+     * @return  the extension validity
+     */
+    FWRUNTIME_API Validity validate();
+
+protected:
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   bundle  a pointer to the bundle the extension is attached to
+     * @param[in]   id      a string containing the extension identifier
+     * @param[in]   point   a string containing the extension point identifier
+     * @param[in]   xmlNode a pointer to the xml node that represents the extension
+     *
+     * @todo        test parameters validity
+     */
+    Extension( ::boost::shared_ptr<Bundle> bundle, const std::string & id, const std::string & point, const xmlNodePtr xmlNode );
+
+
+private:
+
+    const std::string   m_id;       ///< A string containing the extension identifier.
+    const std::string   m_point;    ///< A string containing the extension point identifier the extension will be connected to.
+    xmlDocPtr           m_xmlDoc;   ///< A pointer to the xml document that contains the xml node representing the extension
+    xmlNodePtr          m_xmlNode;  ///< A pointer to the xml node that represents the extension
+    Validity            m_validity; ///< The validity state of the extension
+
+    /**
+     * @brief   Assignment operator.
+     *
+     * @remark  Assignment is forbidden.
+     */
+    void operator=(const Extension&) throw();
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_EXTENSION_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/ExtensionPoint.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/ExtensionPoint.hpp
new file mode 100644
index 0000000..fb8c264
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/ExtensionPoint.hpp
@@ -0,0 +1,178 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXTENSIONPOINT_HPP
+#define _FWRUNTIME_EXTENSIONPOINT_HPP
+
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/BundleElement.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/Runtime.hpp"
+
+namespace fwRuntime
+{
+    struct Bundle;
+
+    namespace io
+    {
+        struct BundleDescriptorReader;
+        struct Validator;
+    }
+}
+
+
+
+namespace fwRuntime
+{
+
+/**
+ * @brief   Defines the extension point class.
+ * @struct  ExtensionPoint
+ * @date    2004-2009
+ * 
+ */
+struct ExtensionPoint : public BundleElement
+{
+    friend struct ::fwRuntime::io::BundleDescriptorReader;
+
+    typedef Extension::Container    ConfigurationElementContainer;
+
+    /**
+     * @brief   Retrieves all configuration elements contributed by extensions
+     *          connected to the extension point instance.
+     *
+     * @return  a container with all found configuration elements
+     */
+    const ConfigurationElementContainer getAllConfigurationElements() const
+    {
+        typedef std::back_insert_iterator< ConfigurationElementContainer >  Inserter;
+
+        ConfigurationElementContainer   container;
+        Inserter                        inserter(container);
+
+        getAllConfigurationElements<Inserter>( inserter );
+
+        return container;
+    }
+
+    /**
+     * @brief       Retrieves all configuration elements contributed by extensions
+     *              connected to the extension point instance.
+     *
+     * @param[out]  output  an output iterator that will be used to store shared
+     *              pointer to the found configuration elements
+     */
+    template<typename OutputIterator>
+    void getAllConfigurationElements( OutputIterator & output ) const
+    {
+        // Retrieves all connected extensions.
+        typedef std::vector< ::boost::shared_ptr< Extension > > ExtensionContainer;
+        typedef std::back_insert_iterator< ExtensionContainer > Inserter;
+
+        ExtensionContainer  extensions;
+        Inserter            inserter(extensions);
+
+        getAllExtensions( inserter );
+
+        // Walk through the collected extensions to extract configuration elements.
+        for( ExtensionContainer::const_iterator i = extensions.begin(); i != extensions.end(); ++i )
+        {
+            ::boost::shared_ptr< Extension >   extension( *i );
+            if ( extension->isEnable() )
+            {
+                std::copy( extension->begin(), extension->end(), output);
+            }
+            OSLM_DEBUG_IF("getAllConfigurationElements for point=" <<  extension->getPoint() <<
+                          " extension" << extension->getIdentifier() << "extension disabled", !extension->isEnable());
+        }
+    }
+
+    /**
+     * @brief       Retrieves all extensions contributed to the point instance.
+     *
+     * @param[out]  output  an output iterator that will be used to store shared
+     *              pointers to found extensions
+     */
+    template<typename OutputIterator>
+    void getAllExtensions( OutputIterator & output ) const
+    {
+        Runtime * rntm( Runtime::getDefault() );
+
+        for( Runtime::ExtensionIterator i = rntm->extensionsBegin(); i != rntm->extensionsEnd(); ++i )
+        {
+            ::boost::shared_ptr< Extension >   extension( *i );
+            if( extension->getPoint() == m_id && extension->isEnable() == true
+                    && extension->validate() == Extension::Valid
+            )
+            {
+                *output = extension;
+                ++output;
+            }
+        }
+    }
+
+
+    /**
+     * @brief   Retrieves the extension point identifier.
+     *
+     * @return  a string containing the extension point identifier
+     */
+    FWRUNTIME_API const std::string & getIdentifier() const;
+
+    /**
+     * @brief   Retrieves the extension validator.
+     *
+     * @return  a shared pointer to the extension validator, or null when none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< io::Validator > getExtensionValidator() const;
+
+
+protected:
+
+
+    /**
+     * @brief       constructor
+     *
+     * @param[in]   bundle  a shared pointer to the bundle where the extension
+     *                      point is declared
+     * @param[in]   id      a string containing the extension point identifier
+     * @param[in]   schema  a path to a file containing an XML schema used to
+     *                      validate extensions contributed to the point.
+     */
+    ExtensionPoint(
+            const ::boost::shared_ptr<Bundle>       bundle,
+            const std::string&              id,
+            const boost::filesystem::path&  schema);
+
+
+private:
+
+    const std::string                               m_id;           ///< a string containing the extension point identifier
+    const ::boost::filesystem::path                 m_schema;       ///< a path to the XML schema used to validate contributed extensions
+    mutable ::boost::shared_ptr< io::Validator >    m_validator;    ///< a shared pointer to the extension validator
+
+    /**
+     * @brief   Assignment operator.
+     *
+     * @remark  Assignment is forbidden for this class.
+     */
+    void operator=(const ExtensionPoint&) throw();
+
+};
+
+} // namespace fwRuntime
+
+
+
+#endif // #define _FWRUNTIME_EXTENSIONPOINT_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/IExecutable.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/IExecutable.hpp
new file mode 100644
index 0000000..2db7515
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/IExecutable.hpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXECUTABLE_HPP
+#define _FWRUNTIME_EXECUTABLE_HPP
+
+#include <string>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+#define REGISTER_EXECUTABLE( type, id ) static ::fwRuntime::utils::GenericExecutableFactoryRegistrar< type > registrar( id );
+
+
+
+struct Bundle;
+struct ConfigurationElement;
+struct Runtime;
+
+
+/**
+ * @brief   Defines the base executable interface.
+ * @struct  IExecutable
+ *
+ * An executable object is an instance created by an extension
+ * point of a plugin.
+ *
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API IExecutable
+{
+    friend struct Runtime;
+
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWRUNTIME_API virtual ~IExecutable();
+
+
+    /**
+     * @brief   Retrieves the bundle the executable originates from.
+     *
+     * @return  a pointer to the originating bundle.
+     */
+    virtual ::boost::shared_ptr<Bundle> getBundle() const throw() = 0;
+
+    /**
+     * @brief       Initializes the executable instance with the specified
+     *              configuration element.
+     *
+     * @param[in]   configuration   a shared pointer to the configuration element used to
+     *              trigger this execution
+     */
+    virtual void setInitializationData( const ::boost::shared_ptr<ConfigurationElement> configuration ) throw() = 0;
+
+
+protected:
+
+    /**
+     * @brief       Updates the bundle the executable originates from.
+     *
+     * @param[in]   bundle  a pointer to the bundle the executable originates from
+     */
+    virtual void setBundle( ::boost::shared_ptr< Bundle > bundle ) = 0;
+
+};
+
+
+
+} // namespace fwRuntime
+
+
+
+#endif // _FWRUNTIME_EXECUTABLE_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/IPlugin.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/IPlugin.hpp
new file mode 100644
index 0000000..e9cfba6
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/IPlugin.hpp
@@ -0,0 +1,63 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PLUGIN_HPP
+#define _FWRUNTIME_PLUGIN_HPP
+
+#include <string>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/IExecutable.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Defines the plugin interface.
+ * @struct  IPlugin
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API IPlugin : public IExecutable
+{
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWRUNTIME_API virtual ~IPlugin();
+
+    /**
+     * @brief   Notifies the plugin about its start.
+     */
+    virtual void start() throw(::fwRuntime::RuntimeException) = 0;
+
+    /**
+     * @brief   Notifies the plugin about its initialisation.
+     */
+    FWRUNTIME_API virtual void initialize() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief   Notifies the plugin about its uninitialisation.
+     */
+    FWRUNTIME_API virtual void uninitialize() throw(::fwRuntime::RuntimeException);
+
+    /**
+     * @brief   Notifies the plugin about its stop.
+     */
+    virtual void stop() throw() = 0;
+
+};
+
+
+
+} // namespace fwRuntime
+
+#endif // #define _FWRUNTIME_PLUGIN_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Namespace.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Namespace.hpp
new file mode 100644
index 0000000..e727686
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIMENAMESPACE_HPP_
+#define FWRUNTIMENAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwRuntime contains classes to manage bundle, configuration element, extension point in the runtime environment from a configuration file .
+ * @namespace   fwRuntime
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwRuntime
+{
+}
+#endif /* FWRUNTIMENAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Plugin.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Plugin.hpp
new file mode 100644
index 0000000..a028f15
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Plugin.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PLUGIN_HPP_
+#define _FWRUNTIME_PLUGIN_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/IPlugin.hpp"
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Provides a default plugin implementation.
+ * @struct  Plugin
+ *
+ * This class is intended to be sub-classed. The IPlugin::start and IPlugin::stop
+ * function must be implemented.
+ *
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API Plugin : public IPlugin
+{
+
+    /**
+     * @name    Overrides
+     */
+    //@{
+    FWRUNTIME_API ::boost::shared_ptr<Bundle> getBundle() const throw();
+    FWRUNTIME_API virtual void setInitializationData(const SPTR(ConfigurationElement) configuration) throw();
+    //@}
+
+
+protected:
+
+    // Overrides
+    FWRUNTIME_API void setBundle( ::boost::shared_ptr<Bundle> bundle) throw();
+
+
+private:
+
+    /**
+     * @brief   a pointer to the bundle the plugin is attached to
+     */
+     ::boost::shared_ptr<Bundle> m_bundle;
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif //_FWRUNTIME_PLUGIN_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Runtime.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Runtime.hpp
new file mode 100644
index 0000000..e1bb855
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Runtime.hpp
@@ -0,0 +1,290 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_FWRUNTIME_HPP
+#define _FWRUNTIME_FWRUNTIME_HPP
+
+#include <boost/shared_ptr.hpp>
+#include <boost/filesystem/path.hpp>
+#include <set>
+#include <vector>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/Version.hpp"
+
+namespace fwRuntime
+{
+    struct Bundle;
+    struct ConfigurationElement;
+    struct Extension;
+    struct ExtensionPoint;
+    struct IExecutable;
+    struct ExecutableFactory;
+    struct IPlugin;
+}
+
+namespace fwRuntime
+{
+
+/**
+ * @brief   Defines the runtime class.
+ * @struct  Runtime
+ * @date    2004-2009
+ * 
+ */
+struct Runtime
+{
+    /**
+     * @name    Type Definitions
+     */
+    //@{
+    typedef std::set< ::boost::shared_ptr<Bundle> >     BundleContainer;    ///< Defines the bundle container type.
+    typedef BundleContainer::iterator                   BundleIterator;     ///< Defines the bundle container iterator type.
+
+    typedef std::set< ::boost::shared_ptr<Extension> >  ExtensionContainer; ///< Defines the extension container type.
+    typedef ExtensionContainer::iterator                ExtensionIterator;  ///< Defines the extension container type.
+    //@}
+
+
+    /**
+     * @brief   Retrieves the default runtime instance.
+     */
+    FWRUNTIME_API static Runtime* getDefault();
+
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    ~Runtime();
+
+
+    /**
+     * @name    Bundles
+     *
+     * @{
+     */
+
+    /**
+     * @brief       Adds a new bundle instance to the runtime system.
+     *
+     * @remark      The given bundle state will be altered according to the current configuration rules.
+     * @param[in]   bundle  a shared pointer to the bundle instance to add
+     */
+    FWRUNTIME_API void addBundle( ::boost::shared_ptr< Bundle > bundle ) throw( RuntimeException );
+
+    /**
+     * @brief       Unregister a bundle instance to the runtime system.
+     *
+     * @param[in]   bundle  a shared pointer to the bundle instance to unregister
+     */
+    FWRUNTIME_API void unregisterBundle( ::boost::shared_ptr< Bundle > bundle );
+
+    /**
+     * @brief       Adds all bundle found in t he given path.
+     *
+     * @param[in]   repository  a path that may containing bundles
+     */
+    FWRUNTIME_API void addBundles( const ::boost::filesystem::path & repository ) throw( RuntimeException );
+
+    /**
+     * @brief   Retrieves the iterator on the begining of the bundle collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API BundleIterator bundlesBegin();
+
+    /**
+     * @brief   Retrieves the iterator on the end of the bundle collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API BundleIterator bundlesEnd();
+
+    /**
+     * @brief       Retrieves the bundle for the specified idenfier.
+     *
+     * @param[in]   identifier  a string containing a bundle identifier
+     * @param[in]   version     the version of the bundle (undefined by default)
+     *
+     * @return      a shared pointer to the found bundle or null if none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< Bundle > findBundle( const std::string & identifier, const Version & version = Version() ) const;
+
+    //@}
+
+
+    /**
+     * @name    Executable, Executable Factories & Dynamic Executable Instanciation
+     *
+     * @{
+     */
+
+    /**
+     * @brief       Adds a new executable factory instance to the runtime system.
+     *
+     * @param[in]   factory a shared pointer to an executable factory
+     */
+    FWRUNTIME_API void addExecutableFactory( ::boost::shared_ptr< ExecutableFactory > factory ) throw(RuntimeException);
+
+    /**
+     * @brief       Unregister a new executable factory instance to the runtime system.
+     *
+     * @param[in]   factory a shared pointer to an executable factory
+     */
+    FWRUNTIME_API void unregisterExecutableFactory( ::boost::shared_ptr< ExecutableFactory > factory );
+
+    /**
+     * @brief   Create an instance of the given executable object type.
+     *
+     * An attempt is made to retrieve a registered executable factory. If none
+     * is found, the creation will fail.
+     *
+     * @remark      This method will not try to load any bundle.
+     *
+     * @param[in]   type    a string containing an executable type
+     *
+     * @return      a pointer to the created executable instance
+     */
+    FWRUNTIME_API IExecutable * createExecutableInstance( const std::string & type ) throw( RuntimeException );
+
+    /**
+     * @brief   Create an instance of the given executable object type and configuration element.
+     *
+     * An attempt is made to find a registered executable factory. If none
+     * is found, the bundle of the given configuration element is started in the
+     * hope it will register a executable factory for the given type. Then an
+     * executable factory for the given type is searched once again and the
+     * instantiation procedure goes further.
+     *
+     * @param[in]   type                    a string containing an executable type
+     * @param[in]   configurationElement    a shared pointer to the configuration element to use for the executable initialization
+     *
+     * @return  a pointer to the created executable instance
+     */
+    FWRUNTIME_API IExecutable * createExecutableInstance( const std::string & type, ::boost::shared_ptr< ConfigurationElement > configurationElement ) throw( RuntimeException );
+
+    /**
+     * @brief       Retrieves the executable factory for the given identifier.
+     *
+     * @param[in]   type    a string containing a type identifier
+     *
+     * @return      a sgared pointer to the found executable factory or null of none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< ExecutableFactory > findExecutableFactory( const std::string & type ) const;
+
+    /**
+     * @brief       Retrieves the plugin instance for the specified bundle.
+     *
+     * @param[in]   bundle  a shared pointer to a bundle instance
+     *
+     * @return      a shared pointer to a plugin instance or null if none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< IPlugin > getPlugin( const ::boost::shared_ptr< Bundle > bundle ) const;
+
+    //@}
+
+
+    /**
+     * @name    Extensions
+     *
+     * @{
+     */
+
+    /**
+     * @brief       Registers a new extension.
+     *
+     * @param[in]   extension   a shared pointer to the extension to register
+     */
+    FWRUNTIME_API void addExtension( ::boost::shared_ptr<Extension> extension) throw(RuntimeException);
+
+    /**
+     * @brief       Unregister a new extension.
+     *
+     * @param[in]   extension   a shared pointer to the extension to register
+     */
+    FWRUNTIME_API void unregisterExtension( ::boost::shared_ptr<Extension> extension);
+
+    /**
+     * @brief   Retrieves the iterator on the beginning of the extension collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionIterator extensionsBegin();
+
+    /**
+     * @brief   Retrieves the iterator on the end of the extension collection.
+     *
+     * @return  an iterator
+     */
+    FWRUNTIME_API ExtensionIterator extensionsEnd();
+
+    /**
+     * @brief       Retrieves the extension instance matching the specified identifier.
+     *
+     * @param[in]   identifier  a string containing an extension identifier
+     *
+     * @return      a shared pointer to the found extension instance or null if none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< Extension > findExtension( const std::string & identifier ) const;
+
+    //@}
+
+
+    /**
+     * @name    Extension Points
+     */
+    //@{
+    /**
+     * @brief       Registers a new extension point.
+     *
+     * @param[in]   point   a pointer to the extension point to register
+     */
+    FWRUNTIME_API void addExtensionPoint( ::boost::shared_ptr<ExtensionPoint> point) throw(RuntimeException);
+
+    /**
+     * @brief       Unregister a new extension point.
+     *
+     * @param[in]   point   a pointer to the extension point to register
+     */
+    FWRUNTIME_API void unregisterExtensionPoint( ::boost::shared_ptr<ExtensionPoint> point);
+
+    /**
+     * @brief       Retrieves the extension point instance matching the specified identifier.
+     *
+     * @param[in]   identifier  a string containing an extension point identifier
+     *
+     * @return      a shared pointer to the found extension point instance or null if none
+     */
+    FWRUNTIME_API ::boost::shared_ptr< ExtensionPoint > findExtensionPoint( const std::string & identifier ) const;
+    //@}
+
+private:
+
+    typedef std::set< ::boost::shared_ptr< ExecutableFactory > > ExecutableFactoryContainer;    ///< Defines the executable factory container type.
+    typedef std::set< ::boost::shared_ptr<ExtensionPoint> > ExtensionPointContainer;            ///< Defines the extension point container type.
+    typedef std::vector< ::boost::shared_ptr<IPlugin> > PluginContainer;                        ///< Defines the plugin container type.
+
+    static ::boost::shared_ptr<Runtime> m_instance; ///< The runtime instance.
+
+    ExecutableFactoryContainer                  m_executableFactories;  ///< Contains all executable factories.
+    ExtensionContainer                          m_extensions;           ///< Contains all registered extensions.
+    ExtensionPointContainer                     m_extensionPoints;      ///< Contains all registered extension points.
+    BundleContainer                             m_bundles;              ///< Contains all bundles.
+    PluginContainer                             m_plugins;              ///< Contains all plugins.
+
+
+    /**
+     * @brief   Constructor.
+     */
+    Runtime();
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_FWRUNTIME_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/RuntimeException.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/RuntimeException.hpp
new file mode 100644
index 0000000..9d90bdd
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/RuntimeException.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_EXCEPTION_HPP
+#define _FWRUNTIME_EXCEPTION_HPP
+
+#include <exception>
+#include <string>
+
+#include <fwCore/Exception.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief   Defines the runtime exception class.
+ * @struct  RuntimeException
+ * @date    2004-2009
+ * 
+ */
+struct FWRUNTIME_CLASS_API RuntimeException : public ::fwCore::Exception
+{
+
+    /**
+     * @brief       Copy constructor.
+     *
+     * @param[in]   exception   an exception instance to copy
+     */
+    FWRUNTIME_API RuntimeException(const RuntimeException& exception) throw();
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   message a string containing the exception message
+     */
+    FWRUNTIME_API RuntimeException(const std::string& message) throw();
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWRUNTIME_API virtual ~RuntimeException() throw();
+
+};
+
+
+} // namespace fwRuntime
+
+
+#endif // #ifndef _FWRUNTIME_EXCEPTION_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/Version.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/Version.hpp
new file mode 100644
index 0000000..791e5cf
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/Version.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_VERSION_HPP_
+#define _FWRUNTIME_VERSION_HPP_
+
+#include <string>
+#include <iostream>
+
+#include "fwRuntime/config.hpp"
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief   Managment of lib and bundle version.
+ * @struct  Version
+ * @date    2007-2009
+ * 
+ */
+struct Version
+{
+
+    /**
+     * @brief   Constructor.
+     *
+     * Builds an undefined version.
+     */
+    FWRUNTIME_API Version();
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   version     an string representation of the version
+     */
+    FWRUNTIME_API Version(const std::string & version);
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   major   the version major number
+     * @param[in]   minor   the version minor number (0 by default)
+     * @param[in]   build   the version build number (0 by default)
+     */
+    FWRUNTIME_API Version(const int major, const int minor = 0, const int build = 0);
+
+
+    /**
+     * @brief   Equality test.
+     */
+    FWRUNTIME_API bool operator==(const Version & version) const;
+
+
+    /**
+     * @brief   String converter.
+     */
+    FWRUNTIME_API const std::string string() const;
+
+    /**
+     * @brief   Return an ostream representation of a version.
+     */
+    FWRUNTIME_API friend std::ostream & operator<<(std::ostream & os, const Version & version);
+
+private :
+
+    int m_major;    ///< defines the major number of the version
+    int m_minor;    ///< defines the minor number of the version
+    int m_build;    ///< defines the svn build number of the version
+    bool m_defined; ///< to know if the version is defined
+};
+
+
+
+
+
+
+} // namespace fwRuntime
+
+#endif /*_FWRUNTIME_VERSION_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/config.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/config.hpp
new file mode 100644
index 0000000..ec6e19e
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/config.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_CONFIG_HPP_
+#define _FWRUNTIME_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWRUNTIME_EXPORTS
+    #define FWRUNTIME_API __declspec(dllexport)
+    #else
+    #define FWRUNTIME_API __declspec(dllimport)
+    #endif
+    
+    #define FWRUNTIME_CLASS_API 
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWRUNTIME_EXPORTS
+        #define FWRUNTIME_API __attribute__ ((visibility("default")))
+        #define FWRUNTIME_CLASS_API __attribute__ ((visibility("default")))
+        #else
+        //#define FWRUNTIME_API __attribute__ ((visibility("hidden")))
+        //#define FWRUNTIME_CLASS_API __attribute__ ((visibility("hidden")))
+        #define FWRUNTIME_API
+        #define FWRUNTIME_CLASS_API
+        #endif
+
+#else
+
+    #define FWRUNTIME_API 
+    #define FWRUNTIME_CLASS_API 
+    
+#endif
+
+
+#endif //_FWRUNTIME_CONFIG_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hpp
new file mode 100644
index 0000000..15f5986
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_DARWIN_HPP
+#define _FWRUNTIME_DL_DARWIN_HPP
+
+
+#ifdef __MACOSX__
+
+
+#include <dlfcn.h>
+
+#include "fwRuntime/dl/Native.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+/**
+ * @brief   Implements a posix native module.
+ * @struct  Darwin
+ * @date    2004-2009
+ *
+ * 
+ */
+struct Darwin : public Native
+{
+
+    /**
+     * @brief   Constructor.
+     *
+     * @param   modulePath  a path to the module to path
+     *
+     * @param   partialName     a boolean telling if the module filename is just
+     *                          a part of the real filename
+     */
+    //Darwin(const boost::filesystem::path& modulePath, const bool partialName) throw();
+    Darwin( const boost::filesystem::path & modulePath ) throw();
+
+    /**
+     * @brief   Destructor.
+     */
+    ~Darwin() throw();
+
+
+    /**
+     * @see ::fwRuntime::dl::Native#isLoaded
+     */
+    bool isLoaded() const throw();
+
+    /**
+     * @brief   Retrieves the address of a symbol specified by its name.
+     *
+     * @param   name    a string containing the symbol name.
+     *
+     * @return  a pointer to the found symbol or null if none has been found
+     */
+    void* getSymbol(const std::string& name) const throw(RuntimeException);
+
+    /**
+     * @see ::fwRuntime::dl::Native#load
+     */
+    void load() throw(RuntimeException);
+
+    /**
+     * @see ::fwRuntime::dl::Native#unload
+     */
+    void unload() throw(RuntimeException);
+
+
+protected:
+
+    /**
+     * @brief   Retrieves the native module file prefix.
+     *
+     * @return  a string containing the native module file prefix
+     */
+    const std::string getNativeFilePrefix() const throw();
+
+    /**
+     * @brief   Retrieves the native module file suffix.
+     *
+     * @return  a string containing the native module file suffix
+     */
+    const std::string getNativeFileSuffix() const throw();
+
+private:
+
+    /**
+     * @brief   The handle of the loaded module.
+     */
+    void *m_handle;
+
+};
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+#endif // #ifdef __MACOSX__
+
+#endif // _FWRUNTIME_DL_DARWIN_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hxx b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hxx
new file mode 100644
index 0000000..751f215
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Darwin.hxx
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#if defined(__MACOSX__) && !defined(FWRUNTIME_API)
+
+// Dynamic shared library (dylib) initialization routine
+//   required to initialize static C++ objects bacause of lazy dynamic linking
+//   http://developer.apple.com/techpubs/macosx/Essentials/
+//          SystemOverview/Frameworks/Dynamic_Shared_Libraries.html
+
+extern "C" {
+    void __initialize_Cplusplus(void);
+    void DylibInit(void);
+};
+
+void DylibInit()
+{
+    // The function __initialize_Cplusplus() must be called from the shared
+    // library initialization routine to cause the static C++ objects in
+    // the library to be initialized (reference number 2441683).
+
+    // This only seems to be necessary if the library initialization routine
+    // needs to use the static C++ objects
+    __initialize_Cplusplus();
+
+}
+
+#endif
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/DarwinNameDecorator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/DarwinNameDecorator.hpp
new file mode 100644
index 0000000..f1dfb74
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/DarwinNameDecorator.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_
+#define _FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_
+
+
+
+#include "fwRuntime/dl/NameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+/**
+ * @brief   Implements a posix specific name decorator.
+ * @struct  DarwinNameDecorator
+ * @date    2004-2009
+ * 
+ */
+struct DarwinNameDecorator : public NameDecorator
+{
+
+
+protected:
+
+    /**
+     * @name        Ovrerides
+     */
+    //@{
+    const std::string getNativePrefix() const throw();
+    const std::string getNativeExtension() const throw();
+    //@}
+
+};
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/INameDecorator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/INameDecorator.hpp
new file mode 100644
index 0000000..c2dd0d6
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/INameDecorator.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_INAMEDECORATOR_HPP_
+#define _FWRUNTIME_DL_INAMEDECORATOR_HPP_
+
+
+#include <string>
+
+
+namespace fwRuntime
+{
+namespace dl
+{
+
+
+
+/**
+ * @brief   Defines the interface of library name decorators.
+ * @struct  INameDecorator
+ * @date    2004-2009
+ * 
+ */
+struct INameDecorator
+{
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~INameDecorator();
+
+    /**
+     * @brief       Retrieves the native library file name for the given abstract file name.
+     *
+     * The native name can be a pattern and will be used for string matching.
+     *
+     * @param[in]   abstractName        the abstract library file name to convert to native library file name
+     */
+    virtual const std::string getNativeName( const std::string & abstractName ) const throw() = 0;
+
+};
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_DL_INAMEDECORATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Library.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Library.hpp
new file mode 100644
index 0000000..266ed73
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Library.hpp
@@ -0,0 +1,170 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_MODULE_HPP
+#define _FWRUNTIME_DL_MODULE_HPP
+
+#include <boost/filesystem/path.hpp>
+
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/dl/Posix.hpp"
+#include "fwRuntime/dl/Win32.hpp"
+#include "fwRuntime/dl/Darwin.hpp"
+
+
+namespace fwRuntime
+{
+
+
+struct Bundle;
+
+
+namespace dl
+{
+
+
+/**
+ * @brief   Defines the module class.
+ * @struct  LibraryBridge
+ * @date    2004-2009
+ *
+ * This class is only a bridge to a native module implementor.
+ *
+ * 
+ */
+template< typename Implementor >
+struct LibraryBridge
+{
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   modulePath      a path pointing the module to load without any extension
+     *                          information
+     */
+    LibraryBridge( const boost::filesystem::path & modulePath ) throw()
+    : m_implementor( modulePath )
+    {}
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    ~LibraryBridge() throw()
+    {}
+
+
+    /**
+     * @brief   Tells if the module is loaded.
+     *
+     * @return  true or false
+     */
+    bool isLoaded() const throw()
+    {
+        return m_implementor.isLoaded();
+    }
+
+    /**
+     * @brief   Retrieves the file path of the library including the owning bundle's path.
+     *
+     * @return  a file path
+     *
+     * @see     getPath
+     */
+    const boost::filesystem::path getFullPath() const throw(RuntimeException)
+    {
+        return m_implementor.getFullPath();
+    }
+
+    /**
+     * @brief   Retrieves the file path of the library.
+     *
+     * @remark  This path is relative to the owning bundle's path.
+     *
+     * @return  a file path
+     *
+     * @see     getFullPath
+     */
+    const boost::filesystem::path getPath() const throw(RuntimeException)
+    {
+        return m_implementor.getPath();
+    }
+
+    /**
+     * @brief       Retrieves the address of a symbol specified by its name.
+     *
+     * @param[in]   name    a string containing the symbol name.
+     *
+     * @return      a pointer to the found symbol or null if none has been found
+     */
+    void* getSymbol(const std::string& name) const throw(RuntimeException)
+    {
+        return m_implementor.getSymbol(name);
+    }
+
+    /**
+     * @brief   Loads the module.
+     */
+    void load() throw(RuntimeException)
+    {
+        m_implementor.load();
+    }
+
+    /**
+     * @brief       Sets the bundle the library is attached to.
+     *
+     * @param[in]   bundle  a pointer to a bundle instance
+     */
+    void setBundle(const ::fwRuntime::Bundle* bundle) throw()
+    {
+        m_implementor.setBundle(bundle);
+    }
+
+    /**
+     * @brief   Undloads the module.
+     */
+    void unload() throw(RuntimeException)
+    {
+        m_implementor.unload();
+    }
+
+
+private:
+
+    /**
+     * @brief   The native module implementator.
+     */
+    Implementor m_implementor;
+
+
+    /**
+     * @brief   Assignment operator.
+     *
+     * @remark  Assignment is fobidden for this class.
+     */
+    void operator=(const LibraryBridge&) throw()
+    {}
+};
+
+
+#if defined(linux) || defined(__linux)
+    typedef struct LibraryBridge< Posix > Library;
+#else
+#   ifdef WIN32
+    typedef struct LibraryBridge< Win32 > Library;
+#   else
+#       ifdef __MACOSX__
+    typedef struct LibraryBridge< Darwin > Library;
+#       endif
+#   endif
+#endif
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #ifdef _FWRUNTIME_DL_MODULE_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/NameDecorator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/NameDecorator.hpp
new file mode 100644
index 0000000..a40668c
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/NameDecorator.hpp
@@ -0,0 +1,81 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_NAMEDECORATOR_HPP_
+#define _FWRUNTIME_DL_NAMEDECORATOR_HPP_
+
+
+
+#include "fwRuntime/dl/INameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+/**
+ * @brief   Implements a default name decorator. This class is intended to be overriden
+ *          to do plateform specific decorations.
+ * @class   NameDecorator
+ * @date    2004-2009
+ * 
+ */
+struct NameDecorator : public INameDecorator
+{
+
+    /**
+     * @name        Overrides
+     */
+    //@{
+    const std::string getNativeName( const std::string & abstractName ) const throw();
+    //@}
+
+
+protected:
+
+    /**
+     * @brief   Retrieves the native file prefix.
+     *
+     * @remark  The default implements does nothing and should be overridden.
+     *
+     * @return  a string containing the native file prefix
+     */
+    virtual const std::string getNativePrefix() const throw();
+
+    /**
+     * @brief   Retrieves the native file suffix.
+     *
+     * @remark  The default implements adds the release or debug suffix.
+     *
+     * @return  a string containing the native file suffix
+     */
+    virtual const std::string getNativeSuffix() const throw();
+
+    /**
+     * @brief   Retrieves the native file extension.
+     *
+     * @remark  The default implements does nothing and should be overridden.
+     *
+     * @return  a string containing the native file extension
+     */
+    virtual const std::string getNativeExtension() const throw();
+
+};
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_DL_NAMEDECORATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Namespace.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Namespace.hpp
new file mode 100644
index 0000000..014e992
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIMEDLNAMESPACE_HPP_
+#define FWRUNTIMEDLNAMESPACE_HPP_
+
+
+namespace fwRuntime
+{
+/**
+ * @brief       The namespace fwRuntime::dl contains classes to manage library module.
+ * @namespace   fwRuntime::dl
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace dl
+{
+
+}
+}
+#endif /* FWRUNTIMEDLNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Native.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Native.hpp
new file mode 100644
index 0000000..105ed60
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Native.hpp
@@ -0,0 +1,146 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_NATIVE_HPP
+#define _FWRUNTIME_DL_NATIVE_HPP
+
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+
+namespace fwRuntime
+{
+
+
+struct Bundle;
+
+
+namespace dl
+{
+
+
+
+struct INameDecorator;
+
+
+
+/**
+ * @brief   Defines the abstract class for native module implementors.
+ * @struct  Native
+ * @date    2004-2009
+ * 
+ */
+struct Native
+{
+    friend struct ::fwRuntime::Bundle;
+
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   modulePath      a path to the module to manage
+     * @param[in]   nameDecorator   a shared pointer to a name decorator to use to retrieve the native file name
+     */
+    Native( const boost::filesystem::path & modulePath, const ::boost::shared_ptr< INameDecorator > nameDecorator ) throw();
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~Native() throw();
+
+
+    /**
+     * @brief   Tells if the module is loaded.
+     *
+     * @return  true or false
+     */
+    virtual bool isLoaded() const throw() = 0;
+
+    /**
+     * @brief       Retrieves the address of a symbol specified by its name.
+     *
+     * @param[in]   name    a string containing the symbol name.
+     *
+     * @return      a pointer to the found symbol or null if none has been found
+     */
+    virtual void * getSymbol( const std::string& name ) const throw(RuntimeException) = 0;
+
+    /**
+     * @brief   Loads the module.
+     */
+    virtual void load() throw(RuntimeException) = 0;
+
+    /**
+     * @brief   Undloads the module.
+     */
+    virtual void unload() throw(RuntimeException) = 0;
+
+    /**
+     * @brief       Retrieves the file path of the library including the owning bundle's path.
+     *
+     * @param[in]   _bMustBeFile  if true : bundle is a dynamic library and we want return an exception if is not a file
+     *
+     * @return      a file path
+     *
+     * @see         getPath
+     */
+    const boost::filesystem::path getFullPath( const bool _bMustBeFile = false ) const throw(RuntimeException);
+
+    /**
+     * @brief   Retrieves the file path of the native library.
+     *
+     * @note  This path is relative to the owning bundle's path.
+     *
+     * @return  a string containing the native module file path
+     */
+    const boost::filesystem::path getPath() const throw(RuntimeException);
+
+    /**
+     * @brief       Set the bundle the library is attached to.
+     *
+     * @param[in]   bundle  a pointer to a bundle instance
+     */
+    void setBundle( const ::fwRuntime::Bundle * bundle ) throw();
+
+
+private:
+
+    /**
+     * @brief   The path to the module to load.
+     */
+    const boost::filesystem::path       m_modulePath;
+
+    /**
+     * @brief   a name decorator to use to retrieve the native path
+     */
+    const ::boost::shared_ptr< INameDecorator > m_nameDecorator;
+
+    /**
+     * @brief   A pointer to the bundle the library is attached to.
+     */
+    const Bundle                            * m_bundle;
+
+
+    /**
+     * @brief   Assignment operator.
+     *
+     * @remark  Assignment is forbidden for this class.
+     */
+    void operator=( const Native & ) throw();
+
+};
+
+
+
+} // namesapce dl
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_DL_NATIVE_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Posix.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Posix.hpp
new file mode 100644
index 0000000..5c46728
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Posix.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_POSIX_HPP
+#define _FWRUNTIME_DL_POSIX_HPP
+
+
+#if defined(linux) || defined(__linux)
+
+
+#include <dlfcn.h>
+
+#include "fwRuntime/dl/Native.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+/**
+ * @brief   Implements a posix native module.
+ * @struct  Posix
+ * @date    2004-2009
+ * 
+ */
+struct Posix : public Native
+{
+
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   modulePath  a path to the module to manage
+     */
+    Posix( const boost::filesystem::path & modulePath ) throw();
+
+    /**
+     * @brief   Destructor.
+     */
+    ~Posix() throw();
+
+
+    /**
+     * @see ::fwRuntime::dl::Native#isLoaded
+     */
+    bool isLoaded() const throw();
+
+    /**
+     * @brief       Retrieves the address of a symbol specified by its name.
+     *
+     * @param[in]   name    a string containing the symbol name.
+     *
+     * @return      a pointer to the found symbol or null if none has been found
+     */
+    void* getSymbol( const std::string & name ) const throw(RuntimeException);
+
+    /**
+     * @see ::fwRuntime::dl::Native#load
+     */
+    void load() throw(RuntimeException);
+
+    /**
+     * @see ::fwRuntime::dl::Native#unload
+     */
+    void unload() throw(RuntimeException);
+
+
+private:
+
+    /**
+     * @brief   The handle of the loaded module.
+     */
+    void * m_handle;
+
+};
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #ifdef linux
+
+
+#endif // _FWRUNTIME_DL_POSIX_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/PosixNameDecorator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/PosixNameDecorator.hpp
new file mode 100644
index 0000000..daf7bbe
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/PosixNameDecorator.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_
+#define _FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_
+
+
+
+#include "fwRuntime/dl/NameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+/**
+ * @brief   Implements a posix specific name decorator.
+ * @struct  PosixNameDecorator
+ * @date    2004-2009
+ * 
+ */
+struct PosixNameDecorator : public NameDecorator
+{
+
+
+protected:
+
+    /**
+     * @name        Ovrerides
+     */
+    //@{
+    const std::string getNativePrefix() const throw();
+    const std::string getNativeExtension() const throw();
+    //@}
+
+};
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_DL_POSIXNAMEDECORATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32.hpp
new file mode 100644
index 0000000..02c179d
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef _WIN32
+
+
+#ifndef _FWRUNTIME_DL_WIN32_HPP
+#define _FWRUNTIME_DL_WIN32_HPP
+
+
+#include <windows.h>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/dl/Native.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+/**
+ * @brief   Implements a win32 native module.
+ * @struct  Win32
+ * @date    2004-2009
+ * 
+ */
+struct Win32 : public Native
+{
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   modulePath      a path to the module to manage
+     */
+    Win32( const boost::filesystem::path & modulePath ) throw();
+
+    /**
+     * @brief   Tells if the module is loaded.
+     *
+     * @return  true or false
+     */
+    bool isLoaded() const throw();
+
+    /**
+     * @brief       Retrieves the address of a symbol specified by its name.
+     *
+     * @param[in]   name    a string containing the symbol name.
+     *
+     * @return      a pointer to the found symbol or null if none has been found
+     */
+    void * getSymbol(const std::string& name) const throw(RuntimeException);
+
+    /**
+     * @brief   Loads the module.
+     */
+    void load() throw(RuntimeException);
+
+    /**
+     * @brief   Undloads the module.
+     */
+    void unload() throw(RuntimeException);
+
+
+private:
+
+    /**
+     * @brief   A handle of the loaded module.
+     */
+    HMODULE m_handle;
+
+};
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_DL_WIN32_HPP
+
+
+#endif // #ifdef _WIN32
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32NameDecorator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32NameDecorator.hpp
new file mode 100644
index 0000000..c162756
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/dl/Win32NameDecorator.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_DL_WIN32NAMEDECORATOR_HPP_
+#define _FWRUNTIME_DL_WIN32NAMEDECORATOR_HPP_
+
+
+
+#include "fwRuntime/dl/NameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+/**
+ * @brief   Implements a win32 specific name decorator.
+ * @struct  Win32NameDecorator
+ * @date    2004-2009
+ * 
+ */
+struct Win32NameDecorator : public NameDecorator
+{
+
+
+protected:
+
+    /**
+     * @name        Ovrerides
+     */
+    //@{
+    const std::string getNativeExtension() const throw();
+    //@}
+
+};
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_DL_WIN32NAMEDECORATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/helper.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/helper.hpp
new file mode 100644
index 0000000..6846714
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/helper.hpp
@@ -0,0 +1,86 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIME_HELPER_HPP_
+#define FWRUNTIME_HELPER_HPP_
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/operations.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/io/Validator.hpp"
+
+
+namespace fwRuntime
+{
+/**
+ * @brief   Check configuration element (its XML representation) with respect to the validator (referencing the xsd schema)
+ * @note    Used to check any service/object based configurations as well as runtime extensions.
+ * @return  (true,"") if configuration element is correct vs validator, else (false,std::string(error message)) otherwise
+ * 
+
+ */
+FWRUNTIME_API std::pair< bool , std::string > validateConfigurationElement( ::boost::shared_ptr< ::fwRuntime::io::Validator >   _validator , ::fwRuntime::ConfigurationElement::sptr _element ) ;
+
+/**
+ * @brief   Update pNode content according to _cfgElement
+ * @note    Used to validate a configuration element vs a xsd schema.
+ * @note    Values are not managed yet (cases where curChild->type == XML_TEXT_NODE ).
+ * @note    To be integrated to configuration element.
+ * 
+
+ */
+FWRUNTIME_API void ConfigurationElement2XML(::fwRuntime::ConfigurationElement::sptr _cfgElement, xmlNodePtr pNode) ;
+
+/**
+ * @brief       Returns the configuration element embedding the configuration to be considered for initializing an object or a service
+ * @param[in]   _config : configuration element containing an attribute "config" specifying the name of the contribution to consider
+ * @param[in]   _extension_pt : extension point to which the configuration should contribute with the name indicated by the previous "config" attribute value
+ * 
+ */
+FWRUNTIME_API ConfigurationElement::sptr getCfgAsAnExtension( ConfigurationElement::sptr _config , std::string _extension_pt ) ;
+
+/**
+ * @brief   Returns configuration elements extending the _extension_pt extension point
+ * 
+
+ */
+FWRUNTIME_API std::vector< ConfigurationElement::sptr > getAllCfgForPoint( std::string _extension_pt ) ;
+
+/**
+ * @brief   Returns extensions extending the _extension_pt extension point
+ * 
+
+ */
+FWRUNTIME_API std::vector< ::boost::shared_ptr< ::fwRuntime::Extension > > getAllExtensionsForPoint(std::string extension_pt);
+
+/**
+ * @brief       Returns contribution ids and configuration elements related to a given extension point
+ * @param[in]   _extension_pt : identifier of the extension point to which configuration elements contribute
+ * @return      Map associating contribution ids and associated configuration elements contributing to the extension point _extension_pt
+ * @note        Configuration element identifiers are value of attributes "id".
+ * 
+ */
+FWRUNTIME_API std::map< std::string , ConfigurationElement::sptr > getAllIdAndConfigurationElementsForPoint( std::string _extension_pt  ) ;
+/**
+ * @brief       Returns contribution ids to a given extension point
+ * @param[in]   _extension_pt : identifier of the extension point to which configuration elements contribute
+ * @return      Map associating contribution ids and associated configuration elements contributing to the extension point _extension_pt
+ * @note        Configuration element identifiers are value of attributes "id".
+ * 
+ */
+FWRUNTIME_API std::vector< std::string > getAllIdsForPoint( std::string _extension_pt  ) ;
+
+/**
+ * @brief   Get information for the point
+ * @return  a string with the information of the extension point
+ * 
+ */
+FWRUNTIME_API std::string getInfoForPoint( std::string _extension_pt) ;
+
+}
+
+#endif /*HELPER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/io/BundleDescriptorReader.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/io/BundleDescriptorReader.hpp
new file mode 100644
index 0000000..c6e49bb
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/io/BundleDescriptorReader.hpp
@@ -0,0 +1,177 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_IO_BUNDLEDESCRIPTORREADER_HPP
+#define _FWRUNTIME_IO_BUNDLEDESCRIPTORREADER_HPP
+
+#if defined(__GNUC__)
+#pragma GCC visibility push(default)
+#endif
+#include <string>
+#include <vector>
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+#include <libxml/parser.h>
+#if defined(__GNUC__)
+#pragma GCC visibility pop
+#endif
+
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/dl/Library.hpp"
+
+namespace fwRuntime
+{
+
+
+struct Bundle;
+struct ConfigurationElement;
+struct Extension;
+struct ExtensionPoint;
+
+namespace io
+{
+
+
+/**
+ * @brief   Defines the bundle descriptor reader class.
+ * @date    2004-2009
+ * 
+ */
+struct BundleDescriptorReader
+{
+    typedef std::vector< ::boost::shared_ptr<Bundle> >  BundleContainer;
+    /// Pair of created extension point associated with extensions
+    typedef std::pair< SPTR(ExtensionPoint), std::vector< SPTR(Extension) > > PointExtensionsPairType;
+
+    /**
+     * @brief       Look for a descriptor at the specified location,
+     *              reads it and creates a bundle with it.
+     *
+     * @param[in]   location    a path to a directory that should contain a bundle description
+     *
+     * @return      a shared pointer to the created bundle
+     */
+    FWRUNTIME_API static ::boost::shared_ptr<Bundle> createBundle(const boost::filesystem::path& location) throw(RuntimeException);
+
+    /**
+     * @brief       Look for a descriptor at the specified location,
+     *              reads it and creates a bundle with it.
+     *
+     * @param[in]   location    a path to a plugin.xml that should contain a bundle description
+     *
+     * @return      a shared pointer to the created bundle
+     */
+    FWRUNTIME_API static ::boost::shared_ptr<Bundle> createBundleFromXmlPlugin( const ::boost::filesystem::path & location ) throw ( RuntimeException );
+
+    /**
+     * @brief       Creates all bundles that are found at the given location.
+     *
+     * @param[in]   location    a path to a directory containing bundles
+     *
+     * @return      a container with all created bundles
+     */
+    static const BundleContainer createBundles(const boost::filesystem::path& location) throw(RuntimeException);
+
+    /**
+     * @brief   Processes a configuration element XML node.
+     *
+     * @param   node    a pointer to the XML node that represents a configuration element
+     * @param   bundle  a pointer to the bundle the extension will be attached to
+     *
+     * @return  a pointer to the created configuration element
+     */
+    static ::boost::shared_ptr<ConfigurationElement> processConfigurationElement(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException);
+
+
+
+private:
+
+    static std::string CLASS;           ///< Defines the class XML element name.
+    static std::string EXTENSION;       ///< Defines the extension XML element name.
+    static std::string EXTENSION_POINT; ///< Defines the extension-point XML element name.
+    static std::string ID;              ///< Defines the id XML element name.
+    static std::string IMPLEMENTS;      ///< Defines the implements XML element name.
+    static std::string NAME;            ///< Defines the name XML element name.
+    static std::string LIBRARY;         ///< Defines the library XML element name.
+    static std::string PLUGIN;          ///< Defines the plugin XML element name.
+    static std::string REQUIREMENT;     ///< Defines the requirement XML element name.
+    static std::string SCHEMA;          ///< Defines the schema XML element name.
+    static std::string VERSION;         ///< Defines the version XML element name.
+    static std::string POINT;           ///< Defines the version XML element name.
+
+    /**
+     * @brief   Processes an extension XML node.
+     *
+     * @param   node    a pointer to the XML node that represents an extension
+     * @param   bundle  a pointer to the bundle the extension will be attached to
+     *
+     * @return  a pointer to the created extension
+     */
+    static ::boost::shared_ptr<Extension> processExtension(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException);
+
+
+    /**
+     * Processes a node that is a point
+     *
+     * @param   node    a pointer to the xml document node that represents a requirement
+     * @param   bundle  a pointer to the bundle the extension will be attached to
+     * @return  a pair with the created extension point and extensions
+     */
+    static PointExtensionsPairType processPoint(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException);
+
+    /**
+     * @brief   Processes an extension point XML node.
+     *
+     * @param   node    a pointer to the XML node that represents an extension point
+     * @param   bundle  a pointer to the bundle declaring the extension point
+     *
+     * @return  a pointer to the created extension point
+     */
+    static ::boost::shared_ptr<ExtensionPoint> processExtensionPoint(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException);
+
+    /**
+     * @brief   Processes a library XML node.
+     *
+     * @param   node    a pointer to the XML node that represents a library declaration
+     *
+     * @return  a pointer to the created library
+     */
+    static ::boost::shared_ptr<dl::Library> processLibrary(xmlNodePtr node) throw(RuntimeException);
+
+    /**
+     * Processes a node that is a plugin element.
+     *
+     * @param   node        a pointer to the xml document node that represents a bundle
+     * @param   location    a path to a directory containing the bundle
+     *
+     * @return  a pointer to the created bundle
+     */
+    static ::boost::shared_ptr<Bundle> processPlugin(xmlNodePtr node, const boost::filesystem::path& location) throw(RuntimeException);
+
+    /**
+     * Processes a node that is a requirement
+     *
+     * @param   node        a pointer to the xml document node that represents a requirement
+     *
+     * @return  a string containing the requirement's value
+     */
+    static const std::string processRequirement(xmlNodePtr node) throw(RuntimeException);
+
+    /**
+     * @brief   Runs the descriptor reading and bundle intialization.
+     *
+     * @return  a pointer to a bundle
+     */
+//   ::boost::shared_ptr<Bundle> run(const boost::filesystem::path& location) throw(RuntimeException);
+};
+
+
+} // namespace io
+
+} // namespace fwRuntime
+
+
+#endif // _FWRUNTIME_IO_BUNDLEDESCRIPTORREADER_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/io/Namespace.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/io/Namespace.hpp
new file mode 100644
index 0000000..8fad01d
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/io/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIMEIONAMESPACE_HPP_
+#define FWRUNTIMEIONAMESPACE_HPP_
+
+
+namespace fwRuntime
+{
+/**
+ * @brief       The namespace fwRuntime::io contains classes to read and perform profile file  .
+ * @namespace   fwRuntime::io
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace io
+{
+
+}
+}
+#endif /* FWRUNTIMEIONAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/io/ProfileReader.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/io/ProfileReader.hpp
new file mode 100644
index 0000000..1849348
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/io/ProfileReader.hpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_IO_PROFILEREADER_HPP_
+#define _FWRUNTIME_IO_PROFILEREADER_HPP_
+
+#if defined(__GNUC__)
+#pragma GCC visibility push(default)
+#endif
+#include <string>
+#include <boost/filesystem/path.hpp>
+#include <libxml/tree.h>
+#if defined(__GNUC__)
+#pragma GCC visibility pop
+#endif
+
+#include <boost/shared_ptr.hpp>
+#include "fwRuntime/config.hpp"
+
+namespace fwRuntime
+{
+    namespace profile
+    {
+        class Activater;
+        class Profile;
+        class Starter;
+    }
+}
+
+
+
+namespace fwRuntime
+{
+
+namespace io
+{
+
+/**
+ * @brief   Reads plugin set profiles from xml files.
+ * @struct  ProfileReader
+ * @date    2004-2009
+ * 
+ */
+struct ProfileReader
+{
+
+    /**
+     * @brief       Creates a profile from an xml file located at the given path.
+     *
+     * @param[in]   path    a path to an xml profile file
+     */
+    FWRUNTIME_API static ::boost::shared_ptr< ::fwRuntime::profile::Profile > createProfile( const boost::filesystem::path & path );
+
+
+
+private:
+
+    static std::string  ID;             ///< defines the name of the id xml element or attribute name
+    static std::string  NAME;           ///< defines the name of the xml profile
+    static std::string  VALUE;          ///< defines the name of the value xml element or attribute name
+    static std::string  VERSION;        ///< defines the name of the version xml element or attribute name
+    static std::string  CHECK_SINGLE_INSTANCE;///< defines the name of the check-single-instance xml element or attribute name
+    static std::string  ACTIVATE;       ///< defines the name of the activate xml element or attribute name
+    static std::string  START;          ///< defines the name of the start xml element or attribute name
+    static std::string  PARAM;          ///< defines the name of the parameter xml element or attribute name
+    static std::string  DIS_EXT_PT;     ///< defines the name of the disable extension point xml element or attribute name
+    static std::string  DIS_EXT;        ///< defines the name of the disable extension xml element or attribute name
+
+    /**
+     * @brief       Processes the given xml node as a profile.
+     *
+     * @param[in]   node    a pointer to the xml node to process
+     *
+     * @return      a shared pointer to the created profile
+     */
+    static ::boost::shared_ptr< ::fwRuntime::profile::Profile > processProfile(xmlNodePtr node);
+
+    /**
+     * @brief       Processes the given xml node as an activater.
+     *
+     * @param[in]   node    a pointer to the xml node to process
+     *
+     * @return      a shared pointer to the created activater
+     */
+    static ::boost::shared_ptr< ::fwRuntime::profile::Activater > processActivater(xmlNodePtr node);
+
+    /**
+     * @brief       Processes the given xml node as an activater parameter and
+     *              stores it in the given activater.
+     *
+     * @param[in]   node        a pointer to the xml node to process
+     * @param[out]  activater   a shared pointer to an activater
+     */
+    static void processActivaterParam(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater);
+
+    /**
+     * @brief       Processes the given xml node as an activater disable extension point and
+     *              stores it in the given activater.
+     *
+     * @param[in]   node        a pointer to the xml node to process
+     * @param[out]  activater   a shared pointer to an activater
+     */
+    static void processActivaterDisableExtensionPoint(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater);
+
+    /**
+     * @brief       Processes the given xml node as an activater disable extension and
+     *              stores it in the given activater.
+     *
+     * @param[in]   node        a pointer to the xml node to process
+     * @param[out]  activater   a shared pointer to an activater
+     */
+    static void processActivaterDisableExtension(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater);
+
+    /**
+     * @brief       Processes the given xml node as a starter.
+     *
+     * @param[in]   node    a pointer to the xml node to process
+     *
+     * @return      a shared pointer to the created starter
+     */
+    static ::boost::shared_ptr< ::fwRuntime::profile::Starter > processStarter(xmlNodePtr node);
+
+};
+
+
+
+} // namespace io
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_IO_PROFILEREADER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/io/Validator.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/io/Validator.hpp
new file mode 100644
index 0000000..e61ff79
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/io/Validator.hpp
@@ -0,0 +1,138 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_IO_VALIDATOR_HPP_
+#define _FWRUNTIME_IO_VALIDATOR_HPP_
+
+#include <string>
+#include <sstream>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/filesystem/path.hpp>
+#include <libxml/tree.h>
+#include <libxml/xmlschemastypes.h>
+
+#include "fwRuntime/config.hpp"
+
+namespace fwRuntime
+{
+
+namespace io
+{
+
+
+
+/**
+ * @brief   Implements an XML validator.
+ * @struct  Validator
+ *
+ * @warning Potential Bug : class Validator can generate bug (infinite loop) when used with other Validator class instance.
+ * It seems that this class use a static ivar to save schemaValidationContext. If your call a instance of an visitor this ivar should not be
+ * directly well positionned. So the recommandation is to construct Validator-Use it-destry it and never store him
+ * @date    2007-2009
+ * 
+ */
+struct Validator
+{
+
+    /**
+     * @brief   Copy Constructor
+     *
+     * Copy a validator.
+     *
+     * @param   validator to be copied
+     */
+    FWRUNTIME_API Validator( const Validator &validator );
+
+    /**
+     * @brief   Constructor
+     *
+     * Builds a validator with a string containing a XML shema.
+     *
+     * @param   schema  a string containing the XML schema
+     */
+    FWRUNTIME_API Validator( const std::string & schema );
+
+    /**
+     * @brief   Constructor
+     *
+     * Builds a validator with a path to a file containing an XML schema.
+     *
+     * @param   path    a path to the xml schema file to load
+     */
+    FWRUNTIME_API Validator( const boost::filesystem::path & path );
+
+    /**
+     * @brief   Destructor
+     */
+    FWRUNTIME_API ~Validator();
+
+    /**
+     * @brief   Clears the error log.
+     */
+    void clearErrorLog();
+
+    /**
+     * @brief   Retrieves the error log content.
+     *
+     * @return  a string containing the error log
+     */
+    FWRUNTIME_API const std::string getErrorLog() const;
+
+    /**
+     * @brief   Validates the given file.
+     *
+     * @param   xmlFile a path to an xml file to validate
+     *
+     * @return  true when the validation succeeds, false otherwise
+     */
+    FWRUNTIME_API bool validate( const boost::filesystem::path & xmlFile );
+
+    /**
+     * @brief   Validates the given xml node.
+     *
+     * @param   node    a pointer to an xml node
+     *
+     * @return  true when the validation succeeds, false otherwise
+     */
+    FWRUNTIME_API bool validate( xmlNodePtr node );
+
+    /**
+     * @brief   Returns the xsd content in string format
+     *
+     * @return  xsd of the validator
+     */
+    FWRUNTIME_API std::string getXsdContent();
+
+
+private:
+
+    void initializeContext();
+
+    std::string             m_xsd_content ;
+    std::ostringstream      m_errorLog;
+
+    typedef ::boost::shared_ptr< xmlSchemaParserCtxt > SchemaParserCtxtSptr;
+    typedef ::boost::shared_ptr< xmlSchema > SchemaSptr;
+    typedef ::boost::shared_ptr< xmlSchemaValidCtxt > SchemaValidCtxtSptr;
+
+    SchemaParserCtxtSptr  m_schemaParserContext;
+    SchemaSptr            m_schema;
+    SchemaValidCtxtSptr   m_schemaValidContext;
+
+    static void ErrorHandler( void * userData, xmlErrorPtr error );
+
+};
+
+
+
+} // namespace io
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_IO_VALIDATOR_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/operations.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/operations.hpp
new file mode 100644
index 0000000..49e09ef
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/operations.hpp
@@ -0,0 +1,359 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_OPERATIONS_HPP_
+#define _FWRUNTIME_OPERATIONS_HPP_
+
+#include <iterator>
+#include <memory>
+#include <string>
+#include <boost/filesystem/path.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/Executable.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/Version.hpp"
+
+namespace fwRuntime
+{
+    struct Bundle;
+
+    namespace profile
+    {
+    class Profile;
+    }
+}
+
+
+
+namespace fwRuntime
+{
+
+
+/**
+ * @brief       Retrieves the extension point having the specified identifier.
+ *
+ * @param[in]   identifier  a string containing an extension point identifier
+ *
+ * @return      a pointer to the found extension point or null if none
+ */
+FWRUNTIME_API ::boost::shared_ptr<ExtensionPoint> findExtensionPoint( const std::string & identifier );
+
+
+
+/**
+ * @brief       Creates an executable instance for the specified configuration element.
+ *
+ * @param[in]   extension   a shared to an extension containing a configuration element
+ *                          to use for the executable instance creation
+ * @param[in]   element     a string containing the name of a configuration element
+ * @param[in]   attribute   a string containing an element attribute name to use as
+ *                          the executable type
+ *
+ * @return      a shared pointer to the built executable object
+ */
+template<typename T>
+T* createExecutableInstance(
+        const ::boost::shared_ptr<Extension>    extension,
+        const std::string           & element = "executable",
+        const std::string           & attribute = "class" ) throw(RuntimeException)
+{
+    // Retrieves the right configuration element.
+     ::boost::shared_ptr<ConfigurationElement> elt( extension->findConfigurationElement(element) );
+    if( elt == 0 )
+    {
+        throw RuntimeException(element + ": configuration element not found in extension.");
+    }
+
+    // Creates the executable instance from the found configuration element.
+    return createExecutableInstance<T>( elt, attribute );
+}
+
+
+/**
+ * @brief       Creates an executable instance for the specifed configuration element.
+ *
+ * @param[in]   element     a shared pointer to a configuration element
+ * @param[in]   attribute   a string containing an element attribute name to use as
+ *                      the executable type
+ *
+ * @return      a shared pointer to the built executable object
+ */
+template<typename T>
+T * createExecutableInstance(
+        const ::boost::shared_ptr<ConfigurationElement> element,
+        const std::string                       & attribute = "class" ) throw(RuntimeException)
+{
+
+    // Retrieves the executable type.
+    if( element->hasAttribute( attribute ) == false )
+    {
+        throw RuntimeException( "Configuration element has no attribute '" + attribute + "'." );
+    }
+    const std::string type( element->getExistingAttributeValue(attribute) );
+
+    // Creates the executable instance.
+    Runtime                         * rntm      ( Runtime::getDefault()                         );
+    std::auto_ptr< IExecutable >    executable  ( rntm->createExecutableInstance(type, element) );
+
+    // Converts the executable instance to the right type.
+    T * result = dynamic_cast<T*>( executable.get() );
+    if( result == 0 )
+    {
+        throw RuntimeException( "Executable creation failed. Bad cast" );
+    }
+    executable.release();
+
+    // That's all folks !
+    return result;
+}
+
+
+
+/**
+ * @brief   Retrieves all extensions for the point having the specified
+ *          identifier.
+ *
+ * @param   identifier  a string containing an extension point identifier
+ * @param   output      an insert iterator used to store each found extension
+ */
+template<typename OutputIterator>
+void getAllExtensionsForPoint(
+        const std::string   & identifier,
+        OutputIterator        output
+    ) throw(RuntimeException)
+{
+     ::boost::shared_ptr< ExtensionPoint >  point = findExtensionPoint(identifier);
+
+    if( !point )
+    {
+        throw RuntimeException( identifier + ": invalid extension point identifier." );
+    }
+    point->getAllExtensions( output );
+}
+
+
+
+/**
+ * @brief   Retrieves all configuration elements for the point having the
+ *          specified identifier.
+ *
+ * @param   identifier  a string containing an extension point identifier
+ * @param   output      an insert iterator used to store found configuration
+ *                      elements
+ */
+template<typename OutputIterator>
+void getAllConfigurationElementsForPoint(
+        const std::string   & identifier,
+        OutputIterator        output
+    ) throw(RuntimeException)
+{
+     ::boost::shared_ptr< ExtensionPoint >  point = findExtensionPoint(identifier);
+
+    OSLM_TRACE("getAllConfigurationElementsForPoint(" << identifier << "Bundle" << point->getBundle()->getIdentifier() );
+
+    if( !point )
+    {
+        throw RuntimeException( identifier + ": invalid extension point identifier." );
+    }
+
+    // VAG test if ExtensionPoint is enable
+    if ( point->isEnable() )
+    {
+        point->getAllConfigurationElements( output );
+    }
+    else
+    {
+        OSLM_DEBUG ( "IGNORING getAllConfigurationElementsForPoint(" << identifier << ") extension point disabled");
+    }
+
+}
+
+
+/**
+ * @brief   Retrieves all configuration elements for the point having the
+ *          specified identifier.
+ *
+ * This method use the container type specified by the template parameter. The
+ * type of the elements of the container must be \::boost::shared_ptr< ConfigurationElement >
+ * or the compilation will fail.
+ *
+ * @return  a container containing shared pointers to all found configuration
+ *          elements
+ */
+template<typename Container>
+const Container getAllConfigurationElementsForPoint(const std::string & identifier) throw(RuntimeException)
+{
+    // Defines an insert iterator type for the container.
+    typedef std::back_insert_iterator< Container > Inserter;
+
+    // Collects all contributed configuratoin elements.
+    Container   elements;
+    Inserter    inserter(elements);
+    getAllConfigurationElementsForPoint(identifier, inserter);
+
+    // The job is done!
+    return elements;
+}
+
+
+/**
+ * @brief   Retrieves all executable objects for the point having the specified identifier
+ *
+ * @param   identifier  a string containing the extension point identifier
+ * @param   attribute   a string containing the name of the element attribute containing
+ *                      the executable identifier (default is "class")
+ *
+ * This method use the container type specified by the template parameter. The
+ * type of the elements of the container must be \::boost::shared_ptr< T >
+ * or the compilation will fail (where T is the type of the executable you want to create).
+ *
+ * @return  a container containing shared pointers to all created executable instances
+ */
+template< typename Container, typename T >
+const Container getAllExecutableForPoint( const std::string & identifier, const std::string & attribute = "class" ) throw(RuntimeException)
+{
+    // Defines the element container
+    typedef std::vector< ::boost::shared_ptr< ConfigurationElement > > ConfigurationElementContainer;
+
+    // Retrieves all configuration elements.
+    ConfigurationElementContainer   elements( getAllConfigurationElementsForPoint< ConfigurationElementContainer >(identifier) );
+
+    // Defines an insert iterator type for the executable container.
+    typedef std::back_insert_iterator< Container > Inserter;
+
+    // Walks through collected configuration elements and create desired executable instances
+    Container                               result;
+    ConfigurationElementContainer::iterator iElement;
+    Inserter                                iInserter( result );
+    for( iElement = elements.begin(); iElement != elements.end(); ++iElement, ++iInserter )
+    {
+         ::boost::shared_ptr< ConfigurationElement >    element( *iElement );
+         ::boost::shared_ptr< T >                       executable( createExecutableInstance< T >(element, attribute) );
+
+        iInserter = executable;
+    }
+    return result;
+}
+
+
+/**
+ * @brief   Retrieves the configuation element with the given identifier for the
+ *          given extension point
+ *
+ * @param   identifier          a string containing the configuration element identifier
+ * @param   pointIdentifier     a string containing the extension point identifier
+ *
+ * @return  a shared pointer to the found configuration element or null if none
+ */
+FWRUNTIME_API ::boost::shared_ptr< ConfigurationElement > findConfigurationElement( const std::string & identifier, const std::string & pointIdentifier );
+
+
+
+/**
+ * @brief   Retrieves the extension having the specified identifier.
+ *
+ * @param   identifier  a string containing an extension identifier
+ *
+ * @return  a shared pointer to the found extension or null if none
+ */
+FWRUNTIME_API ::boost::shared_ptr<Extension> findExtension( const std::string & identifier );
+
+
+/**
+ * @brief   Retrieve a filesystem valid path for a path relative to the bundle having the specified identifier.
+ *
+ * @param   bundleIdentifier    a string containing a bundle identifier
+ * @param   path                a bundle relative path
+ *
+ * @return  a system valid path
+ */
+FWRUNTIME_API const boost::filesystem::path getBundleResourcePath(const std::string& bundleIdentifier, const boost::filesystem::path &path) throw();
+
+
+/**
+ * @brief   Retreives a filesystem valid path for a path relative to the specified bundle.
+ *
+ * @param   bundle  a pointer to a bundle instance
+ * @param   path    a path relative to the bundle
+ *
+ * @return  a system valid path
+ */
+FWRUNTIME_API const boost::filesystem::path getBundleResourcePath( ::boost::shared_ptr<Bundle> bundle, const boost::filesystem::path &path) throw();
+
+
+/**
+ * @brief   Retreives a filesystem valid path for a path relative to the bundle of the specified configuration element.
+ *
+ * @param   element a shared pointer to a configuration element instance
+ * @param   path    a path relative to the bundle
+ *
+ * @return  a system valid path
+ */
+FWRUNTIME_API const boost::filesystem::path getBundleResourcePath( ::boost::shared_ptr<ConfigurationElement> element, const boost::filesystem::path &path) throw();
+
+
+/**
+ * @brief   Retrieves a filesystem valid path for a path relative to the specified executable instance.
+ *
+ * @param   executable  a pointer to an executable instance
+ * @param   path        a path relative to the bundle
+ *
+ * @return  a system valid path
+ */
+FWRUNTIME_API const boost::filesystem::path getBundleResourcePath(const IExecutable *executable, const boost::filesystem::path &path) throw();
+
+
+/**
+ * @brief   Loads all bundles that can be found in the specified directory.
+ *
+ * @param   directory   a path to the directory to explore for bundles
+ */
+FWRUNTIME_API void addBundles( const boost::filesystem::path & directory ) throw(RuntimeException);
+
+
+/**
+ * @brief   Starts the given bundle set profile.
+ *
+ * @param   path    a path to an xml profile file
+ *
+ * @return  a shared pointer to the started profile
+ */
+FWRUNTIME_API ::boost::shared_ptr< ::fwRuntime::profile::Profile > startProfile( const boost::filesystem::path & path );
+
+
+
+/**
+ * @brief   Retrieves the bundle with the given identifier and version
+ *
+ * @param   identifier  a string containing a bunle identifier
+ * @param   version     a version (none by default)
+ *
+ * @return  a shared pointer to the found bundle, or empty when none
+ */
+FWRUNTIME_API ::boost::shared_ptr<Bundle> findBundle( const std::string & identifier, const Version & version = Version() );
+
+
+
+/**
+ * @brief   Starts the bundle specified by the given identifier.
+ *
+ * @param   identifier  a string containing a bundle identifier
+ */
+FWRUNTIME_API void startBundle(const std::string &identifier) throw(RuntimeException);
+
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_OPERATIONS_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/predicates.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/predicates.hpp
new file mode 100644
index 0000000..428bb28
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/predicates.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+namespace fwRuntime
+{
+
+
+
+/**
+ * @brief   Implements a STL compliant predicate that tests if a given
+ *          object has a given identifier and is enabled.
+ * @struct  IsEnableAndHasIdentifier
+ *
+ * @remark  Intended to be used on extensions, extension points and bundles
+ *
+ * @date    2007-2009
+ * 
+ */
+template< typename T >
+struct IsEnableAndHasIdentifier
+{
+    /**
+     * @brief   Constructor.
+     */
+    IsEnableAndHasIdentifier( const std::string & identifier )
+    :   m_identifier( identifier )
+    {}
+
+    bool operator() ( const ::boost::shared_ptr< T > p ) const
+    {
+        return p->getIdentifier() == m_identifier && p->isEnable();
+    }
+
+private:
+
+    std::string m_identifier;
+};
+
+
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Activater.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Activater.hpp
new file mode 100644
index 0000000..9ce8053
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Activater.hpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_ACTIVATER_HPP_
+#define _FWRUNTIME_PROFILE_ACTIVATER_HPP_
+
+#include <map>
+#include <vector>
+#include <string>
+#include <boost/utility.hpp>
+
+#include "fwRuntime/config.hpp"
+#include "fwRuntime/Version.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+
+
+/**
+ * @brief   Activates a given bundle with optional parameters.
+ * @class  Activater
+ * @date    2007-2009.
+ * 
+ */
+class Activater : public boost::noncopyable
+{
+public:
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   identifier  a string containing a bundle identifier
+     * @param[in]   version     a string a bundle version
+     */
+    FWRUNTIME_API Activater( const std::string & identifier, const std::string & version );
+
+
+    /**
+     * @brief       Adds a new parameter to the activater.
+     *
+     * @param[in]   identifier  a string containing the parameter name
+     * @param[in]   value       a string containing the parameter value
+     */
+    FWRUNTIME_API void addParameter( const std::string & identifier, const std::string & value );
+
+    /**
+     * @brief       Adds a new disable extension point  to the activater.
+     *
+     * @param[in]   identifier    a string containing the parameter name
+     */
+    FWRUNTIME_API void addDisableExtensionPoint( const std::string & identifier );
+
+    /**
+     * @brief       Adds a new disable extension  to the activater.
+     *
+     * @param[in]   identifier    a string containing the parameter name
+     */
+    FWRUNTIME_API void addDisableExtension( const std::string & identifier );
+
+    /**
+     * @brief   Applies the activater on the system.
+     *
+     * @remark  This method should be called directly.
+     */
+    void apply();
+
+
+private:
+
+    typedef std::map< std::string, std::string >    ParameterContainer;
+    typedef std::vector< std::string >              DisableExtensionPointContainer;
+    typedef std::vector< std::string >              DisableExtensionContainer;
+
+
+    const std::string               m_identifier;               ///< a bundle identifier
+    const Version                   m_version;                  ///< a bundle version
+
+    ParameterContainer              m_parameters;               ///< all parameters
+    DisableExtensionPointContainer  m_disableExtensionPoints;   ///< all disable extension points
+    DisableExtensionContainer       m_disableExtensions;        ///< all disable extensions
+
+};
+
+
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_PROFILE_ACTIVATER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Initializer.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Initializer.hpp
new file mode 100644
index 0000000..3ee2143
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Initializer.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_INITIALIZER_HPP_
+#define _FWRUNTIME_PROFILE_INITIALIZER_HPP_
+
+#include <string>
+#include <boost/utility.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+
+
+/**
+ * @brief   Starts a given bundle.
+ * @class  Initializer
+ * @date    2007-2009
+ * 
+ */
+class Initializer : public boost::noncopyable
+{
+
+public:
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   identifier  a string containing a bundle identifier
+     */
+    FWRUNTIME_API Initializer( const std::string & identifier );
+
+    /**
+     * @brief   Applies the initializer on the bundle.
+     *
+     * @remark  This method should be called directly.
+     */
+    void apply();
+
+
+protected:
+
+    const std::string   m_identifier;   ///< a bundle identifier
+
+};
+
+
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_PROFILE_INITIALIZER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Namespace.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Namespace.hpp
new file mode 100644
index 0000000..67ca88f
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Namespace.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIMEPROFILENAMESPACE_HPP_
+#define FWRUNTIMEPROFILENAMESPACE_HPP_
+
+
+namespace fwRuntime
+{
+/**
+ * @brief       The namespace fwRuntime::profile contains classes to manage bundle declares in profile.xml file (activate/start/stop).
+ * @namespace   fwRuntime::profile
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace profile
+{
+
+}
+}
+#endif /* FWRUNTIMEPROFILENAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Profile.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Profile.hpp
new file mode 100644
index 0000000..de324e1
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Profile.hpp
@@ -0,0 +1,226 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_PROFILE_HPP_
+#define _FWRUNTIME_PROFILE_PROFILE_HPP_
+
+#include <vector>
+
+#include <boost/function.hpp>
+#include <boost/utility.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "fwCore/base.hpp"
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+/**
+ * @namespace   ::fwRuntime::profile
+ * @brief       Namespace ::fwRuntime::profile
+ * @date    2007-2009
+ */
+namespace profile
+{
+
+class Activater;
+class Starter;
+class Stopper;
+class Initializer;
+class Uninitializer;
+
+
+/**
+ * @brief   Implements a bundle set profile.
+ * @class  Profile
+ * @date    2007-2009
+ */
+class Profile : public ::fwCore::BaseObject
+{
+public:
+
+    typedef std::vector< std::string >  ParamsContainer;
+    typedef ::boost::function< int () > RunCallbackType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Profile)(BaseObject), (()), new Profile) ;
+
+    /**
+     * @brief   Constructor : does nothing.
+     */
+    FWRUNTIME_API Profile();
+
+    FWRUNTIME_API ~Profile();
+
+    /**
+     * @brief       Adds a new activator.
+     *
+     * @param[in]   activater   a shared pointer to an activator
+     */
+    FWRUNTIME_API void add( SPTR( Activater ) activater );
+
+    /**
+     * @brief       Adds a new starter.
+     *
+     * @param[in]   starter a shared pointer to a starter
+     */
+    FWRUNTIME_API void add( SPTR( Starter ) starter );
+
+    /**
+     * @brief       Adds a new stopper.
+     *
+     * @param[in]   stopper a shared pointer to a stopper
+     */
+    FWRUNTIME_API void add( SPTR( Stopper ) stopper );
+
+    /**
+     * @brief       Adds a new starter.
+     *
+     * @param[in]   initializer a shared pointer to an initializer
+     */
+    FWRUNTIME_API void add( SPTR( Initializer ) initializer );
+
+    /**
+     * @brief       Adds a new starter.
+     *
+     * @param[in]   uninitializer a shared pointer to an uninitializer
+     */
+    FWRUNTIME_API void add( SPTR( Uninitializer ) uninitializer );
+
+    /**
+     * @brief   Starts the profile.
+     */
+    FWRUNTIME_API void start();
+    FWRUNTIME_API void stop();
+
+
+    /**
+     * @brief   Run the profile.
+     */
+    FWRUNTIME_API int run();
+    FWRUNTIME_API int defaultRun();
+    FWRUNTIME_API void setRunCallback(RunCallbackType callback);
+
+
+    /**
+     * @brief   Once started, setup the profile.
+     */
+    FWRUNTIME_API void setup();
+    FWRUNTIME_API void cleanup();
+
+    /**
+     * @brief   Return profile name.
+     */
+    std::string getName() { return m_sName; }
+
+    /**
+     * @brief       Set profile name.
+     *
+     * @param[in]   _sName  profile name
+     */
+    void setName(std::string _sName) { m_sName = _sName; }
+
+    /// Get profile m_filePath
+    ::boost::filesystem::path getFilePath() {return  m_filePath; } const
+
+    /// Set profile m_filePath
+    void setFilePath( const ::boost::filesystem::path& _filePath) { m_filePath = _filePath; }
+
+    /**
+     * @brief   Return profile version.
+     */
+    std::string getVersion() { return m_sVersion; }
+
+    /**
+     * @brief       Set profile version.
+     *
+     * @param[in]   _sVersion   profile version
+     */
+    void setVersion(std::string _sVersion) { m_sVersion = _sVersion; }
+
+
+
+    /**
+     * @brief   Return profile CheckSingleInstance.
+     */
+    bool getCheckSingleInstance() { return m_checkSingleInstance; }
+
+    /**
+     * @brief       Set profile CheckSingleInstance.
+     *
+     * @param[in]   _checkSingleInstance    profile CheckSingleInstance
+     */
+    void setCheckSingleInstance(bool _checkSingleInstance) { m_checkSingleInstance = _checkSingleInstance; }
+
+    FWRUNTIME_API ParamsContainer getParams();
+
+    FWRUNTIME_API void setParams(const ParamsContainer &params);
+    FWRUNTIME_API void setParams(int argc, char** argv);
+
+    /**
+     * @brief Returns a reference on internal arg count.
+     * The returned int shall not be modified. This is provided for external
+     * library needs (QApplication contructor for example)
+     */
+    FWRUNTIME_API int& getRawArgCount();
+
+    /**
+     * @brief Returns a raw pointer on internal arguments.
+     * The returned data shall not be modified. This is provided for external
+     * library needs (QApplication contructor for example)
+     */
+    FWRUNTIME_API char** getRawParams();
+
+private:
+
+    typedef std::vector< SPTR(Activater) >     ActivaterContainer;
+    typedef std::vector< SPTR(Starter) >       StarterContainer;
+    typedef std::vector< SPTR(Stopper) >       StopperContainer;
+    typedef std::vector< SPTR(Initializer) >   InitializerContainer;
+    typedef std::vector< SPTR(Uninitializer) > UninitializerContainer;
+
+    ActivaterContainer        m_activaters;     ///< all managed activators
+    StarterContainer          m_starters;       ///< all managed starters
+    StopperContainer          m_stoppers;       ///< all managed stoppers
+    InitializerContainer      m_initializers;   ///< all managed initializers
+    UninitializerContainer    m_uninitializers; ///< all managed uninitializers
+
+    std::string         m_sName;            ///< name profile
+    std::string         m_sVersion;         ///< profile app version
+    ::boost::filesystem::path m_filePath;   ///< xml parsed file used to generate profile
+
+    bool                m_checkSingleInstance;
+
+    ParamsContainer     m_params;
+    int                 m_argc;
+    char              **m_argv;
+
+    RunCallbackType m_run;
+};
+
+
+/**
+ * @brief       Set current profile.
+ *
+ * @param       prof profile
+ */
+FWRUNTIME_API void setCurrentProfile(Profile::sptr prof);
+
+/**
+ * @brief       Get current profile.
+ */
+FWRUNTIME_API Profile::sptr getCurrentProfile();
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+
+#endif /*_FWRUNTIME_PROFILE_PROFILE_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Starter.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Starter.hpp
new file mode 100644
index 0000000..7329812
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Starter.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_STARTER_HPP_
+#define _FWRUNTIME_PROFILE_STARTER_HPP_
+
+#include <string>
+#include <boost/utility.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+
+
+/**
+ * @brief   Starts a given bundle.
+ * @class  Starter
+ * @date    2007-2009
+ * 
+ */
+class Starter : public boost::noncopyable
+{
+public:
+
+    friend class Stopper;
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   identifier  a string containing a bundle identifier
+     */
+    FWRUNTIME_API Starter( const std::string & identifier );
+
+    /**
+     * @brief   Applies the starter on the system.
+     *
+     * @remark  This method should be called directly.
+     */
+    void apply();
+
+
+protected:
+
+    const std::string   m_identifier;   ///< a bundle identifier
+
+};
+
+
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_PROFILE_STARTER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Stopper.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Stopper.hpp
new file mode 100644
index 0000000..4eed31b
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Stopper.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_STOPPER_HPP_
+#define _FWRUNTIME_PROFILE_STOPPER_HPP_
+
+#include <string>
+#include <boost/utility.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/profile/Starter.hpp"
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+
+
+/**
+ * @brief   Stops a given bundle.
+ * @class  Stopper
+ * @date    2007-2009
+ * 
+ */
+class Stopper :  public boost::noncopyable
+{
+
+public:
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   _identifier  a string containing a bundle identifier
+     */
+    FWRUNTIME_API Stopper( const std::string   & _identifier );
+
+    /**
+     * @brief   Applies the Stopper on the system.
+     *
+     * @remark  This method should be called directly.
+     */
+    void apply();
+
+private :
+
+    const std::string   m_identifier;   ///< a bundle identifier
+};
+
+
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_PROFILE_STOPPER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/profile/Uninitializer.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Uninitializer.hpp
new file mode 100644
index 0000000..31e01e9
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/profile/Uninitializer.hpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_PROFILE_UNINITIALIZER_HPP_
+#define _FWRUNTIME_PROFILE_UNINITIALIZER_HPP_
+
+#include <string>
+#include <boost/utility.hpp>
+
+#include "fwRuntime/config.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+
+
+/**
+ * @brief   Starts a given bundle.
+ * @class  Uninitializer
+ * @date    2007-2009
+ * 
+ */
+class Uninitializer : public boost::noncopyable
+{
+public:
+
+    friend class Stopper;
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   identifier a string containing a bundle identifier
+     */
+    FWRUNTIME_API Uninitializer( const std::string & identifier );
+
+    /**
+     * @brief   Applies the uninitializer on the bundle.
+     *
+     * @remark  This method should be called directly.
+     */
+    void apply();
+
+
+protected:
+
+    const std::string   m_identifier;   ///< a bundle identifier
+
+};
+
+
+
+} // namespace profile
+
+} // namespace fwRuntime
+
+
+
+#endif /*_FWRUNTIME_PROFILE_UNINITIALIZER_HPP_*/
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactory.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactory.hpp
new file mode 100644
index 0000000..41b828e
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactory.hpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORY_HPP
+#define _FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORY_HPP
+
+#include <sstream>
+#include <string>
+#include <boost/shared_ptr.hpp>
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/ExecutableFactory.hpp"
+
+
+namespace fwRuntime
+{
+namespace utils
+{
+
+
+/**
+ * @brief   Defines a generic template executable factory class.
+ * @struct  GenericExecutableFactory
+ * @date    2004-2009
+ * 
+ */
+template<typename E>
+struct GenericExecutableFactory : public ExecutableFactory
+{
+    /**
+     * @brief       Constructor.
+     *
+     * @param[in]   type    a string containing the type supported by the factory
+     */
+    GenericExecutableFactory(const std::string& type)
+    :   ExecutableFactory( type )
+    {}
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    virtual ~GenericExecutableFactory()
+    {}
+
+
+    /**
+     * @brief   Creates an executable object instance.
+     *
+     * @return  a pointer to an executable instance
+     */
+    IExecutable* createExecutable() const throw(RuntimeException)
+    {
+        IExecutable * result( 0 );
+        try
+        {
+            result = new E();
+        }
+        catch( std::exception & exception )
+        {
+            std::ostringstream  buffer;
+            buffer << "Unexpected exception caught while creating an ::fwRuntime::IExecutable instance. ";
+            buffer << exception.what();
+            throw RuntimeException( buffer.str() );
+        }
+        catch( ... )
+        {
+            throw RuntimeException( "Unexpected exception caught while creating an ::fwRuntime::IExecutable instance." );
+        }
+        return result;
+    }
+
+
+private:
+
+    /**
+     * @brief   Assignment operator.
+     *
+     * @remark  Assignment forbidden for this class.
+     */
+    void operator=(const GenericExecutableFactory&) throw()
+    {}
+
+};
+
+
+} // namespace utils
+
+} // namespace fwRuntime
+
+
+#endif // #define _FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORY_HPP
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp
new file mode 100644
index 0000000..c4db217
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORYREGISTRAR_HPP_
+#define _FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORYREGISTRAR_HPP_
+
+#include <string>
+
+#include "fwRuntime/ExecutableFactoryRegistrar.hpp"
+#include "fwRuntime/utils/GenericExecutableFactory.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace utils
+{
+
+/**
+ * @brief   Defines a generic template executable factory registrar class.
+ * @struct  GenericExecutableFactoryRegistrar
+ * @date    2004-2009
+ * 
+ */
+template< typename E >
+struct GenericExecutableFactoryRegistrar : public ExecutableFactoryRegistrar
+{
+
+    typedef GenericExecutableFactory< E >   FactoryType;
+
+    /**
+     * @brief   Constructor
+     */
+    GenericExecutableFactoryRegistrar(const std::string& type)
+    : ExecutableFactoryRegistrar( ::boost::shared_ptr< FactoryType >( new FactoryType(type) ) )
+    {}
+
+};
+
+
+} // namespace utils
+
+} // namespace fwRuntime
+
+
+#endif //_FWRUNTIME_UTILS_GENERICEXECUTABLEFACTORYREGISTRAR_HPP_
diff --git a/SrcLib/core/fwRuntime/include/fwRuntime/utils/Namespace.hpp b/SrcLib/core/fwRuntime/include/fwRuntime/utils/Namespace.hpp
new file mode 100644
index 0000000..cadf886
--- /dev/null
+++ b/SrcLib/core/fwRuntime/include/fwRuntime/utils/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRUNTIMEUTILSNAMESPACE_HPP_
+#define FWRUNTIMEUTILSNAMESPACE_HPP_
+
+namespace fwRuntime
+{
+/**
+ * @brief       The namespace fwRuntime::utils contains template executable factory classes
+ * @namespace   fwRuntime::utils
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace utils
+{
+
+}
+}
+#endif /* FWRUNTIMEUTILSNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwRuntime/rc/locale/en/LC_MESSAGES/runtime.po b/SrcLib/core/fwRuntime/rc/locale/en/LC_MESSAGES/runtime.po
new file mode 100644
index 0000000..710eb4c
--- /dev/null
+++ b/SrcLib/core/fwRuntime/rc/locale/en/LC_MESSAGES/runtime.po
@@ -0,0 +1,17 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 13:59+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
diff --git a/SrcLib/core/fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.po b/SrcLib/core/fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.po
new file mode 100644
index 0000000..22cd596
--- /dev/null
+++ b/SrcLib/core/fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.po
@@ -0,0 +1,17 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-06-13 13:59+0200\n"
+"PO-Revision-Date: 2008-06-13 16:00+0100\n"
+"Last-Translator: Johan Moreau <Johan.Moreau at laposte.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
diff --git a/SrcLib/core/fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.pot b/SrcLib/core/fwRuntime/rc/locale/fr/LC_MESSAGES/runtime.pot
new file mode 100644
index 0000000..e69de29
diff --git a/SrcLib/core/fwRuntime/rc/plugin.xsd b/SrcLib/core/fwRuntime/rc/plugin.xsd
new file mode 100644
index 0000000..ba0173a
--- /dev/null
+++ b/SrcLib/core/fwRuntime/rc/plugin.xsd
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    <xs:element name="plugin" type="PluginType" />
+
+    <xs:complexType name="PluginType">
+        <xs:choice minOccurs="0" maxOccurs="unbounded">
+            <xs:element name="library" type="LibraryType" />
+            <xs:element name="requirement" type="RequirementType" />
+            <xs:element name="extension-point" type="ExtensionPointType" />
+            <xs:element name="extension" type="ExtensionType" />
+            <xs:element name="point" type="PointType" />
+            <xs:element name="Substitutions" type="SubstitutionsType" />
+        </xs:choice>
+        <xs:attribute name="id" type="xs:string" use="required" />
+        <xs:attribute name="class" type="xs:string" />
+        <xs:attribute name="version" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="RequirementType">
+        <xs:attribute name="id" type="xs:string" use="required" />
+        <xs:attribute name="version" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="SubstitutionsType">
+        <xs:sequence>
+            <xs:element name="substitute" minOccurs="1" maxOccurs="unbounded">
+                <xs:complexType>
+                    <xs:sequence>
+                        <xs:element name="nodePath" type="xs:string" minOccurs="1" maxOccurs="1" />
+                        <xs:element name="replace" minOccurs="1" maxOccurs="1">
+                            <xs:complexType>
+                                <xs:attribute name="dictEntry" type="xs:string" use="required" />
+                                <xs:attribute name="type" type="xs:string" use="optional" />
+                                <xs:attribute name="status" use="required">
+                                    <xs:simpleType>
+                                        <xs:restriction base="xs:string">
+                                            <xs:enumeration value="optional" />
+                                            <xs:enumeration value="required" />
+                                        </xs:restriction>
+                                    </xs:simpleType>
+                                </xs:attribute>
+                            </xs:complexType>
+                        </xs:element>
+                    </xs:sequence>
+                </xs:complexType>
+            </xs:element>
+        </xs:sequence>
+    </xs:complexType>
+
+
+
+
+    <xs:complexType name="LibraryType">
+        <xs:attribute name="name" type="xs:string" use="required" />
+    </xs:complexType>
+
+    <xs:complexType name="PointType">
+        <xs:sequence>
+            <xs:element name="implements" type="xs:string" minOccurs="1" maxOccurs="unbounded" />
+        </xs:sequence>
+        <xs:attribute name="id" type="xs:string" use="required" />
+        <xs:attribute name="schema" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="ExtensionPointType">
+        <xs:attribute name="id" type="xs:string" use="required" />
+        <xs:attribute name="schema" type="xs:string" />
+    </xs:complexType>
+
+    <xs:complexType name="ExtensionType">
+        <xs:sequence>
+            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
+        </xs:sequence>
+        <xs:attribute name="id" type="xs:string" />
+        <xs:attribute name="implements" type="xs:string" use="required" />
+    </xs:complexType>
+
+</xs:schema>
diff --git a/SrcLib/core/fwRuntime/rc/profile.xsd b/SrcLib/core/fwRuntime/rc/profile.xsd
new file mode 100644
index 0000000..15c89ce
--- /dev/null
+++ b/SrcLib/core/fwRuntime/rc/profile.xsd
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:element name="profile" type="ProfileType" />
+
+<xs:complexType name="ProfileType">
+  <xs:sequence>
+    <xs:element name="activate" type="ActivateType" minOccurs="1" maxOccurs="unbounded" />
+    <xs:element name="start" type="StartType" minOccurs="1" maxOccurs="unbounded" />
+  </xs:sequence>
+  <xs:attribute name="name" type="xs:string" use="required"/>
+  <xs:attribute name="version" type="xs:string" use="required"/>
+  <xs:attribute name="check-single-instance" type="xs:boolean" use="optional"/>
+</xs:complexType>
+
+<xs:complexType name="ActivateType">
+	<xs:sequence>
+		<xs:element name="disable-extension-point" type="DisableExtensionPointType" minOccurs="0" maxOccurs="unbounded" />
+		<xs:element name="disable-extension" type="DisableExtensionType" minOccurs="0" maxOccurs="unbounded" />
+		<xs:element name="param" type="ParamType" minOccurs="0" maxOccurs="unbounded" />
+	</xs:sequence>
+	<xs:attribute name="id" type="xs:string" use="required"/>
+	<xs:attribute name="version" type="xs:string" />
+</xs:complexType>
+
+<xs:complexType name="ParamType">
+	<xs:attribute name="id" type="xs:string" use="required"/>
+	<xs:attribute name="value" type="xs:string"/>
+</xs:complexType>
+
+<xs:complexType name="DisableExtensionPointType">
+	<xs:attribute name="id" type="xs:string" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="DisableExtensionType">
+	<xs:attribute name="id" type="xs:string" use="required"/>
+</xs:complexType>
+
+<xs:complexType name="StartType">
+	<xs:attribute name="id" type="xs:string" use="required"/>
+</xs:complexType>
+
+</xs:schema>
diff --git a/SrcLib/core/fwRuntime/src/Bundle.cpp b/SrcLib/core/fwRuntime/src/Bundle.cpp
new file mode 100644
index 0000000..7eb8a1d
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Bundle.cpp
@@ -0,0 +1,602 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <algorithm>
+#include <cassert>
+#include <exception>
+#include <memory>
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/EmptyPlugin.hpp"
+#include "fwRuntime/IExecutable.hpp"
+#include "fwRuntime/ExecutableFactory.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/predicates.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/io/BundleDescriptorReader.hpp"
+#include "fwRuntime/utils/GenericExecutableFactory.hpp"
+#include "fwRuntime/profile/Profile.hpp"
+#include "fwRuntime/profile/Initializer.hpp"
+#include "fwRuntime/profile/Stopper.hpp"
+
+#include "fwRuntime/Bundle.hpp"
+
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+namespace
+{
+
+    /**
+     * @brief   Defines a STL compatible predicate telling if an executable factory
+     *          matches the given type identifier
+     *
+     * 
+     */
+    struct IsOfType
+    {
+        IsOfType( const std::string & type )
+        :   m_type( type )
+        {}
+
+        bool operator() ( const SPTR( ExecutableFactory ) factory ) const
+        {
+            return factory->getType() == m_type;
+        }
+
+    private:
+
+        std::string m_type;
+    };
+}
+
+//------------------------------------------------------------------------------
+
+SPTR( Bundle ) Bundle::m_loadingBundle;
+
+//------------------------------------------------------------------------------
+
+SPTR( Bundle ) Bundle::getLoadingBundle()
+{
+    return m_loadingBundle;
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::Bundle( const boost::filesystem::path   & location,
+                const std::string               & id,
+                const std::string               & version )
+:   m_location    ( location ),
+    m_identifier  ( id ),
+    m_version     ( version ),
+    m_enable      ( false ),
+    m_started     ( false ),
+    m_initialized ( false )
+
+{
+    // Post-condition.
+    assert( m_location.is_complete() == true );
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::Bundle(
+            const boost::filesystem::path   & location,
+            const std::string               & id,
+            const std::string               & version,
+            const std::string               & c )
+:   m_location    ( location ),
+    m_identifier  ( id ),
+    m_version     ( version ),
+    m_class       ( c ),
+    m_enable      ( false ),
+    m_started     ( false ),
+    m_initialized ( false )
+
+{
+    // Post-condition.
+    assert( m_location.is_complete() == true );
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::addExecutableFactory( SPTR( ExecutableFactory ) factory )
+{
+    m_executableFactories.insert( factory );
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExecutableFactoryConstIterator Bundle::executableFactoriesBegin() const
+{
+    return m_executableFactories.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExecutableFactoryConstIterator Bundle::executableFactoriesEnd() const
+{
+    return m_executableFactories.end();
+}
+
+//------------------------------------------------------------------------------
+
+SPTR( ExecutableFactory ) Bundle::findExecutableFactory( const std::string & type ) const
+{
+    ExecutableFactoryConstIterator  found = std::find_if( m_executableFactories.begin(), m_executableFactories.end(), IsOfType(type) );
+    return found != m_executableFactories.end() ? *found : SPTR( ExecutableFactory )();
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::addExtension( SPTR( Extension ) extension )
+{
+    m_extensions.insert( extension );
+}
+
+//------------------------------------------------------------------------------
+
+bool Bundle::hasExtension(const std::string & identifier) const
+{
+    ExtensionContainer::const_iterator extpt = m_extensions.begin();
+    while( extpt != m_extensions.end() )
+    {
+        if( (*extpt)->getIdentifier() ==  identifier )
+        {
+            return true;
+        }
+        ++extpt;
+    }
+
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::setEnableExtension(const std::string & identifier, const bool enable)
+{
+    for( ExtensionContainer::iterator extpt = m_extensions.begin();
+            extpt != m_extensions.end();
+            ++extpt )
+    {
+
+        if( (*extpt)->getIdentifier() ==  identifier )
+        {
+            (*extpt)->setEnable(enable);
+            break; // The identifier is unique => can break the loop
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExtensionConstIterator Bundle::extensionsBegin() const
+{
+    return m_extensions.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExtensionConstIterator Bundle::extensionsEnd() const
+{
+    return m_extensions.end();
+}
+//------------------------------------------------------------------------------
+
+void Bundle::addExtensionPoint( SPTR( ExtensionPoint ) extensionPoint )
+{
+    m_extensionPoints.insert( extensionPoint );
+}
+
+//------------------------------------------------------------------------------
+
+SPTR( ExtensionPoint ) Bundle::findExtensionPoint( const std::string & identifier ) const
+{
+    ExtensionPointContainer::const_iterator found;
+
+    found = std::find_if( m_extensionPoints.begin(), m_extensionPoints.end(), IsEnableAndHasIdentifier<ExtensionPoint>(identifier) );
+    return (found != m_extensionPoints.end()) ? (*found) : SPTR(ExtensionPoint)();
+}
+
+//------------------------------------------------------------------------------
+
+bool Bundle::hasExtensionPoint(const std::string & identifier) const
+{
+    ExtensionPointContainer::const_iterator extpt = m_extensionPoints.begin();
+    while( extpt != m_extensionPoints.end() )
+    {
+        if( (*extpt)->getIdentifier() ==  identifier )
+        {
+            return true;
+        }
+        ++extpt;
+    }
+
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::setEnableExtensionPoint(const std::string & identifier, const bool enable)
+{
+    for( ExtensionPointContainer::iterator extpt = m_extensionPoints.begin();
+         extpt != m_extensionPoints.end();
+         ++extpt )
+    {
+
+        if( (*extpt)->getIdentifier() ==  identifier )
+        {
+            (*extpt)->setEnable(enable);
+            break; // The identifier is unique => can break the loop
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExtensionPointConstIterator Bundle::extensionPointsBegin() const
+{
+    return m_extensionPoints.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::ExtensionPointConstIterator Bundle::extensionPointsEnd() const
+{
+    return m_extensionPoints.end();
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::addLibrary( SPTR( dl::Library ) library )
+{
+    library->setBundle(this);
+    m_libraries.insert(library);
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::LibraryConstIterator Bundle::librariesBegin() const
+{
+    return m_libraries.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Bundle::LibraryConstIterator Bundle::librariesEnd() const
+{
+    return m_libraries.end();
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::addRequirement(const std::string & requirement)
+{
+    m_requirements.insert(requirement);
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Bundle::getClass() const
+{
+    return m_class;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string & Bundle::getIdentifier() const
+{
+    return m_identifier;
+}
+
+//------------------------------------------------------------------------------
+
+const boost::filesystem::path & Bundle::getLocation() const
+{
+    return m_location;
+}
+
+//------------------------------------------------------------------------------
+
+SPTR( IPlugin ) Bundle::getPlugin() const
+{
+    return m_plugin;
+}
+
+//------------------------------------------------------------------------------
+
+const Version & Bundle::getVersion() const
+{
+    return m_version;
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::loadLibraries() throw(RuntimeException)
+{
+    // Ensure the bundle is enabled.
+    if( m_enable == false )
+    {
+        throw RuntimeException( m_identifier + ": bundle is not enabled." );
+    }
+
+    // Pre-condition
+    SLM_ASSERT("Bundle is already loaded", m_loadingBundle == 0 );
+
+    OSLM_TRACE( "Loading " << this->getIdentifier() << " library...");
+
+    // References the current bundle as the loading bundle.
+    m_loadingBundle = shared_from_this();
+
+    // Loads all libraries.
+    LibraryContainer::iterator curEntry;
+    LibraryContainer::iterator endEntry = m_libraries.end();
+    for(curEntry = m_libraries.begin(); curEntry != endEntry; ++curEntry)
+    {
+        SPTR(dl::Library) library(*curEntry);
+        if(library->isLoaded() == false)
+        {
+            try
+            {
+                library->load();
+            }
+            catch( std::exception & e )
+            {
+                std::string message;
+
+                message += "Unable to load module ";
+                message += library->getPath().string();
+                message += ". ";
+                message += e.what();
+
+                SLM_ERROR(message);
+                m_loadingBundle.reset();
+
+                throw RuntimeException( message );
+            }
+        }
+    }
+
+    // Unreferences the current bundle from the loading bundle.
+    m_loadingBundle.reset();
+
+    // Post-condition
+    assert( m_loadingBundle == 0 );
+
+    OSLM_TRACE(this->getIdentifier() << " library loaded");
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::loadRequirements() throw(RuntimeException)
+{
+    try
+    {
+        Runtime *rntm(Runtime::getDefault());
+        RequirementContainer::const_iterator iter;
+        for(iter = m_requirements.begin(); iter != m_requirements.end(); ++iter)
+        {
+            const std::string requirement ( *iter);
+            SPTR( Bundle ) bundle( rntm->findBundle(requirement) );
+
+            // Ensure that a bundle has been retrieved.
+            if( bundle == 0 )
+            {
+                throw RuntimeException( requirement + ": required bundle not found or not enable." );
+            }
+            // Starts the bundle (loads its libraries and requirements bundle).
+            if ( !bundle->isStarted() )
+            {
+                bundle->start();
+            }
+        }
+    }
+    catch( const std::exception & e )
+    {
+        std::string message;
+
+        message += "Bundle " + getIdentifier() + " was not able to load requirements. ";
+        message += e.what();
+        throw RuntimeException( message );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::start() throw(RuntimeException)
+{
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " already started.", !m_started );
+    if( m_enable == false )
+    {
+        throw RuntimeException( m_identifier + ": bundle is not enabled." );
+    }
+
+    if( m_plugin == 0 )
+    {
+        loadRequirements();
+        loadLibraries();
+        try
+        {
+            startPlugin();
+            OSLM_TRACE(this->getIdentifier() << " Started");
+        }
+        catch( std::exception & e )
+        {
+            throw RuntimeException( m_identifier + ": start plugin error (after load requirement) :" + e.what() );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::startPlugin() throw(RuntimeException)
+{
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " plugin is already started.", !m_started );
+    // Retrieves the type of the plugin.
+    const std::string   pluginType( getClass() );
+
+    // According to the presence of a class or not, build and empty
+    // plugin or attempt to instantiate a user defined plugin.
+    SPTR( IPlugin ) plugin;
+
+    if( pluginType.empty() )
+    {
+        plugin = SPTR( IPlugin )( new EmptyPlugin() );
+    }
+    else
+    {
+        Runtime * rntm  ( Runtime::getDefault() );
+        SPTR( IExecutable ) executable ( rntm->createExecutableInstance(pluginType) );
+
+        plugin = ::boost::dynamic_pointer_cast< IPlugin >( executable );
+    }
+
+    // Ensures that a plugin has been created.
+    if( plugin == 0 )
+    {
+        throw RuntimeException( getIdentifier() + ": unable to create a plugin instance." );
+    }
+
+    OSLM_TRACE("Starting " << this->getIdentifier() << " Bundle's plugin.");
+    // Stores and start the plugin.
+    try
+    {
+        OSLM_TRACE("Register stopper for " << this->getIdentifier() << " Bundle's plugin.");
+        ::fwRuntime::profile::getCurrentProfile()->add( SPTR(profile::Stopper) (new profile::Stopper(this->getIdentifier())));
+        m_plugin = plugin;
+        m_plugin->start();
+        ::fwRuntime::profile::getCurrentProfile()->add( SPTR(profile::Initializer) (new profile::Initializer(this->getIdentifier())) );
+        m_started = true;
+    }
+    catch( std::exception & e )
+    {
+        throw RuntimeException( getIdentifier() + ": start plugin error : " + e.what() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::stop() throw(RuntimeException)
+{
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " not started.", m_started );
+    OSLM_ASSERT(this->getIdentifier() << " : m_plugin not an intance.", m_plugin != 0 );
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " not uninitialized.", !m_initialized );
+
+    OSLM_TRACE("Stopping " << this->getIdentifier() << "Bundle's plugin.");
+    try
+    {
+        m_plugin->stop();
+        m_started = false;
+        OSLM_TRACE(this->getIdentifier() << " Stopped");
+    }
+    catch( std::exception & e )
+    {
+        throw RuntimeException( this->getIdentifier() + ": stop plugin error : " + e.what() );
+    }
+
+    ::fwRuntime::Runtime::getDefault()->unregisterBundle(this->shared_from_this());
+
+    //Unloads all libraries.
+//    LibraryContainer::iterator curEntry;
+//    LibraryContainer::iterator endEntry = m_libraries.end();
+//    for(curEntry = m_libraries.begin(); curEntry != endEntry; ++curEntry)
+//    {
+//        ::boost::shared_ptr<dl::Library> library(*curEntry);
+//        if(library->isLoaded() == true )
+//        {
+//            library->unload();
+//        }
+//    }
+}
+
+//------------------------------------------------------------------------------
+void Bundle::initialize() throw(RuntimeException)
+{
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " not started.", m_started );
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " already initialized.", !m_initialized );
+    try
+    {
+        m_initialized = true;
+        OSLM_TRACE("Initializing " << this->getIdentifier() << " ...");
+        m_plugin->initialize();
+        OSLM_TRACE("             " <<this->getIdentifier() << " Initialized");
+    }
+    catch( std::exception & e )
+    {
+        throw RuntimeException( this->getIdentifier() + ": initialize plugin error : " + e.what() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::uninitialize() throw(RuntimeException)
+{
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " has not been started.", m_plugin );
+    OSLM_ASSERT("Bundle "<< this->getIdentifier() << " not initialized.", m_initialized );
+    try
+    {
+        OSLM_TRACE("Uninitializing " << this->getIdentifier() << " ...");
+        m_plugin->uninitialize();
+        m_initialized = false;
+        OSLM_TRACE("               " << this->getIdentifier() << " Uninitialized");
+    }
+    catch( std::exception & e )
+    {
+        throw RuntimeException( this->getIdentifier() + ": initialize plugin error : " + e.what() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool Bundle::isEnable() const
+{
+    return m_enable;
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::setEnable( const bool state )
+{
+    m_enable = state;
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::addParameter( const std::string & identifier, const std::string & value )
+{
+    m_parameters[identifier] = value;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Bundle::getParameterValue( const std::string & identifier ) const
+{
+    ParameterContainer::const_iterator  found = m_parameters.find(identifier);
+
+    return (found != m_parameters.end()) ? found->second : std::string();
+}
+
+//------------------------------------------------------------------------------
+
+bool Bundle::hasParameter( const std::string & identifier ) const
+{
+    return (m_parameters.find(identifier) != m_parameters.end());
+}
+
+//------------------------------------------------------------------------------
+
+void Bundle::operator= ( const Bundle & )
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/BundleElement.cpp b/SrcLib/core/fwRuntime/src/BundleElement.cpp
new file mode 100644
index 0000000..af4cd15
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/BundleElement.cpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/BundleElement.hpp"
+
+#include <cassert>
+
+#include "fwRuntime/Bundle.hpp"
+
+
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+BundleElement::BundleElement()
+:   m_bundle( Bundle::getLoadingBundle() ), m_enable(true)
+{
+    // Post-condition
+
+    SLM_ASSERT("bundle '" << m_bundle->getIdentifier() << "' not initialized", m_bundle != 0 );
+}
+
+//------------------------------------------------------------------------------
+
+BundleElement::BundleElement( ::boost::shared_ptr< Bundle > bundle )
+:   m_bundle( bundle ), m_enable(true)
+{
+    // Post-condition
+    SLM_ASSERT("bundle '" << m_bundle->getIdentifier() << "' not initialized", m_bundle != 0 );
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> BundleElement::getBundle() const
+{
+    return m_bundle;
+}
+
+//------------------------------------------------------------------------------
+
+bool BundleElement::isEnable() const
+{
+    // Pre-condition.
+    SLM_ASSERT("bundle '" << m_bundle->getIdentifier() << "' not initialized", m_bundle != 0 );
+    return m_bundle->isEnable() && m_enable;
+}
+
+//------------------------------------------------------------------------------
+
+void BundleElement::setEnable(const bool enable)
+{
+    m_enable = enable;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/ConfigurationElement.cpp b/SrcLib/core/fwRuntime/src/ConfigurationElement.cpp
new file mode 100644
index 0000000..7d0cd9d
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/ConfigurationElement.cpp
@@ -0,0 +1,174 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/ConfigurationElement.hpp"
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/IExecutable.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+
+namespace fwRuntime
+{
+
+std::ostream & operator<<(std::ostream & _sstream, ConfigurationElement& _configurationElement)
+{
+    _sstream << "Configuration element " << _configurationElement.getName() << " value = " << _configurationElement.getValue() << std::endl;
+    for(ConfigurationElement::AttributeContainer::iterator iter = _configurationElement.m_attributes.begin() ; iter != _configurationElement.m_attributes.end() ; ++iter )
+    {
+        _sstream << "Id = " << iter->first << " with value " << iter->second << std::endl;
+    }
+    _sstream << "Subelement : " << std::endl;
+    for(ConfigurationElementContainer::Container::iterator iter = _configurationElement.begin() ; iter != _configurationElement.end() ; ++iter )
+    {
+
+        _sstream << std::endl << *(*iter) << std::endl;
+    }
+
+    return _sstream ;
+}
+
+//------------------------------------------------------------------------------
+
+ConfigurationElement::ConfigurationElement( const ::boost::shared_ptr< Bundle > bundle, const std::string & name )
+:   m_bundle( bundle    ),
+    m_name  ( name      ),
+    m_value ( std::string("") )
+{}
+
+//------------------------------------------------------------------------------
+
+const ::boost::shared_ptr<Bundle> ConfigurationElement::getBundle() const throw()
+{
+    return m_bundle;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string ConfigurationElement::getAttributeValue(const std::string& name) const throw()
+{
+    AttributeContainer::const_iterator foundPos = m_attributes.find(name);
+    return foundPos == m_attributes.end() ? std::string() : foundPos->second;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string ConfigurationElement::getExistingAttributeValue(const std::string& name) const throw(NoSuchAttribute)
+{
+    AttributeContainer::const_iterator foundPos = m_attributes.find(name);
+    if(foundPos == m_attributes.end())
+    {
+         FW_RAISE_EXCEPTION(NoSuchAttribute(name));
+    }
+    return foundPos->second;
+}
+
+//------------------------------------------------------------------------------
+
+const ConfigurationElement::AttributePair ConfigurationElement::getSafeAttributeValue(const std::string& name) const throw()
+{
+    AttributeContainer::const_iterator foundPos = m_attributes.find(name);
+    if(foundPos == m_attributes.end())
+    {
+        return AttributePair(false, std::string());
+    }
+    else
+    {
+        return AttributePair(true, foundPos->second);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+const std::string ConfigurationElement::getName() const throw()
+{
+    return m_name;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string ConfigurationElement::getValue() const throw()
+{
+    return m_value;
+}
+
+//------------------------------------------------------------------------------
+
+bool ConfigurationElement::hasAttribute(const std::string& name) const throw()
+{
+    AttributeContainer::const_iterator foundPos = m_attributes.find(name);
+    return foundPos != m_attributes.end();
+}
+
+//------------------------------------------------------------------------------
+
+const std::map<std::string, std::string> ConfigurationElement::getAttributes() const throw()
+{
+    return m_attributes;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigurationElement::setAttributeValue(const std::string& name, const std::string& value) throw()
+{
+    m_attributes[name] = value;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigurationElement::setValue(const std::string& value) throw()
+{
+    m_value = value;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigurationElement::operator=(const ConfigurationElement&) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+std::vector < ConfigurationElement::sptr > ConfigurationElement::find(
+            std::string name,
+            std::string attribute,
+            std::string attributeValue,
+            int depth
+            )
+{
+    typedef std::vector < ConfigurationElement::sptr > ConfVector;
+    ConfVector result;
+
+    bool nameOk = (name.empty() || this->getName() == name);
+    bool attributeOk = (attribute.empty() || this->hasAttribute(attribute));
+    bool attributeValueOk = (attributeValue.empty() || (this->hasAttribute(attribute) && this->getAttributeValue(attribute) == attributeValue));
+    if (nameOk && attributeOk && attributeValueOk)
+    {
+        result.push_back(this->shared_from_this());
+    }
+
+    if (depth != 0)
+    {
+        ConfigurationElement::Iterator iter;
+        for (iter = this->begin(); iter != this->end(); ++iter)
+        {
+            ConfVector deepConf;
+            deepConf = (*iter)->find(name, attribute, attributeValue, depth-1);
+            result.insert(result.end(), deepConf.begin(), deepConf.end());
+        }
+    }
+
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+ConfigurationElement::~ConfigurationElement() {}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/ConfigurationElementContainer.cpp b/SrcLib/core/fwRuntime/src/ConfigurationElementContainer.cpp
new file mode 100644
index 0000000..2d87c57
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/ConfigurationElementContainer.cpp
@@ -0,0 +1,116 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/ConfigurationElementContainer.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace
+{
+
+    /**
+     * @brief   Implements a STL compliant predicate that test if a configuration
+     *          element has the given name.
+     *
+     * 
+     */
+    struct HasName
+    {
+        HasName( const std::string & name )
+        :   m_name( name )
+        {}
+
+        bool operator() ( ConfigurationElement::csptr element ) const
+        {
+            return element->getName() == m_name;
+        }
+
+    private:
+
+        std::string m_name;
+    };
+
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigurationElementContainer::addConfigurationElement( ConfigurationElement::sptr element )
+{
+    m_elements.push_back( element );
+}
+
+//------------------------------------------------------------------------------
+
+ConfigurationElementContainer::Iterator ConfigurationElementContainer::begin()
+{
+    return m_elements.begin();
+}
+
+//------------------------------------------------------------------------------
+
+ConfigurationElementContainer::Iterator ConfigurationElementContainer::end()
+{
+    return m_elements.end();
+}
+
+//------------------------------------------------------------------------------
+
+const ConfigurationElementContainer::Container & ConfigurationElementContainer::getElements() const
+{
+    return m_elements;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ConfigurationElementContainer::hasConfigurationElement( const std::string & name ) const
+{
+    Container::const_iterator found = std::find_if( m_elements.begin(), m_elements.end(), HasName(name) );
+    return found != m_elements.end();
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::shared_ptr<ConfigurationElement> ConfigurationElementContainer::findConfigurationElement( const std::string & name ) const
+{
+    Container::const_iterator   found = std::find_if( m_elements.begin(), m_elements.end(), HasName(name) );
+
+    return ( found == m_elements.end() ) ? ::boost::shared_ptr< ConfigurationElement >() : *found;
+}
+
+//-----------------------------------------------------------------------------
+
+ConfigurationElementContainer ConfigurationElementContainer::findAllConfigurationElement( const std::string & _name ) const
+{
+    ConfigurationElementContainer container;
+
+    for(    Container::const_iterator itCfgElem = m_elements.begin();
+            itCfgElem != m_elements.end();
+            ++itCfgElem )
+    {
+        if ( (*itCfgElem)->getName() == _name )
+        {
+            container.addConfigurationElement( (*itCfgElem) );
+        }
+    }
+
+    return container;
+}
+
+//-----------------------------------------------------------------------------
+
+size_t ConfigurationElementContainer::size() const
+{
+    return m_elements.size();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Convert.cpp b/SrcLib/core/fwRuntime/src/Convert.cpp
new file mode 100644
index 0000000..363806b
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Convert.cpp
@@ -0,0 +1,313 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+
+#include <libxml/parser.h>
+
+#include <set>
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/io/BundleDescriptorReader.hpp"
+
+#include "fwRuntime/Convert.hpp"
+
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+Convert::Convert()
+{}
+
+//------------------------------------------------------------------------------
+
+Convert::~Convert()
+{}
+
+//------------------------------------------------------------------------------
+
+void Convert::fromConfigurationElementToXml( ::boost::shared_ptr< ::fwRuntime::ConfigurationElement > _cfgElement, xmlNodePtr _node)
+{
+    //NAME
+    xmlNodePtr pNode = xmlNewNode( NULL,  xmlCharStrdup( _cfgElement->getName().c_str() ) ) ;
+    xmlAddChild(_node, pNode ) ;
+
+
+    std::string nodeValue = _cfgElement->getValue();
+    if(!nodeValue.empty())
+    {
+        xmlNodeSetContent (pNode, reinterpret_cast<const xmlChar *>(nodeValue.c_str()));
+    }
+
+    std::map<std::string, std::string> attr_cfe = _cfgElement->getAttributes() ;
+
+
+    for ( std::map<std::string, std::string>::iterator iter_attr_cfe = attr_cfe.begin() ;
+        iter_attr_cfe!= attr_cfe.end();
+        ++iter_attr_cfe)
+    {
+        //ATTRIBUTES + VALUES
+        xmlSetProp(pNode , xmlCharStrdup((iter_attr_cfe->first).c_str()), xmlCharStrdup((iter_attr_cfe->second).c_str()) ) ;
+        if ((iter_attr_cfe->first) == std::string("class"))
+        {
+            xmlSetProp(pNode , xmlCharStrdup((iter_attr_cfe->first).c_str()), xmlCharStrdup((iter_attr_cfe->second).c_str()) ) ;
+        }
+    }
+
+    SLM_ASSERT( "ConfigurationElement should not have children("
+                << _cfgElement->size() <<") and a value ("
+                << nodeValue <<") at the same time.",
+                !(!nodeValue.empty() && _cfgElement->size())  );
+
+    for ( std::vector< ::fwRuntime::ConfigurationElement::sptr >::iterator iter_cfeC = _cfgElement->begin() ;
+    iter_cfeC != _cfgElement->end() ;
+    ++iter_cfeC )
+    {
+        fromConfigurationElementToXml( (*iter_cfeC), pNode) ;
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+xmlNodePtr Convert::runningBundlesToXml( )
+{
+    xmlNodePtr node_root = xmlNewNode( NULL,  xmlCharStrdup( "Bundles" ) ) ;
+    std::set< ::boost::shared_ptr< ::fwRuntime::Bundle > > ::iterator iter_bundles ;
+    ::fwRuntime::Runtime * tmp_runtime = ::fwRuntime::Runtime::getDefault() ;
+
+    xmlNodePtr activated_Node = xmlNewNode( NULL,  xmlCharStrdup( "Activated" ) ) ;
+    xmlAddChild(node_root, activated_Node ) ;
+
+    xmlNodePtr inactivated_Node = xmlNewNode( NULL,  xmlCharStrdup( "Inactivated" ) ) ;
+    xmlAddChild(node_root, inactivated_Node ) ;
+
+    bool enable_Value = false ; // the 'do while' loop stop if enable_Value==false.
+    do
+    {
+        enable_Value = !enable_Value ;
+        for (iter_bundles =  tmp_runtime->bundlesBegin() ;
+                iter_bundles != tmp_runtime->bundlesEnd() ;
+                ++iter_bundles)
+        {
+            //BUNDLE
+
+            xmlNodePtr bundleNode = xmlNewNode( NULL, xmlCharStrdup( (*iter_bundles)->getIdentifier().c_str() ) ) ;
+            if (enable_Value)
+            {
+                xmlAddChild(activated_Node, bundleNode ) ;
+            }
+            else
+            {
+                xmlAddChild(inactivated_Node, bundleNode ) ;
+            }
+
+            //EXTENSIONS POINTS
+            xmlNodePtr extensionPoint_activated_list_Node = xmlNewNode( NULL,  xmlCharStrdup( "Extensions_Points" ) ) ;
+            xmlAddChild(bundleNode, extensionPoint_activated_list_Node ) ;
+
+            for ( std::set< ::boost::shared_ptr< ::fwRuntime::ExtensionPoint > >::const_iterator iter_extensionPoints = (*iter_bundles)->extensionPointsBegin() ;
+                    iter_extensionPoints != (*iter_bundles)->extensionPointsEnd() ;
+                    ++iter_extensionPoints)
+            {
+                //EXTENSIONS POINTS
+                std::string str = "Identifier : "+(*iter_extensionPoints)->getIdentifier() ;
+                //-----DEBUG------
+                xmlNodePtr extensionPointsNode = xmlNewNode( NULL,  xmlCharStrdup( str.c_str() ) ) ;
+                //xmlNodePtr extensionPointsNode = xmlNewNode( NULL,  xmlCharStrdup( (str.substr(str.find_last_of("::")+1)).c_str() ) ) ;
+                //-----DEBUG------
+                if (((*iter_extensionPoints)->isEnable())==enable_Value)
+                {
+                    xmlAddChild(extensionPoint_activated_list_Node, extensionPointsNode ) ;
+                }
+
+                std::vector< ::fwRuntime::ConfigurationElement::sptr > AllConfigElement = ((*iter_extensionPoints)->getAllConfigurationElements());
+                for (std::vector< ::fwRuntime::ConfigurationElement::sptr >::const_iterator iter_config_elem = AllConfigElement.begin() ;
+                        iter_config_elem != AllConfigElement.end() ;
+                        ++iter_config_elem)
+                {
+                    //CONFIGURATIONS ELEMENTS
+                    Convert::fromConfigurationElementToXml( (*iter_config_elem), extensionPointsNode) ;
+                }
+            }//end extensionsPoints parsing
+
+            //Extensions
+            xmlNodePtr extension_activated_list_Node = xmlNewNode( NULL,  xmlCharStrdup( "Extensions" ) ) ;
+            xmlAddChild(bundleNode, extension_activated_list_Node ) ;
+
+            for ( std::set< ::boost::shared_ptr< ::fwRuntime::Extension > >::const_iterator iter_extension = (*iter_bundles)->extensionsBegin()  ;
+                    iter_extension != (*iter_bundles)->extensionsEnd() ;
+                    ++iter_extension)
+            {
+                if (((*iter_extension)->isEnable())==enable_Value)
+                {
+                    std::string str = (*iter_extension)->getPoint() ;
+                    xmlNodePtr extensionNode = xmlNewNode( NULL,  xmlCharStrdup( (str.c_str() ) ) ) ;
+
+                    // Adds node if not exist
+                    xmlNodePtr node ;
+                    bool found_node = false ;
+                    for ( node = extension_activated_list_Node->children ;
+                            node ;
+                            node = node->next)
+                    {
+                        if ( (node->type == XML_ELEMENT_NODE) && !(xmlStrcmp(node->name, xmlCharStrdup( (str.c_str() ) ) ) ) )
+                        {
+                            extensionNode = node ;
+                            found_node = true ;
+                            break ;
+                        }
+                    }
+
+                    if (!found_node)
+                    {
+                        xmlAddChild(extension_activated_list_Node, extensionNode ) ;
+                    }
+                    //end adds node
+
+                    for (std::vector< ::fwRuntime::ConfigurationElement::sptr >::iterator iter_cfe_extension = (*iter_extension)->begin() ;
+                            iter_cfe_extension != (*iter_extension)->end() ;
+                            ++iter_cfe_extension )
+                    {
+                        Convert::fromConfigurationElementToXml( (*iter_cfe_extension), extensionNode) ;
+                    }
+                }
+            }//end Extensions parsing
+
+            //cleaning : delete empty node (or if contain empty node)
+            // xmlKeepBlanksDefault(0)  don't work; only for  TEXT NODES
+            // xmlIsBlankNode too, work only for Text-Nodes
+            if (!(extensionPoint_activated_list_Node->children))
+            {
+                xmlUnlinkNode(extensionPoint_activated_list_Node) ;
+                xmlFreeNode(extensionPoint_activated_list_Node) ;
+            }
+
+            if (!(extension_activated_list_Node->children))
+            {
+                xmlUnlinkNode(extension_activated_list_Node) ;
+                xmlFreeNode(extension_activated_list_Node) ;
+            }
+
+            if (!(bundleNode->children))
+            {
+                xmlUnlinkNode(bundleNode) ;
+                xmlFreeNode(bundleNode) ;
+            }
+            //end cleaning
+        }//end bundles iterator
+    } while ( enable_Value ) ;
+
+    return node_root ;
+}//runningBundlesToXml
+
+//------------------------------------------------------------------------------
+
+xmlNodePtr Convert::toXml( ::fwRuntime::ConfigurationElement::sptr _cfgElement)
+{
+    xmlNodePtr tmp = xmlNewNode( NULL,  xmlCharStrdup( "Configurations_Elements" ) );
+    ::fwRuntime::Convert::fromConfigurationElementToXml( _cfgElement, tmp) ;
+    return tmp ;
+}
+
+
+std::string Convert::toXmlString( ::fwRuntime::ConfigurationElement::sptr _cfgElement)
+{
+    xmlNodePtr node = toXml( _cfgElement );
+    xmlBufferPtr buffer = xmlBufferCreate();
+    xmlNodeDump( buffer, node->doc, xmlFirstElementChild(node), 0, 1 );
+
+    std::string result = reinterpret_cast<const char*>(buffer->content);
+
+    xmlFreeNode( node );
+    xmlBufferFree( buffer );
+    return result;
+}
+
+
+::boost::property_tree::ptree Convert::toPropertyTree( ::fwRuntime::ConfigurationElement::sptr _cfgElement)
+{
+    ::boost::property_tree::ptree pt;
+    ::boost::property_tree::ptree ptAttr;
+
+    std::string propertyName = _cfgElement->getName();
+    std::string propertyValue = _cfgElement->getValue();
+
+    typedef std::map<std::string, std::string> AttributeMatType;
+
+    if(!propertyValue.empty())
+    {
+        pt.put(propertyName, propertyValue);
+    }
+
+    AttributeMatType attr = _cfgElement->getAttributes() ;
+
+    for ( AttributeMatType::iterator iter = attr.begin() ; iter!= attr.end(); ++iter)
+    {
+        ptAttr.put(iter->first,iter->second);
+    }
+
+    if(!ptAttr.empty())
+    {
+        pt.put_child(propertyName + ".<xmlattr>", ptAttr);
+    }
+
+    for ( ::fwRuntime::ConfigurationElementContainer::Iterator iterElement = _cfgElement->begin() ;
+          iterElement != _cfgElement->end() ;
+          ++iterElement )
+    {
+        std::string childName = (*iterElement)->getName();
+        ::boost::property_tree::ptree ptChild;
+
+        ptChild = toPropertyTree (*iterElement);
+
+        boost::optional< ::boost::property_tree::ptree & > child = ptChild.get_child_optional(childName) ;
+
+        if(child)
+        {
+            ptChild = *child;
+        }
+
+        pt.add_child( propertyName + "." + childName  , ptChild );
+    }
+    return pt;
+}
+
+::fwRuntime::ConfigurationElement::sptr Convert::fromPropertyTree( ::boost::property_tree::ptree pt )
+{
+    std::stringstream sstr;
+    ::boost::property_tree::write_xml(sstr, pt);
+
+    std::string xml = sstr.str();
+
+    xmlDocPtr doc = xmlParseMemory(xml.c_str(), xml.size());
+
+    if (doc == NULL)
+    {
+        return ::fwRuntime::ConfigurationElement::sptr();
+    }
+
+    xmlNodePtr root = xmlDocGetRootElement(doc);
+
+
+    ::fwRuntime::ConfigurationElement::sptr ce;
+    ce = ::fwRuntime::io::BundleDescriptorReader::processConfigurationElement(root, SPTR(Bundle)());
+
+
+    xmlFreeDoc(doc);
+
+    return ce;
+}
+
+//------------------------------------------------------------------------------
+
+
+}//namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/EConfigurationElement.cpp b/SrcLib/core/fwRuntime/src/EConfigurationElement.cpp
new file mode 100644
index 0000000..b740609
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/EConfigurationElement.cpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/EConfigurationElement.hpp"
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/IExecutable.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+
+
+namespace fwRuntime
+{
+
+EConfigurationElement::EConfigurationElement(const std::string& name) :
+::fwRuntime::ConfigurationElement( ::boost::shared_ptr< ::fwRuntime::Bundle >() , name )
+{}
+
+EConfigurationElement::~EConfigurationElement()
+{}
+
+EConfigurationElement::sptr EConfigurationElement::addConfigurationElement( const std::string& name )
+{
+    EConfigurationElement::sptr cfg = EConfigurationElement::New(name) ;
+    this->::fwRuntime::ConfigurationElement::addConfigurationElement( cfg );
+    return cfg ;
+}
+
+void EConfigurationElement::addConfigurationElement( EConfigurationElement::sptr element )
+{
+    this->::fwRuntime::ConfigurationElement::addConfigurationElement( element );
+}
+
+void EConfigurationElement::setAttributeValue(const std::string& name, const std::string& value) throw()
+{
+    this->::fwRuntime::ConfigurationElement::setAttributeValue( name , value ) ;
+}
+
+void EConfigurationElement::setValue(const std::string& value) throw()
+{
+    this->::fwRuntime::ConfigurationElement::setValue(value);
+}
+
+}
diff --git a/SrcLib/core/fwRuntime/src/EmptyPlugin.cpp b/SrcLib/core/fwRuntime/src/EmptyPlugin.cpp
new file mode 100644
index 0000000..3690a50
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/EmptyPlugin.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/EmptyPlugin.hpp"
+#include "fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp"
+
+
+namespace fwRuntime
+{
+
+
+void EmptyPlugin::start() throw(::fwRuntime::RuntimeException)
+{}
+
+
+void EmptyPlugin::stop() throw()
+{}
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Executable.cpp b/SrcLib/core/fwRuntime/src/Executable.cpp
new file mode 100644
index 0000000..35d1aa1
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Executable.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/Executable.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> Executable::getBundle() const throw()
+{
+    return m_bundle;
+}
+
+//------------------------------------------------------------------------------
+
+const ConfigurationElement::sptr Executable::getInitializationData() const throw()
+{
+    return m_initializationData;
+}
+
+//------------------------------------------------------------------------------
+
+void Executable::setBundle( ::boost::shared_ptr< Bundle > bundle )
+{
+    m_bundle = bundle;
+}
+
+//------------------------------------------------------------------------------
+
+void Executable::setInitializationData( const ConfigurationElement::sptr element ) throw()
+{
+    m_initializationData = element;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/ExecutableFactory.cpp b/SrcLib/core/fwRuntime/src/ExecutableFactory.cpp
new file mode 100644
index 0000000..5566edb
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/ExecutableFactory.cpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/ExecutableFactory.hpp"
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+ExecutableFactory::ExecutableFactory( const std::string & type )
+:   m_type( type )
+{}
+
+//------------------------------------------------------------------------------
+
+ExecutableFactory::~ExecutableFactory()
+{}
+
+//------------------------------------------------------------------------------
+
+const std::string ExecutableFactory::getType() const
+{
+    return m_type;
+}
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/ExecutableFactoryRegistrar.cpp b/SrcLib/core/fwRuntime/src/ExecutableFactoryRegistrar.cpp
new file mode 100644
index 0000000..c5bea59
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/ExecutableFactoryRegistrar.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/ExecutableFactoryRegistrar.hpp"
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/Runtime.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+
+ExecutableFactoryRegistrar::ExecutableFactoryRegistrar( ::boost::shared_ptr< ExecutableFactory > factory )
+{
+    // Pre-condition
+    SLM_ASSERT("No bundle bundle currently loaded", Bundle::getLoadingBundle() != 0 );
+
+    // Retrieves the bundle that is currently loading.
+    ::boost::shared_ptr< Bundle >  loadingBundle( Bundle::getLoadingBundle() );
+    Runtime* runtime( Runtime::getDefault() );
+
+    // Stores the factory into that bundle and the default runtime instance.
+    loadingBundle->addExecutableFactory( factory );
+    runtime->addExecutableFactory( factory );
+}
+
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Extension.cpp b/SrcLib/core/fwRuntime/src/Extension.cpp
new file mode 100644
index 0000000..4802e0f
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Extension.cpp
@@ -0,0 +1,126 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#if defined(__GNUC__)
+#pragma GCC visibility push(default)
+#endif
+#include <iostream>
+#include <sstream>
+#include <libxml/xmlstring.h>
+#if defined(__GNUC__)
+#pragma GCC visibility pop
+#endif
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/io/Validator.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/helper.hpp"
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+Extension::Extension( ::boost::shared_ptr< Bundle > bundle, const std::string & id, const std::string & point, xmlNodePtr xmlNode )
+: BundleElement ( bundle                    ),
+  m_id          ( id                        ),
+  m_point       ( point                     ),
+  m_xmlDoc      ( xmlNewDoc(BAD_CAST "1.0") ),
+  m_xmlNode     ( xmlCopyNode(xmlNode, 1)   ),
+  m_validity    ( UnknownValidity           )
+{
+    xmlDocSetRootElement(m_xmlDoc, m_xmlNode);
+}
+
+//------------------------------------------------------------------------------
+
+Extension::~Extension()
+{
+    xmlFreeDoc( m_xmlDoc );
+}
+
+//------------------------------------------------------------------------------
+
+const std::string& Extension::getIdentifier() const
+{
+    return m_id;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string& Extension::getPoint() const
+{
+    return m_point;
+}
+
+//------------------------------------------------------------------------------
+
+xmlNodePtr Extension::getXmlNode() const
+{
+    return m_xmlNode;
+}
+
+//------------------------------------------------------------------------------
+
+Extension::Validity Extension::getValidity() const
+{
+    return m_validity;
+}
+
+//------------------------------------------------------------------------------
+
+Extension::Validity Extension::validate()
+{
+    // Skips the validation if already done.
+    if( m_validity != UnknownValidity )
+    {
+        return m_validity;
+    }
+
+    // Retrieves the extension point.
+    Runtime * rntm( Runtime::getDefault() );
+     ::boost::shared_ptr< ExtensionPoint >  point( rntm->findExtensionPoint(m_point) );
+
+    // Checks that the point exists.
+    if( !point )
+    {
+        throw RuntimeException(m_point + " : invalid point reference.");
+    }
+
+    // Validates the extension.
+    ::boost::shared_ptr< io::Validator >   validator( point->getExtensionValidator() );
+    OSLM_ASSERT("Sorry, validator creation failed for point "<<point->getIdentifier(), validator );
+
+    // Check extension XML Node <extension id="xxx" implements="yyy" >...</extension>
+    validator->clearErrorLog();
+    if( validator->validate( m_xmlNode ) == true )
+    {
+        m_validity = Valid;
+    }
+    else
+    {
+        m_validity = Invalid;
+        const std::string   identifier = m_id.empty() ? "anonymous" : m_id;
+        OSLM_ERROR("In bundle " << getBundle()->getIdentifier() << ". " << identifier
+                << ": invalid extension XML element node does not respect schema. Verification error log is : "
+                << std::endl << validator->getErrorLog() );
+    }
+
+    return m_validity;
+}
+
+//------------------------------------------------------------------------------
+
+void Extension::operator=(const Extension&) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/ExtensionPoint.cpp b/SrcLib/core/fwRuntime/src/ExtensionPoint.cpp
new file mode 100644
index 0000000..0e002ce
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/ExtensionPoint.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/ExtensionPoint.hpp"
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/io/Validator.hpp"
+
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+ExtensionPoint::ExtensionPoint( const ::boost::shared_ptr< Bundle > bundle, const std::string & id, const ::boost::filesystem::path & schema )
+:   BundleElement   ( bundle ),
+    m_id            ( id ),
+    m_schema        ( schema )
+{}
+
+//------------------------------------------------------------------------------
+
+const std::string & ExtensionPoint::getIdentifier() const
+{
+    return m_id;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< io::Validator > ExtensionPoint::getExtensionValidator() const
+{
+    if( !m_schema.empty() && !m_validator )
+    {
+        try
+        {
+            const ::boost::filesystem::path schemaPath = getBundle()->getLocation() / m_schema;
+            OSLM_DEBUG( "Use this schema : " << schemaPath << " for this id : " << m_id );
+            m_validator = ::boost::shared_ptr< io::Validator >( new io::Validator(schemaPath) );
+        }
+        catch( const std::exception & e )
+        {
+            throw RuntimeException( "Error while creating a validator. " + std::string(e.what()) );
+        }
+    }
+    return m_validator;
+}
+
+//------------------------------------------------------------------------------
+
+void ExtensionPoint::operator=( const ExtensionPoint & ) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/IExecutable.cpp b/SrcLib/core/fwRuntime/src/IExecutable.cpp
new file mode 100644
index 0000000..dda7c17
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/IExecutable.cpp
@@ -0,0 +1,21 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/IExecutable.hpp"
+
+
+
+namespace fwRuntime
+{
+
+
+
+IExecutable::~IExecutable()
+{}
+
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/IPlugin.cpp b/SrcLib/core/fwRuntime/src/IPlugin.cpp
new file mode 100644
index 0000000..b69eecd
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/IPlugin.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwRuntime/IPlugin.hpp"
+
+
+namespace fwRuntime
+{
+
+
+
+IPlugin::~IPlugin()
+{}
+
+
+void IPlugin::initialize() throw(::fwRuntime::RuntimeException)
+{
+}
+
+void IPlugin::uninitialize() throw(::fwRuntime::RuntimeException)
+{
+}
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Plugin.cpp b/SrcLib/core/fwRuntime/src/Plugin.cpp
new file mode 100644
index 0000000..4aa14a3
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Plugin.cpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/Plugin.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> Plugin::getBundle() const throw()
+{
+    return m_bundle;
+}
+
+//------------------------------------------------------------------------------
+
+void Plugin::setInitializationData(const ConfigurationElement::sptr) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void Plugin::setBundle( ::boost::shared_ptr<Bundle> bundle) throw()
+{
+    m_bundle = bundle;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Runtime.cpp b/SrcLib/core/fwRuntime/src/Runtime.cpp
new file mode 100644
index 0000000..b385e3b
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Runtime.cpp
@@ -0,0 +1,332 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <cassert>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/bind.hpp>
+#include <boost/foreach.hpp>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/IExecutable.hpp"
+#include "fwRuntime/ExecutableFactory.hpp"
+#include "fwRuntime/IPlugin.hpp"
+#include "fwRuntime/predicates.hpp"
+#include "fwRuntime/io/BundleDescriptorReader.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace
+{
+/**
+ * @brief   Implements a STL compliant predicate that tests if a given
+ *          object has a given type and is enabled.
+ *
+ * @remark  Intended to be used on executable factories
+ */
+template< typename T >
+struct IsEnableAndHasType
+{
+    IsEnableAndHasType( const std::string & type )
+    :   m_type( type )
+    {}
+
+    bool operator() ( const ::boost::shared_ptr< T > p ) const
+    {
+        return p->getType() == m_type && p->isEnable();
+    }
+
+private:
+
+    std::string m_type;
+};
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Runtime> Runtime::m_instance;
+
+//------------------------------------------------------------------------------
+
+Runtime::Runtime()
+{}
+
+//------------------------------------------------------------------------------
+
+Runtime::~Runtime()
+{}
+
+//------------------------------------------------------------------------------
+
+void Runtime::addBundle( ::boost::shared_ptr< Bundle > bundle ) throw(RuntimeException)
+{
+    m_bundles.insert( bundle );
+    std::for_each( bundle->extensionsBegin(), bundle->extensionsEnd(), ::boost::bind(&Runtime::addExtension, this, _1));
+    std::for_each( bundle->extensionPointsBegin(), bundle->extensionPointsEnd(), ::boost::bind(&Runtime::addExtensionPoint, this, _1));
+    std::for_each( bundle->executableFactoriesBegin(), bundle->executableFactoriesEnd(), ::boost::bind(&Runtime::addExecutableFactory, this, _1));
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::unregisterBundle( ::boost::shared_ptr< Bundle > bundle )
+{
+    FwCoreNotUsedMacro(bundle);
+//    std::for_each( bundle->extensionsBegin(), bundle->extensionsEnd(), ::boost::bind(&Runtime::unregisterExtension, this, _1));
+//    std::for_each( bundle->extensionPointsBegin(), bundle->extensionPointsEnd(), ::boost::bind(&Runtime::unregisterExtensionPoint, this, _1));
+//    std::for_each( bundle->executableFactoriesBegin(), bundle->executableFactoriesEnd(), ::boost::bind(&Runtime::unregisterExecutableFactory, this, _1));
+//    m_bundles.erase( bundle );
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::addBundles( const ::boost::filesystem::path & repository ) throw(RuntimeException)
+{
+    try
+    {
+        using ::fwRuntime::io::BundleDescriptorReader;
+        const BundleDescriptorReader::BundleContainer bundles = BundleDescriptorReader::createBundles( repository );
+        std::for_each( bundles.begin(), bundles.end(), ::boost::bind(&Runtime::addBundle, this, _1) );
+    }
+    catch(const std::exception& exception)
+    {
+        throw RuntimeException( std::string("Error while adding bundles. ") + exception.what() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+Runtime::BundleIterator Runtime::bundlesBegin()
+{
+    return m_bundles.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Runtime::BundleIterator Runtime::bundlesEnd()
+{
+    return m_bundles.end();
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::addExecutableFactory( ::boost::shared_ptr< ExecutableFactory > factory ) throw(RuntimeException)
+{
+    // Ensures no registered factory has the same identifier.
+    const std::string   type( factory->getType() );
+    if( this->findExecutableFactory(type) != 0 )
+    {
+        throw RuntimeException(type + ": type already used by an executable factory.");
+    }
+    // Stores the executable factory.
+    m_executableFactories.insert( factory );
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::unregisterExecutableFactory( ::boost::shared_ptr< ExecutableFactory > factory )
+{
+    // Ensures no registered factory has the same identifier.
+    const std::string type( factory->getType() );
+    OSLM_WARN_IF("ExecutableFactory Type " << type << " not found.", this->findExecutableFactory(type) == 0 );
+    // Removes the executable factory.
+    m_executableFactories.erase(factory);
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ExecutableFactory > Runtime::findExecutableFactory( const std::string & type ) const
+{
+    ExecutableFactoryContainer::const_iterator  found;
+    found = std::find_if( m_executableFactories.begin(), m_executableFactories.end(), IsEnableAndHasType<ExecutableFactory>(type) );
+    return ( found == m_executableFactories.end() ) ? ::boost::shared_ptr< ExecutableFactory >() : *found;
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::addExtension( ::boost::shared_ptr<Extension> extension) throw(RuntimeException)
+{
+    // Asserts no registered extension has the same identifier.
+    const std::string identifier(extension->getIdentifier());
+    if( !identifier.empty() && this->findExtension(identifier) != 0 )
+    {
+        throw RuntimeException(identifier + ": identifier already used by a registered extension.");
+    }
+    // Stores the extension.
+    m_extensions.insert( extension );
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::unregisterExtension( ::boost::shared_ptr<Extension> extension)
+{
+    // Asserts no registered extension has the same identifier.
+    const std::string identifier(extension->getIdentifier());
+    OSLM_WARN_IF("Extension " << identifier << " not found.",
+            !identifier.empty() && this->findExtension(identifier) == 0 );
+    // Removes the extension.
+    m_extensions.erase( extension );
+}
+
+//------------------------------------------------------------------------------
+
+Runtime::ExtensionIterator Runtime::extensionsBegin()
+{
+    return m_extensions.begin();
+}
+
+//------------------------------------------------------------------------------
+
+Runtime::ExtensionIterator Runtime::extensionsEnd()
+{
+    return m_extensions.end();
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::addExtensionPoint( ::boost::shared_ptr<ExtensionPoint> point) throw(RuntimeException)
+{
+    // Asserts no registered extension point has the same identifier.
+    const std::string identifier(point->getIdentifier());
+    if( this->findExtensionPoint(identifier) != 0)
+    {
+        throw RuntimeException(identifier + ": identifier already used by a registered extension point.");
+    }
+    // Stores the extension.
+    m_extensionPoints.insert(point);
+}
+
+//------------------------------------------------------------------------------
+
+void Runtime::unregisterExtensionPoint( ::boost::shared_ptr<ExtensionPoint> point)
+{
+    // Asserts no registered extension point has the same identifier.
+    const std::string identifier(point->getIdentifier());
+    OSLM_WARN_IF("ExtensionPoint " << identifier << " not found.",
+            this->findExtensionPoint(identifier) == 0);
+    // Removes the extension.
+    m_extensionPoints.erase(point);
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< Bundle > Runtime::findBundle( const std::string & identifier, const Version & version ) const
+{
+    ::boost::shared_ptr<Bundle> resBundle;
+    BOOST_FOREACH(SPTR(Bundle) bundle, m_bundles)
+    {
+        if(bundle->getIdentifier() == identifier && bundle->getVersion() == version)
+        {
+            resBundle = bundle;
+            break;
+        }
+    }
+    return resBundle;
+}
+
+//------------------------------------------------------------------------------
+
+Runtime * Runtime::getDefault()
+{
+    if(m_instance.get() == 0)
+    {
+        m_instance = ::boost::shared_ptr<Runtime>(new Runtime());
+    }
+    return m_instance.get();
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Extension> Runtime::findExtension( const std::string & identifier ) const
+{
+    ExtensionContainer::const_iterator  found;
+    found = std::find_if( m_extensions.begin(), m_extensions.end(), IsEnableAndHasIdentifier<Extension>(identifier) );
+    return (found != m_extensions.end()) ? (*found) : ::boost::shared_ptr<Extension>();
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<ExtensionPoint> Runtime::findExtensionPoint( const std::string & identifier ) const
+{
+    ExtensionPointContainer::const_iterator found;
+    found = std::find_if( m_extensionPoints.begin(), m_extensionPoints.end(), IsEnableAndHasIdentifier<ExtensionPoint>(identifier) );
+    return (found != m_extensionPoints.end()) ? (*found) : ::boost::shared_ptr<ExtensionPoint>();
+}
+
+//------------------------------------------------------------------------------
+
+IExecutable * Runtime::createExecutableInstance( const std::string & type ) throw( RuntimeException )
+{
+    ::boost::shared_ptr< ExecutableFactory > factory;
+
+    // Retrieves the executable factory.
+    factory = this->findExecutableFactory( type );
+    if( factory == 0 )
+    {
+        throw RuntimeException( type + ": no executable factory found for that type." );
+    }
+
+    // Creates the executable instance
+    IExecutable* result( factory->createExecutable() );
+    result->setBundle( factory->getBundle() );
+
+    // Job's done.
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+IExecutable * Runtime::createExecutableInstance( const std::string & type, ConfigurationElement::sptr configurationElement ) throw( RuntimeException )
+{
+    ::boost::shared_ptr< ExecutableFactory > factory;
+
+    // Retrieves the executable factory.
+    factory = this->findExecutableFactory( type );
+
+    // If there is no factory has been found, it is possible that
+    // it has not been registered since the bundle of the given configuration element
+    // is not started.
+    // So we start that bundle and look for the executable factory one more type.
+    if( factory == 0)
+    {
+        configurationElement->getBundle()->start();
+        factory = this->findExecutableFactory( type );
+    }
+
+    // If we still have not found any executable factory, then notify the problem.
+    if( factory == 0 )
+    {
+        throw RuntimeException( type + ": no executable factory found for that type." );
+    }
+
+    // Creates the executable instance
+    IExecutable* result( 0 );
+    try
+    {
+        factory->getBundle()->start();
+        result = factory->createExecutable();
+
+        result->setBundle( factory->getBundle() );
+        result->setInitializationData( configurationElement );
+    }
+    catch( const std::exception & e )
+    {
+        std::string message( "Unable to create an executable instance. " );
+        throw RuntimeException( message + e.what() );
+    }
+    // Job's done.
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/RuntimeException.cpp b/SrcLib/core/fwRuntime/src/RuntimeException.cpp
new file mode 100644
index 0000000..a588cc1
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/RuntimeException.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/RuntimeException.hpp"
+
+
+namespace fwRuntime
+{
+
+
+RuntimeException::RuntimeException(const RuntimeException& exception) throw()
+: ::fwCore::Exception(std::string(exception.what()))
+{
+    SLM_WARN( this->what() );
+}
+
+
+RuntimeException::RuntimeException(const std::string& message) throw()
+: ::fwCore::Exception(message)
+{
+    SLM_WARN( this->what() );
+}
+
+
+RuntimeException::~RuntimeException() throw()
+{}
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/Version.cpp b/SrcLib/core/fwRuntime/src/Version.cpp
new file mode 100644
index 0000000..c54bbc3
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/Version.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#if defined(__GNUC__)
+#pragma GCC visibility push(default)
+#endif
+#include <limits.h>
+#include <boost/lexical_cast.hpp>
+#include <boost/regex.hpp>
+#include <sstream>
+#if defined(__GNUC__)
+#pragma GCC visibility pop
+#endif
+
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/Version.hpp"
+
+
+namespace fwRuntime
+{
+
+
+
+Version::Version()
+: m_major(-1), m_minor(-1), m_build(-1), m_defined(false)
+{}
+
+
+
+Version::Version(const std::string & version)
+: m_major(-1), m_minor(-1), m_build(-1), m_defined(false)
+{
+    if( version.empty() == false )
+    {
+        boost::regex    regex ("(\\d+)[-.](\\d+)(svn(\\d+)){0,1}");
+        boost::smatch   what;
+
+        if( boost::regex_match(version, what, regex) )
+        {
+            m_major = boost::lexical_cast<int>( what[1].str() );
+            m_minor = boost::lexical_cast<int>( what[2].str() );
+            m_build = (what.size() == 4) ? boost::lexical_cast<int>( what[3].str() ) : 0;
+            m_defined = true;
+        }
+        else
+        {
+            throw RuntimeException(version + " : invalid version.");
+        }
+    }
+}
+
+
+
+Version::Version(const int major, const int minor, const int build)
+: m_major(major), m_minor(minor), m_build(build), m_defined(true)
+{}
+
+
+
+const std::string Version::string() const
+{
+    std::ostringstream  os;
+    os << *this;
+    return os.str();
+}
+
+
+
+bool Version::operator==(const Version & version) const
+{
+    if( m_defined && version.m_defined )
+    {
+        return m_major == version.m_major && m_minor == version.m_minor;
+    }
+    else
+    {
+        return true;
+    }
+}
+
+
+
+std::ostream & operator<<(std::ostream & os, const Version & version)
+{
+    if(version.m_defined)
+    {
+        return os << version.m_major << "-" << version.m_minor << "svn" << version.m_build;
+    }
+    else
+        return os << "version-not-defined";
+}
+
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/Darwin.cpp b/SrcLib/core/fwRuntime/src/dl/Darwin.cpp
new file mode 100644
index 0000000..59cf97f
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/Darwin.cpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef __MACOSX__
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/dl/Darwin.hpp"
+#include "fwRuntime/dl/DarwinNameDecorator.hpp"
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+Darwin::Darwin( const boost::filesystem::path & modulePath ) throw()
+: Native                ( modulePath, ::boost::shared_ptr< INameDecorator >(new DarwinNameDecorator()) ),
+  m_handle      ( 0 )
+{}
+
+//------------------------------------------------------------------------------
+
+Darwin::~Darwin() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+bool Darwin::isLoaded() const throw()
+{
+    return m_handle != 0;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Darwin::getNativeFilePrefix() const throw()
+{
+    return std::string("lib");
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Darwin::getNativeFileSuffix() const throw()
+{
+    return std::string(".dylib");
+}
+
+//------------------------------------------------------------------------------
+
+void* Darwin::getSymbol(const std::string& name) const throw(RuntimeException)
+{
+    void* result = 0;
+    if(isLoaded() == true)
+    {
+        dlerror(); // Clear existing error
+        result = dlsym(m_handle, name.c_str());
+        if(result == 0) // Check for possible errors
+        {
+            std::string message(dlerror());
+            if(message.empty() == false)
+            {
+                throw RuntimeException("Symbol retrieval failed. " + message);
+            }
+        }
+    }
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+void Darwin::load() throw(RuntimeException)
+{
+    if(m_handle == 0)
+    {
+        // Opens the dynamic library.
+#if BOOST_FILESYSTEM_VERSION > 2
+        m_handle = dlopen(getFullPath(true).string().c_str(), RTLD_LAZY|RTLD_GLOBAL);
+#else
+        m_handle = dlopen(getFullPath(true).native_file_string().c_str(), RTLD_LAZY|RTLD_GLOBAL);
+#endif
+        if(m_handle == 0)
+        {
+            std::string message(dlerror());
+            throw RuntimeException("Module load failed. " + message);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Darwin::unload() throw(RuntimeException)
+{
+    if(m_handle != 0)
+    {
+        int result;
+        result = dlclose(m_handle);
+        if(result != 0)
+        {
+            std::string message(dlerror());
+            throw RuntimeException("Module unload failed. " + message);
+        }
+        m_handle = 0;
+    }
+}
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #ifdef __MACOSX__
+
diff --git a/SrcLib/core/fwRuntime/src/dl/DarwinNameDecoration.cpp b/SrcLib/core/fwRuntime/src/dl/DarwinNameDecoration.cpp
new file mode 100644
index 0000000..86d43c5
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/DarwinNameDecoration.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/dl/DarwinNameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+const std::string DarwinNameDecorator::getNativePrefix() const throw()
+{
+    return std::string("lib");
+}
+
+
+
+const std::string DarwinNameDecorator::getNativeExtension() const throw()
+{
+    return std::string("dylib");
+}
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/INameDecorator.cpp b/SrcLib/core/fwRuntime/src/dl/INameDecorator.cpp
new file mode 100644
index 0000000..fa35f8e
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/INameDecorator.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/dl/INameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+INameDecorator::~INameDecorator()
+{}
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/NameDecorator.cpp b/SrcLib/core/fwRuntime/src/dl/NameDecorator.cpp
new file mode 100644
index 0000000..d37387f
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/NameDecorator.cpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/dl/NameDecorator.hpp"
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+//------------------------------------------------------------------------------
+
+const std::string NameDecorator::getNativeName( const std::string & abstractName ) const throw()
+{
+    return getNativePrefix() + abstractName + ".*?" + getNativeSuffix() + "." + getNativeExtension();
+}
+
+//------------------------------------------------------------------------------
+
+const std::string NameDecorator::getNativePrefix() const throw()
+{
+    return std::string();
+}
+
+//------------------------------------------------------------------------------
+
+const std::string NameDecorator::getNativeSuffix() const throw()
+{
+#ifdef DEBUG
+    return std::string( "D" );
+#else
+    return std::string( "[^D]" );
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+const std::string NameDecorator::getNativeExtension() const throw()
+{
+    return std::string();
+}
+//------------------------------------------------------------------------------
+
+
+} // namespace dl
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/Native.cpp b/SrcLib/core/fwRuntime/src/dl/Native.cpp
new file mode 100644
index 0000000..511f7a5
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/Native.cpp
@@ -0,0 +1,133 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <cassert>
+#include <string>
+#include <limits.h>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/regex.hpp>
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/dl/INameDecorator.hpp"
+#include "fwRuntime/dl/Native.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+//------------------------------------------------------------------------------
+
+Native::Native( const ::boost::filesystem::path & modulePath, const ::boost::shared_ptr< INameDecorator > nameDecorator ) throw()
+:   m_modulePath        ( modulePath ),
+    m_nameDecorator ( nameDecorator ),
+    m_bundle            ( 0 )
+{}
+
+//------------------------------------------------------------------------------
+
+Native::~Native() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path Native::getFullPath( const bool _bMustBeFile ) const throw(RuntimeException)
+{
+    // Pre-condition
+    SLM_ASSERT("bundle not initialized", m_bundle != 0 );
+
+    ::boost::filesystem::path result = m_bundle->getLocation() / getPath();
+
+    // Test that the result path exists.
+    if(result.empty())
+    {
+        throw RuntimeException("Unable to find a native library for the bundle.");
+    }
+    if( ! ::boost::filesystem::exists(result) )
+    {
+#if BOOST_FILESYSTEM_VERSION > 2
+        throw RuntimeException("'" + result.string() + "': invalid native module file name.");
+#else
+        throw RuntimeException("'" + result.native_file_string() + "': invalid native module file name.");
+#endif
+    }
+    if(_bMustBeFile && ::boost::filesystem::is_directory(result) )
+    {
+#if BOOST_FILESYSTEM_VERSION > 2
+        throw RuntimeException("'" + result.string() + "': is a file. Perhaps dynamic librairie is missing.");
+#else
+        throw RuntimeException("'" + result.native_file_string() + "': is a file. Perhaps dynamic librairie is missing.");
+#endif
+    }
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path Native::getPath() const throw(RuntimeException)
+{
+    // Pre-condition
+    SLM_ASSERT("bundle not initialized", m_bundle != 0 );
+
+    ::boost::filesystem::path result;
+
+    const ::boost::filesystem::path fullModulePath( m_bundle->getLocation() / m_modulePath );
+#if BOOST_FILESYSTEM_VERSION > 2
+    const ::boost::regex nativeFileRegex( m_nameDecorator->getNativeName(fullModulePath.filename().string()) );
+#else
+    const ::boost::regex nativeFileRegex( m_nameDecorator->getNativeName(fullModulePath.leaf()) );
+#endif // BOOST_FILESYSTEM_VERSION > 2
+
+    // Walk through the module directory, seeking for a matching file.
+    ::boost::filesystem::directory_iterator curDirEntry(fullModulePath.parent_path());
+    ::boost::filesystem::directory_iterator endDirEntry;
+    for(; curDirEntry != endDirEntry; ++curDirEntry)
+    {
+        ::boost::filesystem::path curEntryPath( *curDirEntry );
+#if BOOST_FILESYSTEM_VERSION > 2
+        if( ::boost::regex_match( curEntryPath.filename().string(), nativeFileRegex ) )
+        {
+            result =  m_modulePath.parent_path() / curEntryPath.filename();
+            break;
+        }
+#else
+        if( ::boost::regex_match( curEntryPath.leaf(), nativeFileRegex ) )
+        {
+            result =  m_modulePath.parent_path() / curEntryPath.leaf();
+            break;
+        }
+#endif // BOOST_FILESYSTEM_VERSION > 2
+    }
+
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+void Native::setBundle( const Bundle * bundle ) throw()
+{
+    // Pre-condition
+    SLM_ASSERT("bundle already initialized", m_bundle == 0 );
+    m_bundle = bundle;
+    // Post-condition
+    SLM_ASSERT("bundle not correctly attached", m_bundle == bundle );
+}
+
+//------------------------------------------------------------------------------
+
+void Native::operator=(const Native&) throw()
+{}
+
+//------------------------------------------------------------------------------
+
+} // namespace dl
+
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/Posix.cpp b/SrcLib/core/fwRuntime/src/dl/Posix.cpp
new file mode 100644
index 0000000..48c0cb4
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/Posix.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef linux
+
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/dl/Posix.hpp"
+#include "fwRuntime/dl/PosixNameDecorator.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+Posix::Posix( const boost::filesystem::path & modulePath ) throw()
+: Native        ( modulePath, ::boost::shared_ptr< INameDecorator >(new PosixNameDecorator()) ),
+  m_handle  ( 0 )
+{}
+
+
+Posix::~Posix() throw()
+{}
+
+
+bool Posix::isLoaded() const throw()
+{
+    return m_handle != 0;
+}
+
+
+void * Posix::getSymbol( const std::string & name ) const throw(RuntimeException)
+{
+    void* result = 0;
+    if(isLoaded() == true)
+    {
+        dlerror(); /* Clear existing error */
+        result = dlsym(m_handle, name.c_str());
+        if(result == 0) /* Check for possible errors */
+        {
+            std::string message(dlerror());
+            if(message.empty() == false)
+            {
+                throw RuntimeException("Symbol retrieval failed. " + message);
+            }
+        }
+    }
+    return result;
+}
+
+
+void Posix::load() throw(RuntimeException)
+{
+    if(m_handle == 0)
+    {
+        // Opens the dynamic library.
+#if BOOST_FILESYSTEM_VERSION > 2
+        m_handle = dlopen(getFullPath(true).string().c_str(), RTLD_LAZY|RTLD_GLOBAL);
+#else
+        m_handle = dlopen(getFullPath(true).native_file_string().c_str(), RTLD_LAZY|RTLD_GLOBAL);
+#endif
+        if(m_handle == 0)
+        {
+            std::string message(dlerror());
+            throw RuntimeException("Module load failed. " + message);
+        }
+    }
+}
+
+
+void Posix::unload() throw(RuntimeException)
+{
+    if(m_handle != 0)
+    {
+        int result;
+        result = dlclose(m_handle);
+        if(result != 0)
+        {
+            std::string message(dlerror());
+            throw RuntimeException("Module unload failed. " + message);
+        }
+        m_handle = 0;
+    }
+}
+
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #ifdef linux
diff --git a/SrcLib/core/fwRuntime/src/dl/PosixNameDecorator.cpp b/SrcLib/core/fwRuntime/src/dl/PosixNameDecorator.cpp
new file mode 100644
index 0000000..7eea6a4
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/PosixNameDecorator.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/dl/PosixNameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+const std::string PosixNameDecorator::getNativePrefix() const throw()
+{
+    return std::string("lib");
+}
+
+
+
+const std::string PosixNameDecorator::getNativeExtension() const throw()
+{
+    return std::string("so");
+}
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/dl/Win32.cpp b/SrcLib/core/fwRuntime/src/dl/Win32.cpp
new file mode 100644
index 0000000..e4aa0fa
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/Win32.cpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef _WIN32
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/dl/Win32.hpp"
+#include "fwRuntime/dl/Win32NameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+//------------------------------------------------------------------------------
+
+Win32::Win32( const boost::filesystem::path & modulePath ) throw()
+: Native        ( modulePath, ::boost::shared_ptr< INameDecorator >(new Win32NameDecorator()) ),
+  m_handle  ( 0 )
+{}
+
+//------------------------------------------------------------------------------
+
+bool Win32::isLoaded() const throw()
+{
+    return m_handle != 0;
+}
+
+//------------------------------------------------------------------------------
+
+void * Win32::getSymbol( const std::string& name ) const throw(RuntimeException)
+{
+    FARPROC symbol;
+
+    symbol = GetProcAddress( m_handle, name.c_str() );
+    if(symbol == 0)
+    {
+        throw RuntimeException("'" + name + "': symbol retrieval failed.");
+    }
+    return symbol;
+}
+
+//------------------------------------------------------------------------------
+
+void Win32::load() throw(RuntimeException)
+{
+    if(m_handle == 0)
+    {
+        // Opens the dynamic library.
+#if BOOST_FILESYSTEM_VERSION > 2
+        std::string lib(getFullPath(true).string());
+#else
+        std::string lib(getFullPath(true).native_file_string());
+#endif
+        OSLM_TRACE("Opens the dynamic library " << lib);
+        m_handle = LoadLibrary( lib.c_str() );
+        if(m_handle == 0)
+        {
+            // Retrieves the last error message.
+            DWORD   lastError = GetLastError();
+            char    buffer[1024];
+            FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, lastError, 0, buffer, 1024, 0 );
+
+            // Builds the error message and throws the exception.
+            std::string message( buffer );
+            throw RuntimeException( message );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Win32::unload() throw(RuntimeException)
+{
+    if(m_handle != 0)
+    {
+        BOOL result;
+        result = FreeLibrary(m_handle);
+        if(!result)
+        {
+            throw RuntimeException("Module unload failed.");
+        }
+        m_handle = 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace dl
+
+} // namespace fwRuntime
+
+
+#endif // #ifdef _WIN32
diff --git a/SrcLib/core/fwRuntime/src/dl/Win32NameDecorator.cpp b/SrcLib/core/fwRuntime/src/dl/Win32NameDecorator.cpp
new file mode 100644
index 0000000..56c2390
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/dl/Win32NameDecorator.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/dl/Win32NameDecorator.hpp"
+
+
+
+namespace fwRuntime
+{
+
+namespace dl
+{
+
+
+
+const std::string Win32NameDecorator::getNativeExtension() const throw()
+{
+    return std::string("dll");
+}
+
+
+
+} // namespace dl
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/helper.cpp b/SrcLib/core/fwRuntime/src/helper.cpp
new file mode 100644
index 0000000..2842ac9
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/helper.cpp
@@ -0,0 +1,217 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/helper.hpp"
+#include "fwRuntime/Convert.hpp"
+
+namespace fwRuntime
+{
+
+//------------------------------------------------------------------------------
+
+std::pair< bool , std::string > validateConfigurationElement( ::boost::shared_ptr< ::fwRuntime::io::Validator > _validator , ::fwRuntime::ConfigurationElement::sptr _element )
+{
+    SLM_ASSERT("_validator not instanced", _validator);
+    SLM_ASSERT("_element not instanced", _element);
+
+    xmlNodePtr _elementNodePtr = xmlNewNode( NULL,  xmlCharStrdup( _element->getName().c_str() ) );
+    ::fwRuntime::ConfigurationElement2XML( _element , _elementNodePtr ) ;
+    xmlDocPtr xmlDoc    = xmlNewDoc(BAD_CAST "1.0") ;
+    xmlNodePtr xmlNode  = xmlCopyNode(_elementNodePtr, 1) ;
+    xmlDocSetRootElement(xmlDoc, xmlNode);
+
+    _validator->clearErrorLog();
+
+    std::pair< bool , std::string > validationResult;
+    if( !(_validator->validate( xmlNode ) == true) )
+    {
+        validationResult.first  = false ;
+        validationResult.second = _validator->getErrorLog() ;
+    }
+    else
+    {
+        validationResult.first  = true ;
+    }
+
+    xmlFreeDoc( xmlDoc );
+    return validationResult ;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigurationElement2XML(::fwRuntime::ConfigurationElement::sptr _cfgElement, xmlNodePtr pNode)
+{
+    //ATTRIBUTES + VALUES
+    std::map<std::string, std::string> attr = _cfgElement->getAttributes() ;
+    for ( std::map<std::string, std::string>::iterator iter_attr_cfe = attr.begin() ; iter_attr_cfe!= attr.end(); ++iter_attr_cfe)
+    {
+        xmlSetProp(pNode , xmlCharStrdup((iter_attr_cfe->first).c_str()), xmlCharStrdup((iter_attr_cfe->second).c_str()) ) ;
+    }
+    //ELEMENTS
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, _cfgElement->getElements())
+    {
+        xmlNodePtr child = xmlNewNode( NULL,  xmlCharStrdup( elt->getName().c_str() ) );
+
+        xmlAddChild(pNode, child) ;
+        // If configuration element is a XML_TEXT_NODE : WARNING : even whitespace (non XML_TEXT_NODE) have been considered as valid XML_TEXT_NODE by BundleDescriptorReader!!!!
+        if( !elt->getValue().empty() )
+        {
+            xmlNodeSetContent(child, xmlCharStrdup( elt->getValue().c_str() ));
+        }
+        // If configuration element is a XML_ELEMENT_NODE
+        else
+        {
+            ConfigurationElement2XML(elt, child);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+ConfigurationElement::sptr getCfgAsAnExtension( ConfigurationElement::sptr config , std::string extension_pt )
+{
+    ConfigurationElement::sptr resultConfig;
+    if( config->hasAttribute("config") )
+    {
+        std::string cfgContribution = config->getExistingAttributeValue("config") ;
+        std::vector< ConfigurationElement::sptr > cfgs = ::fwRuntime::getAllCfgForPoint( extension_pt  ) ;
+        OSLM_FATAL_IF( "No configuration contribution found for extension point " <<  extension_pt, cfgs.empty());
+
+        // Search for all matching contributions
+        std::vector< ConfigurationElement::sptr > matchingCfg ;
+        BOOST_FOREACH(ConfigurationElement::sptr elt, cfgs)
+        {
+            if( cfgContribution == elt->getExistingAttributeValue("id") )
+            {
+                matchingCfg.push_back( elt ) ;
+            }
+        }
+
+        // If no contribution found
+        OSLM_FATAL_IF( "No contribution matching the requested requirement (" << cfgContribution
+                << " for extension point " << extension_pt << " )", matchingCfg.empty());
+
+        // Normal case : only one matching contribution has been found: matchingCfg.size == 1
+        resultConfig =  *matchingCfg.begin();
+
+        // If several matching contributions
+        OSLM_WARN_IF("Several contribution identified by " << cfgContribution << "( for cfg extension point " << extension_pt << " )"
+                << " has been found : the first one is returned", (matchingCfg.size() > 1));
+    }
+    SLM_WARN_IF("Configuration has no config attribute",  !config->hasAttribute("config"));
+    return resultConfig ;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< ConfigurationElement::sptr > getAllCfgForPoint( std::string _extension_pt )
+{
+    using ::fwRuntime::ConfigurationElement;
+
+    typedef std::vector< ConfigurationElement::sptr > ElementContainer;
+    typedef std::back_insert_iterator< ElementContainer > Inserter;
+
+    ElementContainer    renderElements;
+    Inserter            renderInserter(renderElements);
+
+    ::fwRuntime::getAllConfigurationElementsForPoint(_extension_pt, renderInserter);
+    return renderElements ;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< std::string > getAllIdsForPoint( std::string _extension_pt  )
+{
+    std::vector<std::string > ids ;
+
+    using ::fwRuntime::ConfigurationElement;
+    typedef std::vector< ConfigurationElement::sptr > ElementContainer;
+    typedef std::back_insert_iterator< ElementContainer > Inserter;
+
+    // Collects all contributed actions
+    ElementContainer    elements;
+    Inserter            inserter(elements);
+    ::fwRuntime::getAllConfigurationElementsForPoint( _extension_pt , inserter);
+
+    // Creates all contributed action instances.
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, elements)
+    {
+        ids.push_back(elt->getAttributeValue("id")) ;
+    }
+    return ids ;
+}
+
+//------------------------------------------------------------------------------
+
+std::string getInfoForPoint( std::string _extension_pt  )
+{
+    std::string info = "";
+    if(::fwRuntime::findExtensionPoint( _extension_pt ) )
+    {
+        using ::fwRuntime::ConfigurationElement;
+        typedef std::vector< ConfigurationElement::sptr > ElementContainer;
+        typedef std::back_insert_iterator< ElementContainer > Inserter;
+
+        // Collects all contributed actions
+        ElementContainer    elements;
+        Inserter            inserter(elements);
+        ::fwRuntime::getAllConfigurationElementsForPoint( _extension_pt, inserter);
+
+        // Creates all contributed action instances.
+        BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, elements)
+        {
+            if( elt->getName() == "info" && elt->hasAttribute("text") )
+            {
+                info = elt->getAttributeValue("text");
+                break;
+            }
+        }
+    }
+    return info;
+}
+
+//------------------------------------------------------------------------------
+
+std::map< std::string , ConfigurationElement::sptr > getAllIdAndConfigurationElementsForPoint( std::string _extension_pt )
+{
+    std::map<std::string, ConfigurationElement::sptr > cfgElementMap ;
+
+    using ::fwRuntime::ConfigurationElement;
+    typedef std::vector< ConfigurationElement::sptr > ElementContainer;
+    typedef std::back_insert_iterator< ElementContainer > Inserter;
+
+    // Collects all contributed actions
+    ElementContainer    elements;
+    Inserter            inserter(elements);
+    ::fwRuntime::getAllConfigurationElementsForPoint( _extension_pt, inserter);
+
+    // Creates all contributed action instances.
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::sptr elt, elements)
+    {
+        cfgElementMap[elt->getAttributeValue("id")]= elt;
+    }
+    return cfgElementMap ;
+}
+
+//------------------------------------------------------------------------------
+
+std::vector< ::boost::shared_ptr< ::fwRuntime::Extension > > getAllExtensionsForPoint(std::string extension_pt)
+{
+    typedef std::vector< ::boost::shared_ptr< Extension > > ExtensionContainer;
+    typedef std::back_insert_iterator< ExtensionContainer > Inserter;
+
+    ExtensionContainer  extElements;
+    Inserter            extInserter(extElements);
+
+    ::fwRuntime::getAllExtensionsForPoint ( extension_pt , extInserter );
+    return extElements;
+}
+}
diff --git a/SrcLib/core/fwRuntime/src/io/BundleDescriptorReader.cpp b/SrcLib/core/fwRuntime/src/io/BundleDescriptorReader.cpp
new file mode 100644
index 0000000..761d9a7
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/io/BundleDescriptorReader.cpp
@@ -0,0 +1,559 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <libxml/parser.h>
+#include <libxml/xinclude.h>
+
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/dl/Library.hpp"
+#include "fwRuntime/io/BundleDescriptorReader.hpp"
+#include "fwRuntime/io/Validator.hpp"
+
+namespace fwRuntime
+{
+
+namespace io
+{
+
+std::string BundleDescriptorReader::CLASS("class");
+std::string BundleDescriptorReader::EXTENSION("extension");
+std::string BundleDescriptorReader::EXTENSION_POINT("extension-point");
+std::string BundleDescriptorReader::ID("id");
+std::string BundleDescriptorReader::IMPLEMENTS("implements");
+std::string BundleDescriptorReader::LIBRARY("library");
+std::string BundleDescriptorReader::NAME("name");
+std::string BundleDescriptorReader::PLUGIN("plugin");
+std::string BundleDescriptorReader::REQUIREMENT("requirement");
+std::string BundleDescriptorReader::SCHEMA("schema");
+std::string BundleDescriptorReader::VERSION("version");
+std::string BundleDescriptorReader::POINT("point");
+
+//------------------------------------------------------------------------------
+
+const BundleDescriptorReader::BundleContainer BundleDescriptorReader::createBundles(const ::boost::filesystem::path& location) throw(RuntimeException)
+{
+    // Normalizes the path.
+    ::boost::filesystem::path normalizedPath(location);
+    normalizedPath.normalize();
+
+    // Asserts that the repository is a valid directory path.
+    if(::boost::filesystem::exists(normalizedPath) == false || ::boost::filesystem::is_directory(normalizedPath) == false)
+    {
+        throw RuntimeException("'" + normalizedPath.string() + "': not a directory.");
+    }
+
+    // Walk through the repository entries.
+    BundleContainer bundles;
+    ::boost::filesystem::directory_iterator   currentEntry(normalizedPath);
+    ::boost::filesystem::directory_iterator   endEntry;
+    for(; currentEntry != endEntry; ++currentEntry)
+    {
+        ::boost::filesystem::path entryPath = *currentEntry;
+
+        if(::boost::filesystem::is_directory(entryPath))
+        {
+            try
+            {
+                SPTR( ::fwRuntime::Bundle ) bundle = BundleDescriptorReader::createBundle(entryPath);
+                if(bundle)
+                {
+                    bundles.push_back( bundle );
+                }
+            }
+            catch(const RuntimeException& runtimeException)
+            {
+                OSLM_INFO( "'"<< entryPath.string() << "': skipped. " << runtimeException.what() );
+            }
+        }
+    }
+    return bundles;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> BundleDescriptorReader::createBundle(const ::boost::filesystem::path& location) throw(RuntimeException)
+{
+    ::boost::shared_ptr<Bundle> bundle;
+    // Get the descriptor location.
+    ::boost::filesystem::path completeLocation = location;
+
+    if(!completeLocation.is_complete())
+    {
+#ifdef SPECIALINSTALL
+	completeLocation = BUNDLEPATH / location;
+#else
+	completeLocation = ::boost::filesystem::current_path() / location;
+#endif
+        
+    }
+    ::boost::filesystem::path descriptorLocation(location / "plugin.xml");
+    if(::boost::filesystem::exists(descriptorLocation) == false)
+    {
+        throw RuntimeException("'plugin.xml': file not found.");
+    }
+
+    // Validation
+    std::ostringstream fileLocation;
+#ifdef SPECIALINSTALL
+	fileLocation << SHAREPATH << "fwRuntime_" <<  FWRUNTIME_VER << "/plugin.xsd";
+	const ::boost::filesystem::path pluginXSDLocation(fileLocation.str() );
+#else
+	fileLocation << "share/fwRuntime_" <<  FWRUNTIME_VER << "/plugin.xsd";
+	const ::boost::filesystem::path pluginXSDLocation(::boost::filesystem::current_path() / fileLocation.str() );
+#endif
+
+    Validator validator(pluginXSDLocation);
+    if( validator.validate(descriptorLocation) == false )
+    {
+        throw RuntimeException("Invalid bundle descriptor file. " + validator.getErrorLog());
+    }
+
+    // Get the document.
+#if BOOST_FILESYSTEM_VERSION > 2
+    xmlDocPtr document = xmlParseFile(  descriptorLocation.string().c_str() );
+#else
+    xmlDocPtr document = xmlParseFile(  descriptorLocation.native_file_string().c_str() );
+#endif
+    if(document == 0)
+    {
+        throw RuntimeException("Unable to read the bundle descriptor file.");
+    }
+
+
+    try
+    {
+        // Get the root node.
+        xmlNodePtr rootNode = xmlDocGetRootElement(document);
+
+        if (xmlXIncludeProcessTreeFlags (rootNode, XML_PARSE_NOBASEFIX) == -1)
+        {
+            throw RuntimeException("Unable to manage xinclude !");
+        }
+
+        if(xmlStrcmp(rootNode->name, (const xmlChar*) PLUGIN.c_str()) != 0)
+        {
+            throw RuntimeException("Unexpected XML element");
+        }
+
+        // Creates and process the plugin element.
+        bundle = processPlugin(rootNode, completeLocation);
+
+        // Job's done!
+        xmlFreeDoc(document);
+
+    }
+    catch(std::exception& exception)
+    {
+        xmlFreeDoc(document);
+        throw ;
+    }
+    return bundle;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> BundleDescriptorReader::createBundleFromXmlPlugin( const ::boost::filesystem::path & location ) throw ( RuntimeException )
+{
+    ::boost::shared_ptr<Bundle> bundle;
+    // Get the descriptor location.
+    ::boost::filesystem::path tmpCompleteLocation = location;
+    if(!tmpCompleteLocation.is_complete())
+    {
+#ifdef SPECIALINSTALL
+	tmpCompleteLocation = BUNDLEPATH / location;
+#else
+	tmpCompleteLocation = ::boost::filesystem::current_path() / location;
+#endif
+    }
+    tmpCompleteLocation.normalize();
+
+    const ::boost::filesystem::path completeLocation ( tmpCompleteLocation.parent_path() );
+
+    ::boost::filesystem::path descriptorLocation ( tmpCompleteLocation );
+    if( ::boost::filesystem::exists(descriptorLocation) == false )
+    {
+        throw RuntimeException("'plugin.xml': file not found.");
+    }
+
+    // Validation
+    std::ostringstream fileLocation;
+#ifdef SPECIALINSTALL
+	fileLocation << SHAREPATH << "fwRuntime_" <<  FWRUNTIME_VER << "/plugin.xsd";
+	const ::boost::filesystem::path pluginXSDLocation(fileLocation.str() );
+
+#else
+	fileLocation << "share/fwRuntime_" <<  FWRUNTIME_VER << "/plugin.xsd";
+	const ::boost::filesystem::path pluginXSDLocation(::boost::filesystem::current_path() / fileLocation.str() );
+
+#endif
+
+    Validator validator(pluginXSDLocation);
+    if( validator.validate(descriptorLocation) == false )
+    {
+        throw RuntimeException("Invalid bundle descriptor file. " + validator.getErrorLog());
+    }
+
+    // Get the document.
+#if BOOST_FILESYSTEM_VERSION > 2
+    xmlDocPtr document = xmlParseFile(  descriptorLocation.string().c_str() );
+#else
+    xmlDocPtr document = xmlParseFile(  descriptorLocation.native_file_string().c_str() );
+#endif
+    if(document == 0)
+    {
+        throw RuntimeException("Unable to read the bundle descriptor file.");
+    }
+
+    try
+    {
+        // Get the root node.
+        xmlNodePtr rootNode = xmlDocGetRootElement(document);
+        if (xmlXIncludeProcessTreeFlags (rootNode, XML_PARSE_NOBASEFIX) == -1)
+        {
+            throw RuntimeException("Unable to manage xinclude !");
+        }
+
+        if(xmlStrcmp(rootNode->name, (const xmlChar*) PLUGIN.c_str()) != 0)
+        {
+            throw RuntimeException("Unexpected XML element");
+        }
+
+        // Creates and process the plugin element.
+        bundle = processPlugin(rootNode, completeLocation);
+
+        // Job's done!
+        xmlFreeDoc(document);
+    }
+    catch(std::exception& exception)
+    {
+        xmlFreeDoc(document);
+        throw ;
+    }
+    return bundle;
+}
+
+//-----------------------------------------------------------------------------
+
+ConfigurationElement::sptr BundleDescriptorReader::processConfigurationElement(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException)
+{
+    //xmlKeepBlanksDefault(0);
+    // Creates the configuration element.
+    std::string name((const char*) node->name);
+    ConfigurationElement::sptr configurationElement(new ConfigurationElement(bundle, name));
+
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        std::string name((const char*) curAttr->name);
+        std::string value((const char*) curAttr->children->content);
+
+        configurationElement->setAttributeValue(name, value);
+    }
+
+    // Process child nodes.
+    xmlNodePtr curChild = node->children;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        if(curChild->type == XML_TEXT_NODE && !xmlIsBlankNode(curChild))
+        {
+            std::string value((const char*) curChild->content);
+            // Even whitespace (non XML_TEXT_NODE) are considered as valid XML_TEXT_NODE
+            OSLM_WARN_IF("Bundle : " << ( bundle ? bundle->getIdentifier() : "<None>" ) << ", node: " << name << ", blanks in xml nodes can result in unexpected behaviour. Consider using <![CDATA[ ... ]]>.",
+                    (value.find("\n")!=std::string::npos || value.find("\t")!=std::string::npos));
+
+            configurationElement->setValue( configurationElement->getValue() + value );
+            continue;
+        }
+        else if(curChild->type == XML_CDATA_SECTION_NODE )
+        {
+            std::string value((const char*) curChild->content);
+            configurationElement->setValue( configurationElement->getValue() + value );
+            continue;
+        }
+
+        else if(curChild->type == XML_ELEMENT_NODE)
+        {
+            ConfigurationElement::sptr element(processConfigurationElement(curChild, bundle));
+            configurationElement->addConfigurationElement(element);
+            continue;
+        }
+    }
+
+    // Job's done.
+    return configurationElement;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Extension> BundleDescriptorReader::processExtension(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException)
+{
+    // Processes all extension attributes.
+    xmlAttrPtr curAttr;
+    std::string point;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) IMPLEMENTS.c_str()) == 0)
+        {
+            point = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Creates the extension instance.
+    ::boost::shared_ptr<Extension> extension(new Extension(bundle, identifier, point, node));
+
+    // Processes child nodes which are configuration elements.
+    xmlNodePtr curChild;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        if(curChild->type == XML_ELEMENT_NODE)
+        {
+            ConfigurationElement::sptr element(processConfigurationElement(curChild, bundle));
+            extension->addConfigurationElement(element);
+        }
+    }
+
+    // Job's done.
+    return extension;
+}
+
+//------------------------------------------------------------------------------
+
+BundleDescriptorReader::PointExtensionsPairType BundleDescriptorReader::processPoint(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException)
+{
+    // Creates the extension instance.
+    xmlAttrPtr curAttr;
+    std::string schema;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) SCHEMA.c_str()) == 0)
+        {
+            schema = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+    ::boost::shared_ptr<ExtensionPoint> extensionPoint(new ExtensionPoint(bundle, identifier, schema));
+
+    // Processes child nodes which declare identifier as extensions.
+    std::vector< ::boost::shared_ptr<Extension> > extensionContainer ;
+    xmlNodePtr curChild;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        if(curChild->type == XML_ELEMENT_NODE)
+        {
+            if( xmlStrcmp(curChild->name, (const xmlChar*) IMPLEMENTS.c_str()) == 0 )
+            {
+                std::string extensionId =  (const char*) curChild->children->content ;
+                ::boost::shared_ptr<Extension> extension(new Extension(bundle, identifier , extensionId, curChild));
+                extensionContainer.push_back( extension ) ;
+            }
+        }
+    }
+
+    return PointExtensionsPairType( extensionPoint, extensionContainer ) ;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<ExtensionPoint> BundleDescriptorReader::processExtensionPoint(xmlNodePtr node, const ::boost::shared_ptr<Bundle> bundle) throw(RuntimeException)
+{
+    // Processes all extension attributes.
+    xmlAttrPtr  curAttr;
+    std::string identifier;
+    std::string schema;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) SCHEMA.c_str()) == 0)
+        {
+            schema = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+    // Creates the extension instance.
+    ::boost::shared_ptr<ExtensionPoint> point(new ExtensionPoint(bundle, identifier, schema));
+
+    // Job's done.
+    return point;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<dl::Library> BundleDescriptorReader::processLibrary(xmlNodePtr node) throw(RuntimeException)
+{
+    // Processes all plugin attributes.
+    xmlAttrPtr curAttr;
+    std::string name;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) NAME.c_str()) == 0)
+        {
+            name = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Creates the library
+    ::boost::shared_ptr<dl::Library> library( new dl::Library(name) );
+    return library;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr<Bundle> BundleDescriptorReader::processPlugin(xmlNodePtr node, const ::boost::filesystem::path& location) throw(RuntimeException)
+{
+    // Creates the bundle.
+    ::boost::shared_ptr<Bundle> bundle;
+    // Processes all plugin attributes.
+    xmlAttrPtr  curAttr;
+    std::string bundleIdentifier;
+    std::string version;
+    std::string pluginClass;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            bundleIdentifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) CLASS.c_str()) == 0)
+        {
+            pluginClass = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) VERSION.c_str()) == 0)
+        {
+            version = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+    SLM_ASSERT("bundle identifier is empty", !bundleIdentifier.empty());
+
+    if( ::fwRuntime::Runtime::getDefault()->findBundle(bundleIdentifier, Version(version)))
+    {
+        return bundle;
+    }
+    if(pluginClass.empty() == true)
+    {
+        bundle = ::boost::shared_ptr<Bundle>( new Bundle(location, bundleIdentifier, version) );
+    }
+    else
+    {
+        bundle = ::boost::shared_ptr<Bundle>( new Bundle(location, bundleIdentifier, version, pluginClass) );
+    }
+
+    // Processes all child nodes.
+    xmlNodePtr curChild;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        // Skip non element nodes.
+        if(curChild->type != XML_ELEMENT_NODE)
+        {
+            continue;
+        }
+
+        // Extension declaration.
+        if(xmlStrcmp(curChild->name, (const xmlChar*) EXTENSION.c_str()) == 0)
+        {
+            ::boost::shared_ptr<Extension> extension(processExtension(curChild, bundle));
+            bundle->addExtension(extension);
+            continue;
+        }
+
+        // Extension point declaration.
+        if(xmlStrcmp(curChild->name, (const xmlChar*) EXTENSION_POINT.c_str()) == 0)
+        {
+            ::boost::shared_ptr<ExtensionPoint> point(processExtensionPoint(curChild, bundle));
+            bundle->addExtensionPoint(point);
+            continue;
+        }
+
+        // Library declaration.
+        if(xmlStrcmp(curChild->name, (const xmlChar*) LIBRARY.c_str()) == 0)
+        {
+            ::boost::shared_ptr<dl::Library> library(processLibrary(curChild));
+            bundle->addLibrary(library);
+            continue;
+        }
+
+        // Requirement declaration.
+        if(xmlStrcmp(curChild->name, (const xmlChar*) REQUIREMENT.c_str()) == 0)
+        {
+            const std::string   requirement(processRequirement(curChild));
+            bundle->addRequirement(requirement);
+        }
+
+        // Point declaration.
+        if(xmlStrcmp(curChild->name, (const xmlChar*) POINT.c_str()) == 0)
+        {
+            SLM_FATAL("Sorry, this xml element  ( <point ... > </point> ) is depreciated (" + location.string() + ")" );
+        }
+    }
+
+    // Job's done.
+    return bundle;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string BundleDescriptorReader::processRequirement(xmlNodePtr node) throw(RuntimeException)
+{
+    // Processes all requirement attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Do some sanity checking.
+    if(identifier.length() == 0)
+    {
+        throw RuntimeException("Invalid attribute.");
+    }
+
+    // Job's done
+    return identifier;
+}
+
+//------------------------------------------------------------------------------
+
+} // namesapce io
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/io/ProfileReader.cpp b/SrcLib/core/fwRuntime/src/io/ProfileReader.cpp
new file mode 100644
index 0000000..c775dc3
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/io/ProfileReader.cpp
@@ -0,0 +1,292 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/io/ProfileReader.hpp"
+
+#include <string>
+#include <sstream>
+#include <boost/filesystem/operations.hpp>
+#include <libxml/parser.h>
+
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/io/Validator.hpp"
+#include "fwRuntime/profile/Activater.hpp"
+#include "fwRuntime/profile/Profile.hpp"
+#include "fwRuntime/profile/Starter.hpp"
+
+namespace fwRuntime
+{
+
+namespace io
+{
+
+std::string ProfileReader::ID                    ("id");
+std::string ProfileReader::NAME                  ("name");
+std::string ProfileReader::VALUE                 ("value");
+std::string ProfileReader::VERSION               ("version");
+std::string ProfileReader::CHECK_SINGLE_INSTANCE ("check-single-instance");
+std::string ProfileReader::ACTIVATE              ("activate");
+std::string ProfileReader::START                 ("start");
+std::string ProfileReader::PARAM                 ("param");
+std::string ProfileReader::DIS_EXT_PT            ("disable-extension-point");
+std::string ProfileReader::DIS_EXT               ("disable-extension");
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::profile::Profile > ProfileReader::createProfile( const boost::filesystem::path & path )
+{
+    // Normalizes the path.
+    boost::filesystem::path normalizedPath(path);
+    normalizedPath.normalize();
+
+
+    // Asserts that the repository is a valid directory path.
+    if(boost::filesystem::exists(normalizedPath) == false || boost::filesystem::is_directory(normalizedPath) == true)
+    {
+        throw RuntimeException("'" + normalizedPath.string() + "': not a a file.");
+    }
+
+    // Validation
+    std::ostringstream fileLocation;
+#ifdef SPECIALINSTALL
+	fileLocation << SHAREPATH << "fwRuntime_" <<  FWRUNTIME_VER << "/profile.xsd";
+	const ::boost::filesystem::path profileXSDLocation(fileLocation.str() );
+#else
+	fileLocation << "share/fwRuntime_" <<  FWRUNTIME_VER << "/profile.xsd";
+	const ::boost::filesystem::path profileXSDLocation(::boost::filesystem::current_path() / fileLocation.str() );
+#endif
+
+
+    Validator   validator(profileXSDLocation);
+
+    if( validator.validate(normalizedPath) == false )
+    {
+        throw RuntimeException(validator.getErrorLog());
+    }
+
+    // Get the document.
+#if BOOST_FILESYSTEM_VERSION > 2
+    xmlDocPtr document = xmlParseFile(normalizedPath.string().c_str());
+#else
+    xmlDocPtr document = xmlParseFile(normalizedPath.native_file_string().c_str());
+#endif
+    if(document == 0)
+    {
+        throw RuntimeException("Unable to read the profile file.");
+    }
+
+    try
+    {
+        // Get the root node.
+        xmlNodePtr rootNode = xmlDocGetRootElement(document);
+
+        char* pName    = (char *) xmlGetProp(rootNode, (const xmlChar*) NAME.c_str());
+        char* pVersion = (char *) xmlGetProp(rootNode, (const xmlChar*) VERSION.c_str());
+        char* pChkInst = (char *) xmlGetProp(rootNode, (const xmlChar*) CHECK_SINGLE_INSTANCE.c_str());
+
+        SLM_ASSERT("Application profile MUST have a name attribute"   , pName);
+        SLM_ASSERT("Application profile MUST have a version attribute", pVersion);
+
+        std::string sName( pName );
+        std::string sVersion( pVersion );
+        bool checkSingleInstance = pChkInst && std::string(pChkInst) == "true";
+
+        xmlFree(pName);
+        xmlFree(pVersion);
+        xmlFree(pChkInst);
+
+        // Creates and process the profile element.
+         ::boost::shared_ptr< ::fwRuntime::profile::Profile > profile = processProfile(rootNode);
+
+        profile->setFilePath(normalizedPath);
+        profile->setName(sName);
+        profile->setVersion(sVersion);
+        profile->setCheckSingleInstance(checkSingleInstance);
+
+        // Job's done!
+        xmlFreeDoc(document);
+        return profile;
+    }
+    catch(std::exception& exception)
+    {
+        xmlFreeDoc(document);
+        throw ;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::profile::Profile > ProfileReader::processProfile(xmlNodePtr node)
+{
+    using namespace ::fwRuntime::profile;
+
+
+    // Process child nodes.
+    ::boost::shared_ptr< Profile > profile( new Profile() );
+    xmlNodePtr              curChild = node->children;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        if(xmlStrcmp(curChild->name, (const xmlChar*) ACTIVATE.c_str()) == 0)
+        {
+            profile->add( processActivater(curChild) );
+            continue;
+        }
+
+        if(xmlStrcmp(curChild->name, (const xmlChar*) START.c_str()) == 0)
+        {
+            profile->add( processStarter(curChild) );
+            continue;
+        }
+    }
+    return profile;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::profile::Activater > ProfileReader::processActivater(xmlNodePtr node)
+{
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    std::string version;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) VERSION.c_str()) == 0)
+        {
+            version = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Creates the activater object.
+    using ::fwRuntime::profile::Activater;
+    ::boost::shared_ptr< Activater >   activater( new Activater(identifier, version) );
+
+    // Processes child node that are the parameters
+    xmlNodePtr  curChild = node->children;
+    for(curChild = node->children; curChild != 0; curChild = curChild->next)
+    {
+        if(xmlStrcmp(curChild->name, (const xmlChar*) PARAM.c_str()) == 0)
+        {
+            processActivaterParam( curChild, activater );
+            continue;
+        }
+
+        if(xmlStrcmp(curChild->name, (const xmlChar*) DIS_EXT_PT.c_str()) == 0)
+        {
+            processActivaterDisableExtensionPoint( curChild, activater );
+            continue;
+        }
+
+        if(xmlStrcmp(curChild->name, (const xmlChar*) DIS_EXT.c_str()) == 0)
+        {
+            processActivaterDisableExtension( curChild, activater );
+            continue;
+        }
+    }
+    // Job's done.
+    return activater;
+}
+
+//------------------------------------------------------------------------------
+
+void ProfileReader::processActivaterParam(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater)
+{
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    std::string value;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) VALUE.c_str()) == 0)
+        {
+            value = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+    // Stores the parameter into the activater.
+    activater->addParameter( identifier, value );
+}
+
+//------------------------------------------------------------------------------
+
+void ProfileReader::processActivaterDisableExtensionPoint(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater)
+{
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Stores the parameter into the activater.
+    activater->addDisableExtensionPoint( identifier );
+}
+
+//------------------------------------------------------------------------------
+
+void ProfileReader::processActivaterDisableExtension(xmlNodePtr node, ::boost::shared_ptr< ::fwRuntime::profile::Activater > activater)
+{
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Stores the parameter into the activater.
+    activater->addDisableExtension( identifier );
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::profile::Starter > ProfileReader::processStarter(xmlNodePtr node)
+{
+    // Processes all attributes.
+    xmlAttrPtr curAttr;
+    std::string identifier;
+    for(curAttr = node->properties; curAttr != 0; curAttr = curAttr->next)
+    {
+        if(xmlStrcmp(curAttr->name, (const xmlChar*) ID.c_str()) == 0)
+        {
+            identifier = (const char*) curAttr->children->content;
+            continue;
+        }
+    }
+
+    // Creates the activater object.
+    using ::fwRuntime::profile::Starter;
+    ::boost::shared_ptr< Starter > starter( new Starter(identifier) );
+    return starter;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace io
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/io/Validator.cpp b/SrcLib/core/fwRuntime/src/io/Validator.cpp
new file mode 100644
index 0000000..367fabc
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/io/Validator.cpp
@@ -0,0 +1,209 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+//#include <ios_base.h> not necessary on win32
+#include <boost/filesystem/operations.hpp>
+#include <libxml/xmlversion.h>
+#ifndef LIBXML_SCHEMAS_ENABLED
+    #warning "Error libxml schemas disabled"
+#endif
+#include <libxml/tree.h>
+#include <libxml/parser.h>
+#include <libxml/xinclude.h>
+#include <libxml/xmlschemas.h>
+#include <libxml/xmlschemastypes.h>
+
+#include "fwRuntime/RuntimeException.hpp"
+#include "fwRuntime/io/Validator.hpp"
+
+#include <fwCore/base.hpp>
+
+namespace fwRuntime
+{
+namespace io
+{
+
+//------------------------------------------------------------------------------
+
+Validator::Validator( const Validator &validator )
+{
+    m_xsd_content = validator.m_xsd_content;
+    m_schemaParserContext = validator.m_schemaParserContext;
+    m_schema = validator.m_schema;
+}
+
+//------------------------------------------------------------------------------
+
+Validator::Validator( const std::string & buffer )
+{
+    m_xsd_content = buffer ;
+}
+
+//------------------------------------------------------------------------------
+
+Validator::Validator( const boost::filesystem::path & path )
+{
+#if BOOST_FILESYSTEM_VERSION > 2
+    std::string strPath( path.string() );
+#else
+    std::string strPath( path.native_file_string() );
+#endif
+    // Checks the path validity.
+    if( ::boost::filesystem::exists(path) == false || ::boost::filesystem::is_directory(path) )
+    {
+        throw RuntimeException( strPath + ": is not a valid path to an xml schema file." );
+    }
+    m_xsd_content = strPath;
+}
+
+//------------------------------------------------------------------------------
+
+Validator::~Validator()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void Validator::clearErrorLog()
+{
+    m_errorLog.str( std::string() );
+}
+
+//------------------------------------------------------------------------------
+
+const std::string Validator::getErrorLog() const
+{
+    return m_errorLog.str();
+}
+
+//------------------------------------------------------------------------------
+
+void Validator::initializeContext()
+{
+    if(m_schemaValidContext)
+    {
+        return;
+    }
+
+    if ( !m_schemaParserContext )
+    {
+        if (!(m_schemaParserContext = SchemaParserCtxtSptr (
+                  xmlSchemaNewParserCtxt(m_xsd_content.c_str()),
+                  xmlSchemaFreeParserCtxt)
+              ) )
+        {
+            return ;
+        }
+        // Set the structured error callback
+        xmlSchemaSetParserStructuredErrors(m_schemaParserContext.get(), Validator::ErrorHandler, this );
+    }
+
+    // Load XML schema content
+    if (!m_schema)
+    {
+        m_schema = SchemaSptr ( xmlSchemaParse(m_schemaParserContext.get()), xmlSchemaFree );
+    }
+    if (!m_schema)
+    {
+        return ;
+    }
+
+    // Create XML schemas validation context
+    if ( (m_schemaValidContext = SchemaValidCtxtSptr( xmlSchemaNewValidCtxt(m_schema.get()), xmlSchemaFreeValidCtxt)) )
+    {
+        // Set the structured error callback
+        xmlSchemaSetValidStructuredErrors( m_schemaValidContext.get(), Validator::ErrorHandler, this );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool Validator::validate( const boost::filesystem::path & xmlFile )
+{
+    int result;
+
+    initializeContext();
+
+    xmlDocPtr xmlDoc = xmlParseFile ( xmlFile.string().c_str () );
+    if (xmlDoc == NULL)
+    {
+        throw std::ios_base::failure("Unable to parse the XML file " + xmlFile.string() );
+    }
+    xmlNodePtr xmlRoot = xmlDocGetRootElement (xmlDoc);
+    if (xmlXIncludeProcessTreeFlags (xmlRoot,XML_PARSE_NOBASEFIX) == -1)
+    {
+        xmlFreeDoc(xmlDoc);
+        throw std::ios_base::failure(std::string ("Unable to manage xinclude !"));
+    }
+
+    if(!m_schemaValidContext)
+    {
+        return false;
+    }
+
+    result = xmlSchemaValidateDoc(m_schemaValidContext.get(), xmlDoc );
+
+    xmlFreeDoc(xmlDoc);
+
+    if ( result !=0 )
+    {
+        OSLM_WARN("Validator::validation NOK, xml = " << xmlFile.string() ) ;
+        OSLM_WARN("Validator::validation NOK, xsd = " << getXsdContent() ) ;
+        OSLM_ERROR("Validator::validation NOK, error log = " << getErrorLog() ) ;
+    }
+
+    return result == 0;
+}
+
+//------------------------------------------------------------------------------
+
+bool Validator::validate( xmlNodePtr node )
+{
+    int result;
+
+    initializeContext();
+
+    if(!m_schemaValidContext)
+    {
+        return false;
+    }
+
+    result = xmlSchemaValidateOneElement( m_schemaValidContext.get(), node );
+
+    if ( result !=0 )
+    {
+        xmlBufferPtr buffer = xmlBufferCreate();
+        xmlNodeDump( buffer, node->doc, node, 1, 1 );
+        OSLM_WARN("Validator::validation NOK, node :\n " << buffer->content) ;
+        xmlBufferFree( buffer );
+        OSLM_WARN("Validator::validation NOK, xsd = " << getXsdContent() ) ;
+        OSLM_ERROR("Validator::validation NOK, error log = " << getErrorLog() ) ;
+    }
+
+    return result == 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Validator::ErrorHandler( void * userData, xmlErrorPtr error )
+{
+    Validator   * validator = (Validator*) userData;
+
+    validator->m_errorLog << "At line " << error->line << ": " << error->message;
+}
+
+//------------------------------------------------------------------------------
+
+std::string Validator::getXsdContent()
+{
+    return m_xsd_content ;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace io
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/operations.cpp b/SrcLib/core/fwRuntime/src/operations.cpp
new file mode 100644
index 0000000..1901bb8
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/operations.cpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <vector>
+
+#include "fwRuntime/operations.hpp"
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/ConfigurationElement.hpp"
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/io/ProfileReader.hpp"
+#include "fwRuntime/profile/Profile.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace
+{
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief   Functor that matches configuration element identifiers
+ *          against the given identifier
+ *
+ * 
+ */
+struct ConfigurationElementIdentifierPredicate
+{
+    ConfigurationElementIdentifierPredicate( const std::string & identifier )
+    :   m_identifier( identifier )
+    {}
+
+    bool operator() ( ::boost::shared_ptr< ConfigurationElement > element )
+    {
+        return element->getAttributeValue("id") == m_identifier;
+    }
+
+private:
+
+    std::string m_identifier;
+
+};
+
+}
+
+//------------------------------------------------------------------------------
+
+ConfigurationElement::sptr findConfigurationElement( const std::string & identifier, const std::string & pointIdentifier )
+{
+    typedef std::vector< ConfigurationElement::sptr >  ElementContainer;
+    ConfigurationElement::sptr resultConfig;
+    ElementContainer            elements = getAllConfigurationElementsForPoint< ElementContainer >( pointIdentifier );
+    ElementContainer::iterator  foundElement = ::std::find_if( elements.begin(), elements.end(), ConfigurationElementIdentifierPredicate(identifier) );
+    if(foundElement != elements.end())
+    {
+        resultConfig = *foundElement;
+    }
+    return resultConfig;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< Extension > findExtension( const std::string & identifier )
+{
+    ::fwRuntime::Runtime* rntm = ::fwRuntime::Runtime::getDefault();
+    return rntm->findExtension( identifier );
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ExtensionPoint > findExtensionPoint(const std::string &identifier)
+{
+    ::fwRuntime::Runtime * rntm = ::fwRuntime::Runtime::getDefault();
+    return rntm->findExtensionPoint( identifier );
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path getBundleResourcePath(const std::string& bundleIdentifier, const ::boost::filesystem::path &path) throw()
+{
+    Runtime *rntm = Runtime::getDefault();
+     ::boost::shared_ptr<Bundle>    bundle = rntm->findBundle( bundleIdentifier );
+    return bundle != 0 ? getBundleResourcePath(bundle, path) : ::boost::filesystem::path();
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path getBundleResourcePath( ::boost::shared_ptr<Bundle> bundle, const ::boost::filesystem::path &path) throw()
+{
+    return bundle->getLocation() / path;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path getBundleResourcePath( ConfigurationElement::sptr element, const ::boost::filesystem::path &path) throw()
+{
+    return getBundleResourcePath(element->getBundle(), path);
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path getBundleResourcePath(const IExecutable *executable, const ::boost::filesystem::path &path) throw()
+{
+    return getBundleResourcePath(executable->getBundle(), path);
+}
+
+//------------------------------------------------------------------------------
+
+void addBundles( const ::boost::filesystem::path & directory) throw(RuntimeException)
+{
+    Runtime * rntm = Runtime::getDefault();
+    rntm->addBundles( directory );
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::profile::Profile::sptr startProfile( const ::boost::filesystem::path & path )
+{
+    try
+    {
+        ::fwRuntime::profile::Profile::sptr profile = ::fwRuntime::io::ProfileReader::createProfile(path);
+        profile->start();
+        return profile;
+    }
+    catch( const std::exception & exception )
+    {
+        throw RuntimeException( std::string(path.string() + ": invalid profile file. ") + exception.what() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< Bundle > findBundle( const std::string & identifier, const Version & version )
+{
+    return Runtime::getDefault()->findBundle( identifier, version );
+}
+
+//------------------------------------------------------------------------------
+
+void startBundle(const std::string &identifier) throw(RuntimeException)
+{
+    Runtime* rntm = Runtime::getDefault();
+
+    // Retrieves the specified bundle.
+    ::boost::shared_ptr<Bundle> bundle = rntm->findBundle( identifier );
+    if( bundle == 0 )
+    {
+        throw RuntimeException(identifier + ": bundle not found.");
+    }
+    // Starts the found bundle.
+    bundle->start();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Activater.cpp b/SrcLib/core/fwRuntime/src/profile/Activater.cpp
new file mode 100644
index 0000000..9f120a2
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Activater.cpp
@@ -0,0 +1,110 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#if defined(__GNUC__)
+#pragma GCC visibility push(default)
+#endif
+#include <iostream>
+#if defined(__GNUC__)
+#pragma GCC visibility pop
+#endif
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/Bundle.hpp"
+#include "fwRuntime/ExtensionPoint.hpp"
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/profile/Activater.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+//------------------------------------------------------------------------------
+
+Activater::Activater( const std::string & identifier, const std::string & version )
+:   m_identifier( identifier ),
+    m_version( version )
+{}
+
+//------------------------------------------------------------------------------
+
+void Activater::addParameter( const std::string & identifier, const std::string & value )
+{
+    m_parameters[identifier] = value;
+}
+
+//------------------------------------------------------------------------------
+
+void Activater::addDisableExtensionPoint( const std::string & identifier )
+{
+    m_disableExtensionPoints.push_back(identifier);
+}
+
+//------------------------------------------------------------------------------
+
+void Activater::addDisableExtension( const std::string & identifier )
+{
+    m_disableExtensions.push_back(identifier);
+}
+
+//------------------------------------------------------------------------------
+
+void Activater::apply()
+{
+    ::boost::shared_ptr< Bundle >  bundle = Runtime::getDefault()->findBundle(m_identifier, m_version);
+    OSLM_FATAL_IF("Unable to activate Bundle " << m_identifier << "_" << m_version << ". Not found.", bundle==0);
+
+    bundle->setEnable( true );
+
+    // Managment of parameter configuration
+    for( ParameterContainer::const_iterator i = m_parameters.begin();
+            i != m_parameters.end();
+            ++i )
+    {
+        bundle->addParameter( i->first, i->second );
+    }
+
+    // Disable extension point for this bundle
+    for( DisableExtensionPointContainer::const_iterator id = m_disableExtensionPoints.begin();
+            id != m_disableExtensionPoints.end();
+            ++id )
+    {
+        if( bundle->hasExtensionPoint(*id) )
+        {
+            bundle->setEnableExtensionPoint( *id, false );
+        }
+        else
+        {
+            OSLM_ERROR("Unable to disable Extension Point " << *id << " defined in the Bundle " << m_identifier << ". Not found.");
+        }
+    }
+
+    // Disable extension for this bundle
+    for( DisableExtensionContainer::const_iterator id = m_disableExtensions.begin();
+            id != m_disableExtensions.end();
+            ++id )
+    {
+        if( bundle->hasExtension(*id) )
+        {
+            bundle->setEnableExtension( *id, false );
+        }
+        else
+        {
+            OSLM_ERROR("Unable to disable Extension " << *id << " defined in the Bundle " << m_identifier << ". Not found.");
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Initializer.cpp b/SrcLib/core/fwRuntime/src/profile/Initializer.cpp
new file mode 100644
index 0000000..bbb4147
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Initializer.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/Bundle.hpp"
+
+#include "fwRuntime/profile/Profile.hpp"
+#include "fwRuntime/profile/Uninitializer.hpp"
+#include "fwRuntime/profile/Initializer.hpp"
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+//------------------------------------------------------------------------------
+
+Initializer::Initializer( const std::string & identifier )
+: m_identifier( identifier )
+{}
+
+//------------------------------------------------------------------------------
+
+void Initializer::apply()
+{
+    SPTR( Bundle )  bundle = Runtime::getDefault()->findBundle(m_identifier);
+    OSLM_FATAL_IF("Unable to initialize bundle " << m_identifier << ". Not found.", bundle == 0);
+    try
+    {
+        if (!bundle->isInitialized())
+        {
+            bundle->initialize();
+            ::fwRuntime::profile::getCurrentProfile()->add( SPTR(Uninitializer) (new Uninitializer(m_identifier)));
+        }
+    }
+    catch( const std::exception & e )
+    {
+        OSLM_FATAL("Unable to initialize bundle " << m_identifier << ". " << e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Profile.cpp b/SrcLib/core/fwRuntime/src/profile/Profile.cpp
new file mode 100644
index 0000000..f0f09c3
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Profile.cpp
@@ -0,0 +1,253 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/profile/Profile.hpp"
+
+#include <algorithm>
+#include <cstring>
+
+#include <boost/bind.hpp>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/profile/Activater.hpp"
+#include "fwRuntime/profile/Starter.hpp"
+#include "fwRuntime/profile/Stopper.hpp"
+#include "fwRuntime/profile/Initializer.hpp"
+#include "fwRuntime/profile/Uninitializer.hpp"
+
+#include "fwRuntime/Extension.hpp"
+#include "fwRuntime/Bundle.hpp"
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+namespace
+{
+
+    template< typename E >
+    struct Apply
+    {
+        void operator() ( E e )
+        {
+            e->apply();
+        }
+    };
+
+}
+
+// =========================================================
+Profile::wptr current_profile;
+
+void setCurrentProfile(Profile::sptr prof)
+{
+    current_profile = prof;
+}
+
+Profile::sptr getCurrentProfile()
+{
+    return current_profile.lock();
+}
+
+// =========================================================
+
+Profile::Profile():
+    m_checkSingleInstance(false),
+    m_argc(0),
+    m_argv(NULL)
+{
+    m_run = ::boost::bind(&Profile::defaultRun, this);
+}
+
+// =========================================================
+
+Profile::~Profile()
+{
+    if (m_argv)
+    {
+        delete[] m_argv;
+    }
+}
+
+
+
+//------------------------------------------------------------------------------
+
+void Profile::add( SPTR( Activater ) activater )
+{
+    m_activaters.push_back( activater );
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::add( SPTR( Starter ) starter )
+{
+    m_starters.push_back( starter );
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::add( SPTR( Stopper ) stopper )
+{
+    m_stoppers.push_back( stopper );
+}
+
+//------------------------------------------------------------------------------
+void Profile::add( SPTR( Initializer ) initializer )
+{
+    m_initializers.push_back(initializer);
+}
+
+//------------------------------------------------------------------------------
+void Profile::add( SPTR( Uninitializer ) uninitializer )
+{
+    m_uninitializers.push_back(uninitializer);
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::start()
+{
+    std::for_each( m_activaters.begin(), m_activaters.end(), Apply< ActivaterContainer::value_type >() );
+
+    // Check validity of extension
+    Runtime * rntm( Runtime::getDefault() );
+    for( Runtime::ExtensionIterator i = rntm->extensionsBegin(); i != rntm->extensionsEnd(); ++i )
+    {
+        SPTR( Extension ) extension( *i );
+        OSLM_FATAL_IF( "Validation not ok for bundle = '" << extension->getBundle()->getIdentifier() << "'  (extension id = '" << extension->getIdentifier() << "' )",
+                extension->getBundle()->isEnable() && extension->validate() == Extension::Invalid );
+    }
+
+    std::for_each( m_starters.begin(), m_starters.end(), Apply< StarterContainer::value_type >() );
+    OSLM_TRACE( "NB INITIALIZERS" <<  m_initializers.size() );
+}
+
+//------------------------------------------------------------------------------
+
+int Profile::run()
+{
+    SLM_ASSERT("the 'run' callback is missing", m_run);
+    int result;
+    result = m_run();
+    return result;
+}
+
+//------------------------------------------------------------------------------
+
+int Profile::defaultRun()
+{
+    SLM_TRACE_FUNC();
+    this->setup();
+    this->cleanup();
+    return 0;
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::setRunCallback(RunCallbackType callback)
+{
+    m_run = callback;
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::stop()
+{
+    std::for_each( m_stoppers.rbegin(), m_stoppers.rend(), Apply< StopperContainer::value_type >() );
+}
+
+
+//------------------------------------------------------------------------------
+
+void Profile::setup()
+{
+    InitializerContainer initializers;
+    initializers = m_initializers;
+    m_initializers.clear();
+    std::for_each( initializers.begin(), initializers.end(), Apply< InitializerContainer::value_type >() );
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::cleanup()
+{
+    std::for_each( m_uninitializers.rbegin(), m_uninitializers.rend(), Apply< UninitializerContainer::value_type >() );
+    m_uninitializers.clear();
+}
+
+//------------------------------------------------------------------------------
+
+Profile::ParamsContainer Profile::getParams()
+{
+    return m_params;
+}
+
+//------------------------------------------------------------------------------
+
+int &Profile::getRawArgCount()
+{
+    return m_argc;
+}
+
+//------------------------------------------------------------------------------
+
+char** Profile::getRawParams()
+{
+    return m_argv;
+}
+
+//------------------------------------------------------------------------------
+
+void Profile::setParams(int argc, char** argv)
+{
+    Profile::ParamsContainer params;
+
+    for(int i = 0; i < argc; i++)
+    {
+        std::string arg = argv[i];
+        params.push_back( arg );
+    }
+
+    this->setParams(params);
+}
+
+//------------------------------------------------------------------------------
+void Profile::setParams(const Profile::ParamsContainer &params)
+{
+    m_params = params;
+
+
+    if (m_argv)
+    {
+        delete[] m_argv;
+    }
+
+    m_argc = m_params.size();
+    // allocate memory for an array of character strings
+    m_argv = new char*[m_params.size()];
+
+    // for each string, allocate memory in the character array and copy
+    for (unsigned long i=0; i<m_params.size(); i++)
+    {
+        size_t paramSize = m_params[i].size();
+        m_argv[i] = new char[paramSize+1];
+#ifndef _WIN32
+        strncpy(m_argv[i], m_params[i].c_str(), paramSize);
+        m_argv[i][paramSize] = '\0';
+#else
+        strncpy_s(m_argv[i], paramSize+1, m_params[i].c_str(), paramSize);
+#endif
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Starter.cpp b/SrcLib/core/fwRuntime/src/profile/Starter.cpp
new file mode 100644
index 0000000..9db52c9
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Starter.cpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRuntime/profile/Starter.hpp"
+
+#include <iostream>
+#include <sstream>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/Bundle.hpp"
+
+#include <fwCore/base.hpp>
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+//------------------------------------------------------------------------------
+
+Starter::Starter( const std::string & identifier )
+: m_identifier( identifier )
+{}
+
+//------------------------------------------------------------------------------
+
+void Starter::apply()
+{
+    ::boost::shared_ptr< Bundle >  bundle = Runtime::getDefault()->findBundle(m_identifier);
+    OSLM_FATAL_IF("Unable to start bundle " << m_identifier << ". Not found.", bundle == 0);
+    try
+    {
+        bundle->start();
+    }
+    catch( const std::exception & e )
+    {
+        OSLM_FATAL("Unable to start bundle " << m_identifier << ". " << e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Stopper.cpp b/SrcLib/core/fwRuntime/src/profile/Stopper.cpp
new file mode 100644
index 0000000..2d59449
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Stopper.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <iostream>
+#include <sstream>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/Bundle.hpp"
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/profile/Stopper.hpp"
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+//------------------------------------------------------------------------------
+
+Stopper::Stopper( const std::string & identifier )
+: m_identifier( identifier )
+{}
+
+//------------------------------------------------------------------------------
+
+void Stopper::apply()
+{
+    SLM_TRACE_FUNC();
+    ::boost::shared_ptr< Bundle >  bundle = Runtime::getDefault()->findBundle(m_identifier);
+    OSLM_FATAL_IF("Unable to stop bundle " << m_identifier << ". Not found.", bundle == 0);
+    try
+    {
+        OSLM_INFO("Stopping bundle : " << m_identifier);
+        bundle->stop();
+    }
+    catch( const std::exception & e )
+    {
+        OSLM_ERROR("Unable to stop bundle " << m_identifier << ". " << e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/src/profile/Uninitializer.cpp b/SrcLib/core/fwRuntime/src/profile/Uninitializer.cpp
new file mode 100644
index 0000000..c6505dd
--- /dev/null
+++ b/SrcLib/core/fwRuntime/src/profile/Uninitializer.cpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include "fwRuntime/Runtime.hpp"
+#include "fwRuntime/Bundle.hpp"
+
+#include "fwRuntime/profile/Uninitializer.hpp"
+
+
+namespace fwRuntime
+{
+
+namespace profile
+{
+
+//------------------------------------------------------------------------------
+
+Uninitializer::Uninitializer( const std::string & identifier )
+: m_identifier( identifier )
+{}
+
+//------------------------------------------------------------------------------
+
+void Uninitializer::apply()
+{
+    ::boost::shared_ptr< Bundle >  bundle = Runtime::getDefault()->findBundle(m_identifier);
+    OSLM_FATAL_IF("Unable to uninitialize bundle " << m_identifier << ". Not found.", bundle == 0);
+    try
+    {
+        bundle->uninitialize();
+    }
+    catch( const std::exception & e )
+    {
+        OSLM_FATAL("Unable to uninitialize bundle " << m_identifier << ". " << e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace profile
+
+} // namespace fwRuntime
diff --git a/SrcLib/core/fwRuntime/test/CMakeLists.txt b/SrcLib/core/fwRuntime/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwRuntime/test/Properties.cmake b/SrcLib/core/fwRuntime/test/Properties.cmake
new file mode 100644
index 0000000..8ff3419
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwRuntimeTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwRuntime )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwRuntime/test/cppunit.options b/SrcLib/core/fwRuntime/test/cppunit.options
new file mode 100644
index 0000000..b46ab87
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/cppunit.options
@@ -0,0 +1,9 @@
+CLASSTEST=[
+    'EConfigurationElementTest',
+    'RuntimeTest',
+    ]
+
+USE = ['boost','libxml2']
+LIB = ['fwCore_0-1','fwRuntime_0-3']
+REQUIREMENTS = ['dataReg_0-1', 'servicesReg_0-1']
+CONSOLE='yes'
diff --git a/SrcLib/core/fwRuntime/test/tu/include/EConfigurationElementTest.hpp b/SrcLib/core/fwRuntime/test/tu/include/EConfigurationElementTest.hpp
new file mode 100644
index 0000000..24f928a
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/tu/include/EConfigurationElementTest.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRUNTIME_UT_ECONFIGURATIONELEMENTTEST_HPP_
+#define __FWRUNTIME_UT_ECONFIGURATIONELEMENTTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwRuntime
+{
+namespace ut
+{
+
+/**
+ * @brief   Test the creation of EConfigurationElement
+ */
+class EConfigurationElementTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( EConfigurationElementTest );
+    CPPUNIT_TEST( testConfiguration );
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testConfiguration();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWRUNTIME_UT_ECONFIGURATIONELEMENTTEST_HPP_
diff --git a/SrcLib/core/fwRuntime/test/tu/include/RuntimeTest.hpp b/SrcLib/core/fwRuntime/test/tu/include/RuntimeTest.hpp
new file mode 100644
index 0000000..dfb44f2
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/tu/include/RuntimeTest.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRUNTIME_UT_RUNTIMETEST_HPP__
+#define __FWRUNTIME_UT_RUNTIMETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwRuntime
+{
+namespace ut
+{
+
+/**
+ * @brief   Test Runtime : read the bundles in CommonLib
+ */
+class RuntimeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( RuntimeTest );
+    CPPUNIT_TEST( testRuntime );
+    CPPUNIT_TEST_SUITE_END();
+
+protected:
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testRuntime();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWRUNTIME_UT_RUNTIMETEST_HPP__
diff --git a/SrcLib/core/fwRuntime/test/tu/src/EConfigurationElementTest.cpp b/SrcLib/core/fwRuntime/test/tu/src/EConfigurationElementTest.cpp
new file mode 100644
index 0000000..74e9b50
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/tu/src/EConfigurationElementTest.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include "EConfigurationElementTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwRuntime::ut::EConfigurationElementTest );
+
+namespace fwRuntime
+{
+namespace ut
+{
+
+void EConfigurationElementTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void EConfigurationElementTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void EConfigurationElementTest::testConfiguration()
+{
+    const std::string NAME1 = "config_name1";
+    const std::string NAME2 = "config_name2";
+    const std::string NAME3 = "config_name3";
+    const std::string VALUE1 = "value1";
+    const std::string VALUE2 = "value2";
+    const std::string ATTRIBUTE1 = "attibute1";
+
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > config1( new ::fwRuntime::EConfigurationElement(NAME1));
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > config2( new ::fwRuntime::EConfigurationElement(NAME2));
+
+    config1->addConfigurationElement(config2);
+    config2->setAttributeValue(ATTRIBUTE1, VALUE1);
+    config2->setValue(VALUE2);
+    config2->addConfigurationElement(NAME3);
+
+    CPPUNIT_ASSERT_EQUAL(NAME1, config1->getName());
+    CPPUNIT_ASSERT_EQUAL(NAME2, config2->getName());
+    CPPUNIT_ASSERT_EQUAL(VALUE2, config2->getValue());
+    CPPUNIT_ASSERT(config2->hasAttribute(ATTRIBUTE1));
+    CPPUNIT_ASSERT_EQUAL(VALUE1, config2->getExistingAttributeValue(ATTRIBUTE1));
+    CPPUNIT_ASSERT_EQUAL(VALUE1, config2->getAttributeValue(ATTRIBUTE1));
+
+    ::boost::shared_ptr< ::fwRuntime::ConfigurationElement > config3 = ::boost::dynamic_pointer_cast< ::fwRuntime::ConfigurationElement >(config2);
+    CPPUNIT_ASSERT_EQUAL(config3, config1->findConfigurationElement(NAME2));
+    CPPUNIT_ASSERT(config2->findConfigurationElement(NAME3) != NULL);
+}
+
+} // namespace ut
+} // namespace fwTools
diff --git a/SrcLib/core/fwRuntime/test/tu/src/RuntimeTest.cpp b/SrcLib/core/fwRuntime/test/tu/src/RuntimeTest.cpp
new file mode 100644
index 0000000..fc23518
--- /dev/null
+++ b/SrcLib/core/fwRuntime/test/tu/src/RuntimeTest.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <set>
+
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/Bundle.hpp>
+#include <fwRuntime/Extension.hpp>
+#include <fwRuntime/ExtensionPoint.hpp>
+
+#include "RuntimeTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwRuntime::ut::RuntimeTest );
+
+namespace fwRuntime
+{
+namespace ut
+{
+
+void RuntimeTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void RuntimeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void RuntimeTest::testRuntime()
+{
+    // Bundles location
+#ifdef SPECIALINSTALL
+    ::boost::filesystem::path location = BUNDLEPATH;
+#else
+    ::boost::filesystem::path location =  ::boost::filesystem::current_path() / "Bundles/";
+#endif
+
+    if (::boost::filesystem::exists(location))
+    {
+        ::fwRuntime::Runtime * runtime = ::fwRuntime::Runtime::getDefault();
+
+        // Read bundles
+        runtime->addBundles(location);
+        CPPUNIT_ASSERT(runtime->bundlesBegin() !=  runtime->bundlesEnd());
+
+        // Test bundle dataReg
+        CPPUNIT_ASSERT(runtime->findBundle("dataReg"));
+        ::boost::shared_ptr< ::fwRuntime::Bundle > bundle = runtime->findBundle("dataReg");
+        bundle->setEnable(true);
+        CPPUNIT_ASSERT(bundle->isEnable());
+
+        // Test bundle servicesReg
+        ::boost::shared_ptr< ::fwRuntime::Bundle > bundle2 = runtime->findBundle("servicesReg");
+        bundle2->setEnable(true);
+
+        // Test runtime extensions
+        CPPUNIT_ASSERT(runtime->findExtensionPoint("::fwServices::registry::ServiceFactory"));
+        CPPUNIT_ASSERT(runtime->findExtensionPoint("::fwServices::registry::ServiceConfig"));
+        CPPUNIT_ASSERT(runtime->findExtensionPoint("::fwServices::registry::AppConfig"));
+    }
+}
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwServices/CMakeLists.txt b/SrcLib/core/fwServices/CMakeLists.txt
new file mode 100644
index 0000000..3c03ea1
--- /dev/null
+++ b/SrcLib/core/fwServices/CMakeLists.txt
@@ -0,0 +1,16 @@
+
+fwLoadProperties()
+
+fwUseForwardInclude(
+    fwActivities
+    fwCom
+    fwCore
+    fwData
+    fwRuntime
+    fwThread
+    fwTools
+    )
+
+find_package (Boost REQUIRED)
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+
diff --git a/SrcLib/core/fwServices/COPYING b/SrcLib/core/fwServices/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwServices/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwServices/COPYING.LESSER b/SrcLib/core/fwServices/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwServices/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwServices/Properties.cmake b/SrcLib/core/fwServices/Properties.cmake
new file mode 100644
index 0000000..9ef424f
--- /dev/null
+++ b/SrcLib/core/fwServices/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwServices )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwActivities fwCom fwCore fwData fwDataCamp fwRuntime fwThread fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwServices/bin/build.options b/SrcLib/core/fwServices/bin/build.options
new file mode 100644
index 0000000..178f000
--- /dev/null
+++ b/SrcLib/core/fwServices/bin/build.options
@@ -0,0 +1,14 @@
+TYPE    = "shared"
+USE     = [ 'boost' ]
+LIB     = [ 
+            'fwRuntime_0-3',
+            'fwCore_0-1',
+            'fwTools_0-1',
+            'fwData_0-1',
+            'fwThread_0-1',
+            'fwCom_0-1',
+            'fwDataCamp_0-1',
+            'fwActivities_0-1',
+            ]
+VERSION = '0-1'
+
diff --git a/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hpp b/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hpp
new file mode 100644
index 0000000..d51928d
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hpp
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_CONFIGTEMPLATEMANAGER_HPP_
+#define _FWSERVICES_CONFIGTEMPLATEMANAGER_HPP_
+
+#include <vector>
+#include <string>
+#include <utility>
+
+#include <boost/tuple/tuple.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwServices/config.hpp"
+#include "fwServices/IXMLParser.hpp"
+#include "fwServices/IService.hpp"
+#include "fwServices/helper/SigSlotConnection.hpp"
+
+namespace fwServices
+{
+/**
+ * @class   AppConfigManager
+ * @brief   This class provides an API to manage config template.
+ *
+ * 
+ * @date    2007-2009.
+ */
+class FWSERVICES_CLASS_API AppConfigManager : public ::fwTools::Object
+{
+protected:
+    enum ConfigState
+    {
+        STATE_CREATED,
+        STATE_STARTED,
+        STATE_STOPPED,
+        STATE_DESTROYED,
+    };
+    typedef std::vector< ::fwServices::IService::wptr > ServiceContainer;
+    typedef ::boost::tuple< std::string, bool > ConfigAttribute;
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((AppConfigManager)(::fwTools::Object),
+                                           (()),
+                                           ::boost::make_shared< AppConfigManager >);
+
+    /// Constructor. Do nothing.
+    FWSERVICES_API AppConfigManager();
+
+    /// Destructor. Do nothing.
+    FWSERVICES_API virtual ~AppConfigManager();
+
+    /// Return state
+    bool isCreated() { return m_state == STATE_CREATED; }
+    bool isStarted() { return m_state == STATE_STARTED; }
+    bool isStopped() { return m_state == STATE_STOPPED; }
+    bool isDestroyed() { return m_state == STATE_DESTROYED; }
+
+    /// Set config param
+    void setConfig(::fwRuntime::ConfigurationElement::csptr cfgElem)
+    {
+        m_cfgElem = cfgElem;
+    }
+
+    /// Get config root
+    ::fwData::Object::sptr getConfigRoot() const
+    {
+        return m_configuredObject;
+    }
+
+    /// Get config root with autocast
+    template < class ClassName >
+    ::boost::shared_ptr< ClassName > getConfigRoot() const;
+
+    /// Creates objects and services from config
+    FWSERVICES_API virtual void create();
+
+    /// Starts services specified in config
+    FWSERVICES_API virtual void start();
+
+    /// Updates services specified in config
+    FWSERVICES_API virtual void update();
+
+    /// Stops services specified in config
+    FWSERVICES_API virtual void stop();
+
+    /// Destroys services specified in config
+    FWSERVICES_API virtual void destroy();
+
+    /// Calls methods : create, start then update.
+    FWSERVICES_API void launch();
+
+    /// Stops and destroys services specified in config, then resets the configRoot sptr.
+    FWSERVICES_API void stopAndDestroy();
+
+protected:
+    struct ProxyConnections
+    {
+        typedef std::string UIDType;
+        typedef std::string KeyType;
+        typedef std::pair<UIDType, KeyType> ProxyEltType;
+        typedef std::vector<ProxyEltType> ProxyEltVectType;
+
+        std::string m_channel;
+        ProxyEltVectType m_slots;
+        ProxyEltVectType m_signals;
+
+        ProxyConnections(const std::string& channel) : m_channel(channel)
+        {}
+
+        ~ProxyConnections()
+        {}
+
+        void addSlotConnection(UIDType uid, KeyType key)
+        {
+            m_slots.push_back(std::make_pair(uid, key));
+        }
+        void addSignalConnection(UIDType uid, KeyType key)
+        {
+            m_signals.push_back(std::make_pair(uid, key));
+        }
+    };
+    typedef std::vector<ProxyConnections> ProxyConnectionsVectType;
+
+    ::fwData::Object::sptr m_configuredObject;
+    ::fwServices::IXMLParser::sptr m_objectParser;
+    ::fwRuntime::ConfigurationElement::csptr m_cfgElem;
+    ProxyConnectionsVectType m_vectProxyCtns;
+
+    ConfigState m_state;
+
+    ServiceContainer m_createdSrv;
+    ServiceContainer m_startedSrv;
+    helper::SigSlotConnection::sptr m_connections;
+
+    FWSERVICES_API ::fwData::Object::sptr getNewObject(
+            ConfigAttribute type,
+            const std::string& uid,
+            ConfigAttribute id=ConfigAttribute("", false));
+
+    FWSERVICES_API ::fwData::Object::sptr getNewObject(
+            ConfigAttribute type,
+            ConfigAttribute uid=ConfigAttribute("", false),
+            ConfigAttribute id=ConfigAttribute("", false));
+
+    FWSERVICES_API ::fwData::Object::sptr getRefObject(
+            ConfigAttribute type,
+            const std::string& uid,
+            ConfigAttribute id=ConfigAttribute("", false));
+
+    FWSERVICES_API ::fwServices::IService::sptr getNewService(
+            ConfigAttribute type,
+            ConfigAttribute uid,
+            ConfigAttribute implType);
+
+    FWSERVICES_API void autoSigSlotConnection(
+            ::fwData::Object::sptr obj,
+            ::fwServices::IService::sptr srv,
+            ConfigAttribute priority);
+
+    FWSERVICES_API void startConnections();
+    FWSERVICES_API void stopConnections();
+
+    FWSERVICES_API void stopStartedServices();
+    FWSERVICES_API void destroyCreatedServices();
+
+    FWSERVICES_API void processStartItems();
+    FWSERVICES_API void processUpdateItems();
+
+    FWSERVICES_API virtual ::fwData::Object::sptr createObject();
+    FWSERVICES_API virtual void createServices();
+    FWSERVICES_API virtual void createServices(::fwRuntime::ConfigurationElement::csptr cfgElem);
+
+    FWSERVICES_API virtual void bindService(::fwRuntime::ConfigurationElement::csptr srvElem);
+    FWSERVICES_API virtual void createConnections();
+    FWSERVICES_API virtual void createConnection(::fwRuntime::ConfigurationElement::csptr connectionCfg);
+    FWSERVICES_API virtual void createProxy(::fwRuntime::ConfigurationElement::csptr config);
+    FWSERVICES_API virtual void destroyProxies();
+};
+
+} // namespace fwServices
+
+#include "fwServices/AppConfigManager.hxx"
+
+#endif // _FWSERVICES_CONFIGTEMPLATEMANAGER_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hxx b/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hxx
new file mode 100644
index 0000000..c4ac69c
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/AppConfigManager.hxx
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_CONFIGTEMPLATEMANAGER_HXX_
+#define _FWSERVICES_CONFIGTEMPLATEMANAGER_HXX_
+
+#include <fwCore/base.hpp>
+
+namespace fwData
+{
+    class Object;
+}
+
+namespace fwServices
+{
+
+template<class CLASSNAME>
+SPTR(CLASSNAME) AppConfigManager::getConfigRoot() const
+{
+    SPTR(::fwData::Object) obj = this->getConfigRoot();
+    SPTR(CLASSNAME) rootObject = CLASSNAME::dynamicCast( obj ) ;
+    SLM_ASSERT("Unable to cast root object to " << CLASSNAME::classname(), rootObject);
+    return rootObject;
+}
+
+
+}
+
+#endif // _FWSERVICES_CONFIGTEMPLATEMANAGER_HXX_
diff --git a/SrcLib/core/fwServices/include/fwServices/Base.hpp b/SrcLib/core/fwServices/include/fwServices/Base.hpp
new file mode 100644
index 0000000..9628d54
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/Base.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_BASE_HPP_
+#define _FWSERVICES_BASE_HPP_
+
+// For implementing or manipulating a service type
+#include "fwServices/IService.hpp"
+
+// For declaring service to object association
+#include "fwServices/macros.hpp"
+
+// For communications
+#include "fwServices/ObjectMsg.hpp"
+
+
+// For adding/get/erasing/info (has/support/implementationIds)
+#include "fwServices/op/Add.hpp"
+#include "fwServices/op/Get.hpp"
+
+
+#endif /*_FWSERVICES_BASE_HPP_*/
diff --git a/SrcLib/core/fwServices/include/fwServices/IController.hpp b/SrcLib/core/fwServices/include/fwServices/IController.hpp
new file mode 100644
index 0000000..b5d04e2
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/IController.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWSERVICES_ICONTROLLER_HPP_
+#define FWSERVICES_ICONTROLLER_HPP_
+
+#include "fwServices/config.hpp"
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @brief   This interface defines control service API. Does nothing particularly, can be considered as a default service type to be implemented by unclassified services.
+ *
+ * @class   IController
+ * 
+ * @date    2007-2009.
+ */
+class FWSERVICES_CLASS_API IController : public ::fwServices::IService
+{
+
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (IController)(::fwServices::IService) ) ;
+
+protected:
+
+    ///@brief IController constructor. Do nothing.
+    FWSERVICES_API IController();
+
+    ///@brief IController destructor. Do nothing.
+    FWSERVICES_API virtual ~IController();
+
+};
+
+}
+
+#endif // FWSERVICES_ICONTROLLER_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/IEditionService.hpp b/SrcLib/core/fwServices/include/fwServices/IEditionService.hpp
new file mode 100644
index 0000000..1728d34
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/IEditionService.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_IEDITIONSERVICE_HPP_
+#define _FWSERVICES_IEDITIONSERVICE_HPP_
+
+#include <list>
+
+#include <fwTools/Object.hpp>
+
+
+#include "fwServices/config.hpp"
+#include "fwServices/IService.hpp"
+#include "fwServices/ObjectMsg.hpp"
+
+namespace fwServices
+{
+class ObjectMsg ;
+}
+
+namespace fwServices
+{
+
+/**
+ * @brief   This interface defines edition service API. It mainly has the role of the subject in the observer design pattern.
+ * @class   IEditionService
+ * 
+
+ * @date    2007-2009.
+ *
+ * This service notifies modifications performed on its associated object. This can be seen a delegate of traditional notifications performed by objects (subjects) which are themselves subject to modification. This ensures a good separation of concerns.
+ * @todo the design assumes that any object can have only one service of type IEditionService. For robustness, this should be controlled.
+ * @note notification are propagated to "listening" services by invoking the update(const fwServices::ObjectMsg::csptr  ) methods on referenced communication channels which forward this to their destination service acting as the observer.
+ * @note could be improved by directly registering the destination service instead of the communication channel. Communication channel, being a first class entity between the subject and observer, have to be preferred to facilitate the configuration, the (des)activation and the monitoring of communications over a software system.
+ * @note special thanks to Guillaume Brocker
+ */
+class FWSERVICES_CLASS_API IEditionService : public fwServices::IService
+{
+    friend class GlobalEventManager;
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IEditionService)(::fwServices::IService) ) ;
+
+    /**
+     * @brief Invoke the IEditionService::notify( ObjectMsg::csptr ) method on _pSubject.
+     * @param[in] _pSource The service which send the message
+     * @param[in] _pSubject The subject of the message ( to retrieve listeners of the subject )
+     * @param[in] _pMsg message notify to associated object listeners
+     *
+     *  This method notifies observers of _pSubject. It changes notification status of _pSource during all notification, set correct source and subject of msg and timestamp the message.
+     */
+    FWSERVICES_API static void notify(
+            ::fwServices::IService::sptr _pSource,
+            ::fwData::Object::sptr _pSubject,
+            ObjectMsg::sptr _pMsg );
+
+    /**
+     * @brief Invoke the IEditionService::notify( ObjectMsg::csptr ) method on _pSubject.
+     * @param[in] _pSource The service which send the message
+     * @param[in] _pSubject The subject of the message ( to retrieve listeners of the subject )
+     * @param[in] _pMsg message notify to associated object listeners
+     * @param[in] _allowLoops Allow loops (be really careful)
+     *
+     *  This method notifies observers of _pSubject. It changes notification status of _pSource during all notification, set correct source and subject of msg and timestamp the message.
+     */
+    FWSERVICES_API static void notify(
+            ::fwServices::IService::sptr _pSource,
+            ::fwData::Object::sptr _pSubject,
+            ObjectMsg::sptr _pMsg,
+            bool _allowLoops );
+
+protected:
+
+    /// Constructor. Do nothing.
+    FWSERVICES_API IEditionService() ;
+
+    /// Destructor. Do nothing.
+    FWSERVICES_API virtual ~IEditionService() throw();
+
+};
+
+}
+
+#endif // _FWSERVICES_IEDITIONSERVICE_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/IService.hpp b/SrcLib/core/fwServices/include/fwServices/IService.hpp
new file mode 100644
index 0000000..062aecf
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/IService.hpp
@@ -0,0 +1,478 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_ISERVICE_HPP_
+#define _FWSERVICES_ISERVICE_HPP_
+
+#include <boost/property_tree/ptree.hpp>
+
+#include <deque>
+
+#include <fwTools/Failed.hpp>
+#include <fwTools/Object.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/HasSlots.hpp>
+#include <fwCom/HasSignals.hpp>
+
+#include "fwServices/config.hpp"
+#include "fwServices/ObjectMsg.hpp"
+#include "fwServices/factory/new.hpp"
+#include "fwServices/helper/SigSlotConnection.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+class ObjectService;
+}
+
+typedef std::pair< std::string , std::string > ObjectServiceKeyType ;
+
+/**
+ * @brief   Base class for all services.
+ * @class   IService
+ * 
+ * @date    2007-2009.
+ *
+ * This class defines the API to use and declare services. The service state aims at imposing method execution order (i.e. configure(), start(), update() or update(const fwServices::ObjectMsg::sptr), stop()).
+ *
+ * @todo replace tests on status in start, stop, ... methods by assertions.
+ * @todo Refactoring of SWAPPING status. Perhaps must be a special status as UPDATING or UPDATING must be another GlobalStatus. it must be homogeneous.
+ * @todo Add a new method to test if m_associatedObject has expired
+ */
+class FWSERVICES_CLASS_API IService : public ::fwTools::Object, public ::fwCom::HasSlots, public ::fwCom::HasSignals
+{
+
+    // to give to OSR an access on IService.m_associatedObject;
+    friend class registry::ObjectService;
+
+public :
+    typedef ::boost::property_tree::ptree ConfigType;
+
+    fwCoreServiceClassDefinitionsMacro ( (IService)(::fwTools::Object) ) ;
+    fwCoreAllowSharedFromThis();
+
+    /**
+     * @name Definition of service status
+     */
+
+    //@{
+
+    /// Defines all possible global status for a service, including transitions
+    typedef enum
+    {
+        STARTED,    /**< state after start */
+        STARTING,   /**< state during start */
+        SWAPPING,   /**< state during swap */
+        STOPPED,    /**< state after stop */
+        STOPPING    /**< state during stop */
+    } GlobalStatus;
+
+    /// Defines all possible status for an update process
+    typedef enum
+    {
+        UPDATING,   /**< state during update */
+        NOTUPDATING /**< state during when the service is not updating */
+    } UpdatingStatus;
+
+    /// Defines all possible status for a configuration process
+    typedef enum
+    {
+        CONFIGURING,    /**< state during configuration */
+        CONFIGURED,     /**< state after configuration */
+        UNCONFIGURED    /**< state when the service is not configured */
+    } ConfigurationStatus;
+
+    //@}
+
+
+    /**
+     * @name Slot API
+     */
+    //@{
+    typedef ::boost::shared_future< void > SharedFutureType;
+    typedef ::boost::packaged_task< void > PackagedTaskType;
+    typedef ::boost::future< void > UniqueFutureType;
+
+    FWSERVICES_API static const ::fwCom::Slots::SlotKeyType s_START_SLOT;
+    typedef ::fwCom::Slot<SharedFutureType()> StartSlotType;
+
+    FWSERVICES_API static const ::fwCom::Slots::SlotKeyType s_STOP_SLOT;
+    typedef ::fwCom::Slot<SharedFutureType()> StopSlotType;
+
+    FWSERVICES_API static const ::fwCom::Slots::SlotKeyType s_UPDATE_SLOT;
+    typedef ::fwCom::Slot<SharedFutureType()> UpdateSlotType;
+
+    FWSERVICES_API static const ::fwCom::Slots::SlotKeyType s_RECEIVE_SLOT;
+    typedef ::fwCom::Slot<void(ObjectMsg::csptr)> ReceiveSlotType;
+
+    FWSERVICES_API static const ::fwCom::Slots::SlotKeyType s_SWAP_SLOT;
+    typedef ::fwCom::Slot<SharedFutureType(::fwData::Object::sptr)> SwapSlotType;
+
+    /// Initializes m_associatedWorker and associates this worker to all service slots
+    FWSERVICES_API void setWorker( ::fwThread::Worker::sptr worker );
+
+    /// Returns associate worker
+    FWSERVICES_API ::fwThread::Worker::sptr getWorker() const;
+
+    //@}
+
+    /**
+     * @name Key service API
+     */
+
+    //@{
+
+    /**
+     * @brief Affect the configuration, using a generic XML like structure.
+     * @param[in] _cfgElement a structure which represents the xml configuration
+     * @post m_configurationState == UNCONFIGURED
+     */
+    FWSERVICES_API void setConfiguration( const ::fwRuntime::ConfigurationElement::sptr _cfgElement ) ;
+
+    /**
+     * @brief Affect the configuration, using a boost property tree
+     * @param[in] ptree property tree
+     * @post m_configurationState == UNCONFIGURED
+     */
+    FWSERVICES_API void setConfiguration( const ConfigType &ptree ) ;
+
+    /**
+     * @brief Invoke configuring() if m_globalState == STOPPED. Invoke reconfiguring() if m_globalState == STARTED. Does nothing otherwise.
+     * @pre m_configurationState == UNCONFIGURED
+     * @post m_configurationState == CONFIGURED
+     * @note invoke checkConfiguration()
+     */
+    FWSERVICES_API void configure() ;
+
+    /**
+     * @brief Invoke starting() if m_globalState == STOPPED. Does nothing otherwise.
+     * @post m_globalState == STARTED
+     */
+    FWSERVICES_API SharedFutureType start(); //throw( ::fwTools::Failed );
+
+    /**
+     * @brief Invoke stopping() if m_globalState == STARTED. Does nothing otherwise. Stops all observations.
+     *
+     * @post m_globalState == STOPPED
+     *
+     */
+    FWSERVICES_API SharedFutureType stop(); //throw( ::fwTools::Failed );
+
+    /**
+     * @brief Invoke updating() if m_globalState == STARTED. Does nothing otherwise.
+     * @pre m_globalState == STARTED
+     */
+    FWSERVICES_API SharedFutureType update(); //throw( ::fwTools::Failed );
+
+    /**
+     * @brief Associate the service to another object
+     * @param[in] _obj change association service from m_associatedObject to _obj
+     * @pre m_globalState == STARTED
+     * @pre m_associatedObject != _obj
+     *
+     * This method provides to associate te service to another object without stopping
+     * and deleting it. Furthermore, this method modify all observations to be aware to
+     * _obj notifications.
+     * 
+     * 
+     */
+    FWSERVICES_API SharedFutureType swap( ::fwData::Object::sptr _obj ); //throw( ::fwTools::Failed );
+
+    //@}
+
+    /**
+     * @name All concerning status access
+     */
+
+    //@{
+
+    /**
+     * @brief Return the global process status
+     * @return m_globalState
+     */
+    FWSERVICES_API GlobalStatus getStatus() const throw() ;
+
+    /**
+     * @brief Test if the service is started or not
+     * @return true if m_globalState == STARTED
+     */
+    FWSERVICES_API bool isStarted() const throw() ;
+
+    /**
+     * @brief Test if the service is stopped or not
+     * @return true if m_globalState == STOPPED
+     */
+    FWSERVICES_API bool isStopped() const throw() ;
+
+    /**
+     * @brief Return the configuration process status
+     * @return m_configurationState
+     */
+    FWSERVICES_API ConfigurationStatus getConfigurationStatus() const throw() ;
+
+    /**
+     * @brief Return the update process status
+     * @return m_updatingState
+     */
+    FWSERVICES_API UpdatingStatus getUpdatingStatus() const throw() ;
+    //@}
+
+
+    /**
+     * @name All concerning configuration
+     */
+
+    //@{
+
+    /**
+     * @brief Return the configuration, in an xml format read using runtime library
+     * @return m_configuration, a structure which represents the service configuration
+     */
+    FWSERVICES_API ::fwRuntime::ConfigurationElement::sptr getConfiguration() const;
+
+    /**
+     * @brief Return the configuration, in an boost property tree
+     */
+    FWSERVICES_API ConfigType getConfigTree() const ;
+
+
+//    /**
+//     * @brief Check the configuration using XSD if possible
+//     * @return true if the configuration is validate or if
+//     * there is not XSD available to validate the configuration.
+//     */
+//    FWSERVICES_API bool checkConfiguration() ;
+
+
+    //@}
+
+
+    /**
+     * @name Optimized access to associated Object & Helper
+     */
+    //@{
+
+    /**
+     * @brief Return the object associated to service
+     * @return m_associatedObject
+     * @pre the service must have an associated object set
+     * @pre associated object does not be expired
+     */
+    FWSERVICES_API ::fwData::Object::sptr getObject();
+
+    /**
+     * @brief Return the object associated to service. The object is casted.
+     * @return m_associatedObject casted in a good type
+     * @pre the service must have an associated object set
+     * @pre associated object does not be expired
+     * @post cast verification in debug mode ( assertion on dynamic cast )
+     */
+    template< class DATATYPE > SPTR(DATATYPE) getObject();
+
+    //@}
+
+    /**
+     * @name Communication connection between object::signals and service::slots
+     */
+    //@{
+
+    typedef ::fwServices::helper::SigSlotConnection::KeyConnectionsType KeyConnectionsType;
+
+    /**
+     * @brief Returns proposals to connect service slots to associated object signals,
+     * this method is used for obj/srv auto connection
+     */
+    FWSERVICES_API virtual KeyConnectionsType getObjSrvConnections() const;
+
+    //@}
+
+    /**
+     * @name Misc
+     */
+
+    //@{
+
+    /**
+     * @brief Streaming a service
+     * @see IService::operator<<(std::ostream & _ostream, IService& _service)
+     * @note Invoke IService::info( std::ostream )
+     */
+    FWSERVICES_API friend std::ostream & operator<<(std::ostream & _sstream, IService & _service) ;
+
+    //@}
+
+#ifdef COM_LOG
+    /**
+      * @brief Set a newID  for the service, the oldest one is released.
+      * @warning Cannot set a empty ID.
+      * @note This method is thread-safe. This method is used to better trace communication between signals and slots
+      */
+    FWSERVICES_API void setID( ::fwTools::fwID::IDType newID );
+#endif
+
+protected :
+
+    /**
+     * @name Constructor and Destructor
+     */
+
+    //@{
+
+    /**
+     * @brief IService constructor.
+     *
+     * This constructor does nothing. By default, m_associatedObject is null and
+     * service is considered as STOPPED, NOTUPDATING and UNCONFIGURED.
+     */
+    FWSERVICES_API IService() ;
+
+    /**
+     * @brief IService desctructor.
+     *
+     * This destructor does nothing.
+     */
+    FWSERVICES_API virtual ~IService() ;
+
+    //@}
+
+    /**
+     * @name Interface to override (implementation contract)
+     */
+
+    //@{
+
+    /**
+     * @brief Invoke receiving(fwServices::ObjectMsg::csptr) if m_globalState == STARTED. Does nothing otherwise. This method makes a service assimilable to an observer in the sense of the observer design pattern.
+     * @pre m_globalState == STARTED
+     */
+    FWSERVICES_API void receive( fwServices::ObjectMsg::csptr _msg ) ;
+
+    /**
+     * @brief Initialize the service activity.
+     *
+     * Use configuration to start his job. For example : the start method
+     * installs a button in a frame and show the frame.
+     * @see start()
+     */
+    FWSERVICES_API virtual void starting() throw ( ::fwTools::Failed ) = 0 ;
+
+    /**
+     * @brief Uninitialize the service activity. The stop() method is always invoked before destroying a service.
+     *
+     * @see stop()
+     */
+    FWSERVICES_API virtual void stopping() throw ( ::fwTools::Failed ) = 0 ;
+
+    /**
+     * @brief Swap the service from associated object to another object
+     * @see swap()
+     * @todo This method must be pure virtual
+     * @todo FIXME after code update for all services
+     * @todo This method must have in parameter the new object or the old ?
+     */
+    virtual void swapping() throw ( ::fwTools::Failed ) {} ;
+
+    /**
+     * @brief Configure the service before starting. Apply the configuration to service.
+     * @see configure()
+     */
+    FWSERVICES_API virtual void configuring() throw ( ::fwTools::Failed ) = 0 ;
+
+    /**
+     * @brief Reconfigure the service activity when is started.
+     * @todo This method should be pure virtual
+     * @see configure()
+     */
+    FWSERVICES_API virtual void reconfiguring() throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Perform some computations according to object (this service is attached to) attribute values and its internal state.
+     * @see update()
+     */
+    FWSERVICES_API virtual void updating() throw ( ::fwTools::Failed ) = 0 ;
+
+    /**
+     * @brief Perform some computations according to modifications specified in the _msg parameter. _msg generally indicates modification to occur (or having occured) on the object the service
+     * is attached to.
+     * @see receive(fwServices::ObjectMsg::csptr )
+     */
+    FWSERVICES_API virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    /**
+     * @brief Write information in a stream.
+     *
+     * This method is used by operator<<(std::ostream & _sstream, IService& _service)
+     * to avoid declaration of << by all services.
+     */
+    FWSERVICES_API virtual void info( std::ostream & _sstream );
+
+    //@}
+
+    /**
+     * @brief Configuration element used to configure service internal state using a generic XML like structure
+     */
+    ::fwRuntime::ConfigurationElement::sptr  m_configuration ;
+
+    /**
+     * @brief associated object of service
+     * @todo this field must be private
+     */
+    ::fwData::Object::wptr m_associatedObject;
+
+    /**
+     * @name Slot API
+     */
+    //@{
+
+    /// Slot to call start method
+    StartSlotType::sptr m_slotStart;
+
+    /// Slot to call stop method
+    StopSlotType::sptr m_slotStop;
+
+    /// Slot to call update method
+    UpdateSlotType::sptr m_slotUpdate;
+
+    /// Slot to call receive method
+    ReceiveSlotType::sptr m_slotReceive;
+
+    /// Slot to call swap method
+    SwapSlotType::sptr m_slotSwap;
+
+    /// Associated worker
+    ::fwThread::Worker::sptr m_associatedWorker;
+
+    //@}
+
+private :
+
+    /**
+     * @brief Defines the current global status of the service.
+     */
+    GlobalStatus m_globalState;
+
+    /**
+     * @brief Defines if the service is updating.
+     */
+    UpdatingStatus m_updatingState;
+
+    /**
+     * @brief Defines if the service is configured or not.
+     */
+    ConfigurationStatus m_configurationState;
+
+};
+
+} // namespace fwServices
+
+#include "fwServices/IService.hxx"
+
+#endif // _FWSERVICES_ISERVICE_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/IService.hxx b/SrcLib/core/fwServices/include/fwServices/IService.hxx
new file mode 100644
index 0000000..1967d6c
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/IService.hxx
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_ISERVICE_HXX_
+#define _FWSERVICES_ISERVICE_HXX_
+
+namespace fwServices
+{
+
+template< class DATATYPE >
+ SPTR(DATATYPE) IService::getObject()
+{
+    OSLM_ASSERT("Expired object in service " << this->getID(), !m_associatedObject.expired() );
+    SPTR(DATATYPE) casteDdata = ::boost::dynamic_pointer_cast<DATATYPE>( m_associatedObject.lock() );
+    OSLM_ASSERT("DynamicCast "<< ::fwCore::TypeDemangler<DATATYPE>().getFullClassname()<<" failed", casteDdata);
+
+    return casteDdata;
+}
+
+} // namespace fwServices
+
+#endif // _FWSERVICES_ISERVICE_HXX_
diff --git a/SrcLib/core/fwServices/include/fwServices/IXMLParser.hpp b/SrcLib/core/fwServices/include/fwServices/IXMLParser.hpp
new file mode 100644
index 0000000..00f7f9b
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/IXMLParser.hpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef IXMLPARSER_HPP_
+#define IXMLPARSER_HPP_
+
+#include <fwTools/Object.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @class IXMLParser
+ * @brief Service type for the construction of an object and associated services from an XML-based description
+ *
+ * This includes (data) object attributes initialization as well as XML declared service creation, attachment and configuration.
+ * As each specific (data) object has a specific structure (attributes), it must be specialized for each one. Such a service is used by the factory
+ * New(::fwRuntime::ConfigurationElement::sptr ) method.
+ *
+ * The updating() method of this base class parses the XML description: each object named XML children corresponds to a field
+ * added to the object (see ::fwTools::Object). The New(::fwRuntime::ConfigurationElement::sptr ) method on the related child is invoked, therefore allowing to build
+ * tree like composite object which services.
+ *
+ * 
+ */
+class FWSERVICES_CLASS_API IXMLParser : public ::fwServices::IService
+{
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (IXMLParser)(::fwServices::IService) ) ;
+
+public :
+
+    FWSERVICES_API void setObjectConfig( ::fwRuntime::ConfigurationElement::csptr _cfgElem );
+
+    FWSERVICES_API virtual void createConfig( ::fwTools::Object::sptr _obj );
+
+    FWSERVICES_API virtual void startConfig();
+
+    FWSERVICES_API virtual void updateConfig();
+
+    FWSERVICES_API virtual void stopConfig();
+
+    FWSERVICES_API virtual void destroyConfig();
+
+    ::fwRuntime::ConfigurationElement::csptr m_cfg;
+
+protected:
+
+    /**
+     * @brief Constructor. Does nothing.
+     */
+    FWSERVICES_API IXMLParser( ) ;
+
+    /**
+     * @brief Destructor. Does nothing.
+     */
+    FWSERVICES_API virtual ~IXMLParser() ;
+
+    /**
+     * @brief Does nothing
+     */
+    FWSERVICES_API virtual void starting() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Does nothing
+     */
+    FWSERVICES_API virtual void stopping() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Does nothing
+     */
+    FWSERVICES_API virtual void configuring() throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Does nothing
+     */
+    FWSERVICES_API virtual void receiving( fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed) ;
+
+    /**
+     * @brief Parse the XML configuration
+     * @note Should invoked ( this->::IXMLParser::updating() ) from specific XMLParsers updating method to support both specific compositions and this generic one
+     */
+    FWSERVICES_API virtual void updating() throw(::fwTools::Failed) ;
+};
+
+
+
+
+}
+
+#endif /* IXMLPARSER_HPP_ */
diff --git a/SrcLib/core/fwServices/include/fwServices/Namespace.hpp b/SrcLib/core/fwServices/include/fwServices/Namespace.hpp
new file mode 100644
index 0000000..074007f
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/Namespace.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWSERVICESNAMESPACE_HPP_
+#define FWSERVICESNAMESPACE_HPP_
+
+/**
+ * @brief Namespace fwServices is dedicated to (mimic) the dynamic affectation of methods to (pure data) objects (::fwTools::Object), and component orientation transparently. This is assimilable to the
+ * notion of role (corresponding to the IService class).
+ * \li IService : API to normalize manipulation, using a limited set of well defined methods
+ * \li IService : contract for service implementation
+ * \li macros.hpp : declaration of service to object bindings
+ * \li A set of high level methods to facilitate the use of implemented concepts (Add.hpp, New.hpp, Info.hpp, Erase.hpp, Get.hpp and Run.hpp)
+ * \li ObjectMsg and IEditionService : communication management (implementation of an adaptation of the observer design pattern), high-level methods being available in Com.hpp
+ * @namespace   fwServices
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwServices
+{
+}
+#endif /* FWSERVICESNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwServices/include/fwServices/ObjectMsg.hpp b/SrcLib/core/fwServices/include/fwServices/ObjectMsg.hpp
new file mode 100644
index 0000000..68a9dd7
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/ObjectMsg.hpp
@@ -0,0 +1,267 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_OBJECTMSG_HPP_
+#define _FWSERVICES_OBJECTMSG_HPP_
+
+#include <map>
+#include <string>
+#include <vector>
+
+#include <boost/function.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwData/Object.hpp>
+
+#include "fwServices/factory/message/new.hpp"
+#include "fwServices/registry/message/detail.hpp"
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+
+class IService;
+
+/**
+ * @brief Object message : indicate modifications having occurred or being performed on a object.
+ * @class ObjectMsg
+ * 
+ * @date 2007-2009.
+ *
+ * The message only provides identifiers enabling to retrieve the modified information on the object. This should be embed the information. The m_subject is present
+ * to check that the considered object (subject to modifications) is the one known (or referenced) by the service receiving the message through the observation mechanism.
+ *
+ * The m_subject should a priori not be used by a service to access the object. Indeed, to be able to work without observation (therefore without messages, this being possible as observations are optional), a service requires
+ * a reference to the object allowing to perform computations. This reference is generally acquired either at attachment time (e.g. the object of interest being the one the considered service is attached to) or at configuration time (e.g. passing an unique universal identifier in the XML configuration).
+ * Therefore, for coherence and homogeneity, a service should be able to access object(s) it requires in the same way, whatever the working mode (i.e. explicit execution without observations or implicit execution with observation).
+ *
+ * Concerning the type of m_subject : a software instance is based on a (root) tree structured complex object (to which services are attached, corresponding to functionalities). So that
+ * the root object naturally destroys through unreferencement, it must be avoided that instances (except pure data objects) keep strong references on data objects composing the root, otherwise
+ * there is a risk of cross strong references, forgiving the natural destruction of objects. For this reason, messages should also respect this rule and the m_subject should be a weak reference (weak pointer).
+ *
+ * The ObjectMsg contains event identifiers with associated additional information.
+ */
+class FWSERVICES_CLASS_API ObjectMsg : public ::fwTools::Object
+{
+
+public:
+
+    typedef ::fwServices::factory::message::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the objectMsg factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar()
+        {
+            ::fwServices::registry::message::get()->addFactory(T::classname(), &::fwServices::factory::message::New<T>);
+        }
+    };
+
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ObjectMsg)(::fwTools::Object), (()), ::fwServices::factory::message::New< ObjectMsg > );
+
+    /// Defines callback type
+    typedef ::boost::function< void () > MessageCallbackType;
+
+    /**
+     * @brief Constructor
+     * @param key Private construction key
+     */
+    FWSERVICES_API ObjectMsg(::fwServices::ObjectMsg::Key key);
+
+    /// Destructor, do nothing.
+    FWSERVICES_API virtual ~ObjectMsg();
+
+    // generic message
+
+    /// Event identifier used to inform that an object was created
+    FWSERVICES_API static std::string NEW_OBJECT;
+
+    /// Event identifier used to inform that an object was modified
+    FWSERVICES_API static std::string UPDATED_OBJECT;
+
+    /// Event identifier used to inform that an object has to be removed
+    FWSERVICES_API static std::string DELETE_OBJECT;
+
+    /// Event identifier used to inform that fields were added, removed or changed
+    //@{
+    FWSERVICES_API static std::string ADDED_FIELDS;
+    FWSERVICES_API static std::string REMOVED_FIELDS;
+    FWSERVICES_API static std::string CHANGED_FIELDS;
+    //@}
+
+    /**
+     * @name Event management
+     */
+    //@{
+
+    /**
+     * @brief This method add an event to the message before message notification.
+     * @param[in] _eventId the event added in the message
+     * @param[in] _pDataInfo additional information concerning message ( it is an optional parameter )
+     * @note a message can contain many events.
+     */
+    FWSERVICES_API void addEvent( std::string _eventId , ::fwData::Object::csptr _pDataInfo = ::fwData::Object::sptr() );
+
+    /**
+     * @brief This method is used to know if a specific event declared in the message
+     * @param[in] _eventId id of the event researched
+     * @return true if message contain the event id
+     */
+    FWSERVICES_API bool hasEvent( std::string _eventId ) const;
+
+    /**
+     * @brief This method returns all id event contained in the message
+     * @return the list of event
+     */
+    FWSERVICES_API std::vector< std::string > getEventIds() const ;
+
+    /**
+     * @brief This method returns the data info associated to event, this data can be an null ptr when the event not needs some additional informations.
+     * @param[in] _eventId event id used to find his associated data
+     * @return associated data information
+     */
+    FWSERVICES_API ::fwData::Object::csptr getDataInfo( std::string _eventId ) const;
+
+    //@}
+
+
+    /**
+     * @name Management of source/subject message
+     */
+    //@{
+
+    /// Set message source (service which notifies subject obsevers)
+    FWSERVICES_API void setSource( WPTR(::fwServices::IService) _source );
+
+    /// Get message source (service which notifies subject obsevers)
+    FWSERVICES_API WPTR(::fwServices::IService) getSource() const;
+
+    /// Set message subject (object observed)
+    FWSERVICES_API void setSubject( ::fwData::Object::wptr _subject );
+
+    /// Get message subject (object observed)
+    FWSERVICES_API ::fwData::Object::wptr getSubject() const;
+
+    //@}
+
+
+    /**
+     * @name Field events
+     */
+    //@{
+
+    typedef std::map<std::string, ::fwData::Object::sptr> ModifiedFieldsContainerType;
+    typedef ::fwData::Object::FieldNameType FieldNameType;
+
+    /**
+     * @brief       Append an object to the added fields list.
+     * @param[in]   fieldName : the field name of the added object.
+     * @param[in]   object    : the added object.
+     */
+    FWSERVICES_API void appendAddedField( const FieldNameType &fieldName, ::fwData::Object::sptr object );
+
+    /**
+     * @brief   Return the map of the added fields.
+     */
+    FWSERVICES_API const ModifiedFieldsContainerType &getAddedFields() const;
+
+    /**
+     * @brief       Append an object to the removed fields list.
+     * @param[in]   fieldName : the field name of the removed object.
+     * @param[in]   object    : the object which will be removed.
+     */
+    FWSERVICES_API void appendRemovedField( const FieldNameType &fieldName, ::fwData::Object::sptr object );
+
+    /**
+     * @brief   Return the map of the removed fields.
+     */
+    FWSERVICES_API const ModifiedFieldsContainerType &getRemovedFields() const;
+
+    /**
+     * @brief       Append an object to the changed fields list.
+     * @param[in]   fieldName : the field name of the changed object.
+     * @param[in]   oldObject : the old object which will be replaced.
+     * @param[in]   newObject : the new object.
+     */
+    FWSERVICES_API void appendChangedField( const FieldNameType &fieldName, ::fwData::Object::sptr oldObject, ::fwData::Object::sptr newObject );
+
+    /**
+     * @brief   Return a map of old object in changed fields list.
+     */
+    FWSERVICES_API const ModifiedFieldsContainerType &getOldChangedFields() const;
+
+    /**
+    * @brief   Return a map of new object in changed fields list.
+    */
+    FWSERVICES_API const ModifiedFieldsContainerType &getNewChangedFields() const;
+
+    //@}
+
+
+    /// Give some message informations in a string.
+    FWSERVICES_API std::string getGeneralInfo() const;
+
+    /**
+     * @brief Streaming a service
+     * @see ObjectMsg::operator<<(std::ostream & _ostream, ObjectMsg& _service)
+     * @note Invoke ObjectMsg::info( std::ostream )
+     */
+    FWSERVICES_API friend std::ostream & operator<<(std::ostream & _sstream, const ObjectMsg& _message) ;
+
+    /// Set a callback to the message which will be executed during message destruction
+    FWSERVICES_API void setMessageCallback( MessageCallbackType callback );
+
+protected :
+
+    /// Constructor, do nothing.
+    FWSERVICES_API ObjectMsg();
+
+    /**
+     * @brief Intern map which associates an Event Id (string) to a dataInfo ( ::fwData::Object ).
+     *
+     * Some event has not data info, in this cases, the event is in map  but the ::fwData::Object::sptr is null.
+     */
+    std::map< std::string , ::fwData::Object::csptr > m_eventId2DataInfo;
+
+    /// Give some message informations, this method uses getGeneralInfo.
+    FWSERVICES_API virtual void info(std::ostream &_sstream ) const ;
+
+    ModifiedFieldsContainerType m_removedFields;
+    ModifiedFieldsContainerType m_addedFields;
+    ModifiedFieldsContainerType m_oldChangedFields;
+    ModifiedFieldsContainerType m_newChangedFields;
+
+private :
+
+    /// Message source. It is the service which creates msg and sends it at all subject observers
+    WPTR(::fwServices::IService) m_source;
+
+    /// Message subject. All subject observers will be notified.
+    ::fwData::Object::wptr m_subject;
+
+    /// Helper to convert string UUID/Classname in pretty string
+    static std::string convertToLightString( std::string _initialString );
+
+    /// Callback calls during destruction
+    MessageCallbackType m_callback;
+
+    /// Permits to know if message has a callback
+    bool m_hasCallback;
+};
+
+
+} // namespace fwServices
+
+#endif //_FWSERVICES_OBJECTMSG_HPP_
+
diff --git a/SrcLib/core/fwServices/include/fwServices/SConfigController.hpp b/SrcLib/core/fwServices/include/fwServices/SConfigController.hpp
new file mode 100644
index 0000000..c478c5e
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/SConfigController.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_SCONFIGCONTROLLER_HPP_
+#define _FWSERVICES_SCONFIGCONTROLLER_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include "fwServices/helper/ConfigLauncher.hpp"
+#include "fwServices/config.hpp"
+#include "fwServices/IController.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @class   SConfigController
+ * @brief   To manage configuration file defines in xml extension.
+ * @date    2010-2013.
+ *
+ * This action works on a ::fwData::Composite. It action starts/stops a template configuration given by its identifier in this action configuration.
+ *  - You can specified pattern to replace in the template configuration by the tag 'replace'.
+ *  - You can specified pattern to replace by the uid of the object contained by the composite with the given key
+ *  - The pattern GENERIC_UID is replaced by a generated unique identifier when the configuration is launch.
+ *  This assure that the created object and services in the configuration have a unique uid even if this
+ *  configuration is launch several times.
+ *
+ * Example of this service configuration
+ * @verbatim
+   <service impl="::fwServices::SConfigController" type="::fwServices::IController">
+       <config>
+           <appConfig id="IdOfConfig" >
+               <parameters>
+                   <parameter replace="SERIESDB" by="medicalData"  />
+                   <parameter replace="IMAGE" by="@values.image"  />
+               </parameters>
+           </appConfig>
+       </config>
+   </service>
+   @endverbatim
+ */
+class FWSERVICES_CLASS_API SConfigController : public ::fwServices::IController
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (SConfigController)(::fwServices::IController) ) ;
+
+    /// Constructor. Does nothing.
+    FWSERVICES_API SConfigController() throw() ;
+
+    /// Destructor. Does nothing.
+    FWSERVICES_API virtual ~SConfigController() throw() ;
+
+protected:
+
+    /// Starts the config
+    virtual void starting() throw(::fwTools::Failed);
+
+    /// Stops the config
+    virtual void stopping() throw(::fwTools::Failed);
+
+    /// Does nothing
+    virtual void receiving( CSPTR(::fwServices::ObjectMsg) _msg ) throw(::fwTools::Failed);
+
+    /// Does nothing
+    virtual void updating() throw(::fwTools::Failed);
+
+
+    /**
+     * @brief Declare the configuration to associate with an operator type and a view config
+     *
+     * Call the IAction::configuring()
+     *
+     * Example of this service configuration
+     * @verbatim
+       <service impl="::fwServices::SConfigController" type="::fwServices::IController">
+            <config>
+                <appConfig id="IdOfConfig" >
+                    <parameters>
+                        <parameter replace="SERIESDB" by="medicalData"  />
+                        <parameter replace="IMAGE" by="@values.image"  />
+                    </parameters>
+                </appConfig>
+            </config>
+       </service>
+        @endverbatim
+     * It MUST have at least one key node and at least one replace node.
+     */
+    virtual void configuring() throw(fwTools::Failed);
+
+    /// Overrides
+    virtual void info( std::ostream &_sstream ) ;
+
+private:
+
+    /// AppConfig manager
+    ::fwServices::helper::ConfigLauncher::sptr m_configLauncher;
+
+};
+
+} // fwServices
+
+
+#endif // _FWSERVICES_SCONFIGCONTROLLER_HPP_
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/ServiceFactoryRegistrar.hpp b/SrcLib/core/fwServices/include/fwServices/ServiceFactoryRegistrar.hpp
new file mode 100644
index 0000000..7d01d28
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/ServiceFactoryRegistrar.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_SERVICEFACTORYREGISTRAR_HPP__
+#define __FWSERVICES_SERVICEFACTORYREGISTRAR_HPP__
+
+#include "fwServices/factory/new.hpp"
+
+#include "fwServices/registry/ServiceFactory.hpp"
+
+namespace fwServices
+{
+
+
+/**
+ * @brief Helper for registering a service
+ * Creates internally the service factory and adds it to the FactoryRegistry
+ * 
+ * @date    2007-2012.
+ */
+template<class SRV_IMPL>
+class ServiceFactoryRegistrar
+{
+public:
+
+    // parameters are intentionally not references
+    ServiceFactoryRegistrar(std::string simpl, std::string stype, std::string oimpl)
+    {
+        ::fwServices::registry::ServiceFactory::getDefault()
+            ->addFactory( &::fwServices::factory::New< SRV_IMPL > , simpl, stype, oimpl);
+    }
+
+};
+
+
+} //end namespace fwServices
+
+
+#endif // __FWSERVICES_SERVICEFACTORYREGISTRAR_HPP__
diff --git a/SrcLib/core/fwServices/include/fwServices/config.hpp b/SrcLib/core/fwServices/include/fwServices/config.hpp
new file mode 100644
index 0000000..21f6368
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/config.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_CONFIG_HPP_
+#define _FWSERVICES_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWSERVICES_EXPORTS
+    #define FWSERVICES_API __declspec(dllexport)
+    #define FWSERVICES_TEMPLATE_API
+    #else
+    #define FWSERVICES_API __declspec(dllimport)
+    #define FWSERVICES_TEMPLATE_API extern
+    #endif
+
+    #define FWSERVICES_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWSERVICES_EXPORTS
+        #define FWSERVICES_API __attribute__ ((visibility("default")))
+        #define FWSERVICES_CLASS_API __attribute__ ((visibility("default")))
+        #define FWSERVICES_TEMPLATE_API extern
+        #else
+        #define FWSERVICES_API __attribute__ ((visibility("hidden")))
+        #define FWSERVICES_CLASS_API __attribute__ ((visibility("hidden")))
+        #define FWSERVICES_TEMPLATE_API extern
+        #endif
+
+#else
+
+    #define FWSERVICES_API
+    #define FWSERVICES_CLASS_API
+    #define FWSERVICES_TEMPLATE_API extern
+
+#endif
+
+
+#endif //_FWSERVICES_CONFIG_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/factory/message/namespace.hpp b/SrcLib/core/fwServices/include/fwServices/factory/message/namespace.hpp
new file mode 100644
index 0000000..0c35a7f
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/factory/message/namespace.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDATA_FACTORY_MESSAGE_NAMESPACE_HPP__
+#define __FWDATA_FACTORY_MESSAGE_NAMESPACE_HPP__
+
+
+namespace fwServices
+{
+
+namespace factory
+{
+/**
+ * @brief       Contains fwServices::factory::message utilities
+ * @namespace   fwServices::factory::message
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace message
+{
+} // namespace message
+
+} // namespace factory
+
+} // namespace fwServices
+
+#endif /* __FWDATA_FACTORY_MESSAGE_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwServices/include/fwServices/factory/message/new.hpp b/SrcLib/core/fwServices/include/fwServices/factory/message/new.hpp
new file mode 100644
index 0000000..8457f33
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/factory/message/new.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_FACTORY_MESSAGE_NEW_HPP__
+#define __FWSERVICES_FACTORY_MESSAGE_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwServices/config.hpp"
+#include "fwServices/registry/message/detail.hpp"
+
+namespace fwServices
+{
+
+class ObjectMsg;
+
+namespace factory
+{
+
+namespace message
+{
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to ObjectMsg construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwServices::factory::message::New();
+
+    Key(){};
+};
+
+
+FWSERVICES_API SPTR( ::fwServices::ObjectMsg ) New( const ::fwServices::registry::message::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) objMsg = ::boost::make_shared< CLASSNAME >( Key() );
+    return objMsg;
+}
+
+} // namespace message
+
+} // namespace factory
+
+} // namespace fwServices
+
+#endif /* __FWSERVICES_FACTORY_MESSAGE_NEW_HPP__ */
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/factory/namespace.hpp b/SrcLib/core/fwServices/include/fwServices/factory/namespace.hpp
new file mode 100644
index 0000000..37a49ce
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/factory/namespace.hpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_FACTORY_NAMESPACE_HPP__
+#define __FWSERVICES_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwServices
+{
+
+/**
+ * @brief       Contains fwServices::factory utilities
+ * @namespace   fwServices::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwServices
+
+#endif /* __FWSERVICES_FACTORY_NAMESPACE_HPP__ */
+
diff --git a/SrcLib/core/fwServices/include/fwServices/factory/new.hpp b/SrcLib/core/fwServices/include/fwServices/factory/new.hpp
new file mode 100644
index 0000000..099e7d8
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/factory/new.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_FACTORY_NEW_HPP__
+#define __FWSERVICES_FACTORY_NEW_HPP__
+
+#include <string>
+#include <boost/make_shared.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+
+class IService;
+
+namespace factory
+{
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) srv = ::boost::make_shared< CLASSNAME >();
+#ifdef COM_LOG
+    srv->setID(srv->getID());
+#endif
+    return srv;
+}
+
+} // namespace factory
+
+} // namespace fwServices
+
+#endif /* __FWSERVICES_FACTORY_NEW_HPP__ */
+
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/helper/ConfigLauncher.hpp b/SrcLib/core/fwServices/include/fwServices/helper/ConfigLauncher.hpp
new file mode 100644
index 0000000..e2b9d8b
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/helper/ConfigLauncher.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_HELPER_CONFIGLAUNCHER_HPP_
+#define _FWSERVICES_HELPER_CONFIGLAUNCHER_HPP_
+
+#include <fwTools/Failed.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwActivities/registry/Activities.hpp>
+
+#include "fwServices/AppConfigManager.hpp"
+#include "fwServices/helper/SigSlotConnection.hpp"
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+
+class IService;
+
+namespace helper
+{
+
+
+/**
+ * @class   ConfigLauncher
+ * @brief   This class provides few methods to manage AppConfig (parsing, starting, stopping...).
+ * @date    2013.
+ */
+class FWSERVICES_CLASS_API ConfigLauncher : public ::fwCore::BaseObject
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ConfigLauncher)(::fwCore::BaseObject),
+                                            (()),
+                                            ::boost::make_shared< ConfigLauncher > );
+
+    /// Constructor. Do nothing.
+    FWSERVICES_API ConfigLauncher();
+
+    /// Destructor. Do nothing.
+    FWSERVICES_API virtual ~ConfigLauncher();
+
+    /**
+     * @brief Parse a ConfigLauncher configuration
+     *
+     * Example of configuration
+     * @verbatim
+       <service>
+           <config>
+                <appConfig id="Visu2DID" >
+                    <parameters>
+                        <parameter replace="SERIESDB" by="medicalData"  />
+                        <parameter replace="IMAGE" by="@values.image"  />
+                    </parameters>
+                </appConfig>
+            </config>
+       </service>
+        @endverbatim
+     */
+    FWSERVICES_API virtual void parseConfig(const ::fwServices::IService::ConfigType& config);
+
+    /// Launch Appconfig and connect service with config root object
+    FWSERVICES_API virtual void startConfig( SPTR(::fwServices::IService) srv );
+
+    /// Stop/destroy AppConfig and disconnect connection with config root object
+    FWSERVICES_API virtual void stopConfig();
+
+    /// Check if AppConfig can be launched.
+    FWSERVICES_API virtual bool isExecutable(::fwData::Object::sptr currentObj);
+
+protected:
+
+    /// To manage connection to the config root
+    ::fwServices::helper::SigSlotConnection::sptr m_connections;
+
+    ::fwActivities::registry::ActivityAppConfig m_appConfig;
+
+    /// to know if AppConfig is running
+    bool m_configIsRunning;
+
+    // config manager
+    ::fwServices::AppConfigManager::sptr m_appConfigManager;
+
+private:
+
+    /// helper to connect config root
+    void connectToConfigRoot(SPTR(::fwServices::IService) srv);
+
+    /// helper to disconnect config root
+    void disconnectToConfigRoot();
+
+    /// Defines a special key to defines the associated object him self
+    static const std::string s_SELF_KEY;
+    /// Defines a special key to defines the generated uid
+    static const std::string s_GENERIC_UID_KEY;
+
+};
+
+} // helper
+} // fwServices
+
+
+#endif // _FWSERVICES_HELPER_CONFIGLAUNCHER_HPP_
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/helper/SigSlotConnection.hpp b/SrcLib/core/fwServices/include/fwServices/helper/SigSlotConnection.hpp
new file mode 100644
index 0000000..c64dd82
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/helper/SigSlotConnection.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWSERVICES_HELPER_SIGSLOTCONNECTION_HPP_
+#define FWSERVICES_HELPER_SIGSLOTCONNECTION_HPP_
+
+#include <list>
+#include <utility>
+#include <vector>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/BaseObject.hpp>
+
+#include <fwCom/Connection.hpp>
+#include <fwCom/HasSlots.hpp>
+#include <fwCom/HasSignals.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+namespace helper
+{
+
+/**
+ * @brief  This class provides few tools to connect/disconnect signals/slots between obj/srv
+ *
+ * @class  SigSlotConnection
+ * 
+ * @date   2012.
+ */
+class FWSERVICES_CLASS_API SigSlotConnection : public ::fwCore::BaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (SigSlotConnection)(::fwCore::BaseObject),
+                                            (()),
+                                            ::boost::make_shared< SigSlotConnection > );
+
+    typedef std::list< ::fwCom::Connection > ConnectionContainerType;
+
+    typedef std::pair< ::fwCom::Signals::SignalKeyType, ::fwCom::Slots::SlotKeyType > KeyConnectionType;
+
+    typedef std::vector< KeyConnectionType > KeyConnectionsType;
+
+    /// Constructor, does nothing
+    FWSERVICES_API SigSlotConnection();
+
+    /// Destructor, calls disconnect()
+    FWSERVICES_API virtual ~SigSlotConnection();
+
+    /// Connect signal to slot, and register this new connection in  m_connections
+    FWSERVICES_API void connect( ::fwCom::HasSignals::sptr hasSignals, ::fwCom::Signals::SignalKeyType signalKey,
+                  ::fwCom::HasSlots::sptr hasSlots, ::fwCom::Slots::SlotKeyType slotKey );
+
+    /// Connect signals to slots, and register these new connections in  m_connections
+    FWSERVICES_API void connect( ::fwCom::HasSignals::sptr hasSignals, ::fwCom::HasSlots::sptr hasSlots,
+                                 const KeyConnectionsType & keyConnections );
+
+    /// Disconnect all registered connections and clear m_connections
+    FWSERVICES_API void disconnect();
+
+protected :
+
+    /// Connections storage
+    ConnectionContainerType m_connections;
+};
+
+} // end namespace helper
+} // end namespace fwServices
+
+#endif // FWSERVICES_HELPER_SIGSLOTCONNECTION_HPP_
diff --git a/SrcLib/core/fwServices/include/fwServices/macros.hpp b/SrcLib/core/fwServices/include/fwServices/macros.hpp
new file mode 100644
index 0000000..a625373
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/macros.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_MACROS_HPP__
+#define __FWSERVICES_MACROS_HPP__
+
+#include <fwCore/concept_checks.hpp>
+
+#include <fwCom/util/log.hpp>
+
+#include "fwServices/IService.hpp"
+
+#include "fwServices/ServiceFactoryRegistrar.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @name Macros for declaring service to object association
+ */
+
+//@{
+/**
+ * @brief Service object type association including all string-based registration
+ * Associations concern Service-ObjectType are ObjectType-Service. Keys are typeid.
+ * 
+ */
+
+#define fwServicesRegisterMacro( ServiceType , ServiceImpl, ServiceObject )                        \
+    class BOOST_PP_CAT(  ServiceTypeConceptCheck , __LINE__ )                                      \
+    {                                                                                              \
+    public:                                                                                        \
+        BOOST_CONCEPT_ASSERT((::fwCore::concepts::SharedPtrTypedef< ServiceType >));               \
+    };                                                                                             \
+    class BOOST_PP_CAT(  ServiceImplConceptCheck , __LINE__ )                                      \
+    {                                                                                              \
+    public:                                                                                        \
+        BOOST_CONCEPT_ASSERT((::fwCore::concepts::SharedPtrTypedef< ServiceImpl >));               \
+    };                                                                                             \
+    class BOOST_PP_CAT(  ServiceObjectConceptCheck , __LINE__ )                                    \
+    {                                                                                              \
+    public:                                                                                        \
+        BOOST_CONCEPT_ASSERT((::fwCore::concepts::SharedPtrTypedef< ServiceObject >));             \
+    };                                                                                             \
+    static ::fwServices::ServiceFactoryRegistrar< ServiceImpl >                                    \
+        BOOST_PP_CAT( serviceRegistrar, __LINE__) ( #ServiceImpl , #ServiceType, #ServiceObject );
+
+//@}
+
+/// Signal async emit Parameters. Print SLM_COM with Sender string.
+#define fwServicesNotifyMacro( Sender, Signal, Parameters)                     \
+    OSLM_COM(Sender << " uses '" << Signal->getID() << "' sig to asyncEmit."); \
+    Signal->asyncEmit Parameters ;
+
+/// Signal async emit Parameters and block given Slot connection. Print SLM_COM with Sender string.
+#define fwServicesBlockAndNotifyMacro( Sender, Signal, Parameters, Slot)    \
+    {                                                                       \
+        ::fwCom::Connection::Blocker block(Signal->getConnection(Slot));    \
+        fwServicesNotifyMacro(Sender, Signal, Parameters)                   \
+    }
+
+/// Signal async emit the message. Print SLM_COM with Sender string.
+#define fwServicesNotifyMsgMacro( Sender, Signal, Message)                                                           \
+    OSLM_COM(Sender << " uses '" << Signal->getID() << "' sig to asyncEmit " << Message->getLightID()  \
+   << "::" << Message->getEventIds()[0]);                                                                              \
+    Signal->asyncEmit(Message) ;
+
+/// Signal async emit Message and block given Slot connection. Print SLM_COM with Sender string.
+#define fwServicesBlockAndNotifyMsgMacro( Sender, Signal, Message, Slot)    \
+    {                                                                       \
+        ::fwCom::Connection::Blocker block(Signal->getConnection(Slot));    \
+        fwServicesNotifyMsgMacro(Sender, Signal, Message)                   \
+    }
+
+}
+
+#endif /*__FWSERVICES_MACROS_HPP__*/
diff --git a/SrcLib/core/fwServices/include/fwServices/op/Add.hpp b/SrcLib/core/fwServices/include/fwServices/op/Add.hpp
new file mode 100644
index 0000000..ca5bb7e
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/op/Add.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_ADD_HPP_
+#define _FWSERVICES_ADD_HPP_
+
+#include <fwTools/Object.hpp>
+
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @name Methods for creating and attaching services to object
+ */
+//@{
+
+/**
+ * @brief Create and attach to the object obj a service of type serviceType, implementation _implementationId with the universal unique identifier _id
+ * @return the service
+ * @note the template method is also available, where the template parameter SERVICE corresponds to the serviceType
+ * 
+ */
+FWSERVICES_API ::fwServices::IService::sptr add( ::fwData::Object::sptr obj , std::string serviceType , std::string _implementationId , std::string _id = "") ;
+
+template<class SERVICE>
+SPTR(SERVICE) add( ::fwData::Object::sptr obj , std::string _implementationId , std::string _id= "") ;
+
+//@}
+
+
+}
+
+#include "fwServices/op/Add.hxx"
+
+#endif /*_FWSERVICES_ADD_HPP_*/
diff --git a/SrcLib/core/fwServices/include/fwServices/op/Add.hxx b/SrcLib/core/fwServices/include/fwServices/op/Add.hxx
new file mode 100644
index 0000000..b425b15
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/op/Add.hxx
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_ADD_HXX_
+#define _FWSERVICES_ADD_HXX_
+
+#include <fwData/Object.hpp>
+
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+
+template<class SERVICE>
+SPTR(SERVICE) add( ::fwData::Object::sptr obj  , std::string _implementationId , std::string _id)
+{
+    std::string serviceType = ::fwCore::TypeDemangler< SERVICE >().getClassname() ;
+    ::fwServices::IService::sptr service = ::fwServices::add( obj , serviceType , _implementationId, _id ) ;
+    OSLM_ASSERT("Failed to add "<<_implementationId, service );
+    SPTR(SERVICE) castedService = ::boost::dynamic_pointer_cast< SERVICE >( service ) ;
+    SLM_ASSERT("DynamicCast failed", castedService );
+    return castedService ;
+}
+
+//------------------------------------------------------------------------------
+
+}
+
+#endif /*HELPER_HPP_*/
diff --git a/SrcLib/core/fwServices/include/fwServices/op/Get.hpp b/SrcLib/core/fwServices/include/fwServices/op/Get.hpp
new file mode 100644
index 0000000..415f25d
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/op/Get.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_GET_HPP_
+#define _FWSERVICES_GET_HPP_
+
+#include <fwTools/Object.hpp>
+
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+
+/**
+ * @name Methods for accessing services
+ */
+//@{
+
+/**
+ * @brief Get the first service of type serviceType which is attached to obj
+ * @note The template method is also available, where the template parameter SERVICE relates the service type serviceType
+ * @todo Do not automatically add service, raise an error instead
+ * @return the requested service, null if not
+ * 
+ */
+FWSERVICES_API ::fwServices::IService::sptr get( ::fwData::Object::sptr obj, std::string serviceType ) throw(fwTools::Failed );
+
+template<class SERVICE>
+SPTR(SERVICE) get( ::fwData::Object::sptr obj) throw(fwTools::Failed );
+
+/**
+ * @brief Return a registered IService having uid as unique universal identifier , its an alias on fwData::Object::getID(...) method
+ * 
+
+ */
+FWSERVICES_API ::fwServices::IService::sptr get( std::string uid ) throw(fwTools::Failed );
+
+
+//@}
+
+
+}
+
+#include "fwServices/op/Get.hxx"
+
+#endif /*_FWSERVICES_GET_HPP_*/
diff --git a/SrcLib/core/fwServices/include/fwServices/op/Get.hxx b/SrcLib/core/fwServices/include/fwServices/op/Get.hxx
new file mode 100644
index 0000000..2109a88
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/op/Get.hxx
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_GET_HXX_
+#define _FWSERVICES_GET_HXX_
+
+#include <fwData/Object.hpp>
+
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/IService.hpp"
+#include "fwServices/op/Add.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+
+template<class SERVICE>
+SPTR(SERVICE) get( ::fwData::Object::sptr obj ) throw(fwTools::Failed )
+{
+    std::vector< typename SPTR(SERVICE) > services = ::fwServices::OSR::getServices< SERVICE >( obj );
+    std::string serviceType = ::fwCore::TypeDemangler< SERVICE >().getClassname() ;
+    OSLM_ASSERT("Service "<<serviceType<<" not unique, registered "<<services.size()<<" time", services.size() == 1);
+    return services.at(0) ;
+}
+
+//------------------------------------------------------------------------------
+
+}
+
+#endif /*HELPER_HPP_*/
diff --git a/SrcLib/core/fwServices/include/fwServices/op/Namespace.hpp b/SrcLib/core/fwServices/include/fwServices/op/Namespace.hpp
new file mode 100644
index 0000000..f9a184b
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/op/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWSERVICESOPNAMESPACE_HPP_
+#define FWSERVICESOPNAMESPACE_HPP_
+
+namespace fwServices
+{
+/**
+ * @brief       The namespace fwServices::op contains several methods for managing services to object
+ * @namespace   fwServices::op
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace op
+{
+
+}
+}
+#endif /* FWSERVICESOPNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/ActiveWorkers.hpp b/SrcLib/core/fwServices/include/fwServices/registry/ActiveWorkers.hpp
new file mode 100644
index 0000000..bc906b6
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/ActiveWorkers.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_ACTIVEWORKERS_HPP__
+#define __FWSERVICES_REGISTRY_ACTIVEWORKERS_HPP__
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwThread/Worker.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+/**
+ * @class ActiveWorkers
+ * @brief This class to register active worker in the system, creates a default worker
+ * 
+ * @date 2012.
+ */
+class FWSERVICES_CLASS_API ActiveWorkers : public ::fwCore::BaseObject
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (ActiveWorkers)(::fwCore::BaseObject),
+            (()),
+            ::boost::make_shared< ActiveWorkers >);
+
+    typedef std::string WorkerKeyType;
+
+    typedef std::map< WorkerKeyType, ::fwThread::Worker::sptr > WorkerMapType;
+
+    /// Key of default worker in registry, created and registered by initRegistry method
+    FWSERVICES_API static const std::string s_DEFAULT_WORKER;
+
+    /// Constructor, does nothing
+    FWSERVICES_API ActiveWorkers();
+
+    /// Destructor, does nothing
+    FWSERVICES_API virtual ~ActiveWorkers();
+
+    /**
+     * @brief Get a worker registered with key, if the key does not exist a null sptr is returned
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API ::fwThread::Worker::sptr getWorker( const WorkerKeyType & key ) const;
+
+    /**
+     * @brief Registers a worker
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void addWorker( const WorkerKeyType & key, ::fwThread::Worker::sptr worker );
+
+    /**
+     * @brief Initializes registry, creates and registers the default worker
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void initRegistry();
+
+    /**
+     * @brief Unregisters all registered workers, s_DEFAULT_WORKER also
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void clearRegistry();
+
+    /// Returns an instance of ActiveWorkers.
+    FWSERVICES_API static ActiveWorkers::sptr getDefault();
+
+protected :
+
+    /// Association key <=> worker
+    WorkerMapType m_workers;
+
+    /// Used to protect the registry access.
+    mutable ::fwCore::mt::ReadWriteMutex m_registryMutex;
+
+    /// The global instance of the active referenced workers.
+    static ActiveWorkers::sptr s_currentActiveWorkers;
+
+};
+
+} // namespace registry
+} // namespace fwServices
+
+#endif // __FWSERVICES_REGISTRY_ACTIVEWORKERS_HPP__
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/AppConfig.hpp b/SrcLib/core/fwServices/include/fwServices/registry/AppConfig.hpp
new file mode 100644
index 0000000..2edb800
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/AppConfig.hpp
@@ -0,0 +1,193 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_REGISTRY_APPCONFIG_HPP_
+#define _FWSERVICES_REGISTRY_APPCONFIG_HPP_
+
+#include <map>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwServices/config.hpp"
+
+
+namespace fwServices
+{
+
+namespace registry
+{
+
+
+/**
+ * @class AppInfo
+ * 
+ */
+class FWSERVICES_CLASS_API AppInfo : public ::fwCore::BaseObject
+{
+public :
+
+    enum ConfigType {
+        TEMPLATE,
+        STANDARD,
+        PARAMETERS
+    };
+
+    fwCoreClassDefinitionsWithFactoryMacro( (AppInfo)(::fwCore::BaseObject), (()), new AppInfo );
+
+    /// Constructor, do nothing.
+    AppInfo(){}
+
+    /// Destructor, do nothing.
+    virtual ~AppInfo(){}
+
+    ConfigType type;
+    std::string group;
+    std::string desc;
+    typedef std::map< std::string, std::string > ParamatersType;
+    ParamatersType parameters;
+    ::fwRuntime::ConfigurationElement::csptr config;
+};
+
+
+/**
+ * @class AppConfig
+ * @brief This class allows to register all the configuration which has the point extension
+ *        "::fwServices::registry::AppConfig".
+ * 
+ * @date 2012.
+ */
+class FWSERVICES_CLASS_API AppConfig : public ::fwCore::BaseObject
+{
+
+public:
+
+    /// Associations of <pattern, value>.
+    typedef std::map< std::string, std::string > FieldAdaptorType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (AppConfig)(::fwCore::BaseObject), (()), new AppConfig) ;
+
+    /// Destructor
+    FWSERVICES_API virtual ~AppConfig();
+
+    /**
+     * @brief Parses bundle information to retrieve configuration declaration.
+     * @warning This method must be launch only once. The same extension will not be parsed twice.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void parseBundleInformation();
+
+    /**
+     * @brief Register a new config.
+     * @param configId the identifier of the registered config.
+     * @param type the type of the added config. It can be TEMPLATE, STANDARD or PARAMETERS.
+     * @param group the name of the group that owns the config.
+     * @param desc the config description.
+     * @param parameters the list of template parameters in the config.
+     * @param config the registered config.
+     * @note This method is thread safe
+     */
+    FWSERVICES_API void addAppInfo
+    (   const std::string & configId,
+            AppInfo::ConfigType type,
+            const std::string & group,
+            const std::string & desc,
+            const AppInfo::ParamatersType & parameters,
+            ::fwRuntime::ConfigurationElement::csptr config);
+
+    /**
+     * @brief  Return the adapted config with the identifier configId.
+     * @param configId the identifier of the requested config.
+     * @param replaceFields associations between the value and the pattern to replace in the config.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API ::fwRuntime::ConfigurationElement::csptr getAdaptedTemplateConfig( const std::string & configId,
+            const FieldAdaptorType replaceFields = FieldAdaptorType() ) const;
+
+    /**
+     * @brief  Return the adapted config with the identifier configId.
+     * @param configId the identifier of the requested config.
+     * @param replaceFields composite of association between the value and the pattern to replace in the config.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API ::fwRuntime::ConfigurationElement::csptr getAdaptedTemplateConfig( const std::string & configId, ::fwData::Composite::csptr replaceFields ) const;
+
+    /**
+     * @brief Return all configurations ( standard and template ) register in the registry.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API std::vector< std::string > getAllConfigs() const;
+
+    /**
+     * @brief Return all configurations with specified group.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API std::vector< std::string > getConfigsFromGroup(const std::string & group) const;
+
+    /**
+     * @brief Clear the registry.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void clearRegistry();
+
+    /**
+     * @brief Create an unique identifier
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API static std::string getUniqueIdentifier(const std::string& serviceUid = "" );
+
+    /// Return an instance of AppConfig.
+    FWSERVICES_API static AppConfig::sptr getDefault();
+
+protected :
+
+    typedef std::map< std::string, AppInfo::sptr > Registry;
+
+    /// Container of <configId, appConfig information>
+    Registry m_reg;
+
+    /// Constructor
+    FWSERVICES_API AppConfig();
+
+private :
+
+    /// Convert the composite into map <pattern, value>.
+    FieldAdaptorType compositeToFieldAdaptor( ::fwData::Composite::csptr fieldAdaptors ) const;
+
+    /// Adapts the configuration : replace field thanks to field adaptors
+    ::fwRuntime::EConfigurationElement::sptr adaptConfig( ::fwRuntime::ConfigurationElement::csptr _cfgElem,
+                                                          const FieldAdaptorType & fieldAdaptors ) const;
+
+    /// Adapts field thanks to field adaptors
+    std::string adaptField( const std::string & _str, const FieldAdaptorType & fieldAdaptors ) const;
+
+    /// Used to protect the registry access.
+    mutable ::fwCore::mt::ReadWriteMutex m_registryMutex;
+
+    /// Used to protect the unique identifier creation.
+    static ::fwCore::mt::Mutex s_idMutex;
+
+    /// The global instance of the app config.
+    static AppConfig::sptr s_currentAppConfig;
+
+    /// The static identifier for mandatory parameters.
+    static std::string s_mandatoryParameterIdentifier;
+};
+
+} // namespace registry
+
+} // namespace fwServices
+
+#endif // _FWSERVICES_REGISTRY_APPCONFIG_HPP_
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/AppConfigParameters.hpp b/SrcLib/core/fwServices/include/fwServices/registry/AppConfigParameters.hpp
new file mode 100644
index 0000000..da50afa
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/AppConfigParameters.hpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_REGISTRY_APPCONFIGPARAMETERS_HPP_
+#define _FWSERVICES_REGISTRY_APPCONFIGPARAMETERS_HPP_
+
+#include <map>
+
+#include <fwCore/mt/types.hpp>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include "fwServices/config.hpp"
+
+#include "fwServices/registry/AppConfig.hpp"
+
+namespace fwServices
+{
+
+namespace registry
+{
+
+/**
+ * @class AppConfigParameters
+ * @brief This class allows to register all the configuration parameters which has the point extension
+ *        "::fwServices::registry::AppConfigParameters".
+ * 
+ * @date 2012
+ */
+class FWSERVICES_CLASS_API AppConfigParameters : public ::fwCore::BaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (AppConfigParameters)(::fwCore::BaseObject), (()), new AppConfigParameters) ;
+
+    /// Return the default global instance of AppConfigParameters
+    FWSERVICES_API static AppConfigParameters::sptr getDefault();
+
+    /// Destructor
+    FWSERVICES_API virtual ~AppConfigParameters();
+
+    /**
+     * @brief Parse bundle information to retrieve config parameters declaration
+     * @warning This method must be launch only once. The same extension will not be parsed twice.
+     * @note This method is thread safe.
+     **/
+    FWSERVICES_API void parseBundleInformation();
+
+    /**
+     * @brief Get the parameters associated to extension id.
+     * @note This method is thread safe.
+     **/
+    FWSERVICES_API const AppConfig::FieldAdaptorType & getParameters( const std::string & extensionId ) const;
+
+    /**
+     * @brief Clear the registry.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void clearRegistry();
+
+protected :
+
+    typedef std::map< std::string, AppConfig::FieldAdaptorType > Registry;
+
+    /// Container of parameter information
+    Registry m_reg;
+
+    /// Constructor
+    FWSERVICES_API AppConfigParameters();
+
+    /// Used to protect the registry access.
+    mutable ::fwCore::mt::ReadWriteMutex m_registryMutex;
+
+    /// The global instance of the app config parameters.
+    static AppConfigParameters::sptr s_appConfigParameters;
+
+
+};
+
+} // namespace registry
+
+} // namespace fwServices
+
+#endif // _FWSERVICES_REGISTRY_APPCONFIGPARAMETERS_HPP_
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/Namespace.hpp b/SrcLib/core/fwServices/include/fwServices/registry/Namespace.hpp
new file mode 100644
index 0000000..8192422
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWSERVICESREGISTRYNAMESPACE_HPP_
+#define FWSERVICESREGISTRYNAMESPACE_HPP_
+
+namespace fwServices
+{
+/**
+ * @brief       The namespace fwServices::registry contains class to manage services, object and config.
+ * @namespace   fwServices::registry
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace registry
+{
+
+}
+}
+#endif /* FWSERVICESREGISTRYNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hpp b/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hpp
new file mode 100644
index 0000000..1cc2db0
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hpp
@@ -0,0 +1,294 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_OBJECTSERVICE_HPP__
+#define __FWSERVICES_REGISTRY_OBJECTSERVICE_HPP__
+
+#include <map>
+#include <vector>
+
+#include <boost/static_assert.hpp>
+#include <boost/type_traits.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/bimap.hpp>
+#include <boost/bimap/unordered_set_of.hpp>
+#include <boost/bimap/multiset_of.hpp>
+
+#include <fwCore/mt/types.hpp>
+#include <fwCore/base.hpp>
+#include <fwCore/LogicStamp.hpp>
+
+#include <fwTools/Failed.hpp>
+#include <fwTools/Object.hpp>
+
+#include "fwServices/config.hpp"
+#include "fwServices/IService.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+/**
+ * @class ObjectService
+ *
+ * @brief maintain the relation between objects and services
+ *
+ * The API of ObjectService should not be directly invoked,
+ * fwServices/op methods (i.e. add, get,...) should be used instead
+ *
+ * 
+ */
+class FWSERVICES_CLASS_API ObjectService: public ::fwCore::BaseObject
+{
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (ObjectService)(::fwCore::BaseObject) ) ;
+
+    /**
+     * @brief Service container
+     * keeps relation between objects identifiers and attached services
+     */
+    typedef ::boost::bimaps::bimap<
+            ::boost::bimaps::multiset_of< ::fwCore::LogicStamp::LogicStampType >,
+            ::boost::bimaps::unordered_set_of< ::fwServices::IService::sptr >
+            > ServiceContainerType;
+
+
+    typedef std::vector< SPTR( ::fwData::Object ) >       ObjectVectorType;
+    typedef std::vector< SPTR( ::fwServices::IService ) > ServiceVectorType;
+
+    /// Return some informations contain in the registry
+    FWSERVICES_API std::string getRegistryInformation() const;
+
+    /**
+     * @name Management of registrations
+     */
+
+    //@{
+
+    /**
+     * @brief Register the service (service) for the object (obj)
+     * It also updates IService::m_associatedObject of service to point to obj
+     * removal at obj destruction.
+     */
+    FWSERVICES_API void registerService( ::fwData::Object::sptr obj, ::fwServices::IService::sptr service );
+
+    //@}
+
+    /**
+     * @name Management of unregistrations
+     */
+
+    //@{
+
+    /**
+     * @brief Remove the service (service) from the m_container
+     * It invokes service stop method first as well as related observations removal.
+     */
+    FWSERVICES_API void unregisterService(  ::fwServices::IService::sptr service );
+
+    /**
+     * @brief container manipulator (Helper)
+     * remove service from ObjectService containers, do not perform any "semantic action" like
+     * stop service, remove comm channel
+     * @note (internal use) use with care
+     */
+    void  removeFromContainer( ::fwServices::IService::sptr service );
+
+    //@}
+
+    /**
+     * @name Some useful getters
+     */
+
+    //@{
+
+    /**
+     * @brief Return a container with all services of type SERVICE registered in m_container
+     * @note Services may be associated to different object
+     */
+    template<class SERVICE>
+    std::vector< SPTR(SERVICE) > getServices() const;
+
+    /**
+     * @brief Return a container with all services of type SERVICE associated to obj in m_container
+     */
+    template<class SERVICE>
+    std::vector< SPTR(SERVICE) > getServices(::fwData::Object::sptr obj) const;
+
+    /**
+     * @brief Return registered services matching serviceType
+     * @note Should be optimized
+     * @note Invoke getServices( ::fwData::Object::sptr , const std::string & ) for each registered object
+     * 
+     */
+    FWSERVICES_API ServiceVectorType getServices( const std::string & serviceType ) const;
+
+    /**
+     * @brief Return a container of services of type serviceType which are attached to obj
+     * 
+     */
+    FWSERVICES_API ServiceVectorType getServices( ::fwData::Object::sptr obj , const std::string & serviceType ) const;
+
+    /**
+     * @brief return a vector containing all services associated with the object obj
+     * 
+     */
+    FWSERVICES_API ServiceVectorType getServices( ::fwData::Object::sptr obj ) const;
+
+    /**
+     * @brief Return a container with all objects associated with a service of type SERVICE in m_container
+     */
+     template<class SERVICE>
+     ObjectVectorType getObjects() const;
+
+
+    /**
+     * @brief Return a container with all objects registered in m_container
+     */
+     FWSERVICES_API ObjectVectorType getObjects() const;
+
+    //@}
+
+     /**
+      * @name Some useful getters
+      */
+
+     //@{
+     /**
+      * @brief return true is obj has at least one service of type srvType
+      * 
+      */
+     FWSERVICES_API bool has( ::fwData::Object::sptr obj , const std::string &srvType) const;
+
+     /**
+      * @brief return true if key is still present in OSR
+      */
+     FWSERVICES_API bool hasKey( ::fwCore::LogicStamp::csptr key ) const;
+
+     //@}
+
+
+    /**
+     * @name Misc.
+     */
+
+    //@{
+
+     /**
+     * @brief Move service (service) to object objDst in the m_container
+     * 
+     */
+    FWSERVICES_API void swapService( ::fwData::Object::sptr objDst, ::fwServices::IService::sptr service );
+
+    //@}
+
+protected :
+
+    /**
+     * @brief Object to service associations container
+     * @note An object can be registered without services
+     * @warning Do not use smart pointers for ::fwData::Object, otherwise they will never destroy
+     */
+    ServiceContainerType m_container ;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_containerMutex;
+
+private:
+
+    /**
+     * @brief Register the service (service) for the object (obj)
+     * It also updates IService::m_associatedObject of service to point to obj
+     * removal at obj destruction.
+     * @warning not thread-safe
+     */
+    void internalRegisterService( ::fwData::Object::sptr obj, ::fwServices::IService::sptr service );
+
+};
+
+} // namespace registry
+
+
+
+/**
+ * @brief OSR wraps main Object-Service registry access
+ */
+namespace OSR
+{
+
+/**
+ * @brief returns the Object-Service registry main instance
+ */
+FWSERVICES_API ::fwServices::registry::ObjectService::sptr get();
+
+/**
+ * @brief Wraps ObjectService::getObjects
+ */
+FWSERVICES_API ::fwServices::registry::ObjectService::ObjectVectorType getObjects();
+
+/**
+ * @brief Wraps ObjectService::getRegistryInformation
+ */
+FWSERVICES_API std::string getRegistryInformation();
+
+/**
+ * @brief Wraps ObjectService::getServices
+ */
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > getServices() ;
+
+/**
+ * @brief Wraps ObjectService::getServices
+ */
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > getServices(::fwData::Object::sptr obj) ;
+
+/**
+ * @brief Wraps ObjectService::getServices
+ */
+FWSERVICES_API ::fwServices::registry::ObjectService::ServiceVectorType getServices( const std::string & serviceType );
+
+/**
+ * @brief Wraps ObjectService::getServices
+ */
+FWSERVICES_API ::fwServices::registry::ObjectService::ServiceVectorType getServices( ::fwData::Object::sptr obj,
+                                                                                     const std::string & serviceType );
+
+/**
+ * @brief Wraps ObjectService::getServices
+ */
+FWSERVICES_API ::fwServices::registry::ObjectService::ServiceVectorType getServices( ::fwData::Object::sptr obj ) ;
+
+/**
+ * @brief Wraps ObjectService::has
+ */
+FWSERVICES_API bool has( ::fwData::Object::sptr obj , const std::string &srvType) ;
+
+/**
+ * @brief Wraps ObjectService::registerService
+ */
+FWSERVICES_API void registerService( ::fwData::Object::sptr obj, ::fwServices::IService::sptr service );
+
+/**
+ * @brief Wraps ObjectService::swapService
+ */
+FWSERVICES_API void swapService( ::fwData::Object::sptr objDst, ::fwServices::IService::sptr service );
+
+/**
+ * @brief Wraps ObjectService::unregisterService
+ */
+FWSERVICES_API void unregisterService(  ::fwServices::IService::sptr service );
+
+} // namespace OSR
+
+} // namespace fwServices
+
+#include "fwServices/registry/ObjectService.hxx"
+
+#endif // __FWSERVICES_REGISTRY_OBJECTSERVICE_HPP__
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hxx b/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hxx
new file mode 100644
index 0000000..2b5948a
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/ObjectService.hxx
@@ -0,0 +1,108 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwServices/IService.hpp>
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+namespace OSR
+{
+
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > getServices()
+{
+    return ::fwServices::OSR::get()->getServices< SERVICE >();
+}
+
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > getServices(::fwData::Object::sptr obj)
+{
+    return ::fwServices::OSR::get()->getServices< SERVICE >(obj);
+}
+
+} //namespace OSR
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+namespace registry
+{
+
+
+//------------------------------------------------------------------------------
+
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > ObjectService::getServices() const
+{
+    std::vector< SPTR(SERVICE) > services;
+    const ServiceContainerType::right_map &right = m_container.right;
+    BOOST_FOREACH( const ServiceContainerType::right_map::value_type &elt, right)
+    {
+        SPTR(SERVICE) service = ::boost::dynamic_pointer_cast< SERVICE >( elt.first );
+        if ( service )
+        {
+            services.push_back( service ) ;
+        }
+    }
+    SLM_DEBUG_IF("No service registered", services.empty());
+    return services;
+}
+
+//------------------------------------------------------------------------------
+
+template<class SERVICE>
+std::vector< SPTR(SERVICE) > ObjectService::getServices(::fwData::Object::sptr obj) const
+{
+    std::vector< SPTR(SERVICE) > services;
+    if(m_container.left.find(obj->getOSRKey()->getLogicStamp()) != m_container.left.end())
+    {
+        ServiceContainerType::left_map::const_iterator iter;
+        ::fwCore::LogicStamp::LogicStampType key = obj->getOSRKey()->getLogicStamp();
+        ServiceContainerType::left_map::const_iterator firstElement = m_container.left.find(key);
+        ServiceContainerType::left_map::const_iterator lastElement = m_container.left.upper_bound(key);
+        for (iter = firstElement ; iter != lastElement ; ++iter)
+        {
+            SPTR(SERVICE) service = ::boost::dynamic_pointer_cast< SERVICE >( iter->second );
+            if ( service)
+            {
+                services.push_back( service ) ;
+            }
+        }
+    }
+    return services;
+}
+
+//------------------------------------------------------------------------------
+
+template<class SERVICE>
+ObjectService::ObjectVectorType ObjectService::getObjects() const
+{
+    ObjectVectorType objects;
+    const ServiceContainerType::right_map & right = m_container.right;
+    BOOST_FOREACH( const ServiceContainerType::right_map::value_type &elt, right)
+    {
+        SPTR(SERVICE) service = ::boost::dynamic_pointer_cast< SERVICE >( elt.first );
+        if ( service && std::find(objects.begin(), objects.end(), service->getObject()) == objects.end() )
+        {
+            objects.push_back( service->getObject() ) ;
+        }
+    }
+    SLM_WARN_IF( "No object registered for the requested type of service", objects.empty() );
+    return objects;
+}
+
+//------------------------------------------------------------------------------
+
+} // end registry
+} // end fwServices
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/Proxy.hpp b/SrcLib/core/fwServices/include/fwServices/registry/Proxy.hpp
new file mode 100644
index 0000000..21abd90
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/Proxy.hpp
@@ -0,0 +1,97 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_PROXY_HPP__
+#define __FWSERVICES_REGISTRY_PROXY_HPP__
+
+#include <vector>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include <fwCom/SignalBase.hpp>
+#include <fwCom/SlotBase.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+/**
+ * @class Proxy
+ * @brief This class defines a proxy for signal/slot connections.
+ * 
+ * @date 2012.
+ *
+ * @note All the signals registered in a Proxy's channel are connected to all slots registered in the same channel.
+ */
+class FWSERVICES_CLASS_API Proxy : public ::fwCore::BaseObject
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((Proxy)(::fwCore::BaseObject), (()), ::boost::make_shared< Proxy >);
+
+    typedef std::string ChannelKeyType;
+
+    /**
+     * @brief Structure to regsiter signal and slot informations
+     * Contains a signal container, a slot container and a mutex to protect access
+     */
+    struct SigSlots
+    {
+        typedef std::vector< ::fwCom::SignalBase::sptr > SignalContainerType;
+        typedef std::vector< ::fwCom::SlotBase::sptr > SlotContainerType;
+        SignalContainerType m_signals;
+        SlotContainerType m_slots;
+
+        ::fwCore::mt::ReadWriteMutex m_mutex;
+    };
+
+    typedef std::map< ChannelKeyType, SPTR(SigSlots) > ChannelMapType;
+
+    /// Constructor, does nothing
+    FWSERVICES_API Proxy();
+
+    /// Destructor, does nothing
+    FWSERVICES_API virtual ~Proxy();
+
+    /// Returns an instance of Proxy.
+    FWSERVICES_API static Proxy::sptr getDefault();
+
+    /// Registers a signal in the channel. It will be connected to all slots in the channel.
+    FWSERVICES_API void connect(ChannelKeyType channel, ::fwCom::SignalBase::sptr signal);
+
+    /// Registers a slot in the channel. It will be connected to all signals in the channel.
+    FWSERVICES_API void connect(ChannelKeyType channel, ::fwCom::SlotBase::sptr slot);
+
+    /// Unregisters the signal. Disconnects it from the slots in channel
+    FWSERVICES_API void disconnect(ChannelKeyType channel, ::fwCom::SignalBase::sptr signal);
+
+    /// Unregisters the slot. Disconnects it from the signals in channel
+    FWSERVICES_API void disconnect(ChannelKeyType channel, ::fwCom::SlotBase::sptr slot);
+
+protected :
+
+    /// Association channels, SigSlot
+    ChannelMapType m_channels;
+
+    /// Used to protect the m_channels access.
+    mutable ::fwCore::mt::ReadWriteMutex m_channelMutex;
+
+    /// The global instance of the proxy.
+    static Proxy::sptr s_currentProxy;
+
+};
+
+} // namespace registry
+} // namespace fwServices
+
+#endif // __FWSERVICES_REGISTRY_PROXY_HPP__
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/ServiceConfig.hpp b/SrcLib/core/fwServices/include/fwServices/registry/ServiceConfig.hpp
new file mode 100644
index 0000000..437d03f
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/ServiceConfig.hpp
@@ -0,0 +1,152 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_REGISTRY_SERVICECONFIG_HPP_
+#define _FWSERVICES_REGISTRY_SERVICECONFIG_HPP_
+
+#include <map>
+
+#include <fwTools/Object.hpp>
+#include <fwTools/macros.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+
+namespace registry
+{
+
+
+/**
+ * @class ServiceConfigInfo
+ * 
+ */
+class FWSERVICES_CLASS_API ServiceConfigInfo : public ::fwCore::BaseObject
+{
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ServiceConfigInfo)(::fwCore::BaseObject), (()), new ServiceConfigInfo );
+
+    /// Constructor, do nothing.
+    ServiceConfigInfo(){}
+
+    /// Destructor, do nothing.
+    virtual ~ServiceConfigInfo(){}
+
+    std::string service;
+    std::string desc;
+    ::fwRuntime::ConfigurationElement::csptr config;
+};
+
+
+/**
+ * @brief This class allows to register all the service configuration which has the point extension
+ *        "::fwServices::registry::ServiceConfig".
+ * @class ServiceConfig
+ * 
+ *
+ *
+ * Registry config like :
+ * @verbatim
+    <extension implements="::fwServices::registry::ServiceConfig">
+        <id>SDBOpenIOSelectorConfig</id>
+        <service>::uiIO::editor::IOSelectorService</service>
+        <desc>"Open" action's IOSelector config</desc>
+        <config>
+            <type mode="reader" />
+            <selection mode="include" />
+            <addSelection service="::ioAtoms::SReader" />
+            <config id="MDAtomsConfig" service="::ioAtoms::SReader" />
+        </config>
+    </extension>
+   @endverbatim
+ */
+class FWSERVICES_CLASS_API ServiceConfig : public ::fwCore::BaseObject
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ServiceConfig)(::fwCore::BaseObject), (()), new ServiceConfig) ;
+
+    /// Return the default global instance of ServiceConfig
+    FWSERVICES_API static ServiceConfig::sptr getDefault();
+
+    /// Destructor
+    FWSERVICES_API virtual ~ServiceConfig();
+
+    /**
+     * @brief Parses bundle information to retrieve service declaration.
+     * @warning This method must be launch only once. The same extension will not be parsed twice.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void parseBundleInformation();
+
+    /**
+     * @brief Register a new service configuration
+     * @param configId the identifier of the registered configuration.
+     * @param service  the implementation of the service
+     * @param desc     the description of the configuration
+     * @param config   the registered config
+     * @note This method is thread safe
+     */
+    FWSERVICES_API void addServiceConfigInfo( const std::string & configId,
+                                              const std::string & service,
+                                              const std::string & desc,
+                                              ::fwRuntime::ConfigurationElement::csptr config );
+
+    /**
+     * @brief Returns the configuration with the given id for the service with the given implementation
+     * @note This method is thread safe
+     */
+    FWSERVICES_API ::fwRuntime::ConfigurationElement::csptr getServiceConfig( const std::string & configId,
+                                                                              const std::string &serviceImpl="" ) const;
+
+    /**
+     * @brief Returns the description of the given configuration name.
+     * @note This method is thread safe
+     */
+    FWSERVICES_API const std::string& getConfigDesc( const std::string & configId ) const;
+
+    /**
+     * @brief Returns a vector containing the names of the available config for the service with the given
+     * implementation
+     * @note This method is thread safe
+     */
+    FWSERVICES_API std::vector< std::string > getAllConfigForService( std::string serviceImpl ) const;
+
+    /**
+     * @brief Clear the registry.
+     * @note This method is thread safe.
+     */
+    FWSERVICES_API void clearRegistry();
+
+protected :
+
+    typedef std::map< std::string, ServiceConfigInfo::sptr > Registry;
+
+    /// Container of service information <configId, service config information>
+    Registry m_reg;
+
+    /// Constructor
+    FWSERVICES_API ServiceConfig();
+
+    const static std::string CONFIG_EXT_POINT;
+
+    /// Used to protect the registry access.
+    mutable ::fwCore::mt::ReadWriteMutex m_registryMutex;
+
+    /// The global instance of the service config.
+    static ServiceConfig::sptr s_currentServiceConfig;
+};
+
+} // namespace registry
+
+} // namespace fwServices
+
+#endif // _FWSERVICES_REGISTRY_SERVICECONFIG_HPP_
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/ServiceFactory.hpp b/SrcLib/core/fwServices/include/fwServices/registry/ServiceFactory.hpp
new file mode 100644
index 0000000..d75be4d
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/ServiceFactory.hpp
@@ -0,0 +1,166 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_SERVICEFACTORY_HPP__
+#define __FWSERVICES_REGISTRY_SERVICEFACTORY_HPP__
+
+#include <map>
+
+#include <boost/unordered_map.hpp>
+
+#include <boost/tuple/tuple.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwServices/config.hpp"
+
+#if defined(_WIN32) && _MSC_VER > 1499 // Visual C++ 2008 only
+#include <boost/functional/hash/hash.hpp>
+namespace std
+{
+namespace tr1
+{
+template<typename a>
+class hash< std::pair<a, a> >
+{
+public:
+   size_t operator()(const std::pair<a, a> &p) const
+   {
+      return ::boost::hash_value(p);
+   }
+};
+} //namespace tr1
+} //namespace std
+#endif
+
+namespace fwServices
+{
+
+class IService;
+
+namespace registry
+{
+
+/**
+ * @class ServiceInfo
+ * 
+ */
+class FWSERVICES_CLASS_API ServiceInfo : public ::fwTools::Object
+{
+    public :
+        typedef ::boost::function< SPTR(::fwServices::IService)() > FactoryType;
+
+        fwCoreClassDefinitionsWithFactoryMacro( (ServiceInfo)(::fwTools::Object), (()), ::boost::make_shared< ServiceInfo > );
+
+        std::string serviceType;
+        std::string objectImpl;
+        /// service description.
+        std::string desc;
+
+        ::boost::shared_ptr< ::fwRuntime::Bundle > bundle;
+
+        FactoryType factory;
+};
+
+
+/**
+ * @class ServiceFactory
+ * 
+ */
+class FWSERVICES_CLASS_API ServiceFactory : public ::fwCore::BaseObject
+{
+
+public:
+
+    typedef std::string KeyType;
+    typedef std::vector<KeyType> KeyVectorType;
+    typedef std::pair<std::string, std::string> StringPair;
+
+    typedef ::boost::unordered_map< StringPair, bool > SupportMapType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ServiceFactory)(::fwCore::BaseObject), (()), new ServiceFactory) ;
+
+    /// Return the unique Instance, create it if required at first access
+    FWSERVICES_API static ServiceFactory::sptr getDefault();
+
+    /// Parse bundle information to retrieve service declaration
+    FWSERVICES_API void parseBundleInformation( );
+
+    FWSERVICES_API void addFactory( ServiceInfo::FactoryType _factory,
+                                    const std::string & simpl,
+                                    const std::string & stype,
+                                    const std::string & oimpl);
+
+    FWSERVICES_API SPTR(IService) create( const std::string & _srvImpl ) const;
+
+    FWSERVICES_API SPTR(IService) create( const std::string & _srvType, const std::string & _srvImpl ) const;
+
+    FWSERVICES_API void clearFactory();
+
+    /// return a vector of service implementation
+    FWSERVICES_API  std::vector< std::string > getImplementationIdFromObjectAndType(const std::string& object, const std::string& type) const;
+
+    /// return the default service implementation for an object
+    FWSERVICES_API std::string getDefaultImplementationIdFromObjectAndType( const std::string& object, const std::string& type ) const;
+
+    /// return the associated object implementation.
+    FWSERVICES_API  std::string getObjectImplementation(const std::string& srvImpl) const;
+
+    /// return the service description.
+    FWSERVICES_API  std::string getServiceDescription(const std::string& srvImpl) const;
+
+    /// Check if the service with given object and implementation is valid
+    FWSERVICES_API  bool checkServiceValidity(const std::string & object, const std::string & srvImpl) const;
+
+    /**
+     * @brief Check whether an object (object) supports service of type srvType
+     * @return true if service type supported
+     */
+    FWSERVICES_API bool support(const std::string & object, const std::string & srvType);
+
+    /**
+     * @brief Check whether an object (object) supports service of type srvType and implementation srvImpl
+     * @return true if service type supported
+     */
+    FWSERVICES_API bool support(const std::string & object, const std::string & srvType, const std::string & srvImpl) const;
+
+    /**
+     * @brief returns the registered factory keys.
+     */
+    FWSERVICES_API virtual KeyVectorType getFactoryKeys() const;
+
+protected :
+
+    typedef std::map< KeyType, ServiceInfo::sptr > SrvRegContainer;
+
+    /// Container of service information
+    SrvRegContainer m_srvImplTosrvInfo;
+    SupportMapType  m_supportMap;
+
+    mutable ::fwCore::mt::ReadWriteMutex m_srvImplTosrvInfoMutex;
+    mutable ::fwCore::mt::ReadWriteMutex m_supportMapMutex;
+
+private :
+
+    /**
+     * @brief print services informations
+     * @warning not thread-safe
+     */
+    void printInfoMap( const SrvRegContainer & src ) const;
+
+    /**
+     * @brief Trace services not declared in plugin.xml
+     * @warning not thread-safe
+     */
+    void checkServicesNotDeclaredInPluginXml() const;
+};
+
+} // namespace registry
+} // namespace fwServices
+
+#endif // __FWSERVICES_REGISTRY_SERVICEFACTORY_HPP__
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/message/detail.hpp b/SrcLib/core/fwServices/include/fwServices/registry/message/detail.hpp
new file mode 100644
index 0000000..6c0def5
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/message/detail.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_MESSAGE_DETAIL_HPP__
+#define __FWSERVICES_REGISTRY_MESSAGE_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwServices/config.hpp"
+
+namespace fwServices
+{
+
+class ObjectMsg;
+
+namespace registry
+{
+
+namespace message
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwServices::ObjectMsg) () , KeyType > Type;
+
+FWSERVICES_API SPTR( Type ) get();
+
+} // namespace message
+
+} // namespace registry
+
+} // namespace fwServices
+
+#endif /* __FWSERVICES_REGISTRY_MESSAGE_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/message/macros.hpp b/SrcLib/core/fwServices/include/fwServices/registry/message/macros.hpp
new file mode 100644
index 0000000..dbfd7cd
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/message/macros.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_MESSAGE_MACRO_HPP__
+#define __FWSERVICES_REGISTRY_MESSAGE_MACRO_HPP__
+
+#include "fwServices/registry/message/detail.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+namespace message
+{
+
+#define fwServicesMessageRegisterMacro( classname )                                  \
+    static ::fwServices::ObjectMsg::Registrar< classname > s__factory__record__ ## __LINE__ ;
+
+} // end namespace message
+} // end namespace registry
+} // end namespace fwServices
+
+#endif /*__FWSERVICES_REGISTRY_MESSAGE_MACRO_HPP__*/
diff --git a/SrcLib/core/fwServices/include/fwServices/registry/message/namespace.hpp b/SrcLib/core/fwServices/include/fwServices/registry/message/namespace.hpp
new file mode 100644
index 0000000..b80bc3f
--- /dev/null
+++ b/SrcLib/core/fwServices/include/fwServices/registry/message/namespace.hpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSERVICES_REGISTRY_MESSAGE_NAMESPACE_HPP__
+#define __FWSERVICES_REGISTRY_MESSAGE_NAMESPACE_HPP__
+
+
+namespace fwServices
+{
+
+namespace registry
+{
+/**
+ * @brief       Contains fwServices::registry::message details
+ * @namespace   fwServices::registry::message
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace message
+{
+} // namespace message
+} // namespace registry
+
+} // namespace fwServices
+
+#endif /* __FWSERVICES_REGISTRY_MESSAGE_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwServices/src/fwServices/AppConfigManager.cpp b/SrcLib/core/fwServices/src/fwServices/AppConfigManager.cpp
new file mode 100644
index 0000000..a73de28
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/AppConfigManager.cpp
@@ -0,0 +1,746 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/regex.hpp>
+
+#include <fwRuntime/operations.hpp>
+
+#include <fwData/Object.hpp>
+
+#include "fwServices/Base.hpp"
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/registry/ServiceConfig.hpp"
+#include "fwServices/registry/Proxy.hpp"
+#include "fwServices/registry/ActiveWorkers.hpp"
+#include "fwServices/AppConfigManager.hpp"
+
+namespace fwServices
+{
+// Private methods
+
+::fwData::Object::sptr AppConfigManager::getNewObject(
+        ConfigAttribute type,
+        ConfigAttribute uid,
+        ConfigAttribute id)
+{
+    // Building object structure
+    SPTR(::fwRuntime::Extension) ext = ::fwRuntime::findExtension(::boost::get<0>(type));
+    if (ext)
+    {
+        std::string className = ::fwCore::getClassname< ::fwData::Object >();
+        SLM_ASSERT("Extension and classname are different.",
+                   ext->getPoint() == className);
+
+        // Start dll to retrieve proxy and register object
+        ext->getBundle()->start();
+    }
+
+    ::fwData::Object::sptr obj;
+    obj = ::fwData::factory::New(::boost::get<0>(type));
+    OSLM_ASSERT("Factory failed to build object : " <<  ::boost::get<0>(type), obj);
+
+    if (::boost::get<1>(uid))
+    {
+#ifndef COM_LOG
+        OSLM_ASSERT("Object already has an UID.", !obj->hasID());
+#endif
+
+        OSLM_FATAL_IF("UID " << ::boost::get<0>(uid) << " already exists.",
+                      ::fwTools::fwID::exist(::boost::get<0>(uid)));
+        obj->setID(::boost::get<0>(uid));
+    }
+
+    if (::boost::get<1>(id))
+    {
+        obj->setName(::boost::get<0>(id));
+    }
+    return obj;
+}
+
+// ------------------------------------------------------------------------
+
+::fwData::Object::sptr AppConfigManager::getNewObject(
+        ConfigAttribute type,
+        const std::string& uid,
+        ConfigAttribute id)
+{
+    return this->getNewObject(type, ConfigAttribute(uid, true), id);
+}
+
+// ------------------------------------------------------------------------
+
+::fwData::Object::sptr AppConfigManager::getRefObject(
+        ConfigAttribute type,
+        const std::string& uid,
+        ConfigAttribute id)
+{
+    OSLM_ASSERT("Object with UID \"" << uid << "\" doesn't exist.", ::fwTools::fwID::exist(uid));
+    ::fwData::Object::sptr obj;
+    obj = ::fwData::Object::dynamicCast(::fwTools::fwID::getObject(uid));
+
+    if (::boost::get<1>(type))
+    {
+        OSLM_ASSERT("Object with UID \"" << uid
+                << "\" has a different type (\""
+                << obj->getClassname() << "\").",
+                ::boost::get<0>(type) == obj->getClassname());
+    }
+    if (::boost::get<1>(id))
+    {
+        OSLM_ASSERT("Object with UID \"" << uid
+                << "\" has a different id (\""
+                << obj->getName() << "\").",
+                ::boost::get<0>(id) == obj->getName());
+    }
+    return obj;
+}
+
+// ------------------------------------------------------------------------
+
+::fwServices::IService::sptr AppConfigManager::getNewService(
+        ConfigAttribute type,
+        ConfigAttribute uid,
+        ConfigAttribute implType)
+{
+    ::fwServices::registry::ServiceFactory::sptr srvFactory = ::fwServices::registry::ServiceFactory::getDefault();
+
+    ::fwServices::IService::sptr srv;
+    std::string typestr = ::boost::get<0>(type);
+    if(typestr.empty())
+    {
+        srv = srvFactory->create(::boost::get<0>(implType));
+    }
+    else
+    {
+        srv = srvFactory->create(typestr, ::boost::get<0>(implType));
+    }
+
+#ifndef COM_LOG
+    OSLM_ASSERT("Service already has an UID.", !srv->hasID());
+#endif
+
+    OSLM_FATAL_IF("UID " << ::boost::get<0>(uid) << " already exists.", ::fwTools::fwID::exist(::boost::get<0>(uid)));
+    if (::boost::get<1>(uid))
+    {
+        srv->setID(::boost::get<0>(uid));
+    }
+
+    return srv;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::autoSigSlotConnection(
+        ::fwData::Object::sptr obj,
+        ::fwServices::IService::sptr srv,
+        ConfigAttribute priority)
+{
+    m_connections->connect( obj, srv, srv->getObjSrvConnections() );
+
+//    // Add priority for the new comChannel, default is 0.5
+//    if (::boost::get<1>(priority))
+//    {
+//        double priorityValue = ::boost::lexical_cast<double>(::boost::get<0>(priority));
+//        if (priorityValue < 0.0)
+//        {
+//            priorityValue = 0.0;
+//        }
+//        else if (priorityValue > 1.0)
+//        {
+//            priorityValue = 1.0;
+//        }
+//        comChannel->setPriority(priorityValue);
+//    }
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::startConnections()
+{
+    /// Connections are already started
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::stopConnections()
+{
+    m_connections->disconnect();
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::stopStartedServices()
+{
+    std::vector< ::fwServices::IService::SharedFutureType > futures;
+
+    BOOST_REVERSE_FOREACH(::fwServices::IService::wptr w_srv, m_startedSrv)
+    {
+        SLM_ASSERT("Service expired.", !w_srv.expired());
+
+        ::fwServices::IService::sptr srv = w_srv.lock();
+        OSLM_ASSERT("Service " << srv->getID() << " already stopped.", !srv->isStopped());
+        futures.push_back(srv->stop());
+    }
+    m_startedSrv.clear();
+    ::boost::wait_for_all(futures.begin(), futures.end());
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::destroyCreatedServices()
+{
+    BOOST_REVERSE_FOREACH(::fwServices::IService::wptr w_srv, m_createdSrv)
+    {
+        SLM_ASSERT("Service expired.", !w_srv.expired());
+
+        ::fwServices::IService::sptr srv = w_srv.lock();
+        OSLM_ASSERT("Service " << srv->getID() << " must be stopped before destruction.", srv->isStopped());
+        ::fwServices::OSR::unregisterService(srv);
+    }
+    m_createdSrv.clear();
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::processStartItems()
+{
+    std::vector< ::fwServices::IService::SharedFutureType > futures;
+
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem, m_cfgElem->getElements())
+    {
+        if (elem->getName() == "start")
+        {
+            SLM_ERROR_IF("\"type\" attribute on \"start\" node is deprecated. Use UID instead.",
+                        elem->hasAttribute("type"));
+
+            // Uid
+            SLM_ASSERT("Missing attribute \"uid\".", elem->hasAttribute("uid"));
+            std::string uid = elem->getExistingAttributeValue("uid");
+
+            OSLM_ASSERT("Service with UID \"" << uid << "\" doesn't exist.", ::fwTools::fwID::exist(uid));
+
+            ::fwServices::IService::sptr srv = ::fwServices::get(uid);
+
+            OSLM_ASSERT("No service registered with UID \"" << uid << "\".", srv);
+
+            futures.push_back(srv->start());
+            m_startedSrv.push_back(srv);
+        }
+    }
+    ::boost::wait_for_all(futures.begin(), futures.end());
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::processUpdateItems()
+{
+    std::vector< ::fwServices::IService::SharedFutureType > futures;
+
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem, m_cfgElem->getElements())
+    {
+        if (elem->getName() == "update")
+        {
+            // Type
+            if (elem->hasAttribute("type"))
+            {
+                std::string type = elem->getExistingAttributeValue("type");
+
+                std::vector<fwServices::IService::sptr> servicesToUpdate = ::fwServices::OSR::getServices(type);
+
+                OSLM_ASSERT("No services of type \"" << type << "\" found.", !servicesToUpdate.empty());
+
+                BOOST_FOREACH(::fwServices::IService::sptr srv, servicesToUpdate)
+                {
+                    futures.push_back(srv->update());
+                }
+            }
+            else
+            {
+                SLM_ASSERT("Missing attribute \"uid\" or \"type\".", elem->hasAttribute("uid"));
+                std::string uid = elem->getExistingAttributeValue("uid");
+
+                OSLM_ASSERT("Service with UID \"" << uid << "\" doesn't exist.", ::fwTools::fwID::exist(uid));
+
+                futures.push_back(::fwServices::get(uid)->update());
+            }
+        }
+    }
+
+    ::boost::wait_for_all(futures.begin(), futures.end());
+}
+
+// ------------------------------------------------------------------------
+
+::fwData::Object::sptr AppConfigManager::createObject()
+{
+    OSLM_ASSERT("Bad configuration element.", m_cfgElem->getName() == "object");
+
+    // Get attributes
+
+    // Uid
+    ConfigAttribute uid("", false);
+    if (m_cfgElem->hasAttribute("uid"))
+    {
+        ::boost::get<0>(uid) = m_cfgElem->getExistingAttributeValue("uid");
+        SLM_ASSERT("\"uid\" attribute is empty.", !::boost::get<0>(uid).empty());
+        ::boost::get<1>(uid) = true;
+    }
+
+    // Id
+    ConfigAttribute id("", false);
+    if (m_cfgElem->hasAttribute("id"))
+    {
+        ::boost::get<0>(id) = m_cfgElem->getExistingAttributeValue("id");
+        SLM_ASSERT("\"id\" attribute is empty.", !::boost::get<0>(id).empty());
+        ::boost::get<1>(id) = true;
+    }
+
+    // Type
+    ConfigAttribute type("", false);
+    if (m_cfgElem->hasAttribute("type"))
+    {
+        ::boost::get<0>(type) = m_cfgElem->getExistingAttributeValue("type");
+        SLM_ASSERT("\"type\" attribute is empty.", !::boost::get<0>(type).empty());
+        SLM_ASSERT("\"type\" must be a rooted namespace.",
+                ::boost::get<0>(type).substr(0, 2) == "::");
+        ::boost::get<1>(type) = true;
+    }
+
+    // Buildmode
+    ConfigAttribute buildMode("", false);
+    if (m_cfgElem->hasAttribute("src"))
+    {
+        ::boost::get<0>(buildMode) = m_cfgElem->getExistingAttributeValue("src");
+        SLM_ASSERT("\"src\" attribute is empty.", !::boost::get<0>(buildMode).empty());
+
+        SLM_ASSERT("Unhandled build mode (bad \"src\" attribute). "
+                "Must be \"new\" or \"ref\".",
+                ::boost::get<0>(buildMode) == "ref" ||
+                ::boost::get<0>(buildMode) == "src");
+        ::boost::get<1>(buildMode) = true;
+    }
+
+    // Creation of a new object
+    ::fwData::Object::sptr obj;
+
+    // Create new or get the referenced object
+    if (::boost::get<1>(buildMode) && ::boost::get<0>(buildMode) == "ref")
+    {
+        SLM_ASSERT("Missing attribute \"uid\".", ::boost::get<1>(uid));
+        obj = getRefObject(type, ::boost::get<0>(uid), id);
+    }
+    else
+    {
+        obj = getNewObject(type, uid, id);
+    }
+
+    // Get the object parser associated with the object type
+    ::fwServices::registry::ServiceFactory::sptr srvFactory = ::fwServices::registry::ServiceFactory::getDefault();
+
+    std::string srvImpl = srvFactory->getDefaultImplementationIdFromObjectAndType(
+                          obj->getClassname(), "::fwServices::IXMLParser");
+
+    ::fwServices::IService::sptr srv =  srvFactory->create("::fwServices::IXMLParser", srvImpl);
+    m_objectParser = ::fwServices::IXMLParser::dynamicCast(srv);
+    m_objectParser->setObjectConfig(m_cfgElem);
+    m_objectParser->createConfig(obj);
+    return obj;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::createServices()
+{
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  m_cfgElem->getElements())
+    {
+        if (elem->getName() == "service")
+        {
+            this->bindService(elem);
+        }
+        else if (elem->getName() == "serviceList")
+        {
+            this->createServices(elem);
+        }
+    }
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::createServices(::fwRuntime::ConfigurationElement::csptr cfgElem)
+{
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem, cfgElem->getElements())
+    {
+        if (elem->getName() == "service")
+        {
+            this->bindService(elem);
+        }
+        else if (elem->getName() == "serviceList")
+        {
+            this->createServices(elem);
+        }
+    }
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::bindService(::fwRuntime::ConfigurationElement::csptr srvElem)
+{
+    SLM_ASSERT("Configuration element is not a \"service\" node.", srvElem->getName() == "service");
+
+    // Get attributes
+
+    // Uid
+    ConfigAttribute uid("", false);
+    if (srvElem->hasAttribute("uid"))
+    {
+        ::boost::get<0>(uid) = srvElem->getExistingAttributeValue("uid");
+        OSLM_ASSERT("\"uid\" attribute is empty.", !::boost::get<0>(uid).empty());
+        ::boost::get<1>(uid) = true;
+    }
+
+    // Type
+    std::string type = srvElem->getAttributeValue("type");
+
+    // Implementation
+    ConfigAttribute implType("", false);
+    if (srvElem->hasAttribute("impl"))
+    {
+        ::boost::get<0>(implType) = srvElem->getExistingAttributeValue("impl");
+        SLM_ASSERT("\"impl\" attribute is empty.", !::boost::get<0>(implType).empty());
+
+        ::boost::get<1>(implType) = true;
+    }
+
+    // Type
+    std::string workerKey = srvElem->getAttributeValue("worker");
+
+    // Config
+    ConfigAttribute config("", false);
+    if (srvElem->hasAttribute("config"))
+    {
+        ::boost::get<0>(config) = srvElem->getExistingAttributeValue("config");
+        SLM_ASSERT("\"config\" attribute is empty.", !::boost::get<0>(config).empty());
+
+        ::boost::get<1>(config) = true;
+    }
+
+    // autoConnect
+    const ::fwRuntime::ConfigurationElement::AttributePair attribAutoConnect =
+            srvElem->getSafeAttributeValue("autoConnect");
+    std::string autoConnect = attribAutoConnect.second;
+    SLM_ASSERT("\"autoConnect\" attribute must be either \"yes\" or \"no\".",
+                (!attribAutoConnect.first) || autoConnect == "yes" || autoConnect == "no");
+
+    // Priority
+    ConfigAttribute priority("", false);
+    if (srvElem->hasAttribute("priority"))
+    {
+        ::boost::get<0>(priority) = srvElem->getExistingAttributeValue("priority");
+        SLM_ASSERT("\"priority\" attribute is empty.", !::boost::get<0>(priority).empty());
+
+        ::boost::get<1>(priority) = true;
+    }
+
+    // TODO: have a default implementation of service
+    if (!::boost::get<1>(implType))
+    {
+        OSLM_FATAL("Attribute \"impl\" is required for service "  << (::boost::get<1>(uid)?::boost::get<0>(uid):".") );
+    }
+
+    // Create and bind service
+    ::fwServices::IService::sptr srv = this->getNewService(type, uid, implType);
+    ::fwServices::OSR::registerService(m_configuredObject, srv);
+    m_createdSrv.push_back(srv);
+
+    if (!workerKey.empty())
+    {
+        ::fwServices::registry::ActiveWorkers::sptr activeWorkers = ::fwServices::registry::ActiveWorkers::getDefault();
+        ::fwThread::Worker::sptr worker;
+        worker = activeWorkers->getWorker(workerKey);
+        if (!worker)
+        {
+            worker = ::fwThread::Worker::New();
+            activeWorkers->addWorker(workerKey, worker);
+        }
+        srv->setWorker(worker);
+    }
+
+    // Get service configuration
+    ::fwRuntime::ConfigurationElement::csptr cfgElem = srvElem;
+
+    ::fwServices::registry::ServiceConfig::sptr srvCfgFactory = ::fwServices::registry::ServiceConfig::getDefault();
+    if (::boost::get<1>(config))
+    {
+        cfgElem = srvCfgFactory->getServiceConfig(::boost::get<0>(config), ::boost::get<0>(implType));
+    }
+
+    // Configure
+    SLM_ASSERT("ConstCast failed.", ::fwRuntime::ConfigurationElement::constCast(cfgElem));
+    srv->setConfiguration(::fwRuntime::ConfigurationElement::constCast(cfgElem));
+    srv->configure();
+
+    // Communication channel
+    if (autoConnect == "yes")
+    {
+        this->autoSigSlotConnection(m_configuredObject, srv, priority);
+    }
+
+    // Check if user did not bind a service to another service
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem, cfgElem->getElements())
+    {
+        SLM_ASSERT("Cannot bind a service to another service.",
+                elem->getName() != "service" &&
+                elem->getName() != "serviceList");
+    }
+}
+
+// Constructors / Destructors
+// ------------------------------------------------------------------------
+
+AppConfigManager::AppConfigManager() : m_state(STATE_DESTROYED), m_connections( helper::SigSlotConnection::New() )
+{}
+
+// ------------------------------------------------------------------------
+
+AppConfigManager::~AppConfigManager()
+{
+    SLM_ASSERT("Manager must be stopped before destruction.", m_state == STATE_DESTROYED);
+}
+
+// Public methods
+// ------------------------------------------------------------------------
+
+void AppConfigManager::create()
+{
+    SLM_ASSERT("Manager already running.", m_state == STATE_DESTROYED);
+    m_configuredObject = this->createObject();
+    this->createServices();
+    this->createConnections();
+
+    m_state = STATE_CREATED;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::start()
+{
+    SLM_ASSERT("Manager must be created first.", m_state == STATE_CREATED || m_state == STATE_STOPPED);
+
+    this->processStartItems() ;
+    m_objectParser->startConfig();
+    this->startConnections();
+
+    m_state = STATE_STARTED;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::update()
+{
+    this->processUpdateItems();
+    m_objectParser->updateConfig();
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::stop()
+{
+    SLM_ASSERT("Manager is not started, cannot stop.", m_state == STATE_STARTED);
+
+    this->destroyProxies();
+    this->stopConnections();
+    m_objectParser->stopConfig();
+    this->stopStartedServices();
+
+    OSLM_INFO("Parsing OSR after stopping the config :" << std::endl
+              << ::fwServices::OSR::getRegistryInformation());
+    m_state = STATE_STOPPED;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::destroy()
+{
+    SLM_ASSERT("Manager is not stopped, cannot destroy.", m_state == STATE_STOPPED || m_state == STATE_CREATED);
+
+    m_objectParser->destroyConfig();
+    this->destroyCreatedServices();
+
+    OSLM_INFO("Parsing OSR after destroying the config :" << std::endl
+            << ::fwServices::OSR::getRegistryInformation());
+
+    m_objectParser.reset();
+    m_cfgElem.reset();
+    m_configuredObject.reset();
+
+    m_state = STATE_DESTROYED;
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::launch()
+{
+    this->create();
+    this->start();
+    this->update();
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::stopAndDestroy()
+{
+    this->stop();
+    this->destroy();
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::createConnections()
+{
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  m_cfgElem->getElements())
+    {
+        if (elem->getName() == "connect")
+        {
+            this->createConnection(elem);
+        }
+        else if (elem->getName() == "proxy")
+        {
+            this->createProxy(elem);
+        }
+    }
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::createConnection(::fwRuntime::ConfigurationElement::csptr connectionCfg)
+{
+    typedef std::pair< std::string, ::fwCom::Signals::SignalKeyType > SignalInfoType;
+    typedef std::pair< std::string, ::fwCom::Slots::SlotKeyType > SlotInfoType;
+    typedef std::vector< SlotInfoType > SlotInfoContainerType;
+
+    SignalInfoType signalInfo;
+    SlotInfoContainerType slotInfos;
+
+    ::boost::regex re("(.*)/(.*)");
+    ::boost::smatch match;
+    std::string src, uid, key;
+
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  connectionCfg->getElements())
+    {
+        src = elem->getValue();
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            uid.assign(match[1].first, match[1].second);
+            key.assign(match[2].first, match[2].second);
+
+            OSLM_ASSERT(src << " configuration is not correct for "<< elem->getName() ,
+                        !uid.empty() && !key.empty());
+
+            if (elem->getName() == "signal")
+            {
+                SLM_ASSERT("There must be only one signal by connection",
+                           signalInfo.first.empty() && signalInfo.second.empty());
+                signalInfo = std::make_pair(uid, key);
+            }
+            else if (elem->getName() == "slot")
+            {
+                slotInfos.push_back( std::make_pair(uid, key) );
+            }
+        }
+    }
+
+    ::fwTools::Object::sptr sigSource = ::fwTools::fwID::getObject(signalInfo.first);
+    ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(sigSource);
+
+    SLM_ASSERT("Signal source not found" << signalInfo.first , sigSource);
+    SLM_ASSERT("invalid signal source " << signalInfo.first , hasSignals);
+
+    BOOST_FOREACH(SlotInfoType slotInfo,  slotInfos)
+    {
+        ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(slotInfo.first);
+        ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+        SLM_ASSERT("invalid slot owner " << slotInfo.first , hasSlots);
+
+        m_connections->connect(hasSignals, signalInfo.second, hasSlots, slotInfo.second);
+    }
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::createProxy(::fwRuntime::ConfigurationElement::csptr config)
+{
+    ::boost::regex re("(.*)/(.*)");
+    ::boost::smatch match;
+    std::string src, uid, key;
+
+    ::fwServices::registry::Proxy::sptr proxy = ::fwServices::registry::Proxy::getDefault();
+
+    SLM_ASSERT("Missing 'channel' attribute", config->hasAttribute("channel"));
+    std::string channel = config->getAttributeValue("channel");
+    ProxyConnections proxyCnt(channel);
+
+    BOOST_FOREACH(::fwRuntime::ConfigurationElement::csptr elem,  config->getElements())
+    {
+        src = elem->getValue();
+        if( ::boost::regex_match(src, match, re) )
+        {
+            OSLM_ASSERT("Wrong value for attribute src: "<<src, match.size() >= 3);
+            uid.assign(match[1].first, match[1].second);
+            key.assign(match[2].first, match[2].second);
+
+            OSLM_ASSERT(src << " configuration is not correct for "<< elem->getName() ,
+                        !uid.empty() && !key.empty());
+
+            ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(uid);
+
+            if (elem->getName() == "signal")
+            {
+                ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(obj);
+                ::fwCom::SignalBase::sptr sig = hasSignals->signal(key);
+                proxy->connect(channel, sig);
+                proxyCnt.addSignalConnection(uid, key);
+            }
+            else if (elem->getName() == "slot")
+            {
+                ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+                ::fwCom::SlotBase::sptr slot = hasSlots->slot(key);
+                proxy->connect(channel, slot);
+                proxyCnt.addSlotConnection(uid, key);
+            }
+        }
+    }
+    m_vectProxyCtns.push_back(proxyCnt);
+}
+
+// ------------------------------------------------------------------------
+
+void AppConfigManager::destroyProxies()
+{
+    ::fwServices::registry::Proxy::sptr proxy = ::fwServices::registry::Proxy::getDefault();
+    BOOST_FOREACH(ProxyConnectionsVectType::value_type proxyConnections,  m_vectProxyCtns)
+    {
+        BOOST_FOREACH(ProxyConnections::ProxyEltType signalElt, proxyConnections.m_signals)
+        {
+            ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(signalElt.first);
+            ::fwCom::HasSignals::sptr hasSignals = ::boost::dynamic_pointer_cast< ::fwCom::HasSignals >(obj);
+            ::fwCom::SignalBase::sptr sig = hasSignals->signal(signalElt.second);
+            proxy->disconnect(proxyConnections.m_channel, sig);
+        }
+        BOOST_FOREACH(ProxyConnections::ProxyEltType slotElt, proxyConnections.m_slots)
+        {
+            ::fwTools::Object::sptr obj = ::fwTools::fwID::getObject(slotElt.first);
+            ::fwCom::HasSlots::sptr hasSlots = ::boost::dynamic_pointer_cast< ::fwCom::HasSlots >(obj);
+            ::fwCom::SlotBase::sptr slot = hasSlots->slot(slotElt.second);
+            proxy->disconnect(proxyConnections.m_channel, slot);
+        }
+    }
+    m_vectProxyCtns.clear();
+}
+
+}
diff --git a/SrcLib/core/fwServices/src/fwServices/IController.cpp b/SrcLib/core/fwServices/src/fwServices/IController.cpp
new file mode 100644
index 0000000..6a00015
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/IController.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwServices/IController.hpp"
+
+namespace fwServices
+{
+
+//-----------------------------------------------------------------------------
+
+IController::IController()
+{}
+
+//-----------------------------------------------------------------------------
+
+IController::~IController() 
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwServices/src/fwServices/IEditionService.cpp b/SrcLib/core/fwServices/src/fwServices/IEditionService.cpp
new file mode 100644
index 0000000..0eda922
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/IEditionService.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwServices/IEditionService.hpp"
+#include "fwServices/macros.hpp"
+#include "fwServices/ObjectMsg.hpp"
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/op/Get.hpp"
+
+namespace fwServices
+{
+
+//-----------------------------------------------------------------------------
+
+void IEditionService::notify(
+        ::fwServices::IService::sptr _pSource,
+        ::fwData::Object::sptr _pSubject,
+        ::fwServices::ObjectMsg::sptr _pMsg)
+{
+
+    _pMsg->setSource(_pSource);
+    _pMsg->setSubject(_pSubject);
+    _pMsg->timeModified();
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = _pSubject->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    IService::ReceiveSlotType::sptr slot =  _pSource->slot< IService::ReceiveSlotType >( IService::s_RECEIVE_SLOT );
+
+    fwServicesBlockAndNotifyMsgMacro( _pSource->getLightID(), sig, _pMsg, slot );
+}
+
+//-----------------------------------------------------------------------------
+
+void IEditionService::notify(
+        ::fwServices::IService::sptr _pSource,
+        ::fwData::Object::sptr _pSubject,
+        ::fwServices::ObjectMsg::sptr _pMsg,
+         bool _allowLoops )
+{
+
+    _pMsg->setSource(_pSource);
+    _pMsg->setSubject(_pSubject);
+    _pMsg->timeModified();
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = _pSubject->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    if( _allowLoops )
+    {
+        fwServicesNotifyMsgMacro( _pSource->getLightID(), sig, _pMsg );
+    }
+    else
+    {
+        IService::ReceiveSlotType::sptr slot =  _pSource->slot< IService::ReceiveSlotType >( IService::s_RECEIVE_SLOT );
+        fwServicesBlockAndNotifyMsgMacro( _pSource->getLightID(), sig, _pMsg, slot );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+IEditionService::IEditionService()
+{}
+
+//-----------------------------------------------------------------------------
+
+IEditionService::~IEditionService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwServices/src/fwServices/IService.cpp b/SrcLib/core/fwServices/src/fwServices/IService.cpp
new file mode 100644
index 0000000..405d4c3
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/IService.cpp
@@ -0,0 +1,397 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/property_tree/ptree.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/Convert.hpp>
+
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include "fwServices/IService.hpp"
+#include "fwServices/IEditionService.hpp"
+#include "fwServices/registry/ObjectService.hpp"
+#include "fwServices/registry/ActiveWorkers.hpp"
+#include "fwServices/Base.hpp"
+
+namespace fwServices
+{
+
+//-----------------------------------------------------------------------------
+
+const ::fwCom::Slots::SlotKeyType IService::s_START_SLOT = "start";
+const ::fwCom::Slots::SlotKeyType IService::s_STOP_SLOT = "stop";
+const ::fwCom::Slots::SlotKeyType IService::s_UPDATE_SLOT = "update";
+const ::fwCom::Slots::SlotKeyType IService::s_RECEIVE_SLOT = "receive";
+const ::fwCom::Slots::SlotKeyType IService::s_SWAP_SLOT = "swap";
+
+//-----------------------------------------------------------------------------
+
+IService::IService() :
+    m_configuration ( new ::fwRuntime::EConfigurationElement("EmptyConfigurationElement") ),
+    m_globalState ( STOPPED ),
+    m_updatingState ( NOTUPDATING ),
+    m_configurationState ( UNCONFIGURED )
+{
+    // by default a weak_ptr have a use_count == 0
+
+    m_slotStart    = ::fwCom::newSlot( &IService::start     , this ) ;
+    m_slotStop     = ::fwCom::newSlot( &IService::stop      , this ) ;
+    m_slotUpdate   = ::fwCom::newSlot( &IService::update    , this ) ;
+    m_slotReceive  = ::fwCom::newSlot( &IService::receive   , this ) ;
+    m_slotSwap     = ::fwCom::newSlot( &IService::swap      , this ) ;
+
+    ::fwCom::HasSlots::m_slots
+                 ( s_START_SLOT   , m_slotStart   )
+                 ( s_STOP_SLOT    , m_slotStop    )
+                 ( s_UPDATE_SLOT  , m_slotUpdate  )
+                 ( s_RECEIVE_SLOT , m_slotReceive )
+                 ( s_SWAP_SLOT    , m_slotSwap    )
+                 ;
+#ifdef COM_LOG
+    ::fwCom::HasSlots::m_slots.setID();
+    ::fwCom::HasSignals::m_signals.setID();
+#endif
+
+    this->setWorker( registry::ActiveWorkers::getDefault()->getWorker( registry::ActiveWorkers::s_DEFAULT_WORKER ) );
+}
+
+//-----------------------------------------------------------------------------
+
+IService::~IService()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IService::info( std::ostream &_sstream )
+{}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::sptr IService::getObject()
+{
+    SLM_ASSERT("Associated Object of " <<this->getID()<<" ["<<this->getClassname()<<"] is expired", !m_associatedObject.expired() );
+    return m_associatedObject.lock();
+}
+
+//-----------------------------------------------------------------------------
+
+void displayPt(::boost::property_tree::ptree &pt, std::string indent = "")
+{
+    OSLM_ERROR(indent << " data : '" << pt.data() << "'" );
+
+    BOOST_FOREACH( ::boost::property_tree::ptree::value_type &v, pt)
+    {
+        OSLM_ERROR((indent + "  '") << v.first << "':" );
+        displayPt(v.second , indent + "      ");
+
+    }
+}
+
+void IService::setConfiguration(const ::fwRuntime::ConfigurationElement::sptr _cfgElement)
+{
+    SLM_ASSERT( "Invalid ConfigurationElement", _cfgElement ) ;
+    m_configuration = _cfgElement ;
+    m_configurationState = UNCONFIGURED ;
+}
+
+//-----------------------------------------------------------------------------
+
+void IService::setConfiguration( const ConfigType &ptree )
+{
+    ::fwRuntime::ConfigurationElement::sptr ce;
+
+    ce = ::fwRuntime::Convert::fromPropertyTree(ptree);
+
+    SLM_ASSERT( "Invalid ConfigurationElement", ce );
+
+    this->setConfiguration(ce);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::sptr IService::getConfiguration() const
+{
+    return m_configuration ;
+}
+
+//-----------------------------------------------------------------------------
+
+IService::ConfigType IService::getConfigTree() const
+{
+    return ::fwRuntime::Convert::toPropertyTree(this->getConfiguration());
+}
+
+
+////-----------------------------------------------------------------------------
+//
+//bool IService::checkConfiguration()
+//{
+//    ::std::stringstream stream ;
+//    bool checkingResult = ::fwServices::validation::checkService( this->className() , this->m_configuration , stream ) ;
+//    OSLM_TRACE("Configuration checking result for" << this->className() << " : " << stream.str() ) ;
+//    return checkingResult ;
+//}
+
+//-----------------------------------------------------------------------------
+
+void IService::configure()
+{
+    //SLM_ASSERT( "Configuration is not correct", this->checkConfiguration() );
+    if( m_configurationState == UNCONFIGURED )
+    {
+        m_configurationState = CONFIGURING ;
+        if( m_globalState == STOPPED )
+        {
+            this->configuring();
+        }
+        else if( m_globalState == STARTED )
+        {
+            this->reconfiguring();
+        }
+        m_configurationState = CONFIGURED ;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IService::reconfiguring() throw ( ::fwTools::Failed )
+{
+    OSLM_FATAL("If this method (reconfiguring) is called, it must be overrided in the implementation ("<<this->getClassname()<<", "<< this->getID() <<")" );
+}
+
+//-----------------------------------------------------------------------------
+
+IService::SharedFutureType IService::start() //throw( ::fwTools::Failed)
+{
+    if( !m_associatedWorker || ::fwThread::getCurrentThreadId() == m_associatedWorker->getThreadId() )
+    {
+        OSLM_FATAL_IF("Service "<<this->getID()<<" already started", m_globalState != STOPPED);
+
+        PackagedTaskType task( ::boost::bind(&IService::starting, this) );
+        UniqueFutureType ufuture = task.get_future();
+
+        m_globalState = STARTING ;
+        task() ;
+        m_globalState = STARTED ;
+
+        if ( ufuture.has_exception() )
+        {
+            ufuture.get();
+        }
+        return ::boost::move(ufuture);
+    }
+    else
+    {
+        return m_slotStart->asyncRun();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+IService::SharedFutureType IService::stop() //throw( ::fwTools::Failed)
+{
+    if( !m_associatedWorker || ::fwThread::getCurrentThreadId() == m_associatedWorker->getThreadId() )
+    {
+        OSLM_FATAL_IF("Service "<<this->getID()<<" already stopped", m_globalState != STARTED);
+
+        PackagedTaskType task( ::boost::bind(&IService::stopping, this) );
+        UniqueFutureType ufuture = task.get_future();
+
+        m_globalState = STOPPING ;
+        task() ;
+        m_globalState = STOPPED ;
+
+        if ( ufuture.has_exception() )
+        {
+            ufuture.get();
+        }
+        return ::boost::move(ufuture);
+    }
+    else
+    {
+        return m_slotStop->asyncRun();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IService::receive( ::fwServices::ObjectMsg::csptr _msg )
+{
+    if( !m_associatedWorker || ::fwThread::getCurrentThreadId() == m_associatedWorker->getThreadId() )
+    {
+        OSLM_COM("Receive " << _msg->getLightID() << "::" << _msg->getEventIds()[0] << " ( "<< this->getLightID() <<" )" );
+        OSLM_FATAL_IF("IService::receive : "<<this->getID()<<" is stopped and cannot manages messages.", m_globalState != STARTED);
+        this->receiving( _msg );
+    }
+    else
+    {
+        m_slotReceive->asyncRun(_msg);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+IService::SharedFutureType IService::update() //throw( ::fwTools::Failed)
+{
+    if( !m_associatedWorker || ::fwThread::getCurrentThreadId() == m_associatedWorker->getThreadId() )
+    {
+        OSLM_ASSERT("INVOKING update WHILE STOPPED ("<<m_globalState<<") on this = " << this->className(), m_globalState == STARTED );
+        OSLM_ASSERT("INVOKING update WHILE NOT IDLE ("<<m_updatingState<<") on this = " << this->className(), m_updatingState == NOTUPDATING );
+
+        PackagedTaskType task( ::boost::bind(&IService::updating, this) );
+        UniqueFutureType ufuture = task.get_future();
+
+        m_updatingState = UPDATING ;
+        task() ;
+        m_updatingState = NOTUPDATING ;
+
+        if ( ufuture.has_exception() )
+        {
+            ufuture.get();
+        }
+        return ::boost::move(ufuture);
+    }
+    else
+    {
+        return m_slotUpdate->asyncRun();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+IService::SharedFutureType IService::swap( ::fwData::Object::sptr _obj ) //throw(::fwTools::Failed)
+{
+    if( !m_associatedWorker || ::fwThread::getCurrentThreadId() == m_associatedWorker->getThreadId() )
+    {
+        OSLM_ASSERT("Swapping on "<< this->getID() << " with same Object " << _obj->getID(), m_associatedObject.lock() != _obj );
+        OSLM_FATAL_IF( "Service "<< this->getID() << " is not STARTED, no swapping with Object " << _obj->getID(), m_globalState != STARTED);
+
+        PackagedTaskType task( ::boost::bind(&IService::swapping, this) );
+        UniqueFutureType ufuture = task.get_future();
+
+        m_globalState = SWAPPING;
+        ::fwServices::OSR::swapService( _obj , this->getSptr() );
+        task() ;
+        m_globalState = STARTED;
+
+        if ( ufuture.has_exception() )
+        {
+            ufuture.get();
+        }
+        return ::boost::move(ufuture);
+    }
+    else
+    {
+        return m_slotSwap->asyncRun( _obj );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void IService::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    SLM_FATAL("TODO : This method must be implemented");
+}
+
+//-----------------------------------------------------------------------------
+
+IService::GlobalStatus IService::getStatus() const throw()
+{
+    return m_globalState ;
+}
+
+//-----------------------------------------------------------------------------
+
+bool IService::isStarted() const throw()
+{
+    return (m_globalState == STARTED) ;
+}
+
+//-----------------------------------------------------------------------------
+
+bool IService::isStopped() const throw()
+{
+    return (m_globalState == STOPPED) ;
+}
+
+//-----------------------------------------------------------------------------
+
+IService::ConfigurationStatus IService::getConfigurationStatus() const throw()
+{
+    return m_configurationState ;
+}
+
+//-----------------------------------------------------------------------------
+
+IService::UpdatingStatus IService::getUpdatingStatus() const throw()
+{
+    return m_updatingState ;
+}
+
+//-----------------------------------------------------------------------------
+
+void IService::setWorker( ::fwThread::Worker::sptr worker )
+{
+    m_associatedWorker = worker;
+    ::fwCom::HasSlots::m_slots.setWorker( m_associatedWorker );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwThread::Worker::sptr IService::getWorker() const
+{
+    return m_associatedWorker;
+}
+
+//-----------------------------------------------------------------------------
+
+IService::KeyConnectionsType IService::getObjSrvConnections() const
+{
+    KeyConnectionsType connections;
+    connections.push_back( std::make_pair( ::fwData::Object::s_OBJECT_MODIFIED_SIG, s_RECEIVE_SLOT ) );
+    return connections;
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef COM_LOG
+void IService::setID( ::fwTools::fwID::IDType newID )
+{
+    if( ! this->hasID() ||
+        this->getID( ::fwTools::fwID::MUST_EXIST ) != newID )
+    {
+        this->::fwTools::fwID::setID( newID );
+    }
+
+    std::string lightID = this->getLightID( ::fwTools::fwID::MUST_EXIST );
+
+    ::fwCom::HasSlots::m_slots.setID( lightID + "::" );
+    ::fwCom::HasSignals::m_signals.setID( lightID + "::" );
+}
+#endif
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief Streaming a service
+ * @see IService::operator<<(std::ostream & _ostream, IService& _service)
+ * @note Invoke IService::info( std::ostream )
+ */
+std::ostream & operator<<(std::ostream & _ostream, IService& _service)
+{
+    _service.info( _ostream ) ;
+    return _ostream ;
+}
+
+
+}
+
diff --git a/SrcLib/core/fwServices/src/fwServices/IXMLParser.cpp b/SrcLib/core/fwServices/src/fwServices/IXMLParser.cpp
new file mode 100644
index 0000000..ee85b32
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/IXMLParser.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwServices/IXMLParser.hpp"
+
+
+
+namespace fwServices
+{
+
+IXMLParser::IXMLParser( )
+{}
+
+IXMLParser::~IXMLParser()
+{}
+
+void IXMLParser::starting() throw(::fwTools::Failed)
+{}
+
+void IXMLParser::stopping() throw(::fwTools::Failed)
+{}
+
+void IXMLParser::configuring() throw(::fwTools::Failed)
+{}
+
+void IXMLParser::receiving( fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{}
+
+void IXMLParser::updating() throw(::fwTools::Failed)
+{
+    ::fwRuntime::ConfigurationElement::Iterator configEltIter;
+    for(configEltIter = this->m_configuration->begin() ; !(configEltIter == this->m_configuration->end()) ; ++configEltIter)
+    {
+        SLM_ASSERT("ACH => still used ?", (*configEltIter)->getName() != "object" );
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::setObjectConfig( ::fwRuntime::ConfigurationElement::csptr _cfgElem )
+{
+    m_cfg = _cfgElem;
+}
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::createConfig( ::fwTools::Object::sptr _obj )
+{}
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::startConfig()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::updateConfig()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::stopConfig()
+{}
+
+//-----------------------------------------------------------------------------
+
+void IXMLParser::destroyConfig()
+{}
+
+//-----------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/core/fwServices/src/fwServices/ObjectMsg.cpp b/SrcLib/core/fwServices/src/fwServices/ObjectMsg.cpp
new file mode 100644
index 0000000..98c0a2d
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/ObjectMsg.cpp
@@ -0,0 +1,254 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+
+#include <boost/regex.hpp>
+
+#include "fwServices/ObjectMsg.hpp"
+#include "fwServices/IService.hpp"
+#include "fwServices/registry/message/macros.hpp"
+
+fwServicesMessageRegisterMacro( ::fwServices::ObjectMsg );
+
+namespace fwServices
+{
+
+std::string ObjectMsg::NEW_OBJECT     = "ObjectMsg::NEW_OBJECT";
+std::string ObjectMsg::UPDATED_OBJECT = "ObjectMsg::UPDATED_OBJECT";
+std::string ObjectMsg::DELETE_OBJECT  = "ObjectMsg::DELETE_OBJECT";
+
+std::string ObjectMsg::ADDED_FIELDS   = "ADDED_FIELDS";
+std::string ObjectMsg::REMOVED_FIELDS = "REMOVED_FIELDS";
+std::string ObjectMsg::CHANGED_FIELDS = "CHANGED_FIELDS";
+
+//-----------------------------------------------------------------------------
+
+ObjectMsg::ObjectMsg(::fwServices::ObjectMsg::Key key) : m_hasCallback (false)
+{}
+
+//-----------------------------------------------------------------------------
+
+ObjectMsg::ObjectMsg() : m_hasCallback (false)
+{}
+
+//-----------------------------------------------------------------------------
+
+ObjectMsg::~ObjectMsg()
+{
+    if ( m_hasCallback )
+    {
+        m_callback();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::addEvent( std::string _eventId , ::fwData::Object::csptr _pDataInfo )
+{
+    m_eventId2DataInfo[ _eventId ] = _pDataInfo;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ObjectMsg::hasEvent( std::string _eventId ) const
+{
+    return m_eventId2DataInfo.find( _eventId ) != m_eventId2DataInfo.end() ;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > ObjectMsg::getEventIds() const
+{
+    std::vector< std::string > result ;
+    std::map< std::string , ::fwData::Object::csptr >::const_iterator iter ;
+    for( iter = m_eventId2DataInfo.begin() ; iter != m_eventId2DataInfo.end() ; ++iter )
+    {
+        result.push_back( iter->first ) ;
+    }
+    return result ;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::csptr ObjectMsg::getDataInfo( std::string _eventId ) const
+{
+    return m_eventId2DataInfo.find( _eventId )->second;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string ObjectMsg::convertToLightString( std::string _initialString )
+{
+    std::string lightString = _initialString;
+
+    ::boost::regex toolsRegex ("::fwTools::(.*)");
+    ::boost::regex dataRegex ("::fwData::(.*)");
+    const std::string machine_format("\\1");
+
+    if ( ::boost::regex_match( _initialString, toolsRegex ) )
+    {
+        lightString = ::boost::regex_replace( _initialString, toolsRegex, machine_format, boost::match_default | boost::format_sed );
+    }
+    else if ( ::boost::regex_match( _initialString, dataRegex ) )
+    {
+        lightString = ::boost::regex_replace( _initialString, dataRegex, machine_format, boost::match_default | boost::format_sed );
+    }
+
+    return lightString;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string ObjectMsg::getGeneralInfo() const
+{
+    ::fwServices::IService::sptr source = m_source.lock();
+    std::string msgUUID    = convertToLightString( const_cast< ObjectMsg * >(this)->getID() );
+
+    std::string sourceUUID = convertToLightString( source? source->getID():"[source died]" );
+    std::string destUUID   = convertToLightString( m_subject.expired()?"[subject died]":m_subject.lock()->getID());
+
+    std::stringstream eventstream;
+    for(    std::map< std::string, ::fwData::Object::csptr >::const_iterator itEvent2Data = m_eventId2DataInfo.begin();
+            itEvent2Data != m_eventId2DataInfo.end();
+            ++itEvent2Data )
+    {
+        eventstream << "| " << itEvent2Data->first << " |";
+    }
+
+
+    std::stringstream sstream;
+    sstream << msgUUID << " | " << sourceUUID << " ===> " << destUUID << eventstream.str();
+
+    return sstream.str();
+}
+
+//-----------------------------------------------------------------------------
+
+std::ostream & operator<<(std::ostream & _ostream, const ObjectMsg& _message)
+{
+    _message.info( _ostream ) ;
+    return _ostream ;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::info(std::ostream &_sstream ) const
+{
+    _sstream << getGeneralInfo();
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::setSource(::fwServices::IService::wptr _source)
+{
+    m_source = _source;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwServices::IService::wptr ObjectMsg::getSource() const
+{
+    return m_source;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::setSubject( ::fwData::Object::wptr _subject)
+{
+    m_subject = _subject;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwData::Object::wptr ObjectMsg::getSubject() const
+{
+    return m_subject;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::setMessageCallback( MessageCallbackType callback )
+{
+    m_callback = callback;
+    m_hasCallback = true;
+}
+
+//-------------------------------------------------------------------------
+
+void ObjectMsg::appendAddedField( const FieldNameType &fieldName, ::fwData::Object::sptr object )
+{
+    if( ! this->hasEvent( ADDED_FIELDS ) )
+    {
+        this->addEvent( ADDED_FIELDS );
+    }
+
+    SLM_ASSERT("This field is already registered", m_addedFields.find(fieldName) == m_addedFields.end() );
+
+    m_addedFields[ fieldName ] = object;
+}
+
+//-----------------------------------------------------------------------------
+
+const ObjectMsg::ModifiedFieldsContainerType & ObjectMsg::getAddedFields() const
+{
+    return m_addedFields;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::appendRemovedField( const FieldNameType &fieldName, ::fwData::Object::sptr object )
+{
+    if( ! this->hasEvent( REMOVED_FIELDS ) )
+    {
+        this->addEvent( REMOVED_FIELDS );
+    }
+
+    SLM_ASSERT("This field is already registered", m_removedFields.find(fieldName) == m_removedFields.end() );
+
+    m_removedFields[ fieldName ] = object;
+}
+
+//-----------------------------------------------------------------------------
+
+const ObjectMsg::ModifiedFieldsContainerType& ObjectMsg::getRemovedFields() const
+{
+    return m_removedFields;
+}
+
+//-----------------------------------------------------------------------------
+
+void ObjectMsg::appendChangedField( const FieldNameType &fieldName, ::fwData::Object::sptr oldObject, ::fwData::Object::sptr newObject )
+{
+    if( ! this->hasEvent( CHANGED_FIELDS ) )
+    {
+        this->addEvent( CHANGED_FIELDS );
+    }
+
+    SLM_ASSERT("This field is already registered", m_oldChangedFields.find(fieldName) == m_oldChangedFields.end() );
+
+    m_oldChangedFields[ fieldName ] = oldObject;
+    m_newChangedFields[ fieldName ] = newObject;
+}
+
+//-----------------------------------------------------------------------------
+
+const ObjectMsg::ModifiedFieldsContainerType& ObjectMsg::getOldChangedFields() const
+{
+    return m_oldChangedFields;
+}
+
+//-----------------------------------------------------------------------------
+
+const ObjectMsg::ModifiedFieldsContainerType& ObjectMsg::getNewChangedFields() const
+{
+    return m_newChangedFields;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/SConfigController.cpp b/SrcLib/core/fwServices/src/fwServices/SConfigController.cpp
new file mode 100644
index 0000000..e24149c
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/SConfigController.cpp
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include "fwServices/SConfigController.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::IController, ::fwServices::SConfigController, ::fwData::Object );
+
+//------------------------------------------------------------------------------
+
+SConfigController::SConfigController() throw()
+{
+    m_configLauncher = ::fwServices::helper::ConfigLauncher::New();
+}
+
+//------------------------------------------------------------------------------
+
+SConfigController::~SConfigController() throw()
+{}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::starting() throw(::fwTools::Failed)
+{
+    m_configLauncher->startConfig(this->getSptr());
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::stopping() throw(::fwTools::Failed)
+{
+    m_configLauncher->stopConfig();
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::configuring() throw(fwTools::Failed)
+{
+    m_configLauncher->parseConfig(this->getConfigTree());
+}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::updating() throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+{}
+
+//------------------------------------------------------------------------------
+
+void SConfigController::info( std::ostream &_sstream )
+{
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/core/fwServices/src/fwServices/factory/message/new.cpp b/SrcLib/core/fwServices/src/fwServices/factory/message/new.cpp
new file mode 100644
index 0000000..7439e03
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/factory/message/new.cpp
@@ -0,0 +1,33 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwServices/ObjectMsg.hpp"
+
+#include "fwServices/factory/message/new.hpp"
+
+
+namespace fwServices
+{
+
+namespace factory
+{
+
+namespace message
+{
+
+::fwServices::ObjectMsg::sptr New( const ::fwServices::registry::message::KeyType & classname )
+{
+    ::fwServices::ObjectMsg::sptr obj = ::fwServices::registry::message::get()->create(classname);
+    return obj;
+}
+
+} // namespace message
+
+} // namespace factory
+
+} // namespace fwServices
+
+
diff --git a/SrcLib/core/fwServices/src/fwServices/helper/ConfigLauncher.cpp b/SrcLib/core/fwServices/src/fwServices/helper/ConfigLauncher.cpp
new file mode 100644
index 0000000..595ee59
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/helper/ConfigLauncher.cpp
@@ -0,0 +1,171 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/Base.hpp>
+#include <fwServices/registry/AppConfig.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+
+#include <fwDataCamp/getObject.hpp>
+
+#include "fwServices/helper/ConfigLauncher.hpp"
+
+namespace fwServices
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+const std::string ConfigLauncher::s_SELF_KEY = "self";
+const std::string ConfigLauncher::s_GENERIC_UID_KEY = "GENERIC_UID";
+//------------------------------------------------------------------------------
+
+ConfigLauncher::ConfigLauncher() : m_configIsRunning(false)
+{}
+
+//------------------------------------------------------------------------------
+
+ConfigLauncher::~ConfigLauncher()
+{}
+
+//------------------------------------------------------------------------------
+
+void ConfigLauncher::parseConfig(const ::fwServices::IService::ConfigType& config)
+{
+    if(config.get_child("service").count("config") > 0)
+    {
+        SLM_ASSERT("Sorry you must have one (and only one) <config/> element.",
+                config.get_child("service").count("config") == 1 );
+        const ::fwServices::IService::ConfigType srvconfig = config.get_child("service");
+        const ::fwServices::IService::ConfigType &config = srvconfig.get_child("config");
+
+        if(config.count("appConfig") == 1 )
+        {
+            const ::fwServices::IService::ConfigType &appConfig = config.get_child("appConfig");
+            m_appConfig = ::fwActivities::registry::ActivityAppConfig(appConfig);
+        }
+        OSLM_ASSERT("At most 1 <appConfig> tag is allowed", config.count("appConfig") < 2);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigLauncher::startConfig(::fwServices::IService::sptr srv)
+{
+    ::fwData::Object::sptr currentObj = srv->getObject();
+    typedef ::fwActivities::registry::ActivityAppConfig AppConfig;
+    ::fwServices::registry::AppConfig::FieldAdaptorType replaceMap;
+
+    // Generate generic UID
+    const std::string genericUidAdaptor = ::fwServices::registry::AppConfig::getUniqueIdentifier( srv->getID() );
+    replaceMap[ConfigLauncher::s_GENERIC_UID_KEY] = genericUidAdaptor;
+
+    BOOST_FOREACH(const AppConfig::ActivityAppConfigParamsType::value_type& param, m_appConfig.parameters)
+    {
+        if(!param.isSeshat())
+        {
+            std::string by = param.by;
+            if(by == ConfigLauncher::s_SELF_KEY)
+            {
+                by = currentObj->getID();
+            }
+            replaceMap[param.replace] = by;
+        }
+        else
+        {
+            std::string parameterToReplace = param.by;
+            if (parameterToReplace.substr(0,1) == "!")
+            {
+                parameterToReplace.replace(0, 1, "@");
+            }
+
+            ::fwData::Object::sptr obj = ::fwDataCamp::getObject(currentObj, param.by);
+            OSLM_ASSERT("Invalid seshat path : '"<<param.by<<"'", obj);
+            ::fwData::String::sptr stringParameter = ::fwData::String::dynamicCast(obj);
+
+            std::string parameterValue = obj->getID();
+
+            if(stringParameter && param.by.substr(0,1) == "!")
+            {
+                parameterValue = stringParameter->getValue();
+            }
+            replaceMap[param.replace] = parameterValue;
+        }
+    }
+
+    // Init manager
+    ::fwRuntime::ConfigurationElement::csptr config =
+            ::fwServices::registry::AppConfig::getDefault()->getAdaptedTemplateConfig( m_appConfig.id, replaceMap );
+    m_appConfigManager = ::fwServices::AppConfigManager::New();
+    m_appConfigManager->setConfig( config );
+
+    // Launch config
+    m_appConfigManager->launch();
+
+    // Add connection
+    this->connectToConfigRoot(srv);
+
+    m_configIsRunning = true;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigLauncher::stopConfig()
+{
+    if( m_configIsRunning )
+    {
+        // Remove connection
+        this->disconnectToConfigRoot();
+
+        // Delete manager
+        m_appConfigManager->stopAndDestroy();
+        m_appConfigManager.reset();
+    }
+    m_configIsRunning = false;
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigLauncher::connectToConfigRoot(::fwServices::IService::sptr srv)
+{
+    ::fwData::Object::sptr root = m_appConfigManager->getConfigRoot();
+    m_connections = ::fwServices::helper::SigSlotConnection::New();
+    m_connections->connect( root, srv->getSptr(), srv->getObjSrvConnections() );
+}
+
+//------------------------------------------------------------------------------
+
+void ConfigLauncher::disconnectToConfigRoot()
+{
+    m_connections->disconnect();
+    m_connections.reset();
+}
+
+//------------------------------------------------------------------------------
+
+bool ConfigLauncher::isExecutable(::fwData::Object::sptr currentObj)
+{
+    typedef ::fwActivities::registry::ActivityAppConfig AppConfig;
+    bool executable = true;
+    BOOST_FOREACH(const AppConfig::ActivityAppConfigParamsType::value_type& param, m_appConfig.parameters)
+    {
+        if(param.isSeshat())
+        {
+            std::string by = param.by;
+            executable &= ::fwDataCamp::getObject(currentObj, param.by, false).get() != 0;
+        }
+    }
+
+    return executable;
+}
+
+//------------------------------------------------------------------------------
+
+} // helper
+} // fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/helper/SigSlotConnection.cpp b/SrcLib/core/fwServices/src/fwServices/helper/SigSlotConnection.cpp
new file mode 100644
index 0000000..93f99ab
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/helper/SigSlotConnection.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwCom/SignalBase.hpp>
+
+#include "fwServices/helper/SigSlotConnection.hpp"
+
+namespace fwServices
+{
+namespace helper
+{
+
+SigSlotConnection::SigSlotConnection()
+{}
+
+SigSlotConnection::~SigSlotConnection()
+{
+    this->disconnect();
+}
+
+void SigSlotConnection::connect(  ::fwCom::HasSignals::sptr hasSignals, ::fwCom::Signals::SignalKeyType signalKey,
+                                  ::fwCom::HasSlots::sptr hasSlots, ::fwCom::Slots::SlotKeyType slotKey )
+{
+    ::fwCom::Connection connection;
+    connection = hasSignals->signal( signalKey )->connect( hasSlots->slot( slotKey ) );
+    m_connections.push_back(connection);
+}
+
+void SigSlotConnection::connect(::fwCom::HasSignals::sptr hasSignals,
+                                ::fwCom::HasSlots::sptr hasSlots,
+                                const KeyConnectionsType & keyConnections )
+{
+    ::fwCom::Connection connection;
+    BOOST_FOREACH( KeyConnectionType keys, keyConnections )
+    {
+        connection = hasSignals->signal( keys.first )->connect( hasSlots->slot( keys.second ) );
+        m_connections.push_back(connection);
+    }
+}
+
+void SigSlotConnection::disconnect()
+{
+    BOOST_REVERSE_FOREACH( ::fwCom::Connection & connection, m_connections )
+    {
+        connection.disconnect();
+    }
+    m_connections.clear();
+}
+
+} // end namespace helper
+} // end namespace fwServices
diff --git a/SrcLib/core/fwServices/src/fwServices/op/Add.cpp b/SrcLib/core/fwServices/src/fwServices/op/Add.cpp
new file mode 100644
index 0000000..a5ef0f4
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/op/Add.cpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+#include <boost/lexical_cast.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include "fwServices/Base.hpp"
+#include "fwServices/IService.hpp"
+#include "fwServices/op/Add.hpp"
+#include "fwServices/registry/ServiceFactory.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+
+::fwServices::IService::sptr add( ::fwData::Object::sptr obj,
+                                  std::string serviceType,
+                                  std::string _implementationId,
+                                  std::string uid)
+{
+    ::fwServices::IService::sptr srv;
+    srv = ::fwServices::registry::ServiceFactory::getDefault()->create( serviceType, _implementationId );
+    ::fwServices::OSR::registerService( obj , srv );
+    if(!uid.empty())
+    {
+#ifndef COM_LOG
+        OSLM_ASSERT( "Try to set ID: "<<uid<<" but already has an ID: "<<srv->getID(), !srv->hasID() );
+#endif
+        srv->setID( uid ) ;
+    }
+    return srv ;
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/core/fwServices/src/fwServices/op/Get.cpp b/SrcLib/core/fwServices/src/fwServices/op/Get.cpp
new file mode 100644
index 0000000..f593709
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/op/Get.cpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+
+#include "fwServices/IService.hpp"
+#include "fwServices/op/Get.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+
+::fwServices::IService::sptr get( ::fwData::Object::sptr obj, std::string serviceType ) throw(fwTools::Failed )
+{
+    ::fwServices::IService::sptr service;
+    std::vector< ::fwServices::IService::sptr >  services = ::fwServices::OSR::getServices( obj , serviceType );
+    OSLM_ASSERT("Service "<<serviceType<<" not unique, registered "<<services.size()<<" time", services.size() == 1);
+    return services.at(0) ;
+}
+
+//------------------------------------------------------------------------------
+
+::fwServices::IService::sptr get( std::string uid ) throw(fwTools::Failed )
+{
+    OSLM_ASSERT("service not exist with uid "<<uid, ::fwTools::fwID::exist(uid )) ;
+    return ::fwServices::IService::dynamicCast( ::fwTools::fwID::getObject( uid ) );
+}
+
+//------------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/ActiveWorkers.cpp b/SrcLib/core/fwServices/src/fwServices/registry/ActiveWorkers.cpp
new file mode 100644
index 0000000..f5453a5
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/ActiveWorkers.cpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include "fwServices/registry/ActiveWorkers.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+//-----------------------------------------------------------------------------
+
+ActiveWorkers::sptr ActiveWorkers::s_currentActiveWorkers = ActiveWorkers::New();
+
+//-----------------------------------------------------------------------------
+
+const std::string ActiveWorkers::s_DEFAULT_WORKER = "DEFAULT_WORKER";
+
+//-----------------------------------------------------------------------------
+
+ActiveWorkers::ActiveWorkers()
+{}
+
+//-----------------------------------------------------------------------------
+
+ActiveWorkers::~ActiveWorkers()
+{}
+
+//-----------------------------------------------------------------------------
+
+ActiveWorkers::sptr ActiveWorkers::getDefault()
+{
+    return ActiveWorkers::s_currentActiveWorkers;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwThread::Worker::sptr ActiveWorkers::getWorker( const WorkerKeyType & key ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+
+    WorkerMapType::const_iterator it = m_workers.find(key);
+
+    if( it != m_workers.end() )
+    {
+        return it->second;
+    }
+
+    return ::fwThread::Worker::sptr();
+}
+
+//-----------------------------------------------------------------------------
+
+void ActiveWorkers::addWorker( const WorkerKeyType & key, ::fwThread::Worker::sptr worker )
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_workers.insert( WorkerMapType::value_type(key, worker) );
+}
+
+//-----------------------------------------------------------------------------
+
+void ActiveWorkers::initRegistry()
+{
+    this->addWorker( s_DEFAULT_WORKER, ::fwThread::Worker::New() );
+}
+
+//-----------------------------------------------------------------------------
+
+void ActiveWorkers::clearRegistry()
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_workers.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/AppConfig.cpp b/SrcLib/core/fwServices/src/fwServices/registry/AppConfig.cpp
new file mode 100644
index 0000000..2ee19ef
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/AppConfig.cpp
@@ -0,0 +1,309 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Composite.hpp>
+
+#include "fwServices/registry/AppConfig.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+AppConfig::sptr AppConfig::s_currentAppConfig = AppConfig::New();
+::fwCore::mt::Mutex AppConfig::s_idMutex;
+
+std::string AppConfig::s_mandatoryParameterIdentifier = "@mandatory@";
+
+//-----------------------------------------------------------------------------
+
+AppConfig::sptr AppConfig::getDefault()
+{
+    return s_currentAppConfig;
+}
+
+//-----------------------------------------------------------------------------
+
+AppConfig::~AppConfig()
+{
+    SLM_TRACE_FUNC();
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfig::parseBundleInformation()
+{
+    std::vector< ::boost::shared_ptr< ::fwRuntime::Extension > >  extensions =
+            ::fwRuntime::getAllExtensionsForPoint("::fwServices::registry::AppConfig");
+    BOOST_FOREACH( ::boost::shared_ptr< ::fwRuntime::Extension > ext, extensions )
+    {
+        // Get id
+        std::string configId = ext->findConfigurationElement("id")->getValue();
+
+        // Get group
+        std::string group = "";
+        if ( ext->hasConfigurationElement("group") )
+        {
+            group = ext->findConfigurationElement("group")->getValue();
+        }
+        // Get desc
+        std::string desc = "No description available";
+        if ( ext->hasConfigurationElement("desc") )
+        {
+            desc = ext->findConfigurationElement("desc")->getValue();
+        }
+
+        // get type
+        OSLM_ASSERT("Sorry, xml element \"type\" must be equal to \"parameters\" (here = "
+                    << ext->findConfigurationElement("type")->getValue() << ") ",
+                    ext->findConfigurationElement("type")->getValue()=="parameters" );
+        AppInfo::ConfigType type = AppInfo::PARAMETERS;
+
+        // Get parameters
+        AppInfo::ParamatersType parameters;
+        if ( ext->hasConfigurationElement("parameters") )
+        {
+            ::fwRuntime::ConfigurationElement::csptr parametersConfig = ext->findConfigurationElement("parameters");
+            ::fwRuntime::ConfigurationElement::Container elements = parametersConfig->getElements();
+            BOOST_FOREACH( ::fwRuntime::ConfigurationElement::sptr paramConfig, elements )
+            {
+                std::string name = paramConfig->getExistingAttributeValue("name");
+
+                if(paramConfig->hasAttribute("default"))
+                {
+                    parameters[name] = paramConfig->getAttributeValue("default");
+                }
+                else
+                {
+                    parameters[name] = s_mandatoryParameterIdentifier;
+                }
+
+            }
+        }
+
+        // Get config
+        ::fwRuntime::ConfigurationElement::csptr config = *(ext->findConfigurationElement("config")->begin());
+
+        // Add app info
+        this->addAppInfo( configId, type, group, desc, parameters, config );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfig::addAppInfo
+(   const std::string & configId,
+    AppInfo::ConfigType type,
+    const std::string & group,
+    const std::string & desc,
+    const AppInfo::ParamatersType & parameters,
+    ::fwRuntime::ConfigurationElement::csptr config)
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+
+    OSLM_DEBUG( "New app config registering : "
+            << " configId =" << configId
+            << " type=" << type
+    );
+
+    SLM_ASSERT("Sorry, app config id = "<< configId <<" already exist.", m_reg.find( configId ) == m_reg.end() );
+
+    AppInfo::sptr info = AppInfo::New();
+    info->type = type;
+    info->group = group;
+    info->desc = desc;
+    info->config =  config;
+    info->parameters = parameters;
+    m_reg[configId] = info;
+}
+
+//-----------------------------------------------------------------------------
+
+AppConfig::AppConfig()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfig::clearRegistry()
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_reg.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::csptr AppConfig::getAdaptedTemplateConfig(
+        const std::string & configId,
+        const FieldAdaptorType fieldAdaptors ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    // Get config template
+    Registry::const_iterator iter = m_reg.find( configId );
+    SLM_ASSERT("Sorry, the id " <<  configId << " is not found in the application configuration registry", iter != m_reg.end());
+
+    // Adapt config
+    ::fwRuntime::ConfigurationElement::sptr newConfig;
+    SLM_ASSERT("Config has not good type, PARAMETERS type is required", iter->second->type == AppInfo::PARAMETERS );
+
+    FieldAdaptorType fields;
+    AppInfo::ParamatersType parameters = iter->second->parameters;
+    BOOST_FOREACH( AppInfo::ParamatersType::value_type param, parameters )
+    {
+        FieldAdaptorType::const_iterator iter = fieldAdaptors.find( param.first );
+        std::stringstream key;
+        key << "\\$\\{" << param.first << "\\}";
+        if ( iter != fieldAdaptors.end() )
+        {
+            fields[key.str()] = iter->second;
+        }
+        else if ( param.second !=  s_mandatoryParameterIdentifier)
+        {
+            fields[key.str()] = param.second;
+        }
+        else
+        {
+            FW_RAISE("Parameter : '" << param.first << "' is needed by the app configuration id='"<< configId <<"'.");
+        }
+    }
+    newConfig = this->adaptConfig(  iter->second->config, fields );
+
+    return newConfig;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::csptr AppConfig::getAdaptedTemplateConfig( const std::string & configId, ::fwData::Composite::csptr replaceFields ) const
+{
+    FieldAdaptorType fieldAdaptors = compositeToFieldAdaptor( replaceFields );
+    return this->getAdaptedTemplateConfig( configId, fieldAdaptors );
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > AppConfig::getAllConfigs() const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    std::vector< std::string > ids;
+    BOOST_FOREACH( Registry::value_type elem, m_reg )
+    {
+        ids.push_back( elem.first );
+    }
+    return ids;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > AppConfig::getConfigsFromGroup(const std::string & group) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    std::vector< std::string > ids;
+    BOOST_FOREACH( Registry::value_type elem, m_reg )
+    {
+        AppInfo::sptr info = elem.second;
+        if(info->group == group)
+        {
+            ids.push_back( elem.first );
+        }
+    }
+    return ids;
+}
+
+//-----------------------------------------------------------------------------
+
+AppConfig::FieldAdaptorType AppConfig::compositeToFieldAdaptor( ::fwData::Composite::csptr fieldAdaptors ) const
+{
+    FieldAdaptorType fields;
+    BOOST_FOREACH(const ::fwData::Composite::value_type &elem, *fieldAdaptors )
+    {
+        fields[elem.first] = ::fwData::String::dynamicCast( elem.second )->value();
+    }
+
+    return fields;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string AppConfig::getUniqueIdentifier(const std::string& serviceUid )
+{
+    ::fwCore::mt::ScopedLock lock(s_idMutex);
+    static unsigned int srvCpt = 1;
+    std::stringstream sstr;
+
+    if ( serviceUid.empty() )
+    {
+        sstr <<  "AppConfigManager_" << srvCpt;
+    }
+    else
+    {
+        sstr <<  serviceUid << "_" << srvCpt;
+    }
+    ++srvCpt;
+    return sstr.str();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwRuntime::EConfigurationElement::sptr AppConfig::adaptConfig( ::fwRuntime::ConfigurationElement::csptr _cfgElem, const FieldAdaptorType & fieldAdaptors ) const
+{
+    SLM_TRACE_FUNC();
+
+    ::fwRuntime::EConfigurationElement::sptr result = ::fwRuntime::EConfigurationElement::New( _cfgElem->getName() );
+    result->setValue( this->adaptField( _cfgElem->getValue(), fieldAdaptors ) );
+
+    typedef std::map<std::string, std::string> MapAttributesType;
+    BOOST_FOREACH( MapAttributesType::value_type attribute, _cfgElem->getAttributes() )
+    {
+        result->setAttributeValue( attribute.first, this->adaptField( attribute.second, fieldAdaptors ) );
+    }
+
+    BOOST_FOREACH ( ::fwRuntime::ConfigurationElement::csptr subElem, _cfgElem->getElements())
+    {
+        result->addConfigurationElement( this->adaptConfig( subElem, fieldAdaptors ) );
+    }
+
+    return result;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string AppConfig::adaptField( const std::string & _str, const FieldAdaptorType & fieldAdaptors ) const
+{
+    std::string newStr = _str;
+    if(!_str.empty())
+    {
+        BOOST_FOREACH(FieldAdaptorType::value_type fieldAdaptor, fieldAdaptors)
+        {
+            std::stringstream sstr;
+            sstr << "(.*)" << fieldAdaptor.first << "(.*)";
+            ::boost::regex machine_regex ( sstr.str() );
+            if ( ::boost::regex_match( _str, machine_regex ) )
+            {
+                std::stringstream machine_format;
+                machine_format << "\\1" << fieldAdaptor.second << "\\2";
+                newStr = ::boost::regex_replace( newStr,
+                                machine_regex, machine_format.str(),
+                                ::boost::match_default | ::boost::format_sed );
+            }
+        }
+    }
+    return newStr;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/AppConfigParameters.cpp b/SrcLib/core/fwServices/src/fwServices/registry/AppConfigParameters.cpp
new file mode 100644
index 0000000..a10c825
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/AppConfigParameters.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/regex.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Composite.hpp>
+
+#include "fwServices/registry/AppConfigParameters.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+AppConfigParameters::sptr AppConfigParameters::s_appConfigParameters = AppConfigParameters::New();
+
+//-----------------------------------------------------------------------------
+
+AppConfigParameters::sptr AppConfigParameters::getDefault()
+{
+    return s_appConfigParameters;
+}
+
+//-----------------------------------------------------------------------------
+
+AppConfigParameters::~AppConfigParameters()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfigParameters::parseBundleInformation()
+{
+    std::vector< ::boost::shared_ptr< ::fwRuntime::Extension > >  extensions = ::fwRuntime::getAllExtensionsForPoint("::fwServices::registry::AppConfigParameters");
+    BOOST_FOREACH( ::boost::shared_ptr< ::fwRuntime::Extension > ext, extensions )
+    {
+        // Get id
+        std::string extensionId = ext->findConfigurationElement("id")->getValue();
+
+        AppConfig::FieldAdaptorType parameters;
+
+        // Get parmeters
+        ::fwRuntime::ConfigurationElement::csptr parametersConfig = ext->findConfigurationElement("parameters");
+        ::fwRuntime::ConfigurationElement::Container elements = parametersConfig->getElements();
+        BOOST_FOREACH( ::fwRuntime::ConfigurationElement::sptr paramConfig, elements )
+        {
+            std::string name = paramConfig->getExistingAttributeValue("name");
+            std::string val = paramConfig->getExistingAttributeValue("value");
+            parameters[name] = val;
+        }
+        ::fwCore::mt::WriteLock lock(m_registryMutex);
+        Registry::const_iterator iter = m_reg.find( extensionId );
+        SLM_ASSERT("Sorry, the id " <<  extensionId
+                   << " already exists in the application configuration parameter registry", iter == m_reg.end());
+        m_reg[extensionId] = parameters;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+AppConfigParameters::AppConfigParameters()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfigParameters::clearRegistry()
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_reg.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+const AppConfig::FieldAdaptorType & AppConfigParameters::getParameters( const std::string & extensionId ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    Registry::const_iterator iter = m_reg.find( extensionId );
+    SLM_ASSERT("Sorry, the id " <<  extensionId << " is not found in the application configuration parameter registry", iter != m_reg.end());
+    return iter->second;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/ObjectService.cpp b/SrcLib/core/fwServices/src/fwServices/registry/ObjectService.cpp
new file mode 100644
index 0000000..2959e6c
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/ObjectService.cpp
@@ -0,0 +1,314 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <sstream>
+#include <utility>
+
+#include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/LogicStamp.hpp>
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include <fwTools/fwID.hpp>
+
+#include "fwServices/IService.hpp"
+
+#include "fwServices/registry/ServiceConfig.hpp"
+#include "fwServices/registry/ServiceFactory.hpp"
+#include "fwServices/registry/AppConfig.hpp"
+
+#include "fwServices/registry/ObjectService.hpp"
+
+namespace fwServices
+{
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+namespace OSR
+{
+
+::fwServices::registry::ObjectService::sptr get()
+{
+    return ::fwCore::util::LazyInstantiator< ::fwServices::registry::ObjectService >::getInstance();
+}
+
+//------------------------------------------------------------------------------
+
+::fwServices::registry::ObjectService::ObjectVectorType getObjects()
+{
+    return ::fwServices::OSR::get()->getObjects();
+}
+
+//------------------------------------------------------------------------------
+
+std::string getRegistryInformation()
+{
+    return ::fwServices::OSR::get()->getRegistryInformation();
+}
+
+//------------------------------------------------------------------------------
+
+::fwServices::registry::ObjectService::ServiceVectorType getServices( const std::string &serviceType )
+{
+    return ::fwServices::OSR::get()->getServices(serviceType);
+}
+
+//------------------------------------------------------------------------------
+
+::fwServices::registry::ObjectService::ServiceVectorType getServices( ::fwData::Object::sptr obj,
+                                                                      const std::string &serviceType )
+{
+    return ::fwServices::OSR::get()->getServices(obj, serviceType);
+}
+
+//------------------------------------------------------------------------------
+
+::fwServices::registry::ObjectService::ServiceVectorType getServices( ::fwData::Object::sptr obj )
+{
+    return ::fwServices::OSR::get()->getServices(obj);
+}
+
+//------------------------------------------------------------------------------
+
+bool has( ::fwData::Object::sptr obj , const std::string &srvType)
+{
+    return ::fwServices::OSR::get()->has(obj, srvType);
+}
+
+//------------------------------------------------------------------------------
+
+void registerService( ::fwData::Object::sptr obj, ::fwServices::IService::sptr service )
+{
+    ::fwServices::OSR::get()->registerService(obj, service);
+}
+
+//------------------------------------------------------------------------------
+
+void swapService( ::fwData::Object::sptr objDst, ::fwServices::IService::sptr service )
+{
+    ::fwServices::OSR::get()->swapService(objDst, service);
+}
+
+//------------------------------------------------------------------------------
+
+void unregisterService(  ::fwServices::IService::sptr service )
+{
+    ::fwServices::OSR::get()->unregisterService(service);
+}
+
+} //namespace OSR
+
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+
+
+
+namespace registry
+{
+
+void  ObjectService::registerService( ::fwData::Object::sptr object, ::fwServices::IService::sptr service)
+{
+    ::fwCore::mt::WriteLock writeLock(m_containerMutex);
+    this->internalRegisterService(object, service);
+}
+
+//------------------------------------------------------------------------------
+
+void  ObjectService::internalRegisterService( ::fwData::Object::sptr object, ::fwServices::IService::sptr service)
+{
+    OSLM_ASSERT("Sorry, this service "<< service->getClassname()
+            << " is not valid for object " << object->getClassname(),
+            ServiceFactory::getDefault()->checkServiceValidity(object->getClassname(), service->getClassname())
+    );
+
+    OSLM_ASSERT("Service "<< service->getID()<<" already registered",
+            m_container.right.find(service) == m_container.right.end());
+    OSLM_ASSERT("Service "<< service->getID()<<" has already a valid associated object" ,
+            service->m_associatedObject.expired() || object != service->m_associatedObject.lock());
+
+    service->m_associatedObject = object;
+    m_container.insert( ServiceContainerType::value_type( object->getOSRKey()->getLogicStamp(), service ) );
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectService::swapService( ::fwData::Object::sptr objDst, ::fwServices::IService::sptr service )
+{
+    ::fwCore::mt::WriteLock lock(m_containerMutex);
+    OSLM_ASSERT("Object "<< service->getObject()->getID()<<" is not registered in OSR",
+                m_container.left.find(service->getObject()->getOSRKey()->getLogicStamp()) != m_container.left.end());
+
+    OSLM_ASSERT("Service "<< service->getID()<<" is not registered in OSR",
+                    m_container.right.find(service) != m_container.right.end());
+
+    m_container.right.erase(service);
+    this->internalRegisterService(objDst, service);
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectService::unregisterService( ::fwServices::IService::sptr service )
+{
+    SLM_TRACE_FUNC();
+    OSLM_ASSERT( "Sorry, the service ( "<< service->getID() <<" ) must be stop before unregister it.",
+                 service->isStopped() );
+    // TODO verify that there are no com channel on this service.
+    this->removeFromContainer( service );
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectService::removeFromContainer( ::fwServices::IService::sptr service )
+{
+    SLM_TRACE_FUNC();
+    ::fwCore::mt::WriteLock lock(m_containerMutex);
+    OSLM_ASSERT("Unknown service "<<service->getID()<<" in OSR",
+            m_container.right.find(service) != m_container.right.end());
+    m_container.right.erase(service);
+}
+
+//------------------------------------------------------------------------------
+
+ObjectService::ObjectVectorType ObjectService::getObjects() const
+{
+    ObjectVectorType objects;
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    const ServiceContainerType::right_map & right = m_container.right;
+    BOOST_FOREACH( const ServiceContainerType::right_map::value_type &elt, right)
+    {
+        if ( std::find(objects.begin(), objects.end(), elt.first->getObject()) == objects.end() )
+        {
+            objects.push_back( elt.first->getObject() ) ;
+        }
+    }
+    SLM_WARN_IF( "No object registered for the requested type of service", objects.empty() );
+    return objects;
+}
+
+//------------------------------------------------------------------------------
+
+std::string ObjectService::getRegistryInformation() const
+{
+    std::stringstream info;
+    ::fwCore::LogicStamp::LogicStampType previousKey = -1;
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    BOOST_FOREACH( const ServiceContainerType::left_map::value_type &objSrvMap, m_container.left)
+    {
+        // TODO FIXME getObject() fail if there are expired object in OSR
+        ::fwCore::LogicStamp::LogicStampType key = objSrvMap.first;
+
+        if ( previousKey != key )
+        {
+            info    << "Object ( key = "<<key<<" ) has "
+                    << m_container.left.count(key) <<" services." << std::endl;
+            previousKey = key;
+        }
+        ::fwServices::IService::sptr service = objSrvMap.second;
+        info << "    srv : uid = "<< service->getID() <<" , classname = "<< service->getClassname()
+                         <<" , service is stopped = "<< ( service->isStopped() ? "yes" : "no" ) << std::endl;
+    }
+    return info.str();
+}
+
+//------------------------------------------------------------------------------
+
+ObjectService::ServiceVectorType ObjectService::getServices( ::fwData::Object::sptr obj,
+                                                             const std::string & serviceType ) const
+{
+    ServiceVectorType allServices = this->getServices(obj);
+    ServiceVectorType services ;
+
+    // Search should be optimized
+    BOOST_FOREACH(::fwServices::IService::sptr srv, allServices)
+    {
+        if( srv->isA(serviceType) )
+        {
+            services.push_back( srv ) ;
+        }
+    }
+    return services ;
+}
+
+//------------------------------------------------------------------------------
+
+ObjectService::ServiceVectorType ObjectService::getServices( const std::string & serviceType ) const
+{
+    ServiceVectorType services;
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    const ServiceContainerType::right_map right = m_container.right;
+    BOOST_FOREACH( ServiceContainerType::right_map::value_type elt, right)
+    {
+        ::fwServices::IService::sptr service = elt.first;
+        if ( service->isA(serviceType) )
+        {
+            services.push_back( service ) ;
+        }
+    }
+    SLM_DEBUG_IF("No service registered", services.empty());
+    return services;
+}
+
+//------------------------------------------------------------------------------
+
+ObjectService::ServiceVectorType ObjectService::getServices( ::fwData::Object::sptr obj ) const
+{
+    ServiceVectorType services;
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    if(m_container.left.find(obj->getOSRKey()->getLogicStamp()) != m_container.left.end())
+    {
+        ServiceContainerType::left_map::const_iterator iter;
+        ::fwCore::LogicStamp::LogicStampType key = obj->getOSRKey()->getLogicStamp();
+        ServiceContainerType::left_map::const_iterator firstElement = m_container.left.find(key);
+        ServiceContainerType::left_map::const_iterator lastElement  = m_container.left.upper_bound(key);
+        for (iter = firstElement ; iter != lastElement ; ++iter)
+        {
+            services.push_back( iter->second ) ;
+        }
+    }
+    return services;
+}
+
+//------------------------------------------------------------------------------
+
+bool ObjectService::has( ::fwData::Object::sptr obj , const std::string & srvType) const
+{
+    bool hasServices = false;
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    if( m_container.left.find(obj->getOSRKey()->getLogicStamp()) != m_container.left.end())
+    {
+        ServiceContainerType::left_map::const_iterator iter;
+        ::fwCore::LogicStamp::LogicStampType key = obj->getOSRKey()->getLogicStamp();
+        ServiceContainerType::left_map::const_iterator firstElement = m_container.left.find(key);
+        ServiceContainerType::left_map::const_iterator lastElement = m_container.left.upper_bound(key);
+        for (iter = firstElement ; iter != lastElement ; ++iter)
+        {
+            if( iter->second->isA(srvType))
+            {
+                hasServices = true;
+                break;
+            }
+        }
+    }
+    return hasServices ;
+}
+
+//------------------------------------------------------------------------------
+
+bool ObjectService::hasKey( ::fwCore::LogicStamp::csptr key ) const
+{
+    ::fwCore::mt::ReadLock lock(m_containerMutex);
+    return (m_container.left.find(key->getLogicStamp()) != m_container.left.end());
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace registry
+} // namespace fwServices
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/Proxy.cpp b/SrcLib/core/fwServices/src/fwServices/registry/Proxy.cpp
new file mode 100644
index 0000000..278ce8b
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/Proxy.cpp
@@ -0,0 +1,165 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include "fwServices/registry/Proxy.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+//-----------------------------------------------------------------------------
+
+Proxy::sptr Proxy::s_currentProxy = Proxy::New();
+
+//-----------------------------------------------------------------------------
+
+Proxy::Proxy()
+{}
+
+//-----------------------------------------------------------------------------
+
+Proxy::~Proxy()
+{
+    SLM_ASSERT("There are always " << m_channels.size() << " channels in Proxy", m_channels.empty());
+}
+
+//-----------------------------------------------------------------------------
+
+Proxy::sptr Proxy::getDefault()
+{
+    return Proxy::s_currentProxy;
+}
+
+//-----------------------------------------------------------------------------
+
+void Proxy::connect(ChannelKeyType channel, ::fwCom::SignalBase::sptr signal)
+{
+    SPTR(SigSlots) sigslots;
+
+    {
+        ::fwCore::mt::ReadToWriteLock lock(m_channelMutex);
+        ChannelMapType::iterator iter = m_channels.find(channel);
+
+        if (iter == m_channels.end())
+        {
+            sigslots = SPTR(SigSlots)(new SigSlots);
+
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            m_channels[channel] = sigslots;
+        }
+        else
+        {
+            sigslots = iter->second;
+        }
+    }
+
+    ::fwCore::mt::WriteLock lock(sigslots->m_mutex);
+    sigslots->m_signals.push_back(signal);
+
+    BOOST_FOREACH( ::fwCom::SlotBase::sptr slot, sigslots->m_slots )
+    {
+        signal->connect( slot );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Proxy::connect(ChannelKeyType channel, ::fwCom::SlotBase::sptr slot)
+{
+    SPTR(SigSlots) sigslots;
+
+    {
+        ::fwCore::mt::ReadToWriteLock lock(m_channelMutex);
+        ChannelMapType::iterator iter = m_channels.find(channel);
+
+        if (iter == m_channels.end())
+        {
+            sigslots = SPTR(SigSlots)(new SigSlots);
+
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            m_channels[channel] = sigslots;
+        }
+        else
+        {
+            sigslots = iter->second;
+        }
+    }
+
+    ::fwCore::mt::WriteLock lock(sigslots->m_mutex);
+    sigslots->m_slots.push_back(slot);
+
+    BOOST_FOREACH( ::fwCom::SignalBase::sptr signal, sigslots->m_signals )
+    {
+        signal->connect( slot );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Proxy::disconnect(ChannelKeyType channel, ::fwCom::SignalBase::sptr signal)
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_channelMutex);
+    ChannelMapType::iterator iter = m_channels.find(channel);
+
+    SLM_ASSERT("channel '" << channel << "' doesn't exist in Proxy.", iter != m_channels.end());
+    SPTR(SigSlots) sigslots = iter->second;
+
+    ::fwCore::mt::WriteLock sigSlotLock(sigslots->m_mutex);
+
+    BOOST_FOREACH( ::fwCom::SlotBase::sptr slot, sigslots->m_slots )
+    {
+        signal->disconnect( slot );
+    }
+
+    SigSlots::SignalContainerType::iterator sigIter;
+    sigIter = std::find(sigslots->m_signals.begin(), sigslots->m_signals.end(), signal);
+    SLM_ASSERT("Signal is not found", sigIter != sigslots->m_signals.end());
+    sigslots->m_signals.erase(sigIter);
+
+    if (sigslots->m_signals.empty() && sigslots->m_slots.empty())
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+        m_channels.erase(channel);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void Proxy::disconnect(ChannelKeyType channel, ::fwCom::SlotBase::sptr slot)
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_channelMutex);
+    ChannelMapType::iterator iter = m_channels.find(channel);
+
+    SLM_ASSERT("channel '" << channel << "' doesn't exist in Proxy.", iter != m_channels.end());
+    SPTR(SigSlots) sigslots = iter->second;
+
+    ::fwCore::mt::WriteLock sigSlotLock(sigslots->m_mutex);
+
+    BOOST_FOREACH( ::fwCom::SignalBase::sptr signal, sigslots->m_signals )
+    {
+        signal->disconnect( slot );
+    }
+
+    SigSlots::SlotContainerType::iterator slotIter;
+    slotIter = std::find(sigslots->m_slots.begin(), sigslots->m_slots.end(), slot);
+    SLM_ASSERT("Slot is not found", slotIter != sigslots->m_slots.end());
+    sigslots->m_slots.erase(slotIter);
+
+    if (sigslots->m_signals.empty() && sigslots->m_slots.empty())
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+        m_channels.erase(channel);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/ServiceConfig.cpp b/SrcLib/core/fwServices/src/fwServices/registry/ServiceConfig.cpp
new file mode 100644
index 0000000..1688cd6
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/ServiceConfig.cpp
@@ -0,0 +1,162 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include "fwServices/registry/ServiceConfig.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+const std::string ServiceConfig::CONFIG_EXT_POINT = "::fwServices::registry::ServiceConfig";
+
+ServiceConfig::sptr ServiceConfig::s_currentServiceConfig = ServiceConfig::New();
+
+//-----------------------------------------------------------------------------
+
+ServiceConfig::sptr ServiceConfig::getDefault()
+{
+    return s_currentServiceConfig;
+}
+
+//-----------------------------------------------------------------------------
+
+ServiceConfig::~ServiceConfig()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void ServiceConfig::parseBundleInformation()
+{
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef ::boost::shared_ptr< ::fwRuntime::Extension > ExtensionType;
+
+    std::vector< ExtensionType >  extElements;
+    extElements = ::fwRuntime::getAllExtensionsForPoint(CONFIG_EXT_POINT);
+    BOOST_FOREACH(ExtensionType ext , extElements)
+    {
+        // Get id
+        SLM_ASSERT("Missing id element", ext->hasConfigurationElement("id"));
+        std::string id = ext->findConfigurationElement("id")->getValue();
+
+        // Get service
+        std::string service ="";
+        if ( ext->hasConfigurationElement("service") )
+        {
+            service = ext->findConfigurationElement("service")->getValue();
+        }
+
+        // Get desc
+        std::string desc = "No description available";
+        if ( ext->hasConfigurationElement("desc") )
+        {
+            desc = ext->findConfigurationElement("desc")->getValue();
+        }
+
+        // Get config
+        ::fwRuntime::ConfigurationElement::csptr config = ext->findConfigurationElement("config");
+
+        // Add service config info
+        this->addServiceConfigInfo(id, service, desc, config);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ServiceConfig::addServiceConfigInfo
+(   const std::string & configId,
+    const std::string & service,
+    const std::string & desc,
+    ::fwRuntime::ConfigurationElement::csptr config)
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+
+    OSLM_DEBUG( "New service config registring : "
+            << " configId = " << configId
+            << " service = " << service
+            << " desc = " << desc
+    );
+
+    SLM_ASSERT("Sorry, service config id = "<< configId <<" already exist.", m_reg.find( configId ) == m_reg.end() );
+
+    ServiceConfigInfo::sptr info = ServiceConfigInfo::New();
+    info->service = service;
+    info->desc = desc;
+    info->config =  config;
+    m_reg[configId] = info;
+}
+
+//-----------------------------------------------------------------------------
+
+ServiceConfig::ServiceConfig()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void ServiceConfig::clearRegistry()
+{
+    ::fwCore::mt::WriteLock lock(m_registryMutex);
+    m_reg.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::csptr ServiceConfig::getServiceConfig( const std::string & configId,
+                                                                          const std::string &serviceImpl ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    Registry::const_iterator iter = m_reg.find( configId );
+    SLM_ASSERT("Sorry, the id " <<  configId << " is not found in the application configuration registry",
+               iter != m_reg.end());
+    SLM_ASSERT("Sorry, the id " <<  configId << " is not allowed for this service " << serviceImpl,
+               serviceImpl.empty() || iter->second->service.empty() || iter->second->service == serviceImpl);
+    return iter->second->config;
+}
+
+//-----------------------------------------------------------------------------
+
+const std::string& ServiceConfig::getConfigDesc( const std::string & configId ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    Registry::const_iterator iter = m_reg.find( configId );
+    SLM_ASSERT("Sorry, the id " <<  configId << " is not found in the application configuration registry",
+               iter != m_reg.end());
+    return iter->second->desc;
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > ServiceConfig::getAllConfigForService( std::string serviceImpl ) const
+{
+    ::fwCore::mt::ReadLock lock(m_registryMutex);
+    std::vector< std::string > configs;
+
+    BOOST_FOREACH(Registry::value_type srvCfg, m_reg)
+    {
+        ServiceConfigInfo::sptr info = srvCfg.second;
+        if (info->service.empty() || info->service == serviceImpl)
+        {
+            configs.push_back(srvCfg.first);
+        }
+    }
+
+    return configs;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/ServiceFactory.cpp b/SrcLib/core/fwServices/src/fwServices/registry/ServiceFactory.cpp
new file mode 100644
index 0000000..365b96b
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/ServiceFactory.cpp
@@ -0,0 +1,488 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vector>
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/helper.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+
+#include "fwServices/IService.hpp"
+#include "fwServices/registry/ServiceFactory.hpp"
+
+namespace fwServices
+{
+namespace registry
+{
+
+//-----------------------------------------------------------------------------
+
+ServiceFactory::sptr ServiceFactory::getDefault()
+{
+    return ::fwCore::util::LazyInstantiator< ServiceFactory >::getInstance();
+}
+//-----------------------------------------------------------------------------
+
+void ServiceFactory::parseBundleInformation()
+{
+    SrvRegContainer bundleInfoMap;
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    typedef ::boost::shared_ptr< ::fwRuntime::Extension > ExtensionType;
+
+    std::vector< ExtensionType >  extElements;
+    extElements = ::fwRuntime::getAllExtensionsForPoint("::fwServices::registry::ServiceFactory");
+    BOOST_FOREACH(ExtensionType extElt , extElements)
+    {
+        std::vector< ConfigurationType > cfgEltVec = extElt->getElements();
+        SLM_ASSERT("extension element MUST have 3 or 4 elements", cfgEltVec.size() == 3 || cfgEltVec.size() == 4);
+        std::string type = "";
+        std::string service ="";
+        std::string object= "";
+        std::string desc= "";
+
+        BOOST_FOREACH(ConfigurationType cfgElt, cfgEltVec)
+        {
+            std::string elt = cfgElt->getName();
+            if(elt == "type")
+            {
+                type = cfgElt->getValue();
+            }
+            else if(elt == "service")
+            {
+                service = cfgElt->getValue();
+            }
+            else if(elt == "object")
+            {
+                object = cfgElt->getValue();
+            }
+            else if(elt == "desc")
+            {
+                desc = cfgElt->getValue();
+            }
+            else
+            {
+                SLM_FATAL("Unknown element !");
+            }
+        }
+        SLM_ASSERT("Missing type element.", !type.empty());
+        SLM_ASSERT("Missing service element.", !service.empty());
+        SLM_ASSERT("Missing object element.", !object.empty());
+
+        ServiceInfo::sptr info = ServiceInfo::New();
+        info->serviceType = type;
+        info->objectImpl = object;
+        info->desc = desc;
+
+        info->bundle = cfgEltVec[0]->getBundle();
+        SLM_ASSERT("Bundle not find.", info->bundle );
+
+        bundleInfoMap[ service] = info;
+    }
+    // Verify object
+    BOOST_FOREACH(SrvRegContainer::value_type bundle, bundleInfoMap)
+    {
+        if ( bundle.second->objectImpl.empty() )
+        {
+            OSLM_WARN("Service " << bundle.first << " of type  "
+                    << bundle.second->serviceType << " in bundle " << bundle.second->bundle->getIdentifier()
+                    << " has not object defined in plugin.xml ( declaration missing in dataReg ? ). "
+                    "Else is a service of service (sorry but not managed in this version )");
+
+        }
+    }
+
+#if SPYLOG_LEVEL >= 5
+    //Print information
+    this->printInfoMap( bundleInfoMap );
+#endif
+
+    ::fwCore::mt::ReadToWriteLock lock(m_srvImplTosrvInfoMutex);
+    // Merge data info
+    BOOST_FOREACH(SrvRegContainer::value_type bundle, bundleInfoMap)
+    {
+
+        SrvRegContainer::iterator iter = m_srvImplTosrvInfo.find( bundle.first );
+
+        if ( iter != m_srvImplTosrvInfo.end() )
+        {
+            OSLM_DEBUG("Have already information (from register macro) about this service ( "
+                       << bundle.first << " )." );
+
+            ServiceInfo::sptr info = iter->second;
+            ServiceInfo::sptr infoBundle = bundle.second;
+
+            SLM_ASSERT("Try to add bundle, but bundle exists.", ! info->bundle );
+            SLM_ASSERT("Try to add bundle, but this srv is already register and has not the same srv type.",
+                       infoBundle->serviceType == info->serviceType );
+            SLM_ASSERT("Try to add bundle, but this srv ("
+                       << bundle.first << ")is already register and has not the same oimpl. ( "
+                       << infoBundle->objectImpl <<" != "<< info->objectImpl <<" )",
+                       infoBundle->objectImpl == info->objectImpl );
+
+            info->bundle =  infoBundle->bundle;
+            info->desc =  infoBundle->desc;
+        }
+        else
+        {
+            ::fwCore::mt::UpgradeToWriteLock upgrade(lock);
+            m_srvImplTosrvInfo[ bundle.first ] = bundle.second;
+        }
+
+    }
+
+#if SPYLOG_LEVEL >= 5
+    //Print information
+    this->printInfoMap( m_srvImplTosrvInfo );
+#endif
+    this->checkServicesNotDeclaredInPluginXml();
+}
+
+//-----------------------------------------------------------------------------
+
+IService::sptr ServiceFactory::create( const std::string & _srvImpl ) const
+{
+    IService::sptr service;
+
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::const_iterator iter = m_srvImplTosrvInfo.find( _srvImpl );
+
+    OSLM_ASSERT("Sorry don't find in ServiceFactory the service called "
+                << _srvImpl,
+                iter != m_srvImplTosrvInfo.end() );
+
+    ServiceInfo::sptr info = iter->second;
+
+    OSLM_DEBUG("SR create a new service ( classname = " << _srvImpl << " )");
+
+    if ( info->factory )
+    {
+        service = info->factory();
+    }
+    else
+    {
+        OSLM_ASSERT( "Sorry a bundle must declare the factory "
+                     << _srvImpl
+                     <<". Service declaration is missing (or misspelled) in a bundle plugin ?",
+                     info->bundle );
+        OSLM_ASSERT( "Sorry bundle is already load ( "
+                     << info->bundle->getIdentifier() << " ) , factory "
+                     << _srvImpl
+                     << " is still missing. Service declaration is missing (or misspelled) in a .cpp file ?",
+                     ! info->bundle->isStarted() );
+
+        lock.unlock(); // bundle->start() may trigger calls to addFactory
+        info->bundle->start();
+        lock.lock();
+
+        ::fwRuntime::profile::getCurrentProfile()->setup();
+
+        SLM_ASSERT( "Sorry after bundle loading ( "
+                    << info->bundle->getIdentifier() << " ) , factory "
+                    << _srvImpl << " is still missing. Service declaration is missing (or misspelled) in a cpp file ?",
+                    info->factory );
+
+        service = info->factory();
+    }
+
+    this->checkServicesNotDeclaredInPluginXml();
+    return service;
+}
+
+
+//-----------------------------------------------------------------------------
+
+IService::sptr ServiceFactory::create( const std::string & _srvType, const std::string & _srvImpl ) const
+{
+
+#ifdef _DEBUG
+    {
+        ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+
+        OSLM_ASSERT("Sorry don't find in ServiceFactory the service called "
+                    << _srvImpl,
+                    m_srvImplTosrvInfo.find( _srvImpl ) != m_srvImplTosrvInfo.end() );
+
+        OSLM_ASSERT(
+                    "Sorry, type of service must correspond. "
+                    << _srvType << " != " << m_srvImplTosrvInfo.find( _srvImpl )->second->serviceType,
+                    _srvType == m_srvImplTosrvInfo.find( _srvImpl )->second->serviceType);
+    }
+#endif //_DEBUG
+
+    IService::sptr service = this->create(_srvImpl);
+    return service;
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceFactory::addFactory( ServiceInfo::FactoryType _factory,
+        const std::string & simpl,
+        const std::string & stype,
+        const std::string & oimpl)
+{
+    OSLM_DEBUG( "New service registering : "
+            << " simpl =" << simpl
+            << " stype=" << stype
+            << " oimpl=" << oimpl
+    );
+
+    ::fwCore::mt::ReadToWriteLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::iterator iter = m_srvImplTosrvInfo.find( simpl );
+
+    ServiceInfo::sptr info ;
+
+    if ( iter != m_srvImplTosrvInfo.end() )
+    {
+        OSLM_DEBUG("Have already information about this service ( " << simpl << " )." );
+        info = iter->second;
+        OSLM_ASSERT("Try to add factory, but this srv ( " << simpl << " ) has already a registered factory.",
+                    ! info->factory );
+        OSLM_ASSERT("Try to add factory, but this srv ( "
+                    << simpl << " ) is already register and has not the same srv type. ( "
+                    << stype << " != " << info->serviceType <<" )",
+                    stype == info->serviceType );
+        OSLM_ASSERT("Try to add factory, but this srv ( "
+                    << simpl << " ) is already register and has not the same oimpl. ( "
+                    << oimpl << " != " << info->objectImpl <<" )",
+                    oimpl == info->objectImpl );
+
+        ::fwCore::mt::UpgradeToWriteLock upgrade(lock);
+        info->factory     = _factory ;
+    }
+    else
+    {
+        OSLM_DEBUG("Add new service factory in registry ( " << simpl << " )." );
+        ::fwCore::mt::UpgradeToWriteLock upgrade(lock);
+        info = m_srvImplTosrvInfo[simpl] = ServiceInfo::New();
+        info->serviceType = stype;
+        info->objectImpl  = oimpl;
+        info->factory     = _factory ;
+    }
+
+}
+
+
+//-----------------------------------------------------------------------------
+
+void ServiceFactory::printInfoMap( const SrvRegContainer & src ) const
+{
+    // not thread-safe
+
+    //Print information
+    BOOST_FOREACH(SrvRegContainer::value_type srvReg, src)
+    {
+        OSLM_DEBUG(" Service name = " << srvReg.first );
+        OSLM_DEBUG("  - type   = " << srvReg.second->serviceType );
+        OSLM_DEBUG("  - object = " << srvReg.second->objectImpl);
+
+        OSLM_DEBUG_IF("  - bundle = " <<  srvReg.second->bundle->getIdentifier(), srvReg.second->bundle );
+        OSLM_DEBUG_IF("  - bundle = ( no bundle registered )", ! srvReg.second->bundle );
+
+        OSLM_DEBUG_IF("  - name after creation = "
+                      <<  srvReg.second->factory()->getClassname(), srvReg.second->factory );
+        OSLM_DEBUG_IF("  - name after creation = ( no factory registered )", ! srvReg.second->factory );
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ServiceFactory::checkServicesNotDeclaredInPluginXml() const
+{
+    // not thread-safe
+    //Print information
+    BOOST_FOREACH(SrvRegContainer::value_type srvReg, m_srvImplTosrvInfo)
+    {
+        if ( ! srvReg.second->bundle )
+        {
+            OSLM_WARN("Service " << srvReg.first << " is not declared/found in a plugin.xml." );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void ServiceFactory::clearFactory()
+{
+    ::fwCore::mt::WriteLock lock(m_srvImplTosrvInfoMutex);
+    m_srvImplTosrvInfo.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+std::vector< std::string > ServiceFactory::getImplementationIdFromObjectAndType( const std::string& object,
+                                                                                 const std::string& type ) const
+{
+    std::vector< std::string > serviceImpl;
+
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    BOOST_FOREACH(SrvRegContainer::value_type srv, m_srvImplTosrvInfo)
+    {
+        ServiceInfo::sptr srvInfo = srv.second;
+        if(srvInfo->serviceType == type
+           && (srvInfo->objectImpl == object || srvInfo->objectImpl == "::fwData::Object") )
+        {
+            serviceImpl.push_back(srv.first);
+        }
+    }
+    return serviceImpl;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string ServiceFactory::getDefaultImplementationIdFromObjectAndType( const std::string& object,
+                                                                         const std::string& type ) const
+{
+    SLM_ASSERT("Sorry, this case is not managed ", object != "::fwData::Object" );
+
+    std::string serviceImpl = "";
+    bool genericImplIsFound = false;
+    bool specificImplIsFound = false;
+
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    BOOST_FOREACH( SrvRegContainer::value_type srv, m_srvImplTosrvInfo )
+    {
+        ServiceInfo::sptr srvInfo = srv.second;
+        if ( srvInfo->serviceType == type )
+        {
+            if ( srvInfo->objectImpl == object )
+            {
+                OSLM_ASSERT("Sorry, method has already found a specific ("
+                            << serviceImpl <<" != " << srv.first
+                            << ") service for the object (" << srvInfo->objectImpl << ").",
+                            ! specificImplIsFound );
+
+                specificImplIsFound = true;
+                serviceImpl = srv.first;
+            }
+            else if ( srvInfo->objectImpl == "::fwData::Object" )
+            {
+                OSLM_ASSERT("Sorry, method has already found a generic service for the object ("
+                            << srvInfo->objectImpl << ").",
+                            ! genericImplIsFound );
+
+                genericImplIsFound = true;
+                if ( ! specificImplIsFound )
+                {
+                    serviceImpl = srv.first;
+                }
+            }
+        }
+    }
+
+    OSLM_ASSERT("Sorry, default implementation is not found for this type of service "<<type, ! serviceImpl.empty() );
+
+    return serviceImpl;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string ServiceFactory::getObjectImplementation(const std::string& srvImpl) const
+{
+    std::string objImpl;
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::const_iterator iter = m_srvImplTosrvInfo.find( srvImpl );
+    SLM_ASSERT("The service " << srvImpl << " is not found.", iter != m_srvImplTosrvInfo.end());
+    objImpl = iter->second->objectImpl;
+    return objImpl;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string ServiceFactory::getServiceDescription(const std::string& srvImpl) const
+{
+    std::string srvDescription;
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::const_iterator iter = m_srvImplTosrvInfo.find( srvImpl );
+    SLM_ASSERT("The service " << srvImpl << " is not found.", iter != m_srvImplTosrvInfo.end());
+    srvDescription = iter->second->desc;
+    return srvDescription;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ServiceFactory::checkServiceValidity(const std::string & objectClassName, const std::string & srvImpl) const
+{
+    bool isValid = true;
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::const_iterator iter = m_srvImplTosrvInfo.find( srvImpl );
+    isValid &= ( iter != m_srvImplTosrvInfo.end() );
+    if (isValid)
+    {
+        ServiceInfo::sptr srvInfo = iter->second;
+        isValid &= (srvInfo->objectImpl == "::fwData::Object" || srvInfo->objectImpl == objectClassName);
+    }
+    return isValid;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ServiceFactory::support(const std::string &object, const std::string &srvType, const std::string &srvImpl) const
+{
+    bool isSupported = true;
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    SrvRegContainer::const_iterator iter = m_srvImplTosrvInfo.find( srvImpl );
+    isSupported &= ( iter != m_srvImplTosrvInfo.end());
+    if (isSupported)
+    {
+        ServiceInfo::sptr srvInfo = iter->second;
+        isSupported &= (srvInfo->objectImpl == "::fwData::Object" || srvInfo->objectImpl == object);
+        isSupported &= (srvInfo->serviceType == srvType);
+    }
+    return isSupported;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ServiceFactory::support(const std::string & object, const std::string & srvType)
+{
+    bool isSupported = false;
+    SupportMapType::key_type key(object, srvType);
+    ::fwCore::mt::ReadToWriteLock supportMapLock(m_supportMapMutex);
+    SupportMapType::const_iterator iter = m_supportMap.find( key );
+    if (iter != m_supportMap.end())
+    {
+        isSupported = iter->second;
+    }
+    else
+    {
+        ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+        BOOST_FOREACH(SrvRegContainer::value_type srv, m_srvImplTosrvInfo)
+        {
+            ServiceInfo::sptr srvInfo = srv.second;
+            if(srvInfo->serviceType == srvType
+               && (srvInfo->objectImpl == object || srvInfo->objectImpl == "::fwData::Object") )
+            {
+                isSupported = true;
+                break;
+            }
+        }
+        ::fwCore::mt::UpgradeToWriteLock upgrade(supportMapLock);
+        m_supportMap.insert( SupportMapType::value_type(key, isSupported) );
+    }
+    return isSupported;
+}
+
+//-----------------------------------------------------------------------------
+
+ServiceFactory::KeyVectorType ServiceFactory::getFactoryKeys() const
+{
+    ::fwCore::mt::ReadLock lock(m_srvImplTosrvInfoMutex);
+    KeyVectorType vectKeys;
+    std::transform( m_srvImplTosrvInfo.begin(), m_srvImplTosrvInfo.end(),
+            std::back_inserter(vectKeys),
+            ::boost::bind(& SrvRegContainer::value_type::first,_1) );
+    return vectKeys;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace registry
+} // namespace fwServices
+
diff --git a/SrcLib/core/fwServices/src/fwServices/registry/message/detail.cpp b/SrcLib/core/fwServices/src/fwServices/registry/message/detail.cpp
new file mode 100644
index 0000000..81813d8
--- /dev/null
+++ b/SrcLib/core/fwServices/src/fwServices/registry/message/detail.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwServices/registry/message/detail.hpp"
+
+template class  ::fwCore::util::LazyInstantiator< ::fwServices::registry::message::Type >;
+
+namespace fwServices
+{
+
+namespace registry
+{
+
+namespace message
+{
+
+
+struct FwServicesRegistryMessageLazyInstantiatorTag {} ;
+
+SPTR( Type ) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwServicesRegistryMessageLazyInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace message
+
+} // namespace registry
+
+} // namespace fwServices
+
+
diff --git a/SrcLib/core/fwServices/test/CMakeLists.txt b/SrcLib/core/fwServices/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/core/fwServices/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwServices/test/Properties.cmake b/SrcLib/core/fwServices/test/Properties.cmake
new file mode 100644
index 0000000..4f06233
--- /dev/null
+++ b/SrcLib/core/fwServices/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwServicesTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwRuntime fwData fwServices )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwServices/test/cppunit.options b/SrcLib/core/fwServices/test/cppunit.options
new file mode 100644
index 0000000..13826c4
--- /dev/null
+++ b/SrcLib/core/fwServices/test/cppunit.options
@@ -0,0 +1,18 @@
+CLASSTEST=[
+    'ObjectMsgTest',
+    'ServiceTest',
+    'AppConfigTest',
+    'ServiceConfigTest',
+    'AppConfigParametersTest',
+    'ObjectServiceTest',
+    'ActiveWorkersTest',
+    'SlotsSignalsTest',
+    'SigSlotConnectionTest',
+    'SlotsSignalsStuff',
+    'ProxyTest',
+    ]
+
+USE = ['boost']
+REQUIREMENTS = ['servicesReg']
+LIB = ['fwTools_0-1','fwCore_0-1','fwRuntime_0-3','fwData_0-1','fwServices_0-1','fwTest_0-1']
+CONSOLE='yes'
diff --git a/SrcLib/core/fwServices/test/tu/include/ActiveWorkersTest.hpp b/SrcLib/core/fwServices/test/tu/include/ActiveWorkersTest.hpp
new file mode 100644
index 0000000..451e407
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ActiveWorkersTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_ACTIVEWORKERSTEST_HPP_
+#define _FWSERVICES_TEST_TU_ACTIVEWORKERSTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/// Test ActiveWorkers API
+class ActiveWorkersTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActiveWorkersTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    /// Test using ActiveWorkers API
+    void basicTest();
+
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif
diff --git a/SrcLib/core/fwServices/test/tu/include/AppConfigParametersTest.hpp b/SrcLib/core/fwServices/test/tu/include/AppConfigParametersTest.hpp
new file mode 100644
index 0000000..ace9aee
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/AppConfigParametersTest.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_APPCONFIGPARAMETERS_HPP_
+#define _FWSERVICES_TEST_TU_APPCONFIGPARAMETERS_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief Test .
+ */
+class AppConfigParametersTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( AppConfigParametersTest );
+    CPPUNIT_TEST( appConfigParametersTest );
+    CPPUNIT_TEST( concurentAccessToAppConfigParametersTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    // fonctions de tests
+    void appConfigParametersTest();
+    void concurentAccessToAppConfigParametersTest();
+
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_APPCONFIGPARAMETERS_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/AppConfigTest.hpp b/SrcLib/core/fwServices/test/tu/include/AppConfigTest.hpp
new file mode 100644
index 0000000..87ca04c
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/AppConfigTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
+#define _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief Test .
+ */
+class AppConfigTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( AppConfigTest );
+    CPPUNIT_TEST( parametersConfigTest );
+    CPPUNIT_TEST( concurentAccessToAppConfigTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    // fonctions de tests
+    void parametersConfigTest();
+    void concurentAccessToAppConfigTest();
+
+private:
+    ::fwRuntime::ConfigurationElement::sptr buildConfig();
+    ::fwRuntime::ConfigurationElement::sptr buildParametersConfig();
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/ObjectMsgTest.hpp b/SrcLib/core/fwServices/test/tu/include/ObjectMsgTest.hpp
new file mode 100644
index 0000000..d076d86
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ObjectMsgTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_OBJECTMSGTEST_HPP_
+#define _FWSERVICES_TEST_TU_OBJECTMSGTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief   Test ObjectMsg API
+ */
+class ObjectMsgTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ObjectMsgTest );
+    CPPUNIT_TEST( testObjectMsg );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+
+    /// Test using ObjectMsg API
+    void testObjectMsg();
+
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif
diff --git a/SrcLib/core/fwServices/test/tu/include/ObjectServiceTest.hpp b/SrcLib/core/fwServices/test/tu/include/ObjectServiceTest.hpp
new file mode 100644
index 0000000..51c9428
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ObjectServiceTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_OBJECTSERVICETEST_HPP_
+#define _FWSERVICES_TEST_TU_OBJECTSERVICETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief
+ */
+class ObjectServiceTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ObjectServiceTest );
+    CPPUNIT_TEST( swapTest );
+    CPPUNIT_TEST( registerTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void swapTest();
+    void registerTest();
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif //_FWSERVICES_TEST_TU_OBJECTSERVICETEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/ProxyTest.hpp b/SrcLib/core/fwServices/test/tu/include/ProxyTest.hpp
new file mode 100644
index 0000000..4e6e100
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ProxyTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_PROXYTEST_HPP_
+#define _FWSERVICES_TEST_TU_PROXYTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/// Test ActiveWorkers API
+class ProxyTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ProxyTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    /// Test using ActiveWorkers API
+    void basicTest();
+
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_PROXYTEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/ServiceConfigTest.hpp b/SrcLib/core/fwServices/test/tu/include/ServiceConfigTest.hpp
new file mode 100644
index 0000000..7a3d9e5
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ServiceConfigTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
+#define _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief Test .
+ */
+class ServiceConfigTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ServiceConfigTest );
+    CPPUNIT_TEST( serviceConfigTest );
+    CPPUNIT_TEST( concurentAccessToServiceConfigTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    // fonctions de tests
+    void serviceConfigTest();
+    void concurentAccessToServiceConfigTest();
+
+private:
+    ::fwRuntime::ConfigurationElement::sptr buildConfig();
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_APPCONFIGTEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/ServiceTest.hpp b/SrcLib/core/fwServices/test/tu/include/ServiceTest.hpp
new file mode 100644
index 0000000..e9c5104
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/ServiceTest.hpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_SERVICETEST_HPP_
+#define _FWSERVICES_TEST_TU_SERVICETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create service (with uuid, with configuration,...).
+ * And test service methods (start, stop and update).
+ */
+class ServiceTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ServiceTest );
+    CPPUNIT_TEST( testServiceCreation );
+    CPPUNIT_TEST( testServiceCreationWithTemplateMethods );
+    CPPUNIT_TEST( testServiceCreationWithUUID );
+    CPPUNIT_TEST( testStartStopUpdate );
+    CPPUNIT_TEST( testCommunication );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    // fonctions de tests
+
+    /// Test add and remove service
+    void testServiceCreation();
+
+    /// Test add and remove service using template methods
+    void testServiceCreationWithTemplateMethods();
+
+    /// Test add and remove service with UUID
+    void testServiceCreationWithUUID();
+
+    /// test start/stop/update service
+    void testStartStopUpdate();
+
+    /// test sending/receiving message
+    void testCommunication();
+
+private:
+    // create a configurationElement to build a service
+    ::fwRuntime::EConfigurationElement::sptr buildServiceConfig();
+
+    // create a configurationElement to build an object with services
+    ::fwRuntime::ConfigurationElement::sptr buildObjectConfig();
+};
+
+
+/**
+ * @brief Service interface for test
+ */
+class TestService : public ::fwServices::IService
+{
+
+public :
+
+    fwCoreServiceClassDefinitionsMacro ( (TestService)(::fwServices::IService) ) ;
+    TestService() throw()
+    :   m_isUpdated(false),
+        m_isUpdatedMessage(false)
+        {};
+
+    virtual ~TestService() throw() {};
+
+    virtual void configuring() throw( ::fwTools::Failed ) {};
+    virtual void starting() throw(::fwTools::Failed) {};
+    virtual void stopping() throw(::fwTools::Failed) {};
+    virtual void updating() throw(::fwTools::Failed) {};
+    virtual void info(std::ostream &_sstream ) {_sstream << "TestService" ;};
+
+    /// return true if the service is updated with update() method
+    bool getIsUpdated() { return m_isUpdated; };
+
+    /// return true if the service is updated with update(msg) method
+    bool getIsUpdatedMessage() { return m_isUpdatedMessage; };
+
+protected:
+    bool m_isUpdated;
+    bool m_isUpdatedMessage;
+};
+
+
+/**
+ * @brief Service implementation for test
+ */
+class TestServiceImplementation : public TestService
+{
+
+public :
+    fwCoreServiceClassDefinitionsMacro ( (TestServiceImplementation)(::fwServices::ut::TestService) ) ;
+    TestServiceImplementation() throw() {};
+    virtual ~TestServiceImplementation() throw() {};
+
+    virtual void configuring() throw( ::fwTools::Failed ) {};
+    virtual void starting() throw(::fwTools::Failed) {};
+    virtual void stopping() throw(::fwTools::Failed) {};
+    virtual void updating() throw(::fwTools::Failed)
+    {
+        m_isUpdated = true;
+    };
+
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw(::fwTools::Failed)
+    {
+        m_isUpdatedMessage = true;
+    };
+
+    virtual void info(std::ostream &_sstream ) {_sstream << "TestServiceImplementation" ;};
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif
diff --git a/SrcLib/core/fwServices/test/tu/include/SigSlotConnectionTest.hpp b/SrcLib/core/fwServices/test/tu/include/SigSlotConnectionTest.hpp
new file mode 100644
index 0000000..7b70849
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/SigSlotConnectionTest.hpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_SIGSLOTCONNECTIONTEST_HPP_
+#define _FWSERVICES_TEST_TU_SIGSLOTCONNECTIONTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwServices
+{
+namespace ut
+{
+
+class SigSlotConnectionTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SigSlotConnectionTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_SIGSLOTCONNECTIONTEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/SlotsSignalsStuff.hpp b/SrcLib/core/fwServices/test/tu/include/SlotsSignalsStuff.hpp
new file mode 100644
index 0000000..1e3d0e4
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/SlotsSignalsStuff.hpp
@@ -0,0 +1,197 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_SLOTSSIGNALSSTUFF_HPP_
+#define _FWSERVICES_TEST_TU_SLOTSSIGNALSSTUFF_HPP_
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwCom/Signals.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwServices/IService.hpp>
+
+namespace fwServices
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+class ServiceRetarder
+{
+
+public:
+
+    ServiceRetarder() :
+        m_startRetarder(500),
+        m_stopRetarder(500),
+        m_updateRetarder(500),
+        m_receiveRetarder(500),
+        m_swapRetarder(500)
+    {}
+
+    ::boost::chrono::milliseconds m_startRetarder;
+    ::boost::chrono::milliseconds m_stopRetarder;
+    ::boost::chrono::milliseconds m_updateRetarder;
+    ::boost::chrono::milliseconds m_receiveRetarder;
+    ::boost::chrono::milliseconds m_swapRetarder;
+};
+
+//------------------------------------------------------------------------------
+
+class Buffer : public ::fwData::Object
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (Buffer)(::fwData::Object),
+            (()),
+            ::fwData::factory::New< Buffer >);
+
+    Buffer( ::fwData::Object::Key key ){}
+    ~Buffer(){}
+
+    void cachedDeepCopy( const Object::csptr& _source, DeepCopyCacheType &cache ){}
+};
+
+//------------------------------------------------------------------------------
+
+class IBasicTest : public ::fwServices::IService
+{
+public:
+    fwCoreServiceClassDefinitionsMacro ( (IBasicTest)(::fwServices::IService) ) ;
+};
+
+class SBasicTest : public IBasicTest, public ServiceRetarder
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SBasicTest)(IBasicTest) ) ;
+
+    bool m_updateFinished;
+    bool m_swapFinished;
+
+    SBasicTest();
+
+protected:
+
+    virtual void configuring() throw ( ::fwTools::Failed ){}
+    virtual void starting() throw ( ::fwTools::Failed );
+    virtual void stopping() throw ( ::fwTools::Failed );
+    virtual void swapping() throw ( ::fwTools::Failed );
+    virtual void updating() throw ( ::fwTools::Failed );
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed ){}
+};
+
+//------------------------------------------------------------------------------
+
+class SReaderTest : public IBasicTest
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SReaderTest)(IBasicTest) ) ;
+
+    SReaderTest(){};
+
+protected:
+
+    virtual void configuring() throw ( ::fwTools::Failed ){}
+    virtual void starting() throw ( ::fwTools::Failed ){}
+    virtual void stopping() throw ( ::fwTools::Failed ){}
+    virtual void swapping() throw ( ::fwTools::Failed ){};
+    virtual void updating() throw ( ::fwTools::Failed );
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed ){}
+};
+
+//------------------------------------------------------------------------------
+
+class SReader2Test : public IBasicTest
+{
+public:
+
+    typedef ::fwCom::Signal< void () > ChangedSignalType;
+
+    fwCoreServiceClassDefinitionsMacro ( (SReader2Test)(IBasicTest) ) ;
+
+    SReader2Test();
+
+    static const ::fwCom::Signals::SignalKeyType s_CHANGED_SIG;
+
+protected:
+
+    virtual void configuring() throw ( ::fwTools::Failed ){}
+    virtual void starting() throw ( ::fwTools::Failed ){}
+    virtual void stopping() throw ( ::fwTools::Failed ){}
+    virtual void swapping() throw ( ::fwTools::Failed ){};
+    virtual void updating() throw ( ::fwTools::Failed );
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed ){}
+
+    ChangedSignalType::sptr m_sigChanged;
+};
+
+//------------------------------------------------------------------------------
+
+class SShowTest : public IBasicTest, public ServiceRetarder
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SShowTest)(IBasicTest) ) ;
+
+
+    SShowTest();
+
+    int m_receiveCount;
+    int m_changeCount;
+
+    void change();
+
+    static const ::fwCom::Slots::SlotKeyType s_CHANGE_SLOT;
+    typedef ::fwCom::Slot<void()> ChangeSlotType;
+
+protected:
+
+    virtual void configuring() throw ( ::fwTools::Failed ){}
+    virtual void starting() throw ( ::fwTools::Failed ){}
+    virtual void stopping() throw ( ::fwTools::Failed ){}
+    virtual void swapping() throw ( ::fwTools::Failed ){}
+    virtual void updating() throw ( ::fwTools::Failed ){}
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+
+    ChangeSlotType::sptr m_slotChange;
+
+    ::fwCore::mt::Mutex m_mutex;
+};
+
+//------------------------------------------------------------------------------
+
+class SShow2Test : public IBasicTest, public ServiceRetarder
+{
+public:
+
+    fwCoreServiceClassDefinitionsMacro ( (SShow2Test)(IBasicTest) ) ;
+
+
+    SShow2Test();
+
+    int m_receiveCount;
+
+protected:
+
+    virtual void configuring() throw ( ::fwTools::Failed ){}
+    virtual void starting() throw ( ::fwTools::Failed ){}
+    virtual void stopping() throw ( ::fwTools::Failed ){}
+    virtual void swapping() throw ( ::fwTools::Failed ){}
+    virtual void updating() throw ( ::fwTools::Failed );
+    virtual void receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed );
+};
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_SLOTSSIGNALSSTUFF_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/include/SlotsSignalsTest.hpp b/SrcLib/core/fwServices/test/tu/include/SlotsSignalsTest.hpp
new file mode 100644
index 0000000..23b3c44
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/include/SlotsSignalsTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSERVICES_TEST_TU_SLOTSSIGNALSTEST_HPP_
+#define _FWSERVICES_TEST_TU_SLOTSSIGNALSTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwServices
+{
+namespace ut
+{
+
+class SlotsSignalsTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SlotsSignalsTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST( comObjectServiceTest );
+    CPPUNIT_TEST( comServiceToServiceTest );
+    CPPUNIT_TEST( blockConnectionTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+    void comObjectServiceTest();
+    void comServiceToServiceTest();
+    void blockConnectionTest();
+
+};
+
+} //namespace ut
+} //namespace fwServices
+
+#endif // _FWSERVICES_TEST_TU_SLOTSSIGNALSTEST_HPP_
diff --git a/SrcLib/core/fwServices/test/tu/rc/AppConfigParametersTest/plugin.xml b/SrcLib/core/fwServices/test/tu/rc/AppConfigParametersTest/plugin.xml
new file mode 100644
index 0000000..ca1e7c5
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/rc/AppConfigParametersTest/plugin.xml
@@ -0,0 +1,21 @@
+<plugin id="AppConfigParametersTest">
+
+    <requirement id="servicesReg" />
+
+    <extension implements="::fwServices::registry::AppConfigParameters">
+        <id>id1</id>
+        <parameters>
+            <param name="param1" value="value1" />
+            <param name="param2" value="value2" />
+        </parameters>
+    </extension>
+    
+    <extension implements="::fwServices::registry::AppConfigParameters">
+        <id>id2</id>
+        <parameters>
+            <param name="param3" value="value3" />
+            <param name="param4" value="value4" />
+        </parameters>
+    </extension>
+
+</plugin>
diff --git a/SrcLib/core/fwServices/test/tu/src/ActiveWorkersTest.cpp b/SrcLib/core/fwServices/test/tu/src/ActiveWorkersTest.cpp
new file mode 100644
index 0000000..6231de9
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ActiveWorkersTest.cpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include "ActiveWorkersTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ActiveWorkersTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ActiveWorkersTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ActiveWorkersTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ActiveWorkersTest::basicTest()
+{
+    using namespace ::fwServices::registry;
+
+    ActiveWorkers::sptr activeWorkers = ActiveWorkers::getDefault();
+    CPPUNIT_ASSERT( ! activeWorkers->getWorker( ActiveWorkers::s_DEFAULT_WORKER ) );
+
+    activeWorkers->initRegistry();
+    CPPUNIT_ASSERT( activeWorkers->getWorker( ActiveWorkers::s_DEFAULT_WORKER ) );
+
+    CPPUNIT_ASSERT( ! activeWorkers->getWorker( "Wrong_id" ) );
+
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+    activeWorkers->addWorker("another_worker",worker);
+    CPPUNIT_ASSERT( activeWorkers->getWorker( "another_worker" ) );
+
+    activeWorkers->clearRegistry();
+    CPPUNIT_ASSERT( ! activeWorkers->getWorker( "another_worker" ) );
+    CPPUNIT_ASSERT( ! activeWorkers->getWorker( ActiveWorkers::s_DEFAULT_WORKER ) );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/AppConfigParametersTest.cpp b/SrcLib/core/fwServices/test/tu/src/AppConfigParametersTest.cpp
new file mode 100644
index 0000000..c64b0b0
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/AppConfigParametersTest.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwRuntime/Runtime.hpp>
+#include <fwRuntime/Bundle.hpp>
+
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/registry/AppConfigParameters.hpp>
+
+#include <fwTest/helper/Thread.hpp>
+
+#include "AppConfigParametersTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::AppConfigParametersTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+void AppConfigParametersTest::setUp()
+{
+    // Set up context before running a test.
+    // Bundles location
+#ifdef SPECIALINSTALL
+    ::boost::filesystem::path bundlesLocation = BUNDLEPATH;
+#else
+    ::boost::filesystem::path bundlesLocation =  ::boost::filesystem::current_path() / "Bundles";
+#endif
+    CPPUNIT_ASSERT(::boost::filesystem::exists(bundlesLocation));
+    ::fwRuntime::Runtime * runtime = ::fwRuntime::Runtime::getDefault();
+
+    // Read bundles
+    runtime->addBundles(bundlesLocation);
+	#ifdef SPECIALINSTALL
+    		::boost::filesystem::path location = std::string(SHAREPATH) + "tu_exec_fwServices_0-0";
+	#else
+		::boost::filesystem::path location = ::boost::filesystem::current_path() / "share/tu_exec_fwServices_0-0";
+	#endif
+
+    if( ! ::boost::filesystem::exists( location ) )
+    {
+#ifdef SPECIALINSTALL
+	location = std::string(SHAREPATH) + "tu_xml_fwServices_0-0";
+#else
+	location = ::boost::filesystem::current_path() / "share/tu_xml_fwServices_0-0";
+#endif
+
+    }
+    CPPUNIT_ASSERT(::boost::filesystem::exists(location));
+
+    runtime->addBundles(location);
+    CPPUNIT_ASSERT(runtime->bundlesBegin() !=  runtime->bundlesEnd());
+
+    // Test bundle servicesReg
+    ::boost::shared_ptr< ::fwRuntime::Bundle > bundle = runtime->findBundle("servicesReg");
+    bundle->setEnable(true);
+
+    // Test bundle servicesReg
+    ::boost::shared_ptr< ::fwRuntime::Bundle > bundle2 = runtime->findBundle("AppConfigParametersTest");
+    bundle2->setEnable(true);
+
+    ::fwServices::registry::AppConfigParameters::sptr appConfigParam;
+    appConfigParam = ::fwServices::registry::AppConfigParameters::getDefault();
+    appConfigParam->parseBundleInformation();
+}
+
+//------------------------------------------------------------------------------
+
+void AppConfigParametersTest::tearDown()
+{
+    // Clean up after the test run.
+    ::fwServices::registry::AppConfigParameters::sptr appConfigParameters;
+    appConfigParameters = ::fwServices::registry::AppConfigParameters::getDefault();
+    appConfigParameters->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+void AppConfigParametersTest::appConfigParametersTest()
+{
+    ::fwServices::registry::AppConfigParameters::sptr appConfigParam;
+    appConfigParam = ::fwServices::registry::AppConfigParameters::getDefault();
+
+    ::fwServices::registry::AppConfig::FieldAdaptorType parameters =  appConfigParam->getParameters("id1");
+    CPPUNIT_ASSERT(!parameters.empty());
+    CPPUNIT_ASSERT_EQUAL(std::string("value1"), parameters["param1"]);
+
+    ::fwServices::registry::AppConfig::FieldAdaptorType parameters2 =  appConfigParam->getParameters("id2");
+    CPPUNIT_ASSERT(!parameters2.empty());
+    CPPUNIT_ASSERT_EQUAL(std::string("value3"), parameters2["param3"]);
+}
+
+//------------------------------------------------------------------------------
+
+void AppConfigParametersTest::concurentAccessToAppConfigParametersTest()
+{
+    const unsigned int nbThreads = 20;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&AppConfigParametersTest::appConfigParametersTest, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/AppConfigTest.cpp b/SrcLib/core/fwServices/test/tu/src/AppConfigTest.cpp
new file mode 100644
index 0000000..38180fe
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/AppConfigTest.cpp
@@ -0,0 +1,150 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwData/String.hpp>
+#include <fwTest/helper/Thread.hpp>
+
+#include "AppConfigTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::AppConfigTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+void AppConfigTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void AppConfigTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void AppConfigTest::parametersConfigTest()
+{
+    ::fwServices::registry::AppConfig::sptr currentAppConfig = ::fwServices::registry::AppConfig::getDefault();
+
+    const std::string configId(::fwServices::registry::AppConfig::getUniqueIdentifier());
+    const ::fwServices::registry::AppInfo::ConfigType configType(::fwServices::registry::AppInfo::PARAMETERS);
+    const std::string group("parametersGroup");
+    const std::string desc("Descritpion");
+    ::fwServices::registry::AppInfo::ParamatersType parameters;
+
+    parameters["TEST_IMAGE"] = "";
+    parameters["UID_SERVICE2"] = "myTestService2";
+    parameters["GENERIC_UID"] = "";
+
+    ::fwRuntime::ConfigurationElement::csptr config = this->buildParametersConfig();
+
+    currentAppConfig->addAppInfo(configId, configType, group, desc, parameters, config);
+
+    std::vector< std::string > allCconfigs = currentAppConfig->getAllConfigs();
+    CPPUNIT_ASSERT( !allCconfigs.empty());
+
+    std::vector< std::string > configs = currentAppConfig->getConfigsFromGroup(group);
+    CPPUNIT_ASSERT(!configs.empty());
+
+    ::fwServices::registry::AppConfig::FieldAdaptorType replaceFields;
+    replaceFields["TEST_IMAGE"] = "objectUUID";
+    const std::string uniqueIdentifier = ::fwServices::registry::AppConfig::getUniqueIdentifier();
+    replaceFields["GENERIC_UID"] = uniqueIdentifier;
+
+    ::fwRuntime::ConfigurationElement::csptr configEltAdaptedConst;
+    configEltAdaptedConst = currentAppConfig->getAdaptedTemplateConfig(configId, replaceFields);
+
+    ::fwRuntime::ConfigurationElement::sptr configEltAdapted;
+    configEltAdapted =  ::fwRuntime::ConfigurationElement::constCast(configEltAdaptedConst);
+
+    std::string uid = configEltAdapted->getAttributeValue("uid");
+    CPPUNIT_ASSERT_EQUAL(std::string("objectUUID"), uid );
+
+    std::vector< ::fwRuntime::ConfigurationElement::sptr >  servicesCfg = configEltAdapted->find("service");
+
+    std::string serviceUid1 = servicesCfg.at(0)->getAttributeValue("uid");
+    CPPUNIT_ASSERT_EQUAL(uniqueIdentifier+"_myTestService1", serviceUid1);
+
+    std::string serviceUid2 = servicesCfg.at(1)->getAttributeValue("uid");
+    CPPUNIT_ASSERT_EQUAL( std::string("myTestService2"), serviceUid2);
+
+}
+
+//-----------------------------------------------------------------------------
+
+void AppConfigTest::concurentAccessToAppConfigTest()
+{
+    const unsigned int nbThreads = 20;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&AppConfigTest::parametersConfigTest, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+    ::fwServices::registry::AppConfig::getDefault()->clearRegistry();
+    std::vector< std::string > allCconfigs = ::fwServices::registry::AppConfig::getDefault()->getAllConfigs();
+    CPPUNIT_ASSERT(allCconfigs.empty());
+
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::sptr AppConfigTest::buildParametersConfig()
+{
+    // Configuration on fwTools::Object which uid is objectUUID
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("object")) ;
+    cfg->setAttributeValue( "uid" , "${TEST_IMAGE}") ;
+    cfg->setAttributeValue( "type" , "::fwData::Image") ;
+
+    // Object's service A
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceA = cfg->addConfigurationElement("service");
+    serviceA->setAttributeValue( "uid" , "${GENERIC_UID}_myTestService1" ) ;
+    serviceA->setAttributeValue( "type" , "::fwComEd::ut::TestService" ) ;
+    serviceA->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+    serviceA->setAttributeValue( "autoConnect" , "no" ) ;
+
+    // Object's service B
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceB = cfg->addConfigurationElement("service");
+    serviceB->setAttributeValue( "uid" , "${UID_SERVICE2}" ) ;
+    serviceB->setAttributeValue( "type" , "::fwComEd::ut::TestService" ) ;
+    serviceB->setAttributeValue( "impl" , "::fwComEd::ut::TestServiceImplementationImage" ) ;
+    serviceB->setAttributeValue( "autoConnect" , "no" ) ;
+
+    // Start method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startA = cfg->addConfigurationElement("start");
+    startA->setAttributeValue( "uid" , "myTestService1" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startB = cfg->addConfigurationElement("start");
+    startB->setAttributeValue( "uid" , "myTestService2" ) ;
+
+    // Update method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > updateA = cfg->addConfigurationElement("update");
+    updateA->setAttributeValue( "uid" , "myTestService1" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/ObjectMsgTest.cpp b/SrcLib/core/fwServices/test/tu/src/ObjectMsgTest.cpp
new file mode 100644
index 0000000..a2651af
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ObjectMsgTest.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+
+#include <fwServices/ObjectMsg.hpp>
+
+#include "ObjectMsgTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ObjectMsgTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ObjectMsgTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectMsgTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectMsgTest::testObjectMsg()
+{
+    const std::string EVENT1 = "EVENT1";
+    const std::string EVENT2 = "EVENT2";
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+
+    // create message with events
+    ::fwServices::ObjectMsg::sptr objMsg = ::fwServices::ObjectMsg::New();
+    objMsg->addEvent(EVENT1);
+    objMsg->addEvent(EVENT2, image);
+
+
+    // check events
+    CPPUNIT_ASSERT(objMsg->hasEvent(EVENT1));
+    CPPUNIT_ASSERT(objMsg->hasEvent(EVENT2));
+
+    // check event object
+    ::fwData::Object::sptr obj = ::fwData::Object::constCast( objMsg->getDataInfo( EVENT2 ) );
+    ::fwData::Image::sptr img = ::fwData::Image::dynamicCast( obj );
+
+    CPPUNIT_ASSERT_EQUAL(image, img);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/ObjectServiceTest.cpp b/SrcLib/core/fwServices/test/tu/src/ObjectServiceTest.cpp
new file mode 100644
index 0000000..c67fefa
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ObjectServiceTest.cpp
@@ -0,0 +1,129 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Float.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+
+#include "ServiceTest.hpp"
+#include "ObjectServiceTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ObjectServiceTest );
+
+//------------------------------------------------------------------------------
+
+namespace fwServices
+{
+namespace ut
+{
+
+void ObjectServiceTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectServiceTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectServiceTest::swapTest()
+{
+    const std::string srvType("::fwServices::ut::TestService");
+    const std::string srvImplementation("::fwServices::ut::TestServiceImplementation");
+
+    ::fwData::Integer::sptr objSrv1 = ::fwData::Integer::New();
+    ::fwData::Float::sptr objSrv2 = ::fwData::Float::New();
+
+    ::fwServices::IService::sptr service;
+    service = ::fwServices::registry::ServiceFactory::getDefault()->create( srvType, srvImplementation );
+
+    ::fwServices::registry::ObjectService osr;
+
+    osr.registerService(objSrv1, service);
+
+    typedef std::vector< ::fwServices::ut::TestService::sptr > ServiceVectorType;
+    ServiceVectorType servicesByTemplateTypeAndObj1 = osr.getServices< ::fwServices::ut::TestService >( objSrv1 );
+    ServiceVectorType servicesByTemplateTypeAndObj2 = osr.getServices< ::fwServices::ut::TestService >( objSrv2 );
+
+    CPPUNIT_ASSERT_EQUAL(size_t(1), servicesByTemplateTypeAndObj1.size());
+    CPPUNIT_ASSERT_EQUAL(size_t(0), servicesByTemplateTypeAndObj2.size());
+    ::fwServices::IService::sptr osrSrv = servicesByTemplateTypeAndObj1[0];
+    CPPUNIT_ASSERT_EQUAL(service, osrSrv);
+
+    osr.swapService(objSrv2, service);
+
+    CPPUNIT_ASSERT(objSrv2 == service->getObject());
+
+    servicesByTemplateTypeAndObj1 = osr.getServices< ::fwServices::ut::TestService >( objSrv1 );
+    servicesByTemplateTypeAndObj2 = osr.getServices< ::fwServices::ut::TestService >( objSrv2 );
+
+    CPPUNIT_ASSERT_EQUAL(size_t(0), servicesByTemplateTypeAndObj1.size());
+    CPPUNIT_ASSERT_EQUAL(size_t(1), servicesByTemplateTypeAndObj2.size());
+    osrSrv = servicesByTemplateTypeAndObj2[0];
+    CPPUNIT_ASSERT_EQUAL(service, osrSrv);
+
+    osr.unregisterService(service);
+}
+
+//------------------------------------------------------------------------------
+
+void ObjectServiceTest::registerTest()
+{
+    const std::string srvType("::fwServices::ut::TestService");
+    const std::string srvImplementation("::fwServices::ut::TestServiceImplementation");
+
+    ::fwData::Integer::sptr obj = ::fwData::Integer::New();
+
+    ::fwServices::IService::sptr service;
+    service = ::fwServices::registry::ServiceFactory::getDefault()->create( srvType, srvImplementation );
+
+    ::fwServices::registry::ObjectService osr;
+
+    osr.registerService(obj, service);
+    CPPUNIT_ASSERT(osr.has(obj, srvType) );
+
+    typedef ::fwServices::registry::ObjectService::ServiceVectorType ServiceVectorType;
+    ServiceVectorType servicesByType = osr.getServices( srvType );
+    ServiceVectorType servicesByObjAndType = osr.getServices( obj, srvType );
+    typedef std::vector< ::fwServices::ut::TestService::sptr > TestServiceVectorType;
+    TestServiceVectorType servicesByTemplateType = osr.getServices< ::fwServices::ut::TestService >( );
+    TestServiceVectorType servicesByTemplateTypeAndObj = osr.getServices< ::fwServices::ut::TestService >( obj );
+
+
+    CPPUNIT_ASSERT(servicesByType == servicesByObjAndType);
+    CPPUNIT_ASSERT(std::equal(servicesByType.begin(), servicesByType.end(), servicesByTemplateType.begin()));
+    CPPUNIT_ASSERT(std::equal(servicesByType.begin(), servicesByType.end(), servicesByTemplateTypeAndObj.begin()));
+
+    CPPUNIT_ASSERT_EQUAL(size_t(1), servicesByType.size());
+    typedef ::fwServices::registry::ObjectService::ObjectVectorType ObjectVectorType;
+    ::fwServices::IService::sptr osrService = servicesByType[0];
+    CPPUNIT_ASSERT_EQUAL(service, osrService);
+
+    ObjectVectorType objects = osr.getObjects();
+    CPPUNIT_ASSERT_EQUAL(size_t(1), objects.size());
+    ::fwData::Object::sptr osrObject = objects[0];
+    CPPUNIT_ASSERT(obj == osrObject);
+
+    osr.unregisterService(service);
+    CPPUNIT_ASSERT( osr.has(obj, srvType) == false );
+    servicesByType = osr.getServices( srvType );
+    CPPUNIT_ASSERT( servicesByType.empty() );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/ProxyTest.cpp b/SrcLib/core/fwServices/test/tu/src/ProxyTest.cpp
new file mode 100644
index 0000000..e52b537
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ProxyTest.cpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+#include <fwServices/registry/Proxy.hpp>
+
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+#include <fwCom/Slot.hpp>
+#include <fwCom/Slot.hxx>
+
+#include "ProxyTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ProxyTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ProxyTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ProxyTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+struct ProxyTestClass
+{
+    ProxyTestClass() :
+        m_methodSum(0),
+        m_methodSquare(0),
+        m_methodDoNothing(0)
+    {}
+
+    int sum(int a, int b)
+    {
+        OSLM_INFO("SUM " << a << " + " << b);
+        ++m_methodSum;
+        return a+b;
+    }
+
+    int square (int a)
+    {
+        OSLM_INFO("SQUARE " << a );
+        ++m_methodSquare;
+        return a*a;
+    }
+
+    void doNothing()
+    {
+        OSLM_INFO("DO NOTHING");
+        ++m_methodDoNothing;
+    }
+
+    int m_methodSum;
+    int m_methodSquare;
+    int m_methodDoNothing;
+};
+
+//------------------------------------------------------------------------------
+
+void ProxyTest::basicTest()
+{
+    const std::string CHANNEL = "channel";
+
+    ::fwServices::registry::Proxy::sptr proxy = ::fwServices::registry::Proxy::getDefault();
+
+    ::fwCom::Signal< void(int, int) >::sptr sig = ::fwCom::Signal< void(int, int) >::New();
+    ::fwCom::Signal< void(int, int, char) >::sptr sig2 = ::fwCom::Signal< void(int, int, char) >::New();
+
+    ProxyTestClass testObject;
+    ::fwCom::Slot< int (int, int) >::sptr slot = ::fwCom::newSlot( &ProxyTestClass::sum, &testObject );
+    ::fwCom::Slot< int (int) >::sptr slot2 = ::fwCom::newSlot( &ProxyTestClass::square, &testObject );
+    ::fwCom::Slot< void() >::sptr slot3 = ::fwCom::newSlot( &ProxyTestClass::doNothing, &testObject );
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+    slot->setWorker(worker);
+    slot2->setWorker(worker);
+    slot3->setWorker(worker);
+
+    proxy->connect(CHANNEL, sig);
+    proxy->connect(CHANNEL, sig2);
+    proxy->connect(CHANNEL, slot);
+    proxy->connect(CHANNEL, slot2);
+    proxy->connect(CHANNEL, slot3);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), sig->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(3), sig2->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), slot->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), slot2->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), slot3->getNumberOfConnections());
+    sig->asyncEmit(3, 5);
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+    CPPUNIT_ASSERT_EQUAL(1, testObject.m_methodSum);
+    CPPUNIT_ASSERT_EQUAL(1, testObject.m_methodSquare);
+    CPPUNIT_ASSERT_EQUAL(1, testObject.m_methodDoNothing);
+
+    sig2->asyncEmit(8, 2, 'x');
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+
+    CPPUNIT_ASSERT_EQUAL(2, testObject.m_methodSum);
+    CPPUNIT_ASSERT_EQUAL(2, testObject.m_methodSquare);
+    CPPUNIT_ASSERT_EQUAL(2, testObject.m_methodDoNothing);
+
+    proxy->disconnect(CHANNEL, sig);
+    proxy->disconnect(CHANNEL, sig2);
+    proxy->disconnect(CHANNEL, slot);
+    proxy->disconnect(CHANNEL, slot2);
+    proxy->disconnect(CHANNEL, slot3);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), sig->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), sig2->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), slot->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), slot2->getNumberOfConnections());
+    CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(0), slot3->getNumberOfConnections());
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/ServiceConfigTest.cpp b/SrcLib/core/fwServices/test/tu/src/ServiceConfigTest.cpp
new file mode 100644
index 0000000..223d445
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ServiceConfigTest.cpp
@@ -0,0 +1,104 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/AppConfig.hpp>
+#include <fwServices/registry/ServiceConfig.hpp>
+#include <fwData/String.hpp>
+#include <fwTest/helper/Thread.hpp>
+
+#include "ServiceConfigTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ServiceConfigTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+void ServiceConfigTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceConfigTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceConfigTest::serviceConfigTest()
+{
+    ::fwServices::registry::ServiceConfig::sptr currentServiceConfig;
+    currentServiceConfig = ::fwServices::registry::ServiceConfig::getDefault();
+
+    const std::string configId(::fwServices::registry::AppConfig::getUniqueIdentifier());
+    const std::string service("::fwServices::ut::TestService");
+    const std::string desc("Descritpion of config");
+    ::fwRuntime::ConfigurationElement::csptr config = this->buildConfig();
+
+    currentServiceConfig->addServiceConfigInfo( configId, service, desc, config );
+
+    ::fwRuntime::ConfigurationElement::csptr serviceConfig = currentServiceConfig->getServiceConfig(configId, service);
+    CPPUNIT_ASSERT( serviceConfig );
+    CPPUNIT_ASSERT(serviceConfig->hasAttribute("uid"));
+    CPPUNIT_ASSERT_EQUAL(std::string("serviceUUID"), serviceConfig->getAttributeValue("uid"));
+
+    std::vector< std::string > configs = currentServiceConfig->getAllConfigForService(service);
+    CPPUNIT_ASSERT( ! configs.empty());
+    CPPUNIT_ASSERT(std::find(configs.begin(), configs.end(), configId) != configs.end());
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceConfigTest::concurentAccessToServiceConfigTest()
+{
+    const unsigned int nbThreads = 20;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&ServiceConfigTest::serviceConfigTest, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+    ::fwServices::registry::ServiceConfig::sptr currentServiceConfig;
+    currentServiceConfig = ::fwServices::registry::ServiceConfig::getDefault();
+    currentServiceConfig->clearRegistry();
+    std::vector< std::string > allCconfigs = currentServiceConfig->getAllConfigForService("::fwServices::ut::TestService");
+    CPPUNIT_ASSERT(allCconfigs.empty());
+}
+
+//------------------------------------------------------------------------------
+
+::fwRuntime::ConfigurationElement::sptr ServiceConfigTest::buildConfig()
+{
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceCfg ( new ::fwRuntime::EConfigurationElement("config")) ;
+    serviceCfg->setAttributeValue( "uid" , "serviceUUID") ;
+    serviceCfg->setAttributeValue( "type" , "serviceType") ;
+
+    ::fwRuntime::EConfigurationElement::sptr cfg = serviceCfg->addConfigurationElement("param");
+    cfg->setValue("Parameter") ;
+
+
+    return serviceCfg ;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/ServiceTest.cpp b/SrcLib/core/fwServices/test/tu/src/ServiceTest.cpp
new file mode 100644
index 0000000..8517b4a
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/ServiceTest.cpp
@@ -0,0 +1,297 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Integer.hpp>
+
+#include <fwServices/IService.hpp>
+#include <fwServices/IEditionService.hpp>
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+#include <fwServices/AppConfigManager.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+#include <fwServices/registry/ActiveWorkers.hpp>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+#include <fwRuntime/helper.hpp>
+
+#include "ServiceTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::ServiceTest );
+
+//------------------------------------------------------------------------------
+
+fwServicesRegisterMacro( ::fwServices::ut::TestService , ::fwServices::ut::TestServiceImplementation , ::fwData::Object ) ;
+
+//------------------------------------------------------------------------------
+
+namespace fwServices
+{
+namespace ut
+{
+
+void ServiceTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::testServiceCreation()
+{
+    ::fwData::Integer::sptr obj = ::fwData::Integer::New();
+    ::fwServices::IService::sptr service;
+
+    // Test if the object support the service
+    CPPUNIT_ASSERT( ::fwServices::registry::ServiceFactory::getDefault()->support(obj->getClassname(), "::fwServices::ut::TestService") );
+
+    // Test adding service
+    ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation");
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") );
+
+    // Test getting the service its object
+    service = ::fwServices::get(obj, "::fwServices::ut::TestService");
+    CPPUNIT_ASSERT(service);
+    CPPUNIT_ASSERT_EQUAL(obj, service->getObject< ::fwData::Integer >());
+
+    // Test erasing service
+    ::fwServices::OSR::unregisterService(service);
+    CPPUNIT_ASSERT( ::fwServices::OSR::has(obj, "::fwServices::ut::TestService") == false );
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::testServiceCreationWithTemplateMethods()
+{
+    ::fwData::Integer::sptr obj = ::fwData::Integer::New();
+    ::fwServices::ut::TestService::sptr service;
+
+    // Test if the object support the service
+    CPPUNIT_ASSERT( ::fwServices::registry::ServiceFactory::getDefault()->support(obj->getClassname(), "::fwServices::ut::TestService") );
+
+    // Test adding service
+    ::fwServices::add< ::fwServices::ut::TestService >(obj, "::fwServices::ut::TestServiceImplementation");
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") );
+
+    // Test getting the service its object
+    service = ::fwServices::get< ::fwServices::ut::TestService >(obj);
+    CPPUNIT_ASSERT(service);
+    CPPUNIT_ASSERT_EQUAL(obj, service->getObject< ::fwData::Integer >());
+
+    // Test erasing service
+    ::fwServices::OSR::unregisterService(service);
+    CPPUNIT_ASSERT( ::fwServices::OSR::has(obj, "::fwServices::ut::TestService") == false );
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::testServiceCreationWithUUID()
+{
+    const std::string myUUID = "myUUID";
+    const std::string myUUID2 = "myUUID2";
+    const std::string myUUID3 = "myUUID3";
+    size_t nbServices = 0;
+
+    ::fwData::Integer::sptr obj = ::fwData::Integer::New();
+    ::fwServices::IService::sptr service;
+    ::fwServices::IService::sptr service2;
+
+    // Test if the object support the service
+    CPPUNIT_ASSERT( ::fwServices::registry::ServiceFactory::getDefault()->support(obj->getClassname(), "::fwServices::ut::TestService") );
+
+    // Test adding service
+    service = ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation", myUUID);
+    ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation", myUUID2);
+    nbServices = 2;
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") );
+    CPPUNIT_ASSERT(::fwTools::fwID::exist(myUUID) );
+    CPPUNIT_ASSERT(::fwTools::fwID::exist(myUUID2));
+
+    // Test getting the service its object
+    service2 = ::fwServices::get(myUUID2);
+    CPPUNIT_ASSERT(service);
+    CPPUNIT_ASSERT(service2);
+    CPPUNIT_ASSERT_EQUAL(obj, service2->getObject< ::fwData::Integer >());
+    CPPUNIT_ASSERT_EQUAL(myUUID2, service2 ->getID());
+    CPPUNIT_ASSERT( !::fwTools::fwID::exist(myUUID3) );
+    CPPUNIT_ASSERT_EQUAL( nbServices, ::fwServices::OSR::getServices(obj, "::fwServices::ut::TestService").size() );
+
+    // Test erasing service
+    ::fwServices::OSR::unregisterService(service);
+    nbServices--;
+    CPPUNIT_ASSERT_EQUAL( nbServices, ::fwServices::OSR::getServices(obj, "::fwServices::ut::TestService").size() );
+    ::fwServices::OSR::unregisterService(service2);
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::testStartStopUpdate()
+{
+    const std::string myUUID = "myUUID";
+
+    ::fwData::Integer::sptr obj = ::fwData::Integer::New();
+    ::fwServices::ut::TestService::sptr service;
+
+    // Add service
+    CPPUNIT_ASSERT( ::fwServices::registry::ServiceFactory::getDefault()->support(obj->getClassname(), "::fwServices::ut::TestService") );
+    ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation", myUUID);
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") );
+
+    // Get service
+    service = ::fwServices::ut::TestService::dynamicCast( ::fwServices::get(myUUID) );
+    CPPUNIT_ASSERT(service);
+
+    // Service must be stop when it is created
+    CPPUNIT_ASSERT(service->isStopped());
+
+    // Start service
+    service->start();
+    CPPUNIT_ASSERT(service->isStarted());
+
+    // Update service
+    service->update();
+    CPPUNIT_ASSERT(service->getIsUpdated());
+
+    // Stop service
+    service->stop();
+    CPPUNIT_ASSERT(service->isStopped());
+
+    // Erase Service
+    ::fwServices::OSR::unregisterService(service);
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") == false );
+}
+
+//------------------------------------------------------------------------------
+
+void ServiceTest::testCommunication()
+{
+    registry::ActiveWorkers::sptr activeWorkers = registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    const std::string EVENT = "EVENT";
+    const std::string service1UUID = "service1UUID";
+    const std::string service2UUID = "service2UUID";
+
+    ::fwData::Composite::sptr obj = ::fwData::Composite::New();
+    ::fwServices::ut::TestService::sptr service1;
+    ::fwServices::ut::TestService::sptr service2;
+
+    // Add services
+    CPPUNIT_ASSERT( ::fwServices::registry::ServiceFactory::getDefault()->support(obj->getClassname(), "::fwServices::ut::TestService") );
+    ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation", service1UUID);
+    CPPUNIT_ASSERT(::fwServices::OSR::has(obj, "::fwServices::ut::TestService") );
+    service1 = ::fwServices::ut::TestService::dynamicCast( ::fwServices::get(service1UUID) );
+    CPPUNIT_ASSERT(service1);
+
+    ::fwServices::add(obj, "::fwServices::ut::TestService", "::fwServices::ut::TestServiceImplementation", service2UUID);
+    service2 = ::fwServices::ut::TestService::dynamicCast( ::fwServices::get(service2UUID) );
+    CPPUNIT_ASSERT(service2);
+
+    // Start services
+    service1->start().wait();
+    service2->start().wait();
+    CPPUNIT_ASSERT(service1->isStarted());
+    CPPUNIT_ASSERT(service2->isStarted());
+
+    // Create message
+    ::fwServices::ObjectMsg::sptr objMsg = ::fwServices::ObjectMsg::New();
+    objMsg->addEvent(EVENT);
+    CPPUNIT_ASSERT(objMsg->hasEvent(EVENT));
+
+    // Register communication channel
+    ::fwServices::helper::SigSlotConnection::sptr comHelper = ::fwServices::helper::SigSlotConnection::New();
+    comHelper->connect( obj, service1, service1->getObjSrvConnections() );
+    comHelper->connect( obj, service2, service2->getObjSrvConnections() );
+
+    // Service1 send notification
+    ::fwServices::IEditionService::notify(service1, obj, objMsg);
+
+    // Test if service2 has received the message
+    service1->stop().wait();
+    service2->stop().wait();
+    CPPUNIT_ASSERT(service2->getIsUpdatedMessage());
+
+    comHelper->disconnect();
+    comHelper.reset();
+
+    ::fwServices::OSR::unregisterService(service1);
+    ::fwServices::OSR::unregisterService(service2);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::EConfigurationElement > ServiceTest::buildServiceConfig()
+{
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("service")) ;
+    cfg->setAttributeValue( "uid" , "myTestService" ) ;
+    cfg->setAttributeValue( "type" , "::fwServices::ut::TestService" ) ;
+    cfg->setAttributeValue( "impl" , "::fwServices::ut::TestServiceImplementation" ) ;
+    cfg->setAttributeValue( "autoConnect" , "no" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::shared_ptr< ::fwRuntime::ConfigurationElement > ServiceTest::buildObjectConfig()
+{
+    // Configuration on fwTools::Object which uid is objectUUID
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > cfg ( new ::fwRuntime::EConfigurationElement("object")) ;
+    cfg->setAttributeValue( "uid" , "objectUUID") ;
+    cfg->setAttributeValue( "type" , "::fwData::Composite") ;
+
+    // Object's service A
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceA = cfg->addConfigurationElement("service");
+    serviceA->setAttributeValue( "uid" , "myTestService1" ) ;
+    serviceA->setAttributeValue( "type" , "::fwServices::ut::TestService" ) ;
+    serviceA->setAttributeValue( "impl" , "::fwServices::ut::TestServiceImplementation" ) ;
+    serviceA->setAttributeValue( "autoConnect" , "no" ) ;
+
+    // Object's service B
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > serviceB = cfg->addConfigurationElement("service");
+    serviceB->setAttributeValue( "uid" , "myTestService2" ) ;
+    serviceB->setAttributeValue( "type" , "::fwServices::ut::TestService" ) ;
+    serviceB->setAttributeValue( "impl" , "::fwServices::ut::TestServiceImplementation" ) ;
+    serviceB->setAttributeValue( "autoConnect" , "no" ) ;
+
+    // Start method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startA = cfg->addConfigurationElement("start");
+    startA->setAttributeValue( "uid" , "myTestService1" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > startB = cfg->addConfigurationElement("start");
+    startB->setAttributeValue( "uid" , "myTestService2" ) ;
+
+    // Update method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > updateA = cfg->addConfigurationElement("update");
+    updateA->setAttributeValue( "uid" , "myTestService1" ) ;
+
+    // Stop method from object's services
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > stopA = cfg->addConfigurationElement("stop");
+    stopA->setAttributeValue( "uid" , "myTestService1" ) ;
+    ::boost::shared_ptr< ::fwRuntime::EConfigurationElement > stopB = cfg->addConfigurationElement("stop");
+    stopB->setAttributeValue( "uid" , "myTestService2" ) ;
+
+    return cfg ;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/SigSlotConnectionTest.cpp b/SrcLib/core/fwServices/test/tu/src/SigSlotConnectionTest.cpp
new file mode 100644
index 0000000..04966e9
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/SigSlotConnectionTest.cpp
@@ -0,0 +1,79 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+#include <fwServices/macros.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "SigSlotConnectionTest.hpp"
+#include "SlotsSignalsStuff.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::SigSlotConnectionTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SigSlotConnectionTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SigSlotConnectionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SigSlotConnectionTest::basicTest()
+{
+    SLM_TRACE_FUNC();
+    registry::ActiveWorkers::sptr activeWorkers = registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    Buffer::sptr buffer = Buffer::New();
+
+    SShowTest::sptr showTestSrv = ::fwServices::factory::New<SShowTest>();
+    ::fwServices::OSR::registerService(buffer, showTestSrv);
+
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig =
+            buffer->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    ::fwServices::ObjectMsg::sptr msg = ::fwServices::ObjectMsg::New();
+    msg->addEvent(ObjectMsg::NEW_OBJECT);
+
+    ::fwServices::helper::SigSlotConnection::sptr helper = ::fwServices::helper::SigSlotConnection::New();
+
+    helper->connect( buffer, showTestSrv, showTestSrv->getObjSrvConnections() );
+    showTestSrv->start().wait();
+    fwServicesNotifyMsgMacro("SigSlotConnectionTest::basicTest()", sig, msg);
+    showTestSrv->stop().wait();
+    CPPUNIT_ASSERT_EQUAL(1, showTestSrv->m_receiveCount);
+
+    helper->disconnect();
+    showTestSrv->start().wait();
+    fwServicesNotifyMsgMacro("SigSlotConnectionTest::basicTest()", sig, msg);
+    showTestSrv->stop().wait();
+    CPPUNIT_ASSERT_EQUAL(1, showTestSrv->m_receiveCount);
+
+    ::fwServices::OSR::unregisterService(showTestSrv);
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/SlotsSignalsStuff.cpp b/SrcLib/core/fwServices/test/tu/src/SlotsSignalsStuff.cpp
new file mode 100644
index 0000000..4927506
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/SlotsSignalsStuff.cpp
@@ -0,0 +1,186 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/registry/macros.hpp>
+#include <fwData/mt/ObjectWriteLock.hpp>
+
+#include <fwCom/Connection.hpp>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+
+#include <fwCom/Signal.hpp>
+#include <fwCom/Signal.hxx>
+
+#include <fwServices/macros.hpp>
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/registry/ServiceFactory.hpp>
+
+#include "SlotsSignalsStuff.hpp"
+
+namespace fwServices
+{
+namespace ut
+{
+
+fwDataRegisterMacro(Buffer);
+
+fwServicesRegisterMacro( ::fwServices::ut::IBasicTest , ::fwServices::ut::SBasicTest , ::fwServices::ut::Buffer ) ;
+fwServicesRegisterMacro( ::fwServices::ut::IBasicTest , ::fwServices::ut::SReaderTest , ::fwServices::ut::Buffer ) ;
+fwServicesRegisterMacro( ::fwServices::ut::IBasicTest , ::fwServices::ut::SShowTest , ::fwServices::ut::Buffer ) ;
+fwServicesRegisterMacro( ::fwServices::ut::IBasicTest , ::fwServices::ut::SReader2Test , ::fwServices::ut::Buffer ) ;
+fwServicesRegisterMacro( ::fwServices::ut::IBasicTest , ::fwServices::ut::SShow2Test , ::fwServices::ut::Buffer ) ;
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+SBasicTest::SBasicTest() : m_updateFinished(false), m_swapFinished(false)
+{}
+
+//------------------------------------------------------------------------------
+
+void SBasicTest::starting() throw ( ::fwTools::Failed )
+{
+    ::boost::this_thread::sleep_for(m_startRetarder);
+}
+
+//------------------------------------------------------------------------------
+
+void SBasicTest::stopping() throw ( ::fwTools::Failed )
+{
+    ::boost::this_thread::sleep_for(m_stopRetarder);
+}
+
+//------------------------------------------------------------------------------
+
+void SBasicTest::swapping() throw ( ::fwTools::Failed )
+{
+    ::boost::this_thread::sleep_for(m_swapRetarder);
+    m_swapFinished = true;
+}
+
+//------------------------------------------------------------------------------
+
+void SBasicTest::updating() throw ( ::fwTools::Failed )
+{
+    ::boost::this_thread::sleep_for(m_updateRetarder);
+    m_updateFinished = true;
+}
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+void SReaderTest::updating() throw ( ::fwTools::Failed )
+{
+    Buffer::sptr buff = this->getObject< Buffer >();
+
+    // Emit object Modified
+    ObjectMsg::sptr msg = ObjectMsg::New();
+    msg->addEvent(ObjectMsg::NEW_OBJECT);
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = buff->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+
+    fwServicesBlockAndNotifyMsgMacro(this->getLightID(), sig, msg, m_slotReceive)
+}
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+const ::fwCom::Slots::SlotKeyType SShowTest::s_CHANGE_SLOT = "change";
+
+//------------------------------------------------------------------------------
+
+SShowTest::SShowTest() : m_receiveCount(0), m_changeCount(0)
+{
+    m_slotChange = ::fwCom::newSlot( &SShowTest::change, this ) ;
+    ::fwCom::HasSlots::m_slots( s_CHANGE_SLOT, m_slotChange );
+#ifdef COM_LOG
+    m_slotChange->setID( s_CHANGE_SLOT );
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+void SShowTest::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    Buffer::sptr buffer = this->getObject<Buffer>();
+    ::boost::this_thread::sleep_for(m_receiveRetarder);
+    ::fwData::mt::ObjectWriteLock lock(buffer);
+    ++m_receiveCount;
+}
+
+//------------------------------------------------------------------------------
+
+void SShowTest::change()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    ++m_changeCount;
+}
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+const ::fwCom::Signals::SignalKeyType SReader2Test::s_CHANGED_SIG = "changed";
+
+//------------------------------------------------------------------------------
+
+SReader2Test::SReader2Test()
+{
+    m_sigChanged = ChangedSignalType::New();
+#ifdef COM_LOG
+    m_sigChanged->setID( s_CHANGED_SIG );
+#endif
+    // Register
+    ::fwCom::HasSignals::m_signals( s_CHANGED_SIG,  m_sigChanged);
+}
+
+//------------------------------------------------------------------------------
+
+void SReader2Test::updating() throw ( ::fwTools::Failed )
+{
+    // Emit object Modified
+    SReader2Test::ChangedSignalType::sptr sig;
+    sig = this->signal< SReader2Test::ChangedSignalType >( SReader2Test::s_CHANGED_SIG );
+    fwServicesNotifyMacro(this->getLightID(), sig, ());
+}
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+
+SShow2Test::SShow2Test() : m_receiveCount(0)
+{}
+
+//------------------------------------------------------------------------------
+
+void SShow2Test::receiving( ::fwServices::ObjectMsg::csptr _msg ) throw ( ::fwTools::Failed )
+{
+    Buffer::sptr buffer = this->getObject<Buffer>();
+    ::boost::this_thread::sleep_for(m_receiveRetarder);
+    ::fwData::mt::ObjectWriteLock lock(buffer);
+    ++m_receiveCount;
+
+    this->updating();
+}
+
+//------------------------------------------------------------------------------
+
+void SShow2Test::updating() throw ( ::fwTools::Failed )
+{
+    Buffer::sptr buff = this->getObject< Buffer >();
+
+    // Emit object Modified
+    ObjectMsg::sptr msg = ObjectMsg::New();
+    msg->addEvent(ObjectMsg::NEW_OBJECT);
+    ::fwData::Object::ObjectModifiedSignalType::sptr sig;
+    sig = buff->signal< ::fwData::Object::ObjectModifiedSignalType >( ::fwData::Object::s_OBJECT_MODIFIED_SIG );
+    fwServicesBlockAndNotifyMsgMacro(this->getLightID(), sig, msg, m_slotReceive);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwServices/test/tu/src/SlotsSignalsTest.cpp b/SrcLib/core/fwServices/test/tu/src/SlotsSignalsTest.cpp
new file mode 100644
index 0000000..bedad54
--- /dev/null
+++ b/SrcLib/core/fwServices/test/tu/src/SlotsSignalsTest.cpp
@@ -0,0 +1,252 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwServices/registry/ActiveWorkers.hpp>
+#include <fwServices/registry/ObjectService.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "SlotsSignalsTest.hpp"
+#include "SlotsSignalsStuff.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwServices::ut::SlotsSignalsTest );
+
+namespace fwServices
+{
+namespace ut
+{
+
+static ::fwTest::Exception fwTestException(""); // force link with fwTest
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::basicTest()
+{
+    SLM_TRACE_FUNC();
+    using namespace ::fwServices::registry;
+
+    Buffer::sptr buffer = Buffer::New();
+    Buffer::sptr buffer2 = Buffer::New();
+
+    ActiveWorkers::sptr activeWorkers = ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+
+    SBasicTest::sptr basicTestSrv = ::fwServices::factory::New<SBasicTest>();
+    ::fwServices::OSR::registerService(buffer, basicTestSrv);
+
+    IService::SharedFutureType startFuture = basicTestSrv->start();
+    CPPUNIT_ASSERT(basicTestSrv->getStatus() != IService::STARTED);
+    startFuture.wait();
+    CPPUNIT_ASSERT(basicTestSrv->getStatus() == IService::STARTED);
+
+    IService::SharedFutureType updateFuture = basicTestSrv->update();
+    CPPUNIT_ASSERT(basicTestSrv->m_updateFinished == false);
+    updateFuture.wait();
+    CPPUNIT_ASSERT(basicTestSrv->m_updateFinished == true);
+
+    IService::SharedFutureType swapFuture = basicTestSrv->swap(buffer2);
+    CPPUNIT_ASSERT(basicTestSrv->m_swapFinished == false);
+    swapFuture.wait();
+    CPPUNIT_ASSERT(basicTestSrv->m_swapFinished == true);
+
+    IService::SharedFutureType stopFuture = basicTestSrv->stop();
+    CPPUNIT_ASSERT(basicTestSrv->getStatus() != IService::STOPPED);
+    stopFuture.wait();
+    CPPUNIT_ASSERT(basicTestSrv->getStatus() == IService::STOPPED);
+
+    ::fwServices::OSR::unregisterService(basicTestSrv);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::comObjectServiceTest()
+{
+    SLM_TRACE_FUNC();
+    Buffer::sptr buffer = Buffer::New();
+
+    registry::ActiveWorkers::sptr activeWorkers = registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+    ::fwThread::Worker::sptr worker1 = ::fwThread::Worker::New();
+    activeWorkers->addWorker("worker1",worker1);
+    ::fwThread::Worker::sptr worker2 = ::fwThread::Worker::New();
+    activeWorkers->addWorker("worker2",worker2);
+
+    {
+
+        SReaderTest::sptr readerTestSrv = ::fwServices::factory::New<SReaderTest>();
+        ::fwServices::OSR::registerService(buffer, readerTestSrv);
+
+        SShowTest::sptr showTestSrv = ::fwServices::factory::New<SShowTest>();
+        ::fwServices::OSR::registerService(buffer, showTestSrv);
+        showTestSrv->setWorker(worker1);
+
+        buffer->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(showTestSrv->slot(IService::s_RECEIVE_SLOT));
+
+        readerTestSrv->start();
+        showTestSrv->start();
+
+        readerTestSrv->update().wait();
+
+        IService::SharedFutureType stopReaderFuture = readerTestSrv->stop();
+        IService::SharedFutureType stopShowFuture = showTestSrv->stop();
+        stopReaderFuture.wait();
+        stopShowFuture.wait();
+
+        CPPUNIT_ASSERT_EQUAL(1, showTestSrv->m_receiveCount);
+
+        buffer->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->disconnect(showTestSrv->slot(IService::s_RECEIVE_SLOT));
+
+        ::fwServices::OSR::unregisterService(readerTestSrv);
+        ::fwServices::OSR::unregisterService(showTestSrv);
+    }
+
+    {
+        SReaderTest::sptr readerTestSrv = ::fwServices::factory::New<SReaderTest>();
+        ::fwServices::OSR::registerService(buffer, readerTestSrv);
+
+        SReaderTest::sptr reader2TestSrv = ::fwServices::factory::New<SReaderTest>();
+        ::fwServices::OSR::registerService(buffer, reader2TestSrv);
+        reader2TestSrv->setWorker(worker2);
+
+        SShowTest::sptr showTestSrv = ::fwServices::factory::New<SShowTest>();
+        ::fwServices::OSR::registerService(buffer, showTestSrv);
+        showTestSrv->setWorker(worker1);
+
+        buffer->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->connect(showTestSrv->slot(IService::s_RECEIVE_SLOT));
+
+        readerTestSrv->start();
+        reader2TestSrv->start();
+        showTestSrv->start();
+
+        IService::SharedFutureType updateReaderFuture = readerTestSrv->update();
+        IService::SharedFutureType updateReader2Future = reader2TestSrv->update();
+        updateReaderFuture.wait();
+        updateReader2Future.wait();
+
+        IService::SharedFutureType stopReaderFuture = readerTestSrv->stop();
+        IService::SharedFutureType stopReader2Future = reader2TestSrv->stop();
+        IService::SharedFutureType stopShowFuture = showTestSrv->stop();
+        stopReaderFuture.wait();
+        stopReader2Future.wait();
+        stopShowFuture.wait();
+
+        buffer->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->disconnect(showTestSrv->slot(IService::s_RECEIVE_SLOT));
+
+        CPPUNIT_ASSERT_EQUAL(2, showTestSrv->m_receiveCount);
+
+        ::fwServices::OSR::unregisterService(readerTestSrv);
+        ::fwServices::OSR::unregisterService(reader2TestSrv);
+        ::fwServices::OSR::unregisterService(showTestSrv);
+    }
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::comServiceToServiceTest()
+{
+    SLM_TRACE_FUNC();
+    Buffer::sptr buffer = Buffer::New();
+
+    registry::ActiveWorkers::sptr activeWorkers = registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+    ::fwThread::Worker::sptr worker1 = ::fwThread::Worker::New();
+    activeWorkers->addWorker("worker1",worker1);
+
+    SReader2Test::sptr readerTestSrv = ::fwServices::factory::New<SReader2Test>();
+    ::fwServices::OSR::registerService(buffer, readerTestSrv);
+
+    SShowTest::sptr showTestSrv = ::fwServices::factory::New<SShowTest>();
+    ::fwServices::OSR::registerService(buffer, showTestSrv);
+    showTestSrv->setWorker(worker1);
+
+    readerTestSrv->signal(SReader2Test::s_CHANGED_SIG)->connect(showTestSrv->slot(SShowTest::s_CHANGE_SLOT));
+
+    readerTestSrv->start();
+    showTestSrv->start();
+
+    readerTestSrv->update().wait();
+
+    IService::SharedFutureType stopReaderFuture = readerTestSrv->stop();
+    IService::SharedFutureType stopShowFuture = showTestSrv->stop();
+    stopReaderFuture.wait();
+    stopShowFuture.wait();
+
+    readerTestSrv->signal(SReader2Test::s_CHANGED_SIG)->disconnect(showTestSrv->slot(SShowTest::s_CHANGE_SLOT));
+
+    CPPUNIT_ASSERT_EQUAL(1, showTestSrv->m_changeCount);
+
+    ::fwServices::OSR::unregisterService(readerTestSrv);
+    ::fwServices::OSR::unregisterService(showTestSrv);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+void SlotsSignalsTest::blockConnectionTest()
+{
+    SLM_TRACE_FUNC();
+    Buffer::sptr buffer = Buffer::New();
+
+    registry::ActiveWorkers::sptr activeWorkers = registry::ActiveWorkers::getDefault();
+    activeWorkers->initRegistry();
+    ::fwThread::Worker::sptr worker1 = ::fwThread::Worker::New();
+    activeWorkers->addWorker("worker1",worker1);
+
+    SReaderTest::sptr readerTestSrv = ::fwServices::factory::New<SReaderTest>();
+    ::fwServices::OSR::registerService(buffer, readerTestSrv);
+
+    SShow2Test::sptr showTestSrv = ::fwServices::factory::New<SShow2Test>();
+    ::fwServices::OSR::registerService(buffer, showTestSrv);
+    showTestSrv->setWorker(worker1);
+
+    ::fwCom::Connection connection;
+    connection = buffer->signal(::fwData::Object::s_OBJECT_MODIFIED_SIG)->
+                                            connect(showTestSrv->slot(IService::s_RECEIVE_SLOT));
+
+    readerTestSrv->start();
+    showTestSrv->start();
+
+    readerTestSrv->update();
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::seconds(8));
+
+    IService::SharedFutureType stopReaderFuture = readerTestSrv->stop();
+    IService::SharedFutureType stopShowFuture = showTestSrv->stop();
+    stopReaderFuture.wait();
+    stopShowFuture.wait();
+
+    connection.disconnect();
+
+    CPPUNIT_ASSERT_EQUAL(1, showTestSrv->m_receiveCount);
+
+    activeWorkers->clearRegistry();
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwServices
diff --git a/SrcLib/core/fwThread/CMakeLists.txt b/SrcLib/core/fwThread/CMakeLists.txt
new file mode 100644
index 0000000..beb3eff
--- /dev/null
+++ b/SrcLib/core/fwThread/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread REQUIRED)
+
+fwForwardInclude(${fwCore_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+    add_definitions(-DWIN32_LEAN_AND_MEAN)
+endif()
+
diff --git a/SrcLib/core/fwThread/COPYING b/SrcLib/core/fwThread/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwThread/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwThread/COPYING.LESSER b/SrcLib/core/fwThread/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwThread/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwThread/Properties.cmake b/SrcLib/core/fwThread/Properties.cmake
new file mode 100644
index 0000000..63c426f
--- /dev/null
+++ b/SrcLib/core/fwThread/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwThread )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwThread/bin/build.options b/SrcLib/core/fwThread/bin/build.options
new file mode 100644
index 0000000..6fd3fb5
--- /dev/null
+++ b/SrcLib/core/fwThread/bin/build.options
@@ -0,0 +1,10 @@
+USE     = ['boost', 'boostThread',]
+LIB     = [
+          'fwCore_0-1',
+          ]
+TYPE    = 'shared'
+VERSION = '0-1'
+
+
+if os.name == "nt" :
+    GLOBAL_DEF = ['WIN32_LEAN_AND_MEAN']
\ No newline at end of file
diff --git a/SrcLib/core/fwThread/include/fwThread/Namespace.hpp b/SrcLib/core/fwThread/include/fwThread/Namespace.hpp
new file mode 100644
index 0000000..f49d520
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_NAMESPACE_HPP__
+#define __FWTHREAD_NAMESPACE_HPP__
+
+/**
+ * @brief       This namespace fwThread provides few tools to execute asynchronous tasks on different threads.
+ * @namespace   fwThread
+ * 
+ * @date        2012
+ *
+ */
+namespace fwThread
+{
+}
+#endif /* __FWTHREAD_NAMESPACE_HPP__ */
diff --git a/SrcLib/core/fwThread/include/fwThread/TaskHandler.hpp b/SrcLib/core/fwThread/include/fwThread/TaskHandler.hpp
new file mode 100644
index 0000000..808500c
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/TaskHandler.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_TASKHANDLER_HPP__
+#define __FWTHREAD_TASKHANDLER_HPP__
+
+#include <boost/thread/future.hpp>
+
+namespace fwThread
+{
+
+/**
+ * @class   TaskHandler
+ * @brief   This class encapsulates packaged task and provides a copy constructor.
+ *
+ * 
+ * @date   2012.
+ */
+template <typename R>
+struct TaskHandler
+{
+    /// Constructor, moves task.
+    TaskHandler(::boost::packaged_task<R>& task);
+
+    /// Copy constructor, moves task.
+    TaskHandler(const TaskHandler& that);
+
+    /// Executes intern packaged task.
+    void operator ()() const;
+
+protected:
+
+    /// Copy constructor forbidden.
+    TaskHandler& operator=( const TaskHandler& ){};
+
+private:
+    /// Encapsulated packaged task.
+    mutable ::boost::packaged_task<R> m_task;
+};
+
+/// Encapsulate a packaged_task into a boost function to be easily posted on a worker.
+template <typename R>
+inline ::boost::function< void() > moveTaskIntoFunction(::boost::packaged_task<R>& task);
+
+} //namespace fwThread
+
+#include <fwThread/TaskHandler.hxx>
+
+#endif //__FWTHREAD_TASKHANDLER_HPP__
diff --git a/SrcLib/core/fwThread/include/fwThread/TaskHandler.hxx b/SrcLib/core/fwThread/include/fwThread/TaskHandler.hxx
new file mode 100644
index 0000000..e654808
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/TaskHandler.hxx
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+namespace fwThread
+{
+template <typename R>
+TaskHandler<R>::TaskHandler(::boost::packaged_task<R>& task) : m_task(::boost::move(task))
+{}
+
+template <typename R>
+TaskHandler<R>::TaskHandler(const TaskHandler& that) : m_task(::boost::move(that.m_task))
+{}
+
+template <typename R>
+void TaskHandler<R>::operator ()() const
+{
+    this->m_task();
+}
+
+
+template <typename R>
+inline ::boost::function< void() > moveTaskIntoFunction(::boost::packaged_task<R>& task)
+{
+    return TaskHandler<R>(task);
+}
+
+} //namespace fwThread
+
diff --git a/SrcLib/core/fwThread/include/fwThread/Timer.hpp b/SrcLib/core/fwThread/include/fwThread/Timer.hpp
new file mode 100644
index 0000000..9d9e851
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/Timer.hpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_TIMER_HPP__
+#define __FWTHREAD_TIMER_HPP__
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwCore/mt/types.hpp>
+
+#include "fwThread/Worker.hpp"
+#include "fwThread/config.hpp"
+
+
+namespace fwThread
+{
+
+/**
+ * @class Timer
+ * @brief The Timer class provides single-shot or repetitive timers.
+ * A Timer triggers a function once after a delay, or periodically, inside the
+ * worker loop. The delay or the period is defined by the duration attribute.
+ *
+ * Timer's function must be set before starting the timer.
+ *
+ * 
+ * @date   2012.
+ */
+class FWTHREAD_CLASS_API Timer : public ::fwCore::BaseObject
+{
+public:
+    /**
+     * @name Typedefs
+     * @{ */
+    typedef ::boost::shared_ptr< Timer >        sptr;
+    typedef ::boost::function< void() >         FunctionType;
+    typedef ::boost::chrono::duration<double>   TimeDurationType;
+    /**  @} */
+
+
+
+    FWTHREAD_API ~Timer();
+
+    /// Starts or restarts the timer.
+    FWTHREAD_API virtual void start() = 0;
+
+    /// Stops the timer and cancel all pending operations.
+    FWTHREAD_API virtual void stop(){};
+
+    /// Sets time duration.
+    FWTHREAD_API virtual void setDuration(TimeDurationType duration) = 0;
+
+    /// Sets the function to be triggered when time duration expires.
+    template< typename F >
+    void setFunction(F f)
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        m_function = f;
+        updatedFunction();
+    }
+
+    /// Returns if the timer mode is 'one shot'.
+    virtual bool isOneShot() const = 0;
+
+    /// Sets timer mode.
+    virtual void setOneShot(bool oneShot) = 0;
+
+    /// Returns true if the timer is currently running.
+    virtual bool isRunning() const = 0;
+
+protected:
+
+    /**
+     * @brief Constructs a Timer.
+     * By default, a the Timer mode is repetitive.
+     */
+    FWTHREAD_API Timer();
+
+    /// Copy constructor forbidden.
+    Timer( const Timer& );
+
+    /// Copy operator forbidden.
+    Timer& operator=( const Timer& );
+
+    /// This method is triggered when Timer's function is changed.
+    FWTHREAD_API virtual void updatedFunction(){};
+
+    /// Function object to execute each time the timer expires.
+    FunctionType      m_function;
+
+    mutable ::fwCore::mt::Mutex m_mutex;
+};
+
+} //namespace fwThread
+
+#endif //__FWTHREAD_TIMER_HPP__
+
diff --git a/SrcLib/core/fwThread/include/fwThread/Worker.hpp b/SrcLib/core/fwThread/include/fwThread/Worker.hpp
new file mode 100644
index 0000000..649a1f0
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/Worker.hpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_WORKER_HPP__
+#define __FWTHREAD_WORKER_HPP__
+
+#include <boost/any.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/thread.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/HiResClock.hpp>
+
+#include "fwThread/config.hpp"
+
+
+namespace fwThread
+{
+typedef ::boost::thread::id ThreadIdType;
+
+/// Returns the current thread id
+FWTHREAD_API ThreadIdType getCurrentThreadId();
+
+class Timer;
+
+/**
+ * @class   Worker
+ * @brief   This class creates and manages a task loop.
+ * The default implementation create a loop in a new thread.
+ *
+ * 
+ * @date   2012.
+ */
+class FWTHREAD_CLASS_API Worker : public ::fwCore::BaseObject
+{
+public:
+    typedef ::fwCore::HiResClock::HiResClockType PeriodType;
+    typedef ::boost::function< void() > TaskType;
+    typedef ::boost::any                ExitReturnType;
+
+    typedef ::boost::shared_future< ExitReturnType > FutureType;
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Worker)(::fwCore::BaseObject), (()), defaultFactory );
+
+    Worker(){}
+
+    /// Waits for the last task to be processed and stops the loop
+    FWTHREAD_API virtual void stop() = 0;
+
+    /// Requests invocation of the given task handler and returns immediately.
+    virtual void post(TaskType handler) = 0;
+
+    /**
+     * @brief Requests invocation of the given callable and returns a shared future.
+     *
+     * Returns immediately if called from another thread. Otherwise, the given callable is called
+     * immediately.
+     *
+     * @tparam R future's value type
+     * @tparam CALLABLE Any type wrappable with a boost::function< void() >
+     *
+     * @returns a boost::shared_future associated with the result of the given callable
+     */
+    template< typename R, typename CALLABLE >
+    ::boost::shared_future< R > postTask(CALLABLE f);
+
+    /// Returns the worker's thread id
+    FWTHREAD_API virtual ThreadIdType getThreadId() const = 0;
+
+    /// Creates and returns a ::fwThread::Timer running in this Worker
+    FWTHREAD_API virtual SPTR(::fwThread::Timer) createTimer() = 0;
+
+    /**
+     * @brief Returns a boost::shared_future associated with the execution of Worker's loop
+     * @warning Calling getFuture() may be blocking if it is required by a specific implementation (for example, the Qt implementation).
+     */
+    FWTHREAD_API virtual FutureType getFuture()
+    {
+        return m_future;
+    }
+
+    /**
+     * @brief Processes worker pending tasks for the calling thread
+     * for maxtime milliseconds or until there are no more tasks to process.
+     * You can call this function occasionally when your program is busy performing a long operation.
+     *
+     * @param maxtime milliseconds to process worker pending tasks.
+     * @warning Qt implementation processes all Qt and Worker pending events, be careful.
+     * @warning WxWidgets version is not yet implemented.
+     */
+    FWTHREAD_API virtual void processTasks(PeriodType maxtime) = 0;
+
+    /**
+     * @brief Processes all worker pending tasks for the calling thread
+     * until there are no more tasks to process.
+     * You can call this function occasionally when your program is busy performing a long operation.
+     * @warning WxWidgets version is not yet implemented.
+     */
+    FWTHREAD_API virtual void processTasks() = 0;
+
+protected:
+
+    /// Creates and returns a new instance of Worker default implementation
+    /// (boost::Asio).
+    FWTHREAD_API static SPTR(Worker) defaultFactory();
+
+    /// Copy constructor forbidden
+    Worker( const Worker& );
+
+    /// Copy operator forbidden
+    Worker& operator=( const Worker& );
+
+
+    /// Worker's loop future
+    FutureType m_future;
+};
+
+} //namespace fwThread
+
+#include "fwThread/Worker.hxx"
+
+#endif //__FWTHREAD_WORKER_HPP__
diff --git a/SrcLib/core/fwThread/include/fwThread/Worker.hxx b/SrcLib/core/fwThread/include/fwThread/Worker.hxx
new file mode 100644
index 0000000..4e0061b
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/Worker.hxx
@@ -0,0 +1,40 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_WORKER_HXX__
+#define __FWTHREAD_WORKER_HXX__
+
+#include <boost/thread/future.hpp>
+
+#include <fwThread/TaskHandler.hpp>
+
+
+namespace fwThread
+{
+
+template< typename R, typename TASK >
+::boost::shared_future< R > Worker::postTask(TASK f)
+{
+    ::boost::packaged_task< R > task( f );
+    ::boost::future< R > ufuture = task.get_future();
+
+    ::boost::function< void () > ftask = ::fwThread::moveTaskIntoFunction(task);
+
+    if( ::fwThread::getCurrentThreadId() == this->getThreadId())
+    {
+        ftask();
+    }
+    else
+    {
+        this->post(ftask);
+    }
+
+    return ::boost::move(ufuture);
+}
+
+} //namespace fwThread
+
+#endif // __FWTHREAD_WORKER_HXX__
diff --git a/SrcLib/core/fwThread/include/fwThread/config.hpp b/SrcLib/core/fwThread/include/fwThread/config.hpp
new file mode 100644
index 0000000..25a9cb0
--- /dev/null
+++ b/SrcLib/core/fwThread/include/fwThread/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWTHREAD_CONFIG_HPP_
+#define _FWTHREAD_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWTHREAD_EXPORTS
+    #define FWTHREAD_API __declspec(dllexport)
+    #else
+    #define FWTHREAD_API __declspec(dllimport)
+    #endif
+
+    #define FWTHREAD_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWTHREAD_EXPORTS
+    #define FWTHREAD_API __attribute__ ((visibility("default")))
+    #define FWTHREAD_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWTHREAD_API __attribute__ ((visibility("hidden")))
+    //#define FWTHREAD_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWTHREAD_API
+    #define FWTHREAD_CLASS_API
+    #endif
+
+#else
+
+    #define FWTHREAD_API
+    #define FWTHREAD_CLASS_API
+
+#endif
+
+#endif //_FWTHREAD_CONFIG_HPP_
diff --git a/SrcLib/core/fwThread/src/fwThread/Timer.cpp b/SrcLib/core/fwThread/src/fwThread/Timer.cpp
new file mode 100644
index 0000000..972453a
--- /dev/null
+++ b/SrcLib/core/fwThread/src/fwThread/Timer.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwThread/Timer.hpp"
+
+namespace fwThread
+{
+
+Timer::Timer()
+{
+}
+
+Timer::~Timer()
+{
+    this->stop();
+}
+
+} //namespace fwThread
+
diff --git a/SrcLib/core/fwThread/src/fwThread/Worker.cpp b/SrcLib/core/fwThread/src/fwThread/Worker.cpp
new file mode 100644
index 0000000..20514ed
--- /dev/null
+++ b/SrcLib/core/fwThread/src/fwThread/Worker.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/bind.hpp>
+
+#include "fwThread/Worker.hpp"
+
+namespace fwThread
+{
+
+ThreadIdType getCurrentThreadId()
+{
+    return ::boost::this_thread::get_id();
+}
+
+
+//SPTR(Worker) Worker::defaultFactory() => WorkerAsio.cpp
+
+} //namespace fwThread
diff --git a/SrcLib/core/fwThread/src/fwThread/WorkerAsio.cpp b/SrcLib/core/fwThread/src/fwThread/WorkerAsio.cpp
new file mode 100644
index 0000000..e61ea91
--- /dev/null
+++ b/SrcLib/core/fwThread/src/fwThread/WorkerAsio.cpp
@@ -0,0 +1,302 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+#include <boost/asio/deadline_timer.hpp>
+#include <boost/asio/io_service.hpp>
+#include <boost/bind.hpp>
+
+#include <fwCore/TimeStamp.hpp>
+
+#include "fwThread/Worker.hpp"
+#include "fwThread/Timer.hpp"
+
+namespace fwThread
+{
+
+std::size_t WorkerThread( ::boost::asio::io_service & io_service )
+{
+    OSLM_TRACE("Thread " << getCurrentThreadId() <<" Start");
+    std::size_t res = io_service.run();
+    OSLM_TRACE("Thread " << getCurrentThreadId() <<" Finish");
+    return res;
+}
+
+
+/**
+ * @brief Private implementation of fwThread::Worker using boost::asio.
+ */
+class WorkerAsio : public ::fwThread::Worker
+{
+public:
+    typedef ::boost::asio::io_service IOServiceType;
+    typedef ::boost::asio::io_service::work WorkType;
+    typedef ::boost::shared_ptr< WorkType > WorkPtrType;
+    typedef ::boost::thread ThreadType;
+
+
+    WorkerAsio();
+
+    virtual ~WorkerAsio();
+
+    void stop();
+
+    void post(TaskType handler);
+
+    ThreadIdType getThreadId() const;
+
+    SPTR(::fwThread::Timer) createTimer();
+
+    virtual void processTasks();
+
+    virtual void processTasks(PeriodType maxtime);
+
+protected:
+
+    /// Copy constructor forbidden
+    WorkerAsio( const WorkerAsio& );
+
+    /// Copy operator forbidden
+    WorkerAsio& operator=( const WorkerAsio& );
+
+    /// Class provides functionality to manipulate asynchronous tasks.
+    IOServiceType m_ioService;
+
+    /// Class to inform the io_service when it has work to do.
+    WorkPtrType m_work;
+
+    /// Thread created and managed by the worker.
+    SPTR(ThreadType) m_thread;
+};
+
+
+//------------------------------------------------------------------------------
+
+
+/**
+ * @class TimerAsio
+ * @brief Private Timer implementation using boost::asio.
+ *
+ * 
+ * @date   2012.
+ */
+class TimerAsio : public ::fwThread::Timer
+{
+public:
+    /**
+     * @brief Constructs a TimerAsio from given io_service.
+     */
+    TimerAsio(::boost::asio::io_service &ioSrv);
+
+    ~TimerAsio();
+
+    /// Starts or restarts the timer.
+    void start();
+
+    /// Stops the timer and cancel all pending operations.
+    void stop();
+
+    /// Sets time duration.
+    void setDuration(TimeDurationType duration);
+
+    /// Returns if the timer mode is 'one shot'.
+    bool isOneShot() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_oneShot;
+    }
+
+    /// Sets timer mode.
+    void setOneShot(bool oneShot)
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        m_oneShot = oneShot;
+    }
+
+    /// Returns true if the timer is currently running.
+    bool isRunning() const
+    {
+        ::fwCore::mt::ScopedLock lock(m_mutex);
+        return m_running;
+    }
+
+protected:
+
+    void cancelNoLock();
+    void rearmNoLock(TimeDurationType duration);
+
+    void call(const ::boost::system::error_code & code);
+
+
+    /// Copy constructor forbidden.
+    TimerAsio( const TimerAsio& );
+
+    /// Copy operator forbidden.
+    TimerAsio& operator=( const TimerAsio& );
+
+    /// Timer object.
+    ::boost::asio::deadline_timer m_timer;
+
+    /// Time to wait until timer's expiration.
+    TimeDurationType m_duration;
+
+    /// Timer's mode.
+    bool             m_oneShot;
+
+    /// Timer's state.
+    bool             m_running;
+};
+
+//------------------------------------------------------------------------------
+
+
+// ---------- WorkerAsio private implementation ----------
+
+WorkerAsio::WorkerAsio() :
+    m_ioService(),
+    m_work( ::boost::make_shared< WorkType >(::boost::ref(m_ioService)) )
+{
+    ::boost::packaged_task< ::fwThread::Worker::ExitReturnType > task( ::boost::bind(&WorkerThread, ::boost::ref(m_ioService)) );
+    ::boost::future< ::fwThread::Worker::ExitReturnType > ufuture = task.get_future();
+
+    m_thread = ::boost::make_shared< ThreadType >( ::boost::move( task ) );
+
+    m_future = ::boost::move(ufuture);
+}
+
+WorkerAsio::~WorkerAsio()
+{
+    if(!m_ioService.stopped())
+    {
+        this->stop();
+    }
+}
+
+void WorkerAsio::stop()
+{
+    m_work.reset();
+    m_thread->join();
+}
+
+SPTR(::fwThread::Timer) WorkerAsio::createTimer()
+{
+    return ::boost::make_shared< TimerAsio >(::boost::ref(m_ioService));
+}
+
+void WorkerAsio::post(TaskType handler)
+{
+    m_ioService.post(handler);
+}
+
+
+ThreadIdType WorkerAsio::getThreadId() const
+{
+    return m_thread->get_id();
+}
+
+void WorkerAsio::processTasks()
+{
+    m_ioService.poll();
+}
+
+void WorkerAsio::processTasks(PeriodType maxtime)
+{
+    ::fwCore::TimeStamp timeStamp;
+    timeStamp.setLifePeriod(maxtime);
+    timeStamp.modified();
+    while(timeStamp.periodExpired())
+    {
+        m_ioService.poll_one();
+    }
+}
+
+// ---------- Worker ----------
+SPTR(Worker) Worker::defaultFactory()
+{
+    return ::boost::make_shared< WorkerAsio >();
+}
+
+
+// ---------- Timer private implementation ----------
+
+TimerAsio::TimerAsio(::boost::asio::io_service &ioSrv) :
+    m_timer(ioSrv),
+    m_duration(::boost::chrono::seconds(1)),
+    m_oneShot(false),
+    m_running(false)
+{
+}
+
+TimerAsio::~TimerAsio()
+{
+}
+
+void TimerAsio::setDuration(TimeDurationType duration)
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    m_duration = duration;
+}
+
+void TimerAsio::start()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    this->rearmNoLock(m_duration);
+    m_running = true;
+}
+
+void TimerAsio::stop()
+{
+    ::fwCore::mt::ScopedLock lock(m_mutex);
+    if (m_running )
+    {
+        m_running = false;
+        this->cancelNoLock();
+    }
+}
+
+void TimerAsio::rearmNoLock(TimeDurationType duration)
+{
+    this->cancelNoLock();
+    ::boost::posix_time::time_duration d  =
+        ::boost::posix_time::microseconds(boost::chrono::duration_cast<boost::chrono::microseconds>(duration).count());
+    m_timer.expires_from_now( d );
+    m_timer.async_wait( ::boost::bind(&TimerAsio::call, this, _1));
+}
+
+void TimerAsio::call(const ::boost::system::error_code & error)
+{
+    if(!error)
+    {
+        TimeDurationType duration;
+        bool oneShot;
+        {
+            ::fwCore::mt::ScopedLock lock(m_mutex);
+            oneShot = m_oneShot;
+            duration = m_duration;
+        }
+
+        if (!oneShot)
+        {
+            this->rearmNoLock(duration);
+            m_function();
+        }
+        else
+        {
+            m_function();
+            ::fwCore::mt::ScopedLock lock(m_mutex);
+            m_running = false;
+        }
+    }
+}
+
+void TimerAsio::cancelNoLock()
+{
+    m_timer.cancel();
+}
+
+
+} //namespace fwThread
+
diff --git a/SrcLib/core/fwThread/test/CMakeLists.txt b/SrcLib/core/fwThread/test/CMakeLists.txt
new file mode 100644
index 0000000..8789d17
--- /dev/null
+++ b/SrcLib/core/fwThread/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/core/fwThread/test/Properties.cmake b/SrcLib/core/fwThread/test/Properties.cmake
new file mode 100644
index 0000000..005482e
--- /dev/null
+++ b/SrcLib/core/fwThread/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwThreadTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwThread )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwThread/test/cppunit.options b/SrcLib/core/fwThread/test/cppunit.options
new file mode 100644
index 0000000..c16c1bb
--- /dev/null
+++ b/SrcLib/core/fwThread/test/cppunit.options
@@ -0,0 +1,4 @@
+CLASSTEST=['WorkerTest','TaskHandlerTest']
+USE = ['boost','boostThread']
+LIB = ['fwCore_0-1', 'fwTest_0-1', 'fwThread_0-1']
+CONSOLE = 'yes'
diff --git a/SrcLib/core/fwThread/test/tu/include/TaskHandlerTest.hpp b/SrcLib/core/fwThread/test/tu/include/TaskHandlerTest.hpp
new file mode 100644
index 0000000..5815d93
--- /dev/null
+++ b/SrcLib/core/fwThread/test/tu/include/TaskHandlerTest.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_UT_TASKHANDLERTEST_HPP__
+#define __FWTHREAD_UT_TASKHANDLERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwThread
+{
+namespace ut
+{
+
+class TaskHandlerTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TaskHandlerTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST( exceptionTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+    void exceptionTest();
+
+};
+
+} //namespace ut
+} //namespace fwThread
+#endif //__FWTHREAD_UT_TASKHANDLERTEST_HPP__
diff --git a/SrcLib/core/fwThread/test/tu/include/WorkerTest.hpp b/SrcLib/core/fwThread/test/tu/include/WorkerTest.hpp
new file mode 100644
index 0000000..dc0fe23
--- /dev/null
+++ b/SrcLib/core/fwThread/test/tu/include/WorkerTest.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTHREAD_UT_WORKERTEST_HPP__
+#define __FWTHREAD_UT_WORKERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwThread
+{
+namespace ut
+{
+
+class WorkerTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( WorkerTest );
+    CPPUNIT_TEST( basicTest );
+    CPPUNIT_TEST( timerTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void basicTest();
+    void timerTest();
+
+};
+
+} //namespace ut
+} //namespace fwThread
+#endif //__FWTHREAD_UT_WORKERTEST_HPP__
diff --git a/SrcLib/core/fwThread/test/tu/src/TaskHandlerTest.cpp b/SrcLib/core/fwThread/test/tu/src/TaskHandlerTest.cpp
new file mode 100644
index 0000000..e629a1a
--- /dev/null
+++ b/SrcLib/core/fwThread/test/tu/src/TaskHandlerTest.cpp
@@ -0,0 +1,143 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/TaskHandler.hpp>
+
+#include "TaskHandlerTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwThread::ut::TaskHandlerTest );
+
+namespace fwThread
+{
+namespace ut
+{
+
+void TaskHandlerTest::setUp()
+{
+    // Set up context before running a test.
+}
+void TaskHandlerTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+int copy(int val)
+{
+    ::boost::this_thread::sleep_for( ::boost::chrono::seconds(1));
+    return val;
+}
+
+//-----------------------------------------------------------------------------
+
+void throwException()
+{
+    throw std::exception();
+}
+
+//-----------------------------------------------------------------------------
+
+void TaskHandlerTest::basicTest()
+{
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+    ::boost::packaged_task<int> task( ::boost::bind( &copy, 5) );
+    ::boost::future< int > future = task.get_future();
+    ::boost::function< void () > f = moveTaskIntoFunction(task);
+
+    ::boost::packaged_task<int> task2( ::boost::bind( &copy, 8) );
+    ::boost::future< int > future2 = task2.get_future();
+    ::boost::function< void () > f2 = moveTaskIntoFunction(task2);
+
+    worker->post(f);
+    worker->post(f2);
+
+    CPPUNIT_ASSERT( !future.is_ready() );
+    CPPUNIT_ASSERT( !future2.is_ready() );
+
+    future.wait();
+    CPPUNIT_ASSERT( future.is_ready() );
+    CPPUNIT_ASSERT( future.has_value() );
+    CPPUNIT_ASSERT( !future.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 5, future.get() );
+
+    future2.wait();
+    CPPUNIT_ASSERT( future2.is_ready() );
+    CPPUNIT_ASSERT( future2.has_value() );
+    CPPUNIT_ASSERT( !future2.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 8, future2.get() );
+
+
+    ::boost::packaged_task<int> task3( ::boost::bind( &copy, 5) );
+    ::boost::future< int > future3 = task3.get_future();
+    ::boost::function< void () > f3 = moveTaskIntoFunction(task3);
+
+    ::boost::packaged_task<int> task4( ::boost::bind( &copy, 8) );
+    ::boost::future< int > future4 = task4.get_future();
+    ::boost::function< void () > f4 = moveTaskIntoFunction(task4);
+
+    worker->post(f3);
+    worker->post(f4);
+
+    CPPUNIT_ASSERT( !future3.is_ready() );
+    CPPUNIT_ASSERT( !future4.is_ready() );
+
+    worker->stop();
+
+    CPPUNIT_ASSERT( future3.is_ready() );
+    CPPUNIT_ASSERT( future3.has_value() );
+    CPPUNIT_ASSERT( !future3.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 5, future3.get() );
+
+    CPPUNIT_ASSERT( future4.is_ready() );
+    CPPUNIT_ASSERT( future4.has_value() );
+    CPPUNIT_ASSERT( !future4.has_exception() );
+    CPPUNIT_ASSERT_EQUAL( 8, future4.get() );
+}
+
+//-----------------------------------------------------------------------------
+
+void TaskHandlerTest::exceptionTest()
+{
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+    ::boost::packaged_task<void> task( ::boost::bind( &throwException ) );
+    ::boost::future< void > future = task.get_future();
+    ::boost::function< void () > f = moveTaskIntoFunction(task);
+
+    worker->post(f);
+
+    future.wait();
+    worker->stop();
+
+    bool exceptionIsCatched = false;
+    CPPUNIT_ASSERT( future.has_exception() );
+    try
+    {
+        future.get();
+    }
+    catch (std::exception &)
+    {
+        exceptionIsCatched = true;
+    }
+    CPPUNIT_ASSERT(exceptionIsCatched);
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwThread
diff --git a/SrcLib/core/fwThread/test/tu/src/WorkerTest.cpp b/SrcLib/core/fwThread/test/tu/src/WorkerTest.cpp
new file mode 100644
index 0000000..5521336
--- /dev/null
+++ b/SrcLib/core/fwThread/test/tu/src/WorkerTest.cpp
@@ -0,0 +1,269 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <exception>
+
+#include <boost/chrono/duration.hpp>
+
+#include <fwCore/spyLog.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include <fwThread/Worker.hpp>
+#include <fwThread/Timer.hpp>
+
+#include "WorkerTest.hpp"
+
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwThread::ut::WorkerTest );
+
+namespace fwThread
+{
+namespace ut
+{
+
+static ::fwTest::Exception e(""); // force link with fwTest
+
+void WorkerTest::setUp()
+{
+    // Set up context before running a test.
+}
+void WorkerTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+
+//-----------------------------------------------------------------------------
+
+struct TestHandler
+{
+    TestHandler() : m_step(0), m_threadCheckOk(true)
+    {
+        m_constructorThreadId = ::fwThread::getCurrentThreadId();
+    }
+
+    void nextStep()
+    {
+        ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(50));
+        this->nextStepNoSleep();
+    }
+
+    void nextStepNoSleep()
+    {
+
+        m_threadCheckOk &= (m_constructorThreadId != ::fwThread::getCurrentThreadId());
+        m_threadCheckOk &= (m_workerThreadId == ::fwThread::getCurrentThreadId());
+        ++m_step;
+    }
+
+    void setWorkerId(::fwThread::ThreadIdType id)
+    {
+        m_workerThreadId = id;
+    }
+
+    int m_step;
+    bool m_threadCheckOk;
+    ::fwThread::ThreadIdType m_constructorThreadId;
+    ::fwThread::ThreadIdType m_workerThreadId;
+};
+
+//-----------------------------------------------------------------------------
+
+void WorkerTest::basicTest()
+{
+    {
+        ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+        TestHandler handler;
+        handler.setWorkerId(worker->getThreadId());
+        worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+        worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+        worker->post( ::boost::bind( &TestHandler::nextStep, &handler) );
+
+        worker->stop();
+        CPPUNIT_ASSERT_EQUAL(3, handler.m_step);
+        CPPUNIT_ASSERT_EQUAL(true, handler.m_threadCheckOk);
+    }
+
+    {
+        ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+        TestHandler handler;
+        handler.setWorkerId(worker->getThreadId());
+        worker->post( ::boost::bind( &TestHandler::nextStepNoSleep, &handler) );
+        worker->post( ::boost::bind( &TestHandler::nextStepNoSleep, &handler) );
+        worker->post( ::boost::bind( &TestHandler::nextStepNoSleep, &handler) );
+
+        worker->stop();
+        CPPUNIT_ASSERT_EQUAL(3, handler.m_step);
+        CPPUNIT_ASSERT_EQUAL(true, handler.m_threadCheckOk);
+    }
+}
+
+
+//-----------------------------------------------------------------------------
+
+void WorkerTest::timerTest()
+{
+    ::fwThread::Worker::sptr worker = ::fwThread::Worker::New();
+
+
+    TestHandler handler;
+    handler.setWorkerId(worker->getThreadId());
+
+
+    ::fwThread::Timer::sptr timer = worker->createTimer();
+
+    ::boost::chrono::milliseconds duration = ::boost::chrono::milliseconds(100) ;
+
+    timer->setFunction(  ::boost::bind( &TestHandler::nextStepNoSleep, &handler)  );
+    timer->setDuration(duration);
+
+    CPPUNIT_ASSERT(!timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+    timer->start();
+
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+    ::boost::this_thread::sleep_for( duration/10. );
+
+    for (int i = 1 ; i < 50 ; ++i)
+    {
+        ::boost::this_thread::sleep_for( duration );
+
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+
+    }
+
+    timer->stop();
+
+    ::boost::this_thread::sleep_for( duration*3 );
+
+    CPPUNIT_ASSERT(!timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(49, handler.m_step);
+
+
+    // test start after stop
+    handler.m_step = 0;
+
+    timer->start();
+
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+    ::boost::this_thread::sleep_for( duration/10. );
+
+    for (int i = 1 ; i < 50 ; ++i)
+    {
+        ::boost::this_thread::sleep_for( duration );
+
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+
+    }
+
+    timer->stop();
+
+    ::boost::this_thread::sleep_for( duration*3 );
+
+    CPPUNIT_ASSERT(!timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(49, handler.m_step);
+
+
+
+
+
+    // change timer duration on the fly
+    // change timer duration
+    handler.m_step = 0;
+
+    timer->start();
+
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+    ::boost::this_thread::sleep_for( duration/10. );
+
+    for (int i = 1 ; i < 25 ; ++i)
+    {
+        ::boost::this_thread::sleep_for( duration );
+
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+
+    }
+
+    duration = ::boost::chrono::milliseconds(50);
+    timer->setDuration(duration);
+
+    for (int i = 24 ; i < 50 ; ++i)
+    {
+        ::boost::this_thread::sleep_for( duration );
+
+        CPPUNIT_ASSERT(timer->isRunning());
+        CPPUNIT_ASSERT(handler.m_threadCheckOk);
+        CPPUNIT_ASSERT_EQUAL(i, handler.m_step);
+
+    }
+
+
+    timer->stop();
+
+    ::boost::this_thread::sleep_for( duration*3 );
+
+    CPPUNIT_ASSERT(!timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(49, handler.m_step);
+
+
+
+
+
+    // one shot test
+    handler.m_step = 0;
+
+    duration = ::boost::chrono::milliseconds(10);
+    timer->setDuration(duration);
+    timer->setOneShot(true);
+
+    timer->start();
+
+    CPPUNIT_ASSERT(timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(0, handler.m_step);
+
+    ::boost::this_thread::sleep_for( duration*10 );
+
+    CPPUNIT_ASSERT(!timer->isRunning());
+    CPPUNIT_ASSERT(handler.m_threadCheckOk);
+    CPPUNIT_ASSERT_EQUAL(1, handler.m_step);
+
+
+
+    worker->stop();
+    // CPPUNIT_ASSERT_EQUAL(3, handler.m_step);
+    // CPPUNIT_ASSERT_EQUAL(true, handler.m_threadCheckOk);
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwThread
diff --git a/SrcLib/core/fwTools/CMakeLists.txt b/SrcLib/core/fwTools/CMakeLists.txt
new file mode 100644
index 0000000..08e5b74
--- /dev/null
+++ b/SrcLib/core/fwTools/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS regex date_time chrono filesystem system signals REQUIRED)
+fwForwardInclude(${fwCore_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES} )
+
diff --git a/SrcLib/core/fwTools/COPYING b/SrcLib/core/fwTools/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwTools/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwTools/COPYING.LESSER b/SrcLib/core/fwTools/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwTools/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwTools/Properties.cmake b/SrcLib/core/fwTools/Properties.cmake
new file mode 100644
index 0000000..7074dc1
--- /dev/null
+++ b/SrcLib/core/fwTools/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwTools )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwTools/bin/build.options b/SrcLib/core/fwTools/bin/build.options
new file mode 100644
index 0000000..1d1e1f3
--- /dev/null
+++ b/SrcLib/core/fwTools/bin/build.options
@@ -0,0 +1,5 @@
+TYPE    = 'shared'
+VERSION = '0-1'
+USE     = ['boost','boostFilesystem','boostSignals','boostRegex','boostDateTime']
+LIB     = ['fwCore_0-1', 'fwCamp_0-1']
+
diff --git a/SrcLib/core/fwTools/include/fwTools/Bookmarks.hpp b/SrcLib/core/fwTools/include/fwTools/Bookmarks.hpp
new file mode 100644
index 0000000..6c22996
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Bookmarks.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_BOOKMARKS_HPP_
+#define _FWTOOLS_BOOKMARKS_HPP_
+
+#include <string>
+#include <list>
+
+#include <boost/unordered_map.hpp>
+
+#include <fwCore/base.hpp>
+
+
+#include "fwTools/config.hpp"
+#include "fwTools/macros.hpp"
+
+namespace fwTools
+{
+
+class Object;
+/**
+ * @brief   Allows to add a bookmark to an object, the bookmark name is unique (in time), an object can have several bookmarks
+ * @class   Bookmarks
+ * 
+ * @date    2007-2011.
+ * @note    expired object do not erase its bookmarks
+ **/
+class FWTOOLS_CLASS_API Bookmarks
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((Bookmarks), (()), new Bookmarks );
+
+    typedef std::string BookmarkName;
+
+    /**
+     * @brief Tests if the given id exist (i.e recorded in Bookmarks dictionary)
+     * @param[in] _id : the id to test
+     * @return true iff the given id is recorded in Bookmarks dictionary
+     */
+    FWTOOLS_API static bool exist( BookmarkName _bookmark );
+
+    FWTOOLS_API static void add( BookmarkName _bookmark,  SPTR(::fwTools::Object ) ); // cannot set a empty one
+
+    /// silently remove given bookmark
+    FWTOOLS_API static void remove( Bookmarks::BookmarkName _bookmark  );
+
+    /**
+     * @brief Retrieves the object attached to the given id. Return a null sptr if no correspondence exist
+     */
+    FWTOOLS_API static SPTR(::fwTools::Object ) getObject( BookmarkName _bookmark );
+
+
+    /**
+     * @brief Retrieves the list of bookmarks attach to an object
+     */
+    FWTOOLS_API static std::list<BookmarkName> getBookmarks(  SPTR(::fwTools::Object ) );
+
+    /**
+     * @brief Retrieves the list of bookmarks
+     */
+    FWTOOLS_API static std::list<BookmarkName> getBookmarks();
+
+protected :
+
+    FWTOOLS_API Bookmarks();
+
+    FWTOOLS_API virtual ~Bookmarks() ;
+
+   typedef ::boost::unordered_map< BookmarkName, WPTR(::fwTools::Object ) > Dictionary;
+
+   static  Dictionary m_dictionary;
+};
+
+}
+
+
+#endif /* BOOKMARKS_HPP_ */
diff --git a/SrcLib/core/fwTools/include/fwTools/Combinatory.hpp b/SrcLib/core/fwTools/include/fwTools/Combinatory.hpp
new file mode 100644
index 0000000..cb68e4d
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Combinatory.hpp
@@ -0,0 +1,216 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+// fwTools - copyright (C) 2005 IRCAD.
+#ifndef __FWTOOLS_COMBINATORY_HPP__
+#define __FWTOOLS_COMBINATORY_HPP__
+
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/vector.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/push_front.hpp>
+#include <boost/mpl/placeholders.hpp>
+#include <boost/mpl/accumulate.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/apply.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/type_traits.hpp>
+
+namespace fwTools
+{
+
+/**
+ * @brief   Helper for BinaryCartesianProduct two Set
+ * @struct  AppendValueFirst
+ * 
+ * @date    2007-2009.
+ * @param   TYPE should be a simple type
+ * @param   SETOFSET should be a container of type list i.e vector< vector< singleTypes>, vector< singleTypes>, ... >.
+ * If SET is empty then vector<vector<TYPE> > is created
+ *
+ * From a type and a set generate a new set where elements are concatenation of type and element of second set i.e
+ * AppendValueFirst ( a , [ [B] , [C] ] ) --> [ [a,B], [b,C] ] and  AppendValueFirst ( a , [ ] ) --> [ [a] ]
+ */
+struct AppendValueFirst
+{
+    template<class TYPE,class SETOFSET>
+    struct apply
+    {
+
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::eval_if< boost::mpl::empty<SETOFSET>,
+                                                        boost::mpl::vector< boost::mpl::vector<TYPE> >,
+                                                        boost::mpl::transform< SETOFSET, boost::mpl::push_front< boost::mpl::_1 , TYPE > >
+                                                    >::type type;
+    };
+};
+
+
+/**
+ * @brief   MetaFunction which create an boost::boost::mpl::vector
+ * @struct  make_vector
+ * 
+ * @date    2007-2009.
+ */
+struct make_vector
+{
+    template<class T>
+    struct apply
+    {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::vector< T >:: type type;
+    };
+};
+
+
+/**
+ * @brief   MetaFunction ( used for pseudo Curryfication ) which transform a set where new elements are
+ * singleton of 1st set elements i.e { a , b , c } --> { {a}, {b}, {c} }
+ * @struct  makeSetOfSingletons
+ * 
+ * @date    2007-2009.
+ **/
+struct makeSetOfSingletons
+{
+    template<class Set>
+    struct apply
+    {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::transform<Set, make_vector >::type type;
+    };
+};
+
+
+
+
+/**
+ * @brief   Helper which compute from a set and a multi set
+ * @struct  BinaryCartesianProductRecurser
+ * 
+ * @date    2007-2009.
+ *
+ * Set1: A = { a_1, a_2, ..., a_N }  \n  MultiSet = {   { ... b_i ...} , { ... c_i ...}, ... { z_i ...}  }\n
+ * the set
+ * {   {a_1, ... b_i ...} , { a_1,  ... c_i ...}, ... {a_1,  ... z_i ...}  ,        {a_2, ... b_i ...} , { a_2,  ... c_i ...}, {a_2,  ... z_i ...},
+ *   , .... ,  {a_N, ... b_i ...} , { a_N,  ... c_i ...}, ... {a_N,  ... z_i ...}
+ */
+struct BinaryCartesianProductRecurser
+{
+    template< class Set1, class MultiSet >
+    struct apply
+    {
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::accumulate< Set1,
+                                                boost::mpl::vector<>,
+                                                boost::mpl::copy<   boost::mpl::apply2< AppendValueFirst, boost::mpl::_2, MultiSet > ,  boost::mpl::back_inserter< boost::mpl::_1>  >
+
+                                                      >::type type;
+    };
+};
+
+
+
+/**
+ * @brief   Compute Cartesian Product of two set (type list) to generate all possible combinaison.
+ * @struct  BinaryCartesianProduct
+ * 
+ * @date    2007-2009.
+ *
+ * From two type list generate a new type list where all elemenent a combinaison of each set. For example :
+ * @code
+ *  using namespace boost::mpl;
+ *
+ * typedef vector< char, short, long > Set1;
+ * typedef vector< double, float > Set2;
+ *
+ *  typedef vector< vector< char,float>, vector<char, double>, vector< short,float>, vector<short, double>, vector< long,float>, vector<long, double> > Wanted;
+ *
+ *  typedef apply< BinaryCartesianProduct, Set1, Set2 >::type  Result;
+ *
+ *  BOOST_MPL_ASSERT_RELATION( size<Wanted>::value , == , size<Result>::value  );
+ *  BOOST_MPL_ASSERT(( equal< front<Wanted> , front<Result> > ));
+ *  BOOST_MPL_ASSERT(( equal< at_c<Wanted,0> , at_c<Result,0> > ));
+ *  BOOST_MPL_ASSERT(( equal< at_c<Wanted,1> , at_c<Result,1> > ));
+ *  BOOST_MPL_ASSERT(( equal< at_c<Wanted,2> , at_c<Result,2> > ));
+ * @endcode
+ * This operator can deal with empty set :
+ * @code
+ *  using namespace boost::mpl;
+    typedef vector<> emptySet;
+    typedef vector< char, short>  Set1;
+
+    typedef vector< vector<char>, vector<short> >::type Wanted;
+
+    typedef apply< BinaryCartesianProduct, Set1, emptySet >::type  Result;
+    BOOST_MPL_ASSERT_RELATION( size<Wanted>::value , == , size<Result>::value  );
+    BOOST_MPL_ASSERT(( equal< front<Wanted> , front<Result> > ));
+    BOOST_MPL_ASSERT(( equal< at_c<Wanted,0> , at_c<Result,0> > ));
+    BOOST_MPL_ASSERT(( equal< at_c<Wanted,1> , at_c<Result,1> > ));
+ * @endcode
+ */
+struct BinaryCartesianProduct
+{
+    template< class Set1, class Set2 >
+    struct apply
+    {
+        typedef BOOST_DEDUCED_TYPENAME  boost::mpl::apply1< makeSetOfSingletons,  Set2>::type  Set2WithSingletons;
+
+        typedef BOOST_DEDUCED_TYPENAME  boost::mpl::apply2<BinaryCartesianProductRecurser, Set1, Set2WithSingletons >::type type;
+    };
+};
+
+
+
+
+/**
+ * @brief compute the cartesian product of many set
+ * @struct  CartesianProduct
+ * 
+ * @date    2007-2009.
+ * @param   MultiSet must be of the following form vector<  vector< ElementaryType1, ElementaryType2,... > , vector< ...ElementaryTypes...> ... > where Elementary
+ *          types are not boost::mpl::Container : i.e int, classes, std::vector<int> etc...
+ *
+ * Example
+ * @code
+ *  using namespace boost::mpl;
+
+    typedef vector< vector<signed char, signed short, signed int>,  vector< float, double >  , vector< std::string, unsigned char >   > ::type MultiSet;
+
+    typedef apply< CartesianProduct, MultiSet>::type Result;
+
+    BOOST_MPL_ASSERT_RELATION( size< Result >::value , == , 12 );
+
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,0>::type, vector<  signed char,  float  , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,1>::type, vector<  signed char,  float  , unsigned char >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,2>::type, vector<  signed char,  double , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,3>::type, vector<  signed char,  double , unsigned char >    > ));
+
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,4>::type, vector< signed short,  float  , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,5>::type, vector< signed short,  float  , unsigned char >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,6>::type, vector< signed short,  double , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,7>::type, vector< signed short,  double , unsigned char >    > ));
+
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,8>::type, vector<  signed int,  float  , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,9>::type, vector<  signed int,  float  , unsigned char >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,10>::type, vector< signed int,  double , std::string >    > ));
+    BOOST_MPL_ASSERT(( equal<  at_c<Result,11>::type, vector< signed int,  double , unsigned char >    > ));
+ * @endcode
+ **/
+struct CartesianProduct
+{
+    template< class MultiSet >
+    struct apply
+    {
+        typedef BOOST_DEDUCED_TYPENAME  boost::mpl::reverse_fold<   MultiSet,
+                                                            boost::mpl::vector<>,
+                                                            boost::mpl::apply2< BinaryCartesianProductRecurser, boost::mpl::_2, boost::mpl::_1 >
+                            >::type type;
+    };
+};
+
+
+
+} //end namespace fwTools
+
+
+#endif /*__FWTOOLS_COMBINATORY_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/Dispatcher.hpp b/SrcLib/core/fwTools/include/fwTools/Dispatcher.hpp
new file mode 100644
index 0000000..2f9a3c3
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Dispatcher.hpp
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_DISPATCHER_HPP__
+#define __FWTOOLS_DISPATCHER_HPP__
+
+#include <stdexcept>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/pop_front.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwTools/TypeMapping.hpp"
+#include "fwTools/Stringizer.hpp"
+
+
+namespace fwTools
+{
+
+
+/**
+ * @brief   Limit cases for empty typelist
+ * @class   EndTypeListAction
+ * 
+ * @date    2007-2009.
+ * @see ::fwTools::Dispatcher
+ */
+ struct EndTypeListAction
+ {
+
+    /// Perform nothing see Dispatcher<>::invoke()
+    static void invoke() {};
+
+    /// Throw an exception to inform end-user that KeyType value have no correspondance in type list
+    template< class KeyType>
+    static void  invoke(const KeyType &keytype)
+    {
+        std::string msg = ::fwTools::getString(keytype) + " : KeyType value incorrect : no corresponding Type in typelist";
+        throw std::invalid_argument(msg);
+    }
+
+    /// Throw an exception to inform end-user that KeyType value have no correspondance in type list
+    template< class KeyType,class Parameter>
+    static void  invoke( const KeyType &keytype,const Parameter &param )
+    {
+        FwCoreNotUsedMacro(param);
+        std::string msg = ::fwTools::getString(keytype) + " : KeyType value incorrect : no corresponding Type in typelist";
+        throw std::invalid_argument(msg);
+    }
+
+    /// Throw an exception to inform end-user that KeyType value have no correspondance in type list
+    template< class BaseClass, class KeyType>
+    static BaseClass  *instanciate(const KeyType &keytype)
+    {
+        std::string msg = ::fwTools::getString(keytype) + " : KeyType value incorrect : no corresponding Type in typelist";
+        throw std::invalid_argument(msg);
+        return NULL;
+    }
+
+ };
+
+
+
+
+/**
+ * @brief   Create an automatic template instancier exple Dispatcher< TYPESEQUENCE , FUNCTOR>::invoke("int");
+ * @class   Dispatcher
+ * 
+ * @date    2007-2009.
+ *
+ * Will instanciante class FUNCTOR then for a type T in TYPESEQUENCE (here int) call the corresponding operator() method
+ * according to parameter of invoke static method. ie FUNCTOR().operator<int>();
+ */
+template< class TSEQ, class FUNCTOR >
+struct Dispatcher
+{
+
+     private:
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::pop_front<TSEQ>::type Tail;
+        typedef BOOST_DEDUCED_TYPENAME boost::mpl::front<TSEQ>::type Head;
+
+     public :
+
+
+
+     /**
+      * @brief Instanciate and invoke all functors
+      */
+     static void invoke()
+     {
+         namespace mpl = boost::mpl;
+
+         // create the functor then excute it
+         FUNCTOR f;
+#ifdef _WIN32
+         f.operator()<Head>();
+#else
+         f.template operator()<Head>();
+#endif
+
+
+         // recursively call other element in the list
+         typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+             mpl::empty<Tail>,
+             EndTypeListAction,
+             Dispatcher<Tail,FUNCTOR >
+                 >::type typex;
+         typex::invoke();
+     }
+
+
+
+     /**
+      * @brief Invoke only the specified Type only
+      */
+     template< class KeyType >
+     static void invoke( const KeyType &keytype )
+     {
+         namespace mpl = boost::mpl;
+
+         if   ( isMapping< Head>(keytype) )
+         {
+             // create the functor then excute it
+             FUNCTOR f;
+#ifdef _WIN32
+             f.operator()<Head>();
+#else
+             f.template operator()<Head>();
+#endif
+         }
+         else
+         {
+             // recursively call other element in the list
+             typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+                 mpl::empty<Tail>,
+                 EndTypeListAction,
+                 Dispatcher< Tail,FUNCTOR >
+                     >::type typex;
+             typex::invoke(keytype);
+
+         }
+     }
+     // NOTE gcc seems unable to explicit call of static template fonction member :/
+     // all arguments needs to be present specicied template seems ignored
+
+
+     /**
+      * @brief Invoke only the specified Type only with a fixed parameter
+      * @note That parameter is *NOT* const so functor can update value
+      */
+     template< class KeyType,class Parameter >
+     static void invoke( const KeyType &keytype,  Parameter &param )
+     {
+         namespace mpl = boost::mpl;
+
+         if   ( isMapping< Head>(keytype) )
+         {
+             // create the functor then excute it
+             FUNCTOR f;
+#ifdef _WIN32
+             f.operator()<Head>(param);
+#else
+             f.template operator()<Head>(param);
+#endif
+
+         }
+         else
+         {
+             // recursively call other element in the list
+             typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+                 mpl::empty<Tail>,
+                 EndTypeListAction,
+                 Dispatcher<Tail,FUNCTOR >
+                     >::type typex;
+             typex::invoke(keytype,param);
+
+         }
+     }
+
+
+};
+
+
+} //end namespace fwTools
+
+#endif /*__FWTOOLS_DISPATCHER_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/DynamicAttributes.hxx b/SrcLib/core/fwTools/include/fwTools/DynamicAttributes.hxx
new file mode 100644
index 0000000..aa97a7d
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/DynamicAttributes.hxx
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_DYNAMIC_ATTRIBUTE_HXX_
+#define _FWTOOLS_DYNAMIC_ATTRIBUTE_HXX_
+
+#include <map>
+#include <vector>
+
+#include <boost/ref.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/Demangler.hpp>
+
+#include "fwTools/macros.hpp"
+
+namespace fwTools {
+
+class DynamicAttributesBase
+{
+public:
+
+    virtual fwToolsRegisterAttributeSignatureMacro() = 0;
+};
+
+template<class CLASS>
+class DynamicAttributes : public DynamicAttributesBase
+{
+
+public:
+    typedef std::string  AttrNameType;
+    typedef SPTR(CLASS)  AttrType;
+    typedef std::vector< AttrNameType > AttrNameVectorType;
+    typedef ::boost::reference_wrapper< AttrType > AttrRefType;
+    typedef std::map< AttrNameType, AttrRefType > AttrMapType;
+
+    typedef CSPTR(CLASS) ConstAttrType;
+
+    DynamicAttributes();
+    virtual ~DynamicAttributes();
+
+    virtual ConstAttrType getConstAttribute( AttrNameType attrName ) const;
+    virtual AttrType getAttribute( AttrNameType attrName );
+    bool        hasAttribute( AttrNameType attrName );
+
+    virtual fwToolsSetAttributeSignatureMacro()
+    {
+        FwCoreNotUsedMacro(attrName);
+        FwCoreNotUsedMacro(_obj);
+    };
+
+    virtual AttrNameVectorType getAttributeNames();
+
+    virtual fwToolsRegisterAttributeSignatureMacro() {};
+protected:
+    virtual AttrRefType getAttributeRef( AttrNameType attrName );
+    AttrMapType __FWTOOLS_ATTRIBUTE_MAP_NAME;
+
+
+};
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+DynamicAttributes< CLASS >::DynamicAttributes()
+{
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+DynamicAttributes< CLASS >::~DynamicAttributes()
+{
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+typename DynamicAttributes< CLASS >::AttrType DynamicAttributes< CLASS >::getAttribute( AttrNameType attrName )
+{
+    return this->getAttributeRef(attrName);
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+typename DynamicAttributes< CLASS >::AttrRefType DynamicAttributes< CLASS >::getAttributeRef( AttrNameType attrName )
+{
+    typename DynamicAttributes::AttrMapType::iterator iter = this->__FWTOOLS_ATTRIBUTE_MAP_NAME.find(attrName);
+    OSLM_FATAL_IF(
+            "Object "<< ::fwCore::getFullClassname< CLASS >() << "has no attribute named '"<< attrName << "'",
+            iter == this->__FWTOOLS_ATTRIBUTE_MAP_NAME.end()
+            );
+    return (*iter).second;
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+typename DynamicAttributes< CLASS >::ConstAttrType DynamicAttributes< CLASS >::getConstAttribute( AttrNameType attrName ) const
+{
+    typename DynamicAttributes::AttrMapType::const_iterator iter = this->__FWTOOLS_ATTRIBUTE_MAP_NAME.find(attrName);
+    OSLM_FATAL_IF(
+            "Object "<< ::fwCore::getFullClassname< CLASS >() << "has no attribute named '"<< attrName << "'",
+            iter == this->__FWTOOLS_ATTRIBUTE_MAP_NAME.end()
+            );
+    return (*iter).second.get();
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+bool DynamicAttributes< CLASS >::hasAttribute( AttrNameType attrName )
+{
+    typename DynamicAttributes::AttrMapType::iterator iter = this->__FWTOOLS_ATTRIBUTE_MAP_NAME.find(attrName);
+    return iter != this->__FWTOOLS_ATTRIBUTE_MAP_NAME.end();
+}
+
+//------------------------------------------------------------------------------
+
+template< class CLASS >
+typename DynamicAttributes< CLASS >::AttrNameVectorType  DynamicAttributes< CLASS >::getAttributeNames()
+{
+    AttrNameVectorType names;
+    typename DynamicAttributes::AttrMapType::const_iterator iter;
+    for ( iter = this->__FWTOOLS_ATTRIBUTE_MAP_NAME.begin(); iter != this->__FWTOOLS_ATTRIBUTE_MAP_NAME.end(); ++iter )
+    {
+        names.push_back((*iter).first);
+    }
+    return names;
+}
+
+} //end namespace fwTools
+
+#endif //_FWTOOLS_DYNAMIC_ATTRIBUTE_HXX_
diff --git a/SrcLib/core/fwTools/include/fwTools/DynamicType.hpp b/SrcLib/core/fwTools/include/fwTools/DynamicType.hpp
new file mode 100644
index 0000000..c02bbfd
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/DynamicType.hpp
@@ -0,0 +1,165 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_DYNAMICTYPE_HPP__
+#define __FWTOOLS_DYNAMICTYPE_HPP__
+
+#include <string>
+#include <list>
+#include <vector>
+#include <stdexcept>
+
+#include <boost/mpl/vector.hpp>
+
+#include "fwTools/Stringizer.hpp"
+#include "fwTools/config.hpp"
+
+
+namespace fwTools
+{
+
+/**
+ * @brief   Class defining an elementary C++ type aka unsigned char, signed char, .... signed long, float, double
+ * @class   DynamicType
+ * 
+ * @date    2007-2009.
+ *
+ **/
+class FWTOOLS_CLASS_API DynamicType
+{
+public:
+    /// Default constructor
+    FWTOOLS_API DynamicType();
+
+    /// Constructor by copy
+    FWTOOLS_API DynamicType(const DynamicType &);
+
+    /**
+     * @brief comparison operator
+     */
+    FWTOOLS_API bool operator==(const DynamicType &) const;
+
+    /**
+     * @brief comparison operator
+     */
+    FWTOOLS_API bool operator!=(const DynamicType &) const;
+
+
+    /**
+     * @brief  define an order (lexicographic) for dynamicType
+     */
+    FWTOOLS_API bool operator<( const DynamicType& ) const;
+
+    /**
+     * @brief   Set DynamicType value according given template
+     * @note    A BOOST_ASSERTION can be raised if TYPE is not managed by isMapping
+     **/
+    template< class TYPE>
+    void setType() throw(std::invalid_argument);
+
+
+    /**
+     * @brief   Return true iff the DynamicType value represents the TYPE
+     * @note    A BOOST_ASSERTION can be raised if TYPE is not managed by isMapping
+     **/
+    template< class TYPE>
+    bool isType() const;
+
+    /**
+     * @brief   Return the sizeof of the type
+     */
+    FWTOOLS_API unsigned char sizeOf() const;
+
+
+    /**
+     * @brief Register a new type to be managed within DynamicType.
+     *
+     * Check are performed to ensure robsutess
+     */
+    template<class NEWTYPE>
+    static void registerNewType(const std::string &newKey) throw(std::invalid_argument);
+
+
+    /// Default destrucor : do nothing
+    FWTOOLS_API virtual ~DynamicType();
+
+    /// Return a human readable string
+    FWTOOLS_API const std::string &string() const;
+
+    /**
+     * @brief Return a human readable string for type (static version no instanciation ...)
+     *
+     * Use a  DynamicType::string<int>();
+     */
+    template<class TYPE>
+    static const std::string string();
+
+    /**
+     * @brief return the min and max storable in the DynamicType. take care that min/max value are casted into template T
+     */
+    template<class T>
+    std::pair<T,T> minMax();
+
+    /// return true iff the type use a fixed precision
+    FWTOOLS_API bool isFixedPrecision();
+
+    /// return true iff the type is signed
+    FWTOOLS_API bool isSigned();
+
+    typedef boost::mpl::vector<
+        signed char,
+        unsigned char,
+        signed short,
+        unsigned short,
+        signed int,
+        unsigned int,
+        unsigned long,
+        signed long,
+        float,
+        double
+            >::type SupportedTypes;
+
+protected :
+
+    std::string m_value; // aka key
+    unsigned char m_sizeof;
+
+    /// Container of types managed by DynamicType
+    FWTOOLS_API static std::list< std::string > m_managedTypes;
+
+    /// Value for not specified type
+    FWTOOLS_API static const std::string m_unSpecifiedType;
+};
+
+
+
+/// Helper to create object DynamicType from a given type TYPE in { (un)signed char, ... , double }
+template<class TYPE>
+DynamicType makeDynamicType();
+
+/**
+ * @brief   Helper to create object DynamicType from a given type from a KEYTYPE representing a type in { (un)signed char, ... , double }
+ *
+ * Example makeDynamicType(type_id(int)) and   makeDynamicType("signed int")  should work
+ */
+// #include "KEYTYPEMapping.hpp" is mandatory
+template<class KEYTYPE>
+DynamicType makeDynamicType(const  KEYTYPE &keyType);
+
+
+template<>
+FWTOOLS_API std::string getString(const DynamicType &dt);
+
+template<>
+FWTOOLS_API std::string getString(const std::vector<DynamicType> &dtv);
+
+} //end namespace fwTools
+
+
+#include "fwTools/DynamicType.hxx"
+
+
+#endif /*__FWTOOLS_DYNAMICTYPE_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/DynamicType.hxx b/SrcLib/core/fwTools/include/fwTools/DynamicType.hxx
new file mode 100644
index 0000000..9e5b3cd
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/DynamicType.hxx
@@ -0,0 +1,166 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <limits>
+#include <fwCore/base.hpp>
+
+#include "fwTools/StringKeyTypeMapping.hpp"
+#include "fwTools/Dispatcher.hpp"
+
+namespace fwTools
+{
+
+
+template<class TYPE>
+DynamicType makeDynamicType()
+{
+    DynamicType d;
+    d.template setType<TYPE>();
+    return d;
+}
+
+
+
+
+struct TypeSetter
+{
+    template<class TYPE>
+    void operator()( DynamicType & dynamicType )
+    {
+        dynamicType.setType<TYPE>();
+    }
+};
+
+
+
+template<class KEYTYPE>
+DynamicType makeDynamicType(const KEYTYPE &keyType)
+{
+
+    DynamicType d;
+
+    Dispatcher<DynamicType::SupportedTypes,TypeSetter >::invoke(keyType,d);
+
+    assert ( d != DynamicType() ); // a type must be found !!
+
+    return d;
+}
+
+
+
+template<class T>
+class MinMaxFunctor
+{
+public:
+
+    template< typename PIXEL >
+    void operator()( std::pair<T,T> &minMax )
+    {
+        minMax.first = static_cast< T >( std::numeric_limits< PIXEL >::min() );
+        minMax.second = static_cast< T >( std::numeric_limits< PIXEL >::max() );
+
+        ::fwTools::DynamicType type = ::fwTools::makeDynamicType< PIXEL >();
+        if(!std::numeric_limits< PIXEL >::is_integer)
+        {
+            // std::numeric_limits::min() returns the smallest positive value for floating types
+            minMax.first = minMax.second * -1;
+        }
+    }
+};
+
+
+
+
+template< class TYPE>
+void DynamicType::setType() throw(std::invalid_argument)
+{
+     std::list< std::string>::const_iterator  supportedTypesIter;
+
+     supportedTypesIter = m_managedTypes.begin();
+     while ( supportedTypesIter !=  m_managedTypes.end() )
+     {
+         if ( isMapping<TYPE>( *supportedTypesIter) )
+         {
+             m_value  = *supportedTypesIter;
+             m_sizeof = sizeof(TYPE);
+             return;
+
+         }
+         ++supportedTypesIter;
+     }
+
+     throw std::invalid_argument("DynamicType::setType<TYPE> incorrect TYPE");
+}
+
+
+
+
+template< class TYPE>
+bool DynamicType::isType() const
+{
+    return isMapping<TYPE>(m_value);
+}
+
+
+
+
+template<class TYPE>
+const std::string DynamicType::string()
+{
+    DynamicType d;
+    d.setType<TYPE>();
+    return d.string();
+}
+
+
+
+
+template<class NEWTYPE>
+void DynamicType::registerNewType(const std::string &newKey) throw(std::invalid_argument)
+{
+    // ensure isMapping present and well defined
+    // if prog trap here it is because is Mapping is not well defined !!!
+    if ( isMapping<NEWTYPE>(newKey) == false )
+    {
+        throw std::invalid_argument("Dynamic::registerNewType misconception with isMapping");
+    }
+
+    // ensure that newKey is not already used
+    if ( std::find( m_managedTypes.begin(),m_managedTypes.end(), newKey ) != m_managedTypes.end() )
+    {
+        throw std::invalid_argument("Dynamic::registerNewType newKey already used");
+    }
+
+    // ensure that no other mapping respond to newkey
+    try
+    {
+        DynamicType dummy;
+        dummy.setType<NEWTYPE>();
+    }
+    catch ( std::exception )
+    {
+        // OK it is really a new type, insert it
+        m_managedTypes.push_back(newKey);
+        return;
+    }
+
+    throw std::invalid_argument("Dynamic::registerNewType another isMapping is responding");
+}
+
+
+template<class T>
+std::pair<T,T> DynamicType::minMax()
+{
+    SLM_ASSERT("Unable to have minMax for UnSpecifiedType", this->string() != DynamicType::m_unSpecifiedType);
+    std::pair<T,T> minMax;
+    Dispatcher<DynamicType::SupportedTypes,MinMaxFunctor<T> >::invoke(*this,minMax);
+    return minMax;
+}
+
+
+
+} //end namespace fwTools
diff --git a/SrcLib/core/fwTools/include/fwTools/DynamicTypeKeyTypeMapping.hpp b/SrcLib/core/fwTools/include/fwTools/DynamicTypeKeyTypeMapping.hpp
new file mode 100644
index 0000000..3a65569
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/DynamicTypeKeyTypeMapping.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_DYNAMICTYPEKEYTYPEMAPPING_HPP__
+#define __FWTOOLS_DYNAMICTYPEKEYTYPEMAPPING_HPP__
+
+#include "fwTools/DynamicType.hpp"
+
+#include "fwTools/TypeMapping.hpp"
+#include "fwTools/config.hpp"
+
+
+namespace fwTools
+{
+
+
+/**
+ * @name    Dynamic key type mapping
+ * @{
+ */
+
+/**
+ * @brief   Template specialization for defining KeyType mapping ( here DynamicType) with their value.
+ *
+ * Header declare function already specialized while src provide definition
+ * @warning isMapping does not need to be exported since fwTools Library is builded as static
+ */
+// FIX UNSIGNED
+template<> FWTOOLS_API
+bool isMapping<unsigned char>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned short>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned int>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned long>(const DynamicType &key);
+
+
+// FIXED PRECISION SIGNED
+template<> FWTOOLS_API
+bool isMapping<signed char>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed short>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed int>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed long>(const DynamicType &key);
+
+
+
+// FLOATING PRECISION
+template<> FWTOOLS_API
+bool isMapping<float>(const DynamicType &key);
+
+template<> FWTOOLS_API
+bool isMapping<double>(const DynamicType &key);
+
+
+// MISC
+template<> FWTOOLS_API
+bool isMapping<std::string>(const DynamicType &key);
+
+///@}
+
+
+} //end namespace fwTools
+
+
+#endif /*__FWTOOLS_DYNAMICTYPEKEYTYPEMAPPING_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/Exception.hpp b/SrcLib/core/fwTools/include/fwTools/Exception.hpp
new file mode 100644
index 0000000..0bbc886
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Exception.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_EXCEPTION_HPP_
+#define _FWTOOLS_EXCEPTION_HPP_
+
+#include <exception>
+#include <string>
+
+#include "fwCore/Exception.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @brief   Implements fwTools exception class
+ * @class   Exception
+ * 
+ * @date    2007-2009.
+ */
+struct FWTOOLS_CLASS_API Exception : public ::fwCore::Exception
+{
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   message a string containing the failure message
+     */
+    FWTOOLS_API Exception(const std::string &message) throw();
+
+    /**
+     * @brief   Destructor : do nothing.
+     */
+    FWTOOLS_API ~Exception() throw();
+
+
+};
+
+} // namespace fwTools
+
+#endif // _FWTOOLS_EXCEPTION_HPP_
+
diff --git a/SrcLib/core/fwTools/include/fwTools/Failed.hpp b/SrcLib/core/fwTools/include/fwTools/Failed.hpp
new file mode 100644
index 0000000..ebe28ec
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Failed.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_FAILED_HPP_
+#define _FWTOOLS_FAILED_HPP_
+
+#include <exception>
+#include <string>
+
+#include "fwCore/Exception.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @brief   Implements a failed exception class
+ * @class   Failed
+ * 
+ * @date    2007-2009.
+ */
+struct FWTOOLS_CLASS_API Failed : public ::fwCore::Exception
+{
+
+    /**
+     * @brief       Constructor
+     *
+     * @param[in]   message a string containing the failure message
+     */
+    FWTOOLS_API Failed(const std::string &message) throw();
+
+    /**
+     * @brief   Destructor : do nothing.
+     */
+    FWTOOLS_API ~Failed() throw();
+
+
+};
+
+} // namespace fwTools
+
+#endif // _FWTOOLS_FAILED_HPP_
diff --git a/SrcLib/core/fwTools/include/fwTools/IntegerTypes.hpp b/SrcLib/core/fwTools/include/fwTools/IntegerTypes.hpp
new file mode 100644
index 0000000..721c9ff
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/IntegerTypes.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_INTEGERTYPES_HPP__
+#define __FWTOOLS_INTEGERTYPES_HPP__
+
+#include <boost/mpl/vector.hpp>
+
+namespace fwTools
+{
+
+typedef ::boost::mpl::vector<
+                signed char , unsigned char,
+                signed short, unsigned short,
+                signed int  , unsigned int
+#ifndef DEBUG
+                ,signed long , unsigned long
+#endif
+              >::type IntegerTypes;
+
+
+} // end namespace fwTools
+
+#endif //__FWTOOLS_INTEGERTYPES_HPP__
diff --git a/SrcLib/core/fwTools/include/fwTools/IntrinsicTypes.hpp b/SrcLib/core/fwTools/include/fwTools/IntrinsicTypes.hpp
new file mode 100644
index 0000000..116b0e7
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/IntrinsicTypes.hpp
@@ -0,0 +1,25 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_INTRINSICTYPES_HPP__
+#define __FWTOOLS_INTRINSICTYPES_HPP__
+
+#include <boost/mpl/push_back.hpp>
+
+#include "fwTools/IntegerTypes.hpp"
+
+namespace fwTools
+{
+
+#ifdef DEBUG
+typedef ::boost::mpl::push_back< IntegerTypes, float  >::type IntrinsicTypes;
+#else
+typedef ::boost::mpl::push_back< ::boost::mpl::push_back< IntegerTypes, float >::type, double >::type IntrinsicTypes;
+#endif
+
+} // end namespace fwTools
+
+#endif //__FWTOOLS_INTRINSICTYPES_HPP__
diff --git a/SrcLib/core/fwTools/include/fwTools/Namespace.hpp b/SrcLib/core/fwTools/include/fwTools/Namespace.hpp
new file mode 100644
index 0000000..90a196d
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWTOOLSNAMESPACE_HPP_
+#define FWTOOLSNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwTools contains several tools like UUID, factory, dispatche, stringizer, macros, helper.
+ * @namespace   fwTools
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwTools
+{
+}
+#endif /* FWTOOLSNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwTools/include/fwTools/NumericRoundCast.hxx b/SrcLib/core/fwTools/include/fwTools/NumericRoundCast.hxx
new file mode 100644
index 0000000..5947e99
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/NumericRoundCast.hxx
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_NUMERICROUNDCAST_HPP__
+#define __FWTOOLS_NUMERICROUNDCAST_HPP__
+
+#include <boost/numeric/conversion/converter.hpp>
+
+namespace fwTools
+{
+
+/**
+ * This method converts an value of type TYPEIN to an value of type TYPEOUT.
+ * If TYPEIN is a floating point type and TYPEOUT is a integral type then
+ * it rounds float number to nearest integer (returns 3 for 3.1f, 5 for 4.5f).
+ *
+ * Be careful: there is not range checking, overflow is not detected (silent overflow policy)
+ *
+ * @param value to cast (and rounds if is a floating point type) in TYPEOUT
+ * @return casted and rounded value.
+ */
+template < typename TYPEOUT, typename TYPEIN>
+TYPEOUT numericRoundCast (const TYPEIN &value)
+{
+    typedef ::boost::numeric::conversion_traits<TYPEOUT, TYPEIN> TraitsType;
+    typedef ::boost::numeric::silent_overflow_handler OverflowHandlerType;
+    typedef ::boost::numeric::RoundEven<typename TraitsType::source_type> RoundEvenType;
+    typedef ::boost::numeric::raw_converter<TraitsType> ConverterType;
+    typedef ::boost::numeric::UseInternalRangeChecker RangeCheckerType;
+
+    typedef ::boost::numeric::converter<
+            TYPEOUT,
+            TYPEIN,
+            TraitsType,
+            OverflowHandlerType,
+            RoundEvenType,
+            ConverterType,
+            RangeCheckerType
+            > RoundCastType;
+
+    return RoundCastType::convert(value);
+}
+
+} // namespace fwTools
+
+#endif //__FWTOOLS_NUMERICROUNDCAST_HPP__
diff --git a/SrcLib/core/fwTools/include/fwTools/Object.hpp b/SrcLib/core/fwTools/include/fwTools/Object.hpp
new file mode 100644
index 0000000..de08fc8
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Object.hpp
@@ -0,0 +1,125 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_OBJECT_HPP_
+#define _FWTOOLS_OBJECT_HPP_
+
+#include <string>
+#include <vector>
+
+#include <fwCore/base.hpp>
+#include <fwCore/TimeStamp.hpp>
+#include <fwCore/LogicStamp.hpp>
+
+#include "fwTools/config.hpp"
+#include "fwTools/fwID.hpp"
+
+namespace fwTools
+{
+
+class UUID;
+
+/**
+ * @brief   Define Base class for FW4SPL objects and services
+ * @class   Object
+ * 
+ * @date    2007-2009.
+ */
+class FWTOOLS_CLASS_API Object  : public ::fwCore::BaseObject , protected ::fwTools::fwID
+{
+public:
+    fwCoreNonInstanciableClassDefinitionsMacro( (Object)(::fwCore::BaseObject) );
+    fwCoreAllowSharedFromThis();
+
+    friend class ::fwTools::UUID;
+
+    // expose API for ID management
+    FWTOOLS_API using  ::fwTools::fwID::hasID;
+    FWTOOLS_API using  ::fwTools::fwID::getID;
+    FWTOOLS_API using  ::fwTools::fwID::setID;
+    FWTOOLS_API using  ::fwTools::fwID::resetID;
+#ifdef COM_LOG
+    FWTOOLS_API using  ::fwTools::fwID::getLightID;
+#endif
+
+    /// return the sub class classname : an alias of this->getClassname
+    FWTOOLS_API std::string className() const;
+
+    FWTOOLS_API Object();
+
+    FWTOOLS_API virtual ~Object();
+
+    /**
+     * @name    ***DEPRECATED*** All concerning universal unique identifier (UUID) ***DEPRECATED***
+     */
+    //@{
+    /**
+     * @brief Set a name for an object
+     * @deprecated (should use UUID)
+     */
+    void setName ( const std::string _strName ) { m_strName = _strName; }
+
+    /**
+     * @brief Retrieve the name object
+     * @deprecated (should use UUID)
+     */
+    const std::string getName() const { return m_strName; }
+
+    //@}
+
+    FWTOOLS_API void modified()
+    {
+        m_logicStamp->modified();
+    };
+
+    FWTOOLS_API void timeModified()
+    {
+        m_timeStamp->modified();
+    };
+
+    FWTOOLS_API void setLifePeriod(::fwCore::TimeStamp::TimeStampType p)
+    {
+        m_timeStamp->setLifePeriod(p);
+    };
+
+    FWTOOLS_API ::fwCore::TimeStamp::TimeStampType getLifePeriod()
+    {
+        return m_timeStamp->getLifePeriod();
+    };
+
+    FWTOOLS_API bool periodExpired()
+    {
+        return m_timeStamp->periodExpired();
+    };
+
+    ::fwCore::TimeStamp::sptr  getTimeStamp()  const { return m_timeStamp; }
+    ::fwCore::LogicStamp::sptr getLogicStamp() const { return m_logicStamp; }
+
+    ::fwCore::LogicStamp::csptr getOSRKey() const { return m_OSRKey; }
+
+protected :
+
+    ::fwCore::TimeStamp::sptr  m_timeStamp;
+
+    ::fwCore::LogicStamp::sptr m_logicStamp;
+
+    SPTR(::fwTools::UUID) m_uuid;
+
+private :
+
+    /// Standard copy operator, forbidden.
+    Object &operator=(const Object &_obj);
+
+    /// Name identification for an object
+    std::string m_strName;
+
+    /// key used to register object in OSR
+    ::fwCore::LogicStamp::sptr m_OSRKey;
+};
+
+}
+
+#endif /* _FWTOOLS_OBJECT_HPP_ */
diff --git a/SrcLib/core/fwTools/include/fwTools/Os.hpp b/SrcLib/core/fwTools/include/fwTools/Os.hpp
new file mode 100644
index 0000000..4567681
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Os.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_OS_HPP__
+#define __FWTOOLS_OS_HPP__
+
+#include <string>
+
+#include "config.hpp"
+
+
+namespace fwTools {
+
+/**
+ * @brief   Namespace fwTools::os contains tools methods which depend on os like get user application data directory.
+ * 
+ * @date    2009-2010.
+ */
+namespace os {
+
+
+/**
+ * @brief Returns a environment variable value
+ *
+ * @param name environment variable 'name'
+ * @param[out] ok boolean set to true if variable exists
+ *
+ * @return The environment variable content if it exists, else an empty string
+ */
+FWTOOLS_API std::string getEnv(const std::string &name, bool *ok = NULL);
+
+
+/**
+ * @brief Returns a environment variable value
+ *
+ * @param name environment variable 'name'
+ * @param defaultValue Value returned if variable 'name' doesn't exist
+ */
+FWTOOLS_API std::string getEnv(const std::string &name, const std::string &defaultValue);
+
+/**
+ * @brief   Return the users's application data directory
+ * 
+ * @param company The company name
+ * @param appName The application name
+ * @param createDirectory if true, create the returned directory if it don't exist
+ * @date    2007-2009.
+ *
+ * Return the application data directory. If company or appName is not empty, append them to
+ * the path. Under unix, XDG conventions are repected.
+ * For example, the UserDataDir under linux will be "~/.config/company/appName"
+ */
+FWTOOLS_API std::string  getUserDataDir(
+        std::string company  = "",
+        std::string appName  = "",
+        bool createDirectory = false
+        );
+
+
+} // namespace os
+
+} // namespace fwTools
+
+#endif
diff --git a/SrcLib/core/fwTools/include/fwTools/ProgressAdviser.hpp b/SrcLib/core/fwTools/include/fwTools/ProgressAdviser.hpp
new file mode 100644
index 0000000..0352770
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/ProgressAdviser.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_PROGRESSADVISER_HPP__
+#define __FWTOOLS_PROGRESSADVISER_HPP__
+
+#include <string>
+#include <boost/signal.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwTools/config.hpp>
+
+
+namespace fwTools
+{
+
+/**
+ * @brief   Subclasses Inherited from  ProgressAdviser can notify progression
+ * This class is used as base class to add the functionalities of progress notification. To notify a progress then simply call
+ * notifyProgress() method by given the progression [0, 1.0] and a message. The ProgressAdviser will automatically call handler (=Observer).
+ * Handlers can be added using addHandler(). the Handler of type ProgessHandler can be a function or functor or boost::signal with a signature
+ * ( float, std::string ) and returning nothing.
+ * @class   ProgressAdviser
+ * 
+ * @date    2007-2009.
+ */
+class FWTOOLS_CLASS_API ProgressAdviser : public ::boost::signals::trackable
+{
+public:
+
+    /// define a boost signal signature for the ProgessHandler
+    typedef ::boost::signal< void(float, std::string) >   ProgessSignal; // signal for fctor or function returning void and
+    /// define the ProgessHandler type
+    typedef ProgessSignal::slot_type         ProgessHandler; // signal for fctor or function returning void and
+                                                            // accepting a float as argument percent
+                                                            // string for information
+
+    FWTOOLS_API ProgressAdviser();
+    FWTOOLS_API virtual ~ProgressAdviser();
+
+    /*
+     * @brief append a new handler ( a functor accepting a float as argument an returning void)
+     * @param[in] handler can be either  a function or functor or boost::signal with a signature( float, std::string ) and returning nothing
+     */
+    FWTOOLS_API void   addHandler(const ProgessHandler &handler);
+
+    /// notify modification for all handler
+    FWTOOLS_API void   notifyProgress(float percent,std::string msg="");
+
+protected :
+
+    /// to notify progress simply use m_progressSignal( percent,msg ) to notify to Handler
+    ProgessSignal m_progressSignal;
+
+};
+
+}
+
+#endif /* __FWTOOLS_PROGRESSADVISER_HPP__ */
diff --git a/SrcLib/core/fwTools/include/fwTools/ProgressToLogger.hpp b/SrcLib/core/fwTools/include/fwTools/ProgressToLogger.hpp
new file mode 100644
index 0000000..e2632c3
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/ProgressToLogger.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_PROGRESSTOLOGGER_HPP__
+#define __FWTOOLS_PROGRESSTOLOGGER_HPP__
+
+#include <string>
+#include <fwTools/config.hpp>
+#include <boost/signals/trackable.hpp>
+
+namespace fwTools
+{
+
+/**
+ * @brief   Class ProgressToLogger is an ProgressAdviser::ProgressHandler, it receive notification from its ProgressAdviser
+ * and send the progress to the logging system ( SpyLog )
+ * @class   ProgressToLogger
+ * 
+ * @date    2007-2009.
+ */
+class FWTOOLS_CLASS_API ProgressToLogger  : public ::boost::signals::trackable // to autoDisconnect if handler is destroyed before the notifier
+{
+public:
+
+    /**
+     * @brief constructor : define an output to log system as :  [prefix] message percent [postfix]
+     * @param[in] prefix  allow to add a prefix in the formated log message
+     * @param[in] postfix  allow to add a postfix in the formated log message
+     */
+    FWTOOLS_API ProgressToLogger(std::string prefix, std::string postfix= " %");
+
+    /// default destructor, do nothing
+    FWTOOLS_API virtual ~ProgressToLogger();
+
+    /**
+     * @brief the handler effective code : send formated progress information to the log system SpyLog.
+     * The formated ouput look like [prefix] msg percent [postfix]
+     */
+    FWTOOLS_API void operator()(float percent, std::string msg);
+
+protected :
+
+    std::string m_prefix;
+    std::string m_postfix;
+};
+
+}
+
+#endif /* __FWTOOLS_PROGRESSTOLOGGER_HPP__ */
diff --git a/SrcLib/core/fwTools/include/fwTools/StringKeyTypeMapping.hpp b/SrcLib/core/fwTools/include/fwTools/StringKeyTypeMapping.hpp
new file mode 100644
index 0000000..a971c3c
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/StringKeyTypeMapping.hpp
@@ -0,0 +1,76 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_STRINGKEYTYPEMAPPING_HPP__
+#define __FWTOOLS_STRINGKEYTYPEMAPPING_HPP__
+
+#include <string>
+
+#include "fwTools/TypeMapping.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @name    String type mapping
+ * @{
+ */
+/**
+ * @brief   Template specialization for defining KeyType mapping ( here std::string) with their value.
+ *
+ * Header declare function already specialized while src provide definition.
+ *
+ * @warning isMapping does not need to be exported since fwTools Library is builded as static.
+ * 
+ */
+
+// FIX UNSIGNED
+template<> FWTOOLS_API
+bool isMapping<unsigned char>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned short>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned int>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned long>(const std::string &key);
+
+
+// FIXED PRECISION SIGNED
+template<> FWTOOLS_API
+bool isMapping<signed char>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed short>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed int>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed long>(const std::string &key);
+
+
+
+
+// FLOATING PRECISION
+template<> FWTOOLS_API
+bool isMapping<float>(const std::string &key);
+
+template<> FWTOOLS_API
+bool isMapping<double>(const std::string &key);
+
+
+// MISC
+template<> FWTOOLS_API
+bool isMapping<std::string>(const std::string &key);
+///@}
+
+} // end namespace fwTools
+
+#endif /*__FWTOOLS_STRINGKEYTYPEMAPPING_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/Stringizer.hpp b/SrcLib/core/fwTools/include/fwTools/Stringizer.hpp
new file mode 100644
index 0000000..38f8d84
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Stringizer.hpp
@@ -0,0 +1,149 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_STRINGIZER_HPP__
+#define __FWTOOLS_STRINGIZER_HPP__
+
+
+#include <string>
+#include <typeinfo>
+
+#include  <boost/type_traits/is_arithmetic.hpp>
+#include  <boost/lexical_cast.hpp>
+#include  <boost/mpl/if.hpp>
+
+#include <fwCore/Demangler.hpp>
+
+#include "fwTools/TypeInfo.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+
+namespace
+{
+struct NumericCast
+{
+    template<class T>
+    static std::string eval(const T &t)
+    {
+        // note boost::lexical_cast with char is a ASCII-code conversion
+        // instead numerical casting. We provide fix with specialization
+        return ::boost::lexical_cast<std::string>(t);
+    }
+};
+
+struct Default
+{
+    template<class T>
+    static std::string eval(const T &t)
+    {
+        return "No getString for " + ::fwCore::Demangler(typeid(t)).getRootedClassname();
+    }
+};
+}
+
+/**
+ * @name Conversion value to string
+ * @{
+ */
+
+// inline mandatory to be supported in multi compilation unit and avoid conflict when linking
+// function doesn't exist code is rewritted
+/**
+ * @brief       Convert the value to a string
+ * @param[in]   t value
+ * @return      Value converted in a string
+ */
+template<class T>
+inline std::string getString(const T &t)
+{
+    typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<  boost::is_arithmetic<T>::value,
+            NumericCast,
+            Default
+            >::type Choice;
+
+    return Choice::eval(t);
+}
+
+/**
+ * @brief       Convert a pair of values to a string.
+ *
+ * partial specialization.
+ *
+ * @param[in]   t pair of values in type T1 and T2
+ * @return      String in format [value 1, value 2]
+ */
+template<class T1,class T2>
+inline std::string getString(const std::pair<T1,T2> &t)
+{
+    std::string res=("[");
+    res += getString(t.first) + "," + getString(t.second) + "]";
+    return res;
+}
+
+/**
+ * @brief       Convert container values to a string
+ *
+ * Specialization for all stl container vector,list,map
+ *
+ * @param[in]   begin begin of the container
+ * @param[in]   end end of the container
+ * @return      String in format [value1, value2,....]
+ */
+template<class ForwardIterator>
+inline std::string getString(ForwardIterator begin,ForwardIterator end)
+{
+    std::string result("[");
+    if (begin!=end)
+    {
+        result+= getString( *begin );
+        while (++begin!=end)
+        {
+            result+= "," + getString( *begin );
+        }
+    }
+    result += "]";
+    return result;
+}
+
+
+/// explicit specialization of getString(const T &t)
+template<>
+FWTOOLS_API std::string getString(const std::string &aString);
+
+
+template<>
+FWTOOLS_API std::string getString(const std::type_info &ti);
+
+
+template<>
+FWTOOLS_API std::string getString(const TypeInfo &ti);
+
+// char are numerically casted
+template<>
+FWTOOLS_API std::string getString(const signed char &c);
+
+// char are numerically casted // signed char and char doesn't are the same :/ !!!!
+template<>
+FWTOOLS_API std::string getString(const char &c);
+
+// char are numerically casted
+template<>
+FWTOOLS_API std::string getString(const unsigned char &c);
+
+template<>
+FWTOOLS_API std::string getString(const std::string &aString);
+
+
+
+///@}
+
+}
+
+#endif // __FWTOOLS_STRINGIZER_HPP__
+
diff --git a/SrcLib/core/fwTools/include/fwTools/System.hpp b/SrcLib/core/fwTools/include/fwTools/System.hpp
new file mode 100644
index 0000000..f51349c
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/System.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_SYSTEM_HPP_
+#define _FWTOOLS_SYSTEM_HPP_
+
+#include <string>
+
+#include <boost/filesystem/path.hpp>
+
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @class   System
+ * @brief Provide a system to get a Temporary folder which allow multi-user, multi-instance separation
+ * 
+ * @date    2007-2009.
+ * @todo  change "fwDumpFolder" to "localTemp"
+ */
+class FWTOOLS_CLASS_API System
+{
+public:
+
+    /**
+     * @brief   Returns the system's temporary folder.
+     * Returns the value returned by boost::filesystem::temp_directory_path, or
+     * if boost returns no valid dir, c:\\ on windows, /tmp on other systems
+     */
+    FWTOOLS_API static const ::boost::filesystem::path &getTempPath() throw();
+
+    /**
+     * @brief   Returns a unique per-process temporary folder.
+     * The top level temporary folder will be automatically destroyed if the process ends properly
+     *
+     * @param   subFolderPrefix if set, creates a sub folder in temporary folder prefixed with parameter value followed
+     * by a dash.
+     * @return  created folder
+     */
+    FWTOOLS_API static const ::boost::filesystem::path getTemporaryFolder(
+            const std::string& subFolderPrefix = "" ) throw();
+
+    /**
+     * @brief   Returns the pid of a temporary folder
+     * If the given folder contains a file matching *.pid and the first part of
+     * the file name is a integer, this method will return this number.
+     * Otherwise, zero will be returned
+     */
+    FWTOOLS_API static int tempFolderPID(const ::boost::filesystem::path &dir) throw();
+
+    /**
+     * @brief   Clean the zombie folders of old processes in given directory
+     */
+    FWTOOLS_API static void cleanZombies(const ::boost::filesystem::path &dir) throw();
+
+    /**
+     *  @brief  Returns the pid of the current process
+     */
+    FWTOOLS_API static int getPID() throw();
+
+    /**
+     * @brief   Test if process is Active
+     * @return  true if the process is running
+     */
+    FWTOOLS_API static bool isProcessRunning(int pid) throw();
+
+    /**
+     * @brief Sets the temporary folder prefix.
+     * The prefix must be set before the first call to getTemporaryFolder,
+     * otherwise, it won't be used.
+     */
+    static void setTempPrefix(const std::string &prefix)
+    {
+        s_tempPrefix = prefix;
+    };
+
+protected:
+
+    static std::string s_tempPrefix;
+
+};
+
+
+} // namespace fwTools
+
+#endif // _FWTOOLS_SYSTEM_HPP_
diff --git a/SrcLib/core/fwTools/include/fwTools/Type.hpp b/SrcLib/core/fwTools/include/fwTools/Type.hpp
new file mode 100644
index 0000000..8344d98
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/Type.hpp
@@ -0,0 +1,332 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_TYPE_HPP_
+#define _FWTOOLS_TYPE_HPP_
+
+#include <limits>
+#include <map>
+#include <string>
+#include <typeinfo>
+
+#include <boost/cstdint.hpp>
+
+#include <boost/type_traits/is_signed.hpp>
+#include <boost/any.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/base.hpp>
+
+#include "fwTools/config.hpp"
+#include "fwTools/Stringizer.hpp"
+
+
+namespace fwTools
+{
+
+/**
+ * @brief   Class describing an elementary C++ type aka unsigned char, signed char, .... int, float, double
+ * @class   Type
+ * 
+ * @date    2007-2009.
+ *
+ **/
+class FWTOOLS_CLASS_API Type
+{
+
+public:
+    struct FWTOOLS_CLASS_API ToolBase
+    {
+        FWTOOLS_API ToolBase();
+        FWTOOLS_API virtual ~ToolBase(){};
+        FWTOOLS_API ToolBase(const std::type_info &typeinfo);
+        FWTOOLS_API virtual std::string toString( ::boost::any value ) const;
+        FWTOOLS_API virtual std::string toString( const void * ) const;
+
+        const std::type_info &m_typeinfo;
+    };
+
+    template<typename T>
+    struct  Tool : public ToolBase
+    {
+        Tool();
+        virtual ~Tool(){};
+        virtual std::string toString( ::boost::any value ) const;
+        virtual std::string toString( const void * ) const;
+    };
+
+    typedef std::map<std::string, Type> TypeMapType;
+
+    /// Default constructor
+    FWTOOLS_API Type();
+    FWTOOLS_API Type(const std::string &type);
+
+    /**
+     * @brief comparison operator
+     */
+    FWTOOLS_API bool operator==(const Type &) const;
+
+    /**
+     * @brief comparison operator
+     */
+    FWTOOLS_API bool operator!=(const Type &) const;
+
+
+    /**
+     * @brief  define an order (lexicographic) for Type
+     */
+    FWTOOLS_API bool operator<( const Type& ) const;
+
+    /**
+     * @brief   Set Type value according given template
+     * @note    A BOOST_ASSERTION can be raised if TYPE is not managed by isMapping
+     **/
+    template< class TYPE>
+    void setType();
+
+    /**
+     * @brief   Return true iff the Type value represents the TYPE
+     * @note    A BOOST_ASSERTION can be raised if TYPE is not managed by isMapping
+     **/
+    template< class TYPE>
+    bool isOfType() const;
+
+    /**
+     * @brief   Return the sizeof of the type
+     */
+    FWTOOLS_API unsigned char sizeOf() const;
+
+    /// Return a human readable string
+    FWTOOLS_API const std::string &string() const;
+
+    /// return type_info of represented type. If type is unspecified, return typeid(void)
+    FWTOOLS_API const std::type_info &typeId() const;
+
+    /**
+     * @brief return the min and max storable in the Type. take care that min/max value are casted into template T
+     */
+    template<class T>
+    const std::pair<T,T> minMax() const;
+
+    /// return true iff the type use a fixed precision
+    FWTOOLS_API bool isFixedPrecision() const;
+
+    /// return true iff the type is signed
+    FWTOOLS_API bool isSigned() const;
+
+    FWTOOLS_API std::string toString( const void * ) const;
+
+    template <int SIZEOF, bool SIGNED, bool ISINTEGRAL>
+    static const std::string &traitsToString();
+
+    template <typename T>
+    static Type create();
+
+    FWTOOLS_API static Type create(std::string name);
+
+protected :
+
+    std::string m_name;
+    unsigned char m_sizeof;
+    bool m_isSigned;
+    bool m_isFixedPrecision;
+    ::boost::any m_min;
+    ::boost::any m_max;
+
+    SPTR(ToolBase) m_tool;
+
+    /// Value for not specified type
+
+    FWTOOLS_API static const TypeMapType s_TYPEMAP;
+
+public :
+
+    FWTOOLS_API static const Type s_UNSPECIFIED_TYPE;
+
+    FWTOOLS_API static const Type s_INT8;
+    FWTOOLS_API static const Type s_INT16;
+    FWTOOLS_API static const Type s_INT32;
+    FWTOOLS_API static const Type s_INT64;
+
+    FWTOOLS_API static const Type s_UINT8;
+    FWTOOLS_API static const Type s_UINT16;
+    FWTOOLS_API static const Type s_UINT32;
+    FWTOOLS_API static const Type s_UINT64;
+
+    FWTOOLS_API static const Type s_FLOAT;
+    FWTOOLS_API static const Type s_DOUBLE;
+
+    FWTOOLS_API static const std::string s_UNSPECIFIED_TYPENAME;
+
+    FWTOOLS_API static const std::string s_INT8_TYPENAME;
+    FWTOOLS_API static const std::string s_INT16_TYPENAME;
+    FWTOOLS_API static const std::string s_INT32_TYPENAME;
+    FWTOOLS_API static const std::string s_INT64_TYPENAME;
+
+    FWTOOLS_API static const std::string s_UINT8_TYPENAME;
+    FWTOOLS_API static const std::string s_UINT16_TYPENAME;
+    FWTOOLS_API static const std::string s_UINT32_TYPENAME;
+    FWTOOLS_API static const std::string s_UINT64_TYPENAME;
+
+    FWTOOLS_API static const std::string s_FLOAT_TYPENAME;
+    FWTOOLS_API static const std::string s_DOUBLE_TYPENAME;
+
+    typedef ::boost::int8_t   Int8Type;
+    typedef ::boost::int16_t  Int16Type;
+    typedef ::boost::int32_t  Int32Type;
+    typedef ::boost::int64_t  Int64Type;
+
+    typedef ::boost::uint8_t  UInt8Type;
+    typedef ::boost::uint16_t UInt16Type;
+    typedef ::boost::uint32_t UInt32Type;
+    typedef ::boost::uint64_t UInt64Type;
+
+    typedef float             FloatType;
+    typedef double            DoubleType;
+
+
+};
+
+//-----------------------------------------------------------------------------
+
+template< typename T >
+std::string Type::Tool<T>::toString(::boost::any value) const
+{
+    return ::fwTools::getString( boost::any_cast<const T> (value));
+}
+
+//-----------------------------------------------------------------------------
+
+template< typename T >
+std::string Type::Tool<T>::toString(const void *value) const
+{
+    const T &v = *(static_cast< const T* > (value));
+    return ::fwTools::getString( v );
+}
+//-----------------------------------------------------------------------------
+
+template< typename T >
+Type::Tool<T>::Tool() : Type::ToolBase(typeid(T))
+{}
+
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+Type Type::create()
+{
+    Type t;
+    t.setType<T>();
+    return t;
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+bool Type::isOfType() const
+{
+    return *this == create<T>();
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+void Type::setType()
+{
+    m_name = Type::traitsToString< sizeof(T), ::boost::is_signed<T>::value, ::boost::is_integral<T>::value >();
+
+    m_sizeof = sizeof(T);
+    m_isSigned = ::boost::is_signed<T>::value;
+    m_isFixedPrecision = ::boost::is_integral<T>::value;
+
+    m_tool = SPTR(ToolBase)(new Type::Tool<T>());
+
+    T min = static_cast< T >( std::numeric_limits< T >::min() );
+    T max = static_cast< T >( std::numeric_limits< T >::max() );
+
+    if(!m_isFixedPrecision)
+    {
+        // std::numeric_limits::min() returns the smallest positive value for floating types
+        min = max * -1;
+    }
+
+    m_min = min;
+    m_max = max;
+}
+
+//-----------------------------------------------------------------------------
+
+template <>
+FWTOOLS_API void Type::setType< void >();
+
+
+//-----------------------------------------------------------------------------
+
+template <>
+FWTOOLS_API void Type::setType< char >();
+
+//-----------------------------------------------------------------------------
+
+#ifdef linux
+
+template <>
+FWTOOLS_API void Type::setType< ::boost::int64_t >();
+
+//-----------------------------------------------------------------------------
+
+template <>
+FWTOOLS_API void Type::setType< ::boost::uint64_t >();
+
+#endif
+
+//-----------------------------------------------------------------------------
+
+template <int SIZEOF, bool SIGNED, bool ISINTEGRAL>
+const std::string &Type::traitsToString()
+{
+    OSLM_ERROR("unknown " << (SIGNED ? "signed" : "unsigned")
+              << " " << (ISINTEGRAL ? "integral" : "floating")
+              << " type with size : " << SIZEOF);
+    return Type::s_UNSPECIFIED_TYPENAME;
+}
+
+//-----------------------------------------------------------------------------
+
+template <typename T>
+const std::pair<T,T> Type::minMax() const
+{
+    return std::pair<T,T>(
+            boost::any_cast< T >(m_min),
+            boost::any_cast< T >(m_max)
+            );
+}
+
+
+//-----------------------------------------------------------------------------
+
+template<> FWTOOLS_API const std::string &Type::traitsToString< 1, true, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 2, true, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 4, true, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 8, true, true > ();
+
+template<> FWTOOLS_API const std::string &Type::traitsToString< 1, false, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 2, false, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 4, false, true > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 8, false, true > ();
+
+template<> FWTOOLS_API const std::string &Type::traitsToString< 4, false, false > ();
+template<> FWTOOLS_API const std::string &Type::traitsToString< 8, false, false > ();
+
+} //end namespace fwTools
+
+namespace std
+{
+    FWTOOLS_API std::ostream& operator<< (std::ostream& os, const ::fwTools::Type& type);
+} // namespace std
+
+
+#endif /*_FWTOOLS_TYPE_H_*/
+
diff --git a/SrcLib/core/fwTools/include/fwTools/TypeInfo.hpp b/SrcLib/core/fwTools/include/fwTools/TypeInfo.hpp
new file mode 100644
index 0000000..f3b1cdc
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/TypeInfo.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_TYPEINFO_HPP__
+#define __FWTOOLS_TYPEINFO_HPP__
+
+#include <typeinfo>
+#include "fwTools/config.hpp"
+#include <cassert>
+
+namespace fwTools
+{
+/**
+ * @brief   Purpose: offer a first-class, comparable wrapper over std::type_info ( but copy construcible )
+ * @class   TypeInfo
+ * 
+ * @date    2007-2009.
+ *
+ * Code imported from Loki-Library and adapted for FW4SPL
+ */
+
+class FWTOOLS_CLASS_API TypeInfo
+{
+public:
+
+    /// default constructor
+    FWTOOLS_API TypeInfo(); // needed for containers
+
+    /// copy constructor
+    FWTOOLS_API TypeInfo(const std::type_info&); // non-explicit
+
+    /**
+     * @brief copy method
+     * @param[in] ti the TypeInfo to copy
+     * @return the copied TypeInfo
+     */
+    FWTOOLS_API TypeInfo &operator=(const TypeInfo &ti);
+
+    /**
+     * @brief access for the wrapped std::type_info
+     * @return a const reference on the embedded  std::type_info
+     */
+    FWTOOLS_API const std::type_info& type_info() const;
+
+    /**
+     * @brief cast operator TypeInfo -> std::type_info
+     * @return a const reference on the embedded  std::type_info
+     */
+    FWTOOLS_API operator const std::type_info&() const
+    {
+        return *pInfo_;
+    }
+
+
+    // Compatibility functions
+    /**
+     * @brief compatibility functions ( std::type_info like)
+     * @return true iff TypeInfo is "before" an other, ( ordering is defined as std::type_info::before() )
+     */
+    FWTOOLS_API bool before(const TypeInfo& rhs) const;
+
+    /**
+     * @brief compatibility functions ( std::type_info like)
+     * @return the lexical name of the typeinfo ( = td::type_info::name() )
+     */
+    FWTOOLS_API const char* name() const;
+
+private:
+
+    /// std::type_info are not copiable but its pointer yes and typeid always return same reference !!!
+    const std::type_info* pInfo_;
+};
+
+
+// COMPARISON OPERATOR
+/**
+ * @name Comparison operators for TypeInfo
+ * @{
+ */
+FWTOOLS_API bool operator==(const TypeInfo& lhs, const TypeInfo& rhs);
+FWTOOLS_API bool operator<(const TypeInfo& lhs, const TypeInfo& rhs);
+FWTOOLS_API bool operator!=(const TypeInfo& lhs, const TypeInfo& rhs);
+FWTOOLS_API bool operator>(const TypeInfo& lhs, const TypeInfo& rhs);
+FWTOOLS_API bool operator<=(const TypeInfo& lhs, const TypeInfo& rhs);
+FWTOOLS_API bool operator>=(const TypeInfo& lhs, const TypeInfo& rhs);
+///@}
+
+}
+
+#endif /* __FWTOOLS_TYPEINFO_HPP__ */
diff --git a/SrcLib/core/fwTools/include/fwTools/TypeInfoKeyTypeMapping.hpp b/SrcLib/core/fwTools/include/fwTools/TypeInfoKeyTypeMapping.hpp
new file mode 100644
index 0000000..8323444
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/TypeInfoKeyTypeMapping.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_TYPEINFOGKEYTYPEMAPPING_HPP__
+#define __FWTOOLS_TYPEINFOGKEYTYPEMAPPING_HPP__
+
+#include <string>
+#include <typeinfo>
+
+#include "fwTools/TypeMapping.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @name TypeInfo mapping
+ * @{
+ */
+
+/**
+ * @brief       Template specialization for defining KeyType mapping ( here std::type_info) with their value.
+ *
+ * Header declare function already specialized while src provide definition
+ *
+ * @warning     isMapping does not need to be exported since fwTools Library is builded as static
+ */
+
+// FIX UNSIGNED
+template<> FWTOOLS_API
+bool isMapping<unsigned char>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned short>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned int>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<unsigned long>(const std::type_info &key);
+
+
+// FIXED PRECISION SIGNED
+template<> FWTOOLS_API
+bool isMapping<signed char>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed short>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed int>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<signed long>(const std::type_info &key);
+
+
+
+
+// FLOATING PRECISION
+template<> FWTOOLS_API
+bool isMapping<float>(const std::type_info &key);
+
+template<> FWTOOLS_API
+bool isMapping<double>(const std::type_info &key);
+
+
+// MISC
+template<> FWTOOLS_API
+bool isMapping<std::string>(const std::type_info &key);
+///@}
+
+} // namespace fwTools
+
+#endif /*__FWTOOLS_TYPEINFOGKEYTYPEMAPPING_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/TypeMapping.hpp b/SrcLib/core/fwTools/include/fwTools/TypeMapping.hpp
new file mode 100644
index 0000000..200ece3
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/TypeMapping.hpp
@@ -0,0 +1,201 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_TYPEMAPPING_HPP__
+#define __FWTOOLS_TYPEMAPPING_HPP__
+
+#include <iterator>
+#include <boost/static_assert.hpp>
+#include <assert.h>
+#include <stdexcept>
+
+#include <boost/mpl/is_sequence.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/if.hpp>
+
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/pop_front.hpp>
+
+namespace fwTools
+{
+
+// forward declaration
+template< class TSEQ, class KeyTypeContainer >
+struct isMappingMultiMPLHelper;
+
+template< class T, class KeyType >
+struct isMappingSingleMPLHelper;
+
+
+//
+/**
+ * @brief   Create a type (T) binding/mapping with a KeyType ( std::string, ipop::PixelType etc...
+ * @tparam TSingle_or_TSEQ a sequence or 1 element type to test
+ * @tparam KeyType_or_KeyTypeContainer to keys (sequence or single one)
+ * @return  true iff the value of the KeyType can deal with the specified type T
+ * 
+ *
+ * This function should be specializated to create a Mapping with a KeyType value and a type.
+ * This function is used by Dispatcher<>::invoke(key) to know what instance to execute.
+ * If isMapping function is missing for a given type then a compilation error
+ * "invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>" is raised
+ * to inform developer.
+ *
+ * *Example* : if keytype type is a std::string and we need to have a binding within unsigned char
+ * @code
+ * template<>
+ * bool isMapping<unsigned char>(const std::string &key)
+ * {
+ *  return key=="unsigned char";
+ * }
+ * @endcode
+ */
+template< class TSingle_or_TSEQ, class KeyType_or_KeyTypeContainer >
+bool isMapping(const KeyType_or_KeyTypeContainer &key)
+{
+    namespace mpl = ::boost::mpl;
+    typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+                                        mpl::is_sequence< TSingle_or_TSEQ >,
+                                        isMappingMultiMPLHelper< TSingle_or_TSEQ,KeyType_or_KeyTypeContainer >,
+                                        isMappingSingleMPLHelper< TSingle_or_TSEQ,KeyType_or_KeyTypeContainer >
+                                    >::type typex;
+    return typex::evaluate(key);
+
+}
+
+
+
+
+
+/**
+ * @brief   an isMapping() helper : This function is called iff TSingle_or_TSEQ is not a sequence and isMapping<SingleType> is not specialized
+ * This class is intended to avoid developer to forgive the specialization of isMapping<TYPE>
+ * @class   isMappingSingleMPLHelper
+ * @tparam  T the type to test
+ * @tparam  KeyType the type to match
+ * 
+ * @date    2007-2009.
+ */
+template< class T, class KeyType >
+struct isMappingSingleMPLHelper
+{
+
+    /// this function is called iff TSingle_or_TSEQ is not a sequence and isMapping<SingleType>
+    static bool evaluate(const KeyType &key)
+    {
+        FwCoreNotUsedMacro(key);
+        BOOST_STATIC_ASSERT(sizeof(T) == 0);  // note its a compilator workaround of BOOST_STATIC_ASSERT(false);
+        // ** if the compilation trap here its because you have not specialized
+        // ** isMapping<MySingleType,MyCorrespondingKeyType>(keytypevalue)
+        std::string msg("isMapping<TYPE>::(const KEYTYPE &key) not specializated for TYPE and/or KEYTYPE!!!");
+        throw std::invalid_argument(msg);
+        return false;
+    }
+};
+
+
+/**
+ * @brief   Test whatever a typelist is mapping a container of KeyType
+ * 
+ * @return  true if same size & each element of type list mappes a single element of KeyType
+ */
+template< class TSEQ, class KeyTypeContainer >
+bool isMappingMulti(const KeyTypeContainer& keys)
+{
+    return  isMappingMultiMPLHelper<TSEQ,KeyTypeContainer>::evaluate(keys);
+}
+
+
+
+
+/**
+ * @class   EmptyListMapping
+ * @brief an helper to isMapping() using iterator
+ * 
+ * @date    2007-2009.
+ */
+template<  class KeyTypeContainer >
+struct EmptyListMapping
+{
+    static bool evaluate(typename KeyTypeContainer::const_iterator & begin, typename KeyTypeContainer::const_iterator & end)
+    {
+        assert( begin == end ); // assertion fails iff TypeList & KeyType container does not have the same size
+        return true; // an empty typelist with an emty keyType matches
+    }
+};
+
+
+
+
+/**
+ * @class   isMappingMultiMPLHelper
+ * @brief an helper to isMapping() using iterator : this class is called when TSEQ is a sequence. it is recursivelly called with head element
+ * removed from TSEQ
+ * 
+ * @date    2007-2009.
+ */
+template< class TSEQ, class KeyTypeContainer >
+struct
+isMappingMultiMPLHelper
+{
+    static bool evaluate(typename KeyTypeContainer::const_iterator & begin, typename KeyTypeContainer::const_iterator & end);
+
+    static bool evaluate(const KeyTypeContainer& keys)
+    {
+
+        namespace mpl = ::boost::mpl;
+
+        if ( keys.size() !=  static_cast<unsigned long>(mpl::size<TSEQ>::value) )
+        {
+            std::string msg("isMappingMulti TypeList & KeyType container does not have the same size !!!");
+            throw std::invalid_argument(msg);
+            return false;
+        }
+
+        typename KeyTypeContainer::const_iterator begin = keys.begin(); // needed to have cste ptr
+        typename KeyTypeContainer::const_iterator end = keys.end();
+        return isMappingMultiMPLHelper<TSEQ,KeyTypeContainer>::evaluate( begin, end );
+
+    }
+
+};
+
+
+template< class TSEQ, class KeyTypeContainer >
+bool
+isMappingMultiMPLHelper<TSEQ,KeyTypeContainer>::evaluate(typename KeyTypeContainer::const_iterator & begin, typename KeyTypeContainer::const_iterator & end)
+{
+        namespace mpl = ::boost::mpl;
+
+        typedef BOOST_DEDUCED_TYPENAME mpl::front<TSEQ>::type Head;
+        typedef BOOST_DEDUCED_TYPENAME mpl::pop_front<TSEQ>::type Tail;
+
+        typedef BOOST_DEDUCED_TYPENAME mpl::if_<
+                mpl::empty<Tail>,
+                EmptyListMapping < KeyTypeContainer >,
+                isMappingMultiMPLHelper <Tail,KeyTypeContainer >
+                 >::type typex;
+
+        bool firstKeyIsOK = isMapping< Head >( *begin ); // call a isMapping with a single key
+
+        if ( firstKeyIsOK == false ) // OPTIMISATION
+        {
+            return false; // the first key doesn't match : do not try to test other
+        }
+
+        bool otherKeys = typex::evaluate( ++begin , end );
+        return firstKeyIsOK && otherKeys;
+
+}
+
+
+
+} // namespace fwTools
+
+
+#endif /*__FWTOOLS_TYPEMAPPING_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/UUID.hpp b/SrcLib/core/fwTools/include/fwTools/UUID.hpp
new file mode 100644
index 0000000..3d71608
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/UUID.hpp
@@ -0,0 +1,102 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_UUID_HPP_
+#define _FWTOOLS_UUID_HPP_
+
+#include <string>
+#include <map>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwTools/Object.hpp"
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+/**
+ * @brief   Management of UUID on objects.
+ * @class   UUID
+ * 
+ * @date    2007-2009.
+ *
+ */
+class FWTOOLS_CLASS_API UUID
+{
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((UUID), (( )), new UUID );
+
+    typedef std::string UUIDType;
+
+    /**
+     * @brief   Return true iff the given uuid is used
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static bool exist( const UUIDType & uuid);
+
+    /**
+     * @brief   Return an uuid to the given object : if no one previously set then generate a new one
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static const UUIDType& get(::fwTools::Object::sptr object);
+
+    /**
+     * @brief   Return a smart ptr on the object related to a given UUID : return null shared if not supervised
+     * @note This method thread-safe.
+     */
+    FWTOOLS_API static ::fwTools::Object::sptr get( const UUIDType & uuid );
+
+    /**
+     * @brief   Return a new extended UUID;
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static UUIDType generateUUID();
+
+    /**
+     * @brief Attempt to set an UUID. If uuid already exists, do nothing.
+     * @return true if the uuid is set, else false.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static bool set(::fwTools::Object::sptr object,  const UUID::UUIDType & uuid);
+
+protected :
+
+    /// Store association \::boost::weak_ptr <--> uuid as a string
+    typedef std::map< UUIDType, ::fwTools::Object::wptr > UUIDContainer;
+
+    FWTOOLS_API static UUIDContainer s_uuidMap;
+
+    /**
+     * @brief   Default constructor : does nothing.
+     */
+    FWTOOLS_API UUID();
+
+    /**
+     * @brief   Destructor : does nothing.
+     */
+    FWTOOLS_API virtual ~UUID();
+
+    /// Mutex used to lock uuid object access.
+    ::fwCore::mt::ReadWriteMutex m_uuidMutex;
+
+private:
+
+    /// Local UUID, empty by default if not generated.
+    UUIDType m_uuid;
+
+    /// Read/Write mutex used to thread-safe UUID get/set/exist methods.
+    static ::fwCore::mt::ReadWriteMutex s_uuidMapMutex;
+
+    /// Mutex used by generateUUID().
+    static ::fwCore::mt::Mutex s_generateUUIDMutex;
+
+};
+
+}
+
+#endif /* _FWTOOLS_UUID_HPP_ */
diff --git a/SrcLib/core/fwTools/include/fwTools/config.hpp b/SrcLib/core/fwTools/include/fwTools/config.hpp
new file mode 100644
index 0000000..f5af7f4
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/config.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+// fwTools - copyright (C) 2005 IRCAD.
+//
+
+
+#ifndef _FWTOOLS_CONFIG_HPP_
+#define _FWTOOLS_CONFIG_HPP_
+
+
+#ifdef _WIN32
+
+    #ifdef FWTOOLS_EXPORTS
+    #define FWTOOLS_API __declspec(dllexport)
+    #define FWTOOLS_TEMPLATE_API
+    #else
+    #define FWTOOLS_API __declspec(dllimport)
+    #define FWTOOLS_TEMPLATE_API extern
+    #endif
+
+    #define FWTOOLS_CLASS_API
+
+    #pragma warning(disable: 4290)
+    #pragma warning(disable: 4800) // avoid waring on return hard coded value
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWTOOLS_EXPORTS
+        #define FWTOOLS_API __attribute__ ((visibility("default")))
+        #define FWTOOLS_CLASS_API __attribute__ ((visibility("default")))
+        #define FWTOOLS_TEMPLATE_API
+        #else
+        //#define FWTOOLS_API __attribute__ ((visibility("hidden")))
+        //#define FWTOOLS_CLASS_API __attribute__ ((visibility("hidden")))
+        #define FWTOOLS_API
+        #define FWTOOLS_CLASS_API
+        #define FWTOOLS_TEMPLATE_API extern
+        #endif
+
+#else
+
+        #define FWTOOLS_API
+        #define FWTOOLS_CLASS_API
+        #define FWTOOLS_TEMPLATE_API
+
+#endif
+
+
+#endif //_FWTOOLS_CONFIG_HPP_
diff --git a/SrcLib/core/fwTools/include/fwTools/dateAndTime.hpp b/SrcLib/core/fwTools/include/fwTools/dateAndTime.hpp
new file mode 100644
index 0000000..95e3fb7
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/dateAndTime.hpp
@@ -0,0 +1,80 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_DATEANDTIME_HPP_
+#define _FWTOOLS_DATEANDTIME_HPP_
+
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @name Date and time
+ * @{
+ */
+
+//------------------------------------------------------------------------------
+/**
+ * @brief       Convert a string date to a boost date
+ * @param[in]   dateStr date in the string format YYYYMMDD (ie : 20090722)
+ * @return      Date in the boost format
+ */
+FWTOOLS_API ::boost::gregorian::date strToBoostDate( const std::string &dateStr );
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief       Convert a string time to a boost time
+ * @param[in]   timeStr time in the string format HHMMSS
+ * @return      Time in the boost format
+ */
+FWTOOLS_API ::boost::posix_time::time_duration strToBoostTime( const std::string &timeStr );
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief       Convert string data time to a boost time
+ * @param[in]   dateStr date in the string format YYYYMMDD (ie : 20090722)
+ * @param[in]   timeStr time in the string format HHMMSS (by default : "000000")
+ * @return      Time in the boost format
+ */
+FWTOOLS_API ::boost::posix_time::ptime strToBoostDateAndTime( const std::string &dateStr, const std::string &timeStr = "000000");
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief       Convert a boost time to a string date
+ * @param[in]   dateAndTime time in the boost format
+ * @return      Date in the string format YYYYMMDD
+ */
+FWTOOLS_API std::string getDate( const ::boost::posix_time::ptime &dateAndTime );
+
+//------------------------------------------------------------------------------
+
+// HHMMSS
+/**
+ * @brief       Convert a boost time to a string time
+ * @param[in]   dateAndTime time in the boost format
+ * @return      Time in the string format HHMMSS
+ */
+FWTOOLS_API std::string getTime ( const ::boost::posix_time::ptime & dateAndTime );
+
+//------------------------------------------------------------------------------
+
+/**
+ * @brief       Return the current clock
+ * @return      Time in the string format YYYY-mmm-DD HH:MM:SS
+ */
+FWTOOLS_API std::string getCurrentTime();
+
+///@}
+}
+
+#endif // _FWTOOLS_DATEANDTIME_HPP_
diff --git a/SrcLib/core/fwTools/include/fwTools/fromIsoExtendedString.hpp b/SrcLib/core/fwTools/include/fwTools/fromIsoExtendedString.hpp
new file mode 100644
index 0000000..9fcc173
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/fromIsoExtendedString.hpp
@@ -0,0 +1,62 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_FROMISOEXTENDEDSTRING_HPP__
+#define __FWTOOLS_FROMISOEXTENDEDSTRING_HPP__
+
+#include <string>
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include "fwTools/config.hpp"
+
+namespace fwTools
+{
+
+/**
+ * @name Date and time in iso extended format
+ * @{
+ */
+
+/**
+ * @brief       Construct a boost ptime from a string in iso extended format (YYYY-MM-DDTHH:MM:SS)
+ * @param[in]   time_string time in the iso extended format YYYY-MM-DDTHH:MM:SS (example : 2007-02-25T00:00:00 )
+ * @return      Time in the boost format
+ */
+FWTOOLS_API boost::posix_time::ptime fromIsoExtendedString(const std::string & time_string );
+
+/**
+ * @brief   Construct a boost ptime from a string in xsd format (YYYY-MM-DD)
+ * @param   date_string date in the xsd format YYYY-MM-DD
+ * @return  Time in the boost format
+ */
+FWTOOLS_API ::boost::posix_time::ptime fromDateInXsdFormat(const std::string & date_string);
+
+/**
+ * @brief       Construct a string in iso extended format from a boost ptime
+ * @param[in]   ptime time in the boost format
+ * @return      Time in the iso extended format YYYY-MM-DDTHH:MM:SS (example : 2007-02-25T00:00:00 )
+ */
+FWTOOLS_API std::string toIsoExtendedString(boost::posix_time::ptime ptime);
+
+/**
+ * @brief       Construct a string in the format YYYY-MM-DD from a boost ptime
+ * @param[in]   dateAndTime time in the boost format
+ * @return      Time in the format YYYY-MM-DD (example : 2007-02-25 )
+ */
+FWTOOLS_API std::string getDateInXsdFormat( const boost::posix_time::ptime & dateAndTime ) ;
+
+///@}
+
+/**
+ * @brief       Remove all accent in the string
+ * @param[in]   str string with accent
+ * @return      A string without accent
+ */
+FWTOOLS_API std::string toStringWithoutAccent(const std::string & str);
+
+}//end namespace
+
+#endif /*__FWTOOLS_FROMISOEXTENDEDSTRING_HPP__*/
diff --git a/SrcLib/core/fwTools/include/fwTools/fwID.hpp b/SrcLib/core/fwTools/include/fwTools/fwID.hpp
new file mode 100644
index 0000000..8f3f197
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/fwID.hpp
@@ -0,0 +1,159 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTOOLS_FWID_HPP_
+#define _FWTOOLS_FWID_HPP_
+
+#include <string>
+
+#include <boost/unordered_map.hpp>
+
+#include <fwCore/base.hpp>
+#include <fwCore/mt/types.hpp>
+
+#include "fwTools/config.hpp"
+#include "fwTools/macros.hpp"
+
+namespace fwTools
+{
+
+class Object;
+/**
+ * @brief   Defines ID for fwTools::Object. It is used to associate ID with object.
+ * @class   fwID
+ * 
+ * @date    2007-2012.
+ */
+class FWTOOLS_CLASS_API fwID
+{
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (fwID) );
+
+    typedef std::string IDType;
+
+
+    typedef enum {
+        EMPTY    = 1, ///< return an empty id if no one set
+        GENERATE    , ///< generate a new id if necessary
+        MUST_EXIST    ///< throw an exception if object has not id.
+    } Policy;
+
+    /**
+     * Test if the given id exist (i.e recorded in fwID dictionary)
+     * @param[in] _id : the id to test.
+     * @return true iff the given id is recorded in fwID dictionary.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static bool exist( IDType _id);
+
+    /**
+     * @brief Retrieve the object attached to the given id. Return a null sptr if no correspondence exist.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API static SPTR(::fwTools::Object ) getObject( IDType requestID );
+
+    FWTOOLS_API virtual ~fwID() ;
+
+protected :
+
+    // API to expose in fwTools::Object
+    /**
+     * @brief Return true if the object has an id set.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API bool   hasID() const;
+
+    /**
+     * @brief Returns the id of the object. If it is not set and the policy value is
+     * \li EMPTY then an empty id is returned
+     * \li GENERATE (default) then a new ID will be generated (and recorded ) using the pattern "CLASSNAME-NUM". NUM is always increasing
+     * \li MUST_EXIST then an exception Failed is raised
+     * @note We consider an object be constant whatever if its id is generated.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API IDType getID( Policy  policy=GENERATE ) const;
+
+#ifdef COM_LOG
+    /**
+     * @brief Returns a light version the id of the object. Used for log. This method calls getID and replaces id using
+     * pattern "::NS1::NS2::CLASSNAME-NUM" by a light version "CLASSNAME-NUM"
+     * \li EMPTY then an empty id is returned
+     * \li GENERATE (default) then a new ID will be generated (and recorded ) using the pattern "CLASSNAME-NUM". NUM is always increasing
+     * \li MUST_EXIST then an exception Failed is raised
+     * @note We consider an object be constant whatever if its id is generated.
+     * @note This method is thread-safe.
+     */
+    FWTOOLS_API IDType getLightID( Policy  policy=GENERATE ) const;
+#endif
+
+    /**
+      * @brief Set a newID  for the object, (newID must not exist in fwID), the oldest one is released.
+      * @warning Cannot set a empty ID.
+      * @note This method is thread-safe.
+      */
+    FWTOOLS_API virtual void   setID( IDType newID ); // cannot set a empty one
+
+    /**
+      * @brief Release the id for the object.
+      * @note This method is thread-safe
+      */
+    FWTOOLS_API  void   resetID();
+
+    /**
+      * @brief   Constructor : does nothing.
+      */
+    fwID() {}; // cannot be instantiated
+
+
+private :
+
+    /**
+      * @brief Will generate a new ID using the pattern "CLASSNAME-NUM". NUM is always increasing.
+      * @note This method is NOT thread-safe.
+      */
+    IDType generate() const;
+
+    /**
+     * @brief Remove ID from the dictionary.
+     * @note This method is NOT thread-safe.
+     */
+    static void removeIDfromDictionary(IDType _id );
+
+    /**
+      * @brief return true if the  _id is found in the dictionary.
+      * @note This method is NOT thread-safe.
+      */
+    static bool isIdFound( IDType _id);
+
+    /**
+      * @brief Add newID in the dictionary (newID must not exist in fwID).
+      * @note This method is NOT thread-safe
+      */
+    void addIDInDictionary( IDType newID );
+
+   IDType m_id;
+
+   typedef ::boost::unordered_map< IDType, WPTR(::fwTools::Object ) > Dictionary;
+   typedef ::boost::unordered_map< std::string , ::boost::uint32_t >  CategorizedCounter;
+
+   static  Dictionary m_dictionary;
+   static  CategorizedCounter m_CategorizedCounter;
+
+   /// Mutex used to lock dictionary access
+   static ::fwCore::mt::ReadWriteMutex s_dictionaryMutex;
+
+   /// Mutex used by generate() to lock m_CategorizedCounter changes.
+   static ::fwCore::mt::Mutex s_mutexCounter;
+
+   /// Mutex used to lock m_id access
+   mutable ::fwCore::mt::ReadWriteMutex m_idMutex;
+};
+
+}
+
+
+#endif /* FWID_HPP_ */
diff --git a/SrcLib/core/fwTools/include/fwTools/macros.hpp b/SrcLib/core/fwTools/include/fwTools/macros.hpp
new file mode 100644
index 0000000..d2a599d
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/macros.hpp
@@ -0,0 +1,231 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/**
+ * @file fwTools/macros.hpp
+ * @brief TODO
+ *
+ * 
+ */
+
+#ifndef _FWTOOLS_ATTRIBUTESMACROS_HPP_
+#define _FWTOOLS_ATTRIBUTESMACROS_HPP_
+
+#include <boost/ref.hpp>
+
+#include <boost/preprocessor/array/data.hpp>
+#include <boost/preprocessor/array/push_front.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/facilities/expand.hpp>
+#include <boost/preprocessor/repetition/for.hpp>
+#include <boost/preprocessor/seq/for_each.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/to_tuple.hpp>
+#include <boost/preprocessor/stringize.hpp>
+#include <boost/preprocessor/tuple/to_seq.hpp>
+
+/** @cond */
+#define __FWTOOLS_MEMBER_PREFIX                   m_
+#define __FWTOOLS_ATTRIBUTE_ACCESSOR_PARAM_PREFIX _
+#define __FWTOOLS_ATTRIBUTE_MAP_NAME              __m_object_attributes__
+#define __FWTOOLS_ATTRIBUTES_REGISTER_FUNC_NAME   __registerAttributes
+
+#define __FWTOOLS_NONE
+/** @endcond */
+
+
+#define fwToolsRegisterAttributeSignatureMacro()   \
+    void __FWTOOLS_ATTRIBUTES_REGISTER_FUNC_NAME()
+
+
+#define fwToolsSetAttributeSignatureMacro()                   \
+    void setAttribute( AttrNameType attrName, AttrType _obj )
+
+#define fwToolsPrependParamPrefixMacro( _name )                     \
+    BOOST_PP_CAT (__FWTOOLS_ATTRIBUTE_ACCESSOR_PARAM_PREFIX, _name)
+
+#define fwToolsAttributeTypeMacro( _type )  \
+    _type::__FWCORE_TYPEDEF_SHARED_PTR_NAME
+
+//-----------------------------------
+// Setter
+//-----------------------------------
+#define fwToolsSetterMacro( _memberprefix, _type, _var) \
+    fwToolsSetMacro    ( _memberprefix, _type, _var);   \
+    fwToolsSetCRefMacro( _memberprefix, _type, _var);
+
+//-----------------------------------
+//
+#define fwToolsSetMacro( _memberprefix, _type, _var)                                      \
+    void set##_var (const _type fwToolsPrependParamPrefixMacro(_var))                     \
+    {                                                                                     \
+        this->BOOST_PP_CAT( _memberprefix, _var ) = fwToolsPrependParamPrefixMacro(_var); \
+    }
+
+//-----------------------------------
+//
+#define fwToolsSetCRefMacro( _memberprefix, _type, _var)                                  \
+    void setCRef##_var (const _type & fwToolsPrependParamPrefixMacro(_var))               \
+    {                                                                                     \
+        this->BOOST_PP_CAT( _memberprefix, _var ) = fwToolsPrependParamPrefixMacro(_var); \
+    }
+
+//-----------------------------------
+
+
+//-----------------------------------
+// Getter
+//-----------------------------------
+#define fwToolsGetterMacro( _memberprefix, _type, _var) \
+    fwToolsGetMacro    ( _memberprefix, _type, _var);   \
+    fwToolsGetRefMacro ( _memberprefix, _type, _var);   \
+    fwToolsGetCRefMacro( _memberprefix, _type, _var);
+
+
+//-----------------------------------
+//
+#define fwToolsGetMacro( _memberprefix, _type, _var) \
+    const _type get##_var () const                   \
+    {                                                \
+        return BOOST_PP_CAT( _memberprefix, _var );  \
+    }
+
+//-----------------------------------
+//
+#define fwToolsGetRefMacro( _memberprefix, _type, _var)   \
+    _type & getRef##_var ()                               \
+    {                                                     \
+        return this->BOOST_PP_CAT( _memberprefix, _var ); \
+    }
+
+//-----------------------------------
+//
+#define fwToolsGetCRefMacro( _memberprefix, _type, _var)  \
+    const _type & getCRef##_var () const                  \
+    {                                                     \
+        return this->BOOST_PP_CAT( _memberprefix, _var ); \
+    }
+
+//-----------------------------------
+// Getter/Setter
+//-----------------------------------
+#define fwGetterSetterMacro( _memberprefix, _type, _name, _desc )                   \
+    /** @name BOOST_PP_CAT( _memberprefix, _var ) accessor */                       \
+    /** Getter/Setter for _var                            */                        \
+    /** @{                                                */                        \
+    fwToolsGetterMacro( _memberprefix, fwToolsAttributeTypeMacro( _type ) , _name); \
+    fwToolsSetterMacro( _memberprefix, fwToolsAttributeTypeMacro( _type ) , _name); \
+    /**@}                                                 */
+
+
+#define fwToolsDeclareAttrMacro( _memberprefix, _type, _name, _desc )          \
+    /** @desc _desc **/                                                        \
+     fwToolsAttributeTypeMacro( _type )  BOOST_PP_CAT( _memberprefix, _name );
+
+
+#define fwToolsDeclareAttrTypedefMacro( _type, _name, _desc ) \
+    /** @desc _desc **/                                       \
+     typedef _type BOOST_PP_CAT( _name, Type );
+
+
+
+#define __FWTOOLS_ONE_ATTR_REGISTER_MACRO( _memberprefix, _type, _name, _desc )  \
+    /* Register the specified attribute in the map */                            \
+      /* Insert pair into map */                                                 \
+      __FWTOOLS_ATTRIBUTE_MAP_NAME.insert(                                       \
+              std::make_pair(                                                    \
+                  BOOST_PP_STRINGIZE(_name),                                     \
+                  boost::ref( (AttrType&) BOOST_PP_CAT( _memberprefix, _name ) ) \
+                  ));
+
+#define __FWTOOLS_SET_ONE_ATTR_MACRO(_type, _name, _desc )                                          \
+    /* check the given object and Set the specified attribute value */                              \
+    else if( BOOST_PP_STRINGIZE(_name) == attrName && BOOST_PP_CAT(_name,Type)::dynamicCast(_obj) ) \
+    {                                                                                               \
+        theAttr = _obj;                                                                             \
+    }
+
+
+#define __FWTOOLS_PREPEND_TO_TUPLE_MACRO( _size, _tuple, _value )           \
+    BOOST_PP_ARRAY_DATA(BOOST_PP_ARRAY_PUSH_FRONT((_size, _tuple), _value))
+
+#define fwToolsOneAttrRegisterMacro( r, _data_memberprefix, _tuple )                                  \
+    BOOST_PP_EXPAND( __FWTOOLS_ONE_ATTR_REGISTER_MACRO __FWTOOLS_PREPEND_TO_TUPLE_MACRO(3, _tuple, _data_memberprefix))
+
+
+#define fwToolsOneAttrDeclareMacro( r, _data_memberprefix, _tuple )                                            \
+    BOOST_PP_EXPAND( fwToolsDeclareAttrMacro __FWTOOLS_PREPEND_TO_TUPLE_MACRO(3, _tuple, _data_memberprefix) )
+
+
+#define fwToolsOneAttrTypedefDeclareMacro( r, data, _tuple ) \
+    fwToolsDeclareAttrTypedefMacro _tuple
+
+
+#define fwToolsOneAttrGetterSetterMacro( r, _data_memberprefix, _tuple )                 \
+    BOOST_PP_EXPAND( fwGetterSetterMacro  __FWTOOLS_PREPEND_TO_TUPLE_MACRO(3, _tuple, _data_memberprefix))
+
+#define fwToolsSetOneAttrMacro( r, data, _tuple ) \
+    __FWTOOLS_SET_ONE_ATTR_MACRO _tuple
+
+
+#define fwToolsDeclareAttributesMacro( _memberprefix, _attributes )                   \
+        BOOST_PP_SEQ_FOR_EACH(fwToolsOneAttrDeclareMacro, _memberprefix, _attributes)
+
+#define fwToolsDeclareAttributesTypedefMacro( _memberprefix, _attributes )                   \
+        BOOST_PP_SEQ_FOR_EACH(fwToolsOneAttrTypedefDeclareMacro, _memberprefix, _attributes)
+
+
+#define fwToolsGetterSetterAttributesMacro( _memberprefix, _attributes )                   \
+    /** @cond **/                                                                          \
+        BOOST_PP_SEQ_FOR_EACH(fwToolsOneAttrGetterSetterMacro, _memberprefix, _attributes) \
+    /** @endcond **/
+
+
+#define fwToolsRegisterAttributesMacro( _memberprefix, _attributes )                    \
+    /** @cond **/                                                                       \
+    fwToolsRegisterAttributeSignatureMacro()                                            \
+    {                                                                                   \
+        BOOST_PP_SEQ_FOR_EACH(fwToolsOneAttrRegisterMacro,  _memberprefix, _attributes) \
+    }                                                                                   \
+    /** @endcond **/
+
+
+#define fwToolsSetAttributesMacro( _attributes )                                           \
+    /** @cond **/                                                                          \
+    fwToolsSetAttributeSignatureMacro()                                                    \
+    {                                                                                      \
+        AttrRefType::type &theAttr = this->getAttributeRef(attrName);                      \
+        if (!_obj)                                                                         \
+        {                                                                                  \
+            theAttr.reset();                                                               \
+        }                                                                                  \
+        BOOST_PP_SEQ_FOR_EACH(fwToolsSetOneAttrMacro, _, _attributes)                      \
+        else                                                                               \
+        {                                                                                  \
+            OSLM_FATAL( "Attribute '"<<attrName<<"' of object '"<< this->getClassname()    \
+                      <<"' can not handle a object of type '"<<_obj->getClassname()<<"'"); \
+        }                                                                                  \
+    }                                                                                      \
+    /** @endcond **/
+
+
+
+#define fwToolsPrefixedAttributesMacro( _prefix, _attributes )        \
+    private:                                                          \
+        fwToolsDeclareAttributesMacro  ( _prefix, _attributes )       \
+        fwToolsRegisterAttributesMacro ( _prefix, _attributes )       \
+    public:                                                           \
+        fwToolsDeclareAttributesTypedefMacro ( _prefix, _attributes ) \
+        fwToolsGetterSetterAttributesMacro   ( _prefix, _attributes ) \
+        fwToolsSetAttributesMacro            ( _attributes )
+
+
+#define fwToolsAttributesMacro( _attributes )                              \
+    fwToolsPrefixedAttributesMacro( __FWTOOLS_MEMBER_PREFIX, _attributes )
+
+
+#endif //_FWTOOLS_ATTRIBUTESMACROS_HPP_
diff --git a/SrcLib/core/fwTools/include/fwTools/pathDifference.hpp b/SrcLib/core/fwTools/include/fwTools/pathDifference.hpp
new file mode 100644
index 0000000..56c8361
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/pathDifference.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_PATHDIFFERENCE_HPP___
+#define __FWTOOLS_PATHDIFFERENCE_HPP___
+
+#include "fwTools/config.hpp"
+#include <boost/filesystem/path.hpp>
+
+
+namespace fwTools
+{
+/**
+ * @brief   Return the relative difference within two paths
+ *
+ * Return   The relative difference within two paths in such way :
+ * \li cd path1;
+ * \li cd  getPathDifference(path1,path2)
+ * \li assert( pwd = path2 )
+ *
+ * @note    Here path are supposed to be attached in a same root
+ *
+ * examples :
+ * \li   path1="a/b/c"                                  \n
+ *      path2="a/b/e/g"                                 \n
+ *      getPathDifference(path1,path2)                  \n
+ *      return "../e/g"
+ *
+ * \li  path1="a/b/c"                                   \n
+ *      path2="e/f/g"                                   \n
+ *      getPathDifference(path1,path2)                  \n
+ *      return "../../../e/f/g"
+ *
+ * \li  path1="a"                                       \n
+ *      path2="a"                                       \n
+ *      getPathDifference(path1,path2)                  \n
+ *      return ""
+ *
+ * \li  path1="a"                                       \n
+ *      path2="a/e"                                     \n
+ *      getPathDifference(path1,path2)                  \n
+ *      return "e"
+ *
+ * \li  etc..
+ */
+FWTOOLS_API boost::filesystem::path getPathDifference( boost::filesystem::path path1, boost::filesystem::path path2 );
+
+}
+
+#endif /*__FWTOOLS_PATHDIFFERENCE_HPP___*/
diff --git a/SrcLib/core/fwTools/include/fwTools/random/Generator.hpp b/SrcLib/core/fwTools/include/fwTools/random/Generator.hpp
new file mode 100644
index 0000000..d53c053
--- /dev/null
+++ b/SrcLib/core/fwTools/include/fwTools/random/Generator.hpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_RANDOM_GENERATOR_HPP__
+#define __FWTOOLS_RANDOM_GENERATOR_HPP__
+
+#include <ctime>
+
+#include <boost/random/variate_generator.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/random/uniform_real.hpp>
+#include <boost/random/uniform_int.hpp>
+#include <boost/type_traits/is_floating_point.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/concept_check.hpp>
+
+#include <fwCore/base.hpp>
+
+namespace fwTools
+{
+namespace random
+{
+
+
+/**
+ * @brief On each invocation, it returns a random value uniformly distributed in the range [min..max).
+ * @param min      The "min" parameter of the distribution.
+ * @param max      The "max" parameter of the distribution.
+ * @param seedVal  Seed for generator.
+ * @pre   min <= max
+ *
+ * @return returns a random value uniformly distributed in the range [min..max)
+ */
+template <typename T>
+T getValue(T min, T max, ::boost::uint32_t seedVal = std::time(NULL))
+{
+    SLM_ASSERT("Wrong min/max value", min <= max);
+    typedef typename ::boost::mpl::if_<
+            ::boost::is_floating_point<T>,
+            ::boost::uniform_real<>,
+            ::boost::uniform_int<>
+    >::type DistroType;
+
+    ::boost::mt19937 seed(seedVal);
+    DistroType dist(min, max);
+    ::boost::variate_generator< ::boost::mt19937&, DistroType > random(seed, dist);
+    return random();
+}
+
+/**
+ * @brief On each invocation, this method fills specified container with random values uniformly distributed in the range [min..max).
+ * @param[in] min            The "min" parameter of the distribution.
+ * @param[in] max            The "max" parameter of the distribution.
+ * @param[out] randContainer Container to fill with random values.
+ * @param[in] seedVal        Seed for generator.
+ * @pre  min <= max
+ * @pre  CONTAINER type same as template T
+ */
+template <typename T, typename CONTAINER>
+void fillContainer(T min, T max, CONTAINER& randContainer, ::boost::uint32_t seedVal = std::time(NULL))
+{
+    SLM_ASSERT("Wrong min/max value", min <= max);
+    SLM_ASSERT("Container type not same as T", (::boost::is_same< T, typename CONTAINER::value_type>::value) );
+    typedef typename ::boost::mpl::if_<
+            ::boost::is_floating_point<T>,
+            ::boost::uniform_real<>,
+            ::boost::uniform_int<>
+    >::type DistroType;
+
+    ::boost::mt19937 seed(seedVal);
+    DistroType dist(min, max);
+    ::boost::variate_generator< ::boost::mt19937&, DistroType > random(seed, dist);
+    std::generate(randContainer.begin(), randContainer.end(), random);
+}
+
+} // namespace random
+} // namespace fwTools
+
+#endif //__FWTOOLS_RANDOM_GENERATOR_HPP__
diff --git a/SrcLib/core/fwTools/src/fwTools/Bookmarks.cpp b/SrcLib/core/fwTools/src/fwTools/Bookmarks.cpp
new file mode 100644
index 0000000..54b094b
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Bookmarks.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <assert.h>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwCore/Demangler.hpp>
+
+#include "fwTools/Object.hpp"
+#include "fwTools/Bookmarks.hpp"
+#include "fwTools/Failed.hpp"
+
+namespace fwTools
+{
+Bookmarks::Dictionary Bookmarks::m_dictionary;
+
+//-----------------------------------------------------------------------------
+
+Bookmarks::Bookmarks()
+{}
+
+//-----------------------------------------------------------------------------
+
+Bookmarks::~Bookmarks()
+{}
+
+//-----------------------------------------------------------------------------
+
+bool Bookmarks::exist( Bookmarks::BookmarkName _id)
+{
+    return m_dictionary.find( _id ) != m_dictionary.end();
+}
+
+//-----------------------------------------------------------------------------
+
+void Bookmarks::add( Bookmarks::BookmarkName _bookmark,  ::fwTools::Object::sptr obj )
+{
+    OSLM_FATAL_IF("Try to set a  Bookmarks on a null object ", !obj );
+    m_dictionary[ _bookmark ] = obj;
+}
+
+//-----------------------------------------------------------------------------
+
+void Bookmarks::remove( Bookmarks::BookmarkName _bookmark  )
+{
+    m_dictionary.erase( m_dictionary.find( _bookmark ) );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwTools::Object::sptr Bookmarks::getObject( Bookmarks::BookmarkName _bookmark )
+{
+    ::fwTools::Object::sptr bookmark;
+    Dictionary::iterator iter = m_dictionary.find( _bookmark );
+    if ( iter != m_dictionary.end()  && !iter->second.expired() )
+    {
+        bookmark = iter->second.lock();
+    }
+    return  bookmark;
+}
+
+//-----------------------------------------------------------------------------
+
+std::list<Bookmarks::BookmarkName> Bookmarks::getBookmarks( ::fwTools::Object::sptr obj )
+{
+    std::list<Bookmarks::BookmarkName> result;
+    BOOST_FOREACH( Bookmarks::Dictionary::value_type elt, m_dictionary)
+    {
+        if ( !elt.second.expired() && elt.second.lock() == obj )
+        {
+            result.push_back(  elt.first );
+        }
+    }
+    return  result;
+}
+
+//-----------------------------------------------------------------------------
+
+std::list<Bookmarks::BookmarkName> Bookmarks::getBookmarks()
+{
+    std::list<Bookmarks::BookmarkName> result;
+    BOOST_FOREACH( Bookmarks::Dictionary::value_type elt, m_dictionary)
+    {
+        result.push_back( elt.first );
+    }
+    return  result;
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/DynamicType.cpp b/SrcLib/core/fwTools/src/fwTools/DynamicType.cpp
new file mode 100644
index 0000000..bf3f9d6
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/DynamicType.cpp
@@ -0,0 +1,134 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+#include <boost/type_traits/is_unsigned.hpp>
+
+#include "fwCore/spyLog.hpp"
+#include "fwTools/DynamicType.hpp"
+#include "fwTools/DynamicTypeKeyTypeMapping.hpp"
+#include "fwTools/Dispatcher.hpp"
+
+namespace fwTools {
+
+std::list< std::string > DynamicType::m_managedTypes = boost::assign::list_of
+    ("unsigned char")
+    ("signed char")
+    ("unsigned short")
+    ("signed short")
+    ("unsigned int")
+    ("signed int")
+    ("unsigned long")
+    ("signed long")
+    ("float")
+    ("double");
+
+const std::string  DynamicType::m_unSpecifiedType = std::string("UNSPECIFIED TYPE");
+
+typedef boost::mpl::vector< signed char, unsigned char, signed short, unsigned short,  signed int, unsigned int, float, double >::type SupportedTypes;
+
+
+
+bool DynamicType::operator==(const DynamicType &d2) const
+{
+    return m_value == d2.m_value;
+}
+
+
+
+bool DynamicType::operator!=(const DynamicType &d2) const
+{
+    return m_value != d2.m_value;
+}
+
+
+bool DynamicType::operator<(const DynamicType &d2) const
+{
+    return m_value <  d2.m_value;
+}
+
+
+
+
+DynamicType::DynamicType() : m_value( m_unSpecifiedType), m_sizeof(0)
+{
+}
+
+
+DynamicType::DynamicType(const DynamicType &d2)
+{
+    this->m_value = d2.m_value;
+    this->m_sizeof = d2.m_sizeof;
+}
+
+
+DynamicType::~DynamicType()
+{
+}
+
+
+
+const std::string &DynamicType::string() const
+{
+    return m_value;
+}
+
+
+
+unsigned char  DynamicType::sizeOf() const
+{
+    SLM_ASSERT("Sizeof not specified.", m_sizeof!=0);
+    return m_sizeof;
+}
+
+
+bool DynamicType::isFixedPrecision()
+{
+    return !isType<float>() && !isType<double>();
+}
+
+
+
+class isSignedFunctor
+{
+public:
+
+    template< typename PIXEL >
+    void operator()( bool &isSigned )
+    {
+        isSigned =  !::boost::is_unsigned<PIXEL>::value;
+    }
+};
+
+
+bool DynamicType::isSigned()
+{
+    bool isSigned;
+    Dispatcher<SupportedTypes,isSignedFunctor >::invoke(*this,isSigned);
+    return isSigned;
+}
+
+template<>
+std::string getString(const DynamicType &dt)
+{
+    return dt.string();
+}
+
+
+template<>
+std::string getString(const std::vector<DynamicType> &dtv)
+{
+    return getString(dtv.begin(), dtv.end());
+}
+
+
+
+
+
+} // end namespace fwTools {
+
+
+
diff --git a/SrcLib/core/fwTools/src/fwTools/DynamicTypeKeyTypeMapping.cpp b/SrcLib/core/fwTools/src/fwTools/DynamicTypeKeyTypeMapping.cpp
new file mode 100644
index 0000000..9ac5877
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/DynamicTypeKeyTypeMapping.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/DynamicTypeKeyTypeMapping.hpp"
+
+
+namespace fwTools {
+/*
+ * @brief template specialization for defining KeyType mapping ( here DynamicType) with their value
+ * @auhtor Vincent Agnus
+ */
+
+
+// FIX UNSIGNED
+template<>
+bool isMapping<unsigned char>(const DynamicType &key)
+{
+    return key.isType<unsigned char>();
+}
+template<>
+bool isMapping<unsigned short>(const DynamicType &key)
+{
+    return key.isType<unsigned short>();
+}
+template<>
+bool isMapping<unsigned int>(const DynamicType &key)
+{
+    return key.isType<unsigned int>();
+}
+template<>
+bool isMapping<unsigned long>(const DynamicType &key)
+{
+    return key.isType<unsigned long>();
+}
+
+// FIXED PRECISION SIGNED
+template<>
+bool isMapping<signed char>(const DynamicType &key)
+{
+    return key.isType<signed char>();
+}
+template<>
+bool isMapping<signed short>(const DynamicType &key)
+{
+    return key.isType<signed short>();
+}
+template<>
+bool isMapping<signed int>(const DynamicType &key)
+{
+    return key.isType<signed int>();
+}
+
+template<>
+bool isMapping<signed long>(const DynamicType &key)
+{
+    return key.isType<signed long>();
+}
+
+
+// FLOATING PRECISION
+template<>
+bool isMapping<float>(const DynamicType &key)
+{
+    return key.isType<float>();
+}
+template<>
+bool isMapping<double>(const DynamicType &key)
+{
+    return key.isType<double>();
+}
+
+// MISC
+template<>
+bool isMapping<std::string>(const DynamicType &key)
+{
+    return key.isType<std::string>();
+}
+
+
+
+} // end namespace fwTools {
+
diff --git a/SrcLib/core/fwTools/src/fwTools/Exception.cpp b/SrcLib/core/fwTools/src/fwTools/Exception.cpp
new file mode 100644
index 0000000..525fcf2
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Exception.cpp
@@ -0,0 +1,23 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/Exception.hpp"
+
+namespace fwTools
+{
+
+Exception::Exception(const std::string &message) throw()
+: ::fwCore::Exception(message)
+{}
+
+
+Exception::~Exception() throw()
+{}
+
+
+
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/src/fwTools/Failed.cpp b/SrcLib/core/fwTools/src/fwTools/Failed.cpp
new file mode 100644
index 0000000..dfa8ed7
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Failed.cpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/Failed.hpp"
+
+namespace fwTools
+{
+
+Failed::Failed(const std::string &message) throw()
+: ::fwCore::Exception(message)
+{}
+
+
+Failed::~Failed() throw()
+{}
+
+
+    
+} // namespace fwTools
diff --git a/SrcLib/core/fwTools/src/fwTools/Object.cpp b/SrcLib/core/fwTools/src/fwTools/Object.cpp
new file mode 100644
index 0000000..1cb311e
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Object.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/HiResClock.hpp>
+
+#include "fwTools/Object.hpp"
+#include "fwTools/UUID.hpp"
+
+namespace fwTools
+{
+
+//------------------------------------------------------------------------------
+
+Object::Object() :
+    m_timeStamp ( ::fwCore::TimeStamp::New()  ),
+    m_logicStamp( ::fwCore::LogicStamp::New() ),
+    m_uuid( ::fwTools::UUID::New() )
+{
+    m_OSRKey = ::fwCore::LogicStamp::New();
+    m_OSRKey->modified();
+}
+
+//------------------------------------------------------------------------------
+
+Object::~Object()
+{}
+
+//------------------------------------------------------------------------------
+
+Object &Object::operator=(const Object &_obj)
+{
+    SLM_FATAL("This operator is forbidden, use shallowCopy or deepCopy instead.");
+    m_timeStamp =_obj.m_timeStamp;
+    m_logicStamp =_obj.m_logicStamp;
+    return (*this);
+}
+
+//------------------------------------------------------------------------------
+
+std::string Object::className() const
+{
+    return this->getClassname();
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace fwTools
+
+
+
diff --git a/SrcLib/core/fwTools/src/fwTools/Os.cpp b/SrcLib/core/fwTools/src/fwTools/Os.cpp
new file mode 100644
index 0000000..d056f3e
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Os.cpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <boost/filesystem.hpp>
+
+#include "fwCore/base.hpp"
+#include "fwTools/Os.hpp"
+
+
+namespace fwTools {
+
+namespace os {
+
+std::string getEnv(const std::string &name, bool *ok)
+{
+    char *value = std::getenv(name.c_str());
+    bool exists = (value != NULL);
+    if(ok != NULL)
+    {
+        *ok = exists;
+    }
+    return std::string(exists ? value : "");
+}
+
+//------------------------------------------------------------------------------
+
+std::string getEnv(const std::string &name, const std::string &defaultValue)
+{
+    bool ok = false;
+    std::string value = getEnv(name, &ok);
+    return ok ? value : defaultValue;
+}
+
+//------------------------------------------------------------------------------
+
+std::string getUserDataDir( std::string company, std::string appName, bool createDirectory )
+{
+    std::string dataDir;
+#ifdef WIN32
+    char *appData = std::getenv("APPDATA");
+    dataDir = ::fwTools::os::getEnv("APPDATA");
+#else
+    bool hasXdgConfigHome = false;
+    bool hasHome = false;
+    std::string xdgConfigHome = ::fwTools::os::getEnv("XDG_CONFIG_HOME", &hasXdgConfigHome);
+    std::string home          = ::fwTools::os::getEnv("HOME", &hasHome);
+    dataDir = hasXdgConfigHome ? xdgConfigHome : (hasHome ? std::string(home) + "/.config" : "");
+#endif
+
+    if ( !company.empty() )
+    {
+        dataDir += "/" + company;
+    }
+
+
+    if ( !appName.empty() )
+    {
+        dataDir += "/" + appName;
+    }
+
+    if ( !dataDir.empty() )
+    {
+        if (boost::filesystem::exists(dataDir))
+        {
+            if ( ! boost::filesystem::is_directory(dataDir) )
+            {
+                OSLM_ERROR( dataDir << " already exists and is not a directory." );
+                dataDir = "";
+            }
+        }
+        else if (createDirectory)
+        {
+            OSLM_INFO("Creating application data directory: "<< dataDir);
+            boost::filesystem::create_directories(dataDir);
+        }
+    }
+
+    return dataDir;
+}
+
+} // namespace os
+
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/src/fwTools/ProgressAdviser.cpp b/SrcLib/core/fwTools/src/fwTools/ProgressAdviser.cpp
new file mode 100644
index 0000000..b7dbf0a
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/ProgressAdviser.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/ProgressAdviser.hpp"
+
+namespace fwTools {
+
+ProgressAdviser::ProgressAdviser()
+{}
+
+ProgressAdviser::~ProgressAdviser()
+{}
+
+void ProgressAdviser::addHandler(const ProgessHandler &handler)
+{
+    // append a new ProgressHandler
+    m_progressSignal.connect(handler);
+}
+
+void ProgressAdviser::notifyProgress(float percent, std::string msg)
+{
+    m_progressSignal(percent,msg);
+}
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/ProgressToLogger.cpp b/SrcLib/core/fwTools/src/fwTools/ProgressToLogger.cpp
new file mode 100644
index 0000000..e5b8781
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/ProgressToLogger.cpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+#include "fwTools/ProgressToLogger.hpp"
+
+namespace fwTools {
+
+ProgressToLogger::ProgressToLogger(std::string prefix, std::string postfix)
+: m_prefix(prefix),
+  m_postfix(postfix)
+{
+}
+
+ProgressToLogger::~ProgressToLogger() {
+    // TODO Auto-generated destructor stub
+}
+
+
+void ProgressToLogger::operator()(float percent,std::string msg)
+{
+    // fixme io precision
+    OSLM_INFO( m_prefix << msg << " " << (int) (percent*100) << m_postfix);
+}
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/StringKeyTypeMapping.cpp b/SrcLib/core/fwTools/src/fwTools/StringKeyTypeMapping.cpp
new file mode 100644
index 0000000..ab3102c
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/StringKeyTypeMapping.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/StringKeyTypeMapping.hpp"
+
+namespace fwTools {
+
+/*
+ * @brief template specialization for defining KeyType mapping ( here std::string) with their value
+ * @auhtor Vincent Agnus
+ */
+
+
+// FIX UNSIGNED
+template<>
+bool isMapping<unsigned char>(const std::string &key)
+{
+    return key=="unsigned char";
+}
+template<>
+bool isMapping<unsigned short>(const std::string &key)
+{
+    return key=="unsigned short";
+}
+template<>
+bool isMapping<unsigned int>(const std::string &key)
+{
+    return key=="unsigned int";
+}
+template<>
+bool isMapping<unsigned long>(const std::string &key)
+{
+    return key=="unsigned long";
+}
+
+// FIXED PRECISION SIGNED
+template<>
+bool isMapping<signed char>(const std::string &key)
+{
+    return key=="signed char";
+}
+template<>
+bool isMapping<signed short>(const std::string &key)
+{
+    return key=="signed short";
+}
+template<>
+bool isMapping<signed int>(const std::string &key)
+{
+    return key=="signed int";
+}
+
+template<>
+bool isMapping<signed long>(const std::string &key)
+{
+    return key=="signed long";
+}
+
+
+// FLOATING PRECISION
+template<>
+bool isMapping<float>(const std::string &key)
+{
+    return key=="float";
+}
+template<>
+bool isMapping<double>(const std::string &key)
+{
+    return key=="double";
+}
+
+// MISC
+template<>
+bool isMapping<std::string>(const std::string &key)
+{
+    return key=="std::string";
+}
+
+
+
+} // end namespace fwTools {
+
diff --git a/SrcLib/core/fwTools/src/fwTools/Stringizer.cpp b/SrcLib/core/fwTools/src/fwTools/Stringizer.cpp
new file mode 100644
index 0000000..b34006f
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Stringizer.cpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef WIN32
+#include <cxxabi.h>
+#include <stdlib.h>
+#endif
+
+#include "fwTools/Stringizer.hpp"
+
+
+namespace fwTools
+{
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const std::string &aString)
+{
+    return aString;
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const std::type_info &ti)
+{
+#ifndef WIN32
+    char *demangled = abi::__cxa_demangle(ti.name(),0,0,0);
+    if (demangled)
+    {
+        std::string res(demangled);
+        free(demangled);
+        return res;
+    }
+    else
+    {
+        return ti.name();
+    }
+#else
+    return ti.name();
+#endif
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const TypeInfo &ti)
+{
+    return getString(ti.type_info());
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const signed char &c)
+{
+    return boost::lexical_cast<std::string>((short)c);
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const  char &c)
+{
+    return boost::lexical_cast<std::string>((short)c);
+}
+
+//------------------------------------------------------------------------------
+
+template<>
+std::string getString(const unsigned char &c)
+{
+    return boost::lexical_cast<std::string>((short)c);
+}
+
+//------------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/System.cpp b/SrcLib/core/fwTools/src/fwTools/System.cpp
new file mode 100644
index 0000000..3e4d6c8
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/System.cpp
@@ -0,0 +1,292 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/regex.hpp>
+#include <boost/foreach.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+// for PID
+#ifdef WIN32
+#include <wtypes.h>
+#include <windows.h>
+#include <process.h>
+#else
+#include <sys/types.h>
+#include <unistd.h>
+#include <signal.h>
+#endif
+
+#include <fwCore/base.hpp>
+
+#include "fwTools/System.hpp"
+
+
+#define F4S_TMP_EXT "fw4spl-tmp"
+
+namespace fwTools
+{
+
+std::string System::s_tempPrefix;
+
+struct RemoveTemporaryFolder
+{
+    typedef ::boost::shared_ptr< RemoveTemporaryFolder > sptr;
+
+    RemoveTemporaryFolder(const ::boost::filesystem::path &path) : m_path(path)
+    {}
+
+    ~RemoveTemporaryFolder()
+    {
+        ::boost::system::error_code er;
+        ::boost::filesystem::remove_all(m_path, er);
+        OSLM_ERROR_IF( "Failed to remove " << m_path << " : " << er.message(), er.value() != 0);
+    }
+    ::boost::filesystem::path m_path;
+};
+static RemoveTemporaryFolder::sptr autoRemoveTempFolder;
+
+
+
+static struct CleanZombies
+{
+    CleanZombies()
+    {
+        System::cleanZombies(System::getTempPath());
+    }
+} autoCleanZombies;
+
+
+//------------------------------------------------------------------------------
+
+int System::getPID() throw()
+{
+    int pid=0;
+#ifdef WIN32
+    pid = _getpid();
+#else
+    pid = getpid();
+#endif
+
+    return pid;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path &System::getTempPath() throw()
+{
+    namespace fs = ::boost::filesystem;
+    static fs::path sysTmp;
+
+    if(!sysTmp.empty())
+    {
+        return sysTmp;
+    }
+
+    ::boost::system::error_code err;
+    sysTmp = fs::temp_directory_path(err);
+
+    if(err.value() != 0)
+    {
+#ifdef WIN32
+        fs::path fallback("C:\\");
+#else
+        fs::path fallback("/tmp");
+#endif
+        OSLM_ERROR("Temporary Path Error : " << err.message() << ". " << "Falling back to " << fallback );
+
+        sysTmp = fallback;
+    }
+
+    return sysTmp;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path createUniqueFolder(const ::boost::filesystem::path& folderUniquePath)
+{
+    namespace fs = ::boost::filesystem;
+    bool created = false;
+    fs::path tmpDir;
+
+    do
+    {
+        tmpDir = fs::unique_path(folderUniquePath);
+
+        if(! fs::exists(tmpDir))
+        {
+            fs::create_directories(tmpDir);
+
+            created = true;
+        }
+
+    }
+    while ( !created );
+
+    return tmpDir;
+}
+
+//------------------------------------------------------------------------------
+
+const ::boost::filesystem::path System::getTemporaryFolder(const std::string& subFolderPrefix) throw()
+{
+    namespace fs = ::boost::filesystem;
+    static fs::path tmpDirPath;
+
+    if(!tmpDirPath.empty() && fs::exists(tmpDirPath))
+    {
+        if(!subFolderPrefix.empty())
+        {
+            const std::string subDirName = subFolderPrefix + "-" + "%%%%%%%%%%%%";
+            fs::path tmpSubDir = createUniqueFolder(tmpDirPath/subDirName);
+            return tmpSubDir;
+        }
+
+        return tmpDirPath;
+    }
+
+    const fs::path &sysTmp = getTempPath();
+
+    const std::string tmpDirName = s_tempPrefix + (s_tempPrefix.empty() ? "" : "-") + "%%%%%%%%%%%%." F4S_TMP_EXT;
+    fs::path tmpDir = createUniqueFolder(sysTmp/tmpDirName);
+    tmpDirPath = tmpDir;    // tmpDirPath always set to root tmp dir
+
+    fs::path pidFile = tmpDir / (::boost::lexical_cast<std::string>(getPID()) + ".pid");
+    fs::fstream( pidFile, std::ios::out ).close();
+
+    autoRemoveTempFolder = ::boost::make_shared<RemoveTemporaryFolder>(tmpDirPath);
+
+    if(!subFolderPrefix.empty())
+    {
+        const std::string subDirName = subFolderPrefix + "-" + "%%%%%%%%%%%%";
+        tmpDir = createUniqueFolder(tmpDir/subDirName);
+    }
+
+    OSLM_INFO("Temporary folder is : " << tmpDirPath);
+    return tmpDir;
+}
+
+//------------------------------------------------------------------------------
+
+bool System::isProcessRunning(int pid) throw()
+{
+#ifdef WIN32
+    HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, pid);
+    if (!hProcess)
+    {
+        return false;
+    }
+    else
+    {
+        CloseHandle(hProcess);
+        return true;
+    }
+#else
+    return kill(pid,0) == 0 ;
+#endif
+
+    return true;
+}
+
+//------------------------------------------------------------------------------
+
+int System::tempFolderPID(const ::boost::filesystem::path &dir) throw()
+{
+    namespace fs = ::boost::filesystem;
+
+    const ::boost::regex pidFilter( "([[:digit:]]+)\\.pid" );
+
+    fs::directory_iterator i( dir );
+    fs::directory_iterator endIter;
+
+    int pid = 0;
+
+    for( ; i != endIter; ++i )
+    {
+        // Skip if not a dir
+        if( !fs::is_regular_file( i->status() ) )
+        {
+            continue;
+        }
+
+        ::boost::smatch what;
+
+        // Skip if no match
+        std::string s = i->path().filename().string();
+        if( !::boost::regex_match( s, what, pidFilter ) )
+        {
+            continue;
+        }
+
+        try
+        {
+            pid = ::boost::lexical_cast< int >(what.str(1));
+            break;
+        }
+        catch (boost::bad_lexical_cast&)
+        {}
+
+    }
+    return pid;
+}
+
+//------------------------------------------------------------------------------
+
+void System::cleanZombies(const ::boost::filesystem::path &dir) throw()
+{
+    namespace fs = ::boost::filesystem;
+
+    const ::boost::regex tmpFolderFilter( ".*\\." F4S_TMP_EXT );
+
+    std::vector< fs::path > allTempFolders;
+
+    fs::directory_iterator i( dir );
+    fs::directory_iterator endIter;
+
+    for( ; i != endIter; ++i )
+    {
+        // Skip if not a dir
+        if( !fs::is_directory( i->status() ) )
+        {
+            continue;
+        }
+
+        ::boost::smatch what;
+
+        // Skip if no match
+        if( !::boost::regex_match( i->path().filename().string(), what, tmpFolderFilter ) )
+        {
+            continue;
+        }
+
+        allTempFolders.push_back( i->path() );
+    }
+
+
+    BOOST_FOREACH( const fs::path &foundTmpDir, allTempFolders)
+    {
+        int pid = tempFolderPID(foundTmpDir);
+
+        if(pid && !isProcessRunning(pid))
+        {
+            OSLM_INFO("Removing old temp dir : " << foundTmpDir);
+
+            ::boost::system::error_code er;
+            fs::remove_all(foundTmpDir, er);
+
+            OSLM_INFO_IF( "Failed to remove " << foundTmpDir << " : " << er.message(), er.value() != 0);
+        }
+    }
+
+
+}
+
+//------------------------------------------------------------------------------
+
+} //end namespace fwTools
diff --git a/SrcLib/core/fwTools/src/fwTools/Type.cpp b/SrcLib/core/fwTools/src/fwTools/Type.cpp
new file mode 100644
index 0000000..1bbfc75
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/Type.cpp
@@ -0,0 +1,250 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/assign/list_of.hpp>
+
+#include "fwTools/Type.hpp"
+
+
+namespace std
+{
+    std::ostream& operator<< (std::ostream& os, const ::fwTools::Type& type)
+    {
+        os << type.string();
+        return os;
+    }
+}
+
+namespace fwTools
+{
+
+const std::string Type::s_UNSPECIFIED_TYPENAME("UNSPECIFIED TYPE");
+
+const std::string Type::s_INT8_TYPENAME("int8");
+const std::string Type::s_INT16_TYPENAME("int16");
+const std::string Type::s_INT32_TYPENAME("int32");
+const std::string Type::s_INT64_TYPENAME("int64");
+
+const std::string Type::s_UINT8_TYPENAME("uint8");
+const std::string Type::s_UINT16_TYPENAME("uint16");
+const std::string Type::s_UINT32_TYPENAME("uint32");
+const std::string Type::s_UINT64_TYPENAME("uint64");
+
+const std::string Type::s_FLOAT_TYPENAME("float");
+const std::string Type::s_DOUBLE_TYPENAME("double");
+
+
+
+const Type::TypeMapType Type::s_TYPEMAP = ::boost::assign::map_list_of
+    (Type::s_INT8_TYPENAME  , Type::create< ::fwTools::Type::Int8Type >())
+    (Type::s_INT16_TYPENAME , Type::create< ::fwTools::Type::Int16Type >())
+    (Type::s_INT32_TYPENAME , Type::create< ::fwTools::Type::Int32Type >())
+    (Type::s_INT64_TYPENAME , Type::create< ::fwTools::Type::Int64Type >())
+
+    (Type::s_UINT8_TYPENAME , Type::create< ::fwTools::Type::UInt8Type >())
+    (Type::s_UINT16_TYPENAME, Type::create< ::fwTools::Type::UInt16Type >())
+    (Type::s_UINT32_TYPENAME, Type::create< ::fwTools::Type::UInt32Type >())
+    (Type::s_UINT64_TYPENAME, Type::create< ::fwTools::Type::UInt64Type >())
+
+    (Type::s_FLOAT_TYPENAME , Type::create< ::fwTools::Type::FloatType >())
+    (Type::s_DOUBLE_TYPENAME, Type::create< ::fwTools::Type::DoubleType >())
+    ;
+
+
+
+const Type Type::s_UNSPECIFIED_TYPE;
+
+const Type Type::s_INT8  = ::fwTools::Type::create< ::fwTools::Type::Int8Type  >();
+const Type Type::s_INT16 = ::fwTools::Type::create< ::fwTools::Type::Int16Type >();
+const Type Type::s_INT32 = ::fwTools::Type::create< ::fwTools::Type::Int32Type >();
+const Type Type::s_INT64 = ::fwTools::Type::create< ::fwTools::Type::Int64Type >();
+
+const Type Type::s_UINT8  = ::fwTools::Type::create< ::fwTools::Type::UInt8Type  >();
+const Type Type::s_UINT16 = ::fwTools::Type::create< ::fwTools::Type::UInt16Type >();
+const Type Type::s_UINT32 = ::fwTools::Type::create< ::fwTools::Type::UInt32Type >();
+const Type Type::s_UINT64 = ::fwTools::Type::create< ::fwTools::Type::UInt64Type >();
+
+const Type Type::s_FLOAT  = ::fwTools::Type::create< ::fwTools::Type::FloatType  >();
+const Type Type::s_DOUBLE = ::fwTools::Type::create< ::fwTools::Type::DoubleType >();
+
+
+
+template<> const std::string &Type::traitsToString< 1, true, true > () {return Type::s_INT8_TYPENAME;  }
+template<> const std::string &Type::traitsToString< 2, true, true > () {return Type::s_INT16_TYPENAME; }
+template<> const std::string &Type::traitsToString< 4, true, true > () {return Type::s_INT32_TYPENAME; }
+template<> const std::string &Type::traitsToString< 8, true, true > () {return Type::s_INT64_TYPENAME; }
+
+template<> const std::string &Type::traitsToString< 1, false, true > () {return Type::s_UINT8_TYPENAME;  }
+template<> const std::string &Type::traitsToString< 2, false, true > () {return Type::s_UINT16_TYPENAME; }
+template<> const std::string &Type::traitsToString< 4, false, true > () {return Type::s_UINT32_TYPENAME; }
+template<> const std::string &Type::traitsToString< 8, false, true > () {return Type::s_UINT64_TYPENAME; }
+
+template<> const std::string &Type::traitsToString< 4, false, false > () {return Type::s_FLOAT_TYPENAME;  }
+template<> const std::string &Type::traitsToString< 8, false, false > () {return Type::s_DOUBLE_TYPENAME; }
+
+//------------------------------------------------------------------------------
+
+Type::Type()
+{
+    Type::setType<void>();
+}
+
+//------------------------------------------------------------------------------
+
+Type::Type(const std::string &type)
+{
+    *this = Type::create(type);
+}
+
+//------------------------------------------------------------------------------
+
+bool Type::operator==(const Type &_other) const
+{
+    return m_name == _other.m_name;
+}
+
+//------------------------------------------------------------------------------
+
+bool Type::operator!=(const Type &_other) const
+{
+    return m_name != _other.m_name;
+}
+
+//------------------------------------------------------------------------------
+
+bool Type::operator<( const Type& _other) const
+{
+    return m_name < _other.m_name;
+}
+
+//------------------------------------------------------------------------------
+
+unsigned char Type::sizeOf() const
+{
+    return m_sizeof;
+}
+
+//------------------------------------------------------------------------------
+
+const std::string &Type::string() const
+{
+    return m_name;
+}
+
+//------------------------------------------------------------------------------
+
+const std::type_info &Type::typeId() const
+{
+    return m_tool->m_typeinfo;
+}
+
+//------------------------------------------------------------------------------
+
+bool Type::isFixedPrecision() const
+{
+    return m_isFixedPrecision;
+}
+
+//------------------------------------------------------------------------------
+
+bool Type::isSigned() const
+{
+    return m_isSigned;
+}
+
+//-----------------------------------------------------------------------------
+
+Type Type::create(std::string name)
+{
+    TypeMapType::const_iterator iter = s_TYPEMAP.find(name);
+    if (iter != s_TYPEMAP.end())
+    {
+        return iter->second;
+    }
+    return s_UNSPECIFIED_TYPE;
+}
+
+//-----------------------------------------------------------------------------
+
+std::string Type::toString(const void * value) const
+{
+    return m_tool->toString(value);
+}
+
+//-----------------------------------------------------------------------------
+
+Type::ToolBase::ToolBase() : m_typeinfo(typeid(void))
+{}
+
+//-----------------------------------------------------------------------------
+
+Type::ToolBase::ToolBase(const std::type_info &typeinfo) : m_typeinfo(typeinfo)
+{}
+
+//-----------------------------------------------------------------------------
+
+std::string Type::ToolBase::toString(::boost::any value) const
+{
+    FwCoreNotUsedMacro(value);
+    SLM_ASSERT("unable to convert an unspecified type value", 0);
+    return "";
+}
+
+//-----------------------------------------------------------------------------
+
+std::string Type::ToolBase::toString(const void *value) const
+{
+    FwCoreNotUsedMacro(value);
+    SLM_ASSERT("unable to convert an unspecified type value", 0);
+    return "";
+}
+
+//-----------------------------------------------------------------------------
+
+template <>
+void Type::setType<char>()
+{
+    this->setType<signed char>();
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef linux
+
+template <>
+void Type::setType<boost::int64_t>()
+{
+    this->setType<long long>();
+}
+
+//-----------------------------------------------------------------------------
+
+template <>
+void Type::setType<boost::uint64_t>()
+{
+    this->setType<unsigned long long>();
+}
+
+#endif
+
+//-----------------------------------------------------------------------------
+
+template <>
+void Type::setType<void>()
+{
+    m_name = s_UNSPECIFIED_TYPENAME;
+    m_sizeof = 0;
+    m_isSigned = false;
+    m_isFixedPrecision = false;
+
+    m_tool = SPTR(ToolBase)(new Type::ToolBase());
+
+    m_min = 0;
+    m_max = 0;
+}
+
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/src/fwTools/TypeInfo.cpp b/SrcLib/core/fwTools/src/fwTools/TypeInfo.cpp
new file mode 100644
index 0000000..1ea2137
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/TypeInfo.cpp
@@ -0,0 +1,100 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string.h>
+
+#include <fwCore/base.hpp>
+
+#include "fwTools/TypeInfo.hpp"
+
+
+
+namespace fwTools
+{
+
+TypeInfo::TypeInfo()
+{
+    class Nil {};
+    pInfo_ = &typeid(Nil);
+    SLM_ASSERT("pInfo_ not instanced", pInfo_);
+}
+
+TypeInfo::TypeInfo(const std::type_info& ti)
+: pInfo_(&ti)
+{
+    SLM_ASSERT("pInfo_ not instanced", pInfo_);
+}
+
+bool TypeInfo::before(const TypeInfo& rhs) const
+{
+    SLM_ASSERT("pInfo_ not instanced", pInfo_);
+    // type_info::before return type is int in some VC libraries
+    return pInfo_->before(*rhs.pInfo_) != 0;
+}
+
+const std::type_info& TypeInfo::type_info() const
+{
+    SLM_ASSERT("pInfo_ not instanced", pInfo_);
+    return *pInfo_;
+}
+
+const char* TypeInfo::name() const
+{
+    SLM_ASSERT("pInfo_ not instanced", pInfo_);
+    return pInfo_->name();
+}
+
+
+
+TypeInfo &TypeInfo::operator=(const TypeInfo &rhs)
+{
+    pInfo_ = rhs.pInfo_;
+    return *this;
+}
+
+
+// Comparison operators
+
+bool operator==(const TypeInfo& lhs, const TypeInfo& rhs)
+// type_info::operator== return type is int in some VC libraries
+// typeinfo can have different ptr on the same strucure !!!!
+//http://gcc.gnu.org/ml/gcc/2002-05/msg02085.html
+{
+    return strcmp(lhs.type_info().name() , rhs.type_info().name() )== 0;
+}
+
+
+bool operator!=(const TypeInfo& lhs, const TypeInfo& rhs)
+{
+    return !(lhs == rhs);
+}
+
+
+bool operator<(const TypeInfo& lhs, const TypeInfo& rhs)
+{
+    return strcmp(lhs.type_info().name() , rhs.type_info().name() )<  0;
+}
+
+
+
+bool operator>(const TypeInfo& lhs, const TypeInfo& rhs)
+{
+    return strcmp(lhs.type_info().name() , rhs.type_info().name() )>  0;
+}
+
+bool operator<=(const TypeInfo& lhs, const TypeInfo& rhs)
+{
+    return strcmp(lhs.type_info().name() , rhs.type_info().name() )<= 0;
+}
+
+bool operator>=(const TypeInfo& lhs, const TypeInfo& rhs)
+{
+    return strcmp(lhs.type_info().name() , rhs.type_info().name() )>= 0;
+}
+
+
+} // end namespace fwTools
+
diff --git a/SrcLib/core/fwTools/src/fwTools/TypeInfoKeyTypeMapping.cpp b/SrcLib/core/fwTools/src/fwTools/TypeInfoKeyTypeMapping.cpp
new file mode 100644
index 0000000..36ff0e4
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/TypeInfoKeyTypeMapping.cpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTools/TypeInfoKeyTypeMapping.hpp"
+#include <typeinfo>
+
+
+namespace fwTools {
+
+/**
+ * @brief template specialization for defining KeyType mapping ( here std::type_info) with their value
+ */
+template<class T>
+bool isMappingTypeInfoCommon(const std::type_info &key)
+{
+    return key == typeid( T );
+}
+// warning specialization from a partial specialization is not possible
+
+
+
+// FIX UNSIGNED
+template<>
+bool isMapping<unsigned char>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< unsigned char >(key);
+}
+template<>
+bool isMapping<unsigned short>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< unsigned short >(key);
+}
+template<>
+bool isMapping<unsigned int>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< unsigned int >(key);
+}
+template<>
+bool isMapping<unsigned long>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< unsigned long >(key);
+}
+
+// FIXED PRECISION SIGNED
+template<>
+bool isMapping<signed char>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< signed char >(key);
+}
+template<>
+bool isMapping<signed short>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< signed short >(key);
+}
+template<>
+bool isMapping<signed int>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< signed int >(key);
+}
+
+template<>
+bool isMapping<signed long>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< signed long >(key);
+}
+
+
+// FLOATING PRECISION
+template<>
+bool isMapping<float>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< float >(key);
+}
+template<>
+bool isMapping<double>(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< double >(key);
+}
+
+// MISC
+template<>
+bool isMapping< std::string >(const std::type_info &key)
+{
+    return isMappingTypeInfoCommon< std::string >(key);
+}
+
+
+} // end namespace fwTools {
diff --git a/SrcLib/core/fwTools/src/fwTools/UUID.cpp b/SrcLib/core/fwTools/src/fwTools/UUID.cpp
new file mode 100644
index 0000000..7f6531f
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/UUID.cpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/uuid/random_generator.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+#include "fwTools/UUID.hpp"
+
+namespace fwTools
+{
+
+UUID::UUIDContainer UUID::s_uuidMap;
+
+::fwCore::mt::ReadWriteMutex UUID::s_uuidMapMutex;
+::fwCore::mt::Mutex UUID::s_generateUUIDMutex;
+
+//-----------------------------------------------------------------------------
+
+UUID::UUID() : m_uuid("")
+{}
+
+//-----------------------------------------------------------------------------
+
+UUID::~UUID()
+{
+    ::fwCore::mt::ReadLock uuidLock(m_uuidMutex);
+    ::fwCore::mt::ReadToWriteLock lock(s_uuidMapMutex);
+    UUID::UUIDContainer::iterator iter = UUID::s_uuidMap.find(m_uuid);
+    if( iter != UUID::s_uuidMap.end())
+    {
+        ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+        UUID::s_uuidMap.erase(iter);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool UUID::exist( const UUID::UUIDType & uuid)
+{
+    ::fwCore::mt::ReadLock lock(s_uuidMapMutex);
+    return ( UUID::s_uuidMap.find(uuid) != UUID::s_uuidMap.end() );
+}
+
+//-----------------------------------------------------------------------------
+
+const UUID::UUIDType& UUID::get(::fwTools::Object::sptr object)
+{
+    SLM_ASSERT("Object expired", object);
+
+    UUID::sptr uuidObject = object->m_uuid;
+    ::fwCore::mt::ReadToWriteLock uuidLock(uuidObject->m_uuidMutex);
+    if(uuidObject->m_uuid.empty())
+    {
+        UUIDType uuid = UUID::generateUUID();
+
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(uuidLock);
+            uuidObject->m_uuid = uuid;
+        }
+        {
+            ::fwCore::mt::WriteLock lock(s_uuidMapMutex);
+            UUID::s_uuidMap.insert(UUID::UUIDContainer::value_type(uuid, object));
+        }
+    }
+    return uuidObject->m_uuid;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwTools::Object::sptr UUID::get( const UUID::UUIDType & uuid )
+{
+    ::fwCore::mt::ReadLock lock(s_uuidMapMutex);
+    ::fwTools::Object::sptr obj;
+    UUID::UUIDContainer::iterator iter = UUID::s_uuidMap.find(uuid);
+    if( iter != UUID::s_uuidMap.end() )
+    {
+        obj = iter->second.lock();
+    }
+    return obj;
+}
+
+//-----------------------------------------------------------------------------
+
+bool UUID::set(::fwTools::Object::sptr object, const UUID::UUIDType & uuid )
+{
+    ::fwCore::mt::ReadToWriteLock lock(s_uuidMapMutex);
+
+    bool isSet = false;
+
+    if(UUID::s_uuidMap.find(uuid) == UUID::s_uuidMap.end())
+    {
+        UUID::sptr uuidObject = object->m_uuid;
+
+        {
+            ::fwCore::mt::WriteLock uuidLock(uuidObject->m_uuidMutex);
+            uuidObject->m_uuid = uuid;
+        }
+        {
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            UUID::s_uuidMap.insert(UUID::UUIDContainer::value_type(uuid, object));
+        }
+        isSet = true;
+    }
+
+    return isSet;
+}
+
+//-----------------------------------------------------------------------------
+
+UUID::UUIDType UUID::generateUUID()
+{
+    static boost::uuids::random_generator gen;
+    ::fwCore::mt::ScopedLock lock(s_generateUUIDMutex);
+    ::boost::uuids::uuid uuid = gen();
+    return ::boost::uuids::to_string(uuid);
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/dateAndTime.cpp b/SrcLib/core/fwTools/src/fwTools/dateAndTime.cpp
new file mode 100644
index 0000000..f13bdd2
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/dateAndTime.cpp
@@ -0,0 +1,118 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/cstdint.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/regex.hpp>
+
+#include <fwCore/base.hpp>
+#include "fwTools/dateAndTime.hpp"
+
+namespace fwTools
+{
+
+//------------------------------------------------------------------------------
+
+::boost::gregorian::date strToBoostDate( const std::string &dateStr )
+{
+    ::boost::gregorian::date resDate( ::boost::gregorian::from_undelimited_string( "19000101" ) );
+    if ( dateStr.size() < 8 )
+    {
+        OSLM_WARN("The string length is too short (<8) : " << dateStr << ". The string is initialized with \"19000101\".");
+    }
+    else if ( dateStr.size() > 8 )
+    {
+        OSLM_WARN("The string length is too long (>8) : " << dateStr << ".. The string is trunked to 8 characters.");
+        resDate = strToBoostDate( dateStr.substr(0,8) );
+    }
+    else
+    {
+        ::boost::regex isNumber ("[0-9]+");
+
+        if( ::boost::regex_match(dateStr, isNumber) )
+        {
+            resDate = ::boost::gregorian::date( ::boost::gregorian::from_undelimited_string( dateStr ) );
+        }
+        else
+        {
+            OSLM_WARN("The string not contains 8 numbers : " << dateStr << ". The string is initialized with \"19000101\".");
+        }
+    }
+    return resDate;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::posix_time::time_duration strToBoostTime( const std::string &timeStr )
+{
+    using ::boost::posix_time::time_duration;
+    using ::boost::posix_time::hours;
+    using ::boost::posix_time::minutes;
+    using ::boost::posix_time::seconds;
+
+    time_duration td;
+    if ( timeStr.size() < 6 )
+    {
+        OSLM_WARN("The string length is too short (<6) : " << timeStr << ".  The string is initialized with \"000000\".");
+        td = hours(0) + minutes(0) + seconds(0);
+    }
+    else if ( timeStr.size() > 6 )
+    {
+        OSLM_WARN("The string length is too short (>6) : " << timeStr << ". This string is trunked.");
+        td =  strToBoostTime( timeStr.substr(0,6) );
+    }
+    else
+    {
+        ::boost::regex isNumber ("[0-9]+");
+        if( ::boost::regex_match(timeStr, isNumber) )
+        {
+            ::boost::uint16_t  h = ::boost::lexical_cast< ::boost::uint16_t > ( timeStr.substr(0,2) );
+            ::boost::uint16_t  m = ::boost::lexical_cast< ::boost::uint16_t > ( timeStr.substr(2,2) );
+            ::boost::uint16_t  s = ::boost::lexical_cast< ::boost::uint16_t > ( timeStr.substr(4,2) );
+            td = hours(h) + minutes(m) + seconds(s);
+        }
+        else
+        {
+            OSLM_WARN("The string not contains 6 numbers : " << timeStr <<". The string is initialized with \"000000\".");
+            td = hours(0) + minutes(0) + seconds(0);
+        }
+    }
+    return td;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::posix_time::ptime strToBoostDateAndTime( const std::string &dateStr, const std::string &timeStr)
+{
+    return ::boost::posix_time::ptime(strToBoostDate(dateStr),strToBoostTime(timeStr));
+}
+
+//------------------------------------------------------------------------------
+
+std::string getDate( const ::boost::posix_time::ptime & dateAndTime )
+{
+    std::string dateAndTimeStr = ::boost::posix_time::to_iso_string(dateAndTime);
+    return dateAndTimeStr.substr(0,8);
+}
+
+//------------------------------------------------------------------------------
+
+std::string getTime( const ::boost::posix_time::ptime & dateAndTime )
+{
+    std::string dateAndTimeStr = ::boost::posix_time::to_iso_string(dateAndTime);
+    return dateAndTimeStr.substr(9,6);
+}
+
+//------------------------------------------------------------------------------
+
+std::string getCurrentTime()
+{
+    ::boost::posix_time::ptime now = ::boost::posix_time::second_clock::local_time();
+    std::string nowStr = ::boost::posix_time::to_simple_string(now);
+    return nowStr.substr(0,21);
+}
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/fromIsoExtendedString.cpp b/SrcLib/core/fwTools/src/fwTools/fromIsoExtendedString.cpp
new file mode 100644
index 0000000..8f74545
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/fromIsoExtendedString.cpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include "fwTools/fromIsoExtendedString.hpp"
+
+
+namespace fwTools
+{
+
+//------------------------------------------------------------------------------
+
+std::string getDateInXsdFormat( const boost::posix_time::ptime & dateAndTime )
+{
+    std::string dateAndTimeStr = boost::posix_time::to_iso_extended_string(dateAndTime);
+    return dateAndTimeStr.substr(0,10);
+}
+
+//------------------------------------------------------------------------------
+
+::boost::posix_time::ptime fromIsoExtendedString(const std::string & time_string)
+{
+    std::string tmp(time_string);
+    std::string::size_type i = 0;
+    while ((i = tmp.find('T', i)) != (std::string::size_type)(-1))
+    tmp.replace(i++, 1, " ");
+    ::boost::posix_time::ptime  t = boost::posix_time::time_from_string(tmp);
+    return t;
+}
+
+//------------------------------------------------------------------------------
+
+::boost::posix_time::ptime fromDateInXsdFormat(const std::string & date_string)
+{
+    std::stringstream ss;
+    ss << date_string << " 00:00:00";
+
+    ::boost::posix_time::ptime  t = boost::posix_time::time_from_string(ss.str());
+    return t;
+}
+
+//------------------------------------------------------------------------------
+
+std::string toIsoExtendedString(boost::posix_time::ptime ptime)
+{
+    return boost::posix_time::to_iso_extended_string(ptime) ;
+}
+
+//------------------------------------------------------------------------------
+
+std::string toStringWithoutAccent( const std::string & str )
+{
+    std::string newStr = str;
+
+    std::string withAccent      ("�����������������������������������������������������");
+    std::string withoutAccent   ("aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn");
+
+
+    std::string::iterator charWithAccent = withAccent.begin();
+    std::string::iterator charWithoutAccent = withoutAccent.begin();
+
+    while ( charWithAccent != withAccent.end() )
+    {
+        for (   std::string::iterator pCharacter = newStr.begin();
+        pCharacter != newStr.end();
+        ++pCharacter )
+        {
+            if( *pCharacter == *charWithAccent )
+            {
+                *pCharacter = *charWithoutAccent;
+            }
+        }
+        ++charWithAccent;
+        ++charWithoutAccent;
+    }
+    return newStr;
+}
+
+}//end namespace
diff --git a/SrcLib/core/fwTools/src/fwTools/fwID.cpp b/SrcLib/core/fwTools/src/fwTools/fwID.cpp
new file mode 100644
index 0000000..28e294f
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/fwID.cpp
@@ -0,0 +1,175 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <assert.h>
+#include <boost/lexical_cast.hpp>
+#ifdef COM_LOG
+# include <boost/regex.hpp>
+#endif
+
+#include <fwCore/Demangler.hpp>
+
+#include "fwTools/fwID.hpp"
+#include "fwTools/Object.hpp"
+#include "fwTools/Failed.hpp"
+
+namespace fwTools
+{
+
+fwID::CategorizedCounter fwID::m_CategorizedCounter;
+fwID::Dictionary fwID::m_dictionary;
+::fwCore::mt::ReadWriteMutex fwID::s_dictionaryMutex;
+::fwCore::mt::Mutex fwID::s_mutexCounter;
+
+//-----------------------------------------------------------------------------
+
+fwID::~fwID()
+{
+    resetID();
+}
+
+//-----------------------------------------------------------------------------
+
+bool fwID::exist( IDType _id)
+{
+    ::fwCore::mt::ReadLock lock(s_dictionaryMutex);
+    return fwID::isIdFound(_id);
+}
+
+//-----------------------------------------------------------------------------
+
+bool fwID::isIdFound( IDType _id)
+{
+    return m_dictionary.find( _id ) != m_dictionary.end();
+}
+
+//-----------------------------------------------------------------------------
+
+bool fwID::hasID( ) const
+{
+    ::fwCore::mt::ReadLock lock(m_idMutex);
+    return !m_id.empty();
+}
+
+//-----------------------------------------------------------------------------
+
+void fwID::setID( IDType newID )
+{
+    ::fwCore::mt::WriteLock lock(m_idMutex);
+    this->addIDInDictionary(newID);
+}
+
+//-----------------------------------------------------------------------------
+
+void fwID::addIDInDictionary( IDType newID )
+{
+    OSLM_FATAL_IF("Try to set an existing fwID = " << newID, isIdFound(newID));
+
+    ::fwCore::mt::WriteLock lock(s_dictionaryMutex);
+    fwID::removeIDfromDictionary(m_id);
+    // note we use a static cast for a down cast because we do not use the classical polyvi morphic approach
+    //m_dictionary[ newID ] = (static_cast< Object *>(this))->getSptr();
+    m_dictionary[ newID ] = ((Object*)(this))->getSptr();
+    m_id = newID;
+}
+
+//-----------------------------------------------------------------------------
+
+fwID::IDType fwID::getID( Policy policy) const
+{
+    ::fwCore::mt::ReadToWriteLock lock(m_idMutex);
+    if ( m_id.empty() ) // no id set
+    {
+        if ( policy==GENERATE )
+        {
+            IDType newID = generate();
+            ::fwCore::mt::UpgradeToWriteLock writeLock(lock);
+            const_cast<fwID *>(this)->addIDInDictionary(newID);
+        }
+        else if  ( policy == EMPTY )
+        { /* nothing to do*/ }
+        else if ( policy == MUST_EXIST )
+        {
+            throw fwTools::Failed( "fwID::getID() no id set" );
+        }
+    }
+    return m_id;
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef COM_LOG
+fwID::IDType fwID::getLightID( Policy  policy ) const
+{
+    IDType id = this->getID( policy );
+    IDType lightID = id;
+
+    ::boost::regex namespaceRegex ("[:A-Za-z0-9]*::(.*)");
+    const std::string machine_format("\\1");
+    if ( ::boost::regex_match( id, namespaceRegex ) )
+    {
+        lightID = ::boost::regex_replace( id, namespaceRegex, machine_format, boost::match_default | boost::format_sed );
+    }
+
+    return lightID;
+}
+#endif
+
+//-----------------------------------------------------------------------------
+
+fwID::IDType fwID::generate() const
+{
+    IDType newID;
+    std::string prefix = this->getRootedClassname();
+    do
+    {
+        ::fwCore::mt::ScopedLock lock(s_mutexCounter);
+        newID = prefix  + "-" + boost::lexical_cast<std::string>( m_CategorizedCounter[prefix]++ );
+    }
+    while ( exist(newID ) );
+    return newID;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwTools::Object::sptr fwID::getObject( fwID::IDType requestID )
+{
+    ::fwCore::mt::ReadLock lock(s_dictionaryMutex);
+    Dictionary::iterator it = m_dictionary.find(requestID);
+    if ( it!=m_dictionary.end() )
+    {
+        SLM_ASSERT(  "expired object in fwID::Dictionary for id=" + requestID ,  !it->second.expired() );
+        return it->second.lock();
+    }
+    else
+    {
+        return ::fwTools::Object::sptr();
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void fwID::resetID()
+{
+    ::fwCore::mt::WriteLock dicoLock(s_dictionaryMutex);
+    ::fwCore::mt::WriteLock lock(m_idMutex);
+    fwID::removeIDfromDictionary(m_id);
+    m_id.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void fwID::removeIDfromDictionary(IDType _id )
+{
+    if ( !_id.empty() )
+    {
+        m_dictionary.erase(_id);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/core/fwTools/src/fwTools/pathDifference.cpp b/SrcLib/core/fwTools/src/fwTools/pathDifference.cpp
new file mode 100644
index 0000000..4df8edd
--- /dev/null
+++ b/SrcLib/core/fwTools/src/fwTools/pathDifference.cpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+
+#include "fwTools/pathDifference.hpp"
+
+
+namespace fwTools
+{
+boost::filesystem::path getPathDifference( boost::filesystem::path path1, boost::filesystem::path path2 )
+{
+    using boost::filesystem::path;
+    path pathDiff;
+    
+    // search iterator on path for the first element difference
+    std::pair<path::iterator, path::iterator> fstChange;
+    fstChange = std::mismatch(path1.begin(), path1.end(), path2.begin()) ;
+
+    path::iterator i1 = fstChange.first ;
+    path::iterator i2 = fstChange.second;
+
+    // move updir from path1 position : climb to first difference in folder hierarchy
+    while (i1 != path1.end() )
+    {
+        pathDiff /= "..";
+        ++i1;
+    }
+    
+    // mode down_dir to path2
+    while (i2 != path2.end() )
+    {
+        pathDiff /= *i2;
+        ++i2;
+    }
+    
+    return pathDiff;
+}
+
+}
diff --git a/SrcLib/core/fwTools/test/CMakeLists.txt b/SrcLib/core/fwTools/test/CMakeLists.txt
new file mode 100644
index 0000000..cacbb5c
--- /dev/null
+++ b/SrcLib/core/fwTools/test/CMakeLists.txt
@@ -0,0 +1,9 @@
+
+fwLoadProperties()
+
+find_package (Boost COMPONENTS thread REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
diff --git a/SrcLib/core/fwTools/test/Properties.cmake b/SrcLib/core/fwTools/test/Properties.cmake
new file mode 100644
index 0000000..b6ce704
--- /dev/null
+++ b/SrcLib/core/fwTools/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwToolsTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTools fwTest )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwTools/test/cppunit.options b/SrcLib/core/fwTools/test/cppunit.options
new file mode 100644
index 0000000..1a66f70
--- /dev/null
+++ b/SrcLib/core/fwTools/test/cppunit.options
@@ -0,0 +1,17 @@
+
+CLASSTEST=[
+    'ClassFactoryRegistryTest',
+    'DynamicTypeTest'         ,
+    'MacrosTest'              ,
+    'ObjectTest'              ,
+    'RandomTest'              ,
+    'TypeTest'                ,
+    'StringizerTest'          ,
+    'UUIDTest'                ,
+    'NumericRoundCastTest'    ,
+    'FwIDTest'                ,
+    ]
+
+USE = ['boost', 'boostThread']
+LIB = ['fwTools_0-1', 'fwCore_0-1','fwTest_0-1']
+CONSOLE='yes'
diff --git a/SrcLib/core/fwTools/test/tu/include/DynamicTypeTest.hpp b/SrcLib/core/fwTools/test/tu/include/DynamicTypeTest.hpp
new file mode 100644
index 0000000..f758e57
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/DynamicTypeTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_DYNAMICTYPETEST_HPP__
+#define __FWTOOLS_UT_DYNAMICTYPETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class DynamicTypeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( DynamicTypeTest );
+    CPPUNIT_TEST( typeTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void typeTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_DYNAMICTYPETEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/FwIDTest.hpp b/SrcLib/core/fwTools/test/tu/include/FwIDTest.hpp
new file mode 100644
index 0000000..0931ab4
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/FwIDTest.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_FWIDTEST_HPP__
+#define __FWTOOLS_UT_FWIDTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class FwIDTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( FwIDTest );
+    CPPUNIT_TEST( objectFwIDTest );
+    CPPUNIT_TEST( conccurentAccessOnFwIDMapTest );
+    CPPUNIT_TEST( conccurentAccessOnSameObjFwIDTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void objectFwIDTest();
+
+    void conccurentAccessOnFwIDMapTest();
+    void conccurentAccessOnSameObjFwIDTest();
+
+private:
+    void runFwIDCreation();
+    void runAccessToObjectFwID();
+
+    ::fwTools::Object::sptr m_object;
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_FWIDTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/MacrosTest.hpp b/SrcLib/core/fwTools/test/tu/include/MacrosTest.hpp
new file mode 100644
index 0000000..28a984b
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/MacrosTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_MACROSTEST_HPP__
+#define __FWTOOLS_UT_MACROSTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class MacrosTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MacrosTest );
+    CPPUNIT_TEST( factoryMacroTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void factoryMacroTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_MACROSTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/NumericRoundCastTest.hpp b/SrcLib/core/fwTools/test/tu/include/NumericRoundCastTest.hpp
new file mode 100644
index 0000000..3ebb3d6
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/NumericRoundCastTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_NUMERICROUNDCASTTEST_HPP__
+#define __FWTOOLS_UT_NUMERICROUNDCASTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class NumericRoundCastTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( NumericRoundCastTest );
+    CPPUNIT_TEST( castFloatToIntTest );
+    CPPUNIT_TEST( castDoubleToIntTest );
+    CPPUNIT_TEST( castIntToFloatTest );
+    CPPUNIT_TEST( castDoubleToFloatTest );
+    CPPUNIT_TEST( castIntToIntTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void castFloatToIntTest();
+    void castDoubleToIntTest();
+    void castIntToFloatTest();
+    void castDoubleToFloatTest();
+    void castIntToIntTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif // __FWTOOLS_UT_NUMERICROUNDCASTTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/ObjectTest.hpp b/SrcLib/core/fwTools/test/tu/include/ObjectTest.hpp
new file mode 100644
index 0000000..cff28a2
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/ObjectTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_OBJECTTEST_HPP__
+#define __FWTOOLS_UT_OBJECTTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class ObjectTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ObjectTest );
+    CPPUNIT_TEST( idTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void idTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_OBJECTTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/RandomTest.hpp b/SrcLib/core/fwTools/test/tu/include/RandomTest.hpp
new file mode 100644
index 0000000..aafe5e9
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/RandomTest.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_RANDOMTEST_HPP__
+#define __FWTOOLS_UT_RANDOMTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class RandomTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( RandomTest );
+    CPPUNIT_TEST( generatorTest );
+    CPPUNIT_TEST( randomListTest );
+    CPPUNIT_TEST( seedTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void generatorTest();
+    void randomListTest();
+    void seedTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif // __FWTOOLS_UT_RANDOMTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/StringizerTest.hpp b/SrcLib/core/fwTools/test/tu/include/StringizerTest.hpp
new file mode 100644
index 0000000..6e6303d
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/StringizerTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_STRINGIZERTEST_HPP__
+#define __FWTOOLS_UT_STRINGIZERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class StringizerTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( StringizerTest );
+    CPPUNIT_TEST( convertTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void convertTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_STRINGIZERTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/TypeTest.hpp b/SrcLib/core/fwTools/test/tu/include/TypeTest.hpp
new file mode 100644
index 0000000..57d27bb
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/TypeTest.hpp
@@ -0,0 +1,34 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_TYPETEST_HPP__
+#define __FWTOOLS_UT_TYPETEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class TypeTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TypeTest );
+    CPPUNIT_TEST( typeTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void typeTest();
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_TYPETEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/include/UUIDTest.hpp b/SrcLib/core/fwTools/test/tu/include/UUIDTest.hpp
new file mode 100644
index 0000000..5bf69b1
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/include/UUIDTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTOOLS_UT_UUIDTEST_HPP__
+#define __FWTOOLS_UT_UUIDTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTools
+{
+namespace ut
+{
+
+class UUIDTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( UUIDTest );
+    CPPUNIT_TEST( objectUUIDTest );
+    CPPUNIT_TEST( conccurentAccessOnUUIDMapTest );
+    CPPUNIT_TEST( conccurentAccessOnSameObjUUIDTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void objectUUIDTest();
+
+    void conccurentAccessOnUUIDMapTest();
+    void conccurentAccessOnSameObjUUIDTest();
+
+private:
+    void runUUIDCreation();
+    void runAccessToObjectUUID();
+
+    ::fwTools::Object::sptr m_object;
+    std::string m_uuid;
+};
+
+} // namespace ut
+} // namespace fwTools
+
+#endif //__FWTOOLS_UT_UUIDTEST_HPP__
diff --git a/SrcLib/core/fwTools/test/tu/src/DynamicTypeTest.cpp b/SrcLib/core/fwTools/test/tu/src/DynamicTypeTest.cpp
new file mode 100644
index 0000000..d842727
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/DynamicTypeTest.cpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/DynamicType.hpp>
+
+#include "DynamicTypeTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::DynamicTypeTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void DynamicTypeTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void DynamicTypeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void DynamicTypeTest::typeTest()
+{
+    const std::string TYPE = "double";
+    ::fwTools::DynamicType type1 = ::fwTools::makeDynamicType<int>();
+    ::fwTools::DynamicType type2 = ::fwTools::DynamicType();
+    type2.setType<double>();
+
+    CPPUNIT_ASSERT(type1.isType<int>());
+    CPPUNIT_ASSERT(type2.isType<double>());
+    CPPUNIT_ASSERT_EQUAL(type2.string(), TYPE );
+}
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/test/tu/src/FwIDTest.cpp b/SrcLib/core/fwTools/test/tu/src/FwIDTest.cpp
new file mode 100644
index 0000000..29fd39f
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/FwIDTest.cpp
@@ -0,0 +1,183 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+#include <boost/chrono/duration.hpp>
+
+#include <fwTools/fwID.hpp>
+#include <fwTools/UUID.hpp>
+#include <fwTools/Failed.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwTest/helper/Thread.hpp>
+
+#include "FwIDTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::FwIDTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::setUp()
+{
+    // Set up context before running a test.
+    m_object = ::boost::make_shared< ::fwTools::Object >();
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::objectFwIDTest()
+{
+    const std::string fwID = "myID" ;
+
+    ::fwTools::Object::sptr obj = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwID) == false);
+
+    obj->setID(fwID);
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwID) );
+    CPPUNIT_ASSERT_EQUAL(  fwID, obj->getID() );
+    CPPUNIT_ASSERT_EQUAL( obj, ::fwTools::fwID::getObject(fwID) );
+
+    ::fwTools::Object::sptr obj2 = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT(obj2->hasID() == false);
+    CPPUNIT_ASSERT_THROW (obj2->getID(::fwTools::fwID::MUST_EXIST), ::fwTools::Failed);
+
+    std::string fwid = obj2->getID(::fwTools::fwID::GENERATE);
+    CPPUNIT_ASSERT_NO_THROW (obj2->getID(::fwTools::fwID::MUST_EXIST));
+
+    CPPUNIT_ASSERT(obj2->hasID() == true);
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwid) );
+
+    obj2->resetID();
+    CPPUNIT_ASSERT(obj2->hasID() == false);
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwid) == false );
+    CPPUNIT_ASSERT( !::fwTools::fwID::getObject(fwid) );
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::conccurentAccessOnFwIDMapTest()
+{
+    const unsigned int nbThreads = 10;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&FwIDTest::runFwIDCreation, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::runFwIDCreation()
+{
+    const std::string fwID = ::fwTools::UUID::generateUUID() ;
+
+    ::fwTools::Object::sptr obj = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwID) == false);
+
+    obj->setID(fwID);
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwID) );
+
+    CPPUNIT_ASSERT_EQUAL(  fwID, obj->getID() );
+
+    CPPUNIT_ASSERT_EQUAL( obj, ::fwTools::fwID::getObject(fwID) );
+
+    ::fwTools::Object::sptr obj2 = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT(obj2->hasID() == false);
+    CPPUNIT_ASSERT_THROW (obj2->getID(::fwTools::fwID::MUST_EXIST), ::fwTools::Failed);
+
+    std::string fwid = obj2->getID(::fwTools::fwID::GENERATE);
+    CPPUNIT_ASSERT_NO_THROW (obj2->getID(::fwTools::fwID::MUST_EXIST));
+
+    CPPUNIT_ASSERT(obj2->hasID() == true);
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwid) );
+
+    obj2->resetID();
+    CPPUNIT_ASSERT(obj2->hasID() == false);
+
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(fwid) == false );
+    CPPUNIT_ASSERT( !::fwTools::fwID::getObject(fwid) );
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::conccurentAccessOnSameObjFwIDTest()
+{
+    const unsigned int nbThreads = 10;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&FwIDTest::runAccessToObjectFwID, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void FwIDTest::runAccessToObjectFwID()
+{
+    std::string id = m_object->getID();
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(id) );
+    CPPUNIT_ASSERT( m_object->hasID() );
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(200));
+
+    CPPUNIT_ASSERT_EQUAL(  id, m_object->getID() );
+
+    CPPUNIT_ASSERT_EQUAL( m_object, ::fwTools::fwID::getObject(id) );
+
+    ::boost::this_thread::sleep_for( ::boost::chrono::milliseconds(200));
+
+    m_object->resetID();
+    CPPUNIT_ASSERT( m_object->hasID() == false );
+    CPPUNIT_ASSERT( ::fwTools::fwID::exist(id) == false );
+
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwTools
diff --git a/SrcLib/core/fwTools/test/tu/src/MacrosTest.cpp b/SrcLib/core/fwTools/test/tu/src/MacrosTest.cpp
new file mode 100644
index 0000000..4478323
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/MacrosTest.cpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include "MacrosTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::MacrosTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+class ClassTest
+{
+
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((ClassTest), (()) ( ((int)) ), new ClassTest);
+
+    int getNum() { return m_num; }
+
+protected:
+    ClassTest()
+    : m_num(1)
+    {}
+
+    ClassTest(int num)
+    : m_num(num)
+    {}
+
+    virtual ~ClassTest()
+    {}
+
+private:
+    int m_num;
+};
+
+void MacrosTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void MacrosTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void MacrosTest::factoryMacroTest()
+{
+    const int NUM = 15;
+
+    ClassTest::sptr classTest1;
+    ClassTest::sptr classTest2 = ClassTest::New();
+    ClassTest::sptr classTest3 = ClassTest::New(NUM);
+    ClassTest::sptr classTest4 = ClassTest::New();
+
+    CPPUNIT_ASSERT(classTest1 == NULL);
+    CPPUNIT_ASSERT_EQUAL(classTest2->getNum(), 1);
+    CPPUNIT_ASSERT_EQUAL(classTest3->getNum(), NUM);
+    CPPUNIT_ASSERT_EQUAL(classTest4->getNum(), 1);
+}
+
+} // namespace ut
+} // namespace fwTools
diff --git a/SrcLib/core/fwTools/test/tu/src/NumericRoundCastTest.cpp b/SrcLib/core/fwTools/test/tu/src/NumericRoundCastTest.cpp
new file mode 100644
index 0000000..1c6c2de
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/NumericRoundCastTest.cpp
@@ -0,0 +1,123 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/NumericRoundCast.hxx>
+
+#include "NumericRoundCastTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::NumericRoundCastTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void NumericRoundCastTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void NumericRoundCastTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void NumericRoundCastTest::castFloatToIntTest()
+{
+    float val = 1.32f;
+    int castedVal1 = ::fwTools::numericRoundCast<int>(val);
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(1), castedVal1);
+
+    val = 1.82f;
+    castedVal1 = ::fwTools::numericRoundCast<int>(val);
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(2), castedVal1);
+
+    val = -16.62f;
+    castedVal1 = ::fwTools::numericRoundCast<int>(val);
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(-17), castedVal1);
+
+    val = 4826.2f;
+    unsigned int castedVal2 = ::fwTools::numericRoundCast<int>(val);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(4826), castedVal2);
+}
+
+//------------------------------------------------------------------------------
+
+void NumericRoundCastTest::castDoubleToIntTest()
+{
+    double val1 = 895.33;
+    unsigned int castedVal1 = ::fwTools::numericRoundCast<unsigned int>(val1);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(895), castedVal1);
+
+    double val2 = -56655.58;
+    int castedVal2 = ::fwTools::numericRoundCast<int>(val2);
+    CPPUNIT_ASSERT_EQUAL(static_cast<int>(-56656), castedVal2);
+
+    double val3 = 88.9005;
+    unsigned short castedVal3 = ::fwTools::numericRoundCast<unsigned short>(val3);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(89), castedVal3);
+
+}
+
+//------------------------------------------------------------------------------
+
+void NumericRoundCastTest::castIntToFloatTest()
+{
+    int val1 = 55;
+    float castedVal1 = ::fwTools::numericRoundCast<float>(val1);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(55.0f, castedVal1, 0.00000001);
+
+    int val2 = -4564;
+    float castedVal2 = ::fwTools::numericRoundCast<float>(val2);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-4564.0f, castedVal2, 0.00000001);
+
+    unsigned short val3 = 5394;
+    double castedVal3 = ::fwTools::numericRoundCast<double>(val3);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(5394.0, castedVal3, 0.00000001);
+}
+
+//------------------------------------------------------------------------------
+
+void NumericRoundCastTest::castDoubleToFloatTest()
+{
+    double val = 55.678;
+    float castedVal = ::fwTools::numericRoundCast<float>(val);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(55.678f, castedVal, 0.00000001);
+
+    val = -4564.851;
+    castedVal = ::fwTools::numericRoundCast<float>(val);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-4564.851f, castedVal, 0.00000001);
+
+    val = -84.851/3.0;
+    castedVal = ::fwTools::numericRoundCast<float>(val);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-84.851f/3.0f, castedVal, 0.00000001);
+}
+
+//------------------------------------------------------------------------------
+
+void NumericRoundCastTest::castIntToIntTest()
+{
+    unsigned int val1 = 153;
+    unsigned char castedVal1 = ::fwTools::numericRoundCast<unsigned char>(val1);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(153), castedVal1);
+
+    unsigned char val2 = 25;
+    unsigned char castedVal2 = ::fwTools::numericRoundCast<unsigned char>(val2);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned char>(25), castedVal2);
+
+    char val3 = 121;
+    unsigned short castedVal3 = ::fwTools::numericRoundCast<unsigned char>(val3);
+    CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(121), castedVal3);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/test/tu/src/ObjectTest.cpp b/SrcLib/core/fwTools/test/tu/src/ObjectTest.cpp
new file mode 100644
index 0000000..bf286b3
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/ObjectTest.cpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/Object.hpp>
+
+#include "ObjectTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::ObjectTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void ObjectTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void ObjectTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void ObjectTest::idTest()
+{
+    const std::string UUID = "uid" ;
+
+    // process
+    ::fwTools::Object::sptr obj = ::boost::make_shared< ::fwTools::Object >();
+
+    obj->setID(UUID);
+
+    // check
+    CPPUNIT_ASSERT(obj->hasID());
+    CPPUNIT_ASSERT_EQUAL(obj->getID(), UUID);
+}
+
+} // namespace ut
+} // namespace fwTools
diff --git a/SrcLib/core/fwTools/test/tu/src/RandomTest.cpp b/SrcLib/core/fwTools/test/tu/src/RandomTest.cpp
new file mode 100644
index 0000000..a7afad5
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/RandomTest.cpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/random/Generator.hpp>
+
+#include "RandomTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::RandomTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void RandomTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void RandomTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void RandomTest::generatorTest()
+{
+    float minF=10.f, maxF=20.f;
+    float randF = ::fwTools::random::getValue(minF, maxF);
+    CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randF>=minF && randF<=maxF);
+
+    int minI=10, maxI=12;
+    int randI = ::fwTools::random::getValue(minI, maxI);
+    CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randI>=minI && randI<=maxI);
+}
+
+//------------------------------------------------------------------------------
+
+void RandomTest::randomListTest()
+{
+    float minF=10.f, maxF=20.f;
+    std::vector<float> randF(10);
+    ::fwTools::random::fillContainer(minF, maxF, randF);
+    for(size_t i = 0; i <randF.size(); ++i)
+    {
+        CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randF[i]>=minF && randF[i]<=maxF);
+    }
+
+    int minI=10, maxI=20;
+    std::vector<int> randI(10);
+    ::fwTools::random::fillContainer(minI, maxI, randI);
+    for(size_t i = 0; i <randF.size(); ++i)
+    {
+        CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randI[i]>=minI && randI[i]<=maxI);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void RandomTest::seedTest()
+{
+    ::boost::uint32_t seedVal = 42;
+
+    float minF=10.f, maxF=20.f;
+    float randF1 = ::fwTools::random::getValue(minF, maxF, seedVal);
+    CPPUNIT_ASSERT_MESSAGE("Generate random number not in good interval.", randF1>=minF && randF1<=maxF);
+    float randF2 = ::fwTools::random::getValue(minF, maxF, seedVal);
+    CPPUNIT_ASSERT_EQUAL(randF1, randF2);
+
+    int minI=10, maxI=20;
+    std::vector<int> randI1(10);
+    std::vector<int> randI2(10);
+    ::fwTools::random::fillContainer(minI, maxI, randI1, seedVal);
+    ::fwTools::random::fillContainer(minI, maxI, randI2, seedVal);
+    for(size_t i = 0; i <randI1.size(); ++i)
+    {
+        CPPUNIT_ASSERT_EQUAL(randI1[i], randI2[i]);
+    }
+}
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/test/tu/src/StringizerTest.cpp b/SrcLib/core/fwTools/test/tu/src/StringizerTest.cpp
new file mode 100644
index 0000000..4e4aa3f
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/StringizerTest.cpp
@@ -0,0 +1,49 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/Stringizer.hpp>
+
+#include "StringizerTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::StringizerTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void StringizerTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void StringizerTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void StringizerTest::convertTest()
+{
+    const std::string STR1 = "[1,2,3]";
+    const std::string STR2 = "6";
+    const double D = 6.0;
+    std::vector<int> vec;
+    vec.push_back(1);
+    vec.push_back(2);
+    vec.push_back(3);
+
+    std::string res1 = ::fwTools::getString(vec.begin(), vec.end());
+    std::string res2 = ::fwTools::getString<double>(D);
+
+    // check
+    CPPUNIT_ASSERT_EQUAL(res1, STR1);
+    CPPUNIT_ASSERT_EQUAL(res2, STR2);
+}
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/test/tu/src/TypeTest.cpp b/SrcLib/core/fwTools/test/tu/src/TypeTest.cpp
new file mode 100644
index 0000000..baf81cf
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/TypeTest.cpp
@@ -0,0 +1,145 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/Type.hpp>
+
+#include "TypeTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::TypeTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+void TypeTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+void TypeTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+void TypeTest::typeTest()
+{
+    ::fwTools::Type INT8   ( ::fwTools::Type::s_INT8_TYPENAME   );
+    ::fwTools::Type INT16  ( ::fwTools::Type::s_INT16_TYPENAME  );
+    ::fwTools::Type INT32  ( ::fwTools::Type::s_INT32_TYPENAME  );
+    ::fwTools::Type INT64  ( ::fwTools::Type::s_INT64_TYPENAME  );
+
+    ::fwTools::Type UINT8  ( ::fwTools::Type::s_UINT8_TYPENAME  );
+    ::fwTools::Type UINT16 ( ::fwTools::Type::s_UINT16_TYPENAME );
+    ::fwTools::Type UINT32 ( ::fwTools::Type::s_UINT32_TYPENAME );
+    ::fwTools::Type UINT64 ( ::fwTools::Type::s_UINT64_TYPENAME );
+
+    ::fwTools::Type FLOAT  ( ::fwTools::Type::s_FLOAT_TYPENAME  );
+    ::fwTools::Type DOUBLE ( ::fwTools::Type::s_DOUBLE_TYPENAME );
+
+    ::fwTools::Type t;
+
+    CPPUNIT_ASSERT_EQUAL( std::string("int8" ),  INT8.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int16"),  INT16.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int32"),  INT32.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int64"),  INT64.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint8" ), UINT8.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint16"), UINT16.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint32"), UINT32.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint64"), UINT64.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("float"),  FLOAT.string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("double"), DOUBLE.string() );
+
+
+    CPPUNIT_ASSERT_EQUAL( std::string("int8" ),  ::fwTools::Type::create< signed char >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int8" ),  ::fwTools::Type::create< char >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int16"),  ::fwTools::Type::create< short >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int32"),  ::fwTools::Type::create< int >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int64"),  ::fwTools::Type::create< long long >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint8" ), ::fwTools::Type::create< unsigned char >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint16"), ::fwTools::Type::create< unsigned short >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint32"), ::fwTools::Type::create< unsigned int >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint64"), ::fwTools::Type::create< unsigned long long >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("float"),  ::fwTools::Type::create< float  >().string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("double"), ::fwTools::Type::create< double >().string() );
+
+
+    CPPUNIT_ASSERT_EQUAL( std::string("int8" ),  ::fwTools::Type::create("int8").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int16"),  ::fwTools::Type::create("int16").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int32"),  ::fwTools::Type::create("int32").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("int64"),  ::fwTools::Type::create("int64").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint8" ), ::fwTools::Type::create("uint8").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint16"), ::fwTools::Type::create("uint16").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint32"), ::fwTools::Type::create("uint32").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("uint64"), ::fwTools::Type::create("uint64").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("float"),  ::fwTools::Type::create("float").string() );
+    CPPUNIT_ASSERT_EQUAL( std::string("double"), ::fwTools::Type::create("double").string() );
+
+
+    CPPUNIT_ASSERT_EQUAL( ::fwTools::Type::s_UNSPECIFIED_TYPE,  ::fwTools::Type() );
+
+    CPPUNIT_ASSERT_EQUAL( INT8 , ::fwTools::Type::create< signed char >() );
+    CPPUNIT_ASSERT_EQUAL( INT8 , ::fwTools::Type::create< char >() );
+    CPPUNIT_ASSERT_EQUAL( INT16, ::fwTools::Type::create< short >() );
+    CPPUNIT_ASSERT_EQUAL( INT32, ::fwTools::Type::create< int >() );
+    CPPUNIT_ASSERT_EQUAL( INT64, ::fwTools::Type::create< long long >() );
+
+    CPPUNIT_ASSERT_EQUAL( UINT8 , ::fwTools::Type::create< unsigned char >() );
+    CPPUNIT_ASSERT_EQUAL( UINT16, ::fwTools::Type::create< unsigned short >() );
+    CPPUNIT_ASSERT_EQUAL( UINT32, ::fwTools::Type::create< unsigned int >() );
+    CPPUNIT_ASSERT_EQUAL( UINT64, ::fwTools::Type::create< unsigned long long >() );
+
+    CPPUNIT_ASSERT_EQUAL( FLOAT , ::fwTools::Type::create< float  >() );
+    CPPUNIT_ASSERT_EQUAL( DOUBLE, ::fwTools::Type::create< double >() );
+
+    CPPUNIT_ASSERT_EQUAL( ::fwTools::Type::s_UNSPECIFIED_TYPE,  t );
+
+
+    t.setType<void >();
+
+    t.setType<signed char >();
+    CPPUNIT_ASSERT_EQUAL( INT8   , t );
+    t.setType<char >();
+    CPPUNIT_ASSERT_EQUAL( INT8   , t );
+    t.setType<short >();
+    CPPUNIT_ASSERT_EQUAL( INT16  , t );
+    t.setType<int >();
+    CPPUNIT_ASSERT_EQUAL( INT32  , t );
+    t.setType<long long >();
+    CPPUNIT_ASSERT_EQUAL( INT64  , t );
+    t.setType<unsigned char >();
+    CPPUNIT_ASSERT_EQUAL( UINT8  , t );
+    t.setType<unsigned short >();
+    CPPUNIT_ASSERT_EQUAL( UINT16 , t );
+    t.setType<unsigned int >();
+    CPPUNIT_ASSERT_EQUAL( UINT32 , t );
+    t.setType<unsigned long long>();
+    CPPUNIT_ASSERT_EQUAL( UINT64 , t );
+    t.setType<float >();
+    CPPUNIT_ASSERT_EQUAL( FLOAT  , t );
+    t.setType<double >();
+    CPPUNIT_ASSERT_EQUAL( DOUBLE , t );
+
+    CPPUNIT_ASSERT( typeid(void) == ::fwTools::Type::s_UNSPECIFIED_TYPE.typeId());
+
+    CPPUNIT_ASSERT( typeid(signed char) == INT8.typeId() );
+    CPPUNIT_ASSERT( typeid(short      ) == INT16.typeId() );
+    CPPUNIT_ASSERT( typeid(int        ) == INT32.typeId() );
+    CPPUNIT_ASSERT( typeid(long long  ) == INT64.typeId() );
+
+    CPPUNIT_ASSERT( typeid(unsigned char     ) == UINT8.typeId()  );
+    CPPUNIT_ASSERT( typeid(unsigned short    ) == UINT16.typeId()  );
+    CPPUNIT_ASSERT( typeid(unsigned int      ) == UINT32.typeId()  );
+    CPPUNIT_ASSERT( typeid(unsigned long long) == UINT64.typeId()  );
+
+    CPPUNIT_ASSERT( typeid(float ) == FLOAT.typeId()  );
+    CPPUNIT_ASSERT( typeid(double) == DOUBLE.typeId()  );
+}
+
+} // namespace ut
+} // namespace fwTools
+
diff --git a/SrcLib/core/fwTools/test/tu/src/UUIDTest.cpp b/SrcLib/core/fwTools/test/tu/src/UUIDTest.cpp
new file mode 100644
index 0000000..3ffaaaf
--- /dev/null
+++ b/SrcLib/core/fwTools/test/tu/src/UUIDTest.cpp
@@ -0,0 +1,143 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwTools/Object.hpp>
+
+#include <fwTest/helper/Thread.hpp>
+
+#include "UUIDTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTools::ut::UUIDTest );
+
+namespace fwTools
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::setUp()
+{
+    // Set up context before running a test.
+    m_object = ::boost::make_shared< ::fwTools::Object >();
+    m_uuid = ::fwTools::UUID::generateUUID();
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::objectUUIDTest()
+{
+    const std::string UUID = "myUUID" ;
+
+    ::fwTools::Object::sptr obj = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::exist(UUID) == false);
+
+    ::fwTools::UUID::set(obj, UUID);
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::exist(UUID) );
+    CPPUNIT_ASSERT_EQUAL(  UUID, ::fwTools::UUID::get(obj) );
+    CPPUNIT_ASSERT_EQUAL( obj, ::fwTools::UUID::get(UUID) );
+
+    ::fwTools::Object::sptr obj2 = ::boost::make_shared< ::fwTools::Object >();
+    std::string uuid = ::fwTools::UUID::get(obj2);
+    CPPUNIT_ASSERT_EQUAL( obj2, ::fwTools::UUID::get(uuid) );
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::conccurentAccessOnUUIDMapTest()
+{
+    const unsigned int nbThreads = 10;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&UUIDTest::runUUIDCreation, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::runUUIDCreation()
+{
+    std::string UUID = ::fwTools::UUID::generateUUID();
+
+    ::fwTools::Object::sptr obj = ::boost::make_shared< ::fwTools::Object >();
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::exist(UUID) == false);
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::set(obj, UUID));
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::exist(UUID) );
+    CPPUNIT_ASSERT_EQUAL( UUID, ::fwTools::UUID::get(obj) );
+    CPPUNIT_ASSERT_EQUAL( obj, ::fwTools::UUID::get(UUID) );
+
+    ::fwTools::Object::sptr obj2 = ::boost::make_shared< ::fwTools::Object >();
+    std::string uuid = ::fwTools::UUID::get(obj2);
+    CPPUNIT_ASSERT_EQUAL( obj2, ::fwTools::UUID::get(uuid) );
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::conccurentAccessOnSameObjUUIDTest()
+{
+    const unsigned int nbThreads = 10;
+    std::vector< SPTR(::fwTest::helper::Thread) > threads;
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        SPTR(::fwTest::helper::Thread) thread;
+        thread = ::boost::shared_ptr< ::fwTest::helper::Thread >(
+                new ::fwTest::helper::Thread(::boost::bind(&UUIDTest::runAccessToObjectUUID, this)));
+        threads.push_back(thread);
+    }
+
+    for (int i=0 ; i<nbThreads ; ++i)
+    {
+        std::stringstream str;
+        str << "thread " << i;
+        CPPUNIT_ASSERT_MESSAGE(str.str(), threads[i]->timedJoin(1000));
+    }
+
+}
+
+//-----------------------------------------------------------------------------
+
+void UUIDTest::runAccessToObjectUUID()
+{
+    ::fwTools::UUID::set(m_object, m_uuid);
+
+    CPPUNIT_ASSERT( ::fwTools::UUID::exist(m_uuid) );
+    CPPUNIT_ASSERT_EQUAL( m_uuid, ::fwTools::UUID::get(m_object) );
+    CPPUNIT_ASSERT_EQUAL( m_object, ::fwTools::UUID::get(m_uuid) );
+    CPPUNIT_ASSERT(::fwTools::UUID::set(m_object, m_uuid) == false);
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwTools
diff --git a/SrcLib/core/fwZip/CMakeLists.txt b/SrcLib/core/fwZip/CMakeLists.txt
new file mode 100644
index 0000000..4c26226
--- /dev/null
+++ b/SrcLib/core/fwZip/CMakeLists.txt
@@ -0,0 +1,12 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+)
+
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+find_package( ZLIB REQUIRED )
+fwInclude(${ZLIB_INCLUDE_DIRS}) # No forward, minizip should be private
+fwForwardInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES} ${ZLIB_LIBRARIES})
+
diff --git a/SrcLib/core/fwZip/COPYING b/SrcLib/core/fwZip/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/core/fwZip/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/core/fwZip/COPYING.LESSER b/SrcLib/core/fwZip/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/core/fwZip/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/core/fwZip/Properties.cmake b/SrcLib/core/fwZip/Properties.cmake
new file mode 100644
index 0000000..3f3109b
--- /dev/null
+++ b/SrcLib/core/fwZip/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwZip )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/core/fwZip/bin/build.options b/SrcLib/core/fwZip/bin/build.options
new file mode 100644
index 0000000..7e2effb
--- /dev/null
+++ b/SrcLib/core/fwZip/bin/build.options
@@ -0,0 +1,7 @@
+USE     = ['boost', 'boostFilesystem','z']
+LIB     = [
+          'fwTools_0-1',
+          'fwCore_0-1',
+          ]
+TYPE    = 'shared'
+VERSION = '0-1'
diff --git a/SrcLib/core/fwZip/include/Namespace.hpp b/SrcLib/core/fwZip/include/Namespace.hpp
new file mode 100644
index 0000000..bb17b88
--- /dev/null
+++ b/SrcLib/core/fwZip/include/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWZIPNAMESPACE_HPP_
+#define FWZIPNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwZip provides IO for compress/uncompress .zip files using zlib .
+ * @namespace   fwZip
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwZip
+{
+}
+#endif /* FWZIPNAMESPACE_HPP_ */
diff --git a/SrcLib/core/fwZip/include/fwZip/IReadArchive.hpp b/SrcLib/core/fwZip/include/fwZip/IReadArchive.hpp
new file mode 100644
index 0000000..bf098b9
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/IReadArchive.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_READARCHIVE_HPP__
+#define __FWZIP_READARCHIVE_HPP__
+
+#include <istream>
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+namespace fwZip
+{
+
+/**
+ * @brief   This interface defines functions to read a file in an archive.
+ * @class   IReadArchive
+ */
+class IReadArchive
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro((IReadArchive));
+
+    virtual ~IReadArchive(){};
+
+    /**
+     * @brief Returns input stream for the file in current archive.
+     * @param path file in archive.
+     * @return input stream from request file.
+     */
+    virtual SPTR(std::istream) getFile(const ::boost::filesystem::path &path) = 0;
+
+    /**
+     * @brief Returns archive path.
+     */
+    virtual const ::boost::filesystem::path getArchivePath() const = 0;
+
+    virtual IReadArchive::sptr clone() const = 0 ;
+};
+
+}
+
+
+#endif /* __FWZIP_READARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/IWriteArchive.hpp b/SrcLib/core/fwZip/include/fwZip/IWriteArchive.hpp
new file mode 100644
index 0000000..172287c
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/IWriteArchive.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_WRITEARCHIVE_HPP__
+#define __FWZIP_WRITEARCHIVE_HPP__
+
+#include <ostream>
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+namespace fwZip
+{
+
+/**
+ * @brief   This interface defines functions to write a file in an archive.
+ * @class   IWriteArchive
+ */
+class IWriteArchive
+{
+
+public:
+
+    fwCoreNonInstanciableClassDefinitionsMacro((IWriteArchive));
+
+    virtual ~IWriteArchive(){};
+
+    /**
+     * @brief Creates a new file entry in archive and returns output stream for this file.
+     * @param path file in archive.
+     * @return output stream of file entry in archive.
+     */
+    virtual SPTR(std::ostream) createFile(const ::boost::filesystem::path &path) = 0;
+
+    /**
+     * @brief Writes source file in archive.
+     * @param sourceFile source file.
+     * @param path file in archive.
+     */
+    virtual void putFile(const ::boost::filesystem::path &sourceFile, const ::boost::filesystem::path &path) = 0;
+
+    /**
+     * @brief Creates a folder in archive.
+     * @param path folder to create in archive.
+     */
+    virtual bool createDir(const ::boost::filesystem::path &path) = 0;
+
+    /**
+     * @brief Returns archive path.
+     */
+    virtual const ::boost::filesystem::path getArchivePath() const = 0;
+};
+
+}
+
+
+#endif /* __FWZIP_WRITEARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/ReadDirArchive.hpp b/SrcLib/core/fwZip/include/fwZip/ReadDirArchive.hpp
new file mode 100644
index 0000000..1c36949
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/ReadDirArchive.hpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_READDIRARCHIVE_HPP__
+#define __FWZIP_READDIRARCHIVE_HPP__
+
+#include <fstream>
+
+#include <boost/filesystem/path.hpp>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/IReadArchive.hpp"
+
+
+namespace fwZip
+{
+
+/**
+ * @brief   This class defines functions to read a file in a file system archive.
+ * @class   ReadDirArchive
+ */
+class FWZIP_CLASS_API ReadDirArchive : public IReadArchive
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((ReadDirArchive)(IReadArchive),
+                                           ((( const ::boost::filesystem::path& ))),
+                                           ::boost::make_shared< ReadDirArchive >);
+
+    /// Constructors. Initializes archive path.
+    FWZIP_API ReadDirArchive( const ::boost::filesystem::path &archive );
+
+    /// Destructor. Close automatically last input file stream.
+    FWZIP_API ~ReadDirArchive();
+
+    /**
+     * @brief Returns input stream for the file in current archive.
+     * @param path file in archive.
+     * @return input stream from request file.
+     *
+     * @throw ::fwZip::exception::Read if file doesn't exist in archive.
+     */
+    FWZIP_API SPTR(std::istream) getFile(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Returns archive path.
+     */
+    FWZIP_API const ::boost::filesystem::path getArchivePath() const;
+
+    IReadArchive::sptr clone() const
+    {
+        return ReadDirArchive::New(m_archive);
+    }
+
+protected:
+
+    /**
+     * @brief Returns true if path exists in archive.
+     */
+    FWZIP_API bool exists(const ::boost::filesystem::path &path);
+
+    ::boost::filesystem::path m_archive;
+};
+
+}
+
+
+#endif /* __FWZIP_READDIRARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/ReadZipArchive.hpp b/SrcLib/core/fwZip/include/fwZip/ReadZipArchive.hpp
new file mode 100644
index 0000000..84e4968
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/ReadZipArchive.hpp
@@ -0,0 +1,74 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_READZIPARCHIVE_HPP__
+#define __FWZIP_READZIPARCHIVE_HPP__
+
+#include <istream>
+
+#include <boost/make_shared.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/IReadArchive.hpp"
+
+
+namespace fwZip
+{
+
+/**
+ * @brief   This class defines functions to read a file in a zip archive.
+ * @class   ReadZipArchive
+ */
+class FWZIP_CLASS_API ReadZipArchive : public IReadArchive
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((ReadZipArchive)(IReadArchive),
+                                           ((( const ::boost::filesystem::path& ))),
+                                           ::boost::make_shared< ReadZipArchive >);
+
+    /*
+     * @brief Constructors. Initializes archive path, zip descriptor and zip stream.
+     *
+     * @throw ::fwZip::exception::Read if archive doesn't exist.
+     * @throw ::fwZip::exception::Read if archive cannot be opened.
+     */
+    FWZIP_API ReadZipArchive( const ::boost::filesystem::path &archive );
+
+    /**
+     * @brief Returns input stream for the file in current archive (zip).
+     * @param path file in archive.
+     * @return input stream from request file.
+     *
+     * @throw ::fwZip::exception::Read if file doesn't exist in archive.
+     * @throw ::fwZip::exception::Read if cannot retrieve file in archive.
+     */
+    FWZIP_API SPTR(std::istream) getFile(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Returns archive path.
+     */
+    FWZIP_API const ::boost::filesystem::path getArchivePath() const;
+
+    IReadArchive::sptr clone() const
+    {
+        return ReadZipArchive::New(m_archive);
+    }
+
+protected:
+
+    ::boost::filesystem::path m_archive;
+};
+
+}
+
+
+#endif /* __FWZIP_READZIPARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/WriteDirArchive.hpp b/SrcLib/core/fwZip/include/fwZip/WriteDirArchive.hpp
new file mode 100644
index 0000000..05d64d4
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/WriteDirArchive.hpp
@@ -0,0 +1,82 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_WRITEDIRARCHIVE_HPP__
+#define __FWZIP_WRITEDIRARCHIVE_HPP__
+
+#include <fstream>
+
+#include <boost/filesystem/path.hpp>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/IWriteArchive.hpp"
+
+
+namespace fwZip
+{
+
+/**
+ * @brief   This class defines functions to write a file in a file system archive.
+ * @class   WriteDirArchive
+ */
+class FWZIP_CLASS_API WriteDirArchive : public IWriteArchive
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((WriteDirArchive)(IWriteArchive),
+                                           ((( const ::boost::filesystem::path& ))),
+                                           ::boost::make_shared<WriteDirArchive> );
+
+    /// Constructors. Initializes archive path and creates archive directories if doesn't exist.
+    FWZIP_API WriteDirArchive( const ::boost::filesystem::path &archive );
+
+    /// Destructor. Flush and close last output file stream.
+    FWZIP_API ~WriteDirArchive();
+
+    /**
+     * @brief Creates a new file entry in archive and returns output stream for this file.
+     * @param path file in archive.
+     * @return output stream of file entry in archive.
+     *
+     * @note Creates all parent directories of the path in archive.
+     */
+    FWZIP_API SPTR(std::ostream) createFile(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Writes source file in archive. If possible, creates hard link otherwise copy source file in archive.
+     * @param sourceFile source file.
+     * @param path file in archive.
+     *
+     * @note Do nothing if path already exists in archive.
+     */
+    FWZIP_API void putFile(const ::boost::filesystem::path &sourceFile, const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Creates a folder in archive.
+     * @param path folder to create in archive.
+     */
+    FWZIP_API bool createDir(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Returns archive path.
+     */
+    FWZIP_API const ::boost::filesystem::path getArchivePath() const;
+
+protected:
+
+    ::boost::filesystem::path m_archive;
+};
+
+}
+
+
+#endif /* __FWZIP_WRITEDIRARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/WriteZipArchive.hpp b/SrcLib/core/fwZip/include/fwZip/WriteZipArchive.hpp
new file mode 100644
index 0000000..3981b7e
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/WriteZipArchive.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_WRITEZIPARCHIVE_HPP__
+#define __FWZIP_WRITEZIPARCHIVE_HPP__
+
+#include <ostream>
+
+#include <boost/make_shared.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <boost/make_shared.hpp>
+
+#include <fwCore/macros.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/IWriteArchive.hpp"
+
+
+namespace fwZip
+{
+
+/**
+ * @brief   This class defines functions to write a file in a zip archive.
+ * @class   WriteZipArchive
+ */
+class FWZIP_CLASS_API WriteZipArchive : public IWriteArchive
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro((WriteZipArchive)(IWriteArchive),
+                                           ((( const ::boost::filesystem::path& ))),
+                                           ::boost::make_shared<WriteZipArchive> );
+
+    /**
+     * @brief Constructors. Initializes archive path.
+     *
+     */
+    FWZIP_API WriteZipArchive( const ::boost::filesystem::path &archive );
+
+    FWZIP_API ~WriteZipArchive();
+
+    /**
+     * @brief Creates a new file entry in archive and returns output stream for this file.
+     * @param path file in archive.
+     * @return output stream of file entry in archive.
+     *
+     * @throw ::fwZip::exception::Write if archive cannot be opened.
+     * @note Last output stream is automatically flushed before creation of new file entry in zip archive.
+     */
+    FWZIP_API SPTR(std::ostream) createFile(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Writes source file in archive.
+     * @param sourceFile source file.
+     * @param path file in archive.
+     *
+     * @throw ::fwZip::exception::Read if source file cannot be opened.
+     */
+    FWZIP_API void putFile(const ::boost::filesystem::path &sourceFile, const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Creates a folder in archive.
+     * @param path folder to create in archive.
+     *
+     * @todo: file attribute isn't correctly set in zip archive.
+     */
+    FWZIP_API bool createDir(const ::boost::filesystem::path &path);
+
+    /**
+     * @brief Returns archive path.
+     */
+    FWZIP_API const ::boost::filesystem::path getArchivePath() const;
+
+protected:
+
+    ::boost::filesystem::path m_archive;
+};
+
+}
+
+
+#endif /* __FWZIP_WRITEZIPARCHIVE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/config.hpp b/SrcLib/core/fwZip/include/fwZip/config.hpp
new file mode 100644
index 0000000..3d92b1d
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/config.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+
+#ifndef _FWZIP_CONFIG_HPP_
+#define _FWZIP_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWZIP_EXPORTS
+    #define FWZIP_API __declspec(dllexport)
+    #else
+    #define FWZIP_API __declspec(dllimport)
+    #endif
+
+    #define FWZIP_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWZIP_EXPORTS
+    #define FWZIP_API __attribute__ ((visibility("default")))
+    #define FWZIP_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWZIP_API __attribute__ ((visibility("hidden")))
+    //#define FWZIP_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWZIP_API
+    #define FWZIP_CLASS_API
+    #endif
+
+#else
+
+    #define FWZIP_API
+    #define FWZIP_CLASS_API
+
+#endif
+
+#endif //_FWZIP_CONFIG_HPP_
diff --git a/SrcLib/core/fwZip/include/fwZip/exception/Read.hpp b/SrcLib/core/fwZip/include/fwZip/exception/Read.hpp
new file mode 100644
index 0000000..c68c263
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/exception/Read.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_EXCEPTION_READ_HPP__
+#define __FWZIP_EXCEPTION_READ_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwZip/config.hpp"
+
+namespace fwZip
+{
+
+namespace exception
+{
+
+/// Read exception.
+struct Read : ::fwCore::Exception
+{
+    FWZIP_API Read ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwZip
+
+#endif /* __FWZIP_EXCEPTION_READ_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/fwZip/exception/Write.hpp b/SrcLib/core/fwZip/include/fwZip/exception/Write.hpp
new file mode 100644
index 0000000..63153bf
--- /dev/null
+++ b/SrcLib/core/fwZip/include/fwZip/exception/Write.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWZIP_EXCEPTION_WRITE_HPP__
+#define __FWZIP_EXCEPTION_WRITE_HPP__
+
+#include <fwCore/Exception.hpp>
+
+#include "fwZip/config.hpp"
+
+namespace fwZip
+{
+
+namespace exception
+{
+
+/// Write exception.
+struct Write : ::fwCore::Exception
+{
+    FWZIP_API Write ( const std::string &err ) ;
+};
+
+} // namespace exception
+
+} // namespace fwZip
+
+#endif /* __FWZIP_EXCEPTION_WRITE_HPP__ */
+
diff --git a/SrcLib/core/fwZip/include/minizip/crypt.h b/SrcLib/core/fwZip/include/minizip/crypt.h
new file mode 100644
index 0000000..a01d08d
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/crypt.h
@@ -0,0 +1,131 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+   Version 1.01e, February 12th, 2005
+
+   Copyright (C) 1998-2005 Gilles Vollant
+
+   This code is a modified version of crypting code in Infozip distribution
+
+   The encryption/decryption parts of this source code (as opposed to the
+   non-echoing password parts) were originally written in Europe.  The
+   whole source package can be freely distributed, including from the USA.
+   (Prior to January 2000, re-export from the US was a violation of US law.)
+
+   This encryption code is a direct transcription of the algorithm from
+   Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
+   file (appnote.txt) is distributed with the PKZIP program (even in the
+   version without encryption capabilities).
+
+   If you don't need crypting in your application, just define symbols
+   NOCRYPT and NOUNCRYPT.
+
+   This code support the "Traditional PKWARE Encryption".
+
+   The new AES encryption added on Zip format by Winzip (see the page
+   http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+   Encryption is not supported.
+*/
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab)
+{
+    unsigned temp;  /* POTENTIAL BUG:  temp*(temp^1) may overflow in an
+                     * unpredictable manner on 16-bit systems; not a problem
+                     * with any known compiler so far, though */
+
+    temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+    return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c)
+{
+    (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+    (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+    (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+    {
+      register int keyshift = (int)((*(pkeys+1)) >> 24);
+      (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+    }
+    return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab)
+{
+    *(pkeys+0) = 305419896L;
+    *(pkeys+1) = 591751049L;
+    *(pkeys+2) = 878082192L;
+    while (*passwd != '\0') {
+        update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+        passwd++;
+    }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+    (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+    (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN  12
+   /* "last resort" source for second part of crypt seed pattern */
+#  ifndef ZCR_SEED2
+#    define ZCR_SEED2 3141592654UL     /* use PI as default pattern */
+#  endif
+
+static int crypthead(const char* passwd,      /* password string */
+                     unsigned char* buf,      /* where to write header */
+                     int bufSize,
+                     unsigned long* pkeys,
+                     const unsigned long* pcrc_32_tab,
+                     unsigned long crcForCrypting)
+{
+    int n;                       /* index in random header */
+    int t;                       /* temporary */
+    int c;                       /* random byte */
+    unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+    static unsigned calls = 0;   /* ensure different random header each time */
+
+    if (bufSize<RAND_HEAD_LEN)
+      return 0;
+
+    /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+     * output of rand() to get less predictability, since rand() is
+     * often poorly implemented.
+     */
+    if (++calls == 1)
+    {
+        srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+    }
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        c = (rand() >> 7) & 0xff;
+        header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+    }
+    /* Encrypt random header (last two bytes is high word of crc) */
+    init_keys(passwd, pkeys, pcrc_32_tab);
+    for (n = 0; n < RAND_HEAD_LEN-2; n++)
+    {
+        buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+    }
+    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+    buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+    return n;
+}
+
+#endif
diff --git a/SrcLib/core/fwZip/include/minizip/export.h b/SrcLib/core/fwZip/include/minizip/export.h
new file mode 100644
index 0000000..6cccf32
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/export.h
@@ -0,0 +1,8 @@
+#ifndef _MINIZIP_CONFIG_HPP_
+#define _MINIZIP_CONFIG_HPP_
+
+//TODO: minizip/microzip as external dependency
+#define MINIZIP_CLASS_API
+#define MINIZIP_API
+
+#endif //_MINIZIP_CONFIG_HPP_
diff --git a/SrcLib/core/fwZip/include/minizip/ioapi.h b/SrcLib/core/fwZip/include/minizip/ioapi.h
new file mode 100644
index 0000000..74a56cd
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/ioapi.h
@@ -0,0 +1,202 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+         Changes
+
+    Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this)
+    Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux.
+               More if/def section may be needed to support other platforms
+    Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows.
+                          (but you should use iowin32.c for windows instead)
+
+*/
+
+#ifndef _ZLIBIOAPI64_H
+#define _ZLIBIOAPI64_H
+
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+
+  // Linux needs this to support file operation on files larger then 4+GB
+  // But might need better if/def to select just the platforms that needs them.
+
+        #ifndef __USE_FILE_OFFSET64
+                #define __USE_FILE_OFFSET64
+        #endif
+        #ifndef __USE_LARGEFILE64
+                #define __USE_LARGEFILE64
+        #endif
+        #ifndef _LARGEFILE64_SOURCE
+                #define _LARGEFILE64_SOURCE
+        #endif
+        #ifndef _FILE_OFFSET_BIT
+                #define _FILE_OFFSET_BIT 64
+        #endif
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <zlib.h>
+
+#include "minizip/export.h"
+
+#if defined(USE_FILE32API)
+#define fopen64 fopen
+#define ftello64 ftell
+#define fseeko64 fseek
+#else
+#ifdef _MSC_VER
+ #define fopen64 fopen
+ #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
+  #define ftello64 _ftelli64
+  #define fseeko64 _fseeki64
+ #else // old MSC
+  #define ftello64 ftell
+  #define fseeko64 fseek
+ #endif
+#endif
+#endif
+
+/*
+#ifndef ZPOS64_T
+  #ifdef _WIN32
+                #define ZPOS64_T fpos_t
+  #else
+    #include <stdint.h>
+    #define ZPOS64_T uint64_t
+  #endif
+#endif
+*/
+
+#ifdef HAVE_MINIZIP64_CONF_H
+#include "minizip/mz64conf.h"
+#endif
+
+/* a type choosen by DEFINE */
+#ifdef HAVE_64BIT_INT_CUSTOM
+typedef  64BIT_INT_CUSTOM_TYPE ZPOS64_T;
+#else
+#ifdef HAS_STDINT_H
+#include "minizip/stdint.h"
+typedef uint64_t ZPOS64_T;
+#else
+
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+typedef unsigned __int64 ZPOS64_T;
+#else
+typedef unsigned long long int ZPOS64_T;
+#endif
+#endif
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ      (1)
+#define ZLIB_FILEFUNC_MODE_WRITE     (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE   (8)
+
+
+#ifndef ZCALLBACK
+ #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+   #define ZCALLBACK CALLBACK
+ #else
+   #define ZCALLBACK
+ #endif
+#endif
+
+
+
+
+typedef voidpf   (ZCALLBACK *open_file_func)      OF((voidpf opaque, const char* filename, int mode));
+typedef uLong    (ZCALLBACK *read_file_func)      OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong    (ZCALLBACK *write_file_func)     OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef int      (ZCALLBACK *close_file_func)     OF((voidpf opaque, voidpf stream));
+typedef int      (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef long     (ZCALLBACK *tell_file_func)      OF((voidpf opaque, voidpf stream));
+typedef long     (ZCALLBACK *seek_file_func)      OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+
+
+/* here is the "old" 32 bits structure structure */
+typedef struct zlib_filefunc_def_s
+{
+    open_file_func      zopen_file;
+    read_file_func      zread_file;
+    write_file_func     zwrite_file;
+    tell_file_func      ztell_file;
+    seek_file_func      zseek_file;
+    close_file_func     zclose_file;
+    testerror_file_func zerror_file;
+    voidpf              opaque;
+} zlib_filefunc_def;
+
+typedef ZPOS64_T (ZCALLBACK *tell64_file_func)    OF((voidpf opaque, voidpf stream));
+typedef long     (ZCALLBACK *seek64_file_func)    OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+typedef voidpf   (ZCALLBACK *open64_file_func)    OF((voidpf opaque, const void* filename, int mode));
+
+typedef struct zlib_filefunc64_def_s
+{
+    open64_file_func    zopen64_file;
+    read_file_func      zread_file;
+    write_file_func     zwrite_file;
+    tell64_file_func    ztell64_file;
+    seek64_file_func    zseek64_file;
+    close_file_func     zclose_file;
+    testerror_file_func zerror_file;
+    voidpf              opaque;
+} zlib_filefunc64_def;
+
+MINIZIP_API void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
+MINIZIP_API void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+/* now internal definition, only for zip.c and unzip.h */
+typedef struct zlib_filefunc64_32_def_s
+{
+    zlib_filefunc64_def zfile_func64;
+    open_file_func      zopen32_file;
+    tell_file_func      ztell32_file;
+    seek_file_func      zseek32_file;
+} zlib_filefunc64_32_def;
+
+
+#define ZREAD64(filefunc,filestream,buf,size)     ((*((filefunc).zfile_func64.zread_file))   ((filefunc).zfile_func64.opaque,filestream,buf,size))
+#define ZWRITE64(filefunc,filestream,buf,size)    ((*((filefunc).zfile_func64.zwrite_file))  ((filefunc).zfile_func64.opaque,filestream,buf,size))
+//#define ZTELL64(filefunc,filestream)            ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))
+//#define ZSEEK64(filefunc,filestream,pos,mode)   ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE64(filefunc,filestream)             ((*((filefunc).zfile_func64.zclose_file))  ((filefunc).zfile_func64.opaque,filestream))
+#define ZERROR64(filefunc,filestream)             ((*((filefunc).zfile_func64.zerror_file))  ((filefunc).zfile_func64.opaque,filestream))
+
+MINIZIP_API voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
+MINIZIP_API long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
+MINIZIP_API ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
+
+MINIZIP_API void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32);
+
+#define ZOPEN64(filefunc,filename,mode)         (call_zopen64((&(filefunc)),(filename),(mode)))
+#define ZTELL64(filefunc,filestream)            (call_ztell64((&(filefunc)),(filestream)))
+#define ZSEEK64(filefunc,filestream,pos,mode)   (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/SrcLib/core/fwZip/include/minizip/iowin32.h b/SrcLib/core/fwZip/include/minizip/iowin32.h
new file mode 100644
index 0000000..4ce107d
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/iowin32.h
@@ -0,0 +1,32 @@
+/* iowin32.h -- IO base function header for compress/uncompress .zip
+     Version 1.1, February 14h, 2010
+     part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+*/
+#ifdef _WIN32
+
+#include <windows.h>
+
+#include "minizip/export.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MINIZIP_API void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+MINIZIP_API void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def));
+MINIZIP_API void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def));
+MINIZIP_API void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //_WIN32
diff --git a/SrcLib/core/fwZip/include/minizip/mztools.h b/SrcLib/core/fwZip/include/minizip/mztools.h
new file mode 100644
index 0000000..028a575
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/mztools.h
@@ -0,0 +1,31 @@
+/*
+  Additional tools for Minizip
+  Code: Xavier Roche '2004
+  License: Same as ZLIB (www.gzip.org)
+*/
+
+#ifndef _zip_tools_H
+#define _zip_tools_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include <zlib.h>
+#endif
+
+#include "minizip/unzip.h"
+
+/* Repair a ZIP file (missing central directory)
+   file: file to recover
+   fileOut: output file after recovery
+   fileOutTmp: temporary file name used for recovery
+*/
+extern MINIZIP_API int unzRepair(const char* file,
+                             const char* fileOut,
+                             const char* fileOutTmp,
+                             uLong* nRecovered,
+                             uLong* bytesRecovered);
+
+#endif
diff --git a/SrcLib/core/fwZip/include/minizip/unzip.h b/SrcLib/core/fwZip/include/minizip/unzip.h
new file mode 100644
index 0000000..b3be436
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/unzip.h
@@ -0,0 +1,439 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+   Version 1.1, February 14h, 2010
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications of Unzip for Zip64
+         Copyright (C) 2007-2008 Even Rouault
+
+         Modifications for Zip64 support on both zip and unzip
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+         ---------------------------------------------------------------------------------
+
+        Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  ---------------------------------------------------------------------------------
+
+        Changes
+
+        See header of unzip64.c
+
+*/
+
+#include "minizip/export.h"
+
+#ifndef _unz64_H
+#define _unz64_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include <zlib.h>
+#endif
+
+#ifndef  _ZLIBIOAPI_H
+#include "minizip/ioapi.h"
+#endif
+
+#ifdef HAVE_BZIP2
+#include <bzlib.h>
+#endif
+
+#define Z_BZIP2ED 12
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK                          (0)
+#define UNZ_END_OF_LIST_OF_FILE         (-100)
+#define UNZ_ERRNO                       (Z_ERRNO)
+#define UNZ_EOF                         (0)
+#define UNZ_PARAMERROR                  (-102)
+#define UNZ_BADZIPFILE                  (-103)
+#define UNZ_INTERNALERROR               (-104)
+#define UNZ_CRCERROR                    (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+   These data comes from the end of central dir */
+typedef struct unz_global_info64_s
+{
+    ZPOS64_T number_entry;         /* total number of entries in
+                                     the central dir on this disk */
+    uLong size_comment;         /* size of the global comment of the zipfile */
+} unz_global_info64;
+
+typedef struct unz_global_info_s
+{
+    uLong number_entry;         /* total number of entries in
+                                     the central dir on this disk */
+    uLong size_comment;         /* size of the global comment of the zipfile */
+} unz_global_info;
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info64_s
+{
+    uLong version;              /* version made by                 2 bytes */
+    uLong version_needed;       /* version needed to extract       2 bytes */
+    uLong flag;                 /* general purpose bit flag        2 bytes */
+    uLong compression_method;   /* compression method              2 bytes */
+    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */
+    uLong crc;                  /* crc-32                          4 bytes */
+    ZPOS64_T compressed_size;   /* compressed size                 8 bytes */
+    ZPOS64_T uncompressed_size; /* uncompressed size               8 bytes */
+    uLong size_filename;        /* filename length                 2 bytes */
+    uLong size_file_extra;      /* extra field length              2 bytes */
+    uLong size_file_comment;    /* file comment length             2 bytes */
+
+    uLong disk_num_start;       /* disk number start               2 bytes */
+    uLong internal_fa;          /* internal file attributes        2 bytes */
+    uLong external_fa;          /* external file attributes        4 bytes */
+
+    tm_unz tmu_date;
+} unz_file_info64;
+
+typedef struct unz_file_info_s
+{
+    uLong version;              /* version made by                 2 bytes */
+    uLong version_needed;       /* version needed to extract       2 bytes */
+    uLong flag;                 /* general purpose bit flag        2 bytes */
+    uLong compression_method;   /* compression method              2 bytes */
+    uLong dosDate;              /* last mod file date in Dos fmt   4 bytes */
+    uLong crc;                  /* crc-32                          4 bytes */
+    uLong compressed_size;      /* compressed size                 4 bytes */
+    uLong uncompressed_size;    /* uncompressed size               4 bytes */
+    uLong size_filename;        /* filename length                 2 bytes */
+    uLong size_file_extra;      /* extra field length              2 bytes */
+    uLong size_file_comment;    /* file comment length             2 bytes */
+
+    uLong disk_num_start;       /* disk number start               2 bytes */
+    uLong internal_fa;          /* internal file attributes        2 bytes */
+    uLong external_fa;          /* external file attributes        4 bytes */
+
+    tm_unz tmu_date;
+} unz_file_info;
+
+extern MINIZIP_API int unzStringFileNameCompare OF ((const char* fileName1,
+                                                 const char* fileName2,
+                                                 int iCaseSensitivity));
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+    (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern MINIZIP_API unzFile unzOpen OF((const char *path));
+extern MINIZIP_API unzFile unzOpen64 OF((const void *path));
+/*
+  Open a Zip file. path contain the full pathname (by example,
+     on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
+     "zlib/zlib113.zip".
+     If the zipfile cannot be opened (file don't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+     the "64" function take a const void* pointer, because the path is just the
+       value passed to the open64_file_func callback.
+     Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
+       is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char*
+       does not describe the reality
+*/
+
+
+extern MINIZIP_API unzFile unzOpen2 OF((const char *path,
+                                    zlib_filefunc_def* pzlib_filefunc_def));
+/*
+   Open a Zip file, like unzOpen, but provide a set of file low level API
+      for read/write the zip file (see ioapi.h)
+*/
+
+extern MINIZIP_API unzFile unzOpen2_64 OF((const void *path,
+                                    zlib_filefunc64_def* pzlib_filefunc_def));
+/*
+   Open a Zip file, like unz64Open, but provide a set of file low level API
+      for read/write the zip file (see ioapi.h)
+*/
+
+extern MINIZIP_API int unzClose OF((unzFile file));
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+
+extern MINIZIP_API int unzGetGlobalInfo OF((unzFile file,
+                                        unz_global_info *pglobal_info));
+
+extern MINIZIP_API int unzGetGlobalInfo64 OF((unzFile file,
+                                        unz_global_info64 *pglobal_info));
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+
+
+extern MINIZIP_API int unzGetGlobalComment OF((unzFile file,
+                                           char *szComment,
+                                           uLong uSizeBuf));
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern MINIZIP_API int unzGoToFirstFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+
+extern MINIZIP_API int unzGoToNextFile OF((unzFile file));
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern MINIZIP_API int unzLocateFile OF((unzFile file,
+                     const char *szFileName,
+                     int iCaseSensitivity));
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+    uLong pos_in_zip_directory;   /* offset in zip file directory */
+    uLong num_of_file;            /* # of file */
+} unz_file_pos;
+
+extern MINIZIP_API int unzGetFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+extern MINIZIP_API int unzGoToFilePos(
+    unzFile file,
+    unz_file_pos* file_pos);
+
+typedef struct unz64_file_pos_s
+{
+    ZPOS64_T pos_in_zip_directory;   /* offset in zip file directory */
+    ZPOS64_T num_of_file;            /* # of file */
+} unz64_file_pos;
+
+extern MINIZIP_API int unzGetFilePos64(
+    unzFile file,
+    unz64_file_pos* file_pos);
+
+extern MINIZIP_API int unzGoToFilePos64(
+    unzFile file,
+    const unz64_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern MINIZIP_API int unzGetCurrentFileInfo64 OF((unzFile file,
+                         unz_file_info64 *pfile_info,
+                         char *szFileName,
+                         uLong fileNameBufferSize,
+                         void *extraField,
+                         uLong extraFieldBufferSize,
+                         char *szComment,
+                         uLong commentBufferSize));
+
+extern MINIZIP_API int unzGetCurrentFileInfo OF((unzFile file,
+                         unz_file_info *pfile_info,
+                         char *szFileName,
+                         uLong fileNameBufferSize,
+                         void *extraField,
+                         uLong extraFieldBufferSize,
+                         char *szComment,
+                         uLong commentBufferSize));
+/*
+  Get Info about the current file
+  if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+        the current file
+  if szFileName!=NULL, the filemane string will be copied in szFileName
+            (fileNameBufferSize is the size of the buffer)
+  if extraField!=NULL, the extra field information will be copied in extraField
+            (extraFieldBufferSize is the size of the buffer).
+            This is the Central-header version of the extra field
+  if szComment!=NULL, the comment string of the file will be copied in szComment
+            (commentBufferSize is the size of the buffer)
+*/
+
+
+/** Addition for GDAL : START */
+
+extern MINIZIP_API ZPOS64_T unzGetCurrentFileZStreamPos64 OF((unzFile file));
+
+/** Addition for GDAL : END */
+
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+   from it, and close it (you can close it before reading all the file)
+   */
+
+extern MINIZIP_API int unzOpenCurrentFile OF((unzFile file));
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern MINIZIP_API  int unzOpenCurrentFilePassword OF((unzFile file,
+                                                  const char* password));
+/*
+  Open for reading data the current file in the zipfile.
+  password is a crypting password
+  If there is no error, the return value is UNZ_OK.
+*/
+
+extern MINIZIP_API  int unzOpenCurrentFile2 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+extern MINIZIP_API  int unzOpenCurrentFile3 OF((unzFile file,
+                                           int* method,
+                                           int* level,
+                                           int raw,
+                                           const char* password));
+/*
+  Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+    if raw==1
+  *method will receive method of compression, *level will receive level of
+     compression
+  note : you can set level parameter as NULL (if you did not want known level,
+         but you CANNOT set method parameter as NULL
+*/
+
+
+extern MINIZIP_API int unzCloseCurrentFile OF((unzFile file));
+/*
+  Close the file in zip opened with unzOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern MINIZIP_API int unzReadCurrentFile OF((unzFile file,
+                      voidp buf,
+                      unsigned len));
+/*
+  Read bytes from the current file (opened by unzOpenCurrentFile)
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t MINIZIP_API unztell OF((unzFile file));
+
+extern ZPOS64_T MINIZIP_API unztell64 OF((unzFile file));
+/*
+  Give the current position in uncompressed data
+*/
+
+extern MINIZIP_API int unzeof OF((unzFile file));
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern MINIZIP_API int unzGetLocalExtrafield OF((unzFile file,
+                                             voidp buf,
+                                             unsigned len));
+/*
+  Read extra field from the current file (opened by unzOpenCurrentFile)
+  This is the local-header version of the extra field (sometimes, there is
+    more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern MINIZIP_API ZPOS64_T unzGetOffset64 (unzFile file);
+extern MINIZIP_API uLong unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern MINIZIP_API int unzSetOffset64 (unzFile file, ZPOS64_T pos);
+extern MINIZIP_API int unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz64_H */
diff --git a/SrcLib/core/fwZip/include/minizip/zip.h b/SrcLib/core/fwZip/include/minizip/zip.h
new file mode 100644
index 0000000..a8d0af2
--- /dev/null
+++ b/SrcLib/core/fwZip/include/minizip/zip.h
@@ -0,0 +1,364 @@
+/* zip.h -- IO on .zip files using zlib
+   Version 1.1, February 14h, 2010
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+         ---------------------------------------------------------------------------
+
+   Condition of use and distribution are the same than zlib :
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+        ---------------------------------------------------------------------------
+
+        Changes
+
+        See header of zip.h
+
+*/
+
+#include "minizip/export.h"
+
+#ifndef _zip12_H
+#define _zip12_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//#define HAVE_BZIP2
+
+#ifndef _ZLIB_H
+#include <zlib.h>
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "minizip/ioapi.h"
+#endif
+
+#ifdef HAVE_BZIP2
+#include <bzlib.h>
+#endif
+
+#define Z_BZIP2ED 12
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+    from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK                          (0)
+#define ZIP_EOF                         (0)
+#define ZIP_ERRNO                       (Z_ERRNO)
+#define ZIP_PARAMERROR                  (-102)
+#define ZIP_BADZIPFILE                  (-103)
+#define ZIP_INTERNALERROR               (-104)
+
+#ifndef DEF_MEM_LEVEL
+#  if MAX_MEM_LEVEL >= 8
+#    define DEF_MEM_LEVEL 8
+#  else
+#    define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#  endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+    uInt tm_sec;            /* seconds after the minute - [0,59] */
+    uInt tm_min;            /* minutes after the hour - [0,59] */
+    uInt tm_hour;           /* hours since midnight - [0,23] */
+    uInt tm_mday;           /* day of the month - [1,31] */
+    uInt tm_mon;            /* months since January - [0,11] */
+    uInt tm_year;           /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+    tm_zip      tmz_date;       /* date in understandable format           */
+    uLong       dosDate;       /* if dos_date == 0, tmu_date is used      */
+/*    uLong       flag;        */   /* general purpose bit flag        2 bytes */
+
+    uLong       internal_fa;    /* internal file attributes        2 bytes */
+    uLong       external_fa;    /* external file attributes        4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE        (0)
+#define APPEND_STATUS_CREATEAFTER   (1)
+#define APPEND_STATUS_ADDINZIP      (2)
+
+extern MINIZIP_API zipFile zipOpen OF((const char *pathname, int append));
+extern MINIZIP_API zipFile zipOpen64 OF((const void *pathname, int append));
+/*
+  Create a zipfile.
+     pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
+       an Unix computer "zlib/zlib113.zip".
+     if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+       will be created at the end of the file.
+         (useful if the file contain a self extractor code)
+     if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+       add files in existing zip (be sure you don't add file that doesn't exist)
+     If the zipfile cannot be opened, the return value is NULL.
+     Else, the return value is a zipFile Handle, usable with other function
+       of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+   If you want delete file into a zipfile, you must open a zipfile, and create another
+   Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern MINIZIP_API zipFile zipOpen2 OF((const char *pathname,
+                                   int append,
+                                   zipcharpc* globalcomment,
+                                   zlib_filefunc_def* pzlib_filefunc_def));
+
+extern MINIZIP_API zipFile zipOpen2_64 OF((const void *pathname,
+                                   int append,
+                                   zipcharpc* globalcomment,
+                                   zlib_filefunc64_def* pzlib_filefunc_def));
+
+extern MINIZIP_API int zipOpenNewFileInZip OF((zipFile file,
+                       const char* filename,
+                       const zip_fileinfo* zipfi,
+                       const void* extrafield_local,
+                       uInt size_extrafield_local,
+                       const void* extrafield_global,
+                       uInt size_extrafield_global,
+                       const char* comment,
+                       int method,
+                       int level));
+
+extern MINIZIP_API int zipOpenNewFileInZip64 OF((zipFile file,
+                       const char* filename,
+                       const zip_fileinfo* zipfi,
+                       const void* extrafield_local,
+                       uInt size_extrafield_local,
+                       const void* extrafield_global,
+                       uInt size_extrafield_global,
+                       const char* comment,
+                       int method,
+                       int level,
+                       int zip64));
+
+/*
+  Open a file in the ZIP for writing.
+  filename : the filename in zip (if NULL, '-' without quote will be used
+  *zipfi contain supplemental information
+  if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+    contains the extrafield data the the local header
+  if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+    contains the extrafield data the the local header
+  if comment != NULL, comment contain the comment string
+  method contain the compression method (0 for store, Z_DEFLATED for deflate)
+  level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+  zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
+                    this MUST be '1' if the uncompressed size is >= 0xffffffff.
+
+*/
+
+
+extern MINIZIP_API int zipOpenNewFileInZip2 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw));
+
+
+extern MINIZIP_API int zipOpenNewFileInZip2_64 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int zip64));
+/*
+  Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern MINIZIP_API int zipOpenNewFileInZip3 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCrypting));
+
+extern MINIZIP_API int zipOpenNewFileInZip3_64 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCrypting,
+                                            int zip64
+                                            ));
+
+/*
+  Same than zipOpenNewFileInZip2, except
+    windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+    password : crypting password (NULL for no crypting)
+    crcForCrypting : crc of file to compress (needed for crypting)
+ */
+
+extern MINIZIP_API int zipOpenNewFileInZip4 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCrypting,
+                                            uLong versionMadeBy,
+                                            uLong flagBase
+                                            ));
+
+
+extern MINIZIP_API int zipOpenNewFileInZip4_64 OF((zipFile file,
+                                            const char* filename,
+                                            const zip_fileinfo* zipfi,
+                                            const void* extrafield_local,
+                                            uInt size_extrafield_local,
+                                            const void* extrafield_global,
+                                            uInt size_extrafield_global,
+                                            const char* comment,
+                                            int method,
+                                            int level,
+                                            int raw,
+                                            int windowBits,
+                                            int memLevel,
+                                            int strategy,
+                                            const char* password,
+                                            uLong crcForCrypting,
+                                            uLong versionMadeBy,
+                                            uLong flagBase,
+                                            int zip64
+                                            ));
+/*
+  Same than zipOpenNewFileInZip4, except
+    versionMadeBy : value for Version made by field
+    flag : value for flag field (compression level info will be added)
+ */
+
+
+extern MINIZIP_API int zipWriteInFileInZip OF((zipFile file,
+                       const void* buf,
+                       unsigned len));
+/*
+  Write data in the zipfile
+*/
+
+extern MINIZIP_API int zipCloseFileInZip OF((zipFile file));
+/*
+  Close the current file in the zipfile
+*/
+
+extern MINIZIP_API int zipCloseFileInZipRaw OF((zipFile file,
+                                            uLong uncompressed_size,
+                                            uLong crc32));
+
+extern MINIZIP_API int zipCloseFileInZipRaw64 OF((zipFile file,
+                                            ZPOS64_T uncompressed_size,
+                                            uLong crc32));
+
+/*
+  Close the current file in the zipfile, for file opened with
+    parameter raw=1 in zipOpenNewFileInZip2
+  uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern MINIZIP_API int zipClose OF((zipFile file,
+                const char* global_comment));
+/*
+  Close the zipfile
+*/
+
+
+extern MINIZIP_API int zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader));
+/*
+  zipRemoveExtraInfoBlock -  Added by Mathias Svensson
+
+  Remove extra information block from a extra information data for the local file header or central directory header
+
+  It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode.
+
+  0x0001 is the signature header for the ZIP64 extra information blocks
+
+  usage.
+                        Remove ZIP64 Extra information from a central director extra field data
+              zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001);
+
+                        Remove ZIP64 Extra information from a Local File Header extra field data
+        zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001);
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip64_H */
diff --git a/SrcLib/core/fwZip/src/fwZip/ReadDirArchive.cpp b/SrcLib/core/fwZip/src/fwZip/ReadDirArchive.cpp
new file mode 100644
index 0000000..0d9531b
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/ReadDirArchive.cpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwCore/exceptionmacros.hpp>
+
+#include "minizip/unzip.h"
+#include "fwZip/ReadDirArchive.hpp"
+#include "fwZip/exception/Read.hpp"
+
+namespace fwZip
+{
+
+//-----------------------------------------------------------------------------
+
+ReadDirArchive::ReadDirArchive( const ::boost::filesystem::path &archive ) :
+    m_archive(archive)
+{}
+
+//-----------------------------------------------------------------------------
+
+ReadDirArchive::~ReadDirArchive()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+SPTR(std::istream) ReadDirArchive::getFile(const ::boost::filesystem::path &path)
+{
+    FW_RAISE_EXCEPTION_IF(
+            ::fwZip::exception::Read("File '" +  path.string() + "' "
+                                     "in archive '" + m_archive.string() + "' doesn't exist."),
+             !this->exists(m_archive / path));
+
+    SPTR(std::ifstream) is = ::boost::make_shared< std::ifstream >();
+    is->open((m_archive / path).string().c_str(), std::fstream::binary | std::fstream::in);
+    return is;
+}
+
+//-----------------------------------------------------------------------------
+
+bool ReadDirArchive::exists(const ::boost::filesystem::path &path)
+{
+    return !::boost::filesystem::exists(m_archive / path);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path ReadDirArchive::getArchivePath() const
+{
+    return m_archive;
+}
+
+}
+
diff --git a/SrcLib/core/fwZip/src/fwZip/ReadZipArchive.cpp b/SrcLib/core/fwZip/src/fwZip/ReadZipArchive.cpp
new file mode 100644
index 0000000..1517359
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/ReadZipArchive.cpp
@@ -0,0 +1,115 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iosfwd>    // streamsize
+
+#include <boost/make_shared.hpp>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <boost/iostreams/stream.hpp>
+#include <boost/iostreams/categories.hpp>  // source_tag
+
+#include <fwCore/exceptionmacros.hpp>
+
+#include "minizip/unzip.h"
+#include "fwZip/ReadZipArchive.hpp"
+#include "fwZip/exception/Read.hpp"
+
+
+namespace fwZip
+{
+
+
+
+void * openReadZipArchive( const ::boost::filesystem::path &archive )
+{
+    FW_RAISE_EXCEPTION_IF(
+            ::fwZip::exception::Read("Archive '" + archive.string() + "' doesn't exist."),
+            !::boost::filesystem::exists(archive));
+
+    void * zip = unzOpen(archive.string().c_str());
+
+    FW_RAISE_EXCEPTION_IF(
+            ::fwZip::exception::Read("Archive '" + archive.string() + "' cannot be opened."),
+            zip == NULL);
+
+    return zip;
+}
+
+//-----------------------------------------------------------------------------
+
+class ZipSource
+{
+public:
+    typedef char char_type;
+    typedef ::boost::iostreams::source_tag  category;
+
+    ZipSource( const ::boost::filesystem::path &archive, const ::boost::filesystem::path &path ) :
+        m_zipDescriptor( openReadZipArchive(archive), &unzClose ),
+        m_archive(archive),
+        m_path(path)
+    {
+        int nRet = unzLocateFile(m_zipDescriptor.get(), path.string().c_str(), 0);
+
+        FW_RAISE_EXCEPTION_IF(
+                              ::fwZip::exception::Read("File '" +  path.string() + "' in archive '" +
+                                                       archive.string() + "' doesn't exist."),
+                              nRet != UNZ_OK);
+
+        nRet = unzOpenCurrentFile(m_zipDescriptor.get());
+        FW_RAISE_EXCEPTION_IF(
+                              ::fwZip::exception::Read("Cannot retrieve file '" + path.string() +
+                                                       "' in archive '"+ archive.string() + "'."),
+                              nRet != UNZ_OK);
+    }
+
+    std::streamsize read(char* s, std::streamsize n)
+    {
+        int nRet = unzReadCurrentFile(m_zipDescriptor.get(), s, n);
+        FW_RAISE_EXCEPTION_IF(
+                            ::fwZip::exception::Read("Error occurred while reading archive '" + m_archive.string()
+                                                     + ":" + m_path.string() + "'."),
+                            nRet < 0);
+        return nRet;
+    }
+
+protected:
+    SPTR(void) m_zipDescriptor;
+    ::boost::filesystem::path m_archive;
+    ::boost::filesystem::path m_path;
+};
+
+
+
+//-----------------------------------------------------------------------------
+
+ReadZipArchive::ReadZipArchive( const ::boost::filesystem::path &archive ) :
+    m_archive(archive)
+{}
+
+//-----------------------------------------------------------------------------
+
+SPTR(std::istream) ReadZipArchive::getFile(const ::boost::filesystem::path &path)
+{
+    SPTR(::boost::iostreams::stream<ZipSource>) is
+        = ::boost::make_shared< ::boost::iostreams::stream<ZipSource> >(m_archive, path);
+
+    return is;
+}
+
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path ReadZipArchive::getArchivePath() const
+{
+    return m_archive;
+}
+
+
+}
+
diff --git a/SrcLib/core/fwZip/src/fwZip/WriteDirArchive.cpp b/SrcLib/core/fwZip/src/fwZip/WriteDirArchive.cpp
new file mode 100644
index 0000000..ffedc25
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/WriteDirArchive.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fstream>
+
+#include <boost/make_shared.hpp>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <boost/iostreams/stream_buffer.hpp>
+
+#include <fwCore/exceptionmacros.hpp>
+
+#include "minizip/zip.h"
+#include "fwZip/WriteDirArchive.hpp"
+#include "fwZip/exception/Write.hpp"
+
+namespace fwZip
+{
+
+//-----------------------------------------------------------------------------
+
+WriteDirArchive::WriteDirArchive( const ::boost::filesystem::path &archive ) :
+    m_archive(archive)
+{
+    if(!::boost::filesystem::exists(m_archive))
+    {
+        ::boost::filesystem::create_directories(m_archive);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+WriteDirArchive::~WriteDirArchive()
+{}
+
+//-----------------------------------------------------------------------------
+
+SPTR(std::ostream) WriteDirArchive::createFile(const ::boost::filesystem::path &path)
+{
+    const ::boost::filesystem::path file = m_archive / path;
+    const ::boost::filesystem::path parentFile = file.parent_path();
+    if(!::boost::filesystem::exists(parentFile))
+    {
+        ::boost::filesystem::create_directories(parentFile);
+    }
+
+    SPTR(std::ofstream) os = ::boost::make_shared< std::ofstream >();
+    os->open(file.string().c_str(), std::fstream::binary | std::fstream::out | std::fstream::trunc);
+    return os;
+}
+
+//-----------------------------------------------------------------------------
+
+void WriteDirArchive::putFile(const ::boost::filesystem::path &sourceFile, const ::boost::filesystem::path &path)
+{
+    const ::boost::filesystem::path fileDest = m_archive / path;
+    if (! ::boost::filesystem::exists(fileDest))
+    {
+        const ::boost::filesystem::path parentFile = fileDest.parent_path();
+        if(!::boost::filesystem::exists(parentFile))
+        {
+            ::boost::filesystem::create_directories(parentFile);
+        }
+
+        ::boost::system::error_code err;
+        ::boost::filesystem::create_hard_link( sourceFile, fileDest, err );
+        if (err.value() != 0)
+        {
+            ::boost::filesystem::copy_file( sourceFile, fileDest );
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+bool WriteDirArchive::createDir(const ::boost::filesystem::path &path)
+{
+    return ::boost::filesystem::create_directories(m_archive/path);
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path WriteDirArchive::getArchivePath() const
+{
+    return m_archive;
+}
+
+
+}
+
diff --git a/SrcLib/core/fwZip/src/fwZip/WriteZipArchive.cpp b/SrcLib/core/fwZip/src/fwZip/WriteZipArchive.cpp
new file mode 100644
index 0000000..1b2db6e
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/WriteZipArchive.cpp
@@ -0,0 +1,194 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iosfwd>    // streamsize
+#include <fstream>
+
+#include <boost/make_shared.hpp>
+
+#include <boost/iostreams/stream.hpp>
+#include <boost/iostreams/stream_buffer.hpp>
+#include <boost/iostreams/categories.hpp>  // sink_tag
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/posix_time/conversion.hpp>
+
+#include <fwCore/exceptionmacros.hpp>
+
+#include "minizip/zip.h"
+#include "fwZip/WriteZipArchive.hpp"
+#include "fwZip/exception/Write.hpp"
+
+
+namespace fwZip
+{
+
+//-----------------------------------------------------------------------------
+
+zipFile openWriteZipArchive( const ::boost::filesystem::path &archive )
+{
+    int append = (::boost::filesystem::exists(archive)) ? APPEND_STATUS_ADDINZIP : APPEND_STATUS_CREATE;
+    zipFile zip = zipOpen(archive.string().c_str(), append);
+
+    FW_RAISE_EXCEPTION_IF(
+                ::fwZip::exception::Write("Archive '" + archive.string() + "' cannot be opened."),
+                 zip == NULL);
+
+    return zip;
+}
+
+//-----------------------------------------------------------------------------
+
+/*
+ * @brief  Open a file in the zip archive for writing
+ * @note Z_BEST_SPEED compression level for '.raw' files,
+ *       Z_NO_COMPRESSION for 'raw.gz', Z_DEFAULT_COMPRESSION otherwise.
+ */
+int openFile(zipFile zipDescriptor, const ::boost::filesystem::path &path)
+{
+    const std::string extension = path.extension().string();
+    int compressLevel = Z_DEFAULT_COMPRESSION;
+    if(extension == ".raw")
+    {
+        compressLevel = Z_BEST_SPEED;
+    }
+    else if(extension == ".raw.gz")
+    {
+        compressLevel = Z_NO_COMPRESSION;
+    }
+    zip_fileinfo zfi;
+    zfi.internal_fa = 0;
+    zfi.external_fa = 0;// @todo FIXME
+
+    ::boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
+    std::tm ptm = ::boost::posix_time::to_tm(now);
+    zfi.dosDate = 0;
+    zfi.tmz_date.tm_year = ptm.tm_year;
+    zfi.tmz_date.tm_mon  = ptm.tm_mon;
+    zfi.tmz_date.tm_mday = ptm.tm_mday;
+    zfi.tmz_date.tm_hour = ptm.tm_hour;
+    zfi.tmz_date.tm_min  = ptm.tm_min;
+    zfi.tmz_date.tm_sec  = ptm.tm_sec;
+
+    int nRet = zipOpenNewFileInZip(zipDescriptor,
+            path.generic_string().c_str(),
+            &zfi,
+            NULL,
+            0,
+            NULL,
+            0,
+            NULL,
+            Z_DEFLATED,
+            compressLevel);
+
+    return nRet;
+}
+
+//-----------------------------------------------------------------------------
+
+void closeZipArchive(zipFile zipDescriptor)
+{
+    zipClose(zipDescriptor, NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+class ZipSink
+{
+public:
+    typedef char char_type;
+    typedef ::boost::iostreams::sink_tag  category;
+
+    ZipSink( const ::boost::filesystem::path &archive, const ::boost::filesystem::path &path ) :
+        m_zipDescriptor( openWriteZipArchive(archive), &closeZipArchive ),
+        m_archive(archive),
+        m_path(path)
+    {
+        int nRet = openFile(m_zipDescriptor.get(), m_path);
+        FW_RAISE_EXCEPTION_IF(
+                              ::fwZip::exception::Write("Cannot open file '" + path.string() +
+                                                       "' in archive '"+ archive.string() + "'."),
+                              nRet != Z_OK);
+    }
+
+    std::streamsize write(const char* s, std::streamsize n)
+    {
+        int nRet = zipWriteInFileInZip(m_zipDescriptor.get(), s, n);
+        FW_RAISE_EXCEPTION_IF(
+                        ::fwZip::exception::Write("Error occurred while writing archive '" + m_archive.string()
+                                                     + ":" + m_path.string() + "'."),
+                         nRet < 0);
+        return n;
+    }
+
+protected:
+    SPTR(void) m_zipDescriptor;
+    ::boost::filesystem::path m_archive;
+    ::boost::filesystem::path m_path;
+};
+
+//-----------------------------------------------------------------------------
+
+WriteZipArchive::WriteZipArchive( const ::boost::filesystem::path &archive ) :
+    m_archive(archive)
+{}
+
+//-----------------------------------------------------------------------------
+
+WriteZipArchive::~WriteZipArchive()
+{}
+
+//-----------------------------------------------------------------------------
+
+SPTR(std::ostream) WriteZipArchive::createFile(const ::boost::filesystem::path &path)
+{
+    SPTR(::boost::iostreams::stream<ZipSink>) os
+        = ::boost::make_shared< ::boost::iostreams::stream<ZipSink> >(m_archive, path);
+    return os;
+}
+
+//-----------------------------------------------------------------------------
+
+void WriteZipArchive::putFile(const ::boost::filesystem::path &sourceFile, const ::boost::filesystem::path &path)
+{
+    std::ifstream is(sourceFile.string().c_str(), std::ios::binary);
+    FW_RAISE_EXCEPTION_IF(::fwZip::exception::Write("Source file '" + sourceFile.string() + "' cannot be opened."),
+                         !is.good());
+
+    {
+        SPTR(std::ostream) os = this->createFile(path);
+        *os << is.rdbuf();
+    }
+    is.close();
+}
+
+//-----------------------------------------------------------------------------
+
+bool WriteZipArchive::createDir(const ::boost::filesystem::path &path)
+{
+    zipFile zipDescriptor = openWriteZipArchive(m_archive);
+    const int nRet = openFile(zipDescriptor, path);
+
+    zipCloseFileInZip(zipDescriptor);
+    zipClose(zipDescriptor, NULL);
+
+    return nRet == ZIP_OK;
+}
+
+//-----------------------------------------------------------------------------
+
+const ::boost::filesystem::path WriteZipArchive::getArchivePath() const
+{
+    return m_archive;
+}
+
+//-----------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/core/fwZip/src/fwZip/exception/Read.cpp b/SrcLib/core/fwZip/src/fwZip/exception/Read.cpp
new file mode 100644
index 0000000..430a954
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/exception/Read.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/exception/Read.hpp"
+
+namespace fwZip
+{
+
+namespace exception
+{
+
+Read::Read ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwZip
+
diff --git a/SrcLib/core/fwZip/src/fwZip/exception/Write.cpp b/SrcLib/core/fwZip/src/fwZip/exception/Write.cpp
new file mode 100644
index 0000000..d22c8b6
--- /dev/null
+++ b/SrcLib/core/fwZip/src/fwZip/exception/Write.cpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/Exception.hpp>
+
+#include "fwZip/config.hpp"
+#include "fwZip/exception/Write.hpp"
+
+namespace fwZip
+{
+
+namespace exception
+{
+
+Write::Write ( const std::string &err ) : ::fwCore::Exception(err)
+{}
+
+} // namespace exception
+
+} // namespace fwZip
+
diff --git a/SrcLib/core/fwZip/src/minizip/ioapi.c b/SrcLib/core/fwZip/src/minizip/ioapi.c
new file mode 100644
index 0000000..5469bff
--- /dev/null
+++ b/SrcLib/core/fwZip/src/minizip/ioapi.c
@@ -0,0 +1,247 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+*/
+
+#if (defined(_WIN32))
+        #define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#ifdef __APPLE__
+// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+#define FTELLO_FUNC(stream) ftello(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
+#else
+#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
+#define FTELLO_FUNC(stream) ftello64(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
+#endif
+
+
+#include "minizip/ioapi.h"
+
+voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
+{
+    if (pfilefunc->zfile_func64.zopen64_file != NULL)
+        return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
+    else
+    {
+        return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
+    }
+}
+
+long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
+{
+    if (pfilefunc->zfile_func64.zseek64_file != NULL)
+        return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
+    else
+    {
+        uLong offsetTruncated = (uLong)offset;
+        if (offsetTruncated != offset)
+            return -1;
+        else
+            return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
+    }
+}
+
+ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
+{
+    if (pfilefunc->zfile_func64.zseek64_file != NULL)
+        return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
+    else
+    {
+        uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
+        if ((tell_uLong) == ((uLong)-1))
+            return (ZPOS64_T)-1;
+        else
+            return tell_uLong;
+    }
+}
+
+void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
+{
+    p_filefunc64_32->zfile_func64.zopen64_file = NULL;
+    p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
+    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
+    p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
+    p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
+    p_filefunc64_32->zfile_func64.ztell64_file = NULL;
+    p_filefunc64_32->zfile_func64.zseek64_file = NULL;
+    p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
+    p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
+    p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
+    p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
+    p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
+}
+
+
+
+static voidpf  ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
+static uLong   ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+static uLong   ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
+static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
+static long    ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+static int     ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
+static int     ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
+
+static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
+{
+    FILE* file = NULL;
+    const char* mode_fopen = NULL;
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+        mode_fopen = "rb";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+        mode_fopen = "r+b";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+        mode_fopen = "wb";
+
+    if ((filename!=NULL) && (mode_fopen != NULL))
+        file = fopen(filename, mode_fopen);
+    return file;
+}
+
+static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
+{
+    FILE* file = NULL;
+    const char* mode_fopen = NULL;
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+        mode_fopen = "rb";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+        mode_fopen = "r+b";
+    else
+    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+        mode_fopen = "wb";
+
+    if ((filename!=NULL) && (mode_fopen != NULL))
+        file = FOPEN_FUNC((const char*)filename, mode_fopen);
+    return file;
+}
+
+
+static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
+{
+    uLong ret;
+    ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
+    return ret;
+}
+
+static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
+{
+    uLong ret;
+    ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
+    return ret;
+}
+
+static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
+{
+    long ret;
+    ret = ftell((FILE *)stream);
+    return ret;
+}
+
+
+static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
+{
+    ZPOS64_T ret;
+    ret = FTELLO_FUNC((FILE *)stream);
+    return ret;
+}
+
+static long ZCALLBACK fseek_file_func (voidpf  opaque, voidpf stream, uLong offset, int origin)
+{
+    int fseek_origin=0;
+    long ret;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        fseek_origin = SEEK_CUR;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        fseek_origin = SEEK_END;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        fseek_origin = SEEK_SET;
+        break;
+    default: return -1;
+    }
+    ret = 0;
+    if (fseek((FILE *)stream, offset, fseek_origin) != 0)
+        ret = -1;
+    return ret;
+}
+
+static long ZCALLBACK fseek64_file_func (voidpf  opaque, voidpf stream, ZPOS64_T offset, int origin)
+{
+    int fseek_origin=0;
+    long ret;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        fseek_origin = SEEK_CUR;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        fseek_origin = SEEK_END;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        fseek_origin = SEEK_SET;
+        break;
+    default: return -1;
+    }
+    ret = 0;
+
+    if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0)
+                        ret = -1;
+
+    return ret;
+}
+
+
+static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
+{
+    int ret;
+    ret = fclose((FILE *)stream);
+    return ret;
+}
+
+static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
+{
+    int ret;
+    ret = ferror((FILE *)stream);
+    return ret;
+}
+
+void fill_fopen_filefunc (pzlib_filefunc_def)
+  zlib_filefunc_def* pzlib_filefunc_def;
+{
+    pzlib_filefunc_def->zopen_file = fopen_file_func;
+    pzlib_filefunc_def->zread_file = fread_file_func;
+    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+    pzlib_filefunc_def->ztell_file = ftell_file_func;
+    pzlib_filefunc_def->zseek_file = fseek_file_func;
+    pzlib_filefunc_def->zclose_file = fclose_file_func;
+    pzlib_filefunc_def->zerror_file = ferror_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
+
+void fill_fopen64_filefunc (zlib_filefunc64_def*  pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen64_file = fopen64_file_func;
+    pzlib_filefunc_def->zread_file = fread_file_func;
+    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+    pzlib_filefunc_def->ztell64_file = ftell64_file_func;
+    pzlib_filefunc_def->zseek64_file = fseek64_file_func;
+    pzlib_filefunc_def->zclose_file = fclose_file_func;
+    pzlib_filefunc_def->zerror_file = ferror_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
diff --git a/SrcLib/core/fwZip/src/minizip/iowin32.c b/SrcLib/core/fwZip/src/minizip/iowin32.c
new file mode 100644
index 0000000..1f22a31
--- /dev/null
+++ b/SrcLib/core/fwZip/src/minizip/iowin32.c
@@ -0,0 +1,392 @@
+/* iowin32.c -- IO base function header for compress/uncompress .zip
+     Version 1.1, February 14h, 2010
+     part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+     For more info read MiniZip_info.txt
+
+*/
+#ifdef _WIN32
+
+#include <stdlib.h>
+
+#include <zlib.h>
+#include "minizip/ioapi.h"
+#include "minizip/iowin32.h"
+
+#ifndef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
+#endif
+
+#ifndef INVALID_SET_FILE_POINTER
+#define INVALID_SET_FILE_POINTER ((DWORD)-1)
+#endif
+
+voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
+uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+uLong   ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+ZPOS64_T ZCALLBACK win32_tell64_file_func  OF((voidpf opaque, voidpf stream));
+long    ZCALLBACK win32_seek64_file_func  OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+int     ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream));
+int     ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream));
+
+typedef struct
+{
+    HANDLE hf;
+    int error;
+} WIN32FILE_IOWIN;
+
+
+static void win32_translate_open_mode(int mode,
+                                      DWORD* lpdwDesiredAccess,
+                                      DWORD* lpdwCreationDisposition,
+                                      DWORD* lpdwShareMode,
+                                      DWORD* lpdwFlagsAndAttributes)
+{
+    *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
+
+    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+    {
+        *lpdwDesiredAccess = GENERIC_READ;
+        *lpdwCreationDisposition = OPEN_EXISTING;
+        *lpdwShareMode = FILE_SHARE_READ;
+    }
+    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+    {
+        *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+        *lpdwCreationDisposition = OPEN_EXISTING;
+    }
+    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+    {
+        *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+        *lpdwCreationDisposition = CREATE_ALWAYS;
+    }
+}
+
+static voidpf win32_build_iowin(HANDLE hFile)
+{
+    voidpf ret=NULL;
+
+    if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
+    {
+        WIN32FILE_IOWIN w32fiow;
+        w32fiow.hf = hFile;
+        w32fiow.error = 0;
+        ret = malloc(sizeof(WIN32FILE_IOWIN));
+
+        if (ret==NULL)
+            CloseHandle(hFile);
+        else
+            *((WIN32FILE_IOWIN*)ret) = w32fiow;
+    }
+    return ret;
+}
+
+voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode)
+{
+    const char* mode_fopen = NULL;
+    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+    HANDLE hFile = NULL;
+
+    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+    if ((filename!=NULL) && (dwDesiredAccess != 0))
+        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+    return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode)
+{
+    const char* mode_fopen = NULL;
+    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+    HANDLE hFile = NULL;
+
+    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+    if ((filename!=NULL) && (dwDesiredAccess != 0))
+        hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+    return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode)
+{
+    const char* mode_fopen = NULL;
+    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+    HANDLE hFile = NULL;
+
+    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+    if ((filename!=NULL) && (dwDesiredAccess != 0))
+        hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+    return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode)
+{
+    const char* mode_fopen = NULL;
+    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+    HANDLE hFile = NULL;
+
+    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+    if ((filename!=NULL) && (dwDesiredAccess != 0))
+        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+
+    return win32_build_iowin(hFile);
+}
+
+
+uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size)
+{
+    uLong ret=0;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+    if (hFile != NULL)
+    {
+        if (!ReadFile(hFile, buf, size, &ret, NULL))
+        {
+            DWORD dwErr = GetLastError();
+            if (dwErr == ERROR_HANDLE_EOF)
+                dwErr = 0;
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+        }
+    }
+
+    return ret;
+}
+
+
+uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size)
+{
+    uLong ret=0;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+    if (hFile != NULL)
+    {
+        if (!WriteFile(hFile, buf, size, &ret, NULL))
+        {
+            DWORD dwErr = GetLastError();
+            if (dwErr == ERROR_HANDLE_EOF)
+                dwErr = 0;
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+        }
+    }
+
+    return ret;
+}
+
+long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream)
+{
+    long ret=-1;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+    if (hFile != NULL)
+    {
+        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
+        if (dwSet == INVALID_SET_FILE_POINTER)
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = -1;
+        }
+        else
+            ret=(long)dwSet;
+    }
+    return ret;
+}
+
+ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream)
+{
+    ZPOS64_T ret= (ZPOS64_T)-1;
+    HANDLE hFile = NULL;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream)->hf;
+
+    if (hFile)
+    {
+        LARGE_INTEGER li;
+        li.QuadPart = 0;
+        li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT);
+        if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = (ZPOS64_T)-1;
+        }
+        else
+            ret=li.QuadPart;
+    }
+    return ret;
+}
+
+
+long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin)
+{
+    DWORD dwMoveMethod=0xFFFFFFFF;
+    HANDLE hFile = NULL;
+
+    long ret=-1;
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+    switch (origin)
+    {
+    case ZLIB_FILEFUNC_SEEK_CUR :
+        dwMoveMethod = FILE_CURRENT;
+        break;
+    case ZLIB_FILEFUNC_SEEK_END :
+        dwMoveMethod = FILE_END;
+        break;
+    case ZLIB_FILEFUNC_SEEK_SET :
+        dwMoveMethod = FILE_BEGIN;
+        break;
+    default: return -1;
+    }
+
+    if (hFile != NULL)
+    {
+        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
+        if (dwSet == INVALID_SET_FILE_POINTER)
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = -1;
+        }
+        else
+            ret=0;
+    }
+    return ret;
+}
+
+long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin)
+{
+    DWORD dwMoveMethod=0xFFFFFFFF;
+    HANDLE hFile = NULL;
+    long ret=-1;
+
+    if (stream!=NULL)
+        hFile = ((WIN32FILE_IOWIN*)stream)->hf;
+
+    switch (origin)
+    {
+        case ZLIB_FILEFUNC_SEEK_CUR :
+            dwMoveMethod = FILE_CURRENT;
+            break;
+        case ZLIB_FILEFUNC_SEEK_END :
+            dwMoveMethod = FILE_END;
+            break;
+        case ZLIB_FILEFUNC_SEEK_SET :
+            dwMoveMethod = FILE_BEGIN;
+            break;
+        default: return -1;
+    }
+
+    if (hFile)
+    {
+        LARGE_INTEGER* li = (LARGE_INTEGER*)&offset;
+        DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod);
+        if (dwSet == INVALID_SET_FILE_POINTER)
+        {
+            DWORD dwErr = GetLastError();
+            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+            ret = -1;
+        }
+        else
+            ret=0;
+    }
+    return ret;
+}
+
+int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream)
+{
+    int ret=-1;
+
+    if (stream!=NULL)
+    {
+        HANDLE hFile;
+        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+        if (hFile != NULL)
+        {
+            CloseHandle(hFile);
+            ret=0;
+        }
+        free(stream);
+    }
+    return ret;
+}
+
+int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream)
+{
+    int ret=-1;
+    if (stream!=NULL)
+    {
+        ret = ((WIN32FILE_IOWIN*)stream) -> error;
+    }
+    return ret;
+}
+
+void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen_file = win32_open_file_func;
+    pzlib_filefunc_def->zread_file = win32_read_file_func;
+    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+    pzlib_filefunc_def->ztell_file = win32_tell_file_func;
+    pzlib_filefunc_def->zseek_file = win32_seek_file_func;
+    pzlib_filefunc_def->zclose_file = win32_close_file_func;
+    pzlib_filefunc_def->zerror_file = win32_error_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
+
+void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
+    pzlib_filefunc_def->zread_file = win32_read_file_func;
+    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+    pzlib_filefunc_def->zclose_file = win32_close_file_func;
+    pzlib_filefunc_def->zerror_file = win32_error_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
+
+
+void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
+    pzlib_filefunc_def->zread_file = win32_read_file_func;
+    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+    pzlib_filefunc_def->zclose_file = win32_close_file_func;
+    pzlib_filefunc_def->zerror_file = win32_error_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
+
+
+void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+    pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
+    pzlib_filefunc_def->zread_file = win32_read_file_func;
+    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+    pzlib_filefunc_def->zclose_file = win32_close_file_func;
+    pzlib_filefunc_def->zerror_file = win32_error_file_func;
+    pzlib_filefunc_def->opaque = NULL;
+}
+
+#endif // _WIN32
diff --git a/SrcLib/core/fwZip/src/minizip/mztools.c b/SrcLib/core/fwZip/src/minizip/mztools.c
new file mode 100644
index 0000000..bf40d89
--- /dev/null
+++ b/SrcLib/core/fwZip/src/minizip/mztools.c
@@ -0,0 +1,283 @@
+/*
+  Additional tools for Minizip
+  Code: Xavier Roche '2004
+  License: Same as ZLIB (www.gzip.org)
+*/
+
+/* Code */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+
+#include "minizip/export.h"
+#include "minizip/unzip.h"
+
+#define READ_8(adr)  ((unsigned char)*(adr))
+#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
+#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
+
+#define WRITE_8(buff, n) do { \
+  *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
+} while(0)
+#define WRITE_16(buff, n) do { \
+  WRITE_8((unsigned char*)(buff), n); \
+  WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
+} while(0)
+#define WRITE_32(buff, n) do { \
+  WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
+  WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
+} while(0)
+
+extern int MINIZIP_API unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
+const char* file;
+const char* fileOut;
+const char* fileOutTmp;
+uLong* nRecovered;
+uLong* bytesRecovered;
+{
+  int err = Z_OK;
+  FILE* fpZip = fopen(file, "rb");
+  FILE* fpOut = fopen(fileOut, "wb");
+  FILE* fpOutCD = fopen(fileOutTmp, "wb");
+  if (fpZip != NULL &&  fpOut != NULL) {
+    int entries = 0;
+    uLong totalBytes = 0;
+    char header[30];
+    char filename[256];
+    char extra[1024];
+    int offset = 0;
+    int offsetCD = 0;
+    while ( fread(header, 1, 30, fpZip) == 30 ) {
+      int currentOffset = offset;
+
+      /* File entry */
+      if (READ_32(header) == 0x04034b50) {
+        unsigned int version = READ_16(header + 4);
+        unsigned int gpflag = READ_16(header + 6);
+        unsigned int method = READ_16(header + 8);
+        unsigned int filetime = READ_16(header + 10);
+        unsigned int filedate = READ_16(header + 12);
+        unsigned int crc = READ_32(header + 14); /* crc */
+        unsigned int cpsize = READ_32(header + 18); /* compressed size */
+        unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */
+        unsigned int fnsize = READ_16(header + 26); /* file name length */
+        unsigned int extsize = READ_16(header + 28); /* extra field length */
+        filename[0] = extra[0] = '\0';
+
+        /* Header */
+        if (fwrite(header, 1, 30, fpOut) == 30) {
+          offset += 30;
+        } else {
+          err = Z_ERRNO;
+          break;
+        }
+
+        /* Filename */
+        if (fnsize > 0) {
+          if (fread(filename, 1, fnsize, fpZip) == fnsize) {
+            if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
+              offset += fnsize;
+            } else {
+              err = Z_ERRNO;
+              break;
+            }
+          } else {
+            err = Z_ERRNO;
+            break;
+          }
+        } else {
+          err = Z_STREAM_ERROR;
+          break;
+        }
+
+        /* Extra field */
+        if (extsize > 0) {
+          if (fread(extra, 1, extsize, fpZip) == extsize) {
+            if (fwrite(extra, 1, extsize, fpOut) == extsize) {
+              offset += extsize;
+            } else {
+              err = Z_ERRNO;
+              break;
+            }
+          } else {
+            err = Z_ERRNO;
+            break;
+          }
+        }
+
+        /* Data */
+        {
+          int dataSize = cpsize;
+          if (dataSize == 0) {
+            dataSize = uncpsize;
+          }
+          if (dataSize > 0) {
+            char* data = malloc(dataSize);
+            if (data != NULL) {
+              if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {
+                if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {
+                  offset += dataSize;
+                  totalBytes += dataSize;
+                } else {
+                  err = Z_ERRNO;
+                }
+              } else {
+                err = Z_ERRNO;
+              }
+              free(data);
+              if (err != Z_OK) {
+                break;
+              }
+            } else {
+              err = Z_MEM_ERROR;
+              break;
+            }
+          }
+        }
+
+        /* Central directory entry */
+        {
+          char header[46];
+          char* comment = "";
+          int comsize = (int) strlen(comment);
+          WRITE_32(header, 0x02014b50);
+          WRITE_16(header + 4, version);
+          WRITE_16(header + 6, version);
+          WRITE_16(header + 8, gpflag);
+          WRITE_16(header + 10, method);
+          WRITE_16(header + 12, filetime);
+          WRITE_16(header + 14, filedate);
+          WRITE_32(header + 16, crc);
+          WRITE_32(header + 20, cpsize);
+          WRITE_32(header + 24, uncpsize);
+          WRITE_16(header + 28, fnsize);
+          WRITE_16(header + 30, extsize);
+          WRITE_16(header + 32, comsize);
+          WRITE_16(header + 34, 0);     /* disk # */
+          WRITE_16(header + 36, 0);     /* int attrb */
+          WRITE_32(header + 38, 0);     /* ext attrb */
+          WRITE_32(header + 42, currentOffset);
+          /* Header */
+          if (fwrite(header, 1, 46, fpOutCD) == 46) {
+            offsetCD += 46;
+
+            /* Filename */
+            if (fnsize > 0) {
+              if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
+                offsetCD += fnsize;
+              } else {
+                err = Z_ERRNO;
+                break;
+              }
+            } else {
+              err = Z_STREAM_ERROR;
+              break;
+            }
+
+            /* Extra field */
+            if (extsize > 0) {
+              if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
+                offsetCD += extsize;
+              } else {
+                err = Z_ERRNO;
+                break;
+              }
+            }
+
+            /* Comment field */
+            if (comsize > 0) {
+              if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
+                offsetCD += comsize;
+              } else {
+                err = Z_ERRNO;
+                break;
+              }
+            }
+
+
+          } else {
+            err = Z_ERRNO;
+            break;
+          }
+        }
+
+        /* Success */
+        entries++;
+
+      } else {
+        break;
+      }
+    }
+
+    /* Final central directory  */
+    {
+      int entriesZip = entries;
+      char header[22];
+      char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
+      int comsize = (int) strlen(comment);
+      if (entriesZip > 0xffff) {
+        entriesZip = 0xffff;
+      }
+      WRITE_32(header, 0x06054b50);
+      WRITE_16(header + 4, 0);    /* disk # */
+      WRITE_16(header + 6, 0);    /* disk # */
+      WRITE_16(header + 8, entriesZip);   /* hack */
+      WRITE_16(header + 10, entriesZip);  /* hack */
+      WRITE_32(header + 12, offsetCD);    /* size of CD */
+      WRITE_32(header + 16, offset);      /* offset to CD */
+      WRITE_16(header + 20, comsize);     /* comment */
+
+      /* Header */
+      if (fwrite(header, 1, 22, fpOutCD) == 22) {
+
+        /* Comment field */
+        if (comsize > 0) {
+          if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
+            err = Z_ERRNO;
+          }
+        }
+
+      } else {
+        err = Z_ERRNO;
+      }
+    }
+
+    /* Final merge (file + central directory) */
+    fclose(fpOutCD);
+    if (err == Z_OK) {
+      fpOutCD = fopen(fileOutTmp, "rb");
+      if (fpOutCD != NULL) {
+        int nRead;
+        char buffer[8192];
+        while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {
+          if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {
+            err = Z_ERRNO;
+            break;
+          }
+        }
+        fclose(fpOutCD);
+      }
+    }
+
+    /* Close */
+    fclose(fpZip);
+    fclose(fpOut);
+
+    /* Wipe temporary file */
+    (void)remove(fileOutTmp);
+
+    /* Number of recovered entries */
+    if (err == Z_OK) {
+      if (nRecovered != NULL) {
+        *nRecovered = entries;
+      }
+      if (bytesRecovered != NULL) {
+        *bytesRecovered = totalBytes;
+      }
+    }
+  } else {
+    err = Z_STREAM_ERROR;
+  }
+  return err;
+}
diff --git a/SrcLib/core/fwZip/src/minizip/unzip.c b/SrcLib/core/fwZip/src/minizip/unzip.c
new file mode 100644
index 0000000..541f2f3
--- /dev/null
+++ b/SrcLib/core/fwZip/src/minizip/unzip.c
@@ -0,0 +1,2125 @@
+/* unzip.c -- IO for uncompress .zip files using zlib
+   Version 1.1, February 14h, 2010
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications of Unzip for Zip64
+         Copyright (C) 2007-2008 Even Rouault
+
+         Modifications for Zip64 support on both zip and unzip
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+
+  ------------------------------------------------------------------------------------
+  Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+  compatibility with older software. The following is from the original crypt.c.
+  Code woven in by Terry Thorsen 1/2003.
+
+  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
+
+  See the accompanying file LICENSE, version 2000-Apr-09 or later
+  (the contents of which are also included in zip.h) for terms of use.
+  If, for some reason, all these files are missing, the Info-ZIP license
+  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
+
+        crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
+
+  The encryption/decryption parts of this source code (as opposed to the
+  non-echoing password parts) were originally written in Europe.  The
+  whole source package can be freely distributed, including from the USA.
+  (Prior to January 2000, re-export from the US was a violation of US law.)
+
+        This encryption code is a direct transcription of the algorithm from
+  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
+  file (appnote.txt) is distributed with the PKZIP program (even in the
+  version without encryption capabilities).
+
+        ------------------------------------------------------------------------------------
+
+        Changes in unzip.c
+
+        2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
+  2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
+  2007-2008 - Even Rouault - Remove old C style function prototypes
+  2007-2008 - Even Rouault - Add unzip support for ZIP64
+
+        Copyright (C) 2007-2008 Even Rouault
+
+
+        Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
+  Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
+                                should only read the compressed/uncompressed size from the Zip64 format if
+                                the size from normal header was 0xFFFFFFFF
+  Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
+        Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
+                                Patch created by Daniel Borca
+
+  Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
+
+  Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef NOUNCRYPT
+        #define NOUNCRYPT
+#endif
+
+#include <zlib.h>
+#include "minizip/unzip.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+#    define CASESENSITIVITYDEFAULT_NO
+#  endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+const char unz_copyright[] =
+   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info64_internal_s
+{
+    ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
+} unz_file_info64_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+    when reading and decompress it */
+typedef struct
+{
+    char  *read_buffer;         /* internal buffer for compressed data */
+    z_stream stream;            /* zLib stream structure for inflate */
+
+#ifdef HAVE_BZIP2
+    bz_stream bstream;          /* bzLib stream structure for bziped */
+#endif
+
+    ZPOS64_T pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
+    uLong stream_initialised;   /* flag set if stream structure is initialised*/
+
+    ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
+    uInt  size_local_extrafield;/* size of the local extra field */
+    ZPOS64_T pos_local_extrafield;   /* position in the local extra field in read*/
+    ZPOS64_T total_out_64;
+
+    uLong crc32;                /* crc32 of all data uncompressed */
+    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
+    ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
+    ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+    zlib_filefunc64_32_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    uLong compression_method;   /* compression method (0==store) */
+    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    int   raw;
+} file_in_zip64_read_info_s;
+
+
+/* unz64_s contain internal information about the zipfile
+*/
+typedef struct
+{
+    zlib_filefunc64_32_def z_filefunc;
+    int is64bitOpenFunction;
+    voidpf filestream;        /* io structore of the zipfile */
+    unz_global_info64 gi;       /* public global information */
+    ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+    ZPOS64_T num_file;             /* number of the current file in the zipfile*/
+    ZPOS64_T pos_in_central_dir;   /* pos of the current file in the central dir*/
+    ZPOS64_T current_file_ok;      /* flag about the usability of the current file*/
+    ZPOS64_T central_pos;          /* position of the beginning of the central dir*/
+
+    ZPOS64_T size_central_dir;     /* size of the central directory  */
+    ZPOS64_T offset_central_dir;   /* offset of start of central directory with
+                                   respect to the starting disk number */
+
+    unz_file_info64 cur_file_info; /* public info about the current file in zip*/
+    unz_file_info64_internal cur_file_info_internal; /* private info about it*/
+    file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
+                                        file if we are decompressing it */
+    int encrypted;
+
+    int isZip64;
+
+#    ifndef NOUNCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+#    endif
+} unz64_s;
+
+
+#ifndef NOUNCRYPT
+#include "minizip/crypt.h"
+#endif
+
+/* ===========================================================================
+     Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+   for end of file.
+   IN assertion: the stream s has been sucessfully opened for reading.
+*/
+
+
+local int unz64local_getByte OF((
+    const zlib_filefunc64_32_def* pzlib_filefunc_def,
+    voidpf filestream,
+    int *pi));
+
+local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
+{
+    unsigned char c;
+    int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return UNZ_OK;
+    }
+    else
+    {
+        if (ZERROR64(*pzlib_filefunc_def,filestream))
+            return UNZ_ERRNO;
+        else
+            return UNZ_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unz64local_getShort OF((
+    const zlib_filefunc64_32_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+                             voidpf filestream,
+                             uLong *pX)
+{
+    uLong x ;
+    int i = 0;
+    int err;
+
+    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int unz64local_getLong OF((
+    const zlib_filefunc64_32_def* pzlib_filefunc_def,
+    voidpf filestream,
+    uLong *pX));
+
+local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+                            voidpf filestream,
+                            uLong *pX)
+{
+    uLong x ;
+    int i = 0;
+    int err;
+
+    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((uLong)i)<<8;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((uLong)i)<<16;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int unz64local_getLong64 OF((
+    const zlib_filefunc64_32_def* pzlib_filefunc_def,
+    voidpf filestream,
+    ZPOS64_T *pX));
+
+
+local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+                            voidpf filestream,
+                            ZPOS64_T *pX)
+{
+    ZPOS64_T x ;
+    int i = 0;
+    int err;
+
+    err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (ZPOS64_T)i;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<8;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<16;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<24;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<32;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<40;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<48;
+
+    if (err==UNZ_OK)
+        err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x |= ((ZPOS64_T)i)<<56;
+
+    if (err==UNZ_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
+{
+    for (;;)
+    {
+        char c1=*(fileName1++);
+        char c2=*(fileName2++);
+        if ((c1>='a') && (c1<='z'))
+            c1 -= 0x20;
+        if ((c2>='a') && (c2<='z'))
+            c2 -= 0x20;
+        if (c1=='\0')
+            return ((c2=='\0') ? 0 : -1);
+        if (c2=='\0')
+            return 1;
+        if (c1<c2)
+            return -1;
+        if (c1>c2)
+            return 1;
+    }
+}
+
+
+#ifdef  CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+   Compare two filename (fileName1,fileName2).
+   If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+   If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+                                                                or strcasecmp)
+   If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+        (like 1 on Unix, 2 on Windows)
+
+*/
+extern MINIZIP_API int unzStringFileNameCompare (const char*  fileName1,
+                                                 const char*  fileName2,
+                                                 int iCaseSensitivity)
+
+{
+    if (iCaseSensitivity==0)
+        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+    if (iCaseSensitivity==1)
+        return strcmp(fileName1,fileName2);
+
+    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+    unsigned char* buf;
+    ZPOS64_T uSizeFile;
+    ZPOS64_T uBackRead;
+    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+    ZPOS64_T uPosFound=0;
+
+    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize;
+        ZPOS64_T uReadPos ;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    return uPosFound;
+}
+
+
+/*
+  Locate the Central directory 64 of a zipfile (at the end, just before
+    the global comment)
+*/
+local ZPOS64_T unz64local_SearchCentralDir64 OF((
+    const zlib_filefunc64_32_def* pzlib_filefunc_def,
+    voidpf filestream));
+
+local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
+                                      voidpf filestream)
+{
+    unsigned char* buf;
+    ZPOS64_T uSizeFile;
+    ZPOS64_T uBackRead;
+    ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+    ZPOS64_T uPosFound=0;
+    uLong uL;
+                ZPOS64_T relativeOffset;
+
+    if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+        return 0;
+
+
+    uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+    if (uMaxBack>uSizeFile)
+        uMaxBack = uSizeFile;
+
+    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+    if (buf==NULL)
+        return 0;
+
+    uBackRead = 4;
+    while (uBackRead<uMaxBack)
+    {
+        uLong uReadSize;
+        ZPOS64_T uReadPos;
+        int i;
+        if (uBackRead+BUFREADCOMMENT>uMaxBack)
+            uBackRead = uMaxBack;
+        else
+            uBackRead+=BUFREADCOMMENT;
+        uReadPos = uSizeFile-uBackRead ;
+
+        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                     (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+        if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            break;
+
+        if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+            break;
+
+        for (i=(int)uReadSize-3; (i--)>0;)
+            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+                ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
+            {
+                uPosFound = uReadPos+i;
+                break;
+            }
+
+        if (uPosFound!=0)
+            break;
+    }
+    TRYFREE(buf);
+    if (uPosFound == 0)
+        return 0;
+
+    /* Zip64 end of central directory locator */
+    if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return 0;
+
+    /* the signature, already checked */
+    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+        return 0;
+
+    /* number of the disk with the start of the zip64 end of  central directory */
+    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+        return 0;
+    if (uL != 0)
+        return 0;
+
+    /* relative offset of the zip64 end of central directory record */
+    if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
+        return 0;
+
+    /* total number of disks */
+    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+        return 0;
+    if (uL != 1)
+        return 0;
+
+    /* Goto end of central directory record */
+    if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return 0;
+
+     /* the signature */
+    if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+        return 0;
+
+    if (uL != 0x06064b50)
+        return 0;
+
+    return relativeOffset;
+}
+
+/*
+  Open a Zip file. path contain the full pathname (by example,
+     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+     "zlib/zlib114.zip".
+     If the zipfile cannot be opened (file doesn't exist or in not valid), the
+       return value is NULL.
+     Else, the return value is a unzFile Handle, usable with other function
+       of this unzip package.
+*/
+local unzFile unzOpenInternal (const void *path,
+                               zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
+                               int is64bitOpenFunction)
+{
+    unz64_s us;
+    unz64_s *s;
+    ZPOS64_T central_pos;
+    uLong   uL;
+
+    uLong number_disk;          /* number of the current dist, used for
+                                   spaning ZIP, unsupported, always 0*/
+    uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                                   for spaning ZIP, unsupported, always 0*/
+    ZPOS64_T number_entry_CD;      /* total number of entries in
+                                   the central dir
+                                   (same than number_entry on nospan) */
+
+    int err=UNZ_OK;
+
+    if (unz_copyright[0]!=' ')
+        return NULL;
+
+    us.z_filefunc.zseek32_file = NULL;
+    us.z_filefunc.ztell32_file = NULL;
+    if (pzlib_filefunc64_32_def==NULL)
+        fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
+    else
+        us.z_filefunc = *pzlib_filefunc64_32_def;
+    us.is64bitOpenFunction = is64bitOpenFunction;
+
+
+
+    us.filestream = ZOPEN64(us.z_filefunc,
+                                                 path,
+                                                 ZLIB_FILEFUNC_MODE_READ |
+                                                 ZLIB_FILEFUNC_MODE_EXISTING);
+    if (us.filestream==NULL)
+        return NULL;
+
+    central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
+    if (central_pos)
+    {
+        uLong uS;
+        ZPOS64_T uL64;
+
+        us.isZip64 = 1;
+
+        if (ZSEEK64(us.z_filefunc, us.filestream,
+                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+        /* the signature, already checked */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* size of zip64 end of central directory record */
+        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* version made by */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* version needed to extract */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* number of this disk */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* number of the disk with the start of the central directory */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* total number of entries in the central directory on this disk */
+        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* total number of entries in the central directory */
+        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        if ((number_entry_CD!=us.gi.number_entry) ||
+            (number_disk_with_CD!=0) ||
+            (number_disk!=0))
+            err=UNZ_BADZIPFILE;
+
+        /* size of the central directory */
+        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* offset of start of central directory with respect to the
+          starting disk number */
+        if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        us.gi.size_comment = 0;
+    }
+    else
+    {
+        central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
+        if (central_pos==0)
+            err=UNZ_ERRNO;
+
+        us.isZip64 = 0;
+
+        if (ZSEEK64(us.z_filefunc, us.filestream,
+                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err=UNZ_ERRNO;
+
+        /* the signature, already checked */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* number of this disk */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* number of the disk with the start of the central directory */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+            err=UNZ_ERRNO;
+
+        /* total number of entries in the central dir on this disk */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+        us.gi.number_entry = uL;
+
+        /* total number of entries in the central dir */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+        number_entry_CD = uL;
+
+        if ((number_entry_CD!=us.gi.number_entry) ||
+            (number_disk_with_CD!=0) ||
+            (number_disk!=0))
+            err=UNZ_BADZIPFILE;
+
+        /* size of the central directory */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+        us.size_central_dir = uL;
+
+        /* offset of start of central directory with respect to the
+            starting disk number */
+        if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+            err=UNZ_ERRNO;
+        us.offset_central_dir = uL;
+
+        /* zipfile comment length */
+        if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+            err=UNZ_ERRNO;
+    }
+
+    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+        (err==UNZ_OK))
+        err=UNZ_BADZIPFILE;
+
+    if (err!=UNZ_OK)
+    {
+        ZCLOSE64(us.z_filefunc, us.filestream);
+        return NULL;
+    }
+
+    us.byte_before_the_zipfile = central_pos -
+                            (us.offset_central_dir+us.size_central_dir);
+    us.central_pos = central_pos;
+    us.pfile_in_zip_read = NULL;
+    us.encrypted = 0;
+
+
+    s=(unz64_s*)ALLOC(sizeof(unz64_s));
+    if( s != NULL)
+    {
+        *s=us;
+        unzGoToFirstFile((unzFile)s);
+    }
+    return (unzFile)s;
+}
+
+
+extern unzFile MINIZIP_API unzOpen2 (const char *path,
+                                        zlib_filefunc_def* pzlib_filefunc32_def)
+{
+    if (pzlib_filefunc32_def != NULL)
+    {
+        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
+        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
+    }
+    else
+        return unzOpenInternal(path, NULL, 0);
+}
+
+extern unzFile MINIZIP_API unzOpen2_64 (const void *path,
+                                     zlib_filefunc64_def* pzlib_filefunc_def)
+{
+    if (pzlib_filefunc_def != NULL)
+    {
+        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
+        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
+        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
+        return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
+    }
+    else
+        return unzOpenInternal(path, NULL, 1);
+}
+
+extern unzFile MINIZIP_API unzOpen (const char *path)
+{
+    return unzOpenInternal(path, NULL, 0);
+}
+
+extern unzFile MINIZIP_API unzOpen64 (const void *path)
+{
+    return unzOpenInternal(path, NULL, 1);
+}
+
+/*
+  Close a ZipFile opened with unzipOpen.
+  If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+    these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+  return UNZ_OK if there is no problem. */
+extern MINIZIP_API int unzClose (unzFile file)
+{
+    unz64_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+
+    if (s->pfile_in_zip_read!=NULL)
+        unzCloseCurrentFile(file);
+
+    ZCLOSE64(s->z_filefunc, s->filestream);
+    TRYFREE(s);
+    return UNZ_OK;
+}
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem. */
+extern MINIZIP_API int unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
+{
+    unz64_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    *pglobal_info=s->gi;
+    return UNZ_OK;
+}
+
+extern MINIZIP_API int unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
+{
+    unz64_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    /* to do : check if number_entry is not truncated */
+    pglobal_info32->number_entry = (uLong)s->gi.number_entry;
+    pglobal_info32->size_comment = s->gi.size_comment;
+    return UNZ_OK;
+}
+/*
+   Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
+{
+    ZPOS64_T uDate;
+    uDate = (ZPOS64_T)(ulDosDate>>16);
+    ptm->tm_mday = (uInt)(uDate&0x1f) ;
+    ptm->tm_mon =  (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+    ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+    ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+    ptm->tm_min =  (uInt) ((ulDosDate&0x7E0)/0x20) ;
+    ptm->tm_sec =  (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+  Get Info about the current file in the zipfile, with internal only info
+*/
+local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
+                                                  unz_file_info64 *pfile_info,
+                                                  unz_file_info64_internal
+                                                  *pfile_info_internal,
+                                                  char *szFileName,
+                                                  uLong fileNameBufferSize,
+                                                  void *extraField,
+                                                  uLong extraFieldBufferSize,
+                                                  char *szComment,
+                                                  uLong commentBufferSize));
+
+local int unz64local_GetCurrentFileInfoInternal (unzFile file,
+                                                  unz_file_info64 *pfile_info,
+                                                  unz_file_info64_internal
+                                                  *pfile_info_internal,
+                                                  char *szFileName,
+                                                  uLong fileNameBufferSize,
+                                                  void *extraField,
+                                                  uLong extraFieldBufferSize,
+                                                  char *szComment,
+                                                  uLong commentBufferSize)
+{
+    unz64_s* s;
+    unz_file_info64 file_info;
+    unz_file_info64_internal file_info_internal;
+    int err=UNZ_OK;
+    uLong uMagic;
+    long lSeek=0;
+    uLong uL;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    if (ZSEEK64(s->z_filefunc, s->filestream,
+              s->pos_in_central_dir+s->byte_before_the_zipfile,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        err=UNZ_ERRNO;
+
+
+    /* we check the magic */
+    if (err==UNZ_OK)
+    {
+        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x02014b50)
+            err=UNZ_BADZIPFILE;
+    }
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+        err=UNZ_ERRNO;
+    file_info.compressed_size = uL;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+        err=UNZ_ERRNO;
+    file_info.uncompressed_size = uL;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+                // relative offset of local header
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+        err=UNZ_ERRNO;
+    file_info_internal.offset_curfile = uL;
+
+    lSeek+=file_info.size_filename;
+    if ((err==UNZ_OK) && (szFileName!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_filename<fileNameBufferSize)
+        {
+            *(szFileName+file_info.size_filename)='\0';
+            uSizeRead = file_info.size_filename;
+        }
+        else
+            uSizeRead = fileNameBufferSize;
+
+        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+            if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        lSeek -= uSizeRead;
+    }
+
+    // Read extrafield
+    if ((err==UNZ_OK) && (extraField!=NULL))
+    {
+        ZPOS64_T uSizeRead ;
+        if (file_info.size_file_extra<extraFieldBufferSize)
+            uSizeRead = file_info.size_file_extra;
+        else
+            uSizeRead = extraFieldBufferSize;
+
+        if (lSeek!=0)
+        {
+            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                lSeek=0;
+            else
+                err=UNZ_ERRNO;
+        }
+
+        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+            if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+
+        lSeek += file_info.size_file_extra - (uLong)uSizeRead;
+    }
+    else
+        lSeek += file_info.size_file_extra;
+
+
+    if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
+    {
+                                uLong acc = 0;
+
+        // since lSeek now points to after the extra field we need to move back
+        lSeek -= file_info.size_file_extra;
+
+        if (lSeek!=0)
+        {
+            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                lSeek=0;
+            else
+                err=UNZ_ERRNO;
+        }
+
+        while(acc < file_info.size_file_extra)
+        {
+            uLong headerId;
+                                                uLong dataSize;
+
+            if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
+                err=UNZ_ERRNO;
+
+            if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
+                err=UNZ_ERRNO;
+
+            /* ZIP64 extra fields */
+            if (headerId == 0x0001)
+            {
+                uLong uL;
+
+                if(file_info.uncompressed_size == (ZPOS64_T)(unsigned long)-1)
+                {
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info.compressed_size == (ZPOS64_T)(unsigned long)-1)
+                {
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info_internal.offset_curfile == (ZPOS64_T)(unsigned long)-1)
+                {
+                    /* Relative Header offset */
+                    if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+                if(file_info.disk_num_start == (unsigned long)-1)
+                {
+                    /* Disk Start Number */
+                    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+                        err=UNZ_ERRNO;
+                }
+
+            }
+            else
+            {
+                if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
+                    err=UNZ_ERRNO;
+            }
+
+            acc += 2 + 2 + dataSize;
+        }
+    }
+
+    if ((err==UNZ_OK) && (szComment!=NULL))
+    {
+        uLong uSizeRead ;
+        if (file_info.size_file_comment<commentBufferSize)
+        {
+            *(szComment+file_info.size_file_comment)='\0';
+            uSizeRead = file_info.size_file_comment;
+        }
+        else
+            uSizeRead = commentBufferSize;
+
+        if (lSeek!=0)
+        {
+            if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+                lSeek=0;
+            else
+                err=UNZ_ERRNO;
+        }
+
+        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+            if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+                err=UNZ_ERRNO;
+        lSeek+=file_info.size_file_comment - uSizeRead;
+    }
+    else
+        lSeek+=file_info.size_file_comment;
+
+
+    if ((err==UNZ_OK) && (pfile_info!=NULL))
+        *pfile_info=file_info;
+
+    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+        *pfile_info_internal=file_info_internal;
+
+    return err;
+}
+
+
+
+/*
+  Write info about the ZipFile in the *pglobal_info structure.
+  No preparation of the structure is needed
+  return UNZ_OK if there is no problem.
+*/
+extern MINIZIP_API int unzGetCurrentFileInfo64 (unzFile file,
+                                          unz_file_info64 * pfile_info,
+                                          char * szFileName, uLong fileNameBufferSize,
+                                          void *extraField, uLong extraFieldBufferSize,
+                                          char* szComment,  uLong commentBufferSize)
+{
+    return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+                                                szFileName,fileNameBufferSize,
+                                                extraField,extraFieldBufferSize,
+                                                szComment,commentBufferSize);
+}
+
+extern MINIZIP_API int unzGetCurrentFileInfo (unzFile file,
+                                          unz_file_info * pfile_info,
+                                          char * szFileName, uLong fileNameBufferSize,
+                                          void *extraField, uLong extraFieldBufferSize,
+                                          char* szComment,  uLong commentBufferSize)
+{
+    int err;
+    unz_file_info64 file_info64;
+    err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
+                                                szFileName,fileNameBufferSize,
+                                                extraField,extraFieldBufferSize,
+                                                szComment,commentBufferSize);
+    if (err==UNZ_OK)
+    {
+        pfile_info->version = file_info64.version;
+        pfile_info->version_needed = file_info64.version_needed;
+        pfile_info->flag = file_info64.flag;
+        pfile_info->compression_method = file_info64.compression_method;
+        pfile_info->dosDate = file_info64.dosDate;
+        pfile_info->crc = file_info64.crc;
+
+        pfile_info->size_filename = file_info64.size_filename;
+        pfile_info->size_file_extra = file_info64.size_file_extra;
+        pfile_info->size_file_comment = file_info64.size_file_comment;
+
+        pfile_info->disk_num_start = file_info64.disk_num_start;
+        pfile_info->internal_fa = file_info64.internal_fa;
+        pfile_info->external_fa = file_info64.external_fa;
+
+        pfile_info->tmu_date = file_info64.tmu_date,
+
+
+        pfile_info->compressed_size = (uLong)file_info64.compressed_size;
+        pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
+
+    }
+    return err;
+}
+/*
+  Set the current file of the zipfile to the first file.
+  return UNZ_OK if there is no problem
+*/
+extern MINIZIP_API int unzGoToFirstFile (unzFile file)
+{
+    int err=UNZ_OK;
+    unz64_s* s;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    s->pos_in_central_dir=s->offset_central_dir;
+    s->num_file=0;
+    err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                             &s->cur_file_info_internal,
+                                             NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+/*
+  Set the current file of the zipfile to the next file.
+  return UNZ_OK if there is no problem
+  return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern MINIZIP_API int unzGoToNextFile (unzFile  file)
+{
+    unz64_s* s;
+    int err;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (s->gi.number_entry != 0xffff)    /* 2^16 files overflow hack */
+      if (s->num_file+1==s->gi.number_entry)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+            s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+    s->num_file++;
+    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+
+/*
+  Try locate the file szFileName in the zipfile.
+  For the iCaseSensitivity signification, see unzipStringFileNameCompare
+
+  return value :
+  UNZ_OK if the file is found. It becomes the current file.
+  UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern MINIZIP_API int unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
+{
+    unz64_s* s;
+    int err;
+
+    /* We remember the 'current' position in the file so that we can jump
+     * back there if we fail.
+     */
+    unz_file_info64 cur_file_infoSaved;
+    unz_file_info64_internal cur_file_info_internalSaved;
+    ZPOS64_T num_fileSaved;
+    ZPOS64_T pos_in_central_dirSaved;
+
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+
+    if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+        return UNZ_PARAMERROR;
+
+    s=(unz64_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    /* Save the current state */
+    num_fileSaved = s->num_file;
+    pos_in_central_dirSaved = s->pos_in_central_dir;
+    cur_file_infoSaved = s->cur_file_info;
+    cur_file_info_internalSaved = s->cur_file_info_internal;
+
+    err = unzGoToFirstFile(file);
+
+    while (err == UNZ_OK)
+    {
+        char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+        err = unzGetCurrentFileInfo64(file,NULL,
+                                    szCurrentFileName,sizeof(szCurrentFileName)-1,
+                                    NULL,0,NULL,0);
+        if (err == UNZ_OK)
+        {
+            if (unzStringFileNameCompare(szCurrentFileName,
+                                            szFileName,iCaseSensitivity)==0)
+                return UNZ_OK;
+            err = unzGoToNextFile(file);
+        }
+    }
+
+    /* We failed, so restore the state of the 'current file' to where we
+     * were.
+     */
+    s->num_file = num_fileSaved ;
+    s->pos_in_central_dir = pos_in_central_dirSaved ;
+    s->cur_file_info = cur_file_infoSaved;
+    s->cur_file_info_internal = cur_file_info_internalSaved;
+    return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+    ZPOS64_T pos_in_zip_directory;   // offset in file
+    ZPOS64_T num_of_file;            // # of file
+} unz_file_pos;
+*/
+
+extern MINIZIP_API int unzGetFilePos64(unzFile file, unz64_file_pos*  file_pos)
+{
+    unz64_s* s;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_END_OF_LIST_OF_FILE;
+
+    file_pos->pos_in_zip_directory  = s->pos_in_central_dir;
+    file_pos->num_of_file           = s->num_file;
+
+    return UNZ_OK;
+}
+
+extern MINIZIP_API int unzGetFilePos(
+    unzFile file,
+    unz_file_pos* file_pos)
+{
+    unz64_file_pos file_pos64;
+    int err = unzGetFilePos64(file,&file_pos64);
+    if (err==UNZ_OK)
+    {
+        file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
+        file_pos->num_of_file = (uLong)file_pos64.num_of_file;
+    }
+    return err;
+}
+
+extern MINIZIP_API int unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
+{
+    unz64_s* s;
+    int err;
+
+    if (file==NULL || file_pos==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+
+    /* jump to the right spot */
+    s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+    s->num_file           = file_pos->num_of_file;
+
+    /* set the current file */
+    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                               &s->cur_file_info_internal,
+                                               NULL,0,NULL,0,NULL,0);
+    /* return results */
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+extern MINIZIP_API int unzGoToFilePos(
+    unzFile file,
+    unz_file_pos* file_pos)
+{
+    unz64_file_pos file_pos64;
+    if (file_pos == NULL)
+        return UNZ_PARAMERROR;
+
+    file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
+    file_pos64.num_of_file = file_pos->num_of_file;
+    return unzGoToFilePos64(file,&file_pos64);
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+  Read the local header of the current zipfile
+  Check the coherency of the local header and info in the end of central
+        directory about this file
+  store in *piSizeVar the size of extra info in local header
+        (filename and size of extra field data)
+*/
+local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
+                                                    ZPOS64_T * poffset_local_extrafield,
+                                                    uInt  * psize_local_extrafield)
+{
+    uLong uMagic,uData,uFlags;
+    uLong size_filename;
+    uLong size_extra_field;
+    int err=UNZ_OK;
+
+    *piSizeVar = 0;
+    *poffset_local_extrafield = 0;
+    *psize_local_extrafield = 0;
+
+    if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+                                s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+
+    if (err==UNZ_OK)
+    {
+        if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+            err=UNZ_ERRNO;
+        else if (uMagic!=0x04034b50)
+            err=UNZ_BADZIPFILE;
+    }
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+/*
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+        err=UNZ_BADZIPFILE;
+*/
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+        err=UNZ_ERRNO;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+        err=UNZ_BADZIPFILE;
+
+    if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+/* #ifdef HAVE_BZIP2 */
+                         (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
+/* #endif */
+                         (s->cur_file_info.compression_method!=Z_DEFLATED))
+        err=UNZ_BADZIPFILE;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+        err=UNZ_ERRNO;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+        err=UNZ_ERRNO;
+    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+        err=UNZ_ERRNO;
+    else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
+        err=UNZ_BADZIPFILE;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+        err=UNZ_ERRNO;
+    else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+        err=UNZ_BADZIPFILE;
+
+    *piSizeVar += (uInt)size_filename;
+
+    if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+        err=UNZ_ERRNO;
+    *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+                                    SIZEZIPLOCALHEADER + size_filename;
+    *psize_local_extrafield = (uInt)size_extra_field;
+
+    *piSizeVar += (uInt)size_extra_field;
+
+    return err;
+}
+
+/*
+  Open for reading data the current file in the zipfile.
+  If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern MINIZIP_API int unzOpenCurrentFile3 (unzFile file, int* method,
+                                            int* level, int raw, const char* password)
+{
+    int err=UNZ_OK;
+    uInt iSizeVar;
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    ZPOS64_T offset_local_extrafield;  /* offset of the local extra field */
+    uInt  size_local_extrafield;    /* size of the local extra field */
+#    ifndef NOUNCRYPT
+    char source[12];
+#    else
+    if (password != NULL)
+        return UNZ_PARAMERROR;
+#    endif
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    if (!s->current_file_ok)
+        return UNZ_PARAMERROR;
+
+    if (s->pfile_in_zip_read != NULL)
+        unzCloseCurrentFile(file);
+
+    if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+        return UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_INTERNALERROR;
+
+    pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+    pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+    pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+    pfile_in_zip_read_info->pos_local_extrafield=0;
+    pfile_in_zip_read_info->raw=raw;
+
+    if (pfile_in_zip_read_info->read_buffer==NULL)
+    {
+        TRYFREE(pfile_in_zip_read_info);
+        return UNZ_INTERNALERROR;
+    }
+
+    pfile_in_zip_read_info->stream_initialised=0;
+
+    if (method!=NULL)
+        *method = (int)s->cur_file_info.compression_method;
+
+    if (level!=NULL)
+    {
+        *level = 6;
+        switch (s->cur_file_info.flag & 0x06)
+        {
+          case 6 : *level = 1; break;
+          case 4 : *level = 2; break;
+          case 2 : *level = 9; break;
+        }
+    }
+
+    if ((s->cur_file_info.compression_method!=0) &&
+/* #ifdef HAVE_BZIP2 */
+        (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
+/* #endif */
+        (s->cur_file_info.compression_method!=Z_DEFLATED))
+
+        err=UNZ_BADZIPFILE;
+
+    pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+    pfile_in_zip_read_info->crc32=0;
+    pfile_in_zip_read_info->total_out_64=0;
+    pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
+    pfile_in_zip_read_info->filestream=s->filestream;
+    pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+    pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+    pfile_in_zip_read_info->stream.total_out = 0;
+
+    if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
+    {
+#ifdef HAVE_BZIP2
+      pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
+      pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
+      pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
+      pfile_in_zip_read_info->bstream.state = (voidpf)0;
+
+      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+      pfile_in_zip_read_info->stream.zfree = (free_func)0;
+      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+      pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+      pfile_in_zip_read_info->stream.avail_in = 0;
+
+      err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
+      if (err == Z_OK)
+        pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
+      else
+      {
+        TRYFREE(pfile_in_zip_read_info);
+        return err;
+      }
+#else
+      pfile_in_zip_read_info->raw=1;
+#endif
+    }
+    else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
+    {
+      pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+      pfile_in_zip_read_info->stream.zfree = (free_func)0;
+      pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+      pfile_in_zip_read_info->stream.next_in = 0;
+      pfile_in_zip_read_info->stream.avail_in = 0;
+
+      err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+      if (err == Z_OK)
+        pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
+      else
+      {
+        TRYFREE(pfile_in_zip_read_info);
+        return err;
+      }
+        /* windowBits is passed < 0 to tell that there is no zlib header.
+         * Note that in this case inflate *requires* an extra "dummy" byte
+         * after the compressed stream in order to complete decompression and
+         * return Z_STREAM_END.
+         * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+         * size of both compressed and uncompressed data
+         */
+    }
+    pfile_in_zip_read_info->rest_read_compressed =
+            s->cur_file_info.compressed_size ;
+    pfile_in_zip_read_info->rest_read_uncompressed =
+            s->cur_file_info.uncompressed_size ;
+
+
+    pfile_in_zip_read_info->pos_in_zipfile =
+            s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+              iSizeVar;
+
+    pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+    s->pfile_in_zip_read = pfile_in_zip_read_info;
+                s->encrypted = 0;
+
+#    ifndef NOUNCRYPT
+    if (password != NULL)
+    {
+        int i;
+        s->pcrc_32_tab = get_crc_table();
+        init_keys(password,s->keys,s->pcrc_32_tab);
+        if (ZSEEK64(s->z_filefunc, s->filestream,
+                  s->pfile_in_zip_read->pos_in_zipfile +
+                     s->pfile_in_zip_read->byte_before_the_zipfile,
+                  SEEK_SET)!=0)
+            return UNZ_INTERNALERROR;
+        if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
+            return UNZ_INTERNALERROR;
+
+        for (i = 0; i<12; i++)
+            zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+        s->pfile_in_zip_read->pos_in_zipfile+=12;
+        s->encrypted=1;
+    }
+#    endif
+
+
+    return UNZ_OK;
+}
+
+extern MINIZIP_API int unzOpenCurrentFile (unzFile file)
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern MINIZIP_API int unzOpenCurrentFilePassword (unzFile file, const char*  password)
+{
+    return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern MINIZIP_API int unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
+{
+    return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/** Addition for GDAL : START */
+
+extern ZPOS64_T MINIZIP_API unzGetCurrentFileZStreamPos64( unzFile file)
+{
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    s=(unz64_s*)file;
+    if (file==NULL)
+        return 0; //UNZ_PARAMERROR;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+    if (pfile_in_zip_read_info==NULL)
+        return 0; //UNZ_PARAMERROR;
+    return pfile_in_zip_read_info->pos_in_zipfile +
+                         pfile_in_zip_read_info->byte_before_the_zipfile;
+}
+
+/** Addition for GDAL : END */
+
+/*
+  Read bytes from the current file.
+  buf contain buffer where data must be copied
+  len the size of buf.
+
+  return the number of byte copied if somes bytes are copied
+  return 0 if the end of file was reached
+  return <0 with error code if there is an error
+    (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern MINIZIP_API int unzReadCurrentFile  (unzFile file, voidp buf, unsigned len)
+{
+    int err=UNZ_OK;
+    uInt iRead = 0;
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->read_buffer == NULL))
+        return UNZ_END_OF_LIST_OF_FILE;
+    if (len==0)
+        return 0;
+
+    pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+    pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+    if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+        (!(pfile_in_zip_read_info->raw)))
+        pfile_in_zip_read_info->stream.avail_out =
+            (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+    if ((len>pfile_in_zip_read_info->rest_read_compressed+
+           pfile_in_zip_read_info->stream.avail_in) &&
+         (pfile_in_zip_read_info->raw))
+        pfile_in_zip_read_info->stream.avail_out =
+            (uInt)pfile_in_zip_read_info->rest_read_compressed+
+            pfile_in_zip_read_info->stream.avail_in;
+
+    while (pfile_in_zip_read_info->stream.avail_out>0)
+    {
+        if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+            (pfile_in_zip_read_info->rest_read_compressed>0))
+        {
+            uInt uReadThis = UNZ_BUFSIZE;
+            if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+                uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+            if (uReadThis == 0)
+                return UNZ_EOF;
+            if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->pos_in_zipfile +
+                         pfile_in_zip_read_info->byte_before_the_zipfile,
+                         ZLIB_FILEFUNC_SEEK_SET)!=0)
+                return UNZ_ERRNO;
+            if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
+                      pfile_in_zip_read_info->filestream,
+                      pfile_in_zip_read_info->read_buffer,
+                      uReadThis)!=uReadThis)
+                return UNZ_ERRNO;
+
+
+#            ifndef NOUNCRYPT
+            if(s->encrypted)
+            {
+                uInt i;
+                for(i=0;i<uReadThis;i++)
+                  pfile_in_zip_read_info->read_buffer[i] =
+                      zdecode(s->keys,s->pcrc_32_tab,
+                              pfile_in_zip_read_info->read_buffer[i]);
+            }
+#            endif
+
+
+            pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+            pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+            pfile_in_zip_read_info->stream.next_in =
+                (Bytef*)pfile_in_zip_read_info->read_buffer;
+            pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+        }
+
+        if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+        {
+            uInt uDoCopy,i ;
+
+            if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                return (iRead==0) ? UNZ_EOF : iRead;
+
+            if (pfile_in_zip_read_info->stream.avail_out <
+                            pfile_in_zip_read_info->stream.avail_in)
+                uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+            else
+                uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+            for (i=0;i<uDoCopy;i++)
+                *(pfile_in_zip_read_info->stream.next_out+i) =
+                        *(pfile_in_zip_read_info->stream.next_in+i);
+
+            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
+
+            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+                                pfile_in_zip_read_info->stream.next_out,
+                                uDoCopy);
+            pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+            pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+            pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+            pfile_in_zip_read_info->stream.next_out += uDoCopy;
+            pfile_in_zip_read_info->stream.next_in += uDoCopy;
+            pfile_in_zip_read_info->stream.total_out += uDoCopy;
+            iRead += uDoCopy;
+        }
+        else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
+        {
+#ifdef HAVE_BZIP2
+            uLong uTotalOutBefore,uTotalOutAfter;
+            const Bytef *bufBefore;
+            uLong uOutThis;
+
+            pfile_in_zip_read_info->bstream.next_in        = (char*)pfile_in_zip_read_info->stream.next_in;
+            pfile_in_zip_read_info->bstream.avail_in       = pfile_in_zip_read_info->stream.avail_in;
+            pfile_in_zip_read_info->bstream.total_in_lo32  = pfile_in_zip_read_info->stream.total_in;
+            pfile_in_zip_read_info->bstream.total_in_hi32  = 0;
+            pfile_in_zip_read_info->bstream.next_out       = (char*)pfile_in_zip_read_info->stream.next_out;
+            pfile_in_zip_read_info->bstream.avail_out      = pfile_in_zip_read_info->stream.avail_out;
+            pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
+            pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
+
+            uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
+            bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
+
+            err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
+
+            uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
+            uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
+
+            pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
+            pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
+            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+            pfile_in_zip_read_info->stream.next_in   = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
+            pfile_in_zip_read_info->stream.avail_in  = pfile_in_zip_read_info->bstream.avail_in;
+            pfile_in_zip_read_info->stream.total_in  = pfile_in_zip_read_info->bstream.total_in_lo32;
+            pfile_in_zip_read_info->stream.next_out  = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
+            pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
+            pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
+
+            if (err==BZ_STREAM_END)
+              return (iRead==0) ? UNZ_EOF : iRead;
+            if (err!=BZ_OK)
+              break;
+#endif
+        } // end Z_BZIP2ED
+        else
+        {
+            ZPOS64_T uTotalOutBefore,uTotalOutAfter;
+            const Bytef *bufBefore;
+            ZPOS64_T uOutThis;
+            int flush=Z_SYNC_FLUSH;
+
+            uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+            bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+            /*
+            if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+                     pfile_in_zip_read_info->stream.avail_out) &&
+                (pfile_in_zip_read_info->rest_read_compressed == 0))
+                flush = Z_FINISH;
+            */
+            err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+            if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+              err = Z_DATA_ERROR;
+
+            uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+            uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+            pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
+
+            pfile_in_zip_read_info->crc32 =
+                crc32(pfile_in_zip_read_info->crc32,bufBefore,
+                        (uInt)(uOutThis));
+
+            pfile_in_zip_read_info->rest_read_uncompressed -=
+                uOutThis;
+
+            iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+            if (err==Z_STREAM_END)
+                return (iRead==0) ? UNZ_EOF : iRead;
+            if (err!=Z_OK)
+                break;
+        }
+    }
+
+    if (err==Z_OK)
+        return iRead;
+    return err;
+}
+
+
+/*
+  Give the current position in uncompressed data
+*/
+extern z_off_t MINIZIP_API unztell (unzFile file)
+{
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+extern ZPOS64_T MINIZIP_API unztell64 (unzFile file)
+{
+
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return (ZPOS64_T)-1;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return (ZPOS64_T)-1;
+
+    return pfile_in_zip_read_info->total_out_64;
+}
+
+
+/*
+  return 1 if the end of file was reached, 0 elsewhere
+*/
+extern MINIZIP_API int unzeof (unzFile file)
+{
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+        return 1;
+    else
+        return 0;
+}
+
+
+
+/*
+Read extra field from the current file (opened by unzOpenCurrentFile)
+This is the local-header version of the extra field (sometimes, there is
+more info in the local-header version than in the central-header)
+
+  if buf==NULL, it return the size of the local extra field that can be read
+
+  if buf!=NULL, len is the size of the buffer, the extra header is copied in
+    buf.
+  the return value is the number of bytes copied in buf, or (if <0)
+    the error code
+*/
+extern MINIZIP_API int unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
+{
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    uInt read_now;
+    ZPOS64_T size_to_read;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+    size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+                pfile_in_zip_read_info->pos_local_extrafield);
+
+    if (buf==NULL)
+        return (int)size_to_read;
+
+    if (len>size_to_read)
+        read_now = (uInt)size_to_read;
+    else
+        read_now = (uInt)len ;
+
+    if (read_now==0)
+        return 0;
+
+    if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              pfile_in_zip_read_info->offset_local_extrafield +
+              pfile_in_zip_read_info->pos_local_extrafield,
+              ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
+              pfile_in_zip_read_info->filestream,
+              buf,read_now)!=read_now)
+        return UNZ_ERRNO;
+
+    return (int)read_now;
+}
+
+/*
+  Close the file in zip opened with unzipOpenCurrentFile
+  Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern MINIZIP_API int unzCloseCurrentFile (unzFile file)
+{
+    int err=UNZ_OK;
+
+    unz64_s* s;
+    file_in_zip64_read_info_s* pfile_in_zip_read_info;
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+    if (pfile_in_zip_read_info==NULL)
+        return UNZ_PARAMERROR;
+
+
+    if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+        (!pfile_in_zip_read_info->raw))
+    {
+        if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+            err=UNZ_CRCERROR;
+    }
+
+
+    TRYFREE(pfile_in_zip_read_info->read_buffer);
+    pfile_in_zip_read_info->read_buffer = NULL;
+    if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
+        inflateEnd(&pfile_in_zip_read_info->stream);
+#ifdef HAVE_BZIP2
+    else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
+        BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
+#endif
+
+
+    pfile_in_zip_read_info->stream_initialised = 0;
+    TRYFREE(pfile_in_zip_read_info);
+
+    s->pfile_in_zip_read=NULL;
+
+    return err;
+}
+
+
+/*
+  Get the global comment string of the ZipFile, in the szComment buffer.
+  uSizeBuf is the size of the szComment buffer.
+  return the number of byte copied or an error code <0
+*/
+extern MINIZIP_API int unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
+{
+    unz64_s* s;
+    uLong uReadThis ;
+    if (file==NULL)
+        return (int)UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+
+    uReadThis = uSizeBuf;
+    if (uReadThis>s->gi.size_comment)
+        uReadThis = s->gi.size_comment;
+
+    if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+        return UNZ_ERRNO;
+
+    if (uReadThis>0)
+    {
+      *szComment='\0';
+      if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+        return UNZ_ERRNO;
+    }
+
+    if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+        *(szComment+s->gi.size_comment)='\0';
+    return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern ZPOS64_T MINIZIP_API unzGetOffset64(unzFile file)
+{
+    unz64_s* s;
+
+    if (file==NULL)
+          return 0; //UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+    if (!s->current_file_ok)
+      return 0;
+    if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+      if (s->num_file==s->gi.number_entry)
+         return 0;
+    return s->pos_in_central_dir;
+}
+
+extern uLong MINIZIP_API unzGetOffset (unzFile file)
+{
+    ZPOS64_T offset64;
+
+    if (file==NULL)
+          return 0; //UNZ_PARAMERROR;
+    offset64 = unzGetOffset64(file);
+    return (uLong)offset64;
+}
+
+extern MINIZIP_API int unzSetOffset64(unzFile file, ZPOS64_T pos)
+{
+    unz64_s* s;
+    int err;
+
+    if (file==NULL)
+        return UNZ_PARAMERROR;
+    s=(unz64_s*)file;
+
+    s->pos_in_central_dir = pos;
+    s->num_file = s->gi.number_entry;      /* hack */
+    err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+                                              &s->cur_file_info_internal,
+                                              NULL,0,NULL,0,NULL,0);
+    s->current_file_ok = (err == UNZ_OK);
+    return err;
+}
+
+extern MINIZIP_API int unzSetOffset (unzFile file, uLong pos)
+{
+    return unzSetOffset64(file,pos);
+}
diff --git a/SrcLib/core/fwZip/src/minizip/zip.c b/SrcLib/core/fwZip/src/minizip/zip.c
new file mode 100644
index 0000000..ea5191a
--- /dev/null
+++ b/SrcLib/core/fwZip/src/minizip/zip.c
@@ -0,0 +1,2006 @@
+/* zip.c -- IO on .zip files using zlib
+   Version 1.1, February 14h, 2010
+   part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+         Modifications for Zip64 support
+         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+         For more info read MiniZip_info.txt
+
+         Changes
+   Oct-2009 - Mathias Svensson - Remove old C style function prototypes
+   Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
+   Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions.
+   Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data
+                                 It is used when recreting zip archive with RAW when deleting items from a zip.
+                                 ZIP64 data is automaticly added to items that needs it, and existing ZIP64 data need to be removed.
+   Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required)
+   Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <zlib.h>
+
+#include "minizip/zip.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY   (0x0) /* platform depedent */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (64*1024) //(16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+
+// NOT sure that this work on ALL platform
+#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))
+
+#ifndef SEEK_CUR
+#define SEEK_CUR    1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END    2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET    0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC    (0x04034b50)
+#define CENTRALHEADERMAGIC  (0x02014b50)
+#define ENDHEADERMAGIC      (0x06054b50)
+#define ZIP64ENDHEADERMAGIC      (0x6064b50)
+#define ZIP64ENDLOCHEADERMAGIC   (0x7064b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET  (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+  struct linkedlist_datablock_internal_s* next_datablock;
+  uLong  avail_in_this_block;
+  uLong  filled_in_this_block;
+  uLong  unused; /* for future use and alignement */
+  unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+    linkedlist_datablock_internal* first_block;
+    linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+    z_stream stream;            /* zLib stream structure for inflate */
+#ifdef HAVE_BZIP2
+    bz_stream bstream;          /* bzLib stream structure for bziped */
+#endif
+
+    int  stream_initialised;    /* 1 is stream is initialised */
+    uInt pos_in_buffered_data;  /* last written byte in buffered_data */
+
+    ZPOS64_T pos_local_header;     /* offset of the local header of the file
+                                     currenty writing */
+    char* central_header;       /* central header data for the current file */
+    uLong size_centralExtra;
+    uLong size_centralheader;   /* size of the central header for cur file */
+    uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */
+    uLong flag;                 /* flag of the file currently writing */
+
+    int  method;                /* compression method of file currenty wr.*/
+    int  raw;                   /* 1 for directly writing raw data */
+    Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+    uLong dosDate;
+    uLong crc32;
+    int  encrypt;
+    int  zip64;               /* Add ZIP64 extened information in the extra field */
+    ZPOS64_T pos_zip64extrainfo;
+    ZPOS64_T totalCompressedData;
+    ZPOS64_T totalUncompressedData;
+#ifndef NOCRYPT
+    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
+    const unsigned long* pcrc_32_tab;
+    int crypt_header_size;
+#endif
+} curfile64_info;
+
+typedef struct
+{
+    zlib_filefunc64_32_def z_filefunc;
+    voidpf filestream;        /* io structore of the zipfile */
+    linkedlist_data central_dir;/* datablock with central dir in construction*/
+    int  in_opened_file_inzip;  /* 1 if a file in the zip is currently writ.*/
+    curfile64_info ci;            /* info on the file curretly writing */
+
+    ZPOS64_T begin_pos;            /* position of the beginning of the zipfile */
+    ZPOS64_T add_position_when_writting_offset;
+    ZPOS64_T number_entry;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+    char *globalcomment;
+#endif
+
+} zip64_internal;
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "minizip/crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+    linkedlist_datablock_internal* ldi;
+    ldi = (linkedlist_datablock_internal*)
+                 ALLOC(sizeof(linkedlist_datablock_internal));
+    if (ldi!=NULL)
+    {
+        ldi->next_datablock = NULL ;
+        ldi->filled_in_this_block = 0 ;
+        ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+    }
+    return ldi;
+}
+
+local void free_datablock(linkedlist_datablock_internal* ldi)
+{
+    while (ldi!=NULL)
+    {
+        linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+        TRYFREE(ldi);
+        ldi = ldinext;
+    }
+}
+
+local void init_linkedlist(linkedlist_data* ll)
+{
+    ll->first_block = ll->last_block = NULL;
+}
+
+local void free_linkedlist(linkedlist_data* ll)
+{
+    free_datablock(ll->first_block);
+    ll->first_block = ll->last_block = NULL;
+}
+
+
+local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len)
+{
+    linkedlist_datablock_internal* ldi;
+    const unsigned char* from_copy;
+
+    if (ll==NULL)
+        return ZIP_INTERNALERROR;
+
+    if (ll->last_block == NULL)
+    {
+        ll->first_block = ll->last_block = allocate_new_datablock();
+        if (ll->first_block == NULL)
+            return ZIP_INTERNALERROR;
+    }
+
+    ldi = ll->last_block;
+    from_copy = (unsigned char*)buf;
+
+    while (len>0)
+    {
+        uInt copy_this;
+        uInt i;
+        unsigned char* to_copy;
+
+        if (ldi->avail_in_this_block==0)
+        {
+            ldi->next_datablock = allocate_new_datablock();
+            if (ldi->next_datablock == NULL)
+                return ZIP_INTERNALERROR;
+            ldi = ldi->next_datablock ;
+            ll->last_block = ldi;
+        }
+
+        if (ldi->avail_in_this_block < len)
+            copy_this = (uInt)ldi->avail_in_this_block;
+        else
+            copy_this = (uInt)len;
+
+        to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+        for (i=0;i<copy_this;i++)
+            *(to_copy+i)=*(from_copy+i);
+
+        ldi->filled_in_this_block += copy_this;
+        ldi->avail_in_this_block -= copy_this;
+        from_copy += copy_this ;
+        len -= copy_this;
+    }
+    return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+   Inputs a long in LSB order to the given file
+   nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T)
+*/
+
+local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte));
+local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)
+{
+    unsigned char buf[8];
+    int n;
+    for (n = 0; n < nbByte; n++)
+    {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+    if (x != 0)
+      {     /* data overflow - hack for ZIP64 (X Roche) */
+      for (n = 0; n < nbByte; n++)
+        {
+          buf[n] = 0xff;
+        }
+      }
+
+    if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+        return ZIP_ERRNO;
+    else
+        return ZIP_OK;
+}
+
+local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte));
+local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte)
+{
+    unsigned char* buf=(unsigned char*)dest;
+    int n;
+    for (n = 0; n < nbByte; n++) {
+        buf[n] = (unsigned char)(x & 0xff);
+        x >>= 8;
+    }
+
+    if (x != 0)
+    {     /* data overflow - hack for ZIP64 */
+       for (n = 0; n < nbByte; n++)
+       {
+          buf[n] = 0xff;
+       }
+    }
+}
+
+/****************************************************************************/
+
+
+local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm)
+{
+    uLong year = (uLong)ptm->tm_year;
+    if (year>=1980)
+        year-=1980;
+    else if (year>=80)
+        year-=80;
+    return
+      (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+        ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi));
+
+local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi)
+{
+    unsigned char c;
+    int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
+    if (err==1)
+    {
+        *pi = (int)c;
+        return ZIP_OK;
+    }
+    else
+    {
+        if (ZERROR64(*pzlib_filefunc_def,filestream))
+            return ZIP_ERRNO;
+        else
+            return ZIP_EOF;
+    }
+}
+
+
+/* ===========================================================================
+   Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
+
+local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
+{
+    uLong x ;
+    int i = 0;
+    int err;
+
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
+
+local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
+{
+    uLong x ;
+    int i = 0;
+    int err;
+
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x = (uLong)i;
+
+    if (err==ZIP_OK)
+        err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<8;
+
+    if (err==ZIP_OK)
+        err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<16;
+
+    if (err==ZIP_OK)
+        err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+    x += ((uLong)i)<<24;
+
+    if (err==ZIP_OK)
+        *pX = x;
+    else
+        *pX = 0;
+    return err;
+}
+
+local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX));
+
+
+local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
+{
+  ZPOS64_T x;
+  int i = 0;
+  int err;
+
+  err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x = (ZPOS64_T)i;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<8;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<16;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<24;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<32;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<40;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<48;
+
+  if (err==ZIP_OK)
+    err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+  x += ((ZPOS64_T)i)<<56;
+
+  if (err==ZIP_OK)
+    *pX = x;
+  else
+    *pX = 0;
+
+  return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+  Locate the Central directory of a zipfile (at the end, just before
+    the global comment)
+*/
+local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+
+local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+  unsigned char* buf;
+  ZPOS64_T uSizeFile;
+  ZPOS64_T uBackRead;
+  ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+  ZPOS64_T uPosFound=0;
+
+  if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+    return 0;
+
+
+  uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+  if (uMaxBack>uSizeFile)
+    uMaxBack = uSizeFile;
+
+  buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+  if (buf==NULL)
+    return 0;
+
+  uBackRead = 4;
+  while (uBackRead<uMaxBack)
+  {
+    uLong uReadSize;
+    ZPOS64_T uReadPos ;
+    int i;
+    if (uBackRead+BUFREADCOMMENT>uMaxBack)
+      uBackRead = uMaxBack;
+    else
+      uBackRead+=BUFREADCOMMENT;
+    uReadPos = uSizeFile-uBackRead ;
+
+    uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+      (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+    if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+      break;
+
+    if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+      break;
+
+    for (i=(int)uReadSize-3; (i--)>0;)
+      if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+        ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+      {
+        uPosFound = uReadPos+i;
+        break;
+      }
+
+      if (uPosFound!=0)
+        break;
+  }
+  TRYFREE(buf);
+  return uPosFound;
+}
+
+/*
+Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before
+the global comment)
+*/
+local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+
+local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+  unsigned char* buf;
+  ZPOS64_T uSizeFile;
+  ZPOS64_T uBackRead;
+  ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+  ZPOS64_T uPosFound=0;
+  uLong uL;
+  ZPOS64_T relativeOffset;
+
+  if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+    return 0;
+
+  uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+  if (uMaxBack>uSizeFile)
+    uMaxBack = uSizeFile;
+
+  buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+  if (buf==NULL)
+    return 0;
+
+  uBackRead = 4;
+  while (uBackRead<uMaxBack)
+  {
+    uLong uReadSize;
+    ZPOS64_T uReadPos;
+    int i;
+    if (uBackRead+BUFREADCOMMENT>uMaxBack)
+      uBackRead = uMaxBack;
+    else
+      uBackRead+=BUFREADCOMMENT;
+    uReadPos = uSizeFile-uBackRead ;
+
+    uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+      (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+    if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+      break;
+
+    if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+      break;
+
+    for (i=(int)uReadSize-3; (i--)>0;)
+    {
+      // Signature "0x07064b50" Zip64 end of central directory locater
+      if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
+      {
+        uPosFound = uReadPos+i;
+        break;
+      }
+    }
+
+      if (uPosFound!=0)
+        break;
+  }
+
+  TRYFREE(buf);
+  if (uPosFound == 0)
+    return 0;
+
+  /* Zip64 end of central directory locator */
+  if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
+    return 0;
+
+  /* the signature, already checked */
+  if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+    return 0;
+
+  /* number of the disk with the start of the zip64 end of  central directory */
+  if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+    return 0;
+  if (uL != 0)
+    return 0;
+
+  /* relative offset of the zip64 end of central directory record */
+  if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK)
+    return 0;
+
+  /* total number of disks */
+  if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+    return 0;
+  if (uL != 1)
+    return 0;
+
+  /* Goto Zip64 end of central directory record */
+  if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
+    return 0;
+
+  /* the signature */
+  if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+    return 0;
+
+  if (uL != 0x06064b50) // signature of 'Zip64 end of central directory'
+    return 0;
+
+  return relativeOffset;
+}
+
+int LoadCentralDirectoryRecord(zip64_internal* pziinit)
+{
+  int err=ZIP_OK;
+  ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+  ZPOS64_T size_central_dir;     /* size of the central directory  */
+  ZPOS64_T offset_central_dir;   /* offset of start of central directory */
+  ZPOS64_T central_pos;
+  uLong uL;
+
+  uLong number_disk;          /* number of the current dist, used for
+                              spaning ZIP, unsupported, always 0*/
+  uLong number_disk_with_CD;  /* number the the disk with central dir, used
+                              for spaning ZIP, unsupported, always 0*/
+  ZPOS64_T number_entry;
+  ZPOS64_T number_entry_CD;      /* total number of entries in
+                                the central dir
+                                (same than number_entry on nospan) */
+  uLong VersionMadeBy;
+  uLong VersionNeeded;
+  uLong size_comment;
+
+  int hasZIP64Record = 0;
+
+  // check first if we find a ZIP64 record
+  central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream);
+  if(central_pos > 0)
+  {
+    hasZIP64Record = 1;
+  }
+  else if(central_pos == 0)
+  {
+    central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream);
+  }
+
+/* disable to allow appending to empty ZIP archive
+        if (central_pos==0)
+            err=ZIP_ERRNO;
+*/
+
+  if(hasZIP64Record)
+  {
+    ZPOS64_T sizeEndOfCentralDirectory;
+    if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
+      err=ZIP_ERRNO;
+
+    /* the signature, already checked */
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* size of zip64 end of central directory record */
+    if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* version made by */
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* version needed to extract */
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* number of this disk */
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* number of the disk with the start of the central directory */
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* total number of entries in the central directory on this disk */
+    if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* total number of entries in the central directory */
+    if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0))
+      err=ZIP_BADZIPFILE;
+
+    /* size of the central directory */
+    if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* offset of start of central directory with respect to the
+    starting disk number */
+    if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    // TODO..
+    // read the comment from the standard central header.
+    size_comment = 0;
+  }
+  else
+  {
+    // Read End of central Directory info
+    if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+      err=ZIP_ERRNO;
+
+    /* the signature, already checked */
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* number of this disk */
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* number of the disk with the start of the central directory */
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK)
+      err=ZIP_ERRNO;
+
+    /* total number of entries in the central dir on this disk */
+    number_entry = 0;
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+    else
+      number_entry = uL;
+
+    /* total number of entries in the central dir */
+    number_entry_CD = 0;
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+    else
+      number_entry_CD = uL;
+
+    if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0))
+      err=ZIP_BADZIPFILE;
+
+    /* size of the central directory */
+    size_central_dir = 0;
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+    else
+      size_central_dir = uL;
+
+    /* offset of start of central directory with respect to the starting disk number */
+    offset_central_dir = 0;
+    if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+      err=ZIP_ERRNO;
+    else
+      offset_central_dir = uL;
+
+
+    /* zipfile global comment length */
+    if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK)
+      err=ZIP_ERRNO;
+  }
+
+  if ((central_pos<offset_central_dir+size_central_dir) &&
+    (err==ZIP_OK))
+    err=ZIP_BADZIPFILE;
+
+  if (err!=ZIP_OK)
+  {
+    ZCLOSE64(pziinit->z_filefunc, pziinit->filestream);
+    return ZIP_ERRNO;
+  }
+
+  if (size_comment>0)
+  {
+    pziinit->globalcomment = (char*)ALLOC(size_comment+1);
+    if (pziinit->globalcomment)
+    {
+      size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment);
+      pziinit->globalcomment[size_comment]=0;
+    }
+  }
+
+  byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir);
+  pziinit->add_position_when_writting_offset = byte_before_the_zipfile;
+
+  {
+    ZPOS64_T size_central_dir_to_read = size_central_dir;
+    size_t buf_size = SIZEDATA_INDATABLOCK;
+    void* buf_read = (void*)ALLOC(buf_size);
+    if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
+      err=ZIP_ERRNO;
+
+    while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+    {
+      ZPOS64_T read_this = SIZEDATA_INDATABLOCK;
+      if (read_this > size_central_dir_to_read)
+        read_this = size_central_dir_to_read;
+
+      if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this)
+        err=ZIP_ERRNO;
+
+      if (err==ZIP_OK)
+        err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this);
+
+      size_central_dir_to_read-=read_this;
+    }
+    TRYFREE(buf_read);
+  }
+  pziinit->begin_pos = byte_before_the_zipfile;
+  pziinit->number_entry = number_entry_CD;
+
+  if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0)
+    err=ZIP_ERRNO;
+
+  return err;
+}
+
+
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+
+/************************************************************/
+extern zipFile MINIZIP_API zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def)
+{
+    zip64_internal ziinit;
+    zip64_internal* zi;
+    int err=ZIP_OK;
+
+    ziinit.z_filefunc.zseek32_file = NULL;
+    ziinit.z_filefunc.ztell32_file = NULL;
+    if (pzlib_filefunc64_32_def==NULL)
+        fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64);
+    else
+        ziinit.z_filefunc = *pzlib_filefunc64_32_def;
+
+    ziinit.filestream = ZOPEN64(ziinit.z_filefunc,
+                  pathname,
+                  (append == APPEND_STATUS_CREATE) ?
+                  (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+                    (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+    if (ziinit.filestream == NULL)
+        return NULL;
+
+    if (append == APPEND_STATUS_CREATEAFTER)
+        ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END);
+
+    ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream);
+    ziinit.in_opened_file_inzip = 0;
+    ziinit.ci.stream_initialised = 0;
+    ziinit.number_entry = 0;
+    ziinit.add_position_when_writting_offset = 0;
+    init_linkedlist(&(ziinit.central_dir));
+
+
+
+    zi = (zip64_internal*)ALLOC(sizeof(zip64_internal));
+    if (zi==NULL)
+    {
+        ZCLOSE64(ziinit.z_filefunc,ziinit.filestream);
+        return NULL;
+    }
+
+    /* now we add file in a zipfile */
+#    ifndef NO_ADDFILEINEXISTINGZIP
+    ziinit.globalcomment = NULL;
+    if (append == APPEND_STATUS_ADDINZIP)
+    {
+      // Read and Cache Central Directory Records
+      err = LoadCentralDirectoryRecord(&ziinit);
+    }
+
+    if (globalcomment)
+    {
+      *globalcomment = ziinit.globalcomment;
+    }
+#    endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+    if (err != ZIP_OK)
+    {
+#    ifndef NO_ADDFILEINEXISTINGZIP
+        TRYFREE(ziinit.globalcomment);
+#    endif /* !NO_ADDFILEINEXISTINGZIP*/
+        TRYFREE(zi);
+        return NULL;
+    }
+    else
+    {
+        *zi = ziinit;
+        return (zipFile)zi;
+    }
+}
+
+extern zipFile MINIZIP_API zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def)
+{
+    if (pzlib_filefunc32_def != NULL)
+    {
+        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+        fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
+        return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
+    }
+    else
+        return zipOpen3(pathname, append, globalcomment, NULL);
+}
+
+extern zipFile MINIZIP_API zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)
+{
+    if (pzlib_filefunc_def != NULL)
+    {
+        zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+        zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
+        zlib_filefunc64_32_def_fill.ztell32_file = NULL;
+        zlib_filefunc64_32_def_fill.zseek32_file = NULL;
+        return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
+    }
+    else
+        return zipOpen3(pathname, append, globalcomment, NULL);
+}
+
+
+
+extern zipFile MINIZIP_API zipOpen (const char* pathname, int append)
+{
+    return zipOpen3((const void*)pathname,append,NULL,NULL);
+}
+
+extern zipFile MINIZIP_API zipOpen64 (const void* pathname, int append)
+{
+    return zipOpen3(pathname,append,NULL,NULL);
+}
+
+int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local)
+{
+  /* write the local header */
+  int err;
+  uInt size_filename = (uInt)strlen(filename);
+  uInt size_extrafield = size_extrafield_local;
+
+  err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4);
+
+  if (err==ZIP_OK)
+  {
+    if(zi->ci.zip64)
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */
+    else
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+  }
+
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+  // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+  if (err==ZIP_OK)
+  {
+    if(zi->ci.zip64)
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */
+    else
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+  }
+  if (err==ZIP_OK)
+  {
+    if(zi->ci.zip64)
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */
+    else
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+  }
+
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+  if(zi->ci.zip64)
+  {
+    size_extrafield += 20;
+  }
+
+  if (err==ZIP_OK)
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2);
+
+  if ((err==ZIP_OK) && (size_filename > 0))
+  {
+    if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+      err = ZIP_ERRNO;
+  }
+
+  if ((err==ZIP_OK) && (size_extrafield_local > 0))
+  {
+    if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)
+      err = ZIP_ERRNO;
+  }
+
+
+  if ((err==ZIP_OK) && (zi->ci.zip64))
+  {
+      // write the Zip64 extended info
+      short HeaderID = 1;
+      short DataSize = 16;
+      ZPOS64_T CompressedSize = 0;
+      ZPOS64_T UncompressedSize = 0;
+
+      // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file)
+      zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream);
+
+      err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2);
+      err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2);
+
+      err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8);
+      err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8);
+  }
+
+  return err;
+}
+
+/*
+ NOTE.
+ When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped
+ before calling this function it can be done with zipRemoveExtraInfoBlock
+
+ It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize
+ unnecessary allocations.
+ */
+extern MINIZIP_API int zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                         const void* extrafield_local, uInt size_extrafield_local,
+                                         const void* extrafield_global, uInt size_extrafield_global,
+                                         const char* comment, int method, int level, int raw,
+                                         int windowBits,int memLevel, int strategy,
+                                         const char* password, uLong crcForCrypting,
+                                         uLong versionMadeBy, uLong flagBase, int zip64)
+{
+    zip64_internal* zi;
+    uInt size_filename;
+    uInt size_comment;
+    uInt i;
+    int err = ZIP_OK;
+
+#    ifdef NOCRYPT
+    if (password != NULL)
+        return ZIP_PARAMERROR;
+#    endif
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+
+#ifdef HAVE_BZIP2
+    if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED))
+      return ZIP_PARAMERROR;
+#else
+    if ((method!=0) && (method!=Z_DEFLATED))
+      return ZIP_PARAMERROR;
+#endif
+
+    zi = (zip64_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+        if (err != ZIP_OK)
+            return err;
+    }
+
+    if (filename==NULL)
+        filename="-";
+
+    if (comment==NULL)
+        size_comment = 0;
+    else
+        size_comment = (uInt)strlen(comment);
+
+    size_filename = (uInt)strlen(filename);
+
+    if (zipfi == NULL)
+        zi->ci.dosDate = 0;
+    else
+    {
+        if (zipfi->dosDate != 0)
+            zi->ci.dosDate = zipfi->dosDate;
+        else
+          zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date);
+    }
+
+    zi->ci.flag = flagBase;
+    if ((level==8) || (level==9))
+      zi->ci.flag |= 2;
+    if ((level==2))
+      zi->ci.flag |= 4;
+    if ((level==1))
+      zi->ci.flag |= 6;
+    if (password != NULL)
+      zi->ci.flag |= 1;
+
+    zi->ci.crc32 = 0;
+    zi->ci.method = method;
+    zi->ci.encrypt = 0;
+    zi->ci.stream_initialised = 0;
+    zi->ci.pos_in_buffered_data = 0;
+    zi->ci.raw = raw;
+    zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream);
+
+    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment;
+    zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data
+
+    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree);
+
+    zi->ci.size_centralExtra = size_extrafield_global;
+    zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+    /* version info */
+    zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+    zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+    zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+    zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+    zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+    zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+    if (zipfi==NULL)
+        zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+    else
+        zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+    if (zipfi==NULL)
+        zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+    else
+        zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+    if(zi->ci.pos_local_header >= 0xffffffff)
+      zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4);
+    else
+      zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset,4);
+
+    for (i=0;i<size_filename;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+    for (i=0;i<size_extrafield_global;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+              *(((const char*)extrafield_global)+i);
+
+    for (i=0;i<size_comment;i++)
+        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+              size_extrafield_global+i) = *(comment+i);
+    if (zi->ci.central_header == NULL)
+        return ZIP_INTERNALERROR;
+
+    zi->ci.zip64 = zip64;
+    zi->ci.totalCompressedData = 0;
+    zi->ci.totalUncompressedData = 0;
+    zi->ci.pos_zip64extrainfo = 0;
+
+    err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local);
+
+#ifdef HAVE_BZIP2
+    zi->ci.bstream.avail_in = (uInt)0;
+    zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+    zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+    zi->ci.bstream.total_in_hi32 = 0;
+    zi->ci.bstream.total_in_lo32 = 0;
+    zi->ci.bstream.total_out_hi32 = 0;
+    zi->ci.bstream.total_out_lo32 = 0;
+#endif
+
+    zi->ci.stream.avail_in = (uInt)0;
+    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+    zi->ci.stream.next_out = zi->ci.buffered_data;
+    zi->ci.stream.total_in = 0;
+    zi->ci.stream.total_out = 0;
+    zi->ci.stream.data_type = Z_BINARY;
+
+#ifdef HAVE_BZIP2
+    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+#else
+    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+#endif
+    {
+        if(zi->ci.method == Z_DEFLATED)
+        {
+          zi->ci.stream.zalloc = (alloc_func)0;
+          zi->ci.stream.zfree = (free_func)0;
+          zi->ci.stream.opaque = (voidpf)0;
+
+          if (windowBits>0)
+              windowBits = -windowBits;
+
+          err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
+
+          if (err==Z_OK)
+              zi->ci.stream_initialised = Z_DEFLATED;
+        }
+        else if(zi->ci.method == Z_BZIP2ED)
+        {
+#ifdef HAVE_BZIP2
+            // Init BZip stuff here
+          zi->ci.bstream.bzalloc = 0;
+          zi->ci.bstream.bzfree = 0;
+          zi->ci.bstream.opaque = (voidpf)0;
+
+          err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35);
+          if(err == BZ_OK)
+            zi->ci.stream_initialised = Z_BZIP2ED;
+#endif
+        }
+
+    }
+
+#    ifndef NOCRYPT
+    zi->ci.crypt_header_size = 0;
+    if ((err==Z_OK) && (password != NULL))
+    {
+        unsigned char bufHead[RAND_HEAD_LEN];
+        unsigned int sizeHead;
+        zi->ci.encrypt = 1;
+        zi->ci.pcrc_32_tab = get_crc_table();
+        /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+        sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+        zi->ci.crypt_header_size = sizeHead;
+
+        if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+                err = ZIP_ERRNO;
+    }
+#    endif
+
+    if (err==Z_OK)
+        zi->in_opened_file_inzip = 1;
+    return err;
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                         const void* extrafield_local, uInt size_extrafield_local,
+                                         const void* extrafield_global, uInt size_extrafield_global,
+                                         const char* comment, int method, int level, int raw,
+                                         int windowBits,int memLevel, int strategy,
+                                         const char* password, uLong crcForCrypting,
+                                         uLong versionMadeBy, uLong flagBase)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 windowBits, memLevel, strategy,
+                                 password, crcForCrypting, versionMadeBy, flagBase, 0);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                         const void* extrafield_local, uInt size_extrafield_local,
+                                         const void* extrafield_global, uInt size_extrafield_global,
+                                         const char* comment, int method, int level, int raw,
+                                         int windowBits,int memLevel, int strategy,
+                                         const char* password, uLong crcForCrypting)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 windowBits, memLevel, strategy,
+                                 password, crcForCrypting, VERSIONMADEBY, 0, 0);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                         const void* extrafield_local, uInt size_extrafield_local,
+                                         const void* extrafield_global, uInt size_extrafield_global,
+                                         const char* comment, int method, int level, int raw,
+                                         int windowBits,int memLevel, int strategy,
+                                         const char* password, uLong crcForCrypting, int zip64)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 windowBits, memLevel, strategy,
+                                 password, crcForCrypting, VERSIONMADEBY, 0, zip64);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                        const void* extrafield_local, uInt size_extrafield_local,
+                                        const void* extrafield_global, uInt size_extrafield_global,
+                                        const char* comment, int method, int level, int raw)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0, VERSIONMADEBY, 0, 0);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                        const void* extrafield_local, uInt size_extrafield_local,
+                                        const void* extrafield_global, uInt size_extrafield_global,
+                                        const char* comment, int method, int level, int raw, int zip64)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, raw,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0, VERSIONMADEBY, 0, zip64);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                        const void* extrafield_local, uInt size_extrafield_local,
+                                        const void*extrafield_global, uInt size_extrafield_global,
+                                        const char* comment, int method, int level, int zip64)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, 0,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0, VERSIONMADEBY, 0, zip64);
+}
+
+extern MINIZIP_API int zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+                                        const void* extrafield_local, uInt size_extrafield_local,
+                                        const void*extrafield_global, uInt size_extrafield_global,
+                                        const char* comment, int method, int level)
+{
+    return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+                                 extrafield_local, size_extrafield_local,
+                                 extrafield_global, size_extrafield_global,
+                                 comment, method, level, 0,
+                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+                                 NULL, 0, VERSIONMADEBY, 0, 0);
+}
+
+local int zip64FlushWriteBuffer(zip64_internal* zi)
+{
+    int err=ZIP_OK;
+
+    if (zi->ci.encrypt != 0)
+    {
+#ifndef NOCRYPT
+        uInt i;
+        int t;
+        for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+            zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t);
+#endif
+    }
+
+    if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data)
+      err = ZIP_ERRNO;
+
+    zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data;
+
+#ifdef HAVE_BZIP2
+    if(zi->ci.method == Z_BZIP2ED)
+    {
+      zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32;
+      zi->ci.bstream.total_in_lo32 = 0;
+      zi->ci.bstream.total_in_hi32 = 0;
+    }
+    else
+#endif
+    {
+      zi->ci.totalUncompressedData += zi->ci.stream.total_in;
+      zi->ci.stream.total_in = 0;
+    }
+
+
+    zi->ci.pos_in_buffered_data = 0;
+
+    return err;
+}
+
+extern MINIZIP_API int zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len)
+{
+    zip64_internal* zi;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip64_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+
+    zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len);
+
+#ifdef HAVE_BZIP2
+    if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw))
+    {
+      zi->ci.bstream.next_in = (void*)buf;
+      zi->ci.bstream.avail_in = len;
+      err = BZ_RUN_OK;
+
+      while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0))
+      {
+        if (zi->ci.bstream.avail_out == 0)
+        {
+          if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+            err = ZIP_ERRNO;
+          zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+          zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+        }
+
+
+        if(err != BZ_RUN_OK)
+          break;
+
+        if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+        {
+          uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;
+//          uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32;
+          err=BZ2_bzCompress(&zi->ci.bstream,  BZ_RUN);
+
+          zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ;
+        }
+      }
+
+      if(err == BZ_RUN_OK)
+        err = ZIP_OK;
+    }
+    else
+#endif
+    {
+      zi->ci.stream.next_in = (Bytef*)buf;
+      zi->ci.stream.avail_in = len;
+
+      while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+      {
+          if (zi->ci.stream.avail_out == 0)
+          {
+              if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+                  err = ZIP_ERRNO;
+              zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+              zi->ci.stream.next_out = zi->ci.buffered_data;
+          }
+
+
+          if(err != ZIP_OK)
+              break;
+
+          if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+          {
+              uLong uTotalOutBefore = zi->ci.stream.total_out;
+              err=deflate(&zi->ci.stream,  Z_NO_FLUSH);
+              if(uTotalOutBefore > zi->ci.stream.total_out)
+              {
+                int bBreak = 0;
+                bBreak++;
+              }
+
+              zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+          }
+          else
+          {
+              uInt copy_this,i;
+              if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+                  copy_this = zi->ci.stream.avail_in;
+              else
+                  copy_this = zi->ci.stream.avail_out;
+
+              for (i = 0; i < copy_this; i++)
+                  *(((char*)zi->ci.stream.next_out)+i) =
+                      *(((const char*)zi->ci.stream.next_in)+i);
+              {
+                  zi->ci.stream.avail_in -= copy_this;
+                  zi->ci.stream.avail_out-= copy_this;
+                  zi->ci.stream.next_in+= copy_this;
+                  zi->ci.stream.next_out+= copy_this;
+                  zi->ci.stream.total_in+= copy_this;
+                  zi->ci.stream.total_out+= copy_this;
+                  zi->ci.pos_in_buffered_data += copy_this;
+              }
+          }
+      }// while(...)
+    }
+
+    return err;
+}
+
+extern MINIZIP_API int zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32)
+{
+    return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32);
+}
+
+extern MINIZIP_API int zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
+{
+    zip64_internal* zi;
+    ZPOS64_T compressed_size;
+    uLong invalidValue = 0xffffffff;
+    short datasize = 0;
+    int err=ZIP_OK;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+    zi = (zip64_internal*)file;
+
+    if (zi->in_opened_file_inzip == 0)
+        return ZIP_PARAMERROR;
+    zi->ci.stream.avail_in = 0;
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+                {
+                        while (err==ZIP_OK)
+                        {
+                                uLong uTotalOutBefore;
+                                if (zi->ci.stream.avail_out == 0)
+                                {
+                                        if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+                                                err = ZIP_ERRNO;
+                                        zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+                                        zi->ci.stream.next_out = zi->ci.buffered_data;
+                                }
+                                uTotalOutBefore = zi->ci.stream.total_out;
+                                err=deflate(&zi->ci.stream,  Z_FINISH);
+                                zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+                        }
+                }
+    else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+    {
+#ifdef HAVE_BZIP2
+      err = BZ_FINISH_OK;
+      while (err==BZ_FINISH_OK)
+      {
+        uLong uTotalOutBefore;
+        if (zi->ci.bstream.avail_out == 0)
+        {
+          if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+            err = ZIP_ERRNO;
+          zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+          zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+        }
+        uTotalOutBefore = zi->ci.bstream.total_out_lo32;
+        err=BZ2_bzCompress(&zi->ci.bstream,  BZ_FINISH);
+        if(err == BZ_STREAM_END)
+          err = Z_STREAM_END;
+
+        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore);
+      }
+
+      if(err == BZ_FINISH_OK)
+        err = ZIP_OK;
+#endif
+    }
+
+    if (err==Z_STREAM_END)
+        err=ZIP_OK; /* this is normal */
+
+    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+                {
+        if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO)
+            err = ZIP_ERRNO;
+                }
+
+    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+    {
+        int tmp_err = deflateEnd(&zi->ci.stream);
+        if (err == ZIP_OK)
+            err = tmp_err;
+        zi->ci.stream_initialised = 0;
+    }
+#ifdef HAVE_BZIP2
+    else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+    {
+      int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream);
+                        if (err==ZIP_OK)
+                                err = tmperr;
+                        zi->ci.stream_initialised = 0;
+    }
+#endif
+
+    if (!zi->ci.raw)
+    {
+        crc32 = (uLong)zi->ci.crc32;
+        uncompressed_size = zi->ci.totalUncompressedData;
+    }
+    compressed_size = zi->ci.totalCompressedData;
+
+#    ifndef NOCRYPT
+    compressed_size += zi->ci.crypt_header_size;
+#    endif
+
+    // update Current Item crc and sizes,
+    if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff)
+    {
+      /*version Made by*/
+      zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2);
+      /*version needed*/
+      zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2);
+
+    }
+
+    zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+
+
+    if(compressed_size >= 0xffffffff)
+      zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/
+    else
+      zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/
+
+    /// set internal file attributes field
+    if (zi->ci.stream.data_type == Z_ASCII)
+        zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+
+    if(uncompressed_size >= 0xffffffff)
+      zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/
+    else
+      zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/
+
+    // Add ZIP64 extra info field for uncompressed size
+    if(uncompressed_size >= 0xffffffff)
+      datasize += 8;
+
+    // Add ZIP64 extra info field for compressed size
+    if(compressed_size >= 0xffffffff)
+      datasize += 8;
+
+    // Add ZIP64 extra info field for relative offset to local file header of current file
+    if(zi->ci.pos_local_header >= 0xffffffff)
+      datasize += 8;
+
+    if(datasize > 0)
+    {
+      char* p = NULL;
+
+      if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree)
+      {
+        // we can not write more data to the buffer that we have room for.
+        return ZIP_BADZIPFILE;
+      }
+
+      p = zi->ci.central_header + zi->ci.size_centralheader;
+
+      // Add Extra Information Header for 'ZIP64 information'
+      zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID
+      p += 2;
+      zip64local_putValue_inmemory(p, datasize, 2); // DataSize
+      p += 2;
+
+      if(uncompressed_size >= 0xffffffff)
+      {
+        zip64local_putValue_inmemory(p, uncompressed_size, 8);
+        p += 8;
+      }
+
+      if(compressed_size >= 0xffffffff)
+      {
+        zip64local_putValue_inmemory(p, compressed_size, 8);
+        p += 8;
+      }
+
+      if(zi->ci.pos_local_header >= 0xffffffff)
+      {
+        zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8);
+        p += 8;
+      }
+
+      // Update how much extra free space we got in the memory buffer
+      // and increase the centralheader size so the new ZIP64 fields are included
+      // ( 4 below is the size of HeaderID and DataSize field )
+      zi->ci.size_centralExtraFree -= datasize + 4;
+      zi->ci.size_centralheader += datasize + 4;
+
+      // Update the extra info size field
+      zi->ci.size_centralExtra += datasize + 4;
+      zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2);
+    }
+
+    if (err==ZIP_OK)
+        err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);
+
+    free(zi->ci.central_header);
+
+    if (err==ZIP_OK)
+    {
+        // Update the LocalFileHeader with the new values.
+
+        ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream);
+
+        if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+
+        if (err==ZIP_OK)
+            err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+        if(uncompressed_size >= 0xffffffff)
+        {
+          if(zi->ci.pos_zip64extrainfo > 0)
+          {
+            // Update the size in the ZIP64 extended field.
+            if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0)
+              err = ZIP_ERRNO;
+
+            if (err==ZIP_OK) /* compressed size, unknown */
+              err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8);
+
+            if (err==ZIP_OK) /* uncompressed size, unknown */
+              err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8);
+          }
+        }
+        else
+        {
+          if (err==ZIP_OK) /* compressed size, unknown */
+              err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+          if (err==ZIP_OK) /* uncompressed size, unknown */
+              err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+        }
+
+        if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+            err = ZIP_ERRNO;
+    }
+
+    zi->number_entry ++;
+    zi->in_opened_file_inzip = 0;
+
+    return err;
+}
+
+extern MINIZIP_API int zipCloseFileInZip (zipFile file)
+{
+    return zipCloseFileInZipRaw (file,0,0);
+}
+
+int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
+{
+  int err = ZIP_OK;
+  ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset;
+
+  err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4);
+
+  /*num disks*/
+    if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+  /*relative offset*/
+    if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8);
+
+  /*total disks*/ /* Do not support spawning of disk so always say 1 here*/
+    if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4);
+
+    return err;
+}
+
+int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
+{
+  int err = ZIP_OK;
+
+  uLong Zip64DataSize = 44;
+
+  err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4);
+
+  if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ?
+
+  if (err==ZIP_OK) /* version made by */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
+
+  if (err==ZIP_OK) /* version needed */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
+
+  if (err==ZIP_OK) /* number of this disk */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+  if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+  if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
+
+  if (err==ZIP_OK) /* total number of entries in the central dir */
+    err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
+
+  if (err==ZIP_OK) /* size of the central directory */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8);
+
+  if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */
+  {
+    ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8);
+  }
+  return err;
+}
+int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
+{
+  int err = ZIP_OK;
+
+  /*signature*/
+  err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+  if (err==ZIP_OK) /* number of this disk */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+  if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+  if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+  {
+    {
+      if(zi->number_entry >= 0xFFFF)
+        err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record
+      else
+        err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+    }
+  }
+
+  if (err==ZIP_OK) /* total number of entries in the central dir */
+  {
+    if(zi->number_entry >= 0xFFFF)
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record
+    else
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+  }
+
+  if (err==ZIP_OK) /* size of the central directory */
+    err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+  if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */
+  {
+    ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
+    if(pos >= 0xffffffff)
+    {
+      err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4);
+    }
+    else
+                  err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);
+  }
+
+   return err;
+}
+
+int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
+{
+  int err = ZIP_OK;
+  uInt size_global_comment = 0;
+
+  if(global_comment != NULL)
+    size_global_comment = (uInt)strlen(global_comment);
+
+  err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+  if (err == ZIP_OK && size_global_comment > 0)
+  {
+    if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment)
+      err = ZIP_ERRNO;
+  }
+  return err;
+}
+
+extern MINIZIP_API int zipClose (zipFile file, const char* global_comment)
+{
+    zip64_internal* zi;
+    int err = 0;
+    uLong size_centraldir = 0;
+    ZPOS64_T centraldir_pos_inzip;
+    ZPOS64_T pos;
+
+    if (file == NULL)
+        return ZIP_PARAMERROR;
+
+    zi = (zip64_internal*)file;
+
+    if (zi->in_opened_file_inzip == 1)
+    {
+        err = zipCloseFileInZip (file);
+    }
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+    if (global_comment==NULL)
+        global_comment = zi->globalcomment;
+#endif
+
+    centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream);
+
+    if (err==ZIP_OK)
+    {
+        linkedlist_datablock_internal* ldi = zi->central_dir.first_block;
+        while (ldi!=NULL)
+        {
+            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+            {
+                if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block)
+                    err = ZIP_ERRNO;
+            }
+
+            size_centraldir += ldi->filled_in_this_block;
+            ldi = ldi->next_datablock;
+        }
+    }
+    free_linkedlist(&(zi->central_dir));
+
+    pos = centraldir_pos_inzip - zi->add_position_when_writting_offset;
+    if(pos >= 0xffffffff)
+    {
+      ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream);
+      Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip);
+
+      Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos);
+    }
+
+    if (err==ZIP_OK)
+      err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip);
+
+    if(err == ZIP_OK)
+      err = Write_GlobalComment(zi, global_comment);
+
+    if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0)
+        if (err == ZIP_OK)
+            err = ZIP_ERRNO;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+    TRYFREE(zi->globalcomment);
+#endif
+    TRYFREE(zi);
+
+    return err;
+}
+
+extern MINIZIP_API int zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader)
+{
+  char* p = pData;
+  int size = 0;
+  char* pNewHeader;
+  char* pTmp;
+  short header;
+  short dataSize;
+
+  int retVal = ZIP_OK;
+
+  if(pData == NULL || *dataLen < 4)
+    return ZIP_PARAMERROR;
+
+  pNewHeader = (char*)ALLOC(*dataLen);
+  pTmp = pNewHeader;
+
+  while(p < (pData + *dataLen))
+  {
+    header = *(short*)p;
+    dataSize = *(((short*)p)+1);
+
+    if( header == sHeader ) // Header found.
+    {
+      p += dataSize + 4; // skip it. do not copy to temp buffer
+    }
+    else
+    {
+      // Extra Info block should not be removed, So copy it to the temp buffer.
+      memcpy(pTmp, p, dataSize + 4);
+      p += dataSize + 4;
+      size += dataSize + 4;
+    }
+
+  }
+
+  if(size < *dataLen)
+  {
+    // clean old extra info block.
+    memset(pData,0, *dataLen);
+
+    // copy the new extra info block over the old
+    if(size > 0)
+      memcpy(pData, pNewHeader, size);
+
+    // set the new extra info size
+    *dataLen = size;
+
+    retVal = ZIP_OK;
+  }
+  else
+    retVal = ZIP_ERRNO;
+
+  TRYFREE(pNewHeader);
+
+  return retVal;
+}
diff --git a/SrcLib/io/fwAtomsBoostIO/CMakeLists.txt b/SrcLib/io/fwAtomsBoostIO/CMakeLists.txt
new file mode 100644
index 0000000..ae901d6
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/CMakeLists.txt
@@ -0,0 +1,5 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+)
+
diff --git a/SrcLib/io/fwAtomsBoostIO/COPYING b/SrcLib/io/fwAtomsBoostIO/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/io/fwAtomsBoostIO/COPYING.LESSER b/SrcLib/io/fwAtomsBoostIO/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/io/fwAtomsBoostIO/Properties.cmake b/SrcLib/io/fwAtomsBoostIO/Properties.cmake
new file mode 100644
index 0000000..99979a2
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsBoostIO )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtoms fwCore fwMemory fwTools fwZip )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwAtomsBoostIO/bin/build.options b/SrcLib/io/fwAtomsBoostIO/bin/build.options
new file mode 100644
index 0000000..b408db5
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/bin/build.options
@@ -0,0 +1,8 @@
+TYPE = 'shared'
+VERSION = '0.1'
+#USE = []
+LIB = [ 'fwAtoms_0-1',
+        'fwTools_0-1',
+        'fwZip_0-1',
+        'fwMemory_0-1',
+        ]
diff --git a/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Reader.hpp b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Reader.hpp
new file mode 100644
index 0000000..592fb7c
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Reader.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSBOOSTIO_READER_HPP__
+#define __FWATOMSBOOSTIO_READER_HPP__
+
+#include <fwCore/macros.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "fwAtomsBoostIO/types.hpp"
+#include "fwAtomsBoostIO/config.hpp"
+
+namespace fwAtoms
+{
+    class Base;
+}
+namespace fwZip
+{
+    class IReadArchive;
+}
+
+namespace fwAtomsBoostIO
+{
+
+class FWATOMSBOOSTIO_CLASS_API Reader
+{
+
+public:
+
+    FWATOMSBOOSTIO_API SPTR(::fwAtoms::Base) read( SPTR(::fwZip::IReadArchive) archive,
+                                                   const ::boost::filesystem::path& rootFilename = "root.json",
+                                                   FormatType format = JSON ) const;
+
+protected:
+
+    SPTR(::fwAtoms::Base) m_atom;
+
+};
+
+}
+
+#endif /* __FWATOMSBOOSTIO_READER_HPP__ */
+
diff --git a/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Writer.hpp b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Writer.hpp
new file mode 100644
index 0000000..e7be276
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/Writer.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSBOOSTIO_WRITER_HPP__
+#define __FWATOMSBOOSTIO_WRITER_HPP__
+
+#include <sstream>
+
+#include <fwCore/macros.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include "fwAtomsBoostIO/types.hpp"
+#include "fwAtomsBoostIO/config.hpp"
+
+namespace fwAtoms
+{
+    class Base;
+}
+namespace fwZip
+{
+    class IWriteArchive;
+}
+
+namespace fwAtomsBoostIO
+{
+
+class FWATOMSBOOSTIO_CLASS_API Writer
+{
+
+public:
+
+    /// Defines writer version.
+    FWATOMSBOOSTIO_API static const std::string s_VERSION;
+
+    /// Defines key to retrieve fwAtoms version from file.
+    FWATOMSBOOSTIO_API static const std::string s_ATOMS_VERSION_KEY;
+
+    /// Defines key to retrieve writer version from file.
+    FWATOMSBOOSTIO_API static const std::string s_WRITER_VERSION_KEY;
+
+    Writer( SPTR(::fwAtoms::Base) atom ) : m_atom(atom) {}
+
+    FWATOMSBOOSTIO_API void write( SPTR(::fwZip::IWriteArchive) archive,
+                                   const ::boost::filesystem::path& rootFilename = "root.json",
+                                   FormatType format = JSON ) const;
+
+protected:
+
+    SPTR(::fwAtoms::Base) m_atom;
+
+};
+
+}
+
+#endif /* __FWATOMSBOOSTIO_WRITER_HPP__ */
+
diff --git a/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/config.hpp b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/config.hpp
new file mode 100644
index 0000000..13bd69c
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWATOMSBOOSTIO_CONFIG_HPP_
+#define _FWATOMSBOOSTIO_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMSBOOSTIO_EXPORTS
+            #define FWATOMSBOOSTIO_API __declspec(dllexport)
+        #else
+            #define FWATOMSBOOSTIO_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMSBOOSTIO_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMSBOOSTIO_EXPORTS
+            #define FWATOMSBOOSTIO_API __attribute__ ((visibility("default")))
+            #define FWATOMSBOOSTIO_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMSBOOSTIO_API __attribute__ ((visibility("hidden")))
+            #define FWATOMSBOOSTIO_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMSBOOSTIO_API
+        #define FWATOMSBOOSTIO_CLASS_API
+
+    #endif
+
+#endif //FWATOMSBOOSTIO_API
+
diff --git a/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/types.hpp b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/types.hpp
new file mode 100644
index 0000000..20b6720
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/include/fwAtomsBoostIO/types.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSBOOSTIO_TYPES_HPP__
+#define __FWATOMSBOOSTIO_TYPES_HPP__
+
+namespace fwAtomsBoostIO
+{
+
+typedef enum
+{
+    JSON,
+    XML,
+    UNSPECIFIED,
+} FormatType;
+
+} // namespace fwAtomsBoostIO
+
+
+#endif // __FWATOMSBOOSTIO_TYPES_HPP__
+
diff --git a/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Reader.cpp b/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Reader.cpp
new file mode 100644
index 0000000..7e6f41a
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Reader.cpp
@@ -0,0 +1,356 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/foreach.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwZip/IReadArchive.hpp>
+
+#include "fwAtomsBoostIO/Writer.hpp"
+#include "fwAtomsBoostIO/Reader.hpp"
+
+namespace fwAtomsBoostIO
+{
+
+//-----------------------------------------------------------------------------
+struct PTreeVisitor
+{
+
+typedef std::map< std::string, ::fwAtoms::Base::sptr > AtomCacheType;
+
+AtomCacheType m_cache;
+const ::boost::property_tree::ptree &m_root;
+::fwZip::IReadArchive::sptr m_archive;
+
+PTreeVisitor(const ::boost::property_tree::ptree &pt, ::fwZip::IReadArchive::sptr archive) :
+    m_root(pt), m_archive(archive)
+{}
+
+//-----------------------------------------------------------------------------
+
+AtomCacheType::mapped_type hitCache(const AtomCacheType::key_type &path) const
+{
+    AtomCacheType::const_iterator iter = m_cache.find(path);
+    if(iter != m_cache.end())
+    {
+        OSLM_TRACE(" cache hit : '" << path  << "'" );
+        return iter->second;
+    }
+    OSLM_TRACE(" cache miss : '" << path  << "'" );
+    return AtomCacheType::mapped_type();
+}
+
+//-----------------------------------------------------------------------------
+
+void cache(const std::string &ptpath, const AtomCacheType::mapped_type &atom)
+{
+    OSLM_TRACE(" cache : '" << ptpath << "' : " << atom->getClassname() );
+    m_cache.insert( AtomCacheType::value_type( ptpath, atom ) );
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Boolean::sptr getBoolean(const ::boost::property_tree::ptree &pt, const std::string & ptpath)
+{
+    ::fwAtoms::Boolean::sptr atom = ::fwAtoms::Boolean::New(pt.get<std::string>("boolean.value"));
+    this->cache(ptpath, atom);
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Numeric::sptr getNumeric(const ::boost::property_tree::ptree &pt, const std::string & ptpath )
+{
+    ::fwAtoms::Numeric::sptr atom = ::fwAtoms::Numeric::New(pt.get<std::string>("numeric.value"));
+    this->cache(ptpath, atom);
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::String::sptr getString(const ::boost::property_tree::ptree &pt, const std::string & ptpath )
+{
+    ::fwAtoms::String::sptr atom = ::fwAtoms::String::New(pt.get<std::string>("string.value"));
+    this->cache(ptpath, atom);
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Sequence::sptr getSequence(const ::boost::property_tree::ptree &pt, const std::string & ptpath )
+{
+    ::fwAtoms::Sequence::sptr atom = ::fwAtoms::Sequence::New();
+    this->cache(ptpath, atom);
+
+    BOOST_FOREACH( const ::boost::property_tree::ptree::value_type &val, pt.get_child("sequence") )
+    {
+        std::string subPath = ptpath + (ptpath.empty()?"":".") + "sequence." + val.first;
+        ::fwAtoms::Base::sptr subAtom = this->visit(val.second, subPath );
+        atom->push_back( subAtom );
+    }
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Map::sptr getMap(const ::boost::property_tree::ptree &pt, const std::string & ptpath )
+{
+    ::fwAtoms::Map::sptr atom = ::fwAtoms::Map::New();
+    this->cache(ptpath, atom);
+
+    BOOST_FOREACH( const ::boost::property_tree::ptree::value_type &val, pt.get_child("map") )
+    {
+        std::string subPath = ptpath + (ptpath.empty()?"":".") + "map." + val.first + ".value";
+
+        ::boost::property_tree::ptree mapChild = val.second;
+        ::boost::property_tree::ptree value    = mapChild.get_child("value");
+
+        ::fwAtoms::Base::sptr subAtom = this->visit( value, subPath );
+
+        std::string key = mapChild.get<std::string>("key");
+        atom->insert( key, subAtom );
+    }
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr getObject(const ::boost::property_tree::ptree &pt, const std::string & ptpath )
+{
+    using ::boost::property_tree::ptree;
+    ::fwAtoms::Object::sptr atom = ::fwAtoms::Object::New();
+    this->cache(ptpath, atom);
+
+    const ptree& metaInfosTree  = pt.get_child("object.meta_infos");
+    const ptree& attributesTree = pt.get_child("object.attributes");
+
+    ::fwAtoms::Object::MetaInfosType metaInfos;
+    BOOST_FOREACH( const ptree::value_type &val, metaInfosTree )
+    {
+        ::boost::property_tree::ptree item = val.second;
+
+        ::fwAtoms::Object::MetaInfosType::value_type value(
+                item.get<std::string>("key"), item.get<std::string>("value") );
+        metaInfos.insert( value );
+    }
+    atom->setMetaInfos(metaInfos);
+
+
+    ::fwAtoms::Object::AttributesType attributes;
+    BOOST_FOREACH( const ptree::value_type &val, attributesTree )
+    {
+        std::string subPath = ptpath + (ptpath.empty()?"":".")+ "object.attributes." + val.first;
+        ::fwAtoms::Base::sptr subAtom = this->visit(val.second, subPath );
+        ::fwAtoms::Object::AttributesType::value_type value(val.first, subAtom);
+        attributes.insert( value );
+    }
+    atom->setAttributes(attributes);
+
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+
+class AtomsBoostIOReadStream : public ::fwMemory::stream::in::IFactory
+{
+public:
+    AtomsBoostIOReadStream(const ::fwZip::IReadArchive::sptr& archive, const boost::filesystem::path &path):
+        m_archive(archive), m_path(path)
+    {};
+
+protected:
+
+    SPTR(std::istream) get()
+    {
+        return m_archive->getFile(m_path);
+    }
+
+    ::fwZip::IReadArchive::sptr m_archive;
+    boost::filesystem::path m_path;
+};
+
+
+
+
+::fwAtoms::Blob::sptr getBlob(const ::boost::property_tree::ptree &pt, const std::string & ptpath)
+{
+    ::fwAtoms::Blob::sptr atom = ::fwAtoms::Blob::New();
+    ::fwMemory::BufferObject::sptr buffObj = ::fwMemory::BufferObject::New();
+    atom->setBufferObject(buffObj);
+
+    this->cache(ptpath, atom);
+
+    const std::string bufType = pt.get<std::string>("blob.buffer_type");
+
+    if(bufType == "raw")
+    {
+        size_t buffSize = pt.get<size_t>("blob.buffer_size");
+        if(buffSize > 0)
+        {
+            const ::boost::filesystem::path bufFile = pt.get<std::string>("blob.buffer");
+            ::boost::filesystem::path sourceFile = "";
+            ::fwMemory::FileFormatType format = ::fwMemory::OTHER;
+
+            if( ::boost::filesystem::is_directory(m_archive->getArchivePath()))
+            {
+                sourceFile = m_archive->getArchivePath() / bufFile;
+                format = ::fwMemory::RAW;
+            }
+
+            buffObj->setIStreamFactory( ::boost::make_shared< AtomsBoostIOReadStream >(m_archive->clone(), bufFile),
+                                       buffSize, sourceFile, format);
+        }
+    }
+    else
+    {
+        FW_RAISE("Buffer type '" << bufType << "' unknown.");
+    }
+
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr visit(const ::boost::property_tree::ptree &pt, std::string ptpath = "")
+{
+    if(pt.empty())
+    {
+        return ::fwAtoms::Base::sptr();
+    }
+
+    ::fwAtoms::Base::sptr atom = this->hitCache(ptpath);
+
+    if(atom)
+    {
+        return atom;
+    }
+
+    if(pt.count("numeric") == 1 )
+    {
+        atom = this->getNumeric( pt, ptpath );
+    }
+    else if(pt.count("string") == 1)
+    {
+        atom = this->getString( pt, ptpath );
+    }
+    else if(pt.count("boolean") == 1)
+    {
+        atom = this->getBoolean( pt, ptpath );
+    }
+    else if(pt.count("sequence") == 1)
+    {
+        atom = this->getSequence( pt, ptpath );
+    }
+    else if(pt.count("map") == 1)
+    {
+        atom = this->getMap( pt, ptpath );
+    }
+    else if(pt.count("object") == 1)
+    {
+        atom = this->getObject( pt, ptpath );
+    }
+    else if(pt.count("blob") == 1)
+    {
+        atom = this->getBlob( pt, ptpath );
+    }
+    else if(pt.count("ref") == 1)
+    {
+        std::string ref = pt.get<std::string>("ref");
+        const ::boost::property_tree::ptree &refPt = m_root.get_child(ref);
+        atom = this->visit( refPt, ref );
+    }
+    else
+    {
+        SLM_ASSERT("You shall not pass", 0);
+    }
+
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr visit()
+{
+    return this->visit(m_root);
+}
+
+};
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr Reader::read( ::fwZip::IReadArchive::sptr archive,
+                                    const ::boost::filesystem::path& rootFilename,
+                                    FormatType format ) const
+{
+    ::boost::property_tree::ptree root;
+    ::fwAtoms::Base::sptr atom;
+
+    SPTR(std::istream) in = archive->getFile(rootFilename);
+    if(format == JSON)
+    {
+        ::boost::property_tree::json_parser::read_json(*in, root);
+    }
+    else if(format == XML)
+    {
+        ::boost::property_tree::xml_parser::read_xml(*in, root);
+    }
+    else
+    {
+        SLM_ASSERT("You shall not pass", 0);
+    }
+
+    typedef ::boost::property_tree::ptree::const_assoc_iterator PtreeItType;
+    PtreeItType hasVersionsIt = root.find("versions");
+    FW_RAISE_IF("Failed to read file '" << rootFilename.string() << "':\nno versions found in specified file.",
+            hasVersionsIt == root.not_found());
+
+    ::boost::property_tree::ptree versions = root.get_child("versions");
+
+    PtreeItType hasAtomsVersionsIt = versions.find(Writer::s_ATOMS_VERSION_KEY);
+    FW_RAISE_IF("Failed to read file '" << rootFilename.string() << "':\nno atoms version found in specified file.",
+            hasAtomsVersionsIt == versions.not_found());
+
+    PtreeItType hasWriterVersionsIt = versions.find(Writer::s_WRITER_VERSION_KEY);
+    FW_RAISE_IF("Failed to read file '" << rootFilename.string() << "':\nno writer version found in specified file",
+            hasWriterVersionsIt == versions.not_found());
+
+    const std::string& atomsVersion = versions.get< std::string >(Writer::s_ATOMS_VERSION_KEY);
+    const std::string& writerVersion = versions.get< std::string >(Writer::s_WRITER_VERSION_KEY);
+
+    FW_RAISE_IF("Failed to read file '" << rootFilename.string() << "':\n"
+            << "Detected file version is '" << writerVersion << "'"
+            << " whereas current version is '" << Writer::s_VERSION << "'", Writer::s_VERSION != writerVersion);
+
+    FW_RAISE_IF("Failed to read file '" << rootFilename.string() << "':\n"
+            << "Detected atoms version is '" << atomsVersion << "'"
+            << " whereas current version is '" << ::fwAtoms::Base::s_VERSION << "'",
+            ::fwAtoms::Base::s_VERSION != atomsVersion);
+
+    PTreeVisitor visitor(root, archive);
+    atom = visitor.visit();
+
+    return atom;
+}
+
+}
+
diff --git a/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Writer.cpp b/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Writer.cpp
new file mode 100644
index 0000000..6483aee
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/src/fwAtomsBoostIO/Writer.cpp
@@ -0,0 +1,319 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2014.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwMemory/BufferManager.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+
+#include <fwZip/IWriteArchive.hpp>
+
+#include "fwAtomsBoostIO/Writer.hpp"
+
+
+
+namespace fwAtomsBoostIO
+{
+
+const std::string Writer::s_VERSION = "1";
+const std::string Writer::s_ATOMS_VERSION_KEY = "atoms_version";
+const std::string Writer::s_WRITER_VERSION_KEY = "writer_version";
+
+//-----------------------------------------------------------------------------
+
+struct AtomVisitor
+{
+
+typedef std::map< ::fwAtoms::Base::sptr, ::boost::property_tree::ptree > PropTreeCacheType;
+
+PropTreeCacheType m_cache;
+::fwZip::IWriteArchive::sptr m_archive;
+const std::string m_dirPrefix;
+
+
+AtomVisitor( ::fwZip::IWriteArchive::sptr archive, const std::string &dirPrefix ) :
+    m_archive(archive), m_dirPrefix(dirPrefix)
+{}
+
+//-----------------------------------------------------------------------------
+
+PropTreeCacheType::mapped_type hitCache(const PropTreeCacheType::key_type &atom) const
+{
+    PropTreeCacheType::const_iterator iter = m_cache.find(atom);
+    if(iter != m_cache.end())
+    {
+        return iter->second;
+    }
+    return PropTreeCacheType::mapped_type();
+}
+
+//-----------------------------------------------------------------------------
+
+void cache(const PropTreeCacheType::key_type &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree ref;
+    ref.put("ref", ptpath );
+    m_cache.insert( PropTreeCacheType::value_type( atom, ref ) );
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Boolean::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    this->cache(atom, ptpath);
+    pt.put("boolean.value", atom->getValue()?"true":"false");
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Numeric::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    this->cache(atom, ptpath);
+    pt.put("numeric.value", atom->getString());
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::String::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    this->cache(atom, ptpath);
+    pt.put("string.value", atom->getString());
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Map::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    ::boost::property_tree::ptree map;
+    this->cache(atom, ptpath);
+    std::string path = ptpath + (ptpath.empty()?"":".") + "map";
+    unsigned long long count = 0;
+    BOOST_FOREACH(const ::fwAtoms::Map::MapType::value_type& elt, atom->getValue())
+    {
+        const std::string nodeName = "item_" + ::boost::lexical_cast< std::string >(count++);
+        ::boost::property_tree::ptree mapChild;
+        mapChild.put("key", elt.first);
+        mapChild.add_child("value", this->visit(elt.second, path + "." + nodeName + ".value"));
+
+        map.add_child(nodeName, mapChild);
+    }
+    pt.add_child("map", map);
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Sequence::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    ::boost::property_tree::ptree seq;
+    this->cache(atom, ptpath);
+    std::string path = ptpath + (ptpath.empty()?"":".") + "sequence";
+
+    unsigned long long count = 0;
+    BOOST_FOREACH( const ::fwAtoms::Sequence::SequenceType::value_type& elt, atom->getValue())
+    {
+        const std::string nodeName = ::boost::lexical_cast< std::string >(count++);
+        seq.add_child(nodeName, this->visit(elt, path + "." + nodeName));
+    }
+    pt.add_child("sequence", seq);
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Object::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    ::boost::property_tree::ptree object;
+    this->cache(atom, ptpath);
+    std::string path = ptpath + (ptpath.empty()?"":".") + "object";
+
+    const ::fwAtoms::Object::MetaInfosType& metaInfos = atom->getMetaInfos();
+    ::boost::property_tree::ptree metaInfosPt;
+    unsigned long long count = 0;
+    BOOST_FOREACH(const ::fwAtoms::Object::MetaInfosType::value_type& info, metaInfos)
+    {
+        const std::string nodeName = "item_" + ::boost::lexical_cast< std::string >(count++);
+        ::boost::property_tree::ptree item;
+        item.put("key", info.first);
+        item.put("value", info.second);
+        metaInfosPt.push_back(::boost::property_tree::ptree::value_type(nodeName, item));
+    }
+    object.add_child("meta_infos", metaInfosPt);
+
+    const ::fwAtoms::Object::AttributesType& attributes = atom->getAttributes();
+    ::boost::property_tree::ptree attributesPt;
+    BOOST_FOREACH(const ::fwAtoms::Object::AttributesType::value_type attr, attributes)
+    {
+        ::boost::property_tree::ptree childAttributes = this->visit(attr.second, path + ".attributes." + attr.first);
+        attributesPt.add_child(attr.first, childAttributes);
+    }
+    object.add_child("attributes", attributesPt);
+
+    pt.add_child("object", object);
+
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Blob::sptr &atom, const std::string &ptpath)
+{
+    ::boost::property_tree::ptree pt;
+    this->cache(atom, ptpath);
+    std::string path = ptpath + (ptpath.empty()?"":".") + "blob";
+
+    std::string bufType = "raw";
+    pt.put("blob.buffer_type", bufType);
+
+    ::fwMemory::BufferObject::sptr buffObj = atom->getBufferObject();
+    if (!buffObj || buffObj->getSize() == 0)
+    {
+        pt.put("blob.buffer_size", 0);
+    }
+    else
+    {
+        ::boost::filesystem::path bufFile = m_dirPrefix;
+        size_t buffSize = buffObj->getSize();
+
+        const ::fwMemory::BufferManager::StreamInfo streamInfo = buffObj->getStreamInfo();
+        const ::boost::filesystem::path dumpedFile = streamInfo.fsFile;
+        const ::fwMemory::FileFormatType& format = streamInfo.format;
+
+        bufFile /= ::fwTools::UUID::generateUUID() + ".raw";
+
+        if ( !dumpedFile.empty() && (format & ::fwMemory::RAW) )
+        {
+            m_archive->putFile(dumpedFile, bufFile);
+        }
+        else
+        {
+            SPTR(std::istream) is = streamInfo.stream;
+            SLM_ASSERT("no istream", is);
+
+            SPTR(std::ostream) os = m_archive->createFile(bufFile);
+            *os << is->rdbuf();
+        }
+
+        pt.put("blob.buffer_size", buffSize);
+        pt.put("blob.buffer", bufFile.generic_string());
+    }
+
+    return pt;
+}
+
+//-----------------------------------------------------------------------------
+
+::boost::property_tree::ptree visit(const ::fwAtoms::Base::sptr &atom, std::string ptpath = "")
+{
+    ::boost::property_tree::ptree pt;
+    ::boost::property_tree::ptree ref;
+
+    if (!atom)
+    {
+        return pt;
+    }
+
+    ref = this->hitCache(atom);
+    if( !ref.empty() )
+    {
+        return ref;
+    }
+
+    switch(atom->type())
+    {
+    case ::fwAtoms::Base::BOOLEAN :
+        pt = this->visit(::fwAtoms::Boolean::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::NUMERIC :
+        pt = this->visit(::fwAtoms::Numeric::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::STRING :
+        pt = this->visit(::fwAtoms::String::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::OBJECT :
+        pt = this->visit(::fwAtoms::Object::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::SEQUENCE :
+        pt = this->visit(::fwAtoms::Sequence::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::MAP :
+        pt = this->visit(::fwAtoms::Map::dynamicCast(atom), ptpath);
+        break;
+    case ::fwAtoms::Base::BLOB :
+        pt = this->visit(::fwAtoms::Blob::dynamicCast(atom), ptpath);
+        break;
+    default:
+        SLM_ASSERT("You shall not pass", 0);
+        break;
+    }
+
+    return pt;
+}
+
+};
+
+//-----------------------------------------------------------------------------
+
+void Writer::write( ::fwZip::IWriteArchive::sptr archive,
+                    const ::boost::filesystem::path& rootFilename,
+                    FormatType format ) const
+{
+    ::boost::property_tree::ptree root;
+    AtomVisitor visitor(archive, rootFilename.stem().string() + "-" + ((format==JSON)?"json":"xml") );
+    root = visitor.visit(m_atom);
+
+    ::boost::property_tree::ptree versions;
+    versions.put(s_ATOMS_VERSION_KEY, ::fwAtoms::Base::s_VERSION);
+    versions.put(s_WRITER_VERSION_KEY, Writer::s_VERSION);
+
+    root.add_child("versions", versions);
+
+    SPTR(std::ostream) os = archive->createFile(rootFilename);
+    switch(format)
+    {
+    case JSON:
+        ::boost::property_tree::json_parser::write_json(*os, root, false);
+        break;
+    case XML:
+    {
+        ::boost::property_tree::xml_writer_settings<char> settings(' ', 4);
+        ::boost::property_tree::xml_parser::write_xml(*os, root, settings);
+        break;
+    }
+    default:
+        SLM_ASSERT("You shall not pass", 0);
+        break;
+    }
+}
+
+
+
+}
diff --git a/SrcLib/io/fwAtomsBoostIO/test/CMakeLists.txt b/SrcLib/io/fwAtomsBoostIO/test/CMakeLists.txt
new file mode 100644
index 0000000..47e309c
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/test/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+fwLoadProperties()
+
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/SrcLib/io/fwAtomsBoostIO/test/Properties.cmake b/SrcLib/io/fwAtomsBoostIO/test/Properties.cmake
new file mode 100644
index 0000000..bc66d67
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsBoostIOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwAtomsBoostIO fwMemory )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwAtomsBoostIO/test/cppunit.options b/SrcLib/io/fwAtomsBoostIO/test/cppunit.options
new file mode 100644
index 0000000..c1c94fb
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/test/cppunit.options
@@ -0,0 +1,13 @@
+CLASSTEST=[
+    'BoostIOTest',
+]
+
+LIB = [
+    'fwTools_0-1',
+    'fwCore_0-1',
+    'fwAtoms_0-1',
+    'fwAtomsBoostIO_0-1',
+    'fwMemory_0-1'
+    ]
+CONSOLE = 'yes'
+
diff --git a/SrcLib/io/fwAtomsBoostIO/test/tu/include/BoostIOTest.hpp b/SrcLib/io/fwAtomsBoostIO/test/tu/include/BoostIOTest.hpp
new file mode 100644
index 0000000..fba11ea
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/test/tu/include/BoostIOTest.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSBOOSTIO_UT_WRITERTEST_HPP__
+#define __FWATOMSBOOSTIO_UT_WRITERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwZip/IWriteArchive.hpp>
+#include <fwZip/IReadArchive.hpp>
+
+#include <fwAtomsBoostIO/types.hpp>
+#include <fwAtomsBoostIO/Writer.hpp>
+
+namespace fwAtomsBoostIO
+{
+namespace ut
+{
+
+class BoostIOTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( BoostIOTest );
+    CPPUNIT_TEST( readWriteZipTest );
+    CPPUNIT_TEST( readWriteDirTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void readWriteZipTest();
+    void readWriteDirTest();
+
+protected:
+    void readProcess(::fwZip::IReadArchive::sptr readArchive,
+                     const ::boost::filesystem::path& rootFilename,
+                    const ::fwAtomsBoostIO::FormatType& formatType = ::fwAtomsBoostIO::JSON);
+
+    void writeProcess(::fwZip::IWriteArchive::sptr writeArchive,
+                      const ::boost::filesystem::path& rootFilename,
+                      ::fwAtomsBoostIO::FormatType format );
+};
+
+
+}  // namespace ut
+}  // namespace fwAtomsBoostIO
+
+
+
+#endif // __FWATOMSBOOSTIO_UT_WRITERTEST_HPP__
+
+
diff --git a/SrcLib/io/fwAtomsBoostIO/test/tu/src/BoostIOTest.cpp b/SrcLib/io/fwAtomsBoostIO/test/tu/src/BoostIOTest.cpp
new file mode 100644
index 0000000..4f73b4f
--- /dev/null
+++ b/SrcLib/io/fwAtomsBoostIO/test/tu/src/BoostIOTest.cpp
@@ -0,0 +1,336 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwTools/System.hpp>
+#include <fwTools/UUID.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsBoostIO/Reader.hpp>
+#include <fwAtomsBoostIO/Writer.hpp>
+
+#include <fwZip/WriteZipArchive.hpp>
+#include <fwZip/ReadZipArchive.hpp>
+#include <fwZip/WriteDirArchive.hpp>
+#include <fwZip/ReadDirArchive.hpp>
+
+#include "BoostIOTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtomsBoostIO::ut::BoostIOTest );
+
+namespace fwAtomsBoostIO
+{
+namespace ut
+{
+
+
+struct SequenceGenerator
+{
+    std::string META_KEY_0;
+    std::string META_KEY_1;
+    std::string META_KEY_2;
+    std::string META_KEY_3;
+    std::string META_VALUE_0;
+    std::string META_VALUE_1;
+    std::string META_VALUE_2;
+    std::string META_VALUE_3;
+
+
+    std::string ATTR_NAME_0;
+    std::string ATTR_NAME_1;
+    std::string ATTR_NAME_2;
+    std::string ATTR_NAME_3;
+    std::string ATTR_NAME_4;
+
+    ::fwAtoms::Sequence::sptr m_seq;
+
+    SequenceGenerator()
+    {
+        META_KEY_0 = "info.a<b>.c.0";
+        META_KEY_1 = "info.a<b>.c.{1:d}";
+        META_KEY_2 = "info.a<b>.c.2";
+        META_KEY_3 = "info.a<b>.c.3";
+        META_VALUE_0 = "A";
+        META_VALUE_1 = "B";
+        META_VALUE_2 = "C";
+        META_VALUE_3 = "D";
+
+        ATTR_NAME_0 = "m_blob";
+        ATTR_NAME_1 = "m_map";
+        ATTR_NAME_2 = "m_str";
+        ATTR_NAME_3 = "m_num";
+        ATTR_NAME_4 = "NULL";
+
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::New();
+        ::fwAtoms::Map::sptr map = ::fwAtoms::Map::New();
+        ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+        m_seq = ::fwAtoms::Sequence::New();
+
+        ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+        const ::fwMemory::BufferObject::SizeType BUFF_SIZE = 1*1024*1024; // 1Mo
+        bo->allocate(BUFF_SIZE);
+        blob->setBufferObject(bo);
+
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        void *v = lock.getBuffer();
+        char* buff = static_cast<char*>(v);
+        for (size_t i = 0; i < BUFF_SIZE; ++i)
+        {
+            buff[i] = i%256;
+        }
+
+        ::fwAtoms::Boolean::sptr boolFalse = ::fwAtoms::Boolean::New(false);
+        ::fwAtoms::Boolean::sptr boolTrue = ::fwAtoms::Boolean::New(true);
+        ::fwAtoms::Numeric::sptr num = ::fwAtoms::Numeric::New(42);
+        ::fwAtoms::Numeric::sptr num2 = ::fwAtoms::Numeric::New(16.64);
+        ::fwAtoms::String::sptr str = ::fwAtoms::String::New("MyStr");
+
+        obj->setMetaInfo(META_KEY_0, META_VALUE_0);
+        obj->setMetaInfo(META_KEY_1, META_VALUE_1);
+        obj->setMetaInfo(META_KEY_2, META_VALUE_2);
+        obj->setMetaInfo(META_KEY_3, META_VALUE_3);
+
+        obj->setAttribute(ATTR_NAME_0, blob);
+        obj->setAttribute(ATTR_NAME_1, map);
+        obj->setAttribute(ATTR_NAME_2, str);
+        obj->setAttribute(ATTR_NAME_3, num);
+        obj->setAttribute(ATTR_NAME_4, ::fwAtoms::String::sptr());
+
+        m_seq->push_back(obj);
+        m_seq->push_back(obj);
+        m_seq->push_back(blob);
+        m_seq->push_back(map);
+        m_seq->push_back(m_seq);
+        m_seq->push_back(boolFalse);
+        m_seq->push_back(num);
+        m_seq->push_back(str);
+        m_seq->push_back(::fwAtoms::String::sptr());
+        m_seq->push_back(num2);
+        m_seq->push_back(boolTrue);
+
+        // tests the case of a a cache path hiting an object stored in a map
+        ::fwAtoms::Map::sptr map2 = ::fwAtoms::Map::New();
+        ::fwAtoms::Object::sptr obj2 = ::fwAtoms::Object::New();
+        map2->insert("obj2 ref1", obj2);
+        map2->insert("obj2 ref2", obj2);
+
+        map->insert("sequence loop key", m_seq);
+        map->insert("object one more ref", obj);
+        map->insert("map2", map2);
+        map->insert("blob key", ::fwAtoms::Blob::New());
+        map->insert("object key", ::fwAtoms::Object::New());
+        map->insert("sequence key", ::fwAtoms::String::New("map-str"));
+    }
+
+    ::fwAtoms::Sequence::sptr getSequence()
+    {
+        return m_seq;
+    }
+
+    void compare(::fwAtoms::Sequence::sptr readSeq)
+    {
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast((*m_seq)[0]);
+        ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::dynamicCast((*m_seq)[2]);
+        ::fwAtoms::Boolean::sptr boolFalse = ::fwAtoms::Boolean::dynamicCast((*m_seq)[5]);
+        ::fwAtoms::Numeric::sptr num = ::fwAtoms::Numeric::dynamicCast((*m_seq)[6]);
+        ::fwAtoms::String::sptr str = ::fwAtoms::String::dynamicCast((*m_seq)[7]);
+        ::fwAtoms::Numeric::sptr num2 = ::fwAtoms::Numeric::dynamicCast((*m_seq)[9]);
+        ::fwAtoms::Boolean::sptr boolTrue = ::fwAtoms::Boolean::dynamicCast((*m_seq)[10]);
+
+        CPPUNIT_ASSERT_EQUAL(m_seq->size(), readSeq->size());
+
+        ::fwAtoms::Object::sptr   readObj0  = ::fwAtoms::Object::dynamicCast((*readSeq)[0]);
+        ::fwAtoms::Object::sptr   readObj1  = ::fwAtoms::Object::dynamicCast((*readSeq)[1]);
+        ::fwAtoms::Blob::sptr     readBlob  = ::fwAtoms::Blob::dynamicCast((*readSeq)[2]);
+        ::fwAtoms::Map::sptr      readMap   = ::fwAtoms::Map::dynamicCast((*readSeq)[3]);
+        ::fwAtoms::Sequence::sptr readSeq2  = ::fwAtoms::Sequence::dynamicCast((*readSeq)[4]);
+        ::fwAtoms::Boolean::sptr  readBoolF = ::fwAtoms::Boolean::dynamicCast((*readSeq)[5]);
+        ::fwAtoms::Numeric::sptr  readNum   = ::fwAtoms::Numeric::dynamicCast((*readSeq)[6]);
+        ::fwAtoms::String::sptr   readStr   = ::fwAtoms::String::dynamicCast((*readSeq)[7]);
+        ::fwAtoms::Base::sptr     readNull  = ::fwAtoms::Base::dynamicCast((*readSeq)[8]);
+        ::fwAtoms::Numeric::sptr  readNum2  = ::fwAtoms::Numeric::dynamicCast((*readSeq)[9]);
+        ::fwAtoms::Boolean::sptr  readBoolT = ::fwAtoms::Boolean::dynamicCast((*readSeq)[10]);
+
+        CPPUNIT_ASSERT( readObj0  );
+        CPPUNIT_ASSERT( readObj1  );
+        CPPUNIT_ASSERT( readBlob  );
+        CPPUNIT_ASSERT( readMap   );
+        CPPUNIT_ASSERT( readSeq2  );
+        CPPUNIT_ASSERT( readBoolF );
+        CPPUNIT_ASSERT( readNum   );
+        CPPUNIT_ASSERT( readStr   );
+        CPPUNIT_ASSERT( !readNull );
+        CPPUNIT_ASSERT( readNum2  );
+        CPPUNIT_ASSERT( readBoolT );
+
+        ::fwMemory::BufferObject::sptr bo = blob->getBufferObject();
+        ::fwMemory::BufferObject::sptr readBo = readBlob->getBufferObject();
+
+        CPPUNIT_ASSERT( readBo );
+
+        CPPUNIT_ASSERT_EQUAL( bo->getSize(),  readBo->getSize() );
+
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        ::fwMemory::BufferObject::Lock readLock(readBo->lock());
+
+        void *v = lock.getBuffer();
+        void *readV = readLock.getBuffer();
+        char* buff = static_cast<char*>(v);
+        char* readBuff = static_cast<char*>(readV);
+
+        CPPUNIT_ASSERT(readBlob);
+        for (size_t i = 0; i < bo->getSize(); ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL( buff[i], readBuff[i] );
+        }
+
+        CPPUNIT_ASSERT_EQUAL( readObj0, readObj1 );
+        CPPUNIT_ASSERT_EQUAL( readSeq, readSeq2 );
+
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_0, readObj0->getMetaInfo(META_KEY_0) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_1, readObj0->getMetaInfo(META_KEY_1) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_2, readObj0->getMetaInfo(META_KEY_2) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_3, readObj0->getMetaInfo(META_KEY_3) );
+
+        CPPUNIT_ASSERT_EQUAL( obj->getAttributes().size(), readObj0->getAttributes().size() );
+
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readBlob), readObj0->getAttribute(ATTR_NAME_0) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readMap ), readObj0->getAttribute(ATTR_NAME_1) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readStr ), readObj0->getAttribute(ATTR_NAME_2) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readNum ), readObj0->getAttribute(ATTR_NAME_3) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(), readObj0->getAttribute(ATTR_NAME_4) );
+
+        CPPUNIT_ASSERT_EQUAL( boolFalse->getValue(), readBoolF->getValue() );
+        CPPUNIT_ASSERT_EQUAL( boolTrue->getValue(), readBoolT->getValue() );
+        CPPUNIT_ASSERT_EQUAL( num->getString(), readNum->getString() );
+        CPPUNIT_ASSERT_EQUAL( num2->getString(), readNum2->getString() );
+        CPPUNIT_ASSERT_EQUAL( str->getValue(), readStr->getValue() );
+    }
+};
+
+SequenceGenerator generator;
+
+//-----------------------------------------------------------------------------
+
+void BoostIOTest::setUp()
+{
+}
+
+void BoostIOTest::tearDown()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void BoostIOTest::readWriteZipTest()
+{
+    ::boost::filesystem::path folderPath =
+            ::fwTools::System::getTemporaryFolder() / ( ::fwTools::UUID::generateUUID() + ".zip");
+
+    ::fwZip::IWriteArchive::sptr writeArchive;
+    ::fwZip::IReadArchive::sptr readArchive;
+
+    {
+        writeArchive = ::fwZip::WriteZipArchive::New(folderPath.string());
+        this->writeProcess(writeArchive, "root.json", ::fwAtomsBoostIO::JSON);
+        writeArchive.reset();
+
+        readArchive = ::fwZip::ReadZipArchive::New(folderPath.string());
+        this->readProcess(readArchive, "root.json");
+        readArchive.reset();
+
+        bool suppr = ::boost::filesystem::remove_all(folderPath);
+        CPPUNIT_ASSERT(suppr);
+    }
+    {
+        writeArchive = ::fwZip::WriteZipArchive::New(folderPath.string());
+        this->writeProcess(writeArchive, "root.xml", ::fwAtomsBoostIO::XML);
+        writeArchive.reset();
+
+        readArchive = ::fwZip::ReadZipArchive::New(folderPath.string());
+        this->readProcess(readArchive, "root.xml", ::fwAtomsBoostIO::XML);
+        readArchive.reset();
+
+        bool suppr = ::boost::filesystem::remove_all(folderPath);
+        CPPUNIT_ASSERT(suppr);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void BoostIOTest::readWriteDirTest()
+{
+    ::boost::filesystem::path folderPath =
+            ::fwTools::System::getTemporaryFolder() / ::fwTools::UUID::generateUUID();
+
+    ::fwZip::IWriteArchive::sptr writeArchive;
+    ::fwZip::IReadArchive::sptr readArchive;
+
+    {
+        writeArchive = ::fwZip::WriteDirArchive::New(folderPath.string());
+        this->writeProcess(writeArchive, "root.json", ::fwAtomsBoostIO::JSON);
+        writeArchive.reset();
+
+        readArchive = ::fwZip::ReadDirArchive::New(folderPath.string());
+        this->readProcess(readArchive, "root.json");
+        readArchive.reset();
+
+        bool suppr = ::boost::filesystem::remove_all(folderPath);
+        CPPUNIT_ASSERT(suppr);
+    }
+    {
+        writeArchive = ::fwZip::WriteDirArchive::New(folderPath.string());
+        this->writeProcess(writeArchive, "root.xml", ::fwAtomsBoostIO::XML);
+        writeArchive.reset();
+
+        readArchive = ::fwZip::ReadDirArchive::New(folderPath.string());
+        this->readProcess(readArchive, "root.xml" , ::fwAtomsBoostIO::XML);
+        readArchive.reset();
+
+        bool suppr = ::boost::filesystem::remove_all(folderPath);
+        CPPUNIT_ASSERT(suppr);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void BoostIOTest::writeProcess(::fwZip::IWriteArchive::sptr writeArchive,
+                               const ::boost::filesystem::path& rootFilename,
+                               ::fwAtomsBoostIO::FormatType format )
+{
+    ::fwAtoms::Sequence::sptr seq = generator.getSequence();
+    ::fwAtomsBoostIO::Writer(seq).write(writeArchive, rootFilename, format);
+}
+
+//-----------------------------------------------------------------------------
+
+void BoostIOTest::readProcess(::fwZip::IReadArchive::sptr readArchive,
+                              const ::boost::filesystem::path& rootFilename,
+                              const ::fwAtomsBoostIO::FormatType& formatType)
+{
+    ::fwAtoms::Sequence::sptr readSeq;
+    {
+        readSeq = ::fwAtoms::Sequence::dynamicCast(::fwAtomsBoostIO::Reader().read(readArchive, rootFilename, formatType));
+    }
+    generator.compare(readSeq);
+}
+
+}  // namespace ut
+}  // namespace fwAtomsBoostIO
+
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/CMakeLists.txt b/SrcLib/io/fwAtomsHdf5IO/CMakeLists.txt
new file mode 100644
index 0000000..a665429
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/CMakeLists.txt
@@ -0,0 +1,20 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+)
+
+find_package(HDF5 REQUIRED)
+
+find_package (Boost COMPONENTS filesystem REQUIRED)
+
+
+
+fwForwardInclude(
+    ${HDF5_INCLUDE_DIR}
+    ${Boost_INCLUDE_DIRS}
+    )
+fwLink(
+    ${HDF5_LIBRARIES}
+    ${Boost_LIBRARIES}
+    )
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/COPYING b/SrcLib/io/fwAtomsHdf5IO/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/COPYING.LESSER b/SrcLib/io/fwAtomsHdf5IO/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/Properties.cmake b/SrcLib/io/fwAtomsHdf5IO/Properties.cmake
new file mode 100644
index 0000000..c16a2e9
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsHdf5IO )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtoms fwCore fwTools fwMemory )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/bin/build.options b/SrcLib/io/fwAtomsHdf5IO/bin/build.options
new file mode 100644
index 0000000..962bfda
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/bin/build.options
@@ -0,0 +1,4 @@
+TYPE = 'shared'
+VERSION = '0.1'
+USE = ['hdf5']
+LIB = ['fwAtoms_0-1', 'fwTools_0-1']
diff --git a/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Reader.hpp b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Reader.hpp
new file mode 100644
index 0000000..4e4b1cc
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Reader.hpp
@@ -0,0 +1,54 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSHDF5IO_READER_HPP__
+#define __FWATOMSHDF5IO_READER_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#ifdef SPECIALINSTALL
+	#include <H5Cpp.h>
+#else
+	#include <cpp/H5Cpp.h>
+#endif
+
+#include <fwCore/macros.hpp>
+
+#include "fwAtomsHdf5IO/config.hpp"
+
+namespace fwAtoms
+{
+    class Base;
+}
+namespace fwZip
+{
+    class IReadArchive;
+}
+
+namespace fwAtomsHdf5IO
+{
+
+/**
+ * @brief This reader parses a HDF5 file and create the associated atom.
+ * @class Reader
+ */
+class FWATOMSHDF5IO_CLASS_API Reader
+{
+
+public:
+
+    /**
+     * @brief Visits the HDF5 file to create the associated atoms.
+     * @param path path of the HDF5 file.
+     */
+    FWATOMSHDF5IO_API SPTR(::fwAtoms::Base) read(const ::boost::filesystem::path &path);
+
+};
+
+}
+
+#endif /* __FWATOMSHDF5IO_READER_HPP__ */
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Writer.hpp b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Writer.hpp
new file mode 100644
index 0000000..ba9fd82
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/Writer.hpp
@@ -0,0 +1,69 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSHDF5IO_WRITER_HPP__
+#define __FWATOMSHDF5IO_WRITER_HPP__
+
+#include <sstream>
+
+#include <boost/filesystem/path.hpp>
+
+#ifdef SPECIALINSTALL
+    #include <H5Cpp.h>
+#else
+    #include <cpp/H5Cpp.h>
+#endif
+
+#include <fwCore/macros.hpp>
+
+#include "fwAtomsHdf5IO/config.hpp"
+
+namespace fwAtoms
+{
+    class Base;
+}
+
+namespace fwAtomsHdf5IO
+{
+
+/**
+ * @brief This writer parses a fwAtoms to save it in a HDF5 file.
+ * @class Writer
+ */
+class FWATOMSHDF5IO_CLASS_API Writer
+{
+
+public:
+
+    /// Defines writer version.
+    FWATOMSHDF5IO_API static const std::string s_VERSION;
+
+    /// Defines key to retrieve fwAtoms version from file.
+    FWATOMSHDF5IO_API static const std::string s_ATOMS_VERSION_KEY;
+
+    /// Defines key to retrieve writer version from file.
+    FWATOMSHDF5IO_API static const std::string s_WRITER_VERSION_KEY;
+
+    /// Constructor : initializes the writer.
+    FWATOMSHDF5IO_API Writer( SPTR(::fwAtoms::Base) atom );
+
+    /**
+     * @brief Visits the current atom to save it.
+     * @param path path of the HDF5 file to create.
+     */
+    FWATOMSHDF5IO_API void write(const ::boost::filesystem::path &path);
+
+protected:
+
+    /// current atom to save.
+    SPTR(::fwAtoms::Base) m_atom;
+
+};
+
+}
+
+#endif /* __FWATOMSHDF5IO_WRITER_HPP__ */
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/config.hpp b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/config.hpp
new file mode 100644
index 0000000..171ad4f
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/include/fwAtomsHdf5IO/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2012.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWATOMSHDF5IO_CONFIG_HPP_
+#define _FWATOMSHDF5IO_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWATOMSHDF5IO_EXPORTS
+            #define FWATOMSHDF5IO_API __declspec(dllexport)
+        #else
+            #define FWATOMSHDF5IO_API __declspec(dllimport)
+        #endif
+
+        #define FWATOMSHDF5IO_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWATOMSHDF5IO_EXPORTS
+            #define FWATOMSHDF5IO_API __attribute__ ((visibility("default")))
+            #define FWATOMSHDF5IO_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWATOMSHDF5IO_API __attribute__ ((visibility("hidden")))
+            #define FWATOMSHDF5IO_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWATOMSHDF5IO_API
+        #define FWATOMSHDF5IO_CLASS_API
+
+    #endif
+
+#endif //FWATOMSHDF5IO_API
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Reader.cpp b/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Reader.cpp
new file mode 100644
index 0000000..d241775
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Reader.cpp
@@ -0,0 +1,360 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include "fwAtomsHdf5IO/Writer.hpp"
+#include "fwAtomsHdf5IO/Reader.hpp"
+
+namespace fwAtomsHdf5IO
+{
+
+//-----------------------------------------------------------------------------
+
+struct Hdf5Visitor
+{
+    typedef std::map< std::string, ::fwAtoms::Base::sptr> AtomCacheType;
+    AtomCacheType m_cache;
+
+H5::H5File m_file;
+
+
+//-----------------------------------------------------------------------------
+
+AtomCacheType::mapped_type hitCache(const AtomCacheType::key_type &path) const
+{
+    AtomCacheType::const_iterator iter = m_cache.find(path);
+    if(iter != m_cache.end())
+    {
+        return iter->second;
+    }
+    return AtomCacheType::mapped_type();
+}
+
+//-----------------------------------------------------------------------------
+
+void cache(const AtomCacheType::key_type &path, const AtomCacheType::mapped_type &atom)
+{
+    m_cache.insert( AtomCacheType::value_type( path, atom ) );
+}
+
+//-----------------------------------------------------------------------------
+
+Hdf5Visitor(const ::boost::filesystem::path & path)
+{
+    m_file = H5::H5File( path.string(), H5F_ACC_RDWR );
+
+    H5::Group versionsGroup;
+    try
+    {
+        versionsGroup = m_file.openGroup("/versions");
+    }
+    catch(H5::FileIException &fe)
+    {
+        OSLM_ERROR("Failed to read file '" << path.string()
+                << "' (exception occured '" << fe.getDetailMsg() << "')");
+        FW_RAISE("Failed to read file '" << path.string() << "' :\nno versions found.");
+    }
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+
+    H5std_string strAtomsVersion;
+    try
+    {
+        H5::DataSet dsAtomsVersion = versionsGroup.openDataSet(Writer::s_ATOMS_VERSION_KEY);
+        dsAtomsVersion.read(strAtomsVersion, str_type);
+    }
+    catch(H5::GroupIException &ge)
+    {
+        OSLM_ERROR("Failed to read file '" << path.string()
+                << "' (exception occured '" << ge.getDetailMsg() << "')");
+        FW_RAISE("Failed to read file '" << path.string() << "' :\nno atoms version found.");
+
+    }
+
+    H5std_string strWriterVersion;
+    try
+    {
+        H5::DataSet dsWriterVersion = versionsGroup.openDataSet(Writer::s_WRITER_VERSION_KEY);
+        dsWriterVersion.read(strWriterVersion, str_type);
+    }
+    catch(H5::GroupIException &ge)
+    {
+        OSLM_ERROR("Failed to read file '" << path.string()
+                << "' (exception occured '" << ge.getDetailMsg() << "')");
+        FW_RAISE("Failed to read file '" << path.string() << "' :\nno writer version found.");
+    }
+
+    FW_RAISE_IF("Failed to read file '" << path.string() << "':\n" 
+            << "Detected file version is '" << strWriterVersion << "'"
+            << " whereas current version is '" << Writer::s_VERSION << "'", Writer::s_VERSION != strWriterVersion);
+
+    FW_RAISE_IF("Failed to read file '" << path.string() << "':\n" 
+            << "Detected atoms version is '" << strAtomsVersion << "'"
+            << " whereas current version is '" << ::fwAtoms::Base::s_VERSION << "'",
+            ::fwAtoms::Base::s_VERSION != strAtomsVersion);
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr visit()
+{
+    return this->visit("/root");
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr visit(const std::string & path)
+{
+    ::fwAtoms::Base::sptr obj;
+
+    H5::Group group = m_file.openGroup(path);
+
+    if (group.getNumObjs())
+    {
+        H5::StrType str_type(0, H5T_VARIABLE);
+        H5::DataSet type = group.openDataSet( "type" );
+        H5std_string typeStr;
+        type.read( typeStr, str_type );
+
+        if(typeStr == "numeric")
+        {
+            H5::DataSet val  = group.openDataSet( "value" );
+            H5std_string value;
+            val.read( value, str_type );
+            obj = ::fwAtoms::Numeric::New(value);
+            this->cache(path, obj);
+        }
+        else if(typeStr == "string")
+        {
+            H5::DataSet val  = group.openDataSet( "value" );
+            H5std_string value;
+            val.read( value, str_type );
+            obj = ::fwAtoms::String::New(value);
+            this->cache(path, obj);
+        }
+        else if(typeStr == "boolean")
+        {
+            H5::DataSet val  = group.openDataSet( "value" );
+            H5std_string value;
+            val.read( value, str_type );
+            obj = ::fwAtoms::Boolean::New(value);
+            this->cache(path, obj);
+        }
+        else if(typeStr == "sequence")
+        {
+            obj = this->getSequence(path);
+        }
+        else if(typeStr == "mapping")
+        {
+            obj = this->getMap(path);
+        }
+        else if(typeStr == "object")
+        {
+            obj = this->getObject(path);
+        }
+        else if(typeStr == "blob")
+        {
+            obj = this->getBlob(path);
+        }
+        else
+        {
+            FW_RAISE("HDF5 file does not contained a well formed atom");
+        }
+    }
+
+    return obj;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr getAtom(const H5::Group & group, const std::string & path, int index)
+{
+    ::fwAtoms::Base::sptr atom;
+
+    if (group.getObjTypeByIdx(index) == H5G_LINK)
+    {
+        H5std_string  linkPath = m_file.getLinkval(path);
+        FW_RAISE_IF("Object (" << linkPath << ") must already exist.", m_cache.find(linkPath) == m_cache.end());
+
+        atom = this->hitCache(linkPath);
+    }
+    else if (group.getObjTypeByIdx(index) == H5G_GROUP)
+    {
+        atom = this->visit(path);
+    }
+    else
+    {
+        FW_RAISE("This file is not well formed");
+    }
+    return atom;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr getObject(const std::string & path)
+{
+    ::fwAtoms::Object::sptr object = ::fwAtoms::Object::New();
+    this->cache(path, object);
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+
+    const std::string idPath(path + "/id");
+    const std::string metainfoPath(path + "/meta_info");
+    const std::string attributesPath(path + "/attributes");
+
+    // Parses meta info
+    ::fwAtoms::Object::MetaInfosType metaInfos;
+    H5::Group metainfoGroup = m_file.openGroup( metainfoPath );
+
+    for (int i=0 ; i< metainfoGroup.getNumObjs() ; ++i)
+    {
+        H5std_string name = metainfoGroup.getObjnameByIdx(i);
+        FW_RAISE_IF("Meta info type must be H5G_DATASET", metainfoGroup.getObjTypeByIdx(i) != H5G_DATASET);
+
+        H5::DataSet infoDataSet = metainfoGroup.openDataSet(name);
+        H5std_string info;
+        infoDataSet.read(info, str_type);
+
+        metaInfos[name] = std::string(info);
+    }
+    object->setMetaInfos(metaInfos);
+
+    // Parses attributes
+    ::fwAtoms::Object::AttributesType attributes;
+    H5::Group attributesGroup = m_file.openGroup( attributesPath );
+
+    ::fwAtoms::Base::sptr atom;
+
+    for (int i=0 ; i< attributesGroup.getNumObjs() ; ++i)
+    {
+        H5std_string name = attributesGroup.getObjnameByIdx(i);
+
+        std::string eltPath = attributesPath + "/" + name;
+
+        atom = this->getAtom(attributesGroup, eltPath, i);
+
+        attributes[name] = atom;
+    }
+    object->setAttributes(attributes);
+
+    return object;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr getSequence(const std::string & path)
+{
+    ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::New();
+    this->cache(path, seq);
+
+    const std::string seqPath(path + "/sequence");
+    H5::StrType str_type(0, H5T_VARIABLE);
+    H5::Group seqGroup = m_file.openGroup(seqPath);
+
+    ::fwAtoms::Base::sptr atom;
+    for (int i=0 ; i< seqGroup.getNumObjs() ; ++i)
+    {
+        H5std_string name = seqGroup.getObjnameByIdx(i);
+
+        std::string eltPath = seqPath + "/" + name;
+
+        atom = getAtom(seqGroup, eltPath, i);
+
+        seq->push_back(atom);
+    }
+    return seq;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr getMap(const std::string & path)
+{
+    ::fwAtoms::Map::sptr map = ::fwAtoms::Map::New();
+    this->cache(path, map);
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+    const std::string mapPath(path + "/map");
+    H5::Group mapGroup = m_file.openGroup(mapPath);
+
+    ::fwAtoms::Base::sptr atom;
+    for (int i=0 ; i< mapGroup.getNumObjs() ; ++i)
+    {
+        H5std_string name = mapGroup.getObjnameByIdx(i);
+
+        std::string eltPath = mapPath + "/" + name;
+
+        atom = getAtom(mapGroup, eltPath, i);
+
+        ::fwAtoms::Base::sptr atom = this->visit(mapPath + "/" + name);
+
+        map->insert( name, atom );
+    }
+    return map;
+}
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Blob::sptr getBlob(const std::string & path)
+{
+    ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+    this->cache(path, blob);
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+    H5::Group group = m_file.openGroup(path);
+
+    H5::DataSet datasetSize = group.openDataSet("buffer_size");
+    H5std_string value;
+    datasetSize.read( value, str_type );
+    size_t size = ::boost::lexical_cast<size_t>(value);
+
+    ::fwMemory::BufferObject::sptr buffObj = ::fwMemory::BufferObject::New();
+    blob->setBufferObject(buffObj);
+
+    ::fwMemory::BufferObject::Lock lock(buffObj->lock());
+    if (size > 0)
+    {
+        hsize_t fdim[] = {size};
+        buffObj->allocate(size);
+        H5::DataSpace fspace( 1, fdim );
+        H5::DataSet dataset = group.openDataSet("blob");
+        dataset.read(buffObj->getBuffer(), H5::PredType::NATIVE_UINT8);
+    }
+
+    return blob;
+}
+};
+
+//-----------------------------------------------------------------------------
+
+::fwAtoms::Base::sptr Reader::read(const ::boost::filesystem::path &path)
+{
+    Hdf5Visitor visitor(path);
+    ::fwAtoms::Base::sptr obj = visitor.visit();
+
+    return obj;
+}
+
+
+
+//-----------------------------------------------------------------------------
+
+}
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Writer.cpp b/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Writer.cpp
new file mode 100644
index 0000000..3861f02
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/src/fwAtomsHdf5IO/Writer.cpp
@@ -0,0 +1,253 @@
+/* ***** BEGIN LICENSE BLOCK *****
+* FW4SPL - Copyright (C) IRCAD, 2009-2013.
+* Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+* published by the Free Software Foundation.
+* ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include "fwAtomsHdf5IO/Writer.hpp"
+
+
+namespace fwAtomsHdf5IO
+{
+
+const std::string Writer::s_VERSION = "1";
+const std::string Writer::s_ATOMS_VERSION_KEY = "atoms_version";
+const std::string Writer::s_WRITER_VERSION_KEY = "writer_version";
+
+
+//-----------------------------------------------------------------------------
+
+struct AtomVisitor
+{
+typedef std::map< ::fwAtoms::Base::sptr, std::string> Hdf5CacheType;
+Hdf5CacheType m_cache;
+
+H5::H5File m_file;
+
+//-----------------------------------------------------------------------------
+
+AtomVisitor(const ::boost::filesystem::path & path)
+{
+    m_file = H5::H5File( path.string(), H5F_ACC_TRUNC );
+
+    H5::Group versionsGroup = m_file.createGroup("/versions");
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+    H5::DataSpace att_space(H5S_SCALAR);
+
+    H5::DataSet atomsVersion = versionsGroup.createDataSet(Writer::s_ATOMS_VERSION_KEY, str_type, att_space);
+    atomsVersion.write(::fwAtoms::Base::s_VERSION, str_type);
+
+    H5::DataSet writerVersion = versionsGroup.createDataSet(Writer::s_WRITER_VERSION_KEY, str_type, att_space);
+    writerVersion.write(Writer::s_VERSION, str_type);
+}
+
+//-----------------------------------------------------------------------------
+
+Hdf5CacheType::mapped_type hitCache(const Hdf5CacheType::key_type &atom) const
+{
+    Hdf5CacheType::const_iterator iter = m_cache.find(atom);
+    if(iter != m_cache.end())
+    {
+        return iter->second;
+    }
+    return Hdf5CacheType::mapped_type();
+}
+
+//-----------------------------------------------------------------------------
+
+void cache(const Hdf5CacheType::key_type &atom, const Hdf5CacheType::mapped_type &path)
+{
+    m_cache.insert( Hdf5CacheType::value_type( atom, path ) );
+}
+
+//-----------------------------------------------------------------------------
+
+void visit(const ::fwAtoms::Sequence::sptr &seq, const std::string &path)
+{
+    const std::string seqPath(path + "/sequence");
+    H5::Group seqGroup = m_file.createGroup( seqPath );
+    int count = 0;
+    BOOST_FOREACH( ::fwAtoms::Sequence::SequenceType::value_type elt, seq->getValue())
+    {
+        std::stringstream str;
+        str.width(10);
+        str.fill('0');
+        str << count++;
+        this->visit(elt, seqPath + "/" +  str.str());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void visit(const ::fwAtoms::Map::sptr &map, const std::string &path)
+{
+    const std::string mapPath(path + "/map");
+    H5::Group mapGroup = m_file.createGroup( mapPath);
+
+    BOOST_FOREACH(const ::fwAtoms::Map::MapType::value_type& elt, map->getValue())
+    {
+        this->visit(elt.second, mapPath + "/" + elt.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void visit(const ::fwAtoms::Blob::sptr &blob, const std::string &path)
+{
+    H5::Group group = m_file.openGroup( path );
+
+    ::fwMemory::BufferObject::sptr buffObj = blob->getBufferObject();
+
+    H5::StrType str_type(0, H5T_VARIABLE);
+    H5::DataSpace att_space(H5S_SCALAR);
+        H5::DataSet datasetSize = group.createDataSet( "buffer_size", str_type, att_space );
+    if (!buffObj)
+    {
+        datasetSize.write(H5std_string("0"), str_type);
+    }
+    else
+    {
+        ::fwMemory::BufferObject::Lock lock(buffObj->lock());
+
+        datasetSize.write(::boost::lexical_cast<std::string>(buffObj->getSize()), str_type);
+
+        hsize_t fdim[] = {buffObj->getSize()};
+        H5::DataSpace fspace( 1, fdim );
+        H5::DataSet dataset = group.createDataSet( "blob", H5::PredType::NATIVE_UINT8, fspace );
+        dataset.write(buffObj->getBuffer(), H5::PredType::NATIVE_UINT8);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void visit(const ::fwAtoms::Object::sptr &object, const std::string &path)
+{
+    H5::StrType str_type(0, H5T_VARIABLE);
+    H5::DataSpace att_space(H5S_SCALAR);
+
+    const std::string idPath(path + "/id");
+    const std::string metaInfoPath(path + "/meta_info");
+    const std::string attributesPath(path + "/attributes");
+
+    H5::Group metaInfosGroup = m_file.createGroup( metaInfoPath );
+    const ::fwAtoms::Object::MetaInfosType& metaInfos = object->getMetaInfos();
+    BOOST_FOREACH(const ::fwAtoms::Object::MetaInfosType::value_type& info, metaInfos)
+    {
+        // plutot un dataset de strings
+        H5::DataSet infoDataSet = metaInfosGroup.createDataSet( info.first, str_type, att_space );
+        infoDataSet.write(info.second, str_type);
+    }
+
+    H5::Group attributesGroup = m_file.createGroup( attributesPath );
+    const ::fwAtoms::Object::AttributesType& attributes = object->getAttributes();
+    BOOST_FOREACH(const ::fwAtoms::Object::AttributesType::value_type attr, attributes)
+    {
+        this->visit(attr.second, path + "/attributes/" + attr.first);
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void visit(const ::fwAtoms::Base::sptr &base, const std::string &path)
+{
+    std::string cachePath = this->hitCache(base);
+    if(!cachePath.empty())
+    {
+        m_file.link(H5G_LINK_SOFT, cachePath, path);;
+    }
+    else
+    {
+        H5::Group group = m_file.createGroup( path );
+
+        if (base)
+        {
+            this->cache(base, path);
+            H5::StrType str_type(0, H5T_VARIABLE);
+            H5::DataSpace att_space(H5S_SCALAR);
+            H5::DataSet type = group.createDataSet( "type", str_type, att_space );
+
+            // prop_tree::ptree propTree;
+            if(base->isNumeric())
+            {
+                type.write( H5std_string("numeric"), str_type );
+                H5::DataSet val  = group.createDataSet( "value", str_type, att_space );
+                val.write( base->getString(), str_type );
+            }
+            else if(base->isString())
+            {
+                type.write( H5std_string("string"), str_type );
+                H5::DataSet val  = group.createDataSet( "value", str_type, att_space );
+                val.write( base->getString(), str_type );
+            }
+            else if(base->isBoolean())
+            {
+                type.write( H5std_string("boolean"), str_type );
+                H5::DataSet val  = group.createDataSet( "value", str_type, att_space );
+                val.write( H5std_string((base->getString() == "true") ? "true" : "false"), str_type );
+            }
+            else if(base->isSequence())
+            {
+                type.write( H5std_string("sequence"), str_type );
+                ::fwAtoms::Sequence::sptr seq = ::fwAtoms::Sequence::dynamicCast(base);
+                this->visit(seq, path);
+            }
+            else if(base->isMapping())
+            {
+                type.write( H5std_string("mapping"), str_type );
+                ::fwAtoms::Map::sptr mapAtom = ::fwAtoms::Map::dynamicCast(base);
+                this->visit(mapAtom, path);
+            }
+            else if(base->isObject())
+            {
+                type.write( H5std_string("object"), str_type );
+                ::fwAtoms::Object::sptr object = ::fwAtoms::Object::dynamicCast(base);
+                this->visit(object, path);
+            }
+            else if(base->isBlob())
+            {
+                type.write( H5std_string("blob"), str_type );
+                ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::dynamicCast(base);
+                this->visit(blob, path);
+            }
+            else
+            {
+                FW_RAISE("This kind of base is not yet supported");
+            }
+        }
+    }
+}
+
+};
+
+//-----------------------------------------------------------------------------
+
+Writer::Writer( SPTR(::fwAtoms::Base) atom ) : m_atom(atom)
+{}
+
+
+//-----------------------------------------------------------------------------
+
+void Writer::write(const ::boost::filesystem::path &path )
+{
+    AtomVisitor visitor(path);
+    visitor.visit(m_atom, "/root");
+}
+
+//-----------------------------------------------------------------------------
+
+}
diff --git a/SrcLib/io/fwAtomsHdf5IO/test/CMakeLists.txt b/SrcLib/io/fwAtomsHdf5IO/test/CMakeLists.txt
new file mode 100644
index 0000000..47e309c
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/test/CMakeLists.txt
@@ -0,0 +1,7 @@
+
+fwLoadProperties()
+
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/test/Properties.cmake b/SrcLib/io/fwAtomsHdf5IO/test/Properties.cmake
new file mode 100644
index 0000000..e16e6ea
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwAtomsHdf5IOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwAtoms fwAtomsHdf5IO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/test/cppunit.options b/SrcLib/io/fwAtomsHdf5IO/test/cppunit.options
new file mode 100644
index 0000000..ffd8c61
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/test/cppunit.options
@@ -0,0 +1,7 @@
+CLASSTEST=[
+    'Hdf5IOTest',
+]
+
+LIB = ['fwTools_0-1','fwCore_0-1', 'fwAtoms_0-1', 'fwAtomsHdf5IO_0-1', 'fwTest_0-1']
+CONSOLE = 'yes'
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/test/tu/include/Hdf5IOTest.hpp b/SrcLib/io/fwAtomsHdf5IO/test/tu/include/Hdf5IOTest.hpp
new file mode 100644
index 0000000..54dcdfc
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/test/tu/include/Hdf5IOTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWATOMSHDF5IO_UT_HDF5IOTEST_HPP__
+#define __FWATOMSHDF5IO_UT_HDF5IOTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwAtomsHdf5IO/Writer.hpp>
+
+namespace fwAtomsHdf5IO
+{
+namespace ut
+{
+
+class Hdf5IOTest :  public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( Hdf5IOTest );
+    CPPUNIT_TEST( readWriteTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void readWriteTest();
+
+protected:
+    void readProcess(::boost::filesystem::path path);
+
+    void writeProcess(::boost::filesystem::path path);
+};
+
+
+}  // namespace ut
+}  // namespace fwAtomsHdf5IO
+
+
+
+#endif // __FWATOMSHDF5IO_UT_HDF5IOTEST_HPP__
+
+
diff --git a/SrcLib/io/fwAtomsHdf5IO/test/tu/src/Hdf5IOTest.cpp b/SrcLib/io/fwAtomsHdf5IO/test/tu/src/Hdf5IOTest.cpp
new file mode 100644
index 0000000..b1a4270
--- /dev/null
+++ b/SrcLib/io/fwAtomsHdf5IO/test/tu/src/Hdf5IOTest.cpp
@@ -0,0 +1,263 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/operations.hpp>
+
+#include <fwTools/System.hpp>
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsHdf5IO/Reader.hpp>
+#include <fwAtomsHdf5IO/Writer.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "Hdf5IOTest.hpp"
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwAtomsHdf5IO::ut::Hdf5IOTest );
+
+namespace fwAtomsHdf5IO
+{
+namespace ut
+{
+
+static ::fwTest::Exception e(""); // Hack to force log
+
+struct SequenceGenerator
+{
+    std::string META_KEY_0;
+    std::string META_KEY_1;
+    std::string META_KEY_2;
+    std::string META_KEY_3;
+    std::string META_VALUE_0;
+    std::string META_VALUE_1;
+    std::string META_VALUE_2;
+    std::string META_VALUE_3;
+
+
+    std::string ATTR_NAME_0;
+    std::string ATTR_NAME_1;
+    std::string ATTR_NAME_2;
+    std::string ATTR_NAME_3;
+    std::string ATTR_NAME_4;
+
+    ::fwAtoms::Sequence::sptr m_seq;
+
+    SequenceGenerator()
+    {
+        META_KEY_0 = "info.a<b>.c.0";
+        META_KEY_1 = "info.a<b>.c.1";
+        META_KEY_2 = "info.a<b>.c.2";
+        META_KEY_3 = "info.a<b>.c.3";
+        META_VALUE_0 = "A";
+        META_VALUE_1 = "B";
+        META_VALUE_2 = "C";
+        META_VALUE_3 = "D";
+
+        ATTR_NAME_0 = "m_blob";
+        ATTR_NAME_1 = "m_map";
+        ATTR_NAME_2 = "m_str";
+        ATTR_NAME_3 = "m_num";
+        ATTR_NAME_4 = "NULL";
+
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::New();
+        ::fwAtoms::Map::sptr map = ::fwAtoms::Map::New();
+        ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::New();
+        m_seq = ::fwAtoms::Sequence::New();
+
+        ::fwMemory::BufferObject::sptr bo = ::fwMemory::BufferObject::New();
+        const ::fwMemory::BufferObject::SizeType BUFF_SIZE = 1*1024*1024; // 1Mo
+        bo->allocate(BUFF_SIZE);
+        blob->setBufferObject(bo);
+
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        void *v = lock.getBuffer();
+        char* buff = static_cast<char*>(v);
+        for (size_t i = 0; i < BUFF_SIZE; ++i)
+        {
+            buff[i] = i%256;
+        }
+
+        ::fwAtoms::Boolean::sptr boolFalse = ::fwAtoms::Boolean::New(false);
+        ::fwAtoms::Boolean::sptr boolTrue = ::fwAtoms::Boolean::New(true);
+        ::fwAtoms::Numeric::sptr num = ::fwAtoms::Numeric::New(42);
+        ::fwAtoms::Numeric::sptr num2 = ::fwAtoms::Numeric::New(16.64);
+        ::fwAtoms::String::sptr str = ::fwAtoms::String::New("MyStr");
+
+        obj->setMetaInfo(META_KEY_0, META_VALUE_0);
+        obj->setMetaInfo(META_KEY_1, META_VALUE_1);
+        obj->setMetaInfo(META_KEY_2, META_VALUE_2);
+        obj->setMetaInfo(META_KEY_3, META_VALUE_3);
+
+        obj->setAttribute(ATTR_NAME_0, blob);
+        obj->setAttribute(ATTR_NAME_1, map);
+        obj->setAttribute(ATTR_NAME_2, str);
+        obj->setAttribute(ATTR_NAME_3, num);
+        obj->setAttribute(ATTR_NAME_4, ::fwAtoms::String::sptr());
+
+        m_seq->push_back(obj);
+        m_seq->push_back(obj);
+        m_seq->push_back(blob);
+        m_seq->push_back(map);
+        m_seq->push_back(m_seq);
+        m_seq->push_back(boolFalse);
+        m_seq->push_back(num);
+        m_seq->push_back(str);
+        m_seq->push_back(::fwAtoms::String::sptr());
+        m_seq->push_back(num2);
+        m_seq->push_back(boolTrue);
+
+        map->insert("blob key", ::fwAtoms::Blob::New());
+        map->insert("object key", ::fwAtoms::Object::New());
+        map->insert("sequence key", ::fwAtoms::String::New("map-str"));
+    }
+
+    ::fwAtoms::Sequence::sptr getSequence()
+    {
+        return m_seq;
+    }
+
+    void compare(::fwAtoms::Sequence::sptr readSeq)
+    {
+        ::fwAtoms::Object::sptr obj = ::fwAtoms::Object::dynamicCast((*m_seq)[0]);
+        ::fwAtoms::Blob::sptr blob = ::fwAtoms::Blob::dynamicCast((*m_seq)[2]);
+        ::fwAtoms::Boolean::sptr boolFalse = ::fwAtoms::Boolean::dynamicCast((*m_seq)[5]);
+        ::fwAtoms::Numeric::sptr num = ::fwAtoms::Numeric::dynamicCast((*m_seq)[6]);
+        ::fwAtoms::String::sptr str = ::fwAtoms::String::dynamicCast((*m_seq)[7]);
+        ::fwAtoms::Numeric::sptr num2 = ::fwAtoms::Numeric::dynamicCast((*m_seq)[9]);
+        ::fwAtoms::Boolean::sptr boolTrue = ::fwAtoms::Boolean::dynamicCast((*m_seq)[10]);
+
+        CPPUNIT_ASSERT_EQUAL(m_seq->size(), readSeq->size());
+
+        ::fwAtoms::Object::sptr   readObj0  = ::fwAtoms::Object::dynamicCast((*readSeq)[0]);
+        ::fwAtoms::Object::sptr   readObj1  = ::fwAtoms::Object::dynamicCast((*readSeq)[1]);
+        ::fwAtoms::Blob::sptr     readBlob  = ::fwAtoms::Blob::dynamicCast((*readSeq)[2]);
+        ::fwAtoms::Map::sptr      readMap   = ::fwAtoms::Map::dynamicCast((*readSeq)[3]);
+        ::fwAtoms::Sequence::sptr readSeq2  = ::fwAtoms::Sequence::dynamicCast((*readSeq)[4]);
+        ::fwAtoms::Boolean::sptr  readBoolF = ::fwAtoms::Boolean::dynamicCast((*readSeq)[5]);
+        ::fwAtoms::Numeric::sptr  readNum   = ::fwAtoms::Numeric::dynamicCast((*readSeq)[6]);
+        ::fwAtoms::String::sptr   readStr   = ::fwAtoms::String::dynamicCast((*readSeq)[7]);
+        ::fwAtoms::Base::sptr     readNull  = ::fwAtoms::Base::dynamicCast((*readSeq)[8]);
+        ::fwAtoms::Numeric::sptr  readNum2  = ::fwAtoms::Numeric::dynamicCast((*readSeq)[9]);
+        ::fwAtoms::Boolean::sptr  readBoolT = ::fwAtoms::Boolean::dynamicCast((*readSeq)[10]);
+
+        ::fwMemory::BufferObject::sptr bo = blob->getBufferObject();
+        ::fwMemory::BufferObject::sptr readBo = readBlob->getBufferObject();
+
+        CPPUNIT_ASSERT_EQUAL( bo->getSize(),  readBo->getSize() );
+
+        ::fwMemory::BufferObject::Lock lock(bo->lock());
+        ::fwMemory::BufferObject::Lock readLock(readBo->lock());
+
+        void *v = lock.getBuffer();
+        void *readV = readLock.getBuffer();
+        char* buff = static_cast<char*>(v);
+        char* readBuff = static_cast<char*>(readV);
+        for (size_t i = 0; i < bo->getSize(); ++i)
+        {
+            CPPUNIT_ASSERT_EQUAL( buff[i], readBuff[i] );
+        }
+
+        CPPUNIT_ASSERT( readObj0  );
+        CPPUNIT_ASSERT( readObj1  );
+        CPPUNIT_ASSERT( readBlob  );
+        CPPUNIT_ASSERT( readMap   );
+        CPPUNIT_ASSERT( readSeq2  );
+        CPPUNIT_ASSERT( readBoolF );
+        CPPUNIT_ASSERT( readNum   );
+        CPPUNIT_ASSERT( readStr   );
+        CPPUNIT_ASSERT( !readNull );
+        CPPUNIT_ASSERT( readNum2  );
+        CPPUNIT_ASSERT( readBoolT );
+
+        CPPUNIT_ASSERT_EQUAL( readObj0, readObj1 );
+        CPPUNIT_ASSERT_EQUAL( readSeq, readSeq2 );
+
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_0, readObj0->getMetaInfo(META_KEY_0) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_1, readObj0->getMetaInfo(META_KEY_1) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_2, readObj0->getMetaInfo(META_KEY_2) );
+        CPPUNIT_ASSERT_EQUAL( META_VALUE_3, readObj0->getMetaInfo(META_KEY_3) );
+
+        CPPUNIT_ASSERT_EQUAL( obj->getAttributes().size(), readObj0->getAttributes().size() );
+
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readBlob), readObj0->getAttribute(ATTR_NAME_0) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readMap ), readObj0->getAttribute(ATTR_NAME_1) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readStr ), readObj0->getAttribute(ATTR_NAME_2) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(readNum ), readObj0->getAttribute(ATTR_NAME_3) );
+        CPPUNIT_ASSERT_EQUAL( ::fwAtoms::Base::sptr(), readObj0->getAttribute(ATTR_NAME_4) );
+
+        CPPUNIT_ASSERT_EQUAL( boolFalse->getValue(), readBoolF->getValue() );
+        CPPUNIT_ASSERT_EQUAL( boolTrue->getValue(), readBoolT->getValue() );
+        CPPUNIT_ASSERT_EQUAL( num->getString(), readNum->getString() );
+        CPPUNIT_ASSERT_EQUAL( num2->getString(), readNum2->getString() );
+        CPPUNIT_ASSERT_EQUAL( str->getValue(), readStr->getValue() );
+    }
+};
+
+SequenceGenerator generator;
+
+//-----------------------------------------------------------------------------
+
+void Hdf5IOTest::setUp()
+{
+}
+
+void Hdf5IOTest::tearDown()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void Hdf5IOTest::readWriteTest()
+{
+    ::boost::filesystem::path folderPath =
+            ::fwTools::System::getTemporaryFolder() / "HDF5" / "HdF5Test.hdf5";
+
+    if ( !::boost::filesystem::exists(folderPath.parent_path()))
+    {
+        ::boost::filesystem::create_directories(folderPath.parent_path());
+    }
+
+    this->writeProcess(folderPath);
+
+    this->readProcess(folderPath);
+
+    bool suppr = ::boost::filesystem::remove_all(folderPath);
+    CPPUNIT_ASSERT(suppr);
+}
+
+//-----------------------------------------------------------------------------
+
+void Hdf5IOTest::writeProcess( ::boost::filesystem::path path )
+{
+    ::fwAtoms::Sequence::sptr seq = generator.getSequence();
+    ::fwAtomsHdf5IO::Writer(seq).write(path);
+}
+
+//-----------------------------------------------------------------------------
+
+void Hdf5IOTest::readProcess( ::boost::filesystem::path path )
+{
+    ::fwAtoms::Sequence::sptr readSeq;
+    {
+        readSeq = ::fwAtoms::Sequence::dynamicCast(::fwAtomsHdf5IO::Reader().read(path));
+    }
+    generator.compare(readSeq);
+}
+
+}  // namespace ut
+}  // namespace fwAtomsHdf5IO
+
+
diff --git a/SrcLib/io/fwItkIO/CMakeLists.txt b/SrcLib/io/fwItkIO/CMakeLists.txt
new file mode 100644
index 0000000..9540675
--- /dev/null
+++ b/SrcLib/io/fwItkIO/CMakeLists.txt
@@ -0,0 +1,49 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwCore
+    fwData
+    fwDataIO
+    fwTools
+)
+
+
+
+find_package(Boost COMPONENTS filesystem REQUIRED)
+find_package(ITK REQUIRED)
+find_package(GDCM REQUIRED)
+include(${GDCM_USE_FILE})
+
+
+find_library(VGL_ALGO_LIBRARY   vgl_algo )
+find_library(VNL_ALGO_LIBRARY   vnl_algo )
+find_library(VNL_LIBRARY        vnl )
+find_library(VCL_LIBRARY        vcl )
+find_library(V3P_NETLIB_LIBRARY v3p_netlib )
+find_path( VNL_INCLUDE_PATH  vxl/core/vnl/vnl_alloc.h)
+
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS}
+    ${ITK_INCLUDE_DIRS}
+    ${VNL_INCLUDE_PATH}
+    ${VNL_INCLUDE_PATH}/vxl
+    ${VNL_INCLUDE_PATH}/vxl/core
+    ${VNL_INCLUDE_PATH}/vxl/vcl
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    ITKCommon
+    ITKIO
+    ITKMetaIO
+    ITKznz
+    itksys
+    ${ITKIO_LIB_DEPENDS}
+
+    ${VGL_ALGO_LIBRARY}
+    ${VNL_ALGO_LIBRARY}
+    ${VNL_LIBRARY}
+    ${V3P_NETLIB_LIBRARY}
+    gdcmMSFF
+    )
+
diff --git a/SrcLib/io/fwItkIO/Properties.cmake b/SrcLib/io/fwItkIO/Properties.cmake
new file mode 100644
index 0000000..581fad9
--- /dev/null
+++ b/SrcLib/io/fwItkIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwItkIO )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwDataIO fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwItkIO/bin/build.options b/SrcLib/io/fwItkIO/bin/build.options
new file mode 100644
index 0000000..46ccb3b
--- /dev/null
+++ b/SrcLib/io/fwItkIO/bin/build.options
@@ -0,0 +1,11 @@
+TYPE='shared'
+LIB = ['fwData_0-1','fwCore_0-1','fwDataIO_0-2','fwTools_0-1','fwComEd_0-1']
+VERSION = '0-1'
+USE = [
+      'boost', 
+      'boostFilesystem',
+      'itkIO',
+      'gdcmMSFF'
+      ]
+
+
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/ImageIOFactoryRegistrar.hxx b/SrcLib/io/fwItkIO/include/fwItkIO/ImageIOFactoryRegistrar.hxx
new file mode 100644
index 0000000..810cab1
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/ImageIOFactoryRegistrar.hxx
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "itkObjectFactoryBase.h"
+
+
+
+namespace fwItkIO
+{
+
+/**
+ * @brief The purpose of this class is to automatically register a Concrete ImageIOFactory in the factory database of ITK ( itk::ObjectFactoryBase ).
+ * @tparam the type of imageiofactory class to register
+ * The technique used is declare a global variable as instance of a class ( see REGISTER_IMAGEIOFACTORY ). The creation of the instance will call the
+ * registration of the factory
+ */
+template< class ConcreteImageIOFactory >
+class ImageIOFactoryRegistrar
+{
+public:
+    ImageIOFactoryRegistrar()
+    {
+        ::itk::ObjectFactoryBase::RegisterFactory( ConcreteImageIOFactory::New() );
+    }
+};
+
+}
+
+/**
+ * @brief a macro helper to register an imageIOFactory
+ * @note to be declared outside any namespace
+ */
+#define REGISTER_IMAGEIOFACTORY( ConcreteImageIOFactory )   static ::fwItkIO::ImageIOFactoryRegistrar< ConcreteImageIOFactory > registrar;
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/ImageReader.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/ImageReader.hpp
new file mode 100644
index 0000000..3d008be
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/ImageReader.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_IMAGEREADER_HPP_
+#define _FWITKIO_IMAGEREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwTools/ProgressAdviser.hpp>
+
+#include "fwItkIO/config.hpp"
+
+namespace fwItkIO
+{
+
+class ImageReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >,
+                    public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                    public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ImageReader)(::fwDataIO::reader::GenericObjectReader< ::fwData::Image>),
+                                            (()),
+                                            ::fwDataIO::reader::factory::New< ImageReader >
+                                           );
+    fwCoreAllowSharedFromThis();
+
+    FWITKIO_API ImageReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    FWITKIO_API ~ImageReader();
+
+    FWITKIO_API void read();
+};
+
+} // namespace fwItkIO
+
+#endif // _FWITKIO_IMAGEREADER_HPP_
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/ImageWriter.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/ImageWriter.hpp
new file mode 100644
index 0000000..f8965b9
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/ImageWriter.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_IMAGEWRITER_HPP_
+#define _FWITKIO_IMAGEWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwItkIO/config.hpp"
+
+namespace fwItkIO
+{
+
+class ImageWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >,
+                    public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                    public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ImageWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image>),
+                                            (()),
+                                            ::fwDataIO::writer::factory::New< ImageWriter >
+                                           );
+    fwCoreAllowSharedFromThis();
+
+    FWITKIO_API ImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    FWITKIO_API ~ImageWriter();
+
+    FWITKIO_API void write();
+
+    FWITKIO_API std::string extension();
+};
+
+} // namespace fwItkIO
+
+#endif // _FWITKIO_IMAGEWRITER_HPP_
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/JpgImageWriter.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/JpgImageWriter.hpp
new file mode 100644
index 0000000..befa4db
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/JpgImageWriter.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_JPGIMAGEWRITER_HPP_
+#define _FWITKIO_JPGIMAGEWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwItkIO/config.hpp"
+
+namespace fwItkIO
+{
+
+class JpgImageWriter :  public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >,
+                        public ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >,
+                        public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((JpgImageWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image>),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< JpgImageWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    FWITKIO_API JpgImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    FWITKIO_API ~JpgImageWriter();
+
+    FWITKIO_API void write();
+
+    FWITKIO_API std::string  extension();
+};
+
+} // namespace fwItkIO
+
+#endif // _FWITKIO_JPGIMAGEWRITER_HPP_
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/config.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/config.hpp
new file mode 100644
index 0000000..05f23ee
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/config.hpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_CONFIG_HPP_
+#define _FWITKIO_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWITKIO_EXPORTS
+    #define FWITKIO_API __declspec(dllexport)
+    #else
+    #define FWITKIO_API __declspec(dllimport)
+    #endif
+
+    #define FWITKIO_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWITKIO_EXPORTS
+    #define FWITKIO_API __attribute__ ((visibility("default")))
+    #define FWITKIO_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    #define FWITKIO_API __attribute__ ((visibility("hidden")))
+    #define FWITKIO_CLASS_API __attribute__ ((visibility("hidden")))
+    #endif
+
+#else
+
+    #define FWITKIO_API
+    #define FWITKIO_CLASS_API
+
+#endif
+
+#endif //FWITKIO_API
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hpp
new file mode 100644
index 0000000..4877a21
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _ITKIO_PROGESSITKTOFW_HPP_
+#define _ITKIO_PROGESSITKTOFW_HPP_
+
+#include <itkCommand.h>
+#include <itkProcessObject.h>
+
+#include <fwTools/ProgressAdviser.hpp>
+
+namespace fwItkIO
+{
+
+//------------------------------------------------------------------------------
+
+class ProgressorBase
+{
+public:
+    typedef SPTR(ProgressorBase) sptr;
+};
+
+//------------------------------------------------------------------------------
+
+template< typename OBSERVEE >
+class ProgressItkToFw : public ProgressorBase
+{
+public:
+    ProgressItkToFw(OBSERVEE observee, SPTR(::fwTools::ProgressAdviser) observer, std::string msg);
+
+    virtual ~ProgressItkToFw();
+
+protected :
+
+    OBSERVEE m_observee;
+    // observertag used by itk
+    unsigned long m_obsTag;
+    bool m_initialized;
+};
+
+//------------------------------------------------------------------------------
+
+class Progressor
+{
+    public:
+    typedef SPTR(Progressor) sptr;
+
+    template<typename OBS >
+    Progressor(OBS filter, SPTR(::fwTools::ProgressAdviser) observer, std::string message)
+    {
+        typedef ProgressItkToFw< OBS > ProgressType;
+        m_progressor = ProgressorBase::sptr(
+                new ProgressType( filter, observer, message )
+                );
+    }
+
+    ProgressorBase::sptr m_progressor;
+};
+
+}
+
+
+#include "fwItkIO/helper/ProgressItkToFw.hxx"
+
+#endif /* _ITKIO_PROGESSITKTOFW_HPP_ */
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hxx b/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hxx
new file mode 100644
index 0000000..7f7f54b
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/helper/ProgressItkToFw.hxx
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <limits>
+#include <sstream>
+
+#include <itkLightProcessObject.h>
+#include <itkEventObject.h>
+#include <itkCommand.h>
+#include <itkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+namespace fwItkIO
+{
+
+class LocalCommand : public itk::Command
+{
+public:
+
+    LocalCommand() {};
+
+    typedef LocalCommand Self;
+    typedef itk::SmartPointer<LocalCommand>      Pointer;
+    itkNewMacro (Self);
+
+    void Execute(itk::Object *caller, const itk::EventObject &event)
+    {
+        itk::LightProcessObject* po = dynamic_cast<itk::LightProcessObject*>(caller);
+        if( !po ) return;
+        float percent = po->GetProgress();
+        OSLM_TRACE("LocalCommand::Execute" << m_msg << " " << percent );
+        m_adviser->notifyProgress( percent , m_msg );
+    }
+
+    void Execute(const itk::Object *caller, const itk::EventObject &event)
+    {
+        itk::LightProcessObject* po = dynamic_cast<itk::LightProcessObject*>( const_cast<itk::Object*>(caller));
+        Execute(po,event);
+    }
+
+    std::string m_msg;
+    SPTR(::fwTools::ProgressAdviser) m_adviser;
+};
+
+//------------------------------------------------------------------------------
+
+template<typename OBSERVEE >
+ProgressItkToFw<OBSERVEE >::ProgressItkToFw(OBSERVEE observee, SPTR(::fwTools::ProgressAdviser) observer, std::string msg)
+: m_observee( observee), m_obsTag(std::numeric_limits<unsigned long>::max()), m_initialized(false)
+{
+    typename LocalCommand::Pointer itkCallBack;
+    itkCallBack = LocalCommand::New();
+    itkCallBack->m_msg = msg;
+    itkCallBack->m_adviser = observer;
+    m_obsTag = m_observee->AddObserver(itk::ProgressEvent(), itkCallBack );
+    m_initialized = true;
+}
+
+//------------------------------------------------------------------------------
+
+template<typename OBSERVEE >
+ProgressItkToFw<OBSERVEE >::~ProgressItkToFw()
+{
+    if( m_initialized)
+    {
+        m_observee->RemoveObserver (m_obsTag);
+    }
+}
+
+}
+
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/itk.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/itk.hpp
new file mode 100644
index 0000000..ce0c8cd
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/itk.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_ITK_HPP_
+#define _FWITKIO_ITK_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Image.hpp>
+
+#include "fwItkIO/config.hpp"
+
+namespace fwItkIO
+{
+
+/**
+ * @brief Allocate a new data Image from an itk one.
+ *
+ * If bufferManagerIsDataImage = true, itkImage releases buffer management
+ * and so ::fwData::Image manages it (in this case, itkImage must be the
+ * owner of this buffer). if bufferManagerIsDataImage = false, the created
+ * ::fwData::Image does not manage the image buffer.
+ */
+template< class ITKIMAGE>
+::fwData::Image::sptr dataImageFactory( typename ITKIMAGE::Pointer itkImage, bool bufferManagerIsDataImage = true );
+
+/**
+ * @brief Update a data Image from an itk one.
+ *
+ * If bufferManagerIsDataImage = true, itkImage releases buffer management
+ * and so ::fwData::Image manages it (in this case, itkImage must be the
+ * owner of this buffer). if bufferManagerIsDataImage = false, the created
+ * ::fwData::Image does not manage the image buffer.
+ */
+template< class ITKIMAGE>
+void dataImageFactory( typename ITKIMAGE::Pointer itkImage , ::fwData::Image::sptr _dataImage,  bool bufferManagerIsDataImage = true );
+
+/**
+ * @brief Create an ITK image from an ::fwData::Image.
+ *
+ * If bufferManagerIsDataImage = true, imageData conserve his buffer management
+ * and so the created itkImage not manages it. If bufferManagerIsDataImage = false,
+ * the created itkImage manage his image buffer and thus imageData releases his
+ * buffer (in this case, imageData must be the owner of this buffer).
+ *
+ * @pre an assertion check if ITKIMAGE::PixelType correspond to imageData->getPixelType
+ * @pre an assertion check if ITKIMAGE dimension correspond to imageData dimension
+ */
+template< class ITKIMAGE>
+typename ITKIMAGE::Pointer itkImageFactory( ::fwData::Image::sptr imageData, bool bufferManagerIsDataImage = true );
+
+}
+
+#include "fwItkIO/itk.hxx"
+
+#endif // _FWITKIO_ITK_HPP_
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/itk.hxx b/SrcLib/io/fwItkIO/include/fwItkIO/itk.hxx
new file mode 100644
index 0000000..38cfd9a
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/itk.hxx
@@ -0,0 +1,147 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <assert.h>
+
+#include <itkImage.h>
+#include <itkImageRegion.h>
+
+#include <fwTools/DynamicType.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+namespace fwItkIO
+{
+
+template< class ITKIMAGE>
+void dataImageFactory( typename ITKIMAGE::Pointer itkImage , ::fwData::Image::sptr _dataImage, bool bufferManagerIsDataImage )
+{
+    SLM_ASSERT("_dataImage not instanced", _dataImage);
+
+
+    // Add by arnaud
+    ::boost::uint8_t  dim = ITKIMAGE::ImageDimension;
+    ::fwData::Image::SpacingType _vSpacing(dim,1);
+    ::fwData::Image::OriginType _vOrigin(dim,0);
+    ::fwData::Image::SizeType  _vSize(dim,0);
+
+    for (boost::uint8_t  d=0; d<dim; ++d)
+    {
+        // _vOrigin[d] = itkImage->GetBufferedRegion().GetIndex()[d];
+        _vOrigin[d] = itkImage->GetOrigin()[d];
+        _vSize[d] = itkImage->GetBufferedRegion().GetSize()[d];
+        _vSpacing[d] = itkImage->GetSpacing()[d];
+    }
+
+    _dataImage->setSize( _vSize );
+    _dataImage->setOrigin( _vOrigin );
+    _dataImage->setSpacing( _vSpacing );
+
+    typedef typename ITKIMAGE::PixelType PixelType;
+    _dataImage->setType( ::fwTools::Type::create<PixelType>() );
+    ::fwData::Array::sptr array = _dataImage->getDataArray();
+    ::fwComEd::helper::Array arrayHelper(array);
+    if( bufferManagerIsDataImage )
+    {
+        SLM_ASSERT("Sorry, this method requires that itkImage manages its buffer.",  itkImage->GetPixelContainer()->GetContainerManageMemory() );
+        arrayHelper.setBuffer( static_cast<void *>(itkImage->GetBufferPointer()), true, _dataImage->getType(), _vSize, 1 );
+        /// itk image release its management buffer. dataImage must now deal memory
+        itkImage->GetPixelContainer()->SetContainerManageMemory( false );
+    }
+    else
+    {
+        arrayHelper.setBuffer( static_cast<void *>(itkImage->GetBufferPointer()), false, _dataImage->getType(), _vSize, 1 );
+    }
+
+
+    // Post Condition correct PixelType
+    SLM_ASSERT("Sorry, pixel type is not correct", _dataImage->getType()!= fwTools::Type() );
+}
+
+//------------------------------------------------------------------------------
+
+template< class ITKIMAGE>
+::fwData::Image::sptr dataImageFactory( typename ITKIMAGE::Pointer itkImage, bool bufferManagerIsDataImage )
+{
+    ::fwData::Image::sptr data = ::fwData::Image::New();
+    ::fwItkIO::dataImageFactory< ITKIMAGE >(itkImage,data, bufferManagerIsDataImage) ;
+    return data;
+}
+
+//------------------------------------------------------------------------------
+
+template< class ITKIMAGE_PTR >
+void itkImageToFwDataImage( ITKIMAGE_PTR itkImage , ::fwData::Image::sptr _dataImage )
+{
+    dataImageFactory< typename ITKIMAGE_PTR::ObjectType >(itkImage, _dataImage);
+}
+
+//------------------------------------------------------------------------------
+
+template< class ITKIMAGE>
+typename ITKIMAGE::Pointer fwDataImageToItkImage( ::fwData::Image::sptr imageData, bool bufferManagerIsDataImage )
+{
+    // Pre Condition
+    SLM_ASSERT("Sorry, itk image dimension not correspond to fwData image", imageData->getNumberOfDimensions() == ITKIMAGE::ImageDimension );
+
+    ::fwComEd::helper::Image imageHelper(imageData);
+
+    typename ITKIMAGE::Pointer itkImage=ITKIMAGE::New();
+
+    // update spacing information ; workaround due to GetSpacing const
+    typename ITKIMAGE::SpacingType spacing = itkImage->GetSpacing();
+    for (boost::uint8_t  d=0; d<ITKIMAGE::ImageDimension; ++d)
+    {
+        spacing[d] = imageData->getSpacing()[d];
+    }
+    itkImage->SetSpacing(spacing);
+
+    // update origin information ; workaround due to GetOrigin const
+    std::copy(   imageData->getOrigin().begin(),
+                 imageData->getOrigin().end(),
+                 const_cast< typename ITKIMAGE::PointType * >( &itkImage->GetOrigin())->Begin()
+             );
+
+    itk::ImageRegion< ITKIMAGE::ImageDimension > itkRegion;
+
+    unsigned long nbpixels=1;
+    for (::boost::uint8_t  d=0; d<ITKIMAGE::ImageDimension; ++d)
+    {
+        // itkRegion.SetIndex( d,  static_cast<int>(imageData->getCRefOrigin()[d]) );
+        itkRegion.SetSize( d,   static_cast<unsigned long>(imageData->getSize()[d]) );
+        nbpixels *= itkRegion.GetSize()[d];;
+    }
+
+    itkImage->SetRegions(itkRegion);
+
+    if( bufferManagerIsDataImage )
+    {
+        itkImage->GetPixelContainer()->SetImportPointer(static_cast< typename ITKIMAGE::PixelType *>( imageHelper.getBuffer() ) , nbpixels , false );
+    }
+    else
+    {
+        SLM_ASSERT("Sorry, this method requires that imageData manages its buffer.",   imageData->getDataArray()->getIsBufferOwner() );
+        itkImage->GetPixelContainer()->SetImportPointer(static_cast< typename ITKIMAGE::PixelType *>( imageHelper.getBuffer() ) , nbpixels , true );
+        imageData->getDataArray()->setIsBufferOwner( false );
+    }
+
+    return itkImage;
+}
+
+//------------------------------------------------------------------------------
+
+template< class ITKIMAGE>
+typename ITKIMAGE::Pointer itkImageFactory( ::fwData::Image::sptr imageData, bool bufferManagerIsDataImage )
+{
+    return fwDataImageToItkImage<ITKIMAGE>( imageData, bufferManagerIsDataImage );
+}
+
+//------------------------------------------------------------------------------
+
+} // end namespace
+
+
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hpp b/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hpp
new file mode 100644
index 0000000..0c111dd
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_ITKPP_HPP_
+#define _FWITKIO_ITKPP_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <itkpp/MaskScanner.h>
+#include <itkpp/ImageWithScanner.h>
+#include <itkpp/ImageToImageFilterForImageWithScanner.h>
+#include <itkpp/ImageWithScannerIteratorCollection.h>
+
+#include <fwData/Image.hpp>
+
+#include "fwItkIO/config.hpp"
+
+namespace fwItkIO
+{
+
+
+/*
+ * Create an image with scanner
+ * ITKIMAGE template parameter must be instantiated with itk::Image< PIXELTYPE , VDIM > and not with itk::ImageWithScanner< PIXELTYPE , VDIM >,
+ * otherwise the cast filter will wait for
+*/
+template< class PIXELTYPE , int VDimension , class ScannerType >
+typename ScannerType::Pointer  itkppScannerFactory( ::fwData::Image::sptr imageData);
+
+}
+
+#include "fwItkIO/itkpp.hxx"
+
+#endif // _FWITKIO_ITKPP_HPP_
diff --git a/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hxx b/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hxx
new file mode 100644
index 0000000..9f2ae3e
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/fwItkIO/itkpp.hxx
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/DynamicType.hpp>
+
+#include <assert.h>
+
+#include <itkCastImageFilter.h>
+
+#include "fwItkIO/itk.hpp"
+
+namespace fwItkIO
+{
+
+template< class PIXELTYPE , int VDimension , class ScannerType >
+typename ScannerType::Pointer  itkppScannerFactory( ::fwData::Image::sptr imageData)
+{
+    typedef itk::Image< PIXELTYPE , VDimension >    ImageType;
+
+    typename ImageType::Pointer itkRoi = ::fwItkIO::itkImageFactory< ImageType >( imageData ) ;
+    typedef itk::Image< unsigned char , VDimension  >   ROIType;
+    typedef itk::CastImageFilter< ImageType , ROIType  >        CasterType;
+    typename CasterType::Pointer caster = CasterType::New() ;
+    caster->SetInput( itkRoi ) ;
+    caster->Update() ;
+
+    typename ScannerType::Pointer scanner = ScannerType::New();
+    typename ROIType::Pointer outImg = caster->GetOutput();
+    scanner->SetMaskImage( outImg );
+    outImg->DisconnectPipeline();
+
+    return scanner ;
+}
+
+
+} // end namespace
+
+
diff --git a/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIO.h b/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIO.h
new file mode 100644
index 0000000..84a21bf
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIO.h
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef itk_InrImageIO_h
+#define itk_InrImageIO_h
+
+#include <fstream>
+#include "itkImageIOBase.h"
+
+#include "fwItkIO/config.hpp"
+
+namespace itk
+{
+
+/**
+ * \ingroup IOFilters
+ * \author R&D team
+ * \brief Class that defines how to read/write in the InrImage file format.
+ * @todo RGB and vector images.
+ */
+class FWITKIO_CLASS_API InrImageIO : public ImageIOBase
+{
+public :
+    /** Standard typedef's */
+    typedef InrImageIO Self;
+    typedef ImageIOBase SuperClass;
+    typedef SmartPointer<Self> Pointer;
+    
+    /** Method for creation through the object factory. */
+    itkNewMacro(Self);
+
+    /** Run-time type information (and related methods). */
+    itkTypeMacro(InrImageIO, Superclass);
+    
+    /*-------- This part of the interfaces deals with reading data. ----- */
+    
+    /** Determine if the file can be read with this ImageIO implementation.
+     * \param FileNameToRead The name of the file to test for reading.
+     * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite
+     * \return Returns true if this ImageIO can read the file specified.
+     */
+    virtual bool CanReadFile(const char* FileNameToRead);
+    
+    /** Set the spacing and dimension information for the set filename. */
+    virtual void ReadImageInformation();
+    
+    /** Reads the data from disk into the memory buffer provided. */
+    virtual void Read(void* buffer);
+    
+    /*-------- This part of the interfaces deals with writing data. ----- */
+
+    /** Determine if the file can be written with this ImageIO implementation.
+     * \param FileNameToWrite The name of the file to test for writing.
+     * \post Sets classes ImageIOBase::m_FileName variable to be FileNameToWrite
+     * \return Returns true if this ImageIO can write the file specified.
+     */
+    virtual bool CanWriteFile(const char * FileNameToWrite);
+
+    /** Set the spacing and dimension information for the set filename. */
+    virtual void WriteImageInformation();
+
+    /** Writes the data to disk from the memory buffer provided. Make sure
+     * that the IORegions has been set properly. */
+    virtual void Write(const void* buffer);
+    
+protected:
+    FWITKIO_API InrImageIO();
+    FWITKIO_API ~InrImageIO();
+    void PrintSelf(std::ostream& os, Indent indent) const;
+private:
+    InrImageIO(const Self&); //purposely not implemented
+    void operator=(const Self&); //purposely not implemented
+    
+    std::streampos m_headerSize;
+    //bool m_swapBytes;
+}; // class InrImageIO()
+
+} // namespace itk
+
+#endif // itk_InrImageIO_h
diff --git a/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIOFactory.h b/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIOFactory.h
new file mode 100644
index 0000000..13f974c
--- /dev/null
+++ b/SrcLib/io/fwItkIO/include/inr2itk/itkInrImageIOFactory.h
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef itk_InrImageIOFactory_h
+#define itk_InrImageIOFactory_h
+
+#include "itkObjectFactoryBase.h"
+#include "itkImageIOBase.h"
+
+namespace itk
+{
+/** 
+ * \class InrImageIOFactory
+ * \brief Create instances of InrImageIO objects using an object factory.
+ */
+class ITK_EXPORT InrImageIOFactory : public ObjectFactoryBase
+{
+public:
+  /** Standard class typedefs. */
+    typedef InrImageIOFactory   Self;
+    typedef ObjectFactoryBase  Superclass;
+    typedef SmartPointer<Self>  Pointer;
+    typedef SmartPointer<const Self>  ConstPointer;
+
+    /** Class methods used to interface with the registered factories. */
+    virtual const char* GetITKSourceVersion(void) const;
+    virtual const char* GetDescription(void) const;
+
+    /** Method for class instantiation. */
+    itkFactorylessNewMacro(Self);
+
+    /** Run-time type information (and related methods). */
+    itkTypeMacro(InrImageIOFactory, ObjectFactoryBase);
+
+    /** Register one factory of this type  */
+    static void RegisterOneFactory(void)
+    {
+        InrImageIOFactory::Pointer metaFactory = InrImageIOFactory::New();
+        ObjectFactoryBase::RegisterFactory(metaFactory);
+    }
+
+protected:
+    InrImageIOFactory();
+    ~InrImageIOFactory();
+    virtual void PrintSelf(std::ostream& os, Indent indent) const;
+
+private:
+    InrImageIOFactory(const Self&); //purposely not implemented
+    void operator=(const Self&); //purposely not implemented
+
+};
+
+
+} // end namespace itk
+
+
+#endif // itk_InrImageIOFactory_h
diff --git a/SrcLib/io/fwItkIO/src/fwItkIO/ImageReader.cpp b/SrcLib/io/fwItkIO/src/fwItkIO/ImageReader.cpp
new file mode 100644
index 0000000..fbfac36
--- /dev/null
+++ b/SrcLib/io/fwItkIO/src/fwItkIO/ImageReader.cpp
@@ -0,0 +1,133 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <itkImageFileReader.h>
+#include <itkImageIOFactory.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwItkIO/itk.hpp>
+
+
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/TypeInfoKeyTypeMapping.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "inr2itk/itkInrImageIOFactory.h"
+
+#include "fwItkIO/ImageReader.hpp"
+#include "fwItkIO/helper/ProgressItkToFw.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwItkIO::ImageReader );
+
+
+namespace fwItkIO
+{
+
+//------------------------------------------------------------------------------
+
+ImageReader::ImageReader(::fwDataIO::reader::IObjectReader::Key key)  : ::fwData::location::enableSingleFile< IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+ImageReader::~ImageReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+struct ITKLoaderFunctor
+{
+    struct Parameter
+    {
+        ::fwData::Image::sptr       m_dataImage;
+        std::string                 m_filename;
+        ::fwItkIO::ImageReader::sptr  m_fwReader;
+    };
+
+    template<class PIXELTYPE>
+    void operator()(Parameter &param)
+    {
+        OSLM_INFO( "::fwItkIO::ImageReader::ITKLoaderFunctor with PIXELTYPE "<<  ::fwTools::DynamicType::string<PIXELTYPE>() );
+
+        // VAG attention : ImageFileReader ne notifie AUCUNE progressEvent mais son ImageIO oui!!!! mais ImageFileReader ne permet pas de l'atteindre
+        // car soit mis a la mano ou alors construit lors de l'Update donc trop tard
+        // Il faut dont creer une ImageIO a la mano (*1*): affecter l'observation  sur IO (*2*) et mettre le IO dans le reader (voir *3*)
+
+        // Reader IO (*1*)
+        typename itk::ImageIOBase::Pointer imageIORead = itk::ImageIOFactory::CreateImageIO( param.m_filename.c_str(), itk::ImageIOFactory::ReadMode);
+
+        // set observation (*2*)
+        Progressor progress(imageIORead, param.m_fwReader, param.m_filename);
+
+        // the reader
+        typedef itk::Image< PIXELTYPE, 3 >              ImageType;
+        typedef itk::ImageFileReader< ImageType >       ReaderType;
+        typename ReaderType::Pointer reader = ReaderType::New();
+        reader->SetFileName( param.m_filename.c_str() );
+        // attach its IO (*3*)
+        reader->SetImageIO( imageIORead );
+
+        reader->Update();
+        typename ImageType::Pointer itkimage = reader->GetOutput();
+        ::fwItkIO::dataImageFactory< ImageType>( itkimage, param.m_dataImage );
+    }
+
+    //// get pixel type from Header
+    static const std::type_info& getImageType( const std::string &imageFileName )
+    {
+        itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(imageFileName.c_str(), itk::ImageIOFactory::ReadMode);
+
+        if( !imageIO )
+        {
+            std::string errMsg;
+            errMsg  = "no ImageIOFactory found to read header of file : ";
+            errMsg.append( imageFileName );
+
+            throw( std::ios_base::failure( errMsg ) );
+        }
+
+        imageIO->SetFileName( imageFileName.c_str() );
+        imageIO->ReadImageInformation();
+        return imageIO->GetComponentTypeInfo();
+    }
+};
+
+//------------------------------------------------------------------------------
+
+void ImageReader::read()
+{
+    ::boost::filesystem::path file = getFile();
+    OSLM_ASSERT("File: "<<file<<" doesn't exist", ::boost::filesystem::exists( file ) );
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    const std::type_info& ti    = ITKLoaderFunctor::getImageType( file.string() );
+
+    ITKLoaderFunctor::Parameter param;
+    param.m_filename =  file.string();
+    param.m_dataImage = this->getConcreteObject();
+    param.m_fwReader = this->getSptr();
+
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , ITKLoaderFunctor >::invoke(ti , param );
+
+    assert( m_object.lock() ); // verify that ::fwData::Image is well produced
+    // Post Condition image with a pixel type
+    SLM_ASSERT("Image has an unspecified type", getConcreteObject()->getPixelType() != ::fwTools::DynamicType() );
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/src/fwItkIO/ImageWriter.cpp b/SrcLib/io/fwItkIO/src/fwItkIO/ImageWriter.cpp
new file mode 100644
index 0000000..d71fa53
--- /dev/null
+++ b/SrcLib/io/fwItkIO/src/fwItkIO/ImageWriter.cpp
@@ -0,0 +1,127 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <itkImageFileWriter.h>
+
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+#include <fwTools/Dispatcher.hpp>
+
+#include <fwItkIO/itk.hpp>
+
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwItkIO/helper/ProgressItkToFw.hpp"
+#include "fwItkIO/ImageWriter.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwItkIO::ImageWriter );
+
+
+namespace fwItkIO
+{
+//------------------------------------------------------------------------------
+
+ImageWriter::ImageWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+ImageWriter::~ImageWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+
+struct ITKSaverFunctor
+{
+
+    struct Parameter
+    {
+        std::string                m_filename;
+        ::fwData::Image::sptr      m_dataImage;
+        ::fwItkIO::ImageWriter::sptr m_fwWriter;
+    };
+
+    template<class PIXELTYPE>
+    void operator()( const  Parameter &param )
+    {
+        OSLM_DEBUG( "itk::ImageFileWriter with PIXELTYPE "<<  fwTools::DynamicType::string<PIXELTYPE>() );
+
+        // VAG attention : ImageFileReader ne notifie AUCUNE progressEvent mais son ImageIO oui!!!! mais ImageFileReader ne permet pas de l'atteindre
+        // car soit mis a la mano ou alors construit lors de l'Update donc trop tard
+        // Il faut dont creer une ImageIO a la mano (*1*): affecter l'observation  sur IO (*2*) et mettre le IO dans le reader (voir *3*)
+
+        // Reader IO (*1*)
+        typename itk::ImageIOBase::Pointer imageIOWrite = itk::ImageIOFactory::CreateImageIO( param.m_filename.c_str(), itk::ImageIOFactory::WriteMode);
+        assert( imageIOWrite.IsNotNull() );
+
+        // create writer
+        typedef itk::Image< PIXELTYPE, 3> itkImageType;
+        typedef typename  itk::ImageFileWriter< itkImageType >      WriterType;
+        typename WriterType::Pointer writer = WriterType::New();
+
+
+        // set observation (*2*)
+        itk::LightProcessObject::Pointer castHelper= (itk::LightProcessObject *)(imageIOWrite.GetPointer());
+        assert( castHelper.IsNotNull() );
+        Progressor progress(castHelper, param.m_fwWriter, param.m_filename);
+
+        // create itk Image
+        typename itkImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<itkImageType>( param.m_dataImage );
+
+        writer->SetFileName( param.m_filename.c_str() );
+        writer->SetInput( itkImage );
+        writer->SetImageIO( imageIOWrite  ); // (*3*)
+
+        // save image;
+        writer->Update();
+    }
+};
+
+//------------------------------------------------------------------------------
+
+void ImageWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ITKSaverFunctor::Parameter saverParam;
+    saverParam.m_filename =  this->getFile().string();
+    saverParam.m_dataImage = getConcreteObject();
+    saverParam.m_fwWriter =  this->getSptr();
+    assert( saverParam.m_dataImage );
+
+    fwTools::Dispatcher< fwTools::IntrinsicTypes , ITKSaverFunctor >::invoke( saverParam.m_dataImage->getPixelType(), saverParam );
+}
+
+
+
+ std::string ImageWriter::extension()
+{
+    if ( getFile().empty() ||  ( getFile().string().find(".inr.gz") !=  std::string::npos ) )
+    {
+        return ".inr.gz";
+    }
+    else
+    {
+        return ::boost::filesystem::extension( getFile().leaf() );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/src/fwItkIO/JpgImageWriter.cpp b/SrcLib/io/fwItkIO/src/fwItkIO/JpgImageWriter.cpp
new file mode 100644
index 0000000..beb85b6
--- /dev/null
+++ b/SrcLib/io/fwItkIO/src/fwItkIO/JpgImageWriter.cpp
@@ -0,0 +1,173 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <itkImageSeriesWriter.h>
+#include <itkNumericSeriesFileNames.h>
+#include <itkIntensityWindowingImageFilter.h>
+
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+
+#include <fwComEd/Dictionary.hpp>
+#include <fwComEd/fieldHelper/MedicalImageHelpers.hpp>
+
+#include <fwData/Integer.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include <fwItkIO/itk.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwItkIO/helper/ProgressItkToFw.hpp"
+#include "fwItkIO/JpgImageWriter.hpp"
+
+
+fwDataIOWriterRegisterMacro( ::fwItkIO::JpgImageWriter );
+
+
+namespace fwItkIO
+{
+
+//------------------------------------------------------------------------------
+
+JpgImageWriter::JpgImageWriter(::fwDataIO::writer::IObjectWriter::Key key) :
+        ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+JpgImageWriter::~JpgImageWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+struct JpgITKSaverFunctor
+{
+    struct Parameter
+    {
+        std::string                   m_filename;
+        ::fwData::Image::sptr         m_dataImage;
+        ::fwItkIO::JpgImageWriter::sptr m_fwWriter;
+    };
+
+    template<class PIXELTYPE>
+    void operator()( const  Parameter &param )
+    {
+        OSLM_DEBUG( "itk::ImageSeriesWriter with PIXELTYPE "<<  fwTools::DynamicType::string<PIXELTYPE>() );
+
+        ::fwData::Image::sptr image = param.m_dataImage;
+
+        // VAG attention : ImageFileReader ne notifie AUCUNE progressEvent mais son ImageIO oui!!!! mais ImageFileReader ne permet pas de l'atteindre
+        // car soit mis a la mano ou alors construit lors de l'Update donc trop tard
+        // Il faut dont creer une ImageIO a la mano (*1*): affecter l'observation  sur IO (*2*) et mettre le IO dans le reader (voir *3*)
+
+        // Reader IO (*1*)
+        typename itk::ImageIOBase::Pointer imageIOWrite = itk::ImageIOFactory::CreateImageIO( "image.jpg", itk::ImageIOFactory::WriteMode);
+        assert( imageIOWrite.IsNotNull() );
+
+        // create writer
+        typedef itk::Image< PIXELTYPE, 3> itkImageType;
+        typedef itk::Image< unsigned char, 2 >      Image2DType;
+        typedef typename  itk::ImageSeriesWriter< itkImageType, Image2DType > WriterType;
+        typename WriterType::Pointer writer = WriterType::New();
+
+        // set observation (*2*)
+        itk::LightProcessObject::Pointer castHelper= (itk::LightProcessObject *)(imageIOWrite.GetPointer());
+        assert( castHelper.IsNotNull() );
+        Progressor progress(castHelper, param.m_fwWriter, param.m_filename);
+
+        // create itk Image
+        typename itkImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<itkImageType>( image );
+
+        typedef ::itk::IntensityWindowingImageFilter< itkImageType, itkImageType > RescaleFilterType;
+        typename RescaleFilterType::Pointer rescaleFilter = RescaleFilterType::New();
+
+        double min, max;
+        ::fwData::Composite::sptr poolTF;
+        poolTF = image->getField< ::fwData::Composite>( ::fwComEd::Dictionary::m_transferFunctionCompositeId );
+        if(poolTF)
+        {
+            ::fwData::Composite::iterator iter = poolTF->find(::fwData::TransferFunction::s_DEFAULT_TF_NAME);
+            if(iter != poolTF->end())
+            {
+                ::fwData::TransferFunction::sptr tf;
+                tf = ::fwData::TransferFunction::dynamicCast(iter->second);
+                min = tf->getWLMinMax().first;
+                max = tf->getWLMinMax().second;
+            }
+        }
+        else
+        {
+            ::fwComEd::fieldHelper::MedicalImageHelpers::getMinMax(image, min, max);
+        }
+
+        rescaleFilter->SetWindowMinimum( min );
+        rescaleFilter->SetWindowMaximum( max );
+        rescaleFilter->SetOutputMinimum( 0 );
+        rescaleFilter->SetOutputMaximum( 255 );
+        rescaleFilter->InPlaceOff();
+        rescaleFilter->SetInput( itkImage );
+        rescaleFilter->Update();
+
+        writer->SetInput( rescaleFilter->GetOutput() );
+
+        typedef itk::NumericSeriesFileNames    NameGeneratorType;
+
+        NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
+
+        std::string format = param.m_filename;
+        format += "/%04d.jpg";
+        nameGenerator->SetSeriesFormat( format.c_str() );
+        nameGenerator->SetStartIndex( 1 );
+        nameGenerator->SetEndIndex( image->getSize()[2] );
+        nameGenerator->SetIncrementIndex( 1 );
+
+        writer->SetFileNames( nameGenerator->GetFileNames() );
+
+        writer->SetImageIO( imageIOWrite  );
+
+        // save image;
+        writer->Update();
+    }
+};
+
+//------------------------------------------------------------------------------
+
+void JpgImageWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    JpgITKSaverFunctor::Parameter saverParam;
+    saverParam.m_filename =  this->getFolder().string();
+    saverParam.m_dataImage = this->getConcreteObject();
+    saverParam.m_fwWriter =  this->getSptr();
+    assert( saverParam.m_dataImage );
+
+    ::fwTools::Dispatcher< ::fwTools::IntrinsicTypes , JpgITKSaverFunctor >::invoke( saverParam.m_dataImage->getPixelType(), saverParam );
+}
+
+//------------------------------------------------------------------------------
+
+std::string  JpgImageWriter::extension()
+{
+    return ".jpg";
+}
+
+} // namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIO.cxx b/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIO.cxx
new file mode 100644
index 0000000..ff205e0
--- /dev/null
+++ b/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIO.cxx
@@ -0,0 +1,804 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <map>
+#include <utility>
+#include <cstdio>
+
+#include <boost/lexical_cast.hpp>
+
+#include <itk_zlib.h>
+#include <itkByteSwapper.h>
+#include <itkIOCommon.h>
+#include <itkExceptionObject.h>
+
+#include <fwCore/spyLog.hpp>
+#include <fwCore/Exception.hpp>
+
+#include "inr2itk/itkInrImageIO.h"
+
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+
+namespace itk
+{
+
+InrImageIO::InrImageIO()
+{
+    this->SetNumberOfDimensions(3);
+    m_PixelType = SCALAR;
+    //m_swapBytes = false;
+}
+
+//------------------------------------------------------------------------------
+
+InrImageIO::~InrImageIO()
+{
+    // Nothing to do.
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageIO::PrintSelf(std::ostream& os, Indent indent) const
+{
+    Superclass::PrintSelf(os, indent);
+    os << indent << "PixelType " << m_PixelType << "\n";
+    os << indent << "ComponentType " << m_ComponentType << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+bool InrImageIO::CanReadFile( const char* FileNameToRead )
+{
+    // Do not perform extension checking, magic number in the header is better.
+    gzFile inputFile = gzopen(FileNameToRead, "rb");
+    if(inputFile == 0)
+    {
+        return false;
+    }
+
+    char firstLine[256];
+
+    gzgets(inputFile, firstLine, 256);
+
+    gzclose(inputFile);
+
+    std::string const magic("#INRIMAGE-4#{\n");
+    if(firstLine!=magic)
+    {
+        return false;
+    }
+    else
+    {
+        return true;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageIO::ReadImageInformation()
+{
+    gzFile inputFile = gzopen(this->GetFileName(), "rb");
+    if(inputFile==NULL)
+    {
+        gzclose(inputFile);
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "File " << GetFileName() << " could not be read";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    const int lineBufSize = 256;
+    char linebuf[lineBufSize];
+    std::map<std::string, std::string> headerValues;
+    m_headerSize = 0;
+    while( gzgets(inputFile, linebuf, lineBufSize) && !gzeof(inputFile) )
+    {
+        std::string line(linebuf);
+        // Count the number of characters we just read : length of the line
+        m_headerSize += line.length();
+        // Remove eventual trailing '\n'
+        std::string::size_type const endOfLine = line.find('\n');
+        line = line.substr(0, endOfLine);
+
+        if(line=="##}")
+        {
+            // End of header : get outta here
+            break;
+        }
+
+        if(line.empty())
+        {
+            // Empty line, nothing to do
+        }
+        else if(line[0]=='#')
+        {
+            // Comment line, nothing to do
+        }
+        else
+        {
+            // Look for key=value
+            std::string::const_iterator delimiter = std::find(line.begin(), line.end(), '=');
+            if(delimiter==line.end())
+            {
+                // invalid line : missing '='
+                gzclose(inputFile);
+                ExceptionObject exception(__FILE__, __LINE__);
+                std::stringstream errorMessage;
+                errorMessage << "Invalid INR file.\n" << "Offending line : " << line;
+                exception.SetDescription(errorMessage.str());
+                throw exception;
+            }
+
+            // Tokenize [KEY] = [VALUE] and store it in map
+            std::string key = line.substr(0, delimiter-line.begin());
+            std::string value = line.substr(delimiter-line.begin()+1, std::string::npos);
+            OSLM_TRACE("[" << key << "] = [" << value << "]");
+            if(headerValues.find(key)!=headerValues.end())
+            {
+                // duplicate key
+                ExceptionObject exception(__FILE__, __LINE__);
+                gzclose(inputFile);
+                std::stringstream errorMessage;
+                errorMessage << "Invalid INR file.\n" << "Duplicate key : " << key;
+                exception.SetDescription(errorMessage.str());
+                throw exception;
+            }
+            else
+            {
+                headerValues[key] = value;
+            }
+        }
+    }
+    // We have finished reading the header
+    gzclose(inputFile);
+
+    // Process headerValue map
+    for(std::map<std::string, std::string>::const_iterator it=headerValues.begin(); it!=headerValues.end(); ++it)
+    {
+        if(it->first=="XDIM")
+        {
+            int xdim = ::boost::lexical_cast<int>( it->second );
+            this->SetDimensions(0, xdim);
+        }
+        else if(it->first=="YDIM")
+        {
+            int ydim = ::boost::lexical_cast<int>( it->second );
+            this->SetDimensions(1, ydim);
+        }
+        else if(it->first=="ZDIM")
+        {
+            int zdim = ::boost::lexical_cast<int>( it->second );
+            this->SetDimensions(2, zdim);
+        }
+        else if(it->first=="VDIM")
+        {
+            int vdim = ::boost::lexical_cast<int>( it->second );
+            if(vdim == 1)
+            {
+                SetPixelType(SCALAR);
+            }
+            else
+            {
+                SetPixelType(VECTOR);
+            }
+            SetNumberOfComponents(vdim);
+        }
+        else if(it->first=="VX")
+        {
+            float vx = ::boost::lexical_cast< float >( it->second );
+            this->SetSpacing(0, vx);
+        }
+        else if(it->first=="VY")
+        {
+            float vy = ::boost::lexical_cast< float >( it->second );
+            this->SetSpacing(1, vy);
+        }
+        else if(it->first=="VZ")
+        {
+            float vz = ::boost::lexical_cast< float >( it->second );
+            this->SetSpacing(2, vz);
+        }
+        else if(it->first=="TYPE")
+        {
+            std::map<std::string, std::string>::const_iterator pixsize_it = headerValues.find("PIXSIZE");
+            if(pixsize_it==headerValues.end())
+            {
+                // Missing pixsize
+                ExceptionObject exception(__FILE__, __LINE__);
+                std::stringstream errorMessage;
+                errorMessage << "Invalid INR file.\n" << "PIXSIZE key not found.";
+                exception.SetDescription(errorMessage.str());
+                throw exception;
+            }
+            std::string type = it->second;
+            std::string pixsize = pixsize_it->second;
+            if(type=="unsigned fixed")
+            {
+                if(pixsize=="8 bits")
+                {
+                    m_ComponentType = UCHAR;
+                }
+                else if(pixsize=="16 bits")
+                {
+                    m_ComponentType = USHORT;
+                }
+                else if(pixsize=="32 bits")
+                {
+                    if ( 4 == sizeof(unsigned int) )
+                    {
+                        m_ComponentType = UINT;
+                    }
+                    else if ( 4 == sizeof(unsigned long) )
+                    {
+                        m_ComponentType = ULONG;
+                    }
+                    else
+                    {
+                        ExceptionObject exception(__FILE__, __LINE__);
+                        std::stringstream errorMessage;
+                        errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                        exception.SetDescription(errorMessage.str());
+                        throw exception;
+                    }
+                }
+                else if(pixsize=="64 bits")
+                {
+                    if ( 8 == sizeof(unsigned int) )
+                    {
+                        m_ComponentType = UINT;
+                    }
+                    else if ( 8 == sizeof(unsigned long) )
+                    {
+                        m_ComponentType = ULONG;
+                    }
+                    else
+                    {
+                        ExceptionObject exception(__FILE__, __LINE__);
+                        std::stringstream errorMessage;
+                        errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                        exception.SetDescription(errorMessage.str());
+                        throw exception;
+                    }
+                }
+                else
+                {
+                    ExceptionObject exception(__FILE__, __LINE__);
+                    std::stringstream errorMessage;
+                    errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                    exception.SetDescription(errorMessage.str());
+                    throw exception;
+                }
+            }
+            else if(type=="signed fixed")
+            {
+                if(pixsize=="8 bits")
+                {
+                    m_ComponentType = CHAR;
+                }
+                else if(pixsize=="16 bits")
+                {
+                    m_ComponentType = SHORT;
+                }
+                else if(pixsize=="32 bits")
+                {
+                    if ( 4 == sizeof(int) )
+                    {
+                        m_ComponentType = INT;
+                    }
+                    else if ( 4 == sizeof(long) )
+                    {
+                        m_ComponentType = LONG;
+                    }
+                    else
+                    {
+                        ExceptionObject exception(__FILE__, __LINE__);
+                        std::stringstream errorMessage;
+                        errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                        exception.SetDescription(errorMessage.str());
+                        throw exception;
+                    }
+                }
+                else if(pixsize=="64 bits")
+                {
+                    if ( 8 == sizeof(int) )
+                    {
+                        m_ComponentType = INT;
+                    }
+                    else if ( 8 == sizeof(long) )
+                    {
+                        m_ComponentType = LONG;
+                    }
+                    else
+                    {
+                        ExceptionObject exception(__FILE__, __LINE__);
+                        std::stringstream errorMessage;
+                        errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                        exception.SetDescription(errorMessage.str());
+                        throw exception;
+                    }
+                }
+                else
+                {
+                    ExceptionObject exception(__FILE__, __LINE__);
+                    std::stringstream errorMessage;
+                    errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                    exception.SetDescription(errorMessage.str());
+                    throw exception;
+                }
+            }
+            else if(type=="float")
+            {
+                /*
+                if(pixsize=="8 bits")
+                {
+                }
+                else if(pixsize=="16 bits")
+                {
+                }
+                */
+                /*else*/ if(pixsize=="32 bits")
+                {
+                    m_ComponentType = FLOAT;
+                }
+                else if(pixsize=="64 bits")
+                {
+                    m_ComponentType = DOUBLE;
+                }
+                else
+                {
+                    ExceptionObject exception(__FILE__, __LINE__);
+                    std::stringstream errorMessage;
+                    errorMessage << "Invalid INR file.\n" << "Invalid PIXSIZE.";
+                    exception.SetDescription(errorMessage.str());
+                    throw exception;
+                }
+            }
+            else
+            {
+                ExceptionObject exception(__FILE__, __LINE__);
+                std::stringstream errorMessage;
+                errorMessage << "Invalid INR file.\n" << "Invalid TYPE.";
+                exception.SetDescription(errorMessage.str());
+                throw exception;
+            }
+        } // TYPE
+        else if(it->first=="PIXSIZE")
+        {
+            // nothing to do, processed with "TYPE"
+        }
+        else if(it->first=="SCALE")
+        {
+            // For fixed point arithmetic only. We don't use it.
+        }
+        else if(it->first=="CPU")
+        {
+            // Big endian are : sun, sgi
+            if(it->second=="sun" || it->second=="sgi")
+            {
+                // File is big-endian, swap if system is little endian.
+                //m_swapBytes = itk::ByteSwapper<char>::SystemIsLE();
+                m_ByteOrder = BigEndian;
+            }
+            // Little endian are : pc, alpha, decm
+            else if(it->second=="pc" || it->second=="alpha" || it->second=="decm")
+            {
+                // File is little-endian, swap if system is big-endian.
+                //m_swapBytes = itk::ByteSwapper<char>::SystemIsBE();
+                m_ByteOrder = LittleEndian;
+            }
+            else
+            {
+                ExceptionObject exception(__FILE__, __LINE__);
+                std::stringstream errorMessage;
+                errorMessage << "Invalid INR file.\n" << "Unknown CPU value : " << it->second;
+                exception.SetDescription(errorMessage.str());
+                throw exception;
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageIO::Read(void * buffer)
+{
+    gzFile file = gzopen(GetFileName(), "rb");
+
+    if(file == NULL)
+    {
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "INR file " << GetFileName() << " could not be read";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    // Skip the header
+    int bytesSkipped = gzseek(file, m_headerSize, SEEK_CUR);
+    if(bytesSkipped!=m_headerSize)
+    {
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "INR file " << GetFileName() << " could not be read (header size : " << bytesSkipped << "/" << m_headerSize <<").";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    // And read the buffer
+
+    // Replace this line :
+    //int bytesRead = gzread(file, buffer, GetImageSizeInBytes());
+    // by
+    int bytesRead = 0;
+    int nbStep = 10;
+    long long int size = (  (GetImageSizeInBytes()>1024*1024*10)?  ( GetImageSizeInBytes() / nbStep ) + 1 : GetImageSizeInBytes()  );
+    int step = 0;
+    try
+    {
+        while ( bytesRead < GetImageSizeInBytes() && step < nbStep )
+        {
+            step++;
+            UpdateProgress(  ((float)bytesRead)/GetImageSizeInBytes() );
+            bytesRead += gzread( file , ((char *)buffer)+bytesRead,  min(size, GetImageSizeInBytes() - bytesRead)  );
+        }
+    }
+    catch(::fwCore::Exception &e) // catch progress bar cancel exception
+    {
+        gzclose(file);
+        throw;
+    }
+    UpdateProgress( 1.0 );
+    // End replace
+
+    if(bytesRead!=GetImageSizeInBytes())
+    {
+        gzclose(file);
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "INR file " << GetFileName() << " could not be read";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    // Swap bytes if necessary
+    if ( m_ByteOrder == LittleEndian )
+    {
+        switch(m_ComponentType)
+        {
+            case CHAR:
+                ByteSwapper<char>::SwapRangeFromSystemToLittleEndian((char*)buffer, GetImageSizeInComponents() );
+                break;
+            case UCHAR:
+                ByteSwapper<unsigned char>::SwapRangeFromSystemToLittleEndian((unsigned char*)buffer, GetImageSizeInComponents() );
+                break;
+            case SHORT:
+                ByteSwapper<short>::SwapRangeFromSystemToLittleEndian((short*)buffer, GetImageSizeInComponents() );
+                break;
+            case USHORT:
+                ByteSwapper<unsigned short>::SwapRangeFromSystemToLittleEndian((unsigned short*)buffer, GetImageSizeInComponents() );
+                break;
+            case INT:
+                ByteSwapper<int>::SwapRangeFromSystemToLittleEndian((int*)buffer, GetImageSizeInComponents() );
+                break;
+            case UINT:
+                ByteSwapper<unsigned int>::SwapRangeFromSystemToLittleEndian((unsigned int*)buffer, GetImageSizeInComponents() );
+                break;
+            case LONG:
+                ByteSwapper<long>::SwapRangeFromSystemToLittleEndian((long*)buffer, GetImageSizeInComponents() );
+                break;
+            case ULONG:
+                ByteSwapper<unsigned long>::SwapRangeFromSystemToLittleEndian((unsigned long*)buffer, GetImageSizeInComponents() );
+                break;
+            case FLOAT:
+                ByteSwapper<float>::SwapRangeFromSystemToLittleEndian((float*)buffer, GetImageSizeInComponents() );
+                break;
+            case DOUBLE:
+                ByteSwapper<double>::SwapRangeFromSystemToLittleEndian((double*)buffer, GetImageSizeInComponents() );
+                break;
+            default:
+                gzclose(file);
+                ExceptionObject exception(__FILE__, __LINE__);
+                exception.SetDescription("Pixel Type Unknown");
+                throw exception;
+        }
+    }
+    else if ( m_ByteOrder == BigEndian )
+    {
+        switch(m_ComponentType)
+        {
+            case CHAR:
+                ByteSwapper<char>::SwapRangeFromSystemToBigEndian((char*)buffer, GetImageSizeInComponents() );
+                break;
+            case UCHAR:
+                ByteSwapper<unsigned char>::SwapRangeFromSystemToBigEndian((unsigned char*)buffer, GetImageSizeInComponents() );
+                break;
+            case SHORT:
+                ByteSwapper<short>::SwapRangeFromSystemToBigEndian((short*)buffer, GetImageSizeInComponents() );
+                break;
+            case USHORT:
+                ByteSwapper<unsigned short>::SwapRangeFromSystemToBigEndian((unsigned short*)buffer, GetImageSizeInComponents() );
+                break;
+            case INT:
+                ByteSwapper<int>::SwapRangeFromSystemToBigEndian((int*)buffer, GetImageSizeInComponents() );
+                break;
+            case UINT:
+                ByteSwapper<unsigned int>::SwapRangeFromSystemToBigEndian((unsigned int*)buffer, GetImageSizeInComponents() );
+                break;
+            case LONG:
+                ByteSwapper<long>::SwapRangeFromSystemToBigEndian((long*)buffer, GetImageSizeInComponents() );
+                break;
+            case ULONG:
+                ByteSwapper<unsigned long>::SwapRangeFromSystemToBigEndian((unsigned long*)buffer, GetImageSizeInComponents() );
+                break;
+            case FLOAT:
+                ByteSwapper<float>::SwapRangeFromSystemToBigEndian((float*)buffer, GetImageSizeInComponents() );
+                break;
+            case DOUBLE:
+                ByteSwapper<double>::SwapRangeFromSystemToBigEndian((double*)buffer, GetImageSizeInComponents() );
+                break;
+            default:
+                gzclose(file);
+                ExceptionObject exception(__FILE__, __LINE__);
+                exception.SetDescription("Pixel Type Unknown");
+                throw exception;
+        }
+    }
+
+    gzclose(file);
+}
+
+//------------------------------------------------------------------------------
+
+bool InrImageIO::CanWriteFile(const char * FileNameToWrite)
+{
+    // Extension must be .inr or .inr.gz
+    std::string const filename(FileNameToWrite);
+
+    std::string::size_type index = filename.rfind(".inr");
+    if(index==filename.length() - std::string(".inr").length())
+    {
+        return true;
+    }
+
+    index = filename.rfind(".inr.gz");
+    if(index==filename.length() - std::string(".inr.gz").length())
+    {
+        return true;
+    }
+
+    return false;
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageIO::WriteImageInformation()
+{
+    std::stringstream headerStream;
+
+    // Magic
+    headerStream << "#INRIMAGE-4#{" << "\n";
+    // Dimensions : always write a 3D InrImage
+    headerStream << "XDIM=" << ((GetDimensions(0)<1)?1:GetDimensions(0)) << "\n";
+    headerStream << "YDIM=" << ((GetDimensions(1)<1)?1:GetDimensions(1)) << "\n";
+    headerStream << "ZDIM=" << ((GetDimensions(2)<1)?1:GetDimensions(2)) << "\n";
+    // Number of components per pixel
+    headerStream << "VDIM=" << GetNumberOfComponents() << "\n";
+    // Spacing : if it's 0, put it to one instead
+    headerStream << "VX=" << ((GetSpacing(0)==0.0)?1.0:GetSpacing(0)) << "\n";
+    headerStream << "VY=" << ((GetSpacing(1)==0.0)?1.0:GetSpacing(1)) << "\n";
+    headerStream << "VZ=" << ((GetSpacing(2)==0.0)?1.0:GetSpacing(2)) << "\n";
+    // Scale
+    headerStream << "SCALE=2**0" << "\n";
+    // Endianness
+    headerStream << "CPU=" << (itk::ByteSwapper<char>::SystemIsLE()?"pc":"sgi") << "\n";
+    // Point type
+    std::string type;
+    if(m_ComponentType==UCHAR || m_ComponentType==USHORT || m_ComponentType==UINT || m_ComponentType==ULONG)
+    {
+        type="unsigned fixed";
+    }
+    else if(m_ComponentType==CHAR || m_ComponentType==SHORT || m_ComponentType==INT || m_ComponentType==LONG)
+    {
+        type="signed fixed";
+    }
+    else if(m_ComponentType==FLOAT || m_ComponentType==DOUBLE)
+    {
+        type="float";
+    }
+    else
+    {
+        // Unknown/incorrect component type
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "File " << GetFileName()
+                     << " could not be written : unknown pixel type.";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+    headerStream << "TYPE=" << type << "\n";
+    // PixelSize
+    int pixelSize;
+    if(m_ComponentType==UCHAR || m_ComponentType==CHAR)
+    {
+        pixelSize = sizeof(char);
+    }
+    else if(m_ComponentType==USHORT || m_ComponentType==SHORT)
+    {
+        pixelSize = sizeof(short);
+    }
+    else if(m_ComponentType==UINT || m_ComponentType==INT)
+    {
+        pixelSize = sizeof(int);
+    }
+    else if(m_ComponentType==ULONG || m_ComponentType==LONG)
+    {
+        pixelSize = sizeof(long);
+    }
+    else if(m_ComponentType==FLOAT)
+    {
+        pixelSize = sizeof(float);
+    }
+    else if(m_ComponentType==DOUBLE)
+    {
+        pixelSize = sizeof(double);
+    }
+    else
+    {
+        // Unknown/incorrect component type
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "File " << GetFileName()
+                     << " could not be written : unknown pixel type.";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    pixelSize *= 8;
+    headerStream << "PIXSIZE=" << pixelSize << " bits" << "\n";
+
+    int const padding = 256 - headerStream.str().length() - std::string("##}\n").length();
+    for(int i=0; i<padding; ++i)
+    {
+        headerStream << "\n";
+    }
+    headerStream << "##}\n";
+    if(!headerStream)
+    {
+        // Something could not be written to headerStream
+        ExceptionObject exception(__FILE__, __LINE__);
+        std::stringstream errorMessage;
+        errorMessage << "File " << GetFileName()
+                     << " could not be written : error while writing to headerStream.";
+        exception.SetDescription(errorMessage.str());
+        throw exception;
+    }
+
+    std::string const header = headerStream.str();
+    std::string const filename(this->GetFileName());
+    std::string::size_type const index = filename.rfind(".inr.gz");
+
+    if(index==filename.length() - std::string(".inr.gz").length())
+    {
+        gzFile outputFile = gzopen(this->GetFileName(), "wb9");
+        if(outputFile == 0)
+        {
+            ExceptionObject exception(__FILE__, __LINE__);
+            std::stringstream errorMessage;
+            errorMessage << "File " << GetFileName()
+                         << " could not be written : error writing header.";
+            exception.SetDescription(errorMessage.str());
+            throw exception;
+        }
+        std::string const headerString = headerStream.str();
+        gzwrite( outputFile, const_cast<char*>(headerString.c_str()), headerString.length() );
+        gzclose(outputFile);
+    }
+    else
+    {
+        FILE* outputFile = fopen(this->GetFileName(), "wb");
+        if(outputFile == 0)
+        {
+            ExceptionObject exception(__FILE__, __LINE__);
+            std::stringstream errorMessage;
+            errorMessage << "File " << GetFileName()
+                         << " could not be written : error writing header.";
+            exception.SetDescription(errorMessage.str());
+            throw exception;
+        }
+
+        std::string const headerString = headerStream.str();
+        fwrite( headerString.c_str(), sizeof(char), headerString.length(), outputFile);
+        fclose(outputFile);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InrImageIO::Write(const void* buffer)
+{
+    this->WriteImageInformation();
+    std::string const filename(GetFileName());
+    std::string const suffix(".inr.gz");
+    std::string::size_type const index = filename.rfind(suffix);
+    if(index==filename.length() - suffix.length())
+    {
+        gzFile outputFile = gzopen(this->GetFileName(), "ab");
+        if(outputFile == 0)
+        {
+            ExceptionObject exception(__FILE__, __LINE__);
+            std::stringstream errorMessage;
+            errorMessage << "File " << GetFileName()
+                         << " could not be written : error writing buffer.";
+            exception.SetDescription(errorMessage.str());
+            throw exception;
+        }
+
+        // Replace this line :
+        // gzwrite(outputFile, const_cast<void*>(buffer), GetImageSizeInBytes());
+        // by
+        int written = 0;
+        long long int size = (  (GetImageSizeInBytes()>1024*1024*10)? ( GetImageSizeInBytes() / 10 ) + 1 : GetImageSizeInBytes()  );
+        try
+        {
+            while ( written <   GetImageSizeInBytes() )
+            {
+                UpdateProgress(  ((float)written)/GetImageSizeInBytes() );
+                written += gzwrite( outputFile , ((char *)buffer)+written,  min(size, GetImageSizeInBytes() - written)  );
+
+            }
+        }
+        catch(::fwCore::Exception &e) // catch progress bar cancel exception
+        {
+            gzclose(outputFile);
+            throw;
+        }
+        UpdateProgress( 1.0 );
+        // End replace
+
+        gzclose(outputFile);
+    }
+    else
+    {
+        FILE* outputFile = fopen(this->GetFileName(), "ab");
+        if(outputFile == 0)
+        {
+            ExceptionObject exception(__FILE__, __LINE__);
+            std::stringstream errorMessage;
+            errorMessage << "File " << GetFileName()
+                         << " could not be written : error writing buffer.";
+            exception.SetDescription(errorMessage.str());
+            throw exception;
+        }
+
+        // Replace this line :
+        // fwrite(buffer, 1, GetImageSizeInBytes(), outputFile);
+        // by :
+        int written = 0;
+        long long int size = (  (GetImageSizeInBytes()>1024*1024*10)? ( GetImageSizeInBytes() / 10 ) + 1 : GetImageSizeInBytes()  );
+        try
+        {
+            while ( written <   GetImageSizeInBytes() )
+            {
+                UpdateProgress(  ((float)written)/GetImageSizeInBytes() );
+                written += fwrite( ((char *)buffer)+written, 1,  min(size, GetImageSizeInBytes() - written)  , outputFile);
+            }
+        }
+        catch(::fwCore::Exception &e) // catch progress bar cancel exception
+        {
+            fclose(outputFile);
+            throw ;
+        }
+        UpdateProgress( 1.0 );
+        // End replace
+
+        fclose(outputFile);
+    }
+}
+
+} // namespace itk
diff --git a/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIOFactory.cxx b/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIOFactory.cxx
new file mode 100644
index 0000000..43b9fbf
--- /dev/null
+++ b/SrcLib/io/fwItkIO/src/inr2itk/itkInrImageIOFactory.cxx
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwItkIO/ImageIOFactoryRegistrar.hxx"
+
+#include "inr2itk/itkInrImageIOFactory.h"
+
+#include "itkCreateObjectFunction.h"
+#include "inr2itk/itkInrImageIO.h"
+#include "itkVersion.h"
+
+#include <fwCore/base.hpp>
+
+
+REGISTER_IMAGEIOFACTORY( itk::InrImageIOFactory );
+
+
+namespace itk
+{
+
+void InrImageIOFactory::PrintSelf(std::ostream&, Indent) const
+{}
+
+//------------------------------------------------------------------------------
+
+InrImageIOFactory::InrImageIOFactory()
+{
+    SLM_TRACE_FUNC();
+    this->RegisterOverride("itkImageIOBase",
+            "itkInrImageIO",
+            "InrImage IO",
+            1,
+            CreateObjectFunction<InrImageIO>::New());
+}
+
+//------------------------------------------------------------------------------
+
+InrImageIOFactory::~InrImageIOFactory()
+{}
+
+//------------------------------------------------------------------------------
+
+const char* InrImageIOFactory::GetITKSourceVersion(void) const
+{
+    return ITK_SOURCE_VERSION;
+}
+
+//------------------------------------------------------------------------------
+
+const char* InrImageIOFactory::GetDescription() const
+{
+    return "InrImage ImageIO Factory, allows the loading of InrImage into ITK";
+}
+
+} // end namespace itk
diff --git a/SrcLib/io/fwItkIO/test/CMakeLists.txt b/SrcLib/io/fwItkIO/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/io/fwItkIO/test/Properties.cmake b/SrcLib/io/fwItkIO/test/Properties.cmake
new file mode 100644
index 0000000..e4fc8d7
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwItkIOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataIO fwItkIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwItkIO/test/cppunit.options b/SrcLib/io/fwItkIO/test/cppunit.options
new file mode 100644
index 0000000..41d9765
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/cppunit.options
@@ -0,0 +1,17 @@
+CLASSTEST=[
+          'ImageReaderWriterTest',
+          'ImageConversionTest',
+          'ImageReaderWriterJPGTest',
+          'helper',
+          ]
+USE = ['boost']
+LIB = [
+      'fwItkIO_0-1',
+      'fwTools_0-1',
+      'fwCore_0-1',
+      'fwData_0-1',
+      'fwDataCamp_0-1',
+      'fwDataIO_0-2',
+      'fwTest_0-1'
+      ]
+CONSOLE='yes'
diff --git a/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hpp b/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hpp
new file mode 100644
index 0000000..f0a2c8b
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_UT_IMAGECONVERSIONTEST_HPP_
+#define _FWITKIO_UT_IMAGECONVERSIONTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwData/Image.hpp>
+
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+class ImageConversionTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageConversionTest );
+    CPPUNIT_TEST( testConversion );
+    CPPUNIT_TEST( stressTest );
+    CPPUNIT_TEST( testConversion2D );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+    void testConversion();
+    void stressTest();
+    void testConversion2D();
+
+    static void roundSpacing(::fwData::Image::sptr image);
+
+    template< class TYPE >
+    void stressTestForAType();
+
+};
+
+} //namespace ut
+} //namespace fwItkIO
+
+#include "ImageConversionTest.hxx"
+
+#endif // _FWITKIO_UT_IMAGECONVERSIONTEST_HPP_
diff --git a/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hxx b/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hxx
new file mode 100644
index 0000000..8f1a0af
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/include/ImageConversionTest.hxx
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/helper/compare.hpp>
+
+#include <fwItkIO/itk.hpp>
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+template< class TYPE>
+void ImageConversionTest::stressTestForAType()
+{
+    for(unsigned char k=0; k<5; k++)
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create<TYPE>());
+
+        typedef itk::Image< TYPE , 3 > ImageType;
+        typename ImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<ImageType>( image );
+
+        ::fwTest::helper::ExcludeSetType exclude;
+        exclude.insert("array.isOwner");
+
+        ::fwData::Image::sptr image2 = ::fwData::Image::New();
+        bool image2ManagesHisBuffer = false;
+        ::fwItkIO::dataImageFactory< ImageType >( itkImage, image2, image2ManagesHisBuffer );
+        CPPUNIT_ASSERT(::fwTest::helper::compare(image, image2, exclude));
+
+        bool image3ManagesHisBuffer = false;
+        ::fwData::Image::sptr image3 = ::fwItkIO::dataImageFactory< ImageType >( itkImage, image3ManagesHisBuffer );
+        CPPUNIT_ASSERT(::fwTest::helper::compare(image, image3, exclude));
+    }
+}
+
+} //namespace ut
+} //namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterJPGTest.hpp b/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterJPGTest.hpp
new file mode 100644
index 0000000..bfc02ad
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterJPGTest.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_UT_IMAGEREADERWRITERJPGTEST_HPP_
+#define _FWITKIO_UT_IMAGEREADERWRITERJPGTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwData/Image.hpp>
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+class ImageReaderWriterJPGTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageReaderWriterJPGTest );
+    CPPUNIT_TEST( testImageWriter );
+    CPPUNIT_TEST( testImageWriter2 );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    // fonctions de tests
+    void testImageWriter();
+    void testImageWriter2();
+
+};
+
+} //namespace ut
+} //namespace fwItkIO
+
+#endif // _FWITKIO_UT_IMAGEREADERWRITERJPGTEST_HPP_
diff --git a/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterTest.hpp b/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterTest.hpp
new file mode 100644
index 0000000..61704ea
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/include/ImageReaderWriterTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_UT_IMAGEREADERWRITERTEST_HPP_
+#define _FWITKIO_UT_IMAGEREADERWRITERTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+#include <fwData/Image.hpp>
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+class ImageReaderWriterTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageReaderWriterTest );
+    CPPUNIT_TEST( testSaveLoadInr );
+    CPPUNIT_TEST( stressTestInr );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    // fonctions de tests
+    void testSaveLoadInr();
+    void stressTestInr();
+
+private :
+
+
+   void stressTestInrWithType(::fwTools::Type type, int nbTest);
+   void checkSaveLoadInr( ::fwData::Image::sptr image );
+};
+
+} //namespace ut
+} //namespace fwItkIO
+
+#endif // _FWITKIO_UT_IMAGEREADERWRITERTEST_HPP_
diff --git a/SrcLib/io/fwItkIO/test/tu/include/helper.hpp b/SrcLib/io/fwItkIO/test/tu/include/helper.hpp
new file mode 100644
index 0000000..600b7c5
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/include/helper.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWITKIO_UT_HELPER_HPP_
+#define _FWITKIO_UT_HELPER_HPP_
+
+namespace fwData
+{
+class Image;
+}
+
+namespace fwItkIO
+{
+namespace ut
+{
+namespace helper
+{
+
+void roundSpacing( SPTR(::fwData::Image) image);
+
+} //namespace helper
+} //namespace ut
+} //namespace fwItkIO
+
+
+#endif // _FWITKIO_UT_HELPER_HPP_
diff --git a/SrcLib/io/fwItkIO/test/tu/src/ImageConversionTest.cpp b/SrcLib/io/fwItkIO/test/tu/src/ImageConversionTest.cpp
new file mode 100644
index 0000000..84fe330
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/src/ImageConversionTest.cpp
@@ -0,0 +1,136 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Object.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/helper/compare.hpp>
+
+#include <fwItkIO/itk.hpp>
+
+#include "helper.hpp"
+#include "ImageConversionTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwItkIO::ut::ImageConversionTest );
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageConversionTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageConversionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageConversionTest::testConversion()
+{
+    // create Image
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    typedef itk::Image< ::boost::int16_t , 3 > ImageType;
+    ImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<ImageType>( image );
+
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    bool image2ManagesHisBuffer = false;
+    ::fwItkIO::dataImageFactory< ImageType >( itkImage, image2, image2ManagesHisBuffer );
+
+    ::fwItkIO::ut::helper::roundSpacing(image);
+    ::fwItkIO::ut::helper::roundSpacing(image2);
+
+    ::fwTest::helper::ExcludeSetType exclude;
+    exclude.insert("array.isOwner");
+
+    CPPUNIT_ASSERT(::fwTest::helper::compare(image, image2, exclude));
+
+    bool image3ManagesHisBuffer = false;
+    ::fwData::Image::sptr image3 = ::fwItkIO::dataImageFactory< ImageType >( itkImage, image3ManagesHisBuffer );
+    CPPUNIT_ASSERT(::fwTest::helper::compare(image, image3, exclude));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageConversionTest::stressTest()
+{
+    stressTestForAType< ::boost::int8_t >();
+    stressTestForAType< ::boost::uint8_t >();
+
+    stressTestForAType< ::boost::int16_t >();
+    stressTestForAType< ::boost::uint16_t >();
+
+    stressTestForAType< ::boost::int32_t >();
+    stressTestForAType< ::boost::uint32_t >();
+
+    stressTestForAType< ::boost::int64_t >();
+    stressTestForAType< ::boost::uint64_t >();
+
+    stressTestForAType< float >();
+    stressTestForAType< double >();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageConversionTest::testConversion2D()
+{
+    // create Image
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    const ::boost::uint8_t dim = 2;
+    ::fwData::Image::SizeType size(dim);
+    size[0] = rand()%100 + 2;
+    size[1] = rand()%100 + 2;
+    std::vector<double> spacing(dim);
+    spacing[0] = (rand()%200 +1) / 100.;
+    spacing[1] = (rand()%200 +1) / 100.;
+    std::vector<double> origin(dim);
+    origin[0] = (rand()%200 - 100) / 3.;
+    origin[1] = (rand()%200 - 100) / 3.;
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int16_t >();
+
+    ::fwTest::generator::Image::generateImage(image, size, spacing, origin, type);
+    ::fwData::Array::sptr array = image->getDataArray();
+    ::fwTest::generator::Image::randomizeArray(array);
+
+    typedef itk::Image< ::boost::int16_t , 2 > ImageType;
+
+    ImageType::Pointer itkImage = ::fwItkIO::itkImageFactory<ImageType>( image );
+
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    bool image2ManagesHisBuffer = false;
+    ::fwItkIO::dataImageFactory< ImageType >( itkImage, image2, image2ManagesHisBuffer );
+
+    ::fwItkIO::ut::helper::roundSpacing(image);
+    ::fwItkIO::ut::helper::roundSpacing(image2);
+
+    ::fwTest::helper::ExcludeSetType exclude;
+    exclude.insert("array.isOwner");
+
+    CPPUNIT_ASSERT(::fwTest::helper::compare(image, image2, exclude));
+
+    bool image3ManagesHisBuffer = false;
+    ::fwData::Image::sptr image3 = ::fwItkIO::dataImageFactory< ImageType >( itkImage, image3ManagesHisBuffer );
+    CPPUNIT_ASSERT(::fwTest::helper::compare(image, image3, exclude));
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterJPGTest.cpp b/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterJPGTest.cpp
new file mode 100644
index 0000000..cf8e07e
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterJPGTest.cpp
@@ -0,0 +1,90 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <itkImageFileWriter.h>
+#include <itkImageFileReader.h>
+
+#include <fwData/Image.hpp>
+
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/Data.hpp>
+
+#include <fwItkIO/itk.hpp>
+#include <fwItkIO/JpgImageWriter.hpp>
+#include <fwItkIO/ImageReader.hpp>
+
+#include "ImageReaderWriterJPGTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwItkIO::ut::ImageReaderWriterJPGTest );
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterJPGTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterJPGTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterJPGTest::testImageWriter()
+{
+    // create Image
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+
+    // save image in inr
+    const ::boost::filesystem::path PATH = "imageJPG";
+    ::boost::filesystem::create_directories( PATH );
+    ::fwItkIO::JpgImageWriter::sptr myWriter = ::fwItkIO::JpgImageWriter::New();
+    myWriter->setObject(image);
+    myWriter->setFolder(PATH);
+    CPPUNIT_ASSERT_NO_THROW(myWriter->write());
+
+    ::boost::filesystem::remove_all( PATH.string() );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterJPGTest::testImageWriter2()
+{
+    // create Image
+    ::boost::filesystem::path pathInr = ::fwTest::Data::dir() / "rd/patient/mfo/cas01/0/0/patientImage.inr.gz";
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwItkIO::ImageReader::sptr myReader = ::fwItkIO::ImageReader::New();
+    myReader->setObject(image);
+    myReader->setFile(pathInr);
+    myReader->read();
+
+    // save image in inr
+    const ::boost::filesystem::path PATH = "imageJPG";
+    ::boost::filesystem::create_directories( PATH );
+    ::fwItkIO::JpgImageWriter::sptr myWriter = ::fwItkIO::JpgImageWriter::New();
+    myWriter->setObject(image);
+    myWriter->setFolder(PATH);
+    CPPUNIT_ASSERT_NO_THROW(myWriter->write());
+
+    ::boost::filesystem::remove_all( PATH.string() );
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterTest.cpp b/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterTest.cpp
new file mode 100644
index 0000000..b3f0587
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/src/ImageReaderWriterTest.cpp
@@ -0,0 +1,137 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/helper/compare.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwItkIO/ImageWriter.hpp>
+#include <fwItkIO/ImageReader.hpp>
+
+#include "helper.hpp"
+#include "ImageReaderWriterTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwItkIO::ut::ImageReaderWriterTest );
+
+namespace fwItkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::testSaveLoadInr()
+{
+    // create Image
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type::create("int16"));
+    this->checkSaveLoadInr( image );
+}
+
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::stressTestInr()
+{
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int8_t >();
+//    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< ::boost::uint8_t >();
+    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< ::boost::int16_t >();
+    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< ::boost::uint16_t >();
+    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< ::boost::int32_t >();
+    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< ::boost::uint32_t >();
+    this->stressTestInrWithType(type, 5);
+
+//    type = ::fwTools::Type::create< ::boost::int64_t >();
+//    this->stressTestInrWithType(type, 5);
+
+//    type = ::fwTools::Type::create< ::boost::uint64_t >();
+//    this->stressTestInrWithType(type, 5);
+
+    type = ::fwTools::Type::create< float >();
+    this->stressTestInrWithType(type, 5);
+
+//    type = ::fwTools::Type::create< double >();
+//    this->stressTestInrWithType(type, 5);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::stressTestInrWithType(::fwTools::Type type, int nbTest)
+{
+    for (int nb=0 ; nb < nbTest ; ++nb)
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(image, type);
+        this->checkSaveLoadInr(image);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReaderWriterTest::checkSaveLoadInr( ::fwData::Image::sptr image )
+{
+    // inr only support image origin (0,0,0)
+    ::fwData::Image::OriginType origin(3,0);
+    image->setOrigin(origin);
+
+    // save image in inr
+    const ::boost::filesystem::path PATH = "imageInrTest/image.inr.gz";
+    ::boost::filesystem::create_directories( PATH.parent_path() );
+    ::fwItkIO::ImageWriter::sptr myWriter = ::fwItkIO::ImageWriter::New();
+    myWriter->setObject(image);
+    myWriter->setFile(PATH);
+    myWriter->write();
+
+    // load Image
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    ::fwItkIO::ImageReader::sptr myReader = ::fwItkIO::ImageReader::New();
+    myReader->setObject(image2);
+    myReader->setFile(PATH);
+    myReader->read();
+
+    ::boost::filesystem::remove_all( PATH.parent_path().string() );
+
+    ::fwItkIO::ut::helper::roundSpacing(image2);
+
+    // check Image
+    // inr only support float spacing and float origin => add tolerance for comparison (+/-0.00001)
+    CPPUNIT_ASSERT(::fwTest::helper::compare(image, image2));
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwItkIO
diff --git a/SrcLib/io/fwItkIO/test/tu/src/helper.cpp b/SrcLib/io/fwItkIO/test/tu/src/helper.cpp
new file mode 100644
index 0000000..47e2ab7
--- /dev/null
+++ b/SrcLib/io/fwItkIO/test/tu/src/helper.cpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Image.hpp>
+
+#include "helper.hpp"
+
+namespace fwItkIO
+{
+namespace ut
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+double tolerance(double num)
+{
+    return std::floor(num * 100. + .5) / 100;
+}
+
+void roundSpacing(::fwData::Image::sptr image)
+{
+    ::fwData::Image::SpacingType spacing = image->getSpacing();
+    std::transform (spacing.begin(), spacing.end(), spacing.begin(), tolerance);
+    image->setSpacing(spacing);
+}
+
+//------------------------------------------------------------------------------
+
+
+} //namespace helper
+} //namespace ut
+} //namespace fwItkIO
diff --git a/SrcLib/io/fwVtkIO/CMakeLists.txt b/SrcLib/io/fwVtkIO/CMakeLists.txt
new file mode 100644
index 0000000..3d5cffc
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/CMakeLists.txt
@@ -0,0 +1,15 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwData
+    fwDataIO
+    fwMedData
+    fwTools
+)
+
+find_package(VTK REQUIRED)
+
+fwForwardInclude(${VTK_INCLUDE_DIRS})
+fwLink(vtkHybrid)
+
+get_target_property(TARGET_TYPE vtkHybrid LOCATION)
diff --git a/SrcLib/io/fwVtkIO/COPYING b/SrcLib/io/fwVtkIO/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/io/fwVtkIO/COPYING.LESSER b/SrcLib/io/fwVtkIO/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/io/fwVtkIO/Properties.cmake b/SrcLib/io/fwVtkIO/Properties.cmake
new file mode 100644
index 0000000..af30820
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwVtkIO )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwDataIO fwMath fwMedData fwMemory fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwVtkIO/bin/build.options b/SrcLib/io/fwVtkIO/bin/build.options
new file mode 100644
index 0000000..c9350ca
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/bin/build.options
@@ -0,0 +1,17 @@
+TYPE='shared'
+LIB = [
+      'fwData_0-1',
+      'fwMedData_0-1',
+      'fwCore_0-1',
+      'fwDataIO_0-2',
+      'fwTools_0-1',
+      'fwMath_0-1',
+      'fwComEd_0-1'
+      ]
+VERSION = '0-1'
+USE = [
+       'boost',
+       'boostFilesystem',
+       'boostDateTime',
+       'vtkHybrid'
+       ]
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageReader.hpp
new file mode 100644
index 0000000..bcf5eed
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageReader.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_IMAGEREADER_HPP_
+#define _VTKIO_IMAGEREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read an image.
+ * @class   ImageReader
+ * 
+ * @date    2009.
+ *
+ * Read a VTK Image using the VTK lib
+ */
+class ImageReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ImageReader)( ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< ImageReader >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API ImageReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~ImageReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_IMAGEREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageWriter.hpp
new file mode 100644
index 0000000..c07f257
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/ImageWriter.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_IMAGEWRITER_HPP_
+#define _VTKIO_IMAGEWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <vtkActor.h>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write an image.
+ * @class   ImageWriter
+ * 
+ * @date    2009.
+ *
+ * Write a VTK Image using the VTK lib
+ */
+class ImageWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ImageWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< ImageWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API ImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~ImageWriter();
+
+    //! @brief Writing operator.
+    VTKIO_API void write();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_IMAGEWRITER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshReader.hpp
new file mode 100644
index 0000000..9878a05
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshReader.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_MESHREADER_HPP_
+#define _VTKIO_MESHREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+
+#include <fwData/Mesh.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read a mesh.
+ * @class   MeshReader
+ * 
+ * @date    2011.
+ *
+ * Read a VTK Mesh using the VTK lib
+ */
+
+class MeshReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::Mesh >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((MeshReader)( ::fwDataIO::reader::GenericObjectReader< ::fwData::Mesh >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< MeshReader >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API MeshReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~MeshReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_MESHREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshWriter.hpp
new file mode 100644
index 0000000..3780c2f
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/MeshWriter.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_MESHWRITER_HPP_
+#define _VTKIO_MESHWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwTools/ProgressAdviser.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+
+#include <fwData/Mesh.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write a mesh.
+ * @class   MeshWriter
+ * 
+ * @date    2011.
+ *
+ * Write a VTK Mesh using the VTK lib
+ */
+
+class MeshWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Mesh >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((MeshWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Mesh >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< MeshWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API MeshWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~MeshWriter();
+
+    //! @brief Reading operator.
+    VTKIO_API void write();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_MESHWRITER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageReader.hpp
new file mode 100644
index 0000000..471dd66
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageReader.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_METAIMAGEREADER_HPP_
+#define _VTKIO_METAIMAGEREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read a MetaImage.
+ * @class   MetaImageReader
+ * 
+ * @date    2011.
+ *
+ * Read a MetaImage using the VTK lib
+ */
+class MetaImageReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((MetaImageReader)( ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< MetaImageReader >
+                                          );
+
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API MetaImageReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~MetaImageReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".mhd"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_METAIMAGEREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageWriter.hpp
new file mode 100644
index 0000000..d8651a5
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/MetaImageWriter.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_METAIMAGEWRITER_HPP_
+#define _VTKIO_METAIMAGEWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write a MetaImage.
+ * @class   MetaImageWriter
+ * 
+ * @date    2011.
+ *
+ * Write a MetaImage using the VTK lib
+ */
+class MetaImageWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((MetaImageWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< MetaImageWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API MetaImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~MetaImageWriter();
+
+    //! @brief Writing operator.
+    VTKIO_API void write();
+
+    /// @return ".mhd"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_METAIMAGEWRITER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/ModelSeriesObjWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/ModelSeriesObjWriter.hpp
new file mode 100644
index 0000000..d3a5bf2
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/ModelSeriesObjWriter.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKIO_MODELSERIESOBJWRITER_HPP__
+#define __VTKIO_MODELSERIESOBJWRITER_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwData
+{
+    class Reconstruction;
+}
+
+namespace fwMedData
+{
+    class ModelSeries;
+}
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write a ::fwData::Reconstruction.
+ * @class   ModelSeriesObjWriter
+ *
+ * Write a ::fwData::Reconstruction as .obj file using the VTK lib and the obj format.
+ */
+class ModelSeriesObjWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwMedData::ModelSeries >,
+                             public ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (ModelSeriesObjWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwMedData::ModelSeries >),
+            (()),
+            ::fwDataIO::writer::factory::New< ModelSeriesObjWriter >
+            );
+
+    fwCoreAllowSharedFromThis();
+
+    //! Constructor.
+    VTKIO_API ModelSeriesObjWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! Destructor.
+    VTKIO_API ~ModelSeriesObjWriter();
+
+    //! Writing operator.
+    VTKIO_API void write();
+
+    /**
+     * @return ".obj"
+     */
+    VTKIO_API std::string extension();
+
+};
+
+} // namespace fwVtkIO
+
+#endif // __VTKIO_MODELSERIESOBJWRITER_HPP__
+
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/Namespace.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/Namespace.hpp
new file mode 100644
index 0000000..0ad1883
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWVTKIONAMESPACE_HPP_
+#define FWVTKIONAMESPACE_HPP_
+
+/*
+ * @brief       The namespace fwVtkIO provides classes for writting/reading data (image, mesh reconstruction) based on vtk lib .
+ * @namespace   fwVtkIO
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwVtkIO
+{
+}
+#endif /* FWVTKIONAMESPACE_HPP_ */
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/SeriesDBReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/SeriesDBReader.hpp
new file mode 100644
index 0000000..34bcf33
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/SeriesDBReader.hpp
@@ -0,0 +1,66 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_SERIESDBREADER_HPP_
+#define _VTKIO_SERIESDBREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwMedData/Series.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/MultiFiles.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read a SeriesDB.
+ * @class   SeriesDBReader
+ * 
+ * @date    2011.
+ *
+ * Read VTK Mesh or Image files using the VTK lib, convert to ModelSeries or ImageSeries and push to SeriesDB.
+ */
+class SeriesDBReader : public ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >,
+                             public ::fwData::location::enableMultiFiles< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((SeriesDBReader)( ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< SeriesDBReader >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API SeriesDBReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~SeriesDBReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+
+    void setLazyMode(bool lazyMode) { m_lazyMode = lazyMode; }
+
+protected:
+    bool m_lazyMode;
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_SERIESDBREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshReader.hpp
new file mode 100644
index 0000000..e242872
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshReader.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_TRIANGULARMESHREADER_HPP_
+#define _VTKIO_TRIANGULARMESHREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read a mesh.
+ * @class   TriangularMeshReader
+ * 
+ * @date    2009.
+ *
+ * Read a VTK Mesh using the VTK lib
+ */
+
+class TriangularMeshReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::TriangularMesh >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((TriangularMeshReader)( ::fwDataIO::reader::GenericObjectReader< ::fwData::TriangularMesh >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< TriangularMeshReader >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API TriangularMeshReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~TriangularMeshReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".trian"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_TRIANGULARMESHREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshWriter.hpp
new file mode 100644
index 0000000..f3152de
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/TriangularMeshWriter.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_TRIANGULARMESHWRITER_HPP_
+#define _VTKIO_TRIANGULARMESHWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/TriangularMesh.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write a mesh.
+ * @class   TriangularMeshWriter
+ * 
+ * @date    2009.
+ *
+ * Write a VTK Mesh using the VTK lib
+ */
+
+class TriangularMeshWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::TriangularMesh >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((TriangularMeshWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::TriangularMesh >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< TriangularMeshWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API TriangularMeshWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~TriangularMeshWriter();
+
+    //! @brief Reading operator.
+    VTKIO_API void write();
+
+    /// @return ".trian"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_TRIANGULARMESHWRITER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageReader.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageReader.hpp
new file mode 100644
index 0000000..9845fc5
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageReader.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_VTIIMAGEREADER_HPP_
+#define _VTKIO_VTIIMAGEREADER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Read an image.
+ * @class   VtiImageReader
+ * 
+ * @date    2009.
+ *
+ * Read a VTK Image using the VTK lib
+ */
+class VtiImageReader : public ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((VtiImageReader)( ::fwDataIO::reader::GenericObjectReader< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::reader::factory::New< VtiImageReader >
+                                          );
+
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API VtiImageReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~VtiImageReader();
+
+    //! @brief Reading operator.
+    VTKIO_API void read();
+
+    /// @return ".vtk"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_VTIIMAGEREADER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageWriter.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageWriter.hpp
new file mode 100644
index 0000000..3fdf20e
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/VtiImageWriter.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_VTIIMAGEWRITER_HPP_
+#define _VTKIO_VTIIMAGEWRITER_HPP_
+
+#include <boost/filesystem/path.hpp>
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/SingleFile.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwData/Image.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+/**
+ * @brief   Write an image.
+ * @class   VtiImageWriter
+ * 
+ * @date    2009.
+ *
+ * Write a VTK Image using the VTK lib
+ */
+class VtiImageWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >,
+                             public ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((VtiImageWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwData::Image >),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< VtiImageWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    //! @brief Constructor.
+    VTKIO_API VtiImageWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    //! @brief Destructor.
+    VTKIO_API ~VtiImageWriter();
+
+    //! @brief Writing operator.
+    VTKIO_API void write();
+
+    /// @return ".vti"
+    VTKIO_API  std::string extension();
+};
+
+} // namespace fwVtkIO
+
+#endif // _VTKIO_VTIIMAGEWRITER_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/config.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/config.hpp
new file mode 100644
index 0000000..28ba4b8
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/config.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_CONFIG_HPP_
+#define _VTKIO_CONFIG_HPP_
+
+#ifdef FWVTKIO_EXPORTS
+#define VTKIO_EXPORTS
+#endif
+
+#ifdef _WIN32
+
+    #ifdef VTKIO_EXPORTS
+    #define VTKIO_API __declspec(dllexport)
+    #define VTKIO_TEMPLATE_API
+    #else
+    #define VTKIO_API __declspec(dllimport)
+    #define VTKIO_TEMPLATE_API extern
+    #endif
+
+    #define VTKIO_CLASS_API
+
+    #pragma warning(disable: 4290)
+    #pragma warning(disable: 4800) // avoid waring on return hard coded value
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef VTKIO_EXPORTS
+        #define VTKIO_API __attribute__ ((visibility("default")))
+        #define VTKIO_CLASS_API __attribute__ ((visibility("default")))
+        #define VTKIO_TEMPLATE_API
+        #else
+        //#define VTKIO_API __attribute__ ((visibility("hidden")))
+        //#define VTKIO_CLASS_API __attribute__ ((visibility("hidden")))
+        #define VTKIO_API
+        #define VTKIO_CLASS_API
+        #define VTKIO_TEMPLATE_API extern
+        #endif
+
+#else
+
+        #define VTKIO_API
+        #define VTKIO_CLASS_API
+        #define VTKIO_TEMPLATE_API
+
+#endif
+
+
+#endif //_VTKIO_CONFIG_HPP_
+
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/Mesh.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/Mesh.hpp
new file mode 100644
index 0000000..e8bb7c2
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/Mesh.hpp
@@ -0,0 +1,122 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_HELPER_MESH_HPP_
+#define _VTKIO_HELPER_MESH_HPP_
+
+#include <vtkSmartPointer.h>
+#include <vtkPolyData.h>
+
+#include <fwData/Mesh.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+namespace helper
+{
+
+/**
+ * @brief   Helper to manage vtkPolyData and fwData::Mesh.
+ * @class   Mesh
+ * 
+ * @date    2011.
+ *
+ */
+class VTKIO_CLASS_API Mesh
+{
+
+public :
+
+    /*!
+     * @brief Convert a vtkPolyData to a ::fwData::Mesh::sptr.
+     *
+     * @param[in] _polyData vtkPolyData.
+     * @param[out] _mesh ::fwData::Mesh::sptr.
+     *
+     * Returns \b true if the conversion is a success and \b false if it fails
+     */
+    VTKIO_API static void fromVTKMesh(  vtkSmartPointer<vtkPolyData> _polyData, ::fwData::Mesh::sptr _mesh );
+
+    /*!
+     * @brief Convert a ::fwData::Mesh::sptr to a vtkPolyData.
+     *
+     * @param[in] _mesh ::fwData::Mesh::sptr.
+     * @param[out] _polyData vtkPolyData.
+     */
+    VTKIO_API static void toVTKMesh( ::fwData::Mesh::sptr _mesh, vtkSmartPointer<vtkPolyData> _polyData);
+
+    /*!
+     * @brief Update a vtkPolyData with ::fwData::Mesh::sptr points
+     *
+     * @param[out] polyDataDst vtkPolyData
+     * @param[in]  meshSrc ::fwData::Mesh::sptr
+     * @return vtkPolyData
+     *
+     * Warning : be carefull with updatePoints : this may change the number of
+     * vertex of the polydata, cells will not be updated.
+     * Returns the updated vtkPolyPata
+     */
+    VTKIO_API static vtkSmartPointer<vtkPolyData>  updatePolyDataPoints(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc );
+
+    /*!
+     * @brief Update a vtkPolyData with point color of fwData::Mesh
+     *
+     * @param[out] polyDataDst vtkPolyData
+     * @param[in]  meshSrc ::fwData::Mesh::sptr
+     * @return vtkPolyData
+     *
+     * Returns the updated vtkPolyPata
+     */
+    VTKIO_API static vtkSmartPointer<vtkPolyData> updatePolyDataPointColor(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc);
+
+    /*!
+     * @brief Update a vtkPolyData with cell color of fwData::Mesh
+     *
+     * @param[out] polyDataDst vtkPolyData
+     * @param[in]  meshSrc ::fwData::Mesh::sptr
+     * @return vtkPolyData
+     *
+     * Returns the updated vtkPolyPata
+     */
+    VTKIO_API static vtkSmartPointer<vtkPolyData> updatePolyDataCellColor(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc );
+
+    /*!
+     * @brief Update a vtkPolyData with point normals of fwData::Mesh
+     *
+     * @param[out] polyDataDst vtkPolyData
+     * @param[in]  meshSrc ::fwData::Mesh::sptr
+     * @return vtkPolyData
+     *
+     * Returns the updated vtkPolyPata
+     */
+    VTKIO_API static vtkSmartPointer<vtkPolyData> updatePolyDataPointNormals(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc);
+
+    /*!
+     * @brief Update a vtkPolyData with cell normals of fwData::Mesh
+     *
+     * @param[out] polyDataDst vtkPolyData
+     * @param[in]  meshSrc ::fwData::Mesh::sptr
+     * @return vtkPolyData
+     *
+     * Returns the updated vtkPolyPata
+     */
+    VTKIO_API static vtkSmartPointer<vtkPolyData> updatePolyDataCellNormals(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc);
+
+
+    /*!
+     * @brief Compute the volume of the mesh using MassProperties vtk class
+     * @param[in] mesh current mesh
+     * @return volume of the mesh
+     */
+    VTKIO_API static double computeVolume( ::fwData::Mesh::sptr mesh );
+};
+
+} // namespace helper
+} // namespace fwVtkIO
+
+#endif // _VTKIO_HELPER_MESH_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hpp
new file mode 100644
index 0000000..fc1e4c3
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_PROGESSVTKTOFW_HPP_
+#define _VTKIO_PROGESSVTKTOFW_HPP_
+
+#include <vtkCommand.h>
+#include <vtkProcessObject.h>
+
+#include <fwTools/ProgressAdviser.hpp>
+
+namespace fwVtkIO
+{
+
+//------------------------------------------------------------------------------
+
+class ProgressorBase
+{
+public:
+    typedef SPTR(ProgressorBase) sptr;
+};
+
+//------------------------------------------------------------------------------
+
+template< typename OBSERVEE >
+class ProgressVtkToFw : public ProgressorBase
+{
+public:
+    ProgressVtkToFw(OBSERVEE observee, SPTR(::fwTools::ProgressAdviser) observer, std::string msg);
+
+    virtual ~ProgressVtkToFw();
+
+protected :
+
+    OBSERVEE m_observee;
+    // observertag used by vtk
+    unsigned long m_obsTag;
+    bool m_initialized;
+};
+
+//------------------------------------------------------------------------------
+
+class Progressor
+{
+public:
+    typedef SPTR(Progressor) sptr;
+
+    template<typename OBS >
+    Progressor(OBS filter, SPTR(::fwTools::ProgressAdviser) observer, std::string message)
+    {
+        typedef ProgressVtkToFw< OBS > ProgressType;
+        m_progressor = ProgressorBase::sptr(
+                new ProgressType( filter, observer, message )
+                );
+    }
+
+    ProgressorBase::sptr m_progressor;
+};
+
+}
+
+
+#include "fwVtkIO/helper/ProgressVtkToFw.hxx"
+
+#endif /* _VTKIO_PROGESSVTKTOFW_HPP_ */
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hxx b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hxx
new file mode 100644
index 0000000..4badda5
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/ProgressVtkToFw.hxx
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <limits>
+#include <sstream>
+
+#include <vtkSmartPointer.h>
+#include <vtkEvent.h>
+#include <vtkCommand.h>
+#include <vtkObjectFactory.h>
+
+#include <fwCore/base.hpp>
+
+namespace fwVtkIO
+{
+
+class LocalCommand : public vtkCommand
+{
+public:
+
+    LocalCommand() {};
+
+    static LocalCommand* New()
+    {
+        return new LocalCommand();
+    }
+
+    typedef LocalCommand Self;
+    typedef vtkSmartPointer<Self>      Pointer;
+
+    void Execute(vtkObject *caller, unsigned long eventId, void *callData)
+    {
+        vtkAlgorithm* algo = vtkAlgorithm::SafeDownCast(caller);
+        if( !algo ) return;
+        double percent = algo->GetProgress();
+        SLM_ASSERT("m_adviser no set", m_adviser);
+        m_adviser->notifyProgress( percent , m_msg );
+    }
+
+    std::string m_msg;
+    SPTR(::fwTools::ProgressAdviser) m_adviser;
+};
+
+//------------------------------------------------------------------------------
+
+template<typename OBSERVEE >
+ProgressVtkToFw<OBSERVEE >::ProgressVtkToFw(OBSERVEE observee, SPTR(::fwTools::ProgressAdviser) observer, std::string msg)
+: m_observee( observee), m_obsTag(std::numeric_limits<unsigned long>::max()), m_initialized(false)
+{
+    typename LocalCommand::Pointer vtkCallBack;
+    vtkCallBack = LocalCommand::Pointer::New();
+    vtkCallBack->m_msg = msg;
+    vtkCallBack->m_adviser = observer;
+    m_obsTag = m_observee->AddObserver(vtkCommand::ProgressEvent, vtkCallBack );
+    m_initialized = true;
+}
+
+//------------------------------------------------------------------------------
+
+template<typename OBSERVEE >
+ProgressVtkToFw<OBSERVEE >::~ProgressVtkToFw()
+{
+    if( m_initialized)
+    {
+        m_observee->RemoveObserver (m_obsTag);
+    }
+}
+
+}
+
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/TransferFunction.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/TransferFunction.hpp
new file mode 100644
index 0000000..3e0f511
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/helper/TransferFunction.hpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_HELPER_TRANSFERFUNCTION_HPP_
+#define _VTKIO_HELPER_TRANSFERFUNCTION_HPP_
+
+#include <vtkSmartPointer.h>
+#include <vtkLogLookupTable.h>
+
+#include <fwData/TransferFunction.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+namespace fwVtkIO
+{
+
+namespace helper
+{
+
+/**
+ * @brief   Helper to manage vtk data from ::fwData::TransferFunction.
+ * @class   TransferFunction
+ * 
+ * @date    2012.
+ *
+ */
+class VTKIO_CLASS_API TransferFunction
+{
+
+public :
+
+    /*!
+     * @brief Convert a ::fwData::TransferFunction to a vtkLookupTable.
+     *
+     * @param[in] tf ::fwData::TransferFunction
+     * @param[in] allowTransparency Enable conversion of ::fwData::TransferFunction alpha channel
+     * @param[in] size lookup table size
+     * @param[out] lt vtkLookupTable
+     */
+    VTKIO_API static void toVtkLookupTable(
+            ::fwData::TransferFunction::sptr tf,
+             vtkSmartPointer<vtkLookupTable>  lt,
+            bool allowTransparency = false,
+            unsigned int size = 256 );
+
+    /*!
+     * @brief Convert the range of an Image or a TransferFunction to a black and white vtkLookupTable.
+     *
+     * @param[in] rangeMin
+     * @param[in] rangeMax
+     * @param[in] size lookup table size
+     * @param[out] lt vtkLookupTable
+     *
+     */
+    VTKIO_API static void toBWVtkLookupTable(   double rangeMin, double rangeMax,
+                                                vtkSmartPointer<vtkLookupTable> lt,
+                                                unsigned int size = 256 );
+
+  };
+
+} // namespace helper
+} // namespace fwVtkIO
+
+#endif // _VTKIO_HELPER_TRANSFERFUNCTION_HPP_
diff --git a/SrcLib/io/fwVtkIO/include/fwVtkIO/vtk.hpp b/SrcLib/io/fwVtkIO/include/fwVtkIO/vtk.hpp
new file mode 100644
index 0000000..2c7cdbc
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/include/fwVtkIO/vtk.hpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _VTKIO_VTK_HPP_
+#define _VTKIO_VTK_HPP_
+
+#include <boost/shared_ptr.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/TriangularMesh.hpp>
+#include <fwData/TransformationMatrix3D.hpp>
+
+#include "fwVtkIO/config.hpp"
+
+
+// forward declaration
+class vtkPolyData;
+class vtkImageData;
+class vtkImageImport;
+class vtkMatrix4x4;
+class vtkLookupTable;
+
+/**
+ * @brief   Namespace fwVtkIO.
+ * @namespace   fwVtkIO
+ * 
+ * @date    2009.
+ *
+ *  The namespace fwVtkIO contains reader, writer and helper using the VTK lib for output and input actions between data and the frameWork
+ */
+namespace fwVtkIO
+{
+
+struct TypeTranslator
+{
+
+    typedef std::map< ::fwTools::Type, int> fwToolsToVtkMap;
+    typedef std::map< int, ::fwTools::Type> VtkTofwToolsMap;
+
+    static fwToolsToVtkMap::mapped_type translate( const fwToolsToVtkMap::key_type &key );
+
+    static VtkTofwToolsMap::mapped_type translate( const VtkTofwToolsMap::key_type &key );
+
+    static const fwToolsToVtkMap s_toVtk;
+    static const VtkTofwToolsMap s_fromVtk;
+};
+
+/*!
+ * @brief Convert ::fwData::Image PixelType to the VTK data type of pixels.
+ *
+ * @param[in] image ::fwData::Image::sptr.
+ * @return int : VTK data scalar type
+ *
+ */
+VTKIO_API int getVtkScalarType(::fwData::Image::sptr image);
+
+/**
+ * @brief Allocate a new vtkImageData* from a ::fwData::Image::sptr.
+ *
+ * @param[in] _data ::fwData::Image::sptr.
+ * @param[out] dst the vtk image to fill if provided
+ *
+ * if dst is provided the new image will be imported into the dst image else
+ * allocate a new vtkImage from a ::fwData::Image, vtkImage doesn't manage its buffer (the buffer is not copied)
+ *
+ */
+VTKIO_API void toVTKImage( ::fwData::Image::sptr _data ,  vtkImageData *dst);
+
+/*!
+ * @brief Convert a vtkImageData* to a ::fwData::Image::sptr.
+ *
+ * @param[in] _source vtkImageData*.
+ * @param[out] _destination ::fwData::Image::sptr.
+ *
+ * Throw an exception if the conversion fails
+ */
+VTKIO_API void fromVTKImage( vtkImageData* _source, ::fwData::Image::sptr _destination );
+
+/*!
+ * @brief Configure a vtkImageImport* from a ::fwData::Image::sptr.
+ *
+ * @param[in] _pDataImage ::fwData::Image::sptr.
+ * @param[out] _pImageImport vtkImageImport*.
+ */
+VTKIO_API void configureVTKImageImport( ::vtkImageImport * _pImageImport, ::fwData::Image::sptr _pDataImage );
+
+/*!
+ * @brief Convert a ::fwData::TriangularMesh::sptr to a vtkPolyData*.
+ *
+ * @param[in] _mesh ::fwData::TriangularMesh::sptr.
+ * @return vtkPolyData*.
+ */
+VTKIO_API vtkPolyData*  toVTKMesh( ::fwData::TriangularMesh::sptr _mesh );
+
+/*!
+ * @brief Update a vtkPolyData* with ::fwData::TriangularMesh::sptr points
+ *
+ * @param[out] polyDataDst vtkPolyData*
+ * @param[in]  meshSrc ::fwData::TriangularMesh::sptr
+ * @return vtkPolyData*
+ *
+ * Warning : be carefull with updatePoints : this may change the number of
+ * vertex of the polydata, cells will not be updated.
+ * Returns the updated vtkPolyPata
+ */
+VTKIO_API vtkPolyData*  updatePolyDataPoints(vtkPolyData* polyDataDst, ::fwData::TriangularMesh::sptr meshSrc );
+
+/*!
+ * @brief Convert a vtkPolyData* to a ::fwData::TriangularMesh::sptr.
+ *
+ * @param[in] _polyData vtkPolyData*.
+ * @param[out] _triangularMesh ::fwData::TriangularMesh::sptr.
+ * @return bool.
+ *
+ * Returns \b true if the conversion is a success and \b false if it fails
+ */
+VTKIO_API  bool fromVTKMesh( vtkPolyData *_polyData, ::fwData::TriangularMesh::sptr _triangularMesh );
+
+
+/*
+ * @brief compute the volume of the mesh using MassProperties vtk class
+ */
+VTKIO_API  double computeVolume(  ::fwData::TriangularMesh::sptr _triangularMesh );
+
+/*
+* @brief compute the volume of the mesh using ImageStencil
+*/
+VTKIO_API  double computeVolumeWithStencil(  ::fwData::TriangularMesh::sptr _triangularMesh );
+
+/*!
+ * @brief Convert a ::fwData::TransformationMatrix3D::sptr to a vtkMatrix4x4*.
+ *
+ * @param[in] _transfoMatrix ::fwData::TransformationMatrix3D::sptr.
+ * @return vtkPolyData*.
+ */
+VTKIO_API vtkMatrix4x4 *  toVTKMatrix(  ::fwData::TransformationMatrix3D::sptr _transfoMatrix );
+
+/*!
+ * @brief Convert a vtkMatrix4x4* to a ::fwData::TransformationMatrix3D::sptr.
+ *
+ * @param[in] _matrix vtkMatrix4x4*.
+ * @param[out] _transfoMatrix ::fwData::TransformationMatrix3D::sptr.
+ * @return bool.
+ *
+ * Returns \b true if the conversion is a success and \b false if it fails
+ */
+VTKIO_API  bool fromVTKMatrix( vtkMatrix4x4* _matrix,  ::fwData::TransformationMatrix3D::sptr _transfoMatrix);
+
+}
+
+#endif // _VTKIO_VTK_HPP_
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageReader.cpp
new file mode 100644
index 0000000..22e963a
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageReader.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkGenericDataObjectReader.h>
+#include <vtkImageData.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/ImageReader.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::ImageReader );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+ImageReader::ImageReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+ImageReader::~ImageReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectReader > reader = vtkSmartPointer< vtkGenericDataObjectReader >::New();
+    reader->SetFileName(this->getFile().string().c_str());
+
+    //add progress observation
+    Progressor progress(reader, this->getSptr(), this->getFile().string());
+
+    reader->Update();
+
+    vtkDataObject *obj = reader->GetOutput();
+    vtkImageData* img = vtkImageData::SafeDownCast(obj);
+
+    FW_RAISE_IF("ImageReader cannot read VTK image file :"<<this->getFile().string(), !img);
+    try
+    {
+        ::fwVtkIO::fromVTKImage( img, pImage);
+    }
+    catch( std::exception &e)
+    {
+        FW_RAISE("VTKImage to fwData::Image failed "<<e.what());
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+std::string  ImageReader::extension()
+{
+   return ".vtk";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageWriter.cpp
new file mode 100644
index 0000000..7aad130
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/ImageWriter.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkImageData.h>
+#include <vtkGenericDataObjectWriter.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/ImageWriter.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::ImageWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+ImageWriter::ImageWriter(::fwDataIO::writer::IObjectWriter::Key key) :
+        ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+ImageWriter::~ImageWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void ImageWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectWriter > writer = vtkSmartPointer< vtkGenericDataObjectWriter >::New();
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( pImage, vtkImage );
+    writer->SetInput( vtkImage );
+    writer->SetFileName(this->getFile().string().c_str());
+    writer->SetFileTypeToBinary();
+
+    //add progress observation
+    Progressor progress(writer, this->getSptr(), this->getFile().string());
+
+    writer->Write();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  ImageWriter::extension()
+{
+   return ".vtk";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshReader.cpp
new file mode 100644
index 0000000..5a0b8a9
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshReader.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkGenericDataObjectReader.h>
+#include <vtkPolyData.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/helper/Mesh.hpp"
+#include "fwVtkIO/MeshReader.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::MeshReader );
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+MeshReader::MeshReader(::fwDataIO::reader::IObjectReader::Key key) :
+                ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+MeshReader::~MeshReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Mesh::sptr pMesh = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectReader > reader = vtkSmartPointer< vtkGenericDataObjectReader >::New();
+    reader->SetFileName(this->getFile().string().c_str());
+
+    //add progress observation
+    Progressor progress(reader, this->getSptr(), this->getFile().string());
+
+    reader->Update();
+
+    vtkDataObject *obj = reader->GetOutput();
+    vtkPolyData* mesh = vtkPolyData::SafeDownCast(obj);
+    FW_RAISE_IF("MeshReader cannot read VTK Mesh file : "<< this->getFile().string(), !mesh);
+    ::fwVtkIO::helper::Mesh::fromVTKMesh(mesh, pMesh);
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MeshReader::extension()
+{
+   return ".vtk";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshWriter.cpp
new file mode 100644
index 0000000..62c756c
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/MeshWriter.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkPolyData.h>
+#include <vtkGenericDataObjectWriter.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwVtkIO/helper/Mesh.hpp"
+#include "fwVtkIO/MeshWriter.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::MeshWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+MeshWriter::MeshWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+MeshWriter::~MeshWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MeshWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Mesh::sptr pMesh = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectWriter > writer = vtkSmartPointer< vtkGenericDataObjectWriter >::New();
+    vtkSmartPointer< vtkPolyData > vtkMesh = vtkSmartPointer< vtkPolyData >::New();
+    ::fwVtkIO::helper::Mesh::toVTKMesh( pMesh, vtkMesh);
+    writer->SetInput( vtkMesh );
+    writer->SetFileName(this->getFile().string().c_str());
+    writer->SetFileTypeToBinary();
+
+    //add progress observation
+    Progressor progress(writer, this->getSptr(), this->getFile().string());
+    writer->Update();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MeshWriter::extension()
+{
+   return ".vtk";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageReader.cpp
new file mode 100644
index 0000000..d1b7731
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageReader.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkSmartPointer.h>
+#include <vtkMetaImageReader.h>
+#include <vtkImageData.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/MetaImageReader.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::MetaImageReader );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+MetaImageReader::MetaImageReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+MetaImageReader::~MetaImageReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MetaImageReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = this->getConcreteObject();
+
+    vtkSmartPointer< vtkMetaImageReader > reader = vtkSmartPointer< vtkMetaImageReader >::New();
+    reader->SetFileName(this->getFile().string().c_str());
+
+    Progressor progress(reader, this->getSptr(), this->getFile().string());
+
+    reader->Update();
+
+    vtkDataObject *obj = reader->GetOutput();
+    vtkImageData* img = vtkImageData::SafeDownCast(obj);
+    FW_RAISE_IF("MetaImageReader cannot read mhd image file :"<<this->getFile().string(), !img);
+    try
+    {
+        ::fwVtkIO::fromVTKImage( img, pImage);
+    }
+    catch( std::exception &e)
+    {
+        FW_RAISE("MetaImage to fwData::Image failed : "<<e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MetaImageReader::extension()
+{
+   return ".mhd";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageWriter.cpp
new file mode 100644
index 0000000..0215a94
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/MetaImageWriter.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkSmartPointer.h>
+#include <vtkImageData.h>
+#include <vtkMetaImageWriter.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/MetaImageWriter.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::MetaImageWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+MetaImageWriter::MetaImageWriter(::fwDataIO::writer::IObjectWriter::Key key) :
+        ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+MetaImageWriter::~MetaImageWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void MetaImageWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = getConcreteObject();
+
+    vtkSmartPointer< vtkMetaImageWriter > writer = vtkSmartPointer< vtkMetaImageWriter >::New();
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( pImage, vtkImage );
+    writer->SetInput( vtkImage );
+    writer->SetFileName( this->getFile().string().c_str() );
+    writer->SetCompression(true);
+
+    Progressor progress(writer, this->getSptr(), this->getFile().string());
+
+    writer->Write();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  MetaImageWriter::extension()
+{
+   return ".mhd";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/ModelSeriesObjWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/ModelSeriesObjWriter.cpp
new file mode 100644
index 0000000..0701edf
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/ModelSeriesObjWriter.cpp
@@ -0,0 +1,121 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <vtkActor.h>
+#include <vtkPolyData.h>
+#include <vtkProperty.h>
+#include <vtkOBJExporter.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderer.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Material.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include "fwVtkIO/helper/Mesh.hpp"
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/ModelSeriesObjWriter.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::ModelSeriesObjWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+ModelSeriesObjWriter::ModelSeriesObjWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+ModelSeriesObjWriter::~ModelSeriesObjWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer< vtkActor > createActor( const ::fwData::Reconstruction::sptr & pReconstruction )
+{
+    vtkSmartPointer< vtkActor >  actor = vtkSmartPointer< vtkActor >::New();
+
+    ::fwData::Mesh::sptr mesh = pReconstruction->getMesh();
+    ::fwData::Material::sptr material = pReconstruction->getMaterial();
+
+    vtkSmartPointer< vtkPolyData > polyData = vtkSmartPointer< vtkPolyData >::New();
+    ::fwVtkIO::helper::Mesh::toVTKMesh( mesh, polyData);
+    vtkSmartPointer<vtkPolyDataMapper> mapper  = vtkSmartPointer<vtkPolyDataMapper>::New();
+    mapper->SetInput(polyData);
+    actor->SetMapper(mapper);
+
+    ::fwData::Color::sptr color = material->ambient();
+    vtkProperty *property = actor->GetProperty();
+    property->SetColor( color->red(), color->green(), color->blue());
+    property->SetSpecularColor(1.,1.,1.);
+    property->SetSpecularPower(100.); //Shininess
+    property->SetAmbient(.05);
+    property->SetDiffuse(1.);
+    property->SetSpecular(1.);
+    property->SetInterpolationToPhong();
+    property->SetOpacity( color->alpha() );
+
+    return actor;
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeriesObjWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::boost::filesystem::path prefix =  this->getFolder();
+
+    ::fwMedData::ModelSeries::sptr modelSeries = getConcreteObject();
+
+    BOOST_FOREACH( ::fwData::Reconstruction::sptr rec, modelSeries->getReconstructionDB() )
+    {
+        vtkSmartPointer< vtkRenderer > renderer = vtkSmartPointer< vtkRenderer >::New();
+        vtkSmartPointer< vtkActor >  actor = createActor(rec);
+        renderer->AddActor(actor);
+
+        vtkSmartPointer< vtkRenderWindow > renderWindow = vtkSmartPointer< vtkRenderWindow >::New();
+        renderWindow->AddRenderer(renderer);
+
+        std::string filename = (prefix / (rec->getOrganName() + "_" + ::fwTools::UUID::get(rec))).string();
+
+        vtkSmartPointer< vtkOBJExporter > exporter = vtkSmartPointer< vtkOBJExporter >::New();
+        exporter->SetRenderWindow(renderWindow);
+        exporter->SetFilePrefix(filename.c_str());
+        exporter->Write();
+
+        // can not observe progression, not a vtkAlgorithm ...
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string ModelSeriesObjWriter::extension()
+{
+    return ".obj";
+}
+
+} // namespace fwVtkIO
+
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/SeriesDBReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/SeriesDBReader.cpp
new file mode 100644
index 0000000..a0a756d
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/SeriesDBReader.cpp
@@ -0,0 +1,414 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <numeric>
+#include <algorithm>
+#include <iosfwd>
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/iostreams/categories.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/foreach.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/algorithm/string/join.hpp>
+
+#include <vtkGenericDataObjectReader.h>
+#include <vtkImageData.h>
+#include <vtkInformation.h>
+#include <vtkMetaImageReader.h>
+#include <vtkPolyData.h>
+#include <vtkSmartPointer.h>
+#include <vtkStreamingDemandDrivenPipeline.h>
+#include <vtkStructuredPoints.h>
+#include <vtkStructuredPointsReader.h>
+#include <vtkXMLGenericDataObjectReader.h>
+#include <vtkXMLImageDataReader.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+
+#include <fwTools/UUID.hpp>
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwMemory/stream/in/IFactory.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/helper/Mesh.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+#include "fwVtkIO/SeriesDBReader.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::SeriesDBReader );
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+void  initSeries(::fwMedData::Series::sptr series, const std::string& instanceUID)
+{
+    const std::string unknown = "unknown";
+    series->setModality("OT");
+    ::boost::posix_time::ptime now = ::boost::posix_time::second_clock::local_time();
+    const std::string date = ::fwTools::getDate(now);
+    const std::string time = ::fwTools::getTime(now);
+    series->setDate(date);
+    series->setTime(time);
+    //series->setDescription(??);
+    //series->setPerformingPhysiciansName(??);
+
+    series->getEquipment()->setInstitutionName(unknown);
+
+    series->getPatient()->setName(unknown);
+    series->getPatient()->setPatientId(unknown);
+    series->getPatient()->setBirthdate(unknown);
+    series->getPatient()->setSex(unknown);
+
+    series->getStudy()->setInstanceUID(instanceUID);
+    series->getStudy()->setDate(date);
+    series->getStudy()->setTime(time);
+    series->getStudy()->setReferringPhysicianName(unknown);
+    series->getStudy()->setDescription(unknown);
+    series->getStudy()->setPatientAge(unknown);
+}
+
+//------------------------------------------------------------------------------
+
+
+SeriesDBReader::SeriesDBReader(::fwDataIO::reader::IObjectReader::Key key) :
+    ::fwData::location::enableMultiFiles< ::fwDataIO::reader::IObjectReader >(this),
+    m_lazyMode(true)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+SeriesDBReader::~SeriesDBReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+    template <typename T, typename FILE>
+vtkSmartPointer< vtkDataObject  > getObj(FILE &file, SeriesDBReader *progressor)
+{
+    vtkSmartPointer< T > reader = vtkSmartPointer< T >::New();
+    reader->SetFileName(file.string().c_str());
+    if(progressor)
+    {
+        Progressor progress(reader, progressor->getSptr(), file.string());
+    }
+    reader->Update();
+    return reader->GetOutput();
+}
+
+//------------------------------------------------------------------------------
+
+
+::fwData::Object::sptr getDataObject(const vtkSmartPointer< vtkDataObject  > &obj, const boost::filesystem::path &file)
+{
+    vtkSmartPointer< vtkPolyData  > mesh = vtkPolyData::SafeDownCast(obj);
+    vtkSmartPointer< vtkImageData  > img = vtkImageData::SafeDownCast(obj);
+    ::fwData::Object::sptr dataObj;
+    if(mesh)
+    {
+        ::fwData::Mesh::sptr meshObj = ::fwData::Mesh::New();
+        ::fwVtkIO::helper::Mesh::fromVTKMesh(mesh, meshObj);
+        ::fwData::Reconstruction::sptr rec = ::fwData::Reconstruction::New();
+        rec->setMesh(meshObj);
+        rec->setOrganName(file.stem().string());
+        rec->setIsVisible(true);
+        dataObj = rec;
+    }
+    else if(img)
+    {
+        try
+        {
+            ::fwData::Image::sptr imgObj = ::fwData::Image::New();
+            ::fwVtkIO::fromVTKImage( img, imgObj);
+            dataObj = imgObj;
+        }
+        catch( std::exception &e)
+        {
+            FW_RAISE("VTKImage to fwData::Image failed "<<e.what());
+        }
+    }
+    return dataObj;
+}
+//------------------------------------------------------------------------------
+
+struct FilteringStream : ::boost::iostreams::filtering_istream
+{
+
+    typedef ::boost::iostreams::stream< ::boost::iostreams::array_source > BufferStreamType;
+
+
+    FilteringStream(const ::fwData::Image::sptr &source ) :
+        m_image(source),
+        m_bufferObject(source->getDataArray()->getBufferObject()),
+        m_lock( m_bufferObject->lock() ),
+        m_bufferStream( ::boost::make_shared<BufferStreamType>(static_cast<char *>(m_lock.getBuffer()), m_bufferObject->getSize()) )
+    {
+        this->push(*m_bufferStream);
+    }
+
+    ~FilteringStream()
+    {
+        try { this->reset(); } catch (...) { }
+    }
+
+    ::fwData::Image::sptr m_image;
+    ::fwMemory::BufferObject::sptr m_bufferObject;
+    ::fwMemory::BufferObject::Lock m_lock;
+    SPTR(BufferStreamType) m_bufferStream;
+};
+
+//------------------------------------------------------------------------------
+
+template< typename READER >
+class ImageStream : public ::fwMemory::stream::in::IFactory
+{
+public:
+
+    ImageStream( const ::boost::filesystem::path& path ) :  m_path(path)
+    {}
+
+protected:
+
+    ::fwData::Image::sptr getImage()
+    {
+        if(!::boost::filesystem::exists(m_path))
+        {
+            FW_RAISE("file "<< m_path.string() << " does not exist anymore or has moved.");
+        }
+
+        vtkSmartPointer< vtkDataObject  > obj;
+        obj = getObj<READER>(m_path, NULL);
+
+        return ::fwData::Image::dynamicCast(getDataObject(obj, m_path));
+    }
+
+    SPTR(std::istream) get()
+    {
+        SPTR(FilteringStream) is
+            = ::boost::make_shared< FilteringStream>( this->getImage() );
+
+        return is;
+    }
+
+    ::boost::filesystem::path m_path;
+};
+
+//------------------------------------------------------------------------------
+
+
+bool checkIfReadDataTypeIsImage(const vtkSmartPointer< vtkMetaImageReader > &reader)
+{
+    return true;
+}
+
+bool checkIfReadDataTypeIsImage(const vtkSmartPointer< vtkGenericDataObjectReader > &reader)
+{
+    return reader->IsFileStructuredPoints();
+}
+
+bool checkIfReadDataTypeIsImage(const vtkSmartPointer< vtkXMLGenericDataObjectReader > &reader)
+{
+    return (reader->GetImageDataOutput () != 0);
+}
+
+void updateImageFromVtkInfo(const vtkSmartPointer< vtkInformation > &info, const ::fwData::Image::sptr &imgObj)
+{
+    int extent[6];
+    info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
+    ::fwData::Image::SizeType size(3,0);
+    size[0] = extent[1]-extent[0]+1;
+    size[1] = extent[3]-extent[2]+1;
+    size[2] = extent[5]-extent[4]+1;
+    imgObj->setSize(size);
+
+    ::fwData::Image::SpacingType spacing(3, 0);
+    info->Get(vtkDataObject::SPACING(), &spacing[0]);
+    imgObj->setSpacing(spacing);
+
+    ::fwData::Image::OriginType origin(3, 0);
+    info->Get(vtkDataObject::ORIGIN(), &origin[0]);
+    imgObj->setOrigin(origin);
+}
+
+void getInfo(const vtkSmartPointer< vtkGenericDataObjectReader > &reader, const ::fwData::Image::sptr &imgObj)
+{
+    vtkSmartPointer< vtkImageData  > vtkImage = vtkImageData::SafeDownCast(reader->GetOutput());
+    imgObj->setType( ::fwVtkIO::TypeTranslator::translate( vtkImage->GetScalarType() ) );
+
+    vtkSmartPointer< vtkStructuredPointsReader > imgReader =
+        vtkSmartPointer< vtkStructuredPointsReader >::New();
+    imgReader->SetFileName(reader->GetFileName());
+
+    vtkSmartPointer< vtkInformation > info = vtkSmartPointer< vtkInformation >::New();
+    imgReader->ReadMetaData(info);
+
+    updateImageFromVtkInfo(info, imgObj);
+    imgObj->getDataArray()->resize(imgObj->getType(), imgObj->getSize(), vtkImage->GetNumberOfScalarComponents(), false);
+
+    ::fwMemory::BufferObject::sptr buffObj = imgObj->getDataArray()->getBufferObject();
+    boost::filesystem::path file = reader->GetFileName();
+    buffObj->setIStreamFactory( ::boost::make_shared< ImageStream<vtkStructuredPointsReader> >(file), imgObj->getSizeInBytes());
+}
+
+
+void getInfo(const vtkSmartPointer< vtkXMLGenericDataObjectReader > &reader, const ::fwData::Image::sptr &imgObj)
+{
+    vtkSmartPointer< vtkImageData  > vtkImage = vtkImageData::SafeDownCast(reader->GetOutput());
+    imgObj->setType( ::fwVtkIO::TypeTranslator::translate( vtkImage->GetScalarType() ) );
+
+    vtkSmartPointer< vtkXMLImageDataReader > imgReader =
+        vtkSmartPointer< vtkXMLImageDataReader >::New();
+    imgReader->SetFileName(reader->GetFileName());
+
+    vtkSmartPointer< vtkInformation > info = vtkSmartPointer< vtkInformation >::New();
+    imgReader->UpdateInformation();
+    imgReader->CopyOutputInformation(info,0);
+
+    updateImageFromVtkInfo(info, imgObj);
+    imgObj->getDataArray()->resize(imgObj->getType(), imgObj->getSize(), vtkImage->GetNumberOfScalarComponents(), false);
+
+    ::fwMemory::BufferObject::sptr buffObj = imgObj->getDataArray()->getBufferObject();
+    boost::filesystem::path file = reader->GetFileName();
+    buffObj->setIStreamFactory( ::boost::make_shared< ImageStream<vtkXMLImageDataReader> >(file), imgObj->getSizeInBytes());
+
+}
+
+//------------------------------------------------------------------------------
+
+template< typename DATA_READER >
+::fwData::Image::sptr lazyRead( const ::boost::filesystem::path &file)
+{
+    vtkSmartPointer< DATA_READER > reader = vtkSmartPointer< DATA_READER >::New();
+    reader->SetFileName(file.string().c_str());
+    reader->UpdateInformation();
+
+    ::fwData::Image::sptr imgObj;
+
+    if(checkIfReadDataTypeIsImage(reader))
+    {
+        imgObj = ::fwData::Image::New();
+        getInfo(reader, imgObj);
+
+    }
+
+    return imgObj;
+}
+
+
+//------------------------------------------------------------------------------
+
+
+void SeriesDBReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getConcreteObject();
+
+    const ::fwData::location::ILocation::VectPathType files = this->getFiles();
+    const std::string instanceUID = ::fwTools::UUID::generateUUID();
+
+    ::fwMedData::ModelSeries::ReconstructionVectorType recs;
+    std::vector< std::string > errorFiles;
+    BOOST_FOREACH(const ::fwData::location::ILocation::VectPathType::value_type& file, files)
+    {
+
+        vtkSmartPointer< vtkDataObject  > obj;
+        ::fwData::Image::sptr img;
+        ::fwData::Reconstruction::sptr rec;
+
+        if(file.extension().string() == ".vtk")
+        {
+            if(m_lazyMode)
+            {
+                img = lazyRead<vtkGenericDataObjectReader>(file);
+            }
+            if (!img)
+            {
+                obj = getObj<vtkGenericDataObjectReader>(file, this);
+            }
+        }
+        else if(file.extension().string() == ".vti")
+        {
+            if(m_lazyMode)
+            {
+                img = lazyRead<vtkXMLGenericDataObjectReader>(file);
+            }
+            if (!img)
+            {
+                obj = getObj<vtkXMLGenericDataObjectReader>(file, this);
+            }
+        }
+        else if(file.extension().string() == ".mhd")
+        {
+            obj = getObj<vtkMetaImageReader>(file, this);
+        }
+
+        if (!img)
+        {
+            ::fwData::Object::sptr dataObj = getDataObject(obj, file);
+            img = ::fwData::Image::dynamicCast(dataObj);
+            rec = ::fwData::Reconstruction::dynamicCast(dataObj);
+        }
+        if(img)
+        {
+            ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::New();
+            initSeries(imgSeries, instanceUID);
+            imgSeries->setImage(img);
+            seriesDB->getContainer().push_back(imgSeries);
+        }
+        else if (rec)
+        {
+            recs.push_back(rec);
+        }
+        else
+        {
+            errorFiles.push_back(file.string());
+        }
+    }
+
+    if (!errorFiles.empty())
+    {
+        FW_RAISE("SeriesDBReader cannot read VTK file(s) : "<< ::boost::algorithm::join(errorFiles, ", ") );
+    }
+
+    // Adds loaded Reconstructions in SeriesDB
+    if(!recs.empty())
+    {
+        ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::New();
+        initSeries(modelSeries, instanceUID);
+        modelSeries->setReconstructionDB(recs);
+        seriesDB->getContainer().push_back(modelSeries);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  SeriesDBReader::extension()
+{
+    return ".vtk";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshReader.cpp
new file mode 100644
index 0000000..e3a62dd
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshReader.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkGenericDataObjectReader.h>
+#include <vtkPolyData.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/TriangularMeshReader.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::TriangularMeshReader );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+TriangularMeshReader::TriangularMeshReader(::fwDataIO::reader::IObjectReader::Key key) :
+                ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+TriangularMeshReader::~TriangularMeshReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::TriangularMesh::sptr pTriangularMesh = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectReader > reader = vtkSmartPointer< vtkGenericDataObjectReader >::New();
+    reader->SetFileName(this->getFile().string().c_str());
+
+    //add progress observation
+    Progressor progress(reader, this->getSptr(), this->getFile().string());
+
+    reader->Update();
+
+    vtkDataObject *obj = reader->GetOutput();
+    vtkPolyData* mesh = vtkPolyData::SafeDownCast(obj);
+    if(mesh)
+    {
+        ::fwVtkIO::fromVTKMesh(mesh, pTriangularMesh);
+    }
+    else
+    {
+        std::string errMsg;
+        errMsg  = "TriangularMeshReader cannot read VTK Mesh file : ";
+        errMsg.append( this->getFile().string() );
+        throw( errMsg );
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TriangularMeshReader::extension()
+{
+   return ".trian";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshWriter.cpp
new file mode 100644
index 0000000..aa9a370
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/TriangularMeshWriter.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkPolyData.h>
+#include <vtkGenericDataObjectWriter.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/TriangularMeshWriter.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::TriangularMeshWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+TriangularMeshWriter::TriangularMeshWriter(::fwDataIO::writer::IObjectWriter::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+TriangularMeshWriter::~TriangularMeshWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void TriangularMeshWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::TriangularMesh::sptr pTriangularMesh = getConcreteObject();
+
+    vtkSmartPointer< vtkGenericDataObjectWriter > writer = vtkSmartPointer< vtkGenericDataObjectWriter >::New();
+    vtkPolyData* vtkMesh = ::fwVtkIO::toVTKMesh( pTriangularMesh );
+    writer->SetInput( vtkMesh );
+    writer->SetFileName(this->getFile().string().c_str());
+    writer->SetFileTypeToBinary();
+
+    //add progress observation
+    Progressor progress(writer, this->getSptr(), this->getFile().string());
+
+    writer->Write();
+    vtkMesh->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  TriangularMeshWriter::extension()
+{
+   return ".trian";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageReader.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageReader.cpp
new file mode 100644
index 0000000..575d37f
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageReader.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkSmartPointer.h>
+#include <vtkXMLImageDataReader.h>
+#include <vtkImageData.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/VtiImageReader.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOReaderRegisterMacro( ::fwVtkIO::VtiImageReader );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+VtiImageReader::VtiImageReader(::fwDataIO::reader::IObjectReader::Key key)
+: ::fwData::location::enableSingleFile< ::fwDataIO::reader::IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+VtiImageReader::~VtiImageReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void VtiImageReader::read()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = getConcreteObject();
+
+    vtkSmartPointer< vtkXMLImageDataReader > reader = vtkSmartPointer< vtkXMLImageDataReader >::New();
+    reader->SetFileName(this->getFile().string().c_str());
+
+    Progressor progress(reader, this->getSptr(), this->getFile().string());
+
+    reader->Update();
+
+    vtkDataObject *obj = reader->GetOutput();
+    vtkImageData* img = vtkImageData::SafeDownCast(obj);
+    FW_RAISE_IF("VtiImageReader cannot read Vti image file :"<<this->getFile().string(), !img);
+    try
+    {
+        ::fwVtkIO::fromVTKImage( img, pImage);
+    }
+    catch( std::exception &e)
+    {
+        FW_RAISE("VTIImage to fwData::Image failed "<<e.what());
+    }
+}
+
+//------------------------------------------------------------------------------
+
+std::string  VtiImageReader::extension()
+{
+   return ".vti";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageWriter.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageWriter.cpp
new file mode 100644
index 0000000..15d340b
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/VtiImageWriter.cpp
@@ -0,0 +1,73 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkImageData.h>
+#include <vtkXMLImageDataWriter.h>
+#include <vtkZLibDataCompressor.h>
+#include <vtkSmartPointer.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+#include "fwVtkIO/VtiImageWriter.hpp"
+#include "fwVtkIO/helper/ProgressVtkToFw.hpp"
+
+fwDataIOWriterRegisterMacro( ::fwVtkIO::VtiImageWriter );
+
+
+namespace fwVtkIO
+{
+//------------------------------------------------------------------------------
+
+VtiImageWriter::VtiImageWriter(::fwDataIO::writer::IObjectWriter::Key key) :
+        ::fwData::location::enableSingleFile< ::fwDataIO::writer::IObjectWriter >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+VtiImageWriter::~VtiImageWriter()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+void VtiImageWriter::write()
+{
+    assert( !m_object.expired() );
+    assert( m_object.lock() );
+
+    ::fwData::Image::sptr pImage = getConcreteObject();
+
+    vtkSmartPointer< vtkXMLImageDataWriter > writer = vtkSmartPointer< vtkXMLImageDataWriter >::New();
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( pImage, vtkImage );
+    writer->SetInput( vtkImage );
+    writer->SetFileName( this->getFile().string().c_str() );
+    writer->SetDataModeToAppended();
+
+    vtkSmartPointer< vtkZLibDataCompressor > compressor  = vtkSmartPointer< vtkZLibDataCompressor >::New();
+    compressor->SetCompressionLevel(1);
+    writer->SetCompressor( compressor );
+    writer->EncodeAppendedDataOff();
+
+    Progressor progress(writer, this->getSptr(), this->getFile().string());
+
+    writer->Write();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  VtiImageWriter::extension()
+{
+   return ".vti";
+}
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/Mesh.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/Mesh.cpp
new file mode 100644
index 0000000..fe9a1f7
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/Mesh.cpp
@@ -0,0 +1,473 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkPoints.h>
+#include <vtkDataArray.h>
+#include <vtkPointData.h>
+#include <vtkCellData.h>
+#include <vtkCell.h>
+#include <vtkFloatArray.h>
+#include <vtkSmartPointer.h>
+
+#include <vtkMassProperties.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkFillHolesFilter.h>
+
+#include <fwData/Array.hpp>
+#include <fwComEd/helper/Mesh.hpp>
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwVtkIO/helper/Mesh.hpp"
+
+namespace fwVtkIO
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+void Mesh::fromVTKMesh(  vtkSmartPointer<vtkPolyData> polyData, ::fwData::Mesh::sptr mesh )
+{
+    vtkPoints *points = polyData->GetPoints();
+    if (points)
+    {
+        mesh->clear();
+        vtkIdType numberOfPoints = points->GetNumberOfPoints();
+        vtkIdType numberOfCells = polyData->GetNumberOfCells();
+
+        mesh->allocate(numberOfPoints, numberOfCells, numberOfCells*3);
+        ::fwComEd::helper::Mesh meshHelper(mesh);
+
+        double* point;
+        ::fwData::Mesh::Id idx;
+        for (vtkIdType i = 0; i < numberOfPoints; ++i)
+        {
+            point = points->GetPoint(i);
+            idx = meshHelper.insertNextPoint(point[0], point[1], point[2]);
+            SLM_ASSERT("Mesh index not correspond to VTK index point", idx == i);
+        }
+
+        vtkCell* cell;
+        vtkIdList* idList;
+        int cellType;
+        for (vtkIdType i = 0 ; i < numberOfCells ; ++i)
+        {
+            cell = polyData->GetCell(i);
+            idList = cell->GetPointIds();
+            cellType = cell->GetCellType();
+
+            switch (cellType)
+            {
+            case VTK_LINE :
+                SLM_ASSERT("Wrong number of ids: "<<idList->GetNumberOfIds(), idList->GetNumberOfIds()==2);
+                meshHelper.insertNextCell( idList->GetId(0), idList->GetId(1));
+                break;
+            case VTK_TRIANGLE :
+                SLM_ASSERT("Wrong number of ids: "<<idList->GetNumberOfIds(), idList->GetNumberOfIds()==3);
+                meshHelper.insertNextCell( idList->GetId(0), idList->GetId(1), idList->GetId(2));
+                break;
+            case VTK_QUAD :
+                SLM_ASSERT("Wrong number of ids: "<<idList->GetNumberOfIds(), idList->GetNumberOfIds()==4);
+                meshHelper.insertNextCell( idList->GetId(0), idList->GetId(1), idList->GetId(2), idList->GetId(3));
+                break;
+            default:
+                FW_RAISE("VTK Mesh type "<<cellType<< " not supported.");
+            }
+        }
+
+
+        if(polyData->GetPointData()->HasArray("Colors"))
+        {
+            vtkSmartPointer<vtkUnsignedCharArray> colors;
+            colors = vtkUnsignedCharArray::SafeDownCast(polyData->GetPointData()->GetArray("Colors"));
+            FW_RAISE_IF("Only vtkUnsignedCharArray is supported to manage color.", !colors);
+
+            size_t nbComponents = colors->GetNumberOfComponents();
+            SLM_ASSERT("Wrong nb of components ("<<nbComponents<<")",
+                    nbComponents == 3 || nbComponents == 4);
+            mesh->allocatePointColors((::fwData::Mesh::ColorArrayTypes)nbComponents);
+            meshHelper.updateLock();
+
+            ::fwData::Mesh::Id nbPoints = mesh->getNumberOfPoints() ;
+            for (size_t i = 0; i != nbPoints; ++i)
+            {
+                meshHelper.setPointColor(i, colors->GetPointer(i*nbComponents));
+            }
+        }
+
+        if(polyData->GetCellData()->HasArray("Colors"))
+        {
+            vtkSmartPointer<vtkUnsignedCharArray> colors;
+            colors = vtkUnsignedCharArray::SafeDownCast(polyData->GetCellData()->GetArray("Colors"));
+            FW_RAISE_IF("Only vtkUnsignedCharArray is supported to manage color.", !colors);
+
+            size_t nbComponents = colors->GetNumberOfComponents();
+            SLM_ASSERT("Wrong nb of components ("<<nbComponents<<")",
+                    nbComponents == 3 || nbComponents == 4);
+            mesh->allocateCellColors((::fwData::Mesh::ColorArrayTypes)nbComponents);
+            meshHelper.updateLock();
+
+            ::fwData::Mesh::Id nbCells = mesh->getNumberOfCells() ;
+            for (size_t i = 0; i != nbCells; ++i)
+            {
+                meshHelper.setCellColor(i, colors->GetPointer(i*nbComponents));
+            }
+        }
+
+        if(polyData->GetPointData()->GetAttribute(vtkDataSetAttributes::NORMALS))
+        {
+            vtkSmartPointer<vtkFloatArray> normals;
+            normals = vtkFloatArray::SafeDownCast(polyData->GetPointData()->GetNormals());
+            FW_RAISE_IF("Only vtkFloatArray is supported to manage normals.", !normals);
+
+            size_t nbComponents = normals->GetNumberOfComponents();
+            SLM_ASSERT("Wrong nb of components ("<<nbComponents<<")", nbComponents == 3);
+
+            mesh->allocatePointNormals();
+            meshHelper.updateLock();
+
+            ::fwData::Mesh::Id nbPoints = mesh->getNumberOfPoints() ;
+            for (size_t i = 0; i != nbPoints; ++i)
+            {
+                meshHelper.setPointNormal(i, normals->GetPointer(i*nbComponents));
+            }
+        }
+
+        if(polyData->GetCellData()->GetAttribute(vtkDataSetAttributes::NORMALS))
+        {
+            vtkSmartPointer<vtkFloatArray> normals;
+            normals = vtkFloatArray::SafeDownCast(polyData->GetCellData()->GetNormals());
+            FW_RAISE_IF("Only vtkFloatArray is supported to manage normals.", !normals);
+
+            size_t nbComponents = normals->GetNumberOfComponents();
+            SLM_ASSERT("Wrong nb of components ("<<nbComponents<<")", nbComponents == 3);
+
+            mesh->allocateCellNormals();
+            meshHelper.updateLock();
+
+            ::fwData::Mesh::Id nbCells = mesh->getNumberOfCells() ;
+            for (size_t i = 0; i != nbCells; ++i)
+            {
+                meshHelper.setCellNormal(i, normals->GetPointer(i*nbComponents));
+            }
+        }
+
+        mesh->adjustAllocatedMemory();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::toVTKMesh( ::fwData::Mesh::sptr mesh, vtkSmartPointer<vtkPolyData> polyData)
+{
+    vtkSmartPointer< vtkPoints > pts = vtkSmartPointer< vtkPoints >::New();
+    polyData->SetPoints(pts);
+    Mesh::updatePolyDataPoints(polyData, mesh);
+
+    ::fwComEd::helper::Mesh meshHelper(mesh);
+    unsigned int nbCells = mesh->getNumberOfCells() ;
+
+    ::fwData::Mesh::CellTypesMultiArrayType cellTypes = meshHelper.getCellTypes();
+    ::fwData::Mesh::CellDataMultiArrayType cellData = meshHelper.getCellData();
+    ::fwData::Mesh::CellDataOffsetsMultiArrayType cellDataOffsets = meshHelper.getCellDataOffsets();
+
+    polyData->Allocate(4, nbCells);
+
+    vtkIdType typeVtkCell;
+    vtkIdType cell[4];
+    for(unsigned int i=0 ; i<nbCells ; ++i )
+    {
+        ::fwData::Mesh::CellTypes cellType = cellTypes[i];
+        ::fwData::Mesh::Id offset = cellDataOffsets[i];
+        switch( cellType )
+        {
+        case ::fwData::Mesh::EDGE :
+            typeVtkCell = VTK_LINE;
+            cell[0] = cellData[offset];
+            cell[1] = cellData[offset+1];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+            break;
+        case ::fwData::Mesh::TRIANGLE :
+            typeVtkCell = VTK_TRIANGLE;
+            cell[0] = cellData[offset];
+            cell[1] = cellData[offset+1];
+            cell[2] = cellData[offset+2];
+            polyData->InsertNextCell( typeVtkCell, 3, cell );
+            break;
+        case ::fwData::Mesh::QUAD :
+            typeVtkCell = VTK_QUAD;
+            cell[0] = cellData[offset];
+            cell[1] = cellData[offset+1];
+            cell[2] = cellData[offset+2];
+            cell[3] = cellData[offset+3];
+            polyData->InsertNextCell( typeVtkCell, 4, cell );
+            break;
+        case ::fwData::Mesh::TETRA :
+            typeVtkCell = VTK_LINE;
+            cell[0] = cellData[offset];
+            cell[1] = cellData[offset+1];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+            cell[0] = cellData[offset+1];
+            cell[1] = cellData[offset+2];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+            cell[0] = cellData[offset+2];
+            cell[1] = cellData[offset+3];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+            cell[0] = cellData[offset+3];
+            cell[1] = cellData[offset];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+            cell[0] = cellData[offset+2];
+            cell[1] = cellData[offset];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+            cell[0] = cellData[offset+1];
+            cell[1] = cellData[offset+3];
+            polyData->InsertNextCell( typeVtkCell, 2, cell );
+
+        }
+    }
+
+    Mesh::updatePolyDataPointNormals(polyData, mesh);
+    Mesh::updatePolyDataCellNormals(polyData, mesh);
+
+    Mesh::updatePolyDataPointColor(polyData, mesh);
+    Mesh::updatePolyDataCellColor(polyData, mesh);
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer<vtkPolyData> Mesh::updatePolyDataPoints(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+    ::fwComEd::helper::Mesh meshHelper(meshSrc);
+
+    vtkPoints *polyDataPoints = polyDataDst->GetPoints();
+    ::fwData::Mesh::Id nbPoints = meshSrc->getNumberOfPoints() ;
+    ::fwData::Mesh::PointsMultiArrayType points = meshHelper.getPoints();
+
+    if (nbPoints != polyDataPoints->GetNumberOfPoints())
+    {
+        polyDataPoints->SetNumberOfPoints(nbPoints);
+    }
+
+    vtkIdType id = 0;
+    typedef ::fwData::Mesh::PointsMultiArrayType::index PointTypesIndex;
+    for (PointTypesIndex i = 0; i != nbPoints; ++i)
+    {
+        polyDataPoints->SetPoint(id++, points[i][0], points[i][1], points[i][2]);
+    }
+
+    polyDataPoints->Modified();
+    return polyDataDst;
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer<vtkPolyData> Mesh::updatePolyDataPointColor(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+
+    ::fwData::Array::sptr pointColorArray = meshSrc->getPointColorsArray();
+    if(pointColorArray)
+    {
+        ::fwComEd::helper::Array arrayHelper(pointColorArray);
+
+        vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
+        size_t nbComponents = pointColorArray->getNumberOfComponents();
+        colors->SetNumberOfComponents(nbComponents);
+        colors->SetName("Colors");
+
+        unsigned char *pointColor = arrayHelper.begin< unsigned char >();
+        unsigned char *pointColorEnd = arrayHelper.end< unsigned char >();
+
+        for (; pointColor != pointColorEnd; pointColor+=nbComponents)
+        {
+            colors->InsertNextTupleValue(pointColor);
+        }
+        polyDataDst->GetPointData()->SetScalars(colors);
+        polyDataDst->Modified();
+    }
+    else
+    {
+        if(polyDataDst->GetPointData()->HasArray("Colors"))
+        {
+            polyDataDst->GetPointData()->RemoveArray("Colors");
+        }
+        polyDataDst->Modified();
+    }
+
+    return polyDataDst;
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer<vtkPolyData> Mesh::updatePolyDataCellColor(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+
+    ::fwData::Array::sptr cellColorArray = meshSrc->getCellColorsArray();
+    if(cellColorArray)
+    {
+        ::fwComEd::helper::Array arrayHelper(cellColorArray);
+
+        vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
+        size_t nbComponents = cellColorArray->getNumberOfComponents();
+        colors->SetNumberOfComponents(nbComponents);
+        colors->SetName("Colors");
+
+        ::fwMemory::BufferObject::Lock lock = cellColorArray->getBufferObject()->lock();
+        unsigned char *cellColor = arrayHelper.begin< unsigned char >();
+        unsigned char *cellColorEnd = arrayHelper.end< unsigned char >();
+
+        for (; cellColor != cellColorEnd; cellColor+=nbComponents)
+        {
+            colors->InsertNextTupleValue(cellColor);
+        }
+
+        polyDataDst->GetCellData()->SetScalars(colors);
+        polyDataDst->Modified();
+    }
+    else
+    {
+        if(polyDataDst->GetCellData()->HasArray("Colors"))
+        {
+            polyDataDst->GetCellData()->RemoveArray("Colors");
+        }
+        polyDataDst->Modified();
+    }
+
+    return polyDataDst;
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer<vtkPolyData> Mesh::updatePolyDataPointNormals(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+
+    ::fwData::Array::sptr pointNormalsArray = meshSrc->getPointNormalsArray();
+    if(pointNormalsArray)
+    {
+        ::fwComEd::helper::Array arrayHelper(pointNormalsArray);
+
+        vtkSmartPointer<vtkFloatArray> normals = vtkSmartPointer<vtkFloatArray>::New();
+        size_t nbComponents = pointNormalsArray->getNumberOfComponents();
+        normals->SetNumberOfComponents(nbComponents);
+
+        float *pointNormal = arrayHelper.begin< float >();
+        float *pointNormalEnd = arrayHelper.end< float >();
+
+        for (; pointNormal != pointNormalEnd; pointNormal+=nbComponents)
+        {
+            normals->InsertNextTupleValue(pointNormal);
+        }
+
+
+        polyDataDst->GetPointData()->SetNormals(normals);
+        polyDataDst->Modified();
+    }
+    else
+    {
+        if(polyDataDst->GetPointData()->GetAttribute(vtkDataSetAttributes::NORMALS))
+        {
+            polyDataDst->GetPointData()->RemoveArray(vtkDataSetAttributes::NORMALS);
+        }
+        polyDataDst->Modified();
+    }
+
+    return polyDataDst;
+}
+
+//------------------------------------------------------------------------------
+
+vtkSmartPointer<vtkPolyData> Mesh::updatePolyDataCellNormals(vtkSmartPointer<vtkPolyData> polyDataDst, ::fwData::Mesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+
+    ::fwData::Array::sptr cellNormalsArray = meshSrc->getCellNormalsArray();
+
+    if(cellNormalsArray)
+    {
+        ::fwComEd::helper::Array arrayHelper(cellNormalsArray);
+
+        vtkSmartPointer<vtkFloatArray> normals = vtkSmartPointer<vtkFloatArray>::New();
+        size_t nbComponents = cellNormalsArray->getNumberOfComponents();
+        normals->SetNumberOfComponents(nbComponents);
+
+        float *cellNormal = arrayHelper.begin< float >();
+        float *cellNormalEnd = arrayHelper.end< float >();
+
+        for (; cellNormal != cellNormalEnd; cellNormal+=nbComponents)
+        {
+            normals->InsertNextTupleValue(cellNormal);
+        }
+
+        polyDataDst->GetCellData()->SetNormals(normals);
+        polyDataDst->Modified();
+    }
+    else
+    {
+        if(polyDataDst->GetCellData()->GetAttribute(vtkDataSetAttributes::NORMALS))
+        {
+            polyDataDst->GetCellData()->RemoveArray(vtkDataSetAttributes::NORMALS);
+        }
+        polyDataDst->Modified();
+    }
+
+    return polyDataDst;
+}
+
+//-----------------------------------------------------------------------------
+
+double Mesh::computeVolume( ::fwData::Mesh::sptr mesh )
+{
+    vtkSmartPointer< vtkPolyData > vtkMeshRaw = vtkSmartPointer< vtkPolyData >::New();
+    Mesh::toVTKMesh( mesh, vtkMeshRaw );
+
+    // identify and fill holes in meshes
+    vtkSmartPointer< vtkFillHolesFilter > holesFilter = vtkSmartPointer< vtkFillHolesFilter >::New();
+    holesFilter->SetHoleSize(2000);
+    holesFilter->SetInput(vtkMeshRaw);
+    holesFilter->Update();
+    if (holesFilter->GetOutput()->GetNumberOfCells() > 0) // Filter return empty mesh when no topological holes are present
+    {
+        vtkMeshRaw = holesFilter->GetOutput();
+    }
+
+    // compute normals for polygonal mesh
+    vtkSmartPointer< vtkPolyDataNormals > filter = vtkSmartPointer< vtkPolyDataNormals >::New();
+    filter->SetInput(vtkMeshRaw);
+    filter->AutoOrientNormalsOn();
+    filter->FlipNormalsOff();
+
+    // estimate volume, area, shape index of triangle mesh
+    vtkSmartPointer< vtkMassProperties > calculator = vtkSmartPointer< vtkMassProperties >::New();
+    calculator->SetInput( filter->GetOutput() );
+    calculator->Update();
+
+    double volume =  calculator->GetVolume();
+    OSLM_DEBUG("GetVolume : " << volume << " vtkMassProperties::GetVolumeProjected = " << calculator->GetVolumeProjected() );
+    OSLM_DEBUG("Error : " << (calculator->GetVolume()- fabs(calculator->GetVolumeProjected()))*10000);
+    if ( (calculator->GetVolume()- fabs(calculator->GetVolumeProjected()))*10000 > calculator->GetVolume() )
+    {
+        std::stringstream ss;
+        ss << "volume - |volume projected| > volume/10000.0" << std::endl;
+        ss << "[volume = " << volume << "]" << std::endl;
+        ss << "[volume projected = " << calculator->GetVolumeProjected()<<"]";
+        throw (std::out_of_range( ss.str() ));
+    }
+
+    return volume;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/TransferFunction.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/TransferFunction.cpp
new file mode 100644
index 0000000..74a132b
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/helper/TransferFunction.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwVtkIO/helper/TransferFunction.hpp"
+
+namespace fwVtkIO
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::toVtkLookupTable(
+        ::fwData::TransferFunction::sptr tf,
+         vtkSmartPointer<vtkLookupTable> lt,
+        bool allowTransparency,
+        unsigned int size )
+{
+    SLM_WARN_IF( "Sorry, This transfer function conversion not managed clamped TF.", tf->getIsClamped() );
+
+    // Configures basic parameters
+    lt->SetNumberOfTableValues( size );
+    lt->SetScaleToLinear();
+
+
+    ::fwData::TransferFunction::TFValuePairType minMax = tf->getMinMaxTFValues();
+
+    lt->SetTableRange( minMax.first, minMax.second );
+
+    double delta = ( minMax.second - minMax.first ) / (double) (size - 1);
+    ::fwData::TransferFunction::TFColor interpolatedColor;
+
+    if ( allowTransparency )
+    {
+        for( unsigned int k=0; k<size; ++k )
+        {
+            interpolatedColor = tf->getInterpolatedColor( k*delta + minMax.first );
+            lt->SetTableValue(k, interpolatedColor.r, interpolatedColor.g, interpolatedColor.b, interpolatedColor.a);
+        }
+    }
+    else
+    {
+        for( unsigned int k=0; k<size; ++k )
+        {
+            interpolatedColor = tf->getInterpolatedColor( k*delta + minMax.first );
+            lt->SetTableValue(k, interpolatedColor.r, interpolatedColor.g, interpolatedColor.b, 1.0);
+        }
+    }
+
+    lt->Modified();
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunction::toBWVtkLookupTable(
+         double rangeMin,
+         double rangeMax,
+         vtkSmartPointer<vtkLookupTable> lt,
+         unsigned int size )
+{
+    SLM_TRACE_FUNC();
+
+    // Configures basic parameters
+    lt->Allocate( size, size );
+    lt->SetScaleToLinear();
+
+    lt->SetRampToLinear();
+    lt->SetTableRange( rangeMin, rangeMax );
+    lt->SetAlphaRange( 1.0, 1.0 );
+    lt->SetHueRange( 0.0, 0.0 );
+    lt->SetSaturationRange( 0.0, 0.0 );
+    lt->SetValueRange( 0.0, 1.0 );
+
+    lt->Build();
+
+    lt->Modified();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/src/fwVtkIO/vtk.cpp b/SrcLib/io/fwVtkIO/src/fwVtkIO/vtk.cpp
new file mode 100644
index 0000000..410990c
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/src/fwVtkIO/vtk.cpp
@@ -0,0 +1,503 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+#include <cstring>
+#include <functional>
+#include <numeric>
+#include <stdexcept>
+
+#include <boost/assign/list_of.hpp>
+#include <boost/cast.hpp>
+
+#include <vtkImageImport.h>
+#include <vtkSetGet.h>
+
+// for mesh
+#include <vtkCell.h>
+#include <vtkCellType.h>
+#include <vtkPoints.h>
+#include <vtkPolyData.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkPolyDataWriter.h>
+#include <vtkImageData.h>
+#include <vtkImageImport.h>
+#include <vtkImageExport.h>
+#include <vtkMatrix4x4.h>
+#include <vtkPolyDataNormals.h>
+#include <vtkLookupTable.h>
+
+#include <vtkMassProperties.h>
+
+#include <vtkPolyDataToImageStencil.h>
+#include <vtkImageStencil.h>
+#include <vtkImageAccumulate.h>
+
+#include <vtkDataSetAttributes.h>
+#include <vtkDataArray.h>
+#include <vtkPointData.h>
+#include <vtkSmartPointer.h>
+
+#include <fwMath/MeshFunctions.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/ObjectLock.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include "fwVtkIO/vtk.hpp"
+
+
+namespace fwVtkIO
+{
+
+
+TypeTranslator::fwToolsToVtkMap::mapped_type TypeTranslator::translate( const TypeTranslator::fwToolsToVtkMap::key_type &key )
+{
+    fwToolsToVtkMap::const_iterator it = s_toVtk.find( key );
+    FW_RAISE_IF("Unknown Type: " << key, it == s_toVtk.end() );
+    return it->second;
+}
+
+TypeTranslator::VtkTofwToolsMap::mapped_type TypeTranslator::translate( const TypeTranslator::VtkTofwToolsMap::key_type &key )
+{
+    VtkTofwToolsMap::const_iterator it = s_fromVtk.find( key );
+    FW_RAISE_IF("Unknown Type: " << key, it == s_fromVtk.end() );
+    return it->second;
+}
+
+
+
+
+const TypeTranslator::fwToolsToVtkMap TypeTranslator::s_toVtk
+        = boost::assign::map_list_of
+            // char and signed char are treated as the same type.
+            // and plain char is used when writing an int8 image
+            ( fwTools::Type::create("int8" )         , VTK_CHAR )
+            ( fwTools::Type::create("uint8" )        , VTK_UNSIGNED_CHAR )
+
+            ( fwTools::Type::create("int16")         , VTK_SHORT )
+            ( fwTools::Type::create("uint16")        , VTK_UNSIGNED_SHORT )
+
+            ( fwTools::Type::create("int32")         , VTK_INT )
+            ( fwTools::Type::create("uint32")        , VTK_UNSIGNED_INT )
+
+            ( fwTools::Type::create("float" )        , VTK_FLOAT )
+            ( fwTools::Type::create("double")        , VTK_DOUBLE )
+
+#if ( INT_MAX < LONG_MAX )
+            ( fwTools::Type::create("int64")         , VTK_LONG )
+            ( fwTools::Type::create("uint64")        , VTK_UNSIGNED_LONG )
+#endif
+            ;
+
+
+
+
+const TypeTranslator::VtkTofwToolsMap TypeTranslator::s_fromVtk
+    = boost::assign::map_list_of
+
+        // char and signed char are treated as the same type.
+        // and plain char is used when writing an int8 image
+        ( VTK_SIGNED_CHAR        , fwTools::Type::create("int8" )  )
+        ( VTK_CHAR               , fwTools::Type::create("int8" )  )
+        ( VTK_UNSIGNED_CHAR      , fwTools::Type::create("uint8" ) )
+
+        ( VTK_SHORT              , fwTools::Type::create("int16")  )
+        ( VTK_UNSIGNED_SHORT     , fwTools::Type::create("uint16") )
+
+        ( VTK_INT                , fwTools::Type::create("int32")  )
+        ( VTK_UNSIGNED_INT       , fwTools::Type::create("uint32") )
+
+        ( VTK_FLOAT              , fwTools::Type::create("float" ) )
+        ( VTK_DOUBLE             , fwTools::Type::create("double") )
+
+#if ( INT_MAX < LONG_MAX )
+        ( VTK_LONG               , fwTools::Type::create("int64")  )
+        ( VTK_UNSIGNED_LONG      , fwTools::Type::create("uint64") )
+
+        ( VTK___INT64            , fwTools::Type::create("int64")  )
+        ( VTK_LONG_LONG          , fwTools::Type::create("int64")  )
+
+        ( VTK_UNSIGNED___INT64   , fwTools::Type::create("uint64") )
+        ( VTK_UNSIGNED_LONG_LONG , fwTools::Type::create("uint64") )
+#else
+        ( VTK_LONG               , fwTools::Type::create("int32")  )
+        ( VTK_UNSIGNED_LONG      , fwTools::Type::create("uint32") )
+#endif
+        ;
+
+
+//-----------------------------------------------------------------------------
+
+void toVTKImage( ::fwData::Image::sptr data,  vtkImageData *dst)
+{
+    vtkSmartPointer< vtkImageImport > importer = vtkSmartPointer< vtkImageImport >::New();
+
+    configureVTKImageImport( importer, data );
+
+    importer->Update();
+
+    dst->ShallowCopy(importer->GetOutput());
+}
+
+//-----------------------------------------------------------------------------
+
+
+template< typename IMAGETYPE >
+void *newBuffer(size_t size)
+{
+    IMAGETYPE *destBuffer;
+    try
+    {
+        destBuffer = new IMAGETYPE[ size ];
+    }
+    catch (std::exception &e)
+    {
+        OSLM_ERROR ("No enough memory to allocate an image of type "
+                << fwTools::makeDynamicType<IMAGETYPE>().string()
+                << " and of size "<< size << "." << std::endl
+                << e.what() );
+        throw;
+    }
+    return destBuffer;
+}
+
+//-----------------------------------------------------------------------------
+
+template< typename IMAGETYPE >
+void fromRGBBuffer( void *input, size_t size, void *&destBuffer)
+{
+    if(destBuffer == NULL)
+    {
+        destBuffer = newBuffer<IMAGETYPE>(size);
+    }
+
+    IMAGETYPE *destBufferTyped = (IMAGETYPE*)destBuffer;
+    IMAGETYPE *inputTyped      = (IMAGETYPE*)input;
+    IMAGETYPE *finalPtr        = ((IMAGETYPE*)destBuffer) + size;
+    IMAGETYPE valR, valG,valB;
+
+    while (destBufferTyped < finalPtr)
+    {
+        valR = (IMAGETYPE)(float((*(inputTyped++)) * 0.30));
+        valG = (IMAGETYPE)(float((*(inputTyped++)) * 0.59));
+        valB = (IMAGETYPE)(float((*(inputTyped++)) * 0.11));
+        (*destBufferTyped++) = valR + valG + valB;
+    }
+}
+//-----------------------------------------------------------------------------
+
+
+void fromVTKImage( vtkImageData* source, ::fwData::Image::sptr destination )
+{
+    SLM_ASSERT("vtkImageData source and/or ::fwData::Image destination are not correct", destination && source );
+
+    ::fwComEd::helper::Image imageHelper(destination);
+
+    // ensure image size correct
+    source->UpdateInformation();
+    source->PropagateUpdateExtent();
+
+    int dim = source->GetDataDimension() ;
+    OSLM_TRACE("source->GetDataDimension() : " << dim);
+
+    SLM_WARN_IF("2D Vtk image are not yet correctly managed", dim == 2);
+
+
+    destination->setSize( ::fwData::Image::SizeType(source->GetDimensions(), source->GetDimensions()+dim) );
+    destination->setSpacing( ::fwData::Image::SpacingType(source->GetSpacing(), source->GetSpacing()+dim) );
+    destination->setOrigin( ::fwData::Image::OriginType(source->GetOrigin(), source->GetOrigin()+dim) );
+
+
+    size_t size = std::accumulate(source->GetDimensions(), source->GetDimensions()+dim, 1, std::multiplies<size_t>() );
+    void *input = source->GetScalarPointer();
+
+    if (size != 0)
+    {
+        void *destBuffer;
+        int nbBytePerPixel = source->GetScalarSize();
+        int nbComponents = source->GetNumberOfScalarComponents();
+        OSLM_TRACE("image size : " << size << " - nbBytePerPixel : " << nbBytePerPixel );
+
+        destination->setNumberOfComponents(1);
+        if (nbComponents == 3 && nbBytePerPixel == 2)
+        {
+            SLM_TRACE ("RGB 16bits");
+
+            destination->setType( "uint16" );
+            destination->allocate();
+            ::fwData::ObjectLock lock(destination);
+            destBuffer = imageHelper.getBuffer();
+            SLM_ASSERT("Image allocation error", destBuffer != NULL);
+            fromRGBBuffer< unsigned short >(input, size, destBuffer);
+        }
+        else if (nbComponents == 3 && nbBytePerPixel == 1)
+        {
+            SLM_TRACE ("RGB 8bits");
+
+            destination->setType( "uint8" );
+            destination->allocate();
+            ::fwData::ObjectLock lock(destination);
+            destBuffer = imageHelper.getBuffer();
+            SLM_ASSERT("Image allocation error", destBuffer != NULL);
+            fromRGBBuffer< unsigned char >(input, size, destBuffer);
+        }
+        else
+        {
+            SLM_TRACE ("Luminance image");
+            destination->setType( TypeTranslator::translate( source->GetScalarType() ) );
+            destination->setNumberOfComponents(nbComponents);
+            destination->allocate();
+            ::fwData::ObjectLock lock(destination);
+            destBuffer = imageHelper.getBuffer();
+            size_t sizeInBytes = destination->getSizeInBytes();
+            std::memcpy(destBuffer, input, sizeInBytes);
+        }
+    }
+
+}
+
+//------------------------------------------------------------------------------
+
+void configureVTKImageImport( ::vtkImageImport * _pImageImport, ::fwData::Image::sptr _pDataImage )
+{
+    ::fwComEd::helper::Image imageHelper(_pDataImage);
+
+    _pImageImport->SetDataSpacing(  _pDataImage->getSpacing().at(0),
+                                    _pDataImage->getSpacing().at(1),
+                                    _pDataImage->getSpacing().at(2)
+                                );
+
+    _pImageImport->SetDataOrigin(   _pDataImage->getOrigin().at(0),
+                                    _pDataImage->getOrigin().at(1),
+                                    _pDataImage->getOrigin().at(2)
+                                );
+
+    _pImageImport->SetWholeExtent(  0, _pDataImage->getSize().at(0) - 1,
+                                    0, _pDataImage->getSize().at(1) - 1,
+                                    0, _pDataImage->getSize().at(2) - 1
+                                );
+
+    _pImageImport->SetNumberOfScalarComponents(static_cast<int>( _pDataImage->getNumberOfComponents() ));
+
+    // copy WholeExtent to DataExtent
+    _pImageImport->SetDataExtentToWholeExtent();
+    // no copy, no buffer destruction/management
+    _pImageImport->SetImportVoidPointer( imageHelper.getBuffer() );
+    // used to set correct pixeltype to VtkImage
+    _pImageImport->SetDataScalarType( TypeTranslator::translate(_pDataImage->getType()) );
+}
+
+//-----------------------------------------------------------------------------
+
+// This method is written to be as fast as possible, take care when modifying it.
+vtkPolyData*  updatePolyDataPoints(vtkPolyData* polyDataDst, ::fwData::TriangularMesh::sptr meshSrc )
+{
+    SLM_ASSERT( "vtkPolyData should not be NULL", polyDataDst);
+
+    vtkPoints *polyDataPoints = polyDataDst->GetPoints();
+    ::fwData::TriangularMesh::PointContainer &points = meshSrc->points();
+
+    ::fwData::TriangularMesh::PointContainer::iterator pointsIter = points.begin();
+    ::fwData::TriangularMesh::PointContainer::iterator pointsEnd  = points.end();
+
+    float *xyz = 0;
+    vtkIdType id = 0;
+    if (points.size() != polyDataPoints->GetNumberOfPoints())
+    {
+        polyDataPoints->SetNumberOfPoints(points.size());
+    }
+    for( ; pointsIter != pointsEnd ; ++pointsIter )
+    {
+        xyz = &(pointsIter->front());
+        polyDataPoints->SetPoint(id++, xyz);
+    }
+    polyDataPoints->Modified();
+    return polyDataDst;
+}
+
+//-----------------------------------------------------------------------------
+
+vtkPolyData*  toVTKMesh( ::fwData::TriangularMesh::sptr mesh )
+{
+    vtkPolyData *polygonGrid = vtkPolyData::New();
+
+    if ( mesh && !mesh->points().empty() )
+    {
+        vtkSmartPointer< vtkPoints > trianPts = vtkSmartPointer< vtkPoints >::New();
+        polygonGrid->SetPoints(trianPts);
+        updatePolyDataPoints(polygonGrid, mesh);
+
+        ::fwData::TriangularMesh::CellContainer &cells = mesh->cells();
+        unsigned int nbCells = cells.size() ;
+        assert( nbCells ) ;
+        vtkIdType typeCell = VTK_TRIANGLE;
+        polygonGrid->Allocate(typeCell,nbCells);
+        for(unsigned int i=0 ; i<nbCells ; ++i )
+        {
+            vtkIdType cell[3];
+            const std::vector<int> &meshCell = (cells[i]);
+            cell[0] = meshCell[0] ;
+            cell[1] = meshCell[1] ;
+            cell[2] = meshCell[2] ;
+            polygonGrid->InsertNextCell( typeCell, 3, cell );
+        }
+    }
+    else
+    {
+        SLM_INFO("vtkPolyData build from empty mesh.");
+    }
+
+    return polygonGrid;
+}
+
+//-----------------------------------------------------------------------------
+
+bool fromVTKMesh( vtkPolyData *polyData, ::fwData::TriangularMesh::sptr triangularMesh)
+{
+    SLM_TRACE_FUNC();
+    bool res = false;
+    vtkPoints *trianPts = polyData->GetPoints();
+
+    if (trianPts)
+    {
+        // Clear the container cells and set its capacity to 0
+        triangularMesh->clearCells();
+        // Clear the container points and set its capacity to 0
+        triangularMesh->clearPoints();
+
+        vtkDataArray* points = trianPts->GetData();
+        vtkIdType numberOfTuples = points->GetNumberOfTuples();
+        std::vector<float> vPoint(3, 0.0);
+        triangularMesh->points().resize(numberOfTuples, vPoint);
+        double* tuple;
+        for (vtkIdType i = 0; i < numberOfTuples; ++i)
+        {
+            tuple = points->GetTuple(i);
+            ::fwData::TriangularMesh::PointContainer::value_type &vPoints = triangularMesh->points()[i];
+            std::copy(tuple, tuple+3, vPoints.begin());
+        }
+
+        vtkIdType numberOfCells = polyData->GetNumberOfCells();
+        std::vector<int> vCell(3, 0);
+        triangularMesh->cells().resize(numberOfCells, vCell);
+        vtkCell* cell;
+        vtkIdList* idList;
+        vtkIdType* idType;
+        for (vtkIdType i = 0 ; i < numberOfCells ; ++i)
+        {
+            cell = polyData->GetCell(i);
+            idList = cell->GetPointIds();
+            idType = idList->GetPointer(0);
+            ::fwData::TriangularMesh::CellContainer::value_type &vCells = triangularMesh->cells()[i];
+            std::copy(idType, idType+3, vCells.begin());
+        }
+        res = true;
+    }
+
+    return res;
+}
+
+//-----------------------------------------------------------------------------
+
+double computeVolume( ::fwData::TriangularMesh::sptr _triangularMesh )
+{
+    ::fwData::TriangularMesh::sptr closedMesh = ::fwData::Object::copy(_triangularMesh);
+
+    ::fwMath::closeSurface(closedMesh->points(), closedMesh->cells());
+
+    vtkPolyData*  vtkMeshRaw = toVTKMesh( closedMesh );
+
+    vtkSmartPointer< vtkPolyDataNormals > filter = vtkSmartPointer< vtkPolyDataNormals >::New();
+    filter->SetInput(vtkMeshRaw);
+    filter->AutoOrientNormalsOn();
+    filter->FlipNormalsOff();
+
+    vtkSmartPointer< vtkMassProperties > calculator = vtkSmartPointer< vtkMassProperties >::New();
+    calculator->SetInput( filter->GetOutput() );
+    calculator->Update();
+    double volume =  calculator->GetVolume();
+    OSLM_DEBUG("GetVolume : " << volume << " vtkMassProperties::GetVolumeProjected = " << calculator->GetVolumeProjected() );
+    OSLM_DEBUG("Error : " << (calculator->GetVolume()- fabs(calculator->GetVolumeProjected()))*10000);
+    if ( (calculator->GetVolume()- fabs(calculator->GetVolumeProjected()))*10000 > calculator->GetVolume() )
+    {
+        std::stringstream ss;
+        ss << "vtkMassProperties::GetVolume() - | vtkMassProperties::GetVolumeProjected() |";
+        ss << ">  vtkMassProperties::GetVolume()/10000.0" << std::endl;
+        ss << "vtkMassProperties::GetVolume() = " << volume << " vtkMassProperties::GetVolumeProjected = " << calculator->GetVolumeProjected();
+        throw (std::out_of_range( ss.str() ));
+    }
+
+    vtkMeshRaw->Delete();
+
+    return volume;
+}
+
+//-----------------------------------------------------------------------------
+
+double computeVolumeWithStencil(  ::fwData::TriangularMesh::sptr _triangularMesh )
+{
+    vtkPolyData*  vtkMesh = toVTKMesh( _triangularMesh );
+
+    vtkImageData* vi = vtkImageData::New();
+    vi->SetOrigin( 0,0,0 ); // adjust these to your needs
+    vi->SetSpacing( 0.5, 0.5, 0.5 ); // adjust these to your needs
+    vi->SetDimensions( vtkMesh->GetBounds()[1]*2,  vtkMesh->GetBounds()[3]*2,  vtkMesh->GetBounds()[5]*2 ); // adjust these to your needs
+    vi->SetScalarTypeToUnsignedChar ();
+    vi->AllocateScalars();
+    vi->GetPointData()->GetScalars()->FillComponent(0, 1.0);
+    // outputMesh is of vtkPolyData* type and contains your mesh data
+    vtkPolyDataToImageStencil* pti = vtkPolyDataToImageStencil::New();
+    pti->SetInput( vtkMesh );
+    vtkImageAccumulate* ac = vtkImageAccumulate::New();
+    ac->SetInput( vi );
+    ac->SetStencil( pti->GetOutput() );
+    ac->ReverseStencilOff();
+    ac->Update();
+
+    unsigned long nbVoxel = ac->GetVoxelCount();
+
+    pti->Delete();
+    ac->Delete();
+    vi->Delete();
+    vtkMesh->Delete();
+
+    return nbVoxel;
+}
+
+//-----------------------------------------------------------------------------
+
+vtkMatrix4x4 *  toVTKMatrix( ::fwData::TransformationMatrix3D::sptr _transfoMatrix )
+{
+    vtkMatrix4x4  *matrix = vtkMatrix4x4 ::New();
+    for(int l=0; l<4; l++)
+    {
+        for(int c=0; c <4; c++)
+        {
+            matrix->SetElement(l, c, _transfoMatrix->getCoefficient(l, c));
+        }
+    }
+    return matrix;
+}
+
+//-----------------------------------------------------------------------------
+
+bool fromVTKMatrix( vtkMatrix4x4* _matrix, ::fwData::TransformationMatrix3D::sptr _transfoMatrix)
+{
+    SLM_TRACE_FUNC();
+    bool res = true;
+    for(int l=0; l<4; l++)
+    {
+        for(int c=0; c <4; c++)
+        {
+            _transfoMatrix->setCoefficient(l,c, _matrix->GetElement(l,c));
+        }
+    }
+    return res;
+}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/test/CMakeLists.txt b/SrcLib/io/fwVtkIO/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/io/fwVtkIO/test/Properties.cmake b/SrcLib/io/fwVtkIO/test/Properties.cmake
new file mode 100644
index 0000000..09ab2dc
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwVtkIOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataTools fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/fwVtkIO/test/cppunit.options b/SrcLib/io/fwVtkIO/test/cppunit.options
new file mode 100644
index 0000000..4e13357
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/cppunit.options
@@ -0,0 +1,18 @@
+CLASSTEST=[
+          'TrianTest',
+          'MeshTest',
+          'ImageTest',
+          'TransferFunctionTest',
+          'SeriesDBTest',
+          ]
+USE = ['boost']
+LIB = [
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwData_0-1',
+       'fwDataCamp_0-1',
+       'fwVtkIO_0-1',
+       'fwDataTools_0-1',
+       'fwTest_0-1',
+       ]
+CONSOLE='yes'
diff --git a/SrcLib/io/fwVtkIO/test/tu/include/ImageTest.hpp b/SrcLib/io/fwVtkIO/test/tu/include/ImageTest.hpp
new file mode 100644
index 0000000..95a24bf
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/include/ImageTest.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWVTKIO_UT_IMAGETEST_HPP_
+#define _FWVTKIO_UT_IMAGETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Image.hpp>
+#include <fwData/Array.hpp>
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create image.
+ */
+class ImageTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageTest );
+    CPPUNIT_TEST( testImageToVtk );
+    CPPUNIT_TEST( testFromVtk );
+
+    CPPUNIT_TEST( mhdReaderTest );
+    CPPUNIT_TEST( mhdWriterTest );
+    CPPUNIT_TEST( vtiReaderTest );
+    CPPUNIT_TEST( vtiWriterTest );
+    CPPUNIT_TEST( vtkReaderTest );
+    CPPUNIT_TEST( vtkWriterTest );
+
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testImageToVtk();
+    void testFromVtk();
+
+    void mhdReaderTest();
+    void mhdWriterTest();
+    void vtiReaderTest();
+    void vtiWriterTest();
+    void vtkReaderTest();
+    void vtkWriterTest();
+
+};
+
+} // namespace ut
+} // namespace fwVtkIO
+
+#endif //_FWVTKIO_UT_IMAGETEST_HPP_
diff --git a/SrcLib/io/fwVtkIO/test/tu/include/MeshTest.hpp b/SrcLib/io/fwVtkIO/test/tu/include/MeshTest.hpp
new file mode 100644
index 0000000..c1ea53e
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/include/MeshTest.hpp
@@ -0,0 +1,45 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWVTKIO_UT_MESHTEST_HPP_
+#define _FWVTKIO_UT_MESHTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Array.hpp>
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh.
+ */
+class MeshTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( MeshTest );
+    CPPUNIT_TEST( testMeshToVtk );
+    CPPUNIT_TEST( testSyntheticMesh );
+    CPPUNIT_TEST( testExportImportSyntheticMesh );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testMeshToVtk();
+    void testSyntheticMesh();
+    void testExportImportSyntheticMesh();
+
+};
+
+} // namespace ut
+} // namespace fwVtkIO
+
+#endif //_FWVTKIO_UT_MESHTEST_HPP_
diff --git a/SrcLib/io/fwVtkIO/test/tu/include/SeriesDBTest.hpp b/SrcLib/io/fwVtkIO/test/tu/include/SeriesDBTest.hpp
new file mode 100644
index 0000000..d012ff4
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/include/SeriesDBTest.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWVTKIO_UT_SERIESDBTEST_HPP_
+#define _FWVTKIO_UT_SERIESDBTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Mesh.hpp>
+#include <fwData/Array.hpp>
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh.
+ */
+class SeriesDBTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBTest );
+    CPPUNIT_TEST( testImportSeriesDB );
+    CPPUNIT_TEST( testLazyImportSeriesDB );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testImportSeriesDB();
+    void testLazyImportSeriesDB();
+
+};
+
+} // namespace ut
+} // namespace fwVtkIO
+
+#endif //_FWVTKIO_UT_SERIESDBTEST_HPP_
diff --git a/SrcLib/io/fwVtkIO/test/tu/include/TransferFunctionTest.hpp b/SrcLib/io/fwVtkIO/test/tu/include/TransferFunctionTest.hpp
new file mode 100644
index 0000000..461a6fb
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/include/TransferFunctionTest.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWVTKIO_UT_TRANSFERFUNCTIONTEST_HPP_
+#define _FWVTKIO_UT_TRANSFERFUNCTIONTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/TransferFunction.hpp>
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test few methods to create transfer function for VTK.
+ */
+class TransferFunctionTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TransferFunctionTest );
+    CPPUNIT_TEST( toVtkLookupTableTest );
+    CPPUNIT_TEST( toBWVtkLookupTableTest );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void toVtkLookupTableTest();
+    void toBWVtkLookupTableTest();
+
+private :
+
+    ::fwData::TransferFunction::sptr createTFColor();
+
+};
+
+} // end namespace ut
+} // end namespace fwVtkIO
+
+#endif //_FWVTKIO_UT_TRANSFERFUNCTIONTEST_HPP_
diff --git a/SrcLib/io/fwVtkIO/test/tu/include/TrianTest.hpp b/SrcLib/io/fwVtkIO/test/tu/include/TrianTest.hpp
new file mode 100644
index 0000000..54e48e3
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/include/TrianTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWVTKIO_UT_TRIANTEST_HPP_
+#define _FWVTKIO_UT_TRIANTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create mesh or image with VTK.
+ */
+class TrianTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( TrianTest );
+    CPPUNIT_TEST( testTrianToVtk );
+    CPPUNIT_TEST_SUITE_END();
+
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void testTrianToVtk();
+
+};
+
+} // namespace ut
+} // namespace fwVtkIO
+
+#endif //_FWVTKIO_UT_TRIANTEST_HPP_
diff --git a/SrcLib/io/fwVtkIO/test/tu/src/ImageTest.cpp b/SrcLib/io/fwVtkIO/test/tu/src/ImageTest.cpp
new file mode 100644
index 0000000..f7406d7
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/src/ImageTest.cpp
@@ -0,0 +1,450 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <boost/assign/std/vector.hpp>
+#include <boost/assign/list_of.hpp>
+
+#include <vtkImageData.h>
+#include <vtkPolyData.h>
+#include <vtkSmartPointer.h>
+#include <vtkSphereSource.h>
+#include <vtkGenericDataObjectReader.h>
+
+#include <fwTools/System.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwTest/Data.hpp>
+#include <fwTest/File.hpp>
+#include <fwTest/generator/Image.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwVtkIO/ImageWriter.hpp>
+#include <fwVtkIO/ImageReader.hpp>
+#include <fwVtkIO/MetaImageReader.hpp>
+#include <fwVtkIO/MetaImageWriter.hpp>
+#include <fwVtkIO/VtiImageReader.hpp>
+#include <fwVtkIO/VtiImageWriter.hpp>
+#include <fwVtkIO/vtk.hpp>
+
+#include "ImageTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwVtkIO::ut::ImageTest );
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+using namespace boost::assign;
+
+static const double epsilon = 0.00001;
+static const int nbDataTestValues = 1000;
+
+static const ::fwData::Image::SizeType    bostonTeapotSize    = list_of(256)(256)(178);
+static const ::fwData::Image::SpacingType bostonTeapotSpacing = list_of(1)(1)(1);
+static const ::fwData::Image::OriginType  bostonTeapotOrigin  = list_of(1.1)(2.2)(3.3);
+
+#define COMPARE_IMAGE_ATTRS_MACRO(expSize, expSpacing, expOrigin, size, spacing, origin)                                                                                          \
+{                                                                                                                                                                                         \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::SpacingType::value_type >(expSpacing[0]), static_cast< ::fwData::Image::SpacingType::value_type >(spacing[0]), epsilon ); \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::SpacingType::value_type >(expSpacing[1]), static_cast< ::fwData::Image::SpacingType::value_type >(spacing[1]), epsilon ); \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::SpacingType::value_type >(expSpacing[2]), static_cast< ::fwData::Image::SpacingType::value_type >(spacing[2]), epsilon ); \
+                                                                                                                                                                                          \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::OriginType::value_type >(expOrigin[0]), static_cast< ::fwData::Image::OriginType::value_type >(origin[0]), epsilon );     \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::OriginType::value_type >(expOrigin[1]), static_cast< ::fwData::Image::OriginType::value_type >(origin[1]), epsilon );     \
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( static_cast< ::fwData::Image::OriginType::value_type >(expOrigin[2]), static_cast< ::fwData::Image::OriginType::value_type >(origin[2]), epsilon );     \
+                                                                                                                                                                                          \
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwData::Image::SizeType::value_type >(expSize[0]), static_cast< ::fwData::Image::SizeType::value_type >(size[0]) );                              \
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwData::Image::SizeType::value_type >(expSize[1]), static_cast< ::fwData::Image::SizeType::value_type >(size[1]) );                              \
+    CPPUNIT_ASSERT_EQUAL( static_cast< ::fwData::Image::SizeType::value_type >(expSize[2]), static_cast< ::fwData::Image::SizeType::value_type >(size[2]) );                              \
+}
+
+
+#define WRITER_TEST(writerclass, readerclass, imagetype, filename)                                                                 \
+{                                                                                                                                  \
+    const ::boost::filesystem::path testFile(::fwTools::System::getTemporaryFolder() / filename);                                  \
+                                                                                                                                   \
+    ::fwData::Image::sptr image = ::fwData::Image::New();                                                                          \
+    ::fwTest::generator::Image::generateRandomImage(image, ::fwTools::Type(imagetype));                                            \
+                                                                                                                                   \
+    writerclass::sptr writer =  writerclass::New();                                                                                \
+    writer->setObject(image);                                                                                                      \
+    writer->setFile(testFile);                                                                                                     \
+    writer->write();                                                                                                               \
+                                                                                                                                   \
+    CPPUNIT_ASSERT_MESSAGE( "test on <" filename ">  of type <" imagetype "> Failed ", ::boost::filesystem::exists(testFile) );    \
+                                                                                                                                   \
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();                                                                         \
+    readerclass::sptr reader = readerclass::New();                                                                                 \
+    reader->setObject(image2);                                                                                                     \
+    reader->setFile(testFile);                                                                                                     \
+    reader->read();                                                                                                                \
+                                                                                                                                   \
+    ::boost::filesystem::remove(testFile);                                                                                         \
+                                                                                                                                   \
+    CPPUNIT_ASSERT_EQUAL_MESSAGE( "test on <" filename "> of type <" imagetype "> Failed ", image->getType(), image2->getType() ); \
+    COMPARE_IMAGE_ATTRS_MACRO(                                                                                                     \
+                image->getSize(),                                                                                                  \
+                image->getSpacing(),                                                                                               \
+                image->getOrigin(),                                                                                                \
+                image2->getSize(),                                                                                                 \
+                image2->getSpacing(),                                                                                              \
+                image2->getOrigin()                                                                                                \
+            )                                                                                                                      \
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::testImageToVtk()
+{
+    const size_t dim = 3;
+    ::fwData::Image::SizeType size(dim);
+    size[0] = 10;
+    size[1] = 15;
+    size[2] = 23;
+    ::fwData::Image::SpacingType spacing(dim);
+    spacing[0] = 0.85;
+    spacing[1] = 2.6;
+    spacing[2] = 1.87;
+    ::fwData::Image::OriginType origin(dim);
+    origin[0] = -45.6;
+    origin[1] = 25.97;
+    origin[2] = -53.9;
+
+#define IMAGE_TO_VTK_TEST(imgtype, vtktypes)                                                                                   \
+    {                                                                                                                          \
+    ::fwData::Image::sptr image = ::fwData::Image::New();                                                                      \
+    ::fwTest::generator::Image::generateImage(image, size, spacing, origin, ::fwTools::Type(imgtype));                         \
+                                                                                                                               \
+    ::fwComEd::helper::Image imageHelper(image);                                                                               \
+                                                                                                                               \
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();                                         \
+    ::fwVtkIO::toVTKImage(image, vtkImage);                                                                                      \
+                                                                                                                               \
+    COMPARE_IMAGE_ATTRS_MACRO(                                                                                                 \
+            size,                                                                                                              \
+            spacing,                                                                                                           \
+            origin,                                                                                                            \
+                                                                                                                               \
+            vtkImage->GetDimensions(),                                                                                         \
+            vtkImage->GetSpacing(),                                                                                            \
+            vtkImage->GetOrigin()                                                                                              \
+            );                                                                                                                 \
+                                                                                                                               \
+    std::set<int> types = vtktypes;                                                                                            \
+    CPPUNIT_ASSERT_MESSAGE( "Test failed for type " imgtype, types.find( vtkImage->GetScalarType() ) != types.end() );         \
+                                                                                                                               \
+    char *vtkPtr = static_cast<char*>(vtkImage->GetScalarPointer());                                                           \
+    char *ptr = static_cast<char*>(imageHelper.getBuffer());                                                                   \
+                                                                                                                               \
+    CPPUNIT_ASSERT_MESSAGE( "Test failed for type " imgtype, std::equal(ptr, ptr + image->getSizeInBytes(), vtkPtr) );         \
+}
+
+    IMAGE_TO_VTK_TEST("int8"  , list_of(VTK_CHAR)(VTK_SIGNED_CHAR));
+    IMAGE_TO_VTK_TEST("uint8" , list_of(VTK_UNSIGNED_CHAR));
+
+    IMAGE_TO_VTK_TEST("int16" , list_of(VTK_SHORT));
+    IMAGE_TO_VTK_TEST("uint16", list_of(VTK_UNSIGNED_SHORT));
+
+    IMAGE_TO_VTK_TEST("int32" , list_of(VTK_INT));
+    IMAGE_TO_VTK_TEST("uint32", list_of(VTK_UNSIGNED_INT));
+
+    // IMAGE_TO_VTK_TEST("int64" , list_of(VTK_LONG));
+    // IMAGE_TO_VTK_TEST("uint64", list_of(VTK_UNSIGNED_LONG));
+
+    IMAGE_TO_VTK_TEST("float" , list_of(VTK_FLOAT));
+    IMAGE_TO_VTK_TEST("double", list_of(VTK_DOUBLE));
+
+}
+
+//------------------------------------------------------------------------------
+
+
+void ImageTest::testFromVtk()
+{
+#define IMAGE_FROM_VTK_TEST(imagename, type)                                                                           \
+    {                                                                                                                  \
+        const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / imagename );                                \
+                                                                                                                       \
+        CPPUNIT_ASSERT(::boost::filesystem::exists(imagePath));                                                        \
+        CPPUNIT_ASSERT(::boost::filesystem::is_regular_file(imagePath));                                               \
+                                                                                                                       \
+        vtkSmartPointer< vtkGenericDataObjectReader > reader = vtkSmartPointer< vtkGenericDataObjectReader >::New();   \
+        reader->SetFileName(imagePath.string().c_str());                                                               \
+        reader->Update();                                                                                              \
+        vtkSmartPointer< vtkImageData > vtkImage = vtkImageData::SafeDownCast(reader->GetOutput());                    \
+                                                                                                                       \
+        CPPUNIT_ASSERT(vtkImage);                                                                                      \
+                                                                                                                       \
+        ::fwData::Image::sptr image = ::fwData::Image::New();                                                                                \
+        ::fwVtkIO::fromVTKImage(vtkImage, image);                                                                        \
+                                                                                                                       \
+        ::fwComEd::helper::Image imageHelper(image);                                                                   \
+                                                                                                                       \
+        COMPARE_IMAGE_ATTRS_MACRO(                                                                                     \
+                vtkImage->GetDimensions(),                                                                             \
+                vtkImage->GetSpacing(),                                                                                \
+                vtkImage->GetOrigin(),                                                                                 \
+                                                                                                                       \
+                image->getSize(),                                                                                      \
+                image->getSpacing(),                                                                                   \
+                image->getOrigin()                                                                                     \
+                );                                                                                                     \
+                                                                                                                       \
+        CPPUNIT_ASSERT_EQUAL_MESSAGE( "test on <" imagename "> Failed ", ::fwTools::Type(type), image->getType() );    \
+                                                                                                                       \
+        char *vtkPtr = static_cast<char*>(vtkImage->GetScalarPointer());                                               \
+        char *ptr = static_cast<char*>(imageHelper.getBuffer());                                                       \
+                                                                                                                       \
+        CPPUNIT_ASSERT( std::equal(ptr, ptr + image->getSizeInBytes(), vtkPtr) );                                      \
+    }
+
+#define GENERATED_IMAGE_FROM_VTK_TEST(type)                        \
+    IMAGE_FROM_VTK_TEST("fw4spl/image/vtk/img-" type ".vtk", type)
+
+    IMAGE_FROM_VTK_TEST("fw4spl/image/vtk/img.vtk", "int16");
+
+    GENERATED_IMAGE_FROM_VTK_TEST("int8"  );
+    GENERATED_IMAGE_FROM_VTK_TEST("uint8" );
+
+    GENERATED_IMAGE_FROM_VTK_TEST("int16" );
+    GENERATED_IMAGE_FROM_VTK_TEST("uint16");
+
+    GENERATED_IMAGE_FROM_VTK_TEST("int32" );
+    GENERATED_IMAGE_FROM_VTK_TEST("uint32");
+
+    // GENERATED_IMAGE_FROM_VTK_TEST("int64" );
+    // GENERATED_IMAGE_FROM_VTK_TEST("uint64");
+
+    GENERATED_IMAGE_FROM_VTK_TEST("float" );
+    GENERATED_IMAGE_FROM_VTK_TEST("double");
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::mhdReaderTest()
+{
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/mhd/BostonTeapot.mhd" );
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwVtkIO::MetaImageReader::sptr reader = ::fwVtkIO::MetaImageReader::New();
+    reader->setObject(image);
+    reader->setFile(imagePath);
+    reader->read();
+
+    COMPARE_IMAGE_ATTRS_MACRO(
+            bostonTeapotSize,
+            bostonTeapotSpacing,
+            bostonTeapotOrigin,
+
+            image->getSize(),
+            image->getSpacing(),
+            image->getOrigin()
+            );
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::mhdWriterTest()
+{
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/mhd/BostonTeapot.mhd" );
+    const ::boost::filesystem::path zRawPath( ::fwTest::Data::dir() / "fw4spl/image/mhd/BostonTeapot.zraw" );
+
+    const ::boost::filesystem::path testFile(::fwTools::System::getTemporaryFolder() / "BostonTeapot.mhd");
+    const ::boost::filesystem::path testZRawFile(::fwTools::System::getTemporaryFolder() / "BostonTeapot.zraw");
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwVtkIO::MetaImageReader::sptr reader = ::fwVtkIO::MetaImageReader::New();
+    reader->setObject(image);
+    reader->setFile(imagePath);
+    reader->read();
+
+    ::fwVtkIO::MetaImageWriter::sptr writer = ::fwVtkIO::MetaImageWriter::New();
+    writer->setObject(image);
+    writer->setFile(testFile);
+    writer->write();
+
+    CPPUNIT_ASSERT( ::boost::filesystem::exists(testFile) );
+    CPPUNIT_ASSERT( ::boost::filesystem::exists(testZRawFile) );
+
+    CPPUNIT_ASSERT( ::fwTest::File::contentEquals(imagePath, testFile) );
+    CPPUNIT_ASSERT( ::fwTest::File::contentEquals(zRawPath, testZRawFile) );
+
+    ::boost::filesystem::remove(testFile);
+    ::boost::filesystem::remove(testZRawFile);
+
+
+
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"int8", "imageTest.mhd");
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"uint8", "imageTest.mhd");
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"int16", "imageTest.mhd");
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"uint16", "imageTest.mhd");
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"int32", "imageTest.mhd");
+    WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"uint32", "imageTest.mhd");
+    // WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"int64", "imageTest.mhd");
+    // WRITER_TEST(::fwVtkIO::MetaImageWriter,::fwVtkIO::MetaImageReader,"uint64", "imageTest.mhd");
+
+    const ::boost::filesystem::path zFile(::fwTools::System::getTemporaryFolder() / "imagetestfile.zraw");
+    ::boost::filesystem::remove(zFile);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::vtiReaderTest()
+{
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/vti/BostonTeapot.vti" );
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwVtkIO::VtiImageReader::sptr reader = ::fwVtkIO::VtiImageReader::New();
+
+    reader->setObject(image);
+    reader->setFile(imagePath);
+    reader->read();
+
+    COMPARE_IMAGE_ATTRS_MACRO(
+            bostonTeapotSize,
+            bostonTeapotSpacing,
+            bostonTeapotOrigin,
+
+            image->getSize(),
+            image->getSpacing(),
+            image->getOrigin()
+            );
+
+
+
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::vtiWriterTest()
+{
+
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"int8", "imageTest.vti");
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"uint8", "imageTest.vti");
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"int16", "imageTest.vti");
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"uint16", "imageTest.vti");
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"int32", "imageTest.vti");
+    WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"uint32", "imageTest.vti");
+    // WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"int64", "imageTest.vti");
+    // WRITER_TEST(::fwVtkIO::VtiImageWriter,::fwVtkIO::VtiImageReader,"uint64", "imageTest.vti");
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::vtkReaderTest()
+{
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk" );
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwVtkIO::ImageReader::sptr reader = ::fwVtkIO::ImageReader::New();
+
+    reader->setObject(image);
+    reader->setFile(imagePath);
+    reader->read();
+
+    ::fwData::Image::SizeType vtkSize;
+    vtkSize += 230,170,58;
+
+    ::fwData::Image::SpacingType vtkSpacing;
+    vtkSpacing += 1.732, 1.732, 3.2;
+
+    ::fwData::Image::OriginType vtkOrigin;
+    vtkOrigin += 34.64,86.6,56;
+
+    COMPARE_IMAGE_ATTRS_MACRO(
+            vtkSize,
+            vtkSpacing,
+            vtkOrigin,
+
+            image->getSize(),
+            image->getSpacing(),
+            image->getOrigin()
+            );
+
+
+#define VTK_READER_TEST(imagetype)                                                                                                                 \
+{                                                                                                                                                  \
+    const ::boost::filesystem::path testFile(::fwTest::Data::dir() / "fw4spl/image/vtk/img-" imagetype ".vtk");                                    \
+                                                                                                                                                   \
+    ::fwData::Image::sptr image = ::fwData::Image::New();                                                                                                                \
+                                                                                                                                                   \
+    ::fwVtkIO::ImageReader::sptr reader = ::fwVtkIO::ImageReader::New();                                                                                                          \
+    reader->setObject(image);                                                                                                                      \
+    reader->setFile(testFile);                                                                                                                     \
+    reader->read();                                                                                                                                \
+                                                                                                                                                   \
+    vtkSmartPointer< vtkGenericDataObjectReader > vtkreader = vtkSmartPointer< vtkGenericDataObjectReader >::New();                                \
+    vtkreader->SetFileName(testFile.string().c_str());                                                                                             \
+    vtkreader->Update();                                                                                                                           \
+    vtkSmartPointer< vtkImageData > vtkImage = vtkImageData::SafeDownCast(vtkreader->GetOutput());                                                 \
+    CPPUNIT_ASSERT_EQUAL_MESSAGE( "test on <" "fw4spl/image/vtk/img-" imagetype ".vtk" "> Failed ", ::fwTools::Type(imagetype), image->getType()); \
+                                                                                                                                                   \
+    COMPARE_IMAGE_ATTRS_MACRO(                                                                                                                     \
+            image->getSize(),                                                                                                                      \
+            image->getSpacing(),                                                                                                                   \
+            image->getOrigin(),                                                                                                                    \
+                                                                                                                                                   \
+            vtkImage->GetDimensions(),                                                                                                             \
+            vtkImage->GetSpacing(),                                                                                                                \
+            vtkImage->GetOrigin()                                                                                                                  \
+            );                                                                                                                                     \
+}
+
+
+    VTK_READER_TEST("int8"  );
+    VTK_READER_TEST("uint8" );
+    VTK_READER_TEST("int16" );
+    VTK_READER_TEST("uint16");
+    VTK_READER_TEST("int32" );
+    VTK_READER_TEST("uint32");
+    // VTK_READER_TEST("int64" );
+    // VTK_READER_TEST("uint64");
+    VTK_READER_TEST("float" );
+    VTK_READER_TEST("double");
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::vtkWriterTest()
+{
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"int8", "imageTest.vtk");
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"uint8", "imageTest.vtk");
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"int16", "imageTest.vtk");
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"uint16", "imageTest.vtk");
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"int32", "imageTest.vtk");
+    WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"uint32", "imageTest.vtk");
+    // WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"int64", "imageTest.vtk");
+    // WRITER_TEST(::fwVtkIO::ImageWriter,::fwVtkIO::ImageReader,"uint64", "imageTest.vtk");
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwVtkIO
+
diff --git a/SrcLib/io/fwVtkIO/test/tu/src/MeshTest.cpp b/SrcLib/io/fwVtkIO/test/tu/src/MeshTest.cpp
new file mode 100644
index 0000000..36383f0
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/src/MeshTest.cpp
@@ -0,0 +1,158 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <vtkPolyData.h>
+#include <vtkSphereSource.h>
+#include <vtkSmartPointer.h>
+
+#include <fwTools/System.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include <fwTest/generator/Mesh.hpp>
+#include <fwDataTools/Mesh.hpp>
+
+#include <fwVtkIO/MeshWriter.hpp>
+#include <fwVtkIO/MeshReader.hpp>
+#include <fwVtkIO/helper/Mesh.hpp>
+
+#include "MeshTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwVtkIO::ut::MeshTest );
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::testMeshToVtk()
+{
+    ::fwData::Mesh::sptr mesh1 = ::fwData::Mesh::New();
+    CPPUNIT_ASSERT( mesh1 );
+
+    vtkSmartPointer< vtkSphereSource > source = vtkSmartPointer< vtkSphereSource >::New();
+    source->SetThetaResolution(50);
+    source->SetPhiResolution(50);
+    source->SetRadius(2);
+    source->Update();
+    vtkSmartPointer< vtkPolyData > poly_source = source->GetOutput();
+
+
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfCells(), (::fwData::Mesh::Id)0);
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfPoints(), (::fwData::Mesh::Id)0);
+
+    ::fwVtkIO::helper::Mesh::fromVTKMesh(poly_source, mesh1);
+
+    CPPUNIT_ASSERT( mesh1->getNumberOfCells() );
+    CPPUNIT_ASSERT( mesh1->getNumberOfPoints() );
+
+    vtkSmartPointer< vtkPolyData > vtkMesh = vtkSmartPointer< vtkPolyData >::New();
+    ::fwVtkIO::helper::Mesh::toVTKMesh( mesh1, vtkMesh);
+    CPPUNIT_ASSERT( vtkMesh );
+
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfVerts(), vtkMesh->GetNumberOfVerts());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfLines(), vtkMesh->GetNumberOfLines());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfPolys(), vtkMesh->GetNumberOfPolys());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfStrips(), vtkMesh->GetNumberOfStrips());
+
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    CPPUNIT_ASSERT( mesh2 );
+    ::fwVtkIO::helper::Mesh::fromVTKMesh(vtkMesh, mesh2);
+
+    compare(mesh1, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::testSyntheticMesh()
+{
+    ::fwData::Mesh::sptr mesh1 = ::fwData::Mesh::New();
+    ::fwTest::generator::Mesh::generateTriangleQuadMesh(mesh1);
+    ::fwDataTools::Mesh::shakePoint(mesh1);
+    mesh1->adjustAllocatedMemory();
+
+    vtkSmartPointer< vtkPolyData > poly = vtkSmartPointer< vtkPolyData >::New();
+    ::fwVtkIO::helper::Mesh::toVTKMesh( mesh1, poly);
+    CPPUNIT_ASSERT( poly );
+
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    ::fwVtkIO::helper::Mesh::fromVTKMesh(poly, mesh2);
+
+    compare(mesh1, mesh2);
+}
+
+//------------------------------------------------------------------------------
+
+void MeshTest::testExportImportSyntheticMesh()
+{
+    ::fwData::Mesh::sptr mesh1 = ::fwData::Mesh::New();
+    ::fwTest::generator::Mesh::generateTriangleQuadMesh(mesh1);
+    ::fwDataTools::Mesh::shakePoint(mesh1);
+    ::fwDataTools::Mesh::colorizeMeshPoints(mesh1);
+    ::fwDataTools::Mesh::colorizeMeshCells(mesh1);
+    ::fwDataTools::Mesh::generatePointNormals(mesh1);
+    ::fwDataTools::Mesh::generateCellNormals(mesh1);
+
+    mesh1->adjustAllocatedMemory();
+
+    ::boost::filesystem::path testFile = ::fwTools::System::getTemporaryFolder() / "testExportImportSyntheticMesh.vtk";
+
+    ::fwVtkIO::MeshWriter::sptr writer = ::fwVtkIO::MeshWriter::New();
+    writer->setObject(mesh1);
+    writer->setFile(testFile);
+    writer->write();
+    CPPUNIT_ASSERT(::boost::filesystem::exists(testFile));
+
+    ::fwData::Mesh::sptr mesh2 = ::fwData::Mesh::New();
+    ::fwVtkIO::MeshReader::sptr reader = ::fwVtkIO::MeshReader::New();
+    reader->setObject(mesh2);
+    reader->setFile(testFile);
+    reader->read();
+
+    compare(mesh1, mesh2);
+
+    bool suppr = ::boost::filesystem::remove(testFile);
+    CPPUNIT_ASSERT(suppr);
+}
+
+} // namespace ut
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/test/tu/src/SeriesDBTest.cpp b/SrcLib/io/fwVtkIO/test/tu/src/SeriesDBTest.cpp
new file mode 100644
index 0000000..a7c86ca
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/src/SeriesDBTest.cpp
@@ -0,0 +1,191 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+
+#include <fwMemory/BufferManager.hpp>
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwData/Reconstruction.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Array.hpp>
+
+#include <fwMedData/Series.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTest/Data.hpp>
+
+#include <fwVtkIO/SeriesDBReader.hpp>
+
+#include "SeriesDBTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwVtkIO::ut::SeriesDBTest );
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::testImportSeriesDB()
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk" );
+    const ::boost::filesystem::path meshPath( ::fwTest::Data::dir() / "fw4spl/mesh/vtk/sphere.vtk" );
+
+    CPPUNIT_ASSERT_MESSAGE(std::string("Missing file: ") + imagePath.string(), ::boost::filesystem::exists(imagePath));
+    CPPUNIT_ASSERT_MESSAGE(std::string("Missing file: ") + meshPath.string(), ::boost::filesystem::exists(meshPath));
+
+    ::fwData::location::ILocation::VectPathType paths;
+    paths.push_back(imagePath);
+    paths.push_back(meshPath);
+    paths.push_back(meshPath);
+
+    ::fwVtkIO::SeriesDBReader::sptr reader = ::fwVtkIO::SeriesDBReader::New();
+    reader->setObject(seriesDB);
+    reader->setFiles(paths);
+    reader->read();
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2), seriesDB->getContainer().size());
+
+    ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(seriesDB->at(0));
+    CPPUNIT_ASSERT_MESSAGE("ImageSeries dynamicCast failed", imgSeries);
+
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(seriesDB->at(1));
+    CPPUNIT_ASSERT_MESSAGE("ModelSeries dynamicCast failed", modelSeries);
+
+    ::fwMedData::ModelSeries::ReconstructionVectorType recVect = modelSeries->getReconstructionDB();
+    CPPUNIT_ASSERT_EQUAL(size_t(2), recVect.size());
+
+    ::fwData::Reconstruction::sptr rec1 = recVect.at(0);
+    ::fwData::Reconstruction::sptr rec2 = recVect.at(0);
+
+    CPPUNIT_ASSERT_EQUAL(std::string("sphere"), rec1->getOrganName());
+    CPPUNIT_ASSERT_EQUAL(std::string("sphere"), rec2->getOrganName());
+
+    ::fwData::Mesh::sptr mesh1 = rec1->getMesh();
+    ::fwData::Mesh::sptr mesh2 = rec1->getMesh();
+
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfCells(), (::fwData::Mesh::Id)720);
+    CPPUNIT_ASSERT_EQUAL(mesh1->getNumberOfPoints(), (::fwData::Mesh::Id)362);
+
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(mesh1, mesh2);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+bool isLoaded(::fwMemory::BufferObject::sptr bo)
+{
+    ::fwMemory::BufferManager::csptr manager = ::fwMemory::BufferManager::getDefault();
+    const ::fwMemory::BufferManager::BufferInfoMapType mapInfos =  manager->getBufferInfos().get();
+
+    ::fwMemory::BufferManager::BufferInfoMapType::const_iterator iter = mapInfos.find(bo->getBufferPointer());
+    CPPUNIT_ASSERT_MESSAGE("BufferInfo not found.", iter != mapInfos.end());
+    const ::fwMemory::BufferInfo& info = iter->second;
+
+    return info.loaded;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::testLazyImportSeriesDB()
+{
+    ::fwMemory::BufferManager::sptr manager = ::fwMemory::BufferManager::getDefault();
+    {
+        ::fwCore::mt::WriteLock lock( manager->getMutex() );
+        manager->setLoadingMode(::fwMemory::BufferManager::LAZY);
+    }
+
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    const ::boost::filesystem::path imagePath( ::fwTest::Data::dir() / "fw4spl/image/vtk/img.vtk" );
+    const ::boost::filesystem::path meshPath( ::fwTest::Data::dir() / "fw4spl/mesh/vtk/sphere.vtk" );
+
+    CPPUNIT_ASSERT_MESSAGE(std::string("Missing file: ") + imagePath.string(), ::boost::filesystem::exists(imagePath));
+    CPPUNIT_ASSERT_MESSAGE(std::string("Missing file: ") + meshPath.string(), ::boost::filesystem::exists(meshPath));
+
+    ::fwData::location::ILocation::VectPathType paths;
+    paths.push_back(imagePath);
+    paths.push_back(meshPath);
+
+
+    ::fwVtkIO::SeriesDBReader::sptr reader = ::fwVtkIO::SeriesDBReader::New();
+    reader->setObject(seriesDB);
+    reader->setFiles(paths);
+    reader->setLazyMode(true);
+    reader->read();
+
+
+    CPPUNIT_ASSERT_EQUAL(size_t(2), seriesDB->getContainer().size());
+
+    //check ImageSeries
+    {
+        ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(seriesDB->at(0));
+        CPPUNIT_ASSERT_MESSAGE("ImageSeries dynamicCast failed", imgSeries);
+
+        ::fwMemory::BufferObject::sptr bo = imgSeries->getImage()->getDataArray()->getBufferObject();
+        CPPUNIT_ASSERT_MESSAGE("ImageSeries is not lazy-loaded", !isLoaded(bo));
+
+        ::fwMemory::BufferObject::Lock lock = bo->lock();
+
+        CPPUNIT_ASSERT_MESSAGE("ImageSeries is still lazy-loaded", isLoaded(bo));
+    }
+
+    //check ModelSeries
+    {
+        ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(seriesDB->at(1));
+        CPPUNIT_ASSERT_MESSAGE("ModelSeries dynamicCast failed", modelSeries);
+
+        ::fwMedData::ModelSeries::ReconstructionVectorType recVect = modelSeries->getReconstructionDB();
+        CPPUNIT_ASSERT_EQUAL(size_t(1), recVect.size());
+
+        ::fwData::Mesh::sptr mesh = recVect[0]->getMesh();
+
+        ::fwMemory::BufferObject::sptr points = mesh->getPointsArray()->getBufferObject();
+        CPPUNIT_ASSERT_MESSAGE("ModelSeries points are lazy-loaded", isLoaded(points));
+
+        ::fwMemory::BufferObject::sptr cell = mesh->getCellDataArray()->getBufferObject();
+        CPPUNIT_ASSERT_MESSAGE("ModelSeries cells are lazy-loaded", isLoaded(cell));
+    }
+
+    {
+        ::fwCore::mt::WriteLock lock( manager->getMutex() );
+        manager->setLoadingMode(::fwMemory::BufferManager::DIRECT);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/test/tu/src/TransferFunctionTest.cpp b/SrcLib/io/fwVtkIO/test/tu/src/TransferFunctionTest.cpp
new file mode 100644
index 0000000..25187be
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/src/TransferFunctionTest.cpp
@@ -0,0 +1,157 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/TransferFunction.hpp>
+
+#include <fwVtkIO/helper/TransferFunction.hpp>
+
+#include "TransferFunctionTest.hpp"
+
+using fwVtkIO::helper::TransferFunction;
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwVtkIO::ut::TransferFunctionTest );
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr TransferFunctionTest::createTFColor()
+{
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+
+    tf->setBackgroundColor( ::fwData::TransferFunction::TFColor( 1.0, 0.3, 0.6, 0.1) );
+    tf->setInterpolationMode( ::fwData::TransferFunction::LINEAR );
+    tf->setIsClamped( false );
+    tf->setLevel( 0.0 );
+    tf->setName( "TFColor" );
+    tf->setWindow( 400.0 );
+
+    tf->addTFColor( -200,   ::fwData::TransferFunction::TFColor( 1.0, 0.0, 0.0, 0.0) );
+    tf->addTFColor( 0,      ::fwData::TransferFunction::TFColor( 0.0, 1.0, 0.0, 0.0) );
+    tf->addTFColor( 100,     ::fwData::TransferFunction::TFColor( 0.0, 0.0, 1.0, 0.5) );
+    tf->addTFColor( 200,    ::fwData::TransferFunction::TFColor( 0.0, 1.0, 1.0, 1.0) );
+
+    return tf;
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::toVtkLookupTableTest()
+{
+    ::fwData::TransferFunction::sptr tf = this->createTFColor();
+    vtkSmartPointer<vtkLookupTable> lt = vtkSmartPointer<vtkLookupTable>::New();
+
+    double color[3];
+    double opacity;
+    double colorTolerance = 1.0/255.0;
+
+    ::fwVtkIO::helper::TransferFunction::toVtkLookupTable( tf, lt, true, 4096 );
+    lt->GetColor( 0, color);
+    opacity = lt->GetOpacity(0);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, opacity  , colorTolerance );
+
+    lt->GetColor(200,color);
+    opacity = lt->GetOpacity(200);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, opacity  , colorTolerance );
+
+    lt->GetColor(150,color);
+    opacity = lt->GetOpacity(150);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.75, opacity  , colorTolerance );
+
+    tf->setInterpolationMode( ::fwData::TransferFunction::NEAREST );
+    ::fwVtkIO::helper::TransferFunction::toVtkLookupTable( tf, lt, true, 4096 );
+    lt->GetColor(120,color);
+    opacity = lt->GetOpacity(120);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, opacity  , colorTolerance );
+
+//    tf->setLevel(200);
+//    ::fwVtkIO::helper::TransferFunction::toVtkLookupTable( tf, lt, true, 4096 );
+//    lt->GetColor(200,color);
+//    opacity = lt->GetOpacity(200);
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[1] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[2] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, opacity  , colorTolerance );
+//
+//    tf->setLevel(0);
+//    tf->setWindow(800);
+//    ::fwVtkIO::helper::TransferFunction::toVtkLookupTable( tf, lt, true, 4096 );
+//    lt->GetColor(200,color);
+//    opacity = lt->GetOpacity(200);
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[1] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[2] , colorTolerance );
+//    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, opacity  , colorTolerance );
+
+}
+
+//------------------------------------------------------------------------------
+
+void TransferFunctionTest::toBWVtkLookupTableTest()
+{
+    vtkSmartPointer<vtkLookupTable> lt = vtkSmartPointer<vtkLookupTable>::New();
+    ::fwVtkIO::helper::TransferFunction::toBWVtkLookupTable( 0.0, 100.0, lt, 4096 );
+
+    double color[3];
+    double opacity;
+    double colorTolerance = 1.0/255.0;
+
+    lt->GetColor(0,color);
+    opacity = lt->GetOpacity(0);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, opacity  , colorTolerance );
+
+    lt->GetColor(100,color);
+    opacity = lt->GetOpacity(100);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, opacity  , colorTolerance );
+
+    lt->GetColor(50,color);
+    opacity = lt->GetOpacity(50);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, color[0] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, color[1] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.5, color[2] , colorTolerance );
+    CPPUNIT_ASSERT_DOUBLES_EQUAL( 1.0, opacity  , colorTolerance );
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwVtkIO
diff --git a/SrcLib/io/fwVtkIO/test/tu/src/TrianTest.cpp b/SrcLib/io/fwVtkIO/test/tu/src/TrianTest.cpp
new file mode 100644
index 0000000..7a464a2
--- /dev/null
+++ b/SrcLib/io/fwVtkIO/test/tu/src/TrianTest.cpp
@@ -0,0 +1,85 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <vtkPolyData.h>
+#include <vtkSphereSource.h>
+#include <vtkSmartPointer.h>
+
+#include <fwData/TriangularMesh.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+
+#include "TrianTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwVtkIO::ut::TrianTest );
+
+namespace fwVtkIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void TrianTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void TrianTest::testTrianToVtk()
+{
+    ::fwData::TriangularMesh::sptr trian1 = ::fwData::TriangularMesh::New();
+    CPPUNIT_ASSERT( trian1 );
+
+    vtkSmartPointer< vtkSphereSource > source = vtkSmartPointer< vtkSphereSource >::New();
+    source->SetThetaResolution(50);
+    source->SetPhiResolution(50);
+    source->SetRadius(2);
+    source->Update();
+    vtkSmartPointer< vtkPolyData > poly_source = source->GetOutput();
+
+    CPPUNIT_ASSERT( trian1->cells().empty() );
+    CPPUNIT_ASSERT( trian1->points().empty() );
+
+    ::fwVtkIO::fromVTKMesh(poly_source, trian1);
+
+    CPPUNIT_ASSERT( !trian1->cells().empty() );
+    CPPUNIT_ASSERT( !trian1->points().empty() );
+
+    vtkPolyData *mesh = ::fwVtkIO::toVTKMesh( trian1 );
+    CPPUNIT_ASSERT( mesh );
+
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfVerts(), mesh->GetNumberOfVerts());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfLines(), mesh->GetNumberOfLines());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfPolys(), mesh->GetNumberOfPolys());
+    CPPUNIT_ASSERT_EQUAL(poly_source->GetNumberOfStrips(), mesh->GetNumberOfStrips());
+
+
+    ::fwData::TriangularMesh::sptr trian2 = ::fwData::TriangularMesh::New();
+    CPPUNIT_ASSERT( trian2 );
+    ::fwVtkIO::fromVTKMesh(mesh, trian2);
+
+    CPPUNIT_ASSERT_EQUAL(trian1->getNumCells(),  trian2->getNumCells());
+    CPPUNIT_ASSERT_EQUAL(trian1->getNumPoints(), trian2->getNumPoints());
+    CPPUNIT_ASSERT(trian1->points() == trian2->points());
+    CPPUNIT_ASSERT(trian1->cells() ==  trian2->cells());
+
+    mesh->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace fwVtkIO
diff --git a/SrcLib/io/vtkGdcmIO/CMakeLists.txt b/SrcLib/io/vtkGdcmIO/CMakeLists.txt
new file mode 100644
index 0000000..a22ef8c
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/CMakeLists.txt
@@ -0,0 +1,26 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwData
+    fwDataIO
+    fwMemory
+    fwTools
+)
+
+
+find_package(Boost COMPONENTS filesystem REQUIRED)
+find_package(GDCM REQUIRED)
+include(${GDCM_USE_FILE})
+
+fwForwardInclude(
+    ${BOOST_INCLUDE_DIRS}
+    ${GDCM_INCLUDE_DIRS}
+    )
+fwLink(
+    ${GDCM_LIBRARIES}
+    vtkgdcm
+    gdcmMSFF
+    gdcmDSED
+    gdcmCommon
+    )
+
diff --git a/SrcLib/io/vtkGdcmIO/Properties.cmake b/SrcLib/io/vtkGdcmIO/Properties.cmake
new file mode 100644
index 0000000..ab78797
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME vtkGdcmIO )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCore fwData fwDataIO fwMedData fwMemory fwTools fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/vtkGdcmIO/bin/build.options b/SrcLib/io/vtkGdcmIO/bin/build.options
new file mode 100644
index 0000000..21ac864
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/bin/build.options
@@ -0,0 +1,13 @@
+TYPE='shared'
+LIB = [
+       'fwData_0-1',
+       'fwMedData_0-1',
+       'fwCore_0-1',
+       'fwDataIO_0-2',
+       'fwTools_0-1',
+       'fwComEd_0-1',
+       'fwVtkIO_0-1'
+       ]
+VERSION = '0-1'
+USE = ['boost', 'boostFilesystem', 'boostDateTime','vtkgdcm']
+
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/ImageSeriesWriter.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/ImageSeriesWriter.hpp
new file mode 100644
index 0000000..f756213
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/ImageSeriesWriter.hpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_IMAGESERIESWRITER_HPP__
+#define __VTKGDCMIO_IMAGESERIESWRITER_HPP__
+
+#include <fwDataIO/writer/GenericObjectWriter.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwTools/ProgressAdviser.hpp>
+
+#include "vtkGdcmIO/config.hpp"
+
+namespace fwMedData
+{
+class ImageSeries;
+}
+
+namespace vtkGdcmIO
+{
+
+/**
+ * @brief Write an ImageSeries in DICOM format.
+ * @class ImageSeriesWriter
+ */
+class ImageSeriesWriter : public ::fwDataIO::writer::GenericObjectWriter< ::fwMedData::ImageSeries >,
+                             public ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro((ImageSeriesWriter)( ::fwDataIO::writer::GenericObjectWriter< ::fwMedData::ImageSeries>),
+                                           (()),
+                                           ::fwDataIO::writer::factory::New< ImageSeriesWriter >
+                                          );
+    fwCoreAllowSharedFromThis();
+
+    /// Constructor. Does nothing
+    VTKGDCMIO_API ImageSeriesWriter(::fwDataIO::writer::IObjectWriter::Key key);
+
+    /// Write the image series in DICOM format.
+    VTKGDCMIO_API void write();
+
+    /// Return an empty string
+    VTKGDCMIO_API std::string  extension();
+};
+
+} // namespace vtkGdcmIO
+
+#endif // __VTKGDCMIO_IMAGESERIESWRITER_HPP__
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBLazyReader.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBLazyReader.hpp
new file mode 100644
index 0000000..8d1a61a
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBLazyReader.hpp
@@ -0,0 +1,119 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_SERIESDBLAZYREADER_HPP__
+#define __VTKGDCMIO_SERIESDBLAZYREADER_HPP__
+
+#include <gdcmScanner.h>
+
+#include <fwCore/macros.hpp>
+
+#include <fwTools/ProgressAdviser.hpp>
+
+#include <fwData/Image.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+
+#include "vtkGdcmIO/config.hpp"
+
+namespace fwMedData
+{
+class SeriesDB;
+class Equipment;
+class ImageSeries;
+class Patient;
+class Series;
+class SeriesDB;
+class Study;
+}
+
+namespace vtkGdcmIO
+{
+
+/**
+ * @class SeriesDBLazyReader
+ *
+ * @brief Reads DICOM data from a directory path in order to create a SeriesDB object in lazy mode.
+ */
+class SeriesDBLazyReader : public ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >,
+                             public ::fwData::location::enableFolder< ::fwDataIO::reader::IObjectReader > ,
+                             public ::fwData::location::enableMultiFiles< ::fwDataIO::reader::IObjectReader > ,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    typedef std::vector< std::string > SeriesFilesType;
+
+    typedef std::map< std::string, SeriesFilesType > MapSeriesType;
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+                    (SeriesDBLazyReader)( ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >),
+                    (()),
+                    ::fwDataIO::reader::factory::New< SeriesDBLazyReader >
+                    );
+
+    fwCoreAllowSharedFromThis();
+
+    /// Does nothing
+    VTKGDCMIO_API SeriesDBLazyReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    /// Does nothing
+    VTKGDCMIO_API ~SeriesDBLazyReader();
+
+    /// Reads DICOM data from configured path and fills SeriesDB object. Use lazy reading process to read images.
+    VTKGDCMIO_API void read();
+
+private :
+
+    /**
+     * @brief Creates a SeriesDB from the data contained in the given directory path.
+     *
+     * @param directory path from which data is read
+     *
+     * @return a new SeriesDB object
+     */
+    SPTR( ::fwMedData::SeriesDB ) createSeriesDB( const ::boost::filesystem::path &dicomDir );
+
+    /**
+     * @brief Fills the related SeriesDB object with DICOM data extracted from the given files.
+     *
+     * @param seriesDB SeriesDB object to be filled with DICOM data
+     * @param filenames files to extract DICOM data from
+     */
+    void addSeries( const SPTR( ::fwMedData::SeriesDB ) &seriesDB, const std::vector< std::string > &filenames);
+
+    /// Tries estimating Z spacing of an image dicom, returns 0 if it is not a success
+    double computeZSpacing( const SeriesFilesType & seriesFiles );
+
+    /// Searches and sets image information: window/center, correct spacing after preprocessImage(not read image buffer)
+    void fillImage( gdcm::Scanner & scanner, const SeriesFilesType & seriesFiles,
+                    const std::string & dcmFile, ::fwData::Image::sptr img );
+
+    /// Searches and sets another image information ( origin, spacing, type, size, nbComponent )
+    void preprocessImage( const ::fwData::Image::sptr & img, const SeriesFilesType & files );
+
+    /// Searches and sets equipment information
+    void fillEquipment( gdcm::Scanner & scanner, const std::string & dcmFile, SPTR( ::fwMedData::Equipment ) equipment);
+
+    /// Searches and sets study information
+    void fillStudy( gdcm::Scanner & scanner, const std::string & dcmFile, SPTR( ::fwMedData::Study ) study );
+
+    /// Searches and sets patient information
+    void fillPatient( gdcm::Scanner & scanner, const std::string & dcmFile, SPTR( ::fwMedData::Patient ) patient );
+
+    /// Searches and sets series information
+    void fillSeries( gdcm::Scanner & scanner, const std::string & dcmFile, SPTR( ::fwMedData::Series ) series );
+
+    /// Select some dicom tags and scan information in all filenames
+    void scanFiles( gdcm::Scanner & scanner, const std::vector< std::string > & filenames );
+};
+
+} // namespace vtkGdcmIO
+
+#endif // __VTKGDCMIO_SERIESDBLAZYREADER_HPP__
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBReader.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBReader.hpp
new file mode 100644
index 0000000..c72c3dc
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/SeriesDBReader.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_SERIESDBREADER_HPP__
+#define __VTKGDCMIO_SERIESDBREADER_HPP__
+
+
+#include <fwTools/ProgressAdviser.hpp>
+#include <fwDataIO/reader/GenericObjectReader.hpp>
+#include <fwData/location/Folder.hpp>
+#include <fwData/location/MultiFiles.hpp>
+
+#include "vtkGdcmIO/config.hpp"
+namespace fwMedData
+{
+class SeriesDB;
+}
+
+
+namespace vtkGdcmIO
+{
+
+/**
+ * @class SeriesDBReader
+ *
+ * @brief Reads DICOM data from a directory path in order to create a SeriesDB object.
+ */
+class SeriesDBReader : public ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >,
+                             public ::fwData::location::enableFolder< ::fwDataIO::reader::IObjectReader > ,
+                             public ::fwData::location::enableMultiFiles< ::fwDataIO::reader::IObjectReader > ,
+                             public ::fwTools::ProgressAdviser
+{
+
+public :
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+                    (SeriesDBReader)( ::fwDataIO::reader::GenericObjectReader< ::fwMedData::SeriesDB >),
+                    (()),
+                    ::fwDataIO::reader::factory::New< SeriesDBReader >
+                    );
+    fwCoreAllowSharedFromThis();
+
+    VTKGDCMIO_API SeriesDBReader(::fwDataIO::reader::IObjectReader::Key key);
+
+    VTKGDCMIO_API ~SeriesDBReader();
+
+    /**
+     * @brief Reads DICOM data from configured path and fills SeriesDB object.
+     */
+    VTKGDCMIO_API void read();
+
+private :
+
+    /**
+     * @brief Creates a SeriesDB from the data contained in the given directory path.
+     *
+     * @param directory path from which data is read
+     *
+     * @return a new SeriesDB object
+     */
+    SPTR( ::fwMedData::SeriesDB ) createSeriesDB( const ::boost::filesystem::path &dicomDir );
+
+    /**
+     * @brief Fills the related SeriesDB object with DICOM data extracted from the given files.
+     *
+     * @param seriesDB SeriesDB object to be filled with DICOM data
+     * @param filenames files to extract DICOM data from
+     */
+    void addSeries( const SPTR( ::fwMedData::SeriesDB ) &seriesDB, const std::vector< std::string > &filenames);
+
+};
+
+} // namespace vtkGdcmIO
+
+#endif /*__VTKGDCMIO_SERIESDBREADER_HPP__*/
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/config.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/config.hpp
new file mode 100644
index 0000000..ab355c3
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/config.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_CONFIG_HPP__
+#define __VTKGDCMIO_CONFIG_HPP__
+
+
+#ifdef _WIN32
+
+    #ifdef VTKGDCMIO_EXPORTS
+    #define VTKGDCMIO_API __declspec(dllexport)
+    #define VTKGDCMIO_TEMPLATE_API
+    #else
+    #define VTKGDCMIO_API __declspec(dllimport)
+    #define VTKGDCMIO_TEMPLATE_API extern
+    #endif
+
+    #define VTKGDCMIO_CLASS_API
+
+    #pragma warning(disable: 4290)
+    #pragma warning(disable: 4800) // avoid waring on return hard coded value
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef VTKGDCMIO_EXPORTS
+        #define VTKGDCMIO_API __attribute__ ((visibility("default")))
+        #define VTKGDCMIO_CLASS_API __attribute__ ((visibility("default")))
+        #define VTKGDCMIO_TEMPLATE_API
+        #else
+        //#define VTKGDCMIO_API __attribute__ ((visibility("hidden")))
+        //#define VTKGDCMIO_CLASS_API __attribute__ ((visibility("hidden")))
+        #define VTKGDCMIO_API
+        #define VTKGDCMIO_CLASS_API
+        #define VTKGDCMIO_TEMPLATE_API extern
+        #endif
+
+#else
+
+        #define VTKGDCMIO_API
+        #define VTKGDCMIO_CLASS_API
+        #define VTKGDCMIO_TEMPLATE_API
+
+#endif
+
+
+#endif //__VTKGDCMIO_CONFIG_HPP__
+
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/GdcmHelper.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/GdcmHelper.hpp
new file mode 100644
index 0000000..8374cbe
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/GdcmHelper.hpp
@@ -0,0 +1,36 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_GDCMHELPER_HPP__
+#define __VTKGDCMIO_GDCMHELPER_HPP__
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem.hpp>
+
+#include "vtkGdcmIO/config.hpp"
+
+namespace vtkGdcmIO
+{
+namespace helper
+{
+
+/**
+ * @brief   This class contains helpers to search dicom files on filesystem...
+ * @class   DicomSearch
+ * 
+ * @date    2011.
+ */
+class VTKGDCMIO_CLASS_API DicomSearch
+{
+public:
+    VTKGDCMIO_API static void searchRecursivelyFiles(const ::boost::filesystem::path &dirPath, std::vector<std::string>& dicomFiles);
+    static bool compare(std::string & _strOrgin, std::vector<std::string> * vecStr);
+};
+
+} // namespace helper
+} // namespace vtkGdcmIO
+
+#endif /*__VTKGDCMIO_GDCMHELPER_HPP__*/
diff --git a/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/ImageDicomStream.hpp b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/ImageDicomStream.hpp
new file mode 100644
index 0000000..d00964d
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/include/vtkGdcmIO/helper/ImageDicomStream.hpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __VTKGDCMIO_HELPER_IMAGEDICOMSTREAM_HPP__
+#define __VTKGDCMIO_HELPER_IMAGEDICOMSTREAM_HPP__
+
+#include <vector>
+
+#include <boost/iostreams/stream.hpp>
+
+#include <vtkSmartPointer.h>
+#include <vtkGDCMImageReader.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwMemory/stream/in/IFactory.hpp>
+
+#include "vtkGdcmIO/config.hpp"
+
+namespace vtkGdcmIO
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+/// Basic class to store some information to read an dicom image
+class ImageDicomInfo
+{
+
+public :
+
+    typedef std::vector< std::string > SeriesFilesType;
+
+    typedef SPTR( ImageDicomInfo ) sptr;
+
+    /// Size of image buffer in bytes
+    size_t m_buffSizeInBytes;
+
+    /// Dicom files that represents an image series
+    SeriesFilesType m_seriesFiles;
+};
+
+//------------------------------------------------------------------------------
+
+/// Class used to build an std::istream thanks to ::boost::iostreams api
+class ImageDicomSource
+{
+public:
+
+    typedef char char_type;
+
+    typedef ::boost::iostreams::source_tag  category;
+
+    /// Constructor
+    ImageDicomSource( ImageDicomInfo::sptr dcmInfo );
+
+    /// Method to read n bytes in dicom buffer and write it in s. On the first call, readImage() method is called.
+    std::streamsize read(char* s, std::streamsize n);
+
+private :
+
+    /**
+     * @brief Helper to read with vtk and gdcm a dicom image, sets m_reader, m_inputReader and m_success
+     * if reading process is ok.
+     */
+    bool readImage();
+
+    /// Data to store information
+    ImageDicomInfo::sptr m_dcmInfo;
+
+    /// to conserve the position in m_inputReader of bytes already read
+    size_t m_pos;
+
+    /// reader used to read dicom image buffer, it will reset when reading process will finished
+    vtkSmartPointer< vtkGDCMImageReader > m_reader;
+
+    /// direct pointer to raw dicom image buffer
+    char * m_inputReader;
+
+    /// to conserve if reading process is a succes
+    bool m_success;
+};
+
+//------------------------------------------------------------------------------
+
+/// Class to perform a lazy reading on dicom image with fw4spl system
+class ImageDicomStream : public ::fwMemory::stream::in::IFactory
+{
+
+public:
+
+    /// Builds the ::fwMemory::stream::in::IFactory with few dicom information
+    ImageDicomStream( ImageDicomInfo::sptr dcmInfo );
+
+protected:
+
+    /// Returns the istream on dicom image buffer
+    SPTR(std::istream) get();
+
+    /// To conserve dicom information
+    ImageDicomInfo::sptr m_dcmInfo;
+};
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace vtkGdcmIO
+
+#endif // __VTKGDCMIO_HELPER_IMAGEDICOMSTREAM_HPP__
diff --git a/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/ImageSeriesWriter.cpp b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/ImageSeriesWriter.cpp
new file mode 100644
index 0000000..c087a12
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/ImageSeriesWriter.cpp
@@ -0,0 +1,242 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem.hpp>
+
+#include <iostream>
+#include <time.h>
+
+#include <vtkImageData.h>
+#include <vtkStringArray.h>
+#include <vtkSmartPointer.h>
+
+#include <vtkGDCMImageWriter.h>
+#include <vtkMedicalImageProperties.h>
+#include <gdcmFilenameGenerator.h>
+#include <gdcmDicts.h>
+#include <gdcmGlobal.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/IntrinsicTypes.hpp>
+#include <fwTools/DynamicTypeKeyTypeMapping.hpp>
+#include <fwTools/Dispatcher.hpp>
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include <fwDataIO/writer/registry/macros.hpp>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/ProgressVtkToFw.hpp>
+
+#include "vtkGdcmIO/ImageSeriesWriter.hpp"
+
+
+
+fwDataIOWriterRegisterMacro( ::vtkGdcmIO::ImageSeriesWriter );
+
+
+namespace vtkGdcmIO
+{
+
+void setValue(vtkMedicalImageProperties *medprop,
+              const ::boost::uint16_t group,
+              const ::boost::uint16_t element,
+              const std::string &value)
+{
+    const gdcm::Global & g = gdcm::Global::GetInstance();
+    const gdcm::Dicts & ds = g.GetDicts();
+
+    const gdcm::Tag tag(group,element);
+    const gdcm::DictEntry & dicEntry = ds.GetDictEntry( tag );
+    medprop->AddUserDefinedValue( dicEntry.GetName(), value.c_str() );
+}
+
+//------------------------------------------------------------------------------
+
+ImageSeriesWriter::ImageSeriesWriter(::fwDataIO::writer::IObjectWriter::Key key) :
+        ::fwData::location::enableFolder< ::fwDataIO::writer::IObjectWriter >(this)
+{
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesWriter::write()
+{
+    ::fwMedData::ImageSeries::sptr imgSeries = this->getConcreteObject();
+    ::fwData::Image::sptr dataImage = imgSeries->getImage();
+    ::fwMedData::Patient::sptr patient = imgSeries->getPatient();
+    ::fwMedData::Study::sptr study = imgSeries->getStudy();
+    ::fwMedData::Equipment::sptr equipment = imgSeries->getEquipment();
+
+    // Vtk Conversion
+    vtkSmartPointer< vtkImageData > vtkImage = vtkSmartPointer< vtkImageData >::New();
+    ::fwVtkIO::toVTKImage( dataImage, vtkImage );
+
+    ::boost::filesystem::path outputDirectory = this->getFolder();
+    FW_RAISE_IF("'" << outputDirectory << "' is not a directory.",
+                !::boost::filesystem::is_directory( outputDirectory ) );
+
+    // Generate filenames
+    const std::string gdcmfile = ( outputDirectory / "image_" ).string() + "%01d.dcm";
+    ::gdcm::FilenameGenerator fg;
+    fg.SetPattern( gdcmfile.c_str() );
+    int nfiles = vtkImage->GetDimensions()[2];
+    fg.SetNumberOfFilenames( nfiles );
+
+    bool isGenerated = fg.Generate();
+    FW_RAISE_IF("Filename generation failed.", !isGenerated);
+
+    vtkStringArray *filenames = vtkStringArray::New();
+    for(unsigned int i = 0; i < fg.GetNumberOfFilenames(); ++i)
+    {
+        filenames->InsertNextValue( fg.GetFilename(i) );
+    }
+
+    // Medical informations
+    vtkMedicalImageProperties * medprop = vtkMedicalImageProperties::New();
+
+    // Patient name
+    // tagkey = "0010|0010";
+    medprop->SetPatientName(patient->getName().c_str());
+
+    // Patient sex
+    // tagkey = "0010|0040";
+    medprop->SetPatientSex(patient->getSex().c_str());
+
+    // Modality
+    // tagkey = "0008|0060";
+    std::string modality = imgSeries->getModality();
+    if(modality.empty())
+    {
+        modality = "OT";
+    }
+    medprop->SetModality(modality.c_str());
+
+    // Zone
+    // tagkey = "0008|1030";
+    medprop->SetStudyDescription(study->getDescription().c_str());
+    medprop->SetSeriesDescription(imgSeries->getDescription().c_str());
+
+    // ID
+    // tagkey =  "0010|0020";
+    medprop->SetPatientID(patient->getPatientId().c_str());
+
+    // Birthdate
+    // tagkey = "0010|0030";
+    medprop->SetPatientBirthDate(patient->getBirthdate().c_str());
+
+    // Hospital
+    // tagkey = "0008|0080";
+    medprop->SetInstitutionName(equipment->getInstitutionName().c_str());
+
+    // Patient age
+    // Format: nnnD, nnW, nnnM or nnnY (eventually nnD, nnW, nnY)
+    //         with D (day), M (month), W (week), Y (year)
+    // For ex: DICOM (0010,1010) = 031Y
+    medprop->SetPatientAge(study->getPatientAge().c_str());
+
+    // Study Date
+    // tagkey = "0008|0020";
+    medprop->SetStudyDate(study->getDate().c_str());
+
+    // Study Time
+    // tagkey = "0008|0030";
+//    medprop->SetStudyTime(study->getTime().c_str()); // Do not work (write current time)
+    setValue(medprop, 0x0008, 0x0030, study->getTime());
+
+    //Series Date
+    setValue(medprop, 0x0008, 0x0021, imgSeries->getDate());
+
+    // Series Time
+    setValue(medprop, 0x0008, 0x0031, imgSeries->getTime());
+
+    ::fwMedData::DicomValuesType performingPhysicians = imgSeries->getPerformingPhysiciansName();
+    std::stringstream physicians;
+    if (!performingPhysicians.empty())
+    {
+        ::fwMedData::DicomValuesType::const_iterator itr = performingPhysicians.begin();
+
+        physicians << *itr++;
+        for (; itr < performingPhysicians.end() ; ++itr)
+        {
+            physicians << "\\" << *itr;
+        }
+
+    }
+    setValue(medprop, 0x0008, 0x1050, physicians.str());
+
+    setValue(medprop, 0x0008, 0x0090, study->getReferringPhysicianName());
+
+    // Center and Width
+    // Center = tagkey = "0028|1050";
+    // Width = "0028|1051";
+    medprop->AddWindowLevelPreset( dataImage->getWindowWidth(), dataImage->getWindowCenter() );
+
+    // Spacing
+    // tagkey = "0028|0030";
+    std::string value;
+    std::vector<double> spacing = dataImage->getSpacing();
+    value = ::fwTools::getString< double >(spacing[0]);
+    value += '\\';
+    value += ::fwTools::getString< double >(spacing[1]);
+    setValue(medprop, 0x0028, 0x0030, value);
+
+    std::string origin;
+    ::fwData::Image::OriginType orginVec = dataImage->getOrigin();
+    origin = ::fwTools::getString< ::fwData::Image::OriginType::value_type >(orginVec[0]);
+    origin += '\\';
+    origin = ::fwTools::getString< ::fwData::Image::OriginType::value_type >(orginVec[1]);
+
+    if (dataImage->getNumberOfDimensions() > 2)
+    {
+        // Thickness
+        // tagkey = "0018|0050";
+        value = ::fwTools::getString< double >(spacing[2]);
+        medprop->SetSliceThickness(value.c_str());
+
+
+        // InterSlice
+        // tagkey = "0018|0088";
+        value = ::fwTools::getString< double >(spacing[2]);
+        setValue(medprop, 0x0018, 0x0088, value);
+
+        origin += '\\';
+        origin = ::fwTools::getString< ::fwData::Image::OriginType::value_type >(orginVec[2]);
+    }
+
+    setValue(medprop, 0x0020, 0x0032, origin);
+
+    // Writing data
+    //--------------------------------------------------------------
+    vtkSmartPointer< vtkGDCMImageWriter > writer = vtkSmartPointer< vtkGDCMImageWriter >::New();
+
+    //add progress observation
+    ::fwVtkIO::Progressor progress(writer, this->getSptr(), outputDirectory.string());
+    writer->SetStudyUID(study->getInstanceUID().c_str());
+    writer->SetSeriesUID(imgSeries->getInstanceUID().c_str());
+    writer->SetInput( vtkImage );
+    writer->FileLowerLeftOn();
+    writer->SetFileDimensionality( 2 ); // test the 3D to 2D writing mode
+    writer->SetMedicalImageProperties( medprop );
+    writer->SetFileNames( filenames );
+    writer->Write();
+
+    filenames->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+std::string  ImageSeriesWriter::extension()
+{
+    return "";
+}
+
+} // namespace dicomIO
diff --git a/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBLazyReader.cpp b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBLazyReader.cpp
new file mode 100644
index 0000000..9cc2614
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBLazyReader.cpp
@@ -0,0 +1,574 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <algorithm>
+#include <iosfwd>
+
+#include <boost/iostreams/categories.hpp>
+
+#include <exception>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+#include <boost/algorithm/string/trim.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+#if (SPYLOG_LEVEL >= 4 )
+#include <fwCore/HiResTimer.hpp>
+#endif
+
+#include <fwMemory/BufferObject.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/fromIsoExtendedString.hpp>
+
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Study.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include <gdcmImageHelper.h>
+#include <gdcmIPPSorter.h>
+#include <gdcmScanner.h>
+#include <gdcmReader.h>
+#include <gdcmImageReader.h>
+#include <gdcmIPPSorter.h>
+#include <gdcmRescaler.h>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/ProgressVtkToFw.hpp>
+
+#include "vtkGdcmIO/SeriesDBLazyReader.hpp"
+#include "vtkGdcmIO/helper/GdcmHelper.hpp"
+#include "vtkGdcmIO/helper/ImageDicomStream.hpp"
+
+fwDataIOReaderRegisterMacro( ::vtkGdcmIO::SeriesDBLazyReader );
+
+namespace vtkGdcmIO
+{
+
+//------------------------------------------------------------------------------
+
+const ::gdcm::Tag seriesUIDTag(0x0020,0x000e);
+const ::gdcm::Tag seriesDateTag(0x0008,0x0021);
+const ::gdcm::Tag seriesTimeTag(0x0008,0x0031);
+const ::gdcm::Tag seriesTypeTag(0x0008,0x0060);
+const ::gdcm::Tag seriesDescriptionTag(0x0008,0x103e);
+const ::gdcm::Tag seriesPhysicianNamesTag(0x0008,0x1050);
+
+const ::gdcm::Tag equipmentInstitutionNameTag(0x0008,0x0080);
+
+const ::gdcm::Tag patientNameTag(0x0010,0x0010);
+const ::gdcm::Tag patientIDTag(0x0010,0x0020);
+const ::gdcm::Tag patientBirthdateTag(0x0010,0x0030);
+const ::gdcm::Tag patientSexTag(0x0010,0x0040);
+
+const ::gdcm::Tag studyUIDTag(0x0020,0x000d);
+const ::gdcm::Tag studyDateTag(0x0008,0x0020);
+const ::gdcm::Tag studyTimeTag(0x0008,0x0030);
+const ::gdcm::Tag studyReferingPhysicianNameTag(0x0008,0x0090);
+const ::gdcm::Tag studyDescriptionTag(0x0008,0x1030);
+const ::gdcm::Tag studyPatientAgeTag(0x0010,0x1010);
+
+const ::gdcm::Tag imageTypeTag(0x0008,0x0008);
+const ::gdcm::Tag acquisitionDateTag(0x0008,0x0022);
+const ::gdcm::Tag acquisitionTimeTag(0x0008,0x0032);
+
+const ::gdcm::Tag sliceThicknessTag(0x0018,0x0050);
+const ::gdcm::Tag windowCenterTag(0x0028,0x1050);
+const ::gdcm::Tag windowWidthTag(0x0028,0x1051);
+
+//------------------------------------------------------------------------------
+
+SeriesDBLazyReader::SeriesDBLazyReader(::fwDataIO::reader::IObjectReader::Key key) :
+    ::fwData::location::enableFolder< IObjectReader >(this),
+    ::fwData::location::enableMultiFiles< IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+SeriesDBLazyReader::~SeriesDBLazyReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::SeriesDB::sptr SeriesDBLazyReader::createSeriesDB( const ::boost::filesystem::path &dicomDir )
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getConcreteObject();
+
+    std::vector<std::string> filenames;
+    ::vtkGdcmIO::helper::DicomSearch::searchRecursivelyFiles(dicomDir, filenames);
+
+    this->addSeries( seriesDB , filenames);
+    return seriesDB;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::scanFiles( ::gdcm::Scanner & scanner, const std::vector< std::string > & filenames )
+{
+    scanner.AddTag( seriesUIDTag );
+    scanner.AddTag( seriesDateTag );
+    scanner.AddTag( seriesTimeTag );
+    scanner.AddTag( seriesTypeTag );
+    scanner.AddTag( seriesDescriptionTag );
+    scanner.AddTag( seriesPhysicianNamesTag );
+
+    scanner.AddTag( equipmentInstitutionNameTag );
+
+    scanner.AddTag( patientNameTag );
+    scanner.AddTag( patientIDTag );
+    scanner.AddTag( patientBirthdateTag );
+    scanner.AddTag( patientSexTag );
+
+    scanner.AddTag( studyUIDTag );
+    scanner.AddTag( studyUIDTag );
+    scanner.AddTag( studyDateTag );
+    scanner.AddTag( studyTimeTag );
+    scanner.AddTag( studyReferingPhysicianNameTag );
+    scanner.AddTag( studyDescriptionTag );
+    scanner.AddTag( studyPatientAgeTag );
+
+    scanner.AddTag( imageTypeTag );
+
+    scanner.AddTag( acquisitionDateTag );
+    scanner.AddTag( acquisitionTimeTag );
+
+    scanner.AddTag( sliceThicknessTag );
+    scanner.AddTag( windowCenterTag );
+    scanner.AddTag( windowWidthTag );
+
+    bool scanIsOk = scanner.Scan( filenames );
+    FW_RAISE_IF( "Sorry, dicom scanner failed", !scanIsOk );
+}
+
+//------------------------------------------------------------------------------
+
+SeriesDBLazyReader::MapSeriesType buildMapSeriesFromScanner( ::gdcm::Scanner & scanner )
+{
+    ::gdcm::Directory::FilenamesType keys = scanner.GetKeys();
+    ::gdcm::Directory::FilenamesType::const_iterator it = keys.begin();
+
+    SeriesDBLazyReader::MapSeriesType mapSeries;
+
+    for(; it != keys.end() ; ++it)
+    {
+        const char *filename = it->c_str();
+        assert( scanner.IsKey( filename ) );
+
+        const char *seriesUID =  scanner.GetValue( filename, seriesUIDTag );
+        const char *acqDate   =  scanner.GetValue( filename, acquisitionDateTag );
+
+        if (seriesUID)
+        {
+            std::string fileSetId = seriesUID;
+
+            if (acqDate)
+            {
+                fileSetId += "_";
+                fileSetId += acqDate;
+            }
+
+            const char *imageTypeStr = scanner.GetValue(filename, imageTypeTag);
+            if(imageTypeStr)
+            {
+                // Treatment of secondary capture dicom file.
+                std::string imageType(imageTypeStr);
+                SLM_TRACE("Image Type : " + imageType);
+
+                fileSetId += "_";
+                fileSetId += imageTypeStr;
+            }
+            mapSeries[fileSetId].push_back(filename);
+
+        }
+        else
+        {
+            SLM_ERROR ( "Error in vtkGdcmIO : No serie name found in : " + *it );
+        }
+
+    }
+
+    return mapSeries;
+}
+
+//------------------------------------------------------------------------------
+
+
+std::string getValue( ::gdcm::Scanner & scanner, const std::string & dcmFile, const ::gdcm::Tag & tag )
+{
+    const char * tagValue = scanner.GetValue( dcmFile.c_str(), tag );
+    if( tagValue )
+    {
+        return std::string(tagValue);
+    }
+    else
+    {
+        return std::string("");
+    }
+}
+
+//------------------------------------------------------------------------------
+
+template < typename T >
+T getNumericValue( ::gdcm::Scanner & scanner, const std::string & dcmFile, const ::gdcm::Tag & tag )
+{
+    const char * tagValue = scanner.GetValue( dcmFile.c_str(), tag );
+    if( tagValue )
+    {
+        std::string val (tagValue);
+        ::boost::algorithm::trim(val);
+        return ::boost::lexical_cast<T>( val );
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::fillSeries( ::gdcm::Scanner & scanner,
+        const std::string & dcmFile, ::fwMedData::Series::sptr series )
+{
+    const std::string seriesUID =  getValue( scanner, dcmFile, seriesUIDTag );
+    const std::string seriesTime = getValue( scanner, dcmFile, seriesTimeTag );
+    const std::string seriesDate = getValue( scanner, dcmFile, seriesDateTag );
+    const std::string seriesModality = getValue( scanner, dcmFile, seriesTypeTag );
+    const std::string seriesDescription = getValue( scanner, dcmFile, seriesDescriptionTag );
+
+    ::fwMedData::DicomValuesType seriesPhysicianNames;
+    ::gdcm::Scanner::ValuesType gdcmPhysicianNames = scanner.GetValues( seriesPhysicianNamesTag );
+    BOOST_FOREACH(const std::string &str, gdcmPhysicianNames)
+    {
+        ::fwMedData::DicomValuesType result;
+        ::boost::split( result, str, ::boost::is_any_of("\\"));
+        seriesPhysicianNames.reserve(seriesPhysicianNames.size() + result.size());
+        seriesPhysicianNames.insert(seriesPhysicianNames.end(), result.begin(), result.end());
+    }
+
+    SLM_ASSERT("No series UID", !seriesUID.empty() );
+    series->setInstanceUID( seriesUID );
+    series->setModality( seriesModality );
+    series->setDescription( seriesDescription );
+    series->setDate( seriesDate );
+    series->setTime( seriesTime );
+    series->setPerformingPhysiciansName( seriesPhysicianNames );
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::fillPatient( ::gdcm::Scanner & scanner,
+        const std::string & dcmFile, ::fwMedData::Patient::sptr patient )
+{
+    const std::string patientName      = getValue( scanner, dcmFile, patientNameTag );
+    const std::string patientId        = getValue( scanner, dcmFile, patientIDTag );
+    const std::string patientBirthdate = getValue( scanner, dcmFile, patientBirthdateTag );
+    const std::string patientSex       = getValue( scanner, dcmFile, patientSexTag );
+
+    patient->setName(patientName);
+    patient->setPatientId(patientId);
+    patient->setBirthdate(patientBirthdate);
+    patient->setSex(patientSex);
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::fillStudy( ::gdcm::Scanner & scanner,
+        const std::string & dcmFile, ::fwMedData::Study::sptr study )
+{
+    const std::string studyUID =  getValue( scanner, dcmFile, studyUIDTag );
+    const std::string studyReferingPhysicianName = getValue( scanner, dcmFile, studyReferingPhysicianNameTag );
+    const std::string studyDate = getValue( scanner, dcmFile, studyDateTag );
+    const std::string studyTime = getValue( scanner, dcmFile, studyTimeTag );
+    const std::string studyDescription = getValue( scanner, dcmFile, studyDescriptionTag );
+    const std::string studyPatientAge = getValue( scanner, dcmFile, studyPatientAgeTag );
+
+    SLM_ASSERT("No study UID", !studyUID.empty() );
+    study->setInstanceUID(studyUID);
+    study->setDate(studyDate);
+    study->setTime(studyTime);
+    study->setDescription(studyDescription);
+    study->setPatientAge(studyPatientAge);
+    study->setReferringPhysicianName(studyReferingPhysicianName);
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::fillEquipment( ::gdcm::Scanner & scanner,
+        const std::string & dcmFile, ::fwMedData::Equipment::sptr equipment )
+{
+    const std::string equipementInstitution = getValue( scanner, dcmFile, equipmentInstitutionNameTag );
+
+    equipment->setInstitutionName(equipementInstitution);
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::preprocessImage(
+        const ::fwData::Image::sptr & img,
+        const SeriesDBLazyReader::SeriesFilesType & files )
+{
+    ::gdcm::Reader localReader;
+    localReader.SetFileName( files[0].c_str() );
+    localReader.Read();
+    ::gdcm::File & gdcmReaderFile = localReader.GetFile();
+    std::vector<double> origin = ::gdcm::ImageHelper::GetOriginValue( gdcmReaderFile );
+    std::vector<unsigned int> dim = ::gdcm::ImageHelper::GetDimensionsValue( gdcmReaderFile );
+    std::vector<double> spacing = ::gdcm::ImageHelper::GetSpacingValue( gdcmReaderFile );
+    ::gdcm::PixelFormat pixelFormat = ::gdcm::ImageHelper::GetPixelFormatValue( gdcmReaderFile );
+    std::vector<double> interceptSlope = ::gdcm::ImageHelper::GetRescaleInterceptSlopeValue( gdcmReaderFile );
+
+    // Origin
+    ::fwData::Image::OriginType imgOrigin;
+    imgOrigin.resize(3);
+    imgOrigin[0] = origin[0];
+    imgOrigin[1] = origin[1];
+    imgOrigin[2] = origin[2];
+    img->setOrigin( imgOrigin );
+
+    // Spacing
+    ::fwData::Image::SpacingType imgSpacing;
+    imgSpacing.resize(3);
+    imgSpacing[0] = spacing[0];
+    imgSpacing[1] = spacing[1];
+    imgSpacing[2] = 1.0;
+    img->setSpacing( imgSpacing );
+
+    // Size
+    ::fwData::Image::SizeType imgSize (3);
+    imgSize.resize(3);
+    imgSize[0] = dim[0];
+    imgSize[1] = dim[1];
+    imgSize[2] = files.size();
+
+    // Image type
+    ::fwTools::Type imgType;
+    ::gdcm::PixelFormat::ScalarType scalarType = pixelFormat.GetScalarType();
+
+    ::gdcm::Rescaler r;
+    r.SetIntercept( interceptSlope[0] );
+    r.SetSlope( interceptSlope[1] );
+    r.SetPixelFormat( scalarType );
+    scalarType = r.ComputeInterceptSlopePixelType();
+    OSLM_TRACE("Intercept = " << interceptSlope[0] );
+    OSLM_TRACE("Slope = " << interceptSlope[1] );
+
+    switch( scalarType )
+    {
+        case ::gdcm::PixelFormat::UINT8 : imgType = ::fwTools::Type::s_UINT8; break;
+        case ::gdcm::PixelFormat::INT8 : imgType = ::fwTools::Type::s_INT8; break;
+        case ::gdcm::PixelFormat::UINT16 : imgType = ::fwTools::Type::s_UINT16; break;
+        case ::gdcm::PixelFormat::INT16 : imgType = ::fwTools::Type::s_INT16; break;
+        case ::gdcm::PixelFormat::UINT32 : imgType = ::fwTools::Type::s_UINT32; break;
+        case ::gdcm::PixelFormat::INT32 : imgType = ::fwTools::Type::s_INT32; break;
+        case ::gdcm::PixelFormat::FLOAT32 : imgType = ::fwTools::Type::s_FLOAT; break;
+        case ::gdcm::PixelFormat::FLOAT64 : imgType = ::fwTools::Type::s_DOUBLE; break;
+        default : SLM_FATAL("Type not managed"); break;
+    }
+
+    // Number of component
+    size_t numberOfComponents = pixelFormat.GetSamplesPerPixel();
+
+    img->setSize( imgSize );
+    img->setNumberOfComponents( numberOfComponents );
+    img->setType( imgType );
+    img->getDataArray()->resize(imgType, imgSize, numberOfComponents, false);
+}
+
+//------------------------------------------------------------------------------
+
+SeriesDBLazyReader::SeriesFilesType
+sortImageSeriesFiles( const SeriesDBLazyReader::SeriesFilesType & seriesFiles )
+{
+    SeriesDBLazyReader::SeriesFilesType sortedSeriesFiles = seriesFiles;
+
+    ::gdcm::IPPSorter s;
+    s.SetComputeZSpacing( true );
+    s.SetZSpacingTolerance( 1e-3 );
+    bool success = s.Sort( seriesFiles );
+
+    SLM_WARN_IF( "Failed to sort : " + seriesFiles[0], !success );
+    if ( success )
+    {
+        sortedSeriesFiles = s.GetFilenames();
+    }
+
+    return sortedSeriesFiles;
+}
+
+//------------------------------------------------------------------------------
+
+double SeriesDBLazyReader::computeZSpacing( const SeriesDBLazyReader::SeriesFilesType & seriesFiles )
+{
+    SLM_ASSERT("This method only work if series files contains at least 2 frames.", seriesFiles.size() > 1);
+    double zspacing = 0;
+
+    ::gdcm::Reader r1;
+    ::gdcm::Reader r2;
+
+    r1.SetFileName( seriesFiles[0].c_str() );
+    r2.SetFileName( seriesFiles[1].c_str() );
+
+    bool canRead = r1.Read() && r2.Read();
+    SLM_ASSERT("Reader must be ok", canRead);
+
+    std::vector<double> vOrigin1 = ::gdcm::ImageHelper::GetOriginValue(r1.GetFile());
+    std::vector<double> vOrigin2 = ::gdcm::ImageHelper::GetOriginValue(r2.GetFile());
+    zspacing = vOrigin2[2] - vOrigin1[2];
+
+    return zspacing;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::fillImage(
+        ::gdcm::Scanner & scanner,
+        const SeriesDBLazyReader::SeriesFilesType & seriesFiles,
+        const std::string & dcmFile,
+        ::fwData::Image::sptr img )
+{
+
+    this->preprocessImage(img,seriesFiles);
+
+    double center = getNumericValue<double>(scanner, dcmFile, windowCenterTag);
+    double width = getNumericValue<double>(scanner, dcmFile, windowWidthTag);
+
+    img->setWindowCenter(center);
+    img->setWindowWidth(width);
+
+    ::fwData::Image::SpacingType imgSpacing = img->getSpacing();
+    imgSpacing.resize(3);
+    double thickness = getNumericValue<double>(scanner, dcmFile, sliceThicknessTag);
+    thickness = thickness ? thickness : 1.;
+    if ( seriesFiles.size() > 1 )
+    {
+        double computedZSpacing = computeZSpacing( seriesFiles );
+        imgSpacing[2] = computedZSpacing ? computedZSpacing : thickness;
+    }
+    else
+    {
+        imgSpacing[2] = thickness;
+    }
+    img->setSpacing(imgSpacing);
+
+
+    ::vtkGdcmIO::helper::ImageDicomInfo::sptr dcmInfo = ::boost::make_shared< ::vtkGdcmIO::helper::ImageDicomInfo >();
+    dcmInfo->m_buffSizeInBytes = img->getSizeInBytes();
+    dcmInfo->m_seriesFiles = seriesFiles;
+
+    ::fwMemory::BufferObject::sptr buffObj = img->getDataArray()->getBufferObject();
+    buffObj->setIStreamFactory(
+            ::boost::make_shared< ::vtkGdcmIO::helper::ImageDicomStream >( dcmInfo ),
+            img->getSizeInBytes() );
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::addSeries(
+        const ::fwMedData::SeriesDB::sptr &seriesDB,
+        const std::vector< std::string > & filenames )
+{
+    //gdcm::Trace::SetDebug( 1 );
+    //gdcm::Trace::SetWarning( 1 );
+    //gdcm::Trace::SetError( 1 );
+
+    try
+    {
+
+#if (SPYLOG_LEVEL >= 4 ) // Log level info
+        ::fwCore::HiResTimer timer;
+        timer.start();
+#endif
+
+        /// Build scanner
+        ::gdcm::Scanner scanner;
+
+        /// Scan specific tags in filenames
+        this->scanFiles( scanner, filenames );
+
+        /// Build map series
+        MapSeriesType mapSeries = buildMapSeriesFromScanner( scanner );
+
+        BOOST_FOREACH( MapSeriesType::value_type mapElem, mapSeries )
+        {
+            SeriesFilesType seriesFiles = sortImageSeriesFiles( mapElem.second );
+            const std::string & refDcmFile = seriesFiles[0];
+
+            // ToDo
+            // ::gdcm::MediaStorage::IsImage( ::gdcm::MediaStorage::GetMSType( XXX ) ) );
+            bool isAnImage = true;
+            if ( isAnImage )
+            {
+                /// Build new data
+                ::fwMedData::ImageSeries::sptr series = ::fwMedData::ImageSeries::New();
+                ::fwData::Image::sptr img = ::fwData::Image::New();
+
+                series->setImage( img );
+
+                // Fill data object
+                this->fillSeries( scanner, refDcmFile, series );
+                this->fillPatient( scanner, refDcmFile, series->getPatient() );
+                this->fillStudy( scanner, refDcmFile, series->getStudy() );
+                this->fillEquipment( scanner, refDcmFile, series->getEquipment() );
+                this->fillImage( scanner, seriesFiles, refDcmFile, img );
+
+                seriesDB->getContainer().push_back(series);
+            }
+        }
+
+#if (SPYLOG_LEVEL >= 4 )
+        timer.stop();
+        OSLM_INFO( "Time in to lazy read data : " << timer.getElapsedTimeInMilliSec() );
+#endif
+
+    }
+    catch (std::exception& e)
+    {
+        OSLM_ERROR( "Try with another reader or retry with this reader on a specific subfolder : " << e.what() );
+        std::vector< std::string >::const_iterator it = filenames.begin();
+        for( ; it != filenames.end(); ++it)
+        {
+            SLM_ERROR("file error : " + *it );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReader::read()
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getConcreteObject();
+    std::vector<std::string> filenames;
+    if(::fwData::location::have < ::fwData::location::Folder, ::fwDataIO::reader::IObjectReader > (this))
+    {
+        ::vtkGdcmIO::helper::DicomSearch::searchRecursivelyFiles(this->getFolder(), filenames);
+    }
+    else if(::fwData::location::have < ::fwData::location::MultiFiles, ::fwDataIO::reader::IObjectReader > (this))
+    {
+        BOOST_FOREACH(::boost::filesystem::path file, this->getFiles())
+        {
+            filenames.push_back(file.string());
+        }
+    }
+    this->addSeries( seriesDB , filenames);
+}
+
+} //namespace vtkGdcmIO
+
+
diff --git a/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBReader.cpp b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBReader.cpp
new file mode 100644
index 0000000..bc64920
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/SeriesDBReader.cpp
@@ -0,0 +1,447 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <exception>
+
+#include <boost/filesystem/path.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+#include <boost/foreach.hpp>
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/fromIsoExtendedString.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Study.hpp>
+
+#include <fwDataIO/reader/registry/macros.hpp>
+
+#include <vtkImageWriter.h>
+
+#include <vtkGDCMImageReader.h>
+#include <vtkImageData.h>
+#include <vtkStringArray.h>
+#include <vtkMedicalImageProperties.h>
+#include <vtkSmartPointer.h>
+
+#include <gdcmImageHelper.h>
+#include <gdcmIPPSorter.h>
+#include <gdcmScanner.h>
+#include <gdcmReader.h>
+#include <gdcmIPPSorter.h>
+
+#include <fwVtkIO/vtk.hpp>
+#include <fwVtkIO/helper/ProgressVtkToFw.hpp>
+
+#include "vtkGdcmIO/SeriesDBReader.hpp"
+#include "vtkGdcmIO/helper/GdcmHelper.hpp"
+
+fwDataIOReaderRegisterMacro( ::vtkGdcmIO::SeriesDBReader );
+
+namespace vtkGdcmIO
+{
+
+//------------------------------------------------------------------------------
+
+SeriesDBReader::SeriesDBReader(::fwDataIO::reader::IObjectReader::Key key) :
+    ::fwData::location::enableFolder< IObjectReader >(this),
+    ::fwData::location::enableMultiFiles< IObjectReader >(this)
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+SeriesDBReader::~SeriesDBReader()
+{
+    SLM_TRACE_FUNC();
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::SeriesDB::sptr SeriesDBReader::createSeriesDB( const ::boost::filesystem::path &dicomDir )
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getConcreteObject();
+
+    std::vector<std::string> filenames;
+    ::vtkGdcmIO::helper::DicomSearch::searchRecursivelyFiles(dicomDir, filenames);
+
+    this->addSeries( seriesDB , filenames);
+    return seriesDB;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReader::addSeries( const ::fwMedData::SeriesDB::sptr &seriesDB, const std::vector< std::string > &filenames)
+{
+    //gdcm::Trace::SetDebug( 1 );
+    //gdcm::Trace::SetWarning( 1 );
+    //gdcm::Trace::SetError( 1 );
+
+    gdcm::Scanner scanner;
+    const gdcm::Tag seriesUIDTag(0x0020,0x000e);
+    const gdcm::Tag seriesDateTag(0x0008,0x0021);
+    const gdcm::Tag seriesTimeTag(0x0008,0x0031);
+    const gdcm::Tag seriesTypeTag(0x0008,0x0060);
+    const gdcm::Tag seriesDescriptionTag(0x0008,0x103e);
+    const gdcm::Tag seriesPhysicianNamesTag(0x0008,0x1050);
+
+    const gdcm::Tag equipmentInstitutionNameTag(0x0008,0x0080);
+
+    const gdcm::Tag patientNameTag(0x0010,0x0010);
+    const gdcm::Tag patientIDTag(0x0010,0x0020);
+    const gdcm::Tag patientBirthdateTag(0x0010,0x0030);
+    const gdcm::Tag patientSexTag(0x0010,0x0040);
+    const gdcm::Tag studyUIDTag(0x0020,0x000d);
+    const gdcm::Tag studyDateTag(0x0008,0x0020);
+    const gdcm::Tag studyTimeTag(0x0008,0x0030);
+    const gdcm::Tag studyReferingPhysicianNameTag(0x0008,0x0090);
+    const gdcm::Tag studyDescriptionTag(0x0008,0x1030);
+    const gdcm::Tag studyPatientAgeTag(0x0010,0x1010);
+
+    const gdcm::Tag imageTypeTag(0x0008,0x0008);
+    const gdcm::Tag acquisitionDateTag(0x0008,0x0022);
+    const gdcm::Tag acquisitionTimeTag(0x0008,0x0032);
+
+    scanner.AddTag( seriesUIDTag );
+    scanner.AddTag( seriesDateTag );
+    scanner.AddTag( seriesTimeTag );
+    scanner.AddTag( seriesTypeTag );
+    scanner.AddTag( seriesDescriptionTag );
+    scanner.AddTag( seriesPhysicianNamesTag );
+    scanner.AddTag( equipmentInstitutionNameTag );
+    scanner.AddTag( studyUIDTag );
+    scanner.AddTag( patientNameTag );
+    scanner.AddTag( patientIDTag );
+    scanner.AddTag( patientBirthdateTag );
+    scanner.AddTag( patientSexTag );
+    scanner.AddTag( studyUIDTag );
+    scanner.AddTag( studyDateTag );
+    scanner.AddTag( studyTimeTag );
+    scanner.AddTag( studyReferingPhysicianNameTag );
+    scanner.AddTag( studyDescriptionTag );
+    scanner.AddTag( studyPatientAgeTag );
+    scanner.AddTag( imageTypeTag );
+    scanner.AddTag( acquisitionDateTag );
+    scanner.AddTag( acquisitionTimeTag );
+
+
+    try
+    {
+        bool b = scanner.Scan( filenames );
+        if( !b )
+        {
+            SLM_ERROR("Scanner failed");
+            return ;
+        }
+        gdcm::Directory::FilenamesType keys = scanner.GetKeys();
+        gdcm::Directory::FilenamesType::const_iterator it = keys.begin();
+
+        typedef std::map< std::string, std::vector< std::string > > MapSeriesType;
+        MapSeriesType mapSeries;
+
+        for(; it != keys.end() ; ++it)
+        {
+            const char *filename = it->c_str();
+            assert( scanner.IsKey( filename ) );
+
+            const char *seriesUID =  scanner.GetValue( filename, seriesUIDTag );
+            const char *acqDate   =  scanner.GetValue( filename, acquisitionDateTag );
+
+            if (seriesUID)
+            {
+                std::string fileSetId = seriesUID;
+
+                if (acqDate)
+                {
+                    fileSetId += "_";
+                    fileSetId += acqDate;
+                }
+
+                const char *imageTypeStr = scanner.GetValue(filename, imageTypeTag);
+                if(imageTypeStr)
+                {
+                    // Treatment of secondary capture dicom file.
+                    std::string imageType(imageTypeStr);
+                    OSLM_TRACE("Image Type : " << imageType);
+
+                    fileSetId += "_";
+                    fileSetId += imageTypeStr;
+                }
+                mapSeries[fileSetId].push_back(filename);
+
+            }
+            else
+            {
+                OSLM_ERROR ( "Error in vtkGdcmIO : No serie name found in : " << filename );
+            }
+
+        }
+
+        MapSeriesType::const_iterator iter    = mapSeries.begin();
+        MapSeriesType::const_iterator iterEnd = mapSeries.end();
+
+        while (iter != iterEnd)
+        {
+            std::string seriesInstanceUID;
+            std::string studyInstanceUID;
+
+            ::fwMedData::ImageSeries::sptr series = ::fwMedData::ImageSeries::New();
+            ::fwMedData::Patient::sptr patient = series->getPatient();
+            ::fwMedData::Study::sptr study = series->getStudy();
+            ::fwMedData::Equipment::sptr equipment = series->getEquipment();
+
+            seriesDB->getContainer().push_back(series);
+
+            OSLM_TRACE ( " Processing : " << iter->first << " file set.");
+            const MapSeriesType::mapped_type &files = iter->second;
+            if ( !files.empty() )
+            {
+                vtkSmartPointer< vtkStringArray > fileArray = vtkSmartPointer< vtkStringArray >::New();
+                vtkSmartPointer< vtkGDCMImageReader > reader = vtkSmartPointer< vtkGDCMImageReader >::New();
+                reader->FileLowerLeftOn();
+                gdcm::IPPSorter s;
+                s.SetComputeZSpacing( true );
+                s.SetZSpacingTolerance( 1e-3 );
+                b = s.Sort( files );
+                double zspacing = 0;
+                // int nbSorter = 0;
+                fileArray->Initialize();
+
+                MapSeriesType::mapped_type::const_iterator filesIt  = files.begin();
+                MapSeriesType::mapped_type::const_iterator filesEnd = files.end();
+
+                OSLM_WARN_IF( "Failed to sort:" << iter->first, !b );
+                OSLM_TRACE  ( "Found z-spacing:" << s.GetZSpacing());
+
+                if(b)
+                {
+                    const std::vector<std::string> & sorted = s.GetFilenames();
+                    OSLM_TRACE ( "Success to sort" << iter->first );
+                    zspacing = s.GetZSpacing();
+                    if (!zspacing && s.GetFilenames().size() > 1)
+                    {
+                        SLM_TRACE ( "Guessing zspacing ..." );
+                        if (!sorted.empty())
+                        {
+                            gdcm::Reader localReader1;
+                            gdcm::Reader localReader2;
+                            const std::string &f1 = *(sorted.begin());
+                            const std::string &f2 = *(sorted.begin() + 1);
+                            OSLM_TRACE ( "Search spacing in : " << f1.c_str());
+                            OSLM_TRACE ( "Search spacing in : " << f2.c_str());
+
+                            localReader1.SetFileName( f1.c_str() );
+                            localReader2.SetFileName( f2.c_str() );
+                            bool canRead = localReader1.Read() && localReader2.Read() ;
+                            if( canRead )
+                            {
+                                std::vector<double> vOrigin1 = gdcm::ImageHelper::GetOriginValue(localReader1.GetFile());
+                                std::vector<double> vOrigin2 = gdcm::ImageHelper::GetOriginValue(localReader2.GetFile());
+                                zspacing = vOrigin2[2] - vOrigin1[2];
+                                OSLM_TRACE ( "Found z-spacing:" << zspacing << " from : << " << vOrigin2[2] << " | " << vOrigin1[2]);
+                            }
+
+                            OSLM_ERROR_IF( "Cannot read :" << f1 << " or : " << f2 , !canRead );
+                        }
+                        OSLM_DEBUG_IF ( "Failed to find z-spacing:" << s.GetZSpacing(), !zspacing);
+                        OSLM_DEBUG_IF ( "Guessed z-spacing:" << s.GetZSpacing() << " -> " << zspacing , zspacing);
+                    }
+
+                    filesIt  = sorted.begin();
+                    filesEnd = sorted.end();
+                }
+
+                for( ; filesIt != filesEnd; ++filesIt)
+                {
+                    const std::string &f = *filesIt;
+                    OSLM_TRACE("Add " << f << " to vtkGdcmReader");
+                    fileArray->InsertNextValue( f.c_str() );
+                }
+
+                ::fwData::Image::sptr pDataImage = ::fwData::Image::New();
+
+                bool res = false;
+                if (fileArray->GetNumberOfValues() > 0)
+                {
+                    reader->SetFileNames( fileArray );
+                    try
+                    {
+                        SLM_TRACE ( "Read all files" );
+                        //add progress observation
+                        ::fwVtkIO::Progressor progress(reader, this->getSptr(), "Serie " + iter->first);
+                        reader->Update();
+                        try
+                        {
+                            ::fwVtkIO::fromVTKImage(reader->GetOutput(), pDataImage);
+                            res = true;
+                        }
+                        catch(std::exception &e)
+                        {
+                            OSLM_ERROR("VTKImage to fwData::Image failed : "<<e.what());
+                        }
+                    }
+                    catch (std::exception &e)
+                    {
+                        OSLM_ERROR ( "Error during conversion : " << e.what() );
+                    }
+                    catch (...)
+                    {
+                        OSLM_ERROR ( "Unexpected error during conversion" );
+                    }
+                }
+
+                if (res)
+                {
+
+                    SLM_ASSERT("No file to read", !files.empty());
+
+                    // Read medical info
+                    vtkMedicalImageProperties * medprop = reader->GetMedicalImageProperties();
+
+                    std::string patientName      = medprop->GetPatientName(); //"0010|0010"
+                    std::string patientId        = medprop->GetPatientID();
+                    std::string patientBirthdate = medprop->GetPatientBirthDate(); //"0010|0030"
+                    std::string patientSex       = medprop->GetPatientSex(); //"0010|0040"
+
+                    gdcm::Scanner::ValuesType gdcmPhysicianNames = scanner.GetValues( seriesPhysicianNamesTag );
+                    const char * seriesUIDStr =  scanner.GetValue( files[0].c_str(), seriesUIDTag );
+                    const char * seriesTimeStr = scanner.GetValue( files[0].c_str(), seriesTimeTag );
+                    const char * seriesDateStr = scanner.GetValue( files[0].c_str(), seriesDateTag );
+                    std::string seriesModality = medprop->GetModality(); //"0008|0060"
+                    std::string seriesDescription = medprop->GetSeriesDescription();
+                    std::string seriesDate = ( seriesDateStr ? seriesDateStr : "" );
+                    std::string seriesTime = ( seriesTimeStr ? seriesTimeStr : "" );
+
+                    ::fwMedData::DicomValuesType seriesPhysicianNames;
+                    BOOST_FOREACH(const std::string &str, gdcmPhysicianNames)
+                    {
+                        ::fwMedData::DicomValuesType result;
+                        ::boost::split( result, str, ::boost::is_any_of("\\"));
+                        seriesPhysicianNames.reserve(seriesPhysicianNames.size() + result.size());
+                        seriesPhysicianNames.insert(seriesPhysicianNames.end(), result.begin(), result.end());
+                    }
+
+                    const char * studyUIDStr =  scanner.GetValue( files[0].c_str(), studyUIDTag );
+                    const char * studyReferingPhysicianNameStr
+                        = scanner.GetValue( files[0].c_str(), studyReferingPhysicianNameTag );
+                    std::string studyDate = medprop->GetStudyDate();
+                    std::string studyTime = medprop->GetStudyTime();
+                    std::string studyDescription = medprop->GetStudyDescription() ; //"0008|1030"
+                    std::string studyPatientAge = medprop->GetPatientAge();
+                    std::string studyReferingPhysicianName
+                        = ( studyReferingPhysicianNameStr ? studyReferingPhysicianNameStr : "" );
+
+                    std::string equipementInstitution = medprop->GetInstitutionName(); //"0008|0080"
+
+
+                    double thickness = medprop->GetSliceThicknessAsDouble();//"0018|0050"
+                    double center=0.0;
+                    double width=0.0;
+                    if (medprop->GetNumberOfWindowLevelPresets())//FIXME : Multiple preset !!!
+                    {
+                        medprop->GetNthWindowLevelPreset(0,&width,&center); //0028|1050,1051
+                    }
+
+                    // Image must have 3 dimensions
+                    if(pDataImage->getNumberOfDimensions()  == 2)
+                    {
+                        ::fwData::Image::SizeType imgSize = pDataImage->getSize();
+                        imgSize.resize(3);
+                        imgSize[2] = 1;
+                        pDataImage->setSize(imgSize);
+
+                        ::fwData::Image::OriginType imgOrigin = pDataImage->getOrigin();
+                        imgOrigin.resize(3);
+                        imgOrigin[2] = 0.;
+                        pDataImage->setOrigin(imgOrigin);
+
+                        width = 4096;
+                    }
+
+
+                    ::fwData::Image::SpacingType vPixelSpacing = pDataImage->getSpacing();
+                    vPixelSpacing.resize(3);
+                    // assume z-spacing = 1 if not guessed
+                    vPixelSpacing[2] = zspacing ? zspacing : (thickness ? thickness : 1.);
+                    pDataImage->setSpacing(vPixelSpacing);
+                    pDataImage->setWindowCenter(center);
+                    pDataImage->setWindowWidth(width);
+
+                    // Get the serie instance UID.
+                    SLM_ASSERT("No series UID", seriesUIDStr);
+                    series->setInstanceUID(( seriesUIDStr ? seriesUIDStr : "UNKNOWN-UID" ));
+                    series->setModality( seriesModality );
+                    series->setDescription( seriesDescription );
+                    series->setDate( seriesDate );
+                    series->setTime( seriesTime );
+                    series->setPerformingPhysiciansName( seriesPhysicianNames );
+                    series->setImage(pDataImage);
+
+                    SLM_ASSERT("No study UID",  studyUIDStr);
+                    study->setInstanceUID(( studyUIDStr ? studyUIDStr : "UNKNOWN-UID" ));
+                    study->setDate(studyDate);
+                    study->setTime(studyTime);
+                    study->setDescription(studyDescription);
+                    study->setPatientAge(studyPatientAge);
+                    study->setReferringPhysicianName(studyReferingPhysicianName);
+
+                    patient->setName(patientName);
+                    patient->setPatientId(patientId);
+                    patient->setBirthdate(patientBirthdate);
+                    patient->setSex(patientSex);
+
+                    equipment->setInstitutionName(equipementInstitution);
+
+                } // if res
+            } // if !files.empty()
+            ++iter;
+        } // while (iter != iterEnd)
+    } // try
+    catch (std::exception& e)
+    {
+        OSLM_ERROR ( "Try with another reader or retry with this reader on a specific subfolder : " << e.what() );
+        std::vector< std::string >::const_iterator it = filenames.begin();
+        for( ; it != filenames.end(); ++it)
+        {
+            OSLM_ERROR ("file error : " << *it );
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReader::read()
+{
+    SLM_TRACE_FUNC();
+    ::fwMedData::SeriesDB::sptr seriesDB = this->getConcreteObject();
+    std::vector<std::string> filenames;
+    if(::fwData::location::have < ::fwData::location::Folder, ::fwDataIO::reader::IObjectReader > (this))
+    {
+        ::vtkGdcmIO::helper::DicomSearch::searchRecursivelyFiles(this->getFolder(), filenames);
+    }
+    else if(::fwData::location::have < ::fwData::location::MultiFiles, ::fwDataIO::reader::IObjectReader > (this))
+    {
+        BOOST_FOREACH(::boost::filesystem::path file, this->getFiles())
+        {
+            filenames.push_back(file.string());
+        }
+    }
+    this->addSeries( seriesDB , filenames);
+}
+
+} //namespace vtkGdcmIO
+
+
diff --git a/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/GdcmHelper.cpp b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/GdcmHelper.cpp
new file mode 100644
index 0000000..2da90f3
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/GdcmHelper.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include <boost/algorithm/string/classification.hpp>
+
+#include <gdcmImageHelper.h>
+#include <gdcmIPPSorter.h>
+#include <gdcmFilename.h>
+#include <gdcmTesting.h>
+#include <gdcmSystem.h>
+#include <gdcmTrace.h>
+#include <gdcmDirectory.h>
+#include <gdcmScanner.h>
+#include <gdcmReader.h>
+#include <gdcmIPPSorter.h>
+#include <gdcmFilenameGenerator.h>
+#include <gdcmAttribute.h>
+#include <gdcmFile.h>
+
+#include <fwCore/base.hpp>
+
+#include "vtkGdcmIO/helper/GdcmHelper.hpp"
+
+namespace vtkGdcmIO
+{
+namespace helper
+{
+
+void DicomSearch::searchRecursivelyFiles(const ::boost::filesystem::path &dirPath, std::vector<std::string>& dicomFiles)
+{
+    std::vector<std::string> vecStr;
+    std::string strIgnoreFile = ".zip|.txt|.htm|.html|.xml|.exe|.gz|.dir|.gif|.jpeg|.jpg|dicomdir|.DS_Store";
+    ::boost::algorithm::split( vecStr, strIgnoreFile, ::boost::algorithm::is_any_of("|"), ::boost::algorithm::token_compress_on );
+
+    std::string lowerFilename;
+    std::string filename;
+    for( ::boost::filesystem::recursive_directory_iterator it(dirPath);
+            it != ::boost::filesystem::recursive_directory_iterator(); ++it)
+    {
+        if(! ::boost::filesystem::is_directory(*it))
+        {
+#if BOOST_FILESYSTEM_VERSION > 2
+            lowerFilename = filename = it->path().string();
+#else
+            lowerFilename = filename = it->string();
+#endif
+            std::transform ( lowerFilename.begin(), lowerFilename.end(), lowerFilename.begin(), tolower );
+            if(DicomSearch::compare( lowerFilename, &vecStr) )
+            {
+                try
+                {
+                    ::gdcm::Reader reader;
+                    reader.SetFileName( filename.c_str() );
+                    if( !reader.CanRead() )// with GDCM2.0.18 use !reader.CanRead()
+                    {
+                        OSLM_WARN("Failed to read: " << filename );
+                    }
+                    else
+                    {
+                        dicomFiles.push_back( filename.c_str() );
+                    }
+                }
+                catch (std::exception& e)
+                {
+                    OSLM_ERROR ( "Try with another reader for this file : " << filename.c_str());
+                }
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+bool DicomSearch::compare(std::string & _strOrgin, std::vector<std::string> * vecStr)
+{
+    bool res = true;
+    for (size_t i = 0; i < vecStr->size() && res; ++i)
+    {
+        res = ! ::boost::ends_with(_strOrgin, vecStr->at(i));
+    }
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace helper
+} //namespace vtkGdcmIO
+
+
diff --git a/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/ImageDicomStream.cpp b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/ImageDicomStream.cpp
new file mode 100644
index 0000000..1d9c8f6
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/src/vtkGdcmIO/helper/ImageDicomStream.cpp
@@ -0,0 +1,142 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <vtkStringArray.h>
+
+#include "vtkGdcmIO/helper/ImageDicomStream.hpp"
+
+namespace vtkGdcmIO
+{
+namespace helper
+{
+
+//------------------------------------------------------------------------------
+
+ImageDicomSource::ImageDicomSource( ImageDicomInfo::sptr dcmInfo ) :
+    m_dcmInfo ( dcmInfo ),
+    m_pos ( 0 ),
+    m_success ( false )
+{
+    SLM_ASSERT( "ImageDicomSource needs dicom file to read a dciom image", dcmInfo->m_seriesFiles.size() > 0);
+}
+
+//------------------------------------------------------------------------------
+
+bool filesStillExist( const ImageDicomInfo::SeriesFilesType & files )
+{
+    ::boost::filesystem::path filePath;
+    bool allFilesExists = true;
+
+    for(    ImageDicomInfo::SeriesFilesType::const_iterator itFile = files.begin();
+            allFilesExists && ( itFile != files.end() );
+            ++itFile )
+    {
+        filePath = *itFile;
+        allFilesExists &= ::boost::filesystem::exists(filePath);
+    }
+    return allFilesExists;
+}
+
+//------------------------------------------------------------------------------
+
+bool ImageDicomSource::readImage()
+{
+    vtkSmartPointer< vtkStringArray > fileArray = vtkSmartPointer< vtkStringArray >::New();
+    fileArray->Initialize();
+    BOOST_FOREACH( std::string file, m_dcmInfo->m_seriesFiles )
+    {
+        OSLM_TRACE("Add " << file << " to vtkGdcmReader");
+        fileArray->InsertNextValue( file.c_str() );
+    }
+
+    m_reader = vtkSmartPointer< vtkGDCMImageReader >::New();
+    m_reader->FileLowerLeftOn();
+
+    bool res = false;
+    if ( filesStillExist( m_dcmInfo->m_seriesFiles ) )
+    {
+        m_reader->SetFileNames( fileArray );
+        try
+        {
+            m_reader->Update();
+            m_inputReader = static_cast<char*>( m_reader->GetOutput()->GetScalarPointer() );
+            res = true;
+        }
+        catch (std::exception &e)
+        {
+            m_reader = 0;
+            m_inputReader = 0;
+            OSLM_ERROR ( "Error during conversion : " << e.what() );
+        }
+        catch (...)
+        {
+            m_reader = 0;
+            m_inputReader = 0;
+            OSLM_ERROR ( "Unexpected error during conversion" );
+        }
+    }
+
+    return res;
+}
+
+
+//------------------------------------------------------------------------------
+
+std::streamsize ImageDicomSource::read(char* s, std::streamsize n)
+{
+    if ( m_pos == 0 )
+    {
+        m_success = this->readImage();
+        OSLM_ERROR_IF( "Error while reading dicom files : " << m_dcmInfo->m_seriesFiles[0] << " ...", !m_success );
+    }
+
+    using namespace std;
+    streamsize amt = static_cast<streamsize>( m_dcmInfo->m_buffSizeInBytes - m_pos );
+    streamsize result = std::min(n, amt);
+
+    if (result != 0) {
+        if( m_success )
+        {
+            std::copy( m_inputReader + m_pos, m_inputReader + m_pos + result, s );
+        }
+        m_pos += result;
+        return result;
+    }
+    else
+    {
+        if ( m_reader )
+        {
+            m_reader = 0;
+        }
+        return -1; // EOF
+    }
+}
+
+
+//------------------------------------------------------------------------------
+
+ImageDicomStream::ImageDicomStream( ImageDicomInfo::sptr dcmInfo ) : m_dcmInfo ( dcmInfo )
+{};
+
+//------------------------------------------------------------------------------
+
+SPTR(std::istream) ImageDicomStream::get()
+{
+    SPTR(::boost::iostreams::stream<ImageDicomSource>) is
+            = ::boost::make_shared< ::boost::iostreams::stream<ImageDicomSource> >( m_dcmInfo );
+
+    return is;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace helper
+} // namespace vtkGdcmIO
diff --git a/SrcLib/io/vtkGdcmIO/test/CMakeLists.txt b/SrcLib/io/vtkGdcmIO/test/CMakeLists.txt
new file mode 100644
index 0000000..b23b5b0
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/CMakeLists.txt
@@ -0,0 +1,8 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
diff --git a/SrcLib/io/vtkGdcmIO/test/Properties.cmake b/SrcLib/io/vtkGdcmIO/test/Properties.cmake
new file mode 100644
index 0000000..205c8fb
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME vtkGdcmIOTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwDataTools vtkGdcmIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/io/vtkGdcmIO/test/cppunit.options b/SrcLib/io/vtkGdcmIO/test/cppunit.options
new file mode 100644
index 0000000..3ead05b
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/cppunit.options
@@ -0,0 +1,17 @@
+CLASSTEST=[
+    'SeriesDBReaderTest',
+    'SeriesDBLazyReaderTest',
+    'ImageSeriesWriterTest',
+    ]
+
+USE = ['boost']
+LIB = [
+       'vtkGdcmIO_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1', 
+       'fwData_0-1',
+       'fwMedData_0-1',
+       'fwTest_0-1',
+       'fwDataCamp_0-1'
+       ]
+CONSOLE='yes'
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/include/ImageSeriesWriterTest.hpp b/SrcLib/io/vtkGdcmIO/test/tu/include/ImageSeriesWriterTest.hpp
new file mode 100644
index 0000000..4f7510b
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/include/ImageSeriesWriterTest.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWVTKGDCMIO_TEST_TU_IMAGESERIESWRITERTEST_HPP__
+#define __FWVTKGDCMIO_TEST_TU_IMAGESERIESWRITERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+class ImageSeriesWriterTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageSeriesWriterTest );
+    CPPUNIT_TEST( writeReadTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void writeReadTest();
+
+};
+
+} // namespace ut
+} // namespace vtkGdcmIO
+
+#endif // __FWVTKGDCMIO_TEST_TU_IMAGESERIESWRITERTEST_HPP__
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBLazyReaderTest.hpp b/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBLazyReaderTest.hpp
new file mode 100644
index 0000000..3675e4b
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBLazyReaderTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWVTKGDCMIO_TEST_TU_SERIESDBLAZYREADER_HPP__
+#define __FWVTKGDCMIO_TEST_TU_SERIESDBLAZYREADER_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwMedData
+{
+    class SeriesDB;
+}
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+class SeriesDBLazyReaderTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBLazyReaderTest );
+    CPPUNIT_TEST( readSeriesDBTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void readSeriesDBTest();
+
+private:
+    ::fwMedData::SeriesDB::sptr m_seriesDB;
+
+};
+
+} // namespace ut
+} // namespace vtkGdcmIO
+
+#endif // __FWVTKGDCMIO_TEST_TU_SERIESDBLAZYREADER_HPP__
+
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBReaderTest.hpp b/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBReaderTest.hpp
new file mode 100644
index 0000000..b2b2b63
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/include/SeriesDBReaderTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWVTKGDCMIO_TEST_TU_SERIESDBREADERTEST_HPP__
+#define __FWVTKGDCMIO_TEST_TU_SERIESDBREADERTEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <fwServices/macros.hpp>
+#include <fwRuntime/EConfigurationElement.hpp>
+
+namespace fwMedData
+{
+    class SeriesDB;
+}
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+class SeriesDBReaderTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBReaderTest );
+    CPPUNIT_TEST( readSeriesDBTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+
+    void setUp();
+    void tearDown();
+
+    void readSeriesDBTest();
+
+private:
+    ::fwMedData::SeriesDB::sptr m_seriesDB;
+
+};
+
+} // namespace ut
+} // namespace vtkGdcmIO
+
+#endif // __FWVTKGDCMIO_TEST_TU_SERIESDBREADERTEST_HPP__
+
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/src/ImageSeriesWriterTest.cpp b/SrcLib/io/vtkGdcmIO/test/tu/src/ImageSeriesWriterTest.cpp
new file mode 100644
index 0000000..3a7c99a
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/src/ImageSeriesWriterTest.cpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwTools/System.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwData/Object.hpp>
+#include <fwData/Image.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwTest/generator/SeriesDB.hpp>
+#include <fwTest/generator/Image.hpp>
+
+#include <vtkGdcmIO/ImageSeriesWriter.hpp>
+#include <vtkGdcmIO/SeriesDBReader.hpp>
+
+#include "ImageSeriesWriterTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::vtkGdcmIO::ut::ImageSeriesWriterTest );
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesWriterTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesWriterTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeriesWriterTest::writeReadTest()
+{
+    ::fwTest::generator::Image::initRand();
+    ::fwMedData::ImageSeries::sptr imgSeries;
+    imgSeries = ::fwTest::generator::SeriesDB::createImageSeries();
+
+    const ::boost::filesystem::path PATH = ::fwTools::System::getTemporaryFolder() / "dicomTest";
+
+    ::boost::filesystem::create_directories( PATH );
+
+    ::vtkGdcmIO::ImageSeriesWriter::sptr writer = ::vtkGdcmIO::ImageSeriesWriter::New();
+    writer->setObject(imgSeries);
+    writer->setFolder(PATH);
+    CPPUNIT_ASSERT_NO_THROW(writer->write());
+
+    // load ImageSeries
+    ::fwMedData::SeriesDB::sptr sdb = ::fwMedData::SeriesDB::New();
+    ::vtkGdcmIO::SeriesDBReader::sptr reader = ::vtkGdcmIO::SeriesDBReader::New();
+    reader->setObject(sdb);
+    reader->setFolder(PATH);
+    CPPUNIT_ASSERT_NO_THROW(reader->read());
+
+    ::boost::filesystem::remove_all( PATH );
+
+    // check series
+    CPPUNIT_ASSERT_EQUAL(size_t(1), sdb->getContainer().size());
+
+    compare(imgSeries, sdb->getContainer().front());
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+} // namespace vtkGdcmIO
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBLazyReaderTest.cpp b/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBLazyReaderTest.cpp
new file mode 100644
index 0000000..a7fa518
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBLazyReaderTest.cpp
@@ -0,0 +1,83 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#if (SPYLOG_LEVEL >= 4 )
+#include <fwCore/HiResTimer.hpp>
+#endif
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwComEd/helper/Image.hpp>
+
+#include <fwTest/Data.hpp>
+#include <fwTest/DicomReaderTest.hpp>
+
+#include <vtkGdcmIO/SeriesDBLazyReader.hpp>
+
+#include "SeriesDBLazyReaderTest.hpp"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::vtkGdcmIO::ut::SeriesDBLazyReaderTest );
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReaderTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReaderTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBLazyReaderTest::readSeriesDBTest()
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    const ::boost::filesystem::path path = ::fwTest::Data::dir() / "fw4spl/Patient/Dicom/ACHGenou";
+
+    ::vtkGdcmIO::SeriesDBLazyReader::sptr reader = ::vtkGdcmIO::SeriesDBLazyReader::New();
+    reader->setObject(seriesDB);
+
+    reader->setFolder(path);
+
+    CPPUNIT_ASSERT_NO_THROW(reader->read());
+
+    CPPUNIT_ASSERT_EQUAL( size_t( 1 ), seriesDB->size());
+    ::fwMedData::ImageSeries::sptr series = ::fwMedData::ImageSeries::dynamicCast(seriesDB->front());
+
+    CPPUNIT_ASSERT( ::fwTest::DicomReaderTest::checkSeriesACHGenou( series ) );
+
+#if (SPYLOG_LEVEL >= 4 ) // Log level info
+        ::fwCore::HiResTimer timer;
+        timer.start();
+#endif
+
+    ::fwComEd::helper::Image locker ( series->getImage() );
+
+    #if (SPYLOG_LEVEL >= 4 )
+        timer.stop();
+        OSLM_INFO( "Time in to read data : " << timer.getElapsedTimeInMilliSec() );
+#endif
+
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+
+} // namespace vtkGdcmIO
+
diff --git a/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBReaderTest.cpp b/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBReaderTest.cpp
new file mode 100644
index 0000000..61de579
--- /dev/null
+++ b/SrcLib/io/vtkGdcmIO/test/tu/src/SeriesDBReaderTest.cpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/SeriesDB.hpp>
+
+#include <fwTest/Data.hpp>
+#include <fwTest/DicomReaderTest.hpp>
+
+#include <vtkGdcmIO/SeriesDBReader.hpp>
+
+#include "SeriesDBReaderTest.hpp"
+
+CPPUNIT_TEST_SUITE_REGISTRATION( ::vtkGdcmIO::ut::SeriesDBReaderTest );
+
+namespace vtkGdcmIO
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBReaderTest::readSeriesDBTest()
+{
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+
+    const ::boost::filesystem::path path = ::fwTest::Data::dir() / "fw4spl/Patient/Dicom/ACHGenou";
+
+    ::vtkGdcmIO::SeriesDBReader::sptr reader = ::vtkGdcmIO::SeriesDBReader::New();
+    reader->setObject(seriesDB);
+
+    reader->setFolder(path);
+
+    CPPUNIT_ASSERT_NO_THROW(reader->read());
+
+    CPPUNIT_ASSERT_EQUAL( size_t( 1 ), seriesDB->size());
+    ::fwMedData::ImageSeries::sptr series = ::fwMedData::ImageSeries::dynamicCast(seriesDB->front());
+
+    CPPUNIT_ASSERT( ::fwTest::DicomReaderTest::checkSeriesACHGenou( series ) );
+
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace ut
+
+} // namespace vtkGdcmIO
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/CMakeLists.txt b/SrcLib/patch/fwMDSemanticPatch/CMakeLists.txt
new file mode 100644
index 0000000..102d9a4
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/CMakeLists.txt
@@ -0,0 +1,6 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwAtoms
+    fwAtomsPatch
+    fwCore
+)
diff --git a/SrcLib/patch/fwMDSemanticPatch/COPYING b/SrcLib/patch/fwMDSemanticPatch/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/COPYING.LESSER b/SrcLib/patch/fwMDSemanticPatch/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/Properties.cmake b/SrcLib/patch/fwMDSemanticPatch/Properties.cmake
new file mode 100644
index 0000000..336ffe3
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwMDSemanticPatch )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtoms fwAtomsPatch fwCore fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/bin/build.options b/SrcLib/patch/fwMDSemanticPatch/bin/build.options
new file mode 100644
index 0000000..c125249
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/bin/build.options
@@ -0,0 +1,9 @@
+TYPE = 'shared'
+VERSION = '0.1'
+LIB = [
+    'fwData_0-1',
+    'fwCamp_0-1',
+    'fwAtoms_0-1',
+    'fwAtomsPatch_0-1',
+    'fwAtomConversion_0-1',
+]
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/PatchLoader.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/PatchLoader.hpp
new file mode 100644
index 0000000..eb4cb17
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/PatchLoader.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_PATCHLOADER_HPP__
+#define __FWMDSEMANTICPATCH_PATCHLOADER_HPP__
+
+#include "fwMDSemanticPatch/config.hpp"
+
+namespace fwMDSemanticPatch
+{
+
+/// Loads patches by processing .versions and .graphlink files.
+class PatchLoader
+{
+public:
+    /// Computes VersionsManager's link and version tables.
+    FWMDSEMANTICPATCH_API static void loadPatches();
+};
+
+} //namespace fwMDSemanticPatch
+
+#endif /* __FWMDSEMANTICPATCH_PATCHLOADER_HPP__ */
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.hpp
new file mode 100644
index 0000000..f204642
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.hpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_V1TOV2_MEDICALWORKSPACEPATCHER_HPP__
+#define __FWMDSEMANTICPATCH_V1TOV2_MEDICALWORKSPACEPATCHER_HPP__
+
+#include <string>
+
+#include <fwCore/base.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Map.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include "fwAtomsPatch/patcher/DefaultPatcher.hpp"
+#include "fwMDSemanticPatch/config.hpp"
+
+
+namespace fwMDSemanticPatch
+{
+
+namespace V1
+{
+namespace V2
+{
+
+/**
+ * @brief This patcher adds required meta infos on composites describing a 'Medical workspace'.
+ *
+ * Composite describing a 'Medical workspace' contains childs designated by keys 'patientDB', 'planningDB' and
+ * 'processingDB'.
+ */
+class FWMDSEMANTICPATCH_CLASS_API MedicalWorkspacePatcher : public ::fwAtomsPatch::patcher::DefaultPatcher
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (MedicalWorkspacePatcher)(::fwAtomsPatch::patcher::DefaultPatcher), (()),
+                ::fwAtomsPatch::patcher::factory::New< MedicalWorkspacePatcher >);
+
+    /// Constructor
+    FWMDSEMANTICPATCH_API MedicalWorkspacePatcher(::fwAtomsPatch::patcher::IPatcher::Key key);
+
+    /// Destructor
+    FWMDSEMANTICPATCH_API virtual ~MedicalWorkspacePatcher();
+
+    /**
+     * @brief Applies the patch to the specified object
+     *
+     * Adds meta info 'compositeType' with value 'MedicalWorkspace' if current object has childs designated with keys
+     * 'patientDB', 'planningDB' and 'processingDB', and applies patcher 'DefaultPatcher'.
+     */
+    FWMDSEMANTICPATCH_API virtual ::fwAtoms::Object::sptr transformObject(::fwAtoms::Object::sptr object,
+            const std::string& context,
+            const std::string& currentVersion,
+            const std::string& targetVersion);
+
+protected:
+
+    /// Adds a meta info "compositeType" if the object is a composite with a special type.
+    FWMDSEMANTICPATCH_API void addCompositeTypes(::fwAtoms::Object::sptr object);
+
+};
+
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif /* __FWMDSEMANTICPATCH_V1TOV2_MEDICALWORKSPACEPATCHER_HPP__ */
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp
new file mode 100644
index 0000000..328778b
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp
@@ -0,0 +1,58 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_V1_V2_FWDATA_ACQUISITION_HPP__
+#define __FWMDSEMANTICPATCH_V1_V2_FWDATA_ACQUISITION_HPP__
+
+#include <fwAtomsPatch/ISemanticPatch.hpp>
+
+#include "fwMDSemanticPatch/config.hpp"
+
+namespace fwMDSemanticPatch
+{
+
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+/// Patch an acquisition from version 'V1' to 'V2' within 'MedicalData' context.
+class FWMDSEMANTICPATCH_CLASS_API Acquisition : public ::fwAtomsPatch::ISemanticPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro((Acquisition)(::fwAtomsPatch::ISemanticPatch), (()), new Acquisition) ;
+
+    /// Constructor
+    FWMDSEMANTICPATCH_API Acquisition();
+
+    /// Destructor
+    FWMDSEMANTICPATCH_API ~Acquisition();
+
+    /// Copy constructor
+    FWMDSEMANTICPATCH_API Acquisition( const Acquisition &cpy );
+
+    /**
+     * @brief Applies patch
+     * 
+     * Retrieves 'comment' field stored into acquisition's image and moves it into current object 'description'
+     * attribute.
+     */
+    FWMDSEMANTICPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif // __FWMDSEMANTICPATCH_V1_V2_FWDATA_ACQUISITION_HPP__
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Composite.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Composite.hpp
new file mode 100644
index 0000000..9ca2888
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Composite.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_V1_V2_FWDATA_COMPOSITE_HPP__
+#define __FWMDSEMANTICPATCH_V1_V2_FWDATA_COMPOSITE_HPP__
+
+#include <fwAtomsPatch/ISemanticPatch.hpp>
+
+#include "fwMDSemanticPatch/config.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+/// Patch the composite describing a 'Medical workspace' from version 'V1' to 'V2' within 'MedicalData' context.
+class FWMDSEMANTICPATCH_CLASS_API Composite : public ::fwAtomsPatch::ISemanticPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (Composite)(::fwAtomsPatch::ISemanticPatch), (()), new Composite) ;
+
+    /// Constructor
+    FWMDSEMANTICPATCH_API Composite();
+
+    /// Destructor
+    FWMDSEMANTICPATCH_API ~Composite();
+
+    /// Copy constructor
+    FWMDSEMANTICPATCH_API Composite( const Composite &cpy );
+
+    /**
+     * @brief Applies patch
+     *
+     * If the related composite describes a 'Medical workspace' (i.e has value 'MedicalWorkspace' for 'compositeType'
+     * meta info), then converts the composite to a ::fwMedData::SeriesDB and insert model series built from previous 
+     * acquisitions.
+     */
+    FWMDSEMANTICPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif /* __FWMDSEMANTICPATCH_V1_V2_FWDATA_COMPOSITE_HPP__ */
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Patient.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Patient.hpp
new file mode 100644
index 0000000..2b6ed13
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Patient.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_V1_V2_FWDATA_PATIENT_HPP__
+#define __FWMDSEMANTICPATCH_V1_V2_FWDATA_PATIENT_HPP__
+
+#include <fwAtomsPatch/ISemanticPatch.hpp>
+#include "fwMDSemanticPatch/config.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+/// Patch a patient from version 'V1' to 'V2' within 'MedicalData' context.
+class FWMDSEMANTICPATCH_CLASS_API Patient : public ::fwAtomsPatch::ISemanticPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (Patient)(::fwAtomsPatch::ISemanticPatch), (()), new Patient) ;
+
+    /// Constructor
+    FWMDSEMANTICPATCH_API Patient();
+
+    /// Destructor
+    FWMDSEMANTICPATCH_API ~Patient();
+
+    /// Copy constructor
+    FWMDSEMANTICPATCH_API Patient( const Patient &cpy );
+
+    /**
+     * @brief Applies patch.
+     *
+     * Sets the 'patient_id' attribute value to a newly generated UUID.
+     */
+    FWMDSEMANTICPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif // __FWMDSEMANTICPATCH_V1_V2_FWDATA_PATIENT_HPP__
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Study.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Study.hpp
new file mode 100644
index 0000000..a6046f1
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/V1/V2/fwData/Study.hpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_V1_V2_FWDATA_STUDY_HPP__
+#define __FWMDSEMANTICPATCH_V1_V2_FWDATA_STUDY_HPP__
+
+#include <fwAtomsPatch/ISemanticPatch.hpp>
+
+#include "fwMDSemanticPatch/config.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+/// Patch a study from version V'1' to 'V2' within 'MedicalData' context.
+class FWMDSEMANTICPATCH_CLASS_API Study : public ::fwAtomsPatch::ISemanticPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (Study)(::fwAtomsPatch::ISemanticPatch), (()), new Study) ;
+
+    /// Constructor
+    FWMDSEMANTICPATCH_API Study();
+
+    /// Destructor
+    FWMDSEMANTICPATCH_API ~Study();
+
+    /// Copy constructor
+    FWMDSEMANTICPATCH_API Study( const Study &cpy );
+
+    /**
+     * @brief Applies patch.
+     *
+     * Sets the 'instance_uid' attribute value to a newly generated UUID.
+     */
+    FWMDSEMANTICPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif /* __FWMDSEMANTICPATCH_V1_V2_FWDATA_STUDY_HPP__ */
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/config.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/config.hpp
new file mode 100644
index 0000000..1d5d286
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/config.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWMDSEMANTICPATCH_CONFIG_HPP_
+#define _FWMDSEMANTICPATCH_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWMDSEMANTICPATCH_EXPORTS
+            #define FWMDSEMANTICPATCH_API __declspec(dllexport)
+        #else
+            #define FWMDSEMANTICPATCH_API __declspec(dllimport)
+            #define FWMDSEMANTICPATCH_TEMPLATE_API extern "C++"
+        #endif
+
+        #define FWMDSEMANTICPATCH_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWMDSEMANTICPATCH_EXPORTS
+            #define FWMDSEMANTICPATCH_API __attribute__ ((visibility("default")))
+            #define FWMDSEMANTICPATCH_CLASS_API __attribute__ ((visibility("default")))
+            #define FWMDSEMANTICPATCH_TEMPLATE_API extern "C++"
+        #else
+            #define FWMDSEMANTICPATCH_API __attribute__ ((visibility("hidden")))
+            #define FWMDSEMANTICPATCH_CLASS_API __attribute__ ((visibility("hidden")))
+            #define FWMDSEMANTICPATCH_TEMPLATE_API extern "C++"
+        #endif
+
+    #else
+
+        #define FWMDSEMANTICPATCH_API
+        #define FWMDSEMANTICPATCH_CLASS_API
+        #define FWMDSEMANTICPATCH_TEMPLATE_API extern "C++"
+
+    #endif
+
+#endif //_FWMDSEMANTICPATCH_CONFIG_HPP_
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/namespace.hpp b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/namespace.hpp
new file mode 100644
index 0000000..af3f2e6
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/include/fwMDSemanticPatch/namespace.hpp
@@ -0,0 +1,38 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWMDSEMANTICPATCH_NAMESPACE_HPP__
+#define __FWMDSEMANTICPATCH_NAMESPACE_HPP__
+
+/**
+ * @brief Contains the semantic patches within the context "MedicalData".
+ * @namespace fwMDSemanticPatch
+ */
+namespace fwMDSemanticPatch
+{
+
+    /**
+     * @brief Contains the semantic patches to transform atoms from version V1.
+     */
+    namespace V1
+    {
+        /**
+         * @brief Contains the semantic patches to transform atoms from version V1 to version V2.
+         */
+        namespace V2
+        {
+            /**
+             * @brief Contains the semantic patches to transform atoms (from fwData objects) from version V1 to version
+             * V2.
+             */
+            namespace fwData
+            {
+            } // namespace fwData
+        } // namespace V2
+    } // namespace V1
+} // namespace fwMDSemanticPatch
+
+#endif /* __FWMDSEMANTICPATCH_NAMESPACE_HPP__ */
diff --git a/SrcLib/patch/fwMDSemanticPatch/rc/V1.versions b/SrcLib/patch/fwMDSemanticPatch/rc/V1.versions
new file mode 100644
index 0000000..67a26c0
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/rc/V1.versions
@@ -0,0 +1,51 @@
+{
+    "context": "MedicalData",
+    "version_name": "V1",
+    "versions":
+    {
+        "::fwData::Acquisition": "1",
+        "::fwData::Array": "1",
+        "::fwData::Boolean": "1",
+        "::fwData::Camera": "2",
+        "::fwData::Color": "1",
+        "::fwData::Composite": "1",
+        "::fwData::Dictionary": "1",
+        "::fwData::DictionaryOrgan": "1",
+        "::fwData::Edge": "1",
+        "::fwData::Float": "1",
+        "::fwData::Graph": "1",
+        "::fwData::Histogram": "1",
+        "::fwData::Image": "1",
+        "::fwData::Integer": "1",
+        "::fwData::Line": "1",
+        "::fwData::List": "1",
+        "::fwData::Material": "1",
+        "::fwData::Mesh": "1",
+        "::fwData::Model": "1",
+        "::fwData::Node": "1",
+        "::fwData::Patient": "1",
+        "::fwData::PatientDB": "1",
+        "::fwData::Plane": "1",
+        "::fwData::PlaneList": "1",
+        "::fwData::Point": "1",
+        "::fwData::PointList": "1",
+        "::fwData::Port": "1",
+        "::fwData::ProcessObject": "1",
+        "::fwData::ROITraits": "1",
+        "::fwData::Reconstruction": "1",
+        "::fwData::ReconstructionTraits": "1",
+        "::fwData::Resection": "1",
+        "::fwData::ResectionDB": "1",
+        "::fwData::String": "1",
+        "::fwData::StructureTraits": "1",
+        "::fwData::StructureTraitsDictionary": "1",
+        "::fwData::Study": "1",
+        "::fwData::Tag": "1",
+        "::fwData::TransferFunction": "1",
+        "::fwData::TransformationMatrix3D": "1",
+        "::fwData::Vector": "1",
+        "::fwData::Video": "1",
+        "::fwData::location::Folder": "1",
+        "::fwData::location::SingleFile": "1"
+    }
+}
diff --git a/SrcLib/patch/fwMDSemanticPatch/rc/V1ToV2.graphlink b/SrcLib/patch/fwMDSemanticPatch/rc/V1ToV2.graphlink
new file mode 100644
index 0000000..e34697e
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/rc/V1ToV2.graphlink
@@ -0,0 +1,20 @@
+{
+    "context" : "MedicalData",
+    "origin_version" : "V1",
+    "target_version" : "V2",
+    "patcher" : "MedicalWorkspacePatcher",
+    "links" : [
+        {
+            "::fwData::Patient" : "1",
+            "::fwMedData::Patient" : "1"
+        },
+        {
+            "::fwData::Study" : "1",
+            "::fwMedData::Study" : "1"
+        },
+        {
+            "::fwData::Acquisition" : "1",
+            "::fwMedData::ImageSeries" : "1"
+        }
+    ]
+}
diff --git a/SrcLib/patch/fwMDSemanticPatch/rc/V2.versions b/SrcLib/patch/fwMDSemanticPatch/rc/V2.versions
new file mode 100644
index 0000000..2c51d86
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/rc/V2.versions
@@ -0,0 +1,53 @@
+{
+    "context": "MedicalData",
+    "version_name": "V2",
+    "versions":
+    {
+        "::fwData::Array": "1",
+        "::fwData::Boolean": "1",
+        "::fwData::Camera": "2",
+        "::fwData::Color": "1",
+        "::fwData::Composite": "1",
+        "::fwData::Edge": "1",
+        "::fwData::Float": "1",
+        "::fwData::Graph": "1",
+        "::fwData::Histogram": "1",
+        "::fwData::Image": "1",
+        "::fwData::Integer": "1",
+        "::fwData::Line": "1",
+        "::fwData::List": "1",
+        "::fwData::Material": "1",
+        "::fwData::Mesh": "1",
+        "::fwData::Model": "1",
+        "::fwData::Node": "1",
+        "::fwData::Plane": "1",
+        "::fwData::PlaneList": "1",
+        "::fwData::Point": "1",
+        "::fwData::PointList": "1",
+        "::fwData::Port": "1",
+        "::fwData::ProcessObject": "1",
+        "::fwData::ROITraits": "1",
+        "::fwData::Reconstruction": "2",
+        "::fwData::ReconstructionTraits": "1",
+        "::fwData::Resection": "1",
+        "::fwData::ResectionDB": "1",
+        "::fwData::String": "1",
+        "::fwData::StructureTraits": "1",
+        "::fwData::StructureTraitsDictionary": "1",
+        "::fwData::Tag": "1",
+        "::fwData::TransferFunction": "1",
+        "::fwData::TransformationMatrix3D": "1",
+        "::fwData::Vector": "1",
+        "::fwData::Video": "1",
+        "::fwData::location::Folder": "1",
+        "::fwData::location::SingleFile": "1",
+        "::fwMedData::ActivitySeries": "1",
+        "::fwMedData::Equipment": "1",
+        "::fwMedData::ImageSeries": "1",
+        "::fwMedData::ModelSeries": "1",
+        "::fwMedData::Patient": "1",
+        "::fwMedData::Series": "1",
+        "::fwMedData::SeriesDB": "1",
+        "::fwMedData::Study": "1"
+    }
+}
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/PatchLoader.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/PatchLoader.cpp
new file mode 100644
index 0000000..345469c
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/PatchLoader.cpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtomsPatch/VersionsManager.hpp>
+
+#include "fwMDSemanticPatch/PatchLoader.hpp"
+
+namespace fwMDSemanticPatch
+{
+
+void PatchLoader::loadPatches()
+{
+    SPTR(::fwAtomsPatch::VersionsManager) versionManager = ::fwAtomsPatch::VersionsManager::getDefault();
+	#ifdef SPECIALINSTALL
+    		versionManager->buildVersionTable(SHAREPATH "fwMDSemanticPatch_" FWMDSEMANTICPATCH_VER "/");
+    versionManager->buildLinkTable(SHAREPATH "fwMDSemanticPatch_" FWMDSEMANTICPATCH_VER "/");
+	#else
+		versionManager->buildVersionTable("./share/fwMDSemanticPatch_" FWMDSEMANTICPATCH_VER "/");
+    versionManager->buildLinkTable("./share/fwMDSemanticPatch_" FWMDSEMANTICPATCH_VER "/");
+	#endif
+    
+}
+
+} //namespace fwMDSemanticPatch
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.cpp
new file mode 100644
index 0000000..c5ea1fa
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/IPatch.hpp>
+#include <fwAtomsPatch/IStructuralPatch.hpp>
+#include <fwAtomsPatch/StructuralPatchDB.hpp>
+#include <fwAtomsPatch/patcher/registry/macros.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/MedicalWorkspacePatcher.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+
+patcherRegisterMacro(::fwMDSemanticPatch::V1::V2::MedicalWorkspacePatcher, "MedicalWorkspacePatcher");
+
+MedicalWorkspacePatcher::MedicalWorkspacePatcher(::fwAtomsPatch::patcher::IPatcher::Key key):
+        ::fwAtomsPatch::patcher::DefaultPatcher(key)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+MedicalWorkspacePatcher::~MedicalWorkspacePatcher()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr MedicalWorkspacePatcher::transformObject(::fwAtoms::Object::sptr object,
+            const std::string &context,
+            const std::string &currentVersion,
+            const std::string &targetVersion)
+{
+    this->addCompositeTypes(object);
+    return ::fwAtomsPatch::patcher::DefaultPatcher::transformObject(object,context,currentVersion, targetVersion);
+}
+
+// ----------------------------------------------------------------------------
+
+void MedicalWorkspacePatcher::addCompositeTypes(::fwAtoms::Object::sptr object)
+{
+    if( ::fwAtomsPatch::helper::getClassname( object ) == "::fwData::Composite")
+    {
+        ::fwAtoms::Map::sptr values = object->getAttribute< ::fwAtoms::Map >("values");
+        if((*values)["patientDB"] && (*values)["planningDB"] && (*values)["processingDB"])
+        {
+            object->setMetaInfo("compositeType", "MedicalWorkspace");
+        }
+    }
+
+    BOOST_FOREACH( ::fwAtoms::Object::AttributesType::value_type elem, object->getAttributes() )
+    {
+        ::fwAtoms::Object::sptr att = ::fwAtoms::Object::dynamicCast(elem.second);
+        if(att)
+        {
+            this->addCompositeTypes(att);
+        }
+    }
+}
+
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Acquisition.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Acquisition.cpp
new file mode 100644
index 0000000..c55a783
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Acquisition.cpp
@@ -0,0 +1,77 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+Acquisition::Acquisition() : ::fwAtomsPatch::ISemanticPatch()
+{
+    m_originClassname = "::fwData::Acquisition";
+    m_originVersion = "1";
+    this->addContext("MedicalData", "V1", "V2");
+}
+
+// ----------------------------------------------------------------------------
+
+Acquisition::~Acquisition()
+{}
+
+// ----------------------------------------------------------------------------
+
+Acquisition::Acquisition( const Acquisition &cpy ) : ::fwAtomsPatch::ISemanticPatch(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+void Acquisition::apply(
+        const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    ISemanticPatch::apply(previous, current, newVersions);
+    ::fwAtomsPatch::helper::cleanFields( current );
+
+    ::fwAtoms::Object::sptr image = current->getAttribute< ::fwAtoms::Object >("image");
+    ::fwAtoms::Map::sptr fields = image->getAttribute< ::fwAtoms::Map >("fields");
+
+    ::fwAtoms::Map::ConstIteratorType it = fields->find("m_commentId");
+    ::fwAtomsPatch::helper::Object helper(current);
+    if ( it != fields->end() )
+    {
+        ::fwAtoms::Object::sptr value =  ::fwAtoms::Object::dynamicCast( it->second );
+        helper.replaceAttribute("description", ::fwAtoms::String::New(value->getAttribute("value")->getString()));
+    }
+
+    ::fwAtoms::String::sptr uid = current->getAttribute< ::fwAtoms::String >("instance_uid");
+    if( uid->getValue().empty() )
+    {
+        helper.replaceAttribute("instance_uid", ::fwAtoms::String::New( ::fwTools::UUID::generateUUID() ));
+    }
+
+}
+
+// ----------------------------------------------------------------------------
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Composite.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Composite.cpp
new file mode 100644
index 0000000..3ca1829
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Composite.cpp
@@ -0,0 +1,316 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+#include <vector>
+
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/Blob.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwMedData/ActivitySeries.hpp>
+
+#include <fwMemory/BufferObject.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/fwData/Composite.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+typedef std::map< ::fwAtoms::Object::sptr, ::fwAtoms::Object::sptr > Image2ModelType;
+
+Composite::Composite() : ::fwAtomsPatch::ISemanticPatch()
+{
+    m_originClassname = "::fwData::Composite";
+    m_originVersion = "1";
+    this->addContext("MedicalData", "V1", "V2");
+}
+
+// ----------------------------------------------------------------------------
+
+Composite::~Composite()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+Composite::Composite( const Composite &cpy ) : ::fwAtomsPatch::ISemanticPatch(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void processPlanning(
+        const ::fwAtoms::Map::sptr& oldCompositeMap,
+        const ::fwAtoms::Sequence::sptr& series,
+        const Image2ModelType& image2Model,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+        ::fwAtoms::Object::sptr oldPlanningDB = ::fwAtoms::Object::dynamicCast( (*oldCompositeMap)["planningDB"] );
+        ::fwAtoms::Map::sptr oldPlannings = oldPlanningDB->getAttribute< ::fwAtoms::Map >("values");
+
+        BOOST_FOREACH( ::fwAtoms::Map::value_type oldPlanningAtom, oldPlannings->getValue() )
+        {
+            ::fwAtoms::Map::sptr oldPlanning
+                = ::fwAtoms::Object::dynamicCast(oldPlanningAtom.second)->getAttribute< ::fwAtoms::Map >("values");
+
+            SLM_ASSERT("Didn't find 'acquisition' in planning",
+                    oldPlanning->getValue().find("acquisition") != oldPlanning->getValue().end());
+            ::fwAtoms::Base::sptr acquisition = oldPlanning->getValue().find("acquisition")->second;
+            ::fwAtoms::Object::sptr acqObj = ::fwAtoms::Object::dynamicCast(acquisition);
+            SLM_ASSERT("Failed to cast acquisition to object", acqObj);
+
+            Image2ModelType::const_iterator it = image2Model.find(newVersions[acqObj]);
+            SLM_ASSERT("Didn't find image series related to acquisition", it != image2Model.end());
+            ::fwAtoms::Object::sptr imageSeries = it->first;
+
+            ::fwAtoms::Object::sptr resectionDB
+                = ::fwAtoms::Object::dynamicCast(oldPlanning->getValue().find("resectionDB")->second);
+
+            // Retrieves expert who performed the resection
+            ::fwAtoms::Object::sptr expert
+                = ::fwAtoms::Object::dynamicCast(oldPlanning->getValue().find("expert")->second);
+
+            ::fwAtoms::Sequence::sptr experts = ::fwAtoms::Sequence::New();
+            experts->push_back( ::fwAtoms::String::dynamicCast(expert->getAttribute< ::fwAtoms::String >("value")));
+
+            // Retrieves resection information
+            ::fwAtoms::Object::sptr information
+                = ::fwAtoms::Object::dynamicCast(oldPlanning->getValue().find("information")->second);
+            ::fwAtoms::String::sptr informationStr
+                = ::fwAtoms::String::dynamicCast(information->getAttribute< ::fwAtoms::String >("value"));
+
+            // Retrieves resection date and time
+            ::fwAtoms::Object::sptr dateTimeObj
+                = ::fwAtoms::Object::dynamicCast(oldPlanning->getValue().find("startDateTime")->second);
+            ::fwAtoms::String::sptr dateTimeStr
+                = ::fwAtoms::String::dynamicCast(dateTimeObj->getAttribute< ::fwAtoms::String >("value"));
+
+            ::fwAtoms::String::sptr time = ::fwAtoms::String::New("");
+            ::fwAtoms::String::sptr date = ::fwAtoms::String::New("");
+
+            std::string dateTimeStd = dateTimeStr->getString();
+            std::vector< std::string > strs;
+            ::boost::split(strs, dateTimeStd, ::boost::is_any_of(" "));
+
+            if(strs.size() >= 2)
+            {
+                date->setValue(strs[0]);
+                time->setValue(strs[1]);
+            }
+
+            ::fwAtomsPatch::StructuralCreatorDB::sptr creators = ::fwAtomsPatch::StructuralCreatorDB::getDefault();
+            ::fwAtoms::Object::sptr newActivitySeries = creators->create( "::fwMedData::ActivitySeries", "1");
+
+            ::fwAtoms::Object::sptr imgComposite = ::fwAtoms::Object::New();
+            ::fwAtomsPatch::helper::setClassname(imgComposite, "::fwData::Composite");
+            ::fwAtomsPatch::helper::setVersion(imgComposite, "1");
+            ::fwAtomsPatch::helper::generateID(imgComposite);
+            ::fwAtomsPatch::helper::cleanFields(imgComposite);
+
+            ::fwAtomsPatch::helper::Object imgCompositeHelper(imgComposite);
+            ::fwAtoms::Map::sptr compositeMap = ::fwAtoms::Map::New();
+            compositeMap->insert("OptionalInputImageKey", imageSeries->getAttribute< ::fwAtoms::Object >("image"));
+            imgCompositeHelper.addAttribute("values", compositeMap);
+
+            ::fwAtoms::Map::sptr activityDataMap = ::fwAtoms::Map::New();
+            activityDataMap->insert("resectionDB", resectionDB);
+            activityDataMap->insert("modelSeries", it->second);
+            activityDataMap->insert("imageSeries", imgComposite);
+
+            ::fwAtoms::Object::sptr mapObj = ::fwAtoms::Object::New();
+            ::fwAtomsPatch::helper::setClassname(mapObj, "::fwData::Composite");
+            ::fwAtomsPatch::helper::setVersion(mapObj, "1");
+            ::fwAtomsPatch::helper::generateID(mapObj);
+            ::fwAtomsPatch::helper::cleanFields(mapObj);
+
+            ::fwAtomsPatch::helper::Object mapObjHelper(mapObj);
+            mapObjHelper.addAttribute("values", activityDataMap);
+
+            ::fwAtomsPatch::helper::Object helperActivity(newActivitySeries);
+            helperActivity.replaceAttribute("activity_config_id", ::fwAtoms::String::New("Resection"));
+            helperActivity.replaceAttribute("data", mapObj);
+
+            helperActivity.replaceAttribute("modality", ::fwAtoms::String::New("OT") );
+            helperActivity.replaceAttribute("instance_uid", ::fwAtoms::String::New(::fwTools::UUID::generateUUID()));
+            helperActivity.replaceAttribute("date", date);
+            helperActivity.replaceAttribute("time", time);
+            helperActivity.replaceAttribute("performing_physicians_name", experts);
+            helperActivity.replaceAttribute("description" , informationStr);
+            helperActivity.replaceAttribute("patient", imageSeries->getAttribute< ::fwAtoms::Object >("patient"));
+            helperActivity.replaceAttribute("study", imageSeries->getAttribute< ::fwAtoms::Object >("study"));
+            helperActivity.replaceAttribute("equipment", imageSeries->getAttribute< ::fwAtoms::Object >("equipment"));
+
+            series->push_back(newActivitySeries);
+        }
+}
+
+// ----------------------------------------------------------------------------
+
+void Composite::apply(
+        const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    Image2ModelType image2Model;
+
+    ISemanticPatch::apply(previous, current, newVersions);
+
+    // Create helper
+    ::fwAtomsPatch::helper::Object helper(current);
+
+    // If fwData::Composite is a MedicalWorkspace
+    if ( previous->getMetaInfo("compositeType") == "MedicalWorkspace" )
+    {
+        // Update type/version
+        ::fwAtomsPatch::helper::setClassname( current, "::fwMedData::SeriesDB" );
+        ::fwAtomsPatch::helper::setVersion( current, "1" );
+
+        // Update Attributes
+        ::fwAtomsPatch::helper::cleanFields( current );
+        // Replace fwAtoms::Map by fwAtoms::Sequence ( have the same key )
+        ::fwAtoms::Sequence::sptr series = ::fwAtoms::Sequence::New();
+        helper.replaceAttribute( "values", series );
+
+        // Add ImageSeries and create ModelSeries if they are necessary
+        ::fwAtoms::Map::sptr oldCompositeMap = previous->getAttribute< ::fwAtoms::Map >("values");
+        ::fwAtoms::Object::sptr oldPatientDB =
+                ::fwAtoms::Object::dynamicCast( (*oldCompositeMap)["patientDB"] );
+        ::fwAtoms::Sequence::sptr oldPatients = oldPatientDB->getAttribute< ::fwAtoms::Sequence >("patients");
+
+        ::fwAtomsPatch::StructuralCreatorDB::sptr creators = ::fwAtomsPatch::StructuralCreatorDB::getDefault();
+
+        BOOST_FOREACH( ::fwAtoms::Base::sptr oldPatientAtom, oldPatients->getValue() )
+        {
+            ::fwAtoms::Object::sptr oldPatient = ::fwAtoms::Object::dynamicCast( oldPatientAtom );
+            ::fwAtoms::Object::sptr newPatient = newVersions[oldPatient];
+
+            ::fwAtoms::Sequence::sptr oldStudies = oldPatient->getAttribute< ::fwAtoms::Sequence >("studies");
+
+            BOOST_FOREACH( ::fwAtoms::Base::sptr oldStudyAtom, oldStudies->getValue() )
+            {
+                ::fwAtoms::Object::sptr oldStudy = ::fwAtoms::Object::dynamicCast( oldStudyAtom );
+                ::fwAtoms::Object::sptr newStudy = newVersions[oldStudy];
+
+                ::fwAtoms::Sequence::sptr oldAcquisitions =
+                        oldStudy->getAttribute< ::fwAtoms::Sequence >("acquisitions");
+
+                BOOST_FOREACH( ::fwAtoms::Base::sptr oldAcqAtom, oldAcquisitions->getValue() )
+                {
+                    ::fwAtoms::Object::sptr oldAcq = ::fwAtoms::Object::dynamicCast( oldAcqAtom );
+
+                    // finalize and push newImgSeries
+                    ::fwAtoms::Object::sptr newImgSeries = newVersions[oldAcq];
+                    ::fwAtomsPatch::helper::Object imgSeriesHelper (newImgSeries);
+                    ::fwAtoms::Object::sptr clonedPatient = ::fwAtoms::Object::dynamicCast(newPatient->clone());
+                    ::fwAtomsPatch::helper::changeUID(clonedPatient);
+
+                    imgSeriesHelper.replaceAttribute("patient", clonedPatient );
+                    ::fwAtoms::Object::sptr clonedStudy = ::fwAtoms::Object::dynamicCast(newStudy->clone());
+                    ::fwAtomsPatch::helper::changeUID(clonedStudy);
+
+                    imgSeriesHelper.replaceAttribute("study", clonedStudy );
+                    imgSeriesHelper.replaceAttribute("modality", oldStudy->getAttribute("modality")->clone() );
+
+                    ::fwAtoms::String::sptr institution;
+                    institution = ::fwAtoms::String::dynamicCast( oldStudy->getAttribute("hospital")->clone() );
+                    ::fwAtoms::Object::sptr equipment = newImgSeries->getAttribute< ::fwAtoms::Object >("equipment");
+                    ::fwAtomsPatch::helper::Object equipmentHelper(equipment);
+                    equipmentHelper.replaceAttribute("institution_name", institution);
+
+
+                    // Set study date and time if necessary
+                    ::fwAtoms::String::sptr studyDate = newStudy->getAttribute< ::fwAtoms::String >("date");
+                    ::fwAtomsPatch::helper::Object studyHelper(clonedStudy);
+
+                    if ( studyDate->getValue().empty() )
+                    {
+                        studyHelper.replaceAttribute("date", newImgSeries->getAttribute("date")->clone());
+                    }
+
+                    ::fwAtoms::String::sptr studyTime = newStudy->getAttribute< ::fwAtoms::String >("time");
+                    if ( studyTime->getValue().empty() )
+                    {
+                        studyHelper.replaceAttribute("time", newImgSeries->getAttribute("time")->clone());
+                    }
+
+                    series->push_back( newImgSeries );
+
+                    // finalize and push newModelSeries
+                    ::fwAtoms::Sequence::sptr oldReconstructions =
+                            oldAcq->getAttribute< ::fwAtoms::Sequence >("reconstructions");
+
+                    if ( oldReconstructions->size() > 0 )
+                    {
+                        // Create new model series
+                        ::fwAtoms::Object::sptr newModelSeries =
+                                creators->create( "::fwMedData::ModelSeries", "1");
+
+                        ::fwAtomsPatch::helper::Object msHelper (newModelSeries);
+                        ::fwAtoms::Object::sptr msPatient = ::fwAtoms::Object::dynamicCast(clonedPatient->clone());
+                        ::fwAtomsPatch::helper::changeUID(msPatient);
+                        msHelper.replaceAttribute("patient", msPatient );
+
+                        ::fwAtoms::Object::sptr msStudy = ::fwAtoms::Object::dynamicCast(clonedStudy->clone());
+                        ::fwAtomsPatch::helper::changeUID(msStudy);
+                        msHelper.replaceAttribute("study", msStudy );
+
+                        ::fwAtoms::Object::sptr msEquipment = ::fwAtoms::Object::dynamicCast(equipment->clone());
+                        ::fwAtomsPatch::helper::changeUID(msEquipment);
+                        msHelper.replaceAttribute("equipment", msEquipment );
+
+                        msHelper.replaceAttribute("modality", ::fwAtoms::String::New("OT") );
+                        msHelper.replaceAttribute("instance_uid" ,
+                                ::fwAtoms::String::New(::fwTools::UUID::generateUUID()) );
+                        msHelper.replaceAttribute("date" , newImgSeries->getAttribute("date")->clone() );
+                        msHelper.replaceAttribute("time", newImgSeries->getAttribute("time")->clone() );
+                        msHelper.replaceAttribute("performing_physicians_name" ,
+                                newImgSeries->getAttribute("performing_physicians_name")->clone() );
+                        msHelper.replaceAttribute("description" , newImgSeries->getAttribute("description")->clone() );
+
+                        ::fwAtoms::Sequence::sptr newReconstructions =
+                                newModelSeries->getAttribute< ::fwAtoms::Sequence >("reconstruction_db");
+                        BOOST_FOREACH( ::fwAtoms::Base::sptr oldRecAtom, oldReconstructions->getValue() )
+                        {
+                            ::fwAtoms::Object::sptr oldRec = ::fwAtoms::Object::dynamicCast( oldRecAtom );
+                            newReconstructions->push_back(newVersions[oldRec]);
+                        }
+
+                        image2Model[newImgSeries] = newModelSeries;
+                        series->push_back( newModelSeries );
+                    }
+                }
+            }
+        }
+
+        processPlanning(oldCompositeMap, series, image2Model, newVersions);
+
+    } // End "MedicalWorkspace"
+}
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Patient.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Patient.cpp
new file mode 100644
index 0000000..15abda9
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Patient.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/fwData/Patient.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+Patient::Patient() : ::fwAtomsPatch::ISemanticPatch()
+{
+    m_originClassname = "::fwData::Patient";
+    m_originVersion = "1";
+    this->addContext("MedicalData", "V1", "V2");
+}
+
+// ----------------------------------------------------------------------------
+
+Patient::~Patient()
+{}
+
+// ----------------------------------------------------------------------------
+
+Patient::Patient( const Patient &cpy ) : ::fwAtomsPatch::ISemanticPatch(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+void Patient::apply(
+        const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    ISemanticPatch::apply(previous, current, newVersions);
+    ::fwAtomsPatch::helper::cleanFields( current );
+    ::fwAtomsPatch::helper::Object helper( current );
+
+    ::fwAtoms::String::sptr uid = current->getAttribute< ::fwAtoms::String >("patient_id");
+    if( uid->getValue().empty() )
+    {
+        helper.replaceAttribute("patient_uid", ::fwAtoms::String::New(::fwTools::UUID::generateUUID()));
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Study.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Study.cpp
new file mode 100644
index 0000000..174ccb1
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/Study.cpp
@@ -0,0 +1,67 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/UUID.hpp>
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/fwData/Study.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+Study::Study() : ::fwAtomsPatch::ISemanticPatch()
+{
+    m_originClassname = "::fwData::Study";
+    m_originVersion = "1";
+    this->addContext("MedicalData", "V1", "V2");
+}
+
+// ----------------------------------------------------------------------------
+
+Study::~Study()
+{}
+
+// ----------------------------------------------------------------------------
+
+Study::Study( const Study &cpy ) : ::fwAtomsPatch::ISemanticPatch(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+void Study::apply(
+        const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    ISemanticPatch::apply(previous, current, newVersions);
+    ::fwAtomsPatch::helper::cleanFields( current );
+    ::fwAtomsPatch::helper::Object helper( current );
+
+    ::fwAtoms::String::sptr uid = current->getAttribute< ::fwAtoms::String >("instance_uid");
+    if( uid->getValue().empty() )
+    {
+        helper.replaceAttribute("instance_uid", ::fwAtoms::String::New(::fwTools::UUID::generateUUID()));
+    }
+}
+
+// ----------------------------------------------------------------------------
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
diff --git a/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/autoload.cpp b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/autoload.cpp
new file mode 100644
index 0000000..377ca0e
--- /dev/null
+++ b/SrcLib/patch/fwMDSemanticPatch/src/fwMDSemanticPatch/V1/V2/fwData/autoload.cpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtomsPatch/SemanticPatchDB.hpp>
+
+#include "fwMDSemanticPatch/V1/V2/fwData/Composite.hpp"
+#include "fwMDSemanticPatch/V1/V2/fwData/Study.hpp"
+#include "fwMDSemanticPatch/V1/V2/fwData/Patient.hpp"
+#include "fwMDSemanticPatch/V1/V2/fwData/Acquisition.hpp"
+
+namespace fwMDSemanticPatch
+{
+namespace V1
+{
+namespace V2
+{
+namespace fwData
+{
+
+/// Registers contextual patches dedicated to conversions from version 'V1' to version 'V2'.
+struct runner
+{
+    runner()
+    {
+        ::fwAtomsPatch::SemanticPatchDB::sptr contextPatchDB = ::fwAtomsPatch::SemanticPatchDB::getDefault();
+        contextPatchDB->registerPatch(::fwMDSemanticPatch::V1::V2::fwData::Composite::New());
+        contextPatchDB->registerPatch(::fwMDSemanticPatch::V1::V2::fwData::Study::New());
+        contextPatchDB->registerPatch(::fwMDSemanticPatch::V1::V2::fwData::Patient::New());
+        contextPatchDB->registerPatch(::fwMDSemanticPatch::V1::V2::fwData::Acquisition::New());
+    }
+
+    static runner r;
+};
+
+runner runner::r;
+
+} // namespace fwData
+} // namespace V2
+} // namespace V1
+} // namespace fwMDSemanticPatch
+
diff --git a/SrcLib/patch/fwStructuralPatch/CMakeLists.txt b/SrcLib/patch/fwStructuralPatch/CMakeLists.txt
new file mode 100644
index 0000000..b9c8451
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/CMakeLists.txt
@@ -0,0 +1,4 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwAtomsPatch
+)
diff --git a/SrcLib/patch/fwStructuralPatch/COPYING b/SrcLib/patch/fwStructuralPatch/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/patch/fwStructuralPatch/COPYING.LESSER b/SrcLib/patch/fwStructuralPatch/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/patch/fwStructuralPatch/Properties.cmake b/SrcLib/patch/fwStructuralPatch/Properties.cmake
new file mode 100644
index 0000000..30307fe
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwStructuralPatch )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwAtoms fwAtomsPatch fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/patch/fwStructuralPatch/bin/build.options b/SrcLib/patch/fwStructuralPatch/bin/build.options
new file mode 100644
index 0000000..aabe31a
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/bin/build.options
@@ -0,0 +1,11 @@
+TYPE = 'shared'
+VERSION = '0.1'
+#USE = []
+LIB = [
+    'fwData_0-1',
+    'fwDataCamp_0-1',
+    'fwCamp_0-1',
+    'fwAtoms_0-1',
+    'fwAtomsPatch_0-1',
+    'fwAtomConversion_0-1',
+]
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/PatchLoader.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/PatchLoader.hpp
new file mode 100644
index 0000000..d6cfb10
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/PatchLoader.hpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_PATCHLOADER_HPP__
+#define __FWSTRUCTURALPATCH_PATCHLOADER_HPP__
+
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+
+/// Loads patches.
+class PatchLoader
+{
+public:
+    /// Function used to force link.
+    FWSTRUCTURALPATCH_API static void loadPatches();
+};
+
+} //namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_PATCHLOADER_HPP__ */
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/config.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/config.hpp
new file mode 100644
index 0000000..a60dd32
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/config.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWSTRUCTURALPATCH_CONFIG_HPP_
+#define _FWSTRUCTURALPATCH_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWSTRUCTURALPATCH_EXPORTS
+            #define FWSTRUCTURALPATCH_API __declspec(dllexport)
+        #else
+            #define FWSTRUCTURALPATCH_API __declspec(dllimport)
+            #define FWSTRUCTURALPATCH_TEMPLATE_API extern "C++"
+        #endif
+
+        #define FWSTRUCTURALPATCH_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWSTRUCTURALPATCH_EXPORTS
+            #define FWSTRUCTURALPATCH_API __attribute__ ((visibility("default")))
+            #define FWSTRUCTURALPATCH_CLASS_API __attribute__ ((visibility("default")))
+            #define FWSTRUCTURALPATCH_TEMPLATE_API extern "C++"
+        #else
+            #define FWSTRUCTURALPATCH_API __attribute__ ((visibility("hidden")))
+            #define FWSTRUCTURALPATCH_CLASS_API __attribute__ ((visibility("hidden")))
+            #define FWSTRUCTURALPATCH_TEMPLATE_API extern "C++"
+        #endif
+
+    #else
+
+        #define FWSTRUCTURALPATCH_API
+        #define FWSTRUCTURALPATCH_CLASS_API
+        #define FWSTRUCTURALPATCH_TEMPLATE_API extern "C++"
+
+    #endif
+
+#endif //_FWSTRUCTURALPATCH_CONFIG_HPP_
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp
new file mode 100644
index 0000000..18aa61a
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_ACTIVITYSERIES1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_ACTIVITYSERIES1_HPP__
+
+#include <fwAtomsPatch/IStructuralCreator.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Series1.hpp"
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::ActivitySeries version 1.
+class FWSTRUCTURALPATCH_CLASS_API ActivitySeries1 : public ::fwStructuralPatch::creator::fwMedData::Series1
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (ActivitySeries1)(::fwStructuralPatch::creator::fwMedData::Series1),(()), new ActivitySeries1);
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API ActivitySeries1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~ActivitySeries1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API ActivitySeries1( const ActivitySeries1 &cpy );
+
+    /**
+     * @brief Creates the specified object.
+     */
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_ACTIVITYSERIES1_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Equipment1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Equipment1.hpp
new file mode 100644
index 0000000..50a3dda
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Equipment1.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_EQUIPMENT1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_EQUIPMENT1_HPP__
+
+#include <fwAtomsPatch/IStructuralCreator.hpp>
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::Equipment version '1'.
+class FWSTRUCTURALPATCH_CLASS_API Equipment1 : public ::fwAtomsPatch::IStructuralCreator
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro( (Equipment1)(::fwAtomsPatch::IStructuralCreator), (()), new Equipment1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API Equipment1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~Equipment1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API Equipment1( const Equipment1 &cpy );
+
+    /// Create the specified object (sets 'institution_name' attribute).
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_EQUIPMENT1_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp
new file mode 100644
index 0000000..a3bcbfe
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_IMAGESERIES1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_IMAGESERIES1_HPP__
+
+#include "fwStructuralPatch/config.hpp"
+#include "fwStructuralPatch/creator/fwMedData/Series1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::ImageSeries version '1'.
+class FWSTRUCTURALPATCH_CLASS_API ImageSeries1 : public ::fwStructuralPatch::creator::fwMedData::Series1
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ImageSeries1)(::fwStructuralPatch::creator::fwMedData::Series1),
+            (()), new ImageSeries1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API ImageSeries1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~ImageSeries1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API ImageSeries1( const ImageSeries1 &cpy );
+
+    /// Creates the specified object (sets 'image' attribute) and calls creator 'Series1'.
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_IMAGESERIES1_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp
new file mode 100644
index 0000000..e50939f
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_MODELSERIES1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_MODELSERIES1_HPP__
+
+#include "fwStructuralPatch/config.hpp"
+#include "fwStructuralPatch/creator/fwMedData/Series1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::ModelSeries version '1'.
+class FWSTRUCTURALPATCH_CLASS_API ModelSeries1 : public ::fwStructuralPatch::creator::fwMedData::Series1
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (ModelSeries1)(::fwStructuralPatch::creator::fwMedData::Series1),
+            (()), new ModelSeries1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API ModelSeries1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~ModelSeries1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API ModelSeries1( const ModelSeries1 &cpy );
+
+    /// Creates the specified object (sets 'reconstruction_db' attribute) and calls creator 'Series1'.
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_MODELSERIES1_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Patient1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Patient1.hpp
new file mode 100644
index 0000000..4d69790
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Patient1.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_PATIENT1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_PATIENT1_HPP__
+
+#include <fwAtomsPatch/IStructuralCreator.hpp>
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::Patient version '1'.
+class FWSTRUCTURALPATCH_CLASS_API Patient1 : public ::fwAtomsPatch::IStructuralCreator
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Patient1)(::fwAtomsPatch::IStructuralCreator), (()), new Patient1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API Patient1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~Patient1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API Patient1( const Patient1 &cpy );
+
+    /// Creates the specified object (sets 'name', 'patient_id', 'birth_date' and 'sex' attributes).
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_CREATOR_PATIENT1_HPP__ */
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Series1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Series1.hpp
new file mode 100644
index 0000000..a98870e
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Series1.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_SERIES1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_SERIES1_HPP__
+
+#include <fwAtomsPatch/IStructuralCreator.hpp>
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::Series version 1.
+class FWSTRUCTURALPATCH_CLASS_API Series1 : public ::fwAtomsPatch::IStructuralCreator
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Series1)(::fwAtomsPatch::IStructuralCreator),(()), new Series1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API Series1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~Series1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API Series1( const Series1 &cpy );
+
+    /**
+     * @brief Creates the specified object.
+     *
+     * Calls creators for 'patient', 'study' and 'equipment' attributes and sets remaining attributes.
+     */
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_SERIES1_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Study1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Study1.hpp
new file mode 100644
index 0000000..a4a137c
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/creator/fwMedData/Study1.hpp
@@ -0,0 +1,50 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_STUDY1_HPP__
+#define __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_STUDY1_HPP__
+
+#include <fwAtomsPatch/IStructuralCreator.hpp>
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+/// Structural creator for ::fwMedData::Study version '1'.
+class FWSTRUCTURALPATCH_CLASS_API Study1 : public ::fwAtomsPatch::IStructuralCreator
+{
+
+public:
+
+    fwCoreClassDefinitionsWithFactoryMacro( (Study1)(::fwAtomsPatch::IStructuralCreator),(()), new Study1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API Study1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~Study1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API Study1( const Study1 &cpy );
+
+    /**
+     * @brief Creates the specified object.
+     *
+     * Sets 'instance_uid', 'date', 'time', 'referring_physician_name', 'description' and 'patient_age' attributes.
+     */
+    FWSTRUCTURALPATCH_API virtual ::fwAtoms::Object::sptr create();
+
+};
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_CREATOR_FWMEDDATA_STUDY1_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp
new file mode 100644
index 0000000..0b59be4
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp
@@ -0,0 +1,61 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1_HPP__
+#define __FWSTRUCTURALPATCH_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1_HPP__
+
+#include <fwAtomsPatch/IStructuralPatch.hpp>
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Acquisition
+{
+
+/// Transforms an acquisition in version '1' to an image series in version '1'.
+class FWSTRUCTURALPATCH_CLASS_API V1ToFwMedDataImageSeriesV1 : public ::fwAtomsPatch::IStructuralPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (V1ToFwMedDataImageSeriesV1)(::fwStructuralPatch::fwData::Acquisition::V1ToFwMedDataImageSeriesV1),
+            (()),
+            new V1ToFwMedDataImageSeriesV1);
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataImageSeriesV1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~V1ToFwMedDataImageSeriesV1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataImageSeriesV1( const V1ToFwMedDataImageSeriesV1 &cpy );
+
+    /**
+     * @brief Applies patch
+     *
+     * Removes attributes from acquisition, changes 'uid' attribute to 'instance_uid', adds attributes 'modality',
+     * 'patient', 'equipment', 'performing_physicians_name', 'time' and 'date'.
+     */
+    FWSTRUCTURALPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+
+} // namespace Acquisition
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1_HPP__ */
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp
new file mode 100644
index 0000000..1355e25
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1_HPP__
+#define __FWSTRUCTURALPATCH_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1_HPP__
+
+#include <fwAtomsPatch/IStructuralPatch.hpp>
+
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Patient
+{
+
+/// Transforms a ::fwData::Patient to a ::fwMedData::Patient.
+class FWSTRUCTURALPATCH_CLASS_API V1ToFwMedDataPatientV1 : public ::fwAtomsPatch::IStructuralPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (V1ToFwMedDataPatientV1)(::fwStructuralPatch::fwData::Patient::V1ToFwMedDataPatientV1),
+            (()),
+            new V1ToFwMedDataPatientV1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataPatientV1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~V1ToFwMedDataPatientV1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataPatientV1( const V1ToFwMedDataPatientV1 &cpy );
+
+    /**
+     * @brief Applies patch
+     *
+     * Merges 'firstname' and 'name' attributes, removes 'db_id' and 'studies', updates attribues.
+     */
+    FWSTRUCTURALPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace Patient
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1_HPP__ */
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp
new file mode 100644
index 0000000..46b2c37
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_FWDATA_RECONSTRUCTION_V1TOV2_HPP__
+#define __FWSTRUCTURALPATCH_FWDATA_RECONSTRUCTION_V1TOV2_HPP__
+
+#include <fwAtomsPatch/IStructuralPatch.hpp>
+
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Reconstruction
+{
+
+/// Structural patch to convert a fwData::Reconstruction from version '1' to version '2'.
+class FWSTRUCTURALPATCH_CLASS_API V1ToV2 : public ::fwAtomsPatch::IStructuralPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (V1ToV2)(::fwStructuralPatch::fwData::Reconstruction::V1ToV2), (()), new V1ToV2) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API V1ToV2();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~V1ToV2();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API V1ToV2( const V1ToV2 &cpy );
+
+    /**
+     * @brief Applies patch
+     *
+     * Removes attributes from reconstruction.
+     */
+    FWSTRUCTURALPATCH_API virtual void apply(
+            const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+
+} // namespace Reconstruction
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_FWDATA_RECONSTRUCTION_V1TOV2_HPP__ */
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp
new file mode 100644
index 0000000..6edea63
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1_HPP__
+#define __FWSTRUCTURALPATCH_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1_HPP__
+
+#include <fwAtomsPatch/IStructuralPatch.hpp>
+
+#include "fwStructuralPatch/config.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Study
+{
+
+/// Transforms a ::fwData::Study to a ::fwMedData::Study.
+class FWSTRUCTURALPATCH_CLASS_API V1ToFwMedDataStudyV1 : public ::fwAtomsPatch::IStructuralPatch
+{
+public:
+    fwCoreClassDefinitionsWithFactoryMacro(
+            (V1ToFwMedDataStudyV1)(::fwStructuralPatch::fwData::Study::V1ToFwMedDataStudyV1),
+            (()),
+            new V1ToFwMedDataStudyV1) ;
+
+    /// Constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataStudyV1();
+
+    /// Destructor
+    FWSTRUCTURALPATCH_API ~V1ToFwMedDataStudyV1();
+
+    /// Copy constructor
+    FWSTRUCTURALPATCH_API V1ToFwMedDataStudyV1( const V1ToFwMedDataStudyV1 &cpy );
+
+    /**
+     * @brief Applies patch
+     *
+     * Removes attributes 'hospital', 'modality', 'acquisition_zone', 'ris_id', 'db_id' and 'acquisitions', renames
+     * 'uid' to 'instance_uid', adds 'referring_physicians_name' and 'patient_age'.
+     */
+    FWSTRUCTURALPATCH_API virtual void apply(const ::fwAtoms::Object::sptr& previous,
+            const ::fwAtoms::Object::sptr& current,
+            ::fwAtomsPatch::IPatch::NewVersionsType& newVersions);
+
+};
+
+} // namespace Study
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+#endif /* __FWSTRUCTURALPATCH_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1_HPP__ */
+
diff --git a/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/namespace.hpp b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/namespace.hpp
new file mode 100644
index 0000000..2eef622
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/include/fwStructuralPatch/namespace.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_NAMESPACE_HPP__
+#define __FWSTRUCTURALPATCH_NAMESPACE_HPP__
+
+/**
+ * @brief Contains creators and structural patches.
+ * @namespace fwStructuralPatch
+ */
+namespace fwStructuralPatch
+{
+
+    /**
+     * @brief Contains creators (implementation if ::fwAtomsPatch::IStructuralCreator).
+     * @namespace fwStructuralPatch::creator
+     */
+    namespace creator
+    {
+
+        /**
+         * @brief Contains creators for fwMedData.
+         * @namespace fwStructuralPatch::creator::fwMedData
+         */
+        namespace fwMedData
+        {
+        }
+    } // namespace creator
+
+    /// Contains the structural patch (::fwAtomsPatch::IStructuralPatch) to tranforms atoms from fwData objects.
+    namespace fwData
+    {
+        /// Contains the structural patch to transform atoms from fwData::Acquisition.
+        namespace Acquisition
+        {
+        }
+
+        /// Contains the structural patch to transform atoms from fwData::Patient.
+        namespace Patient
+        {
+        }
+
+        /// Contains the structural patch to transform atoms from fwData::Reconstruction.
+        namespace Reconstruction
+        {
+        }
+
+        /// Contains the structural patch to transform atoms from fwData::Study.
+        namespace Study
+        {
+        }
+    } // namespace fwData
+
+} // namespace fwStructuralPatch
+
+#endif // __FWSTRUCTURALPATCH_NAMESPACE_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/PatchLoader.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/PatchLoader.cpp
new file mode 100644
index 0000000..5b14ed8
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/PatchLoader.cpp
@@ -0,0 +1,17 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwStructuralPatch/PatchLoader.hpp"
+
+namespace fwStructuralPatch
+{
+
+void PatchLoader::loadPatches()
+{
+}
+
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/autoload.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/autoload.cpp
new file mode 100644
index 0000000..344f701
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/autoload.cpp
@@ -0,0 +1,35 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwAtomsPatch/StructuralPatchDB.hpp>
+
+#include "fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp"
+#include "fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp"
+#include "fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp"
+#include "fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp"
+
+
+namespace fwStructuralPatch
+{
+
+/// Registers structural patches dedicated to conversions from version '1' to version '2'.
+struct runner
+{
+    runner()
+    {
+        ::fwAtomsPatch::StructuralPatchDB::sptr structuralPatches = ::fwAtomsPatch::StructuralPatchDB::getDefault();
+        structuralPatches->registerPatch(::fwStructuralPatch::fwData::Reconstruction::V1ToV2::New());
+        structuralPatches->registerPatch(::fwStructuralPatch::fwData::Patient::V1ToFwMedDataPatientV1::New());
+        structuralPatches->registerPatch(::fwStructuralPatch::fwData::Study::V1ToFwMedDataStudyV1::New());
+        structuralPatches->registerPatch(::fwStructuralPatch::fwData::Acquisition::V1ToFwMedDataImageSeriesV1::New());
+    }
+
+    static runner r;
+};
+runner runner::r;
+
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/autoload.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/autoload.cpp
new file mode 100644
index 0000000..1883163
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/autoload.cpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Equipment1.hpp"
+#include "fwStructuralPatch/creator/fwMedData/Patient1.hpp"
+#include "fwStructuralPatch/creator/fwMedData/Study1.hpp"
+#include "fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp"
+#include "fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp"
+#include "fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+
+/// Registers structural creators dedicated to data creation.
+struct runner
+{
+    runner()
+    {
+        ::fwAtomsPatch::StructuralCreatorDB::sptr creators = ::fwAtomsPatch::StructuralCreatorDB::getDefault();
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::Equipment1::New());
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::Patient1::New());
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::Study1::New());
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::ModelSeries1::New());
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::ImageSeries1::New());
+        creators->registerCreator(::fwStructuralPatch::creator::fwMedData::ActivitySeries1::New());
+    }
+
+    static runner r;
+};
+
+runner runner::r;
+
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ActivitySeries1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ActivitySeries1.cpp
new file mode 100644
index 0000000..29095f5
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ActivitySeries1.cpp
@@ -0,0 +1,55 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Object.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+ActivitySeries1::ActivitySeries1()
+{
+    m_classname = "::fwMedData::ActivitySeries";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+ActivitySeries1::~ActivitySeries1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+ActivitySeries1::ActivitySeries1( const ActivitySeries1 &cpy ) : Series1(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr ActivitySeries1::create()
+{
+    ::fwAtoms::Object::sptr series = this->Series1::create();
+    ::fwAtomsPatch::helper::Object helper(series);
+
+    helper.addAttribute("activity_config_id", ::fwAtoms::String::New(""));
+    helper.addAttribute("data", ::fwAtoms::Object::New());
+
+    return series;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
+
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Equipment1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Equipment1.cpp
new file mode 100644
index 0000000..f1a9d20
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Equipment1.cpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Equipment1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+// ----------------------------------------------------------------------------
+
+Equipment1::Equipment1()
+{
+    m_classname = "::fwMedData::Equipment";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+Equipment1::~Equipment1()
+{}
+
+// ----------------------------------------------------------------------------
+
+Equipment1::Equipment1( const Equipment1 &cpy ) : ::fwAtomsPatch::IStructuralCreator(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Equipment1::create()
+{
+    ::fwAtoms::Object::sptr equipment = this->createObjBase();
+    ::fwAtomsPatch::helper::Object helper(equipment);
+
+    helper.addAttribute("institution_name" , ::fwAtoms::String::New(""));
+
+    return equipment;
+}
+
+// ----------------------------------------------------------------------------
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ImageSeries1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ImageSeries1.cpp
new file mode 100644
index 0000000..478366e
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ImageSeries1.cpp
@@ -0,0 +1,52 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Blob.hpp>
+
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+ImageSeries1::ImageSeries1()
+{
+    m_classname = "::fwMedData::ImageSeries";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+ImageSeries1::~ImageSeries1()
+{}
+
+// ----------------------------------------------------------------------------
+
+ImageSeries1::ImageSeries1( const ImageSeries1 &cpy ) : Series1(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr ImageSeries1::create()
+{
+    ::fwAtoms::Object::sptr modelSeries = this->Series1::create();
+    ::fwAtomsPatch::helper::Object helper(modelSeries);
+
+    helper.addAttribute("image", ::fwAtoms::Blob::New());
+
+    return modelSeries;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ModelSeries1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ModelSeries1.cpp
new file mode 100644
index 0000000..4e16282
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/ModelSeries1.cpp
@@ -0,0 +1,53 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+ModelSeries1::ModelSeries1()
+{
+    m_classname = "::fwMedData::ModelSeries";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+ModelSeries1::~ModelSeries1()
+{}
+
+// ----------------------------------------------------------------------------
+
+ModelSeries1::ModelSeries1( const ModelSeries1 &cpy ) : Series1(cpy)
+{}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr ModelSeries1::create()
+{
+    ::fwAtoms::Object::sptr modelSeries = this->Series1::create();
+    ::fwAtomsPatch::helper::Object helper(modelSeries);
+
+    helper.addAttribute("reconstruction_db", ::fwAtoms::Sequence::New());
+
+    return modelSeries;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Patient1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Patient1.cpp
new file mode 100644
index 0000000..d070ac9
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Patient1.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Map.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Patient1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+Patient1::Patient1()
+{
+    m_classname = "::fwMedData::Patient";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+Patient1::~Patient1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+Patient1::Patient1( const Patient1 &cpy ) : ::fwAtomsPatch::IStructuralCreator(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Patient1::create()
+{
+    ::fwAtoms::Object::sptr patient = this->createObjBase();
+    ::fwAtomsPatch::helper::Object helper(patient);
+
+    helper.addAttribute("name" , ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_id" , ::fwAtoms::String::New(""));
+    helper.addAttribute("birth_date" , ::fwAtoms::String::New(""));
+    helper.addAttribute("sex" , ::fwAtoms::String::New(""));
+
+    return patient;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Series1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Series1.cpp
new file mode 100644
index 0000000..b3cb279
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Series1.cpp
@@ -0,0 +1,65 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Sequence.hpp>
+
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Series1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+Series1::Series1()
+{
+    m_classname = "::fwMedData::Series";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+Series1::~Series1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+Series1::Series1( const Series1 &cpy ) : ::fwAtomsPatch::IStructuralCreator(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Series1::create()
+{
+    ::fwAtoms::Object::sptr series = this->createObjBase();
+    ::fwAtomsPatch::helper::Object helper(series);
+
+    ::fwAtomsPatch::StructuralCreatorDB::sptr creators = ::fwAtomsPatch::StructuralCreatorDB::getDefault();
+    helper.addAttribute("patient"  , creators->create( "::fwMedData::Patient", "1") );
+    helper.addAttribute("study"    , creators->create( "::fwMedData::Study", "1") );
+    helper.addAttribute("equipment", creators->create( "::fwMedData::Equipment", "1") );
+
+    helper.addAttribute("instance_uid" , ::fwAtoms::String::New(""));
+    helper.addAttribute("modality" , ::fwAtoms::String::New(""));
+    helper.addAttribute("date" , ::fwAtoms::String::New(""));
+    helper.addAttribute("time" , ::fwAtoms::String::New(""));
+    helper.addAttribute("performing_physicians_name", ::fwAtoms::Sequence::New());
+    helper.addAttribute("description" , ::fwAtoms::String::New(""));
+
+    return series;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Study1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Study1.cpp
new file mode 100644
index 0000000..c588520
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/creator/fwMedData/Study1.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+
+#include "fwStructuralPatch/creator/fwMedData/Study1.hpp"
+
+namespace fwStructuralPatch
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+Study1::Study1()
+{
+    m_classname = "::fwMedData::Study";
+    m_version = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+Study1::~Study1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+Study1::Study1( const Study1 &cpy ) : ::fwAtomsPatch::IStructuralCreator(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+::fwAtoms::Object::sptr Study1::create()
+{
+    ::fwAtoms::Object::sptr study = this->createObjBase();
+    ::fwAtomsPatch::helper::Object helper(study);
+
+    helper.addAttribute("instance_uid" , ::fwAtoms::String::New(""));
+    helper.addAttribute("date" , ::fwAtoms::String::New(""));
+    helper.addAttribute("time" , ::fwAtoms::String::New(""));
+    helper.addAttribute("referring_physician_name" , ::fwAtoms::String::New(""));
+    helper.addAttribute("description" , ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_age" , ::fwAtoms::String::New(""));
+
+    return study;
+}
+
+} // namespace fwMedData
+} // namespace creator
+} // namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.cpp
new file mode 100644
index 0000000..6748bfd
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.cpp
@@ -0,0 +1,135 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <iostream>
+#include <sstream>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/String.hpp>
+#include <fwAtoms/Sequence.hpp>
+#include <fwAtomsPatch/StructuralCreatorDB.hpp>
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/infos/Logger.hpp>
+
+#include "fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Acquisition
+{
+
+V1ToFwMedDataImageSeriesV1::V1ToFwMedDataImageSeriesV1() : ::fwAtomsPatch::IStructuralPatch()
+{
+    m_originClassname = "::fwData::Acquisition";
+    m_targetClassname = "::fwMedData::ImageSeries";
+    m_originVersion = "1";
+    m_targetVersion = "1";
+
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataImageSeriesV1::~V1ToFwMedDataImageSeriesV1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataImageSeriesV1::V1ToFwMedDataImageSeriesV1( const V1ToFwMedDataImageSeriesV1 &cpy ) : ::fwAtomsPatch::IStructuralPatch(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void V1ToFwMedDataImageSeriesV1::apply(const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    IStructuralPatch::apply(previous, current, newVersions);
+
+    //Update object version
+    this->updateVersion(current);
+
+    //Create helper
+    ::fwAtomsPatch::helper::Object helper(current);
+
+    helper.removeAttribute("bits_per_pixel");
+    helper.removeAttribute("slice_thickness");
+    helper.removeAttribute("axe");
+    helper.removeAttribute("unsigned_flag");
+    helper.removeAttribute("acquisition_index");
+    helper.removeAttribute("image_type");
+    helper.removeAttribute("image_format");
+    helper.removeAttribute("is_main");
+    helper.removeAttribute("is_normal_dir");
+    helper.removeAttribute("db_id");
+    helper.removeAttribute("labo_id");
+    helper.removeAttribute("net_id");
+    helper.removeAttribute("date_send_to_labo");
+    helper.removeAttribute("date_receive_from_labo");
+    helper.removeAttribute("date_send_to_dbt");
+    helper.removeAttribute("date_disponibility");
+    helper.removeAttribute("patient_size");
+    helper.removeAttribute("patient_weight");
+    helper.removeAttribute("radiations");
+    helper.removeAttribute("medical_printer");
+    helper.removeAttribute("medical_printer_corp");
+    helper.removeAttribute("patient_position");
+    helper.removeAttribute("dicom_file_list");
+    helper.removeAttribute("path_to_files");
+    helper.removeAttribute("struct_anat");
+    helper.removeAttribute("creation_date");
+    helper.removeAttribute("reconstructions");
+
+    helper.renameAttribute("uid", "instance_uid");
+
+    helper.addAttribute("modality", ::fwAtoms::String::New(""));
+
+    ::fwAtomsPatch::StructuralCreatorDB::sptr creators = ::fwAtomsPatch::StructuralCreatorDB::getDefault();
+
+    // Create Patient
+    helper.addAttribute("patient", creators->create( "::fwMedData::Patient", "1") );
+
+    // Create Equipment
+    helper.addAttribute("equipment", creators->create( "::fwMedData::Equipment", "1") );
+
+    // Create Study
+    helper.addAttribute("study", creators->create( "::fwMedData::Study", "1") );
+
+    // Create performing_physicians_name
+    helper.addAttribute("performing_physicians_name", ::fwAtoms::Sequence::New());
+
+    //===========================================
+    // Update time format
+    //===========================================
+
+    std::string creationDate = previous->getAttribute("creation_date")->getString();
+
+    // Date and time
+    ::boost::posix_time::ptime pdate =
+            ::boost::posix_time::time_from_string(creationDate);
+    const std::string date = ::fwTools::getDate(pdate);
+    const std::string time = ::fwTools::getTime(pdate);
+
+    helper.addAttribute("date", ::fwAtoms::String::New(date));
+    helper.addAttribute("time", ::fwAtoms::String::New(time));
+}
+
+} // namespace Acquisition
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.cpp
new file mode 100644
index 0000000..ea9fa7d
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.cpp
@@ -0,0 +1,98 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <string>
+#include <sstream>
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+
+#include <fwTools/dateAndTime.hpp>
+
+#include <fwAtoms/String.hpp>
+
+#include "fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Patient
+{
+
+V1ToFwMedDataPatientV1::V1ToFwMedDataPatientV1() : ::fwAtomsPatch::IStructuralPatch()
+{
+    m_originClassname = "::fwData::Patient";
+    m_targetClassname = "::fwMedData::Patient";
+    m_originVersion = "1";
+    m_targetVersion = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataPatientV1::~V1ToFwMedDataPatientV1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataPatientV1::V1ToFwMedDataPatientV1(
+        const V1ToFwMedDataPatientV1 &cpy ) : ::fwAtomsPatch::IStructuralPatch(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void V1ToFwMedDataPatientV1::apply(const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    IStructuralPatch::apply(previous, current, newVersions);
+
+    // Update object version
+    this->updateVersion(current);
+
+    // Create helper
+    ::fwAtomsPatch::helper::Object helper(current);
+
+    helper.removeAttribute("firstname");
+    helper.removeAttribute("db_id");
+    helper.removeAttribute("studies");
+
+    helper.renameAttribute("id_dicom", "patient_id");
+    helper.renameAttribute("birthdate", "birth_date");
+    helper.renameAttribute("is_male", "sex");
+
+    // Update Name
+    std::string nameSeperation = "^";
+    if( previous->getAttribute("name")->getString().empty() ||
+        previous->getAttribute("firstname")->getString().empty() )
+    {
+        nameSeperation = "";
+    }
+
+    std::string newName = previous->getAttribute("name")->getString()
+            + nameSeperation
+            + previous->getAttribute("firstname")->getString();
+    helper.replaceAttribute( "name", ::fwAtoms::String::New(newName) );
+
+    // Update Birthdate
+    ::boost::posix_time::ptime bithdate =
+            ::boost::posix_time::time_from_string(previous->getAttribute("birthdate")->getString());
+    helper.replaceAttribute("birth_date", ::fwAtoms::String::New(::fwTools::getDate(bithdate)));
+
+    // Update Sex
+    helper.replaceAttribute("sex", ::fwAtoms::String::New(
+            !(previous->getAttribute("is_male")->getString().compare("true"))?"M":"F"));
+}
+
+} // namespace Patient
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Reconstruction/V1ToV2.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Reconstruction/V1ToV2.cpp
new file mode 100644
index 0000000..2ce3cc9
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Reconstruction/V1ToV2.cpp
@@ -0,0 +1,78 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/String.hpp>
+
+#include "fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Reconstruction
+{
+
+V1ToV2::V1ToV2() : ::fwAtomsPatch::IStructuralPatch()
+{
+    m_originClassname = "::fwData::Reconstruction";
+    m_targetClassname = "::fwData::Reconstruction";
+    m_originVersion = "1";
+    m_targetVersion = "2";
+
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToV2::~V1ToV2()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToV2::V1ToV2( const V1ToV2 &cpy ) : ::fwAtomsPatch::IStructuralPatch(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void V1ToV2::apply(
+        const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    IStructuralPatch::apply(previous, current, newVersions);
+
+    // Update object version
+    this->updateVersion(current);
+
+    // Create helper
+    ::fwAtomsPatch::helper::Object helper(current);
+
+    helper.removeAttribute("reconstruction_format");
+    helper.removeAttribute("is_closed");
+    helper.removeAttribute("is_automatic");
+    helper.removeAttribute("avg_volume");
+    helper.removeAttribute("vol_deviation");
+    helper.removeAttribute("vol_pct_confidence");
+    helper.removeAttribute("reconstruction_time");
+    helper.removeAttribute("mask_generated");
+    helper.removeAttribute("level");
+    helper.removeAttribute("label");
+    helper.removeAttribute("generated_3D");
+    helper.removeAttribute("type_3D");
+    helper.removeAttribute("db_id");
+}
+
+} // namespace Reconstruction
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
diff --git a/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.cpp b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.cpp
new file mode 100644
index 0000000..29d5baa
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/src/fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwAtoms/Numeric.hpp>
+#include <fwAtoms/Numeric.hxx>
+#include <fwAtoms/String.hpp>
+
+#include "fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp"
+
+namespace fwStructuralPatch
+{
+
+namespace fwData
+{
+
+namespace Study
+{
+
+V1ToFwMedDataStudyV1::V1ToFwMedDataStudyV1() : ::fwAtomsPatch::IStructuralPatch()
+{
+    m_originClassname = "::fwData::Study";
+    m_targetClassname = "::fwMedData::Study";
+    m_originVersion = "1";
+    m_targetVersion = "1";
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataStudyV1::~V1ToFwMedDataStudyV1()
+{
+}
+
+// ----------------------------------------------------------------------------
+
+V1ToFwMedDataStudyV1::V1ToFwMedDataStudyV1( const V1ToFwMedDataStudyV1 &cpy ) : ::fwAtomsPatch::IStructuralPatch(cpy)
+{
+}
+
+// ----------------------------------------------------------------------------
+
+void V1ToFwMedDataStudyV1::apply(const ::fwAtoms::Object::sptr& previous,
+        const ::fwAtoms::Object::sptr& current,
+        ::fwAtomsPatch::IPatch::NewVersionsType& newVersions)
+{
+    IStructuralPatch::apply(previous, current, newVersions);
+
+    // Update object version
+    this->updateVersion(current);
+
+    // Create helper
+    ::fwAtomsPatch::helper::Object helper(current);
+
+    helper.removeAttribute("hospital");
+    helper.removeAttribute("modality");
+    helper.removeAttribute("acquisition_zone");
+    helper.removeAttribute("ris_id");
+    helper.removeAttribute("db_id");
+    helper.removeAttribute("acquisitions");
+
+    helper.renameAttribute("uid", "instance_uid");
+
+    helper.addAttribute("referring_physician_name", ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_age", ::fwAtoms::String::New(""));
+}
+
+} // namespace Study
+
+} // namespace fwData
+
+} // namespace fwStructuralPatch
+
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/CMakeLists.txt b/SrcLib/patch/fwStructuralPatch/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/Properties.cmake b/SrcLib/patch/fwStructuralPatch/test/Properties.cmake
new file mode 100644
index 0000000..c117922
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwStructuralPatchTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData fwStructuralPatch )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/cppunit.options b/SrcLib/patch/fwStructuralPatch/test/cppunit.options
new file mode 100644
index 0000000..a5d881e
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/cppunit.options
@@ -0,0 +1,25 @@
+CLASSTEST=[
+          # test for creators
+          'Patient1Test',
+          'Series1Test',
+          'Study1Test',
+          'ModelSeries1Test',
+          'Equipment1Test',
+          # test for structural patches
+          'V1ToV2Test',
+          'V1ToFwMedDataImageSeriesV1Test',
+          'V1ToFwMedDataPatientV1Test',
+          'V1ToFwMedDataStudyV1Test',
+          ]
+
+USE = ['boost']
+LIB = [
+       'fwData_0-1',
+       'fwDataCamp_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwTest_0-1',
+       'fwStructuralPatch_0-1',
+       ]
+CONSOLE = 'yes'
+LOGLEVEL='trace'
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ActivitySeries1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ActivitySeries1Test.hpp
new file mode 100644
index 0000000..f978534
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ActivitySeries1Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_ACTIVITYSERIES1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_ACTIVITYSERIES1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class ActivitySeries1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ActivitySeries1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void createTest();
+    void copyTest();
+
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_ACTIVITYSERIES1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Equipment1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Equipment1Test.hpp
new file mode 100644
index 0000000..b44c9d0
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Equipment1Test.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_EQUIPMENT1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_EQUIPMENT1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class Equipment1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( Equipment1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    void createTest();
+    void copyTest();
+
+};
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_EQUIPMENT1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ImageSeries1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ImageSeries1Test.hpp
new file mode 100644
index 0000000..0e277bd
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ImageSeries1Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_IMAGESERIES1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_IMAGESERIES1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class ImageSeries1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageSeries1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void createTest();
+    void copyTest();
+
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_IMAGESERIES1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ModelSeries1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ModelSeries1Test.hpp
new file mode 100644
index 0000000..917653d
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/ModelSeries1Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_MODELSERIES1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_MODELSERIES1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class ModelSeries1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ModelSeries1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void createTest();
+    void copyTest();
+
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_MODELSERIES1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Patient1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Patient1Test.hpp
new file mode 100644
index 0000000..6707721
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Patient1Test.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_PATIENT1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_PATIENT1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class Patient1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( Patient1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+    void createTest();
+    void copyTest();
+
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_PATIENT1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Series1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Series1Test.hpp
new file mode 100644
index 0000000..383fc8d
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Series1Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_SERIES1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_SERIES1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class Series1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( Series1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void createTest();
+    void copyTest();
+
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_SERIES1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Study1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Study1Test.hpp
new file mode 100644
index 0000000..ed586f9
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/creator/fwMedData/Study1Test.hpp
@@ -0,0 +1,43 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_STUDY1TEST_HPP__
+#define __FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_STUDY1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+class Study1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( Study1Test );
+    CPPUNIT_TEST( createTest );
+    CPPUNIT_TEST( copyTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void createTest();
+    void copyTest();
+};
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_UT_CREATOR_FWMEDDATA_STUDY1TEST_HPP__
+
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.hpp
new file mode 100644
index 0000000..6966a1f
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_TEST_TU_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1TEST_HPP__
+#define __FWSTRUCTURALPATCH_TEST_TU_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Acquisition
+{
+/**
+ * @brief Test patch to convert ::fwData::Acquisition version 1 to ::fwMedData::ImageSeries version 1.
+ */
+class V1ToFwMedDataImageSeriesV1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( V1ToFwMedDataImageSeriesV1Test );
+    CPPUNIT_TEST( applyPatchTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void applyPatchTest();
+};
+} //namespace Acquisition
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_TEST_TU_FWDATA_ACQUISITION_V1TOFWMEDDATAIMAGESERIESV1TEST_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Patient/V1ToFwMedDataPatientV1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Patient/V1ToFwMedDataPatientV1Test.hpp
new file mode 100644
index 0000000..14fcff1
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Patient/V1ToFwMedDataPatientV1Test.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_TEST_TU_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1TEST_HPP__
+#define __FWSTRUCTURALPATCH_TEST_TU_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Patient
+{
+/**
+ * @brief Test patch to convert ::fwData::Patient version 1 to ::fwMedData::Patient version 1.
+ */
+class V1ToFwMedDataPatientV1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( V1ToFwMedDataPatientV1Test );
+    CPPUNIT_TEST( applyPatchTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void applyPatchTest();
+};
+} //namespace Patient
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_TEST_TU_FWDATA_PATIENT_V1TOFWMEDDATAPATIENTV1TEST_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Reconstruction/V1ToV2Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Reconstruction/V1ToV2Test.hpp
new file mode 100644
index 0000000..da22bea
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Reconstruction/V1ToV2Test.hpp
@@ -0,0 +1,44 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_TEST_TU_FWDATA_RECONSTRUCTION_V1TOV2TEST_HPP__
+#define __FWSTRUCTURALPATCH_TEST_TU_FWDATA_RECONSTRUCTION_V1TOV2TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Reconstruction
+{
+
+/**
+ * @brief Test patch to convert fwData::Reconstruction from version 1 to version 2.
+ */
+class V1ToV2Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( V1ToV2Test );
+    CPPUNIT_TEST( applyPatchTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void applyPatchTest();
+};
+
+} //namespace Reconstruction
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_TEST_TU_FWDATA_RECONSTRUCTION_V1TOV2TEST_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Study/V1ToFwMedDataStudyV1Test.hpp b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Study/V1ToFwMedDataStudyV1Test.hpp
new file mode 100644
index 0000000..122258a
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/include/fwData/Study/V1ToFwMedDataStudyV1Test.hpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWSTRUCTURALPATCH_TEST_TU_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1TEST_HPP__
+#define __FWSTRUCTURALPATCH_TEST_TU_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1TEST_HPP__
+
+#include <cppunit/extensions/HelperMacros.h>
+
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Study
+{
+/**
+ * @brief Test patch to convert ::fwData::Study version 1 to ::fwMedData::Study version 1.
+ */
+class V1ToFwMedDataStudyV1Test : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( V1ToFwMedDataStudyV1Test );
+    CPPUNIT_TEST( applyPatchTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+    void applyPatchTest();
+};
+} //namespace Study
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
+
+#endif //__FWSTRUCTURALPATCH_TEST_TU_FWDATA_STUDY_V1TOFWMEDDATAPSTUDYV1TEST_HPP__
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ActivitySeries1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ActivitySeries1Test.cpp
new file mode 100644
index 0000000..f82d958
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ActivitySeries1Test.cpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/ActivitySeries1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/ActivitySeries1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::ActivitySeries1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ActivitySeries1::sptr actSeriesCreator = ActivitySeries1::New();
+
+    CPPUNIT_ASSERT(actSeriesCreator);
+    const std::string& classname = actSeriesCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ActivitySeries") == classname );
+    const std::string& objectVersion =  actSeriesCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr actSeries = actSeriesCreator->create();
+
+    const std::string& actSeriesClassname = ::fwAtomsPatch::helper::getClassname(actSeries);
+    CPPUNIT_ASSERT_MESSAGE(
+            "Classname must be equal" , std::string("::fwMedData::ActivitySeries") == actSeriesClassname );
+    const std::string& actSeriesObjectVersion = ::fwAtomsPatch::helper::getVersion(actSeries);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == actSeriesObjectVersion );
+
+    CPPUNIT_ASSERT(actSeries->getAttribute("data"));
+    CPPUNIT_ASSERT(actSeries->getAttribute("activity_config_id"));
+}
+
+//------------------------------------------------------------------------------
+
+void ActivitySeries1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ActivitySeries1 actSeriesCreator;
+
+    const std::string& classname = actSeriesCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ActivitySeries") == classname );
+    const std::string& objectVersion =  actSeriesCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ActivitySeries1* actSeriesCreator2 = new ActivitySeries1(actSeriesCreator);
+
+    CPPUNIT_ASSERT(actSeriesCreator2);
+    const std::string& classnameActivitySeriesCreator2 = actSeriesCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE(
+            "Classname must be equal", std::string("::fwMedData::ActivitySeries") == classnameActivitySeriesCreator2 );
+
+    const std::string& objectVersionActivitySeriesCreator2 =  actSeriesCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionActivitySeriesCreator2 );
+
+    delete(actSeriesCreator2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Equipment1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Equipment1Test.cpp
new file mode 100644
index 0000000..c37bbf3
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Equipment1Test.cpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/Equipment1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/Equipment1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::Equipment1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void Equipment1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void Equipment1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void Equipment1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Equipment1::sptr equipmentCreator = Equipment1::New();
+
+    CPPUNIT_ASSERT(equipmentCreator);
+    const std::string& classname = equipmentCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Equipment") == classname );
+    const std::string& objectVersion =  equipmentCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr equipment = equipmentCreator->create();
+
+    const std::string& equipmentClassname = ::fwAtomsPatch::helper::getClassname(equipment);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Equipment") == equipmentClassname );
+    const std::string& equipmentObjectVersion = ::fwAtomsPatch::helper::getVersion(equipment);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == equipmentObjectVersion );
+
+    CPPUNIT_ASSERT(equipment->getAttribute("institution_name"));
+}
+
+//------------------------------------------------------------------------------
+
+void Equipment1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Equipment1 equipmentCreator;
+
+    const std::string& classname = equipmentCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Equipment") == classname );
+    const std::string& objectVersion =  equipmentCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    Equipment1* equipmentCreator2 = new Equipment1(equipmentCreator);
+
+    CPPUNIT_ASSERT(equipmentCreator2);
+    const std::string& classnameEquipmentCreator2 = equipmentCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Equipment") == classnameEquipmentCreator2 );
+
+    const std::string& objectVersionEquipmentCreator2 =  equipmentCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionEquipmentCreator2 );
+
+    delete(equipmentCreator2);
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ImageSeries1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ImageSeries1Test.cpp
new file mode 100644
index 0000000..9d116ea
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ImageSeries1Test.cpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/ImageSeries1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/ImageSeries1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::ImageSeries1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void ImageSeries1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ImageSeries1::sptr imageSeriesCreator = ImageSeries1::New();
+
+    CPPUNIT_ASSERT(imageSeriesCreator);
+    const std::string& classname = imageSeriesCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ImageSeries") == classname );
+    const std::string& objectVersion =  imageSeriesCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr imageSeries = imageSeriesCreator->create();
+
+    const std::string& imageSeriesClassname = ::fwAtomsPatch::helper::getClassname(imageSeries);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ImageSeries") == imageSeriesClassname );
+    const std::string& imageSeriesObjectVersion = ::fwAtomsPatch::helper::getVersion(imageSeries);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == imageSeriesObjectVersion );
+
+    CPPUNIT_ASSERT(imageSeries->getAttribute("reconstruction_db"));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageSeries1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ImageSeries1 imageSeriesCreator;
+
+    const std::string& classname = imageSeriesCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ImageSeries") == classname );
+    const std::string& objectVersion =  imageSeriesCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ImageSeries1* imageSeriesCreator2 = new ImageSeries1(imageSeriesCreator);
+
+    CPPUNIT_ASSERT(imageSeriesCreator2);
+    const std::string& classnameImageSeriesCreator2 = imageSeriesCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ImageSeries") == classnameImageSeriesCreator2 );
+
+    const std::string& objectVersionImageSeriesCreator2 =  imageSeriesCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionImageSeriesCreator2 );
+
+    delete(imageSeriesCreator2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ModelSeries1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ModelSeries1Test.cpp
new file mode 100644
index 0000000..1238858
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/ModelSeries1Test.cpp
@@ -0,0 +1,92 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/ModelSeries1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/ModelSeries1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::ModelSeries1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void ModelSeries1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ModelSeries1::sptr modelSeriesCreator = ModelSeries1::New();
+
+    CPPUNIT_ASSERT(modelSeriesCreator);
+    const std::string& classname = modelSeriesCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ModelSeries") == classname );
+    const std::string& objectVersion =  modelSeriesCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr modelSeries = modelSeriesCreator->create();
+
+    const std::string& modelSeriesClassname = ::fwAtomsPatch::helper::getClassname(modelSeries);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ModelSeries") == modelSeriesClassname );
+    const std::string& modelSeriesObjectVersion = ::fwAtomsPatch::helper::getVersion(modelSeries);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == modelSeriesObjectVersion );
+
+    CPPUNIT_ASSERT(modelSeries->getAttribute("reconstruction_db"));
+}
+
+//------------------------------------------------------------------------------
+
+void ModelSeries1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    ModelSeries1 modelSeriesCreator;
+
+    const std::string& classname = modelSeriesCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ModelSeries") == classname );
+    const std::string& objectVersion =  modelSeriesCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ModelSeries1* modelSeriesCreator2 = new ModelSeries1(modelSeriesCreator);
+
+    CPPUNIT_ASSERT(modelSeriesCreator2);
+    const std::string& classnameModelSeriesCreator2 = modelSeriesCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::ModelSeries") == classnameModelSeriesCreator2 );
+
+    const std::string& objectVersionModelSeriesCreator2 =  modelSeriesCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionModelSeriesCreator2 );
+
+    delete(modelSeriesCreator2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Patient1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Patient1Test.cpp
new file mode 100644
index 0000000..eacf113
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Patient1Test.cpp
@@ -0,0 +1,94 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/Patient1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/Patient1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::Patient1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void Patient1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void Patient1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void Patient1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Patient1::sptr patientCreator = Patient1::New();
+
+    CPPUNIT_ASSERT(patientCreator);
+    const std::string& classname = patientCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Patient") == classname );
+    const std::string& objectVersion =  patientCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr patient = patientCreator->create();
+
+    const std::string& patientClassname = ::fwAtomsPatch::helper::getClassname(patient);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Patient") == patientClassname );
+    const std::string& patientObjectVersion = ::fwAtomsPatch::helper::getVersion(patient);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == patientObjectVersion );
+
+    CPPUNIT_ASSERT(patient->getAttribute("name"));
+    CPPUNIT_ASSERT(patient->getAttribute("patient_id"));
+    CPPUNIT_ASSERT(patient->getAttribute("birth_date"));
+    CPPUNIT_ASSERT(patient->getAttribute("sex"));
+
+}
+
+void Patient1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Patient1 patientCreator;
+
+    const std::string& classname = patientCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Patient") == classname );
+    const std::string& objectVersion =  patientCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    Patient1* patientCreator2 = new Patient1(patientCreator);
+
+    CPPUNIT_ASSERT(patientCreator2);
+    const std::string& classnamePatientCreator2 = patientCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Patient") == classnamePatientCreator2 );
+
+    const std::string& objectVersionPatientCreator2 =  patientCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionPatientCreator2 );
+
+    delete(patientCreator2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Series1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Series1Test.cpp
new file mode 100644
index 0000000..a18771e
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Series1Test.cpp
@@ -0,0 +1,101 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwStructuralPatch/creator/fwMedData/Series1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/Series1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::Series1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void Series1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void Series1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void Series1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Series1::sptr seriesCreator = Series1::New();
+
+    CPPUNIT_ASSERT(seriesCreator);
+    const std::string& classname = seriesCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Series") == classname );
+    const std::string& objectVersion =  seriesCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr series = seriesCreator->create();
+
+    const std::string& seriesClassname = ::fwAtomsPatch::helper::getClassname(series);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Series") == seriesClassname );
+    const std::string& seriesObjectVersion = ::fwAtomsPatch::helper::getVersion(series);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == seriesObjectVersion );
+
+    CPPUNIT_ASSERT(series->getAttribute("patient"));
+    CPPUNIT_ASSERT(series->getAttribute("study"));
+    CPPUNIT_ASSERT(series->getAttribute("equipment"));
+    CPPUNIT_ASSERT(series->getAttribute("instance_uid"));
+    CPPUNIT_ASSERT(series->getAttribute("modality"));
+    CPPUNIT_ASSERT(series->getAttribute("date"));
+    CPPUNIT_ASSERT(series->getAttribute("time"));
+    CPPUNIT_ASSERT(series->getAttribute("performing_physicians_name"));
+    CPPUNIT_ASSERT(series->getAttribute("description"));
+}
+
+//------------------------------------------------------------------------------
+
+void Series1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Series1 seriesCreator;
+
+    const std::string& classname = seriesCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Series") == classname );
+    const std::string& objectVersion =  seriesCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    Series1* seriesCreator2 = new Series1(seriesCreator);
+
+    CPPUNIT_ASSERT(seriesCreator2);
+    const std::string& classnameSeriesCreator2 = seriesCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Series") == classnameSeriesCreator2 );
+
+    const std::string& objectVersionSeriesCreator2 =  seriesCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionSeriesCreator2 );
+
+    delete(seriesCreator2);
+
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Study1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Study1Test.cpp
new file mode 100644
index 0000000..1f0eea8
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/creator/fwMedData/Study1Test.cpp
@@ -0,0 +1,99 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwStructuralPatch/creator/fwMedData/Study1.hpp"
+#include "fwAtomsPatch/helper/functions.hpp"
+#include "fwAtomsPatch/helper/Object.hpp"
+#include "fwAtoms/String.hpp"
+
+#include "creator/fwMedData/Study1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::creator::fwMedData::Study1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace creator
+{
+namespace fwMedData
+{
+
+//------------------------------------------------------------------------------
+
+void Study1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void Study1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void Study1Test::createTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Study1::sptr studyCreator = Study1::New();
+
+    CPPUNIT_ASSERT(studyCreator);
+    const std::string& classname = studyCreator->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Study") == classname );
+    const std::string& objectVersion =  studyCreator->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    ::fwAtoms::Object::sptr study = studyCreator->create();
+
+    const std::string& studyClassname = ::fwAtomsPatch::helper::getClassname(study);
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Study") == studyClassname );
+    const std::string& studyObjectVersion = ::fwAtomsPatch::helper::getVersion(study);
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == studyObjectVersion );
+
+    CPPUNIT_ASSERT(study->getAttribute("instance_uid"));
+    CPPUNIT_ASSERT(study->getAttribute("date"));
+    CPPUNIT_ASSERT(study->getAttribute("time"));
+    CPPUNIT_ASSERT(study->getAttribute("referring_physician_name"));
+    CPPUNIT_ASSERT(study->getAttribute("description"));
+    CPPUNIT_ASSERT(study->getAttribute("patient_age"));
+
+}
+
+//------------------------------------------------------------------------------
+
+void Study1Test::copyTest()
+{
+    using namespace ::fwStructuralPatch::creator::fwMedData;
+    Study1 studyCreator;
+
+    const std::string& classname = studyCreator.getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Study") == classname );
+    const std::string& objectVersion =  studyCreator.getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersion );
+
+    Study1* studyCreator2 = new Study1(studyCreator);
+
+    CPPUNIT_ASSERT(studyCreator2);
+    const std::string& classnamestudyCreator2 = studyCreator2->getObjectClassname();
+    CPPUNIT_ASSERT_MESSAGE("Classname must be equal" , std::string("::fwMedData::Study") == classnamestudyCreator2 );
+
+    const std::string& objectVersionstudyCreator2 =  studyCreator2->getObjectVersion();
+    CPPUNIT_ASSERT_MESSAGE("ObjectVersion must be equal" , std::string("1") == objectVersionstudyCreator2 );
+
+    delete(studyCreator2);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace fwMedData
+} //namespace creator
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.cpp
new file mode 100644
index 0000000..9dad11f
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.cpp
@@ -0,0 +1,154 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwStructuralPatch/fwData/Acquisition/V1ToFwMedDataImageSeriesV1.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "fwData/Acquisition/V1ToFwMedDataImageSeriesV1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::fwData::Acquisition::V1ToFwMedDataImageSeriesV1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Acquisition
+{
+
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataImageSeriesV1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataImageSeriesV1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataImageSeriesV1Test::applyPatchTest()
+{
+    ::fwAtoms::Object::sptr acqObj = ::fwAtoms::Object::New();
+    ::fwAtoms::Object::sptr isObj;
+
+    ::fwAtomsPatch::helper::setClassname(acqObj, "::fwData::Acquisition");
+    ::fwAtomsPatch::helper::setVersion(acqObj, "1");
+
+    ::fwAtomsPatch::helper::Object helper(acqObj);
+
+    helper.addAttribute("bits_per_pixel", ::fwAtoms::String::New(""));
+    helper.addAttribute("slice_thickness", ::fwAtoms::String::New(""));
+    helper.addAttribute("axe", ::fwAtoms::String::New(""));
+    helper.addAttribute("unsigned_flag", ::fwAtoms::String::New(""));
+    helper.addAttribute("acquisition_index", ::fwAtoms::String::New(""));
+    helper.addAttribute("image_type", ::fwAtoms::String::New(""));
+    helper.addAttribute("image_format", ::fwAtoms::String::New(""));
+    helper.addAttribute("creation_date", ::fwAtoms::String::New("2013-Jun-12 14:49:12"));
+    helper.addAttribute("is_main", ::fwAtoms::String::New(""));
+    helper.addAttribute("is_normal_dir", ::fwAtoms::String::New(""));
+    helper.addAttribute("uid", ::fwAtoms::String::New(""));
+    helper.addAttribute("db_id", ::fwAtoms::String::New(""));
+    helper.addAttribute("labo_id", ::fwAtoms::String::New(""));
+    helper.addAttribute("net_id", ::fwAtoms::String::New(""));
+    helper.addAttribute("date_send_to_labo", ::fwAtoms::String::New(""));
+    helper.addAttribute("date_receive_from_labo", ::fwAtoms::String::New(""));
+    helper.addAttribute("date_send_to_dbt", ::fwAtoms::String::New(""));
+    helper.addAttribute("date_disponibility", ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_size", ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_weight", ::fwAtoms::String::New(""));
+    helper.addAttribute("radiations", ::fwAtoms::String::New(""));
+    helper.addAttribute("medical_printer", ::fwAtoms::String::New(""));
+    helper.addAttribute("medical_printer_corp", ::fwAtoms::String::New(""));
+    helper.addAttribute("patient_position", ::fwAtoms::String::New(""));
+    helper.addAttribute("description", ::fwAtoms::String::New(""));
+    helper.addAttribute("dicom_file_list", ::fwAtoms::String::New(""));
+    helper.addAttribute("path_to_files", ::fwAtoms::String::New(""));
+    helper.addAttribute("image", ::fwAtoms::Object::New());
+    helper.addAttribute("struct_anat", ::fwAtoms::Object::sptr());
+    helper.addAttribute("reconstructions", ::fwAtoms::Sequence::New());
+
+    isObj = ::fwAtoms::Object::dynamicCast(acqObj->clone());
+
+    ::fwAtomsPatch::IPatch::NewVersionsType newVersions;
+    newVersions[acqObj] = isObj;
+
+    ::fwStructuralPatch::fwData::Acquisition::V1ToFwMedDataImageSeriesV1::sptr patch;
+    patch = ::fwStructuralPatch::fwData::Acquisition::V1ToFwMedDataImageSeriesV1::New();
+    CPPUNIT_ASSERT_NO_THROW(patch->apply(acqObj, isObj, newVersions));
+
+    CPPUNIT_ASSERT(isObj);
+    CPPUNIT_ASSERT_EQUAL(std::string("::fwMedData::ImageSeries"), ::fwAtomsPatch::helper::getClassname(isObj));
+    CPPUNIT_ASSERT_EQUAL(std::string("1"), ::fwAtomsPatch::helper::getVersion(isObj));
+
+    CPPUNIT_ASSERT(!isObj->getAttribute("bits_per_pixel"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("slice_thickness"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("axe"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("unsigned_flag"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("acquisition_index"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("image_type"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("image_format"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("is_main"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("is_normal_dir"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("db_id"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("labo_id"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("net_id"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("date_send_to_labo"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("date_receive_from_labo"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("date_send_to_dbt"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("date_disponibility"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("patient_size"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("patient_weight"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("radiations"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("medical_printer"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("medical_printer_corp"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("patient_position"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("dicom_file_list"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("path_to_files"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("struct_anat"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("creation_date"));
+    CPPUNIT_ASSERT(!isObj->getAttribute("reconstructions"));
+
+    CPPUNIT_ASSERT(isObj->getAttribute("instance_uid"));
+    CPPUNIT_ASSERT(isObj->getAttribute("modality"));
+    CPPUNIT_ASSERT(isObj->getAttribute("patient"));
+    CPPUNIT_ASSERT(isObj->getAttribute("equipment"));
+    CPPUNIT_ASSERT(isObj->getAttribute("study"));
+    CPPUNIT_ASSERT(isObj->getAttribute("performing_physicians_name"));
+    CPPUNIT_ASSERT(isObj->getAttribute("date"));
+    CPPUNIT_ASSERT(isObj->getAttribute("time"));
+
+    ::fwAtoms::String::sptr date = isObj->getAttribute< ::fwAtoms::String >("date");
+    CPPUNIT_ASSERT_EQUAL(std::string("20130612"), date->getString());
+    ::fwAtoms::String::sptr time = isObj->getAttribute< ::fwAtoms::String >("time");
+    CPPUNIT_ASSERT_EQUAL(std::string("144912"), time->getString());
+}
+
+//------------------------------------------------------------------------------
+} //namespace Acquisition
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Patient/V1ToFwMedDataPatientV1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Patient/V1ToFwMedDataPatientV1Test.cpp
new file mode 100644
index 0000000..5bfc868
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Patient/V1ToFwMedDataPatientV1Test.cpp
@@ -0,0 +1,113 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwStructuralPatch/fwData/Patient/V1ToFwMedDataPatientV1.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "fwData/Patient/V1ToFwMedDataPatientV1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::fwData::Patient::V1ToFwMedDataPatientV1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Patient
+{
+
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataPatientV1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataPatientV1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataPatientV1Test::applyPatchTest()
+{
+    ::fwAtoms::Object::sptr originObj = ::fwAtoms::Object::New();
+    ::fwAtoms::Object::sptr targetObj;
+
+    ::fwAtomsPatch::helper::setClassname(originObj, "::fwData::Patient");
+    ::fwAtomsPatch::helper::setVersion(originObj, "1");
+
+    ::fwAtomsPatch::helper::Object helper(originObj);
+
+    helper.addAttribute("name", ::fwAtoms::String::New("name"));
+    helper.addAttribute("firstname", ::fwAtoms::String::New("firstname"));
+    helper.addAttribute("id_dicom", ::fwAtoms::String::New("46539"));
+    helper.addAttribute("birthdate", ::fwAtoms::String::New("2013-Jun-13 10:10:10"));
+    helper.addAttribute("is_male", ::fwAtoms::Boolean::New(false));
+    helper.addAttribute("db_id", ::fwAtoms::String::New("4529"));
+    helper.addAttribute("studies", ::fwAtoms::Sequence::New());
+
+    targetObj = ::fwAtoms::Object::dynamicCast(originObj->clone());
+
+    ::fwAtomsPatch::IPatch::NewVersionsType newVersions;
+    newVersions[originObj] = targetObj;
+
+    ::fwStructuralPatch::fwData::Patient::V1ToFwMedDataPatientV1::sptr patch;
+    patch = ::fwStructuralPatch::fwData::Patient::V1ToFwMedDataPatientV1::New();
+    CPPUNIT_ASSERT_NO_THROW(patch->apply(originObj, targetObj, newVersions));
+
+    CPPUNIT_ASSERT(targetObj);
+    CPPUNIT_ASSERT_EQUAL(std::string("::fwMedData::Patient"), ::fwAtomsPatch::helper::getClassname(targetObj));
+    CPPUNIT_ASSERT_EQUAL(std::string("1"), ::fwAtomsPatch::helper::getVersion(targetObj));
+
+    CPPUNIT_ASSERT(!targetObj->getAttribute("firstname"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("id_dicom"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("birthdate"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("is_male"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("db_id"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("studies"));
+
+    CPPUNIT_ASSERT(targetObj->getAttribute("name"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("patient_id"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("birth_date"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("sex"));
+
+    ::fwAtoms::String::sptr name = targetObj->getAttribute< ::fwAtoms::String >("name");
+    CPPUNIT_ASSERT_EQUAL(std::string("name^firstname"), name->getString());
+
+    ::fwAtoms::String::sptr patientId = targetObj->getAttribute< ::fwAtoms::String >("patient_id");
+    CPPUNIT_ASSERT_EQUAL(std::string("46539"), patientId->getString());
+
+    ::fwAtoms::String::sptr birthdate = targetObj->getAttribute< ::fwAtoms::String >("birth_date");
+    CPPUNIT_ASSERT_EQUAL(std::string("20130613"), birthdate->getString());
+
+    ::fwAtoms::String::sptr sex = targetObj->getAttribute< ::fwAtoms::String >("sex");
+    CPPUNIT_ASSERT_EQUAL(std::string("F"), sex->getString());
+}
+
+//------------------------------------------------------------------------------
+} //namespace Patient
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Reconstruction/V1ToV2Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Reconstruction/V1ToV2Test.cpp
new file mode 100644
index 0000000..9772529
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Reconstruction/V1ToV2Test.cpp
@@ -0,0 +1,120 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwStructuralPatch/fwData/Reconstruction/V1ToV2.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "fwData/Reconstruction/V1ToV2Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::fwData::Reconstruction::V1ToV2Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Reconstruction
+{
+// force link for log
+::fwTest::Exception e("");
+
+//------------------------------------------------------------------------------
+
+void V1ToV2Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToV2Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToV2Test::applyPatchTest()
+{
+    ::fwAtoms::Object::sptr recObjV1 = ::fwAtoms::Object::New();
+    ::fwAtoms::Object::sptr recObjV2;
+
+    ::fwAtomsPatch::helper::setClassname(recObjV1, "::fwData::Reconstruction");
+    ::fwAtomsPatch::helper::setVersion(recObjV1, "1");
+
+    ::fwAtomsPatch::helper::Object helper(recObjV1);
+
+    helper.addAttribute("is_visible", ::fwAtoms::Boolean::New(true));
+    helper.addAttribute("organ_name", ::fwAtoms::String::New("Organ"));
+    helper.addAttribute("structure_type", ::fwAtoms::String::New(""));
+    helper.addAttribute("material", ::fwAtoms::String::New(""));
+    helper.addAttribute("image", ::fwAtoms::String::New(""));
+    helper.addAttribute("mesh", ::fwAtoms::String::New(""));
+
+    std::vector< std::string> v1Attributs;
+
+    v1Attributs.push_back("reconstruction_format");
+    v1Attributs.push_back("is_closed");
+    v1Attributs.push_back("is_automatic");
+    v1Attributs.push_back("avg_volume");
+    v1Attributs.push_back("vol_deviation");
+    v1Attributs.push_back("vol_pct_confidence");
+    v1Attributs.push_back("reconstruction_time");
+    v1Attributs.push_back("mask_generated");
+    v1Attributs.push_back("level");
+    v1Attributs.push_back("label");
+    v1Attributs.push_back("generated_3D");
+    v1Attributs.push_back("type_3D");
+    v1Attributs.push_back("db_id");
+
+    BOOST_FOREACH(std::string attribut, v1Attributs)
+    {
+        helper.addAttribute(attribut, ::fwAtoms::String::New(""));
+    }
+
+    recObjV2 = ::fwAtoms::Object::dynamicCast(recObjV1->clone());
+
+    ::fwAtomsPatch::IPatch::NewVersionsType newVersions;
+    newVersions[recObjV1] = recObjV2;
+
+
+
+    ::fwStructuralPatch::fwData::Reconstruction::V1ToV2::sptr rec1Torec2Patch;
+    rec1Torec2Patch = ::fwStructuralPatch::fwData::Reconstruction::V1ToV2::New();
+    CPPUNIT_ASSERT_NO_THROW(rec1Torec2Patch->apply(recObjV1, recObjV2, newVersions));
+
+    CPPUNIT_ASSERT(recObjV2);
+    CPPUNIT_ASSERT(recObjV2->getAttribute("is_visible"));
+    CPPUNIT_ASSERT(recObjV2->getAttribute("organ_name"));
+    CPPUNIT_ASSERT(recObjV2->getAttribute("structure_type"));
+    CPPUNIT_ASSERT(recObjV2->getAttribute("material"));
+    CPPUNIT_ASSERT(recObjV2->getAttribute("image"));
+    CPPUNIT_ASSERT(recObjV2->getAttribute("mesh"));
+
+    BOOST_FOREACH(std::string attribut, v1Attributs)
+    {
+        CPPUNIT_ASSERT_MESSAGE("'" + attribut + "' attribut must not exist", ! recObjV2->getAttribute(attribut));
+    }
+}
+
+//------------------------------------------------------------------------------
+} //namespace Reconstruction
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Study/V1ToFwMedDataStudyV1Test.cpp b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Study/V1ToFwMedDataStudyV1Test.cpp
new file mode 100644
index 0000000..4d5cb6c
--- /dev/null
+++ b/SrcLib/patch/fwStructuralPatch/test/tu/src/fwData/Study/V1ToFwMedDataStudyV1Test.cpp
@@ -0,0 +1,117 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwAtoms/Base.hpp>
+#include <fwAtoms/Object.hpp>
+#include <fwAtoms/Object.hxx>
+#include <fwAtoms/Boolean.hpp>
+#include <fwAtoms/String.hpp>
+
+#include <fwAtomsPatch/helper/Object.hpp>
+#include <fwAtomsPatch/helper/functions.hpp>
+
+#include <fwStructuralPatch/fwData/Study/V1ToFwMedDataStudyV1.hpp>
+
+#include <fwTest/Exception.hpp>
+
+#include "fwData/Study/V1ToFwMedDataStudyV1Test.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwStructuralPatch::ut::fwData::Study::V1ToFwMedDataStudyV1Test );
+
+namespace fwStructuralPatch
+{
+namespace ut
+{
+namespace fwData
+{
+namespace Study
+{
+
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataStudyV1Test::setUp()
+{
+    // Set up context before running a test.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataStudyV1Test::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void V1ToFwMedDataStudyV1Test::applyPatchTest()
+{
+    ::fwAtoms::Object::sptr originObj = ::fwAtoms::Object::New();
+    ::fwAtoms::Object::sptr targetObj;
+
+    ::fwAtomsPatch::helper::setClassname(originObj, "::fwData::Study");
+    ::fwAtomsPatch::helper::setVersion(originObj, "1");
+
+    ::fwAtomsPatch::helper::Object helper(originObj);
+
+    helper.addAttribute("hospital", ::fwAtoms::String::New("hospital"));
+    helper.addAttribute("modality", ::fwAtoms::String::New(""));
+    helper.addAttribute("acquisition_zone", ::fwAtoms::String::New(""));
+    helper.addAttribute("uid", ::fwAtoms::String::New("4564634"));
+    helper.addAttribute("db_id", ::fwAtoms::String::New("4529"));
+    helper.addAttribute("date", ::fwAtoms::String::New("20130613"));
+    helper.addAttribute("time", ::fwAtoms::String::New("102445"));
+    helper.addAttribute("description", ::fwAtoms::String::New("description of study"));
+    helper.addAttribute("acquisitions", ::fwAtoms::Sequence::New());
+
+    targetObj = ::fwAtoms::Object::dynamicCast(originObj->clone());
+
+    ::fwAtomsPatch::IPatch::NewVersionsType newVersions;
+    newVersions[originObj] = targetObj;
+
+    ::fwStructuralPatch::fwData::Study::V1ToFwMedDataStudyV1::sptr patch;
+    patch = ::fwStructuralPatch::fwData::Study::V1ToFwMedDataStudyV1::New();
+    CPPUNIT_ASSERT_NO_THROW(patch->apply(originObj, targetObj, newVersions));
+
+    CPPUNIT_ASSERT(targetObj);
+    CPPUNIT_ASSERT_EQUAL(std::string("::fwMedData::Study"), ::fwAtomsPatch::helper::getClassname(targetObj));
+    CPPUNIT_ASSERT_EQUAL(std::string("1"), ::fwAtomsPatch::helper::getVersion(targetObj));
+
+    CPPUNIT_ASSERT(!targetObj->getAttribute("hospital"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("modality"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("acquisition_zone"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("uid"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("db_id"));
+    CPPUNIT_ASSERT(!targetObj->getAttribute("acquisitions"));
+
+    CPPUNIT_ASSERT(targetObj->getAttribute("instance_uid"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("date"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("time"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("referring_physician_name"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("description"));
+    CPPUNIT_ASSERT(targetObj->getAttribute("patient_age"));
+
+    ::fwAtoms::String::sptr uid = targetObj->getAttribute< ::fwAtoms::String >("instance_uid");
+    CPPUNIT_ASSERT_EQUAL(std::string("4564634"), uid->getString());
+
+    ::fwAtoms::String::sptr description = targetObj->getAttribute< ::fwAtoms::String >("description");
+    CPPUNIT_ASSERT_EQUAL(std::string("description of study"), description->getString());
+
+    ::fwAtoms::String::sptr date = targetObj->getAttribute< ::fwAtoms::String >("date");
+    CPPUNIT_ASSERT_EQUAL(std::string("20130613"), date->getString());
+
+    ::fwAtoms::String::sptr time = targetObj->getAttribute< ::fwAtoms::String >("time");
+    CPPUNIT_ASSERT_EQUAL(std::string("102445"), time->getString());
+}
+
+//------------------------------------------------------------------------------
+} //namespace Study
+} //namespace fwData
+} //namespace ut
+} //namespace fwStructuralPatch
diff --git a/SrcLib/tests/fwTest/CMakeLists.txt b/SrcLib/tests/fwTest/CMakeLists.txt
new file mode 100644
index 0000000..7d06fe6
--- /dev/null
+++ b/SrcLib/tests/fwTest/CMakeLists.txt
@@ -0,0 +1,16 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwComEd
+    fwCore
+    fwData
+    fwDataTools
+    fwMath
+    fwTools
+)
+
+
+find_package (Boost COMPONENTS thread filesystem REQUIRED)
+find_package(CppUnit REQUIRED)
+
+fwForwardInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
diff --git a/SrcLib/tests/fwTest/COPYING b/SrcLib/tests/fwTest/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/tests/fwTest/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/tests/fwTest/COPYING.LESSER b/SrcLib/tests/fwTest/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/tests/fwTest/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/tests/fwTest/Properties.cmake b/SrcLib/tests/fwTest/Properties.cmake
new file mode 100644
index 0000000..c42ff4b
--- /dev/null
+++ b/SrcLib/tests/fwTest/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwTest )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwComEd fwCore fwData fwDataCamp fwDataTools fwMath fwMedData fwTools )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/tests/fwTest/bin/build.options b/SrcLib/tests/fwTest/bin/build.options
new file mode 100644
index 0000000..18cda19
--- /dev/null
+++ b/SrcLib/tests/fwTest/bin/build.options
@@ -0,0 +1,11 @@
+TYPE = 'shared'
+VERSION = '0.1'
+
+USE = ['boostFilesystem', 'cppunit']
+LIB = ['fwTools_0-1',
+       'fwCore_0-1',
+       'fwData_0-1',
+       'fwMedData_0-1',
+       'fwComEd_0-1',
+       'fwDataTools_0-1'
+      ]
diff --git a/SrcLib/tests/fwTest/include/fwTest/Data.hpp b/SrcLib/tests/fwTest/include/fwTest/Data.hpp
new file mode 100644
index 0000000..5e1a5f8
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/Data.hpp
@@ -0,0 +1,29 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST__DATA_HPP__
+#define __FWTEST__DATA_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include "fwTest/Exception.hpp"
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+
+class FWTEST_CLASS_API Data
+{
+public:
+    FWTEST_API static boost::filesystem::path dir() throw(fwTest::Exception);
+
+
+    static const std::string s_TEST_DATA_DIR_ENV_VAR;
+};
+
+} // namespace fwTest
+
+#endif // __FWTEST__DATA_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/DicomReaderTest.hpp b/SrcLib/tests/fwTest/include/fwTest/DicomReaderTest.hpp
new file mode 100644
index 0000000..19195b9
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/DicomReaderTest.hpp
@@ -0,0 +1,46 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST__DICOMREADERTEST_HPP__
+#define __FWTEST__DICOMREADERTEST_HPP__
+
+#include "fwTest/config.hpp"
+
+namespace fwMedData
+{
+    class ImageSeries;
+}
+
+namespace fwTest
+{
+
+/**
+ * @class   DicomReaderTest
+ * @brief   This class defines some tools to check dicom manipulations during tests
+ * 
+ * @date    2007-2012.
+ */
+class FWTEST_CLASS_API DicomReaderTest
+{
+
+public:
+
+    /**
+     * @brief Method used to verify if a specific dicom file (stored on the
+     * test database) is well read
+     *
+     * This file is located here on test database : "fw4spl/Patient/Dicom/ACHGenou",
+     * its represents a CT image of a knee ( 400 slices ).
+     */
+    FWTEST_API static bool checkSeriesACHGenou( const SPTR(::fwMedData::ImageSeries) &series );
+};
+
+
+
+
+} // namespace fwTest
+
+#endif // __FWTEST__DICOMREADERTEST_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/Exception.hpp b/SrcLib/tests/fwTest/include/fwTest/Exception.hpp
new file mode 100644
index 0000000..b434f75
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/Exception.hpp
@@ -0,0 +1,32 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST__EXCEPTION_HPP__
+#define __FWTEST__EXCEPTION_HPP__
+
+#include <stdexcept>
+#include <string>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+
+
+class FWTEST_CLASS_API Exception : public std::runtime_error
+{
+
+public:
+    FWTEST_API Exception ( const std::string &err );
+
+};
+
+
+
+
+} // namespace fwTest
+
+#endif // __FWTEST__EXCEPTION_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/File.hpp b/SrcLib/tests/fwTest/include/fwTest/File.hpp
new file mode 100644
index 0000000..cf9995e
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/File.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST__FILE_HPP__
+#define __FWTEST__FILE_HPP__
+
+#include <boost/filesystem/path.hpp>
+
+#include "fwTest/Exception.hpp"
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+
+class FWTEST_CLASS_API File
+{
+public:
+    FWTEST_API static bool contentEquals(const ::boost::filesystem::path &lfile, const ::boost::filesystem::path &rfile);
+
+};
+
+} // namespace fwTest
+
+#endif // __FWTEST__FILE_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/config.hpp b/SrcLib/tests/fwTest/include/fwTest/config.hpp
new file mode 100644
index 0000000..d6fb9a9
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+
+#ifndef _FWTEST_CONFIG_HPP_
+#define _FWTEST_CONFIG_HPP_
+
+    #ifdef _WIN32
+
+        #ifdef FWTEST_EXPORTS
+            #define FWTEST_API __declspec(dllexport)
+        #else
+            #define FWTEST_API __declspec(dllimport)
+        #endif
+
+        #define FWTEST_CLASS_API
+
+        #pragma warning(disable: 4290)
+
+    #elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+        #ifdef FWTEST_EXPORTS
+            #define FWTEST_API __attribute__ ((visibility("default")))
+            #define FWTEST_CLASS_API __attribute__ ((visibility("default")))
+        #else
+            #define FWTEST_API __attribute__ ((visibility("hidden")))
+            #define FWTEST_CLASS_API __attribute__ ((visibility("hidden")))
+        #endif
+
+    #else
+
+        #define FWTEST_API
+        #define FWTEST_CLASS_API
+
+    #endif
+
+#endif //FWTEST_API
+
diff --git a/SrcLib/tests/fwTest/include/fwTest/generator/Image.hpp b/SrcLib/tests/fwTest/include/fwTest/generator/Image.hpp
new file mode 100644
index 0000000..6ea71bb
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/generator/Image.hpp
@@ -0,0 +1,71 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST_GENERATOR_IMAGE_HPP__
+#define __FWTEST_GENERATOR_IMAGE_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <fwTools/Type.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMath/Compare.hpp>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+namespace generator
+{
+
+
+/**
+ * @brief   This class contains helper to generate images.
+ * @class   Image
+ */
+class Image
+{
+
+public :
+
+    /**
+     * @brief Initialize 'rand' seed
+     */
+    FWTEST_API static void initRand();
+
+    /**
+     * @brief Generate an image with the given informations. Buffer is filled with 0.
+     * @param image     image to generate
+     * @param size      vector of image size
+     * @param spacing   vector of image spacing
+     * @param origin    vector of image origin
+     * @param type      image type
+     */
+    FWTEST_API static void generateImage(::fwData::Image::sptr image,
+                                              ::fwData::Image::SizeType size,
+                                              std::vector<double> spacing,
+                                              std::vector<double> origin,
+                                              ::fwTools::Type type);
+
+    /// Generate an image with random information (size, spacing, ...). Buffer is filled with random values.
+    FWTEST_API static void generateRandomImage(::fwData::Image::sptr image, ::fwTools::Type type);
+
+    /// Fill array with random value
+    FWTEST_API static void randomizeArray(::fwData::Array::sptr array);
+
+    /// Creates an Array with the given type and size and fills buffer with random values.
+    FWTEST_API static ::fwData::Array::sptr createRandomizedArray(const std::string &type,
+                                                                  ::fwData::Array::SizeType sizes);
+
+};
+
+} // namespace generator
+} // namespace fwTest
+
+#endif // __FWTEST_GENERATOR_IMAGE_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/generator/Mesh.hpp b/SrcLib/tests/fwTest/include/fwTest/generator/Mesh.hpp
new file mode 100644
index 0000000..5db86d0
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/generator/Mesh.hpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST_GENERATOR_MESH_HPP__
+#define __FWTEST_GENERATOR_MESH_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Mesh.hpp>
+
+#include <fwComEd/helper/Mesh.hpp>
+
+#include <fwDataTools/Vector.hxx>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+namespace generator
+{
+
+
+/**
+ * @brief   This helper generates a mesh using specified structure (quad or triangle).
+ * @class   Mesh
+ */
+class Mesh
+{
+
+public :
+
+    typedef std::map< ::fwDataTools::Point, ::fwData::Mesh::Id> PointsMapType;
+
+
+    /**
+     * @brief Initialize 'rand' seed
+     */
+    FWTEST_API static void initRand();
+
+    /**
+     * @brief Generate a mesh.
+     * @param mesh mesh to generate
+     */
+    FWTEST_API static void generateMesh( ::fwData::Mesh::sptr mesh );
+
+
+    /**
+     * @brief Add quad cells in mesh, this method generates synthetic data (two face of a cube).
+     *
+     * @param[out]  mesh fwData::Mesh Mesh structure to fill with quad cells.
+     * @param[in]   points PointsMapType Point registration map used to not create point which already in mesh buffer.
+     * @param[in]   nbPointsByEdge size_t Number of points by edge.
+     * @param[in]   edgeDim float Edge dimension in 3D world.
+     */
+    FWTEST_API static void addQuadMesh(::fwData::Mesh::sptr mesh,
+                                       PointsMapType& points,
+                                       size_t nbPointsByEdge = 10,
+                                       float edgeDim = 100.);
+
+    /**
+     * @brief Add triangle cells in mesh, this method generates synthetic data (two face of a cube).
+     *
+     * @param[out]  mesh fwData::Mesh Mesh structure to fill with triangle cells.
+     * @param[in]   points PointsMapType Point registration map used to not create point which already in mesh buffer.
+     * @param[in]   nbPointsByEdge size_t Number of points by edge.
+     * @param[in]   edgeDim float Edge dimension in 3D world.
+     */
+    FWTEST_API static void addTriangleMesh(::fwData::Mesh::sptr mesh,
+                                           PointsMapType& points,
+                                           size_t nbPointsByEdge = 10,
+                                           float edgeDim = 100.);
+
+    /**
+     * @brief Generate a quad mesh.
+     * @see addQuadMesh
+     * @param[out]  mesh fwData::Mesh empty mesh structure to fill with quad cells.
+     */
+    FWTEST_API static void generateQuadMesh(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Generate a triangle mesh.
+     * @see addTriangleMesh
+     * @param[out]  mesh fwData::Mesh empty mesh structure to fill with triangle cell.
+     */
+    FWTEST_API static void generateTriangleMesh(::fwData::Mesh::sptr mesh);
+
+    /**
+     * @brief Generate a mesh with quad and triangle cells.
+     * @see addQuadMesh
+     * @see addTriangleMesh
+     * @param[out]  mesh fwData::Mesh empty mesh structure to fill with quad and triangle cells.
+     */
+    FWTEST_API static void generateTriangleQuadMesh(::fwData::Mesh::sptr mesh);
+
+
+protected:
+
+    FWTEST_API static ::fwData::Mesh::Id addPoint(::fwData::Mesh::PointValueType* pt,
+                                                       ::fwComEd::helper::Mesh::sptr meshHelper,
+                                                       PointsMapType& points);
+
+
+};
+
+} // namespace generator
+} // namespace fwTest
+
+#endif // __FWTEST_GENERATOR_MESH_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/generator/Object.hpp b/SrcLib/tests/fwTest/include/fwTest/generator/Object.hpp
new file mode 100644
index 0000000..961608c
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/generator/Object.hpp
@@ -0,0 +1,95 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST_GENERATOR_OBJECT_HPP__
+#define __FWTEST_GENERATOR_OBJECT_HPP__
+
+#include <fwCore/base.hpp>
+
+#include <fwData/Array.hpp>
+#include <fwData/Color.hpp>
+#include <fwData/Composite.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Node.hpp>
+#include <fwData/Plane.hpp>
+#include <fwData/Point.hpp>
+#include <fwData/Port.hpp>
+#include <fwData/ProcessObject.hpp>
+#include <fwData/ReconstructionTraits.hpp>
+#include <fwData/Resection.hpp>
+#include <fwData/ResectionDB.hpp>
+#include <fwData/ROITraits.hpp>
+#include <fwData/StructureTraits.hpp>
+#include <fwData/StructureTraitsDictionary.hpp>
+#include <fwData/TransferFunction.hpp>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+namespace generator
+{
+/**
+ * @brief   This class contains helper to generate data objects.
+ * @class   Object
+ */
+class Object
+{
+public:
+
+    /// Creates a color with random values
+    FWTEST_API static ::fwData::Color::sptr randomizeColor();
+
+    /// Creates a TransferFunction with random values and specified nbPoints, window and level
+    FWTEST_API static ::fwData::TransferFunction::sptr createTFColor(unsigned char nbPoints,
+                                                                     double window,
+                                                                     double level );
+
+    /// Creates a TransferFunction with few values
+    FWTEST_API static ::fwData::TransferFunction::sptr createTFColor();
+
+    /// Creates a StructureTraitsDictionary with many organs
+    FWTEST_API static ::fwData::StructureTraitsDictionary::sptr createStructureTraitsDictionary();
+
+    /// Creates a StructureTraits representing the liver
+    FWTEST_API static ::fwData::StructureTraits::sptr createStructureTraits();
+
+    /// Return a composite containing the ROITraits and a reference on its StructureTraits and mask node (because of weak ptr)
+    FWTEST_API static ::fwData::Composite::sptr createROITraits();
+
+    /// Return a composite containing the ReconstructionTraits and a reference on its StructureTraits and mask/mesh node (because of weak ptr)
+    FWTEST_API static ::fwData::Composite::sptr createReconstructionTraits();
+
+    /// Creates a Node with random ports
+    FWTEST_API static ::fwData::Node::sptr createNode();
+
+    /// Creates a Port with random identifier and type
+    FWTEST_API static ::fwData::Port::sptr createPort();
+
+    /// Creates a Material with ambient and diffuse color.
+    FWTEST_API static ::fwData::Material::sptr createMaterial( );
+
+    /// Creates a ProcessObject with 3 inputs and 1 output
+    FWTEST_API static ::fwData::ProcessObject::sptr createProcessObject();
+
+    /// Creates a ResectionDB containing one Resection.
+    FWTEST_API static ::fwData::ResectionDB::sptr generateResectionDB();
+
+    /// Creates a Resection with 2 planes, 1 input Reconstruction and 1 output Reconstruction.
+    FWTEST_API static ::fwData::Resection::sptr generateResection();
+
+    /// Creates a Point with random coordinates.
+    FWTEST_API static ::fwData::Point::sptr generatePoint();
+
+    /// Creates a Plane with random points.
+    FWTEST_API static ::fwData::Plane::sptr generatePlane();
+};
+
+} // namespace generator
+} // namespace fwTest
+
+
+#endif // __FWTEST_GENERATOR_OBJECT_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/generator/SeriesDB.hpp b/SrcLib/tests/fwTest/include/fwTest/generator/SeriesDB.hpp
new file mode 100644
index 0000000..e305210
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/generator/SeriesDB.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWDTEST_GENERATOR_SERIESDB_HPP__
+#define __FWDTEST_GENERATOR_SERIESDB_HPP__
+
+#include <fwCore/base.hpp>
+
+#include "fwTest/config.hpp"
+
+namespace fwData
+{
+    class Reconstruction;
+}
+
+namespace fwMedData
+{
+    class SeriesDB;
+    class Series;
+    class Patient;
+    class Study;
+    class Equipment;
+    class ImageSeries;
+    class ModelSeries;
+    class ActivitySeries;
+}
+
+namespace fwTest
+{
+namespace generator
+{
+
+
+/**
+ * @brief   This class contains helper to generate Medical Data (SeriesDB, ImageSeries, ...).
+ * @class   Patient
+ *
+ */
+class SeriesDB
+{
+
+public :
+
+    /**
+     * @brief Creates a SeriesDB.
+     * @param nbImgSeries       number of ImageSeries to add in seriesDB
+     * @param nbModelSeries     number of ModelSeries to add in seriesDB
+     * @param nbActivitySeries  number of ActivitySeries to add in seriesDB
+     * @return The created SeriesDB
+     */
+    FWTEST_API static SPTR(::fwMedData::SeriesDB) createSeriesDB(const unsigned char nbImgSeries,
+                                                     const unsigned char nbModelSeries,
+                                                     const unsigned char nbActivitySeries);
+
+
+    /// Returns a Patient with dummy informations
+    FWTEST_API static SPTR(::fwMedData::Patient) createPatient();
+
+
+    /// Returns a Study with dummy informations
+    FWTEST_API static SPTR(::fwMedData::Study) createStudy();
+
+    /// Returns an Equipment with dummy informations
+    FWTEST_API static SPTR(::fwMedData::Equipment) createEquipement();
+
+    /// Generates dummy informations for the series
+    FWTEST_API static void generateSeriesInformation(SPTR(::fwMedData::Series) series);
+
+    /// Returns an ImageSeries with a randomized image
+    FWTEST_API static SPTR(::fwMedData::ImageSeries) createImageSeries();
+
+    /**
+     * @brief Returns a ModelSeries containing random Reconstructions
+     * @param nbReconstruction number of Reconstrutions to add in the ModelSeries
+     */
+    FWTEST_API static SPTR(::fwMedData::ModelSeries) createModelSeries(unsigned char nbReconstruction);
+
+    /// Returns an ActivitySeries with dummy data
+    FWTEST_API static SPTR(::fwMedData::ActivitySeries) createActivitySeries();
+
+    /**
+     * @brief Generate a reconstruction.
+     * @param rec   reconstruction to generate
+     */
+    FWTEST_API static void generateReconstruction(SPTR(::fwData::Reconstruction) rec);
+
+
+};
+
+} // namespace generator
+} // namespace fwTest
+
+#endif // __FWDTEST_GENERATOR_SERIESDB_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/helper/Thread.hpp b/SrcLib/tests/fwTest/include/fwTest/helper/Thread.hpp
new file mode 100644
index 0000000..b562219
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/helper/Thread.hpp
@@ -0,0 +1,88 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST_HELPER_THREAD_HPP__
+#define __FWTEST_HELPER_THREAD_HPP__
+
+#include <exception>
+
+#include <boost/thread.hpp>
+#include <boost/bind.hpp>
+#include <boost/thread/thread_time.hpp>
+
+#include <cppunit/Exception.h>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+namespace helper
+{
+
+/**
+ * @brief   Helper to manage a thread. The thread launches a function and catches its exception.
+ * @class   Thread
+ * 
+ * @date    2012.
+ *
+ * @note    It is used for unit test.
+ */
+class FWTEST_CLASS_API Thread
+{
+public:
+
+    typedef ::boost::function<void ()> FunctionType;
+
+    /**
+     * @brief Constructor : launch a thread which call run(f)
+     * @param f function to be called in thread
+     */
+    FWTEST_API Thread(FunctionType f);
+
+    /// Destructor
+    FWTEST_API virtual ~Thread();
+
+    /// Waits the thread execution to complete
+    FWTEST_API void join(bool raise = true);
+
+    /**
+     * @brief Waits the thread of execution to complete
+     * @param time time to waits for the thread stop.
+     * @param raise if true raises an exception when it failed.
+     * @return true if the thread of execution has completed before the call times out
+     */
+    FWTEST_API bool timedJoin(int time, bool raise = true);
+
+    /// Return the exception raised in function launched by thread
+    CPPUNIT_NS::Exception getException() {return m_exception;}
+
+    /// Return true if function launched by thread raised exception
+    bool hasFailed() {return m_hasFailed;}
+
+    /**
+     * @brief If any, throws the exception raised by the thread function.
+     */
+    void throwException();
+
+private :
+
+    /// Method launched by thread : call run(f) surrounded by try/catch
+    void run(FunctionType f);
+
+    /// Thread created in constructor
+    ::boost::thread m_thread;
+
+    /// Exception raised by function launched by thread
+    CPPUNIT_NS::Exception m_exception;
+
+    /// true if function launched by thread raised exception
+    bool m_hasFailed;
+};
+
+} // namespace helper
+} // namespace fwTest
+
+#endif // __FWTEST_HELPER_THREAD_HPP__
diff --git a/SrcLib/tests/fwTest/include/fwTest/helper/compare.hpp b/SrcLib/tests/fwTest/include/fwTest/helper/compare.hpp
new file mode 100644
index 0000000..7334a7e
--- /dev/null
+++ b/SrcLib/tests/fwTest/include/fwTest/helper/compare.hpp
@@ -0,0 +1,28 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWTEST_HELPER_COMPARE_HPP__
+#define __FWTEST_HELPER_COMPARE_HPP__
+
+#include <set>
+#include <string>
+
+#include "fwTest/config.hpp"
+
+namespace fwTest
+{
+namespace helper
+{
+typedef std::set<std::string> ExcludeSetType;
+
+FWTEST_API bool compare(::fwData::Object::sptr objRef,
+                        ::fwData::Object::sptr objComp,
+                         ExcludeSetType exclude = ExcludeSetType());
+
+} // namespace helper
+} // namespace fwTest
+
+#endif // __FWTEST_HELPER_COMPARE_HPP__
diff --git a/SrcLib/tests/fwTest/src/fwTest/Data.cpp b/SrcLib/tests/fwTest/src/fwTest/Data.cpp
new file mode 100644
index 0000000..c8f4ac5
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/Data.cpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <cstdlib>
+#include <sstream>
+
+#include <boost/filesystem/operations.hpp>
+
+#include "fwTest/Exception.hpp"
+#include "fwTest/Data.hpp"
+
+namespace fwTest
+{
+
+const std::string Data::s_TEST_DATA_DIR_ENV_VAR("FWTEST_DATA_DIR");
+
+boost::filesystem::path Data::dir() throw(fwTest::Exception)
+{
+    char * val = std::getenv(s_TEST_DATA_DIR_ENV_VAR.c_str());
+    if (val == 0)
+    {
+        std::stringstream msg;
+        msg << "The '" << s_TEST_DATA_DIR_ENV_VAR
+            << "' environment variable is not set.";
+        throw fwTest::Exception(msg.str());
+    }
+
+    ::boost::filesystem::path datadir(val);
+
+    if (!::boost::filesystem::exists(datadir))
+    {
+        std::stringstream msg;
+        msg << "The path'" << datadir
+            << "' doesn't seem to exist.";
+        throw fwTest::Exception(msg.str());
+    }
+
+    return datadir;
+}
+
+
+} // namespace fwTest
+
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/DicomReaderTest.cpp b/SrcLib/tests/fwTest/src/fwTest/DicomReaderTest.cpp
new file mode 100644
index 0000000..71ab5e3
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/DicomReaderTest.cpp
@@ -0,0 +1,233 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwTools/dateAndTime.hpp>
+#include <fwTools/Type.hpp>
+
+#include <fwData/Image.hpp>
+
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Series.hpp>
+
+#include "fwTest/DicomReaderTest.hpp"
+
+namespace fwTest
+{
+
+//------------------------------------------------------------------------------
+#define CHECK_VALUE(check,message,val1,val2)                                \
+{                                                                           \
+    check &= (val1 == val2);                                                \
+    OSLM_ERROR_IF(message << " <"<< val1 << "> != <" << val2 << ">", val1 != val2 );        \
+}                                                                           \
+
+//------------------------------------------------------------------------------
+
+#define CHECK_VALUE_WITH_TOLERANCE(check,message,val1,val2,tol)                                 \
+{                                                                                               \
+    check &= ( val1 - tol <= val2 &&  val2 <= val1 + tol ) ;                                    \
+    OSLM_ERROR_IF(message << val1 << " != " << val2, val1 - tol > val2 ||  val2 > val1 + tol ); \
+}
+
+//------------------------------------------------------------------------------
+
+bool DicomReaderTest::checkSeriesACHGenou( const ::fwMedData::ImageSeries::sptr &series )
+{
+    bool ok = true;
+    bool notReallyChecked = true;
+
+
+    ::fwMedData::Patient::sptr patient = series->getPatient();
+    ::fwMedData::Study::sptr study = series->getStudy();
+    ::fwMedData::Equipment::sptr equipment = series->getEquipment();
+
+    // Study, Acquisition
+    ::fwData::Image::sptr img = series->getImage();
+
+    //# Dicom-File-Format
+    //
+    //# Dicom-Meta-Information-Header
+    //# Used TransferSyntax:
+    //(0002,0000) UL 224                                                # 4,1 File Meta Information Group Length
+    //(0002,0001) OB 00\01                                              # 2,1 File Meta Information Version
+    //(0002,0002) UI [1.2.840.10008.5.1.4.1.1.2]                        # 26,1 Media Storage SOP Class UID
+    //(0002,0003) UI [1.2.392.200036.9116.2.6.1.48.1211418863.1225184712.380696]         # 58,1 Media Storage SOP Instance UID
+    //(0002,0010) UI [1.2.840.10008.1.2.1]                              # 20,1 Transfer Syntax UID
+    //(0002,0012) UI [1.2.250.1.119.1.1.1.1.1.1.33.3.8.13.7]            # 38,1 Implementation Class UID
+    //(0002,0013) SH [scanplus_33 ]                                     # 12,1 Implementation Version Name
+    //(0002,0016) AE [scanplus]                                         # 8,1 Source Application Entity Title
+    //
+    //# Dicom-Data-Set
+    //# Used TransferSyntax: 1.2.840.10008.1.2.1
+    //(0008,0000) UL 426                                                # 4,1 Generic Group Length
+    //(0008,0008) CS [ORIGINAL\PRIMARY\AXIAL]                           # 22,2-n Image Type
+    //(0008,0016) UI [1.2.840.10008.5.1.4.1.1.2]                        # 26,1 SOP Class UID
+    //(0008,0018) UI [1.2.392.200036.9116.2.6.1.48.1211418863.1225184712.380696]         # 58,1 SOP Instance UID
+    //(0008,0020) DA [20081028]                                         # 8,1 Study Date
+    CHECK_VALUE(ok,"Study Date doesn't match : ", "20081028",study->getDate());
+    //(0008,0021) DA [20081028]                                         # 8,1 Series Date
+    CHECK_VALUE(ok,"Series Modality doesn't match : ", "20081028", series->getDate() );
+    //(0008,0022) DA [20081028]                                         # 8,1 Acquisition Date
+    //(0008,0023) DA [20081028]                                         # 8,1 Content Date
+    //(0008,0030) TM [174327.000]                                       # 10,1 Study Time
+    CHECK_VALUE(ok,"Study Time doesn't match : ", "174327.000", study->getTime() );
+    //(0008,0031) TM [180156.734]                                       # 10,1 Series Time
+    CHECK_VALUE(ok,"Series Modality doesn't match : ", "180156.734", series->getTime() );
+    //(0008,0032) TM [174446.850]                                       # 10,1 Acquisition Time
+    //(0008,0033) TM [174502.095]                                       # 10,1 Content Time
+    //(0008,0050) SH [12514 ]                                           # 6,1 Accession Number
+    //(0008,0060) CS [CT]                                               # 2,1 Modality
+    CHECK_VALUE(ok,"Series Modality doesn't match : ", "CT", series->getModality() );
+    //(0008,0070) LO [TOSHIBA ]                                         # 8,1 Manufacturer
+    //(0008,0080) LO [SCANNER DE LA MODER ]                             # 20,1 Institution Name
+    CHECK_VALUE(ok,"Equipment's Institution Name doesn't match : ", "SCANNER DE LA MODER ", equipment->getInstitutionName() );
+    //(0008,0090) PN [DR MOREL]                                         # 8,1 Referring Physician's Name
+    CHECK_VALUE(ok,"Study Referring Physician's Name doesn't match : ", "DR MOREL", study->getReferringPhysicianName() );
+    //(0008,1010) SH [00000000001 ]                                     # 12,1 Station Name
+    //(0008,103e) LO [ OS 0.5   ]                                       # 10,1 Series Description
+    CHECK_VALUE(ok,"Study Description doesn't match : ", " OS 0.5   ", series->getDescription() );
+    CHECK_VALUE(ok,"Study Description doesn't match : ", "", study->getDescription() ); // 0008,1030
+    //(0008,1040) LO [ID_DEPARTMENT ]                                   # 14,1 Institutional Department Name
+    {
+        fwMedData::DicomValuesType physiciansName;
+        ok &= (physiciansName == series->getPerformingPhysiciansName());
+        OSLM_ERROR_IF ("Name of the physician(s) administering the Series doesn't match : ", (physiciansName == series->getPerformingPhysiciansName()));
+    }
+    //(0008,1090) LO [Aquilion]                                         # 8,1 Manufacturer's Model Name
+    //(0010,0000) UL 104                                                # 4,1 Generic Group Length
+    //(0010,0010) PN [CHARNOZ ARNAUD]                                   # 14,1 Patient's Name
+    CHECK_VALUE(ok,"Patient's Name doesn't match : ", "CHARNOZ ARNAUD", patient->getName() );
+    //(0010,0020) LO [12592 ARTHRO GENOU  G ]                           # 22,1 Patient ID
+    CHECK_VALUE(ok,"Patient ID doesn't match : ", "12592 ARTHRO GENOU  G ", patient->getPatientId() );
+    //(0010,0030) DA [19790618]                                         # 8,1 Patient's Birth Date
+    CHECK_VALUE(ok,"Patient's Birth Date doesn't match : ", "19790618", patient->getBirthdate() );
+    //(0010,0040) CS [M ]                                               # 2,1 Patient's Sex
+    CHECK_VALUE(ok,"Patient's Sex doesn't match :", "M " , patient->getSex() );
+    //(0010,1010) AS [029Y]                                             # 4,1 Patient's Age
+    CHECK_VALUE(ok,"Study Patient's Age doesn't match :", "029Y" , study->getPatientAge() );
+    //(0010,4000) LT [ARTHRO]                                           # 6,1 Patient Comments
+    //(0018,0000) UL 284                                                # 4,1 Generic Group Length
+    //(0018,0015) CS [DR MOREL]                                         # 8,1 Body Part Examined
+    //(0018,0022) CS [HELICAL_CT]                                       # 10,1-n Scan Options
+    //(0018,0050) DS [0.5 ]                                             # 4,1 Slice Thickness
+    //(0018,0060) DS [120 ]                                             # 4,1 KVP
+    //(0018,0090) DS [400.00]                                           # 6,1 Data Collection Diameter
+    //(0018,1000) LO [C4522344]                                         # 8,1 Device Serial Number
+    //(0018,1020) LO [V3.20ER005]                                       # 10,1-n Software Version(s)
+    //(0018,1030) LO [ARTHRO GENOU]                                     # 12,1 Protocol Name
+    //(0018,1100) DS [196.875 ]                                         # 8,1 Reconstruction Diameter
+    //(0018,1120) DS [+0.0]                                             # 4,1 Gantry/Detector Tilt
+    //(0018,1130) DS [+90.00]                                           # 6,1 Table Height
+    //(0018,1140) CS [CW]                                               # 2,1 Rotation Direction
+    //(0018,1150) IS [500 ]                                             # 4,1 Exposure Time
+    //(0018,1151) IS [200 ]                                             # 4,1 X-Ray Tube Current
+    //(0018,1152) IS [100 ]                                             # 4,1 Exposure
+    //(0018,1170) IS [24]                                               # 2,1 Generator Power
+    //(0018,1190) DS [0.9\0.8 ]                                         # 8,1-n Focal Spot(s)
+    //(0018,1210) SH [FC30]                                             # 4,1-n Convolution Kernel
+    //(0018,5100) CS [FFS ]                                             # 4,1 Patient Position
+    //(0018,9345) UN (FD) 23.1                                          # 8,1 CTDIvol
+    //(0020,0000) UL 370                                                # 4,1 Generic Group Length
+    //(0020,000d) UI [1.2.392.200036.9116.2.6.1.48.1211418863.1225183167.375775]         # 58,1 Study Instance UID
+    CHECK_VALUE(ok,"Study Instance UID doesn't match :", "1.2.392.200036.9116.2.6.1.48.1211418863.1225183167.375775" , study->getInstanceUID() );
+    //(0020,000e) UI [1.2.392.200036.9116.2.6.1.48.1211418863.1225184516.765855]         # 58,1 Series Instance UID
+    CHECK_VALUE(ok,"Series Instance UID doesn't match :", "1.2.392.200036.9116.2.6.1.48.1211418863.1225184516.765855" , series->getInstanceUID() );
+    //(0020,0010) SH [12514 ]                                           # 6,1 Study ID
+    //(0020,0011) IS [3 ]                                               # 2,1 Series Number
+    //(0020,0012) IS [3 ]                                               # 2,1 Acquisition Number
+    //(0020,0013) IS [404 ]                                             # 4,1 Instance Number
+    //(0020,0020) CS [L\P ]                                             # 4,2 Patient Orientation
+    //(0020,0032) DS [-36.71875\-88.28125\1350.300]                     # 28,3 Image Position (Patient)
+
+
+    if(!img)
+    {
+        OSLM_ERROR( "Missing image." );
+        return false;
+    }
+
+
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image x origin doesn't match  :", -36.71875 , img->getOrigin()[0], 0.01);
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image y origin doesn't match  :", -88.28125 , img->getOrigin()[1], 0.01);
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image z origin doesn't match  :", 1350.300 , img->getOrigin()[2], 0.01);
+    //(0020,0037) DS [1.00000\0.00000\0.00000\0.00000\1.00000\0.00000 ]         # 48,6 Image Orientation (Patient)
+    //(0020,0052) UI [1.2.392.200036.9116.2.6.1.48.1211418863.1225183409.15274]         # 56,1 Frame of Reference UID
+    //(0020,1040) LO (no value)                                         # 0,1 Position Reference Indicator
+    //(0020,1041) DS [+161.20 ]                                         # 8,1 Slice Location
+    //(0028,0000) UL 158                                                # 4,1 Generic Group Length
+    //(0028,0002) US 1                                                  # 2,1 Samples per Pixel
+    //(0028,0004) CS [MONOCHROME2 ]                                     # 12,1 Photometric Interpretation
+    //(0028,0010) US 512                                                # 2,1 Rows
+    //(0028,0011) US 512                                                # 2,1 Columns
+    CHECK_VALUE(ok,"Image x size doesn't match  :", 512 , img->getSize()[0] );
+    CHECK_VALUE(ok,"Image y size doesn't match  :", 512 , img->getSize()[1] );
+    CHECK_VALUE(ok,"Image z size doesn't match  :", 404 , img->getSize()[2] );
+    //(0028,0030) DS [0.384\0.384 ]                                     # 12,2 Pixel Spacing
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image x spacing doesn't match  :", 0.384 , img->getSpacing()[0], 0.001);
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image y spacing doesn't match  :", 0.384 , img->getSpacing()[1], 0.001);
+    CHECK_VALUE_WITH_TOLERANCE(ok,"Image z spacing doesn't match  :", 0.399 , img->getSpacing()[2], 0.001);
+    //(0028,0100) US 16                                                 # 2,1 Bits Allocated
+    //(0028,0101) US 16                                                 # 2,1 Bits Stored
+    CHECK_VALUE(notReallyChecked,"Image Bits Allocated correspond  :", 16, img->getType().sizeOf() * 8 );
+    //(0028,0102) US 15                                                 # 2,1 High Bit
+    //(0028,0103) US 1                                                  # 2,1 Pixel Representation
+    CHECK_VALUE(notReallyChecked,"Image Bits Allocated correspond  :", false, img->getType().isSigned() );
+    //(0028,1050) DS [500 ]                                             # 4,1-n Window Center
+    CHECK_VALUE(ok,"Image Window Center correspond  :", 500, img->getWindowCenter() );
+    //(0028,1051) DS [2500]                                             # 4,1-n Window Width
+    CHECK_VALUE(ok,"Image Window Width correspond  :", 2500, img->getWindowWidth() );
+    //(0028,1052) DS [-1024 ]                                           # 6,1 Rescale Intercept
+    //(0028,1053) DS [1 ]                                               # 2,1 Rescale Slope
+    //(0040,0000) UL 116                                                # 4,1 Generic Group Length
+    //(0040,0002) DA [20081028]                                         # 8,1 Scheduled Procedure Step Start Date
+    //(0040,0003) TM [174327.000]                                       # 10,1 Scheduled Procedure Step Start Time
+    //(0040,0004) DA [20081028]                                         # 8,1 Scheduled Procedure Step End Date
+    //(0040,0005) TM [181327.000]                                       # 10,1 Scheduled Procedure Step End Time
+    //(0040,0244) DA [20081028]                                         # 8,1 Performed Procedure Step Start Date
+    //(0040,0245) TM [174327.000]                                       # 10,1 Performed Procedure Step Start Time
+    //(0040,0253) SH [12325 ]                                           # 6,1 Performed Procedure Step ID
+    //(7005,0000) UL 546                                                # 4,1 Generic Group Length
+    //(7005,0010) LO [TOSHIBA_MEC_CT3 ]                                 # 16,1 Private Creator
+    //(7005,1007) UN (DS) [335\269 ]                                    # 8,2 Reconstruction Center
+    //(7005,1008) UN (DS) [0.5 ]                                        # 4,1 Detector Slice Thickness in mm
+    //(7005,1009) UN (LO) [1111111111111111]                            # 16,1 Number of Detector rows to Reconstruct
+    //(7005,100a) UN (DS) [+5.50 ]                                      # 6,1 Table Speed in mm/rot
+    //(7005,100b) UN (SH) [ORG ]                                        # 4,1 Filter
+    //(7005,100d) UN (CS) [DR MOREL]                                    # 8,1 Organ
+    //(7005,100e) UN (SH) [IMG ]                                        # 4,1 File Type Remarks
+    //(7005,100f) UN (SH) [FF]                                          # 2,1 Direction
+    //(7005,1011) UN (LT) [Vol.]                                        # 4,1 Series Comment
+    //(7005,1012) UN (SH) [SU]                                          # 2,1 Position
+    //(7005,1013) UN (US) 1                                             # 2,1 Expert Plan No.
+    //(7005,1016) UN (UI) [1.2.392.200036.9116.2.6.1.48.1211418863.1225184516.747732]         # 58,1 Volume UID
+    //(7005,1017) UN (US) 404                                           # 2,1 Total Frame Count in the Volume
+    //(7005,1018) UN (US) 404                                           # 2,1 Frame No.
+    //(7005,1019) UN (UL) 1642763                                       # 4,1 Frame Sort Key
+    //(7005,101a) UN (US) 1                                             # 2,1 Frame Sort Order
+    //(7005,101b) UN (SH) [FC30]                                        # 4,1 Convolution Kernel
+    //(7005,101d) UN (UL) 9                                             # 4,1 Reconstruction Number
+    //(7005,101e) UN (UL) 13                                            # 4,1 Raw Data Number
+    //(7005,101f) UN (LO) [20081028180156768480]                        # 20,1 Volume Number
+    //(7005,1020) UN (UL) 3                                             # 4,1 Local Series Number
+    //(7005,1021) UN (LO) [BOOST ]                                      # 6,1 Decrease in Artifact Filter
+    //(7005,1022) UN (DS) [0.40]                                        # 4,1 Reconstruction Interval
+    //(7005,1023) UN (DS) [0.688 ]                                      # 6,1 Pitch Factor
+    //(7005,1024) UN (DA) [20081024]                                    # 8,1 The Acquisition Date of NRA
+    //(7005,1030) UN (CS) [CT]                                          # 2,1 Main Modality in Study
+    //(7005,1040) UN (FD) 402.4                                         # 8,1 DLP Dose Length Product
+
+    return ok;
+
+}
+
+} // namespace fwTest
+
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/Exception.cpp b/SrcLib/tests/fwTest/src/fwTest/Exception.cpp
new file mode 100644
index 0000000..1a207e8
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/Exception.cpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwTest/Exception.hpp"
+
+namespace fwTest
+{
+
+Exception::Exception ( const std::string &err ) 
+    : std::runtime_error ( err )
+{
+}
+
+
+} // namespace fwTest
+
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/File.cpp b/SrcLib/tests/fwTest/src/fwTest/File.cpp
new file mode 100644
index 0000000..c46cec2
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/File.cpp
@@ -0,0 +1,47 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fstream>
+#include <boost/filesystem/path.hpp>
+#include "fwTest/File.hpp"
+
+namespace fwTest
+{
+
+bool File::contentEquals(const ::boost::filesystem::path &lfile, const ::boost::filesystem::path &rfile)
+{
+    using namespace std;
+    const streambuf::int_type eof = streambuf::traits_type::eof();
+
+    std::ifstream lstream(lfile.c_str());
+    std::ifstream rstream(rfile.c_str());
+
+    streambuf * lbuf = lstream.rdbuf();
+    streambuf * rbuf = rstream.rdbuf();
+
+    char lchar, rchar;
+    while (true)
+    {
+        lchar = lbuf->sbumpc();
+        rchar = rbuf->sbumpc();
+
+        if (lchar == eof && rchar == eof)
+        {
+            return true;
+        }
+
+        if (lchar != rchar || lchar == eof || rchar == eof )
+        {
+            break;
+        }
+    }
+
+    return false;
+}
+
+}; //namespace fwTest
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/generator/Image.cpp b/SrcLib/tests/fwTest/src/fwTest/generator/Image.cpp
new file mode 100644
index 0000000..038965f
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/generator/Image.cpp
@@ -0,0 +1,111 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <ctime>
+
+#include <fwTools/Type.hpp>
+#include <fwTools/NumericRoundCast.hxx>
+
+#include <fwComEd/helper/Array.hpp>
+
+#include "fwTest/generator/Image.hpp"
+
+
+namespace fwTest
+{
+namespace generator
+{
+
+//------------------------------------------------------------------------------
+
+void Image::initRand()
+{
+    std::srand(::fwTools::numericRoundCast< unsigned int >(std::time(NULL)));
+}
+
+//------------------------------------------------------------------------------
+
+void Image::generateImage(::fwData::Image::sptr image,
+                          ::fwData::Image::SizeType size,
+                          std::vector<double> spacing,
+                          std::vector<double> origin,
+                          ::fwTools::Type type)
+{
+    image->setSpacing(spacing);
+    image->setOrigin(origin);
+    image->setSize(size);
+    image->setType(type);
+
+    image->allocate();
+
+    ::fwData::Array::sptr array = image->getDataArray();
+    ::fwComEd::helper::Array helper(array);
+    std::fill(helper.begin(), helper.end(), 0);
+}
+
+//------------------------------------------------------------------------------
+
+void Image::generateRandomImage(::fwData::Image::sptr image, ::fwTools::Type type)
+{
+    image->setType(type);
+
+    ::fwData::Image::SizeType size(3);
+    size[0] = rand()%100 + 2;
+    size[1] = rand()%100 + 2;
+    size[2] = rand()%100 + 2;
+    image->setSize(size);
+
+    std::vector< double > spacing(3);
+    spacing[0] = (rand()%200 +1) / 100.;
+    spacing[1] = (rand()%200 +1) / 100.;
+    spacing[2] = (rand()%200 +1) / 100.;
+    image->setSpacing(spacing);
+
+    std::vector< double > origin(3);
+    origin[0] = (rand()%200 - 100) / 10.;
+    origin[1] = (rand()%200 - 100) / 10.;
+    origin[2] = (rand()%200 - 100) / 10.;
+    image->setOrigin(origin);
+
+    image->allocate();
+
+    ::fwData::Array::sptr array = image->getDataArray();
+    randomizeArray(array);
+
+    image->setWindowWidth( (rand()%200) / 10. + 1);
+    image->setWindowCenter((rand()%200 - 100) / 10.);
+}
+
+//------------------------------------------------------------------------------
+
+void Image::randomizeArray(::fwData::Array::sptr array)
+{
+    ::fwComEd::helper::Array helper(array);
+    char *iter = helper.begin< char >();
+
+    for (; iter != helper.end< char >() ; ++iter)
+    {
+        *iter = rand()%256;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Array::sptr Image::createRandomizedArray(const std::string &type, ::fwData::Array::SizeType sizes)
+{
+    ::fwData::Array::sptr array = ::fwData::Array::New();
+
+    array->resize( ::fwTools::Type::create(type), sizes, 1, true );
+
+    Image::randomizeArray( array );
+
+    return array;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace generator
+} // namespace fwTest
diff --git a/SrcLib/tests/fwTest/src/fwTest/generator/Mesh.cpp b/SrcLib/tests/fwTest/src/fwTest/generator/Mesh.cpp
new file mode 100644
index 0000000..d104748
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/generator/Mesh.cpp
@@ -0,0 +1,255 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/type_traits/make_unsigned.hpp>
+
+#include <cstdlib>
+#include <ctime>
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/NumericRoundCast.hxx>
+
+#include <fwDataTools/Mesh.hpp>
+
+#include "fwTest/generator/Mesh.hpp"
+
+
+namespace fwTest
+{
+namespace generator
+{
+
+struct RandFloat{
+    float operator()()
+    { return ((rand()%101-50.f))/500.f; };
+} ;
+
+//------------------------------------------------------------------------------
+
+void Mesh::initRand()
+{
+    std::srand(::fwTools::numericRoundCast<unsigned int>(std::time(NULL)));
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::generateMesh( ::fwData::Mesh::sptr mesh )
+{
+    ::fwTest::generator::Mesh::generateTriangleMesh(mesh);
+    ::fwTest::generator::Mesh::initRand();
+    ::fwDataTools::Mesh::shakePoint(mesh);
+    ::fwDataTools::Mesh::generateCellNormals(mesh);
+    ::fwDataTools::Mesh::generatePointNormals(mesh);
+    ::fwDataTools::Mesh::colorizeMeshPoints(mesh);
+    ::fwDataTools::Mesh::colorizeMeshCells(mesh);
+    mesh->adjustAllocatedMemory();
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::generateTriangleQuadMesh(::fwData::Mesh::sptr mesh)
+{
+    size_t nbPointsByEdge = 10;
+    float edgeDim = 100.;
+    Mesh::PointsMapType points;
+
+    mesh->clear();
+    Mesh::addTriangleMesh(mesh, points, nbPointsByEdge, edgeDim);
+    Mesh::addQuadMesh(mesh, points, nbPointsByEdge, edgeDim);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::generateTriangleMesh(::fwData::Mesh::sptr mesh)
+{
+    size_t nbPointsByEdge = 10;
+    float edgeDim = 100.;
+    Mesh::PointsMapType points;
+
+    mesh->clear();
+    Mesh::addTriangleMesh(mesh, points, nbPointsByEdge, edgeDim);
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::generateQuadMesh(::fwData::Mesh::sptr mesh)
+{
+    size_t nbPointsByEdge = 10;
+    float edgeDim = 100.;
+    Mesh::PointsMapType points;
+
+    mesh->clear();
+    Mesh::addQuadMesh(mesh, points, nbPointsByEdge, edgeDim);
+}
+//------------------------------------------------------------------------------
+
+void Mesh::addQuadMesh(::fwData::Mesh::sptr mesh, PointsMapType& points, size_t nbPointsByEdge, float edgeDim)
+{
+    ::fwComEd::helper::Mesh::sptr meshHelper;
+    meshHelper = ::fwComEd::helper::Mesh::New(mesh);
+
+    ::fwData::Mesh::PointValueType pt1[3], pt2[3], pt3[3], pt4[3];
+    ::fwData::Mesh::Id idx1, idx2, idx3, idx4;
+    float step = edgeDim / nbPointsByEdge;
+
+    //Face Y = edgeDim
+    for(size_t x=0; x<nbPointsByEdge; x++)
+    {
+        for(size_t z=0; z<nbPointsByEdge; z++)
+        {
+            pt1[0] = x*step;
+            pt1[1] = edgeDim;
+            pt1[2] = z*step;
+
+            pt2[0] = (x+1)*step;
+            pt2[1] = edgeDim;
+            pt2[2] = (z)*step;
+
+            pt3[0] = x*step;
+            pt3[1] = edgeDim;
+            pt3[2] = (z+1)*step;
+
+            pt4[0] = (x+1)*step;
+            pt4[1] = edgeDim;
+            pt4[2] = (z+1)*step;
+
+            idx1 = Mesh::addPoint(pt1, meshHelper, points);
+            idx2 = Mesh::addPoint(pt2, meshHelper, points);
+            idx3 = Mesh::addPoint(pt3, meshHelper, points);
+            idx4 = Mesh::addPoint(pt4, meshHelper, points);
+
+            meshHelper->insertNextCell(idx1, idx3, idx4, idx2);
+        }
+    }
+
+    //Face X = edgeDim
+    for(size_t y=0; y<nbPointsByEdge; y++)
+    {
+        for(size_t z=0; z<nbPointsByEdge; z++)
+        {
+            pt1[0] = edgeDim;
+            pt1[1] = y*step;
+            pt1[2] = z*step;
+
+            pt2[0] = edgeDim;
+            pt2[1] = y*step;
+            pt2[2] = (z+1)*step;
+
+            pt3[0] = edgeDim;
+            pt3[1] = (y+1)*step;
+            pt3[2] = z*step;
+
+            pt4[0] = edgeDim;
+            pt4[1] = (y+1)*step;
+            pt4[2] = (z+1)*step;
+
+            idx1 = Mesh::addPoint(pt1, meshHelper, points);
+            idx2 = Mesh::addPoint(pt2, meshHelper, points);
+            idx3 = Mesh::addPoint(pt3, meshHelper, points);
+            idx4 = Mesh::addPoint(pt4, meshHelper, points);
+
+            meshHelper->insertNextCell(idx1, idx3, idx4, idx2);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void Mesh::addTriangleMesh(::fwData::Mesh::sptr mesh, PointsMapType& points, size_t nbPointsByEdge, float edgeDim)
+{
+    ::fwComEd::helper::Mesh::sptr meshHelper;
+    meshHelper = ::fwComEd::helper::Mesh::New(mesh);
+
+    ::fwData::Mesh::PointValueType pt1[3], pt2[3], pt3[3], pt4[3];
+    ::fwData::Mesh::Id idx1, idx2, idx3, idx4;
+    float step = edgeDim / nbPointsByEdge;
+
+    //Face Z = 0
+    for(size_t x=0; x<nbPointsByEdge; x++)
+    {
+        for(size_t y=0; y<nbPointsByEdge; y++)
+        {
+            pt1[0] = x*step;
+            pt1[1] = y*step;
+            pt1[2] = 0;
+
+            pt2[0] = (x+1)*step;
+            pt2[1] = y*step;
+            pt2[2] = 0;
+
+            pt3[0] = x*step;
+            pt3[1] = (y+1)*step;
+            pt3[2] = 0;
+
+            pt4[0] = (x+1)*step;
+            pt4[1] = (y+1)*step;
+            pt4[2] = 0;
+
+            idx1 = Mesh::addPoint(pt1, meshHelper, points);
+            idx2 = Mesh::addPoint(pt2, meshHelper, points);
+            idx3 = Mesh::addPoint(pt3, meshHelper, points);
+            idx4 = Mesh::addPoint(pt4, meshHelper, points);
+
+            meshHelper->insertNextCell(idx1, idx4, idx2);
+            meshHelper->insertNextCell(idx1, idx3, idx4);
+        }
+    }
+
+    //Face X = 0
+    for(size_t y=0; y<nbPointsByEdge; y++)
+    {
+        for(size_t z=0; z<nbPointsByEdge; z++)
+        {
+            pt1[0] = 0;
+            pt1[1] = y*step;
+            pt1[2] = z*step;
+
+            pt2[0] = 0;
+            pt2[1] = y*step;
+            pt2[2] = (z+1)*step;
+
+            pt3[0] = 0;
+            pt3[1] = (y+1)*step;
+            pt3[2] = z*step;
+
+            pt4[0] = 0;
+            pt4[1] = (y+1)*step;
+            pt4[2] = (z+1)*step;
+
+            idx1 = Mesh::addPoint(pt1, meshHelper, points);
+            idx2 = Mesh::addPoint(pt2, meshHelper, points);
+            idx3 = Mesh::addPoint(pt3, meshHelper, points);
+            idx4 = Mesh::addPoint(pt4, meshHelper, points);
+
+            meshHelper->insertNextCell(idx2, idx4, idx3);
+            meshHelper->insertNextCell(idx1, idx2, idx3);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Mesh::Id Mesh::addPoint(::fwData::Mesh::PointValueType* pt,
+                                           ::fwComEd::helper::Mesh::sptr meshHelper,
+                                           PointsMapType& points)
+{
+    ::fwDataTools::Point myPoint(pt[0], pt[1], pt[2]);
+
+    PointsMapType::iterator it = points.find(myPoint);
+    if(it != points.end())
+    {
+        return it->second;
+    }
+    ::fwData::Mesh::Id idx = meshHelper->insertNextPoint(pt[0], pt[1], pt[2]);
+    points[myPoint] = idx;
+    return idx;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace generator
+} // namespace fwTest
diff --git a/SrcLib/tests/fwTest/src/fwTest/generator/Object.cpp b/SrcLib/tests/fwTest/src/fwTest/generator/Object.cpp
new file mode 100644
index 0000000..ea3aa0a
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/generator/Object.cpp
@@ -0,0 +1,399 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <cmath>
+
+#include <boost/assign/std/vector.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/convenience.hpp>
+
+#include <fwData/Integer.hpp>
+#include <fwData/String.hpp>
+#include <fwData/Resection.hpp>
+#include <fwData/ResectionDB.hpp>
+#include <fwData/Plane.hpp>
+#include <fwData/ProcessObject.hpp>
+
+#include <fwTest/generator/Image.hpp>
+#include <fwTest/generator/Mesh.hpp>
+#include <fwTest/generator/SeriesDB.hpp>
+#include "fwTest/generator/Object.hpp"
+
+#include <fwMath/IntrasecTypes.hpp>
+
+using namespace boost::assign;
+
+namespace fwTest
+{
+namespace generator
+{
+
+//------------------------------------------------------------------------------
+
+::fwData::StructureTraitsDictionary::sptr Object::createStructureTraitsDictionary()
+{
+    ::fwData::StructureTraitsDictionary::sptr structDico = ::fwData::StructureTraitsDictionary::New();
+    ::fwData::StructureTraits::sptr skin = ::fwData::StructureTraits::New();
+    std::string skinType = "Skin";
+    skin->setType(skinType);
+    skin->setClass(::fwData::StructureTraits::ENVIRONMENT);
+    ::fwData::Color::sptr skinColor = ::fwData::Color::New(255.0f/255.0f, 179.0f/255.0f, 140.0f/255.0f, 1.0f);
+    skin->setColor(skinColor);
+    ::fwData::StructureTraits::CategoryContainer skinCat(1);
+    skinCat[0] = ::fwData::StructureTraits::BODY;
+    skin->setCategories(skinCat);
+    structDico->addStructure(skin);
+
+    ::fwData::StructureTraits::sptr liver = ::fwData::StructureTraits::New();
+    liver->setType("Liver");
+    liver->setClass(::fwData::StructureTraits::ORGAN);
+    liver->setColor(::fwData::Color::New(204.0f/255.0f, 51.0f/255.0f, 51.0f/255.0f, 1.0));
+    ::fwData::StructureTraits::CategoryContainer liverCat(1);
+    liverCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    liver->setCategories(liverCat);
+    std::string nativeExp = "inter(world(type(Skin)),not(class(Organ)))";
+    liver->setNativeExp(nativeExp);
+    structDico->addStructure(liver);
+
+    ::fwData::StructureTraits::sptr liverTumor = ::fwData::StructureTraits::New();
+    liverTumor->setType("Liver_Tumor");
+    liverTumor->setClass(::fwData::StructureTraits::LESION);
+    liverTumor->setColor(::fwData::Color::New(0.0f, 179.0f/255.0f, 0.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer liverTumorCat(1);
+    liverTumorCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    liverTumor->setCategories(liverTumorCat);
+    liverTumor->setAttachmentType("Liver");
+    structDico->addStructure(liverTumor);
+
+    ::fwData::StructureTraits::sptr tumor = ::fwData::StructureTraits::New();
+    tumor->setType("Tumor");
+    tumor->setClass(::fwData::StructureTraits::LESION);
+    tumor->setColor(::fwData::Color::New(0.0f, 0.0f, 1.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer tumorCat(8);
+    tumorCat[0] = ::fwData::StructureTraits::BODY;
+    tumorCat[1] = ::fwData::StructureTraits::HEAD;
+    tumorCat[2] = ::fwData::StructureTraits::NECK;
+    tumorCat[3] = ::fwData::StructureTraits::THORAX;
+    tumorCat[4] = ::fwData::StructureTraits::ABDOMEN;
+    tumorCat[5] = ::fwData::StructureTraits::PELVIS;
+    tumorCat[6] = ::fwData::StructureTraits::ARM;
+    tumorCat[7] = ::fwData::StructureTraits::LEG;
+    tumor->setCategories(tumorCat);
+
+    ::fwData::StructureTraits::sptr colon = ::fwData::StructureTraits::New();
+    colon->setType("Colon");
+    colon->setClass(::fwData::StructureTraits::ORGAN);
+    colon->setColor(::fwData::Color::New(1.0f, 179.0f/255.0f, 128.0f/255.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer colonCat(1);
+    colonCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    colon->setCategories(colonCat);
+    structDico->addStructure(colon);
+
+    ::fwData::StructureTraits::sptr caecum = ::fwData::StructureTraits::New();
+    caecum->setType("Caecum");
+    caecum->setClass(::fwData::StructureTraits::FUNCTIONAL);
+    caecum->setColor(::fwData::Color::New(1.0f, 179.0f/255.0f, 128.0f/255.0f, 1.0f));
+    ::fwData::StructureTraits::CategoryContainer caecumCat(1);
+    caecumCat[0] = ::fwData::StructureTraits::ABDOMEN;
+    caecum->setCategories(caecumCat);
+    caecum->setAttachmentType("Colon");
+    structDico->addStructure(caecum);
+
+    return structDico;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::StructureTraits::sptr Object::createStructureTraits()
+{
+    ::fwData::StructureTraits::sptr pStructureTraits = ::fwData::StructureTraits::New();
+
+    const std::string type = "Liver";
+    const ::fwData::StructureTraits::StructureClass structClass = ::fwData::StructureTraits::ORGAN;
+    const ::fwData::StructureTraits::ROIExpression nativeExp = "inter(world(type(Skin)),not(class(Organ)))";
+    const ::fwData::StructureTraits::ROIExpression nativeGeoExp = "halfSpace(world(Left_lung),Z+,true)";
+
+    pStructureTraits->setType(type);
+    pStructureTraits->setClass(structClass);
+    pStructureTraits->setNativeExp(nativeExp);
+    pStructureTraits->setNativeGeometricExp(nativeGeoExp);
+
+    ::fwData::Color::sptr color = ::fwData::Color::New();
+    color->setRGBA(rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f);
+    pStructureTraits->setColor(color);
+
+    ::fwData::StructureTraits::CategoryContainer categories(2);
+    categories[0] = ::fwData::StructureTraits::ABDOMEN;
+    categories[1] = ::fwData::StructureTraits::BODY;
+    pStructureTraits->setCRefCategories(categories);
+
+    return pStructureTraits;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Composite::sptr Object::createROITraits()
+{
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+
+    ::fwData::ROITraits::sptr roi = ::fwData::ROITraits::New();
+    std::stringstream ss;
+    ss << "ID_" << rand()%100;
+    roi->setIdentifier(ss.str());
+
+    roi->setEvaluatedExp("inter(skin),not(liver)");
+    ::fwData::StructureTraits::sptr structure = Object::createStructureTraits();
+    roi->setStructureTraits(structure);
+
+    ::fwData::Node::sptr maskNode = Object::createNode();
+    roi->setMaskOpNode(maskNode);
+
+    (*composite)["ROITraits"] = roi;
+    (*composite)["StructureTraits"] = structure;
+    (*composite)["MaskOpNode"] = maskNode;
+
+    return composite;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Composite::sptr Object::createReconstructionTraits()
+{
+    ::fwData::Composite::sptr composite = ::fwData::Composite::New();
+
+    ::fwData::ReconstructionTraits::sptr rec = ::fwData::ReconstructionTraits::New();
+
+    std::stringstream ss;
+    ss << "ID_" << rand()%100;
+    rec->setIdentifier(ss.str());
+
+    ::fwData::StructureTraits::sptr structure = Object::createStructureTraits();
+    rec->setStructureTraits(structure);
+
+    ::fwData::Node::sptr maskNode = Object::createNode();
+    rec->setMaskOpNode(maskNode);
+
+    ::fwData::Node::sptr meshNode = Object::createNode();
+    rec->setMeshOpNode(meshNode);
+
+    (*composite)["ReconstructionTraits"] = rec;
+    (*composite)["StructureTraits"] = structure;
+    (*composite)["MaskOpNode"] = maskNode;
+    (*composite)["MeshOpNode"] = meshNode;
+
+    return composite;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Node::sptr Object::createNode()
+{
+    ::fwData::Node::sptr node = ::fwData::Node::New();
+
+    unsigned int nbInputs = rand()%5;
+    unsigned int nbOutputs = rand()%5;
+
+    for (unsigned int i=0 ; i<nbInputs ; ++i)
+    {
+        node->addInputPort(Object::createPort());
+    }
+
+    for (unsigned int i=0 ; i<nbOutputs ; ++i)
+    {
+        node->addOutputPort(Object::createPort());
+    }
+
+    return node;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Port::sptr Object::createPort()
+{
+    ::fwData::Port::sptr port = ::fwData::Port::New();
+
+    std::stringstream ssId;
+    ssId << "ID_" << rand()%100;
+    port->setIdentifier(ssId.str());
+
+    std::stringstream ssType;
+    ssType << "Type_" << rand()%100;
+    port->setType(ssType.str());
+
+    return port;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Color::sptr Object::randomizeColor()
+{
+    ::fwData::Color::sptr col = ::fwData::Color::New();
+    col->setRGBA(rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f);
+    return col;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr Object::createTFColor(const unsigned char nbPoints,
+                                                       const double window,
+                                                       const double level)
+{
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+
+    tf->setBackgroundColor( ::fwData::TransferFunction::TFColor( rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f) );
+    tf->setInterpolationMode( ::fwData::TransferFunction::NEAREST );
+    tf->setIsClamped( false );
+    tf->setLevel(level);
+    tf->setName( "TFColor" );
+    tf->setWindow(window );
+
+    for (unsigned char nb=0 ; nb<nbPoints ; ++nb)
+    {
+        double value = rand()%100 - level;
+        tf->addTFColor( value, ::fwData::TransferFunction::TFColor( rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f, rand()%100 / 100.f ));
+    }
+
+    ::fwData::String::sptr myString = ::fwData::String::New("fieldStringValue");
+    tf->setField( "fieldStringKey", myString );
+
+    return tf;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::TransferFunction::sptr Object::createTFColor()
+{
+
+    ::fwData::TransferFunction::sptr tf = ::fwData::TransferFunction::New();
+
+    tf->setBackgroundColor( ::fwData::TransferFunction::TFColor( 1.0f, 0.3f, 0.6f, 0.1f) );
+    tf->setInterpolationMode( ::fwData::TransferFunction::NEAREST );
+    tf->setIsClamped( false );
+    tf->setLevel( 900.6 );
+    tf->setName( "TFColor" );
+    tf->setWindow( -200.02 );
+
+    tf->addTFColor( -40.33, ::fwData::TransferFunction::TFColor( 0.9f, 0.2f, 0.3f, 0.4f) );
+    tf->addTFColor( 3,      ::fwData::TransferFunction::TFColor( 0.1f, 0.2f, 0.9f, 0.4f) ); // Invert point 3 <=> -0.2, for tests
+    tf->addTFColor( -0.2,   ::fwData::TransferFunction::TFColor( 0.1f, 0.9f, 0.3f, 0.4f) );
+    tf->addTFColor( 150,    ::fwData::TransferFunction::TFColor( 0.1f, 0.2f, 0.3f, 0.9f) );
+
+    ::fwData::String::sptr myString = ::fwData::String::New("fieldStringValue");
+    tf->setField( "fieldStringKey", myString );
+
+    return tf;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Material::sptr Object::createMaterial()
+{
+    // use the default value MODE_PHONG,MODE_SURFACE, MODE_STANDARD
+
+    ::fwData::Color::sptr ambient = ::fwData::Color::New();
+    ambient->setRGBA(0.5f,0.5f,0.5f,0.5f);
+
+    ::fwData::Color::sptr diffuse = ::fwData::Color::New();
+    diffuse->setRGBA(0.8f,0.2f,0.5f,0.4f);
+
+    ::fwData::Material::sptr material = ::fwData::Material::New();
+
+    material->setAmbient(::fwData::Object::copy( ambient ));
+    material->setDiffuse(::fwData::Object::copy( diffuse ));
+
+    return material;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::ProcessObject::sptr Object::createProcessObject()
+{
+    const std::string IMAGEID1 = "myImage1";
+    const std::string IMAGEID2 = "myImage2";
+    const std::string FIELDID1 = "myField1";
+    const std::string FIELDID2 = "myField2";
+    ::fwData::Image::sptr image1 = ::fwData::Image::New();
+    ::fwData::Image::sptr image2 = ::fwData::Image::New();
+    ::fwData::Integer::sptr field1 = ::fwData::Integer::New(3);
+    ::fwData::Integer::sptr field2 = ::fwData::Integer::New(8);
+
+    // process
+    ::fwData::ProcessObject::sptr po = ::fwData::ProcessObject::New();
+    po->setInputValue(IMAGEID1, image1);
+    po->setInputValue(FIELDID1, field1);
+    po->setInputValue(FIELDID2, field2);
+    po->setOutputValue(IMAGEID2, image2);
+    return po;
+}
+
+
+//------------------------------------------------------------------------------
+
+::fwData::Point::sptr Object::generatePoint()
+{
+    fwVec3d coord = {{rand()%300, rand()%300, rand()%300}};
+    ::fwData::Point::sptr point = ::fwData::Point::New();
+    point->setCoord(coord);
+    return point;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Plane::sptr Object::generatePlane()
+{
+    ::fwData::Plane::sptr plane = ::fwData::Plane::New();
+    plane->setValue(generatePoint(), generatePoint(), generatePoint());
+    plane->setIsIntersection(((rand()%1) ? true :false));
+    return plane;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Resection::sptr Object::generateResection()
+{
+
+    ::fwData::Resection::sptr resection = ::fwData::Resection::New();
+
+    resection->setName("Resection1");
+    resection->setIsSafePart(((rand()%1) ? true : false));
+    resection->setIsValid(((rand()%1) ? true : false));
+    resection->setIsVisible(((rand()%1) ? true : false));
+    ::fwData::Reconstruction::sptr recInput = ::fwData::Reconstruction::New();
+
+    ::fwTest::generator::SeriesDB::generateReconstruction(recInput);
+    ::fwData::Resection::ResectionInputs inputs;
+    inputs.push_back(recInput);
+    resection->setInputs(inputs);
+
+    ::fwData::Reconstruction::sptr recOutput = ::fwData::Reconstruction::New();
+    ::fwTest::generator::SeriesDB::generateReconstruction(recOutput);
+    ::fwData::Resection::ResectionOutputs outputs;
+    outputs.push_back(recOutput);
+    resection->setOutputs(outputs);
+
+    ::fwData::PlaneList::PlaneListContainer planes;
+    planes.push_back(generatePlane());
+    planes.push_back(generatePlane());
+    ::fwData::PlaneList::sptr planeList = ::fwData::PlaneList::New();
+    planeList->setPlanes(planes);
+
+    return resection;
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::ResectionDB::sptr Object::generateResectionDB()
+{
+    ::fwData::ResectionDB::sptr resectionDB = ::fwData::ResectionDB::New();
+    resectionDB->addResection(generateResection());
+    return resectionDB;
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace generator
+} // namespace fwTest
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/generator/SeriesDB.cpp b/SrcLib/tests/fwTest/src/fwTest/generator/SeriesDB.cpp
new file mode 100644
index 0000000..5e87ce9
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/generator/SeriesDB.cpp
@@ -0,0 +1,250 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <sstream>
+
+#include <fwTools/Type.hpp>
+
+#include <fwData/Composite.hpp>
+#include <fwData/Image.hpp>
+#include <fwData/Material.hpp>
+#include <fwData/Mesh.hpp>
+#include <fwData/Reconstruction.hpp>
+#include <fwData/String.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Equipment.hpp>
+
+#include "fwTest/generator/SeriesDB.hpp"
+#include "fwTest/generator/Image.hpp"
+#include "fwTest/generator/Mesh.hpp"
+
+
+namespace fwTest
+{
+namespace generator
+{
+
+//------------------------------------------------------------------------------
+
+::fwMedData::SeriesDB::sptr SeriesDB::createSeriesDB(const unsigned char nbImgSeries,
+                                                     const unsigned char nbModelSeries,
+                                                     const unsigned char nbActivitySeries)
+{
+    Image::initRand();
+    ::fwMedData::SeriesDB::sptr seriesDB = ::fwMedData::SeriesDB::New();
+    for (unsigned char nb=0 ; nb<nbImgSeries ; ++nb)
+    {
+        ::fwMedData::Series::sptr imgSeries;
+        imgSeries = SeriesDB::createImageSeries();
+        seriesDB->getContainer().push_back(imgSeries);
+    }
+
+    for (unsigned char nb=0 ; nb<nbModelSeries ; ++nb)
+    {
+        ::fwMedData::Series::sptr modelSeries;
+        modelSeries = SeriesDB::createModelSeries(rand()%15+1);
+        seriesDB->getContainer().push_back(modelSeries);
+    }
+
+    for (unsigned char nb=0 ; nb<nbActivitySeries ; ++nb)
+    {
+        ::fwMedData::Series::sptr activitySeries;
+        activitySeries = SeriesDB::createActivitySeries();
+        seriesDB->getContainer().push_back(activitySeries);
+    }
+    return seriesDB;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::Patient::sptr SeriesDB::createPatient()
+{
+    ::fwMedData::Patient::sptr patient = ::fwMedData::Patient::New();
+    const std::string PATIENT_NAME          = "NomSeriesDB1" ;
+    const std::string PATIENT_FIRSTNAME     = "PrenomSeriesDB1" ;
+    const std::string PATIENT_ID            = "4564383757" ;
+    const std::string PATIENT_BIRTHDATE     = "19710418";
+    const std::string PATIENT_SEX           = "O ";
+
+    patient->setName( PATIENT_NAME + "^" + PATIENT_FIRSTNAME );
+    patient->setPatientId(   PATIENT_ID );
+    patient->setBirthdate( PATIENT_BIRTHDATE );
+    patient->setSex( PATIENT_SEX );
+
+    return patient;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::Study::sptr SeriesDB::createStudy()
+{
+    ::fwMedData::Study::sptr study = ::fwMedData::Study::New();
+
+    static unsigned int count = 1;
+    std::stringstream str;
+    str.width(4);
+    str.fill('0');
+    str << count++;
+
+    // studies informations
+    const std::string UID         = "1.2.826.0.1.3680043.2.1125.44278200849347599055201494082232" + str.str() ;
+    const std::string DATE        = "20130418";
+    const std::string TIME        = "095948.689872 ";
+    const std::string PHYSICIAN   = "Dr^Jekyl" ;
+    const std::string DESCRIPTION = "Say 33. " ;
+    const std::string PATIENT_AGE = "042Y" ;
+
+    study->setInstanceUID( UID );
+    study->setDate( DATE );
+    study->setTime( TIME );
+    study->setReferringPhysicianName( PHYSICIAN );
+    study->setDescription( DESCRIPTION );
+    study->setPatientAge( PATIENT_AGE );
+
+    return study;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::Equipment::sptr SeriesDB::createEquipement()
+{
+    ::fwMedData::Equipment::sptr equipment = ::fwMedData::Equipment::New();
+    const std::string INSTITUTION = "hospital" ;
+    equipment->setInstitutionName(INSTITUTION);
+
+    return equipment;
+}
+
+
+//------------------------------------------------------------------------------
+
+void SeriesDB::generateSeriesInformation(::fwMedData::Series::sptr series)
+{
+    series->setPatient(SeriesDB::createPatient());
+    series->setStudy(SeriesDB::createStudy());
+    series->setEquipment(SeriesDB::createEquipement());
+
+    static unsigned int count = 1;
+    std::stringstream str;
+    str.width(4);
+    str.fill('0');
+    str << count++;
+
+    const std::string UID         = "1.2.826.0.1.3680043.2.1125.102906542887009256605006409108689" + str.str();
+    const std::string MODALITY    = "CT";
+    const std::string DATE        = "20130418";
+    const std::string TIME        = "101010.101010 ";
+    const std::string DESCRIPTION = "Description ";
+
+    ::fwMedData::DicomValuesType performingPhysiciansName;
+    performingPhysiciansName.push_back("Dr^Jekyl");
+    performingPhysiciansName.push_back("Dr^House");
+    performingPhysiciansName.push_back("Dr^Einstein ");
+    series->setPerformingPhysiciansName(performingPhysiciansName);
+
+    series->setInstanceUID(UID);
+    series->setModality(MODALITY);
+    series->setDate(DATE);
+    series->setTime(TIME);
+    series->setDescription(DESCRIPTION);
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::ImageSeries::sptr SeriesDB::createImageSeries()
+{
+    ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::New();
+
+    SeriesDB::generateSeriesInformation(imgSeries);
+
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    Image::generateRandomImage(image, ::fwTools::Type::s_INT16);
+
+    imgSeries->setImage(image);
+
+    return imgSeries;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::ModelSeries::sptr SeriesDB::createModelSeries(unsigned char nbReconstruction)
+{
+    ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::New();
+
+    SeriesDB::generateSeriesInformation(modelSeries);
+
+    ::fwMedData::ModelSeries::ReconstructionVectorType recDB;
+    for (unsigned char nb=0 ; nb<nbReconstruction ; ++nb)
+    {
+        ::fwData::Reconstruction::sptr rec = ::fwData::Reconstruction::New();
+
+        SeriesDB::generateReconstruction(rec);
+
+        recDB.push_back(rec);
+    }
+    modelSeries->setReconstructionDB(recDB);
+
+    return modelSeries;
+}
+
+//------------------------------------------------------------------------------
+
+::fwMedData::ActivitySeries::sptr SeriesDB::createActivitySeries()
+{
+    ::fwMedData::ActivitySeries::sptr activitySeries = ::fwMedData::ActivitySeries::New();
+
+    SeriesDB::generateSeriesInformation(activitySeries);
+
+    const std::string CONFIG_ID = "IdOfTheConfig";
+    activitySeries->setActivityConfigId(CONFIG_ID);
+
+    ::fwData::Composite::sptr data = ::fwData::Composite::New();
+    data->getContainer()["key1"] = ::fwData::String::New("ValueOfKey1");
+    activitySeries->setData(data);
+
+    return activitySeries;
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDB::generateReconstruction(::fwData::Reconstruction::sptr rec)
+{
+    rec->setIsVisible(true);
+    rec->setOrganName("liver");
+    rec->setStructureType("Liver");
+
+    ::fwData::Image::sptr img = ::fwData::Image::New();
+    Image::generateRandomImage(img, ::fwTools::Type::create("uint16"));
+    rec->setImage(img);
+
+    ::fwData::Material::sptr material = ::fwData::Material::New();
+    material->ambient()->red() = 0.75f;
+    material->ambient()->green() = 0.10f;
+    material->ambient()->blue() = 0.56f;
+    material->ambient()->alpha() = 0.8f;
+    material->diffuse()->red() = 0.85f;
+    material->diffuse()->green() = 0.20f;
+    material->diffuse()->blue() = 0.66f;
+    material->diffuse()->alpha() = 0.9f;
+    rec->setMaterial(material);
+
+    ::fwData::Mesh::sptr mesh = ::fwData::Mesh::New();
+    Mesh::generateMesh( mesh );
+
+    rec->setMesh(mesh);
+}
+
+//------------------------------------------------------------------------------
+
+} // namespace generator
+} // namespace fwTest
diff --git a/SrcLib/tests/fwTest/src/fwTest/helper/Thread.cpp b/SrcLib/tests/fwTest/src/fwTest/helper/Thread.cpp
new file mode 100644
index 0000000..de988ee
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/helper/Thread.cpp
@@ -0,0 +1,68 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/chrono/duration.hpp>
+#include "fwTest/helper/Thread.hpp"
+
+namespace fwTest
+{
+namespace helper
+{
+
+Thread::Thread(FunctionType f) :
+        m_hasFailed(false)
+{
+    m_thread = ::boost::thread(::boost::bind(&Thread::run, this, f));
+}
+
+Thread::~Thread()
+{
+}
+
+void Thread::join(bool raise)
+{
+    m_thread.join();
+    if (raise)
+    {
+        this->throwException();
+    }
+}
+
+bool Thread::timedJoin(int time, bool raise)
+{
+    bool joined = m_thread.try_join_for(boost::chrono::milliseconds(time));
+    if (raise)
+    {
+        this->throwException();
+    }
+    return joined;
+}
+
+void Thread::throwException()
+{
+    if (this->hasFailed())
+    {
+        throw this->getException();
+    }
+}
+
+void Thread::run(FunctionType f)
+{
+    try
+    {
+        f();
+    }
+    catch (CPPUNIT_NS::Exception &e)
+    {
+        m_exception = e;
+        m_hasFailed = true;
+    }
+}
+
+} // namespace helper
+} // namespace fwTest
+
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/helper/compare.cpp b/SrcLib/tests/fwTest/src/fwTest/helper/compare.cpp
new file mode 100644
index 0000000..68beb57
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/helper/compare.cpp
@@ -0,0 +1,39 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwData/Object.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include "fwTest/helper/compare.hpp"
+
+namespace fwTest
+{
+namespace helper
+{
+
+bool compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp, ExcludeSetType excludeCompare)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH(const ExcludeSetType::value_type& key, excludeCompare)
+    {
+        props->erase(key);
+    }
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    return props->empty();
+}
+
+} // namespace helper
+} // namespace fwTest
+
+
diff --git a/SrcLib/tests/fwTest/src/fwTest/initialisation.cpp b/SrcLib/tests/fwTest/src/fwTest/initialisation.cpp
new file mode 100644
index 0000000..10b9e2b
--- /dev/null
+++ b/SrcLib/tests/fwTest/src/fwTest/initialisation.cpp
@@ -0,0 +1,57 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <ostream>
+#include <cstdio>
+
+#include <boost/filesystem.hpp>
+
+# include <fwCore/log/SpyLogger.hpp>
+
+namespace fwTest
+{
+
+
+struct LogInitialization
+{
+    LogInitialization ()
+    {
+        fwCore::log::SpyLogger &logger = fwCore::log::SpyLogger::getSpyLogger();
+
+        std::string logFile = "fwTest.log";
+
+        FILE * pFile = fopen(logFile.c_str(), "w");
+        if (pFile==NULL)
+        {
+            ::boost::system::error_code err;
+            ::boost::filesystem::path sysTmp = ::boost::filesystem::temp_directory_path(err);
+            if(err.value() != 0)
+            {
+                // replace log file appender by stream appender: default dir and temp dir unreachable
+                logger.addStreamAppender();
+            }
+            else
+            {
+                // creates SLM.log in temp directory: default dir unreachable
+                sysTmp = sysTmp / logFile;
+                logFile = sysTmp.string();
+                logger.addFileAppender(logFile);
+            }
+        }
+        else
+        {
+            // creates SLM.log in default logFile directory
+            fclose(pFile);
+            logger.addFileAppender(logFile);
+        }
+    }
+
+};
+
+static LogInitialization init;
+
+}; //namespace fwTest
+
diff --git a/SrcLib/tests/fwTest/test/CMakeLists.txt b/SrcLib/tests/fwTest/test/CMakeLists.txt
new file mode 100644
index 0000000..384db7d
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/CMakeLists.txt
@@ -0,0 +1,10 @@
+
+fwLoadProperties()
+
+find_package (Boost REQUIRED)
+find_package(CppUnit)
+fwInclude(${Boost_INCLUDE_DIRS} ${CPPUNIT_INCLUDE_DIR})
+fwLink(${Boost_LIBRARIES} ${CPPUNIT_LIBRARY})
+
+
+
diff --git a/SrcLib/tests/fwTest/test/Properties.cmake b/SrcLib/tests/fwTest/test/Properties.cmake
new file mode 100644
index 0000000..f00957c
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwTestTest )
+set( VERSION  )
+set( TYPE TEST )
+set( DEPENDENCIES fwCore fwTest fwTools fwData )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/tests/fwTest/test/cppunit.options b/SrcLib/tests/fwTest/test/cppunit.options
new file mode 100644
index 0000000..e78db87
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/cppunit.options
@@ -0,0 +1,15 @@
+CLASSTEST=[
+          'ImageTest',
+          'SeriesDBTest',
+          ]
+
+USE = ['boost']
+LIB = [
+       'fwData_0-1',
+       'fwDataCamp_0-1',
+       'fwTools_0-1',
+       'fwCore_0-1',
+       'fwTest_0-1'
+       ]
+CONSOLE = 'yes'
+LOGLEVEL='trace'
diff --git a/SrcLib/tests/fwTest/test/tu/include/ImageTest.hpp b/SrcLib/tests/fwTest/test/tu/include/ImageTest.hpp
new file mode 100644
index 0000000..7cf5a5f
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/tu/include/ImageTest.hpp
@@ -0,0 +1,51 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTEST_TEST_TU_IMAGETEST_HPP_
+#define _FWTEST_TEST_TU_IMAGETEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <fwData/Image.hpp>
+
+namespace fwTest
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create image.
+ */
+class ImageTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( ImageTest );
+    CPPUNIT_TEST( generator3DTest );
+    CPPUNIT_TEST( generator2DTest );
+    CPPUNIT_TEST( deepCopyTest );
+    CPPUNIT_TEST( stressTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void generator3DTest();
+    void generator2DTest();
+    void deepCopyTest();
+    void stressTest();
+
+private:
+    void stressTestWithType(::fwTools::Type type, int nbTest);
+
+
+};
+
+} //namespace ut
+} //namespace fwTest
+
+#endif //_FWTEST_TEST_TU_IMAGETEST_HPP_
diff --git a/SrcLib/tests/fwTest/test/tu/include/SeriesDBTest.hpp b/SrcLib/tests/fwTest/test/tu/include/SeriesDBTest.hpp
new file mode 100644
index 0000000..b85aa5c
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/tu/include/SeriesDBTest.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWTEST_TEST_TU_SERIESDBTEST_HPP_
+#define _FWTEST_TEST_TU_SERIESDBTEST_HPP_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+namespace fwTest
+{
+namespace ut
+{
+
+/**
+ * @brief Test many methods to create image.
+ */
+class SeriesDBTest : public CPPUNIT_NS::TestFixture
+{
+    CPPUNIT_TEST_SUITE( SeriesDBTest );
+    CPPUNIT_TEST( generationTest );
+    CPPUNIT_TEST_SUITE_END();
+
+public:
+    // interface
+    void setUp();
+    void tearDown();
+
+
+    void generationTest();
+
+
+
+};
+
+} //namespace ut
+} //namespace fwTest
+
+#endif //_FWTEST_TEST_TU_SERIESDBTEST_HPP_
diff --git a/SrcLib/tests/fwTest/test/tu/src/ImageTest.cpp b/SrcLib/tests/fwTest/test/tu/src/ImageTest.cpp
new file mode 100644
index 0000000..7d8dd62
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/tu/src/ImageTest.cpp
@@ -0,0 +1,172 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <fwTools/Type.hpp>
+
+#include <fwDataCamp/visitor/CompareObjects.hpp>
+
+#include <fwTest/generator/Image.hpp>
+
+#include "ImageTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTest::ut::ImageTest );
+
+namespace fwTest
+{
+namespace ut
+{
+
+//-----------------------------------------------------------------------------
+
+void compare(::fwData::Object::sptr objRef, ::fwData::Object::sptr objComp)
+{
+    ::fwDataCamp::visitor::CompareObjects visitor;
+    visitor.compare(objRef, objComp);
+    SPTR(::fwDataCamp::visitor::CompareObjects::PropsMapType) props = visitor.getDifferences();
+    BOOST_FOREACH( ::fwDataCamp::visitor::CompareObjects::PropsMapType::value_type prop, (*props) )
+    {
+        OSLM_ERROR( "new object difference found : " << prop.first << " '" << prop.second << "'" );
+    }
+    CPPUNIT_ASSERT_MESSAGE("Object Not equal" , props->size() == 0 );
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::generator3DTest()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    const ::boost::uint8_t dim = 3;
+    ::fwData::Image::SizeType size(dim);
+    size[0] = 10;
+    size[1] = 15;
+    size[2] = 23;
+    ::fwData::Image::SpacingType spacing(dim);
+    spacing[0] = 0.85;
+    spacing[1] = 2.6;
+    spacing[2] = 1.87;
+    ::fwData::Image::OriginType origin(dim);
+    origin[0] = -45.6;
+    origin[1] = 25.97;
+    origin[2] = -53.9;
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int32_t >();
+
+    ::fwTest::generator::Image::generateImage(image, size, spacing, origin, type);
+
+    CPPUNIT_ASSERT(image->getSize() == size);
+    CPPUNIT_ASSERT(image->getSpacing() == spacing);
+    CPPUNIT_ASSERT(image->getOrigin() == origin);
+    CPPUNIT_ASSERT_EQUAL(type.string(), image->getType().string());
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::generator2DTest()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    const ::boost::uint8_t dim = 2;
+    ::fwData::Image::SizeType size(dim);
+    size[0] = 10;
+    size[1] = 15;
+    std::vector<double> spacing(dim);
+    spacing[0] = 0.85;
+    spacing[1] = 2.6;
+    std::vector<double> origin(dim);
+    origin[0] = -45.6;
+    origin[1] = 25.97;
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int16_t >();
+
+    ::fwTest::generator::Image::generateImage(image, size, spacing, origin, type);
+    CPPUNIT_ASSERT(image->getSize() == size);
+    CPPUNIT_ASSERT(image->getSpacing() == spacing);
+    CPPUNIT_ASSERT(image->getOrigin() == origin);
+    CPPUNIT_ASSERT_EQUAL(type.string(), image->getType().string());
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::deepCopyTest()
+{
+    ::fwData::Image::sptr image = ::fwData::Image::New();
+    ::fwData::Image::sptr image2;
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int32_t >();
+    ::fwTest::generator::Image::generateRandomImage(image, type);
+
+    image2 = ::fwData::Object::copy(image);
+    compare(image, image2);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::stressTest()
+{
+    ::fwTools::Type type = ::fwTools::Type::create< ::boost::int8_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::uint8_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::int16_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::uint16_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::int32_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::uint32_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::int64_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< ::boost::uint64_t >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< float >();
+    this->stressTestWithType(type, 10);
+
+    type = ::fwTools::Type::create< double >();
+    this->stressTestWithType(type, 10);
+}
+
+//------------------------------------------------------------------------------
+
+void ImageTest::stressTestWithType(::fwTools::Type type, int nbTest)
+{
+    for (int nb=0 ; nb < nbTest ; ++nb)
+    {
+        ::fwData::Image::sptr image = ::fwData::Image::New();
+        ::fwTest::generator::Image::generateRandomImage(image, type);
+
+        ::fwData::Image::sptr image2;
+        image2 = ::fwData::Object::copy(image);
+        compare(image, image2);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwTest
diff --git a/SrcLib/tests/fwTest/test/tu/src/SeriesDBTest.cpp b/SrcLib/tests/fwTest/test/tu/src/SeriesDBTest.cpp
new file mode 100644
index 0000000..5b7561d
--- /dev/null
+++ b/SrcLib/tests/fwTest/test/tu/src/SeriesDBTest.cpp
@@ -0,0 +1,140 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwData/Composite.hpp>
+#include <fwData/String.hpp>
+
+#include <fwMedData/SeriesDB.hpp>
+#include <fwMedData/Series.hpp>
+#include <fwMedData/ImageSeries.hpp>
+#include <fwMedData/ModelSeries.hpp>
+#include <fwMedData/ActivitySeries.hpp>
+#include <fwMedData/Patient.hpp>
+#include <fwMedData/Study.hpp>
+#include <fwMedData/Equipment.hpp>
+#include <fwMedData/ImageSeries.hpp>
+
+#include <fwTest/generator/SeriesDB.hpp>
+
+#include "SeriesDBTest.hpp"
+
+// Registers the fixture into the 'registry'
+CPPUNIT_TEST_SUITE_REGISTRATION( ::fwTest::ut::SeriesDBTest );
+
+namespace fwTest
+{
+namespace ut
+{
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::setUp()
+{
+    // Set up context before running a test.
+    srand(time(NULL));
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::tearDown()
+{
+    // Clean up after the test run.
+}
+
+//------------------------------------------------------------------------------
+
+void SeriesDBTest::generationTest()
+{
+    const unsigned char nbImgSeries = 3;
+    const unsigned char nbModelSeries = 4;
+    const unsigned char nbActivitySeries = 5;
+    ::fwMedData::SeriesDB::sptr seriesDB;
+    seriesDB = ::fwTest::generator::SeriesDB::createSeriesDB(nbImgSeries, nbModelSeries, nbActivitySeries);
+
+    ::fwMedData::SeriesDB::ContainerType seriesContainer = seriesDB->getContainer();
+    CPPUNIT_ASSERT_EQUAL((size_t) (nbImgSeries + nbModelSeries + nbActivitySeries), seriesContainer.size());
+
+    CPPUNIT_ASSERT(::fwMedData::ImageSeries::dynamicCast(seriesContainer[0]));
+
+    ::fwMedData::DicomValuesType performingPhysiciansName;
+    performingPhysiciansName.push_back("Dr Jekyl");
+    performingPhysiciansName.push_back("Dr House");
+    performingPhysiciansName.push_back("Dr Einstein ");
+
+    unsigned char nbIS = 0;
+    unsigned char nbMS = 0;
+    unsigned char nbAS = 0;
+
+    unsigned int count = 1;
+    std::stringstream str;
+    BOOST_FOREACH(::fwMedData::Series::sptr series, seriesContainer)
+    {
+        str.str("");
+        str.width(4);
+        str.fill('0');
+        str << count++;
+        CPPUNIT_ASSERT_EQUAL(std::string("1.2.826.0.1.3680043.2.1125.102906542887009256605006409108689" + str.str()) ,
+                             series->getInstanceUID());
+        CPPUNIT_ASSERT_EQUAL(std::string("CT") , series->getModality());
+        CPPUNIT_ASSERT_EQUAL(std::string("20130418") , series->getDate());
+        CPPUNIT_ASSERT_EQUAL(std::string("101010.101010 ") , series->getTime());
+        CPPUNIT_ASSERT_EQUAL(std::string("Description ") , series->getDescription());
+        CPPUNIT_ASSERT(performingPhysiciansName == series->getPerformingPhysiciansName());
+
+        ::fwMedData::Patient::sptr patient = series->getPatient();
+        CPPUNIT_ASSERT_EQUAL(std::string("NomSeriesDB1^PrenomSeriesDB1") , patient->getName());
+        CPPUNIT_ASSERT_EQUAL(std::string("4564383757") , patient->getPatientId());
+        CPPUNIT_ASSERT_EQUAL(std::string("19710418 095318.185236") , patient->getBirthdate());
+        CPPUNIT_ASSERT_EQUAL(std::string("O ") , patient->getSex());
+
+        ::fwMedData::Study::sptr study = series->getStudy();
+        CPPUNIT_ASSERT_EQUAL(std::string("1.2.826.0.1.3680043.2.1125.44278200849347599055201494082232" + str.str()) ,
+                             study->getInstanceUID());
+        CPPUNIT_ASSERT_EQUAL(std::string("20130418") , study->getDate());
+        CPPUNIT_ASSERT_EQUAL(std::string("095948.689872 ") , study->getTime());
+        CPPUNIT_ASSERT_EQUAL(std::string("Dr Jekyl") , study->getReferringPhysicianName());
+        CPPUNIT_ASSERT_EQUAL(std::string("Say 33. ") , study->getDescription());
+        CPPUNIT_ASSERT_EQUAL(std::string("042Y") , study->getPatientAge());
+
+        ::fwMedData::Equipment::sptr equipement = series->getEquipment();
+        CPPUNIT_ASSERT_EQUAL(std::string("hospital"), equipement->getInstitutionName());
+
+        ::fwMedData::ImageSeries::sptr imgSeries = ::fwMedData::ImageSeries::dynamicCast(series);
+        ::fwMedData::ModelSeries::sptr modelSeries = ::fwMedData::ModelSeries::dynamicCast(series);
+        ::fwMedData::ActivitySeries::sptr activitySeries = ::fwMedData::ActivitySeries::dynamicCast(series);
+
+        if (imgSeries)
+        {
+            ++nbIS;
+            CPPUNIT_ASSERT(imgSeries->getImage());
+        }
+        else if (modelSeries)
+        {
+            ++nbMS;
+            CPPUNIT_ASSERT(!modelSeries->getReconstructionDB().empty());
+        }
+        else if (activitySeries)
+        {
+            ++nbAS;
+            CPPUNIT_ASSERT_EQUAL(std::string("IdOfTheConfig"), activitySeries->getActivityConfigId());
+            ::fwData::Composite::sptr composite = activitySeries->getData();
+            CPPUNIT_ASSERT(composite);
+            CPPUNIT_ASSERT(composite->find("key1") != composite->end());
+            ::fwData::String::sptr value = ::fwData::String::dynamicCast(composite->getContainer()["key1"]);
+            CPPUNIT_ASSERT(value);
+            CPPUNIT_ASSERT_EQUAL(std::string("ValueOfKey1"), value->value());
+        }
+    }
+
+    CPPUNIT_ASSERT_EQUAL(nbImgSeries, nbIS);
+    CPPUNIT_ASSERT_EQUAL(nbModelSeries, nbMS);
+    CPPUNIT_ASSERT_EQUAL(nbActivitySeries, nbAS);
+}
+
+//------------------------------------------------------------------------------
+
+} //namespace ut
+} //namespace fwTest
diff --git a/SrcLib/visu/fwRenderVTK/CMakeLists.txt b/SrcLib/visu/fwRenderVTK/CMakeLists.txt
new file mode 100644
index 0000000..419ee14
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/CMakeLists.txt
@@ -0,0 +1,24 @@
+fwLoadProperties()
+fwUseForwardInclude(
+    fwCore
+    fwData
+    fwGui
+    fwMath
+    fwRender
+    fwRuntime
+    fwServices
+    fwTools
+)
+
+
+find_package(Boost REQUIRED)
+find_package(VTK REQUIRED)
+
+fwForwardInclude(
+    ${Boost_INCLUDE_DIRS}
+    ${VTK_INCLUDE_DIRS}
+    )
+fwLink(
+    ${Boost_LIBRARIES} 
+    vtkWidgets
+    )
diff --git a/SrcLib/visu/fwRenderVTK/COPYING b/SrcLib/visu/fwRenderVTK/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/SrcLib/visu/fwRenderVTK/COPYING.LESSER b/SrcLib/visu/fwRenderVTK/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/SrcLib/visu/fwRenderVTK/Properties.cmake b/SrcLib/visu/fwRenderVTK/Properties.cmake
new file mode 100644
index 0000000..da88b20
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME fwRenderVTK )
+set( VERSION 0.1 )
+set( TYPE LIBRARY )
+set( DEPENDENCIES fwCom fwComEd fwCore fwData fwGui fwMath fwRender fwRuntime fwServices fwTools fwVtkIO )
+set( REQUIREMENTS  )
+
diff --git a/SrcLib/visu/fwRenderVTK/bin/build.options b/SrcLib/visu/fwRenderVTK/bin/build.options
new file mode 100755
index 0000000..1ac662b
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/bin/build.options
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+USE = [
+    'boost',
+    'vtkWidgets'
+    ]
+LIB = [
+    'fwComEd_0-1',
+    'fwCore_0-1',
+    'fwData_0-1',
+    'fwMath_0-1',
+    'fwRender_0-1',
+    'fwRuntime_0-3',
+    'fwServices_0-1',
+    'fwTools_0-1',
+    'fwVtkIO_0-1',
+    'fwGui_0-1'
+    ]
+TYPE = 'shared'
+VERSION = '0-1'
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkAdaptorService.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkAdaptorService.hpp
new file mode 100644
index 0000000..1aff59b
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkAdaptorService.hpp
@@ -0,0 +1,161 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_VTKADAPTORSERVICE_HPP_
+#define _FWRENDERVTK_VTKADAPTORSERVICE_HPP_
+
+#include <string>
+
+#include <fwServices/ObjectMsg.hpp>
+#include <fwServices/IService.hpp>
+#include <fwServices/helper/SigSlotConnection.hpp>
+
+#include "fwRenderVTK/VtkRenderService.hpp"
+#include "fwRenderVTK/config.hpp"
+
+class vtkProp;
+class vtkPropCollection;
+class vtkRenderer;
+class vtkRenderWindowInteractor;
+class vtkTransform;
+
+namespace fwRenderVTK
+{
+
+class FWRENDERVTK_CLASS_API IVtkAdaptorService : public fwServices::IService
+{
+    friend class VtkRenderService;
+public :
+    fwCoreServiceClassDefinitionsMacro ( (IVtkAdaptorService)(::fwServices::IService) ) ;
+
+    typedef fwServices::IService SuperClass ;
+
+
+    /// To set a representation
+    virtual void show(bool b = true) {};
+    virtual void hide() {this->show(false);};
+
+
+    FWRENDERVTK_API void setRenderService( VtkRenderService::sptr service );
+    FWRENDERVTK_API void setRenderId(VtkRenderService::RendererIdType newID);
+    FWRENDERVTK_API VtkRenderService::sptr getRenderService();
+    FWRENDERVTK_API VtkRenderService::RendererIdType getRenderId();
+    FWRENDERVTK_API vtkRenderer* getRenderer();
+
+
+    FWRENDERVTK_API void setPickerId(VtkRenderService::PickerIdType newID);
+    FWRENDERVTK_API VtkRenderService::PickerIdType getPickerId();
+    FWRENDERVTK_API vtkAbstractPropPicker* getPicker(std::string pickerId = "");
+
+    FWRENDERVTK_API void setTransformId(VtkRenderService::VtkObjectIdType newID);
+    FWRENDERVTK_API VtkRenderService::VtkObjectIdType getTransformId();
+    FWRENDERVTK_API vtkTransform* getTransform();
+
+    FWRENDERVTK_API vtkObject * getVtkObject(VtkRenderService::VtkObjectIdType objectId);
+
+    FWRENDERVTK_API vtkRenderWindowInteractor* getInteractor();
+
+
+    FWRENDERVTK_API virtual ::fwData::Object::sptr getAssociatedObject(vtkProp *prop, int depth=0);
+
+    FWRENDERVTK_API void getAllSubProps(vtkPropCollection *propc, int depth = -1);
+
+    /// set the pipeline modified so a render request can be send. end-user have to call this
+    /// method when it have modified a  vtk structure
+    FWRENDERVTK_API void setVtkPipelineModified();
+
+    /// Returns true if the service automatically triggers the rendering.
+    bool getAutoRender() const
+    {
+        return m_autoRender;
+    }
+
+    /// Sets if the service automatically triggers the rendering.
+    void setAutoRender(bool autoRender)
+    {
+        m_autoRender = autoRender;
+    }
+
+protected :
+
+    /**
+     * @brief   constructor
+     */
+    FWRENDERVTK_API IVtkAdaptorService() throw() ;
+
+    /**
+     * @brief   destructor
+     */
+    FWRENDERVTK_API virtual ~IVtkAdaptorService() throw() ;
+
+    ::fwServices::ObjectMsg::sptr m_message;
+
+    /**
+     * @name    Standard service methods
+     */
+    //@{
+    /// Overrides
+    FWRENDERVTK_API virtual void info(std::ostream &_sstream ) ;
+    FWRENDERVTK_API void starting() throw(fwTools::Failed);
+    FWRENDERVTK_API void stopping() throw(fwTools::Failed);
+    FWRENDERVTK_API void swapping() throw(fwTools::Failed);
+    FWRENDERVTK_API void updating() throw(fwTools::Failed);
+    FWRENDERVTK_API void receiving(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed);
+    //@}
+
+
+    /// priority of comChannel observing related object (specified with objectId)
+    double m_comChannelPriority;
+
+    /// state of the pipeline
+    bool m_vtkPipelineModified;
+    VtkRenderService::RendererIdType   m_rendererId;
+    VtkRenderService::PickerIdType     m_pickerId;
+    VtkRenderService::VtkObjectIdType  m_transformId;
+    VtkRenderService::wptr             m_renderService;
+
+    ::fwServices::helper::SigSlotConnection::sptr m_connections;
+
+
+    typedef std::vector < ::fwRenderVTK::IVtkAdaptorService::wptr > ServiceVector;
+    ServiceVector m_subServices;
+
+    vtkPropCollection * m_propCollection;
+
+    bool m_autoRender;
+
+    FWRENDERVTK_API virtual void doStart() = 0;
+    FWRENDERVTK_API virtual void doStop() = 0;
+    FWRENDERVTK_API virtual void doSwap() = 0;
+    FWRENDERVTK_API virtual void doUpdate() = 0;
+    FWRENDERVTK_API virtual void doReceive(::fwServices::ObjectMsg::csptr msg) = 0;
+
+
+    ServiceVector & getRegisteredServices() {return m_subServices;};
+    FWRENDERVTK_API void registerService( ::fwRenderVTK::IVtkAdaptorService::sptr service );
+    FWRENDERVTK_API void unregisterServices();
+
+    FWRENDERVTK_API void registerProp(vtkProp *prop);
+    FWRENDERVTK_API void unregisterProps();
+
+    FWRENDERVTK_API void addToRenderer(vtkProp *prop);
+    FWRENDERVTK_API void addToPicker(vtkProp *prop, std::string pickerId = "");
+    FWRENDERVTK_API void removeFromPicker(vtkProp *prop, std::string pickerId = "");
+
+    FWRENDERVTK_API void removeAllPropFromRenderer();
+
+    FWRENDERVTK_API static void getProps(vtkPropCollection *propc, vtkProp *prop);
+
+
+private:
+    /// notify a render request iff vtkPipeline is modified
+    void requestRender();
+
+};
+
+}
+
+#endif /*_FWRENDERVTK_VTKADAPTORSERVICE_HPP_*/
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkRenderWindowInteractorManager.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkRenderWindowInteractorManager.hpp
new file mode 100644
index 0000000..e8fd2a1
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/IVtkRenderWindowInteractorManager.hpp
@@ -0,0 +1,91 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_IVTKRENDERWINDOWINTERACTORMANAGER_HPP_
+#define _FWRENDERVTK_IVTKRENDERWINDOWINTERACTORMANAGER_HPP_
+
+#include <string>
+#include <fwServices/IService.hpp>
+
+#include <vtkRenderWindowInteractor.h>
+
+#include <fwCore/base.hpp>
+
+#include <fwGui/container/fwContainer.hpp>
+
+#include "fwRenderVTK/factory/new.hpp"
+#include "fwRenderVTK/registry/detail.hpp"
+#include "fwRenderVTK/config.hpp"
+
+namespace fwRenderVTK
+{
+
+/**
+ * @brief   Defines a class to manage vtkRenderWindowInteractor in a window.
+ * @class   IVtkRenderWindowInteractorManager
+ * 
+ * @date    2009-2010.
+ *
+ */
+class FWRENDERVTK_CLASS_API IVtkRenderWindowInteractorManager : public ::fwCore::BaseObject
+{
+
+public:
+
+    typedef ::fwRenderVTK::factory::Key Key;
+
+    /**
+     * @brief Class used to register a class factory in factory registry.
+     * This class defines also the object factory ( 'create' )
+     *
+     * @tparam T Factory product type
+     */
+    template <typename T>
+    class Registrar
+    {
+    public:
+        Registrar(std::string functorKey)
+        {
+            ::fwRenderVTK::registry::get()->addFactory(functorKey, &::fwRenderVTK::factory::New<T>);
+        }
+    };
+
+
+    fwCoreNonInstanciableClassDefinitionsMacro( (IVtkRenderWindowInteractorManager)(::fwCore::BaseObject) )
+
+    typedef std::string FactoryRegistryKeyType;
+
+    FWRENDERVTK_API static const FactoryRegistryKeyType REGISTRY_KEY;
+
+    FWRENDERVTK_API static IVtkRenderWindowInteractorManager::sptr createManager();
+
+    /// Constructor. Do nothing.
+    FWRENDERVTK_API IVtkRenderWindowInteractorManager();
+
+    /// Destructor. Do nothing.
+    FWRENDERVTK_API virtual ~IVtkRenderWindowInteractorManager();
+
+    /// Creates an interactor and installs it in window.
+    FWRENDERVTK_API virtual void installInteractor( ::fwGui::container::fwContainer::sptr _parent ) = 0;
+
+    /// Deletes interactor and manage correctly the window (removing layout).
+    FWRENDERVTK_API virtual void uninstallInteractor() = 0;
+
+    /// Return a pointer on interactor
+    FWRENDERVTK_API virtual ::vtkRenderWindowInteractor * getInteractor() = 0;
+
+    virtual void setRenderService(::fwServices::IService::sptr srv){m_renderService = srv;}
+
+
+protected:
+    ::fwServices::IService::wptr m_renderService;
+};
+
+} // namespace fwRenderVTK
+
+#endif // _FWRENDERVTK_IVTKRENDERWINDOWINTERACTORMANAGER_HPP_
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/Namespace.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/Namespace.hpp
new file mode 100644
index 0000000..b02af1a
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/Namespace.hpp
@@ -0,0 +1,20 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRENDERVTKNAMESPACE_HPP_
+#define FWRENDERVTKNAMESPACE_HPP_
+
+/**
+ * @brief       The namespace fwRenderVTK contains classes for rendering with VTK.
+ * @namespace   fwRenderVTK
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace fwRenderVTK
+{
+}
+#endif /* FWRENDERVTKNAMESPACE_HPP_ */
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/VtkRenderService.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/VtkRenderService.hpp
new file mode 100644
index 0000000..9410412
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/VtkRenderService.hpp
@@ -0,0 +1,198 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_VTKRENDERSERVICE_HPP_
+#define _FWRENDERVTK_VTKRENDERSERVICE_HPP_
+
+
+#include <map>
+
+#include <fwRuntime/ConfigurationElement.hpp>
+
+#include <fwRender/IRender.hpp>
+
+#include <fwData/Composite.hpp>
+
+#include "fwRenderVTK/config.hpp"
+#include "fwRenderVTK/IVtkRenderWindowInteractorManager.hpp"
+
+
+class vtkRenderWindow;
+class vtkRenderer;
+class vtkAbstractPropPicker;
+class vtkObject;
+class vtkTransform;
+
+namespace fwData
+{
+
+class TransformationMatrix3D;
+
+}
+
+namespace fwRenderVTK
+{
+
+class IVtkAdaptorService;
+
+/**
+ * @class VtkRenderService
+ * @brief The generic scene service shows adaptors in a 3D VTK scene. 
+ */
+class FWRENDERVTK_CLASS_API VtkRenderService : public ::fwRender::IRender
+{
+public :
+    fwCoreServiceClassDefinitionsMacro ( (VtkRenderService)(::fwRender::IRender) ) ;
+
+    typedef std::string RendererIdType;
+    typedef std::string PickerIdType;
+    typedef std::string ObjectIdType;
+    typedef std::string AdaptorIdType;
+    typedef std::string VtkObjectIdType;
+
+    FWRENDERVTK_API static const ::fwCom::Slots::SlotKeyType s_RENDER_SLOT;
+    typedef ::fwCom::Slot<void()> RenderSlotType;
+
+    FWRENDERVTK_API VtkRenderService() throw() ;
+
+    FWRENDERVTK_API virtual ~VtkRenderService() throw() ;
+
+    /// Returns the vtkRenderer with the given id
+    FWRENDERVTK_API vtkRenderer * getRenderer(RendererIdType rendererId);
+
+    /// Returns true if the scene is shown on screen
+    bool isShownOnScreen();
+
+    /// Returns the picker with the given id
+    FWRENDERVTK_API vtkAbstractPropPicker * getPicker(PickerIdType pickerId);
+
+    /// Returns the vtkObject with the given id
+    FWRENDERVTK_API vtkObject * getVtkObject(VtkObjectIdType objectId);
+
+    bool getPendingRenderRequest(){return m_pendingRenderRequest;}
+    void setPendingRenderRequest(bool b){m_pendingRenderRequest=b;}
+
+protected:
+
+    /// Renders the scene.
+    FWRENDERVTK_API void render();
+
+    /// Install observations : should be implemented in IService
+    FWRENDERVTK_API virtual void starting() throw( ::fwTools::Failed);
+    /// Uninstall observations : should be implemented in IService
+    FWRENDERVTK_API virtual void stopping() throw( ::fwTools::Failed);
+
+    /**
+     * @brief configures the adaptor
+     * @verbatim
+    <service uid="generiSceneUID" impl="::fwRenderVTK::VtkRenderService" type="::fwRender::IRender">
+        <scene autoRender="false">
+            <renderer id="background" layer="0" background="0.0" />
+            <vtkObject id="transform" class="vtkTransform" />
+            <picker id="negatodefault" vtkclass="fwVtkCellPicker" />
+
+            <adaptor id="tmAdaptor" class="::visuVTKAdaptor::Transform" uid="adaptorUID" objectId="tm3dKey">
+                <config transform="transform" />
+            </adaptor>
+
+            <adaptor id="snapshot" class="::visuVTKAdaptor::Snapshot" objectId="self">
+                <config ...... />
+            </adaptor>
+        </scene>
+    </service> 
+       @endverbatim
+     * With : 
+     *  - \b autoRender (optional, "true" by default): this attribute is forwarded to all adaptors. For each adaptor, 
+     *    if autoRender=true,  the scene is automatically rendered after doStart, doUpdate, doSwap, doReceive and 
+     *    doStop and m_vtkPipelineModified=true.
+     *  - \b renderer 
+     *     - \b id (mandatory): the identifier of the renderer
+     *     - \b layer (optional): defines the layer of the vtkRenderer. This is only used if there are layered renderers.
+     *     - \b background (optional): the background color of the rendering screen. The color value can be defines as a 
+     *       grey level value (ex . 1.0 for white) or as a hexadecimal value (ex : \#ffffff for white).
+     *  - \b vtkObject
+     *    - \b id (mandatory): the identifier of the vtkObject
+     *    - \b class (mandatory): the classname of the vtkObject to create. For example vtkTransform, vtkImageBlend, ...
+     *  - \b picker
+     *    - \b id (mandatory): the identifier of the picker
+     *    - \b vtkclass (optional, by default vtkCellPicker): the classname of the picker to create.
+     *  - \b adaptor
+     *    - \b id (mandatory): the identifier of the adaptor
+     *    - \b class (mandatory): the classname of the adaptor service
+     *    - \b uid (optional): the fwID to specify for the adaptor service
+     *    - \b objectId (mandatory): the key of the adaptor's object in the scene's composite. The "self" key is used 
+     *     when the adaptor works on the scene's composite.
+     *    - \b config: adaptor's configuration. It is parsed in the adaptor's configuring() method.
+     */
+    FWRENDERVTK_API virtual void configuring() throw( ::fwTools::Failed) ;
+
+    /// Updates the scene's adaptors with the modified objects contained in the composite.
+    FWRENDERVTK_API void receiving( ::fwServices::ObjectMsg::csptr message ) throw( ::fwTools::Failed);
+
+    /// Does nothing.
+    FWRENDERVTK_API void updating() throw( ::fwTools::Failed);
+
+    /// Add a vtk object in the VtkRenderService, referenced by a key.
+    void addVtkObject( VtkObjectIdType _id, vtkObject * _vtkObj );
+
+    /// Slot to call render method
+    RenderSlotType::sptr m_slotRender;
+
+private :
+
+    typedef ::fwRuntime::ConfigurationElement::sptr ConfigurationType;
+    ConfigurationType m_sceneConfiguration;
+
+    /// @brief VTK Interactor window manager
+    ::fwRenderVTK::IVtkRenderWindowInteractorManager::sptr m_interactorManager;
+
+
+    class SceneAdaptor {
+
+        public:
+
+        SPTR (IVtkAdaptorService) getService()
+        { return m_service.lock(); }
+
+        ConfigurationType m_config;
+        WPTR(IVtkAdaptorService) m_service;
+
+    };
+
+    /// @brief scene's renderers
+    typedef std::map< RendererIdType , vtkRenderer* > RenderersMapType ;
+
+    /// @brief scene's pickers
+    typedef std::map< PickerIdType , vtkAbstractPropPicker * > PickersMapType ;
+
+    /// @brief scene's transforms
+    typedef std::map< VtkObjectIdType , vtkObject  * > VtkObjectMapType ;
+
+    /// @brief Actives adaptors in scene
+    typedef std::map< AdaptorIdType, SceneAdaptor > SceneAdaptorsMapType ;
+
+    RenderersMapType     m_renderers;
+    PickersMapType       m_pickers;
+    SceneAdaptorsMapType m_sceneAdaptors;
+    VtkObjectMapType     m_vtkObjects;
+
+    bool m_pendingRenderRequest;
+
+    bool m_autoRender;
+
+    void startContext();
+    void stopContext();
+
+    void configurePicker   ( ConfigurationType conf );
+    void configureRenderer ( ConfigurationType conf );
+    void configureObject   ( ConfigurationType conf );
+    void configureVtkObject( ConfigurationType conf );
+    vtkTransform * createVtkTransform( ConfigurationType conf );
+};
+
+}
+
+#endif //_FWRENDERVTK_VTKRENDERSERVICE_HPP_
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/config.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/config.hpp
new file mode 100644
index 0000000..1aa566e
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/config.hpp
@@ -0,0 +1,41 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_CONFIG_HPP_
+#define _FWRENDERVTK_CONFIG_HPP_
+
+#ifdef _WIN32
+
+    #ifdef FWRENDERVTK_EXPORTS
+    #define FWRENDERVTK_API __declspec(dllexport)
+    #else
+    #define FWRENDERVTK_API __declspec(dllimport)
+    #endif
+
+    #define FWRENDERVTK_CLASS_API
+
+    #pragma warning(disable: 4290)
+
+#elif defined(__GNUC__) && (__GNUC__>=4) && defined(__USE_DYLIB_VISIBILITY__)
+
+    #ifdef FWRENDERVTK_EXPORTS
+    #define FWRENDERVTK_API __attribute__ ((visibility("default")))
+    #define FWRENDERVTK_CLASS_API __attribute__ ((visibility("default")))
+    #else
+    //#define FWRENDERVTK_API __attribute__ ((visibility("hidden")))
+    //#define FWRENDERVTK_CLASS_API __attribute__ ((visibility("hidden")))
+    #define FWRENDERVTK_API
+    #define FWRENDERVTK_CLASS_API
+    #endif
+
+#else
+
+    #define FWRENDERVTK_API
+    #define FWRENDERVTK_CLASS_API
+
+#endif
+
+#endif //_FWRENDERVTK_CONFIG_HPP_
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/namespace.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/namespace.hpp
new file mode 100644
index 0000000..2be75d6
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRENDERVTK_FACTORY_NAMESPACE_HPP__
+#define __FWRENDERVTK_FACTORY_NAMESPACE_HPP__
+
+
+namespace fwRenderVTK
+{
+
+/**
+ * @brief       Contains fwRenderVTK::factory utilities
+ * @namespace   fwRenderVTK::factory
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace factory
+{
+} // namespace factory
+
+} // namespace fwRenderVTK
+
+#endif /* __FWRENDERVTK_FACTORY_NAMESPACE_HPP__ */
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/new.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/new.hpp
new file mode 100644
index 0000000..8b2ae13
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/factory/new.hpp
@@ -0,0 +1,59 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRENDERVTK_FACTORY_NEW_HPP__
+#define __FWRENDERVTK_FACTORY_NEW_HPP__
+
+#include <string>
+
+#include <boost/make_shared.hpp>
+
+#include <fwTools/macros.hpp>
+
+#include "fwRenderVTK/config.hpp"
+#include "fwRenderVTK/registry/detail.hpp"
+
+namespace fwRenderVTK
+{
+
+class IVtkRenderWindowInteractorManager;
+
+namespace factory
+{
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New();
+
+/**
+ * @brief Key class used to restrict access to Object construction.
+ * See http://www.drdobbs.com/184402053
+ */
+class Key
+{
+    template<typename CLASSNAME>
+    friend SPTR( CLASSNAME ) fwRenderVTK::factory::New();
+
+    Key(){};
+};
+
+
+FWRENDERVTK_API SPTR( ::fwRenderVTK::IVtkRenderWindowInteractorManager ) New(
+        const ::fwRenderVTK::registry::KeyType & classname );
+
+
+template<class CLASSNAME > SPTR( CLASSNAME )  New()
+{
+    SPTR(CLASSNAME) obj = ::boost::make_shared< CLASSNAME >( Key() );
+    return obj;
+}
+
+} // namespace factory
+
+} // namespace fwRenderVTK
+
+#endif /* __FWRENDERVTK_FACTORY_NEW_HPP__ */
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/detail.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/detail.hpp
new file mode 100644
index 0000000..effca2b
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/detail.hpp
@@ -0,0 +1,37 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRENDERVTK_REGISTRY_DETAIL_HPP__
+#define __FWRENDERVTK_REGISTRY_DETAIL_HPP__
+
+#include <string>
+
+#include <fwCore/macros.hpp>
+#include <fwCore/util/FactoryRegistry.hpp>
+
+#include "fwRenderVTK/config.hpp"
+
+namespace fwRenderVTK
+{
+
+class IVtkRenderWindowInteractorManager;
+
+namespace registry
+{
+
+typedef std::string KeyType;
+
+typedef ::fwCore::util::FactoryRegistry< SPTR(::fwRenderVTK::IVtkRenderWindowInteractorManager) (), KeyType > Type;
+
+FWRENDERVTK_API SPTR(Type) get();
+
+} // namespace registry
+
+} // namespace fwRenderVTK
+
+#endif /* __FWRENDERVTK_REGISTRY_DETAIL_HPP__ */
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/macros.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/macros.hpp
new file mode 100644
index 0000000..16fe283
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/macros.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRENDERVTK_REGISTRY_MACRO_HPP__
+#define __FWRENDERVTK_REGISTRY_MACRO_HPP__
+
+#include <boost/preprocessor/cat.hpp>
+
+#include "fwRenderVTK/IVtkRenderWindowInteractorManager.hpp"
+#include "fwRenderVTK/registry/detail.hpp"
+
+namespace fwRenderVTK
+{
+namespace registry
+{
+
+#define fwRenderVTKRegisterMacro( VTKRenderInteractorMngClassname, FunctorKey )                            \
+    static ::fwRenderVTK::IVtkRenderWindowInteractorManager::Registrar< VTKRenderInteractorMngClassname >  \
+    BOOST_PP_CAT( s__factory__record__, __LINE__) ( FunctorKey );
+
+} // end namespace registry
+} // end namespace fwRenderVTK
+
+#endif /*__FWRENDERVTK_REGISTRY_MACRO_HPP__*/
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/namespace.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/namespace.hpp
new file mode 100644
index 0000000..d59f61a
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/registry/namespace.hpp
@@ -0,0 +1,27 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef __FWRENDERVTK_REGISTRY_NAMESPACE_HPP__
+#define __FWRENDERVTK_REGISTRY_NAMESPACE_HPP__
+
+
+namespace fwRenderVTK
+{
+
+/**
+ * @brief       Contains fwRenderVTK::registry details
+ * @namespace   fwRenderVTK::registry
+ * 
+ * @date        2009-2012
+ *
+ */
+namespace registry
+{
+} // namespace registry
+
+} // namespace fwRenderVTK
+
+#endif /* __FWRENDERVTK_REGISTRY_NAMESPACE_HPP__ */
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Helpers.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Helpers.hpp
new file mode 100644
index 0000000..9f3ee8c
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Helpers.hpp
@@ -0,0 +1,31 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <vtkType.h>
+
+#include "fwRenderVTK/config.hpp"
+
+
+class vtkProp;
+class vtkPoints;
+class vtkRenderer;
+class vtkAbstractPropPicker;
+
+namespace fwRenderVTK {
+
+namespace vtk {
+
+FWRENDERVTK_API vtkIdType getNearestPointId(vtkPoints* pts, vtkRenderer* renderer);
+FWRENDERVTK_API vtkProp  *getNearestPickedProp(vtkAbstractPropPicker *picker, vtkRenderer *renderer);
+FWRENDERVTK_API bool      getNearestPickedPosition(vtkAbstractPropPicker *picker, vtkRenderer *renderer, double *position);
+
+} //vtk
+
+} //fwRenderVTK
+
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Instantiator.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Instantiator.hpp
new file mode 100644
index 0000000..1d5efc0
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Instantiator.hpp
@@ -0,0 +1,22 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "fwRenderVTK/config.hpp"
+
+namespace fwRenderVTK {
+
+namespace vtk {
+
+class FWRENDERVTK_CLASS_API Instantiator
+{
+public:
+    FWRENDERVTK_API static void ClassInitialize();
+    FWRENDERVTK_API static void ClassFinalize();
+};
+} //vtk
+
+} //fwRenderVTK
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle2DForNegato.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle2DForNegato.hpp
new file mode 100644
index 0000000..8982183
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle2DForNegato.hpp
@@ -0,0 +1,56 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_INTERACTORSTYLE2DFORNEGATO_HPP_
+#define _FWRENDERVTK_INTERACTORSTYLE2DFORNEGATO_HPP_
+
+#include <vtkImagePlaneWidget.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+
+#include "fwRenderVTK/config.hpp"
+
+
+class Renderer;
+
+class FWRENDERVTK_CLASS_API InteractorStyle2DForNegato : public vtkInteractorStyleTrackballCamera
+{
+
+public:
+
+    FWRENDERVTK_API static InteractorStyle2DForNegato *New();
+
+    vtkTypeRevisionMacro(InteractorStyle2DForNegato, vtkInteractorStyle);
+
+    FWRENDERVTK_API virtual void OnMiddleButtonDown();
+
+    FWRENDERVTK_API virtual void OnChar();
+
+    FWRENDERVTK_API virtual void OnLeftButtonDown();
+    FWRENDERVTK_API virtual void OnMouseMove();
+    FWRENDERVTK_API virtual void OnMouseWheelBackward();
+    FWRENDERVTK_API virtual void OnMouseWheelForward();
+    FWRENDERVTK_API virtual void OnRightButtonDown();
+
+    FWRENDERVTK_API virtual void Pan();
+    FWRENDERVTK_API virtual void Dolly();
+
+protected:
+
+    FWRENDERVTK_API InteractorStyle2DForNegato();
+    FWRENDERVTK_API ~InteractorStyle2DForNegato();
+
+    FWRENDERVTK_API virtual void Dolly(double factor);
+private:
+
+    InteractorStyle2DForNegato(const InteractorStyle2DForNegato&);  // Not implemented.
+
+    void operator=(const InteractorStyle2DForNegato&);  // Not implemented.
+
+    double m_newPickPoint[4];
+    double m_oldPickPoint[4];
+};
+
+#endif // _FWRENDERVTK_INTERACTORSTYLE3DFORNEGATO_HPP_
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle3DForNegato.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle3DForNegato.hpp
new file mode 100644
index 0000000..10f5668
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/InteractorStyle3DForNegato.hpp
@@ -0,0 +1,60 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef _FWRENDERVTK_INTERACTORSTYLE3DFORNEGATO_HPP_
+#define _FWRENDERVTK_INTERACTORSTYLE3DFORNEGATO_HPP_
+
+#include <vtkImagePlaneWidget.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+
+#include "fwRenderVTK/config.hpp"
+
+
+class Renderer;
+
+class FWRENDERVTK_CLASS_API InteractorStyle3DForNegato : public vtkInteractorStyleTrackballCamera
+{
+
+public:
+
+    FWRENDERVTK_API static InteractorStyle3DForNegato *New();
+
+    vtkTypeRevisionMacro(InteractorStyle3DForNegato, vtkInteractorStyle);
+
+    FWRENDERVTK_API virtual void OnMiddleButtonDown();
+
+    FWRENDERVTK_API virtual void OnChar();
+    FWRENDERVTK_API virtual void OnKeyUp();
+    FWRENDERVTK_API virtual void OnKeyDown();
+
+    FWRENDERVTK_API virtual void OnLeftButtonDown();
+    FWRENDERVTK_API virtual void OnMouseMove();
+    FWRENDERVTK_API virtual void OnRightButtonDown();
+    FWRENDERVTK_API virtual void OnMouseWheelBackward();
+    FWRENDERVTK_API virtual void OnMouseWheelForward();
+
+    FWRENDERVTK_API virtual void Rotate();
+    FWRENDERVTK_API virtual void Spin();
+    FWRENDERVTK_API virtual void Pan();
+    FWRENDERVTK_API virtual void Dolly();
+
+protected:
+
+    FWRENDERVTK_API InteractorStyle3DForNegato();
+    FWRENDERVTK_API ~InteractorStyle3DForNegato();
+
+    FWRENDERVTK_API virtual void Dolly(double factor);
+private:
+
+    InteractorStyle3DForNegato(const InteractorStyle3DForNegato&);  // Not implemented.
+
+    void operator=(const InteractorStyle3DForNegato&);  // Not implemented.
+
+    double m_newPickPoint[4];
+    double m_oldPickPoint[4];
+};
+
+#endif // _FWRENDERVTK_INTERACTORSTYLE3DFORNEGATO_HPP_
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp
new file mode 100644
index 0000000..cd9a400
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp
@@ -0,0 +1,84 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#ifndef __MARKEDSPHEREHANDLEREPRESENTATION_H
+#define __MARKEDSPHEREHANDLEREPRESENTATION_H
+
+#include "vtkHandleRepresentation.h"
+#include "vtkSphereHandleRepresentation.h"
+#include "vtkCylinderSource.h" // Needed for delegation to sphere
+
+class vtkProperty;
+class vtkFollower;
+class vtkCleanPolyData;
+
+#include "fwRenderVTK/config.hpp"
+
+namespace fwRenderVTK
+{
+
+namespace vtk
+{
+
+
+class FWRENDERVTK_CLASS_API  MarkedSphereHandleRepresentation 
+                        : public vtkSphereHandleRepresentation
+{
+public:
+  // Description:
+  // Instantiate this class.
+  FWRENDERVTK_API static MarkedSphereHandleRepresentation *New();
+
+  // Description:
+  // Standard methods for instances of this class.
+  vtkTypeRevisionMacro(MarkedSphereHandleRepresentation,vtkHandleRepresentation);
+  FWRENDERVTK_API void PrintSelf(ostream& os, vtkIndent indent);
+
+  FWRENDERVTK_API virtual void SetWorldPosition(double p[3]);
+
+  // Description:
+  // Set/Get the handle properties when unselected and selected.
+  FWRENDERVTK_API void SetMarkerProperty(vtkProperty*);
+  FWRENDERVTK_API vtkGetObjectMacro(MarkerProperty,vtkProperty);
+  
+  // Description:
+  // Methods to make this class properly act like a vtkWidgetRepresentation.
+  FWRENDERVTK_API virtual void BuildRepresentation();
+  FWRENDERVTK_API virtual void GetActors(vtkPropCollection *);
+  FWRENDERVTK_API virtual void ReleaseGraphicsResources(vtkWindow *);
+  FWRENDERVTK_API virtual int RenderOpaqueGeometry(vtkViewport *viewport);
+  FWRENDERVTK_API virtual int RenderTranslucentPolygonalGeometry(vtkViewport *viewport);
+  FWRENDERVTK_API virtual int HasTranslucentPolygonalGeometry();
+
+protected:
+  MarkedSphereHandleRepresentation();
+  ~MarkedSphereHandleRepresentation();
+
+  // the cursor3D
+  vtkFollower       *Follower;
+  vtkCleanPolyData  *CleanPolyData;
+  vtkPolyDataMapper *MarkerMapper;
+  vtkCylinderSource *Marker;
+
+  double MarkerRadiusFactor;
+
+  // Properties used to control the appearance of selected objects and
+  // the manipulator in general.
+  vtkProperty *MarkerProperty;
+  void         CreateDefaultProperties();
+  
+private:
+  MarkedSphereHandleRepresentation(const MarkedSphereHandleRepresentation&);  //Not implemented
+  void operator=(const MarkedSphereHandleRepresentation&);  //Not implemented
+};
+
+
+} // namespace vtk
+
+} // namespace fwRenderVTK
+
+#endif //__MARKEDSPHEREHANDLEREPRESENTATION_H
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Namespace.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Namespace.hpp
new file mode 100644
index 0000000..3bba8a0
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/Namespace.hpp
@@ -0,0 +1,24 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifndef FWRENDERVTKVTKNAMESPACE_HPP_
+#define FWRENDERVTKVTKNAMESPACE_HPP_
+
+namespace fwRenderVTK
+{
+/*
+ * @brief       The namespace fwRenderVTK::vtk provides several picker and interactor for the generic scene .
+ * @namespace   fwRenderVTK::vtk
+ * 
+ * @date        2009-2010.
+ *
+ */
+namespace vtk
+{
+
+}
+}
+#endif /* FWRENDERVTKVTKNAMESPACE_HPP_ */
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp
new file mode 100644
index 0000000..0d54a80
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp
@@ -0,0 +1,105 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: vtkBoxRepresentation.h,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkBoxRepresentation - a class defining the representation for the vtkBoxWidget2
+// .SECTION Description
+// This class is a concrete representation for the vtkBoxWidget2. It
+// represents a box with seven handles: one on each of the six faces, plus a
+// center handle. Through interaction with the widget, the box
+// representation can be arbitrarily positioned in the 3D space.
+//
+// To use this representation, you normally use the PlaceWidget() method
+// to position the widget at a specified region in space.
+//
+// .SECTION Caveats
+// This class, and vtkBoxWidget2, are second generation VTK
+// widgets. An earlier version of this functionality was defined in the
+// class vtkBoxWidget.
+
+// .SECTION See Also
+// vtkBoxWidget2 vtkBoxWidget
+
+
+#ifndef __fwVtkBoxRepresentation_h
+#define __fwVtkBoxRepresentation_h
+
+#include "vtkWidgetRepresentation.h"
+
+#include "fwRenderVTK/config.hpp"
+
+class vtkBoxRepresentation;
+class vtkActor;
+class vtkPolyDataMapper;
+class vtkLineSource;
+class vtkSphereSource;
+class vtkCellPicker;
+class vtkProperty;
+class vtkPolyData;
+class vtkPoints;
+class vtkPolyDataAlgorithm;
+class vtkPointHandleRepresentation3D;
+class vtkTransform;
+class vtkPlanes;
+class vtkBox;
+class vtkDoubleArray;
+class vtkMatrix4x4;
+
+
+class FWRENDERVTK_CLASS_API fwVtkBoxRepresentation : public vtkBoxRepresentation
+{
+public:
+  // Description:
+  // Instantiate the class.
+  FWRENDERVTK_API static fwVtkBoxRepresentation *New();
+
+  // Description:
+  // Standard methods for the class.
+  vtkTypeRevisionMacro(fwVtkBoxRepresentation,vtkBoxRepresentation);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+  // Description:
+  // Control the behavior of the widget. Translation, rotation, and
+  // scaling can all be enabled and disabled.
+  vtkSetMacro(TranslationEnabled,int);
+  vtkGetMacro(TranslationEnabled,int);
+  vtkBooleanMacro(TranslationEnabled,int);
+  vtkSetMacro(ScalingEnabled,int);
+  vtkGetMacro(ScalingEnabled,int);
+  vtkBooleanMacro(ScalingEnabled,int);
+  vtkSetMacro(RotationEnabled,int);
+  vtkGetMacro(RotationEnabled,int);
+  vtkBooleanMacro(RotationEnabled,int);
+
+//  // Description:
+//  // These are methods that satisfy vtkWidgetRepresentation's API.
+  virtual void WidgetInteraction(double e[2]);
+
+
+protected:
+  fwVtkBoxRepresentation();
+
+  // Control whether scaling, rotation, and translation are supported
+  int TranslationEnabled;
+  int ScalingEnabled;
+  int RotationEnabled;
+
+};
+
+#endif
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkCellPicker.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkCellPicker.hpp
new file mode 100644
index 0000000..34ad175
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkCellPicker.hpp
@@ -0,0 +1,93 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: fwVtkCellPicker.h,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME fwVtkCellPicker - select a cell by shooting a ray into graphics window
+// .SECTION Description
+// fwVtkCellPicker is used to select a cell by shooting a ray into graphics
+// window and intersecting with actor's defining geometry - specifically 
+// its cells. Beside returning coordinates, actor and mapper, fwVtkCellPicker
+// returns the id of the closest cell within the tolerance along the pick
+// ray, and the dataset that was picked.
+// .SECTION See Also
+// fwVtkPicker vtkPointPicker
+
+#ifndef __FWRENDERVTK_VTKCELLPICKER__
+#define __FWRENDERVTK_VTKCELLPICKER__
+
+#include <vector>
+#include <fwData/TriangularMesh.hpp>
+
+#include <fwMath/IntrasecTypes.hpp>
+
+#include "fwRenderVTK/vtk/fwVtkPicker.hpp"
+#include "fwRenderVTK/config.hpp"
+
+class vtkGenericCell;
+class vtkPolyData;
+
+class FWRENDERVTK_CLASS_API fwVtkCellPicker : public fwVtkPicker
+{
+public:
+  FWRENDERVTK_API static fwVtkCellPicker *New();
+  vtkTypeRevisionMacro(fwVtkCellPicker,fwVtkPicker);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+  // Description:
+  // Get the id of the picked cell. If CellId = -1, nothing was picked.
+  vtkGetMacro(CellId, vtkIdType);
+
+  // Description:
+  // Get the subId of the picked cell. If SubId = -1, nothing was picked.
+  vtkGetMacro(SubId, int);
+
+  // Description:
+  // Get the parametric coordinates of the picked cell. Only valid if 
+  // pick was made.
+  vtkGetVectorMacro(PCoords, double,3);
+
+  typedef std::vector< std::pair<int, fwVec3d> > PickedCellType;
+
+  FWRENDERVTK_API PickedCellType GetPickedCellIds( double p1[3], double p2[3], ::fwData::TriangularMesh::sptr mesh);
+  FWRENDERVTK_API PickedCellType GetPickedCellIds( double p1[3], double p2[3], vtkPolyData *polydata);
+
+protected:
+  fwVtkCellPicker();
+  ~fwVtkCellPicker();
+
+  vtkIdType CellId; // picked cell
+  int SubId; // picked cell subId
+  double PCoords[3]; // picked cell parametric coordinates
+
+  virtual double IntersectWithLine(double p1[3], double p2[3], double tol, 
+                                  vtkAssemblyPath *path, vtkProp3D *p, 
+                                  vtkAbstractMapper3D *m);
+  void Initialize();
+  
+private:
+  vtkGenericCell *Cell; //used to accelerate picking
+  
+private:
+  fwVtkCellPicker(const fwVtkCellPicker&);  // Not implemented.
+  void operator=(const fwVtkCellPicker&);  // Not implemented.
+};
+
+#endif
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkPicker.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkPicker.hpp
new file mode 100644
index 0000000..1a45e44
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkPicker.hpp
@@ -0,0 +1,96 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: fwVtkPicker.h,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME fwVtkPicker - superclass for 3D geometric pickers (uses ray cast)
+// .SECTION Description
+// fwVtkPicker is used to select instances of vtkProp3D by shooting a ray
+// into a graphics window and intersecting with the actor's bounding box. 
+// The ray is defined from a point defined in window (or pixel) coordinates, 
+// and a point located from the camera's position.
+//
+// fwVtkPicker may return more than one vtkProp3D, since more than one bounding
+// box may be intersected. fwVtkPicker returns the list of props that were hit,
+// the pick coordinates in world and untransformed mapper space, and the 
+// prop (vtkProp3D) and mapper that are "closest" to the camera. The closest 
+// prop is the one whose center point (i.e., center of bounding box) 
+// projected on the ray is closest to the camera.
+
+// .SECTION See Also
+// fwVtkPicker is used for quick geometric picking. If you desire to pick
+// points or cells, use the subclass vtkPointPicker or vtkCellPicker,
+// respectively.  Or you may use hardware picking to pick any type of vtkProp
+// - see vtkPropPicker or vtkWorldPointPicker.
+
+#ifndef __FWRENDERVTK_VTKPICKER__
+#define __FWRENDERVTK_VTKCPICKER__
+
+#include "fwRenderVTK/config.hpp"
+
+#include <vtkPicker.h>
+
+class vtkAbstractMapper3D;
+class vtkDataSet;
+class vtkTransform;
+class vtkActorCollection;
+class vtkProp3DCollection;
+class vtkPropCollection;
+class vtkPolyData;
+class vtkPoints;
+
+class FWRENDERVTK_CLASS_API fwVtkPicker : public vtkPicker
+{
+public:
+    FWRENDERVTK_API static fwVtkPicker *New();
+
+  vtkTypeRevisionMacro(fwVtkPicker,vtkPicker);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+  // Description:
+  // Perform pick operation with selection point provided. Normally the 
+  // first two values for the selection point are x-y pixel coordinate, and
+  // the third value is =0. Return non-zero if something was successfully 
+  // picked.
+  FWRENDERVTK_API virtual int Pick(double selectionX, double selectionY, double selectionZ,
+                   vtkRenderer *renderer);  
+
+
+
+  FWRENDERVTK_API int PickPolyData( double p1[3], double p2[3], vtkPolyData *polydata);
+  FWRENDERVTK_API int Pick( double p1[3], double p2[3], vtkPropCollection *props);
+  // Description: 
+  // Perform pick operation with selection point provided. Normally the first
+  // two values for the selection point are x-y pixel coordinate, and the
+  // third value is =0. Return non-zero if something was successfully picked.
+  int Pick(double selectionPt[3], vtkRenderer *ren)
+    {return this->Pick(selectionPt[0], selectionPt[1], selectionPt[2], ren);};
+      
+protected:
+  fwVtkPicker();
+  ~fwVtkPicker();
+
+private:
+  fwVtkPicker(const fwVtkPicker&);  // Not implemented.
+  void operator=(const fwVtkPicker&);  // Not implemented.
+};
+
+
+#endif
+
+
diff --git a/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp
new file mode 100644
index 0000000..4493285
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/include/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp
@@ -0,0 +1,97 @@
+#ifndef __FWRENDERVTK_FWVTKWINDOWLEVELLOOKUPTABLE_HPP__
+#define __FWRENDERVTK_FWVTKWINDOWLEVELLOOKUPTABLE_HPP__
+
+#include <vtkLookupTable.h>
+
+#include "fwRenderVTK/config.hpp"
+
+///Reinplementation of vtkWindowLevelLookupTable : add specific out-of-bounds colors
+class FWRENDERVTK_API fwVtkWindowLevelLookupTable : public vtkLookupTable
+{
+public:
+  static fwVtkWindowLevelLookupTable *New();
+  vtkTypeMacro(fwVtkWindowLevelLookupTable,vtkLookupTable);
+  void PrintSelf(ostream& os, vtkIndent indent);
+
+  // Description:
+  // Set the window for the lookup table.  The window is the difference
+  // between TableRange[0] and TableRange[1].
+  void SetWindow(double window) {
+    this->InverseVideo = window < 0;
+    if(this->InverseVideo)
+    {
+        window = -window;
+    }
+    if (window < 1e-5) { window = 1e-5; }
+    this->Window = window;
+    this->SetTableRange(this->Level - this->Window/2.0,
+                        this->Level + this->Window/2.0); };
+  vtkGetMacro(Window,double);
+
+  void BuildInvert();
+
+  // Description:
+  // Set the Level for the lookup table.  The level is the average of
+  // TableRange[0] and TableRange[1].
+  void SetLevel(double level) {
+    this->Level = level;
+    this->SetTableRange(this->Level - this->Window/2.0,
+                        this->Level + this->Window/2.0); };
+  vtkGetMacro(Level,double);
+
+  // Description:
+  // Set  on or off.  You can achieve the same effect by
+  // switching the LeftClampValue and the RightClampValue.
+  vtkSetMacro(Clamping,int);
+  vtkGetMacro(Clamping,int);
+  vtkBooleanMacro(Clamping,int);
+
+  // Description:
+  // Set the minimum table value.  All lookup table entries below the
+  // start of the ramp will be set to this color.  After you change
+  // this value, you must re-build the lookup table.
+  vtkSetVector4Macro(LeftClampValue,double);
+  vtkGetVector4Macro(LeftClampValue,double);
+
+  // Description:
+  // Set the maximum table value. All lookup table entries above the
+  // end of the ramp will be set to this color.  After you change
+  // this value, you must re-build the lookup table.
+  vtkSetVector4Macro(RightClampValue,double);
+  vtkGetVector4Macro(RightClampValue,double);
+
+  unsigned char *GetCurrentPointer(const vtkIdType id);
+
+
+  // Description:
+  // map a set of scalars through the lookup table
+  void MapScalarsThroughTable2(void *input, unsigned char *output,
+                               int inputDataType, int numberOfValues,
+                               int inputIncrement, int outputIncrement);
+
+
+
+protected:
+  fwVtkWindowLevelLookupTable(int sze=256, int ext=256);
+  ~fwVtkWindowLevelLookupTable();
+
+  double Window;
+  double Level;
+  int InverseVideo;
+
+  int Clamping;
+  double RightClampValue[4];
+  double LeftClampValue[4];
+
+
+  vtkUnsignedCharArray *InvertTable;
+  vtkTimeStamp InvertTime;
+
+private:
+  fwVtkWindowLevelLookupTable(const fwVtkWindowLevelLookupTable&);  // Not implemented.
+  void operator=(const fwVtkWindowLevelLookupTable&);  // Not implemented.
+};
+
+#endif //__FWRENDERVTK_FWVTKWINDOWLEVELLOOKUPTABLE_HPP__
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkAdaptorService.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkAdaptorService.cpp
new file mode 100644
index 0000000..c7af96a
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkAdaptorService.cpp
@@ -0,0 +1,375 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+
+#include <vtkRenderer.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkAbstractPropPicker.h>
+#include <vtkTransform.h>
+
+#include <fwData/String.hpp>
+#include <fwTools/fwID.hpp>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/IEditionService.hpp>
+
+#include "fwRenderVTK/IVtkAdaptorService.hpp"
+
+
+
+namespace fwRenderVTK
+{
+
+IVtkAdaptorService::IVtkAdaptorService() throw()
+    : m_comChannelPriority(0.5),
+      m_vtkPipelineModified(true),
+      m_rendererId ("default") ,
+      m_pickerId   (""), // by default no Picker
+      m_transformId   (""), // by default no Transform
+      m_propCollection ( vtkPropCollection::New() ),
+      m_autoRender(true)
+{
+    m_connections = ::fwServices::helper::SigSlotConnection::New();
+}
+
+IVtkAdaptorService::~IVtkAdaptorService() throw()
+{
+    m_propCollection->Delete();
+}
+
+void IVtkAdaptorService::info(std::ostream &_sstream )
+{
+    _sstream << "IVtkAdaptorService : " ;
+    this->SuperClass::info( _sstream ) ;
+}
+
+void IVtkAdaptorService::starting() throw(fwTools::Failed)
+{
+    /// Install observation
+    m_connections->connect(this->getObject(), this->getSptr(), this->getObjSrvConnections());
+
+    assert( m_renderService.lock() );
+
+    doStart();
+    requestRender();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::stopping() throw(fwTools::Failed)
+{
+    /// Stop observation
+    m_connections->disconnect();
+    doStop();
+    requestRender();
+}
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::swapping() throw(fwTools::Failed)
+{
+    m_connections->disconnect();
+    m_connections->connect(this->getObject(), this->getSptr(), this->getObjSrvConnections());
+    doSwap();
+    requestRender();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::updating() throw(fwTools::Failed)
+{
+    doUpdate();
+    requestRender();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::receiving(::fwServices::ObjectMsg::csptr msg) throw(fwTools::Failed)
+{
+    doReceive(msg);
+    requestRender();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::setRenderService( VtkRenderService::sptr service)
+{
+    /// Preconditions
+    SLM_ASSERT("service not instanced", service);
+    assert( this->isStopped() ) ;
+
+    m_renderService = service ;
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::setRenderId(VtkRenderService::RendererIdType newID)
+{
+    m_rendererId =  newID;
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::setVtkPipelineModified()
+{
+    m_vtkPipelineModified = true;
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::requestRender()
+{
+    if ( this->getRenderService()->isShownOnScreen() && m_vtkPipelineModified && m_autoRender )
+    {
+        if ( !this->getRenderService()->getPendingRenderRequest())
+        {
+            this->getRenderService()->setPendingRenderRequest(true);
+            this->getRenderService()->slot(VtkRenderService::s_RENDER_SLOT)->asyncRun();
+        }
+        m_vtkPipelineModified = false;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+VtkRenderService::RendererIdType IVtkAdaptorService::getRenderId()
+{
+    return m_rendererId;
+}
+
+//------------------------------------------------------------------------------
+
+VtkRenderService::sptr  IVtkAdaptorService:: getRenderService()
+{
+    return m_renderService.lock();
+}
+
+//------------------------------------------------------------------------------
+
+vtkRenderer* IVtkAdaptorService::getRenderer()
+{
+    return m_renderService.lock()->getRenderer(m_rendererId);
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::setPickerId(VtkRenderService::PickerIdType newID)
+{
+    m_pickerId =  newID;
+}
+
+//------------------------------------------------------------------------------
+
+VtkRenderService::PickerIdType IVtkAdaptorService::getPickerId()
+{
+    return m_pickerId;
+}
+
+//------------------------------------------------------------------------------
+
+vtkAbstractPropPicker * IVtkAdaptorService::getPicker(std::string pickerId)
+{
+    if (pickerId.empty())
+    {
+        pickerId = m_pickerId;
+    }
+    return m_renderService.lock()->getPicker(pickerId);
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::setTransformId(VtkRenderService::VtkObjectIdType newID)
+{
+    m_transformId =  newID;
+}
+
+//------------------------------------------------------------------------------
+
+VtkRenderService::VtkObjectIdType IVtkAdaptorService::getTransformId()
+{
+    return m_transformId;
+}
+
+//------------------------------------------------------------------------------
+
+vtkTransform * IVtkAdaptorService::getTransform()
+{
+    return vtkTransform::SafeDownCast(m_renderService.lock()->getVtkObject(m_transformId));
+}
+
+//------------------------------------------------------------------------------
+
+vtkObject * IVtkAdaptorService::getVtkObject(VtkRenderService::VtkObjectIdType objectId)
+{
+    if (!objectId.empty())
+    {
+        return m_renderService.lock()->getVtkObject(objectId);
+    }
+    return NULL;
+}
+
+//------------------------------------------------------------------------------
+
+vtkRenderWindowInteractor* IVtkAdaptorService::getInteractor()
+{
+    return this->getRenderer()->GetRenderWindow()->GetInteractor();
+}
+
+//------------------------------------------------------------------------------
+
+::fwData::Object::sptr IVtkAdaptorService::getAssociatedObject(vtkProp *prop, int depth)
+{
+    ::fwData::Object::sptr obj;
+
+    if (prop)
+    {
+        if ( m_propCollection->IsItemPresent(prop) )
+        {
+            obj = this->getObject();
+        }
+        else
+        {
+            ::fwData::Object::sptr res;
+            BOOST_FOREACH( ServiceVector::value_type service, m_subServices)
+            {
+                if(!service.expired())
+                {
+                    res = service.lock()->getAssociatedObject(prop, depth - 1 );
+                    if (res) break;
+                }
+            }
+            obj = ( res && depth == 0 ) ? this->getObject() : res;
+        }
+    }
+    return obj;
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::registerService( ::fwRenderVTK::IVtkAdaptorService::sptr service)
+{
+        m_subServices.push_back(service);
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::unregisterServices()
+{
+    BOOST_FOREACH(
+            ServiceVector::value_type service,
+            m_subServices
+            )
+    {
+        if(!service.expired())
+        {
+            service.lock()->stop();
+            ::fwServices::OSR::unregisterService(service.lock());
+        }
+    }
+    m_subServices.clear();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::registerProp(vtkProp *prop)
+{
+    getProps(m_propCollection, prop);
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::getProps(vtkPropCollection *propc, vtkProp *prop)
+{
+    int initSize = propc->GetNumberOfItems();
+
+    prop->GetActors(propc);
+    prop->GetActors2D(propc);
+    prop->GetVolumes(propc);
+
+    if (initSize == propc->GetNumberOfItems())
+    {
+        propc->AddItem(prop);
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::getAllSubProps(vtkPropCollection *propc, int depth)
+{
+    vtkProp *prop;
+
+    m_propCollection->InitTraversal();
+    while ( (prop = m_propCollection->GetNextProp()) )
+    {
+        getProps(propc, prop);
+    }
+
+    if(depth != 0)
+    {
+        BOOST_FOREACH( ServiceVector::value_type service, m_subServices)
+        {
+            if(!service.expired())
+            {
+                service.lock()->getAllSubProps( propc, depth - 1 );
+            }
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::unregisterProps()
+{
+    m_propCollection->RemoveAllItems();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::addToRenderer(vtkProp *prop)
+{
+    this->registerProp(prop);
+    this->getRenderer()->AddViewProp(prop);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::addToPicker(vtkProp *prop, std::string pickerId)
+{
+    OSLM_ASSERT("Picker '"<< pickerId << "' undefined." , this->getPicker(pickerId));
+    this->getPicker(pickerId)->AddPickList(prop);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::removeFromPicker(vtkProp *prop, std::string pickerId)
+{
+    OSLM_ASSERT("Picker '"<< pickerId << "' undefined." , this->getPicker(pickerId));
+    this->getPicker(pickerId)->DeletePickList(prop);
+    this->setVtkPipelineModified();
+}
+
+//------------------------------------------------------------------------------
+
+void IVtkAdaptorService::removeAllPropFromRenderer()
+{
+    vtkPropCollection *propc = m_propCollection;
+    vtkProp *prop;
+
+    propc->InitTraversal();
+    while ( (prop = propc->GetNextProp()) )
+    {
+        this->getRenderer()->RemoveViewProp(prop);
+    }
+    this->unregisterProps();
+    this->setVtkPipelineModified();
+}
+
+
+} // namespace fwRenderVTK
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkRenderWindowInteractorManager.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkRenderWindowInteractorManager.cpp
new file mode 100644
index 0000000..c0793ee
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/IVtkRenderWindowInteractorManager.cpp
@@ -0,0 +1,42 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRenderVTK/IVtkRenderWindowInteractorManager.hpp"
+
+namespace fwRenderVTK
+{
+
+//-----------------------------------------------------------------------------
+
+const IVtkRenderWindowInteractorManager::FactoryRegistryKeyType IVtkRenderWindowInteractorManager::REGISTRY_KEY =
+        "::fwRenderVTK::IVtkRenderWindowInteractorManager::REGISTRY_KEY";
+
+//-----------------------------------------------------------------------------
+
+IVtkRenderWindowInteractorManager::sptr IVtkRenderWindowInteractorManager::createManager()
+{
+    IVtkRenderWindowInteractorManager::sptr manager = ::fwRenderVTK::factory::New(
+            ::fwRenderVTK::IVtkRenderWindowInteractorManager::REGISTRY_KEY );
+    SLM_ASSERT("Sorry, The factory process to create an IVtkRenderWindowInteractorManager, failed. Missing Qt or Wx component ?", manager );
+    return manager;
+}
+
+//-----------------------------------------------------------------------------
+
+IVtkRenderWindowInteractorManager::IVtkRenderWindowInteractorManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+IVtkRenderWindowInteractorManager::~IVtkRenderWindowInteractorManager()
+{}
+
+//-----------------------------------------------------------------------------
+
+} // namespace fwRenderVTK
+
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/VtkRenderService.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/VtkRenderService.cpp
new file mode 100644
index 0000000..a2d559b
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/VtkRenderService.cpp
@@ -0,0 +1,554 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <boost/foreach.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <boost/function.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <vtkActor.h>
+#include <vtkCellPicker.h>
+#include <vtkFrustumCoverageCuller.h>
+#include <vtkInteractorStyleTrackballCamera.h>
+#include <vtkLight.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProperty.h>
+#include <vtkRendererCollection.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderer.h>
+#include <vtkSphereSource.h>
+#include <vtkInstantiator.h>
+#include <vtkTransform.h>
+#include <vtkCamera.h>
+
+#include <fwCom/Slots.hpp>
+#include <fwCom/Slots.hxx>
+
+#include <fwServices/Base.hpp>
+#include <fwServices/macros.hpp>
+#include <fwTools/fwID.hpp>
+#include <fwData/Color.hpp>
+
+#include <fwRuntime/ConfigurationElementContainer.hpp>
+#include <fwRuntime/utils/GenericExecutableFactoryRegistrar.hpp>
+
+#include <fwComEd/CompositeMsg.hpp>
+#include <fwComEd/CameraMsg.hpp>
+
+#include "fwRenderVTK/IVtkAdaptorService.hpp"
+#include "fwRenderVTK/VtkRenderService.hpp"
+
+
+fwServicesRegisterMacro( ::fwRender::IRender , ::fwRenderVTK::VtkRenderService , ::fwData::Composite ) ;
+
+using namespace fwServices;
+
+
+namespace fwRenderVTK
+{
+
+const ::fwCom::Slots::SlotKeyType VtkRenderService::s_RENDER_SLOT = "render";
+
+//-----------------------------------------------------------------------------
+
+VtkRenderService::VtkRenderService() throw() :
+     m_pendingRenderRequest(false), m_autoRender(true)
+{
+    m_slotRender = ::fwCom::newSlot( &VtkRenderService::render, this);
+    m_slotRender->setWorker(m_associatedWorker);
+
+    ::fwCom::HasSlots::m_slots(s_RENDER_SLOT, m_slotRender);
+}
+
+//-----------------------------------------------------------------------------
+
+VtkRenderService::~VtkRenderService() throw()
+{}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::configureRenderer( ConfigurationType conf )
+{
+    assert(conf->getName() == "renderer");
+
+    std::string id = conf->getAttributeValue("id");
+    std::string background = conf->getAttributeValue("background");
+
+    if(m_renderers.count(id) == 0)
+    {
+        m_renderers[id] = vtkRenderer::New();
+
+        m_renderers[id]->SetUseDepthPeeling     ( 1  );
+        m_renderers[id]->SetMaximumNumberOfPeels( 8  );
+        m_renderers[id]->SetOcclusionRatio      ( 0. );
+
+        if(conf->hasAttribute("layer") )
+        {
+            int layer = ::boost::lexical_cast< int >(conf->getAttributeValue("layer"));
+            m_renderers[id]->SetLayer(layer);
+        }
+    }
+
+    if ( !background.empty() )
+    {
+        if(background[0] == '#')
+        {
+            ::fwData::Color::sptr color = ::fwData::Color::New();
+            color->setRGBA(background);
+            m_renderers[id]->SetBackground(color->getRefRGBA()[0], color->getRefRGBA()[1], color->getRefRGBA()[2]);
+        }
+        else
+        {
+            // compatibility with "old" color
+            double color = ::boost::lexical_cast<double> (background);
+            m_renderers[id]->SetBackground(color, color, color);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::configurePicker( ConfigurationType conf )
+{
+    assert(conf->getName() == "picker");
+
+    std::string id = conf->getAttributeValue("id");
+    std::string vtkclass = conf->getAttributeValue("vtkclass");
+
+    if (vtkclass.empty())
+    {
+        vtkclass = "vtkCellPicker";
+    }
+
+    if(m_pickers.count(id) == 0)
+    {
+        m_pickers[id] =  vtkAbstractPropPicker::SafeDownCast(vtkInstantiator::CreateInstance(vtkclass.c_str()));
+        OSLM_ASSERT("'" << vtkclass.c_str() << "' instantiation failled.",m_pickers[id]);
+        m_pickers[id]->InitializePickList();
+        m_pickers[id]->PickFromListOn();
+        vtkPicker *picker = vtkPicker::SafeDownCast(m_pickers[id]);
+        if (picker)
+        {
+            picker->SetTolerance(0);
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::configureObject( ConfigurationType conf )
+{
+    assert(conf->getName() == "adaptor");
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >() ;
+
+    const std::string id            = conf->getAttributeValue("id");
+    const std::string objectId      = conf->getAttributeValue("objectId");
+    const std::string adaptor       = conf->getAttributeValue("class");
+    const std::string uid           = conf->getAttributeValue("uid");
+    const std::string compositeName = "self";
+
+    SLM_ASSERT( "'id' required attribute missing or empty"      , !id.empty() );
+    SLM_ASSERT( "'objectId' required attribute missing or empty", !objectId.empty() );
+    SLM_ASSERT( "'adaptor' required attribute missing or empty" , !adaptor.empty() );
+
+    const unsigned int compositeObjectCount = composite->getContainer().count(objectId);
+
+    OSLM_TRACE_IF(objectId << " not found in composite. If it exist, associated Adaptor will be destroyed",
+                  ! (compositeObjectCount == 1 || objectId == compositeName) );
+
+
+    ::fwData::Object::sptr object;
+    if (compositeObjectCount)
+    {
+        object = ::fwData::Object::dynamicCast(composite->getContainer()[objectId]);
+    }
+    else if (objectId == compositeName)
+    {
+        object = ::fwData::Object::dynamicCast(composite);
+    }
+
+    if ( m_sceneAdaptors.count(id) == 0 && object )
+    {
+        OSLM_TRACE ("Adding service : IVtkAdaptorService " << adaptor << " on "<< objectId );
+        SceneAdaptor adaptee;
+        adaptee.m_config = * (conf->begin());
+        if (!uid.empty())
+        {
+            OSLM_TRACE("VtkRenderService::configureObject : uid = " << uid);
+            adaptee.m_service = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( object , adaptor, uid);
+        }
+        else
+        {
+            adaptee.m_service = ::fwServices::add< ::fwRenderVTK::IVtkAdaptorService >( object , adaptor);
+        }
+
+        assert(adaptee.m_config->getName() == "config");
+        assert(adaptee.getService());
+
+        adaptee.getService()->setConfiguration(adaptee.m_config);
+        adaptee.getService()->setAutoRender(m_autoRender);
+        adaptee.getService()->configure();
+        adaptee.getService()->setRenderService(VtkRenderService::dynamicCast(this->shared_from_this()));
+        adaptee.getService()->setName(id);
+
+        if (this->isStarted())
+        {
+            adaptee.getService()->start();
+        }
+
+        m_sceneAdaptors[id] = adaptee;
+    }
+    else if(m_sceneAdaptors.count(id) == 1)
+    {
+        SceneAdaptor &adaptee = m_sceneAdaptors[id];
+        SLM_ASSERT("Adaptor service expired !", adaptee.getService() );
+        OSLM_ASSERT( adaptee.getService()->getID() <<  " is not started " ,adaptee.getService()->isStarted());
+        if (object)
+        {
+            OSLM_TRACE ("Swapping IVtkAdaptorService " << adaptor << " on "<< objectId );
+            if(adaptee.getService()->getObject() != object)
+            {
+                adaptee.getService()->swap(object);
+            }
+            else
+            {
+                OSLM_WARN(adaptor << "'s object already is '"
+                        << adaptee.getService()->getObject()->getID()
+                        << "', no need to swap");
+            }
+        }
+        else
+        {
+            adaptee.getService()->stop();
+            ::fwServices::OSR::unregisterService(adaptee.getService());
+            adaptee.m_service.reset();
+            m_sceneAdaptors.erase(id);
+        }
+    }
+    else
+    {
+            OSLM_TRACE ( "'"<< objectId << "' inexistent, passing by '" << adaptor << "'");
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::configureVtkObject( ConfigurationType conf )
+{
+    assert(conf->getName() == "vtkObject");
+
+    std::string id = conf->getAttributeValue("id");
+    std::string vtkClass = conf->getAttributeValue("class");
+    assert( !id.empty() );
+    assert( !vtkClass.empty() );
+
+    if( m_vtkObjects.count(id) == 0 )
+    {
+
+        if ( vtkClass == "vtkTransform" && conf->size() == 1 )
+        {
+            m_vtkObjects[id] = createVtkTransform( conf );
+        }
+        else
+        {
+            m_vtkObjects[id] = vtkInstantiator::CreateInstance(vtkClass.c_str());
+        }
+
+
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+vtkTransform * VtkRenderService::createVtkTransform( ConfigurationType conf )
+{
+    SLM_ASSERT("vtkObject must be contain just only one sub xml element called vtkTransform.", conf->size() == 1 && ( *conf->begin() )->getName() == "vtkTransform");
+
+    ConfigurationType vtkTransformXmlElem = *conf->begin();
+
+    vtkTransform * newMat = vtkTransform::New();
+
+    for(    ::fwRuntime::ConfigurationElement::Iterator elem = vtkTransformXmlElem->begin();
+            !(elem == vtkTransformXmlElem->end());
+            ++elem )
+    {
+        SLM_ASSERT("Sorry, the name of xml element must be concatenate.", (*elem)->getName() == "concatenate" );
+
+        std::string transformId = (*elem)->getValue();
+
+        vtkTransform * mat = vtkTransform::SafeDownCast( getVtkObject(transformId) );
+
+        if ( (*elem)->hasAttribute( "inverse" ) && (*elem)->getAttributeValue( "inverse" ) == "yes" )
+        {
+            newMat->Concatenate( mat->GetLinearInverse() );
+        }
+        else
+        {
+            newMat->Concatenate( mat );
+        }
+
+    }
+
+    return newMat;
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::addVtkObject( VtkObjectIdType _id, vtkObject * _vtkObj )
+{
+    assert( ! _id.empty() );
+
+    if( m_vtkObjects.count(_id) == 0 )
+    {
+        m_vtkObjects[_id] = _vtkObj;
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::configuring() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+    SLM_FATAL_IF( "Depreciated tag \"win\" in configuration", m_configuration->findConfigurationElement("win") );
+    this->initialize();
+
+    std::vector < ::fwRuntime::ConfigurationElement::sptr > vectConfig = m_configuration->find("scene");
+    //assert(m_configuration->getName() == "scene");
+    assert(!vectConfig.empty());
+    m_sceneConfiguration = vectConfig.at(0);
+
+    std::string autoRender = m_sceneConfiguration->getAttributeValue("autoRender");
+    m_autoRender = (autoRender.empty() || autoRender == "true");
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::starting() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    this->create();
+    this->startContext();
+
+    // Instantiate vtk object, class...
+    ::fwRuntime::ConfigurationElementContainer::Iterator iter;
+    for (iter = m_sceneConfiguration->begin() ; iter != m_sceneConfiguration->end() ; ++iter)
+    {
+        if ((*iter)->getName() == "renderer")
+        {
+            this->configureRenderer(*iter);
+        }
+        else if ((*iter)->getName() == "picker")
+        {
+            this->configurePicker(*iter);
+        }
+        else if ((*iter)->getName() == "adaptor")
+        {
+            this->configureObject(*iter);
+        }
+        else if ((*iter)->getName() == "vtkObject")
+        {
+            this->configureVtkObject(*iter);
+        }
+        else
+        {
+            OSLM_ASSERT("Bad scene configurationType, unknown xml node : " << (*iter)->getName(), false);
+        }
+    }
+
+    m_interactorManager->getInteractor()->GetRenderWindow()->SetNumberOfLayers(m_renderers.size());
+    for( RenderersMapType::iterator iter = m_renderers.begin(); iter != m_renderers.end(); ++iter )
+    {
+        vtkRenderer *renderer = (*iter).second;
+        m_interactorManager->getInteractor()->GetRenderWindow()->AddRenderer(renderer);
+    }
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >() ;
+
+    SceneAdaptorsMapType::iterator adaptorIter ;
+    for ( adaptorIter = m_sceneAdaptors.begin();
+          adaptorIter != m_sceneAdaptors.end();
+          ++adaptorIter)
+    {
+        adaptorIter->second.getService()->start();
+        assert(adaptorIter->second.getService()->isStarted());
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::stopping() throw(fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwData::Composite::sptr composite = this->getObject< ::fwData::Composite >() ;
+
+    SceneAdaptorsMapType::iterator adaptorIter ;
+
+    for ( adaptorIter = m_sceneAdaptors.begin();
+          adaptorIter != m_sceneAdaptors.end();
+          ++adaptorIter)
+    {
+        adaptorIter->second.getService()->stop();
+        ::fwServices::OSR::unregisterService(adaptorIter->second.getService());
+        adaptorIter->second.getService().reset();
+    }
+
+    this->stopContext();
+
+    this->getContainer()->clean();
+    this->destroy();
+
+    m_sceneAdaptors.clear();
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::receiving( ::fwServices::ObjectMsg::csptr message ) throw(::fwTools::Failed)
+{
+    SLM_TRACE_FUNC();
+
+    ::fwComEd::CompositeMsg::csptr compositeMsg = ::fwComEd::CompositeMsg::dynamicConstCast(message);
+
+    if( compositeMsg )
+    {
+
+        ::fwData::Composite::ContainerType objects;
+
+        ::fwData::Composite::sptr modifiedKeys;
+
+        modifiedKeys = compositeMsg->getAddedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        modifiedKeys = compositeMsg->getNewChangedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        modifiedKeys = compositeMsg->getRemovedKeys();
+        objects.insert(modifiedKeys->begin(), modifiedKeys->end());
+
+        assert ( m_sceneConfiguration );
+
+        BOOST_FOREACH( ::fwData::Composite::ContainerType::value_type objectId, objects)
+        {
+            std::vector< ConfigurationType > confVec = m_sceneConfiguration->find("adaptor","objectId",objectId.first);
+            BOOST_FOREACH( ConfigurationType cfg, confVec )
+            {
+                this->configureObject(cfg);
+            }
+        }
+    }
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::updating() throw(fwTools::Failed)
+{}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::render()
+{
+    m_interactorManager->getInteractor()->Render();
+    this->setPendingRenderRequest(false);
+}
+
+//-----------------------------------------------------------------------------
+
+bool VtkRenderService::isShownOnScreen()
+{
+   return this->getContainer()->isShownOnScreen();
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::startContext()
+{
+    m_interactorManager = ::fwRenderVTK::IVtkRenderWindowInteractorManager::createManager();
+    m_interactorManager->setRenderService(this->getSptr());
+    m_interactorManager->installInteractor( this->getContainer() );
+
+    // For Depth peeling (translucent rendering)
+//    m_interactorManager->getInteractor()->SetRenderWhenDisabled(false);
+
+#ifndef __linux
+    m_interactorManager->getInteractor()->GetRenderWindow()->SetAlphaBitPlanes(1);
+    m_interactorManager->getInteractor()->GetRenderWindow()->SetMultiSamples(0);
+#endif
+
+//    m_interactor->GetRenderWindow()->PointSmoothingOn();
+//    m_interactor->GetRenderWindow()->LineSmoothingOn();
+//    m_interactor->GetRenderWindow()->PolygonSmoothingOn();
+//    m_interactor->Register(NULL);
+//    m_interactor->SetInteractorStyle( vtkInteractorStyleTrackballCamera::New() );
+
+//    m_interactorManager->getInteractor()->SetRenderModeToDirect();
+    //m_interactor->SetRenderModeToFrameRated();
+//    m_interactor->SetRenderModeToOneShot();
+//    m_interactor->SetRenderModeToMeanTime();
+}
+
+//-----------------------------------------------------------------------------
+
+void VtkRenderService::stopContext()
+{
+    SLM_TRACE_FUNC();
+
+    for( RenderersMapType::iterator iter = m_renderers.begin(); iter != m_renderers.end(); ++iter )
+    {
+        vtkRenderer *renderer = iter->second;
+        renderer->InteractiveOff();
+        m_interactorManager->getInteractor()->GetRenderWindow()->RemoveRenderer(renderer);
+        renderer->Delete();
+    }
+
+    m_renderers.clear();
+
+    m_interactorManager->uninstallInteractor();
+    m_interactorManager.reset();
+}
+
+//-----------------------------------------------------------------------------
+
+vtkRenderer * VtkRenderService::getRenderer(RendererIdType rendererId)
+{
+    OSLM_ASSERT("Renderer not found : '" << rendererId << "'" , m_renderers.count(rendererId) == 1);
+
+    return m_renderers[rendererId];
+}
+
+//-----------------------------------------------------------------------------
+
+vtkAbstractPropPicker * VtkRenderService::getPicker(PickerIdType pickerId)
+{
+    OSLM_ASSERT("Picker '" << pickerId << "' not found",
+            pickerId.empty() ||  ( !pickerId.empty() && m_pickers.count(pickerId) == 1));
+
+    if ( pickerId.empty() )
+    {
+        return NULL;
+    }
+    return m_pickers[pickerId];
+}
+
+//-----------------------------------------------------------------------------
+
+vtkObject * VtkRenderService::getVtkObject(VtkObjectIdType objectId)
+{
+    OSLM_WARN_IF("vtkObject '" << objectId << "' not found",
+            !(objectId.empty() ||  ( !objectId.empty() && m_vtkObjects.count(objectId) == 1)));
+
+    if ( objectId.empty() )
+    {
+        return NULL;
+    }
+    return m_vtkObjects[objectId];
+}
+
+//-----------------------------------------------------------------------------
+
+} //namespace fwRenderVTK
+
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/factory/new.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/factory/new.cpp
new file mode 100644
index 0000000..60c8655
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/factory/new.cpp
@@ -0,0 +1,26 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include "fwRenderVTK/IVtkRenderWindowInteractorManager.hpp"
+#include "fwRenderVTK/factory/new.hpp"
+
+
+namespace fwRenderVTK
+{
+
+namespace factory
+{
+
+::fwRenderVTK::IVtkRenderWindowInteractorManager::sptr New( const ::fwRenderVTK::registry::KeyType & classname )
+{
+    return ::fwRenderVTK::registry::get()->create(classname);
+}
+
+} // namespace factory
+
+} // namespace fwRenderVTK
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/registry/detail.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/registry/detail.cpp
new file mode 100644
index 0000000..e53e8b3
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/registry/detail.cpp
@@ -0,0 +1,30 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/util/LazyInstantiator.hpp>
+
+#include "fwRenderVTK/registry/detail.hpp"
+
+
+namespace fwRenderVTK
+{
+
+namespace registry
+{
+
+struct FwRenderVTKRegistryInstantiatorTag {} ;
+
+SPTR(Type) get()
+{
+    typedef ::fwCore::util::LazyInstantiator< Type, FwRenderVTKRegistryInstantiatorTag > InstantiatorType;
+    return InstantiatorType::getInstance();
+}
+
+} // namespace registry
+
+} // namespace fwRenderVTK
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Helpers.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Helpers.cpp
new file mode 100644
index 0000000..1c4d45a
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Helpers.cpp
@@ -0,0 +1,139 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <vtkMath.h>
+#include <vtkPoints.h>
+#include <vtkPicker.h>
+#include <vtkAssemblyNode.h>
+#include <vtkRenderer.h>
+#include <vtkCamera.h>
+#include <vtkAssemblyPath.h>
+#include <vtkProp3DCollection.h>
+
+
+#include <fwCore/base.hpp>
+#include "fwRenderVTK/vtk/Helpers.hpp"
+
+namespace fwRenderVTK
+{
+
+namespace vtk
+{
+
+//------------------------------------------------------------------------------
+
+vtkIdType getNearestPointId(vtkPoints* pts, vtkRenderer* renderer)
+{
+    vtkIdType id=-1;
+    double camPosition[3];
+    double distance = VTK_DOUBLE_MAX;
+    renderer->GetActiveCamera()->GetPosition(camPosition);
+
+    for(vtkIdType i = 0; i<pts->GetNumberOfPoints (); i++)
+    {
+        double *point = pts->GetPoint(i);
+        double distancePtCam = vtkMath::Distance2BetweenPoints(point, camPosition);
+
+        if(distancePtCam < distance)
+        {
+            id = i;
+            distance = distancePtCam;
+        }
+    }
+
+    return id;
+}
+
+//------------------------------------------------------------------------------
+
+vtkProp * getNearestPickedProp(vtkAbstractPropPicker *picker, vtkRenderer *renderer)
+{
+    vtkProp   *res       = NULL;
+    vtkPicker *vtkpicker = vtkPicker::SafeDownCast(picker);
+
+    SLM_ASSERT("getNearestPickedProp *need* a picker.", picker);
+    SLM_ASSERT("getNearestPickedProp *need* a renderer.", renderer);
+
+    if (vtkpicker)
+    {
+        vtkIdType id = getNearestPointId(vtkpicker->GetPickedPositions(), renderer);
+
+        if (id>-1 && vtkpicker->GetProp3Ds()->GetNumberOfItems() > id)
+        {
+//          vtkIdType i = id;
+//          vtkAssemblyPath *path = picker->GetPath();
+//          vtkAssemblyNode *node;
+//          path->InitTraversal();
+//          for ( path->InitTraversal(); (node=path->GetNextNode()); )
+//          {
+//              if (--i == 0)
+//              {
+//                  res = node->GetViewProp();
+//                  break;
+//              }
+//          }
+//          vtkAssemblyNode *node = vtkAssemblyNode::SafeDownCast(picker->GetPath()->GetItemAsObject(id));
+//          SLM_ASSERT("vtkAssemblyNode error: not found", node);
+//          res = node->GetViewProp();
+//          SLM_ASSERT("No vtkProp found in picker's path", res);
+
+            res = vtkProp::SafeDownCast(vtkpicker->GetProp3Ds()->GetItemAsObject(id));
+        }
+    }
+    else
+    {
+        res = picker->GetProp3D();
+    }
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+bool getNearestPickedPosition(vtkAbstractPropPicker *picker, vtkRenderer *renderer, double position[3])
+{
+    bool res = false;
+    vtkPicker *vtkpicker = vtkPicker::SafeDownCast(picker);
+
+    SLM_ASSERT("getNearestPickedProp *need* a picker.", picker);
+    SLM_ASSERT("getNearestPickedProp *need* a renderer.", renderer);
+
+    double *point = NULL;
+    if (vtkpicker)
+    {
+        vtkPoints *pts = vtkpicker->GetPickedPositions();
+        vtkIdType id = getNearestPointId(pts, renderer);
+
+        if (id>-1)
+        {
+            point = pts->GetPoint(id);
+        }
+        else
+        {
+            point = vtkpicker->GetPickPosition();
+        }
+    }
+    else
+    {
+        point = picker->GetPickPosition();
+    }
+
+    if(point)
+    {
+        std::copy(point, point + 3, position);
+        res = true;
+    }
+    return res;
+}
+
+//------------------------------------------------------------------------------
+
+} //vtk
+
+} //fwRenderVTK
+
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Instantiator.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Instantiator.cpp
new file mode 100644
index 0000000..70c0433
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/Instantiator.cpp
@@ -0,0 +1,64 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include <fwCore/base.hpp>
+#include <vtkInstantiator.h>
+
+#include "fwRenderVTK/vtk/Instantiator.hpp"
+
+extern vtkObject* vtkInstantiatorfwVtkBoxRepresentationNew();
+extern vtkObject* vtkInstantiatorfwVtkPickerNew();
+extern vtkObject* vtkInstantiatorfwVtkCellPickerNew();
+extern vtkObject* vtkInstantiatorInteractorStyle2DForNegatoNew();
+extern vtkObject* vtkInstantiatorInteractorStyle3DForNegatoNew();
+
+namespace fwRenderVTK {
+
+namespace vtk {
+
+void Instantiator::ClassInitialize()
+{
+    vtkInstantiator::RegisterInstantiator("fwVtkBoxRepresentation", vtkInstantiatorfwVtkBoxRepresentationNew);
+    vtkInstantiator::RegisterInstantiator("fwVtkPicker", vtkInstantiatorfwVtkPickerNew);
+    vtkInstantiator::RegisterInstantiator("fwVtkCellPicker", vtkInstantiatorfwVtkCellPickerNew);
+    vtkInstantiator::RegisterInstantiator("InteractorStyle2DForNegato", vtkInstantiatorInteractorStyle2DForNegatoNew);
+    vtkInstantiator::RegisterInstantiator("InteractorStyle3DForNegato", vtkInstantiatorInteractorStyle3DForNegatoNew);
+
+#ifdef DEBUG
+    vtkObject *o = vtkInstantiator::CreateInstance("fwVtkBoxRepresentation");
+    SLM_ASSERT("Unable to instantiate a fwVtkBoxRepresentation",o);
+    o->Delete();
+
+    o = vtkInstantiator::CreateInstance("fwVtkPicker");
+    SLM_ASSERT("Unable to instantiate a fwVtkPicker",o);
+    o->Delete();
+
+    o = vtkInstantiator::CreateInstance("fwVtkCellPicker");
+    SLM_ASSERT("Unable to instantiate a fwVtkCellPicker",o);
+    o->Delete();
+
+    o = vtkInstantiator::CreateInstance("InteractorStyle2DForNegato");
+    SLM_ASSERT("Unable to instantiate a InteractorStyle2DForNegato",o);
+    o->Delete();
+
+    o = vtkInstantiator::CreateInstance("InteractorStyle3DForNegato");
+    SLM_ASSERT("Unable to instantiate a InteractorStyle3DForNegato",o);
+    o->Delete();
+#endif
+}
+
+void Instantiator::ClassFinalize()
+{
+    vtkInstantiator::UnRegisterInstantiator("fwVtkBoxRepresentation", vtkInstantiatorfwVtkBoxRepresentationNew);
+    vtkInstantiator::UnRegisterInstantiator("fwVtkPicker", vtkInstantiatorfwVtkPickerNew);
+    vtkInstantiator::UnRegisterInstantiator("fwVtkCellPicker", vtkInstantiatorfwVtkCellPickerNew);
+    vtkInstantiator::UnRegisterInstantiator("InteractorStyle2DForNegato", vtkInstantiatorInteractorStyle2DForNegatoNew);
+    vtkInstantiator::UnRegisterInstantiator("InteractorStyle3DForNegato", vtkInstantiatorInteractorStyle3DForNegatoNew);
+}
+} //vtk
+
+} //fwRenderVTK
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle2DForNegato.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle2DForNegato.cpp
new file mode 100644
index 0000000..fcb0462
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle2DForNegato.cpp
@@ -0,0 +1,276 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <vtkCamera.h>
+#include <vtkCallbackCommand.h>
+#include <vtkCommand.h>
+#include <vtkRenderer.h>
+#include <vtkObjectFactory.h>
+#include <vtkRenderWindowInteractor.h>
+
+#include "fwRenderVTK/vtk/InteractorStyle2DForNegato.hpp"
+
+vtkCxxRevisionMacro(InteractorStyle2DForNegato, "$Revision: 1.24 $");
+vtkStandardNewMacro(InteractorStyle2DForNegato);
+
+//------------------------------------------------------------------------------
+
+InteractorStyle2DForNegato::InteractorStyle2DForNegato() :
+    vtkInteractorStyleTrackballCamera()
+{
+}
+
+//------------------------------------------------------------------------------
+
+InteractorStyle2DForNegato::~InteractorStyle2DForNegato()
+{}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnChar()
+{
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+
+    switch (rwi->GetKeyCode())
+    {
+    case 'r' :
+        this->FindPokedRenderer(rwi->GetEventPosition()[0],
+                rwi->GetEventPosition()[1]);
+        this->CurrentRenderer->ResetCamera();
+        rwi->Render();
+        break;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnLeftButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0],
+            this->Interactor->GetEventPosition()[1]);
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    this->GrabFocus(this->EventCallbackCommand);
+    if (this->Interactor->GetShiftKey())
+    {
+        m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+        m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+        this->StartPan();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnRightButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0],
+            this->Interactor->GetEventPosition()[1]);
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    this->GrabFocus(this->EventCallbackCommand);
+
+    m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+    m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+    this->StartDolly();
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnMiddleButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], this->Interactor->GetEventPosition()[1]);
+
+    if (this->CurrentRenderer != NULL)
+    {
+        m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+        m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+        this->StartPan();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnMouseMove()
+{
+    int x = this->Interactor->GetEventPosition()[0];
+    int y = this->Interactor->GetEventPosition()[1];
+
+    m_newPickPoint[0] = this->Interactor->GetEventPosition()[0];
+    m_newPickPoint[1] = this->Interactor->GetEventPosition()[1];
+
+    switch (this->State)
+    {
+    case VTKIS_PAN:
+        this->FindPokedRenderer(x, y);
+        this->Pan();
+        this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+        break;
+    case VTKIS_DOLLY:
+          this->FindPokedRenderer(x, y);
+          this->Dolly();
+          this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+          break;
+    }
+    m_oldPickPoint[0] = m_newPickPoint[0];
+    m_oldPickPoint[1] = m_newPickPoint[1];
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnMouseWheelBackward()
+{
+    if (!this->Interactor->GetShiftKey())
+    {
+        int x = this->Interactor->GetEventPosition()[0];
+        int y = this->Interactor->GetEventPosition()[1];
+        this->FindPokedRenderer(x, y);
+        this->GrabFocus(this->EventCallbackCommand);
+        this->StartDolly();
+        double factor = this->MotionFactor * -0.2 * this->MouseWheelMotionFactor;
+        this->Dolly(pow(1.1, factor));
+        this->EndDolly();
+        this->ReleaseFocus();
+    }
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::OnMouseWheelForward()
+{
+    if (!this->Interactor->GetShiftKey())
+    {
+        int x = this->Interactor->GetEventPosition()[0];
+        int y = this->Interactor->GetEventPosition()[1];
+        this->FindPokedRenderer(x, y);
+        this->GrabFocus(this->EventCallbackCommand);
+        this->StartDolly();
+        double factor = this->MotionFactor * 0.2 * this->MouseWheelMotionFactor;
+        this->Dolly(pow(1.1, factor));
+        this->EndDolly();
+        this->ReleaseFocus();
+    }
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::Pan()
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    // do nothing if mouse is still on the same pos
+    if( (m_newPickPoint[0] == m_oldPickPoint[0]) &&
+            (m_newPickPoint[1] == m_oldPickPoint[1]) )
+    {
+        return;
+    }
+
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+    double viewFocus[4], focalDepth, viewPoint[3];
+    double newPickPoint[4], oldPickPoint[4];
+    double motionVector[3];
+
+    // Calculate the focal depth since we'll be using it a lot
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    camera->GetFocalPoint(viewFocus);
+    this->ComputeWorldToDisplay(viewFocus[0], viewFocus[1], viewFocus[2],
+            viewFocus);
+    focalDepth = viewFocus[2];
+
+    this->ComputeDisplayToWorld( m_newPickPoint[0],
+            m_newPickPoint[1],
+            focalDepth,
+            newPickPoint);
+
+    // Has to recalc old mouse point since the viewport has moved,
+    // so can't move it outside the loop
+    this->ComputeDisplayToWorld(m_oldPickPoint[0],
+            m_oldPickPoint[1],
+            focalDepth,
+            oldPickPoint);
+
+    // Camera motion is reversed
+    motionVector[0] = oldPickPoint[0] - newPickPoint[0];
+    motionVector[1] = oldPickPoint[1] - newPickPoint[1];
+    motionVector[2] = oldPickPoint[2] - newPickPoint[2];
+
+    camera->GetFocalPoint(viewFocus);
+    camera->GetPosition(viewPoint);
+
+    camera->SetFocalPoint(motionVector[0] + viewFocus[0],
+            motionVector[1] + viewFocus[1],
+            motionVector[2] + viewFocus[2]);
+
+    camera->SetPosition(motionVector[0] + viewPoint[0],
+            motionVector[1] + viewPoint[1],
+            motionVector[2] + viewPoint[2]);
+
+    if (rwi->GetLightFollowCamera())
+    {
+        this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
+    }
+    rwi->Render();
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::Dolly()
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+    if( (m_newPickPoint[0] == m_oldPickPoint[0]) &&
+            (m_newPickPoint[1] == m_oldPickPoint[1]) )
+    {
+        return;
+    }
+    double *center = this->CurrentRenderer->GetCenter();
+    int dy = m_newPickPoint[1] - m_oldPickPoint[1];
+    double dyf = this->MotionFactor * dy / center[1];
+    this->Dolly(pow(1.1, dyf));
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle2DForNegato::Dolly(double factor)
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    if (camera->GetParallelProjection())
+    {
+        camera->SetParallelScale(camera->GetParallelScale() / factor);
+    }
+    else
+    {
+        camera->Dolly(factor);
+        if (this->AutoAdjustCameraClippingRange)
+        {
+            this->CurrentRenderer->ResetCameraClippingRange();
+        }
+    }
+
+    if (this->Interactor->GetLightFollowCamera())
+    {
+        this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
+    }
+
+    this->Interactor->Render();
+}
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle3DForNegato.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle3DForNegato.cpp
new file mode 100644
index 0000000..3d0768e
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/InteractorStyle3DForNegato.cpp
@@ -0,0 +1,407 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#include <fwCore/base.hpp>
+
+#include <vtkMath.h>
+#include <vtkCamera.h>
+#include <vtkCallbackCommand.h>
+#include <vtkCommand.h>
+#include <vtkRenderer.h>
+#include <vtkObjectFactory.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderWindow.h>
+#include "vtkCellPicker.h"
+
+#include "fwRenderVTK/vtk/InteractorStyle3DForNegato.hpp"
+
+vtkCxxRevisionMacro(InteractorStyle3DForNegato, "$Revision: 1.24 $");
+vtkStandardNewMacro(InteractorStyle3DForNegato);
+
+//------------------------------------------------------------------------------
+
+InteractorStyle3DForNegato::InteractorStyle3DForNegato() :
+    vtkInteractorStyleTrackballCamera()
+{
+}
+
+//------------------------------------------------------------------------------
+
+InteractorStyle3DForNegato::~InteractorStyle3DForNegato()
+{}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnChar()
+{
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+
+    switch (rwi->GetKeyCode())
+    {
+    case 'r' :
+        this->FindPokedRenderer(rwi->GetEventPosition()[0],
+                rwi->GetEventPosition()[1]);
+        this->CurrentRenderer->ResetCamera();
+        rwi->Render();
+        break;
+    case 'f' :
+    case 'F' :
+    {
+        this->AnimState = VTKIS_ANIM_ON;
+        vtkAssemblyPath *path = NULL;
+        this->FindPokedRenderer(rwi->GetEventPosition()[0],
+                rwi->GetEventPosition()[1]);
+        rwi->GetPicker()->Pick(rwi->GetEventPosition()[0],
+                rwi->GetEventPosition()[1],
+                0.0,
+                this->CurrentRenderer);
+        vtkAbstractPropPicker *picker;
+        if ((picker=vtkAbstractPropPicker::SafeDownCast(rwi->GetPicker())))
+        {
+            path = picker->GetPath();
+        }
+        if (path != NULL)
+        {
+            rwi->FlyTo(this->CurrentRenderer, picker->GetPickPosition());
+        }
+        this->AnimState = VTKIS_ANIM_OFF;
+    }
+    break;
+
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnKeyUp()
+{
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+
+    switch (rwi->GetKeyCode())
+    {
+    case 'q' :
+        OnLeftButtonUp();
+        break;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnKeyDown()
+{
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+
+    switch (rwi->GetKeyCode())
+    {
+    case 'q' :
+        OnLeftButtonDown();
+        break;
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnLeftButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0],
+            this->Interactor->GetEventPosition()[1]);
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    this->GrabFocus(this->EventCallbackCommand);
+    m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+    m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+
+    if (this->Interactor->GetShiftKey())
+    {
+        this->StartRotate();
+    }
+    else
+    {
+        if (this->Interactor->GetControlKey())
+        {
+            // press Ctrl key
+            this->StartSpin();
+        }
+        else
+        {
+            this->StartRotate();
+        }
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnRightButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0],
+            this->Interactor->GetEventPosition()[1]);
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    this->GrabFocus(this->EventCallbackCommand);
+
+    m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+    m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+    this->StartDolly();
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnMiddleButtonDown()
+{
+    this->FindPokedRenderer(this->Interactor->GetEventPosition()[0], this->Interactor->GetEventPosition()[1]);
+
+    if (this->CurrentRenderer != NULL)
+    {
+        m_oldPickPoint[0] = this->Interactor->GetEventPosition()[0];
+        m_oldPickPoint[1] = this->Interactor->GetEventPosition()[1];
+        this->StartPan();
+    }
+}
+
+//------------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnMouseMove()
+{
+    int x = this->Interactor->GetEventPosition()[0];
+    int y = this->Interactor->GetEventPosition()[1];
+
+    m_newPickPoint[0] = this->Interactor->GetEventPosition()[0];
+    m_newPickPoint[1] = this->Interactor->GetEventPosition()[1];
+
+    switch (this->State)
+    {
+    case VTKIS_ROTATE:
+        this->FindPokedRenderer(x, y);
+        this->Rotate();
+        this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+        break;
+
+    case VTKIS_PAN:
+        this->FindPokedRenderer(x, y);
+        this->Pan();
+        this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+        break;
+
+    case VTKIS_DOLLY:
+        this->FindPokedRenderer(x, y);
+        this->Dolly();
+        this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+        break;
+
+    case VTKIS_SPIN:
+        this->FindPokedRenderer(x, y);
+        this->Spin();
+        this->InvokeEvent(vtkCommand::InteractionEvent, NULL);
+        break;
+    }
+    m_oldPickPoint[0] = m_newPickPoint[0];
+    m_oldPickPoint[1] = m_newPickPoint[1];
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnMouseWheelBackward()
+{
+    if (!this->Interactor->GetShiftKey())
+    {
+        this->GrabFocus(this->EventCallbackCommand);
+        this->StartDolly();
+        double factor = this->MotionFactor * -0.2 * this->MouseWheelMotionFactor;
+        this->Dolly(pow(1.1, factor));
+        this->EndDolly();
+        this->ReleaseFocus();
+    }
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::OnMouseWheelForward()
+{
+    if (!this->Interactor->GetShiftKey())
+    {
+        this->GrabFocus(this->EventCallbackCommand);
+        this->StartDolly();
+        double factor = this->MotionFactor * 0.2 * this->MouseWheelMotionFactor;
+        this->Dolly(pow(1.1, factor));
+        this->EndDolly();
+        this->ReleaseFocus();
+    }
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::Pan()
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    // do nothing if mouse is still on the same pos
+    if( (m_newPickPoint[0] == m_oldPickPoint[0]) &&
+            (m_newPickPoint[1] == m_oldPickPoint[1]) )
+    {
+        return;
+    }
+
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+    double viewFocus[4], focalDepth, viewPoint[3];
+    double newPickPoint[4], oldPickPoint[4];
+    double motionVector[3];
+
+    // Calculate the focal depth since we'll be using it a lot
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    camera->GetFocalPoint(viewFocus);
+    this->ComputeWorldToDisplay(viewFocus[0], viewFocus[1], viewFocus[2],
+            viewFocus);
+    focalDepth = viewFocus[2];
+
+    this->ComputeDisplayToWorld( m_newPickPoint[0],
+            m_newPickPoint[1],
+            focalDepth,
+            newPickPoint);
+
+    // Has to recalc old mouse point since the viewport has moved,
+    // so can't move it outside the loop
+    this->ComputeDisplayToWorld(m_oldPickPoint[0],
+            m_oldPickPoint[1],
+            focalDepth,
+            oldPickPoint);
+
+    // Camera motion is reversed
+    motionVector[0] = oldPickPoint[0] - newPickPoint[0];
+    motionVector[1] = oldPickPoint[1] - newPickPoint[1];
+    motionVector[2] = oldPickPoint[2] - newPickPoint[2];
+
+    camera->GetFocalPoint(viewFocus);
+    camera->GetPosition(viewPoint);
+
+    camera->SetFocalPoint(motionVector[0] + viewFocus[0],
+            motionVector[1] + viewFocus[1],
+            motionVector[2] + viewFocus[2]);
+
+    camera->SetPosition(motionVector[0] + viewPoint[0],
+            motionVector[1] + viewPoint[1],
+            motionVector[2] + viewPoint[2]);
+
+    if (rwi->GetLightFollowCamera())
+    {
+        this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
+    }
+    rwi->Render();
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::Dolly()
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+    if( (m_newPickPoint[0] == m_oldPickPoint[0]) &&
+            (m_newPickPoint[1] == m_oldPickPoint[1]) )
+    {
+        return;
+    }
+    double *center = this->CurrentRenderer->GetCenter();
+    int dy = m_newPickPoint[1] - m_oldPickPoint[1];
+    double dyf = this->MotionFactor * dy / center[1];
+    this->Dolly(pow(1.1, dyf));
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::Dolly(double factor)
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    if (camera->GetParallelProjection())
+    {
+        camera->SetParallelScale(camera->GetParallelScale() / factor);
+    }
+    else
+    {
+        camera->Dolly(factor);
+        if (this->AutoAdjustCameraClippingRange)
+        {
+            this->CurrentRenderer->ResetCameraClippingRange();
+        }
+    }
+
+    if (this->Interactor->GetLightFollowCamera())
+    {
+        this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
+    }
+
+    this->Interactor->Render();
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::Rotate()
+{
+    if (this->CurrentRenderer == NULL)
+    {
+        return;
+    }
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+    int dx = m_newPickPoint[0] - m_oldPickPoint[0];
+    int dy = m_newPickPoint[1] - m_oldPickPoint[1];
+    int *size = this->CurrentRenderer->GetRenderWindow()->GetSize();
+    double delta_elevation = -20.0 / size[1];
+    double delta_azimuth = -20.0 / size[0];
+    double rxf = dx * delta_azimuth * this->MotionFactor;
+    double ryf = dy * delta_elevation * this->MotionFactor;
+
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    camera->Azimuth(rxf);
+    camera->Elevation(ryf);
+    camera->OrthogonalizeViewUp();
+    if (this->AutoAdjustCameraClippingRange)
+    {
+        this->CurrentRenderer->ResetCameraClippingRange();
+    }
+    if (rwi->GetLightFollowCamera())
+    {
+        this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
+    }
+
+    rwi->Render();
+}
+
+//----------------------------------------------------------------------------
+
+void InteractorStyle3DForNegato::Spin()
+{
+    if ( this->CurrentRenderer == NULL )
+    {
+        return;
+    }
+    vtkRenderWindowInteractor *rwi = this->Interactor;
+    double *center = this->CurrentRenderer->GetCenter();
+    double newAngle =
+            vtkMath::DegreesFromRadians( atan2( m_newPickPoint[1] - center[1],
+                    m_newPickPoint[0] - center[0] ) );
+    double oldAngle =
+            vtkMath::DegreesFromRadians( atan2( m_oldPickPoint[1] - center[1],
+                    m_oldPickPoint[0] - center[0] ) );
+    vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
+    camera->Roll( newAngle - oldAngle );
+    camera->OrthogonalizeViewUp();
+
+    rwi->Render();
+}
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.cpp
new file mode 100644
index 0000000..1c83fb1
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/MarkedSphereHandleRepresentation.cpp
@@ -0,0 +1,193 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+
+#include "vtkAssemblyPath.h"
+#include "vtkCellPicker.h"
+#include "vtkCamera.h"
+#include "vtkCleanPolyData.h"
+#include "vtkCoordinate.h"
+#include "vtkCylinderSource.h"
+#include "vtkFollower.h"
+#include "vtkInteractorObserver.h"
+#include "vtkLine.h"
+#include "vtkMath.h"
+#include "vtkObjectFactory.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkPolyDataNormals.h"
+#include "vtkProperty.h"
+#include "vtkRenderer.h"
+#include "vtkRenderWindow.h"
+
+
+#include "fwRenderVTK/vtk/MarkedSphereHandleRepresentation.hpp"
+
+namespace fwRenderVTK
+{
+
+namespace vtk
+{
+
+vtkCxxRevisionMacro(MarkedSphereHandleRepresentation, "$Revision: 0.0 $");
+vtkStandardNewMacro(MarkedSphereHandleRepresentation);
+
+//----------------------------------------------------------------------
+MarkedSphereHandleRepresentation::MarkedSphereHandleRepresentation() : vtkSphereHandleRepresentation()
+{
+    this->Marker = vtkCylinderSource::New();
+    this->Marker->SetCenter(0.,-1.,0.);
+    this->Marker->SetResolution(64);
+    this->Marker->SetHeight(0.);
+
+    this->CleanPolyData = vtkCleanPolyData::New();
+    this->CleanPolyData->PointMergingOn();
+    this->CleanPolyData->CreateDefaultLocator();
+    this->CleanPolyData->SetInputConnection(0, this->Marker->GetOutputPort(0));
+
+    vtkPolyDataNormals *MarkerNormals = vtkPolyDataNormals::New();
+    MarkerNormals->SetInputConnection( 0, this->CleanPolyData->GetOutputPort(0) );
+
+    this->MarkerMapper = vtkPolyDataMapper::New();
+    this->MarkerMapper->SetInput( MarkerNormals->GetOutput() );
+    MarkerNormals->Delete();
+
+    this->Follower = vtkFollower::New();
+    this->Follower->SetMapper(this->MarkerMapper);
+    this->Follower->RotateX(90);
+
+    // Set up the initial properties, parent's one is called in parent's constructor
+    this->CreateDefaultProperties();
+
+    this->MarkerRadiusFactor = 1.5;
+    this->SetMarkerProperty(this->MarkerProperty);
+    this->Marker->SetRadius(this->MarkerRadiusFactor * this->Sphere->GetRadius());
+}
+
+//----------------------------------------------------------------------
+MarkedSphereHandleRepresentation::~MarkedSphereHandleRepresentation()
+{
+  this->Marker->Delete();
+  this->CleanPolyData->Delete();
+  this->MarkerMapper->Delete();
+  this->Follower->Delete();
+  this->MarkerProperty->Delete();
+}
+
+//-------------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::SetWorldPosition(double p[3])
+{
+  this->vtkSphereHandleRepresentation::SetWorldPosition(p);
+  this->Follower->SetPosition(this->GetWorldPosition());// p may have been clamped
+}
+
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::CreateDefaultProperties()
+{
+    this->MarkerProperty = vtkProperty::New();
+    this->MarkerProperty->SetColor(1., 1., 0.);
+    this->MarkerProperty->SetOpacity(0.5);
+}
+
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::BuildRepresentation()
+{
+  // The net effect is to resize the handle
+//  if ( this->GetMTime() > this->BuildTime ||
+//       (this->Renderer && this->Renderer->GetVTKWindow() &&
+//        this->Renderer->GetVTKWindow()->GetMTime() > this->BuildTime) )
+//  {
+      if ( ! this->Placed )
+      {
+          this->ValidPick = 1;
+          this->Placed = 1;
+      }
+
+      this->SizeBounds();
+      this->Sphere->Update();
+
+      this->Follower->SetCamera( this->GetRenderer()->GetActiveCamera() );
+      this->Marker->SetRadius(this->MarkerRadiusFactor * this->Sphere->GetRadius() );
+      this->Marker->Update();
+      this->BuildTime.Modified();
+//  }
+
+}
+//
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::GetActors(vtkPropCollection *pc)
+{
+  this->Actor->GetActors(pc);
+  this->Follower->GetActors(pc);
+}
+
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::ReleaseGraphicsResources(vtkWindow *win)
+{
+  this->Actor->ReleaseGraphicsResources(win);
+  this->Follower->ReleaseGraphicsResources(win);
+}
+
+//----------------------------------------------------------------------
+int MarkedSphereHandleRepresentation::RenderOpaqueGeometry(vtkViewport *viewport)
+{
+  this->BuildRepresentation();
+  int ret = 0;
+  if (this->GetRenderer()->GetActiveCamera()->GetParallelProjection())
+  {
+      ret = this->Follower->RenderOpaqueGeometry(viewport);
+  }
+  return this->Actor->RenderOpaqueGeometry(viewport) + ret;
+}
+
+//----------------------------------------------------------------------
+int MarkedSphereHandleRepresentation::RenderTranslucentPolygonalGeometry(vtkViewport *viewport)
+{
+  this->BuildRepresentation();
+  int ret = 0;
+  if (this->GetRenderer()->GetActiveCamera()->GetParallelProjection())
+  {
+     ret = this->Follower->RenderTranslucentPolygonalGeometry(viewport);
+  }
+  return this->Actor->RenderTranslucentPolygonalGeometry(viewport) + ret;
+}
+
+//----------------------------------------------------------------------
+int MarkedSphereHandleRepresentation::HasTranslucentPolygonalGeometry()
+{
+    return 1;
+}
+
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::SetMarkerProperty(vtkProperty * p)
+{
+    vtkSetObjectBodyMacro(MarkerProperty, vtkProperty, p);
+    if (p)
+    {
+        this->Follower->SetProperty( p );
+    }
+}
+
+//----------------------------------------------------------------------
+void MarkedSphereHandleRepresentation::PrintSelf(ostream& os, vtkIndent indent)
+{
+    this->vtkSphereHandleRepresentation::PrintSelf(os,indent);
+
+    if ( this->MarkerProperty )
+    {
+        os << indent << "Selected Property: " << this->MarkerProperty << "\n";
+    }
+    else
+    {
+        os << indent << "Marker Property: (none)\n";
+    }
+
+    this->Sphere->PrintSelf(os,indent.GetNextIndent());
+}
+
+} // namespace vtk
+
+} // namespace fwRenderVTK
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkBoxRepresentation.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkBoxRepresentation.cpp
new file mode 100644
index 0000000..de8caf2
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkBoxRepresentation.cpp
@@ -0,0 +1,163 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   Patched version of vtkBoxRepresentation,
+   see http://public.kitware.com/pipermail/vtkusers/2010-July/110328.html
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ =========================================================================*/
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: fwVtkBoxRepresentation.cxx,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include <vtkBoxRepresentation.h>
+#include <vtkActor.h>
+#include <vtkSphereSource.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkPolyData.h>
+#include <vtkCallbackCommand.h>
+#include <vtkBox.h>
+#include <vtkPolyData.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkInteractorObserver.h>
+#include <vtkMath.h>
+#include <vtkCellArray.h>
+#include <vtkCellPicker.h>
+#include <vtkTransform.h>
+#include <vtkDoubleArray.h>
+#include <vtkBox.h>
+#include <vtkPlanes.h>
+#include <vtkCamera.h>
+#include <vtkAssemblyPath.h>
+#include <vtkWindow.h>
+#include <vtkObjectFactory.h>
+
+#include "fwRenderVTK/vtk/fwVtkBoxRepresentation.hpp"
+
+vtkCxxRevisionMacro(fwVtkBoxRepresentation, "$Revision: 1.9 $");
+vtkStandardNewMacro(fwVtkBoxRepresentation);
+
+//----------------------------------------------------------------------------
+fwVtkBoxRepresentation::fwVtkBoxRepresentation() : vtkBoxRepresentation()
+{
+  // Enable/disable the translation, rotation, and scaling of the widget
+  this->TranslationEnabled = 1;
+  this->RotationEnabled = 1;
+  this->ScalingEnabled = 1;
+}
+
+//----------------------------------------------------------------------
+void fwVtkBoxRepresentation::WidgetInteraction(double e[2])
+{
+  // Convert events to appropriate coordinate systems
+  vtkCamera *camera = this->Renderer->GetActiveCamera();
+  if ( !camera )
+    {
+    return;
+    }
+  double focalPoint[4], pickPoint[4], prevPickPoint[4];
+  double z, vpn[3];
+  camera->GetViewPlaneNormal(vpn);
+
+  // Compute the two points defining the motion vector
+  double pos[3];
+  if ( this->LastPicker == this->HexPicker )
+    {
+    this->HexPicker->GetPickPosition(pos);
+    }
+  else
+    {
+    this->HandlePicker->GetPickPosition(pos);
+    }
+  vtkInteractorObserver::ComputeWorldToDisplay(this->Renderer,
+                                               pos[0], pos[1], pos[2],
+                                               focalPoint);
+  z = focalPoint[2];
+  vtkInteractorObserver::ComputeDisplayToWorld(this->Renderer,this->LastEventPosition[0],
+                                               this->LastEventPosition[1], z, prevPickPoint);
+  vtkInteractorObserver::ComputeDisplayToWorld(this->Renderer, e[0], e[1], z, pickPoint);
+
+  // Process the motion
+  if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF0 )
+    {
+    this->MoveMinusXFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF1 )
+    {
+    this->MovePlusXFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF2 )
+    {
+    this->MoveMinusYFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF3 )
+    {
+    this->MovePlusYFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF4 )
+    {
+    this->MoveMinusZFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::MoveF5 )
+    {
+    this->MovePlusZFace(prevPickPoint,pickPoint);
+    }
+
+  else if ( this->TranslationEnabled && this->InteractionState == fwVtkBoxRepresentation::Translating )
+    {
+    this->Translate(prevPickPoint, pickPoint);
+    }
+
+  else if ( this->ScalingEnabled && this->InteractionState == fwVtkBoxRepresentation::Scaling )
+    {
+    this->Scale(prevPickPoint, pickPoint,
+                static_cast<int>(e[0]), static_cast<int>(e[1]));
+    }
+
+  else if ( this->RotationEnabled && this->InteractionState == fwVtkBoxRepresentation::Rotating )
+    {
+    this->Rotate(static_cast<int>(e[0]), static_cast<int>(e[1]), prevPickPoint, pickPoint, vpn);
+    }
+
+  // Store the start position
+  this->LastEventPosition[0] = e[0];
+  this->LastEventPosition[1] = e[1];
+  this->LastEventPosition[2] = 0.0;
+}
+
+//----------------------------------------------------------------------------
+void fwVtkBoxRepresentation::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os,indent);
+
+  os << indent << "Translation Enabled: " << (this->TranslationEnabled ? "On\n" : "Off\n");
+  os << indent << "Scaling Enabled: " << (this->ScalingEnabled ? "On\n" : "Off\n");
+  os << indent << "Rotation Enabled: " << (this->RotationEnabled ? "On\n" : "Off\n");
+}
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkCellPicker.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkCellPicker.cpp
new file mode 100644
index 0000000..89874ad
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkCellPicker.cpp
@@ -0,0 +1,241 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   fw version of vtkCellPicked : same a vtk5.4's cellpicker,
+   but inherits from fwVtkPicker.
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ =========================================================================*/
+
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: fwVtkCellPicker.cxx,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include <boost/assign.hpp>
+
+#include <vtkGenericCell.h>
+#include <vtkImageData.h>
+#include <vtkMapper.h>
+#include <vtkMath.h>
+#include <vtkPolyData.h>
+#include <vtkObjectFactory.h>
+#include <vtkAbstractVolumeMapper.h>
+#include <vtkInstantiator.h>
+
+#include <fwVtkIO/vtk.hpp>
+#include "fwRenderVTK/vtk/fwVtkCellPicker.hpp"
+
+vtkCxxRevisionMacro(fwVtkCellPicker, "$Revision: 1.38 $");
+vtkStandardNewMacro(fwVtkCellPicker);
+
+
+//------------------------------------------------------------------------------
+
+fwVtkCellPicker::fwVtkCellPicker()
+{
+    this->CellId = -1;
+    this->SubId = -1;
+    for (int i=0; i<3; i++)
+    {
+        this->PCoords[i] = 0.0;
+    }
+    this->Cell = vtkGenericCell::New();
+}
+
+//------------------------------------------------------------------------------
+
+fwVtkCellPicker::~fwVtkCellPicker()
+{
+    this->Cell->Delete();
+}
+
+//------------------------------------------------------------------------------
+
+double fwVtkCellPicker::IntersectWithLine(double p1[3], double p2[3], double tol,
+                                       vtkAssemblyPath *path,
+                                       vtkProp3D *prop3D,
+                                       vtkAbstractMapper3D *m)
+{
+    vtkIdType numCells, cellId, minCellId;
+    int i, minSubId, subId;
+    double x[3], tMin, t, pcoords[3], minXYZ[3], minPcoords[3];
+    vtkDataSet *input;
+    vtkMapper *mapper;
+    vtkAbstractVolumeMapper *volumeMapper;
+
+    // Get the underlying dataset
+    if ( (mapper=vtkMapper::SafeDownCast(m)) != NULL )
+    {
+        input = mapper->GetInput();
+    }
+    else if ( (volumeMapper=vtkAbstractVolumeMapper::SafeDownCast(m)) != NULL )
+    {
+        input = volumeMapper->GetDataSetInput();
+    }
+    else
+    {
+        return VTK_DOUBLE_MAX;
+    }
+
+    if ( (numCells = input->GetNumberOfCells()) < 1 )
+    {
+        return 2.0;
+    }
+
+    // Intersect each cell with ray.  Keep track of one closest to
+    // the eye (within the tolerance tol) and within the clipping range).
+    // Note that we fudge the "closest to" (tMin+this->Tolerance) a little and
+    // keep track of the cell with the best pick based on parametric
+    // coordinate (pick the minimum, maximum parametric distance). This
+    // breaks ties in a reasonable way when cells are the same distance
+    // from the eye (like cells lying on a 2D plane).
+    //
+    minCellId = -1;
+    minSubId = -1;
+    pcoords[0] = pcoords[1] = pcoords[2] = 0;
+    double pDistMin=VTK_DOUBLE_MAX, pDist;
+    for (tMin=VTK_DOUBLE_MAX,cellId=0; cellId<numCells; cellId++)
+    {
+        input->GetCell(cellId, this->Cell);
+
+        if ( this->Cell->IntersectWithLine(p1, p2, tol, t, x, pcoords, subId)
+                && t <= (tMin+this->Tolerance) )
+        {
+            pDist = this->Cell->GetParametricDistance(pcoords);
+            if ( pDist < pDistMin || (pDist == pDistMin && t < tMin) )
+            {
+                minCellId = cellId;
+                minSubId = subId;
+                for (i=0; i<3; i++)
+                {
+                    minXYZ[i] = x[i];
+                    minPcoords[i] = pcoords[i];
+                }
+                tMin = t;
+                pDistMin = pDist;
+            }//if minimum, maximum
+        }//if a close cell
+    }//for all cells
+
+    //  Now compare this against other actors.
+    if ( minCellId>(-1) && tMin < this->GlobalTMin )
+    {
+        this->MarkPicked(path, prop3D, m, tMin, minXYZ);
+        this->CellId = minCellId;
+        this->SubId = minSubId;
+        for (i=0; i<3; i++)
+        {
+            this->PCoords[i] = minPcoords[i];
+        }
+        vtkDebugMacro("Picked cell id= " << minCellId);
+    }
+    return tMin;
+}
+
+//------------------------------------------------------------------------------
+
+void fwVtkCellPicker::Initialize()
+{
+    this->CellId = (-1);
+    this->SubId = (-1);
+    for (int i=0; i<3; i++)
+    {
+        this->PCoords[i] = 0.0;
+    }
+    this->fwVtkPicker::Initialize();
+}
+
+//------------------------------------------------------------------------------
+
+void fwVtkCellPicker::PrintSelf(ostream& os, vtkIndent indent)
+{
+    this->Superclass::PrintSelf(os,indent);
+
+    os << indent << "Cell Id: " << this->CellId << "\n";
+    os << indent << "SubId: " << this->SubId << "\n";
+    os << indent << "PCoords: (" << this->PCoords[0] << ", "
+            << this->PCoords[1] << ", " << this->PCoords[2] << ")\n";
+}
+
+//------------------------------------------------------------------------------
+
+fwVtkCellPicker::PickedCellType fwVtkCellPicker::GetPickedCellIds( double p1[3], double p2[3], ::fwData::TriangularMesh::sptr mesh)
+{
+    PickedCellType res;
+
+    vtkPolyData *polydata = fwVtkIO::toVTKMesh(mesh);
+
+    res = this->GetPickedCellIds(p1, p2, polydata);
+
+    polydata->Delete();
+
+    return res;
+}
+
+
+fwVtkCellPicker::PickedCellType fwVtkCellPicker::GetPickedCellIds( double p1[3], double p2[3], vtkPolyData *polydata)
+{
+    PickedCellType res;
+
+    if ( this->PickPolyData(p1,p2, polydata) )
+    {
+        double *intersec = this->GetPickPosition();
+        fwVec3d point;
+
+        for(int i = 0; i<3; i++)
+        {
+            point[i] = intersec[i];
+        }
+        res.push_back( std::make_pair( this->GetCellId(), point) );
+
+
+        double ray[3];
+        double p3a[3];
+        double p3b[3];
+
+        this->GetPickPosition(p3a);
+        this->GetPickPosition(p3b);
+
+        for (int i = 0; i < 3; i++)
+        {
+            ray[i] = p2[i] - p1[i];
+        }
+
+        vtkMath::Normalize(ray);
+
+        for (int i = 0; i < 3; i++)
+        {
+            ray[i] *= 1e-5;
+            p3a[i] -= ray[i];
+            p3b[i] += ray[i];
+        }
+
+
+        boost::assign::push_back(res).range( this->GetPickedCellIds(p1, p3a, polydata) );
+        boost::assign::push_back(res).range( this->GetPickedCellIds(p3b, p2, polydata) );
+
+    }
+
+    return res;
+}
+
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkPicker.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkPicker.cpp
new file mode 100644
index 0000000..e7dd3b5
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkPicker.cpp
@@ -0,0 +1,707 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2012.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+/*=========================================================================
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   Patched version of vtkPicker,
+   see http://www.vtk.org/doc/release/5.4/html/a00996.html
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ =========================================================================*/
+
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    $RCSfile: fwVtkPicker.cxx,v $
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+
+#include <vtkAbstractVolumeMapper.h>
+#include <vtkActor.h>
+#include <vtkAssemblyNode.h>
+#include <vtkAssemblyPath.h>
+#include <vtkBox.h>
+#include <vtkCamera.h>
+#include <vtkCommand.h>
+#include <vtkImageActor.h>
+#include <vtkImageData.h>
+#include <vtkLODProp3D.h>
+#include <vtkMapper.h>
+#include <vtkMath.h>
+#include <vtkObjectFactory.h>
+#include <vtkPoints.h>
+#include <vtkPolyDataMapper.h>
+#include <vtkProp3DCollection.h>
+#include <vtkPropCollection.h>
+#include <vtkProperty.h>
+#include <vtkRenderWindow.h>
+#include <vtkRenderer.h>
+#include <vtkTransform.h>
+#include <vtkVertex.h>
+#include <vtkVolume.h>
+
+#include "fwRenderVTK/vtk/fwVtkPicker.hpp"
+
+vtkCxxRevisionMacro(fwVtkPicker, "$Revision: 1.95 $");
+vtkStandardNewMacro(fwVtkPicker);
+
+// Construct object with initial tolerance of 1/40th of window. There are no
+// pick methods and picking is performed from the renderer's actors.
+fwVtkPicker::fwVtkPicker() : vtkPicker()
+{
+
+}
+
+fwVtkPicker::~fwVtkPicker()
+{
+}
+
+
+// Perform pick operation with selection point provided. Normally the 
+// first two values for the selection point are x-y pixel coordinate, and
+// the third value is =0. Return non-zero if something was successfully picked.
+int fwVtkPicker::Pick(double selectionX, double selectionY, double selectionZ,
+                    vtkRenderer *renderer)
+{
+  int i;
+  vtkProp *prop;
+  vtkCamera *camera;
+  vtkAbstractMapper3D *mapper = NULL;
+  double p1World[4], p2World[4], p1Mapper[4], p2Mapper[4];
+  int picked=0;
+  int *winSize;
+  double x, y, t;
+  double *viewport;
+  double cameraPos[4], cameraFP[4];
+  double *displayCoords, *worldCoords;
+  double *clipRange;
+  double ray[3], rayLength;
+  int pickable;
+  int LODId;
+  double windowLowerLeft[4], windowUpperRight[4];
+  double bounds[6], tol;
+  double tF, tB;
+  double hitPosition[3];
+  double cameraDOP[3];
+  
+  //  Initialize picking process
+  this->Initialize();
+  this->Renderer = renderer;
+  this->SelectionPoint[0] = selectionX;
+  this->SelectionPoint[1] = selectionY;
+  this->SelectionPoint[2] = selectionZ;
+
+  // Invoke start pick method if defined
+  this->InvokeEvent(vtkCommand::StartPickEvent,NULL);
+
+  if ( renderer == NULL )
+    {
+    vtkErrorMacro(<<"Must specify renderer!");
+    return 0;
+    }
+
+  // Get camera focal point and position. Convert to display (screen) 
+  // coordinates. We need a depth value for z-buffer.
+  //
+  camera = renderer->GetActiveCamera();
+  camera->GetPosition(cameraPos);
+  cameraPos[3] = 1.0;
+  camera->GetFocalPoint(cameraFP);
+  cameraFP[3] = 1.0;
+
+  renderer->SetWorldPoint(cameraFP[0],cameraFP[1],cameraFP[2],cameraFP[3]);
+  renderer->WorldToDisplay();
+  displayCoords = renderer->GetDisplayPoint();
+  selectionZ = displayCoords[2];
+
+  // Convert the selection point into world coordinates.
+  //
+  renderer->SetDisplayPoint(selectionX, selectionY, selectionZ);
+  renderer->DisplayToWorld();
+  worldCoords = renderer->GetWorldPoint();
+  if ( worldCoords[3] == 0.0 )
+    {
+    vtkErrorMacro(<<"Bad homogeneous coordinates");
+    return 0;
+    }
+  for (i=0; i < 3; i++) 
+    {
+    this->PickPosition[i] = worldCoords[i] / worldCoords[3];
+    }
+  
+  //  Compute the ray endpoints.  The ray is along the line running from
+  //  the camera position to the selection point, starting where this line
+  //  intersects the front clipping plane, and terminating where this
+  //  line intersects the back clipping plane.
+  for (i=0; i<3; i++)
+    {
+    ray[i] = this->PickPosition[i] - cameraPos[i];
+    }
+  for (i=0; i<3; i++)
+    {
+    cameraDOP[i] = cameraFP[i] - cameraPos[i];
+    }
+
+  vtkMath::Normalize(cameraDOP);
+
+  if (( rayLength = vtkMath::Dot(cameraDOP,ray)) == 0.0 ) 
+    {
+    vtkWarningMacro("Cannot process points");
+    return 0;
+    } 
+
+  clipRange = camera->GetClippingRange();
+
+  if ( camera->GetParallelProjection() )
+    {
+    tF = clipRange[0] - rayLength;
+    tB = clipRange[1] - rayLength;
+    for (i=0; i<3; i++) 
+      {
+      p1World[i] = this->PickPosition[i] + tF*cameraDOP[i];
+      p2World[i] = this->PickPosition[i] + tB*cameraDOP[i];
+      }
+    }
+  else
+    {
+    tF = clipRange[0] / rayLength;
+    tB = clipRange[1] / rayLength;
+    for (i=0; i<3; i++) 
+      {
+      p1World[i] = cameraPos[i] + tF*ray[i];
+      p2World[i] = cameraPos[i] + tB*ray[i];
+      }
+    }
+  p1World[3] = p2World[3] = 1.0;
+
+  // Compute the tolerance in world coordinates.  Do this by
+  // determining the world coordinates of the diagonal points of the
+  // window, computing the width of the window in world coordinates, and 
+  // multiplying by the tolerance.
+  //
+  viewport = renderer->GetViewport();
+  winSize = renderer->GetRenderWindow()->GetSize();
+  x = winSize[0] * viewport[0];
+  y = winSize[1] * viewport[1];
+  renderer->SetDisplayPoint(x, y, selectionZ);
+  renderer->DisplayToWorld();
+  renderer->GetWorldPoint(windowLowerLeft);
+
+  x = winSize[0] * viewport[2];
+  y = winSize[1] * viewport[3];
+  renderer->SetDisplayPoint(x, y, selectionZ);
+  renderer->DisplayToWorld();
+  renderer->GetWorldPoint(windowUpperRight);
+
+  for (tol=0.0,i=0; i<3; i++) 
+    {
+    tol += (windowUpperRight[i] - windowLowerLeft[i]) *
+      (windowUpperRight[i] - windowLowerLeft[i]);
+    }
+  
+  tol = sqrt (tol) * this->Tolerance;
+
+  //  Loop over all props.  Transform ray (defined from position of
+  //  camera to selection point) into coordinates of mapper (not
+  //  transformed to actors coordinates!  Reduces overall computation!!!).
+  //  Note that only vtkProp3D's can be picked by fwVtkPicker.
+  //
+  vtkPropCollection *props;
+  vtkProp *propCandidate;
+  if ( this->PickFromList ) 
+    {
+    props = this->GetPickList();
+    }
+  else 
+    {
+    props = renderer->GetViewProps();
+    }
+
+  vtkActor *actor;
+  vtkLODProp3D *prop3D;
+  vtkVolume *volume;
+  vtkImageActor *imageActor = 0;
+  vtkAssemblyPath *path;
+  vtkProperty *tempProperty;
+  this->Transform->PostMultiply();
+  vtkCollectionSimpleIterator pit;
+  double scale[3];
+  for ( props->InitTraversal(pit); (prop=props->GetNextProp(pit)); )
+    {
+    for ( prop->InitPathTraversal(); (path=prop->GetNextPath()); )
+      {
+      pickable = 0;
+      actor = NULL;
+      propCandidate = path->GetLastNode()->GetViewProp();
+      if ( propCandidate->GetPickable() && propCandidate->GetVisibility() )
+        {
+        pickable = 1;
+        if ( (actor=vtkActor::SafeDownCast(propCandidate)) != NULL )
+          {
+          mapper = actor->GetMapper();
+          if ( actor->GetProperty()->GetOpacity() <= 0.0 )
+            {
+            pickable = 0;
+            }
+          }
+        else if ( (prop3D=vtkLODProp3D::SafeDownCast(propCandidate)) != NULL )
+          {
+          LODId = prop3D->GetPickLODID();
+          mapper = prop3D->GetLODMapper(LODId);
+
+          // if the mapper is a vtkMapper (as opposed to a vtkVolumeMapper), 
+          // then check the transparency to see if the object is pickable
+          if ( vtkMapper::SafeDownCast(mapper) != NULL)
+            {
+            prop3D->GetLODProperty(LODId, &tempProperty);
+            if ( tempProperty->GetOpacity() <= 0.0 )
+              {
+              pickable = 0;
+              }
+            }
+          }
+        else if ( (volume=vtkVolume::SafeDownCast(propCandidate)) != NULL )
+          {
+          mapper = volume->GetMapper();
+          }
+        else if ( (imageActor=vtkImageActor::SafeDownCast(propCandidate)) )
+          {
+          mapper = 0;
+          }
+        else 
+          {
+          pickable = 0; //only vtkProp3D's (actors and volumes) can be picked
+          }
+        }
+
+      //  If actor can be picked, get its composite matrix, invert it, and
+      //  use the inverted matrix to transform the ray points into mapper
+      //  coordinates. 
+      if ( pickable  &&  mapper != NULL )
+        {
+        vtkMatrix4x4 *lastMatrix = path->GetLastNode()->GetMatrix();
+        if (lastMatrix == NULL)
+          {
+          vtkErrorMacro (<< "Pick: Null matrix.");
+          return 0;
+          }
+        this->Transform->SetMatrix(lastMatrix);
+        this->Transform->Push();
+        this->Transform->Inverse();
+        this->Transform->GetScale(scale); //need to scale the tolerance
+
+        this->Transform->TransformPoint(p1World,p1Mapper);
+        this->Transform->TransformPoint(p2World,p2Mapper);
+
+        for (i=0; i<3; i++) 
+          {
+          ray[i] = p2Mapper[i] - p1Mapper[i];
+          }
+
+        this->Transform->Pop();
+
+        //  Have the ray endpoints in mapper space, now need to compare this
+        //  with the mapper bounds to see whether intersection is possible.
+        //
+        //  Get the bounding box of the modeller.  Note that the tolerance is
+        //  added to the bounding box to make sure things on the edge of the
+        //  bounding box are picked correctly.
+        mapper->GetBounds(bounds);
+        bounds[0] -= tol; bounds[1] += tol; 
+        bounds[2] -= tol; bounds[3] += tol; 
+        bounds[4] -= tol; bounds[5] += tol; 
+        if ( vtkBox::IntersectBox(bounds, p1Mapper, 
+                                  ray, hitPosition, t) )
+          {
+          t = this->IntersectWithLine(p1Mapper, p2Mapper, 
+                                      tol*0.333*(scale[0]+scale[1]+scale[2]), path, 
+                                      static_cast<vtkProp3D *>(propCandidate), mapper);
+          if ( t < VTK_DOUBLE_MAX )
+            {
+            picked = 1;
+            if ( ! this->Prop3Ds->IsItemPresent(prop) )
+              {
+              this->Prop3Ds->AddItem(static_cast<vtkProp3D *>(prop));
+              }
+            this->PickedPositions->InsertNextPoint
+              ((1.0 - t)*p1World[0] + t*p2World[0],
+               (1.0 - t)*p1World[1] + t*p2World[1],
+               (1.0 - t)*p1World[2] + t*p2World[2]);
+
+            // backwards compatibility: also add to this->Actors
+            if (actor)
+              {
+              this->Actors->AddItem(actor);
+              }
+            }
+          }
+        }
+      else if ( pickable && imageActor )
+        { // special case for imageActor, which has no mapper
+        vtkMatrix4x4 *lastMatrix = path->GetLastNode()->GetMatrix();
+        if (lastMatrix == NULL)
+          {
+          vtkErrorMacro (<< "Pick: Null matrix.");
+          return 0;
+          }
+        this->Transform->SetMatrix(lastMatrix);
+        this->Transform->Push();
+        this->Transform->Inverse();
+
+        this->Transform->TransformPoint(p1World,p1Mapper);
+        this->Transform->TransformPoint(p2World,p2Mapper);
+
+        this->Transform->Pop();
+
+        //  Have the ray endpoints in data space, now need to compare this
+        //  with the displayed image bounds.
+        imageActor->GetDisplayBounds(bounds);
+
+        t = VTK_DOUBLE_MAX;
+
+        for (i = 0; i < 3; i++)
+          {
+          if (bounds[2*i] == bounds[2*i+1] && p2Mapper[i] != p1Mapper[i])
+            {
+//            t = (p2World[i] - bounds[2*i])/(p2Mapper[i] - p1Mapper[i]);
+            t = (p2Mapper[i] - bounds[2*i])/(p2Mapper[i] - p1Mapper[i]);
+            break;
+            }
+          }
+
+        if (t < VTK_DOUBLE_MAX)
+          {
+//          hitPosition[0] = (1.0 - t)*p1Mapper[0] + t*p2Mapper[0];
+//          hitPosition[1] = (1.0 - t)*p1Mapper[1] + t*p2Mapper[1];
+//          hitPosition[2] = (1.0 - t)*p1Mapper[2] + t*p2Mapper[2];
+            hitPosition[0] = t*p1Mapper[0] + (1.0 - t)*p2Mapper[0];
+            hitPosition[1] = t*p1Mapper[1] + (1.0 - t)*p2Mapper[1];
+            hitPosition[2] = t*p1Mapper[2] + (1.0 - t)*p2Mapper[2];
+          if ((bounds[0] == bounds[1] || (hitPosition[0] >= bounds[0]-tol &&
+                                          hitPosition[0] <= bounds[1]+tol)) &&
+              (bounds[2] == bounds[3] || (hitPosition[1] >= bounds[2]-tol &&
+                                          hitPosition[1] <= bounds[3]+tol)) &&
+              (bounds[4] == bounds[5] || (hitPosition[2] >= bounds[4]-tol &&
+                                          hitPosition[2] <= bounds[5]+tol)))
+            {
+            picked = 1;
+
+            // the following code is handled in MarkPicked for other Prop3Ds
+            this->Mapper = mapper; // mapper is null
+            this->DataSet = imageActor->GetInput();
+            this->MapperPosition[0] = hitPosition[0];
+            this->MapperPosition[1] = hitPosition[1];
+            this->MapperPosition[2] = hitPosition[2];
+            this->Transform->TransformPoint(hitPosition,this->PickPosition);
+            imageActor->Pick();
+            this->InvokeEvent(vtkCommand::PickEvent,NULL);
+
+            this->Prop3Ds->AddItem(imageActor);
+//            this->PickedPositions->InsertNextPoint
+//              ((1.0 - t)*p1World[0] + t*p2World[0],
+//               (1.0 - t)*p1World[1] + t*p2World[1],
+//               (1.0 - t)*p1World[2] + t*p2World[2]);
+            this->PickedPositions->InsertNextPoint
+                (t*p1World[0] + (1.0 - t)*p2World[0],
+                 t*p1World[1] + (1.0 - t)*p2World[1],
+                 t*p1World[2] + (1.0 - t)*p2World[2]);
+            }
+          }
+        }//if visible and pickable not transparent and has mapper
+      }//for all parts
+    }//for all actors
+
+  // Invoke end pick method if defined
+  this->InvokeEvent(vtkCommand::EndPickEvent,NULL);
+
+  return picked;
+}
+
+
+
+int fwVtkPicker::PickPolyData( double p1[3], double p2[3], vtkPolyData *polydata)
+{
+
+    vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
+    vtkActor *actor = vtkActor::New();
+    vtkPropCollection *props = vtkPropCollection::New();
+
+    mapper->SetInput(polydata);
+    actor->SetMapper(mapper);
+    props->AddItem(actor);
+
+    int res = Pick( p1, p2, props );
+
+    props->Delete();
+    mapper->Delete();
+    actor->Delete();
+
+    return res;
+}
+
+
+
+
+// Perform pick operation with selection point provided. Normally the 
+// first two values for the selection point are x-y pixel coordinate, and
+// the third value is =0. Return non-zero if something was successfully picked.
+int fwVtkPicker::Pick( double p1[3], double p2[3], vtkPropCollection *props)
+{
+  int i;
+  vtkProp *prop;
+  vtkAbstractMapper3D *mapper = NULL;
+  double p1World[4], p2World[4], p1Mapper[4], p2Mapper[4];
+  int picked=0;
+  double t;
+  double ray[3];
+  int pickable;
+  int LODId;
+  double bounds[6];
+  double hitPosition[3];
+  
+  double tol = this->Tolerance;
+
+  //  Initialize picking process
+  this->Initialize();
+
+  // Invoke start pick method if defined
+  this->InvokeEvent(vtkCommand::StartPickEvent,NULL);
+
+  std::copy(p1,p1+3,p1World);
+  std::copy(p2,p2+3,p2World);
+
+  p1World[3] = p2World[3] = 1.0;
+
+  //  Loop over all props.  Transform ray (defined from position of
+  //  camera to selection point) into coordinates of mapper (not
+  //  transformed to actors coordinates!  Reduces overall computation!!!).
+  //  Note that only vtkProp3D's can be picked by fwVtkPicker.
+  //
+  vtkProp *propCandidate;
+
+  vtkActor *actor;
+  vtkLODProp3D *prop3D;
+  vtkVolume *volume;
+  vtkImageActor *imageActor = 0;
+  vtkAssemblyPath *path;
+  vtkProperty *tempProperty;
+  this->Transform->PostMultiply();
+  vtkCollectionSimpleIterator pit;
+  double scale[3];
+  for ( props->InitTraversal(pit); (prop=props->GetNextProp(pit)); )
+    {
+    for ( prop->InitPathTraversal(); (path=prop->GetNextPath()); )
+      {
+      pickable = 0;
+      actor = NULL;
+      propCandidate = path->GetLastNode()->GetViewProp();
+      if ( propCandidate->GetPickable() && propCandidate->GetVisibility() )
+        {
+        pickable = 1;
+        if ( (actor=vtkActor::SafeDownCast(propCandidate)) != NULL )
+          {
+          mapper = actor->GetMapper();
+          if ( actor->GetProperty()->GetOpacity() <= 0.0 )
+            {
+            pickable = 0;
+            }
+          }
+        else if ( (prop3D=vtkLODProp3D::SafeDownCast(propCandidate)) != NULL )
+          {
+          LODId = prop3D->GetPickLODID();
+          mapper = prop3D->GetLODMapper(LODId);
+
+          // if the mapper is a vtkMapper (as opposed to a vtkVolumeMapper), 
+          // then check the transparency to see if the object is pickable
+          if ( vtkMapper::SafeDownCast(mapper) != NULL)
+            {
+            prop3D->GetLODProperty(LODId, &tempProperty);
+            if ( tempProperty->GetOpacity() <= 0.0 )
+              {
+              pickable = 0;
+              }
+            }
+          }
+        else if ( (volume=vtkVolume::SafeDownCast(propCandidate)) != NULL )
+          {
+          mapper = volume->GetMapper();
+          }
+        else if ( (imageActor=vtkImageActor::SafeDownCast(propCandidate)) )
+          {
+          mapper = 0;
+          }
+        else 
+          {
+          pickable = 0; //only vtkProp3D's (actors and volumes) can be picked
+          }
+        }
+
+      //  If actor can be picked, get its composite matrix, invert it, and
+      //  use the inverted matrix to transform the ray points into mapper
+      //  coordinates. 
+      if ( pickable  &&  mapper != NULL )
+        {
+        vtkMatrix4x4 *lastMatrix = path->GetLastNode()->GetMatrix();
+        if (lastMatrix == NULL)
+          {
+          vtkErrorMacro (<< "Pick: Null matrix.");
+          return 0;
+          }
+        this->Transform->SetMatrix(lastMatrix);
+        this->Transform->Push();
+        this->Transform->Inverse();
+        this->Transform->GetScale(scale); //need to scale the tolerance
+
+        this->Transform->TransformPoint(p1World,p1Mapper);
+        this->Transform->TransformPoint(p2World,p2Mapper);
+
+        for (i=0; i<3; i++) 
+          {
+          ray[i] = p2Mapper[i] - p1Mapper[i];
+          }
+
+        this->Transform->Pop();
+
+        //  Have the ray endpoints in mapper space, now need to compare this
+        //  with the mapper bounds to see whether intersection is possible.
+        //
+        //  Get the bounding box of the modeller.  Note that the tolerance is
+        //  added to the bounding box to make sure things on the edge of the
+        //  bounding box are picked correctly.
+        mapper->GetBounds(bounds);
+        bounds[0] -= tol; bounds[1] += tol; 
+        bounds[2] -= tol; bounds[3] += tol; 
+        bounds[4] -= tol; bounds[5] += tol; 
+        if ( vtkBox::IntersectBox(bounds, p1Mapper, 
+                                  ray, hitPosition, t) )
+          {
+          t = this->IntersectWithLine(p1Mapper, p2Mapper, 
+                                      tol*0.333*(scale[0]+scale[1]+scale[2]), path, 
+                                      static_cast<vtkProp3D *>(propCandidate), mapper);
+          if ( t < VTK_DOUBLE_MAX )
+            {
+            picked = 1;
+            if ( ! this->Prop3Ds->IsItemPresent(prop) )
+              {
+              this->Prop3Ds->AddItem(static_cast<vtkProp3D *>(prop));
+              }
+            this->PickedPositions->InsertNextPoint
+              ((1.0 - t)*p1World[0] + t*p2World[0],
+               (1.0 - t)*p1World[1] + t*p2World[1],
+               (1.0 - t)*p1World[2] + t*p2World[2]);
+
+            // backwards compatibility: also add to this->Actors
+            if (actor)
+              {
+              this->Actors->AddItem(actor);
+              }
+            }
+          }
+        }
+      else if ( pickable && imageActor )
+        { // special case for imageActor, which has no mapper
+        vtkMatrix4x4 *lastMatrix = path->GetLastNode()->GetMatrix();
+        if (lastMatrix == NULL)
+          {
+          vtkErrorMacro (<< "Pick: Null matrix.");
+          return 0;
+          }
+        this->Transform->SetMatrix(lastMatrix);
+        this->Transform->Push();
+        this->Transform->Inverse();
+
+        this->Transform->TransformPoint(p1World,p1Mapper);
+        this->Transform->TransformPoint(p2World,p2Mapper);
+
+        this->Transform->Pop();
+
+        //  Have the ray endpoints in data space, now need to compare this
+        //  with the displayed image bounds.
+        imageActor->GetDisplayBounds(bounds);
+
+        t = VTK_DOUBLE_MAX;
+
+        for (i = 0; i < 3; i++)
+          {
+          if (bounds[2*i] == bounds[2*i+1] && p2Mapper[i] != p1Mapper[i])
+            {
+//            t = (p2World[i] - bounds[2*i])/(p2Mapper[i] - p1Mapper[i]);
+            t = (p2Mapper[i] - bounds[2*i])/(p2Mapper[i] - p1Mapper[i]);
+            break;
+            }
+          }
+
+        if (t < VTK_DOUBLE_MAX)
+          {
+//          hitPosition[0] = (1.0 - t)*p1Mapper[0] + t*p2Mapper[0];
+//          hitPosition[1] = (1.0 - t)*p1Mapper[1] + t*p2Mapper[1];
+//          hitPosition[2] = (1.0 - t)*p1Mapper[2] + t*p2Mapper[2];
+            hitPosition[0] = t*p1Mapper[0] + (1.0 - t)*p2Mapper[0];
+            hitPosition[1] = t*p1Mapper[1] + (1.0 - t)*p2Mapper[1];
+            hitPosition[2] = t*p1Mapper[2] + (1.0 - t)*p2Mapper[2];
+          if ((bounds[0] == bounds[1] || (hitPosition[0] >= bounds[0]-tol &&
+                                          hitPosition[0] <= bounds[1]+tol)) &&
+              (bounds[2] == bounds[3] || (hitPosition[1] >= bounds[2]-tol &&
+                                          hitPosition[1] <= bounds[3]+tol)) &&
+              (bounds[4] == bounds[5] || (hitPosition[2] >= bounds[4]-tol &&
+                                          hitPosition[2] <= bounds[5]+tol)))
+            {
+            picked = 1;
+
+            // the following code is handled in MarkPicked for other Prop3Ds
+            this->Mapper = mapper; // mapper is null
+            this->DataSet = imageActor->GetInput();
+            this->MapperPosition[0] = hitPosition[0];
+            this->MapperPosition[1] = hitPosition[1];
+            this->MapperPosition[2] = hitPosition[2];
+            this->Transform->TransformPoint(hitPosition,this->PickPosition);
+            imageActor->Pick();
+            this->InvokeEvent(vtkCommand::PickEvent,NULL);
+
+            this->Prop3Ds->AddItem(imageActor);
+//            this->PickedPositions->InsertNextPoint
+//              ((1.0 - t)*p1World[0] + t*p2World[0],
+//               (1.0 - t)*p1World[1] + t*p2World[1],
+//               (1.0 - t)*p1World[2] + t*p2World[2]);
+            this->PickedPositions->InsertNextPoint
+                (t*p1World[0] + (1.0 - t)*p2World[0],
+                 t*p1World[1] + (1.0 - t)*p2World[1],
+                 t*p1World[2] + (1.0 - t)*p2World[2]);
+            }
+          }
+        }//if visible and pickable not transparent and has mapper
+      }//for all parts
+    }//for all actors
+
+  // Invoke end pick method if defined
+  this->InvokeEvent(vtkCommand::EndPickEvent,NULL);
+
+  return picked;
+}
+
+
+
+
+
+
+void fwVtkPicker::PrintSelf(ostream& os, vtkIndent indent)
+{
+  os << indent << "fwVtkPicker: \n";
+  this->Superclass::PrintSelf(os,indent);
+}
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.cpp
new file mode 100644
index 0000000..be59238
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.cpp
@@ -0,0 +1,631 @@
+#include <iostream>
+#include <cmath>
+
+#include <vtkBitArray.h>
+#include <vtkObjectFactory.h>
+#include <vtkMath.h>
+
+#include "fwRenderVTK/vtk/fwVtkWindowLevelLookupTable.hpp"
+
+vtkStandardNewMacro(fwVtkWindowLevelLookupTable);
+
+//----------------------------------------------------------------------------
+    fwVtkWindowLevelLookupTable::fwVtkWindowLevelLookupTable(int sze, int ext)
+: vtkLookupTable(sze, ext)
+{
+    this->Level = (this->TableRange[0] + this->TableRange[1])/2;
+    this->Window = (this->TableRange[1] - this->TableRange[0]);
+
+    this->InverseVideo = 0;
+
+    this->Clamping = 0;
+
+    this->LeftClampValue[0] = 0.0;
+    this->LeftClampValue[1] = 0.0;
+    this->LeftClampValue[2] = 0.0;
+    this->LeftClampValue[3] = 0.0;
+
+    this->RightClampValue[0] = 0.0;
+    this->RightClampValue[1] = 0.0;
+    this->RightClampValue[2] = 0.0;
+    this->RightClampValue[3] = 0.0;
+
+    this->InvertTable = vtkUnsignedCharArray::New();
+    this->InvertTable->Register(this);
+    this->InvertTable->Delete();
+    this->InvertTable->SetNumberOfComponents(4);
+    this->InvertTable->Allocate(4*sze,4*ext);
+}
+
+
+fwVtkWindowLevelLookupTable::~fwVtkWindowLevelLookupTable()
+{
+    this->InvertTable->UnRegister(this);
+    this->InvertTable = NULL;
+}
+
+void fwVtkWindowLevelLookupTable::BuildInvert()
+{
+    if (this->GetMTime() < this->InvertTime)
+    {
+        return;
+    }
+    if (this->Table->GetNumberOfTuples() < 1)
+    {
+        return;
+    }
+
+    this->InvertTable->SetNumberOfTuples(this->NumberOfColors);
+
+    unsigned char *tableRgba, *invertTableRgba2;
+
+    int n = this->NumberOfColors-1;
+    for (int i = 0; i < this->NumberOfColors; i++)
+    {
+        tableRgba = this->Table->GetPointer(4*i);
+        invertTableRgba2 = this->InvertTable->WritePointer(4*(n-i),4);
+
+        invertTableRgba2[0] = tableRgba[0];
+        invertTableRgba2[1] = tableRgba[1];
+        invertTableRgba2[2] = tableRgba[2];
+        invertTableRgba2[3] = tableRgba[3];
+    }
+
+    this->InvertTime.Modified();
+
+}
+
+
+unsigned char * fwVtkWindowLevelLookupTable::GetCurrentPointer(const vtkIdType id)
+{
+    if(this->InverseVideo)
+    {
+        this->BuildInvert();
+        return this->InvertTable->GetPointer(4*id);
+    }
+    else
+    {
+        return this->Table->GetPointer(4*id);
+    }
+}
+
+
+//----------------------------------------------------------------------------
+void fwVtkWindowLevelLookupTable::PrintSelf(ostream& os, vtkIndent indent)
+{
+    this->Superclass::PrintSelf(os,indent);
+
+    os << indent << "Window: " << this->Window << "\n";
+    os << indent << "Level: " << this->Level << "\n";
+    os << indent << "InverseVideo: "
+        << (this->InverseVideo ? "On\n" : "Off\n");
+    os << indent << "LeftClampValue : ("
+        << this->LeftClampValue[0] << ", "
+        << this->LeftClampValue[1] << ", "
+        << this->LeftClampValue[2] << ", "
+        << this->LeftClampValue[3] << ")\n";
+    os << indent << "RightClampValue : ("
+        << this->RightClampValue[0] << ", "
+        << this->RightClampValue[1] << ", "
+        << this->RightClampValue[2] << ", "
+        << this->RightClampValue[3] << ")\n";
+}
+
+
+//----------------------------------------------------------------------------
+// Apply log to value, with appropriate constraints.
+inline double vtkApplyLogScale(double v, const double range[2],
+        const double logRange[2])
+{
+    // is the range set for negative numbers?
+    if (range[0] < 0)
+    {
+        if (v < 0)
+        {
+            v = log10(-static_cast<double>(v));
+        }
+        else if (range[0] > range[1])
+        {
+            v = logRange[0];
+        }
+        else
+        {
+            v = logRange[1];
+        }
+    }
+    else
+    {
+        if (v > 0)
+        {
+            v = log10(static_cast<double>(v));
+        }
+        else if (range[0] < range[1])
+        {
+            v = logRange[0];
+        }
+        else
+        {
+            v = logRange[1];
+        }
+    }
+    return v;
+}
+
+
+//----------------------------------------------------------------------------
+// Apply shift/scale to the scalar value v and do table lookup.
+inline unsigned char *vtkLinearLookup(double v,
+        unsigned char *table,
+        double maxIndex,
+        double shift, double scale,
+        unsigned char *nanColor,
+        unsigned char *leftColor,
+        unsigned char *rightColor
+        )
+{
+
+    if (vtkMath::IsNan(v))
+    {
+        return nanColor;
+    }
+
+    double findx = (v + shift)*scale;
+    if (findx < 0.0)
+    {
+        return leftColor;
+    }
+    else if (findx > maxIndex)
+    {
+        return rightColor;
+    }
+    return &table[4*static_cast<unsigned int>(findx)];
+    /* round
+       return &table[4*(unsigned int)(findx + 0.5f)];
+       */
+}
+
+
+//----------------------------------------------------------------------------
+// There is a little more to this than simply taking the log10 of the
+// two range values: we do conversion of negative ranges to positive
+// ranges, and conversion of zero to a 'very small number'
+void fwVtkWindowLevelLookupTableLogRange(const double range[2], double logRange[2])
+{
+    double rmin = range[0];
+    double rmax = range[1];
+
+    if (rmin == 0)
+    {
+        rmin = 1.0e-6*(rmax - rmin);
+        if (rmax < 0)
+        {
+            rmin = -rmin;
+        }
+    }
+    if (rmax == 0)
+    {
+        rmax = 1.0e-6*(rmin - rmax);
+        if (rmin < 0)
+        {
+            rmax = -rmax;
+        }
+    }
+    if (rmin < 0 && rmax < 0)
+    {
+        logRange[0] = log10(-static_cast<double>(rmin));
+        logRange[1] = log10(-static_cast<double>(rmax));
+    }
+    else if (rmin > 0 && rmax > 0)
+    {
+        logRange[0] = log10(static_cast<double>(rmin));
+        logRange[1] = log10(static_cast<double>(rmax));
+    }
+}
+
+
+
+//----------------------------------------------------------------------------
+// accelerate the mapping by copying the data in 32-bit chunks instead
+// of 8-bit chunks
+    template<class T>
+void fwVtkWindowLevelLookupTableMapData(fwVtkWindowLevelLookupTable *self, T *input,
+        unsigned char *output, int length,
+        int inIncr, int outFormat)
+{
+    int i = length;
+    double *range = self->GetTableRange();
+    double maxIndex = self->GetNumberOfColors() - 1;
+    double shift, scale;
+    unsigned char *table = self->GetCurrentPointer(0);
+    unsigned char *cptr;
+    double alpha;
+
+    unsigned char nanColor[4];
+    unsigned char selfLeftColor[4];
+    unsigned char selfRightColor[4];
+
+    for (int c = 0; c < 4; c++)
+    {
+        nanColor[c] = static_cast<unsigned char>(self->GetNanColor()[c]*255.0);
+        selfLeftColor[c] = static_cast<unsigned char>(self->GetLeftClampValue()[c]*255.0);
+        selfRightColor[c] = static_cast<unsigned char>(self->GetRightClampValue()[c]*255.0);
+    }
+
+
+    unsigned char *leftColor = selfLeftColor;
+    unsigned char *rightColor = selfRightColor;
+
+    if(self->GetClamping())
+    {
+        leftColor = &table[0];
+        rightColor = &table[(self->GetNumberOfColors()-1) * 4];
+    }
+
+    if ( (alpha=self->GetAlpha()) >= 1.0 ) //no blending required
+    {
+        if (self->GetScale() == VTK_SCALE_LOG10)
+        {
+            double val;
+            double logRange[2];
+            fwVtkWindowLevelLookupTableLogRange(range, logRange);
+            shift = -logRange[0];
+            if (logRange[1] <= logRange[0])
+            {
+                scale = VTK_DOUBLE_MAX;
+            }
+            else
+            {
+                /* while this looks like the wrong scale, it is the correct scale
+                 * taking into account the truncation to int that happens below. */
+                // scale = (maxIndex + 1)/(logRange[1] - logRange[0]);
+                // Fixed scale : finaly, no truncation happends below
+                scale = (maxIndex)/(logRange[1] - logRange[0]);
+            }
+            if (outFormat == VTK_RGBA)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_RGB)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_LUMINANCE_ALPHA)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    *output++ = cptr[3];
+                    input += inIncr;
+                }
+            }
+            else // outFormat == VTK_LUMINANCE
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    input += inIncr;
+                }
+            }
+        }//if log scale
+
+        else //not log scale
+        {
+            shift = -range[0];
+            if (range[1] <= range[0])
+            {
+                scale = VTK_DOUBLE_MAX;
+            }
+            else
+            {
+                /* while this looks like the wrong scale, it is the correct scale
+                 * taking into account the truncation to int that happens below. */
+                // scale = (maxIndex + 1)/(range[1] - range[0]);
+                // Fixed scale : finaly, no truncation happends below
+                scale = (maxIndex)/(range[1] - range[0]);
+            }
+
+            if (outFormat == VTK_RGBA)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_RGB)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_LUMINANCE_ALPHA)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    *output++ = cptr[3];
+                    input += inIncr;
+                }
+            }
+            else // outFormat == VTK_LUMINANCE
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    input += inIncr;
+                }
+            }
+        }//if not log lookup
+    }//if blending not needed
+
+    else //blend with the specified alpha
+    {
+        if (self->GetScale() == VTK_SCALE_LOG10)
+        {
+            double val;
+            double logRange[2];
+            fwVtkWindowLevelLookupTableLogRange(range, logRange);
+            shift = -logRange[0];
+            if (logRange[1] <= logRange[0])
+            {
+                scale = VTK_DOUBLE_MAX;
+            }
+            else
+            {
+                /* while this looks like the wrong scale, it is the correct scale
+                 * taking into account the truncation to int that happens below. */
+                // scale = (maxIndex + 1)/(logRange[1] - logRange[0]);
+                // Fixed scale : finaly, no truncation happends below
+                scale = (maxIndex)/(logRange[1] - logRange[0]);
+            }
+            if (outFormat == VTK_RGBA)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = static_cast<unsigned char>((*cptr)*alpha); cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_RGB)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_LUMINANCE_ALPHA)
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    *output++ = static_cast<unsigned char>(alpha*cptr[3]);
+                    input += inIncr;
+                }
+            }
+            else // outFormat == VTK_LUMINANCE
+            {
+                while (--i >= 0)
+                {
+                    val = vtkApplyLogScale(*input, range, logRange);
+                    cptr = vtkLinearLookup(val, table, maxIndex, shift, scale, nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    input += inIncr;
+                }
+            }
+        }//log scale with blending
+
+        else //no log scale with blending
+        {
+            shift = -range[0];
+            if (range[1] <= range[0])
+            {
+                scale = VTK_DOUBLE_MAX;
+            }
+            else
+            {
+                /* while this looks like the wrong scale, it is the correct scale
+                 * taking into account the truncation to int that happens below. */
+                // scale = (maxIndex + 1)/(range[1] - range[0]);
+                // Fixed scale : finaly, no truncation happends below
+                scale = (maxIndex)/(range[1] - range[0]);
+            }
+
+            if (outFormat == VTK_RGBA)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = static_cast<unsigned char>((*cptr)*alpha); cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_RGB)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    *output++ = *cptr++;
+                    input += inIncr;
+                }
+            }
+            else if (outFormat == VTK_LUMINANCE_ALPHA)
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    *output++ = static_cast<unsigned char>(cptr[3]*alpha);
+                    input += inIncr;
+                }
+            }
+            else // outFormat == VTK_LUMINANCE
+            {
+                while (--i >= 0)
+                {
+                    cptr = vtkLinearLookup(*input, table, maxIndex, shift, scale,
+                            nanColor, leftColor, rightColor);
+                    *output++ = static_cast<unsigned char>(cptr[0]*0.30 + cptr[1]*0.59 +
+                            cptr[2]*0.11 + 0.5);
+                    input += inIncr;
+                }
+            }
+        }//no log scale
+    }//alpha blending
+
+}
+
+
+
+
+//----------------------------------------------------------------------------
+// Although this is a relatively expensive calculation,
+// it is only done on the first render. Colors are cached
+// for subsequent renders.
+    template<class T>
+void fwVtkWindowLevelLookupTableMapMag(fwVtkWindowLevelLookupTable *self, T *input,
+        unsigned char *output, int length,
+        int inIncr, int outFormat)
+{
+    double tmp, sum;
+    double *mag;
+    int i, j;
+
+    mag = new double[length];
+    for (i = 0; i < length; ++i)
+    {
+        sum = 0;
+        for (j = 0; j < inIncr; ++j)
+        {
+            tmp = static_cast<double>(*input);
+            sum += (tmp * tmp);
+            ++input;
+        }
+        mag[i] = sqrt(sum);
+    }
+
+    fwVtkWindowLevelLookupTableMapData(self, mag, output, length, 1, outFormat);
+
+    delete [] mag;
+}
+
+
+//----------------------------------------------------------------------------
+void fwVtkWindowLevelLookupTable::MapScalarsThroughTable2(void *input,
+        unsigned char *output,
+        int inputDataType,
+        int numberOfValues,
+        int inputIncrement,
+        int outputFormat)
+{
+    if (this->UseMagnitude && inputIncrement > 1)
+    {
+        switch (inputDataType)
+        {
+            vtkTemplateMacro(
+                    fwVtkWindowLevelLookupTableMapMag(this,static_cast<VTK_TT*>(input),output,
+                        numberOfValues,inputIncrement,outputFormat);
+                    return
+                    );
+            case VTK_BIT:
+            vtkErrorMacro("Cannot comput magnitude of bit array.");
+            break;
+            default:
+            vtkErrorMacro(<< "MapImageThroughTable: Unknown input ScalarType");
+        }
+    }
+
+    switch (inputDataType)
+    {
+        case VTK_BIT:
+            {
+                vtkIdType i, id;
+                vtkBitArray *bitArray = vtkBitArray::New();
+                bitArray->SetVoidArray(input,numberOfValues,1);
+                vtkUnsignedCharArray *newInput = vtkUnsignedCharArray::New();
+                newInput->SetNumberOfValues(numberOfValues);
+                for (id=i=0; i<numberOfValues; i++, id+=inputIncrement)
+                {
+                    newInput->SetValue(i, bitArray->GetValue(id));
+                }
+                fwVtkWindowLevelLookupTableMapData(this,
+                        static_cast<unsigned char*>(newInput->GetPointer(0)),
+                        output,numberOfValues,
+                        inputIncrement,outputFormat);
+                newInput->Delete();
+                bitArray->Delete();
+            }
+            break;
+
+            vtkTemplateMacro(
+                    fwVtkWindowLevelLookupTableMapData(this,static_cast<VTK_TT*>(input),output,
+                        numberOfValues,inputIncrement,outputFormat)
+                    );
+        default:
+            vtkErrorMacro(<< "MapImageThroughTable: Unknown input ScalarType");
+            return;
+    }
+}
+
diff --git a/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtklogging.cpp b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtklogging.cpp
new file mode 100644
index 0000000..fe6eda6
--- /dev/null
+++ b/SrcLib/visu/fwRenderVTK/src/fwRenderVTK/vtklogging.cpp
@@ -0,0 +1,77 @@
+
+#include <vtkObjectFactory.h>
+#include <vtkOutputWindow.h>
+
+#include <fwCore/base.hpp>
+
+class vtkOutputWindowToSpyLog : public vtkOutputWindow
+{
+public:
+
+  vtkTypeRevisionMacro(vtkOutputWindowToSpyLog,vtkObject);
+  // Description:
+  // Print ObjectFactor to stream.
+  virtual void PrintSelf(ostream& os, vtkIndent indent);
+
+   static vtkOutputWindowToSpyLog* New();
+
+  virtual void DisplayText(const char*);
+
+protected:
+  vtkOutputWindowToSpyLog();
+  virtual ~vtkOutputWindowToSpyLog();
+  
+private:
+  vtkOutputWindowToSpyLog(const vtkOutputWindowToSpyLog&);  // Not implemented.
+  void operator=(const vtkOutputWindowToSpyLog&);  // Not implemented.
+};
+
+
+//------------------------------------------------------------------------------
+
+vtkCxxRevisionMacro(vtkOutputWindowToSpyLog, "$Revision: 1.3 $");
+vtkStandardNewMacro(vtkOutputWindowToSpyLog);
+
+//------------------------------------------------------------------------------
+
+vtkOutputWindowToSpyLog::vtkOutputWindowToSpyLog()
+{
+}
+
+//------------------------------------------------------------------------------
+
+vtkOutputWindowToSpyLog::~vtkOutputWindowToSpyLog()
+{
+}
+
+//------------------------------------------------------------------------------
+
+void vtkOutputWindowToSpyLog::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os, indent);
+
+  os << indent << "vtkOutputWindowToSpyLog" << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+void vtkOutputWindowToSpyLog::DisplayText(const char* txt)
+{
+  OSLM_WARN("[VTK]: " << txt);
+}
+
+//------------------------------------------------------------------------------
+
+
+class InitializeVtkOutputWindow
+{
+
+public:
+    InitializeVtkOutputWindow()
+    {
+        vtkOutputWindow::SetInstance( vtkOutputWindowToSpyLog::New() );
+    }
+
+};
+
+static InitializeVtkOutputWindow _vtkOutputWindowInstantiator;
diff --git a/Utilities/VersionGenerator/bin/build.options b/Utilities/VersionGenerator/bin/build.options
new file mode 100644
index 0000000..56d3a7b
--- /dev/null
+++ b/Utilities/VersionGenerator/bin/build.options
@@ -0,0 +1,11 @@
+TYPE = "exec"
+CONSOLE="yes"
+USE=['boost', 'boostProgramOptions']
+LIB=[ 
+    'fwAtomsPatch_0-1',
+    'fwAtoms_0-1',
+    'fwData_0-1',
+    'fwCamp_0-1',
+    'fwDataCamp_0-1',
+    'fwAtomConversion_0-1'
+]
diff --git a/Utilities/VersionGenerator/src/main.cpp b/Utilities/VersionGenerator/src/main.cpp
new file mode 100644
index 0000000..c958f00
--- /dev/null
+++ b/Utilities/VersionGenerator/src/main.cpp
@@ -0,0 +1,75 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2013.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+ 
+#include <stdlib.h>
+#include <string>
+#include <iostream>
+#include <fstream>
+
+#include <boost/program_options.hpp>
+#include <boost/filesystem/path.hpp>
+
+#include <fwAtomsPatch/VersionsManager.hpp>
+
+/** \file main.cpp
+ *********************
+ * Software : VersionGenerator
+ *********************
+ * Allows to generate a file with .versions extesion
+ * This file contains the listof the data and theirs version.
+ * HELP  : VersionGenerator.exe --help 
+ * USE :   VersionGenerator.exe \<options\>
+ * Allowed options:
+ *   -h [ --help ]           produce help message
+ *   -o [ --output ] arg     set the output file
+ *   -f [ --context ] arg     set context name. It will be register in the generated file.
+ *   -v [ --version ] arg    set version name. It will be register in the generated file. 
+ */
+ 
+int main(int argc, char** argv)
+{
+    // Declare the supported options.
+    ::boost::program_options::options_description desc("Allowed options");
+    desc.add_options()
+        ("help,h", "produce help message")
+        ("output,o", ::boost::program_options::value< std::string >(), "set output file")
+        ("context,f", ::boost::program_options::value< std::string >(), "set context name")
+        ("version,v", ::boost::program_options::value< std::string >(), "set version name")
+    ;
+
+    // Manage the options
+    ::boost::program_options::variables_map vm;
+    ::boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
+    ::boost::program_options::notify(vm);
+
+    if (vm.count("help")) {
+        std::cout << desc << "\n";
+        return EXIT_SUCCESS;
+    }
+    else if(!vm.count("context"))
+    {
+        std::cout << "You must specify a context name." << "\n";
+        return EXIT_FAILURE;
+    }
+    else if(!vm.count("version"))
+    {
+        std::cout << "You must specify a version name." << "\n";
+        return EXIT_FAILURE;
+    }
+    else if(!vm.count("output"))
+    {
+        std::cout << "You must specify a output file." << "\n";
+        return EXIT_FAILURE;
+    }
+
+    // Generate the result 
+    ::boost::filesystem::path versionFile(vm["output"].as< std::string >());
+    ::fwAtomsPatch::VersionsManager::generateNewFile(versionFile, vm["context"].as< std::string >(),
+            vm["version"].as< std::string >());
+
+    return EXIT_SUCCESS;
+}
+
diff --git a/launcher/CMakeLists.txt b/launcher/CMakeLists.txt
new file mode 100644
index 0000000..b7aad3c
--- /dev/null
+++ b/launcher/CMakeLists.txt
@@ -0,0 +1,6 @@
+fwLoadProperties()
+
+find_package (Boost COMPONENTS filesystem program_options REQUIRED)
+fwInclude(${Boost_INCLUDE_DIRS})
+fwLink(${Boost_LIBRARIES})
+
diff --git a/launcher/COPYING b/launcher/COPYING
new file mode 100644
index 0000000..2be1e50
--- /dev/null
+++ b/launcher/COPYING
@@ -0,0 +1,675 @@
+                     GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/launcher/COPYING.LESSER b/launcher/COPYING.LESSER
new file mode 100644
index 0000000..3b1dc0e
--- /dev/null
+++ b/launcher/COPYING.LESSER
@@ -0,0 +1,166 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
diff --git a/launcher/Properties.cmake b/launcher/Properties.cmake
new file mode 100644
index 0000000..80a51b1
--- /dev/null
+++ b/launcher/Properties.cmake
@@ -0,0 +1,7 @@
+
+set( NAME launcher )
+set( VERSION 0.1 )
+set( TYPE EXECUTABLE )
+set( DEPENDENCIES fwCore fwRuntime )
+set( REQUIREMENTS  )
+
diff --git a/launcher/bin/build.options b/launcher/bin/build.options
new file mode 100644
index 0000000..0c8f9f8
--- /dev/null
+++ b/launcher/bin/build.options
@@ -0,0 +1,7 @@
+USE   = ['boost', 'boostFilesystem', 'boostProgramOptions']
+LIB   = ['fwCore_0-1','fwRuntime_0-3']
+
+VERSION = '0-1'
+TYPE    = 'exec'
+
+#CONSOLE = 'yes'
diff --git a/launcher/bin/vc/fw4spl.ico b/launcher/bin/vc/fw4spl.ico
new file mode 100644
index 0000000..d0c8883
Binary files /dev/null and b/launcher/bin/vc/fw4spl.ico differ
diff --git a/launcher/bin/vc/launcher.rc b/launcher/bin/vc/launcher.rc
new file mode 100755
index 0000000..b8f9741
--- /dev/null
+++ b/launcher/bin/vc/launcher.rc
@@ -0,0 +1,3 @@
+// First icon in alphabetical order, so it will be used by Explorer if the
+// application doesn't have any icons of its own
+ICON_AAA    ICON   "fw4spl.ico"
diff --git a/launcher/src/ProfileRunner.cpp b/launcher/src/ProfileRunner.cpp
new file mode 100644
index 0000000..ac4fd30
--- /dev/null
+++ b/launcher/src/ProfileRunner.cpp
@@ -0,0 +1,342 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * FW4SPL - Copyright (C) IRCAD, 2009-2014.
+ * Distributed under the terms of the GNU Lesser General Public License (LGPL) as
+ * published by the Free Software Foundation.
+ * ****** END LICENSE BLOCK ****** */
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <ostream>
+#include <vector>
+#include <string>
+
+#include <boost/filesystem.hpp>
+#include <boost/foreach.hpp>
+
+#include <boost/program_options/options_description.hpp>
+#include <boost/program_options/parsers.hpp>
+#include <boost/program_options/positional_options.hpp>
+#include <boost/program_options/variables_map.hpp>
+
+#include <fwRuntime/operations.hpp>
+#include <fwRuntime/profile/Profile.hpp>
+#include <fwRuntime/io/ProfileReader.hpp>
+
+
+#ifdef _WIN32
+# define CONSOLE_LOG false;
+# define FILE_LOG true;
+#else
+# define CONSOLE_LOG true;
+# define FILE_LOG false;
+#endif
+
+#ifndef DEFAULT_PROFILE
+#define DEFAULT_PROFILE profile.xml
+#endif
+
+#define GET_DEFAULT_PROFILE(x) #x
+#define GET_DEFAULT_PROFILE2(x) GET_DEFAULT_PROFILE(x)
+#define DEFAULT_PROFILE_STRING  GET_DEFAULT_PROFILE2(DEFAULT_PROFILE)
+
+
+
+//------------------------------------------------------------------------------
+#if defined(_WIN32) && _MSC_VER > 1499 &&  _MSC_VER < 1600 // Visual C++ 2008 only
+
+ #pragma message ( "Setting up manifest..." )
+
+ #if defined(_DEBUG)
+     // add a dependency on the retail crt even in debug
+     #pragma comment(linker,"/manifestdependency:\"type='win32' " \
+             "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "   \
+             "version='" _CRT_ASSEMBLY_VERSION "' "               \
+             "processorArchitecture='*' "                         \
+             "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "' "  \
+             "language='*'\"")
+ #endif /* _DEBUG */
+
+ #pragma comment(linker,"/manifestdependency:\"type='win32' " \
+        "name='Microsoft.Windows.Common-Controls' "           \
+        "version='6.0.0.0' "                                  \
+        "processorArchitecture='*' "                          \
+        "publicKeyToken='6595b64144ccf1df' "                  \
+        "language='*'\"")
+
+#endif /* _WIN32 && _MSC_VER > 1499 &&  _MSC_VER < 1600 */
+
+//------------------------------------------------------------------------------
+namespace po = boost::program_options;
+namespace fs = boost::filesystem;
+
+typedef fs::path PathType;
+typedef std::vector< PathType > PathListType;
+typedef std::vector< std::string > StringListType;
+
+namespace std {
+template<class A1, class A2>
+inline ostream& operator<<(ostream& s, vector<A1, A2> const& vec)
+{
+    copy(vec.begin(), vec.end(), ostream_iterator<A1>(s, " "));
+    return s;
+}
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef __MACOSX__
+std::pair<std::string, std::string> parsePns(const std::string& s)
+{
+    if (s.substr(0, 5) == "-psn_")
+    {
+        return std::make_pair(std::string("psn"), s.substr(5));
+    }
+    return std::make_pair(std::string(), std::string());
+}
+#endif
+
+/// Wrapper for boost::filesystem::absolute, needed by clang 3.0 in use with
+/// std::transform
+PathType absolute( const PathType &path )
+{
+    return fs::absolute(path);
+}
+
+//-----------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+    PathListType bundlePaths;
+    PathType rwd;
+    PathType profileFile;
+    ::fwRuntime::profile::Profile::ParamsContainer profileArgs;
+
+    po::options_description options("Launcher options");
+
+#ifdef SPECIALINSTALL
+	options.add_options()
+        ("help,h", "Show help message")
+        ("bundle-path,B", po::value(&bundlePaths)->default_value(PathListType(1,BUNDLEPATH)),
+"Adds a bundle path")
+        ("rwd", po::value(&rwd)->default_value("./"), "Sets runtime working directory")
+        ;
+	#else
+		
+	options.add_options()
+        ("help,h", "Show help message")
+        ("bundle-path,B", po::value(&bundlePaths)->default_value(PathListType(1,"./Bundles/")),
+"Adds a bundle path")
+        ("rwd", po::value(&rwd)->default_value("./"), "Sets runtime working directory")
+        ;
+	#endif
+
+    bool consoleLog = CONSOLE_LOG;
+    bool fileLog = FILE_LOG;
+    std::string logFile;
+    const std::string defaultLogFile = "SLM.log";
+
+    typedef ::fwCore::log::SpyLogger SpyLogger;
+    int logLevel = SpyLogger::SL_TRACE;
+
+    po::options_description logOptions("Log options");
+    logOptions.add_options()
+        ("clog", po::value(&consoleLog)->implicit_value(true)->zero_tokens(), "Enable log output to console")
+        ("no-clog", po::value(&consoleLog)->implicit_value(false)->zero_tokens(), "Disable log output to console")
+        ("flog", po::value(&fileLog)->implicit_value(true)->zero_tokens(), "Enable log output to file")
+        ("no-flog", po::value(&fileLog)->implicit_value(false)->zero_tokens(), "Disable log output to file")
+        ("log-output", po::value(&logFile)->default_value(defaultLogFile), "Log output filename")
+
+        ("log-trace", po::value(&logLevel)->implicit_value(SpyLogger::SL_TRACE)->zero_tokens(), "Set loglevel to trace")
+        ("log-debug", po::value(&logLevel)->implicit_value(SpyLogger::SL_DEBUG)->zero_tokens(), "Set loglevel to debug")
+        ("log-info",  po::value(&logLevel)->implicit_value(SpyLogger::SL_INFO )->zero_tokens(), "Set loglevel to info")
+        ("log-warn",  po::value(&logLevel)->implicit_value(SpyLogger::SL_WARN )->zero_tokens(), "Set loglevel to warn")
+        ("log-error", po::value(&logLevel)->implicit_value(SpyLogger::SL_ERROR)->zero_tokens(), "Set loglevel to error")
+        ("log-fatal", po::value(&logLevel)->implicit_value(SpyLogger::SL_FATAL)->zero_tokens(), "Set loglevel to fatal")
+        ;
+
+    po::options_description hidden("Hidden options");
+    hidden.add_options()
+#ifdef __MACOSX__
+        ("psn", po::value<std::string>(), "Application PSN number")
+#endif
+        ("profile", po::value(&profileFile)->default_value(DEFAULT_PROFILE_STRING), "Profile file")
+        ("profile-args", po::value(&profileArgs)->multitoken(), "Profile args")
+        ;
+
+    po::options_description cmdline_options;
+    cmdline_options.add(options).add(logOptions).add(hidden);
+
+    po::positional_options_description p;
+    p.add("profile", 1).add("profile-args", -1);
+
+    po::variables_map vm;
+
+    try
+    {
+        po::store(po::command_line_parser(argc, argv)
+                .options(cmdline_options)
+#ifdef __MACOSX__
+                .extra_parser(parsePns)
+#endif
+                .positional(p)
+                .run(),
+                vm);
+        po::notify(vm);
+    }
+    catch(const po::error &e)
+    {
+        std::cerr << e.what() << std::endl;
+        return 1;
+    }
+
+    if (vm.count("help"))
+    {
+        std::cout << "usage: " << argv[0] << " [options] [profile(=profile.xml)] [profile-args ...]" << std::endl;
+        std::cout << "  use '--' to stop processing args for launcher" << std::endl  << std::endl;
+        std::cout << options << std::endl << logOptions << std::endl;
+        return 0;
+    }
+
+    SpyLogger &logger = fwCore::log::SpyLogger::getSpyLogger();
+
+    if(consoleLog)
+    {
+        logger.addStreamAppender(std::clog, static_cast<SpyLogger::LevelType>(logLevel));
+    }
+
+    if(fileLog)
+    {
+        FILE * pFile = fopen(logFile.c_str(), "w");
+        if (pFile==NULL)
+        {
+            ::boost::system::error_code err;
+            PathType sysTmp = fs::temp_directory_path(err);
+            if(err.value() != 0)
+            {
+                // replace log file appender by stream appender: default dir and temp dir unreachable
+                logger.addStreamAppender(std::clog, static_cast<SpyLogger::LevelType>(logLevel));
+            }
+            else
+            {
+                // creates SLM.log in temp directory: default dir unreachable
+                sysTmp = sysTmp / "SLM.log";
+                logFile = sysTmp.string();
+                logger.addFileAppender(logFile, static_cast<SpyLogger::LevelType>(logLevel));
+            }
+        }
+        else
+        {
+            // creates SLM.log in default logFile directory
+            fclose(pFile);
+            logger.addFileAppender(logFile, static_cast<SpyLogger::LevelType>(logLevel));
+        }
+    }
+
+#ifdef __MACOSX__
+    fs::path execPath = argv[0];
+
+    if ( execPath.string().find(".app/") != std::string::npos || vm.count("psn"))
+    {
+        bool isChdirOkOSX = false;
+
+        fs::path execPath = argv[0];
+
+        while ( fs::extension(execPath) != ".app"
+                && execPath != execPath.parent_path()
+                && !fs::is_directory( execPath / "Bundles" )
+                )
+        {
+            execPath = execPath.parent_path();
+        }
+
+        if ( fs::is_directory( execPath / "Contents" / "Bundles" ) )
+        {
+            execPath = execPath / "Contents";
+        }
+        else
+        {
+            OSLM_ERROR_IF("Bundle directory not found.", !fs::is_directory( execPath / "Bundles" ));
+        }
+
+        isChdirOkOSX = (chdir(execPath.string().c_str()) == 0);
+
+        SLM_ERROR_IF("Was not able to find a directory to change to.", !isChdirOkOSX);
+    }
+#endif
+
+    OSLM_INFO_IF( "Bundle paths are: "  << bundlePaths << std::endl, vm.count("bundle-path") );
+    OSLM_INFO_IF( "Profile: "           << profileFile << std::endl, vm.count("profile"));
+    OSLM_INFO_IF( "Profile-args: "      << profileArgs << std::endl, vm.count("profile-args") );
+
+    std::transform( bundlePaths.begin(), bundlePaths.end(), bundlePaths.begin(), absolute );
+    profileFile = fs::absolute(profileFile);
+
+    bool isChdirOk = false;
+#ifdef _WIN32
+        isChdirOk = (bool)(SetCurrentDirectory(rwd.string().c_str()) != 0);
+#else
+        isChdirOk = ( chdir(rwd.string().c_str()) == 0 );
+#endif // _WIN32
+    OSLM_ERROR_IF( "Was not able to change directory to : " << rwd , !isChdirOk);
+
+    BOOST_FOREACH(const fs::path &bundlePath, bundlePaths )
+    {
+        if ( fs::is_directory(bundlePath))
+        {
+            ::fwRuntime::addBundles( bundlePath );
+        }
+        else
+        {
+            OSLM_ERROR( "Bundle path " << bundlePath << " do not exists or is not a directory.");
+        }
+    }
+
+    int retValue = 0;
+
+    if ( fs::is_regular_file(profileFile))
+    {
+        ::fwRuntime::profile::Profile::sptr profile;
+
+        try
+        {
+            profile = ::fwRuntime::io::ProfileReader::createProfile(profileFile);
+            ::fwRuntime::profile::setCurrentProfile(profile);
+
+            profile->setParams(profileArgs);
+
+            profile->start();
+            profile->run();
+            profile->stop();
+        }
+        catch(std::exception &e)
+        {
+            OSLM_FATAL( e.what() );
+            retValue = 1;
+        }
+        catch(...)
+        {
+            SLM_FATAL( "An unrecoverable error has occurred." );
+            retValue = 1;
+        }
+    }
+    else
+    {
+        OSLM_ERROR( "Profile file " << profileFile << " do not exists or is not a regular file.");
+        retValue = 1;
+    }
+
+    return retValue;
+}
+
+//-----------------------------------------------------------------------------
+
+#ifdef _WIN32
+int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR args, int)
+{
+    return main(__argc, __argv);
+}
+#endif // _WIN32
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/fw4spl.git



More information about the debian-med-commit mailing list